From cppljevans at suddenlink.net Sat Nov 1 12:23:38 2008 From: cppljevans at suddenlink.net (Larry Evans) Date: Sat Nov 1 11:14:03 2008 Subject: [Haskell-beginners] Control.Monad.State: State CTOR unneeded to create a State? In-Reply-To: <694519c50810301920u398b6058m83d827cd4e9c8f55@mail.gmail.com> References: <490A768F.5020707@suddenlink.net> <694519c50810301920u398b6058m83d827cd4e9c8f55@mail.gmail.com> Message-ID: <490C828A.6070406@suddenlink.net> On 10/30/08 21:20, Antoine Latter wrote: > On Thu, Oct 30, 2008 at 10:07 PM, Larry Evans wrote: >> Page: >> >> http://hackage.haskell.org/packages/archive/mtl/latest/doc/html/Control-Monad-State.html#2 >> >> suggests, with the content: >> >> Constructors >> State runState :: (s -> (a, s)) >> that State has a labeled constructor: >> >> http://www.haskell.org/onlinereport/exps.html#sect3.15.2 >> >> yet the Examples section: >> >> http://hackage.haskell.org/packages/archive/mtl/latest/doc/html/Control-Monad-State.html#4 >> >> shows, AFAICT, no call to the State CTOR: >> >> tick :: State Int Int >> tick = do n <- get >> put (n+1) >> return n >> I assume the n must be an Int (since it's in n+1), but what are >> the >> get and put. There is a get and put described here: >> >> http://hackage.haskell.org/packages/archive/mtl/latest/doc/html/Control-Monad-State.html#1 >> >> however, I don't see how they are relevant since they are defined for >> an already existing MonadState, and AFAICT, tick hasn't been defined >> yet since it's on the lhs of the =. >> >> Please, what am I missing? >> > > Hi Larry. Event thought 'get' and 'put' are defined in MonadState, > the concrete implementation of them for "State s a" uses the 'State' > constructor. They probably look something like so: > > get = State (\s -> (s,s)) > put newS = State (\oldS ->( (), newS )) That still leaves me confused about: put (n+1) AFAICT, with the preceding |n <- get|, this means: put (get+1) and since the get has type, |State Int Int|, and there's not + operator defined on that type (because the following: let get1 = get::(State Int Int) print (evalState get1 99) let get1p1 = get1+1 putStrLn "get1p1=" compiles with error: {---cut here--- GenMonads2Arrows.hs:40:15: No instance for (Num (State Int Int)) arising from a use of `+' at GenMonads2Arrows.hs:40:15-20 Possible fix: add an instance declaration for (Num (State Int Int)) In the expression: get1 + 1 In the definition of `get1p1': get1p1 = get1 + 1 In the expression: do putStr "plusOneCtor=" print (plusOneCtor int1) putStr "plusOne=" print (plusOne int1) }---cut here--- So, looking (again ;) at: http://hackage.haskell.org/packages/archive/mtl/latest/doc/html/Control-Monad-State.html#4 shows: get ::m s where, based on: Instances: MonadState s (State s) from the Control-Monad_state.hmtl#4, m is |State Int| and s is |Int| however, that's just what was used above that wasn't compatible with +1. So, how can get be used in |get+1|? Is there some way to trace what's happening in the tick rhs? Could template haskell be any help here? I can't use ghci because I have to explicity type the get result, and that leads to the above compile error. I'm stuck! Help! [snip] > As long as you aren't writing anything that needs to dig to much into > the workings of 'State', you shouldn't have to worry too much about > it. I'm trying to understand how to use MonadState. I would have expected tick would have been defined: tick = State (\n -> (n+1,n+1)) instead of the more obscure: tick = do n <- get put (n+1) return n I figured that understanding how the more obscure definition worked might show me why it was used instead of the simpler definition. However, as noted above, I can't figure out how the more obscure defintion works and I don't even know if the two definitions comput the same results. > > I hope I haven't made things more confused ^_^ You've helped. Thanks. -Larry From padovani at sti.uniurb.it Sat Nov 1 11:48:38 2008 From: padovani at sti.uniurb.it (Luca Padovani) Date: Sat Nov 1 11:43:41 2008 Subject: [Haskell-beginners] Control.Monad.State: State CTOR unneeded to create a State? In-Reply-To: <490C828A.6070406@suddenlink.net> References: <490A768F.5020707@suddenlink.net> <694519c50810301920u398b6058m83d827cd4e9c8f55@mail.gmail.com> <490C828A.6070406@suddenlink.net> Message-ID: Hi Larry, I approached Haskell very recently and I see in your posts many doubts that I experienced myself, so perhaps I can be of some help by providing you with the intuition that guided me, rather than with an in depth explanation of how monadic state works. On Sat, Nov 1, 2008 at 5:23 PM, Larry Evans wrote: >> get = State (\s -> (s,s)) >> put newS = State (\oldS ->( (), newS )) > > That still leaves me confused about: > > put (n+1) > > AFAICT, with the preceding |n <- get|, this means: > > put (get+1) pretty much as with IO, you shouldn't think of get as of a function (or value) representing the value of the state, nor should you think of put as of a function that modifies the state. You should think of get and put (n + 1) as of *actions* that, *when performed*, will read and write the state. In particular put (n + 1) is NOT equivalent to put (get + 1) because "get" here is not the state (of value Int), but it's an action that lets you access the state and n <- get is the way you have to say that you want to perform the get action and bind the value in the state to the name n. The thing that I found really weird in the beginning was that with State the state is never mentioned anywhere! But there is where the intuition "action that reads/writes the state" comes into the game. --luca From allbery at ece.cmu.edu Sat Nov 1 12:02:41 2008 From: allbery at ece.cmu.edu (Brandon S. Allbery KF8NH) Date: Sat Nov 1 11:57:48 2008 Subject: [Haskell-beginners] Control.Monad.State: State CTOR unneeded to create a State? In-Reply-To: <490C828A.6070406@suddenlink.net> References: <490A768F.5020707@suddenlink.net> <694519c50810301920u398b6058m83d827cd4e9c8f55@mail.gmail.com> <490C828A.6070406@suddenlink.net> Message-ID: <0A571117-4CE9-4352-9749-97E915DAD9EA@ece.cmu.edu> On 2008 Nov 1, at 12:23, Larry Evans wrote: > That still leaves me confused about: > > put (n+1) > AFAICT, with the preceding |n <- get|, this means: > > put (get+1) The <- syntax (actually (>>=)) "unwraps" a monadic value (on condition that it is "rewrapped" later), so instead of |State Int Int| it's just |Int|. > I'm trying to understand how to use MonadState. I would have > expected tick would have been defined: > > tick = State (\n -> (n+1,n+1)) I think you meant \n -> (n,n+1) > > instead of the more obscure: > > tick = do n <- get > put (n+1) > return n The above translates to get >>= \n -> put (n+1) >> return n Expand (>>=): State (\s -> let (a,s') = runState get s in runState (put (a+1)) s') Expand |get| and |put|: State (\s -> let (a,s') = runState (State (\s'' -> (s'',s''))) in runState (State (\_ -> ((),a+1))) s') |runState| and |State| cancel: State (\s -> let (a,s') = (\s'' -> (s'',s'')) in (\_ -> (s',a+1))) Now expand the inner lambdas: State (\s -> let (a,s') = (s,s) in (s',a+1)) And collapse the let: State (\s -> (s,s+1)) (I think I did that right; at least I got the right result...) The point of using the "more obscure" definition is that it uses the machinery already defined for |State| --- and (given that I'm not absolutely certain I expanded the above right!) using the machinery is easier to keep track of than expanding directly, while demonstrating the operation of |State| instead of just presenting a result without explanation of how it follows from the definition of |State|. -- brandon s. allbery [solaris,freebsd,perl,pugs,haskell] allbery@kf8nh.com system administrator [openafs,heimdal,too many hats] allbery@ece.cmu.edu electrical and computer engineering, carnegie mellon university KF8NH From byorgey at seas.upenn.edu Sat Nov 1 15:43:55 2008 From: byorgey at seas.upenn.edu (Brent Yorgey) Date: Sat Nov 1 15:38:57 2008 Subject: [Haskell-beginners] Control.Monad.State: State CTOR unneeded to create a State? In-Reply-To: <490C828A.6070406@suddenlink.net> References: <490A768F.5020707@suddenlink.net> <694519c50810301920u398b6058m83d827cd4e9c8f55@mail.gmail.com> <490C828A.6070406@suddenlink.net> Message-ID: <20081101194355.GA32669@seas.upenn.edu> On Sat, Nov 01, 2008 at 11:23:38AM -0500, Larry Evans wrote: > > put (n+1) > AFAICT, with the preceding |n <- get|, this means: > > put (get+1) > and since the get has type, |State Int Int|, and there's > not + operator defined on that type (because the following: > Others have explained in more detail, let me just state this simply to hopefully clear up the main point of confusion: let x = y and x <- y are *not* the same. In the first case, x is just a name for y, and x and y can be used interchangeably. In the second case, x is bound to *the result of* the action y. So x and y cannot be used interchangeably. -Brent From michael at snoyman.com Mon Nov 3 16:41:26 2008 From: michael at snoyman.com (Michael Snoyman) Date: Mon Nov 3 16:36:22 2008 Subject: [Haskell-beginners] Weighted average Message-ID: <29bf512f0811031341t56f9a734obe0b896ee68a221e@mail.gmail.com> Hi everyone, I'm trying to set up some type safe functions for doing weighted averages and sum of products. The example I give below is to try and calculate the average miles per gallon for a collections of vehicles. Unfortunately, I am unable to get my weightedAverage function to work, seemingly due to an ambiguity for which instance to use. I think that the issue is that my "class Multiplicable" should only have two parameters, as opposed to the three it currently has. However, I can't figure out how to get that to work. Any help is greatly appreciated. Thank you, Michael ---------------------------------- {-# LANGUAGE MultiParamTypeClasses #-} import Prelude hiding (sum, product) class Addable a where add :: a -> a -> a zero :: a sum :: [a] -> a sum = foldr add zero class Multiplicable a b c where mult :: a -> b -> c product :: [a] -> [b] -> [c] product x y = map (\(x1, y1) -> x1 `mult` y1) $ zip x y sumProduct :: (Addable c, Multiplicable a b c) => [a] -> [b] -> c sumProduct x y = sum $ product x y weightedAverage x y = (sumProduct y x) `divide` (sum y) class Dividable a b c where divide :: c -> a -> b newtype MilesPerGallon = MilesPerGallon Double deriving Show newtype Gallon = Gallon Double deriving Show newtype Mile = Mile Double deriving Show instance Addable Gallon where add (Gallon x) (Gallon y) = Gallon $ x + y zero = Gallon 0 instance Addable Mile where add (Mile x) (Mile y) = Mile $ x + y zero = Mile 0 instance Multiplicable Gallon MilesPerGallon Mile where mult (Gallon x) (MilesPerGallon y) = Mile $ x * y instance Dividable Gallon MilesPerGallon Mile where divide (Mile x) (Gallon y) = MilesPerGallon $ x / y milesPerGallon :: [MilesPerGallon] milesPerGallon = map MilesPerGallon [35, 25, 29, 20, 52] gallons :: [Gallon] gallons = map Gallon [500, 190, 240, 100, 600] totalGallons :: Gallon totalGallons = sum gallons totalMiles :: Mile totalMiles = sumProduct gallons milesPerGallon totalMilesPerGallon :: MilesPerGallon totalMilesPerGallon = totalMiles `divide` totalGallons -- I would like some way to get the following line to replace the previous --totalMilesPerGallon = weightedAverage milesPerGallon gallons main = do putStrLn $ "Total gallons of gas used: " ++ show totalGallons putStrLn $ "Total miles traveled: " ++ show totalMiles putStrLn $ "Average miles per gallon: " ++ show totalMilesPerGallon -------------- next part -------------- An HTML attachment was scrubbed... URL: http://www.haskell.org/pipermail/beginners/attachments/20081103/9bf23093/attachment.htm From daniel.is.fischer at web.de Mon Nov 3 17:55:37 2008 From: daniel.is.fischer at web.de (Daniel Fischer) Date: Mon Nov 3 17:49:49 2008 Subject: [Haskell-beginners] Weighted average In-Reply-To: <29bf512f0811031341t56f9a734obe0b896ee68a221e@mail.gmail.com> References: <29bf512f0811031341t56f9a734obe0b896ee68a221e@mail.gmail.com> Message-ID: <200811032355.38065.daniel.is.fischer@web.de> Am Montag, 3. November 2008 22:41 schrieb Michael Snoyman: > Hi everyone, > > I'm trying to set up some type safe functions for doing weighted averages > and sum of products. The example I give below is to try and calculate the > average miles per gallon for a collections of vehicles. Unfortunately, I am > unable to get my weightedAverage function to work, seemingly due to an > ambiguity for which instance to use. I think that the issue is that my > "class Multiplicable" should only have two parameters, as opposed to the > three it currently has. However, I can't figure out how to get that to > work. > > Any help is greatly appreciated. Thank you, > Michael > > ---------------------------------- > > {-# LANGUAGE MultiParamTypeClasses #-} > > import Prelude hiding (sum, product) > > class Addable a where > add :: a -> a -> a > zero :: a > > sum :: [a] -> a > sum = foldr add zero > > class Multiplicable a b c where > mult :: a -> b -> c Use functional dependencies {-# LANGUAGE FunctionalDependencies #-}, class Multiplicable a b c | a b -> c where ... which states that the result type of multiplication is determined by the argument types or type families > > product :: [a] -> [b] -> [c] > product x y = map (\(x1, y1) -> x1 `mult` y1) $ zip x y product = zipWith mult > > sumProduct :: (Addable c, Multiplicable a b c) => [a] -> [b] -> c > sumProduct x y = sum $ product x y > > weightedAverage x y = (sumProduct y x) `divide` (sum y) > > class Dividable a b c where > divide :: c -> a -> b FunDep here, too, but which one? > > newtype MilesPerGallon = MilesPerGallon Double deriving Show > newtype Gallon = Gallon Double deriving Show > newtype Mile = Mile Double deriving Show > > instance Addable Gallon where > add (Gallon x) (Gallon y) = Gallon $ x + y > zero = Gallon 0 > > instance Addable Mile where > add (Mile x) (Mile y) = Mile $ x + y > zero = Mile 0 > > instance Multiplicable Gallon MilesPerGallon Mile where > mult (Gallon x) (MilesPerGallon y) = Mile $ x * y > > instance Dividable Gallon MilesPerGallon Mile where > divide (Mile x) (Gallon y) = MilesPerGallon $ x / y > > milesPerGallon :: [MilesPerGallon] > milesPerGallon = map MilesPerGallon [35, 25, 29, 20, 52] > > gallons :: [Gallon] > gallons = map Gallon [500, 190, 240, 100, 600] > > totalGallons :: Gallon > totalGallons = sum gallons > > totalMiles :: Mile > totalMiles = sumProduct gallons milesPerGallon > > totalMilesPerGallon :: MilesPerGallon > totalMilesPerGallon = totalMiles `divide` totalGallons > -- I would like some way to get the following line to replace the previous > --totalMilesPerGallon = weightedAverage milesPerGallon gallons > > main = do > putStrLn $ "Total gallons of gas used: " ++ show totalGallons > putStrLn $ "Total miles traveled: " ++ show totalMiles > putStrLn $ "Average miles per gallon: " ++ show totalMilesPerGallon From michael at snoyman.com Mon Nov 3 18:26:12 2008 From: michael at snoyman.com (Michael Snoyman) Date: Mon Nov 3 18:21:07 2008 Subject: [Haskell-beginners] Weighted average In-Reply-To: <200811032355.38065.daniel.is.fischer@web.de> References: <29bf512f0811031341t56f9a734obe0b896ee68a221e@mail.gmail.com> <200811032355.38065.daniel.is.fischer@web.de> Message-ID: <29bf512f0811031526v6ccbdf22ke4a5eb4f36a2494c@mail.gmail.com> On Mon, Nov 3, 2008 at 2:55 PM, Daniel Fischer wrote: > > > > class Multiplicable a b c where > > mult :: a -> b -> c > > Use functional dependencies {-# LANGUAGE FunctionalDependencies #-}, > > class Multiplicable a b c | a b -> c where ... > > which states that the result type of multiplication is determined by the > argument types > > or type families That's exactly what I was looking for, thank you. Now that I got that working, I've noticed that it can be tedious making sure the arguments to sumProduct are in the correct order. Since multiplication is commutative, is there any way of automatically having the Multiplicable instances generate a "flip" mult? > sumProduct :: (Addable c, Multiplicable a b c) => [a] -> [b] -> c > > sumProduct x y = sum $ product x y > > > > weightedAverage x y = (sumProduct y x) `divide` (sum y) > > > > class Dividable a b c where > > divide :: c -> a -> b > > FunDep here, too, but which one? I did class Dividable a b c | c a -> b where... Michael -------------- next part -------------- An HTML attachment was scrubbed... URL: http://www.haskell.org/pipermail/beginners/attachments/20081103/5f554cea/attachment.htm From daniel.is.fischer at web.de Mon Nov 3 18:53:05 2008 From: daniel.is.fischer at web.de (Daniel Fischer) Date: Mon Nov 3 18:46:11 2008 Subject: [Haskell-beginners] Weighted average In-Reply-To: <29bf512f0811031526v6ccbdf22ke4a5eb4f36a2494c@mail.gmail.com> References: <29bf512f0811031341t56f9a734obe0b896ee68a221e@mail.gmail.com> <200811032355.38065.daniel.is.fischer@web.de> <29bf512f0811031526v6ccbdf22ke4a5eb4f36a2494c@mail.gmail.com> Message-ID: <200811040052.24231.daniel.is.fischer@web.de> Am Dienstag, 4. November 2008 00:26 schrieb Michael Snoyman: > On Mon, Nov 3, 2008 at 2:55 PM, Daniel Fischer wrote: > > > class Multiplicable a b c where > > > mult :: a -> b -> c > > > > Use functional dependencies {-# LANGUAGE FunctionalDependencies #-}, > > > > class Multiplicable a b c | a b -> c where ... > > > > which states that the result type of multiplication is determined by the > > argument types > > > > or type families > > That's exactly what I was looking for, thank you. Now that I got that > working, I've noticed that it can be tedious making sure the arguments to > sumProduct are in the correct order. Since multiplication is commutative, > is there any way of automatically having the Multiplicable instances > generate a "flip" mult? Beware! Multiplication is usually not commutative, think about matrices. If (a `mult` b) and (b `mult` a) are both defined (need not be if they have different types), the products may have different types, so in general it is not desirable to have both defined automatically in a way that doesn't force you to supply the arguments in the correct order. In your case, you could provide instance Multiplicable MilesPerGallon Gallon Mile where mult = flip mult -- or write the implementation out and it should work whichever order the arguments are passed. > > > sumProduct :: (Addable c, Multiplicable a b c) => [a] -> [b] -> c > > > > > sumProduct x y = sum $ product x y > > > > > > weightedAverage x y = (sumProduct y x) `divide` (sum y) > > > > > > class Dividable a b c where > > > divide :: c -> a -> b > > > > FunDep here, too, but which one? > > I did class Dividable a b c | c a -> b where... > > Michael From michael at snoyman.com Tue Nov 4 10:22:11 2008 From: michael at snoyman.com (Michael Snoyman) Date: Tue Nov 4 10:17:04 2008 Subject: [Haskell-beginners] Weighted average In-Reply-To: <200811040052.24231.daniel.is.fischer@web.de> References: <29bf512f0811031341t56f9a734obe0b896ee68a221e@mail.gmail.com> <200811032355.38065.daniel.is.fischer@web.de> <29bf512f0811031526v6ccbdf22ke4a5eb4f36a2494c@mail.gmail.com> <200811040052.24231.daniel.is.fischer@web.de> Message-ID: <29bf512f0811040722i6ad33074u11e9e1c82c05ea0e@mail.gmail.com> On Mon, Nov 3, 2008 at 3:53 PM, Daniel Fischer wrote: > Am Dienstag, 4. November 2008 00:26 schrieb Michael Snoyman: > > Beware! Multiplication is usually not commutative, think about matrices. If > (a `mult` b) and (b `mult` a) are both defined (need not be if they have > different types), the products may have different types, so in general it > is > not desirable to have both defined automatically in a way that doesn't > force > you to supply the arguments in the correct order. > > In your case, you could provide > instance Multiplicable MilesPerGallon Gallon Mile where > mult = flip mult > -- or write the implementation out > and it should work whichever order the arguments are passed. Good point. Thanks for all the help! -------------- next part -------------- An HTML attachment was scrubbed... URL: http://www.haskell.org/pipermail/beginners/attachments/20081104/994dd9eb/attachment.htm From apfelmus at quantentunnel.de Tue Nov 4 10:42:05 2008 From: apfelmus at quantentunnel.de (apfelmus) Date: Tue Nov 4 10:37:17 2008 Subject: [Haskell-beginners] Re: Weighted average In-Reply-To: <29bf512f0811031341t56f9a734obe0b896ee68a221e@mail.gmail.com> References: <29bf512f0811031341t56f9a734obe0b896ee68a221e@mail.gmail.com> Message-ID: Michael Snoyman wrote: > > newtype MilesPerGallon = MilesPerGallon Double deriving Show > newtype Gallon = Gallon Double deriving Show > newtype Mile = Mile Double deriving Show > You may want to have a look at Bj?rn Buckwalter's dimensional library http://hackage.haskell.org/cgi-bin/hackage-scripts/package/dimensional Regards, apfelmus From gerryxiao at gmail.com Thu Nov 6 05:38:55 2008 From: gerryxiao at gmail.com (gerry xiao) Date: Thu Nov 6 05:33:44 2008 Subject: [Haskell-beginners] Tab complement Message-ID: Hello,i'm gerry,new to haskell Why i can't do tab complement in GHCI? Best Regards gerry -------------- next part -------------- An HTML attachment was scrubbed... URL: http://www.haskell.org/pipermail/beginners/attachments/20081106/e8241551/attachment-0001.htm From DekuDekuplex at Yahoo.com Thu Nov 6 06:39:30 2008 From: DekuDekuplex at Yahoo.com (Benjamin L.Russell) Date: Thu Nov 6 06:34:33 2008 Subject: [Haskell-beginners] Re: Tab complement References: Message-ID: On Thu, 6 Nov 2008 18:38:55 +0800, "gerry xiao" wrote: >Hello,i'm gerry,new to haskell > >Why i can't do tab complement in GHCI? In GHC 6.10.1, editline is used for input (see "1.4. Release notes for version 6.10.1" at http://haskell.org/ghc/docs/6.10.1/html/users_guide/release-6-10-1.html, under "1.4.4. GHCi changes"). Editline provides certain useful command line editing features, such as command history and line editing, but not tab completion. For tab completion, one possibility that might work is to try out rlwrap (see "rlwrap" at http://utopia.knoware.nl/~hlub/rlwrap/man.html). Rlwrap is a readline wrapper that intercepts user input, providing line editing, persistent history, and completion. While readline was replaced by editline in GHC 6.10.1, it might be possible to wrap the editline in GHCi with an rlwrap wrapper for readline wrapping GHCi in the following manner at the command prompt: $ rlwrap ghci See "rlwrap, Emacs midi-input and p5httpd" at http://utopia.knoware.nl/~hlub/rlwrap/ for information on compiling and running rlwrap, which requires "[a] newer (4.2+) GNU readline and an ANSI C compiler." Please note that using rlwrap would be experimental, since you would essentially be wrapping the editline replacing readline in GHCi with an rlwrap wrapping readline wrapping GHCi in the shell. Please post your results in this thread, since it would be useful to learn if this would work. -- Benjamin L. Russell From DekuDekuplex at Yahoo.com Fri Nov 7 01:40:25 2008 From: DekuDekuplex at Yahoo.com (Benjamin L.Russell) Date: Fri Nov 7 01:35:31 2008 Subject: [Haskell-beginners] (fwd) Haskell Quick Reference (1-page PDF) - QuickReference.pdf (0/1) Message-ID: <2lo7h45m5fjv8o3knsnbp75pfpkpj929u4@4ax.com> The following one-page Haskell Quick Reference was posted earlier today on Haskell-Cafe; I am forwarding it to this list as a reference for any interested beginners. -- Benjamin L. Russell On Thu, 6 Nov 2008 13:41:13 +0000, in gmane.comp.lang.haskell.cafe Malcolm Wallace wrote: >Some time ago, there was a thread about a "CheatSheet" for Haskell >beginners. As I recall, the CheatSheet was more than 12 pages long. > >For a Haskell tutorial I was running at a conference recently, I needed >a "Quick Reference Guide" that would fit onto a single side of A4. So I >knocked one together quickly, and it is attached as a PDF. I send it to >this list, with permission for anyone to distribute it more widely as >they wish, in the hope that it might be useful. > >Doubtless it is incomplete, and I have no particular desire to fix >errors or maintain this document, so if anyone is interested and would >like to adopt it, I can pass on the editable sources. It was originally >created as an Apple Numbers spreadsheet (simply for speed of creation) >but could be converted to Excel or CSV, for import into other tools. > >Regards, > Malcolm From DekuDekuplex at Yahoo.com Fri Nov 7 01:40:26 2008 From: DekuDekuplex at Yahoo.com (Benjamin L.Russell) Date: Fri Nov 7 01:39:49 2008 Subject: [Haskell-beginners] (fwd) Haskell Quick Reference (1-page PDF) - QuickReference.pdf (1/1) Message-ID: begin 644 QuickReference.pdf M)5!$1BTQ+C,*)<3E\N7KI_.@T,3&"C(@,"!O8FH*/#P@+TQE;F=T:"`T(#`@ M4B`O1FEL=&5R("]&;&%T941E8V]D92`^/@IS=')E86T*>-K-??MSY+:5[N_\ M*U"U]X=)66+PXFON.E7V9'RO*XYOUAXG6^7QW5`M2NIUJUONQXR4[/[O>PY( M$"`)M,@&-=-.Q:8XHP^/\\!W0."1(+FC&2B+Q^@+_U-[+6 M0(1&``2_$B<9Q7\(_N_2_-@@60"+>_+U.\*3^F_"?Z4H8EH4/.(I>7=/?O\- MBREAY-T->?5_O_KQ3V^_^X[\VT_?OOD3^>'M-V]_>/O]F[>_(^_^D[Q]5W?6 MTW+D:YG)^F_"?Q.>Q$QB%V2_Y6_?OGU+_KK<_:VJ?B7O#OO-=EFN"*LW@!\;SN)"9(/"C2&0L\M2\ M6T4_-OUI1YTE,4]97A`N6`PB%D4!P'WQ*3UH?T=F,LX%*Z+F=R[-+]6:(64L M4VO$$A1.9B!!&E-KP-9@(Z.N62X%$QD^P7]XDN#(69;*3/6"YUF<\ZQ0O4AD M6L!(H:4BRYJ>X;MH9;U+$^@D_+V5];OFW9WU5B30>@^Q>==!Y#"RM(=HWEF( M0N8P,5U$_6WVTWEF(+!>@05U$_\Z"$V[SJ(M(A9UD,T[]R(-Z3Q""Q"CW#4 M2(Y[BZ$5@^>0-"5I!K(D]3/\77C&SOQXU'L>09,&+,WBPM@"3T)M@7-C"UR$V@*GQA8X#[4%EAM;X#34%EAF;('EH;;`$F,+ M+`VU!2:,+;`DU!88,[8`P1IP>,K"`*DQ!R2/P8"YZA0\:'PV&3/2F$1SN;R# MF4^TC`%>PCIX:1:()RS*1`.QF+5(B$`LJH:)?T5K'+[C`PM1FK1'[<4HVE>7O87YUEDV'?QH(+1J>*C+:6D-9<,09(:2;'' M$*1F.:?U]G$`DB:@M&:>(4@-Y:3UMG$(4K-I3.LMXQ"D9L.8UCPU!*DAJ+1F MIB%(S48QK;>)`Y`TN:4UJPU!:N@LK7EL"%)#8&G-7$.06FM1V\(A2*VUR$!K MT727UMO!`4AZ,YC66\$A2)G6<<610Y`2K>.*%8<@2:WCB@>'('&MXXKYAB!1 MK>.*ZP8@:9)+:W8;@M2N+6J[-P0IT3K.`]<6O=%+:RX<@L2UCJLMWA`DJG5< M\>@`)$V@:.**X<@)5K'%3L.01):QQ4?#D%B6L<- M`+/(+FU9;@B7RBV\/)"Y,`LK#?3K+751K#@Z74];!UJSZ^@T''O#EC;;M2=V MZM)@91"AJ`U@F*LL(,RR((&P1PTD/L\`&0%S)RVDG`>2)P:2)W-`XKDY#8G/ MYX!,"@.9%+-`6@8IYS%(:1FDG,<@(5PPD'06ZX&XH87$YSD@,V,]^#P' M9&*L!Y_G@)3&>O!Y#DANK`>?YX`$,$JI)2/]XM1-/FMAP[BC`]Z^.'6/SP;/ MC$7Q4:OF\Y")L2A\G@-2&(O"YSD@N36A?)ZYI,:B\'D&2(A;6DA\G@,R,Q:% MSW-`)L:B\'D.2&'6(WR>`Y*9]0B?YX"DQGKP>09(B'.H.0@"N.V+4_?=;8Z< M]\#;%S-P^L10^F061B_`G"+M^N=PT\PRIEE6)V-)QHZ:BRF]:QM45]_ZBYFM)<&.%1"G8JG7/`,'?W(:T=V+[]^%S'67/YA!`-Q MAO]2-W]X>_/GS>;^OEKO=^:24;?[21)G(BVB1,30C6=[3T;T/AK7>]+K/2^& MO;^\[-Y/8KC'GN`]EJ;?(.8L!AH_H>-1Z+1;'8^*U-MS4JVO+S4DN_]LGB*;K9R$(3^?O#ZO]LB,'0OYY^7&YOR/K M:K=?KF\O_QM'6`LGZ@M'I+'`:S23A3/K`%$XJ7"-[U\((?_2=G\@(-W]GH"B M$.4:M>9UE4L)R#>`O_SPU?_Y\U?DL#N4J]43*UBNJJT:;.0V)'V];:PW?D%AY70XUF^O0?F6-TL8Q+J\K[Q>F>&35KEH%G^` M?8NZHS!S1O'ZUM`?P(K2'T%5[L6;NW*[\_D#W?5S\`=%-A3!S6&]V"\WZ]T% M^5!NE^75JMJ1Z*@34]OL<'+BSYR"=Y0(=MS&IVKV1Y9J4V]N#6G(? M-KNE,CQX59'=W6:[]TDJS^*"OKBDC%I0GKHDY=#(F\WF/[XNM^\%3X2\*O_A MDYD>02VS%_/@XV2&-[G[`SFLKZOM;K'9@I3^XX(\;)7K_WBTKT_"W&Y^J_%I98HB#'J5:J$]6NU69/7EABM%:VAA1Z))3GTXCPD M5CABWO>OOOCB_>]@B%ZAZ0&\I%NT5`2<<#*6:Y3K1AJUW,#MKZ4E87CR4ZUB,+,\';N*E>3OL)#]W2\G MW?5/P@F]?7?+J9&&LI2.E)3XAD*Z*A>__G;8[/UFI3.8G$'0R(4C0OYQOX6Q M^()%P8LX2P=Z]JD=H>I]XHAY@5-P".=7&_)QLUU=PX_"$SNV(SF+33W76':U M)%#?R+6*JBX;U7+*)A(<^I6=X@/ZLHD"!E3+)K6#X:B5C5P@F?4Y`MW_(Q*) M`I7+_7G4L14O@.THZ:/T0AAPW?)UHZ(4-OYO^:)R+ M_FZY@Y';LH/>"5/ M;-85J5;5/6Z?E60%>+YIH!0$\*D6*EK$.1L["^]?/0)3>MR]_YU/077?/\U* MY>N\9Z7"2:]IWR,I]VH3\V:[6>\O8$ADN5,O(`#;D\V->CXB)+"/F-*SX'Z" MY2[NAY)Z@O__`_[_\R_$*S(]DFBZEY_U:X?R*8ZQ1%IP2BC;"@SP[LCRRW,6 M"T_0&\VC@.X[?D,7+X0C:OR9`"=ZN@"Q_&*-(+(%HD<0))`H5+<:@>`8HOZR M^]L!HZ4K\/2_5N`6E4GAIYRRV4PZW)9;<@/A$ZCAZZ?7_WC]\R^U_D4.@64L M3L\C[A4)=PF,DS@F+.D(K&-!>@3GL+OD'(.R'UB7]N5RC32\).O#?;5=+LBV M7-_Z=FAYRN+B/.);D19.R5P0J823^H6C!W$6PG$-8RB(`(:I200-Y< MGH>0\M0E)$DOB"A03/!WO6+2PS@+,;D&HH2P4Q'N[0:BC8]K`N[N(T12^-_# M@T\^.M?E&42SDCJBV7>'AY7WRR@!G<1[" M-822/)3++5C[AW)UJ,@E[I%L-P<()-1V%O#07=598GV*QD6=#/3S.P(I,J^H MD/GXN:@>PSEX`>S:M,1X7ST>@S?9.;>&@.>7Z"1=WF'_U*?TU^1:# M4/A7=5MM+\@WJTT)/]?G!"Y(M5^T@XTZ4F*%C!D-W,\*CQ24E-3%VH&48NHQ M];;K;CE%GRI0JTT]=X30'6G=X*[6C+ZH:S_](*\V=R#?WCTN`66 MRUB>QS?9A#K"4Q;S2OA$IOM^#M_XG+W?+9;U@:X%66_V2B0$8M`O"8%QD4?" MZ/\7L/AX1*,S?I^!QTZX(XI["V$W?L"L/V1Z'#=^JJ;BQ<^JC7$)B7!$.U]Z M/C:T_3X'HN;L>;.%_27N%);DNKJ!<$UI&+J(F@QT9!)9&>*36,BS<-.)RA/1 ME\F7/HO7'3^'[PVJZWVAU%]]R)>-5/!,:KE=[E`J^C#&MMH?MDUD_?5FLZK* MM<\#Z`S]Y^`!,D>L]EUY?W5=MK[-YP)$$A?I)SJNBG-&\[%[\.]?O7__>/D' MYA`UKVU8]OOOV6?`!&W;@$]0&A MEE?ML7U*QW([Q,8+_^*S'&:GCG#G\@\^SZ![W0A)=SN:BPBT3:G4<,)W(%KT M>SR00TFVR]N[/2FWV\U'(`/-V81&-KL+8N0RAO$?Z8W((1;(6:0[)L?93'UU(Q#@^#KWY/'KH M"KN_*Y\V!]]UG8+C1_$\MRUH;DZJYRFO2]2,^K[''\(=")_#/ M*.4=@<]DS$$D1:2;,8:#LX7]_@;+>.HYV_F M^T1I+&^2D+]=XQV2.M18[O3)I_T!J.&':O6$7_N7Z^OEHMS#YJ8\XY:9DPVMXWVXQC MNW_"$05O]Y]5IN8HW0:6LNWR&M[C2;J#.D57/3ZLEHOE7GV!;:[+3%.C8]T: MJM&NNE^J8[*[N#NCS]:GB];]VG2BGEM:U/]@4<'FC^TG?2/9JA\7R2*/)0)C M_3B:<.@NR"A%8=C5!TE3?7`Y;I=!@P[*]R&Q33@JM^B7[_NN>E1V_.,3".MQ M>LF^XU,2/3LE@H*WSF1!GIF2:,*4.$#M*8G4E"1Y#"$A=TS)V\>';;5#SK5[ M5D6B:?-Q7$4P+(8NX:7OG(2I2"\Q\@!TJ"(I="AWS$?TZH_M]D!O/C"5899S M98)%D=&:<_&,"$IUU$ZYV-R(LX[4E&O^L@XI?(GF2L=Q8B MR_+!/.IW-B*F5.S/H_7.C6CJ$Y*P^H31T$14_9,Z-S5)F2ZJI%^,+2MR'+P<4SKU&GH60&W"AI*PBU#>4GXD9V?Z7L MS6]"V335@%K M&TKF4#5.60_7-N7350WK[G94C=,Y5$)5W^VH6GWY+UC5F.BYGCI[<+"JL;[< MZES"P7K&^BZ8C73!S^A9GO1@Z2PK9]IS:-UZ;M')ZUM_F1^7&O@Y+]E;C.=1 MW*SG(L4<:MLM]Z:;2@,TM^`M?<+'C(5A:S[BC40!-*6ZT?6S74 MZR28\8.!YB.-APB<]-;7B!""0ELO3P.=/&U]/`UT\;3U\#30P=,Z]*V11!*$ MI+T[#5PH:!N&TM'QIP])F,)"08L$;=<(&KA$T#:XU`5O`I!H6^8F:*FA[4I# M`Q<:VH:,]*18L0_6JGG8FD7;L)`>BP?'(=&VJDR@FNNECP:N?+1=^&C@NH?I MCK.V@DN8V[0KN(09<:]\2P!2KHL4G;YV0E014;UTTM-73E74)$I8N[2$X*AE M,S+%6D[&J1?-B(9%7?9G*%.LY40PNV9)DR->CJ^L\BPDRPTDR^>`A%6^A<3G M.2";).0*`%-1`"CH' MI,B,8$0VBV"`:!C(9!:-!,9A("6;!9*:N<3G&2!Y9B!Y-@]D4P]`08ZJ!_`\ MI&6*?!Y3Y)8I\@!3M"&ID3BGLT@QM1;&>=9%9BTX\[@URZO-(A9+=V91'>/0NF49AB=! M\#!"QEZF+(.SE^/*,GS3')$FY0,>K7/>QU'`-ZVM1H4!T?>Z_BA6102$^-AMU#N:C(5;7_6%7K]M1ZG5CP M1AUR;),75^UQ,]([?V=43J8Q3TZ14Q0ZVL']:\?%I1ORO_R2TEU_R8N6(W1, M22V;F]I@JFL\4FP+A;Q_=778UR>,+\O=;K-8EG@BNG\%P8@+@^?T+,3E MJHKPB,E\GWSRTGT_!WFY>J_OPF%>NN;Z*":&A>YI\:EDG3[1\!1$VC7SRZ_R\J'J,,X&8+SB:FN6VO*S;GOK5@FNRJ8U+=&H&Q+&;Y60C,5?+A MD?S]YN]^:>G.?QII@6X(.EI:6ARM`^Q)J\EY6XNJOF?FRW=KI$6S6!9G(2UG MN8H;K,G3_WT+68RFY&\:"K!L7[0,9;HU3"Q#JQ;ZJ*+XA=8 M?LC(UN*".P\9Q&H%7%BR2POH(_\<9+!;"B)J?2/SBJOM?"LN9^^CH&N6YO47[;SAG3*/JQ]-!(Y+J_F8N,YHZ1V'>XC_++Y^<)Y,,D)]O75VL&U3JP7N6Y_H9X<"?Q+GLA@.*!II26.F2^(5F-0](,N2!BNV%G9OQ?XL@28K'!F8?!K] M4.[WU79]>5_N%W>-;JO$IUK!?>J=T"XY?E'UANE5H<<1];;CSHG:T*`[+L6C MPBDBM0LY&HIXCS>,L%2QQ MV<[C%P)F+/&93Z-,T7'"^VGB$TP0.8A/-C>P!D$84G6#E+*.6_2:1,"4ZCH" M0!V?P)9\T8F^QSB=*7;'&P4QQ7JON@E/HDXEQ')?FEH*WCUW(N"7&1N$R)_: M[:EQN*JW?7U8KJYA)6)?<#38[:&7K=EHH![(2^8V&L'=:PUT#>6O*JFIVAN\ M@E'M<>=)J5F=0.NZ(S$(RC#E>^OF?4YLJOU$XN.%!UX.'(NF`\<:O2(WY)%\2;9WNZD1 M2[^UJ.5T8`DR8ZEC3,OUQ%7/.R0\[@G44;C6"JN-Z(2!N%/S-/LNQSB<5J11 MF6RBD"V7;I^CY],584EN8\T@]+J`#6Z\J*T)7=H+LU&K-#$5N5U^@!5K7*SL M[M=SV4<< MA;=)3.:09YQ'IQKGF&G+)7B`G!7/&&?0W+GR9OF-,VH5JC%.ET:%,R;C"OS= M'F:/KC#%**:14JF;[G878)V;G:I8=(!U6J4BQ)`J)N0O=K2E_K[9F@GMF+6+ M$>FRT/LQW MZ`0:1TC)#,[#<3[;42DH<7RT?;-97R_KK-*^SP]8W(32E_[\T$X8UO9ZEI8F'.B1CEP32G%WV+%U/HV-1$>&`'^;B\+AR%&+IS$L?RL2]3=U,ZPK M$CQA#!/=/)*$HWD)CREL11C M;1/3D4Y4MCY^2^/Q;(6]6]K;R)RXD/O'D6!ZJ92[-LDV-]/VKXY-UI#*8Y;- MAW(/?^$/:D3TM)ESL480M2.E)S3&=&-LHNWX.C=G/(VC'>N/I5B1_IZ^0"YX6:Y6F!RS1,:H MLA(OL:35:@5='6>ISS?/4J`T0J9M+\QW]5;;/)^VVQ1D9[!1)*7CG/"/U6^' M:KU023AK.N[?M&194>\VUPN`A/G*`G>,(H_9LR(NTK$[1M<;,_NC/)@7'0)3 M*5DN'%^V4<7)OUZ2Y0:C@XF4X\APW%F0VR@86BSMC>0H=(@N6\(6\9!&G5KW M<>)ZT#3E6@\2ZDSQ/&T%]4NK2?'<-F-4HBZ1,-><2?@;'%08&NJ[1>^I/Y87 MG5-_`I,!SAN*M9[KB`2&BMR)NG?+Z^JRNKFI0,=`]*C:AR9=[\3%Q*]P%$8D M9=[:E/&>4VQIQ&!%&A=.]E[37_W%=MKYAZ.VF_9;JO3^*V1VN=FJIVNOF.E0#OQV:O:&;Y1;+*Z^KJ0SD2)D,AXB9X+U?F!CX314IM)O9^F_MG.8O M$Q^@[/GH^*`]@J@4[Z&_,;K*Z3HG] M616OTRR1+9/5$OI3KIIJD^!/P%7>S=@QD4:#PG>U9=9[MA<$NJ.(>VN?L4^# M.5"*]/-K<%[X-/C]*_Y:O'X"IGA$DYM1?`)-EDFE#>X\$S4&5_GG,ILUI']1U#=5:4L"JVH]NY-Q0EUE^^) M+&](]Q?FZ]I0G=O.F!6O_FC93*A'F0L>\YS3/#+[=^QEPC<&&B:+L>&;VKR; M])GO"'Z]>1>%;-X-VXE.W+P;%=\;^PNRJF[V^+/Z1A%W M/T\DB8"`B-<)=W.\,*#+3Q0TELF@_(2J^Z!_IU=^(KHTOU27GT@DC0MARD]P M*6.19:RM/^&I^-%$]\_4G\ARZ$=BUYJX5WV3TJY)L;+>F5H3YG?M^A/M6Y%# MF[2+J-_9B'B5(@EZDZ3<0GUHJ&]='!Y+U%W*O)Q&;6?P:6]3-V@0.,2MQ_'3?)N MJNXHI1/GUU<[@_5J4>39#+@P^[)7,R*C)^)&W9H<_5H48Q,''M>SA/=J&B0C MTP@^HV<)%?V:',4<>B;SM%^3@\^A9S+MVELD\V0./9.843/J-)3/H6=2].Q- M)FP./9-].Y9B%G\FTIY=R)%V_(R>"=G3!Y&*.?1,\'[-$YG,H6>"]6N>\#G\ M#BS:/7\F&)U#S^J,L)V&\!9+482K&N?]LB=35=A3BR+O=UEQW%%=?D;;6-JO M1Y&S.;2-\9YUL%3.H6U%'Q:G/`I6MMXL1(68Q57F70U.YUCH(]9;-V4VAYL, M*G3A5%_&(,S";1O-*,V+/,13&IB&45H-)0&Z:V`:1FDUE`?HKH%I5B+](NHP M2G(RKF9^YD40\VN[IYF?U5`(\S,P#?,S+X*8GX%IF)_54#J'GFGF9UX$,;\6 M1C,_JR$^AYYIYM<*,HSY&=R&^5D-Y7/HF>S9Q72&YM8SS=`,+I5SZ)EF:%9# M8@X]TPS-:F@6?Z:85`?79E*GZYEF4JT@@YA41R4TD[+:8G.HA&92!G<\DWI& M*S3C,2_265:YH@_+Q2R+7,_FNHPG.M5%]#08IR`*=CPLZ_FSD.6-MGR$UD0D M"D`2NE:!HAXA2%S7*E!D(P2)ZF(%BEX$(.F=*L0,FR?%4.H2+WD6AM16K%!D M)`2IK5BAZ$<($J=M*9PT#(F*MA1.$82DN06M244(4JIU7-&($*1$Z[@B#B%( M0NNXVB0*06JM19&.`"3--FA-,T*0I):=(A8A2+PM/B3#9*=W>1`SS((U&Z$U M#0E!:O5)$X\0,-X6U0E4*REV%9L3.F62PBNRHG9EZMSP2K': M=Z=*TT[;/U%7^< M05^!R-GZ*ND^`O'KH#(VA[X" M";11\<<9])5W]97/HZ_`#&U]Q1]GT%=@B;:^PH]SZ"O017L&\,<9]!6H8P>5 MRSGTM>B`%G(6-M!=MI-Y/';78<^!R3K+X*BB0<]B=M;`;MV@P0F^*#2#X60S M=218/U8WJ#X,JA[?O^KE\=WMR^U>9;S!##V;C]7V4IUA755XEK-_#\&,'5B] MNEX%034.0Y5Z9FJ#<<[;",^//N*>@CTWY/5KTDL^B16?>6YW'T-"3-_2='[6 MI(VF-6B$/G,%NG=;P1;2-;DA[P7G=^5.)?6`9T$PD]*?UIN/ZSK)X:BCXV,Z M)&3,BSQQW/#$IL<=NA^T$QVY<&D:V"UOU^7^L!V5_F/,[(*0051`-8=7'QTG MCVN]AFB*9[9>O\CMO8X=B=>F_P/AC%?[$ZIYI/O?4H&O6VQA#-I=YM:]'( M,?3+,VG55FK]<=/\W%YXN[!RA^%(/7Z(LSB3'3_T$@G<+?W(ZK/8X^[W]5+@ M^<2E!U&+*YJEU$"?15K*X1G"<7'UDV3#JT&>[(LF3:GZDXDNZ4BOAC>ZL`9& M;S:-B]KLJ866QC&;1?=U8A*)CV>C)Q$)0?55X9O%OU=S7C/MBT:C9'X&O M$S-$NAES.^HC7H\9M2`,VHE<>1E2!MK@&@XFC_S2D2[/>"`MW$S6T:2X:52,#+4VU]X>FO;]L/$X^:N>MT=$7R=YI]&+2K-T>RNVU8[@2O MWI6+.Z+Z7R>T*L>5VAC5)3&@C3@G'B;2WK1ZR?10(^,AO$TY<*/OD+]W0D'% MZ.LP4.44-%?\NW'AFOST\#`R,!02J"<[T3V<0,C:^CVCJKY@AOAI_J"M`N4J M.,0YLS)96F[A'>CAE^0-_/O;]=[G$/1,?1*'X)TGIT,`][^]K'-N7ZNT^DI5 MWI%]^2LJBPI#L0@$Z`Y>WH=50Y;PKV14VO)1?1JZ@SK'A$H=4'<&/4.KL]#/ M@ZH_^69:]'BL#T/['_2A65$Q08V5Y@#_K)V3NCCP6FF"QV8$JR]`?J(@1D#` MELH7M)D&?YK-_`06\U=83/\&__]WG\WHF=)$[]1(:9S-^.9I@LW\-&G')#K6 MY)!^]-3Q)YU]H\G.4L)\VADF+\C?5,*4?_?I(4PG2SZA'NJ"(Z/T$(2HPV7%KX9]#"=^3KS6;E4T$]29]&!7U3Y%3!/]>)UG=/JL:5RNY5CX5< M6GG.T6]Z)S*:VHNA5BZ!*VX70-)N*\S4XU$V7N0Q37QA^MR:AO56\[&:MJX^ MGJ!L31/.T%;2C#KK?'P/ZO8]4+%WY*=^*=16X]J9>OGHUCM/SIWJ[U'=5LM? MJY[.-<,!Z5&"I',=G?@ M7R`/NS6%&?#NL=G)[S?7A]5$SS!HH-(TCC+4"F& MGL[>PHMZN]*M(-J/""]0WG"$;M6ULK%G6$@S7,O&[F)QC,A'Y\!?WC]LMON)6M9OH=4R@247TL)9R@:+ MW,5_VVRO/9\F]#Q%TY5@UF_-2JGRQ42!>YHCQMEJ'Q]=[7FQ*G>[:?OY1QHH0+`0\+K2JKT96[-DT(XC MJQJ/!;4+88[];A!-G3#W]P_,@+VY5F<`D,I%;NUNY'["%DPT^3NI?Q#1T8IG M#]OJ&E-QULG'ZK(>L6?ZHHDM._F[TK=F`KL;P'7RY?O#;J^R%.J-H&F,[EAG MA@D2'8<"NJ;+LUADKC!BOB_=AIM($1=TK-UBLNARO:BF?>KSMX&?R"`.8/;2U.-=]A24]4H2R'$98)--EXW,SDR:T>-]TL"OGWELUTM^(E1T2F&ZQN` MTW"UV)N\NE-;<\?B7#&'3M=V!C&'E(X/'5^7NV9F?4<$.,WBHK"<1C3+V3W_\H7G MR]C8C\;-)X/(H?.ZW\-S/9^!DDMU0ZC7^=7R?HGZ!!J_6*HTE:A/ZHOSOKJM MMCOR_I5*ERDHN5KN=]X/2:R`T):>>!)K?D7+V7"LW]9#\E#G=@`]8\'.14,(7#!JR% M-)[O\A19Z13XYR$KX3A,_L?-X:H?/QMAZ?Z_I+`ZJB&2L:OIM>KXYOR;OMH;H@WX!< M*C]C`+@\.1O1I*FC;.Y=Z:4+NO?G(1I7[_%\Q:HB/ZV7B\TUA!4P&#"7(VY- M4FSM7`22.[Y/_+C?#HK>6")I^G\>(G'U?U\][@^POM0%E>J@T\@%;`B"Z)]1 MZWXA?KO1V;+/(*!+J6.;_^OE[:W>^?)$=(QC$N]>1,>A83%[1#?B-E;*'&'I M^U?EQ55?"$;7]`",KHWM_@N$=LX!/)3+K3YK@I]:5-4H4#']A#N%:@>AK9[E M5SG&8EKT/,-G&:\2EW`$LC^7O_C<@NY\3U2?QRTX.Z]N9:C#FTV!F5HPI9(6 MKJG7NWHG:OU47RGS"HJR6-*S$53B"F*QP,B53U:Z_^WTL\BHC3WB0C_M?#(J1V!=04J)2\3/L`2DXO) M]Y^4=/">FG5#K>\,N]*:]EGD6+<<-SFL>?P?B%7:S0IE;F1S=')E86T*96YD M;V)J"C0@,"!O8FH*,3$R,#,*96YD;V)J"C$@,"!O8FH*/#P@+U1Y<&4@+U!A M9V4@+U!A9W8,YDJ$RB[&[IV%Z>F9Z9A9F=V=YM5HM:D_2G4[2[:WN=+J3LGIM MS=;L9'?W_?1^B2?B[Q[VNGN$^<\?=X?C]_ZZ+1#PE*]S.`*A2.A\3?WU&VWM MZV;\RC''4>F8ZW`XYK9UA`-G;]VZ,54[/BSK^+^-O_\#1]F'U]_=_=_._Q_' MG$YGN,/A*)LY5?L[IB;AKSNV;J@V'HV[Q5%WU M3^K]_UB?JSH[M2#L>VYLYPA]?A^-4) MAZ-\[!_F\/U8>MGIYS^9[_];_O]I/*Q_M.X?JK=_ MY7!\6>EPQ/ZEMRNR_\,GE16S'/^P/__)^&^]+RNOJ)PV?<;,6;/GS/UHWOP% M"Q_/6[3MWZ^[=?S`UMX;&IN:6UK;V MCDYG5W=/K\OM\?K\@6`H'(%@!,5P@J1H!K`<+XB2K*B:;IB6'8W%$\E4.I/- MY0O%4E__P.#0\,CHV/CCBLW;]^]__2SSW_PQ9=???W#;W[T M[8]_\M/O?O;S7_S:K__&;_[RMW[[=W[UN[_W^W_PAW_TQW_RS_[TG__9O_CS MO_C+O_KKO_F7?_L__*M__6_^Q__IW_[/_^[?_X?_Y>_^U[__C__;__Z?_H__ M_'_^7__EOV__?]_^_S]O_W\!X"\8\!T#GC(@P0""`6T,.,.`90#\9]KZ"]KX M&:4]I90X)>.4V$H+9VA^&%'C=QZGW./D($!8P[%^+ M_;\A%-_PV3R7Y+F8E[7K6.,04.;3_%^*$[_&C[SF!K),9^DP"? M4>"EBYFXS0SL9]*S:/6/8LR/;&;2I!,Z36ETCTK?ENF#(CV?8WX_JGYC*9.& ME-!$4A6Z%?Z6Q!T0V/DL\WMV_(>F_5@W8ZI.*&J7K-R4I"I>F,>ROVL5OS*R M8UK*5N*X'.V2S%I1W\?)(U@[^6T.8SPV^;S M'^@3(^J(*0\@4K%#S%P7$GLXXS.[67L6 M(_^F\>UGVA=#RCM->@Z)X^W"X#6^L)N-SV24WS!^_5/MQX/*EZKT%A*?M@MC MU_F^76QJ)J/^-$^]S%*%%"7'J7"4:K&HJP:U1Z'G"LR/\_*+C%1(BG*,#]E\ ML\E=T=D],IC+,]_F[!=I,Y_0I:@:M)0F0[JLB;LD?@X'?I3-/DNF1H.C;( M626OD7NDI2XHL>VB,1.(7V5>3R2>I:*/@37B,?KKM?QY);5-M&8`Z3F[38C-`/(7J1\_CG^5C'Y*62_<^D2].G1>+FX3$M-9 MY>T(.3A`6B42SY$]:?)^DCP;I;;I]"R)>3TB#0X(5I$GLEQWBJU+L&=LL$T' MLT3FU;`YT*^;!17/*%TIZ6Y#:;[2@D]'T4SEC-IW(UIIRUE MBRK-X+F7@WVE4E[+99!TLC,1NQ.U3YG&9D69SO$O!D:+I4$U5X)3^8YXYG8T M<<*T-RG:-$YX/O"\4)Q0WSPEET\;J0WRO8T3GHZ\'6A\)F$(PE^O$UZHT*3< M.2K>'1#/%X5]&7YUE*M40.IM7'QNAR?,]A']3K]VOJ#L34NK;*%"9I-O89KDHQ5Z_YY^^"(Y/M@R-W"KUG\WF=R=2*TRK7)+D;PCL!T3O6Z+^!7%M M@C@Q0FSO(S].4^4&(W_#8Y]SO6_9^N?@ZF-P?)C97F(^3C'E.B/_4$4_EWO> M2`^?B5?'A6-#_-8BMS3)EFE`_BJ*?FIUOS8>/-6NC"G5`_+6@K0D(92IK/15 M&ODTT?TJ]N")?674K![0M^25)7&I3.&E+TO(^USWJ_2#R>3ET=C1?FMS3E\< M5QR*('TY@KSO[WY9>#"9O3R2/-H?VYRS%L M'\E-7XBU;X4SS_BJ<6[=`+LPPSH,0'QG>W]H-'VNU;Q1SSR5]X]*:_O%!6G> MH7/$3U/>K^--G]DUK\W33_3]H^K:/F5^2G1H//[3@O?K3--GR=I7\=.3]KX1 M8TU)FY>2'9J`_V30^W6QZ=-<[]WXYU/R^=/-% M[LQ$NFHXOJYHS4]J#DW$?_S,^^58\[O!6R^*9Q_G#@ZGUA>C\Q.Z0Y/^+8;_ M/DY\B1.#!*$21(@@ZTFRFJ(6,?2_0:3?1<4?8,(@QBLX%\*Y>H*M)L$BFOE7 M<.QW$.MSU.A'-1E3`IC\$!>/$OP"BOU;J/A+./L>3A61N(C:?M2\CVN'"7D^ MR?U-9.PWH:&W4%\!S@E(VH?&[V'V(5S[B!#^*OSJUR-/WD3&\M`@#Q>]2+8. M31S$S8\(Z2]#7_Q:^-VKR(L<-,%"PQZX=!?-',"BQG^82K\GHD\=\./[R`#55AZ-JG^,8?] MA,.?L7B*Q:?PY0+$'4`>`N0"0/\A*WS+\D\!EP+3WF.S7=.HQ'8_2-DZ97;1^DU:K:&D>S?^* M'OJ*ZANC\C:5P:B$DXK64.8^2IU+";]-/?F"&ALEARRR#R5SG63J!AG;2QES M*/&WR'<_(%^,$),&,8H0_1UD_CJ9VD/:LRCIM\AO?D!^/DR\T8FG,#':3@Q< M)W-[R-@L2OXE^8O/R6^'B!^H^&L(?]).C%PG2KO)Y$Q*^;F.OE.Q`06;.EJ0 MA+>+^'6!V,>3\UCZ.Y5[HW#],JM*`!)!FP!N\&`_!^:QX#M%?RVK?9*BB%)8 M$%MYX1K'[V6YCP#[$SGU4HH7A*C(FT'>:.&T*ZRR&XAS&.Y;J>^%6,@+&8%/ M!KA8$VM?9HV=0)E%\S\2QY\+PSF^G^<*?C;3R"8N@>@.1I])B]^(+Y\)3[+< M.,<.^=A2`\A>!(GMC#F#EGXH_N`I_S;#O6#9QUXPU`!*%YG,=B8Z@Y9_*/SX M"?]5FGO/@.<>,-X`!B\PA6U,?#JMO$\BHW$T'D4I"W4;6+V&7U"('1(YAZ?> M)JLQYF=DA,G,XYFU<&;;EJ"F1AMBK"0\4_IS$;1?862QX M$XT-6K9EF+BF]ZC:?5DY*\E;>6$F8%]'\P-FQM23F!;O5NQ[DGE&U+;P\G3` MO[2'^LU^0R^@:K9+3M5)L=."M9G3I@/AA?VDSQC7M6%$Z7?*^;MB^I00W\09 MTQCQA?6NSWBA:9.P,MHI]=\1\R?YU";.KF2D%]97)>-337L%R9,=TL@=L>\D MG]W$QBJ!/-8'I_.(D$&"*;0UCMZTL>,FODDE9XC4:)%)Y1@A30>3=&N,KK7H M8P:]2:%G"LQH04IE13XE!!)\[[$+#6;FFIX\K$37BGHE*PQD7T933^CXF-L> M?&04KVG9PTIBK6A6L.)`]M-HZC4=?^JRQ^J-@:M:X;"<7BO8Y:R4&8/4(1CM M0[H+R(,L>CF)'8CA:PUBND1E1FEED$;[J.X\=3]#74I0!Z+46H.>)M&9$5$9 M$)`2WY7C[J6YBW&VRF;7Z*!2!.EA4^[7X8+FS"IU2?E"3-IOB:LUOD)@4T-) MJ2\.Y:.=&:LN:5R(:?M,994JEO-<_3D2MDLYR7M!41.PMXQN'$(J>E#3^70 MG2E\A4U4*K3VG"(G*>\HU3A(UI2HDSEJ9Y):85/E"JT^$\@)WC/"-0ZP-XKL MB0R[(P&66Z!,9J;X3XQK[B'E49]\/2^=2(O;X\(RDRN76.5)'!^+NH:L1WW& M]9QV/*UNB\D?&V*9R,F3.7PL[1I*/"K%KN7LXREC6TS[V)#+1%Z>',!&B[V# MN?I2^EHV<2P9W18UE^JJ0Q"DB7%L=+AWL/]AL7`UFSF63&RU[:6:[IBZ')]X MCHY.]`R,/"CV7\T4CB4RV^SX4LTH$T3B<\CW%FI]`=^:1,Z-(@?[T0UY;%&" M*--IXG/*_X9L?4[>GB#/C9`'^LD-.7)1G')H-/$I[WO-M3YC;ST&9X?`@1)8 MGP6+8HQ#98CWJN^ETO)$NCDFGAT4JXK"N@R_,,HY%("_BWI?6LU/C)NCVMD! MM:H@KTM+"Z*"0^;PMVGOBT3S9.SFJ'VFWZ@J:&M3R@);WSQ1K!W.GNE+5N5BZY+F`DO]$+V9]#P? M;9H8J!TNG.G+5.62ZQ+1!:;ND$7?MU#'E]"]3^%+K^#J)\BN471E'S8W33A, MVO\MV?$E>>\]%^(?*^;]*M'\:JWMM7WIB'AW5=PRHRW/RG+CX?91K_S1=]RIY M:3)V=,3:T6\LSZES8K)#Y?U?#K2_+]:]S%V:3!T=B>_LLU=DC;DQQ:$*OB_' M.MX/UKTL79K(5@\G=_7%5F:LN5'-H8I_%H%^#L.O$#B'(AR*>C"L#L\$U_[1AX'!F+!(A'.=D62-^'H/E2?38B_ZWGSE>_YN'\B&AS! M0WW.<*X62NU%K5F$]"O/5U_Y/AWSO[("3[#@B#/<7P/E]B*Q683\*\_/OO1^ M,^K[W/"_0H*3SO!P#53:@R1G$LJO4^'/Z,@P#9DTC-)()XW6TMA^AI@'J%\0 MU'N2'B)IDZ11DG92]$V*/D`S"P#SS7Z' MQMY@=A]F*K@>P;4V0KE.RGM)<2[-_13)OT*S130E8?$0%FW!S:N$OIM09E/\ MC^'AE\A``2F):"Z(IIJQ^!7$<4Y(LCQ@.2_@&@!W";"[`#L;@$]9:Q28<:!30'4S2CTC M7V"D'8PPB^'>@\P(DXHQ"9*)]M+60]HX1ZO;:'D&S;]E^H?I4I3.$W2ZAT[< MIZ)G:7,KK520I#?)B M7T#(M_#I6BY1S=KK@5;)B,/RLZ0TP8FC/GZ@F2O4L)EJ-K$.F!4?HG<)Z14K M//7RHTW<0`U;.,JFUP&[@I'RV8"9"E'QL#L6>61!UPWDB(:N5_`9(IE/8T82 M)^.X*XK7F\15G3BBDNMD:KI`YY)`3P`B!GIM\-``5S1P2&'62DPESV03JA93 M,%ON-J4'NGA%%0[*_!J1*^?83#RJ1FW4,KL,XX&F75;4`[+\B2!6<%PZEE7L M-&HFN_38?=6^I!A5DO:)(%>P?#HV(-LEQ,P[]K6"%5/2Q M;(W"QF"G5JI3LA?EU'XQMHK7RUDQ%7TI64\A8[Q#&[RKE"Y(V?UB8A5O3E'$ M'`B`8C"8"[5F(K>2T+D8O-="5^OX=(DT^U&FB`5R6&L:OY7`ST:)/1:Q2B,K M)=HH,4R>"629EA1S,\ZE-YFH?8BR3XCTN#LQ_"C:=]W,G]33.Y38QZ)1SHG,A#\R$G0.AN[UA2_G(T?3 M\)8$\K&%5R@4\Q@-CZ#.`?1>";NR M])$DO3E&+S7H*8HPHV)H0.PL"75Y_F*:/Y+@-MG<8ITMDP`]8H0&](ZB>C>G M7$S)A^/2)EME'2H=?,$[)_D'8]R5(?9XB=V=8UO@Z6?AJO'(YD%H21&9E<(=)M7U M!=SP'JE]A9QY@AP80S_(FI?$F4FR:H3E.-\E'KV*W7AJGQXS MJP;TS05U<5J>84\IA7>^RSUZF;GQ)'EJ-%;5;VW.&XM3VBQ;=BA34?^C%\6: MR>RID>3^_MCFO+4DJ<^R/G26?LOO^R(8&`T%[4@8AR).&+J)(E4$-IYE]\M"[Q/!/1KT]C?["U="Z5V0/0.7?]SY];/84$!#P7P<#,!7261/10V!Y!?PN@3!,NB M&(_B?@QOPO"K!+&7I#YBZ"\B8`(":1AP"/"AH!%EKN!@-P'FT.#SD#8>5I,1 MA8$D#RPU(.(E3-B)\[,H]M-@8C04CX>C=,1T0WH]K%U$E1VX-)/DWP6*(\%\ M+)2APDE7)/80LLXCQG9,F4D*;_UCPX&A:+"?#!5ZPYD'D<0Y.+H-TV>0XEO? MR^'`4SLXC@<'>T+%!Y'L.3BY#;6FD]);W^=#@;=6X#D6'.\.#=X/E\Y"F:UH M=!HI/P>>?L9G,@&<"78SX0<,=(Y!M@%L%DL\H^`2C1@TBM%8%XW=I_'S-+&= M(6<#^BE)%TE&)QF4HKM(^A[%G*.8[30S@V$F<3F/RRHA083820AUA'":Y+=0 MW'2:G<"BN:FS%V:&<;T=U^[@RBE"WD2*TVAN',UFT8R$I<)8O!VS;^/F25S; M2,K3*'X,&=8T6(,$N@NHCX!RC9$/ M`VDM(U0P;(Y-Z2!!@'@OL.L9\RJM'V;4-8Q4P?!94-)``6=R/4SJ(1V_0MN' M:',-K58P0H8959EAC!GHH@L/J,P5*GF0BGY"Z^6TF&:>J(Z'3!<*V(YP%A0VX0T?NJL@% M!:V2\$]$8II`61;!&41()]LU\HY"GI>H?2*U6J#+>=HT>*#Q095K5;C;$G=. MY/8*[$H>E''`T#5&U0**VB++MT7IK"#MX845'%_.LKH68]2H7[:;)?.6J)_E MU=V\LH(3RUE.5W.TDO')J28I?E.(GN'-W9R^@I7+`:^I@Y32[Y.*C6*VED^> MYF*[6&LYJY4#054>D_*85QIJ%$HU?.XTE]K%QI8#O0R(?,Z%I#V]25]](G`] M&CQAAG?H\'(5G2817#:,I",]":@^!E^SD>,&NEW'EBEXY=0Q3.-P$N^)XP^C MQ%63.*Z3VU1RF4R5"32;9*$XVQ5E[UO@J@&.:6"K`I9*P,$#D%`B,=EIR_=, MZ8HN'E.%+3*_1.05]%$YL5FT%_/:5`0/N=Q]GJ:BKS;G/Y,.'HB'UT>A109:H1#P8,C= M%VXJ1&JST-D47!5#UMOH(ATOETFH'W,5L:8<5IO!SR3PJBBQSB07:E291$=* M3&\>-&:8&RGF=)RILL%:`\Q7&8?(1(I2;TYL2(LWDL+I&+_?XM?JW'R%=8@@ M7#!ZLOJCM'8CH9Z*ROM-::TFSI=YA\"&"HGN;.Q1*GH];IVR]7V&NE93YLNB M0^!"^7QW-EN?2E^+Q4_:]C[#7*/J\R79(?"A_$!WIJ\^5;@62Y^T$OOTZ!K% MG"^I98+@>M+;_-A]:]1[;M!_J!3%D2G6WC#HWLF42:QM!;0^BY/O10'MN:QC^.$[,M-TXPA]FM2?KC&#W38!P*TSW&-P[QM?WHVCBD MU/;)9_/2P8RX-2%\;`LS=7Y**5VC=L.@5=MGGLGK!]/JUKC\L27-T@2'Q'6- MI!L'D[6E^)F&/E-5 MIBC2\J;W[DOWQ:>>HX_].X<#:_I"\W)090)UF&3CV^"=EZ%+3T+58^%=@Y$U M)7A>%JF,8PZ#;'P-WWF.7)I$JD>170/HF@(V+XU/CY$.G6I\2=Y^2EYX3!X9 M)G?VD6MRU+P476G3#HUI?,'>?L)>&&>/#(&=);`F"^8E0:4-'"IH>"[?GI0N MC(E'!H6=17Y-EI^7X"JG8*:P#<^,VQ/ZQ5'MR("ZLR"OR4CSXF+E%,P4KN%I M_,[CV,41^TB_L;.@K4VK\V)RI2%.4:3A:>;.>/K2*B`CVH*4%?"]"Z$GD707W3($UU2ND?@78+?RS?Z MN2LA;B?,SL3!YVW1\4XKV6VRO;K7K3;XE$M!:0D_\@M_>%M&F8\+[YFB M[`P23+K,@L=0?3KD5SN#RMVP=`82MZ#"=(*;Z$WGW$G%&X=\T8Z`>2>DGXJH MFQ%I.L$_[NG/NHJR)Q_VIMO]B=O!Z,FPN1E6IQ'"X^['V=Y1R3T8\I3:?-G; M@=3)<&P3;$S#Q?'N5YG>9Z+K<=`SU.HMW0KD3H22FV!K&B$-X5TIW"40GA#A M;27]M\C022JRF49F`GP(#2:P$(]%@CC4@L,W">0DB6ZF\)D,.0BC<03G4#R` MXBT8<1,C3Q#D)I*:3M/]$38*<0#B?##;C+"U*'L<8S<0H)("I9!FAS4ZHGH@ MN1&6;B!B-2JLQ_E*BBT&XU8H1H6C[HC9`.G78?4HJJS#Q4J2*P0*9C!'A3*N M4+X^G+X621R&[3685D&*>?]3(S!! M!$=[@OWUH?RU2.8P'%^#F5-1DNM2V%Z,=?>RWH>L_RH('F$C:UED.HLG@%\" M002$NT'D`8"N`/@P0-(5XBA0,DOYKBRFG6QFT.M\*XV8[K M=W'U`J'L)^55E%!.-_81VDI2+J=Y$^T':"F(%5JP M]&TL<0Z+[<7-E:1:3@D&,@[0D0`ZV(P6;J'9KEE"CI3D+M\2KN M)L5;*_M/B\'=8GBE`%?PN*CZ<"7@D4.-4KA&C)P2X-T"LH+'*GE2E"%,1MP2 MTB"B-P3L%(_OY(D5'%G.48)(H0+=R]./>+J&HT^QS$Z669Y!4F=HRVMM+Z4D8I8W@&#$7`@!.4 M[C'9*W3J&!W?2EM+::V,$?"$TQ_K:;-==RS/!<-W6`ML5L.+9;A2"BAZ6L8T2OE@DRG@*,4F/ M0;9HU"V5.B]3AR1Z@T@O$F@'Q\`&Y]'X9I6[J7#G).Z0R&X0V(4\<'``UE6W MIC8I2JTLGY.D@X*XGA<6)BE#AFDKMT:J5* MS95IAT"[DJ`USMZ-@HLVJ#;`+@VL5,#<*9@)P)646^/2W:ATT1*K=6&GRJ^4 M^;G?PZPW8;;$C#NV?L'4CFK*3D5>*8ES1<'!<[WQ9$LT<<>*73"LHZJQ4]96 MB,I<07+P?&\\WQ+-W;;2Y_7X$36Z4S97B/I<7G9P?-M(Y_VA[JO]O<>+[KTY M[X948%$\/,."'1K1,N*Y/^B[VN<_40CLS80V)".+HO`,$W6H1,M0Z%Y_^&HQ M`.A6H>0.M*V.4\=BR#[TD2&Z+$0HNGJQ]@UE32 M[N;5RQFE.BGOB4GK+7&A+DQ7/K2/&HO1NSG[W.?=WG>/SL= M*H_!#H.H>^:^-N$]->:K&@QL+@57Y,*S4U!%%'7H1-V3X+7'H5,CX:J!R.8" MM"(#STZ@E1]@1MU]#%\=14X.H?OZT,TY;$4*GQTCRDUJ"F9WQ\FK(^2)`7)? MD=J'I)/] MTKZ\N#DMK$CPLRV^7/_0/KHS8EP=-$[VZ?MRZJ:4O"(NS3;%KIBKA[:ZW;[O/5!_\5P:`<"S2#Q MM^V^86<@UA.D76&W)U+O@RZ&D!T0-I,@7KB8J3#U[D&Y[(S>/A MUL'VSN*=[NPI=V)CT*I$I3%?>\;OE(,]D9"K/>*]#?E/(:%M.#R3PD?=WK37 M+_H#X4"H/12^'89.P<@6%)M)D2.]4,H-"UXDY$-;`]BM$'XR0FQ&R.D$-=C% M)'H9SL7X/4R+C[D98$Z$F4TP,PUG!CKE6+<,>B6?6VSV"K5^X7B(WPASTW"V MKST:==I,M^EU&4T>K<:G5`?E#9`X#>-*;3F[,T-WI3P]\4:W?<-K'@UH&R)R M)<:76H>LCG[*671W9QMN>V-&`M3ZB56!BL772ZABGG,.N[M*CWMQU3_J( M/[X^;%1@4@9JTV$GB?2X4-+>(C(+\+#M8CX:MH MY`@&KR?0Z321"835$(2'X9X(\A!"K\+8811?AQ.5%)7RD;*?0@-T=XAZ$*:O M0O1AA%Z+T14DD_"(DD^$_8(SP-\/\9?#_$&86X.R%02(NTS18T`^W>G7[@65 M2R'Y`"1^@@@5!!OK30GN9,03[_!%ZP+FQ:!>%5%7(U(%P4=[^GA7,>S)M7M3 M=_WQB\%H5=A<#:L5N!#M'N5=PV%W?YNG<->7N1!([@]'5\%Z.2YJ5!M#.8-4 M=ROMNDU[SM&^?4QH%8"F`4S%W33A#1#^5C)PFPR=(R/[*'@UC4X#A(J&*"SB M_UYEMW#D'('N([%5%%'.4`J,DPCA10/23\'J3E1>AHOE)"<$\V@HVQM.UX<3UR/1D["Y$]&787(YR?.!0234 MWQLJ/@QGKT>2)Z'83L1:AJGEI$");6&ATRETWQ-Z+_.>:MZWE0\NY:`R#B-Y M5XCW='*^>YS_,A>L9L-;66@IBU2P!,D&@VRH@XW4`>@R@*L!LA5@'P.\#)`$ M@P88O)W&ZVAB2F75-+F5H98RE`/0.`7\%&BC0!WU0675%-A*@Z4T<#``(^6I M7T/0\;A["]8V$NHB4'#0/8T4/7FC&L[58TIU[Y-]:Z3@/!$J$["@WMNMN1^IWAN*_Y0%UXC0`@$I MYXF`ZN]2@O5R^+H4.25"^P1DC8`NX/$RCO1+B%-"'XK8-0$_Q1/[.6(-1\[C M*`=+^T2Z\\,C[LQ5GCG),?M89@W+S/L>9CY!Z.2%!YQPA>-/L/Q>P*T&W+SO M8>;E]0Y.O\]^>)CJ!)#W`&DU$#\"?!E@/5R\G8O=8Z.7@'FJM3'1<3/>=3;:>\AR;S5\'VO! M60KDD'!GHJ,P#8M]+$:F2TC92+>&?,U1`.U5NBL&3ZD1[:I M\%(%G2-A#H'LL*%Z$ZDQT-,Z>E#%MLGX4HF8*9(.GFXWB7J#O*%3IU7JH$)M ME>BE(CUK"F8\TVYP]3IW0^-.*^P!F=TJLDL%=M;W,&O7E8>:'X6QTW!K$VS'JK6=<4\*>E5HKJ%5Y9PTBQ.<'!2KB1$,_$A`,6O\W@5VO<1S)7*;(.@:U+ M:M?CVNFH6F4JVW1IM2I^)`F5(N\0N+J$?3UNGXY:5::^5=-6*\I'DEPIB%-F MNS'>*+,AAXY?'^LZ/]QS=,"UJ^19F_,M205F MQ,)EW\/L^K#[_*#W2)]_9R&X-A-:DHC,B,+E!N90R>N#P7-]XD9!EWV`6;@6HD]6^`.Y[CM279-C%UBL3-TMNS[CMG5HGPV+Q_.RML3 MXIJHL,049FA\FQJ43^;-PYG].T)96U47F)*,U2Q3!:F8#;9VI3O;%.Z M.N'>[DZWZZ[77*M;Z?#"7?[.GL!==^B,/[(EC$S'\/%' MH4QS6&J+1#JA]F[XM@LYY<4VA?!I*#GR@$@UD'PS&6PC6SO)6SW4"0^U,4A7 M(O10G9"H%[A&WM_"MW1P-[NYXVYV0X"M0,#`'2/VP``-NJ]9;6Y7:IW2,9>X M/L!7P&S_[53T?A+4Q[U-T:96JZ93/]:KKO=+Y3#?=[,_>J_$/,Q[&M--+8F: MSFAUC[G.IY;#0M_-Q]&Z4>;AH*>AV-B2K>E(5O?$UOF,J^'/-61P$8D,IW$\LYNH\=%N3P>CZ_!%[@>"!T-1S;`R#0"S[4'=&>( MZ`F[7)%''NB:#SD21-=#>`5.IELPM0/'G$1/-_'015[UDH<#U+H(58'1J296 M;N70#J[+R3[H8:^XV4-^L#8,*E&0:-"D%A5I4[LZE?O=TF67>-`GK`GQ%2@; MKT^(33&X->KLL.YW&9=ZM0->94U(+$?X^,.BV)B#6C(=[AW@NP MIPKUK\;#E11F>KI87V\XX&X/>N^&_>" MT/DPO`]"5Z%8.4%JW0C=B_G=6(L7O^4GS@6)?1%R)4*5X;3J9*ANX.L%S6YP MRPO.!L">,%@!@S*,43IDLDOV]LA-+NFF1SSC%W:'^!405XZQA.G/='=?G-Y1"U'!8`VPFAK+]I1CW==PWM/$)X=I'\9%:Y@4!#I M@J">'MC]$/5>0_TGL.`.(KR,A"MHG`EYH;"_.Q)\`(6NPI'C"+0=0SXFL#** MH/U0.(@X0^C],'HE@A^'B6THL10G'21%>:F0G^X,T/>"])4P?0QBMB',4HQQ M$`SI%H)>H<,GU`7XRR&^.LQM@;DE*.L@`.$R`AZ]W:O=]:N7`O+1D+0%$I<@ M?!G!XKU)OSO1YHG=\5D7_<;1H+8EHBQ!I#*NS9VY[4U<]$>/!JTM M87T)K)3C?`0TNIC69J:C%G2=!;T'@'L]\"\"X3*`ADFGB^IIHERUM.@6%\PVAFV'X2MJQ'C M)*3M@Y4UJ#P?%QTDYPUF.D+I^^'DE7#T1,3:!QEK$'4^)CNF@"4WMDJM=\6. MBU+74;%WA^!>+OCG\&''U'X2.EN$[KM"[T7>0"*[C0'`XJY_`>UMW, M>>]P_@MLX"@;V@DBRUGX(Q8M8XDN)M3$1&XQT'D&/L*@.QEL.8//`80#4%T4 MUDCAMZ@/=S"/TN1.FEQ.4W.F8,;03I)I),%-$IPCP1$2[*#`RZKON!S8*X4VB.&%(C13 M0!T\\4@.W)%#EZ1(M0CM$>`-_)3*L.D"H1R)R6T0O"MA1`=_#XQLX8B%' M3F<_P.R10-T6J(L\?92C=W/T>I9>R#(SOH?9(XZ_S?$7.?XHR^UFN?6`70#8 M&5,P8T$]J]YBU0NL<@3(NX"TCA$7,,)TYD/'[`%KW62M\\`\#/1=C+J.5N;3 MTG1&<##6>;?C*U;!#QFZFVR\GG2<2W?MBKDV6 M9[GAGZV%*KZ'VHV2)=\3W,:@QP00?5&MBE@`TR6":"V0*H^!YF-W3Q@B8=5<5=LK!> MXI<)_&R>*_\>9MG>AKWE]LVYSK M7)'NGA]W5=H^AQ%VJ-CYOK83Q<[]^:[-F=Z52<_\F&^:%73H'V!VH=AU/-^[ M+^O>G/*NB`?FVZ%*(U*F(0Z9.)_S',OX]J8"&Q.A%='(`A.:IJ-3JS@D\EPF M="P=WI.,;(S!*RQDOH%5JO@4V!PB?2Z%'$NB>Q+8QBB^W"3FZT2E0CDDVB$P MYY)4=8+:$Z/9L7*J.RWNB\@937*X)"Q2A4OJ@LJFHO^&AW=S(M+7X.CN:NKMJ7;W'?=[U MX5`YAI;N=UB/NNCF'F^;NZG36]/M/^8);0A"%0A6N.LQ'_K(!K^[)=C0'KK> M%:EVP>L":#E,Y&[!6AV,/T1Z&M'Z5NQ:)WZDEUCK(\LA*E-#JW=H]#[=_8A^ MV$Q?;6<.=S-KO$Q9A$E>D^6;$E(G=3T4'S0*5]KX0UW<)UZV+`(25VRIUH+O MF%WW]0<-ZN56Y6"7](E'*(MP\4LY\48:OIWLNA>[_\B^W&(>+T&W\LZZS/WZY)7FV*%.ZQ.W5A818^T/!6=CI+NET]5QS]-UR==[,.A= M`X4J<-1N;N?:G>'.GLYN5YW+<]'C/Q`(KHE`Y1AF-;C8%D^HW=?N#-SM#IUW MA??[X$]":#E*Z`_"3",4:(%;VI';3O1<+[;/BZ\.$N4(I=TCJ7K*UT@UMU*W M.JASW?1>-[TJ0)?#C')'(!\(WD=\WK5E3ZI#.*EVA)^ M-^]^D&EXE*QMB9WIL/?T&"M\:ADD"+T/,7>CV]O2X.^X$>PZ%>[=!7F7H:%R M`N6=;6A/I\O5W>!QW?!Y3@9].\/!Y7"D',>X]E[$Z>[M\=:[_-<]P1/^\(X0 MM`Q"RC`"M(2@]DB7$WK0#5]U(<>]Z/8`_G&$<*`4TXB'6PEG.W'?25[M(8^[ MJ6U^:FF8=B`T_8@--7.=K>R]3O9*-WO,!;;ZP)(0<""`>J@&&]6.%N5>NWS9 M*57WBEN]PM(07X:PY(-XL"':T6S?;3,N=^K5/>I6C[PD*);!''$O%ZC/M#>E M[K3&+G7:U=WF5H^^)""7P3P6?.@+-;:&6VY#'1?@KL-([R;,NY@(E5,(XFWS M^#M;`EVW0[WG(YY#D&\3$ER,1\I)#';U>#RN9I_G5L!_/A@\%`YMA*%%*.(@ M<*@[X.H--;K#M5[HK!\^&$(W1+"%".[`R7`GVM.--?1B-6[\K(\X$"#7A\D% M,.7`Z%`[T^UD'G4S-2[FC(>I\C/K0F`!Q#@P)M@J=75(C[K$&SWB&;=0Y>/7 M!?GY$.=`0:#%ZFHWZSN-Z]W::9?R7]EYZ^\HKR_L^]R3B1`E1MS=B`L0`9(` M$0@0)1[B[C,9S63B(01W*6ZE.*5`@5+:T@(5**4M5EJ*$Y],QOMQ4K8R4K.Y6=MY!3.)M;XLTMM^)5Z_$;J%9F97-^`:,P ME5FRL*5\-JO2FUUCQ:G3XS51_):*AM+\IO*4YLH%C)K9S#KOE@9+=I,>ATEX M[/+:FKSZ^N4-#3%-C6'-S5X,IF5+BRZ;3;C3HL+B$PRNIY.94\Y;6\&+J>&$-?*\FO@6#K],R9C6T6S6TZ,&9L07%I7U9%7U)5[_SJ[I#:+L_Z3HNF#AUF.V&W%96LS2I? MNZ1RS=RJ_N":/H_Z'O/&;AU&)V$)"P09Z8*L!$%>9-M*?T&)LZ#7GIO,($7G$DORR`7^G,KS9NK=,2-,&8Y;%+TCAE\9S*"&ZU/[?6F5=O MS&^:QF>05G8.HSJEI7912WTXJ\&/W>3,81AS6[1X+,+G9CH@'&%J=_KB[JQY7;G!72O=NXJM.LMU M.ZK5.AJ(L"6E(R^Q8^6\CN+@CE*/]@KK]FK=]CJZL`G&+*6M.$%8.E=8$22L MV#,5NXJC!J54E0 M7YE[;Z5-=[515YUF9Z-:!X.TLQ?TE$?V5`5TU[AVU5EW-AAU-&FV,VCM+"+D MQG;51G35^W!3@E8B:(T1",+;VOS:VIP%`DN!P%`@ MT&@54`(!$0BB6SOG"+K\!)W.@@[+UG;#UG8-?CO5.F53([:FA6S.]-Z48[^A MP&1MD?9`&:V_BO0UD.Z6\,TY09OR/3<4VJTK,5E3KMU?I=972_4TDBY6^(:5 M0>N+/=:5VJRI,%Y=K=U7J];;0'4S2"<[?&U9X)H*]X$JJ_X:H[YZ[9Y&M:GW MI[X6FS-0';BZUJV_WJJOT7#J:S2&6F<+Z>"0=M[L_H:`_B:W5_FN/7RK+KYA M)U^[HU5-..7*X$7#NH5^/>TN/4++KC;#CC;M]C8U(3SJU*\MZ2D]61DMN=EE M!?D9147Q9:5A596V]76$R=RX+*\K;25S17%I3EEZ0<6BXJJ0\CK;VD:*T;)A M26EGE5Q5DU:7MV"POJ@LB:;:B;5Q%X7W]">U-"8W+@RO3DEFQ%;P`PL M85E7L4DC=\U"=ELBIWX9IR"5DYS)CVDH:TW:B-O MP?K:A+4%2P>6I_7'9/7YK^RQ+.\B#>T]$3MY,5MKXS<5)&U8GKHN-G,@H*#? MLKR'-'3TYJ9P"S)JBK+S2O.7EA?-KRKUJZVT;*RC6IC=*W(Y.075^46YA:5) M)15SRZM\J^NLZALI9DM76@D[L[PRIS*[H'IQ46U4:;U/59-E'8-BL-N7US+3 MZLLS&S)SFA(+FB-+F-X5+1:U;-+,;4MJ8:2PRM)9*[+8"7F+2!-K:UQ/4U)W27)71D97?'9G>$% M'1ZE[6950M+8QE^TKG'QFN+EJ]/35L5G]87G]WB6=)M5=9)&(7_!UH;$S<5+ M-Z2EKHW+'(C(Z_9R4E=R%Q=PY9;R9E3P8 M4=T/QJQ\A3`O1YB<+UQ0))Q3VN93T695VZ;;.&7,RM-[\[)ZD_-Z8E=VSR[I M]"GOM*KNT&MH)XRV\K2U>9EKEN<.Q!2LFE7.\)A%M=E9]?E)#87SFTJ"&>7NS,H9K%H=3B/A MMA15%6;6E"RI*YO74!G46.W67#>#V:#-:B8<5F%Y949E=6)U;51M?6!]HVMC MDRF#,:VEA;`Y!24-Z>6-"95-D=6,@%JF:T.+23-;B\DA+%Y>84M:"2N^G!U9 MR0FHX;C4<4V:>)H?C%EN06MJD2"N5!!1(0BH:G6I;35N%&@Q!#!FN?E=J85= M<26=X64=_I7MSC7M)O7M6A^,66YN?^K*_D7%J^:4]OI5=#M7=YG4=6HW=9"6 MMBQ.RG).Q@)N]BQ>O@^OR(Y?JM]:26^M(ZW,3&;VLI:\6-;*6>P2'TZ9';?2 M@%>KSF\@_)8532N7-A?',,K"F!7>+=5V[%H#3H,&MYGP6.EUY4L:JJ(;:T*: MZ[P8#78M308L!IW30KBA1._RHQ?.ZVU@=[:3%I9B2UE,:R*6>PJ M'TZM(Z?>C-LXC==,X[40/B>!41/-K`MKJ?=F-3JPFV=P&%K<%AJ737CR;7M&7J?]Q3'XQ9 M?)U@?D-;2*/`LTE@QQ"8,@5:+`'M@S&+J^F<5]<5W-#IT=AAU]QNRFC7;&FG M6$+":8M>E1S>E^'?F^7:DV?14ZC?74+OJB2==:2=.:\G`MJ[04-,P2-^JW-ZJU,JI4-8Q;% MJP_E-WKQF^SYC!E\IAZ_A6X_'H7_X\I"T MMD:Q>"%LOB>';\?AFW+Y>EP^G=M*/ABS<*8PB"7T8`MMV6VFG#8]3AN=TP8C M2GB"L/7)`>O2/=9DV@[D&O:OU%A50O564CWUI*LE9.T*WS4Y+@/YEOV%!GVE MFKT5M)X:JFO*F(6LSO7M7^F\JLB\KTR_IU*CNYK654]U-I-V5FA?\4L>> M*MVN6LW.>EI'$S:0"#DAW14^W54.736F776Z'0T:[4VTJ?=9I(T;W%'K MW5GOT-E@VMZDV]ZL(632IMZ?^I(P4-CDU:"EMTA2R--C9-P,7[1,`/ M%+"]VCCV0HYI&U=7P-40\&@"/K8"[BN`W^HI$-BU"4P$K;J"5K@R6NO4EX=3 MO_[W3]S];_W_?U[___TW0=7HAO_[-T'_=V#^M_[_C_5/A+N4B`(]:\=\`QAC MOG.98WY)+6-^^:Q1_P;V:$`W9S3@(^YHP&>\T;Q+'.16(YKE7CH7Z,D8#9_%&@N+X(T%9K2/!-6TC(5W"X=`] M[<.A5SN&PQYUO@\;[GP<,M)V![FN!(QR3OF/L0[ZC3'%:0XY$TFNI>,+?!I' MPH/YP[/F=PS/2NT:FEW>,S2GO6\P?-^JP8@;J]]'/E_](G)PU;U90]U?A`UW MG`X9$1X('6G;&CS2.EELES&1ZUPH2O>L&4WTYPS-"^\=C$Q<\WYNX=IW\_GK MWT7OW_@V]M;F5[%O-C^,?K?NQMSW:TY%#*[>.V>H;Q/R]:$V29-ULKC&(4=4 MYE8^EC>3,9PRJ^M=_((-;^*RMKV.9^]\E7C@HY=+[N[Y8\FKO;?BWFP[$_MV MRY[Y[S:LCWJ_IA.Y.,@EZ;1:(FZUSYA@NQ2--WG5CU2&"-_ES=_P,FWYWK]3 MFXX\SSCX\9^9OQZ[E_[\Z+FE+_?O27B]:V#AFVVM,>\V-8BU_MJ8Q[LV/E@K=;,Z/?;90=-9TO.62Y>/*P_8J)_2XE8WMG,H9V MS>E[M7GQ1X^[2B__.GGYPX\[5MS MYZ1XY1MFOBL MT\KQS[SJ1JX&"][]/'_=]W]D'EOU8\=W==__?*W@_-.S&1\]/Y:T^N6^>-[K MG;&-;[?,JWR_/JKD_<#46J1'D>-CNU3Q:<<\T16W\O&G7G6_#H5V['JQ_&## M(^;%O#]NG4FY__Q@_#>O=\[_[-V&R*.#`W.V#W6'K1GN"!4,=\@.FVMKQ-V9?]9?C+Y[T\.Q;]XOB/FE[<;(F\/ MK@K]\88\D^,9LNN(NX;S9$.&X<_DU@D7IEP*1H8"194 MO(W=O/1EP?ZX-]MWS'M[=_V%T6UBJ]U MW16/=5RE(EWWO^730[Z26";NFG`I@=BXF>_GKEGP-FOKW/=]Z^8,7>D+'G[; M%O#'*-?W_AC3^X?Q!H_O1#5NWX@JE']JF,JD&B9_*[0=OY,;AAR16"WI01W5 M8S,924-S>J+>IZV9/<3K"1DY*O0?O<_Q&AJO]WH\7N]Q'^-_%%6XW)XHD2DH MM;]5].G?*[2=3LN,9F^06"6QQ$X%^>/>]0N&0]MF#2_M#AYI:O,?W<[Q&;_6 MY"%Z5^/Z;J+,Y?%$B7QLI<-;<8[]$W&VW:^3F>(P MIWR1KUO%N*=OW;A79/VX]^*&<9^=]E35'O24U0S&6N?-<6R\4"ONK&9(8PQOX5@608X5L4> M]>_\EV.!G_-&`A_Q!P-'>4_\1]EW?,>85V:"83[CC0>0;S+9-EV<`);-=Z\: M"_%GC01%\4>"EPE&@DO;AD.$8-@>,.Q&YU#8\ZY7H<,=]X)'!->0ZU3`*/N` MWUC+%N23%%@O$V21B5MO0[+B>H?""WL%P7O]@Y+Z!]U'? MK7DS]]V:AQ&#JV[,&>H]%3;0/O8E9L>!O;LOG-P@-;WRSZ><>SN-?;;\6\W7!Z[OMU'X$]:\&>#G", M!8Y)VV?$2GA62\5,AVQ1O5O%:*D_>W!%Y.K72Y-VODQJV`?)''R>^ONAN\M? M'#@'_NP&,_JCWVW@SGV_M@&Y*L*'5LDVF41)UUG$3?9#^SW.A6,"GZ8AYNR> MUY7QNY[E%)]Z6G#@W&^%#\]>R/WS^';PIPO\:5KT9GMY[-O->6!B!G+)CQB& MR@Z!0_LMEXCWVF>)=KM7C6P+%KQ=OW#+'ZTKS_["V'?C2L.OU[>6/;[05O#7 M\;Y">F!\M.&D=*3YK'39ZU39LX[U(\]IDO M\_WG40-_75UQY.M/CUSO7/7C][7\WZ\4-3P[F5;Z]]&DO)?[XK+>;)_BS[QD MU'$<.4Y\R+%H\HQ-RL1GS@7CU[&WCP)YMU_';6O]M?5*Q???;)LETO M#L3WOMX5RWZ[>5[]^W61Y8.KYQ0-] MOM@8]/>#46#$7T+WV1OBWZW=6/X^[NK@O\>:0N\/\J=>7N,X?7U>+W[ M-5&5VV<3YV1@ZD#T-&/A?ZC;QC^3S#W/?'Z]R_%U6Y?CM1ZOSU1)'J.4672"FU9RJZ_C<*'>=# M,I.H[DG;M'*1>T7<2!`O;#BI(WB$+?`?/-'\4J' MV^+DG%+H>:V2F\YC8CYP)UY)Y8WZ,P-$$GM]8/<9O;O00 M7:UVF7A;XC`HSG5X"GX\F,RRO3>9_G""D%M*2NV\4F/&5H7^S%:IZ;S*2>ME MR1/.!;,`D9EC"YN]Q\L:W$5]5:X3)TJ=Q/<*["?&LVS?3F;8/)E,M?Y5DCP9 M:)\YX>52..'F4R9R"Z\0N2=6BMQS*D4>=54BC\YJD<=.Q* M>(BJ?W,757[K)JJXY#91?L)MHFQRODVJ.`QWTTSW"I%G8.VX5TS=N'%8) MGK6#9[O`LTO@V:/F$>_QQJ=@SATP[`KX=1+Y#B`D2RV3)A>BEG"7XG%_[X8Q MWSF,*4\VZE\,E@G`L=W@V'7><.!SWBMXL7O@SK7_&+8?^;9XC==+\Z"3=)L4 M\1+'?%&T1_5H:!![)'BA8#@D#UZ,`X;M[1J:]5WWNUF#W0_!G2_!G-.!HYR] M\&(;?,=:>F:.,61UIM&2,LLED_FH)KV4H,J)[,"*M?S"*,?!^WOYU M[^;?W_#7_'?KOX,?.P7V[)XUW+4&^=KA[UCP8S*!<;B4#:TT62\75SGECZ_T MJA].#NM\MRAATYM%-3M>)QS8_6+)XSWWP)\I'[5SWOMUO9'_>JAZ<*P,').O M-PB4K8%N^RSBQ.T.&2*N>_EH?2#OW[LM(>+USZ<*W6Q?%O-L8/>_]6L7' M.JZ*$_J^\E-&LZ6GS6(GS]FF3%QP*1[]W*_ES96%ZWZ\?GX;K^/^UQ7L1Q>S M:IY_O*S@Y8'X[-<[IO@S-_G]FO"EJ.,8B=9+X*X>LT1>. M>3?>1?+8CUH/%]Q^>#+]D^='$K>^^BBV\^V6N;*3\U/62*(=*OS&)E(R91]\3V60-#LSM3P(^DES_L773_S?;(ZX,# M8>>&.X/VC[3Z;QCE^'6-L7RY8TS%01UGQ<>ZGHH+^CZ*G_0\)T=TW7_'W7U$ M[)37.!(J7/@F:VO,NQ,;(UZ_Z@_[&?SY9I3K)W'$5&U^RY1I?*X MEHWRFJ:EZG=U(\D$7?^14MOQ/'37*W;*SQD-Y$8,IO3/&=K4&S+TD]#W!=CU M\WB3YY1WN2$J=[D*_5\0KU1]0]-0/J'4)B04[;%*3><*/,1FJ5ELD]@Q-VG, MMSED9+$P:*2]U6_L4HOGZ/LZMS_A6^Y/E#C?F2ARO"G.L_MZOB?D MH8)0-U1T@WT*/>\VJ=F"$K']BIAQ[SJ_L3@6Y,'P&C]0YR:Z7^XX.I'O\$R< M8_=@,M/VI\ETZSN2E"=/";D_0LA72HKVL5+#K%]NX-\HG1&[8M(N?8[(H\)K M/*;>4U15XR;:5.X\<;700?PFQV9H,LWFJ62*':4+7;RSA<[S2X0.\6OG'#.0M063CBW(W8433B? M1_R,&"YZZSQ1])OS1.&W3N*5GR-.(B01\+:!=AEB#]>5$Z[^)1.N\\&SU'*1 M6SFP+`37=H)KEQ"/*L?`KC\0W[M.E'WN.E%ZTG6BY(#+1(DT$1XY&IH-=<@5 M>7E4BCQ#:\8]$\&S0K",WS#NO:MQW/M:XZCWWTVOP9Q[GN.UU\"ND^ZBJGU@ MXA:$+!M>.QD^9I%MQK\L\P7+HL&R;'",Q?Z78S=Y[P.&N0_]1UE?@CFGP+`] MR+ MZOXV9%AX&CWE1^@I!]"?ML&+,9%3SM/WDS.AV3JS!9.EN/>SH-E$?]90U(+> MP:@*<&S?NK?SGZZ_AW[P-'BQ'>SI!L=8X%@M_%UQT`A?L4;'6=ZO[R?KAN=O M!5L9=BM$%9ZU0^ES>M[$94YQ;-?CQ<\_^C3QU4=;%K[9R@<3:Y&K$!XJ<_90 MSW)P3/F1EJ5BCXZ3XB-]7]E.XW#)%LM$\1JGO%$A^%&>L/59P=Y]EPK_/+HF MZ_FQQF4O#N3'O]Z9LN#MYH3Y[]?'1@T.S(T<6J4\HF&J/#;-5G%"QTU^RB!` M=M8D2O*IU6+Q)?NL%Q<7U_[XY84:=N?O)PKKGIY)*?[[<$(V/,P4?Y:_'YB3 M--07ECC/"8/>O.7[WQME>W\U MWN!^&=[C+/S#(3!@!_S'QVK:BFLT#>FOE-K0"*'N*]4T3RETW3HD%O'I(O?R MP-%XKM_8FI:9(S\V>[P05;O=`S^^G2AV_%*<;W]%G&7WZ63&Y'5"AN\1\M=S M,$!"J,_@9=;+]?WJD"-.Y%KD/1[;Z#G.K747?5KE+!HL=G@.WW%?G&W[_62& M]4U)BM57DJ5_?D?(K[\2B"AT%)?F.8C7@QU7,JPE;Y,M1J2)%G]($\U_E<:;W9,NNO8S(>?` MH4-B0@VHU+29V,^58%F\=$;TS$F[-(?).=EVD_DK;"<[TZTE1Y,M)?>6F$^* M%LT8E,;.>(KX31HC];!8++&W2YVT]4B?M)N5,6D7!PQF(JH10L1VQ#G$O15B MNY$5[^TF,W]'?(>XC#B)D,Y"[^%CM732R7&%V,$W6^PP+T?LD)PK=BS+$SL* M$#L0%Q$/\T0.XMQGCN*\[Q%7',6Y)_%Z`"%;!)\=8;Y(X@\?X^*2/^$<#/XE M%$VX%!1/N'!+)EQV(*Z5B%R?E[X%NWYVF2B^!AZ>1.Q';$'(,^#7E^#.C[9, MG`R!C_'P*A6Y1X%]*^#IF/]YNF]JAN'G'L&#W0"_P+#*/6#B>C=1>3=\G:), MSTM>@+LV#1R*1V\W&SW93/^Z<9\EC6,^=>A+=Z$O_9GQ$I?,M[X?&-:T"PQ; M#5\G`,,8Z$^5+=H.BD;DJ3(,DQ;`.Z38ID_UF*-!49R1H&+^2-#NUN&@9ZWW MX9M.A8P(M\&/=<';M:!'K0;'"L$QY2IHKGN:O4*(/!S#6=)Z\T7B`H>7K#<,DO?!5+4[Y[[+GMSVIV,N^D/Y\H#OQU>ZJN#<[LN!]EB+? MPHBAOOGAP]WALX<[50S'\2\)P>U#W41Y M7<-,]I"N^^39#/O/?U\GNFI3"+QXRHO:\'XCH'UP5QAWN"*Y'_U0ZRO// M'V7/S!YCJ`Y0=.51FKKRI)J6\I*:MOPN3>/Y&$6[+-&RZAYR6Y3X(KLJXO6M M6O^[HTR_BV,L[^/C#1X[1#7NJT55[FVB2K<6485J/Z6F/$;1Y9_2Z!,_4+2_ M7A'RC8Q&WZ[0=EHIL4SP%,W'G;^_PO7]8)G'75&UZ_6),J>+Z%M.H?\X(,YQ MV";.5AXBU/@%0KVZ"0\"+W)SF%"'E6K:7+F^[]))ZR6N$U'0?4^AD^C[`H?7 M&'=/G&/[+=AQ'?K_'/H_+TEZ>X:0QU\04!B::2[,6F4G;%YI)CRTPE=V;9RP511@-RN88/96%&_TFFR-SFA$MM;). MD%JX+99:ABS&U(@5B"J$<+'48COB?*+4XEZ"Q&(D832/ZTE M*3\@KMI,IIZVF4P[:#N9+I]OX"\+!8<\S.,EM@XIDS8!:9,VB](F;?/PRD9L M1UQ-%=O\E39H.YEQ'^S[`G$*L=]^,FN+_62V8IFNFWP1>IAP<,C':LFD@^N* M2?OPK$G[].Q)^V;$=L3766/V(UF/P;T;CN+\4X@]B`U.XOQN)W&!L@#W=1;T MN@P\BP:'`FS!1._\":=X,+&F<,)I>Z'8Z6[!6SS[';S<"3=1V2XP<36B%=&, M]U1-].G*&NB^!/5D30^!QUL`?YM1D<"P!')O<0HAJ"Z%4FV@:JO5@2/\T.WF[ MOI^DQBSV16Y,WH/Z7,B(("1KE MB;83(M]+B/(@H91'*9KR$QI=>8:F^?;X#(>[QU+\KY_<%]C7_4OA@O2WFZ-3 MWJV/2`)#$M`'@3T!"T>Y?@M&66,[")$BA^((H12G"26Y0JBW./O?_VBD=_IV MG,O&FWVA]9=_3`K<-,H+[`!WF*-LW^HQAG?A>*-7SGB=9X:H9@1U3"+'Y!%" M)LZB#[E!R+W?"?GXI?JTSC\]O3,?KERP^,FU>)?;$\5NYT3EKH92_T6S9#6Q\Z0GHF9(1F* MF?%"%C/C%YS&.]#^-[*Y)E_*HG[".BY=`+_`@%WW">E^3ZAJ>)D4I8:YOWQZ MX`R9;[2)K'BNB6Q7E(GL7I216#K'^$]H_@'B1^C_EGSVU:/@SU5"=MXFI`\< M:IZ@:`4JBKY(J6GA(9\>8"+SB3*29<\QDO?/-I)?GFTH?QUJ,"X/G/Y,'C+] M5WF(X5UYV">GL7[LPRKX.M9+0LJDE%K:/S2-N'NXS.C\')G1S[/D1B-A(B/Y[,>FLOFW9TACKYI)%YXQE\8I/.&O[8QG MR\RLY\M,/1$1B*6(XGDR$_Y3[/5QJ+`W_&V-_PMAKYM+X,Q;2 MQ$/@FF*VMI/<5]]?YF`2*36S72`U\UL@G;$`D1LKG<&*D9ENBY:97ITO-?EK M[ACF?V`A3;AN*5E\!CP\`!9NM98D*^/1>\S3<9$'H6=P-ITGM7",DYK/BI>: MI^"U<9'4;-M"Z8RO8R=F#,?^@;%?@9]@:,H^L'`C.-AM-[E"E:.FJTS1,%?$ MH9[9TX/`UEB)E5N2Q'(AHA(\WI8H-?\I;A#KOC7%4#!P%QBXVD&KKD@>UD&AB8 M!P]7V.$R4=0,;U>!R$-O.L&![MG@!X-&5]72#90KP8^E!H$2/YO$<>?XC%+DI_U6*R(2_6^HAJEF$U^>=A`SV$")9!?WW(5\G34/) M4C<:+S.>^:@P/OQ.S<:0\WGW%W+\1QEY@:/<)$0,>M1P_[&6$+\QIK_O6//C M7FAN@)!7&PAY!^T,[4+L(^2W'<9Z-[8GVIS[:(/MNMYO(^/37K-#XD>$08M& M6OT7P+O$C#&\YH_7>\X3U3Y"CF?(\7PC:Y)WR6> M??.9ZW[AZ][DNO-$E>X-HBJW,E&%6]Y$N6OF1)EKVD3I5(ZGR/$,.9[M!`.@ MGZOP$MN@/_9=9[,5/^3Y)/UXVL_GRS<+K$](EMM]-+G";CVB&\&9S+1OF,SZ M'7OQ>#7\RR;P[P`AEZ'A_=`?[Q6A4@=U3;Q?104[O=T8:/7RKU#3GV3SS:Y* M%YJ=!S>.21>8[Y$NLM@D3?@-.1ZL(>0K,.#34QC_)2$]Z(G*H-\HI;J!H=3= M7U_.F:DO_<['8%`>8'Q/%F[\C2S"^"JT?Q':/RT+?]"%\=C+4V#AWDN$]-\A MI/%O0J7+*%J`2L-87^'BHZLH]]15G/#4D[_W,G@I#YA^7QYL>$L>.OUK>?#T MZ_*@6_A,3^-S^.@<&(H:6AX04CA(J'@%1?-4:9CH*9R\=!79[CJ*+:XZBA_< M=&1R5[WG"F_]!XJ9^C\@OE/X?K89\W],R,#GA'!O$5+^A)`,>,MY"DK-"3S4 M53BZZ2A27+2574[:R@M.VHH7SMHBA:/.GPHWW5\5'KIW%9Z'L0_K4$,K[H0: M^*%<^*$EXQ1M%GAHH]0TU5$X.&LK%SM.4S+MIRGW([ZWUU).V&B-*&RU_U`X MZ?RF<%&8ZOG(#4P#Y`9._G+]`#^%?HRO0C]UID*OW%NA)_!2Z&[S4.B</PV:\FR#O"H&0PL M!\_0@.<\JR'D=37N[0KD*H+_R$`/$JUI)7&9$?S6-6'VX]`!O[NS?O`_8S.1 M.`!^,C"F&-XLPVFB<`GZT@5@V5T&],(DY!'B+\2[9GB(:D+]E6MD]GW6`I=K MA3T.)W._\FH-?9N6"?\6[R&JFNLIJ@Y#!'J)JGR]196W6-`K%YZ!#]_1A@#7 M[D&'7W;JJI_NGF>P?U6;05_K99?4K*>IGG/':SWFBJK=H\"02%&%:P3X$3%1 M^AV;D-O(\7TK[O\.]!#0SS5P8/]!-6K-(;]IG,/5AE7[3UK'K'X<9<>8S+"O M$F<[K$3ODXU>)@V1+,[]%CEN(<=M`<:CAB_`@6/[X?_A)%A<$D>:'A*'FIX2#[+>)`0\'#%*4[;FNN):XSU9R\;J(QHC35N2MW MT?M*X:7WN<)'_P*T?U+N]S7V]/-V0@[`4ZT[#/U_1D@1:DAX2HB[F*+456;Z M=%6N+EUU2)>N?*6G^5IIJ7T?VK^E<-'Y2N&J\X7"[3KJ.`8F;P"'!/`BE=<) M20./Y_U-B+V$0O-KID=7)2/'@`Y=]2U"H:/Y7&FI]4!A.^T'A8/VMTK'4]V$ M[(`W[`"'ZL'"G.\(60Q?%_::4%:RJ1PS,"Y>1TW%FZ:F.J6MIGJF31?+]33^ M5)@AC_6TG^2V>];#`^%S8&`?"\'"E)\(B7U$B!]\V0SYAQP8%X.H0XY=B)N( M42WZJ%Q7XP_%#,W?%!9*?6U[I;:QHW*:@[U2R]=6.6V^K5(KU5JI56JEU."9 M*S4VFZKHIPU4]!]U56HCVN-TE<%C+:7U+1V%\Q?ZBIGG#>2!*BM-4Z6!CJU2 MV]1!.4WN@JWJ?$'X.TV@R>]8.%H`OS^?/0,P11=Z03_,5T7>V*/O<&^:)9@3S;- M4*C?,1A55QI^KZ-PF1J_UT@V9PV\61MXQ(`_^R.=D!?+"1F.AP>)I-04'EB; ML:ZU4MO#7JJ]PF[88*W5"Y/;E@_T)ITP/F"J]DZP<&IL.3B8"Y;]6$#(S[FX ML[,(^3,5?B:>4+)@FL:0G8G-$Z=%#C_-;+?Z.N":U4G;=P%K,??4V"+XP71X ML\5@62Q8]@7X]64Y-%,*W181\A-R/LP$3Y;J:UU=$FEZ,I5EM#_YG$7[G"=A M*VPG4Q?:3V:&.XIS@YW%^0&NXGP_#W'>97#P4LW_BXNUT%\]>J!Z.K6K,5!S M34NM%J_QB$E&UL]AKG-$.8YA8,94S`)#I@)__C#NO[$7ZG!_-T'_T-":?OCW M=?9J%1NRM'+7[]"+[OS>S;)>'&M1@AXF1[+$*EVRS'HY>J`D2>K_'?\9QI^? MFK^%D"WP1@SNMOD/L9=%GL9UI;G61:7UM',*.^WC"J>I-9QI1`\$'G?`B]3!DZ5_ M2LA<]%5VT"\1&R#2$("@V6\4)E.Y-*\HK2Z@C@.X%_K7HH=" MCYJ/WBX!-82"91;/IG),1TP=9DPBAM&9&"&T/Y7J]/MR'8U;,F.-;^2F4WNP M$?Z8BVE*XYCOH= MF>%V<*P3]TDMUI!U]M\:PF^"I;\08O"&PMBI'.&(,@3,M!B7AAB@')31:$]5 M&FH/Y-JJ:5J&*@U#(Q7=5E^EYJ.M4HO24M&6:JIHA9I*&DM#3JVGRZCC-`GY MEIHDK\DPI5)[3%-IW%%73?]"2VES'BQ1&=.G(0\88X0<#M-4:D$8'X?(U530 MFM5EU#JZA)RDBBFJ,,-XR,1:9IR6KVZA%JK)B;G*!'YG;RG9+0':BJ-K]15)N>F*>T.ZRH\ M=NC+_8<#L4P7<,@4_D-=$W688[PO:DC4D-$JU,74&C41N4R-DI?4'ZCA:[I* M]PQXNA\LVJPO]^LSE(<^GH^>(0S]AB?X84ZI*=4U-50T&PT%+5)#2BN@BZ@! MM6'J2^HE-4Z[K::<=E93:;571^&V%O,+P5(&O-GW2PBYNQ#]2A3Z#G_DLJ9H M"DU-=:F:J]8@/5GKF6:GYH-IES5O:[[5.P<>;]=5N'>"90PCV>Q*4]F\/+#L M*CCV13(A-Y#KY@+P8S98Y$JH)V:&VC]:SM?_PH&A>][Y$YW#ED^LUNHIO!FH MO1B>-!TL6PP>Q<"7G0LMI'%SK"1+`FPDRWWL)M/<["=7?`)V?0Q?=P3\.HA\^_(( MV8VK"C=-24F\X>H>_B[7RER19!4B2K`/@/0(DRZV#)"G' MBW%G(\]AY#FP$N/QNA%6H`]*D,9]R($XC-B/7-LQO@N^KA0:F+^#1@7M"-+PWMV@X;CSC+;! MYM<66OU*&YTVA;,^4^XSO5X6;%PAFW.\Y/_EV%6)^L&Q>HQ?!H[,/$$1HXLV MZGJ7\^C3/C](5[O\7%/MI`K-HFJZQG8P9)W25J=/X7(<\QY#GOW@>S_&-\,3 MYD"#\R!1A\N$4#]/IZB?4RCJ[B:*W/N%HKZ9I&B75>IJ9U73Z">4^NJ'%:;' M(<ZA.B!X$72/\(^@",ST5\:?XL//^ M.YA1Y/D6>6ZHU/>"Q0.8@@D_E8_^-@&>;`YX[`Y,&/R`'(^1XQ$.WF-\8(^F MFE@T7;_#\/TR@@,)HW3G'[4-\(2M\(05V,,4<"CZ!/P@:G#$.G1^!H.>(,>3 M(#32*Q"`YF,8MT<`W<,_L3XQ+EHE]0]=4^,?:KK:/\2:4A(O2D+"J0FR&#K- M)8.D@;PAO>0%V4N>DXOD$?D>!'A!'A`YN454U#6PZ*2&REBE0]'^H:FKJ2A# M2D'L*3'Q)V,DE@R1#(ROP8AN\@=R_$XND=_(+_AO$)DP'CP[15?I'=!26HY9 M$R+7)M0_E#HE)\;4.'$FPV0V>4>68GP9>48ZR$/D>$"ND9_)$_(#$9/K>/H, M3:5Y4$,Y8XNVPO&)-_R''?H7/4(4%!UKF$'>$V_RDBPD?Y)\\I@(,?=^U[3ZF#O)98?RAYBO7\ M3EI!TB/D-JKX$C6#Q`'CTDS25^E9XRPXMI6TS6%8!EN7#UYU>"K^`:^QT M+/B!:^137_#("D=11U?MBEZH^@FC4OH!TYWT;89WM/NUI!;-8'D16)0^71ZT M&#URS%2/BH_]`-BS#YYLSV*<6>3:/0?O^5#45A\7^JK`3'IKT(!ZO==5XTR+ MMYX+C.2ALTUD$8%FLGG>%M(%;M;2Q+W9&`/OM#V#D$W(-0`N=J,V01(A#4M- MJ=*41"HK64"/3SAC[#?GB<\,;VF4J1>\A[=LOKF/+-K<5[IP;PYR@(/;D&BER;X,E\@##>%FH M\2)9Q%XP;S=JV88\&Y&G#\$`2S(;<.8[*>+0ZT2SZL^A&:_:09_6^XNV6KM2 MF\Y63=>L5UIH5R@<]$KDWA]R(+:CGO5XY8(C1>A7%T#'SN"`^F%#2NUP$D4= MF6K4;E%D[Q!%;9=3M'7P#WTJ78UVY8R]X/!NU+T-T8WQU>BKDF$UPN!'+,$1 M\BD.WSEL]%D8I3.`PDF(^6.8BJ/0_@$IC;971=\+#N]"K,%X)CB6TT5(#,;/ MA!\QQA!R$3DNX"!^"MA^BJ;S/$1]%DW.6;#H["0.A8S:!RQLPG@!IBE';YJ$ M\7/05[FA+S(X@QS7]''AX%*^C$-P"=J_!.U_AJ;Q`KS,I==H!N5D.\9W8_V- MZ`NS,$TLQ@?!5SJ@!IV+R'$#.;[`P;N*R^LJ-OHJ8'?E%,:B:;L&LW5]G*S& M>!;VKQ@<6P(.16"\[R%";/"8%CP1N0F>?N.#9W&8OP0XKZ/8ZZCE.GYXXW>8 M]'=$2>A$1J:#&5;D+7$G?Y$P:&T1])X.7I1#:1SH;37YENPC7Y-/R0W\[3J> MN$I&010%.4W]0YM0)\A!)R/$D+PBMN"-#[0Z%[Q8!KT7DCN$2;XA_=#L/HS[ MC'P.%5\"62X0N".P:#]8]H^TX!F(.OF;&(%W#N!%$+F+6NZ0',Q;#_KT MD6;:&K]']P@]ZATR?:T#SJ^8V8X"DW5!R%^5/) M%5*-%?20T^0@^02K.(95'D4-NR@E;9V:2KM;0VEV#0$N'P4,Q\"20_"UVVEY+0^>"*^NM*X"2PY/1?'#U[J'#Z^ M"X[XR/`Q?`&672,V6/U>#(^KN=FU%6)->9$ M:9'DZ'`2'UU#BXSZ:-K,D#L6AJZ3O@8N+,!_>3J M__C%2P2_D"9E4<0_UXWRR,NA[',WT$TSO]'13)/.T$Q26$R+D]OJQ,J= M]:/EWEO`K@U3#$0M/:B%CSP5R+L$_LP#?8D!VX2:QEE,J7.[*1K[*D78XQ#7 M/Q2M4JFI7JR8KIFOL-J*'!LQ9@WR]*">9K`H$WXD`O*RADS)!AR!81!OX@=[.`"PD MNY%C)P[/3FS8#IC%[3!:VP&&'>BI=MW"A?*0;$/M:\`Q#M9>Q$$-X&`0_(@# M,*&S"SGVX_#NQ4'>AX.T#[#9AUKV0OM[T3#MNX[#]#W9`(ZU87P->K)TH"$* MZ)V)\3;H3Z>A;'($+#R,@W<8E^IAP/(Q\@AS'71#P9,>Q<<>QM\>Q4<=1R\?P59]5$,W/&A^-72["W$:VKT.#=XC'X-:1T&?O\&@ M%\CS!"Q[0*SA,3SA-&:1+\"/R_`.YT@I.458>+Z?'(;R#I*S(,E7(-)O<#;O MR6[DN&<*[Z$!BP8&_0R6W2)VF,47*IV'IY=!\2LQEH'G>_'\1ZCD4[(#3VU# MY9M!T#64E/8E]/Z-&2%WP+(?B!IF,$;MCM!\,.:.QWS9&-=`MH!#&Y!I+7ZZ M%K,-P.GT$#'5!D]SS@]7CRNN(DL@'T?R"AAT$BP[!#[O`S^V@\WKX.WZP<-> M5-0#.G6B!CX9I9B40JU.3:5S&%[C$%AV"$?@,%AV%,?A$!BTBYB3K220K,%Z MNDDM$9#UA`L2L[$/362$JJ3D:BO5E#J9ZDK3G6#&-GBI+;-P7E'3.OBR`?BR MC90:ZG4@[=C;%JJ!-%+[22WU$U5&B6F9-+G&4K!HH8;"?.XTI?UZ:'P`1[`/ MN3J1BP]?UHR:&K&V.@,]4FH<3F6;EE/))MO4X@UN:D=J39@&:2DLO;05=BZZ M"F<'`X7G`*[`7G"L`]S@H;]L1*]:BO6MP/H6^U%D7H`7F1641?D%]-.=?2[K M&#F]MM:V5]CIV,OM=1SD3KI.WP8ERPIP'UE$#JR8B0.(K8+34G M%LL2B>&R5MJTI+-TM<6O-&B+E!IJT>A?HI33-2*4YFL@QS[4TK'D7X8UH::@&6)D@$5-#U'X(%D+=O5CSBZ, M9>.QE>!`+/HZ#TC+$)Z&"*9AD1[X(3:>C7N?(T#!$'8K&A4A_$S[+;(V_3\O M")[5H*]+0H^`CQ?(.LBY M%RQC8(I\]&0+P`%?]%4V8-&T?N18@\,[X/PO4U=APE6`S2H8KG[P;`"&;<,9 M,H#47#"X')A;SH6/@A_R!*HL,%YSBH5;P,)-$-4F[.LF+'HC'EX/V&[8`,Z" M(5M/$"'P5H_QV>C)8L&A()3I`A;-F/*5.Z=XBL._$Y?>3OBZ7=CT75.-,(K= MB;W=B3IV?0Q'HPX%Z(,HYO`+3M"M'W0?`6XL`C=2T77D@QEUT!\?FN^%AK9" MAR?P^^?0\FWH_R%Y0(?_`(-^!,MNPD]]`>]Q#BS[!"P["I;M_:#]*CS?`NWW M0O?;H,./\?H%]/0CZ/:,?&-$R&VP[#;RW`#++H%EGX!E!^'+]J"6K20-BBW& ML\U0?P_I0HX.Y.C"TYT@7SM(>@%]V"436$:P["H8=`XL.PB6[2`S,>_<_[2? MCV>;L9IN.+SM8,!Y,.`[5/8$A!LA1]'/'<.V?PR6?8(C^3$8M`]Z24A M&!N'Y[/`C%K0K`>_[T%,.:R?227ZNQ(B(KM"_KW&=N`8;8Y,$S0P2K=5%16B>5PNE/]?PH:FTG.@J71OTV&;3 ME)9=X$8;Y,19\"]_RN&EN85F[GA$7=_F@8ZZ MA=R`;JXR4+=4&6I:R\P_Y(`7XTPQ#!ZJ'#S,!EOCL$_>J$MOOC;1@)^BQU03 MVORM%#7_6XK,'<0$"HJ:I:310E7JW6"/,/%?AC6AEDK4DHVK-1)_MP132#H. M80HV*A5_2<4Y3X=64F$(4G#G)\/++)>1GJ1_.)OPY%QR9!PXY@R7Z MT".IT$1B:*X(ST@E^=8"$';HV<$Q@#_:%8B(LE(N)N(`5'TP4P#"U;R0]6#<37J@87BX)Z4.! M!E>PQ`S3:/1,L1`'MP=U].`#[\"'UPGSUH%".P&[KBDF;B`\E%8%O*T`)N=C MK!\8Z@@.FL#3T=$?DG7@V%I: M[Y!/;`@Y`9:=QE$Z!08=!,NV@F4#8%D[UL1%+4RHM1[KJ<7(*N2HQ!.58$`Y M7%<9.+('UG,/MGT/=+H7QVDW?,<:Y!&BQV2`974D$N.22!&(48B9\[`#>:@T M!\3+`H$SP;)-V.X-8-G:*>^"'K,?QZ$+#&H&$\NQQRO!LFS0(AV_I^#=Y9AA M*79\,3Z!1-P("628K,+5TXWCTPX/Q$>/R;+&4<254@8&98%ER<0+S\60A9@] M&KLX%S5$8O?",?]L<#`8/:H0_.%#IRW@1@..407:\GS((\40^J<@<\J.S*;B M2"!53WRHW<2#NDDY4^\H.TI)6=#^43-54VFV0JOLV'_Y,V4S"E!3*O@:`Y;Y M6N#>-9U.S,W"B:%%&:5MOIFF/N,K-9K)")TR_D>-,OF'3C/]1_U#CBF&12,' M^%,`[J2"K3$S<6CKAFHC\32"(F&YF*PV(4`1#P:G7@8BT5;\/=/811N?^#@ M%,,8J*46>0HQ+A%<\P8/IH,+9#D.\E)L]#(L,AFP2D7#M0(,R4*>3`@J\R@1 M_LL*<"02LG(`LG0A#'#DX!+EX*`\_+(3F2@&7E,W MZ$*:ICB&'/7XL!JPV`;PL!$YFI&#B1RL M+B($QQI1=P'>3L#8()3H!(Z9@&/J4QQKQ<'E8RT!6*(&7V<&7[4\@Y5K.'UZ#C*;-_)?P<@R0EV5X_S[[/BIT:,'2^0 MYQE8]@0Z&X)E)\1B/$L>9==2KA)VU,*`%K3672#/>1AT"I8=AF5[V6-VB_EP9QGEUN)5JFA-`[6YRI!OP9"GR/RR.(5W M.0G+'AN+_60J/`*#]I*G!W_7S'XL"#^VHOTJ^N5>:%)!2\IA:ADM+H7>)7#D M"-PXC!U_$$GL2Z?;F0[]Y`F39RLLJZ1O2O":Q918C9M917^LI*=7T'/Y>*KE MX@VQ#WWM0:<##%TW2W,[^Z=FEI0:&%1"GI7TS5+JD@.Y%M.BKT/)>=1A+GO4 M3+SE7>*O8@!]]J#5CFRF\'R6>>JTB25I'7VT!`9EPK*9],LT6C&9OIC`:I-. M^;&L3+>PST[5_B/ZXOQI95FOIT[52*L4N[$M_`DWR5T7Y70?/LY M88?O5Y@"O$?J1XA[6`[X$X(_U?"P%&GDP?NI]+=&^\0,YNE,*CH+(,QF89[- M0CS[7.Q_TF2\;?FP+A@681IOEUZ,NFP@3S9><2QM9(GAI)-RT.TR])+'7,_' MG.2QR5B._UCVC-B)G+NI2SMU:;2>9X$H\F;`H='P1!3!L=48X#5HKIB;K0,X M94"B`C!4DJ?\88MA/>3IH%PC9R4LR47+4_`DR557_1@Y*EF$[B5'%>VI!A2U M"#V(R.MW6WO)7O#4SCUKD?4:$).)+">@YZ1@W(]M`_"U='0M%:T#./7`HH$< MS8B]=%93-I:DS>#L='KA:K_HQ%L`F#&NS]&15MLSO.L4YR=#!Q.N1")A_DT9;.YCC+^D47 M_C$$`S?`P%SXEP'_)E,V#8[IN^(AGL7@:_CP[LH])]0+>?'#L'XNQ( M$1?%.)0\F=5T)KN<`+XG!^^Q@IE=!'/*4$DU.@XQ4]LA43\_]^.,'H$'0^)Y MANY9\OP`!IUC%G\;ECT*RQYD?N\1N>QS"BBW#GYLA`$UG*WPHQ<*[.,\CH+. M6H^_GH)EWR//&?(U-3+JAY!<2WLR1I0?!#_$$31DFA;X5`-;FL+ MU!FBJ4.P;(AI"0NO$#)Q8@&N7<&TQ+:KB9XBSEYH=A"6G.9\6 M^^'&7K2U&[T/L#?L93ITD"=(GDJ86$P?%T*-%?S,@V1+(>G=W"4'/Y1-.Q;! M@5TLQ7W(J8LIU#8M-IWJ6%(VPJ#5Y,F&B0O$''JX`.YLI)=:(.0>,I\47V,7 M.XV5I1N-=3#L+6BU'EG=1YW*D?IJ]G2+8-!4\MQ.FR;`YG'4;`RM'$U?^%@7 M4L1+8A0LZ\R/\:>!/#4+8QZHB.ET-WR=GA;_'C:=AKJX*`F]>IG(H]@O))_' M&+R,N%\776@^LCSV'*E&^BC:58R\=Y?6/+?ZT(<=&I%`'?ZJHRSKR+&(_-X:<="?^B1P+J%P.0%K*7%]*?990 MGUSV07=_1W23HX/V-%.7;>391'T*^7T63/%)+U7`1%Y!CA49,3^UAASWH-U2 MA+8><9;N%CV%,5LA]X)!SC(NR6:[-!D]C^(4ZYG$)0QZ">:U%#AN`#25@&83 M.;8`B9JHZ&5+$N6>+9S5I"_$HMP)AV[C=,L]8343>#/UV$2.S73\9G)L`7*U MP*9>>JIVT4LHREE/ZC+*9?/6="S*K9PF/!+U+*#;R!$D1Y#^"%+1>G(T`+JF M)NNY62\<:^'>F\%;(>6R"$\!+V-`KD%S10L3MYE%M!G3V[PX5N$PP`VS`8S( M!T$=HH,NKB-E*4C)@7VS*#<)BY,*7G3)L6[),7)TD*-C8=R3T5&=5+B3&^V( M)K[#+]'^1/MOXO9?^\Y/;5SB.S\3\R71_NNT_\8XOBE&"+K%84<,TW#2>>73 MGUQ)'%_Z\:\18K>*;8Y8!3M71Q!4W^H(ON>9%$[TZY=^%.]TQMBA.&+)+*=J M[+08(7AEJB9&4NS/$WW]11X/N=([SH#-VN:8Y8BGP6J,0>DV,T40F:TM9.48+RB8:8I^;,TX5>G1B! MSW=$)SM"$5T3+XZP.+'X1TT33G&ZB`I3"9Y%L([@E2N;YQY(#,MU MC[-N\:X:\S)&LY18E3;"TF58`_<3983EP&E_LP>3=%G^#_9@V*5SL8,`+L/( M30R,[3CE#(T3VF(E]([L8\,QF%)RW8I?L4;3KXRF(:.9]F#0*AY0=2@?%10J MP2R=X3SH<#&U?[IYQRTR7EVDKE3J3JS-LQZ^/&,/ZM8S&<7[)VD<0K<'\PV9 M4UTD1PQZ#*%KJE>ME#D=^XE4]\SE`S?%*/W=$7EBC.%10C\SZ4WC=PX=T7<3 MU(Z7HZF,T40+@.*8+7C)4IQV4167AA-Y0S$GAJ;I^F55AX9N.LQ1NFEXM'^K MT8.7;[AQ"SD-_0RZSO&0P]`,?9$B+DV8NJK#9+1A"&.-+;A;CJ:NIZH#KPE# M-9M9S`5=73D_8-AT/4>IE(]%3N0KP:,N5Y*N!J^L^_6--FYU/ET-%=(?GG)% M1YH+?7@5``I3#L=1.P`U:Y!<#B,B]6D/I@G=*0S3 M]*K5'W_7MCTOWPRH_(T:R!^?DJ3Y[#&W1S,9C0]LP4F&%)R6;@N^XM(E0+4W MG>Y$TR*V8"T[.1AX0MT0"%BI.-@9'A3O_84]^'KJZ#%W+E.K__%-;"I?^_ZA M'GND:+3NQC8LM>_L#*DB4U<-O6Z8AK[0_N0#?NJ:/EIAK5RZ5%;Z#'V4RURH M`-"K^[PI14H]UY[Z-+$#N-Y8#I3,G3%&T:''Z])-E]N^#?;IAL&"9%_ZGF1\ M74(=8YAL)@F%@%MUTRM,U4*FS;SGT(5_),;A\QU_?M7^^^11;J_;,,;;W8Y+ M8X>F*]MU9`A8/;OMS[=P^1XA=BDZ3'&-GUVFW/IBHO>_P./#?>5S,_S^28H1 MD8K3M/EV'0)5MS"3;,'GA9&4Y$E1]F)3\A]X-]&W7_KQZ2>_?]\>,3T>MRE< M]C&JT8UD5Y+A>L_.2E_:S"6;]US'+26._\VQ_?9QJ4EI7D_[\.!ET^US>Y-' MS[$/7.#@FXD.^\H<+_WPT8/['CAIM_FIIG=25LV1O;;@F41G?>6/C''-EV[8 MQHG_\_$5:']7J%=^PE44M+7W19L:&KO\\W)RLOV9_OF!P`)_?GM[..0O:&MM MW]$5BOJ+(L&L.?ZZ<-AO7=KICX8Z0]'N4'V6:`WO",9;E/V7^M!*^9?E6;P>VMZTJHC7=W+^ MU%54$7NM5T3")??$7]\2:2LIC>44'[5WK=AP-7]G=WGAU7AS7?'ZV%_0:WDM M;6OE-;=1=DE_8\7&V&OMOO[&@I+XZ]?$)A$6(=$D(OR,"+\H$.N(K169U@<[ MVL1VWFOBFB:QVKHB1%1^:+SE,ZX-B_7#7OLI);\*[9]6J0ZQ@_*Q/3=PQ>_A[@]&:IN!O'_Z8[+(&5[-?>S]>N]A] M@MQ??KP]+!J(MEYK7Z>MSL/JN3UR;.+P;/).H0,EEX>U.62[7Z;89N5KL>[7 M;;TK/TB?/^R>G]V?7'UIYRNW#;_CV^:+][V5-I]DD](%%$< MQ[^S)4*L!64F4O!.M@=7!NU@'8S=]6_*MJQKI@BRSK[9'9V=G=[,;B4>0H@N M0=8QNEC123J&!P\=`@\1@F)=(N@H&02"EY#M-S.[[HC:@S?O,[__O]][0%TH M;9IZ@`%YPQ;)_BB[.S[!ZC=0AP8$02NM6&8DD1AVF6QQ9.U]A>2)7Q&>S/I[V<89; M"O$R\4W%%!0GD"(>*"E9)^8.L6QD-(/DEXF[,I:2)R;?P%-G%EZ9]A#0?04X M];DFF["`Y7?`I=::+-0,7!P#5CIKLMVD.Q^I:=U2.SMKS:Z]>+1_4EJW02>S-Q5Q>P1/@R\_`EH;IM M_L#-$RN8#X66S=FL0Y8[6-@Y.EF$7@AGL4+>+-IX M*/%,._)ZL=KO.=I!;HR.T$GS"JCIUW0;RH:GV# MSH70_J2*OE&/I?.:/9CR.-!MZ/'A"L,HQ&][,;%CVM%D-;Y5&NFMRF?2MQ)T MMI#\QFQAR+%I(M_07"XUYK&4FLO%XA5>Q3AT<&@PZ&N`(8E^1!&&"8$"5-)H M9*&1E+LV@MC"[+&6.A(^9J3?)I]MU^<>BN3M>-U!-(Z%MH,(3/XF_Y:WY"7Y MK?QKL:48JFD6Q)2FK#_[0W&=S-6X%6VE)B^^0GDCI-61)6G^H"?+5ZFO.M58 M;*E%%(5_R@J\/_-3N_/_\'S;`!:`IE;F1S=')E86T*96YD;V)J"C$V(#`@ M;V)J"CDA27<\5V?2%*`3[1KU2QP#GA<3SNW[PD777%G%.$\D?N)RP-? M@'^S8M<$O`+\/L1IF&D685(GA@+F+ MV-TP]C9UP(VBD:E,JTEE7?FD/%/>*9^5'>4IT,>UJI8`-5468-%?^DTL>=O4]C!LND)KS6<`[>($*%2@]1'7"#C*EX1PU[ M;6K(ZQ$+%/)[Y;U8=3[4.:I]*\S?#K5U0X:'/1/3$+U#U-TR;D=JP=Y:V9B, M5]T9>WY].[&ULF\V>CC=;-A/'\R#,XJ_C3.LU\1RAFS^VXEJ\?J_Y,'?^@.? ML?!1"F5N9'-T7W\EL6,[3NRF M^6SKA#H)H:4)3=J&$DIHTS;0=:4J3$AH&IO(/C308$.@"8F)C5\+TS292-L0 M8M/X^!$Q^,&431H3TS:80!H5;-!XS[F^:6$;VK\MR1.?<^_U.>_SO.]YSK$) M)838R7U$(&,G5I?.D9=I#E=>`5XZ.'4\M)M?YVZ]!5"W#_&\Y53N"`^9?X1^N^@GSRU M>N%2\CWB),3C0G_Z[)TGEK1*YB'TCZ&?75VZ=(YI[#+Z7T)?N6-I=?F)XN'O MH_\]]//G[OS\!983S.B_AO[^<^>7SS4(Z2;$&T7?Q`,EG`]G9"8_XV.0(\:5 M_^MWV)?M-"W[-LZ]G#^YH?-"_35YF; M#)(I*C3(--YV/="[U2#2UIXV\AN,]A>`+>Z)($42"0&=P`!0!Q:`%>!NX`'@ M4>!IX%G@1:!]$:.Z&L2_"10V2)SX2:_;,[!!4@A:0JM!AK8PN)D,D0X@#52` M">`FX';@(O!EX!'@*>`GP"^!]D6$^#H:;P%L<8/4C-')!H(+$Z&[0>JN#5+% MZ+Q==?$`PJ2N3QM&6.HF?Z)!LGC-0B]O>40H]\:9W^=@HD/P^^*LW%NI!LP= M>!FE#JHETOU]:(W0_KX>IB4P]$F"FI2;*MW>PT2PY)4-LDN:^6[IP>ZG11I7=TI.IA5J<_MYPF'+?[ND:W_Z:F M?%:SU)ZLQ6I)W3'\R.MEY%4FWVX0!;ISP^`24)!5`"L(6W'=R1_7Y0BVLA!$ M%H+(0A!9""(+060AB"P$D84@LA!$%H+(0A!9""(+P9TL!)&%(+(`[;U8_WPR M+_0VD9C>-F%2@K*RX]6U52S1<@_E\OE]7-JJQJ7M8?U](Q"\@SXQ)YR<'S]3 M3YTY??2>P)QGIIHLQ=O#Y:E2>3==.CK7OW!^Y/2%8_/%W<%L)=YU>"+7KWN2 M#;S?!6\%#OIP@^0*/`#U:@`YP`[F=M2XW.(K@Z\,OC+XRN`K@Z\,OC+XRN`K M@Z\,OC+XRN`K[_"5P5<&7]#"B*0`WF$X'9\J#-XBR>AM$>V$(7["52Q555XZ MZ19U7ETC[!KYE-HJOUOI_R=GF/),#X6*Z@PYNOV:- MYP936C$F_5E*^E8O%>>_,)FH#V,\&,T(AF=?(PD]^TXHTK,%#C&2U6_'<-M&RGK;AO8@W)NW!\$AY=5$ MK;]'N$8"2\0A<`X9+2[P[@A-M5+)5Q*_05]>/.!B9CG?'QN];3P5*M:+I=DH MLP6RHZ5@CQ9@LU3;5<_.7E0EW_8/@CVU_+X]@9[KBDI1=DW1C>,LF(DX!XZ> M'RC,#,C)+I:>VIT4O6JX>SCMV3L3J?\P.5?OG1S.')XL!M+<#IL?X]_[["4D MZ:L;)&"49,"ENYH=KF;?<34[7,T.5[/#U>PP#CMS MP]7L<#6[[FJ\D+W(O+?`1X65;/'-#1T*>`J\&JQ7JR'.%R"$AL,(9>\(A3Z& M-J+>URO"+&:\#STR.V0)!X+C6KI/,)GHWKE1T7)=O7*KPH;92U4;=R#4XDS^",]\'O/H^\,FEC]EA)!0S;G;FZQJ!E M`KHF"GS4!MFU943C`E3P*1FZEKB-`>'-5KM[\U_5-8M&5_ADMV7<9I'[#R2O MKJS.[K;X(H%Q34M9Q9&Y`='GE^*)E">1;Q/VS^UILP4[^R)]Q^/21*FRJ#(O M:[OR$76F^\/A;%*Q]L6WWZ"2.A1PA+WV;%Q2[=L-6NG8'5!RD?9R5[FKU,6N MOU:/W)/O_9_5X[_7XG^I0*UZZNQG5J!+9_Y9%3@#_W4W+S,K.+IA++]ND"2F M3P%)UXY+HH^V#1L!P:NGY<$>>+`'I>1!37G@P1YXL`<>[($'>^#!'GBP!Q[L M@0=[X,&>'0_VP(,]N@?;,%JT=6*)0LOHCI91:!F%EE%H&86646@9A991:!F% MEE%H&86646@9A991#`T75'&FY7JI6+OM2!9OMW/W-BS;!NX`'@4>!IX%G@18!72%>K(OC^G+ZZ/\>-RHB[6LLMN-6JD#+W<4ZTM5BT M:EN+H[%#W_[(H2H3M7PY4#M3SX3[IGK[#J:9A[K#?=/ET7V1\G1Q`D<5&)8O MK/DMNV^^:[`PLTM.]D[^JOO(9&%Z=^>1Z=Y)LK,N[F%>\!;U^/3YJWJ%XF^0 M]@:J:7,KAI-G9DMFG]L'%_.Y[%:3S^*P[%F,LQ`OS+=B^T)RSFJB]"AC$_UW M\K$_Q'F@H9]OG]G`PE-TJC)H=^&DR-M=+77]4->_HZX?>OFAKA_J^J&N'^KZ MH:X?ZOJAKA_J^J&N'^KZH:X?ZFZ`BI]TZ7NIO@EL;F$W.) MZD0R.5Y1`YE2.%1*!_V)+G^DE/*S6:4ZG4]/#:6#:7XG$_#)66]^C*[F1S-N M7VI7,I93@S;)VQ'Q=L2]%EL@$^W=EW6[T\/=\;P:EFS>CK#'%W*:\]A-U.9' MM,:^"SE+AL,X#9K[CZB)9<%!C7/#M3-UU5NN M_E:94PZ[#M>8X)6[@LZXTVD/MOMD1L=.PGL>?71J^^=VGQ12O*+`9DQM3I_5 M9:7%*?WC/''">RS8R>+D`P$AQ& M@L-(![/3LMAM!`7U03CUXLU[:7O4NG8"RQTRP93 MC@P?>9:%$<$R?8P#UO[0]AVZELWGFP7Z=\S;`1_GM'?FYO-YKL[B,68)M&;Q MBGHN,V*<\O)\DMZT^`8;.GJTSYF,V:(VIUUQ*L6T^C[II1U04FQ^P+"T`1L;:;[-W[4@S#8_YGTV M0MSL8'.37M_\F/Z^^2$=)"K+$2?[@'2B_SS&BY(HM=`O,0=;$TQ"0J@(KYIJ MIC?;;F[[FKEB_J+Y'3$KWJKS\9+SB%,%6M':^$<4=MSX1H=R_?3K9A(A9/KZ MF;WU@]W[E\]>7+ZP0-PIE;F1S=')E86T* M96YD;V)J"C(Q(#`@;V)J"C,Q-S`*96YD;V)J"C(R(#`@;V)J"CP\("]4>7!E M("]&;VYT1&5S8W)I<'1O9`<5WE_K^]K>KKGOF=ZSCUFC]G=V5G- MGMI3TEJ65\>R*TN6==HREB6#LY$I)W$(F$*D@B&Q8ZY0)L2(6(0%3'FE!6-" M08C+H384D!11"'^$A!!0H&P"J9C=?.]US[&'7-'J=;_WNJ??]_O>[[MZ!F&$ MD(8>1RP:.WWAY"7\':8",Z]">^7TTB,I[L_PIQ#"S\`X=N[2?1?^]M[/?03& M+T`[=-^#CYY+_^J_EA%B)82L/[G_[,DSMWR7]R"4_2C&,-G4.JA MDQ?.OG;MS$F$\C!$K9MO92U>O@H\[,[?\QT-BF,;?M#AZ:@$0D(1EZ"E+I"BXXZO2Z&QG(1![D13[D MWV&%`+0@M!`*TW$$6A3%X!A'"92D+L"I+O6O@^9*ZGIU/TGSRQS.7J&"V>O+':E MEM&AA?-P/+Q@+8\M1NO=LXN+57@.1Y[#T>=<680G/.`\X0'Z!'C`;^`FOCB; M6F;S=RW,+2P_/AE='IMC%J+BW"74)<4SK]S/N3(+(+, M0AMT)/LIA^`9\(C%*U><$9.WEE^^UP"9ZJP$<3B"$?%:$3A%:`QA[O+N&TSOA]"::W M9X0I]W4R8D\"QCJ327?">(3!IJ++]&M5;)%J$P19(Q5-`4C-QU-&=LV[@;J@%LSIF<7T0AA MDK/Q;MAR-VR\F]Y$^E/TIG#7-E[<0-W.,ZZC4?C\#31>OWWV9HT:5:+BJJWB M%M@-A8K48JQ2S]@@2I42!6\G"EG&AQ`\EBQ@]PAY;)+T.J392AXO)5<@J+,- MBN4+(YCL)"ZYK)C7&[-<>HJ<4[J[)1<.YUK%[SFT9`X\_Q>L3GB^A\[8S[U=2NKI9>EQQ*%D*E MD8RJ9D9*O0.&T=?2M2NE4@-IA<.G&1T868$_\*$U1G)$71Q1ES.1)Q-Y6W]E MT%@7U5C9Z"Y5?(%>?Z8\@BLC(@%7MOPZ!K1<,(')A7Z"M9#1V4I!_*:H?DY5 M>,:(I%+)D-LE8EY2O(E"6\&05/GK7D53\<\4361?.[D8`&P:(VM\<>+@D;FQ M%LQS6-,P)S'=^T^>O3?OT6"DXG`RQD?3/ODO;]U"="^KP,=/`A]WH6.KJ%AG M7]%F7Q'85P0@Q2:WX2/8?#8V!;12HA]0@`T^8$.AYC8*P(8"_:-NHU(0B!5V M@BTV'`C88A!P)G`S"6QR"")3/:H*LI2*)]XR-+1T3[5ZS]+0P-&)-I$7&>T^ ME>':!P9OK` M^G_*7KQ[^OQ,QAH_-[7^@E=>PNFYL;$Y_([U3E%FM.+>$[T#]\ZTP$Z#F',; M/V-.01QO1R=70>,\;!995H1E\VN(@''$N(DVW&Y[C"IW'X'2GVN3+84_[O&N-PW\&Y)(EY2DM9= M7AF0O58??^4&.-"7/ZJX#JGF7YDJP!%M@(+K>:]ZW*50;I*]N0CX]#ZEF%=U>5'141W#=>!7.[J/1*O: M'KD,FV=*G6`^7UZTZ/8#P&AS;` MZ$5YHO*:#Q$,1)(,1V!$!$9V[C.(8>VRN4FV8S4!9"]9H+$\7;2NRZ_".@-H M=)4:8;IN9D6B,1>L%=^^WC:-=9>LWC(X([8RPCH2D&"4V5%9E01/C?;FCQ1= M>O4SLDMU*>N24JA.)<2&UDYQH40ZYE%DC=-PZ2EP0M3]LC*7*X_$7]BNP,L+ M0KJSIYA@%=;&MO$?S*.`+8RZ-S/#88*W:QN]&XYEL]P-, M%7R"K+]$D+WH]_3TE]LBJOD+X.[/&PK&U7WW3;4&9)87M"9"87/]E][RX&!W MBN%%;#.8Q('2Q@>89R$.%M`LNKJ"[@!`^Z&Y;D(?T`8!;9",P2%VU")!!^Q6 M!T2"#IIO%]8(Q^`VN&6FEG?/`/89"*`S3K"HZ8DA:F&:]!0C$[&&1VYQ/#)1 M^'5(H9P<:QRBZC@(.4ZC*E\ID.06$@8[1VK$UOY*@B56SM8RK4;@#0KY6JAE M0H\*O"SR'J]7Z!WL.?+PV-C#1WK(.5&-\/Z`(;)7K<&.J*BZY5`ER8+PQ"X<[Y:#'Z:QN!.]"0ADVT!N;IO[(86OUT,MF^1 M0?MQ.`?6".=N0&4<1SPPK!8F_$2__B:%MY&)-EOA%@B!G=ABI[B*D^*2,.&$ M;;;<2PA*R)KNPD3A^2W1`[-7BY95O'J*]47C(2.P9FI+(W-G+JY_L.9;NQ^R M`@%K_=95/I8MI$.,"0ST/&?>.75D;I-[L.VQ%7*SMP(GQ]&?KJ`)H,XDM`E2 MYZR1*JA1"4[22M"N?T*(LZD7`NJ%@'HAJB,W7!JP+\G0"4-KA;9S-5B$Q:-. M'FA7@X.UM&X0"#@(!!RD!*R(P1%,$C:G'!3`5,DPCH,U:CJTXX@**>TJ;]^G M`0_DW-C=HW,7=D>SU7UW[JMF^W9G]@T5M"F5AP*KTDTMT3MFM>_*>!1>,DTSH;B]LBJ\CQ,@J7.%BR/Y[DI M*^,.A!6W`%!BP*]IR".2Z*@=GZ*-^$2Q:P2[UI1#.#EN8Z(135:144^8#,/. MMB)K]9C6V\B%(,*`,QO!@S3A>P7V_UH]`?+4>M><<+>DFI\W57I8OT(#'D9' M8/^_"':10P=6P3AX9-)5)>!HG+Y*(J,X0:$!":R:;PD268-VA.!J^\;!#$%8&<3ZU,,.SXT-$YYVSY[=M>NL[/M-HE_OOYZM:>GBK5Z('E] M_&B_W]]_=+P^1_D;!KV_$^0O`POM7":[/3K?@-V`\I`&`]!A&OR24('RJ!&7 M.]EZ``@F1.+5?O(MW8AF2(]^=Y+CCR6Z?/+8UX(3"0$*V82L_D70?O&,HQ+&?G&7$H MU/\8Y#Z##B!;YB%HAV^;67C(A,<&0S+7+(UQI7IOK].K`V0JO<0].W%O"V!. MS#2%O"T3/8X&/ON/@5`ZJS&Z%??YUD27*Q!-Q`+D-89T57*Y?,&`R3*$MR*Z?=[!$;P!@(>59-?%%FL!V+Q:,"E29HNWOG`VXL]#Y^9U526%(TR MT[K[X)%#N]M922$Q4I#9MJ&9\;)F5"=FJGDL\623>8G-#4Q.#'I]0Q,3`UF6 MSJIL<>+P_*'=+0P4KC2.(>9!O`(5<`^:1)MS&&4'\]HA')9@2_*4ZR6CEKH1 MA=CY`6$(6!OQROF&:H5,(5/!WWA.T!@UV]J:]KO^WI4JC22@PGB:521%9G[, M*K*HL#W/'=1X/K)_?GZFBY4)(61^[\7W3M-R6N1,GT\4?3Z3$YFG/DNXD0>; MG,8O@>M<6H7PP4'51R1KL^OE-O"Y;2!L6Y-CE0D4N0FLETQX;?O,U0)[#NPS M!_:9H]Y:!I?;95^2H!."U@*-FNYFO^K4T:2,#L3Q#F5TD,F#G^&E?-^(53E_ ML*?GX/E*]X%JAA-E[82*@ZWE1*S:F4AT5F/A4B$,O,#/57ROR`HR[_>[]7AG,M41UQ67(?`2)X).AC=N,1;^%J!^:)7H`PR(Z$0' MSXA)7I[OVNQ6&ZH(D8E0TT2:3*1K[_:P4TB3VBA-"VG\!GS((+4VIF_Y:'`& M?^L3['K-[F^O307\O^O_^B7(!#5-^!+.VIWUJFJ:*GY)4WE%$Q9.R_H[=7E. M=C^A2QH6U/5WJ>`A./T/P@0C\%@'C#ET[RIUI;;W#9+X6*]%XT3Z>!,M)&\B-T.I/VZ@3]L M2TXPO)>B.2Z[KU!,=EXQ"0<%;-*+>DDTXT`@.YJAS>;8$+N1'``!-U=(-&!@ MY1MNTW33`UYI*(_T\&/0H^OV@P[WP+H#Z#2IW[BM]5MS+&ZLO4VI;U+9W0`R M(:117VL1Z2!18YL-%^P-$_L*6"N^Q5T65?\Y;[N]V?TTR_9EB1ZO;HZS* MAB&O*IZW<-Y0Q*_[1<`D_;>[MY1G*#PV8.4+6=>*#5Y:W.BNA-EB,]L$*2)#O68/6^H^`L.$VZY MU56U3@;!>,J0<9^S*;8\A-,G0)X>]-NKI+HC>]).JCN2?W/-%6BS(,K6+*DQ MD2`3B::=Z203G;7J+T$SE9W%.298ZJ@:'^?`C\ M.7D?_USC>Y8,K3:XG:H-\A5,>(V\7"?[`;>0=SIND/A?J/#`W.5R*T M)@8_P.N&G23`DTV::'YINOEKA:1! M7ND1JE=JU5=ADU-L>G7Z_?ORJ6S;CUSL9R3WP[FIOE2J;RJW_C^LZ]92+)F* M7FOL_6-::J"]6$DY!L!`48Z8711?)WI/K>YLQD?JSL+_%Y]34.Z$;]O6;P7< MMAUPKAEPW0;2^>;2\Y_>TY',I=9?UX5KJOM>-ASUF^(KJI=?[!Y=G%W_BJ3_ M^L%D,!K]1$,'3PAMG2V\!,F-)CWA&>V?FJ;*H'D-?@/L8`9]=07M`0O8"VT/ MB-8+5.^%/K-&WEK`O%-K]AKDO8Y3:P;H7QZ:76L"-=8(8>RZLUI37Q745P7U M59O2(\=%[!1KX*)!WGHZ!A(%`XF"@43I(J0J':T9R"@8R"@8R.B.52G7E`_Y M=RA,:Z;47S[0JO*JR+:.[,ON.M0?Z=Y[9&]W/)^7(Z5""+N&5$Z1I%QY=W;X M2%^(7O0GDG)B:C"//_0$R\NJ2_:WE./%4H14H*8I8UG3()EBA-_E6%E2I'BQ M'&SK"BNRZ7.;,@,W*1Q/:[T\<%&`_"))WA.#7NN9`=K\'9.R-47>%A<;$P:9 M,&Q-NW"U3'W]8S#OSC]6-V*'F_6WI!AV&OP[#78;K7WIKG&\:-4$*+V\;$Z1"4IE"BADSM!5ZK='14-/X% MS<0?OMDR4X['RS,M-VMH7LM;5OZU>I3$J`C[,@*8=J&YVV9YW62B^\TRE$;* M;U>(\7HU:-_R!&L0L(X"UA9TO^T)DW5/**[=@*U*(DR_*";?B8762/J. M-N]40P5A,A%NFLB2B:RM`H-T[`2@?%NX06_]:PK\Z/.6 M$^ZA7^(P^V.2`GT]$5FKGX,;'X"JOPWND^T?8=#/(&9C0T(^;F']TQN+W,"V MWP#E\>NH!T.MSYQ&%K0LM"+S;=0*K0IMCOF(W5@%S>%WHV.U.3*&?LD9M\+G M8C!W!/IA=AG%X=P"/]:!+Z_=`?A&O#]%J1SLW`.4_;1]`T7?\T M_950&OX^`?7<3YEYYGML'_M)3N`N<]?X"'^,_[[PC)@5OREEI7=)/Y2?D&\I MEY6?J'>I?P@V?EC[GNN,ZSOZ47?$_9C[WXQCQBNV+L!+/8E8>"KC:$@A8122 M'>QHV./H1R#K'YT^.C,YUSYQ\=*ELV^[].#)1\YVC%]\\$SMEU+P;^.CY+<%E1($J>;#V%@@;[6"-G5`&EU`?*D,U48%*8A<$DTDTC?:@O>@. M="@M:0'>3;Z?L]\FP:'O[EX'6*12!9VM(@A&_:80A@&>` MMO:(@5'C&MMTYPU`R"&11&_[UT8(_1_1"I\0"F5N9'-T"!;("TS-#0@+3(T.2`Q,#@Q(#DQ M,R!=("]&;VYT3F%M92`O6D9:1T11*T-O<'!E%=I9'1H(#$Q,3(@ M+UA(96EG:'0@-#0S("]&;VYT1FEL93(*,C0@,"!2(#X^"F5N9&]B:@HR-R`P M(&]B:@I;(#,P-2`U,#`@-3`P(#4P,"`U,#`@-3`P(#4P,"`U,#`@-3`P(#4P M,"`U,#`@-3`P(#4P,"`U,#`@-3`P(#4P,"`V,3$*-3`P(#8Q,2`U,#`@-3`P M(#4P,"`U,#`@-3`P(#8Q,2`U,#`@-3`P(#4P,"`U,#`@-3`P(#4P,"`U,#`@ M-3`P(#7!E("]"87-E1F]N="`O6D9:1T11*T-O<'!E-KE>PMT6]69[MY'DB5+EBQ9DO5^'CUL698LRY(L2Y8?D1T[3AP[L1,[+R?$ M(0D0S"HIA9:AE+9`,M,6NN[0:9G+=*93IK2%"9T"P7T,`Z4#M)WKU=M++\&K M+RZT0[F4VY;20BW?;^]S),LATWDL9JV[UE7R^^QS=,[>^___[W_M?40H(:2) MW$P49/#HJ2/7]-_XGC_!E6\30EN.7G?:3_B'_HC]O?R:XZ?T[@?OEL[I[N-7 MW7#Y7_[LB0HABAY"LK>?.'9D\7^_>/VSA.2_BMNS)W"AX0'%'IS_&N>A$Z=. M7W_OB&&>D#X[GI^Z:NGHD6G-<"LAA1/X_O.GCEQ_C7!,82*D:,&Y_^HCIXY] MXWM/OH!S]$\BURQ=>[KQ[QJ_@?,#.'_FFG<=N^8\(1V$]+?A7,DF2BB?1?_>!F0<$>59$&M:91JVO2&YJ-F$"+V6)MM1%B=SA=;H^7^(@_$!1#81*) MMK7'.N*$=":27:GN=$\FF^O-]Q6*_:6!P:'A+>61T:UCX]LFMN^8W$G^$SY3 MT[MV_WONAWSB$^=)X]3<@Y1^=/X\7?_P^3+Q/$H:B6+A4.=Y0N-^_\C)\CEZ M&"="'!=B`;04<..\_ZS\[OGC6/^H_<63QG#+,C_CBV-GYI/\< MV3UW$G]GY@+G!N==M>:Q^?D^]*-D_2AY/V?GT<,5<@]7\![0P1IN4L4G_.<4 MD:FYZ;ES-Y==YP;+\ZY`P#]R[K&IN7./E5V!^7GQ&'^AB_NQ9^4R(!,X]=O:LZRPXX5?$P'E*Y`O@E-VC"(^!B%\2`&,`\YLOHNS$^L7MN!#,)S'<",Z0;V'E<`/")FN@@9%42K`(0X8`I M$#8%3'2YLR6EYQN3R\0# M%"LZSA./<9G`+GB[UAP)CLTKTKTF^>B0K[M6NE+F MM%ILINE<6@W*B)Q$-2EJ1+XKAF\[\&T3OAU2D0OH[&60<'#(!0!W M$0>H'90'C8/F02=!-X#.@#X)N@_T*.AID/Z@U'\&_6;E?C$JKA16I3D.K$(K M3JZ191*5&8D:-R0?K4U+19QXG'4DM;I2.=%+;=9TIJ3(]"2$),VTVM()&LV( M5H/":O$*-E."VC)>M`V"PIK`7=FK9S77+>:ZIOH"8G?64CQ@F;4H'KA>=),#BZ# M.1UG3VF$.!MPV@J*@+*@4=`>T.6@ZT"W@NX"W0MZ&/1-D/X@E/(_T'@1)!R$ MY-20'($=,+[!74XT4,;XMX>V]A?'AB9WMK;W/7GM3VYZWX_>=?RUZX:O?]<2 MH>MOK!?(]_B^M9#WWKH6P]]ZZ%O/?2MA[[U MT+<>^M9#WWKH6\_U;6(:;93GI4Z7*---%)JR6AH:!_F40H.C_<4GC_\",[IV MJ??:%VYZ[X\AJR[8:AM]$T(:6,:IP.=%F2&"&E:DMF8%O=,DXYQ-7B5/'J/A M!A6.C;`^"@3`SH",=(9.EB]<*%^@ON>?+^,_.MZ]?C5YG"S!5#J9O9":O1`9 M97NIB58JXY4#13>P!K(=-,`+4U-L?%QG8VO(*YEHI#'5QAK][.)\-$RNY?P M85?7?['^&EV`SA3<^Y$DDT%7JI&F*6VM/#=&VX3GUZS"S[G/BZV_+@C"D\1& MTN1;YTD/;LZ`>L"='=S9&3NK'(&$^[P(RQU`HZ`]+.T`70>Z%707Z%[0PZ!O M@F0$$B`00T';&>8]8,N&58X?`_!CJ.+'`/P8@!\#\&,`?@S`CP'X,0`_!N#' M`/P8@!\#\&,`?@SH'E(PPURQVM42NW<3M:F M!YT#`\5.M[NS.##@;#NZMUC<>S0:G9G:FO7YLENG9EA[+.OW9\>F9KAF]N+/ M(N2J)2+#9Z.,3QF/),D9ZJHRU4&F.LA4!YGJ(%,=9*J# M3'60J0XRU4&F.LA4!YGJ(%,=M\D@>FQE82HIC2#A`+*V$RL/(5&@0?*\+'9% M2@($+3!!JPT*=2`3*"ERDI.%H(7X+&T.9L+N[G"KK;/<&2YG117];Y7_TA#- M#0<"I2Z/6)Q.],X5W/09_T"WKR68](1[NY+NUN[A^8&)0#H>M5@3^;%D]_:T M*[+E`).M9_UU6H$\2A2R-1(3GXP1`'#)(G5)_DD#66BJLM!`%AK(0@-9:"`+ M#62A@2PTD(4&LM!`%AK(0@-9:"`+#62Q#'"9B(L'DB"NN'A$"D(#<5PW\K,X MI-2Y*DDM(^D@@W$SU7$S&#>#<3,8-X-Q,Q@W@W$S&#>#<3,8-X-Q,Q@W@W$S M7`[RY]KLCEBO M;WR[,$L#I;EL]_QP=&`HUAOHVYG(3&<]PJPQD`YFQUK#*5>+2J6D?SJF,(GI M@#\MFO>.Y/84O*[L=&;PD$$P;^M*C25LP>),VM<;<^3S[KBGF?D?-TORH4L% M#'IZF9<)-2?-'?1&.L6.QE4YG]-R,]#(9L!Y7TKGOOG>`V*P)7:\C_.LC]DIVU MPBU6DSQ!3MQ8]\JD9'-PQ%`L58C9[>\[KST1MT&NH-)TH M'2SY0J699&C<)D2$JR1N>5VV2WSV.&&*-V8O1NQPXW8X4;L<"-VN!$[ MW(@=;L0.-V*'&['#C=CAKL8.-V*'FXF5R;@=,FZORK@=,F[G__*@<=`\Z"3H M!M`9T"=!]X$>!3W-,A/852.TEEYE\SI/\LR^$L`=FVC"R,`7D,''?%V(M^UR M=DE6(6?D3R@G'NX.`59\9[KU\<[!R9B:9F2F(\ M);0?FL[T/>'L*`1\^;C#$>L+!`H=#EZOR'[0A]C]0P8(R1/&C"RX^.7@@H19 M0J@?TO-7I>>']/R0B1_2\T-Z?DC/#^GY(3T_I.>']/R0GA_2\T-Z?J80ILD8 M-!F#)F/09`R:C$&3,6@R!DW&H,D8-!F#)F/09`R:C%4U&8,F8SP+4'-/23;7 M4TTD*:=6RR0L^[QPG>Q9]I[NSE;=E:2";,YF@$8BM$[LS`IN1=X^_X%W1X?G MNM-[2D%/?B;;,V<7E).3Z6W48(ED`[YTV-HW^X+] ML^F>N9*8Z13^^+9>>L27[X"\LYY`,>EV=O9QS/-\3%#QVC+W]LQ3*6>>#2ND M/N.LMV)X9&2<)CBDQY>6Z%U+2Y7G>-XF\%SS"=ZWD8Q907F/",3B&2J/7)>053Q3#?0+ M`6L7_6U%LUPNWUHN7VI<95**9@WX1BE5;]9P)FQ5)3"HDMY7W/)BZ:7R/Q!A M_4T,?(?P#,]UP_*3U7J=R-Z20/X"FP7OR4739@6J[8`M39^^07C/%RHO'YFB MBA+]WXRV%KXA3BD3KZ[FCAWR``XIWU## MPM15"U/S;]M!>=`X:!YT$G0#Z`SHDZ#[0(^"G@:Q&,#N=W"=MB??*9_7LLHB MF8ZTU+`2!():<$PP*PP"2(R)(!C2R36%SLBD)]:DUXHVX=(S9Z0PTR!2Y,]U M:40DFE"(BMJW]W_=EXO9MTY77J#SF>F<>W0XG4N)QLZ>C.VOG_/V=CBW#M!/ MO*"VQR/Y/$VO9<7\MNCP`8-@V9W/;K-JM2JZ=NL;.E="+)8Y/CK67Q,^CYHF M3$XM$Z^L`Z\47;R8GQ<^R0N?Y(5/\L(G>>&3O/!)7O@D+WR2%S[)"Y_DA4_R M5GV2%S[)RVICIDJCK$J&.HGS!B/W^8IZA\/R])JG:17*"YJ>R<7>7>^?C;?O MNG'WF7L,"PIO9CPY>*#@=A?V#TZQ3P!@K@?X(N1\WXN::[;-?- MS#I-F?,$N,U2S1S^NN\\1OK(\IR&YMX(1[]_K@9]N,6&'14:S\X_\2O(4] MO<7]);^[<'"H;6MO1+V@S4T?[YM]_VQ'8NZFJ8$;Y^?I]5.IV8%0]E M-I0.IU-&N ML(+H(EFJ-\U(NWD>%'-`7;1CGT#??6*?4+F=SZ%_[0D;WKPG?A2V8 M47E^ZSQI2[*HA"-&M&!$RSNZ-M2.7KWP%E]/"RVGAY;3P M3@LOIX67T\++:>'EM/!R6LG+->,QR;,MPZ-+=B-*:T/"IF)I M4SYO$#[L+AX:&CI4=%>/"QU[;IZ=O7E/1_5(CV5/SJ33,R>SU>/X;2?Z^T_< M-HYCJ73BMII?OPSZTT""9\X3:[)^)0CGO)Z%PB2.5>!85>58A:FKP+$*'*O` ML0H.,42O65Q8+O0KF#I&: MR$F*J!`S\BK'Y,+/Q)BS2:D2!+7VBN9FC2`H=+:H;ZAP[>4=WWQE2]'56>21 M(645DTYG-AG1M21[LDYG5]3=(+1<-K1WL?+([\K9:,JCE>PU#'LY"GO)DX^P M',4GYR@LJ[/P-L>XL;969X%,+%696"`3"[\S#QH'S8-.@FX`G0%]$G0?Z%'0 MTR"F\>Y5J=?"*L]A0G4Y3.Y2.4Q#K4(5-T#?(&U[.U"3ZMAC"9JZ6 M9RXY.,6*K,],P/K:PJMK3R+=N%5X[]04[VL;9`[GA=*7APXI+]0:ZZLG&3E: MWG?SAE3@`9&H!B,9UFAEH?+VA87]AR]?N/OL;1^G`GVJTGOXZ-'#[/BQ#YZ1 M]JZ%8WS>CDV^5EJVDNJC@!D04XAF>KQR])^$;U_^%B#TI\*5:WQ#"YQ^',\W MD\R_&$&D?J0M!:EEN+AOWC^+),)___N%.X5[CG]:^),CCQS]K/`9C/6`'$BR MPMS:Y^0Y+_(8$I5W@+3)C;I.@3O4?)1&N059*](HD11FQ"CQM[^]XIN/G7[K ME2N6O_0NNE2YDT8KS]$ENA^EDDW2Y=AZ@2J`>37+]=2RS-5RQ4I7Y9QO(__: M7)_2C`B]BB:J^,I7KA0^4?[]X;+"?HD]C&INH4(J0!L\FL" MZP7R%3Z'',O7:"U?HW55<\/JICV3S9F4A\5#:]J$67R@K/AT^?<_8W=V4XT0 M$1[%[!VU?90-N4G1E$K2HDT7MG[IH=$+PJ.5G?1$Y<_H@WQ>'Z*_7G_XHOT= M#PUDZ*^W=7=S/E\6MI,OOFVO!EXKVGK+X![A^8]]3(K%H?77!:U@0HT]3)Y8 M)D79U(L\&W#*4N>QN(A87$0L+B(6%Q&+BXC%1<3B(F)Q$;&XB%A<1"PN(A87 M$8N+U5A<1"PNPAVQY<<0*7+O;4JR^O$\<4*"\15IM9NU4VBGDI*FRTRR.7G! M+\?7O3]O2/MR5;V]H";KM#KU:W=`B]L:C.;$Y'(N%:>O>EG;1IFGQ M6/UA2Z-:)\E^"V3?"1NRHRJX'U5SDBT/DMKR((M[]KJ5X821[7!)UZK[*`:V MJRYY?0>\OJ/J]1W\'ZOK\Z!QT#SH).@&T!G0)T'W@1X%/PGPQN\\JT((Q M5(C'2]$64Z38T=X?-;-0.&+SM6ABXY?EJFZG M=74[_8LY5:2P(]Y_H-_KZ]]?.'JM8:]FZT!;7\AD#)<2V4&ZD-@2MW9,'.OK M.S(:.7&X..S/E$/1\=Y@=L,>#<"$&9CXBI0+6>5E2VMU5VZ%[16]DSER:RW7 ME]K5'=I6_MH#*,E>?0@2*[?=5FZS1$H\F^'_J[FP1_9\'E;Q7Y0+JUA=L%ET M:>M-QE"QHQX,]`Z.F82E'C.5B[!P07BF\AN;SZSIX(C9%H]TC-9DIP`^M)#& M_F5D,E*F9#$R&9*:#"WRMA;AFSEL<9/G]*$:'TYY']+)HXJEEEB'V`,,`P&V M,(\L4%9^+I"55X^9263IWU2^+[1&,@&V$S(SHQO)QDIM+91^4+#F]H]DYH=" M@J^TOS1WFO9X,VTV6S3[0+K;G>P/)D_,Y=O&+BL4%L?:YJ2X3MN%[P*7.^OS M&6FM@,U>ORH=+=6U"<9[=7^GGF4B>TO65M7R'C'3DP5H;1FV_=#@H:+UZ.SB M8M"G<^J:?$VCXWOIT*Y3:E02BQPN]"QMVK)0EJZ]G-0N;V>T MLY4.1&>Q?O.%H7+35ET,D5MNU);#O3:/7U[^KKG6P53I"]F341= M=%9HZY\(W7CZU5AOT&`*][6W]8I&$QP>?6Y;1T=ZYY%$9F%KK+,KV#&6]C1: M_+987\AXTY^)^5$Q7.[Q^3/#P=!87F2^;A!_7H$?<++=2Z>L2@9(@^SWF.=W MRE'"N;&;OI%/L#5[LUS0F_FBF=-L7+:ENH, M:05>J(3$0MS>VU7Y*SH3&^EV:ZT!.S5!H*G9F>%RTZ<.+CVEJ`"MM9_A9Q+ZM/,LBZEO(U6?;F&'855>1]$*VM2>XE] M$#//PCMH,!*ULAPXN11S;[`?WJD((LL+6@@VA\K-KP5QOG>$-:#;"O\EOL MTC<+U8:_VCC'&S"7559]Z^6W$-@H;2MLC889#D;F5]G*<7RU5CDC!4FR/62- MO(;.F-?DBSDJ]]/AXEB++V9'ZWUM^9`I$>MJF]M> MDQGLQP3?.;)YC:O>?A3<%TF!K%7FCES*>BYI,WS"=19S;4::X47FZH'O?Y!P_UEPX.^OV#!TO]AP;]5$B.=SN=W>/)Y'C* MZ4R-)_.7C;>WCU^6SQ\=C\7&C\JY<@&YLNG_T5R9)NOSX_J\68ZU%^7*&=5_ M+%=6P1MK-R?+HY6WI\H<;P7DD2:>1]Y7S2.U_\EYI!:]VE:DEYNUM=Q1:DM5 M'F%0K\\4ZS/(MV>-E,?GS5FCZ3^6-5:.",^,;,X:*Z]+OJ(??W8(9KB&J%2" MU_PKYJROZK=1]@:-AAS[RA8V-:[^F3LX+8SA:5Z485F0Y45;.;+/\;0AG[6V( M:I7#VC[IK8@:8*/LE>6W;0'57H`\/2N$BI,=T9T#44^RW^\M=ODL_JC9VAYL M11D=S&^+!T=R8O?$W$2W/1RW.%-1^V>ZMK2W-$=*R7!WP*)6Z\V>5HNCN:'1 M$G`D!\+-)K$WVMWK,UF#`;O/V*"U1?GR-J$>X=/PY_LO_5ZN0GYOEIW;5B7= MT?K^.$0MO23($.Q<>0W_3]&_7WL+S)ECYBWC^'5MG'/SLW&GAJH,G MA'$DQII']01"&+V[M,^9L/`V+BM]Z_/@==YQZZDN7 M?^#&4]18>>W99ZGMU8<>8F_XK7=S7;$W$#9X:>$\M-1FWB+/7"5+1D>3P=OLB8F>LC#.6:CLM=DURDF5LCG0P^4/ M_TJ?P9B-J$WJ]PXWO[.;LP8R`9H)6`.M],N5AVFQOH)CA:&C M5;.`?LJ<0*:D0`-N@&9&S1&?Q6#S&HU>F\'BBYA'NYM;=$JKV]/8Z'%;E;J6 M9N$OBJ9`RO^P,^XSE8W>N.LA/Q!<;';XFA^.=/L,5"$8_2GQ$://WBSO2:YW MD#L5+9?(BZMKERR.[B@K6G[O4/Q4>L8..7BX'`8V[]77\ZZ6WZ?L7+EHG=8) M+4A%55?*9F7ZE!C,5'GNH-9T518VJT$ABQ/(*+^P:917G:5?!DCGDA] M+>-=JFN2BWDX+AF]E&6S8-\L!_OZ7S&_IIT4W@I(4Z"(`=5D"15 MK+\AS)$N7-]-/\R_WTUWK/\"W\=`>T%VD`?D!HF@"'N>WP?"LPGV/#_>OOZF M<#^9%+Y+.H3'<#P**H'>(!T8:Y=P-]IQ,JDX3J9PSP[AM^CK=EQCS]Q.PKA7 MP/5M>(XH[B%-[(CGQMA\<"08HYNR7YW^8/UEP4%"PC39(A]#[$C;\$P)[3CJ MPQ^@%O_!^J\$-3N2$<4L&637^??L.3Q#=Y!^].>C!=+(OD/;(/R&F(0&THBV MAOZ(M.*>+CR_`T<[_3SL@%$K9-G*W^ETX]\M]`"]E_Y2B`@SPN7"S<)=BF'% M"<5KRF=5;M67&TZK$^H#ZGO47U5?4/]&$]&\W#C7^%CC+[5>[0/:I[1OZIRZ M1=U?-Y6;OJ@OZE?TOS'$#=L-MQH>-OS$\-OF4'.Y>4_S%<8VXV.F;M-*2V_+ MA\Q9\^WF+YE?LP0M1/3)Y[-W'N"_@G_4_9[^7O,1GAK__V,!_0]D$LVCF/[5H0:YC MX4O=-N1/#DC-P[>Z_9A-"+EJ!/&_#8EP#/5,@B0A\Q3Z3R,3R9(0HWS"/\=;7!E("]&;VYT M("]3=6)T>7!E("]4-J=6'ML6]49/^=A_*0T&;K\_W.N>>>\WV_[SN_[UP32@BQD_-$(*6# M)V9/D7_0.]#S%N3JP;.GPT3[T._SWT.G#I]HDE^\K+?IGL/'[SOTK?>__20A M[&^$.(X?69B=__O2N9\1XBIC>/$(.BPO""UH7T2[_^+4/0NGEM&/]BK:)FXHH9K!=F(AO^!SD+U&SU=]&/FZCT#^_X]I73-# M+,1*&D@C-!O98-C81!Q$)-QW%VDF;@)DB`3Q$`*_4N/+I'&B_"*EE>EENO;P M\@@)O((9A)D[T\N$IL+AT:,C2_0`&BR%CF0$FI`*CRT)L;'=964ZO!A>W#J_ M&!X+'YF=7S+%M"MN+"Q.J^$ELJ=\%+^WE2-+I6G_NKHP/=V/>4Q\'I,VS^(T M9CAFS'!,FP$37,<@FF%Y<-%HL'EEZ=7'1OPA/M!XELDR) MT0%/^1@A-KI,2Q/:K9(2\?,.):)$8,?T".9N3(WO*8_"DLATFL<[AQ1YC?&X M6A$%>*#"537;'8NX(C%7Q$6KM?/T?.TQ\G=.V3M8_H0^Q=;6[^#$(/B\Q4H?2AV@=W4X^3_?6Z MI.=K>.U?S,?A1Y\U^K-J++.HE<4@1,@:9 M@AR"G(4\`KD$N0)Y&?(ZI&G_S6;R.RCO0]A^[F8SZ87IW"`8M@HXG#4#SG>L+)'ZR2-MS+:5/ET!-`3]#H`8KY(9K/ M!9GD<5BDEB#+YXJ]0>K-9VC!U9-A2M3!S%*+`TJ&%7J&6.^0D*V8LDEWI%6D M(.RCK:,M"6@;8,M&6@+0-M&6C+0%L&VC+0EH&V M#+1EH"W7T9:!M@RT@9\73,"G]#IYUD0TW0*TR&JVF^8S`@>BCH_BH'4X\CEZ MZ;M"\I;)S*:Y$24^,MM_^(+C,6MO/I+QV^V!3/0.NC.WM=N7'#\\V#\[ECA^ M.-L75/OEP$!W:#VG,NPJ^"=)?KI,NI"T'JA\>0^63W(3$.&V#US9X;8/7-GAM@]&V#US9X;:M[;8/7-GBMS^[#K#Y5 MU_7LPC[PP@PS\HB;808B`3`EUP-.GDTB"6BY0V_("YY#7BGO4EQ*AMX(%GW. M+JM*1`TYF@)917^_*Y6:@H/JG)`'0R&!S*RG![X MTS"[6OLTGDAOF^TISF]/QY(Y)^+;9P^_F>ZP9^.]N3_0,^8Y$US MPP.S8_'8R-S&\@/!!ZU#78,EVB_&H]Z;+@[>-95/;IWO'YS?DIC8[^L:TCF+ M_VQ'7#UDIJH5,FZ`@,4MP)C@ZEXA.D!*YRN_*N?$$I]!3S.6^!@V\)4$6:K,S-M0;\K5:JMT*+NS-]29IDW:ONC'[QNPC=>*7AY"MAY"!C&MZ+K%N#:N:O6D MJB&O#X0-!25`L?P;E0J;/'-FXOHU9N:Q^6QN_^=C8UZ]H09P#_HKW$0,)<9S MP@3R+TT>K.)'?R[MY"%L6@]A`!M$WRI&"$&W,=QW:@3,>]7Z*@Z('S9W(*/Y M(QVXV0"15G0]NL(?;2`=>+1*4H9F8*MO.>D+J@ZTE@16I=!?\80BMJ@BLHI5 MB@6#2K.I(N?&.HL[O=*N[OQ.F3'S]6LT%5=;&[WQM+?V'@W[U)BW)9IIJ[U+ M]^8VIUIZHMEXJF.,K.>+&ZFR_>OSA:EZVU?W]G_,E<(-N9*>0JYP2[^0*UOT MNLQKPT;8Y09C_0;08;%.58=0SUA.XQIG:J<[<";AOH`S"3@31VO(6<@CD$N0 M*Y"7(:]##,XDX$RB<68G9@VN:BQL)K_'WOU0(U-,WPBE%=()Z8-LA4Q#CD+N M@SP&^0'D!<@KD#!8/#YV<./&N;$X9:'!3""0&0R%!E195@="0_.; MX_'-\T-#"YL3BAN>B[KD( MS\6ZY]P%$9Z+\%R$YR(\%^&Y",]%>"["B_!)&<:2>5[0&?(F),?B_R:3J#[H!-M;W#(8UHNQ6ZH1QPW[/]"/D@_ M@XVG%AV(9@--]H"J1-4@O];>J;"V7=F^R3Y9[B]OS$ZTL?UR>C`4YNBI0&\P M+=/GKX]]'$^DMAWHZ5VX-1-/#AM[@GX'V$FDNZJ]/G#CI/4]8'"\P]CA#HWC M&XBCGO>ZJ1YO(WQFX1'39U#.Y/)B5*"W[AULMD?$:5$T/U\SVBRV947F/^+Q%G[)Z=- MVEY[#;09[`!M4LZ%0@=L$A%Y?1V^Q1M5O;9O4*OZ&[VVNQK6-8>A86VW(AA? M=QY?]O!/'I]AY<4I-G/IV2?*;!^6?8;>67N:SH"W[Z@]AW>M:^"9)JPI(4U1 M++&.6ZVOS==S&W.;];G='JG%8K7$$Q+?OT5:>.>)N]F9IWYN\UTV']OP@\)[R]EB`!TS=K%];VFHI?^O_"2_]- MM4_8$`E#XNR@=@W0[:#57:1(<8[A(BR2?M[&?3ZF2!^&WHIQ!XB%]PL97*UK MUS"_C&^&;",':)`NLC`[R]X0/,*(<$#XHREE>LM\S'S%DK(\8'G=2JRZ=5[4 M+H83,3.\L'%*9T>-?V,H7B-U'RS8'V1XQ^[;=HQW;5DX?G;A]-&#LSL6SBRD MAT\>GU__/V;MA_P]_2L^7NT?&2?>C3:1$=3.S60+B'Z\@D MZNGMI$SVDGW\OZ'_`I3^B3D*96YD7!E("]&;VYT("]3=6)T>7!E("]4'0I"B]4:71L92`H475I8VM2969EF4@,S<@+U)O;W0@,3D@,"!2("]);F9O(#,V(#`@4B`O240@6R`\ M8C0S,V-D9# The PDF attachment to the following forwarded message was mistakenly content-filtered away, so I have modified the filtering options to include PDF files. This is a retransmission, with the PDF file reattached; if this attempt fails, I shall need to do some research on specifying filtering options for content types in Mailman before attempting yet another retransmission. -- Benjamin L. Russell On Fri, 07 Nov 2008 15:40:25 +0900, Benjamin L.Russell wrote: >The following one-page Haskell Quick Reference was posted earlier >today on Haskell-Cafe; I am forwarding it to this list as a reference >for any interested beginners. > >-- Benjamin L. Russell > >On Thu, 6 Nov 2008 13:41:13 +0000, in gmane.comp.lang.haskell.cafe >Malcolm Wallace wrote: > >>Some time ago, there was a thread about a "CheatSheet" for Haskell >>beginners. As I recall, the CheatSheet was more than 12 pages long. >> >>For a Haskell tutorial I was running at a conference recently, I needed >>a "Quick Reference Guide" that would fit onto a single side of A4. So I >>knocked one together quickly, and it is attached as a PDF. I send it to >>this list, with permission for anyone to distribute it more widely as >>they wish, in the hope that it might be useful. >> >>Doubtless it is incomplete, and I have no particular desire to fix >>errors or maintain this document, so if anyone is interested and would >>like to adopt it, I can pass on the editable sources. It was originally >>created as an Apple Numbers spreadsheet (simply for speed of creation) >>but could be converted to Excel or CSV, for import into other tools. >> >>Regards, >> Malcolm From DekuDekuplex at Yahoo.com Fri Nov 7 02:15:30 2008 From: DekuDekuplex at Yahoo.com (Benjamin L.Russell) Date: Fri Nov 7 02:14:52 2008 Subject: [Haskell-beginners] (re-send) (fwd) Haskell Quick Reference (1-page PDF) - QuickReference.pdf (1/1) Message-ID: begin 644 QuickReference.pdf M)5!$1BTQ+C,*)<3E\N7KI_.@T,3&"C(@,"!O8FH*/#P@+TQE;F=T:"`T(#`@ M4B`O1FEL=&5R("]&;&%T941E8V]D92`^/@IS=')E86T*>-K-??MSY+:5[N_\ M*U"U]X=)66+PXFON.E7V9'RO*XYOUAXG6^7QW5`M2NIUJUONQXR4[/[O>PY( M$"`)M,@&-=-.Q:8XHP^/\\!W0."1(+FC&2B+Q^@+_U-[+6 M0(1&``2_$B<9Q7\(_N_2_-@@60"+>_+U.\*3^F_"?Z4H8EH4/.(I>7=/?O\- MBREAY-T->?5_O_KQ3V^_^X[\VT_?OOD3^>'M-V]_>/O]F[>_(^_^D[Q]5W?6 MTW+D:YG)^F_"?Q.>Q$QB%V2_Y6_?OGU+_KK<_:VJ?B7O#OO-=EFN"*LW@!\;SN)"9(/"C2&0L\M2\ M6T4_-OUI1YTE,4]97A`N6`PB%D4!P'WQ*3UH?T=F,LX%*Z+F=R[-+]6:(64L M4VO$$A1.9B!!&E-KP-9@(Z.N62X%$QD^P7]XDN#(69;*3/6"YUF<\ZQ0O4AD M6L!(H:4BRYJ>X;MH9;U+$^@D_+V5];OFW9WU5B30>@^Q>==!Y#"RM(=HWEF( M0N8P,5U$_6WVTWEF(+!>@05U$_\Z"$V[SJ(M(A9UD,T[]R(-Z3Q""Q"CW#4 M2(Y[BZ$5@^>0-"5I!K(D]3/\77C&SOQXU'L>09,&+,WBPM@"3T)M@7-C"UR$V@*GQA8X#[4%EAM;X#34%EAF;('EH;;`$F,+ M+`VU!2:,+;`DU!88,[8`P1IP>,K"`*DQ!R2/P8"YZA0\:'PV&3/2F$1SN;R# MF4^TC`%>PCIX:1:()RS*1`.QF+5(B$`LJH:)?T5K'+[C`PM1FK1'[<4HVE>7O87YUEDV'?QH(+1J>*C+:6D-9<,09(:2;'' M$*1F.:?U]G$`DB:@M&:>(4@-Y:3UMG$(4K-I3.LMXQ"D9L.8UCPU!*DAJ+1F MIB%(S48QK;>)`Y`TN:4UJPU!:N@LK7EL"%)#8&G-7$.06FM1V\(A2*VUR$!K MT727UMO!`4AZ,YC66\$A2)G6<<610Y`2K>.*%8<@2:WCB@>'('&MXXKYAB!1 MK>.*ZP8@:9)+:W8;@M2N+6J[-P0IT3K.`]<6O=%+:RX<@L2UCJLMWA`DJG5< M\>@`)$V@:.**X<@)5K'%3L.01):QQ4?#D%B6L<- M`+/(+FU9;@B7RBV\/)"Y,`LK#?3K+751K#@Z74];!UJSZ^@T''O#EC;;M2=V MZM)@91"AJ`U@F*LL(,RR((&P1PTD/L\`&0%S)RVDG`>2)P:2)W-`XKDY#8G/ MYX!,"@.9%+-`6@8IYS%(:1FDG,<@(5PPD'06ZX&XH87$YSD@,V,]^#P' M9&*L!Y_G@)3&>O!Y#DANK`>?YX`$,$JI)2/]XM1-/FMAP[BC`]Z^.'6/SP;/ MC$7Q4:OF\Y")L2A\G@-2&(O"YSD@N36A?)ZYI,:B\'D&2(A;6DA\G@,R,Q:% MSW-`)L:B\'D.2&'6(WR>`Y*9]0B?YX"DQGKP>09(B'.H.0@"N.V+4_?=;8Z< M]\#;%S-P^L10^F061B_`G"+M^N=PT\PRIEE6)V-)QHZ:BRF]:QM45]_ZBYFM)<&.%1"G8JG7/`,'?W(:T=V+[]^%S'67/YA!`-Q MAO]2-W]X>_/GS>;^OEKO=^:24;?[21)G(BVB1,30C6=[3T;T/AK7>]+K/2^& MO;^\[-Y/8KC'GN`]EJ;?(.8L!AH_H>-1Z+1;'8^*U-MS4JVO+S4DN_]LGB*;K9R$(3^?O#ZO]LB,'0OYY^7&YOR/K M:K=?KF\O_QM'6`LGZ@M'I+'`:S23A3/K`%$XJ7"-[U\((?_2=G\@(-W]GH"B M$.4:M>9UE4L)R#>`O_SPU?_Y\U?DL#N4J]43*UBNJJT:;.0V)'V];:PW?D%AY70XUF^O0?F6-TL8Q+J\K[Q>F>&35KEH%G^` M?8NZHS!S1O'ZUM`?P(K2'T%5[L6;NW*[\_D#W?5S\`=%-A3!S6&]V"\WZ]T% M^5!NE^75JMJ1Z*@34]OL<'+BSYR"=Y0(=MS&IVKV1Y9J4V]N#6G(? M-KNE,CQX59'=W6:[]TDJS^*"OKBDC%I0GKHDY=#(F\WF/[XNM^\%3X2\*O_A MDYD>02VS%_/@XV2&-[G[`SFLKZOM;K'9@I3^XX(\;)7K_WBTKT_"W&Y^J_%I98HB#'J5:J$]6NU69/7EABM%:VAA1Z))3GTXCPD M5CABWO>OOOCB_>]@B%ZAZ0&\I%NT5`2<<#*6:Y3K1AJUW,#MKZ4E87CR4ZUB,+,\';N*E>3OL)#]W2\G MW?5/P@F]?7?+J9&&LI2.E)3XAD*Z*A>__G;8[/UFI3.8G$'0R(4C0OYQOX6Q M^()%P8LX2P=Z]JD=H>I]XHAY@5-P".=7&_)QLUU=PX_"$SNV(SF+33W76':U M)%#?R+6*JBX;U7+*)A(<^I6=X@/ZLHD"!E3+)K6#X:B5C5P@F?4Y`MW_(Q*) M`I7+_7G4L14O@.THZ:/T0AAPW?)UHZ(4-OYO^:)R+ M_FZY@Y';LH/>"5/ M;-85J5;5/6Z?E60%>+YIH!0$\*D6*EK$.1L["^]?/0)3>MR]_YU/077?/\U* MY>N\9Z7"2:]IWR,I]VH3\V:[6>\O8$ADN5,O(`#;D\V->CXB)+"/F-*SX'Z" MY2[NAY)Z@O__`_[_\R_$*S(]DFBZEY_U:X?R*8ZQ1%IP2BC;"@SP[LCRRW,6 M"T_0&\VC@.X[?D,7+X0C:OR9`"=ZN@"Q_&*-(+(%HD<0))`H5+<:@>`8HOZR M^]L!HZ4K\/2_5N`6E4GAIYRRV4PZW)9;<@/A$ZCAZZ?7_WC]\R^U_D4.@64L M3L\C[A4)=PF,DS@F+.D(K&-!>@3GL+OD'(.R'UB7]N5RC32\).O#?;5=+LBV M7-_Z=FAYRN+B/.);D19.R5P0J823^H6C!W$6PG$-8RB(`(:I200-Y< MGH>0\M0E)$DOB"A03/!WO6+2PS@+,;D&HH2P4Q'N[0:BC8]K`N[N(T12^-_# M@T\^.M?E&42SDCJBV7>'AY7WRR@!G<1[" M-822/)3++5C[AW)UJ,@E[I%L-P<()-1V%O#07=598GV*QD6=#/3S.P(I,J^H MD/GXN:@>PSEX`>S:M,1X7ST>@S?9.;>&@.>7Z"1=WF'_U*?TU^1:# M4/A7=5MM+\@WJTT)/]?G!"Y(M5^T@XTZ4F*%C!D-W,\*CQ24E-3%VH&48NHQ M];;K;CE%GRI0JTT]=X30'6G=X*[6C+ZH:S_](*\V=R#?WCTN`66 MRUB>QS?9A#K"4Q;S2OA$IOM^#M_XG+W?+9;U@:X%66_V2B0$8M`O"8%QD4?" MZ/\7L/AX1*,S?I^!QTZX(XI["V$W?L"L/V1Z'#=^JJ;BQ<^JC7$)B7!$.U]Z M/C:T_3X'HN;L>;.%_27N%);DNKJ!<$UI&+J(F@QT9!)9&>*36,BS<-.)RA/1 ME\F7/HO7'3^'[PVJZWVAU%]]R)>-5/!,:KE=[E`J^C#&MMH?MDUD_?5FLZK* MM<\#Z`S]Y^`!,D>L]EUY?W5=MK[-YP)$$A?I)SJNBG-&\[%[\.]?O7__>/D' MYA`UKVU8]OOOV6?`!&W;@$]0&A MEE?ML7U*QW([Q,8+_^*S'&:GCG#G\@\^SZ![W0A)=SN:BPBT3:G4<,)W(%KT M>SR00TFVR]N[/2FWV\U'(`/-V81&-KL+8N0RAO$?Z8W((1;(6:0[)L?93'UU(Q#@^#KWY/'KH M"KN_*Y\V!]]UG8+C1_$\MRUH;DZJYRFO2]2,^K[''\(=")_#/ M*.4=@<]DS$$D1:2;,8:#LX7]_@;+>.HYV_F M^T1I+&^2D+]=XQV2.M18[O3)I_T!J.&':O6$7_N7Z^OEHMS#YJ8\XY:9DPVMXWVXQC MNW_"$05O]Y]5IN8HW0:6LNWR&M[C2;J#.D57/3ZLEHOE7GV!;:[+3%.C8]T: MJM&NNE^J8[*[N#NCS]:GB];]VG2BGEM:U/]@4<'FC^TG?2/9JA\7R2*/)0)C M_3B:<.@NR"A%8=C5!TE3?7`Y;I=!@P[*]R&Q33@JM^B7[_NN>E1V_.,3".MQ M>LF^XU,2/3LE@H*WSF1!GIF2:,*4.$#M*8G4E"1Y#"$A=TS)V\>';;5#SK5[ M5D6B:?-Q7$4P+(8NX:7OG(2I2"\Q\@!TJ"(I="AWS$?TZH_M]D!O/C"5899S M98)%D=&:<_&,"$IUU$ZYV-R(LX[4E&O^L@XI?(GF2L=Q8B MR_+!/.IW-B*F5.S/H_7.C6CJ$Y*P^H31T$14_9,Z-S5)F2ZJI%^,+2MR'+P<4SKU&GH60&W"AI*PBU#>4GXD9V?Z7L MS6]"V335@%K M&TKF4#5.60_7-N7350WK[G94C=,Y5$)5W^VH6GWY+UC5F.BYGCI[<+"JL;[< MZES"P7K&^BZ8C73!S^A9GO1@Z2PK9]IS:-UZ;M')ZUM_F1^7&O@Y+]E;C.=1 MW*SG(L4<:MLM]Z:;2@,TM^`M?<+'C(5A:S[BC40!-*6ZT?6S74 MZR28\8.!YB.-APB<]-;7B!""0ELO3P.=/&U]/`UT\;3U\#30P=,Z]*V11!*$ MI+T[#5PH:!N&TM'QIP])F,)"08L$;=<(&KA$T#:XU`5O`I!H6^8F:*FA[4I# M`Q<:VH:,]*18L0_6JGG8FD7;L)`>BP?'(=&VJDR@FNNECP:N?+1=^&C@NH?I MCK.V@DN8V[0KN(09<:]\2P!2KHL4G;YV0E014;UTTM-73E74)$I8N[2$X*AE M,S+%6D[&J1?-B(9%7?9G*%.LY40PNV9)DR->CJ^L\BPDRPTDR^>`A%6^A<3G M.2";).0*`%-1`"CH' MI,B,8$0VBV"`:!C(9!:-!,9A("6;!9*:N<3G&2!Y9B!Y-@]D4P]`08ZJ!_`\ MI&6*?!Y3Y)8I\@!3M"&ID3BGLT@QM1;&>=9%9BTX\[@URZO-(A9+=V91'>/0NF49AB=! M\#!"QEZF+(.SE^/*,GS3')$FY0,>K7/>QU'`-ZVM1H4!T?>Z_BA6102$^-AMU#N:C(5;7_6%7K]M1ZG5CP M1AUR;),75^UQ,]([?V=43J8Q3TZ14Q0ZVL']:\?%I1ORO_R2TEU_R8N6(W1, M22V;F]I@JFL\4FP+A;Q_=778UR>,+\O=;K-8EG@BNG\%P8@+@^?T+,3E MJHKPB,E\GWSRTGT_!WFY>J_OPF%>NN;Z*":&A>YI\:EDG3[1\!1$VC7SRZ_R\J'J,,X&8+SB:FN6VO*S;GOK5@FNRJ8U+=&H&Q+&;Y60C,5?+A MD?S]YN]^:>G.?QII@6X(.EI:6ARM`^Q)J\EY6XNJOF?FRW=KI$6S6!9G(2UG MN8H;K,G3_WT+68RFY&\:"K!L7[0,9;HU3"Q#JQ;ZJ*+XA=8 M?LC(UN*".P\9Q&H%7%BR2POH(_\<9+!;"B)J?2/SBJOM?"LN9^^CH&N6YO47[;SAG3*/JQ]-!(Y+J_F8N,YHZ1V'>XC_++Y^<)Y,,D)]O75VL&U3JP7N6Y_H9X<"?Q+GLA@.*!II26.F2^(5F-0](,N2!BNV%G9OQ?XL@28K'!F8?!K] M4.[WU79]>5_N%W>-;JO$IUK!?>J=T"XY?E'UANE5H<<1];;CSHG:T*`[+L6C MPBDBM0LY&HIXCS>,L%2QQ MV<[C%P)F+/&93Z-,T7'"^VGB$TP0.8A/-C>P!D$84G6#E+*.6_2:1,"4ZCH" M0!V?P)9\T8F^QSB=*7;'&P4QQ7JON@E/HDXEQ')?FEH*WCUW(N"7&1N$R)_: M[:EQN*JW?7U8KJYA)6)?<#38[:&7K=EHH![(2^8V&L'=:PUT#>6O*JFIVAN\ M@E'M<>=)J5F=0.NZ(S$(RC#E>^OF?4YLJOU$XN.%!UX.'(NF`\<:O2(WY)%\2;9WNZD1 M2[^UJ.5T8`DR8ZEC3,OUQ%7/.R0\[@G44;C6"JN-Z(2!N%/S-/LNQSB<5J11 MF6RBD"V7;I^CY],584EN8\T@]+J`#6Z\J*T)7=H+LU&K-#$5N5U^@!5K7*SL M[M=SV4<< MA;=)3.:09YQ'IQKGF&G+)7B`G!7/&&?0W+GR9OF-,VH5JC%.ET:%,R;C"OS= M'F:/KC#%**:14JF;[G878)V;G:I8=(!U6J4BQ)`J)N0O=K2E_K[9F@GMF+6+ M$>FRT/LQW MZ`0:1TC)#,[#<3[;42DH<7RT?;-97R_KK-*^SP]8W(32E_[\T$X8UO9ZEI8F'.B1CEP32G%WV+%U/HV-1$>&`'^;B\+AR%&+IS$L?RL2]3=U,ZPK M$CQA#!/=/)*$HWD)CREL11C M;1/3D4Y4MCY^2^/Q;(6]6]K;R)RXD/O'D6!ZJ92[-LDV-]/VKXY-UI#*8Y;- MAW(/?^$/:D3TM)ESL480M2.E)S3&=&-LHNWX.C=G/(VC'>N/I5B1_IZ^0"YX6:Y6F!RS1,:H MLA(OL:35:@5='6>ISS?/4J`T0J9M+\QW]5;;/)^VVQ1D9[!1)*7CG/"/U6^' M:KU023AK.N[?M&194>\VUPN`A/G*`G>,(H_9LR(NTK$[1M<;,_NC/)@7'0)3 M*5DN'%^V4<7)OUZ2Y0:C@XF4X\APW%F0VR@86BSMC>0H=(@N6\(6\9!&G5KW M<>)ZT#3E6@\2ZDSQ/&T%]4NK2?'<-F-4HBZ1,-><2?@;'%08&NJ[1>^I/Y87 MG5-_`I,!SAN*M9[KB`2&BMR)NG?+Z^JRNKFI0,=`]*C:AR9=[\3%Q*]P%$8D M9=[:E/&>4VQIQ&!%&A=.]E[37_W%=MKYAZ.VF_9;JO3^*V1VN=FJIVNOF.E0#OQV:O:&;Y1;+*Z^KJ0SD2)D,AXB9X+U?F!CX314IM)O9^F_MG.8O M$Q^@[/GH^*`]@J@4[Z&_,;K*Z3HG] M616OTRR1+9/5$OI3KIIJD^!/P%7>S=@QD4:#PG>U9=9[MA<$NJ.(>VN?L4^# M.5"*]/-K<%[X-/C]*_Y:O'X"IGA$DYM1?`)-EDFE#>X\$S4&5_GG,ILUI']1U#=5:4L"JVH]NY-Q0EUE^^) M+&](]Q?FZ]I0G=O.F!6O_FC93*A'F0L>\YS3/#+[=^QEPC<&&B:+L>&;VKR; M])GO"'Z]>1>%;-X-VXE.W+P;%=\;^PNRJF[V^+/Z1A%W M/T\DB8"`B-<)=W.\,*#+3Q0TELF@_(2J^Z!_IU=^(KHTOU27GT@DC0MARD]P M*6.19:RM/^&I^-%$]\_4G\ARZ$=BUYJX5WV3TJY)L;+>F5H3YG?M^A/M6Y%# MF[2+J-_9B'B5(@EZDZ3<0GUHJ&]='!Y+U%W*O)Q&;6?P:6]3-V@0.,2MQ_'3?)N MJNXHI1/GUU<[@_5J4>39#+@P^[)7,R*C)^)&W9H<_5H48Q,''M>SA/=J&B0C MTP@^HV<)%?V:',4<>B;SM%^3@\^A9S+MVELD\V0./9.843/J-)3/H6=2].Q- M)FP./9-].Y9B%G\FTIY=R)%V_(R>"=G3!Y&*.?1,\'[-$YG,H6>"]6N>\#G\ M#BS:/7\F&)U#S^J,L)V&\!9+482K&N?]LB=35=A3BR+O=UEQW%%=?D;;6-JO M1Y&S.;2-\9YUL%3.H6U%'Q:G/`I6MMXL1(68Q57F70U.YUCH(]9;-V4VAYL, M*G3A5%_&(,S";1O-*,V+/,13&IB&45H-)0&Z:V`:1FDUE`?HKH%I5B+](NHP M2G(RKF9^YD40\VN[IYF?U5`(\S,P#?,S+X*8GX%IF)_54#J'GFGF9UX$,;\6 M1C,_JR$^AYYIYM<*,HSY&=R&^5D-Y7/HF>S9Q72&YM8SS=`,+I5SZ)EF:%9# M8@X]TPS-:F@6?Z:85`?79E*GZYEF4JT@@YA41R4TD[+:8G.HA&92!G<\DWI& M*S3C,2_265:YH@_+Q2R+7,_FNHPG.M5%]#08IR`*=CPLZ_FSD.6-MGR$UD0D M"D`2NE:!HAXA2%S7*E!D(P2)ZF(%BEX$(.F=*L0,FR?%4.H2+WD6AM16K%!D M)`2IK5BAZ$<($J=M*9PT#(F*MA1.$82DN06M244(4JIU7-&($*1$Z[@B#B%( M0NNXVB0*06JM19&.`"3--FA-,T*0I):=(A8A2+PM/B3#9*=W>1`SS((U&Z$U M#0E!:O5)$X\0,-X6U0E4*REV%9L3.F62PBNRHG9EZMSP2K': M=Z=*TT[;/U%7^< M05^!R-GZ*ND^`O'KH#(VA[X" M";11\<<9])5W]97/HZ_`#&U]Q1]GT%=@B;:^PH]SZ"O017L&\,<9]!6H8P>5 MRSGTM>B`%G(6-M!=MI-Y/';78<^!R3K+X*BB0<]B=M;`;MV@P0F^*#2#X60S M=218/U8WJ#X,JA[?O^KE\=WMR^U>9;S!##V;C]7V4IUA755XEK-_#\&,'5B] MNEX%034.0Y5Z9FJ#<<[;",^//N*>@CTWY/5KTDL^B16?>6YW'T-"3-_2='[6 MI(VF-6B$/G,%NG=;P1;2-;DA[P7G=^5.)?6`9T$PD]*?UIN/ZSK)X:BCXV,Z M)&3,BSQQW/#$IL<=NA^T$QVY<&D:V"UOU^7^L!V5_F/,[(*0051`-8=7'QTG MCVN]AFB*9[9>O\CMO8X=B=>F_P/AC%?[$ZIYI/O?4H&O6VQA#-I=YM:]'( M,?3+,VG55FK]<=/\W%YXN[!RA^%(/7Z(LSB3'3_T$@G<+?W(ZK/8X^[W]5+@ M^<2E!U&+*YJEU$"?15K*X1G"<7'UDV3#JT&>[(LF3:GZDXDNZ4BOAC>ZL`9& M;S:-B]KLJ866QC&;1?=U8A*)CV>C)Q$)0?55X9O%OU=S7C/MBT:C9'X&O M$S-$NAES.^HC7H\9M2`,VHE<>1E2!MK@&@XFC_S2D2[/>"`MW$S6T:2X:52,#+4VU]X>FO;]L/$X^:N>MT=$7R=YI]&+2K-T>RNVU8[@2O MWI6+.Z+Z7R>T*L>5VAC5)3&@C3@G'B;2WK1ZR?10(^,AO$TY<*/OD+]W0D'% MZ.LP4.44-%?\NW'AFOST\#`R,!02J"<[T3V<0,C:^CVCJKY@AOAI_J"M`N4J M.,0YLS)96F[A'>CAE^0-_/O;]=[G$/1,?1*'X)TGIT,`][^]K'-N7ZNT^DI5 MWI%]^2LJBPI#L0@$Z`Y>WH=50Y;PKV14VO)1?1JZ@SK'A$H=4'<&/4.KL]#/ M@ZH_^69:]'BL#T/['_2A65$Q08V5Y@#_K)V3NCCP6FF"QV8$JR]`?J(@1D#` MELH7M)D&?YK-_`06\U=83/\&__]WG\WHF=)$[]1(:9S-^.9I@LW\-&G')#K6 MY)!^]-3Q)YU]H\G.4L)\VADF+\C?5,*4?_?I(4PG2SZA'NJ"(Z/T$(2HPV7%KX9]#"=^3KS6;E4T$]29]&!7U3Y%3!/]>)UG=/JL:5RNY5CX5< M6GG.T6]Z)S*:VHNA5BZ!*VX70-)N*\S4XU$V7N0Q37QA^MR:AO56\[&:MJX^ MGJ!L31/.T%;2C#KK?'P/ZO8]4+%WY*=^*=16X]J9>OGHUCM/SIWJ[U'=5LM? MJY[.-<,!Z5&"I',=G?@ M7R`/NS6%&?#NL=G)[S?7A]5$SS!HH-(TCC+4"F& MGL[>PHMZN]*M(-J/""]0WG"$;M6ULK%G6$@S7,O&[F)QC,A'Y\!?WC]LMON)6M9OH=4R@247TL)9R@:+ MW,5_VVRO/9\F]#Q%TY5@UF_-2JGRQ42!>YHCQMEJ'Q]=[7FQ*G>[:?OY1QHH0+`0\+K2JKT96[-DT(XC MJQJ/!;4+88[];A!-G3#W]P_,@+VY5F<`D,I%;NUNY'["%DPT^3NI?Q#1T8IG M#]OJ&E-QULG'ZK(>L6?ZHHDM._F[TK=F`KL;P'7RY?O#;J^R%.J-H&F,[EAG MA@D2'8<"NJ;+LUADKC!BOB_=AIM($1=TK-UBLNARO:BF?>KSMX&?R"`.8/;2U.-=]A24]4H2R'$98)--EXW,SDR:T>-]TL"OGWELUTM^(E1T2F&ZQN` MTW"UV)N\NE-;<\?B7#&'3M=V!C&'E(X/'5^7NV9F?4<$.,WBHK"<1C3+V3W_\H7G MR]C8C\;-)X/(H?.ZW\-S/9^!DDMU0ZC7^=7R?HGZ!!J_6*HTE:A/ZHOSOKJM MMCOR_I5*ERDHN5KN=]X/2:R`T):>>!)K?D7+V7"LW]9#\E#G=@`]8\'.14,(7#!JR% M-)[O\A19Z13XYR$KX3A,_L?-X:H?/QMAZ?Z_I+`ZJB&2L:OIM>KXYOR;OMH;H@WX!< M*C]C`+@\.1O1I*FC;.Y=Z:4+NO?G(1I7[_%\Q:HB/ZV7B\TUA!4P&#"7(VY- M4FSM7`22.[Y/_+C?#HK>6")I^G\>(G'U?U\][@^POM0%E>J@T\@%;`B"Z)]1 MZWXA?KO1V;+/(*!+J6.;_^OE[:W>^?)$=(QC$N]>1,>A83%[1#?B-E;*'&'I M^U?EQ55?"$;7]`",KHWM_@N$=LX!/)3+K3YK@I]:5-4H4#']A#N%:@>AK9[E M5SG&8EKT/,-G&:\2EW`$LC^7O_C<@NY\3U2?QRTX.Z]N9:C#FTV!F5HPI9(6 MKJG7NWHG:OU47RGS"HJR6-*S$53B"F*QP,B53U:Z_^WTL\BHC3WB0C_M?#(J1V!=04J)2\3/L`2DXO) M]Y^4=/">FG5#K>\,N]*:]EGD6+<<-SFL>?P?B%7:S0IE;F1S=')E86T*96YD M;V)J"C0@,"!O8FH*,3$R,#,*96YD;V)J"C$@,"!O8FH*/#P@+U1Y<&4@+U!A M9V4@+U!A9W8,YDJ$RB[&[IV%Z>F9Z9A9F=V=YM5HM:D_2G4[2[:WN=+J3LGIM MS=;L9'?W_?1^B2?B[Q[VNGN$^<\?=X?C]_ZZ+1#PE*]S.`*A2.A\3?WU&VWM MZV;\RC''4>F8ZW`XYK9UA`-G;]VZ,54[/BSK^+^-O_\#1]F'U]_=_=_._Q_' MG$YGN,/A*)LY5?L[IB;AKSNV;J@V'HV[Q5%WU M3^K]_UB?JSH[M2#L>VYLYPA]?A^-4) MAZ-\[!_F\/U8>MGIYS^9[_];_O]I/*Q_M.X?JK=_ MY7!\6>EPQ/ZEMRNR_\,GE16S'/^P/__)^&^]+RNOJ)PV?<;,6;/GS/UHWOP% M"Q_/6[3MWZ^[=?S`UMX;&IN:6UK;V MCDYG5W=/K\OM\?K\@6`H'(%@!,5P@J1H!K`<+XB2K*B:;IB6'8W%$\E4.I/- MY0O%4E__P.#0\,CHV/CCBLW;]^]__2SSW_PQ9=???W#;W[T M[8]_\M/O?O;S7_S:K__&;_[RMW[[=W[UN[_W^W_PAW_TQW_RS_[TG__9O_CS MO_C+O_KKO_F7?_L__*M__6_^Q__IW_[/_^[?_X?_Y>_^U[__C__;__Z?_H__ M_'_^7__EOV__?]_^_S]O_W\!X"\8\!T#GC(@P0""`6T,.,.`90#\9]KZ"]KX M&:4]I90X)>.4V$H+9VA^&%'C=QZGW./D($!8P[%^+ M_;\A%-_PV3R7Y+F8E[7K6.,04.;3_%^*$[_&C[SF!K),9^DP"? M4>"EBYFXS0SL9]*S:/6/8LR/;&;2I!,Z36ETCTK?ENF#(CV?8WX_JGYC*9.& ME-!$4A6Z%?Z6Q!T0V/DL\WMV_(>F_5@W8ZI.*&J7K-R4I"I>F,>ROVL5OS*R M8UK*5N*X'.V2S%I1W\?)(U@[^6T.8SPV^;S M'^@3(^J(*0\@4K%#S%P7$GLXXS.[67L6 M(_^F\>UGVA=#RCM->@Z)X^W"X#6^L)N-SV24WS!^_5/MQX/*EZKT%A*?M@MC MU_F^76QJ)J/^-$^]S%*%%"7'J7"4:K&HJP:U1Z'G"LR/\_*+C%1(BG*,#]E\ ML\E=T=D],IC+,]_F[!=I,Y_0I:@:M)0F0[JLB;LD?@X'?I3-/DNF1H.C;( M626OD7NDI2XHL>VB,1.(7V5>3R2>I:*/@37B,?KKM?QY);5-M&8`Z3F[38C-`/(7J1\_CG^5C'Y*62_<^D2].G1>+FX3$M-9 MY>T(.3A`6B42SY$]:?)^DCP;I;;I]"R)>3TB#0X(5I$GLEQWBJU+L&=LL$T' MLT3FU;`YT*^;!17/*%TIZ6Y#:;[2@D]'T4SEC-IW(UIIRUE MBRK-X+F7@WVE4E[+99!TLC,1NQ.U3YG&9D69SO$O!D:+I4$U5X)3^8YXYG8T M<<*T-RG:-$YX/O"\4)Q0WSPEET\;J0WRO8T3GHZ\'6A\)F$(PE^O$UZHT*3< M.2K>'1#/%X5]&7YUE*M40.IM7'QNAR?,]A']3K]VOJ#L34NK;*%"9I-O89KDHQ5Z_YY^^"(Y/M@R-W"KUG\WF=R=2*TRK7)+D;PCL!T3O6Z+^!7%M M@C@Q0FSO(S].4^4&(W_#8Y]SO6_9^N?@ZF-P?)C97F(^3C'E.B/_4$4_EWO> M2`^?B5?'A6-#_-8BMS3)EFE`_BJ*?FIUOS8>/-6NC"G5`_+6@K0D(92IK/15 M&ODTT?TJ]N")?674K![0M^25)7&I3.&E+TO(^USWJ_2#R>3ET=C1?FMS3E\< M5QR*('TY@KSO[WY9>#"9O3R2/-H?VYRS%L M'\E-7XBU;X4SS_BJ<6[=`+LPPSH,0'QG>W]H-'VNU;Q1SSR5]X]*:_O%!6G> MH7/$3U/>K^--G]DUK\W33_3]H^K:/F5^2G1H//[3@O?K3--GR=I7\=.3]KX1 M8TU)FY>2'9J`_V30^W6QZ=-<[]WXYU/R^=/-% M[LQ$NFHXOJYHS4]J#DW$?_S,^^58\[O!6R^*9Q_G#@ZGUA>C\Q.Z0Y/^+8;_ M/DY\B1.#!*$21(@@ZTFRFJ(6,?2_0:3?1<4?8,(@QBLX%\*Y>H*M)L$BFOE7 M<.QW$.MSU.A'-1E3`IC\$!>/$OP"BOU;J/A+./L>3A61N(C:?M2\CVN'"7D^ MR?U-9.PWH:&W4%\!S@E(VH?&[V'V(5S[B!#^*OSJUR-/WD3&\M`@#Q>]2+8. M31S$S8\(Z2]#7_Q:^-VKR(L<-,%"PQZX=!?-',"BQG^82K\GHD\=\./[R`#55AZ-JG^,8?] MA,.?L7B*Q:?PY0+$'4`>`N0"0/\A*WS+\D\!EP+3WF.S7=.HQ'8_2-DZ97;1^DU:K:&D>S?^* M'OJ*ZANC\C:5P:B$DXK64.8^2IU+";]-/?F"&ALEARRR#R5SG63J!AG;2QES M*/&WR'<_(%^,$),&,8H0_1UD_CJ9VD/:LRCIM\AO?D!^/DR\T8FG,#':3@Q< M)W-[R-@L2OXE^8O/R6^'B!^H^&L(?]).C%PG2KO)Y$Q*^;F.OE.Q`06;.EJ0 MA+>+^'6!V,>3\UCZ.Y5[HW#],JM*`!)!FP!N\&`_!^:QX#M%?RVK?9*BB%)8 M$%MYX1K'[V6YCP#[$SGU4HH7A*C(FT'>:.&T*ZRR&XAS&.Y;J>^%6,@+&8%/ M!KA8$VM?9HV=0)E%\S\2QY\+PSF^G^<*?C;3R"8N@>@.1I])B]^(+Y\)3[+< M.,<.^=A2`\A>!(GMC#F#EGXH_N`I_S;#O6#9QUXPU`!*%YG,=B8Z@Y9_*/SX M"?]5FGO/@.<>,-X`!B\PA6U,?#JMO$\BHW$T'D4I"W4;6+V&7U"('1(YAZ?> M)JLQYF=DA,G,XYFU<&;;EJ"F1AMBK"0\4_IS$;1?862QX M$XT-6K9EF+BF]ZC:?5DY*\E;>6$F8%]'\P-FQM23F!;O5NQ[DGE&U+;P\G3` MO[2'^LU^0R^@:K9+3M5)L=."M9G3I@/AA?VDSQC7M6%$Z7?*^;MB^I00W\09 MTQCQA?6NSWBA:9.P,MHI]=\1\R?YU";.KF2D%]97)>-337L%R9,=TL@=L>\D MG]W$QBJ!/-8'I_.(D$&"*;0UCMZTL>,FODDE9XC4:)%)Y1@A30>3=&N,KK7H M8P:]2:%G"LQH04IE13XE!!)\[[$+#6;FFIX\K$37BGHE*PQD7T933^CXF-L> M?&04KVG9PTIBK6A6L.)`]M-HZC4=?^JRQ^J-@:M:X;"<7BO8Y:R4&8/4(1CM M0[H+R(,L>CF)'8CA:PUBND1E1FEED$;[J.X\=3]#74I0!Z+46H.>)M&9$5$9 M$)`2WY7C[J6YBW&VRF;7Z*!2!.EA4^[7X8+FS"IU2?E"3-IOB:LUOD)@4T-) MJ2\.Y:.=&:LN:5R(:?M,994JEO-<_3D2MDLYR7M!41.PMXQN'$(J>E#3^70 MG2E\A4U4*K3VG"(G*>\HU3A(UI2HDSEJ9Y):85/E"JT^$\@)WC/"-0ZP-XKL MB0R[(P&66Z!,9J;X3XQK[B'E49]\/2^=2(O;X\(RDRN76.5)'!^+NH:L1WW& M]9QV/*UNB\D?&V*9R,F3.7PL[1I*/"K%KN7LXREC6TS[V)#+1%Z>',!&B[V# MN?I2^EHV<2P9W18UE^JJ0Q"DB7%L=+AWL/]AL7`UFSF63&RU[:6:[IBZ')]X MCHY.]`R,/"CV7\T4CB4RV^SX4LTH$T3B<\CW%FI]`=^:1,Z-(@?[T0UY;%&" M*--IXG/*_X9L?4[>GB#/C9`'^LD-.7)1G')H-/$I[WO-M3YC;ST&9X?`@1)8 MGP6+8HQ#98CWJN^ETO)$NCDFGAT4JXK"N@R_,,HY%("_BWI?6LU/C)NCVMD! MM:H@KTM+"Z*"0^;PMVGOBT3S9.SFJ'VFWZ@J:&M3R@);WSQ1K!W.GNE+5N5BZY+F`DO]$+V9]#P? M;9H8J!TNG.G+5.62ZQ+1!:;ND$7?MU#'E]"]3^%+K^#J)\BN471E'S8W33A, MVO\MV?$E>>\]%^(?*^;]*M'\:JWMM7WIB'AW5=PRHRW/RG+CX?91K_S1=]RIY M:3)V=,3:T6\LSZES8K)#Y?U?#K2_+]:]S%V:3!T=B>_LLU=DC;DQQ:$*OB_' M.MX/UKTL79K(5@\G=_7%5F:LN5'-H8I_%H%^#L.O$#B'(AR*>C"L#L\$U_[1AX'!F+!(A'.=D62-^'H/E2?38B_ZWGSE>_YN'\B&AS! M0WW.<*X62NU%K5F$]"O/5U_Y/AWSO[("3[#@B#/<7P/E]B*Q683\*\_/OO1^ M,^K[W/"_0H*3SO!P#53:@R1G$LJO4^'/Z,@P#9DTC-)()XW6TMA^AI@'J%\0 MU'N2'B)IDZ11DG92]$V*/D`S"P#SS7Z' MQMY@=A]F*K@>P;4V0KE.RGM)<2[-_13)OT*S130E8?$0%FW!S:N$OIM09E/\ MC^'AE\A``2F):"Z(IIJQ^!7$<4Y(LCQ@.2_@&@!W";"[`#L;@$]9:Q28<:!30'4S2CTC M7V"D'8PPB^'>@\P(DXHQ"9*)]M+60]HX1ZO;:'D&S;]E^H?I4I3.$W2ZAT[< MIZ)G:7,KK520I#?)B M7T#(M_#I6BY1S=KK@5;)B,/RLZ0TP8FC/GZ@F2O4L)EJ-K$.F!4?HG<)Z14K M//7RHTW<0`U;.,JFUP&[@I'RV8"9"E'QL#L6>61!UPWDB(:N5_`9(IE/8T82 M)^.X*XK7F\15G3BBDNMD:KI`YY)`3P`B!GIM\-``5S1P2&'62DPESV03JA93 M,%ON-J4'NGA%%0[*_!J1*^?83#RJ1FW4,KL,XX&F75;4`[+\B2!6<%PZEE7L M-&HFN_38?=6^I!A5DO:)(%>P?#HV(-LEQ,P[]K6"%5/2Q M;(W"QF"G5JI3LA?EU'XQMHK7RUDQ%7TI64\A8[Q#&[RKE"Y(V?UB8A5O3E'$ M'`B`8C"8"[5F(K>2T+D8O-="5^OX=(DT^U&FB`5R6&L:OY7`ST:)/1:Q2B,K M)=HH,4R>"629EA1S,\ZE-YFH?8BR3XCTN#LQ_"C:=]W,G]33.Y38QZ)1SHG,A#\R$G0.AN[UA2_G(T?3 M\)8$\K&%5R@4\Q@-CZ#.`?1>";NR M])$DO3E&+S7H*8HPHV)H0.PL"75Y_F*:/Y+@-MG<8ITMDP`]8H0&](ZB>C>G M7$S)A^/2)EME'2H=?,$[)_D'8]R5(?9XB=V=8UO@Z6?AJO'(YD%H21&9E<(=)M7U M!=SP'JE]A9QY@AP80S_(FI?$F4FR:H3E.-\E'KV*W7AJGQXS MJP;TS05U<5J>84\IA7>^RSUZF;GQ)'EJ-%;5;VW.&XM3VBQ;=BA34?^C%\6: MR>RID>3^_MCFO+4DJ<^R/G26?LOO^R(8&`T%[4@8AR).&+J)(E4$-IYE]\M"[Q/!/1KT]C?["U="Z5V0/0.7?]SY];/84$!#P7P<#,!7261/10V!Y!?PN@3!,NB M&(_B?@QOPO"K!+&7I#YBZ"\B8`(":1AP"/"AH!%EKN!@-P'FT.#SD#8>5I,1 MA8$D#RPU(.(E3-B)\[,H]M-@8C04CX>C=,1T0WH]K%U$E1VX-)/DWP6*(\%\ M+)2APDE7)/80LLXCQG9,F4D*;_UCPX&A:+"?#!5ZPYD'D<0Y.+H-TV>0XEO? MR^'`4SLXC@<'>T+%!Y'L.3BY#;6FD]);W^=#@;=6X#D6'.\.#=X/E\Y"F:UH M=!HI/P>>?L9G,@&<"78SX0<,=(Y!M@%L%DL\H^`2C1@TBM%8%XW=I_'S-+&= M(6<#^BE)%TE&)QF4HKM(^A[%G*.8[30S@V$F<3F/RRHA083820AUA'":Y+=0 MW'2:G<"BN:FS%V:&<;T=U^[@RBE"WD2*TVAN',UFT8R$I<)8O!VS;^/F25S; M2,K3*'X,&=8T6(,$N@NHCX!RC9$/ M`VDM(U0P;(Y-Z2!!@'@OL.L9\RJM'V;4-8Q4P?!94-)``6=R/4SJ(1V_0MN' M:',-K58P0H8959EAC!GHH@L/J,P5*GF0BGY"Z^6TF&:>J(Z'3!<*V(YP%A0VX0T?NJL@% M!:V2\$]$8II`61;!&41()]LU\HY"GI>H?2*U6J#+>=HT>*#Q095K5;C;$G=. MY/8*[$H>E''`T#5&U0**VB++MT7IK"#MX845'%_.LKH68]2H7[:;)?.6J)_E MU=V\LH(3RUE.5W.TDO')J28I?E.(GN'-W9R^@I7+`:^I@Y32[Y.*C6*VED^> MYF*[6&LYJY4#054>D_*85QIJ%$HU?.XTE]K%QI8#O0R(?,Z%I#V]25]](G`] M&CQAAG?H\'(5G2817#:,I",]":@^!E^SD>,&NEW'EBEXY=0Q3.-P$N^)XP^C MQ%63.*Z3VU1RF4R5"32;9*$XVQ5E[UO@J@&.:6"K`I9*P,$#D%`B,=EIR_=, MZ8HN'E.%+3*_1.05]%$YL5FT%_/:5`0/N=Q]GJ:BKS;G/Y,.'HB'UT>A109:H1#P8,C= M%VXJ1&JST-D47!5#UMOH(ATOETFH'W,5L:8<5IO!SR3PJBBQSB07:E291$=* M3&\>-&:8&RGF=)RILL%:`\Q7&8?(1(I2;TYL2(LWDL+I&+_?XM?JW'R%=8@@ M7#!ZLOJCM'8CH9Z*ROM-::TFSI=YA\"&"HGN;.Q1*GH];IVR]7V&NE93YLNB M0^!"^7QW-EN?2E^+Q4_:]C[#7*/J\R79(?"A_$!WIJ\^5;@62Y^T$OOTZ!K% MG"^I98+@>M+;_-A]:]1[;M!_J!3%D2G6WC#HWLF42:QM!;0^BY/O10'MN:QC^.$[,M-TXPA]FM2?KC&#W38!P*TSW&-P[QM?WHVCBD MU/;)9_/2P8RX-2%\;`LS=7Y**5VC=L.@5=MGGLGK!]/JUKC\L27-T@2'Q'6- MI!L'D[6E^)F&/E-5 MIBC2\J;W[DOWQ:>>HX_].X<#:_I"\W)090)UF&3CV^"=EZ%+3T+58^%=@Y$U M)7A>%JF,8PZ#;'P-WWF.7)I$JD>170/HF@(V+XU/CY$.G6I\2=Y^2EYX3!X9 M)G?VD6MRU+P476G3#HUI?,'>?L)>&&>/#(&=);`F"^8E0:4-'"IH>"[?GI0N MC(E'!H6=17Y-EI^7X"JG8*:P#<^,VQ/ZQ5'MR("ZLR"OR4CSXF+E%,P4KN%I M_,[CV,41^TB_L;.@K4VK\V)RI2%.4:3A:>;.>/K2*B`CVH*4%?"]"Z$GD707W3($UU2ND?@78+?RS?Z MN2LA;B?,SL3!YVW1\4XKV6VRO;K7K3;XE$M!:0D_\@M_>%M&F8\+[YFB M[`P23+K,@L=0?3KD5SN#RMVP=`82MZ#"=(*;Z$WGW$G%&X=\T8Z`>2>DGXJH MFQ%I.L$_[NG/NHJR)Q_VIMO]B=O!Z,FPN1E6IQ'"X^['V=Y1R3T8\I3:?-G; M@=3)<&P3;$S#Q?'N5YG>9Z+K<=`SU.HMW0KD3H22FV!K&B$-X5TIW"40GA#A M;27]M\C022JRF49F`GP(#2:P$(]%@CC4@L,W">0DB6ZF\)D,.0BC<03G4#R` MXBT8<1,C3Q#D)I*:3M/]$38*<0#B?##;C+"U*'L<8S<0H)("I9!FAS4ZHGH@ MN1&6;B!B-2JLQ_E*BBT&XU8H1H6C[HC9`.G78?4HJJS#Q4J2*P0*9C!'A3*N M4+X^G+X621R&[3685D&*>?]3(S!! M!$=[@OWUH?RU2.8P'%^#F5-1DNM2V%Z,=?>RWH>L_RH('F$C:UED.HLG@%\" M002$NT'D`8"N`/@P0-(5XBA0,DOYKBRFG6QFT.M\*XV8[K M=W'U`J'L)^55E%!.-_81VDI2+J=Y$^T':"F(%5JP M]&TL<0Z+[<7-E:1:3@D&,@[0D0`ZV(P6;J'9KEE"CI3D+M\2KN M)L5;*_M/B\'=8GBE`%?PN*CZ<"7@D4.-4KA&C)P2X-T"LH+'*GE2E"%,1MP2 MTB"B-P3L%(_OY(D5'%G.48)(H0+=R]./>+J&HT^QS$Z669Y!4F=HRVMM+Z4D8I8W@&#$7`@!.4 M[C'9*W3J&!W?2EM+::V,$?"$TQ_K:;-==RS/!<-W6`ML5L.+9;A2"BAZ6L8T2OE@DRG@*,4F/ M0;9HU"V5.B]3AR1Z@T@O$F@'Q\`&Y]'X9I6[J7#G).Z0R&X0V(4\<'``UE6W MIC8I2JTLGY.D@X*XGA<6)BE#AFDKMT:J5* MS95IAT"[DJ`USMZ-@HLVJ#;`+@VL5,#<*9@)P)646^/2W:ATT1*K=6&GRJ^4 M^;G?PZPW8;;$C#NV?L'4CFK*3D5>*8ES1<'!<[WQ9$LT<<>*73"LHZJQ4]96 MB,I<07+P?&\\WQ+-W;;2Y_7X$36Z4S97B/I<7G9P?-M(Y_VA[JO]O<>+[KTY M[X948%$\/,."'1K1,N*Y/^B[VN<_40CLS80V)".+HO`,$W6H1,M0Z%Y_^&HQ M`.A6H>0.M*V.4\=BR#[TD2&Z+$0HNGJQ]@UE32 M[N;5RQFE.BGOB4GK+7&A+DQ7/K2/&HO1NSG[W.?=WG>/SL= M*H_!#H.H>^:^-N$]->:K&@QL+@57Y,*S4U!%%'7H1-V3X+7'H5,CX:J!R.8" MM"(#STZ@E1]@1MU]#%\=14X.H?OZT,TY;$4*GQTCRDUJ"F9WQ\FK(^2)`7)? MD=J'I)/] MTKZ\N#DMK$CPLRV^7/_0/KHS8EP=-$[VZ?MRZJ:4O"(NS3;%KIBKA[:ZW;[O/5!_\5P:`<"S2#Q MM^V^86<@UA.D76&W)U+O@RZ&D!T0-I,@7KB8J3#U[D&Y[(S>/A MUL'VSN*=[NPI=V)CT*I$I3%?>\;OE(,]D9"K/>*]#?E/(:%M.#R3PD?=WK37 M+_H#X4"H/12^'89.P<@6%)M)D2.]4,H-"UXDY$-;`]BM$'XR0FQ&R.D$-=C% M)'H9SL7X/4R+C[D98$Z$F4TP,PUG!CKE6+<,>B6?6VSV"K5^X7B(WPASTW"V MKST:==I,M^EU&4T>K<:G5`?E#9`X#>-*;3F[,T-WI3P]\4:W?<-K'@UH&R)R M)<:76H>LCG[*671W9QMN>V-&`M3ZB56!BL772ZABGG,.N[M*CWMQU3_J( M/[X^;%1@4@9JTV$GB?2X4-+>(C(+\+#M8CX:MH MY`@&KR?0Z321"835$(2'X9X(\A!"K\+8811?AQ.5%)7RD;*?0@-T=XAZ$*:O M0O1AA%Z+T14DD_"(DD^$_8(SP-\/\9?#_$&86X.R%02(NTS18T`^W>G7[@65 M2R'Y`"1^@@@5!!OK30GN9,03[_!%ZP+FQ:!>%5%7(U(%P4=[^GA7,>S)M7M3 M=_WQB\%H5=A<#:L5N!#M'N5=PV%W?YNG<->7N1!([@]'5\%Z.2YJ5!M#.8-4 M=ROMNDU[SM&^?4QH%8"F`4S%W33A#1#^5C)PFPR=(R/[*'@UC4X#A(J&*"SB M_UYEMW#D'('N([%5%%'.4`J,DPCA10/23\'J3E1>AHOE)"<$\V@HVQM.UX<3UR/1D["Y$]&787(YR?.!0234 MWQLJ/@QGKT>2)Z'83L1:AJGEI$");6&ATRETWQ-Z+_.>:MZWE0\NY:`R#B-Y M5XCW='*^>YS_,A>L9L-;66@IBU2P!,D&@VRH@XW4`>@R@*L!LA5@'P.\#)`$ M@P88O)W&ZVAB2F75-+F5H98RE`/0.`7\%&BC0!WU0675%-A*@Z4T<#``(^6I M7T/0\;A["]8V$NHB4'#0/8T4/7FC&L[58TIU[Y-]:Z3@/!$J$["@WMNMN1^IWAN*_Y0%UXC0`@$I MYXF`ZN]2@O5R^+H4.25"^P1DC8`NX/$RCO1+B%-"'XK8-0$_Q1/[.6(-1\[C M*`=+^T2Z\\,C[LQ5GCG),?M89@W+S/L>9CY!Z.2%!YQPA>-/L/Q>P*T&W+SO M8>;E]0Y.O\]^>)CJ!)#W`&DU$#\"?!E@/5R\G8O=8Z.7@'FJM3'1<3/>=3;:>\AR;S5\'VO! M60KDD'!GHJ,P#8M]+$:F2TC92+>&?,U1`.U5NBL&3ZD1[:I M\%(%G2-A#H'LL*%Z$ZDQT-,Z>E#%MLGX4HF8*9(.GFXWB7J#O*%3IU7JH$)M ME>BE(CUK"F8\TVYP]3IW0^-.*^P!F=TJLDL%=M;W,&O7E8>:'X6QTW!K$VS'JK6=<4\*>E5HKJ%5Y9PTBQ.<'!2KB1$,_$A`,6O\W@5VO<1S)7*;(.@:U+ M:M?CVNFH6F4JVW1IM2I^)`F5(N\0N+J$?3UNGXY:5::^5=-6*\I'DEPIB%-F MNS'>*+,AAXY?'^LZ/]QS=,"UJ^19F_,M205F MQ,)EW\/L^K#[_*#W2)]_9R&X-A-:DHC,B,+E!N90R>N#P7-]XD9!EWV`6;@6HD]6^`.Y[CM279-C%UBL3-TMNS[CMG5HGPV+Q_.RML3 MXIJHL,049FA\FQJ43^;-PYG].T)96U47F)*,U2Q3!:F8#;9VI3O;%.Z M.N'>[DZWZZ[77*M;Z?#"7?[.GL!==^B,/[(EC$S'\/%' MH4QS6&J+1#JA]F[XM@LYY<4VA?!I*#GR@$@UD'PS&6PC6SO)6SW4"0^U,4A7 M(O10G9"H%[A&WM_"MW1P-[NYXVYV0X"M0,#`'2/VP``-NJ]9;6Y7:IW2,9>X M/L!7P&S_[53T?A+4Q[U-T:96JZ93/]:KKO=+Y3#?=[,_>J_$/,Q[&M--+8F: MSFAUC[G.IY;#0M_-Q]&Z4>;AH*>AV-B2K>E(5O?$UOF,J^'/-61P$8D,IW$\LYNH\=%N3P>CZ_!%[@>"!T-1S;`R#0"S[4'=&>( MZ`F[7)%''NB:#SD21-=#>`5.IELPM0/'G$1/-_'015[UDH<#U+H(58'1J296 M;N70#J[+R3[H8:^XV4-^L#8,*E&0:-"D%A5I4[LZE?O=TF67>-`GK`GQ%2@; MKT^(33&X->KLL.YW&9=ZM0->94U(+$?X^,.BV)B#6C(=[AW@NP MIPKUK\;#E11F>KI87V\XX&X/>N^&_>" MT/DPO`]"5Z%8.4%JW0C=B_G=6(L7O^4GS@6)?1%R)4*5X;3J9*ANX.L%S6YP MRPO.!L">,%@!@S*,43IDLDOV]LA-+NFF1SSC%W:'^!405XZQA.G/='=?G-Y1"U'!8`VPFAK+]I1CW==PWM/$)X=I'\9%:Y@4!#I M@J">'MC]$/5>0_TGL.`.(KR,A"MHG`EYH;"_.Q)\`(6NPI'C"+0=0SXFL#** MH/U0.(@X0^C],'HE@A^'B6THL10G'21%>:F0G^X,T/>"])4P?0QBMB',4HQQ M$`SI%H)>H<,GU`7XRR&^.LQM@;DE*.L@`.$R`AZ]W:O=]:N7`O+1D+0%$I<@ M?!G!XKU)OSO1YHG=\5D7_<;1H+8EHBQ!I#*NS9VY[4U<]$>/!JTM M87T)K)3C?`0TNIC69J:C%G2=!;T'@'L]\"\"X3*`ADFGB^IIHERUM.@6%\PVAFV'X2MJQ'C M)*3M@Y4UJ#P?%QTDYPUF.D+I^^'DE7#T1,3:!QEK$'4^)CNF@"4WMDJM=\6. MBU+74;%WA^!>+OCG\&''U'X2.EN$[KM"[T7>0"*[C0'`XJY_`>UMW, M>>]P_@MLX"@;V@DBRUGX(Q8M8XDN)M3$1&XQT'D&/L*@.QEL.8//`80#4%T4 MUDCAMZ@/=S"/TN1.FEQ.4W.F8,;03I)I),%-$IPCP1$2[*#`RZKON!S8*X4VB.&%(C13 M0!T\\4@.W)%#EZ1(M0CM$>`-_)3*L.D"H1R)R6T0O"MA1`=_#XQLX8B%' M3F<_P.R10-T6J(L\?92C=W/T>I9>R#(SOH?9(XZ_S?$7.?XHR^UFN?6`70#8 M&5,P8T$]J]YBU0NL<@3(NX"TCA$7,,)TYD/'[`%KW62M\\`\#/1=C+J.5N;3 MTG1&<##6>;?C*U;!#QFZFVR\GG2<2W?MBKDV6 M9[GAGZV%*KZ'VHV2)=\3W,:@QP00?5&MBE@`TR6":"V0*H^!YF-W3Q@B8=5<5=LK!> MXI<)_&R>*_\>9MG>AKWE]LVYSK M7)'NGA]W5=H^AQ%VJ-CYOK83Q<[]^:[-F=Z52<_\F&^:%73H'V!VH=AU/-^[ M+^O>G/*NB`?FVZ%*(U*F(0Z9.)_S',OX]J8"&Q.A%='(`A.:IJ-3JS@D\EPF M="P=WI.,;(S!*RQDOH%5JO@4V!PB?2Z%'$NB>Q+8QBB^W"3FZT2E0CDDVB$P MYY)4=8+:$Z/9L7*J.RWNB\@937*X)"Q2A4OJ@LJFHO^&AW=S(M+7X.CN:NKMJ7;W'?=[U MX5`YAI;N=UB/NNCF'F^;NZG36]/M/^8);0A"%0A6N.LQ'_K(!K^[)=C0'KK> M%:EVP>L":#E,Y&[!6AV,/T1Z&M'Z5NQ:)WZDEUCK(\LA*E-#JW=H]#[=_8A^ MV$Q?;6<.=S-KO$Q9A$E>D^6;$E(G=3T4'S0*5]KX0UW<)UZV+`(25VRIUH+O MF%WW]0<-ZN56Y6"7](E'*(MP\4LY\48:OIWLNA>[_\B^W&(>+T&W\LZZS/WZY)7FV*%.ZQ.W5A818^T/!6=CI+NET]5QS]-UR==[,.A= M`X4J<-1N;N?:G>'.GLYN5YW+<]'C/Q`(KHE`Y1AF-;C8%D^HW=?N#-SM#IUW MA??[X$]":#E*Z`_"3",4:(%;VI';3O1<+[;/BZ\.$N4(I=TCJ7K*UT@UMU*W M.JASW?1>-[TJ0)?#C')'(!\(WD=\WK5E3ZI#.*EVA)^ M-^]^D&EXE*QMB9WIL/?T&"M\:ADD"+T/,7>CV]O2X.^X$>PZ%>[=!7F7H:%R M`N6=;6A/I\O5W>!QW?!Y3@9].\/!Y7"D',>X]E[$Z>[M\=:[_-<]P1/^\(X0 MM`Q"RC`"M(2@]DB7$WK0#5]U(<>]Z/8`_G&$<*`4TXB'6PEG.W'?25[M(8^[ MJ6U^:FF8=B`T_8@--7.=K>R]3O9*-WO,!;;ZP)(0<""`>J@&&]6.%N5>NWS9 M*57WBEN]PM(07X:PY(-XL"':T6S?;3,N=^K5/>I6C[PD*);!''$O%ZC/M#>E M[K3&+G7:U=WF5H^^)""7P3P6?.@+-;:&6VY#'1?@KL-([R;,NY@(E5,(XFWS M^#M;`EVW0[WG(YY#D&\3$ER,1\I)#';U>#RN9I_G5L!_/A@\%`YMA*%%*.(@ M<*@[X.H--;K#M5[HK!\^&$(W1+"%".[`R7`GVM.--?1B-6[\K(\X$"#7A\D% M,.7`Z%`[T^UD'G4S-2[FC(>I\C/K0F`!Q#@P)M@J=75(C[K$&SWB&;=0Y>/7 M!?GY$.=`0:#%ZFHWZSN-Z]W::9?R7]EYZ^\HKR_L^]R3B1`E1MS=B`L0`9(` M$0@0)1[B[C,9S63B(01W*6ZE.*5`@5+:T@(5**4M5EJ*$Y],QOMQ4K8R4K.Y6=MY!3.)M;XLTMM^)5Z_$;J%9F97-^`:,P ME5FRL*5\-JO2FUUCQ:G3XS51_):*AM+\IO*4YLH%C)K9S#KOE@9+=I,>ATEX M[/+:FKSZ^N4-#3%-C6'-S5X,IF5+BRZ;3;C3HL+B$PRNIY.94\Y;6\&+J>&$-?*\FO@6#K],R9C6T6S6TZ,&9L07%I7U9%7U)5[_SJ[I#:+L_Z3HNF#AUF.V&W%96LS2I? MNZ1RS=RJ_N":/H_Z'O/&;AU&)V$)"P09Z8*L!$%>9-M*?T&)LZ#7GIO,($7G$DORR`7^G,KS9NK=,2-,&8Y;%+TCAE\9S*"&ZU/[?6F5=O MS&^:QF>05G8.HSJEI7912WTXJ\&/W>3,81AS6[1X+,+G9CH@'&%J=_KB[JQY7;G!72O=NXJM.LMU M.ZK5.AJ(L"6E(R^Q8^6\CN+@CE*/]@KK]FK=]CJZL`G&+*6M.$%8.E=8$22L MV#,5NXJC!J54E0 M7YE[;Z5-=[515YUF9Z-:!X.TLQ?TE$?V5`5TU[AVU5EW-AAU-&FV,VCM+"+D MQG;51G35^W!3@E8B:(T1",+;VOS:VIP%`DN!P%`@ MT&@54`(!$0BB6SOG"+K\!)W.@@[+UG;#UG8-?CO5.F53([:FA6S.]-Z48[^A MP&1MD?9`&:V_BO0UD.Z6\,TY09OR/3<4VJTK,5E3KMU?I=972_4TDBY6^(:5 M0>N+/=:5VJRI,%Y=K=U7J];;0'4S2"<[?&U9X)H*]X$JJ_X:H[YZ[9Y&M:GW MI[X6FS-0';BZUJV_WJJOT7#J:S2&6F<+Z>"0=M[L_H:`_B:W5_FN/7RK+KYA M)U^[HU5-..7*X$7#NH5^/>TN/4++KC;#CC;M]C8U(3SJU*\MZ2D]61DMN=EE M!?D9147Q9:5A596V]76$R=RX+*\K;25S17%I3EEZ0<6BXJJ0\CK;VD:*T;)A M26EGE5Q5DU:7MV"POJ@LB:;:B;5Q%X7W]">U-"8W+@RO3DEFQ%;P`PL M85E7L4DC=\U"=ELBIWX9IR"5DYS)CVDH:TW:B-O MP?K:A+4%2P>6I_7'9/7YK^RQ+.\B#>T]$3MY,5MKXS<5)&U8GKHN-G,@H*#? MLKR'-'3TYJ9P"S)JBK+S2O.7EA?-KRKUJZVT;*RC6IC=*W(Y.075^46YA:5) M)15SRZM\J^NLZALI9DM76@D[L[PRIS*[H'IQ46U4:;U/59-E'8-BL-N7US+3 MZLLS&S)SFA(+FB-+F-X5+1:U;-+,;4MJ8:2PRM)9*[+8"7F+2!-K:UQ/4U)W27)71D97?'9G>$% M'1ZE[6950M+8QE^TKG'QFN+EJ]/35L5G]87G]WB6=)M5=9)&(7_!UH;$S<5+ M-Z2EKHW+'(C(Z_9R4E=R%Q=PY9;R9E3P8 M4=T/QJQ\A3`O1YB<+UQ0))Q3VN93T695VZ;;.&7,RM-[\[)ZD_-Z8E=VSR[I M]"GOM*KNT&MH)XRV\K2U>9EKEN<.Q!2LFE7.\)A%M=E9]?E)#87SFTJ"&>7NS,H9K%H=3B/A MMA15%6;6E"RI*YO74!G46.W67#>#V:#-:B8<5F%Y949E=6)U;51M?6!]HVMC MDRF#,:VEA;`Y!24-Z>6-"95-D=6,@%JF:T.+23-;B\DA+%Y>84M:"2N^G!U9 MR0FHX;C4<4V:>)H?C%EN06MJD2"N5!!1(0BH:G6I;35N%&@Q!#!FN?E=J85= M<26=X64=_I7MSC7M)O7M6A^,66YN?^K*_D7%J^:4]OI5=#M7=YG4=6HW=9"6 MMBQ.RG).Q@)N]BQ>O@^OR(Y?JM]:26^M(ZW,3&;VLI:\6-;*6>P2'TZ9';?2 M@%>KSF\@_)8532N7-A?',,K"F!7>+=5V[%H#3H,&MYGP6.EUY4L:JJ(;:T*: MZ[P8#78M308L!IW30KBA1._RHQ?.ZVU@=[:3%I9B2UE,:R*6>PJ M'TZM(Z?>C-LXC==,X[40/B>!41/-K`MKJ?=F-3JPFV=P&%K<%AJ737CR;7M&7J?]Q3'XQ9 M?)U@?D-;2*/`LTE@QQ"8,@5:+`'M@S&+J^F<5]<5W-#IT=AAU]QNRFC7;&FG M6$+":8M>E1S>E^'?F^7:DV?14ZC?74+OJB2==:2=.:\G`MJ[04-,P2-^JW-ZJU,JI4-8Q;% MJP_E-WKQF^SYC!E\IAZ_A6X_'H7_X\I"T MMD:Q>"%LOB>';\?AFW+Y>EP^G=M*/ABS<*8PB"7T8`MMV6VFG#8]3AN=TP8C M2GB"L/7)`>O2/=9DV@[D&O:OU%A50O564CWUI*LE9.T*WS4Y+@/YEOV%!GVE MFKT5M)X:JFO*F(6LSO7M7^F\JLB\KTR_IU*CNYK654]U-I-V5FA?\4L>> M*MVN6LW.>EI'$S:0"#DAW14^W54.736F776Z'0T:[4VTJ?=9I(T;W%'K MW5GOT-E@VMZDV]ZL(632IMZ?^I(P4-CDU:"EMTA2R--C9-P,7[1,`/ M%+"]VCCV0HYI&U=7P-40\&@"/K8"[BN`W^HI$-BU"4P$K;J"5K@R6NO4EX=3 MO_[W3]S];_W_?U[___TW0=7HAO_[-T'_=V#^M_[_C_5/A+N4B`(]:\=\`QAC MOG.98WY)+6-^^:Q1_P;V:$`W9S3@(^YHP&>\T;Q+'.16(YKE7CH7Z,D8#9_%&@N+X(T%9K2/!-6TC(5W"X=`] M[<.A5SN&PQYUO@\;[GP<,M)V![FN!(QR3OF/L0[ZC3'%:0XY$TFNI>,+?!I' MPH/YP[/F=PS/2NT:FEW>,S2GO6\P?-^JP8@;J]]'/E_](G)PU;U90]U?A`UW MG`X9$1X('6G;&CS2.EELES&1ZUPH2O>L&4WTYPS-"^\=C$Q<\WYNX=IW\_GK MWT7OW_@V]M;F5[%O-C^,?K?NQMSW:TY%#*[>.V>H;Q/R]:$V29-ULKC&(4=4 MYE8^EC>3,9PRJ^M=_((-;^*RMKV.9^]\E7C@HY=+[N[Y8\FKO;?BWFP[$_MV MRY[Y[S:LCWJ_IA.Y.,@EZ;1:(FZUSYA@NQ2--WG5CU2&"-_ES=_P,FWYWK]3 MFXX\SSCX\9^9OQZ[E_[\Z+FE+_?O27B]:V#AFVVM,>\V-8BU_MJ8Q[LV/E@K=;,Z/?;90=-9TO.62Y>/*P_8J)_2XE8WMG,H9V MS>E[M7GQ1X^[2B__.GGYPX\[5MS MYZ1XY1MFOBL MT\KQS[SJ1JX&"][]/'_=]W]D'EOU8\=W==__?*W@_-.S&1\]/Y:T^N6^>-[K MG;&-;[?,JWR_/JKD_<#46J1'D>-CNU3Q:<<\T16W\O&G7G6_#H5V['JQ_&## M(^;%O#]NG4FY__Q@_#>O=\[_[-V&R*.#`W.V#W6'K1GN"!4,=\@.FVMKQ-V9?]9?C+Y[T\.Q;]XOB/FE[<;(F\/ MK@K]\88\D^,9LNN(NX;S9$.&X<_DU@D7IEP*1H8"194 MO(W=O/1EP?ZX-]MWS'M[=_V%T6UBJ]U MW16/=5RE(EWWO^730[Z26";NFG`I@=BXF>_GKEGP-FOKW/=]Z^8,7>D+'G[; M%O#'*-?W_AC3^X?Q!H_O1#5NWX@JE']JF,JD&B9_*[0=OY,;AAR16"WI01W5 M8S,924-S>J+>IZV9/<3K"1DY*O0?O<_Q&AJO]WH\7N]Q'^-_%%6XW)XHD2DH MM;]5].G?*[2=3LN,9F^06"6QQ$X%^>/>]0N&0]MF#2_M#AYI:O,?W<[Q&;_6 MY"%Z5^/Z;J+,Y?%$B7QLI<-;<8[]$W&VW:^3F>(P MIWR1KUO%N*=OW;A79/VX]^*&<9^=]E35'O24U0S&6N?-<6R\4"ONK&9(8PQOX5@608X5L4> M]>_\EV.!G_-&`A_Q!P-'>4_\1]EW?,>85V:"83[CC0>0;S+9-EV<`);-=Z\: M"_%GC01%\4>"EPE&@DO;AD.$8-@>,.Q&YU#8\ZY7H<,=]X)'!->0ZU3`*/N` MWUC+%N23%%@O$V21B5MO0[+B>H?""WL%P7O]@Y+Z!]U'? MK7DS]]V:AQ&#JV[,&>H]%3;0/O8E9L>!O;LOG-P@-;WRSZ><>SN-?;;\6\W7!Z[OMU'X$]:\&>#G", M!8Y)VV?$2GA62\5,AVQ1O5O%:*D_>W!%Y.K72Y-VODQJV`?)''R>^ONAN\M? M'#@'_NP&,_JCWVW@SGV_M@&Y*L*'5LDVF41)UUG$3?9#^SW.A6,"GZ8AYNR> MUY7QNY[E%)]Z6G#@W&^%#\]>R/WS^';PIPO\:5KT9GMY[-O->6!B!G+)CQB& MR@Z!0_LMEXCWVF>)=KM7C6P+%KQ=OW#+'ZTKS_["V'?C2L.OU[>6/;[05O#7 M\;Y">F!\M.&D=*3YK'39ZU39LX[U(\]IDO M\_WG40-_75UQY.M/CUSO7/7C][7\WZ\4-3P[F5;Z]]&DO)?[XK+>;)_BS[QD MU'$<.4Y\R+%H\HQ-RL1GS@7CU[&WCP)YMU_';6O]M?5*Q???;)LETO M#L3WOMX5RWZ[>5[]^W61Y8.KYQ0-] MOM@8]/>#46#$7T+WV1OBWZW=6/X^[NK@O\>:0N\/\J=>7N,X?7U>+W[ M-5&5VV<3YV1@ZD#T-&/A?ZC;QC^3S#W/?'Z]R_%U6Y?CM1ZOSU1)'J.4672"FU9RJZ_C<*'>=# M,I.H[DG;M'*1>T7<2!`O;#BI(WB$+?`?/-'\4J' MV^+DG%+H>:V2F\YC8CYP)UY)Y8WZ,P-$$GM]8/<9O;O00 M7:UVF7A;XC`HSG5X"GX\F,RRO3>9_G""D%M*2NV\4F/&5H7^S%:IZ;S*2>ME MR1/.!;,`D9EC"YN]Q\L:W$5]5:X3)TJ=Q/<*["?&LVS?3F;8/)E,M?Y5DCP9 M:)\YX>52..'F4R9R"Z\0N2=6BMQS*D4>=54BC\YJD<=.Q* M>(BJ?W,757[K)JJXY#91?L)MHFQRODVJ.`QWTTSW"I%G8.VX5TS=N'%8) MGK6#9[O`LTO@V:/F$>_QQJ=@SATP[`KX=1+Y#B`D2RV3)A>BEG"7XG%_[X8Q MWSF,*4\VZE\,E@G`L=W@V'7><.!SWBMXL7O@SK7_&+8?^;9XC==+\Z"3=)L4 M\1+'?%&T1_5H:!![)'BA8#@D#UZ,`X;M[1J:]5WWNUF#W0_!G2_!G-.!HYR] M\&(;?,=:>F:.,61UIM&2,LLED_FH)KV4H,J)[,"*M?S"*,?!^WOYU M[^;?W_#7_'?KOX,?.P7V[)XUW+4&^=KA[UCP8S*!<;B4#:TT62\75SGECZ_T MJA].#NM\MRAATYM%-3M>)QS8_6+)XSWWP)\I'[5SWOMUO9'_>JAZ<*P,').O M-PB4K8%N^RSBQ.T.&2*N>_EH?2#OW[LM(>+USZ<*W6Q?%O-L8/>_]6L7' M.JZ*$_J^\E-&LZ6GS6(GS]FF3%QP*1[]W*_ES96%ZWZ\?GX;K^/^UQ7L1Q>S M:IY_O*S@Y8'X[-<[IO@S-_G]FO"EJ.,8B=9+X*X>LT1>. M>3?>1?+8CUH/%]Q^>#+]D^='$K>^^BBV\^V6N;*3\U/62*(=*OS&)E(R91]\3V60-#LSM3P(^DES_L773_S?;(ZX,# M8>>&.X/VC[3Z;QCE^'6-L7RY8TS%01UGQ<>ZGHH+^CZ*G_0\)T=TW7_'W7U$ M[)37.!(J7/@F:VO,NQ,;(UZ_Z@_[&?SY9I3K)W'$5&U^RY1I?*X MEHWRFJ:EZG=U(\D$7?^14MOQ/'37*W;*SQD-Y$8,IO3/&=K4&S+TD]#W!=CU M\WB3YY1WN2$J=[D*_5\0KU1]0]-0/J'4)B04[;%*3><*/,1FJ5ELD]@Q-VG, MMSED9+$P:*2]U6_L4HOGZ/LZMS_A6^Y/E#C?F2ARO"G.L_MZOB?D MH8)0-U1T@WT*/>\VJ=F"$K']BIAQ[SJ_L3@6Y,'P&C]0YR:Z7^XX.I'O\$R< M8_=@,M/VI\ETZSN2E"=/";D_0LA72HKVL5+#K%]NX-\HG1&[8M(N?8[(H\)K M/*;>4U15XR;:5.X\<;700?PFQV9H,LWFJ62*':4+7;RSA<[S2X0.\6OG'#.0M063CBW(W8433B? M1_R,&"YZZSQ1])OS1.&W3N*5GR-.(B01\+:!=AEB#]>5$Z[^)1.N\\&SU'*1 M6SFP+`37=H)KEQ"/*L?`KC\0W[M.E'WN.E%ZTG6BY(#+1(DT$1XY&IH-=<@5 M>7E4BCQ#:\8]$\&S0K",WS#NO:MQW/M:XZCWWTVOP9Q[GN.UU\"ND^ZBJGU@ MXA:$+!M>.QD^9I%MQK\L\P7+HL&R;'",Q?Z78S=Y[P.&N0_]1UE?@CFGP+`] MR+ MZOXV9%AX&CWE1^@I!]"?ML&+,9%3SM/WDS.AV3JS!9.EN/>SH-E$?]90U(+> MP:@*<&S?NK?SGZZ_AW[P-'BQ'>SI!L=8X%@M_%UQT`A?L4;'6=ZO[R?KAN=O M!5L9=BM$%9ZU0^ES>M[$94YQ;-?CQ<\_^C3QU4=;%K[9R@<3:Y&K$!XJ<_90 MSW)P3/F1EJ5BCXZ3XB-]7]E.XW#)%LM$\1JGO%$A^%&>L/59P=Y]EPK_/+HF MZ_FQQF4O#N3'O]Z9LN#MYH3Y[]?'1@T.S(T<6J4\HF&J/#;-5G%"QTU^RB!` M=M8D2O*IU6+Q)?NL%Q<7U_[XY84:=N?O)PKKGIY)*?[[<$(V/,P4?Y:_'YB3 M--07ECC/"8/>O.7[WQME>W\U MWN!^&=[C+/S#(3!@!_S'QVK:BFLT#>FOE-K0"*'N*]4T3RETW3HD%O'I(O?R MP-%XKM_8FI:9(S\V>[P05;O=`S^^G2AV_%*<;W]%G&7WZ63&Y'5"AN\1\M=S M,$!"J,_@9=;+]?WJD"-.Y%KD/1[;Z#G.K747?5KE+!HL=G@.WW%?G&W[_62& M]4U)BM57DJ5_?D?(K[\2B"AT%)?F.8C7@QU7,JPE;Y,M1J2)%G]($\U_E<:;W9,NNO8S(>?` MH4-B0@VHU+29V,^58%F\=$;TS$F[-(?).=EVD_DK;"<[TZTE1Y,M)?>6F$^* M%LT8E,;.>(KX31HC];!8++&W2YVT]4B?M)N5,6D7!PQF(JH10L1VQ#G$O15B MNY$5[^TF,W]'?(>XC#B)D,Y"[^%CM732R7&%V,$W6^PP+T?LD)PK=BS+$SL* M$#L0%Q$/\T0.XMQGCN*\[Q%7',6Y)_%Z`"%;!)\=8;Y(X@\?X^*2/^$<#/XE M%$VX%!1/N'!+)EQV(*Z5B%R?E[X%NWYVF2B^!AZ>1.Q';$'(,^#7E^#.C[9, MG`R!C_'P*A6Y1X%]*^#IF/]YNF]JAN'G'L&#W0"_P+#*/6#B>C=1>3=\G:), MSTM>@+LV#1R*1V\W&SW93/^Z<9\EC6,^=>A+=Z$O_9GQ$I?,M[X?&-:T"PQ; M#5\G`,,8Z$^5+=H.BD;DJ3(,DQ;`.Z38ID_UF*-!49R1H&+^2-#NUN&@9ZWW MX9M.A8P(M\&/=<';M:!'K0;'"L$QY2IHKGN:O4*(/!S#6=)Z\T7B`H>7K#<,DO?!5+4[Y[[+GMSVIV,N^D/Y\H#OQU>ZJN#<[LN!]EB+? MPHBAOOGAP]WALX<[50S'\2\)P>U#W41Y M7<-,]I"N^^39#/O/?U\GNFI3"+QXRHO:\'XCH'UP5QAWN"*Y'_U0ZRO// M'V7/S!YCJ`Y0=.51FKKRI)J6\I*:MOPN3>/Y&$6[+-&RZAYR6Y3X(KLJXO6M M6O^[HTR_BV,L[^/C#1X[1#7NJT55[FVB2K<6485J/Z6F/$;1Y9_2Z!,_4+2_ M7A'RC8Q&WZ[0=EHIL4SP%,W'G;^_PO7]8)G'75&UZ_6),J>+Z%M.H?\X(,YQ MV";.5AXBU/@%0KVZ"0\"+W)SF%"'E6K:7+F^[]))ZR6N$U'0?4^AD^C[`H?7 M&'=/G&/[+=AQ'?K_'/H_+TEZ>X:0QU\04!B::2[,6F4G;%YI)CRTPE=V;9RP511@-RN88/96%&_TFFR-SFA$MM;). MD%JX+99:ABS&U(@5B"J$<+'48COB?*+4XEZ"Q&(D832/ZTE M*3\@KMI,IIZVF4P[:#N9+I]OX"\+!8<\S.,EM@XIDS8!:9,VB](F;?/PRD9L M1UQ-%=O\E39H.YEQ'^S[`G$*L=]^,FN+_62V8IFNFWP1>IAP<,C':LFD@^N* M2?OPK$G[].Q)^V;$=L3766/V(UF/P;T;CN+\4X@]B`U.XOQN)W&!L@#W=1;T MN@P\BP:'`FS!1._\":=X,+&F<,)I>Z'8Z6[!6SS[';S<"3=1V2XP<36B%=&, M]U1-].G*&NB^!/5D30^!QUL`?YM1D<"P!')O<0HAJ"Z%4FV@:JO5@2/\T.WF[ MOI^DQBSV16Y,WH/Z7,B(("1KE MB;83(M]+B/(@H91'*9KR$QI=>8:F^?;X#(>[QU+\KY_<%]C7_4OA@O2WFZ-3 MWJV/2`)#$M`'@3T!"T>Y?@M&66,[")$BA^((H12G"26Y0JBW./O?_VBD=_IV MG,O&FWVA]9=_3`K<-,H+[`!WF*-LW^HQAG?A>*-7SGB=9X:H9@1U3"+'Y!%" M)LZB#[E!R+W?"?GXI?JTSC\]O3,?KERP^,FU>)?;$\5NYT3EKH92_T6S9#6Q\Z0GHF9(1F* MF?%"%C/C%YS&.]#^-[*Y)E_*HG[".BY=`+_`@%WW">E^3ZAJ>)D4I8:YOWQZ MX`R9;[2)K'BNB6Q7E(GL7I216#K'^$]H_@'B1^C_EGSVU:/@SU5"=MXFI`\< M:IZ@:`4JBKY(J6GA(9\>8"+SB3*29<\QDO?/-I)?GFTH?QUJ,"X/G/Y,'C+] M5WF(X5UYV">GL7[LPRKX.M9+0LJDE%K:/S2-N'NXS.C\')G1S[/D1B-A(B/Y[,>FLOFW9TACKYI)%YXQE\8I/.&O[8QG MR\RLY\M,/1$1B*6(XGDR$_Y3[/5QJ+`W_&V-_PMAKYM+X,Q;2 MQ$/@FF*VMI/<5]]?YF`2*36S72`U\UL@G;$`D1LKG<&*D9ENBY:97ITO-?EK M[ACF?V`A3;AN*5E\!CP\`!9NM98D*^/1>\S3<9$'H6=P-ITGM7",DYK/BI>: MI^"U<9'4;-M"Z8RO8R=F#,?^@;%?@9]@:,H^L'`C.-AM-[E"E:.FJTS1,%?$ MH9[9TX/`UEB)E5N2Q'(AHA(\WI8H-?\I;A#KOC7%4#!P%QBXVD&KKD@>UD&AB8 M!P]7V.$R4=0,;U>!R$-O.L&![MG@!X-&5]72#90KP8^E!H$2/YO$<>?XC%+DI_U6*R(2_6^HAJEF$U^>=A`SV$")9!?WW(5\G34/) M4C<:+S.>^:@P/OQ.S<:0\WGW%W+\1QEY@:/<)$0,>M1P_[&6$+\QIK_O6//C M7FAN@)!7&PAY!^T,[4+L(^2W'<9Z-[8GVIS[:(/MNMYO(^/37K-#XD>$08M& M6OT7P+O$C#&\YH_7>\X3U3Y"CF?(\7PC:Y)WR6> M??.9ZW[AZ][DNO-$E>X-HBJW,E&%6]Y$N6OF1)EKVD3I5(ZGR/$,.9[M!`.@ MGZOP$MN@/_9=9[,5/^3Y)/UXVL_GRS<+K$](EMM]-+G";CVB&\&9S+1OF,SZ M'7OQ>#7\RR;P[P`AEZ'A_=`?[Q6A4@=U3;Q?104[O=T8:/7RKU#3GV3SS:Y* M%YJ=!S>.21>8[Y$NLM@D3?@-.1ZL(>0K,.#34QC_)2$]Z(G*H-\HI;J!H=3= M7U_.F:DO_<['8%`>8'Q/%F[\C2S"^"JT?Q':/RT+?]"%\=C+4V#AWDN$]-\A MI/%O0J7+*%J`2L-87^'BHZLH]]15G/#4D[_W,G@I#YA^7QYL>$L>.OUK>?#T MZ_*@6_A,3^-S^.@<&(H:6AX04CA(J'@%1?-4:9CH*9R\=!79[CJ*+:XZBA_< M=&1R5[WG"F_]!XJ9^C\@OE/X?K89\W],R,#GA'!O$5+^A)`,>,MY"DK-"3S4 M53BZZ2A27+2574[:R@M.VHH7SMHBA:/.GPHWW5\5'KIW%9Z'L0_K4$,K[H0: M^*%<^*$EXQ1M%GAHH]0TU5$X.&LK%SM.4S+MIRGW([ZWUU).V&B-*&RU_U`X MZ?RF<%&8ZOG(#4P#Y`9._G+]`#^%?HRO0C]UID*OW%NA)_!2Z&[S4.B</PV:\FR#O"H&0PL M!\_0@.<\JR'D=37N[0KD*H+_R$`/$JUI)7&9$?S6-6'VX]`!O[NS?O`_8S.1 M.`!^,C"F&-XLPVFB<`GZT@5@V5T&],(DY!'B+\2[9GB(:D+]E6MD]GW6`I=K MA3T.)W._\FH-?9N6"?\6[R&JFNLIJ@Y#!'J)JGR]196W6-`K%YZ!#]_1A@#7 M[D&'7W;JJI_NGF>P?U6;05_K99?4K*>IGG/':SWFBJK=H\"02%&%:P3X$3%1 M^AV;D-O(\7TK[O\.]!#0SS5P8/]!-6K-(;]IG,/5AE7[3UK'K'X<9<>8S+"O M$F<[K$3ODXU>)@V1+,[]%CEN(<=M`<:CAB_`@6/[X?_A)%A<$D>:'A*'FIX2#[+>)`0\'#%*4[;FNN):XSU9R\;J(QHC35N2MW MT?M*X:7WN<)'_P*T?U+N]S7V]/-V0@[`4ZT[#/U_1D@1:DAX2HB[F*+456;Z M=%6N+EUU2)>N?*6G^5IIJ7T?VK^E<-'Y2N&J\X7"[3KJ.`8F;P"'!/`BE=<) M20./Y_U-B+V$0O-KID=7)2/'@`Y=]2U"H:/Y7&FI]4!A.^T'A8/VMTK'4]V$ M[(`W[`"'ZL'"G.\(60Q?%_::4%:RJ1PS,"Y>1TW%FZ:F.J6MIGJF31?+]33^ M5)@AC_6TG^2V>];#`^%S8&`?"\'"E)\(B7U$B!]\V0SYAQP8%X.H0XY=B)N( M42WZJ%Q7XP_%#,W?%!9*?6U[I;:QHW*:@[U2R]=6.6V^K5(KU5JI56JEU."9 M*S4VFZKHIPU4]!]U56HCVN-TE<%C+:7U+1V%\Q?ZBIGG#>2!*BM-4Z6!CJU2 MV]1!.4WN@JWJ?$'X.TV@R>]8.%H`OS^?/0,P11=Z03_,5T7>V*/O<&^:)9@3S;- M4*C?,1A55QI^KZ-PF1J_UT@V9PV\61MXQ(`_^R.=D!?+"1F.AP>)I-04'EB; ML:ZU4MO#7JJ]PF[88*W5"Y/;E@_T)ITP/F"J]DZP<&IL.3B8"Y;]6$#(S[FX ML[,(^3,5?B:>4+)@FL:0G8G-$Z=%#C_-;+?Z.N":U4G;=P%K,??4V"+XP71X ML\5@62Q8]@7X]64Y-%,*W181\A-R/LP$3Y;J:UU=$FEZ,I5EM#_YG$7[G"=A M*VPG4Q?:3V:&.XIS@YW%^0&NXGP_#W'>97#P4LW_BXNUT%\]>J!Z.K6K,5!S M34NM%J_QB$E&UL]AKG-$.8YA8,94S`)#I@)__C#NO[$7ZG!_-T'_T-":?OCW M=?9J%1NRM'+7[]"+[OS>S;)>'&M1@AXF1[+$*EVRS'HY>J`D2>K_'?\9QI^? MFK^%D"WP1@SNMOD/L9=%GL9UI;G61:7UM',*.^WC"J>I-9QI1`\$'G?`B]3!DZ5_ M2LA<]%5VT"\1&R#2$("@V6\4)E.Y-*\HK2Z@C@.X%_K7HH=" MCYJ/WBX!-82"91;/IG),1TP=9DPBAM&9&"&T/Y7J]/MR'8U;,F.-;^2F4WNP M$?Z8BVE*XYCOH= MF>%V<*P3]TDMUI!U]M\:PF^"I;\08O"&PMBI'.&(,@3,M!B7AAB@')31:$]5 M&FH/Y-JJ:5J&*@U#(Q7=5E^EYJ.M4HO24M&6:JIHA9I*&DM#3JVGRZCC-`GY MEIHDK\DPI5)[3%-IW%%73?]"2VES'BQ1&=.G(0\88X0<#M-4:D$8'X?(U530 MFM5EU#JZA)RDBBFJ,,-XR,1:9IR6KVZA%JK)B;G*!'YG;RG9+0':BJ-K]15)N>F*>T.ZRH\ M=NC+_8<#L4P7<,@4_D-=$W688[PO:DC4D-$JU,74&C41N4R-DI?4'ZCA:[I* M]PQXNA\LVJPO]^LSE(<^GH^>(0S]AB?X84ZI*=4U-50T&PT%+5)#2BN@BZ@! MM6'J2^HE-4Z[K::<=E93:;571^&V%O,+P5(&O-GW2PBYNQ#]2A3Z#G_DLJ9H M"DU-=:F:J]8@/5GKF6:GYH-IES5O:[[5.P<>;]=5N'>"90PCV>Q*4]F\/+#L M*CCV13(A-Y#KY@+P8S98Y$JH)V:&VC]:SM?_PH&A>][Y$YW#ED^LUNHIO!FH MO1B>-!TL6PP>Q<"7G0LMI'%SK"1+`FPDRWWL)M/<["=7?`)V?0Q?=P3\.HA\^_(( MV8VK"C=-24F\X>H>_B[7RER19!4B2K`/@/0(DRZV#)"G' MBW%G(\]AY#FP$N/QNA%6H`]*D,9]R($XC-B/7-LQO@N^KA0:F+^#1@7M"-+PWMV@X;CSC+;! MYM<66OU*&YTVA;,^4^XSO5X6;%PAFW.\Y/_EV%6)^L&Q>HQ?!H[,/$$1HXLV MZGJ7\^C3/C](5[O\7%/MI`K-HFJZQG8P9)W25J=/X7(<\QY#GOW@>S_&-\,3 MYD"#\R!1A\N$4#]/IZB?4RCJ[B:*W/N%HKZ9I&B75>IJ9U73Z">4^NJ'%:;' M(<ZA.B!X$72/\(^@",ST5\:?XL//^ M.YA1Y/D6>6ZHU/>"Q0.8@@D_E8_^-@&>;`YX[`Y,&/R`'(^1XQ$.WF-\8(^F MFE@T7;_#\/TR@@,)HW3G'[4-\(2M\(05V,,4<"CZ!/P@:G#$.G1^!H.>(,>3 M(#32*Q"`YF,8MT<`W<,_L3XQ+EHE]0]=4^,?:KK:/\2:4A(O2D+"J0FR&#K- M)8.D@;PAO>0%V4N>DXOD$?D>!'A!'A`YN454U#6PZ*2&REBE0]'^H:FKJ2A# M2D'L*3'Q)V,DE@R1#(ROP8AN\@=R_$XND=_(+_AO$)DP'CP[15?I'=!26HY9 M$R+7)M0_E#HE)\;4.'$FPV0V>4>68GP9>48ZR$/D>$"ND9_)$_(#$9/K>/H, M3:5Y4$,Y8XNVPO&)-_R''?H7/4(4%!UKF$'>$V_RDBPD?Y)\\I@(,?=^U[3ZF#O)98?RAYBO7\ M3EI!TB/D-JKX$C6#Q`'CTDS25^E9XRPXMI6TS6%8!EN7#UYU>"K^`:^QT M+/B!:^137_#("D=11U?MBEZH^@FC4OH!TYWT;89WM/NUI!;-8'D16)0^71ZT M&#URS%2/BH_]`-BS#YYLSV*<6>3:/0?O^5#45A\7^JK`3'IKT(!ZO==5XTR+ MMYX+C.2ALTUD$8%FLGG>%M(%;M;2Q+W9&`/OM#V#D$W(-0`N=J,V01(A#4M- MJ=*41"HK64"/3SAC[#?GB<\,;VF4J1>\A[=LOKF/+-K<5[IP;PYR@(/;D&BER;X,E\@##>%FH M\2)9Q%XP;S=JV88\&Y&G#\$`2S(;<.8[*>+0ZT2SZL^A&:_:09_6^XNV6KM2 MF\Y63=>L5UIH5R@<]$KDWA]R(+:CGO5XY8(C1>A7%T#'SN"`^F%#2NUP$D4= MF6K4;E%D[Q!%;9=3M'7P#WTJ78UVY8R]X/!NU+T-T8WQU>BKDF$UPN!'+,$1 M\BD.WSEL]%D8I3.`PDF(^6.8BJ/0_@$IC;971=\+#N]"K,%X)CB6TT5(#,;/ MA!\QQA!R$3DNX"!^"MA^BJ;S/$1]%DW.6;#H["0.A8S:!RQLPG@!IBE';YJ$ M\7/05[FA+S(X@QS7]''AX%*^C$-P"=J_!.U_AJ;Q`KS,I==H!N5D.\9W8_V- MZ`NS,$TLQ@?!5SJ@!IV+R'$#.;[`P;N*R^LJ-OHJ8'?E%,:B:;L&LW5]G*S& M>!;VKQ@<6P(.16"\[R%";/"8%CP1N0F>?N.#9W&8OP0XKZ/8ZZCE.GYXXW>8 M]'=$2>A$1J:#&5;D+7$G?Y$P:&T1])X.7I1#:1SH;37YENPC7Y-/R0W\[3J> MN$I&010%.4W]0YM0)\A!)R/$D+PBMN"-#[0Z%[Q8!KT7DCN$2;XA_=#L/HS[ MC'P.%5\"62X0N".P:#]8]H^TX!F(.OF;&(%W#N!%$+F+6NZ0',Q;#_KT MD6;:&K]']P@]ZATR?:T#SJ^8V8X"DW5!R%^5/) M%5*-%?20T^0@^02K.(95'D4-NR@E;9V:2KM;0VEV#0$N'P4,Q\"20_"UVVEY+0^>"*^NM*X"2PY/1?'#U[J'#Z^ M"X[XR/`Q?`&672,V6/U>#(^KN=FU%6)->9$ M:9'DZ'`2'UU#BXSZ:-K,D#L6AJZ3O@8N+,!_>3J M__C%2P2_D"9E4<0_UXWRR,NA[',WT$TSO]'13)/.T$Q26$R+D]OJQ,J= M]:/EWEO`K@U3#$0M/:B%CSP5R+L$_LP#?8D!VX2:QEE,J7.[*1K[*D78XQ#7 M/Q2M4JFI7JR8KIFOL-J*'!LQ9@WR]*">9K`H$WXD`O*RADS)!AR!81!OX@=[.`"PD MNY%C)P[/3FS8#IC%[3!:VP&&'>BI=MW"A?*0;$/M:\`Q#M9>Q$$-X&`0_(@# M,*&S"SGVX_#NQ4'>AX.T#[#9AUKV0OM[T3#MNX[#]#W9`(ZU87P->K)TH"$* MZ)V)\3;H3Z>A;'($+#R,@W<8E^IAP/(Q\@AS'71#P9,>Q<<>QM\>Q4<=1R\?P59]5$,W/&A^-72["W$:VKT.#=XC'X-:1T&?O\&@ M%\CS!"Q[0*SA,3SA-&:1+\"/R_`.YT@I.458>+Z?'(;R#I*S(,E7(-)O<#;O MR6[DN&<*[Z$!BP8&_0R6W2)VF,47*IV'IY=!\2LQEH'G>_'\1ZCD4[(#3VU# MY9M!T#64E/8E]/Z-&2%WP+(?B!IF,$;MCM!\,.:.QWS9&-=`MH!#&Y!I+7ZZ M%K,-P.GT$#'5!D]SS@]7CRNN(DL@'T?R"AAT$BP[!#[O`S^V@\WKX.WZP<-> M5-0#.G6B!CX9I9B40JU.3:5S&%[C$%AV"$?@,%AV%,?A$!BTBYB3K220K,%Z MNDDM$9#UA`L2L[$/362$JJ3D:BO5E#J9ZDK3G6#&-GBI+;-P7E'3.OBR`?BR MC90:ZG4@[=C;%JJ!-%+[22WU$U5&B6F9-+G&4K!HH8;"?.XTI?UZ:'P`1[`/ MN3J1BP]?UHR:&K&V.@,]4FH<3F6;EE/))MO4X@UN:D=J39@&:2DLO;05=BZZ M"F<'`X7G`*[`7G"L`]S@H;]L1*]:BO6MP/H6^U%D7H`7F1641?D%]-.=?2[K M&#F]MM:V5]CIV,OM=1SD3KI.WP8ERPIP'UE$#JR8B0.(K8+34G M%LL2B>&R5MJTI+-TM<6O-&B+E!IJT>A?HI33-2*4YFL@QS[4TK'D7X8UH::@&6)D@$5-#U'X(%D+=O5CSBZ, M9>.QE>!`+/HZ#TC+$)Z&"*9AD1[X(3:>C7N?(T#!$'8K&A4A_$S[+;(V_3\O M")[5H*]+0H^`CQ?(.LBY M%RQC8(I\]&0+P`%?]%4V8-&T?N18@\,[X/PO4U=APE6`S2H8KG[P;`"&;<,9 M,H#47#"X')A;SH6/@A_R!*HL,%YSBH5;P,)-$-4F[.LF+'HC'EX/V&[8`,Z" M(5M/$"'P5H_QV>C)8L&A()3I`A;-F/*5.Z=XBL._$Y?>3OBZ7=CT75.-,(K= MB;W=B3IV?0Q'HPX%Z(,HYO`+3M"M'W0?`6XL`C=2T77D@QEUT!\?FN^%AK9" MAR?P^^?0\FWH_R%Y0(?_`(-^!,MNPD]]`>]Q#BS[!"P["I;M_:#]*CS?`NWW M0O?;H,./\?H%]/0CZ/:,?&-$R&VP[#;RW`#++H%EGX!E!^'+]J"6K20-BBW& ML\U0?P_I0HX.Y.C"TYT@7SM(>@%]V"436$:P["H8=`XL.PB6[2`S,>_<_[2? MCV>;L9IN.+SM8,!Y,.`[5/8$A!LA1]'/'<.V?PR6?8(C^3$8M`]Z24A M&!N'Y[/`C%K0K`>_[T%,.:R?227ZNQ(B(KM"_KW&=N`8;8Y,$S0P2K=5%16B>5PNE/]?PH:FTG.@J71OTV&;3 ME)9=X$8;Y,19\"]_RN&EN85F[GA$7=_F@8ZZ MA=R`;JXR4+=4&6I:R\P_Y(`7XTPQ#!ZJ'#S,!EOCL$_>J$MOOC;1@)^BQU03 MVORM%#7_6XK,'<0$"HJ:I:310E7JW6"/,/%?AC6AEDK4DHVK-1)_MP132#H. M80HV*A5_2<4Y3X=64F$(4G#G)\/++)>1GJ1_.)OPY%QR9!PXY@R7Z MT".IT$1B:*X(ST@E^=8"$';HV<$Q@#_:%8B(LE(N)N(`5'TP4P#"U;R0]6#<37J@87BX)Z4.! M!E>PQ`S3:/1,L1`'MP=U].`#[\"'UPGSUH%".P&[KBDF;B`\E%8%O*T`)N=C MK!\8Z@@.FL#3T=$?DG7@V%I: M[Y!/;`@Y`9:=QE$Z!08=!,NV@F4#8%D[UL1%+4RHM1[KJ<7(*N2HQ!.58$`Y M7%<9.+('UG,/MGT/=+H7QVDW?,<:Y!&BQV2`974D$N.22!&(48B9\[`#>:@T M!\3+`H$SP;)-V.X-8-G:*>^"'K,?QZ$+#&H&$\NQQRO!LFS0(AV_I^#=Y9AA M*79\,3Z!1-P("628K,+5TXWCTPX/Q$>/R;+&4<254@8&98%ER<0+S\60A9@] M&KLX%S5$8O?",?]L<#`8/:H0_.%#IRW@1@..407:\GS((\40^J<@<\J.S*;B M2"!53WRHW<2#NDDY4^\H.TI)6=#^43-54VFV0JOLV'_Y,V4S"E!3*O@:`Y;Y M6N#>-9U.S,W"B:%%&:5MOIFF/N,K-9K)")TR_D>-,OF'3C/]1_U#CBF&12,' M^%,`[J2"K3$S<6CKAFHC\32"(F&YF*PV(4`1#P:G7@8BT5;\/=/811N?^#@ M%,,8J*46>0HQ+A%<\P8/IH,+9#D.\E)L]#(L,AFP2D7#M0(,R4*>3`@J\R@1 M_LL*<"02LG(`LG0A#'#DX!+EX*`\_+(3F2@&7E,W MZ$*:ICB&'/7XL!JPV`;PL!$YFI&#B1RL M+B($QQI1=P'>3L#8()3H!(Z9@&/J4QQKQ<'E8RT!6*(&7V<&7[4\@Y5K.'UZ#C*;-_)?P<@R0EV5X_S[[/BIT:,'2^0 MYQE8]@0Z&X)E)\1B/$L>9==2KA)VU,*`%K3672#/>1AT"I8=AF5[V6-VB_EP9QGEUN)5JFA-`[6YRI!OP9"GR/RR.(5W M.0G+'AN+_60J/`*#]I*G!W_7S'XL"#^VHOTJ^N5>:%)!2\IA:ADM+H7>)7#D M"-PXC!U_$$GL2Z?;F0[]Y`F39RLLJZ1O2O":Q918C9M917^LI*=7T'/Y>*KE MX@VQ#WWM0:<##%TW2W,[^Z=FEI0:&%1"GI7TS5+JD@.Y%M.BKT/)>=1A+GO4 M3+SE7>*O8@!]]J#5CFRF\'R6>>JTB25I'7VT!`9EPK*9],LT6C&9OIC`:I-. M^;&L3+>PST[5_B/ZXOQI95FOIT[52*L4N[$M_`DWR5T7Y70?/LY M88?O5Y@"O$?J1XA[6`[X$X(_U?"P%&GDP?NI]+=&^\0,YNE,*CH+(,QF89[- M0CS[7.Q_TF2\;?FP+A@681IOEUZ,NFP@3S9><2QM9(GAI)-RT.TR])+'7,_' MG.2QR5B._UCVC-B)G+NI2SMU:;2>9X$H\F;`H='P1!3!L=48X#5HKIB;K0,X M94"B`C!4DJ?\88MA/>3IH%PC9R4LR47+4_`DR557_1@Y*EF$[B5'%>VI!A2U M"#V(R.MW6WO)7O#4SCUKD?4:$).)+">@YZ1@W(]M`_"U='0M%:T#./7`HH$< MS8B]=%93-I:DS>#L='KA:K_HQ%L`F#&NS]&15MLSO.L4YR=#!Q.N1")A_DT9;.YCC+^D47 M_C$$`S?`P%SXEP'_)E,V#8[IN^(AGL7@:_CP[LH])]0+>?'#L'XNQ( M$1?%.)0\F=5T)KN<`+XG!^^Q@IE=!'/*4$DU.@XQ4]LA43\_]^.,'H$'0^)Y MANY9\OP`!IUC%G\;ECT*RQYD?N\1N>QS"BBW#GYLA`$UG*WPHQ<*[.,\CH+. M6H^_GH)EWR//&?(U-3+JAY!<2WLR1I0?!#_$$31DFA;X5`-;FL+ MU!FBJ4.P;(AI"0NO$#)Q8@&N7<&TQ+:KB9XBSEYH=A"6G.9\6 M^^'&7K2U&[T/L#?L93ITD"=(GDJ86$P?%T*-%?S,@V1+(>G=W"4'/Y1-.Q;! M@5TLQ7W(J8LIU#8M-IWJ6%(VPJ#5Y,F&B0O$''JX`.YLI)=:(.0>,I\47V,7 M.XV5I1N-=3#L+6BU'EG=1YW*D?IJ]G2+8-!4\MQ.FR;`YG'4;`RM'$U?^%@7 M4L1+8A0LZ\R/\:>!/#4+8QZHB.ET-WR=GA;_'C:=AKJX*`F]>IG(H]@O))_' M&+R,N%\776@^LCSV'*E&^BC:58R\=Y?6/+?ZT(<=&I%`'?ZJHRSKR+&(_-X:<="?^B1P+J%P.0%K*7%]*?990 MGUSV07=_1W23HX/V-%.7;>391'T*^7T63/%)+U7`1%Y!CA49,3^UAASWH-U2 MA+8><9;N%CV%,5LA]X)!SC(NR6:[-!D]C^(4ZYG$)0QZ">:U%#AN`#25@&83 M.;8`B9JHZ&5+$N6>+9S5I"_$HMP)AV[C=,L]8343>#/UV$2.S73\9G)L`7*U MP*9>>JIVT4LHREE/ZC+*9?/6="S*K9PF/!+U+*#;R!$D1Y#^"%+1>G(T`+JF M)NNY62\<:^'>F\%;(>6R"$\!+V-`KD%S10L3MYE%M!G3V[PX5N$PP`VS`8S( M!T$=HH,NKB-E*4C)@7VS*#<)BY,*7G3)L6[),7)TD*-C8=R3T5&=5+B3&^V( M)K[#+]'^1/MOXO9?^\Y/;5SB.S\3\R71_NNT_\8XOBE&"+K%84<,TW#2>>73 MGUQ)'%_Z\:\18K>*;8Y8!3M71Q!4W^H(ON>9%$[TZY=^%.]TQMBA.&+)+*=J M[+08(7AEJB9&4NS/$WW]11X/N=([SH#-VN:8Y8BGP6J,0>DV,T40F:TM9.48+RB8:8I^;,TX5>G1B! MSW=$)SM"$5T3+XZP.+'X1TT33G&ZB`I3"9Y%L([@E2N;YQY(#,MU MC[-N\:X:\S)&LY18E3;"TF58`_<3983EP&E_LP>3=%G^#_9@V*5SL8,`+L/( M30R,[3CE#(T3VF(E]([L8\,QF%)RW8I?L4;3KXRF(:.9]F#0*AY0=2@?%10J MP2R=X3SH<#&U?[IYQRTR7EVDKE3J3JS-LQZ^/&,/ZM8S&<7[)VD<0K<'\PV9 M4UTD1PQZ#*%KJE>ME#D=^XE4]\SE`S?%*/W=$7EBC.%10C\SZ4WC=PX=T7<3 MU(Z7HZF,T40+@.*8+7C)4IQV4167AA-Y0S$GAJ;I^F55AX9N.LQ1NFEXM'^K MT8.7;[AQ"SD-_0RZSO&0P]`,?9$B+DV8NJK#9+1A"&.-+;A;CJ:NIZH#KPE# M-9M9S`5=73D_8-AT/4>IE(]%3N0KP:,N5Y*N!J^L^_6--FYU/ET-%=(?GG)% M1YH+?7@5``I3#L=1.P`U:Y!<#B,B]6D/I@G=*0S3 M]*K5'W_7MCTOWPRH_(T:R!^?DJ3Y[#&W1S,9C0]LP4F&%)R6;@N^XM(E0+4W MG>Y$TR*V8"T[.1AX0MT0"%BI.-@9'A3O_84]^'KJZ#%W+E.K__%-;"I?^_ZA M'GND:+3NQC8LM>_L#*DB4U<-O6Z8AK[0_N0#?NJ:/EIAK5RZ5%;Z#'V4RURH M`-"K^[PI14H]UY[Z-+$#N-Y8#I3,G3%&T:''Z])-E]N^#?;IAL&"9%_ZGF1\ M74(=8YAL)@F%@%MUTRM,U4*FS;SGT(5_),;A\QU_?M7^^^11;J_;,,;;W8Y+ M8X>F*]MU9`A8/;OMS[=P^1XA=BDZ3'&-GUVFW/IBHO>_P./#?>5S,_S^28H1 MD8K3M/EV'0)5MS"3;,'GA9&4Y$E1]F)3\A]X-]&W7_KQZ2>_?]\>,3T>MRE< M]C&JT8UD5Y+A>L_.2E_:S"6;]US'+26._\VQ_?9QJ4EI7D_[\.!ET^US>Y-' MS[$/7.#@FXD.^\H<+_WPT8/['CAIM_FIIG=25LV1O;;@F41G?>6/C''-EV[8 MQHG_\_$5:']7J%=^PE44M+7W19L:&KO\\W)RLOV9_OF!P`)_?GM[..0O:&MM MW]$5BOJ+(L&L.?ZZ<-AO7=KICX8Z0]'N4'V6:`WO",9;E/V7^M!*^9?E6;P>VMZTJHC7=W+^ MU%54$7NM5T3")??$7]\2:2LIC>44'[5WK=AP-7]G=WGAU7AS7?'ZV%_0:WDM M;6OE-;=1=DE_8\7&V&OMOO[&@I+XZ]?$)A$6(=$D(OR,"+\H$.N(K169U@<[ MVL1VWFOBFB:QVKHB1%1^:+SE,ZX-B_7#7OLI);\*[9]6J0ZQ@_*Q/3=PQ>_A[@]&:IN!O'_Z8[+(&5[-?>S]>N]A] M@MQ??KP]+!J(MEYK7Z>MSL/JN3UR;.+P;/).H0,EEX>U.62[7Z;89N5KL>[7 M;;TK/TB?/^R>G]V?7'UIYRNW#;_CV^:+][V5-I]DD](%%$< MQ[^S)4*L!64F4O!.M@=7!NU@'8S=]6_*MJQKI@BRSK[9'9V=G=[,;B4>0H@N M0=8QNEC123J&!P\=`@\1@F)=(N@H&02"EY#M-S.[[HC:@S?O,[__O]][0%TH M;9IZ@`%YPQ;)_BB[.S[!ZC=0AP8$02NM6&8DD1AVF6QQ9.U]A>2)7Q&>S/I[V<89; M"O$R\4W%%!0GD"(>*"E9)^8.L6QD-(/DEXF[,I:2)R;?P%-G%EZ9]A#0?04X M];DFF["`Y7?`I=::+-0,7!P#5CIKLMVD.Q^I:=U2.SMKS:Z]>+1_4EJW02>S-Q5Q>P1/@R\_`EH;IM M_L#-$RN8#X66S=FL0Y8[6-@Y.EF$7@AGL4+>+-IX M*/%,._)ZL=KO.=I!;HR.T$GS"JCIUW0;RH:GV# MSH70_J2*OE&/I?.:/9CR.-!MZ/'A"L,HQ&][,;%CVM%D-;Y5&NFMRF?2MQ)T MMI#\QFQAR+%I(M_07"XUYK&4FLO%XA5>Q3AT<&@PZ&N`(8E^1!&&"8$"5-)H M9*&1E+LV@MC"[+&6.A(^9J3?)I]MU^<>BN3M>-U!-(Z%MH,(3/XF_Y:WY"7Y MK?QKL:48JFD6Q)2FK#_[0W&=S-6X%6VE)B^^0GDCI-61)6G^H"?+5ZFO.M58 M;*E%%(5_R@J\/_-3N_/_\'S;`!:`IE;F1S=')E86T*96YD;V)J"C$V(#`@ M;V)J"CDA27<\5V?2%*`3[1KU2QP#GA<3SNW[PD777%G%.$\D?N)RP-? M@'^S8M<$O`+\/L1IF&D685(GA@+F+ MV-TP]C9UP(VBD:E,JTEE7?FD/%/>*9^5'>4IT,>UJI8`-5468-%?^DTL>=O4]C!LND)KS6<`[>($*%2@]1'7"#C*EX1PU[ M;6K(ZQ$+%/)[Y;U8=3[4.:I]*\S?#K5U0X:'/1/3$+U#U-TR;D=JP=Y:V9B, M5]T9>WY].[&ULF\V>CC=;-A/'\R#,XJ_C3.LU\1RAFS^VXEJ\?J_Y,'?^@.? ML?!1"F5N9'-T7W\EL6,[3NRF M^6SKA#H)H:4)3=J&$DIHTS;0=:4J3$AH&IO(/C308$.@"8F)C5\+TS292-L0 M8M/X^!$Q^,&431H3TS:80!H5;-!XS[F^:6$;VK\MR1.?<^_U.>_SO.]YSK$) M)838R7U$(&,G5I?.D9=I#E=>`5XZ.'4\M)M?YVZ]!5"W#_&\Y53N"`^9?X1^N^@GSRU M>N%2\CWB),3C0G_Z[)TGEK1*YB'TCZ&?75VZ=(YI[#+Z7T)?N6-I=?F)XN'O MH_\]]//G[OS\!983S.B_AO[^<^>7SS4(Z2;$&T7?Q`,EG`]G9"8_XV.0(\:5 M_^MWV)?M-"W[-LZ]G#^YH?-"_35YF; M#)(I*C3(--YV/="[U2#2UIXV\AN,]A>`+>Z)($42"0&=P`!0!Q:`%>!NX`'@ M4>!IX%G@1:!]$:.Z&L2_"10V2)SX2:_;,[!!4@A:0JM!AK8PN)D,D0X@#52` M">`FX';@(O!EX!'@*>`GP"^!]D6$^#H:;P%L<8/4C-')!H(+$Z&[0>JN#5+% MZ+Q==?$`PJ2N3QM&6.HF?Z)!LGC-0B]O>40H]\:9W^=@HD/P^^*LW%NI!LP= M>!FE#JHETOU]:(W0_KX>IB4P]$F"FI2;*MW>PT2PY)4-LDN:^6[IP>ZG11I7=TI.IA5J<_MYPF'+?[ND:W_Z:F M?%:SU)ZLQ6I)W3'\R.MEY%4FWVX0!;ISP^`24)!5`"L(6W'=R1_7Y0BVLA!$ M%H+(0A!9""(+060AB"P$D84@LA!$%H+(0A!9""(+P9TL!)&%(+(`[;U8_WPR M+_0VD9C>-F%2@K*RX]6U52S1<@_E\OE]7-JJQJ7M8?U](Q"\@SXQ)YR<'S]3 M3YTY??2>P)QGIIHLQ=O#Y:E2>3==.CK7OW!^Y/2%8_/%W<%L)=YU>"+7KWN2 M#;S?!6\%#OIP@^0*/`#U:@`YP`[F=M2XW.(K@Z\,OC+XRN`K@Z\,OC+XRN`K M@Z\,OC+XRN`K[_"5P5<&7]#"B*0`WF$X'9\J#-XBR>AM$>V$(7["52Q555XZ MZ19U7ETC[!KYE-HJOUOI_R=GF/),#X6*Z@PYNOV:- MYP936C$F_5E*^E8O%>>_,)FH#V,\&,T(AF=?(PD]^TXHTK,%#C&2U6_'<-M&RGK;AO8@W)NW!\$AY=5$ MK;]'N$8"2\0A<`X9+2[P[@A-M5+)5Q*_05]>/.!B9CG?'QN];3P5*M:+I=DH MLP6RHZ5@CQ9@LU3;5<_.7E0EW_8/@CVU_+X]@9[KBDI1=DW1C>,LF(DX!XZ> M'RC,#,C)+I:>VIT4O6JX>SCMV3L3J?\P.5?OG1S.')XL!M+<#IL?X]_[["4D MZ:L;)&"49,"ENYH=KF;?<34[7,T.5[/#U>PP#CMS MP]7L<#6[[FJ\D+W(O+?`1X65;/'-#1T*>`J\&JQ7JR'.%R"$AL,(9>\(A3Z& M-J+>URO"+&:\#STR.V0)!X+C6KI/,)GHWKE1T7)=O7*KPH;92U4;=R#4XDS^",]\'O/H^\,FEC]EA)!0S;G;FZQJ!E M`KHF"GS4!MFU943C`E3P*1FZEKB-`>'-5KM[\U_5-8M&5_ADMV7<9I'[#R2O MKJS.[K;X(H%Q34M9Q9&Y`='GE^*)E">1;Q/VS^UILP4[^R)]Q^/21*FRJ#(O M:[OR$76F^\/A;%*Q]L6WWZ"2.A1PA+WV;%Q2[=L-6NG8'5!RD?9R5[FKU,6N MOU:/W)/O_9_5X[_7XG^I0*UZZNQG5J!+9_Y9%3@#_W4W+S,K.+IA++]ND"2F M3P%)UXY+HH^V#1L!P:NGY<$>>+`'I>1!37G@P1YXL`<>[($'>^#!'GBP!Q[L M@0=[X,&>'0_VP(,]N@?;,%JT=6*)0LOHCI91:!F%EE%H&86646@9A991:!F% MEE%H&86646@9A991#`T75'&FY7JI6+OM2!9OMW/W-BS;!NX`'@4>!IX%G@18!72%>K(OC^G+ZZ/\>-RHB[6LLMN-6JD#+W<4ZTM5BT M:EN+H[%#W_[(H2H3M7PY4#M3SX3[IGK[#J:9A[K#?=/ET7V1\G1Q`D<5&)8O MK/DMNV^^:[`PLTM.]D[^JOO(9&%Z=^>1Z=Y)LK,N[F%>\!;U^/3YJWJ%XF^0 M]@:J:7,KAI-G9DMFG]L'%_.Y[%:3S^*P[%F,LQ`OS+=B^T)RSFJB]"AC$_UW M\K$_Q'F@H9]OG]G`PE-TJC)H=^&DR-M=+77]4->_HZX?>OFAKA_J^J&N'^KZ MH:X?ZOJAKA_J^J&N'^KZH:X?ZFZ`BI]TZ7NIO@EL;F$W.) MZD0R.5Y1`YE2.%1*!_V)+G^DE/*S6:4ZG4]/#:6#:7XG$_#)66]^C*[F1S-N M7VI7,I93@S;)VQ'Q=L2]%EL@$^W=EW6[T\/=\;P:EFS>CK#'%W*:\]A-U.9' MM,:^"SE+AL,X#9K[CZB)9<%!C7/#M3-UU5NN M_E:94PZ[#M>8X)6[@LZXTVD/MOMD1L=.PGL>?71J^^=VGQ12O*+`9DQM3I_5 M9:7%*?WC/''">RS8R>+D`P$AQ& M@L-(![/3LMAM!`7U03CUXLU[:7O4NG8"RQTRP93 MC@P?>9:%$<$R?8P#UO[0]AVZELWGFP7Z=\S;`1_GM'?FYO-YKL[B,68)M&;Q MBGHN,V*<\O)\DMZT^`8;.GJTSYF,V:(VIUUQ*L6T^C[II1U04FQ^P+"T`1L;:;[-W[4@S#8_YGTV M0MSL8'.37M_\F/Z^^2$=)"K+$2?[@'2B_SS&BY(HM=`O,0=;$TQ"0J@(KYIJ MIC?;;F[[FKEB_J+Y'3$KWJKS\9+SB%,%6M':^$<4=MSX1H=R_?3K9A(A9/KZ MF;WU@]W[E\]>7+ZP0-PIE;F1S=')E86T* M96YD;V)J"C(Q(#`@;V)J"C,Q-S`*96YD;V)J"C(R(#`@;V)J"CP\("]4>7!E M("]&;VYT1&5S8W)I<'1O9`<5WE_K^]K>KKGOF=ZSCUFC]G=V5G- MGMI3TEJ65\>R*TN6==HREB6#LY$I)W$(F$*D@B&Q8ZY0)L2(6(0%3'FE!6-" M08C+H384D!11"'^$A!!0H&P"J9C=?.]US[&'7-'J=;_WNJ??]_O>[[MZ!F&$ MD(8>1RP:.WWAY"7\':8",Z]">^7TTB,I[L_PIQ#"S\`X=N[2?1?^]M[/?03& M+T`[=-^#CYY+_^J_EA%B)82L/[G_[,DSMWR7]R"4_2C&,-G4.JA MDQ?.OG;MS$F$\C!$K9MO92U>O@H\[,[?\QT-BF,;?M#AZ:@$0D(1EZ"E+I"BXXZO2Z&QG(1![D13[D MWV&%`+0@M!`*TW$$6A3%X!A'"92D+L"I+O6O@^9*ZGIU/TGSRQS.7J&"V>O+':E MEM&AA?-P/+Q@+8\M1NO=LXN+57@.1Y[#T>=<680G/.`\X0'Z!'C`;^`FOCB; M6F;S=RW,+2P_/AE='IMC%J+BW"74)<4SK]S/N3(+(+, M0AMT)/LIA^`9\(C%*U><$9.WEE^^UP"9ZJP$<3B"$?%:$3A%:`QA[O+N&TSOA]"::W M9X0I]W4R8D\"QCJ327?">(3!IJ++]&M5;)%J$P19(Q5-`4C-QU-&=LV[@;J@%LSIF<7T0AA MDK/Q;MAR-VR\F]Y$^E/TIG#7-E[<0-W.,ZZC4?C\#31>OWWV9HT:5:+BJJWB M%M@-A8K48JQ2S]@@2I42!6\G"EG&AQ`\EBQ@]PAY;)+T.J392AXO)5<@J+,- MBN4+(YCL)"ZYK)C7&[-<>HJ<4[J[)1<.YUK%[SFT9`X\_Q>L3GB^A\[8S[U=2NKI9>EQQ*%D*E MD8RJ9D9*O0.&T=?2M2NE4@-IA<.G&1T868$_\*$U1G)$71Q1ES.1)Q-Y6W]E MT%@7U5C9Z"Y5?(%>?Z8\@BLC(@%7MOPZ!K1<,(')A7Z"M9#1V4I!_*:H?DY5 M>,:(I%+)D-LE8EY2O(E"6\&05/GK7D53\<\4361?.[D8`&P:(VM\<>+@D;FQ M%LQS6-,P)S'=^T^>O3?OT6"DXG`RQD?3/ODO;]U"="^KP,=/`A]WH6.KJ%AG M7]%F7Q'85P0@Q2:WX2/8?#8V!;12HA]0@`T^8$.AYC8*P(8"_:-NHU(0B!5V M@BTV'`C88A!P)G`S"6QR"")3/:H*LI2*)]XR-+1T3[5ZS]+0P-&)-I$7&>T^ ME>':!P9OK` M^G_*7KQ[^OQ,QAH_-[7^@E=>PNFYL;$Y_([U3E%FM.+>$[T#]\ZTP$Z#F',; M/V-.01QO1R=70>,\;!995H1E\VN(@''$N(DVW&Y[C"IW'X'2GVN3+84_[O&N-PW\&Y)(EY2DM9= M7AF0O58??^4&.-"7/ZJX#JGF7YDJP!%M@(+K>:]ZW*50;I*]N0CX]#ZEF%=U>5'141W#=>!7.[J/1*O: M'KD,FV=*G6`^7UZTZ/8#P&AS;` MZ$5YHO*:#Q$,1)(,1V!$!$9V[C.(8>VRN4FV8S4!9"]9H+$\7;2NRZ_".@-H M=)4:8;IN9D6B,1>L%=^^WC:-=9>LWC(X([8RPCH2D&"4V5%9E01/C?;FCQ1= M>O4SLDMU*>N24JA.)<2&UDYQH40ZYE%DC=-PZ2EP0M3]LC*7*X_$7]BNP,L+ M0KJSIYA@%=;&MO$?S*.`+8RZ-S/#88*W:QN]&XYEL]P-, M%7R"K+]$D+WH]_3TE]LBJOD+X.[/&PK&U7WW3;4&9)87M"9"87/]E][RX&!W MBN%%;#.8Q('2Q@>89R$.%M`LNKJ"[@!`^Z&Y;D(?T`8!;9",P2%VU")!!^Q6 M!T2"#IIO%]8(Q^`VN&6FEG?/`/89"*`S3K"HZ8DA:F&:]!0C$[&&1VYQ/#)1 M^'5(H9P<:QRBZC@(.4ZC*E\ID.06$@8[1VK$UOY*@B56SM8RK4;@#0KY6JAE M0H\*O"SR'J]7Z!WL.?+PV-C#1WK(.5&-\/Z`(;)7K<&.J*BZY5`ER8+PQ"X<[Y:#'Z:QN!.]"0ADVT!N;IO[(86OUT,MF^1 M0?MQ.`?6".=N0&4<1SPPK!8F_$2__B:%MY&)-EOA%@B!G=ABI[B*D^*2,.&$ M;;;<2PA*R)KNPD3A^2W1`[-7BY95O'J*]47C(2.P9FI+(W-G+JY_L.9;NQ^R M`@%K_=95/I8MI$.,"0ST/&?>.75D;I-[L.VQ%7*SMP(GQ]&?KJ`)H,XDM`E2 MYZR1*JA1"4[22M"N?T*(LZD7`NJ%@'HAJB,W7!JP+\G0"4-KA;9S-5B$Q:-. M'FA7@X.UM&X0"#@(!!RD!*R(P1%,$C:G'!3`5,DPCH,U:CJTXX@**>TJ;]^G M`0_DW-C=HW,7=D>SU7UW[JMF^W9G]@T5M"F5AP*KTDTMT3MFM>_*>!1>,DTSH;B]LBJ\CQ,@J7.%BR/Y[DI M*^,.A!6W`%!BP*]IR".2Z*@=GZ*-^$2Q:P2[UI1#.#EN8Z(135:144^8#,/. MMB)K]9C6V\B%(,*`,QO!@S3A>P7V_UH]`?+4>M><<+>DFI\W57I8OT(#'D9' M8/^_"':10P=6P3AX9-)5)>!HG+Y*(J,X0:$!":R:;PD268-VA.!J^\;!#$%8&<3ZU,,.SXT-$YYVSY[=M>NL[/M-HE_OOYZM:>GBK5Z('E] M_&B_W]]_=+P^1_D;!KV_$^0O`POM7":[/3K?@-V`\I`&`]!A&OR24('RJ!&7 M.]EZ``@F1.+5?O(MW8AF2(]^=Y+CCR6Z?/+8UX(3"0$*V82L_D70?O&,HQ+&?G&7$H MU/\8Y#Z##B!;YB%HAV^;67C(A,<&0S+7+(UQI7IOK].K`V0JO<0].W%O"V!. MS#2%O"T3/8X&/ON/@5`ZJS&Z%??YUD27*Q!-Q`+D-89T57*Y?,&`R3*$MR*Z?=[!$;P!@(>59-?%%FL!V+Q:,"E29HNWOG`VXL]#Y^9U526%(TR MT[K[X)%#N]M922$Q4I#9MJ&9\;)F5"=FJGDL\623>8G-#4Q.#'I]0Q,3`UF6 MSJIL<>+P_*'=+0P4KC2.(>9!O`(5<`^:1)MS&&4'\]HA')9@2_*4ZR6CEKH1 MA=CY`6$(6!OQROF&:H5,(5/!WWA.T!@UV]J:]KO^WI4JC22@PGB:521%9G[, M*K*HL#W/'=1X/K)_?GZFBY4)(61^[\7W3M-R6N1,GT\4?3Z3$YFG/DNXD0>; MG,8O@>M<6H7PP4'51R1KL^OE-O"Y;2!L6Y-CE0D4N0FLETQX;?O,U0)[#NPS M!_:9H]Y:!I?;95^2H!."U@*-FNYFO^K4T:2,#L3Q#F5TD,F#G^&E?-^(53E_ ML*?GX/E*]X%JAA-E[82*@ZWE1*S:F4AT5F/A4B$,O,#/57ROR`HR[_>[]7AG,M41UQ67(?`2)X).AC=N,1;^%J!^:)7H`PR(Z$0' MSXA)7I[OVNQ6&ZH(D8E0TT2:3*1K[_:P4TB3VBA-"VG\!GS((+4VIF_Y:'`& M?^L3['K-[F^O307\O^O_^B7(!#5-^!+.VIWUJFJ:*GY)4WE%$Q9.R_H[=7E. M=C^A2QH6U/5WJ>`A./T/P@0C\%@'C#ET[RIUI;;W#9+X6*]%XT3Z>!,M)&\B-T.I/VZ@3]L M2TXPO)>B.2Z[KU!,=EXQ"0<%;-*+>DDTXT`@.YJAS>;8$+N1'``!-U=(-&!@ MY1MNTW33`UYI*(_T\&/0H^OV@P[WP+H#Z#2IW[BM]5MS+&ZLO4VI;U+9W0`R M(:117VL1Z2!18YL-%^P-$_L*6"N^Q5T65?\Y;[N]V?TTR_9EB1ZO;HZS* MAB&O*IZW<-Y0Q*_[1<`D_;>[MY1G*#PV8.4+6=>*#5Y:W.BNA-EB,]L$*2)#O68/6^H^`L.$VZY MU56U3@;!>,J0<9^S*;8\A-,G0)X>]-NKI+HC>]).JCN2?W/-%6BS(,K6+*DQ MD2`3B::=Z203G;7J+T$SE9W%.298ZJ@:'^?`C\ M.7D?_USC>Y8,K3:XG:H-\A5,>(V\7"?[`;>0=SIND/A?J/#`W.5R*T M)@8_P.N&G23`DTV::'YINOEKA:1! M7ND1JE=JU5=ADU-L>G7Z_?ORJ6S;CUSL9R3WP[FIOE2J;RJW_C^LZ]92+)F* M7FOL_6-::J"]6$DY!L!`48Z8711?)WI/K>YLQD?JSL+_%Y]34.Z$;]O6;P7< MMAUPKAEPW0;2^>;2\Y_>TY',I=9?UX5KJOM>-ASUF^(KJI=?[!Y=G%W_BJ3_ M^L%D,!K]1$,'3PAMG2V\!,F-)CWA&>V?FJ;*H'D-?@/L8`9]=07M`0O8"VT/ MB-8+5.^%/K-&WEK`O%-K]AKDO8Y3:P;H7QZ:76L"-=8(8>RZLUI37Q745P7U M59O2(\=%[!1KX*)!WGHZ!A(%`XF"@43I(J0J':T9R"@8R"@8R.B.52G7E`_Y M=RA,:Z;47S[0JO*JR+:.[,ON.M0?Z=Y[9&]W/)^7(Z5""+N&5$Z1I%QY=W;X M2%^(7O0GDG)B:C"//_0$R\NJ2_:WE./%4H14H*8I8UG3()EBA-_E6%E2I'BQ M'&SK"BNRZ7.;,@,W*1Q/:[T\<%&`_"))WA.#7NN9`=K\'9.R-47>%A<;$P:9 M,&Q-NW"U3'W]8S#OSC]6-V*'F_6WI!AV&OP[#78;K7WIKG&\:-4$*+V\;$Z1"4IE"BADSM!5ZK='14-/X% MS<0?OMDR4X['RS,M-VMH7LM;5OZU>I3$J`C[,@*8=J&YVV9YW62B^\TRE$;* M;U>(\7HU:-_R!&L0L(X"UA9TO^T)DW5/**[=@*U*(DR_*";?B8762/J. M-N]40P5A,A%NFLB2B:RM`H-T[`2@?%NX06_]:PK\Z/.6 M$^ZA7^(P^V.2`GT]$5FKGX,;'X"JOPWND^T?8=#/(&9C0T(^;F']TQN+W,"V MWP#E\>NH!T.MSYQ&%K0LM"+S;=0*K0IMCOF(W5@%S>%WHV.U.3*&?LD9M\+G M8C!W!/IA=AG%X=P"/]:!+Z_=`?A&O#]%J1SLW`.4_;1]`T7?\T M_950&OX^`?7<3YEYYGML'_M)3N`N<]?X"'^,_[[PC)@5OREEI7=)/Y2?D&\I MEY6?J'>I?P@V?EC[GNN,ZSOZ47?$_9C[WXQCQBNV+L!+/8E8>"KC:$@A8122 M'>QHV./H1R#K'YT^.C,YUSYQ\=*ELV^[].#)1\YVC%]\\$SMEU+P;^.CY+<%E1($J>;#V%@@;[6"-G5`&EU`?*D,U48%*8A<$DTDTC?:@O>@. M="@M:0'>3;Z?L]\FP:'O[EX'6*12!9VM(@A&_:80A@&>` MMO:(@5'C&MMTYPU`R"&11&_[UT8(_1_1"I\0"F5N9'-T"!;("TS-#0@+3(T.2`Q,#@Q(#DQ M,R!=("]&;VYT3F%M92`O6D9:1T11*T-O<'!E%=I9'1H(#$Q,3(@ M+UA(96EG:'0@-#0S("]&;VYT1FEL93(*,C0@,"!2(#X^"F5N9&]B:@HR-R`P M(&]B:@I;(#,P-2`U,#`@-3`P(#4P,"`U,#`@-3`P(#4P,"`U,#`@-3`P(#4P M,"`U,#`@-3`P(#4P,"`U,#`@-3`P(#4P,"`V,3$*-3`P(#8Q,2`U,#`@-3`P M(#4P,"`U,#`@-3`P(#8Q,2`U,#`@-3`P(#4P,"`U,#`@-3`P(#4P,"`U,#`@ M-3`P(#7!E("]"87-E1F]N="`O6D9:1T11*T-O<'!E-KE>PMT6]69[MY'DB5+EBQ9DO5^'CUL698LRY(L2Y8?D1T[3AP[L1,[+R?$ M(0D0S"HIA9:AE+9`,M,6NN[0:9G+=*93IK2%"9T"P7T,`Z4#M)WKU=M++\&K M+RZT0[F4VY;20BW?;^]S),LATWDL9JV[UE7R^^QS=,[>^___[W_M?40H(:2) MW$P49/#HJ2/7]-_XGC_!E6\30EN.7G?:3_B'_HC]O?R:XZ?T[@?OEL[I[N-7 MW7#Y7_[LB0HABAY"LK>?.'9D\7^_>/VSA.2_BMNS)W"AX0'%'IS_&N>A$Z=. M7W_OB&&>D#X[GI^Z:NGHD6G-<"LAA1/X_O.GCEQ_C7!,82*D:,&Y_^HCIXY] MXWM/OH!S]$\BURQ=>[KQ[QJ_@?,#.'_FFG<=N^8\(1V$]+?A7,DF2BB?1?_>!F0<$>59$&M:91JVO2&YJ-F$"+V6)MM1%B=SA=;H^7^(@_$!1#81*) MMK7'.N*$=":27:GN=$\FF^O-]Q6*_:6!P:'A+>61T:UCX]LFMN^8W$G^$SY3 MT[MV_WONAWSB$^=)X]3<@Y1^=/X\7?_P^3+Q/$H:B6+A4.=Y0N-^_\C)\CEZ M&"="'!=B`;04<..\_ZS\[OGC6/^H_<63QG#+,C_CBV-GYI/\< MV3UW$G]GY@+G!N==M>:Q^?D^]*-D_2AY/V?GT<,5<@]7\![0P1IN4L4G_.<4 MD:FYZ;ES-Y==YP;+\ZY`P#]R[K&IN7./E5V!^7GQ&'^AB_NQ9^4R(!,X]=O:LZRPXX5?$P'E*Y`O@E-VC"(^!B%\2`&,`\YLOHNS$^L7MN!#,)S'<",Z0;V'E<`/")FN@@9%42K`(0X8`I M$#8%3'2YLR6EYQN3R\0# M%"LZSA./<9G`+GB[UAP)CLTKTKTF^>B0K[M6NE+F MM%ILINE<6@W*B)Q$-2EJ1+XKAF\[\&T3OAU2D0OH[&60<'#(!0!W M$0>H'90'C8/F02=!-X#.@#X)N@_T*.AID/Z@U'\&_6;E?C$JKA16I3D.K$(K M3JZ191*5&8D:-R0?K4U+19QXG'4DM;I2.=%+;=9TIJ3(]"2$),VTVM()&LV( M5H/":O$*-E."VC)>M`V"PIK`7=FK9S77+>:ZIOH"8G?64CQ@F;4H'KA>=),#BZ# M.1UG3VF$.!MPV@J*@+*@4=`>T.6@ZT"W@NX"W0MZ&/1-D/X@E/(_T'@1)!R$ MY-20'($=,+[!74XT4,;XMX>V]A?'AB9WMK;W/7GM3VYZWX_>=?RUZX:O?]<2 MH>MOK!?(]_B^M9#WWKH6P]]ZZ%O/?2MA[[U MT+<>^M9#WWKH6\_U;6(:;93GI4Z7*---%)JR6AH:!_F40H.C_<4GC_\",[IV MJ??:%VYZ[X\AJR[8:AM]$T(:6,:IP.=%F2&"&E:DMF8%O=,DXYQ-7B5/'J/A M!A6.C;`^"@3`SH",=(9.EB]<*%^@ON>?+^,_.MZ]?C5YG"S!5#J9O9":O1`9 M97NIB58JXY4#13>P!K(=-,`+4U-L?%QG8VO(*YEHI#'5QAK][.)\-$RNY?P M85?7?['^&EV`SA3<^Y$DDT%7JI&F*6VM/#=&VX3GUZS"S[G/BZV_+@C"D\1& MTN1;YTD/;LZ`>L"='=S9&3NK'(&$^[P(RQU`HZ`]+.T`70>Z%707Z%[0PZ!O M@F0$$B`00T';&>8]8,N&58X?`_!CJ.+'`/P8@!\#\&,`?@S`CP'X,0`_!N#' M`/P8@!\#\&,`?@SH'E(PPURQVM42NW<3M:F M!YT#`\5.M[NS.##@;#NZMUC<>S0:G9G:FO7YLENG9EA[+.OW9\>F9KAF]N+/ M(N2J)2+#9Z.,3QF/),D9ZJHRU4&F.LA4!YGJ(%,=9*J# M3'60J0XRU4&F.LA4!YGJ(%,=M\D@>FQE82HIC2#A`+*V$RL/(5&@0?*\+'9% M2@($+3!!JPT*=2`3*"ERDI.%H(7X+&T.9L+N[G"KK;/<&2YG117];Y7_TA#- M#0<"I2Z/6)Q.],X5W/09_T"WKR68](1[NY+NUN[A^8&)0#H>M5@3^;%D]_:T M*[+E`).M9_UU6H$\2A2R-1(3GXP1`'#)(G5)_DD#66BJLM!`%AK(0@-9:"`+ M#62A@2PTD(4&LM!`%AK(0@-9:"`+#62Q#'"9B(L'DB"NN'A$"D(#<5PW\K,X MI-2Y*DDM(^D@@W$SU7$S&#>#<3,8-X-Q,Q@W@W$S&#>#<3,8-X-Q,Q@W@W$S M7`[RY]KLCEBO M;WR[,$L#I;EL]_QP=&`HUAOHVYG(3&<]PJPQD`YFQUK#*5>+2J6D?SJF,(GI M@#\MFO>.Y/84O*[L=&;PD$$P;^M*C25LP>),VM<;<^3S[KBGF?D?-TORH4L% M#'IZF9<)-2?-'?1&.L6.QE4YG]-R,]#(9L!Y7TKGOOG>`V*P)7:\C_.LC]DIVU MPBU6DSQ!3MQ8]\JD9'-PQ%`L58C9[>\[KST1MT&NH-)TH M'2SY0J699&C<)D2$JR1N>5VV2WSV.&&*-V8O1NQPXW8X4;L<"-VN!$[ MW(@=;L0.-V*'&['#C=CAKL8.-V*'FXF5R;@=,FZORK@=,F[G__*@<=`\Z"3H M!M`9T"=!]X$>!3W-,A/852.TEEYE\SI/\LR^$L`=FVC"R,`7D,''?%V(M^UR M=DE6(6?D3R@G'NX.`59\9[KU\<[!R9B:9F2F(\ M);0?FL[T/>'L*`1\^;C#$>L+!`H=#EZOR'[0A]C]0P8(R1/&C"RX^.7@@H19 M0J@?TO-7I>>']/R0B1_2\T-Z?DC/#^GY(3T_I.>']/R0GA_2\T-Z?J80ILD8 M-!F#)F/09`R:C$&3,6@R!DW&H,D8-!F#)F/09`R:C%4U&8,F8SP+4'-/23;7 M4TTD*:=6RR0L^[QPG>Q9]I[NSE;=E:2";,YF@$8BM$[LS`IN1=X^_X%W1X?G MNM-[2D%/?B;;,V<7E).3Z6W48(ED`[YTV-HW^X+] ML^F>N9*8Z13^^+9>>L27[X"\LYY`,>EV=O9QS/-\3%#QVC+W]LQ3*6>>#2ND M/N.LMV)X9&2<)CBDQY>6Z%U+2Y7G>-XF\%SS"=ZWD8Q907F/",3B&2J/7)>053Q3#?0+ M`6L7_6U%LUPNWUHN7VI<95**9@WX1BE5;]9P)FQ5)3"HDMY7W/)BZ:7R/Q!A M_4T,?(?P#,]UP_*3U7J=R-Z20/X"FP7OR4739@6J[8`M39^^07C/%RHO'YFB MBA+]WXRV%KXA3BD3KZ[FCAWR``XIWU## MPM15"U/S;]M!>=`X:!YT$G0#Z`SHDZ#[0(^"G@:Q&,#N=W"=MB??*9_7LLHB MF8ZTU+`2!():<$PP*PP"2(R)(!C2R36%SLBD)]:DUXHVX=(S9Z0PTR!2Y,]U M:40DFE"(BMJW]W_=EXO9MTY77J#SF>F<>W0XG4N)QLZ>C.VOG_/V=CBW#M!/ MO*"VQR/Y/$VO9<7\MNCP`8-@V9W/;K-JM2JZ=NL;.E="+)8Y/CK67Q,^CYHF M3$XM$Z^L`Z\47;R8GQ<^R0N?Y(5/\L(G>>&3O/!)7O@D+WR2%S[)"Y_DA4_R M5GV2%S[)RVICIDJCK$J&.HGS!B/W^8IZA\/R])JG:17*"YJ>R<7>7>^?C;?O MNG'WF7L,"PIO9CPY>*#@=A?V#TZQ3P!@K@?X(N1\WXN::[;-?- MS#I-F?,$N,U2S1S^NN\\1OK(\IR&YMX(1[]_K@9]N,6&'14:S\X_\2O(4] MO<7]);^[<'"H;6MO1+V@S4T?[YM]_VQ'8NZFJ8$;Y^?I]5.IV8%0]E M-I0.IU-&N ML(+H(EFJ-\U(NWD>%'-`7;1CGT#??6*?4+F=SZ%_[0D;WKPG?A2V8 M47E^ZSQI2[*HA"-&M&!$RSNZ-M2.7KWP%E]/"RVGAY;3P M3@LOIX67T\++:>'EM/!R6LG+->,QR;,MPZ-+=B-*:T/"IF)I M4SYO$#[L+AX:&CI4=%>/"QU[;IZ=O7E/1_5(CV5/SJ33,R>SU>/X;2?Z^T_< M-HYCJ73BMII?OPSZTT""9\X3:[)^)0CGO)Z%PB2.5>!85>58A:FKP+$*'*O` ML0H.,42O65Q8+O0KF#I&: MR$F*J!`S\BK'Y,+/Q)BS2:D2!+7VBN9FC2`H=+:H;ZAP[>4=WWQE2]'56>21 M(645DTYG-AG1M21[LDYG5]3=(+1<-K1WL?+([\K9:,JCE>PU#'LY"GO)DX^P M',4GYR@LJ[/P-L>XL;969X%,+%696"`3"[\S#QH'S8-.@FX`G0%]$G0?Z%'0 MTR"F\>Y5J=?"*L]A0G4Y3.Y2.4Q#K4(5-T#?(&U[.U"3ZMAC"9JZ6 M9RXY.,6*K,],P/K:PJMK3R+=N%5X[]04[VL;9`[GA=*7APXI+]0:ZZLG&3E: MWG?SAE3@`9&H!B,9UFAEH?+VA87]AR]?N/OL;1^G`GVJTGOXZ-'#[/BQ#YZ1 M]JZ%8WS>CDV^5EJVDNJC@!D04XAF>KQR])^$;U_^%B#TI\*5:WQ#"YQ^',\W MD\R_&$&D?J0M!:EEN+AOWC^+),)___N%.X5[CG]:^),CCQS]K/`9C/6`'$BR MPMS:Y^0Y+_(8$I5W@+3)C;I.@3O4?)1&N059*](HD11FQ"CQM[^]XIN/G7[K ME2N6O_0NNE2YDT8KS]$ENA^EDDW2Y=AZ@2J`>37+]=2RS-5RQ4I7Y9QO(__: M7)_2C`B]BB:J^,I7KA0^4?[]X;+"?HD]C&INH4(J0!L\FL" MZP7R%3Z'',O7:"U?HW55<\/JICV3S9F4A\5#:]J$67R@K/AT^?<_8W=V4XT0 M$1[%[!VU?90-N4G1E$K2HDT7MG[IH=$+PJ.5G?1$Y<_H@WQ>'Z*_7G_XHOT= M#PUDZ*^W=7=S/E\6MI,OOFVO!EXKVGK+X![A^8]]3(K%H?77!:U@0HT]3)Y8 M)D79U(L\&W#*4N>QN(A87$0L+B(6%Q&+BXC%1<3B(F)Q$;&XB%A<1"PN(A87 M$8N+U5A<1"PNPAVQY<<0*7+O;4JR^O$\<4*"\15IM9NU4VBGDI*FRTRR.7G! M+\?7O3]O2/MR5;V]H";KM#KU:W=`B]L:C.;$Y'(N%:>O>EG;1IFGQ M6/UA2Z-:)\E^"V3?"1NRHRJX'U5SDBT/DMKR((M[]KJ5X821[7!)UZK[*`:V MJRYY?0>\OJ/J]1W\'ZOK\Z!QT#SH).@&T!G0)T'W@1X%/PGPQN\\JT((Q M5(C'2]$64Z38T=X?-;-0.&+SM6ABXY?EJFZG M=74[_8LY5:2P(]Y_H-_KZ]]?.'JM8:]FZT!;7\AD#)<2V4&ZD-@2MW9,'.OK M.S(:.7&X..S/E$/1\=Y@=L,>#<"$&9CXBI0+6>5E2VMU5VZ%[16]DSER:RW7 ME]K5'=I6_MH#*,E>?0@2*[?=5FZS1$H\F^'_J[FP1_9\'E;Q7Y0+JUA=L%ET M:>M-QE"QHQX,]`Z.F82E'C.5B[!P07BF\AN;SZSIX(C9%H]TC-9DIP`^M)#& M_F5D,E*F9#$R&9*:#"WRMA;AFSEL<9/G]*$:'TYY']+)HXJEEEB'V`,,`P&V M,(\L4%9^+I"55X^9263IWU2^+[1&,@&V$S(SHQO)QDIM+91^4+#F]H]DYH=" M@J^TOS1WFO9X,VTV6S3[0+K;G>P/)D_,Y=O&+BL4%L?:YJ2X3MN%[P*7.^OS M&6FM@,U>ORH=+=6U"<9[=7^GGF4B>TO65M7R'C'3DP5H;1FV_=#@H:+UZ.SB M8M"G<^J:?$VCXWOIT*Y3:E02BQPN]"QMVK)0EJZ]G-0N;V>T MLY4.1&>Q?O.%H7+35ET,D5MNU);#O3:/7U[^KKG6P53I"]F341= M=%9HZY\(W7CZU5AOT&`*][6W]8I&$QP>?6Y;1T=ZYY%$9F%KK+,KV#&6]C1: M_+987\AXTY^)^5$Q7.[Q^3/#P=!87F2^;A!_7H$?<++=2Z>L2@9(@^SWF.=W MRE'"N;&;OI%/L#5[LUS0F_FBF=-L7+:ENH, M:05>J(3$0MS>VU7Y*SH3&^EV:ZT!.S5!H*G9F>%RTZ<.+CVEJ`"MM9_A9Q+ZM/,LBZEO(U6?;F&'855>1]$*VM2>XE] M$#//PCMH,!*ULAPXN11S;[`?WJD((LL+6@@VA\K-KP5QOG>$-:#;"O\EOL MTC<+U8:_VCC'&S"7559]Z^6W$-@H;2MLC889#D;F5]G*<7RU5CDC!4FR/62- MO(;.F-?DBSDJ]]/AXEB++V9'ZWUM^9`I$>MJF]M> MDQGLQP3?.;)YC:O>?A3<%TF!K%7FCES*>BYI,WS"=19S;4::X47FZH'O?Y!P_UEPX.^OV#!TO]AP;]5$B.=SN=W>/)Y'C* MZ4R-)_.7C;>WCU^6SQ\=C\7&C\JY<@&YLNG_T5R9)NOSX_J\68ZU%^7*&=5_ M+%=6P1MK-R?+HY6WI\H<;P7DD2:>1]Y7S2.U_\EYI!:]VE:DEYNUM=Q1:DM5 M'F%0K\\4ZS/(MV>-E,?GS5FCZ3^6-5:.",^,;,X:*Z]+OJ(??W8(9KB&J%2" MU_PKYJROZK=1]@:-AAS[RA8V-:[^F3LX+8SA:5Z485F0Y45;.;+/\;0AG[6V( M:I7#VC[IK8@:8*/LE>6W;0'57H`\/2N$BI,=T9T#44^RW^\M=ODL_JC9VAYL M11D=S&^+!T=R8O?$W$2W/1RW.%-1^V>ZMK2W-$=*R7!WP*)6Z\V>5HNCN:'1 M$G`D!\+-)K$WVMWK,UF#`;O/V*"U1?GR-J$>X=/PY_LO_5ZN0GYOEIW;5B7= MT?K^.$0MO23($.Q<>0W_3]&_7WL+S)ECYBWC^'5MG'/SLW&GAJH,G MA'$DQII']01"&+V[M,^9L/`V+BM]Z_/@==YQZZDN7 M?^#&4]18>>W99ZGMU8<>8F_XK7=S7;$W$#9X:>$\M-1FWB+/7"5+1D>3P=OLB8F>LC#.6:CLM=DURDF5LCG0P^4/ M_TJ?P9B-J$WJ]PXWO[.;LP8R`9H)6`.M],N5AVFQOH)CA:&C M5;.`?LJ<0*:D0`-N@&9&S1&?Q6#S&HU>F\'BBYA'NYM;=$JKV]/8Z'%;E;J6 M9N$OBJ9`RO^P,^XSE8W>N.LA/Q!<;';XFA^.=/L,5"$8_2GQ$://WBSO2:YW MD#L5+9?(BZMKERR.[B@K6G[O4/Q4>L8..7BX'`8V[]77\ZZ6WZ?L7+EHG=8) M+4A%55?*9F7ZE!C,5'GNH-9T518VJT$ABQ/(*+^P:917G:5?!DCGDA] M+>-=JFN2BWDX+AF]E&6S8-\L!_OZ7S&_IIT4W@I(4Z"(`=5D"15 MK+\AS)$N7-]-/\R_WTUWK/\"W\=`>T%VD`?D!HF@"'N>WP?"LPGV/#_>OOZF M<#^9%+Y+.H3'<#P**H'>(!T8:Y=P-]IQ,JDX3J9PSP[AM^CK=EQCS]Q.PKA7 MP/5M>(XH[B%-[(CGQMA\<"08HYNR7YW^8/UEP4%"PC39(A]#[$C;\$P)[3CJ MPQ^@%O_!^J\$-3N2$<4L&637^??L.3Q#=Y!^].>C!=+(OD/;(/R&F(0&THBV MAOZ(M.*>+CR_`T<[_3SL@%$K9-G*W^ETX]\M]`"]E_Y2B`@SPN7"S<)=BF'% M"<5KRF=5;M67&TZK$^H#ZGO47U5?4/]&$]&\W#C7^%CC+[5>[0/:I[1OZIRZ M1=U?-Y6;OJ@OZE?TOS'$#=L-MQH>-OS$\-OF4'.Y>4_S%<8VXV.F;M-*2V_+ MA\Q9\^WF+YE?LP0M1/3)Y[-W'N"_@G_4_9[^7O,1GAK__V,!_0]D$LVCF/[5H0:YC MX4O=-N1/#DC-P[>Z_9A-"+EJ!/&_#8EP#/5,@B0A\Q3Z3R,3R9(0HWS"/\=;7!E("]&;VYT M("]3=6)T>7!E("]4-J=6'ML6]49/^=A_*0T&;K\_W.N>>>\WV_[SN_[UP32@BQD_-$(*6# M)V9/D7_0.]#S%N3JP;.GPT3[T._SWT.G#I]HDE^\K+?IGL/'[SOTK?>__20A M[&^$.(X?69B=__O2N9\1XBIC>/$(.BPO""UH7T2[_^+4/0NGEM&/]BK:)FXHH9K!=F(AO^!SD+U&SU=]&/FZCT#^_X]I73-# M+,1*&D@C-!O98-C81!Q$)-QW%VDF;@)DB`3Q$`*_4N/+I'&B_"*EE>EENO;P M\@@)O((9A)D[T\N$IL+AT:,C2_0`&BR%CF0$FI`*CRT)L;'=964ZO!A>W#J_ M&!X+'YF=7S+%M"MN+"Q.J^$ELJ=\%+^WE2-+I6G_NKHP/=V/>4Q\'I,VS^(T M9CAFS'!,FP$37,<@FF%Y<-%HL'EEZ=7'1OPA/M!XELDR) MT0%/^1@A-KI,2Q/:K9(2\?,.):)$8,?T".9N3(WO*8_"DLATFL<[AQ1YC?&X M6A$%>*#"537;'8NX(C%7Q$6KM?/T?.TQ\G=.V3M8_H0^Q=;6[^#$(/B\Q4H?2AV@=W4X^3_?6Z MI.=K>.U?S,?A1Y\U^K-J++.HE<4@1,@:9 M@AR"G(4\`KD$N0)Y&?(ZI&G_S6;R.RCO0]A^[F8SZ87IW"`8M@HXG#4#SG>L+)'ZR2-MS+:5/ET!-`3]#H`8KY(9K/ M!9GD<5BDEB#+YXJ]0>K-9VC!U9-A2M3!S%*+`TJ&%7J&6.^0D*V8LDEWI%6D M(.RCK:,M"6@;8,M&6@+0-M&6C+0%L&VC+0EH&V M#+1EH"W7T9:!M@RT@9\73,"G]#IYUD0TW0*TR&JVF^8S`@>BCH_BH'4X\CEZ MZ;M"\I;)S*:Y$24^,MM_^(+C,6MO/I+QV^V!3/0.NC.WM=N7'#\\V#\[ECA^ M.-L75/OEP$!W:#VG,NPJ^"=)?KI,NI"T'JA\>0^63W(3$.&V#US9X;8/7-GAM@]&V#US9X;:M[;8/7-GBMS^[#K#Y5 MU_7LPC[PP@PS\HB;808B`3`EUP-.GDTB"6BY0V_("YY#7BGO4EQ*AMX(%GW. M+JM*1`TYF@)917^_*Y6:@H/JG)`'0R&!S*RG![X MTS"[6OLTGDAOF^TISF]/QY(Y)^+;9P^_F>ZP9^.]N3_0,^8Y$US MPP.S8_'8R-S&\@/!!ZU#78,EVB_&H]Z;+@[>-95/;IWO'YS?DIC8[^L:TCF+ M_VQ'7#UDIJH5,FZ`@,4MP)C@ZEXA.D!*YRN_*N?$$I]!3S.6^!@V\)4$6:K,S-M0;\K5:JMT*+NS-]29IDW:ONC'[QNPC=>*7AY"MAY"!C&MZ+K%N#:N:O6D MJB&O#X0-!25`L?P;E0J;/'-FXOHU9N:Q^6QN_^=C8UZ]H09P#_HKW$0,)<9S MP@3R+TT>K.)'?R[MY"%L6@]A`!M$WRI&"$&W,=QW:@3,>]7Z*@Z('S9W(*/Y M(QVXV0"15G0]NL(?;2`=>+1*4H9F8*MO.>D+J@ZTE@16I=!?\80BMJ@BLHI5 MB@6#2K.I(N?&.HL[O=*N[OQ.F3'S]6LT%5=;&[WQM+?V'@W[U)BW)9IIJ[U+ M]^8VIUIZHMEXJF.,K.>+&ZFR_>OSA:EZVU?W]G_,E<(-N9*>0JYP2[^0*UOT MNLQKPT;8Y09C_0;08;%.58=0SUA.XQIG:J<[<";AOH`S"3@31VO(6<@CD$N0 M*Y"7(:]##,XDX$RB<68G9@VN:BQL)K_'WOU0(U-,WPBE%=()Z8-LA4Q#CD+N M@SP&^0'D!<@KD#!8/#YV<./&N;$X9:'!3""0&0R%!E195@="0_.; MX_'-\T-#"YL3BAN>B[KD( MS\6ZY]P%$9Z+\%R$YR(\%^&Y",]%>"["B_!)&<:2>5[0&?(F),?B_R:3J#[H!-M;W#(8UHNQ6ZH1QPW[/]"/D@_ M@XVG%AV(9@--]H"J1-4@O];>J;"V7=F^R3Y9[B]OS$ZTL?UR>C`4YNBI0&\P M+=/GKX]]'$^DMAWHZ5VX-1-/#AM[@GX'V$FDNZJ]/G#CI/4]8'"\P]CA#HWC M&XBCGO>ZJ1YO(WQFX1'39U#.Y/)B5*"W[AULMD?$:5$T/U\SVBRV947F/^+Q%G[)Z=- MVEY[#;09[`!M4LZ%0@=L$A%Y?1V^Q1M5O;9O4*OZ&[VVNQK6-8>A86VW(AA? M=QY?]O!/'I]AY<4I-G/IV2?*;!^6?8;>67N:SH"W[Z@]AW>M:^"9)JPI(4U1 M++&.6ZVOS==S&W.;];G='JG%8K7$$Q+?OT5:>.>)N]F9IWYN\UTV']OP@\)[R]EB`!TS=K%];VFHI?^O_"2_]- MM4_8$`E#XNR@=@W0[:#57:1(<8[A(BR2?M[&?3ZF2!^&WHIQ!XB%]PL97*UK MUS"_C&^&;",':)`NLC`[R]X0/,*(<$#XHREE>LM\S'S%DK(\8'G=2JRZ=5[4 M+H83,3.\L'%*9T>-?V,H7B-U'RS8'V1XQ^[;=HQW;5DX?G;A]-&#LSL6SBRD MAT\>GU__/V;MA_P]_2L^7NT?&2?>C3:1$=3.S60+B'Z\@D MZNGMI$SVDGW\OZ'_`I3^B3D*96YD7!E("]&;VYT("]3=6)T>7!E("]4'0I"B]4:71L92`H475I8VM2969EF4@,S<@+U)O;W0@,3D@,"!2("]);F9O(#,V(#`@4B`O240@6R`\ M8C0S,V-D9# Message-ID: begin 644 QuickReference.pdf M)5!$1BTQ+C,*)<3E\N7KI_.@T,3&"C(@,"!O8FH*/#P@+TQE;F=T:"`T(#`@ M4B`O1FEL=&5R("]&;&%T941E8V]D92`^/@IS=')E86T*>-K-??MSY+:5[N_\ M*U"U]X=)66+PXFON.E7V9'RO*XYOUAXG6^7QW5`M2NIUJUONQXR4[/[O>PY( M$"`)M,@&-=-.Q:8XHP^/\\!W0."1(+FC&2B+Q^@+_U-[+6 M0(1&``2_$B<9Q7\(_N_2_-@@60"+>_+U.\*3^F_"?Z4H8EH4/.(I>7=/?O\- MBREAY-T->?5_O_KQ3V^_^X[\VT_?OOD3^>'M-V]_>/O]F[>_(^_^D[Q]5W?6 MTW+D:YG)^F_"?Q.>Q$QB%V2_Y6_?OGU+_KK<_:VJ?B7O#OO-=EFN"*LW@!\;SN)"9(/"C2&0L\M2\ M6T4_-OUI1YTE,4]97A`N6`PB%D4!P'WQ*3UH?T=F,LX%*Z+F=R[-+]6:(64L M4VO$$A1.9B!!&E-KP-9@(Z.N62X%$QD^P7]XDN#(69;*3/6"YUF<\ZQ0O4AD M6L!(H:4BRYJ>X;MH9;U+$^@D_+V5];OFW9WU5B30>@^Q>==!Y#"RM(=HWEF( M0N8P,5U$_6WVTWEF(+!>@05U$_\Z"$V[SJ(M(A9UD,T[]R(-Z3Q""Q"CW#4 M2(Y[BZ$5@^>0-"5I!K(D]3/\77C&SOQXU'L>09,&+,WBPM@"3T)M@7-C"UR$V@*GQA8X#[4%EAM;X#34%EAF;('EH;;`$F,+ M+`VU!2:,+;`DU!88,[8`P1IP>,K"`*DQ!R2/P8"YZA0\:'PV&3/2F$1SN;R# MF4^TC`%>PCIX:1:()RS*1`.QF+5(B$`LJH:)?T5K'+[C`PM1FK1'[<4HVE>7O87YUEDV'?QH(+1J>*C+:6D-9<,09(:2;'' M$*1F.:?U]G$`DB:@M&:>(4@-Y:3UMG$(4K-I3.LMXQ"D9L.8UCPU!*DAJ+1F MIB%(S48QK;>)`Y`TN:4UJPU!:N@LK7EL"%)#8&G-7$.06FM1V\(A2*VUR$!K MT727UMO!`4AZ,YC66\$A2)G6<<610Y`2K>.*%8<@2:WCB@>'('&MXXKYAB!1 MK>.*ZP8@:9)+:W8;@M2N+6J[-P0IT3K.`]<6O=%+:RX<@L2UCJLMWA`DJG5< M\>@`)$V@:.**X<@)5K'%3L.01):QQ4?#D%B6L<- M`+/(+FU9;@B7RBV\/)"Y,`LK#?3K+751K#@Z74];!UJSZ^@T''O#EC;;M2=V MZM)@91"AJ`U@F*LL(,RR((&P1PTD/L\`&0%S)RVDG`>2)P:2)W-`XKDY#8G/ MYX!,"@.9%+-`6@8IYS%(:1FDG,<@(5PPD'06ZX&XH87$YSD@,V,]^#P' M9&*L!Y_G@)3&>O!Y#DANK`>?YX`$,$JI)2/]XM1-/FMAP[BC`]Z^.'6/SP;/ MC$7Q4:OF\Y")L2A\G@-2&(O"YSD@N36A?)ZYI,:B\'D&2(A;6DA\G@,R,Q:% MSW-`)L:B\'D.2&'6(WR>`Y*9]0B?YX"DQGKP>09(B'.H.0@"N.V+4_?=;8Z< M]\#;%S-P^L10^F061B_`G"+M^N=PT\PRIEE6)V-)QHZ:BRF]:QM45]_ZBYFM)<&.%1"G8JG7/`,'?W(:T=V+[]^%S'67/YA!`-Q MAO]2-W]X>_/GS>;^OEKO=^:24;?[21)G(BVB1,30C6=[3T;T/AK7>]+K/2^& MO;^\[-Y/8KC'GN`]EJ;?(.8L!AH_H>-1Z+1;'8^*U-MS4JVO+S4DN_]LGB*;K9R$(3^?O#ZO]LB,'0OYY^7&YOR/K M:K=?KF\O_QM'6`LGZ@M'I+'`:S23A3/K`%$XJ7"-[U\((?_2=G\@(-W]GH"B M$.4:M>9UE4L)R#>`O_SPU?_Y\U?DL#N4J]43*UBNJJT:;.0V)'V];:PW?D%AY70XUF^O0?F6-TL8Q+J\K[Q>F>&35KEH%G^` M?8NZHS!S1O'ZUM`?P(K2'T%5[L6;NW*[\_D#W?5S\`=%-A3!S6&]V"\WZ]T% M^5!NE^75JMJ1Z*@34]OL<'+BSYR"=Y0(=MS&IVKV1Y9J4V]N#6G(? M-KNE,CQX59'=W6:[]TDJS^*"OKBDC%I0GKHDY=#(F\WF/[XNM^\%3X2\*O_A MDYD>02VS%_/@XV2&-[G[`SFLKZOM;K'9@I3^XX(\;)7K_WBTKT_"W&Y^J_%I98HB#'J5:J$]6NU69/7EABM%:VAA1Z))3GTXCPD M5CABWO>OOOCB_>]@B%ZAZ0&\I%NT5`2<<#*6:Y3K1AJUW,#MKZ4E87CR4ZUB,+,\';N*E>3OL)#]W2\G MW?5/P@F]?7?+J9&&LI2.E)3XAD*Z*A>__G;8[/UFI3.8G$'0R(4C0OYQOX6Q M^()%P8LX2P=Z]JD=H>I]XHAY@5-P".=7&_)QLUU=PX_"$SNV(SF+33W76':U M)%#?R+6*JBX;U7+*)A(<^I6=X@/ZLHD"!E3+)K6#X:B5C5P@F?4Y`MW_(Q*) M`I7+_7G4L14O@.THZ:/T0AAPW?)UHZ(4-OYO^:)R+ M_FZY@Y';LH/>"5/ M;-85J5;5/6Z?E60%>+YIH!0$\*D6*EK$.1L["^]?/0)3>MR]_YU/077?/\U* MY>N\9Z7"2:]IWR,I]VH3\V:[6>\O8$ADN5,O(`#;D\V->CXB)+"/F-*SX'Z" MY2[NAY)Z@O__`_[_\R_$*S(]DFBZEY_U:X?R*8ZQ1%IP2BC;"@SP[LCRRW,6 M"T_0&\VC@.X[?D,7+X0C:OR9`"=ZN@"Q_&*-(+(%HD<0))`H5+<:@>`8HOZR M^]L!HZ4K\/2_5N`6E4GAIYRRV4PZW)9;<@/A$ZCAZZ?7_WC]\R^U_D4.@64L M3L\C[A4)=PF,DS@F+.D(K&-!>@3GL+OD'(.R'UB7]N5RC32\).O#?;5=+LBV M7-_Z=FAYRN+B/.);D19.R5P0J823^H6C!W$6PG$-8RB(`(:I200-Y< MGH>0\M0E)$DOB"A03/!WO6+2PS@+,;D&HH2P4Q'N[0:BC8]K`N[N(T12^-_# M@T\^.M?E&42SDCJBV7>'AY7WRR@!G<1[" M-822/)3++5C[AW)UJ,@E[I%L-P<()-1V%O#07=598GV*QD6=#/3S.P(I,J^H MD/GXN:@>PSEX`>S:M,1X7ST>@S?9.;>&@.>7Z"1=WF'_U*?TU^1:# M4/A7=5MM+\@WJTT)/]?G!"Y(M5^T@XTZ4F*%C!D-W,\*CQ24E-3%VH&48NHQ M];;K;CE%GRI0JTT]=X30'6G=X*[6C+ZH:S_](*\V=R#?WCTN`66 MRUB>QS?9A#K"4Q;S2OA$IOM^#M_XG+W?+9;U@:X%66_V2B0$8M`O"8%QD4?" MZ/\7L/AX1*,S?I^!QTZX(XI["V$W?L"L/V1Z'#=^JJ;BQ<^JC7$)B7!$.U]Z M/C:T_3X'HN;L>;.%_27N%);DNKJ!<$UI&+J(F@QT9!)9&>*36,BS<-.)RA/1 ME\F7/HO7'3^'[PVJZWVAU%]]R)>-5/!,:KE=[E`J^C#&MMH?MDUD_?5FLZK* MM<\#Z`S]Y^`!,D>L]EUY?W5=MK[-YP)$$A?I)SJNBG-&\[%[\.]?O7__>/D' MYA`UKVU8]OOOV6?`!&W;@$]0&A MEE?ML7U*QW([Q,8+_^*S'&:GCG#G\@\^SZ![W0A)=SN:BPBT3:G4<,)W(%KT M>SR00TFVR]N[/2FWV\U'(`/-V81&-KL+8N0RAO$?Z8W((1;(6:0[)L?93'UU(Q#@^#KWY/'KH M"KN_*Y\V!]]UG8+C1_$\MRUH;DZJYRFO2]2,^K[''\(=")_#/ M*.4=@<]DS$$D1:2;,8:#LX7]_@;+>.HYV_F M^T1I+&^2D+]=XQV2.M18[O3)I_T!J.&':O6$7_N7Z^OEHMS#YJ8\XY:9DPVMXWVXQC MNW_"$05O]Y]5IN8HW0:6LNWR&M[C2;J#.D57/3ZLEHOE7GV!;:[+3%.C8]T: MJM&NNE^J8[*[N#NCS]:GB];]VG2BGEM:U/]@4<'FC^TG?2/9JA\7R2*/)0)C M_3B:<.@NR"A%8=C5!TE3?7`Y;I=!@P[*]R&Q33@JM^B7[_NN>E1V_.,3".MQ M>LF^XU,2/3LE@H*WSF1!GIF2:,*4.$#M*8G4E"1Y#"$A=TS)V\>';;5#SK5[ M5D6B:?-Q7$4P+(8NX:7OG(2I2"\Q\@!TJ"(I="AWS$?TZH_M]D!O/C"5899S M98)%D=&:<_&,"$IUU$ZYV-R(LX[4E&O^L@XI?(GF2L=Q8B MR_+!/.IW-B*F5.S/H_7.C6CJ$Y*P^H31T$14_9,Z-S5)F2ZJI%^,+2MR'+P<4SKU&GH60&W"AI*PBU#>4GXD9V?Z7L MS6]"V335@%K M&TKF4#5.60_7-N7350WK[G94C=,Y5$)5W^VH6GWY+UC5F.BYGCI[<+"JL;[< MZES"P7K&^BZ8C73!S^A9GO1@Z2PK9]IS:-UZ;M')ZUM_F1^7&O@Y+]E;C.=1 MW*SG(L4<:MLM]Z:;2@,TM^`M?<+'C(5A:S[BC40!-*6ZT?6S74 MZR28\8.!YB.-APB<]-;7B!""0ELO3P.=/&U]/`UT\;3U\#30P=,Z]*V11!*$ MI+T[#5PH:!N&TM'QIP])F,)"08L$;=<(&KA$T#:XU`5O`I!H6^8F:*FA[4I# M`Q<:VH:,]*18L0_6JGG8FD7;L)`>BP?'(=&VJDR@FNNECP:N?+1=^&C@NH?I MCK.V@DN8V[0KN(09<:]\2P!2KHL4G;YV0E014;UTTM-73E74)$I8N[2$X*AE M,S+%6D[&J1?-B(9%7?9G*%.LY40PNV9)DR->CJ^L\BPDRPTDR^>`A%6^A<3G M.2";).0*`%-1`"CH' MI,B,8$0VBV"`:!C(9!:-!,9A("6;!9*:N<3G&2!Y9B!Y-@]D4P]`08ZJ!_`\ MI&6*?!Y3Y)8I\@!3M"&ID3BGLT@QM1;&>=9%9BTX\[@URZO-(A9+=V91'>/0NF49AB=! M\#!"QEZF+(.SE^/*,GS3')$FY0,>K7/>QU'`-ZVM1H4!T?>Z_BA6102$^-AMU#N:C(5;7_6%7K]M1ZG5CP M1AUR;),75^UQ,]([?V=43J8Q3TZ14Q0ZVL']:\?%I1ORO_R2TEU_R8N6(W1, M22V;F]I@JFL\4FP+A;Q_=778UR>,+\O=;K-8EG@BNG\%P8@+@^?T+,3E MJHKPB,E\GWSRTGT_!WFY>J_OPF%>NN;Z*":&A>YI\:EDG3[1\!1$VC7SRZ_R\J'J,,X&8+SB:FN6VO*S;GOK5@FNRJ8U+=&H&Q+&;Y60C,5?+A MD?S]YN]^:>G.?QII@6X(.EI:6ARM`^Q)J\EY6XNJOF?FRW=KI$6S6!9G(2UG MN8H;K,G3_WT+68RFY&\:"K!L7[0,9;HU3"Q#JQ;ZJ*+XA=8 M?LC(UN*".P\9Q&H%7%BR2POH(_\<9+!;"B)J?2/SBJOM?"LN9^^CH&N6YO47[;SAG3*/JQ]-!(Y+J_F8N,YHZ1V'>XC_++Y^<)Y,,D)]O75VL&U3JP7N6Y_H9X<"?Q+GLA@.*!II26.F2^(5F-0](,N2!BNV%G9OQ?XL@28K'!F8?!K] M4.[WU79]>5_N%W>-;JO$IUK!?>J=T"XY?E'UANE5H<<1];;CSHG:T*`[+L6C MPBDBM0LY&HIXCS>,L%2QQ MV<[C%P)F+/&93Z-,T7'"^VGB$TP0.8A/-C>P!D$84G6#E+*.6_2:1,"4ZCH" M0!V?P)9\T8F^QSB=*7;'&P4QQ7JON@E/HDXEQ')?FEH*WCUW(N"7&1N$R)_: M[:EQN*JW?7U8KJYA)6)?<#38[:&7K=EHH![(2^8V&L'=:PUT#>6O*JFIVAN\ M@E'M<>=)J5F=0.NZ(S$(RC#E>^OF?4YLJOU$XN.%!UX.'(NF`\<:O2(WY)%\2;9WNZD1 M2[^UJ.5T8`DR8ZEC3,OUQ%7/.R0\[@G44;C6"JN-Z(2!N%/S-/LNQSB<5J11 MF6RBD"V7;I^CY],584EN8\T@]+J`#6Z\J*T)7=H+LU&K-#$5N5U^@!5K7*SL M[M=SV4<< MA;=)3.:09YQ'IQKGF&G+)7B`G!7/&&?0W+GR9OF-,VH5JC%.ET:%,R;C"OS= M'F:/KC#%**:14JF;[G878)V;G:I8=(!U6J4BQ)`J)N0O=K2E_K[9F@GMF+6+ M$>FRT/LQW MZ`0:1TC)#,[#<3[;42DH<7RT?;-97R_KK-*^SP]8W(32E_[\T$X8UO9ZEI8F'.B1CEP32G%WV+%U/HV-1$>&`'^;B\+AR%&+IS$L?RL2]3=U,ZPK M$CQA#!/=/)*$HWD)CREL11C M;1/3D4Y4MCY^2^/Q;(6]6]K;R)RXD/O'D6!ZJ92[-LDV-]/VKXY-UI#*8Y;- MAW(/?^$/:D3TM)ESL480M2.E)S3&=&-LHNWX.C=G/(VC'>N/I5B1_IZ^0"YX6:Y6F!RS1,:H MLA(OL:35:@5='6>ISS?/4J`T0J9M+\QW]5;;/)^VVQ1D9[!1)*7CG/"/U6^' M:KU023AK.N[?M&194>\VUPN`A/G*`G>,(H_9LR(NTK$[1M<;,_NC/)@7'0)3 M*5DN'%^V4<7)OUZ2Y0:C@XF4X\APW%F0VR@86BSMC>0H=(@N6\(6\9!&G5KW M<>)ZT#3E6@\2ZDSQ/&T%]4NK2?'<-F-4HBZ1,-><2?@;'%08&NJ[1>^I/Y87 MG5-_`I,!SAN*M9[KB`2&BMR)NG?+Z^JRNKFI0,=`]*C:AR9=[\3%Q*]P%$8D M9=[:E/&>4VQIQ&!%&A=.]E[37_W%=MKYAZ.VF_9;JO3^*V1VN=FJIVNOF.E0#OQV:O:&;Y1;+*Z^KJ0SD2)D,AXB9X+U?F!CX314IM)O9^F_MG.8O M$Q^@[/GH^*`]@J@4[Z&_,;K*Z3HG] M616OTRR1+9/5$OI3KIIJD^!/P%7>S=@QD4:#PG>U9=9[MA<$NJ.(>VN?L4^# M.5"*]/-K<%[X-/C]*_Y:O'X"IGA$DYM1?`)-EDFE#>X\$S4&5_GG,ILUI']1U#=5:4L"JVH]NY-Q0EUE^^) M+&](]Q?FZ]I0G=O.F!6O_FC93*A'F0L>\YS3/#+[=^QEPC<&&B:+L>&;VKR; M])GO"'Z]>1>%;-X-VXE.W+P;%=\;^PNRJF[V^+/Z1A%W M/T\DB8"`B-<)=W.\,*#+3Q0TELF@_(2J^Z!_IU=^(KHTOU27GT@DC0MARD]P M*6.19:RM/^&I^-%$]\_4G\ARZ$=BUYJX5WV3TJY)L;+>F5H3YG?M^A/M6Y%# MF[2+J-_9B'B5(@EZDZ3<0GUHJ&]='!Y+U%W*O)Q&;6?P:6]3-V@0.,2MQ_'3?)N MJNXHI1/GUU<[@_5J4>39#+@P^[)7,R*C)^)&W9H<_5H48Q,''M>SA/=J&B0C MTP@^HV<)%?V:',4<>B;SM%^3@\^A9S+MVELD\V0./9.843/J-)3/H6=2].Q- M)FP./9-].Y9B%G\FTIY=R)%V_(R>"=G3!Y&*.?1,\'[-$YG,H6>"]6N>\#G\ M#BS:/7\F&)U#S^J,L)V&\!9+482K&N?]LB=35=A3BR+O=UEQW%%=?D;;6-JO M1Y&S.;2-\9YUL%3.H6U%'Q:G/`I6MMXL1(68Q57F70U.YUCH(]9;-V4VAYL, M*G3A5%_&(,S";1O-*,V+/,13&IB&45H-)0&Z:V`:1FDUE`?HKH%I5B+](NHP M2G(RKF9^YD40\VN[IYF?U5`(\S,P#?,S+X*8GX%IF)_54#J'GFGF9UX$,;\6 M1C,_JR$^AYYIYM<*,HSY&=R&^5D-Y7/HF>S9Q72&YM8SS=`,+I5SZ)EF:%9# M8@X]TPS-:F@6?Z:85`?79E*GZYEF4JT@@YA41R4TD[+:8G.HA&92!G<\DWI& M*S3C,2_265:YH@_+Q2R+7,_FNHPG.M5%]#08IR`*=CPLZ_FSD.6-MGR$UD0D M"D`2NE:!HAXA2%S7*E!D(P2)ZF(%BEX$(.F=*L0,FR?%4.H2+WD6AM16K%!D M)`2IK5BAZ$<($J=M*9PT#(F*MA1.$82DN06M244(4JIU7-&($*1$Z[@B#B%( M0NNXVB0*06JM19&.`"3--FA-,T*0I):=(A8A2+PM/B3#9*=W>1`SS((U&Z$U M#0E!:O5)$X\0,-X6U0E4*REV%9L3.F62PBNRHG9EZMSP2K': M=Z=*TT[;/U%7^< M05^!R-GZ*ND^`O'KH#(VA[X" M";11\<<9])5W]97/HZ_`#&U]Q1]GT%=@B;:^PH]SZ"O017L&\,<9]!6H8P>5 MRSGTM>B`%G(6-M!=MI-Y/';78<^!R3K+X*BB0<]B=M;`;MV@P0F^*#2#X60S M=218/U8WJ#X,JA[?O^KE\=WMR^U>9;S!##V;C]7V4IUA755XEK-_#\&,'5B] MNEX%034.0Y5Z9FJ#<<[;",^//N*>@CTWY/5KTDL^B16?>6YW'T-"3-_2='[6 MI(VF-6B$/G,%NG=;P1;2-;DA[P7G=^5.)?6`9T$PD]*?UIN/ZSK)X:BCXV,Z M)&3,BSQQW/#$IL<=NA^T$QVY<&D:V"UOU^7^L!V5_F/,[(*0051`-8=7'QTG MCVN]AFB*9[9>O\CMO8X=B=>F_P/AC%?[$ZIYI/O?4H&O6VQA#-I=YM:]'( M,?3+,VG55FK]<=/\W%YXN[!RA^%(/7Z(LSB3'3_T$@G<+?W(ZK/8X^[W]5+@ M^<2E!U&+*YJEU$"?15K*X1G"<7'UDV3#JT&>[(LF3:GZDXDNZ4BOAC>ZL`9& M;S:-B]KLJ866QC&;1?=U8A*)CV>C)Q$)0?55X9O%OU=S7C/MBT:C9'X&O M$S-$NAES.^HC7H\9M2`,VHE<>1E2!MK@&@XFC_S2D2[/>"`MW$S6T:2X:52,#+4VU]X>FO;]L/$X^:N>MT=$7R=YI]&+2K-T>RNVU8[@2O MWI6+.Z+Z7R>T*L>5VAC5)3&@C3@G'B;2WK1ZR?10(^,AO$TY<*/OD+]W0D'% MZ.LP4.44-%?\NW'AFOST\#`R,!02J"<[T3V<0,C:^CVCJKY@AOAI_J"M`N4J M.,0YLS)96F[A'>CAE^0-_/O;]=[G$/1,?1*'X)TGIT,`][^]K'-N7ZNT^DI5 MWI%]^2LJBPI#L0@$Z`Y>WH=50Y;PKV14VO)1?1JZ@SK'A$H=4'<&/4.KL]#/ M@ZH_^69:]'BL#T/['_2A65$Q08V5Y@#_K)V3NCCP6FF"QV8$JR]`?J(@1D#` MELH7M)D&?YK-_`06\U=83/\&__]WG\WHF=)$[]1(:9S-^.9I@LW\-&G')#K6 MY)!^]-3Q)YU]H\G.4L)\VADF+\C?5,*4?_?I(4PG2SZA'NJ"(Z/T$(2HPV7%KX9]#"=^3KS6;E4T$]29]&!7U3Y%3!/]>)UG=/JL:5RNY5CX5< M6GG.T6]Z)S*:VHNA5BZ!*VX70-)N*\S4XU$V7N0Q37QA^MR:AO56\[&:MJX^ MGJ!L31/.T%;2C#KK?'P/ZO8]4+%WY*=^*=16X]J9>OGHUCM/SIWJ[U'=5LM? MJY[.-<,!Z5&"I',=G?@ M7R`/NS6%&?#NL=G)[S?7A]5$SS!HH-(TCC+4"F& MGL[>PHMZN]*M(-J/""]0WG"$;M6ULK%G6$@S7,O&[F)QC,A'Y\!?WC]LMON)6M9OH=4R@247TL)9R@:+ MW,5_VVRO/9\F]#Q%TY5@UF_-2JGRQ42!>YHCQMEJ'Q]=[7FQ*G>[:?OY1QHH0+`0\+K2JKT96[-DT(XC MJQJ/!;4+88[];A!-G3#W]P_,@+VY5F<`D,I%;NUNY'["%DPT^3NI?Q#1T8IG M#]OJ&E-QULG'ZK(>L6?ZHHDM._F[TK=F`KL;P'7RY?O#;J^R%.J-H&F,[EAG MA@D2'8<"NJ;+LUADKC!BOB_=AIM($1=TK-UBLNARO:BF?>KSMX&?R"`.8/;2U.-=]A24]4H2R'$98)--EXW,SDR:T>-]TL"OGWELUTM^(E1T2F&ZQN` MTW"UV)N\NE-;<\?B7#&'3M=V!C&'E(X/'5^7NV9F?4<$.,WBHK"<1C3+V3W_\H7G MR]C8C\;-)X/(H?.ZW\-S/9^!DDMU0ZC7^=7R?HGZ!!J_6*HTE:A/ZHOSOKJM MMCOR_I5*ERDHN5KN=]X/2:R`T):>>!)K?D7+V7"LW]9#\E#G=@`]8\'.14,(7#!JR% M-)[O\A19Z13XYR$KX3A,_L?-X:H?/QMAZ?Z_I+`ZJB&2L:OIM>KXYOR;OMH;H@WX!< M*C]C`+@\.1O1I*FC;.Y=Z:4+NO?G(1I7[_%\Q:HB/ZV7B\TUA!4P&#"7(VY- M4FSM7`22.[Y/_+C?#HK>6")I^G\>(G'U?U\][@^POM0%E>J@T\@%;`B"Z)]1 MZWXA?KO1V;+/(*!+J6.;_^OE[:W>^?)$=(QC$N]>1,>A83%[1#?B-E;*'&'I M^U?EQ55?"$;7]`",KHWM_@N$=LX!/)3+K3YK@I]:5-4H4#']A#N%:@>AK9[E M5SG&8EKT/,-G&:\2EW`$LC^7O_C<@NY\3U2?QRTX.Z]N9:C#FTV!F5HPI9(6 MKJG7NWHG:OU47RGS"HJR6-*S$53B"F*QP,B53U:Z_^WTL\BHC3WB0C_M?#(J1V!=04J)2\3/L`2DXO) M]Y^4=/">FG5#K>\,N]*:]EGD6+<<-SFL>?P?B%7:S0IE;F1S=')E86T*96YD M;V)J"C0@,"!O8FH*,3$R,#,*96YD;V)J"C$@,"!O8FH*/#P@+U1Y<&4@+U!A M9V4@+U!A9W8,YDJ$RB[&[IV%Z>F9Z9A9F=V=YM5HM:D_2G4[2[:WN=+J3LGIM MS=;L9'?W_?1^B2?B[Q[VNGN$^<\?=X?C]_ZZ+1#PE*]S.`*A2.A\3?WU&VWM MZV;\RC''4>F8ZW`XYK9UA`-G;]VZ,54[/BSK^+^-O_\#1]F'U]_=_=_._Q_' MG$YGN,/A*)LY5?L[IB;AKSNV;J@V'HV[Q5%WU M3^K]_UB?JSH[M2#L>VYLYPA]?A^-4) MAZ-\[!_F\/U8>MGIYS^9[_];_O]I/*Q_M.X?JK=_ MY7!\6>EPQ/ZEMRNR_\,GE16S'/^P/__)^&^]+RNOJ)PV?<;,6;/GS/UHWOP% M"Q_/6[3MWZ^[=?S`UMX;&IN:6UK;V MCDYG5W=/K\OM\?K\@6`H'(%@!,5P@J1H!K`<+XB2K*B:;IB6'8W%$\E4.I/- MY0O%4E__P.#0\,CHV/CCBLW;]^]__2SSW_PQ9=???W#;W[T M[8]_\M/O?O;S7_S:K__&;_[RMW[[=W[UN[_W^W_PAW_TQW_RS_[TG__9O_CS MO_C+O_KKO_F7?_L__*M__6_^Q__IW_[/_^[?_X?_Y>_^U[__C__;__Z?_H__ M_'_^7__EOV__?]_^_S]O_W\!X"\8\!T#GC(@P0""`6T,.,.`90#\9]KZ"]KX M&:4]I90X)>.4V$H+9VA^&%'C=QZGW./D($!8P[%^+ M_;\A%-_PV3R7Y+F8E[7K6.,04.;3_%^*$[_&C[SF!K),9^DP"? M4>"EBYFXS0SL9]*S:/6/8LR/;&;2I!,Z36ETCTK?ENF#(CV?8WX_JGYC*9.& ME-!$4A6Z%?Z6Q!T0V/DL\WMV_(>F_5@W8ZI.*&J7K-R4I"I>F,>ROVL5OS*R M8UK*5N*X'.V2S%I1W\?)(U@[^6T.8SPV^;S M'^@3(^J(*0\@4K%#S%P7$GLXXS.[67L6 M(_^F\>UGVA=#RCM->@Z)X^W"X#6^L)N-SV24WS!^_5/MQX/*EZKT%A*?M@MC MU_F^76QJ)J/^-$^]S%*%%"7'J7"4:K&HJP:U1Z'G"LR/\_*+C%1(BG*,#]E\ ML\E=T=D],IC+,]_F[!=I,Y_0I:@:M)0F0[JLB;LD?@X'?I3-/DNF1H.C;( M626OD7NDI2XHL>VB,1.(7V5>3R2>I:*/@37B,?KKM?QY);5-M&8`Z3F[38C-`/(7J1\_CG^5C'Y*62_<^D2].G1>+FX3$M-9 MY>T(.3A`6B42SY$]:?)^DCP;I;;I]"R)>3TB#0X(5I$GLEQWBJU+L&=LL$T' MLT3FU;`YT*^;!17/*%TIZ6Y#:;[2@D]'T4SEC-IW(UIIRUE MBRK-X+F7@WVE4E[+99!TLC,1NQ.U3YG&9D69SO$O!D:+I4$U5X)3^8YXYG8T M<<*T-RG:-$YX/O"\4)Q0WSPEET\;J0WRO8T3GHZ\'6A\)F$(PE^O$UZHT*3< M.2K>'1#/%X5]&7YUE*M40.IM7'QNAR?,]A']3K]VOJ#L34NK;*%"9I-O89KDHQ5Z_YY^^"(Y/M@R-W"KUG\WF=R=2*TRK7)+D;PCL!T3O6Z+^!7%M M@C@Q0FSO(S].4^4&(W_#8Y]SO6_9^N?@ZF-P?)C97F(^3C'E.B/_4$4_EWO> M2`^?B5?'A6-#_-8BMS3)EFE`_BJ*?FIUOS8>/-6NC"G5`_+6@K0D(92IK/15 M&ODTT?TJ]N")?674K![0M^25)7&I3.&E+TO(^USWJ_2#R>3ET=C1?FMS3E\< M5QR*('TY@KSO[WY9>#"9O3R2/-H?VYRS%L M'\E-7XBU;X4SS_BJ<6[=`+LPPSH,0'QG>W]H-'VNU;Q1SSR5]X]*:_O%!6G> MH7/$3U/>K^--G]DUK\W33_3]H^K:/F5^2G1H//[3@O?K3--GR=I7\=.3]KX1 M8TU)FY>2'9J`_V30^W6QZ=-<[]WXYU/R^=/-% M[LQ$NFHXOJYHS4]J#DW$?_S,^^58\[O!6R^*9Q_G#@ZGUA>C\Q.Z0Y/^+8;_ M/DY\B1.#!*$21(@@ZTFRFJ(6,?2_0:3?1<4?8,(@QBLX%\*Y>H*M)L$BFOE7 M<.QW$.MSU.A'-1E3`IC\$!>/$OP"BOU;J/A+./L>3A61N(C:?M2\CVN'"7D^ MR?U-9.PWH:&W4%\!S@E(VH?&[V'V(5S[B!#^*OSJUR-/WD3&\M`@#Q>]2+8. M31S$S8\(Z2]#7_Q:^-VKR(L<-,%"PQZX=!?-',"BQG^82K\GHD\=\./[R`#55AZ-JG^,8?] MA,.?L7B*Q:?PY0+$'4`>`N0"0/\A*WS+\D\!EP+3WF.S7=.HQ'8_2-DZ97;1^DU:K:&D>S?^* M'OJ*ZANC\C:5P:B$DXK64.8^2IU+";]-/?F"&ALEARRR#R5SG63J!AG;2QES M*/&WR'<_(%^,$),&,8H0_1UD_CJ9VD/:LRCIM\AO?D!^/DR\T8FG,#':3@Q< M)W-[R-@L2OXE^8O/R6^'B!^H^&L(?]).C%PG2KO)Y$Q*^;F.OE.Q`06;.EJ0 MA+>+^'6!V,>3\UCZ.Y5[HW#],JM*`!)!FP!N\&`_!^:QX#M%?RVK?9*BB%)8 M$%MYX1K'[V6YCP#[$SGU4HH7A*C(FT'>:.&T*ZRR&XAS&.Y;J>^%6,@+&8%/ M!KA8$VM?9HV=0)E%\S\2QY\+PSF^G^<*?C;3R"8N@>@.1I])B]^(+Y\)3[+< M.,<.^=A2`\A>!(GMC#F#EGXH_N`I_S;#O6#9QUXPU`!*%YG,=B8Z@Y9_*/SX M"?]5FGO/@.<>,-X`!B\PA6U,?#JMO$\BHW$T'D4I"W4;6+V&7U"('1(YAZ?> M)JLQYF=DA,G,XYFU<&;;EJ"F1AMBK"0\4_IS$;1?862QX M$XT-6K9EF+BF]ZC:?5DY*\E;>6$F8%]'\P-FQM23F!;O5NQ[DGE&U+;P\G3` MO[2'^LU^0R^@:K9+3M5)L=."M9G3I@/AA?VDSQC7M6%$Z7?*^;MB^I00W\09 MTQCQA?6NSWBA:9.P,MHI]=\1\R?YU";.KF2D%]97)>-337L%R9,=TL@=L>\D MG]W$QBJ!/-8'I_.(D$&"*;0UCMZTL>,FODDE9XC4:)%)Y1@A30>3=&N,KK7H M8P:]2:%G"LQH04IE13XE!!)\[[$+#6;FFIX\K$37BGHE*PQD7T933^CXF-L> M?&04KVG9PTIBK6A6L.)`]M-HZC4=?^JRQ^J-@:M:X;"<7BO8Y:R4&8/4(1CM M0[H+R(,L>CF)'8CA:PUBND1E1FEED$;[J.X\=3]#74I0!Z+46H.>)M&9$5$9 M$)`2WY7C[J6YBW&VRF;7Z*!2!.EA4^[7X8+FS"IU2?E"3-IOB:LUOD)@4T-) MJ2\.Y:.=&:LN:5R(:?M,994JEO-<_3D2MDLYR7M!41.PMXQN'$(J>E#3^70 MG2E\A4U4*K3VG"(G*>\HU3A(UI2HDSEJ9Y):85/E"JT^$\@)WC/"-0ZP-XKL MB0R[(P&66Z!,9J;X3XQK[B'E49]\/2^=2(O;X\(RDRN76.5)'!^+NH:L1WW& M]9QV/*UNB\D?&V*9R,F3.7PL[1I*/"K%KN7LXREC6TS[V)#+1%Z>',!&B[V# MN?I2^EHV<2P9W18UE^JJ0Q"DB7%L=+AWL/]AL7`UFSF63&RU[:6:[IBZ')]X MCHY.]`R,/"CV7\T4CB4RV^SX4LTH$T3B<\CW%FI]`=^:1,Z-(@?[T0UY;%&" M*--IXG/*_X9L?4[>GB#/C9`'^LD-.7)1G')H-/$I[WO-M3YC;ST&9X?`@1)8 MGP6+8HQ#98CWJN^ETO)$NCDFGAT4JXK"N@R_,,HY%("_BWI?6LU/C)NCVMD! MM:H@KTM+"Z*"0^;PMVGOBT3S9.SFJ'VFWZ@J:&M3R@);WSQ1K!W.GNE+5N5BZY+F`DO]$+V9]#P? M;9H8J!TNG.G+5.62ZQ+1!:;ND$7?MU#'E]"]3^%+K^#J)\BN471E'S8W33A, MVO\MV?$E>>\]%^(?*^;]*M'\:JWMM7WIB'AW5=PRHRW/RG+CX?91K_S1=]RIY M:3)V=,3:T6\LSZES8K)#Y?U?#K2_+]:]S%V:3!T=B>_LLU=DC;DQQ:$*OB_' M.MX/UKTL79K(5@\G=_7%5F:LN5'-H8I_%H%^#L.O$#B'(AR*>C"L#L\$U_[1AX'!F+!(A'.=D62-^'H/E2?38B_ZWGSE>_YN'\B&AS! M0WW.<*X62NU%K5F$]"O/5U_Y/AWSO[("3[#@B#/<7P/E]B*Q683\*\_/OO1^ M,^K[W/"_0H*3SO!P#53:@R1G$LJO4^'/Z,@P#9DTC-)()XW6TMA^AI@'J%\0 MU'N2'B)IDZ11DG92]$V*/D`S"P#SS7Z' MQMY@=A]F*K@>P;4V0KE.RGM)<2[-_13)OT*S130E8?$0%FW!S:N$OIM09E/\ MC^'AE\A``2F):"Z(IIJQ^!7$<4Y(LCQ@.2_@&@!W";"[`#L;@$]9:Q28<:!30'4S2CTC M7V"D'8PPB^'>@\P(DXHQ"9*)]M+60]HX1ZO;:'D&S;]E^H?I4I3.$W2ZAT[< MIZ)G:7,KK520I#?)B M7T#(M_#I6BY1S=KK@5;)B,/RLZ0TP8FC/GZ@F2O4L)EJ-K$.F!4?HG<)Z14K M//7RHTW<0`U;.,JFUP&[@I'RV8"9"E'QL#L6>61!UPWDB(:N5_`9(IE/8T82 M)^.X*XK7F\15G3BBDNMD:KI`YY)`3P`B!GIM\-``5S1P2&'62DPESV03JA93 M,%ON-J4'NGA%%0[*_!J1*^?83#RJ1FW4,KL,XX&F75;4`[+\B2!6<%PZEE7L M-&HFN_38?=6^I!A5DO:)(%>P?#HV(-LEQ,P[]K6"%5/2Q M;(W"QF"G5JI3LA?EU'XQMHK7RUDQ%7TI64\A8[Q#&[RKE"Y(V?UB8A5O3E'$ M'`B`8C"8"[5F(K>2T+D8O-="5^OX=(DT^U&FB`5R6&L:OY7`ST:)/1:Q2B,K M)=HH,4R>"629EA1S,\ZE-YFH?8BR3XCTN#LQ_"C:=]W,G]33.Y38QZ)1SHG,A#\R$G0.AN[UA2_G(T?3 M\)8$\K&%5R@4\Q@-CZ#.`?1>";NR M])$DO3E&+S7H*8HPHV)H0.PL"75Y_F*:/Y+@-MG<8ITMDP`]8H0&](ZB>C>G M7$S)A^/2)EME'2H=?,$[)_D'8]R5(?9XB=V=8UO@Z6?AJO'(YD%H21&9E<(=)M7U M!=SP'JE]A9QY@AP80S_(FI?$F4FR:H3E.-\E'KV*W7AJGQXS MJP;TS05U<5J>84\IA7>^RSUZF;GQ)'EJ-%;5;VW.&XM3VBQ;=BA34?^C%\6: MR>RID>3^_MCFO+4DJ<^R/G26?LOO^R(8&`T%[4@8AR).&+J)(E4$-IYE]\M"[Q/!/1KT]C?["U="Z5V0/0.7?]SY];/84$!#P7P<#,!7261/10V!Y!?PN@3!,NB M&(_B?@QOPO"K!+&7I#YBZ"\B8`(":1AP"/"AH!%EKN!@-P'FT.#SD#8>5I,1 MA8$D#RPU(.(E3-B)\[,H]M-@8C04CX>C=,1T0WH]K%U$E1VX-)/DWP6*(\%\ M+)2APDE7)/80LLXCQG9,F4D*;_UCPX&A:+"?#!5ZPYD'D<0Y.+H-TV>0XEO? MR^'`4SLXC@<'>T+%!Y'L.3BY#;6FD]);W^=#@;=6X#D6'.\.#=X/E\Y"F:UH M=!HI/P>>?L9G,@&<"78SX0<,=(Y!M@%L%DL\H^`2C1@TBM%8%XW=I_'S-+&= M(6<#^BE)%TE&)QF4HKM(^A[%G*.8[30S@V$F<3F/RRHA083820AUA'":Y+=0 MW'2:G<"BN:FS%V:&<;T=U^[@RBE"WD2*TVAN',UFT8R$I<)8O!VS;^/F25S; M2,K3*'X,&=8T6(,$N@NHCX!RC9$/ M`VDM(U0P;(Y-Z2!!@'@OL.L9\RJM'V;4-8Q4P?!94-)``6=R/4SJ(1V_0MN' M:',-K58P0H8959EAC!GHH@L/J,P5*GF0BGY"Z^6TF&:>J(Z'3!<*V(YP%A0VX0T?NJL@% M!:V2\$]$8II`61;!&41()]LU\HY"GI>H?2*U6J#+>=HT>*#Q095K5;C;$G=. MY/8*[$H>E''`T#5&U0**VB++MT7IK"#MX845'%_.LKH68]2H7[:;)?.6J)_E MU=V\LH(3RUE.5W.TDO')J28I?E.(GN'-W9R^@I7+`:^I@Y32[Y.*C6*VED^> MYF*[6&LYJY4#054>D_*85QIJ%$HU?.XTE]K%QI8#O0R(?,Z%I#V]25]](G`] M&CQAAG?H\'(5G2817#:,I",]":@^!E^SD>,&NEW'EBEXY=0Q3.-P$N^)XP^C MQ%63.*Z3VU1RF4R5"32;9*$XVQ5E[UO@J@&.:6"K`I9*P,$#D%`B,=EIR_=, MZ8HN'E.%+3*_1.05]%$YL5FT%_/:5`0/N=Q]GJ:BKS;G/Y,.'HB'UT>A109:H1#P8,C= M%VXJ1&JST-D47!5#UMOH(ATOETFH'W,5L:8<5IO!SR3PJBBQSB07:E291$=* M3&\>-&:8&RGF=)RILL%:`\Q7&8?(1(I2;TYL2(LWDL+I&+_?XM?JW'R%=8@@ M7#!ZLOJCM'8CH9Z*ROM-::TFSI=YA\"&"HGN;.Q1*GH];IVR]7V&NE93YLNB M0^!"^7QW-EN?2E^+Q4_:]C[#7*/J\R79(?"A_$!WIJ\^5;@62Y^T$OOTZ!K% MG"^I98+@>M+;_-A]:]1[;M!_J!3%D2G6WC#HWLF42:QM!;0^BY/O10'MN:QC^.$[,M-TXPA]FM2?KC&#W38!P*TSW&-P[QM?WHVCBD MU/;)9_/2P8RX-2%\;`LS=7Y**5VC=L.@5=MGGLGK!]/JUKC\L27-T@2'Q'6- MI!L'D[6E^)F&/E-5 MIBC2\J;W[DOWQ:>>HX_].X<#:_I"\W)090)UF&3CV^"=EZ%+3T+58^%=@Y$U M)7A>%JF,8PZ#;'P-WWF.7)I$JD>170/HF@(V+XU/CY$.G6I\2=Y^2EYX3!X9 M)G?VD6MRU+P476G3#HUI?,'>?L)>&&>/#(&=);`F"^8E0:4-'"IH>"[?GI0N MC(E'!H6=17Y-EI^7X"JG8*:P#<^,VQ/ZQ5'MR("ZLR"OR4CSXF+E%,P4KN%I M_,[CV,41^TB_L;.@K4VK\V)RI2%.4:3A:>;.>/K2*B`CVH*4%?"]"Z$GD707W3($UU2ND?@78+?RS?Z MN2LA;B?,SL3!YVW1\4XKV6VRO;K7K3;XE$M!:0D_\@M_>%M&F8\+[YFB M[`P23+K,@L=0?3KD5SN#RMVP=`82MZ#"=(*;Z$WGW$G%&X=\T8Z`>2>DGXJH MFQ%I.L$_[NG/NHJR)Q_VIMO]B=O!Z,FPN1E6IQ'"X^['V=Y1R3T8\I3:?-G; M@=3)<&P3;$S#Q?'N5YG>9Z+K<=`SU.HMW0KD3H22FV!K&B$-X5TIW"40GA#A M;27]M\C022JRF49F`GP(#2:P$(]%@CC4@L,W">0DB6ZF\)D,.0BC<03G4#R` MXBT8<1,C3Q#D)I*:3M/]$38*<0#B?##;C+"U*'L<8S<0H)("I9!FAS4ZHGH@ MN1&6;B!B-2JLQ_E*BBT&XU8H1H6C[HC9`.G78?4HJJS#Q4J2*P0*9C!'A3*N M4+X^G+X621R&[3685D&*>?]3(S!! M!$=[@OWUH?RU2.8P'%^#F5-1DNM2V%Z,=?>RWH>L_RH('F$C:UED.HLG@%\" M002$NT'D`8"N`/@P0-(5XBA0,DOYKBRFG6QFT.M\*XV8[K M=W'U`J'L)^55E%!.-_81VDI2+J=Y$^T':"F(%5JP M]&TL<0Z+[<7-E:1:3@D&,@[0D0`ZV(P6;J'9KEE"CI3D+M\2KN M)L5;*_M/B\'=8GBE`%?PN*CZ<"7@D4.-4KA&C)P2X-T"LH+'*GE2E"%,1MP2 MTB"B-P3L%(_OY(D5'%G.48)(H0+=R]./>+J&HT^QS$Z669Y!4F=HRVMM+Z4D8I8W@&#$7`@!.4 M[C'9*W3J&!W?2EM+::V,$?"$TQ_K:;-==RS/!<-W6`ML5L.+9;A2"BAZ6L8T2OE@DRG@*,4F/ M0;9HU"V5.B]3AR1Z@T@O$F@'Q\`&Y]'X9I6[J7#G).Z0R&X0V(4\<'``UE6W MIC8I2JTLGY.D@X*XGA<6)BE#AFDKMT:J5* MS95IAT"[DJ`USMZ-@HLVJ#;`+@VL5,#<*9@)P)646^/2W:ATT1*K=6&GRJ^4 M^;G?PZPW8;;$C#NV?L'4CFK*3D5>*8ES1<'!<[WQ9$LT<<>*73"LHZJQ4]96 MB,I<07+P?&\\WQ+-W;;2Y_7X$36Z4S97B/I<7G9P?-M(Y_VA[JO]O<>+[KTY M[X948%$\/,."'1K1,N*Y/^B[VN<_40CLS80V)".+HO`,$W6H1,M0Z%Y_^&HQ M`.A6H>0.M*V.4\=BR#[TD2&Z+$0HNGJQ]@UE32 M[N;5RQFE.BGOB4GK+7&A+DQ7/K2/&HO1NSG[W.?=WG>/SL= M*H_!#H.H>^:^-N$]->:K&@QL+@57Y,*S4U!%%'7H1-V3X+7'H5,CX:J!R.8" MM"(#STZ@E1]@1MU]#%\=14X.H?OZT,TY;$4*GQTCRDUJ"F9WQ\FK(^2)`7)? MD=J'I)/] MTKZ\N#DMK$CPLRV^7/_0/KHS8EP=-$[VZ?MRZJ:4O"(NS3;%KIBKA[:ZW;[O/5!_\5P:`<"S2#Q MM^V^86<@UA.D76&W)U+O@RZ&D!T0-I,@7KB8J3#U[D&Y[(S>/A MUL'VSN*=[NPI=V)CT*I$I3%?>\;OE(,]D9"K/>*]#?E/(:%M.#R3PD?=WK37 M+_H#X4"H/12^'89.P<@6%)M)D2.]4,H-"UXDY$-;`]BM$'XR0FQ&R.D$-=C% M)'H9SL7X/4R+C[D98$Z$F4TP,PUG!CKE6+<,>B6?6VSV"K5^X7B(WPASTW"V MKST:==I,M^EU&4T>K<:G5`?E#9`X#>-*;3F[,T-WI3P]\4:W?<-K'@UH&R)R M)<:76H>LCG[*671W9QMN>V-&`M3ZB56!BL772ZABGG,.N[M*CWMQU3_J( M/[X^;%1@4@9JTV$GB?2X4-+>(C(+\+#M8CX:MH MY`@&KR?0Z321"835$(2'X9X(\A!"K\+8811?AQ.5%)7RD;*?0@-T=XAZ$*:O M0O1AA%Z+T14DD_"(DD^$_8(SP-\/\9?#_$&86X.R%02(NTS18T`^W>G7[@65 M2R'Y`"1^@@@5!!OK30GN9,03[_!%ZP+FQ:!>%5%7(U(%P4=[^GA7,>S)M7M3 M=_WQB\%H5=A<#:L5N!#M'N5=PV%W?YNG<->7N1!([@]'5\%Z.2YJ5!M#.8-4 M=ROMNDU[SM&^?4QH%8"F`4S%W33A#1#^5C)PFPR=(R/[*'@UC4X#A(J&*"SB M_UYEMW#D'('N([%5%%'.4`J,DPCA10/23\'J3E1>AHOE)"<$\V@HVQM.UX<3UR/1D["Y$]&787(YR?.!0234 MWQLJ/@QGKT>2)Z'83L1:AJGEI$");6&ATRETWQ-Z+_.>:MZWE0\NY:`R#B-Y M5XCW='*^>YS_,A>L9L-;66@IBU2P!,D&@VRH@XW4`>@R@*L!LA5@'P.\#)`$ M@P88O)W&ZVAB2F75-+F5H98RE`/0.`7\%&BC0!WU0675%-A*@Z4T<#``(^6I M7T/0\;A["]8V$NHB4'#0/8T4/7FC&L[58TIU[Y-]:Z3@/!$J$["@WMNMN1^IWAN*_Y0%UXC0`@$I MYXF`ZN]2@O5R^+H4.25"^P1DC8`NX/$RCO1+B%-"'XK8-0$_Q1/[.6(-1\[C M*`=+^T2Z\\,C[LQ5GCG),?M89@W+S/L>9CY!Z.2%!YQPA>-/L/Q>P*T&W+SO M8>;E]0Y.O\]^>)CJ!)#W`&DU$#\"?!E@/5R\G8O=8Z.7@'FJM3'1<3/>=3;:>\AR;S5\'VO! M60KDD'!GHJ,P#8M]+$:F2TC92+>&?,U1`.U5NBL&3ZD1[:I M\%(%G2-A#H'LL*%Z$ZDQT-,Z>E#%MLGX4HF8*9(.GFXWB7J#O*%3IU7JH$)M ME>BE(CUK"F8\TVYP]3IW0^-.*^P!F=TJLDL%=M;W,&O7E8>:'X6QTW!K$VS'JK6=<4\*>E5HKJ%5Y9PTBQ.<'!2KB1$,_$A`,6O\W@5VO<1S)7*;(.@:U+ M:M?CVNFH6F4JVW1IM2I^)`F5(N\0N+J$?3UNGXY:5::^5=-6*\I'DEPIB%-F MNS'>*+,AAXY?'^LZ/]QS=,"UJ^19F_,M205F MQ,)EW\/L^K#[_*#W2)]_9R&X-A-:DHC,B,+E!N90R>N#P7-]XD9!EWV`6;@6HD]6^`.Y[CM279-C%UBL3-TMNS[CMG5HGPV+Q_.RML3 MXIJHL,049FA\FQJ43^;-PYG].T)96U47F)*,U2Q3!:F8#;9VI3O;%.Z M.N'>[DZWZZ[77*M;Z?#"7?[.GL!==^B,/[(EC$S'\/%' MH4QS6&J+1#JA]F[XM@LYY<4VA?!I*#GR@$@UD'PS&6PC6SO)6SW4"0^U,4A7 M(O10G9"H%[A&WM_"MW1P-[NYXVYV0X"M0,#`'2/VP``-NJ]9;6Y7:IW2,9>X M/L!7P&S_[53T?A+4Q[U-T:96JZ93/]:KKO=+Y3#?=[,_>J_$/,Q[&M--+8F: MSFAUC[G.IY;#0M_-Q]&Z4>;AH*>AV-B2K>E(5O?$UOF,J^'/-61P$8D,IW$\LYNH\=%N3P>CZ_!%[@>"!T-1S;`R#0"S[4'=&>( MZ`F[7)%''NB:#SD21-=#>`5.IELPM0/'G$1/-_'015[UDH<#U+H(58'1J296 M;N70#J[+R3[H8:^XV4-^L#8,*E&0:-"D%A5I4[LZE?O=TF67>-`GK`GQ%2@; MKT^(33&X->KLL.YW&9=ZM0->94U(+$?X^,.BV)B#6C(=[AW@NP MIPKUK\;#E11F>KI87V\XX&X/>N^&_>" MT/DPO`]"5Z%8.4%JW0C=B_G=6(L7O^4GS@6)?1%R)4*5X;3J9*ANX.L%S6YP MRPO.!L">,%@!@S*,43IDLDOV]LA-+NFF1SSC%W:'^!405XZQA.G/='=?G-Y1"U'!8`VPFAK+]I1CW==PWM/$)X=I'\9%:Y@4!#I M@J">'MC]$/5>0_TGL.`.(KR,A"MHG`EYH;"_.Q)\`(6NPI'C"+0=0SXFL#** MH/U0.(@X0^C],'HE@A^'B6THL10G'21%>:F0G^X,T/>"])4P?0QBMB',4HQQ M$`SI%H)>H<,GU`7XRR&^.LQM@;DE*.L@`.$R`AZ]W:O=]:N7`O+1D+0%$I<@ M?!G!XKU)OSO1YHG=\5D7_<;1H+8EHBQ!I#*NS9VY[4U<]$>/!JTM M87T)K)3C?`0TNIC69J:C%G2=!;T'@'L]\"\"X3*`ADFGB^IIHERUM.@6%\PVAFV'X2MJQ'C M)*3M@Y4UJ#P?%QTDYPUF.D+I^^'DE7#T1,3:!QEK$'4^)CNF@"4WMDJM=\6. MBU+74;%WA^!>+OCG\&''U'X2.EN$[KM"[T7>0"*[C0'`XJY_`>UMW, M>>]P_@MLX"@;V@DBRUGX(Q8M8XDN)M3$1&XQT'D&/L*@.QEL.8//`80#4%T4 MUDCAMZ@/=S"/TN1.FEQ.4W.F8,;03I)I),%-$IPCP1$2[*#`RZKON!S8*X4VB.&%(C13 M0!T\\4@.W)%#EZ1(M0CM$>`-_)3*L.D"H1R)R6T0O"MA1`=_#XQLX8B%' M3F<_P.R10-T6J(L\?92C=W/T>I9>R#(SOH?9(XZ_S?$7.?XHR^UFN?6`70#8 M&5,P8T$]J]YBU0NL<@3(NX"TCA$7,,)TYD/'[`%KW62M\\`\#/1=C+J.5N;3 MTG1&<##6>;?C*U;!#QFZFVR\GG2<2W?MBKDV6 M9[GAGZV%*KZ'VHV2)=\3W,:@QP00?5&MBE@`TR6":"V0*H^!YF-W3Q@B8=5<5=LK!> MXI<)_&R>*_\>9MG>AKWE]LVYSK M7)'NGA]W5=H^AQ%VJ-CYOK83Q<[]^:[-F=Z52<_\F&^:%73H'V!VH=AU/-^[ M+^O>G/*NB`?FVZ%*(U*F(0Z9.)_S',OX]J8"&Q.A%='(`A.:IJ-3JS@D\EPF M="P=WI.,;(S!*RQDOH%5JO@4V!PB?2Z%'$NB>Q+8QBB^W"3FZT2E0CDDVB$P MYY)4=8+:$Z/9L7*J.RWNB\@937*X)"Q2A4OJ@LJFHO^&AW=S(M+7X.CN:NKMJ7;W'?=[U MX5`YAI;N=UB/NNCF'F^;NZG36]/M/^8);0A"%0A6N.LQ'_K(!K^[)=C0'KK> M%:EVP>L":#E,Y&[!6AV,/T1Z&M'Z5NQ:)WZDEUCK(\LA*E-#JW=H]#[=_8A^ MV$Q?;6<.=S-KO$Q9A$E>D^6;$E(G=3T4'S0*5]KX0UW<)UZV+`(25VRIUH+O MF%WW]0<-ZN56Y6"7](E'*(MP\4LY\48:OIWLNA>[_\B^W&(>+T&W\LZZS/WZY)7FV*%.ZQ.W5A818^T/!6=CI+NET]5QS]-UR==[,.A= M`X4J<-1N;N?:G>'.GLYN5YW+<]'C/Q`(KHE`Y1AF-;C8%D^HW=?N#-SM#IUW MA??[X$]":#E*Z`_"3",4:(%;VI';3O1<+[;/BZ\.$N4(I=TCJ7K*UT@UMU*W M.JASW?1>-[TJ0)?#C')'(!\(WD=\WK5E3ZI#.*EVA)^ M-^]^D&EXE*QMB9WIL/?T&"M\:ADD"+T/,7>CV]O2X.^X$>PZ%>[=!7F7H:%R M`N6=;6A/I\O5W>!QW?!Y3@9].\/!Y7"D',>X]E[$Z>[M\=:[_-<]P1/^\(X0 MM`Q"RC`"M(2@]DB7$WK0#5]U(<>]Z/8`_G&$<*`4TXB'6PEG.W'?25[M(8^[ MJ6U^:FF8=B`T_8@--7.=K>R]3O9*-WO,!;;ZP)(0<""`>J@&&]6.%N5>NWS9 M*57WBEN]PM(07X:PY(-XL"':T6S?;3,N=^K5/>I6C[PD*);!''$O%ZC/M#>E M[K3&+G7:U=WF5H^^)""7P3P6?.@+-;:&6VY#'1?@KL-([R;,NY@(E5,(XFWS M^#M;`EVW0[WG(YY#D&\3$ER,1\I)#';U>#RN9I_G5L!_/A@\%`YMA*%%*.(@ M<*@[X.H--;K#M5[HK!\^&$(W1+"%".[`R7`GVM.--?1B-6[\K(\X$"#7A\D% M,.7`Z%`[T^UD'G4S-2[FC(>I\C/K0F`!Q#@P)M@J=75(C[K$&SWB&;=0Y>/7 M!?GY$.=`0:#%ZFHWZSN-Z]W::9?R7]EYZ^\HKR_L^]R3B1`E1MS=B`L0`9(` M$0@0)1[B[C,9S63B(01W*6ZE.*5`@5+:T@(5**4M5EJ*$Y],QOMQ4K8R4K.Y6=MY!3.)M;XLTMM^)5Z_$;J%9F97-^`:,P ME5FRL*5\-JO2FUUCQ:G3XS51_):*AM+\IO*4YLH%C)K9S#KOE@9+=I,>ATEX M[/+:FKSZ^N4-#3%-C6'-S5X,IF5+BRZ;3;C3HL+B$PRNIY.94\Y;6\&+J>&$-?*\FO@6#K],R9C6T6S6TZ,&9L07%I7U9%7U)5[_SJ[I#:+L_Z3HNF#AUF.V&W%96LS2I? MNZ1RS=RJ_N":/H_Z'O/&;AU&)V$)"P09Z8*L!$%>9-M*?T&)LZ#7GIO,($7G$DORR`7^G,KS9NK=,2-,&8Y;%+TCAE\9S*"&ZU/[?6F5=O MS&^:QF>05G8.HSJEI7912WTXJ\&/W>3,81AS6[1X+,+G9CH@'&%J=_KB[JQY7;G!72O=NXJM.LMU M.ZK5.AJ(L"6E(R^Q8^6\CN+@CE*/]@KK]FK=]CJZL`G&+*6M.$%8.E=8$22L MV#,5NXJC!J54E0 M7YE[;Z5-=[515YUF9Z-:!X.TLQ?TE$?V5`5TU[AVU5EW-AAU-&FV,VCM+"+D MQG;51G35^W!3@E8B:(T1",+;VOS:VIP%`DN!P%`@ MT&@54`(!$0BB6SOG"+K\!)W.@@[+UG;#UG8-?CO5.F53([:FA6S.]-Z48[^A MP&1MD?9`&:V_BO0UD.Z6\,TY09OR/3<4VJTK,5E3KMU?I=972_4TDBY6^(:5 M0>N+/=:5VJRI,%Y=K=U7J];;0'4S2"<[?&U9X)H*]X$JJ_X:H[YZ[9Y&M:GW MI[X6FS-0';BZUJV_WJJOT7#J:S2&6F<+Z>"0=M[L_H:`_B:W5_FN/7RK+KYA M)U^[HU5-..7*X$7#NH5^/>TN/4++KC;#CC;M]C8U(3SJU*\MZ2D]61DMN=EE M!?D9147Q9:5A596V]76$R=RX+*\K;25S17%I3EEZ0<6BXJJ0\CK;VD:*T;)A M26EGE5Q5DU:7MV"POJ@LB:;:B;5Q%X7W]">U-"8W+@RO3DEFQ%;P`PL M85E7L4DC=\U"=ELBIWX9IR"5DYS)CVDH:TW:B-O MP?K:A+4%2P>6I_7'9/7YK^RQ+.\B#>T]$3MY,5MKXS<5)&U8GKHN-G,@H*#? MLKR'-'3TYJ9P"S)JBK+S2O.7EA?-KRKUJZVT;*RC6IC=*W(Y.075^46YA:5) M)15SRZM\J^NLZALI9DM76@D[L[PRIS*[H'IQ46U4:;U/59-E'8-BL-N7US+3 MZLLS&S)SFA(+FB-+F-X5+1:U;-+,;4MJ8:2PRM)9*[+8"7F+2!-K:UQ/4U)W27)71D97?'9G>$% M'1ZE[6950M+8QE^TKG'QFN+EJ]/35L5G]87G]WB6=)M5=9)&(7_!UH;$S<5+ M-Z2EKHW+'(C(Z_9R4E=R%Q=PY9;R9E3P8 M4=T/QJQ\A3`O1YB<+UQ0))Q3VN93T695VZ;;.&7,RM-[\[)ZD_-Z8E=VSR[I M]"GOM*KNT&MH)XRV\K2U>9EKEN<.Q!2LFE7.\)A%M=E9]?E)#87SFTJ"&>7NS,H9K%H=3B/A MMA15%6;6E"RI*YO74!G46.W67#>#V:#-:B8<5F%Y949E=6)U;51M?6!]HVMC MDRF#,:VEA;`Y!24-Z>6-"95-D=6,@%JF:T.+23-;B\DA+%Y>84M:"2N^G!U9 MR0FHX;C4<4V:>)H?C%EN06MJD2"N5!!1(0BH:G6I;35N%&@Q!#!FN?E=J85= M<26=X64=_I7MSC7M)O7M6A^,66YN?^K*_D7%J^:4]OI5=#M7=YG4=6HW=9"6 MMBQ.RG).Q@)N]BQ>O@^OR(Y?JM]:26^M(ZW,3&;VLI:\6-;*6>P2'TZ9';?2 M@%>KSF\@_)8532N7-A?',,K"F!7>+=5V[%H#3H,&MYGP6.EUY4L:JJ(;:T*: MZ[P8#78M308L!IW30KBA1._RHQ?.ZVU@=[:3%I9B2UE,:R*6>PJ M'TZM(Z?>C-LXC==,X[40/B>!41/-K`MKJ?=F-3JPFV=P&%K<%AJ737CR;7M&7J?]Q3'XQ9 M?)U@?D-;2*/`LTE@QQ"8,@5:+`'M@S&+J^F<5]<5W-#IT=AAU]QNRFC7;&FG M6$+":8M>E1S>E^'?F^7:DV?14ZC?74+OJB2==:2=.:\G`MJ[04-,P2-^JW-ZJU,JI4-8Q;% MJP_E-WKQF^SYC!E\IAZ_A6X_'H7_X\I"T MMD:Q>"%LOB>';\?AFW+Y>EP^G=M*/ABS<*8PB"7T8`MMV6VFG#8]3AN=TP8C M2GB"L/7)`>O2/=9DV@[D&O:OU%A50O564CWUI*LE9.T*WS4Y+@/YEOV%!GVE MFKT5M)X:JFO*F(6LSO7M7^F\JLB\KTR_IU*CNYK654]U-I-V5FA?\4L>> M*MVN6LW.>EI'$S:0"#DAW14^W54.736F776Z'0T:[4VTJ?=9I(T;W%'K MW5GOT-E@VMZDV]ZL(632IMZ?^I(P4-CDU:"EMTA2R--C9-P,7[1,`/ M%+"]VCCV0HYI&U=7P-40\&@"/K8"[BN`W^HI$-BU"4P$K;J"5K@R6NO4EX=3 MO_[W3]S];_W_?U[___TW0=7HAO_[-T'_=V#^M_[_C_5/A+N4B`(]:\=\`QAC MOG.98WY)+6-^^:Q1_P;V:$`W9S3@(^YHP&>\T;Q+'.16(YKE7CH7Z,D8#9_%&@N+X(T%9K2/!-6TC(5W"X=`] M[<.A5SN&PQYUO@\;[GP<,M)V![FN!(QR3OF/L0[ZC3'%:0XY$TFNI>,+?!I' MPH/YP[/F=PS/2NT:FEW>,S2GO6\P?-^JP8@;J]]'/E_](G)PU;U90]U?A`UW MG`X9$1X('6G;&CS2.EELES&1ZUPH2O>L&4WTYPS-"^\=C$Q<\WYNX=IW\_GK MWT7OW_@V]M;F5[%O-C^,?K?NQMSW:TY%#*[>.V>H;Q/R]:$V29-ULKC&(4=4 MYE8^EC>3,9PRJ^M=_((-;^*RMKV.9^]\E7C@HY=+[N[Y8\FKO;?BWFP[$_MV MRY[Y[S:LCWJ_IA.Y.,@EZ;1:(FZUSYA@NQ2--WG5CU2&"-_ES=_P,FWYWK]3 MFXX\SSCX\9^9OQZ[E_[\Z+FE+_?O27B]:V#AFVVM,>\V-8BU_MJ8Q[LV/E@K=;,Z/?;90=-9TO.62Y>/*P_8J)_2XE8WMG,H9V MS>E[M7GQ1X^[2B__.GGYPX\[5MS MYZ1XY1MFOBL MT\KQS[SJ1JX&"][]/'_=]W]D'EOU8\=W==__?*W@_-.S&1\]/Y:T^N6^>-[K MG;&-;[?,JWR_/JKD_<#46J1'D>-CNU3Q:<<\T16W\O&G7G6_#H5V['JQ_&## M(^;%O#]NG4FY__Q@_#>O=\[_[-V&R*.#`W.V#W6'K1GN"!4,=\@.FVMKQ-V9?]9?C+Y[T\.Q;]XOB/FE[<;(F\/ MK@K]\88\D^,9LNN(NX;S9$.&X<_DU@D7IEP*1H8"194 MO(W=O/1EP?ZX-]MWS'M[=_V%T6UBJ]U MW16/=5RE(EWWO^730[Z26";NFG`I@=BXF>_GKEGP-FOKW/=]Z^8,7>D+'G[; M%O#'*-?W_AC3^X?Q!H_O1#5NWX@JE']JF,JD&B9_*[0=OY,;AAR16"WI01W5 M8S,924-S>J+>IZV9/<3K"1DY*O0?O<_Q&AJO]WH\7N]Q'^-_%%6XW)XHD2DH MM;]5].G?*[2=3LN,9F^06"6QQ$X%^>/>]0N&0]MF#2_M#AYI:O,?W<[Q&;_6 MY"%Z5^/Z;J+,Y?%$B7QLI<-;<8[]$W&VW:^3F>(P MIWR1KUO%N*=OW;A79/VX]^*&<9^=]E35'O24U0S&6N?-<6R\4"ONK&9(8PQOX5@608X5L4> M]>_\EV.!G_-&`A_Q!P-'>4_\1]EW?,>85V:"83[CC0>0;S+9-EV<`);-=Z\: M"_%GC01%\4>"EPE&@DO;AD.$8-@>,.Q&YU#8\ZY7H<,=]X)'!->0ZU3`*/N` MWUC+%N23%%@O$V21B5MO0[+B>H?""WL%P7O]@Y+Z!]U'? MK7DS]]V:AQ&#JV[,&>H]%3;0/O8E9L>!O;LOG-P@-;WRSZ><>SN-?;;\6\W7!Z[OMU'X$]:\&>#G", M!8Y)VV?$2GA62\5,AVQ1O5O%:*D_>W!%Y.K72Y-VODQJV`?)''R>^ONAN\M? M'#@'_NP&,_JCWVW@SGV_M@&Y*L*'5LDVF41)UUG$3?9#^SW.A6,"GZ8AYNR> MUY7QNY[E%)]Z6G#@W&^%#\]>R/WS^';PIPO\:5KT9GMY[-O->6!B!G+)CQB& MR@Z!0_LMEXCWVF>)=KM7C6P+%KQ=OW#+'ZTKS_["V'?C2L.OU[>6/;[05O#7 M\;Y">F!\M.&D=*3YK'39ZU39LX[U(\]IDO M\_WG40-_75UQY.M/CUSO7/7C][7\WZ\4-3P[F5;Z]]&DO)?[XK+>;)_BS[QD MU'$<.4Y\R+%H\HQ-RL1GS@7CU[&WCP)YMU_';6O]M?5*Q???;)LETO M#L3WOMX5RWZ[>5[]^W61Y8.KYQ0-] MOM@8]/>#46#$7T+WV1OBWZW=6/X^[NK@O\>:0N\/\J=>7N,X?7U>+W[ M-5&5VV<3YV1@ZD#T-&/A?ZC;QC^3S#W/?'Z]R_%U6Y?CM1ZOSU1)'J.4672"FU9RJZ_C<*'>=# M,I.H[DG;M'*1>T7<2!`O;#BI(WB$+?`?/-'\4J' MV^+DG%+H>:V2F\YC8CYP)UY)Y8WZ,P-$$GM]8/<9O;O00 M7:UVF7A;XC`HSG5X"GX\F,RRO3>9_G""D%M*2NV\4F/&5H7^S%:IZ;S*2>ME MR1/.!;,`D9EC"YN]Q\L:W$5]5:X3)TJ=Q/<*["?&LVS?3F;8/)E,M?Y5DCP9 M:)\YX>52..'F4R9R"Z\0N2=6BMQS*D4>=54BC\YJD<=.Q* M>(BJ?W,757[K)JJXY#91?L)MHFQRODVJ.`QWTTSW"I%G8.VX5TS=N'%8) MGK6#9[O`LTO@V:/F$>_QQJ=@SATP[`KX=1+Y#B`D2RV3)A>BEG"7XG%_[X8Q MWSF,*4\VZE\,E@G`L=W@V'7><.!SWBMXL7O@SK7_&+8?^;9XC==+\Z"3=)L4 M\1+'?%&T1_5H:!![)'BA8#@D#UZ,`X;M[1J:]5WWNUF#W0_!G2_!G-.!HYR] M\&(;?,=:>F:.,61UIM&2,LLED_FH)KV4H,J)[,"*M?S"*,?!^WOYU M[^;?W_#7_'?KOX,?.P7V[)XUW+4&^=KA[UCP8S*!<;B4#:TT62\75SGECZ_T MJA].#NM\MRAATYM%-3M>)QS8_6+)XSWWP)\I'[5SWOMUO9'_>JAZ<*P,').O M-PB4K8%N^RSBQ.T.&2*N>_EH?2#OW[LM(>+USZ<*W6Q?%O-L8/>_]6L7' M.JZ*$_J^\E-&LZ6GS6(GS]FF3%QP*1[]W*_ES96%ZWZ\?GX;K^/^UQ7L1Q>S M:IY_O*S@Y8'X[-<[IO@S-_G]FO"EJ.,8B=9+X*X>LT1>. M>3?>1?+8CUH/%]Q^>#+]D^='$K>^^BBV\^V6N;*3\U/62*(=*OS&)E(R91]\3V60-#LSM3P(^DES_L773_S?;(ZX,# M8>>&.X/VC[3Z;QCE^'6-L7RY8TS%01UGQ<>ZGHH+^CZ*G_0\)T=TW7_'W7U$ M[)37.!(J7/@F:VO,NQ,;(UZ_Z@_[&?SY9I3K)W'$5&U^RY1I?*X MEHWRFJ:EZG=U(\D$7?^14MOQ/'37*W;*SQD-Y$8,IO3/&=K4&S+TD]#W!=CU M\WB3YY1WN2$J=[D*_5\0KU1]0]-0/J'4)B04[;%*3><*/,1FJ5ELD]@Q-VG, MMSED9+$P:*2]U6_L4HOGZ/LZMS_A6^Y/E#C?F2ARO"G.L_MZOB?D MH8)0-U1T@WT*/>\VJ=F"$K']BIAQ[SJ_L3@6Y,'P&C]0YR:Z7^XX.I'O\$R< M8_=@,M/VI\ETZSN2E"=/";D_0LA72HKVL5+#K%]NX-\HG1&[8M(N?8[(H\)K M/*;>4U15XR;:5.X\<;700?PFQV9H,LWFJ62*':4+7;RSA<[S2X0.\6OG'#.0M063CBW(W8433B? M1_R,&"YZZSQ1])OS1.&W3N*5GR-.(B01\+:!=AEB#]>5$Z[^)1.N\\&SU'*1 M6SFP+`37=H)KEQ"/*L?`KC\0W[M.E'WN.E%ZTG6BY(#+1(DT$1XY&IH-=<@5 M>7E4BCQ#:\8]$\&S0K",WS#NO:MQW/M:XZCWWTVOP9Q[GN.UU\"ND^ZBJGU@ MXA:$+!M>.QD^9I%MQK\L\P7+HL&R;'",Q?Z78S=Y[P.&N0_]1UE?@CFGP+`] MR+ MZOXV9%AX&CWE1^@I!]"?ML&+,9%3SM/WDS.AV3JS!9.EN/>SH-E$?]90U(+> MP:@*<&S?NK?SGZZ_AW[P-'BQ'>SI!L=8X%@M_%UQT`A?L4;'6=ZO[R?KAN=O M!5L9=BM$%9ZU0^ES>M[$94YQ;-?CQ<\_^C3QU4=;%K[9R@<3:Y&K$!XJ<_90 MSW)P3/F1EJ5BCXZ3XB-]7]E.XW#)%LM$\1JGO%$A^%&>L/59P=Y]EPK_/+HF MZ_FQQF4O#N3'O]Z9LN#MYH3Y[]?'1@T.S(T<6J4\HF&J/#;-5G%"QTU^RB!` M=M8D2O*IU6+Q)?NL%Q<7U_[XY84:=N?O)PKKGIY)*?[[<$(V/,P4?Y:_'YB3 M--07ECC/"8/>O.7[WQME>W\U MWN!^&=[C+/S#(3!@!_S'QVK:BFLT#>FOE-K0"*'N*]4T3RETW3HD%O'I(O?R MP-%XKM_8FI:9(S\V>[P05;O=`S^^G2AV_%*<;W]%G&7WZ63&Y'5"AN\1\M=S M,$!"J,_@9=;+]?WJD"-.Y%KD/1[;Z#G.K747?5KE+!HL=G@.WW%?G&W[_62& M]4U)BM57DJ5_?D?(K[\2B"AT%)?F.8C7@QU7,JPE;Y,M1J2)%G]($\U_E<:;W9,NNO8S(>?` MH4-B0@VHU+29V,^58%F\=$;TS$F[-(?).=EVD_DK;"<[TZTE1Y,M)?>6F$^* M%LT8E,;.>(KX31HC];!8++&W2YVT]4B?M)N5,6D7!PQF(JH10L1VQ#G$O15B MNY$5[^TF,W]'?(>XC#B)D,Y"[^%CM732R7&%V,$W6^PP+T?LD)PK=BS+$SL* M$#L0%Q$/\T0.XMQGCN*\[Q%7',6Y)_%Z`"%;!)\=8;Y(X@\?X^*2/^$<#/XE M%$VX%!1/N'!+)EQV(*Z5B%R?E[X%NWYVF2B^!AZ>1.Q';$'(,^#7E^#.C[9, MG`R!C_'P*A6Y1X%]*^#IF/]YNF]JAN'G'L&#W0"_P+#*/6#B>C=1>3=\G:), MSTM>@+LV#1R*1V\W&SW93/^Z<9\EC6,^=>A+=Z$O_9GQ$I?,M[X?&-:T"PQ; M#5\G`,,8Z$^5+=H.BD;DJ3(,DQ;`.Z38ID_UF*-!49R1H&+^2-#NUN&@9ZWW MX9M.A8P(M\&/=<';M:!'K0;'"L$QY2IHKGN:O4*(/!S#6=)Z\T7B`H>7K#<,DO?!5+4[Y[[+GMSVIV,N^D/Y\H#OQU>ZJN#<[LN!]EB+? MPHBAOOGAP]WALX<[50S'\2\)P>U#W41Y M7<-,]I"N^^39#/O/?U\GNFI3"+QXRHO:\'XCH'UP5QAWN"*Y'_U0ZRO// M'V7/S!YCJ`Y0=.51FKKRI)J6\I*:MOPN3>/Y&$6[+-&RZAYR6Y3X(KLJXO6M M6O^[HTR_BV,L[^/C#1X[1#7NJT55[FVB2K<6485J/Z6F/$;1Y9_2Z!,_4+2_ M7A'RC8Q&WZ[0=EHIL4SP%,W'G;^_PO7]8)G'75&UZ_6),J>+Z%M.H?\X(,YQ MV";.5AXBU/@%0KVZ"0\"+W)SF%"'E6K:7+F^[]))ZR6N$U'0?4^AD^C[`H?7 M&'=/G&/[+=AQ'?K_'/H_+TEZ>X:0QU\04!B::2[,6F4G;%YI)CRTPE=V;9RP511@-RN88/96%&_TFFR-SFA$MM;). MD%JX+99:ABS&U(@5B"J$<+'48COB?*+4XEZ"Q&(D832/ZTE M*3\@KMI,IIZVF4P[:#N9+I]OX"\+!8<\S.,EM@XIDS8!:9,VB](F;?/PRD9L M1UQ-%=O\E39H.YEQ'^S[`G$*L=]^,FN+_62V8IFNFWP1>IAP<,C':LFD@^N* M2?OPK$G[].Q)^V;$=L3766/V(UF/P;T;CN+\4X@]B`U.XOQN)W&!L@#W=1;T MN@P\BP:'`FS!1._\":=X,+&F<,)I>Z'8Z6[!6SS[';S<"3=1V2XP<36B%=&, M]U1-].G*&NB^!/5D30^!QUL`?YM1D<"P!')O<0HAJ"Z%4FV@:JO5@2/\T.WF[ MOI^DQBSV16Y,WH/Z7,B(("1KE MB;83(M]+B/(@H91'*9KR$QI=>8:F^?;X#(>[QU+\KY_<%]C7_4OA@O2WFZ-3 MWJV/2`)#$M`'@3T!"T>Y?@M&66,[")$BA^((H12G"26Y0JBW./O?_VBD=_IV MG,O&FWVA]9=_3`K<-,H+[`!WF*-LW^HQAG?A>*-7SGB=9X:H9@1U3"+'Y!%" M)LZB#[E!R+W?"?GXI?JTSC\]O3,?KERP^,FU>)?;$\5NYT3EKH92_T6S9#6Q\Z0GHF9(1F* MF?%"%C/C%YS&.]#^-[*Y)E_*HG[".BY=`+_`@%WW">E^3ZAJ>)D4I8:YOWQZ MX`R9;[2)K'BNB6Q7E(GL7I216#K'^$]H_@'B1^C_EGSVU:/@SU5"=MXFI`\< M:IZ@:`4JBKY(J6GA(9\>8"+SB3*29<\QDO?/-I)?GFTH?QUJ,"X/G/Y,'C+] M5WF(X5UYV">GL7[LPRKX.M9+0LJDE%K:/S2-N'NXS.C\')G1S[/D1B-A(B/Y[,>FLOFW9TACKYI)%YXQE\8I/.&O[8QG MR\RLY\M,/1$1B*6(XGDR$_Y3[/5QJ+`W_&V-_PMAKYM+X,Q;2 MQ$/@FF*VMI/<5]]?YF`2*36S72`U\UL@G;$`D1LKG<&*D9ENBY:97ITO-?EK M[ACF?V`A3;AN*5E\!CP\`!9NM98D*^/1>\S3<9$'H6=P-ITGM7",DYK/BI>: MI^"U<9'4;-M"Z8RO8R=F#,?^@;%?@9]@:,H^L'`C.-AM-[E"E:.FJTS1,%?$ MH9[9TX/`UEB)E5N2Q'(AHA(\WI8H-?\I;A#KOC7%4#!P%QBXVD&KKD@>UD&AB8 M!P]7V.$R4=0,;U>!R$-O.L&![MG@!X-&5]72#90KP8^E!H$2/YO$<>?XC%+DI_U6*R(2_6^HAJEF$U^>=A`SV$")9!?WW(5\G34/) M4C<:+S.>^:@P/OQ.S<:0\WGW%W+\1QEY@:/<)$0,>M1P_[&6$+\QIK_O6//C M7FAN@)!7&PAY!^T,[4+L(^2W'<9Z-[8GVIS[:(/MNMYO(^/37K-#XD>$08M& M6OT7P+O$C#&\YH_7>\X3U3Y"CF?(\7PC:Y)WR6> M??.9ZW[AZ][DNO-$E>X-HBJW,E&%6]Y$N6OF1)EKVD3I5(ZGR/$,.9[M!`.@ MGZOP$MN@/_9=9[,5/^3Y)/UXVL_GRS<+K$](EMM]-+G";CVB&\&9S+1OF,SZ M'7OQ>#7\RR;P[P`AEZ'A_=`?[Q6A4@=U3;Q?104[O=T8:/7RKU#3GV3SS:Y* M%YJ=!S>.21>8[Y$NLM@D3?@-.1ZL(>0K,.#34QC_)2$]Z(G*H-\HI;J!H=3= M7U_.F:DO_<['8%`>8'Q/%F[\C2S"^"JT?Q':/RT+?]"%\=C+4V#AWDN$]-\A MI/%O0J7+*%J`2L-87^'BHZLH]]15G/#4D[_W,G@I#YA^7QYL>$L>.OUK>?#T MZ_*@6_A,3^-S^.@<&(H:6AX04CA(J'@%1?-4:9CH*9R\=!79[CJ*+:XZBA_< M=&1R5[WG"F_]!XJ9^C\@OE/X?K89\W],R,#GA'!O$5+^A)`,>,MY"DK-"3S4 M53BZZ2A27+2574[:R@M.VHH7SMHBA:/.GPHWW5\5'KIW%9Z'L0_K4$,K[H0: M^*%<^*$EXQ1M%GAHH]0TU5$X.&LK%SM.4S+MIRGW([ZWUU).V&B-*&RU_U`X MZ?RF<%&8ZOG(#4P#Y`9._G+]`#^%?HRO0C]UID*OW%NA)_!2Z&[S4.B</PV:\FR#O"H&0PL M!\_0@.<\JR'D=37N[0KD*H+_R$`/$JUI)7&9$?S6-6'VX]`!O[NS?O`_8S.1 M.`!^,C"F&-XLPVFB<`GZT@5@V5T&],(DY!'B+\2[9GB(:D+]E6MD]GW6`I=K MA3T.)W._\FH-?9N6"?\6[R&JFNLIJ@Y#!'J)JGR]196W6-`K%YZ!#]_1A@#7 M[D&'7W;JJI_NGF>P?U6;05_K99?4K*>IGG/':SWFBJK=H\"02%&%:P3X$3%1 M^AV;D-O(\7TK[O\.]!#0SS5P8/]!-6K-(;]IG,/5AE7[3UK'K'X<9<>8S+"O M$F<[K$3ODXU>)@V1+,[]%CEN(<=M`<:CAB_`@6/[X?_A)%A<$D>:'A*'FIX2#[+>)`0\'#%*4[;FNN):XSU9R\;J(QHC35N2MW MT?M*X:7WN<)'_P*T?U+N]S7V]/-V0@[`4ZT[#/U_1D@1:DAX2HB[F*+456;Z M=%6N+EUU2)>N?*6G^5IIJ7T?VK^E<-'Y2N&J\X7"[3KJ.`8F;P"'!/`BE=<) M20./Y_U-B+V$0O-KID=7)2/'@`Y=]2U"H:/Y7&FI]4!A.^T'A8/VMTK'4]V$ M[(`W[`"'ZL'"G.\(60Q?%_::4%:RJ1PS,"Y>1TW%FZ:F.J6MIGJF31?+]33^ M5)@AC_6TG^2V>];#`^%S8&`?"\'"E)\(B7U$B!]\V0SYAQP8%X.H0XY=B)N( M42WZJ%Q7XP_%#,W?%!9*?6U[I;:QHW*:@[U2R]=6.6V^K5(KU5JI56JEU."9 M*S4VFZKHIPU4]!]U56HCVN-TE<%C+:7U+1V%\Q?ZBIGG#>2!*BM-4Z6!CJU2 MV]1!.4WN@JWJ?$'X.TV@R>]8.%H`OS^?/0,P11=Z03_,5T7>V*/O<&^:)9@3S;- M4*C?,1A55QI^KZ-PF1J_UT@V9PV\61MXQ(`_^R.=D!?+"1F.AP>)I-04'EB; ML:ZU4MO#7JJ]PF[88*W5"Y/;E@_T)ITP/F"J]DZP<&IL.3B8"Y;]6$#(S[FX ML[,(^3,5?B:>4+)@FL:0G8G-$Z=%#C_-;+?Z.N":U4G;=P%K,??4V"+XP71X ML\5@62Q8]@7X]64Y-%,*W181\A-R/LP$3Y;J:UU=$FEZ,I5EM#_YG$7[G"=A M*VPG4Q?:3V:&.XIS@YW%^0&NXGP_#W'>97#P4LW_BXNUT%\]>J!Z.K6K,5!S M34NM%J_QB$E&UL]AKG-$.8YA8,94S`)#I@)__C#NO[$7ZG!_-T'_T-":?OCW M=?9J%1NRM'+7[]"+[OS>S;)>'&M1@AXF1[+$*EVRS'HY>J`D2>K_'?\9QI^? MFK^%D"WP1@SNMOD/L9=%GL9UI;G61:7UM',*.^WC"J>I-9QI1`\$'G?`B]3!DZ5_ M2LA<]%5VT"\1&R#2$("@V6\4)E.Y-*\HK2Z@C@.X%_K7HH=" MCYJ/WBX!-82"91;/IG),1TP=9DPBAM&9&"&T/Y7J]/MR'8U;,F.-;^2F4WNP M$?Z8BVE*XYCOH= MF>%V<*P3]TDMUI!U]M\:PF^"I;\08O"&PMBI'.&(,@3,M!B7AAB@')31:$]5 M&FH/Y-JJ:5J&*@U#(Q7=5E^EYJ.M4HO24M&6:JIHA9I*&DM#3JVGRZCC-`GY MEIHDK\DPI5)[3%-IW%%73?]"2VES'BQ1&=.G(0\88X0<#M-4:D$8'X?(U530 MFM5EU#JZA)RDBBFJ,,-XR,1:9IR6KVZA%JK)B;G*!'YG;RG9+0':BJ-K]15)N>F*>T.ZRH\ M=NC+_8<#L4P7<,@4_D-=$W688[PO:DC4D-$JU,74&C41N4R-DI?4'ZCA:[I* M]PQXNA\LVJPO]^LSE(<^GH^>(0S]AB?X84ZI*=4U-50T&PT%+5)#2BN@BZ@! MM6'J2^HE-4Z[K::<=E93:;571^&V%O,+P5(&O-GW2PBYNQ#]2A3Z#G_DLJ9H M"DU-=:F:J]8@/5GKF6:GYH-IES5O:[[5.P<>;]=5N'>"90PCV>Q*4]F\/+#L M*CCV13(A-Y#KY@+P8S98Y$JH)V:&VC]:SM?_PH&A>][Y$YW#ED^LUNHIO!FH MO1B>-!TL6PP>Q<"7G0LMI'%SK"1+`FPDRWWL)M/<["=7?`)V?0Q?=P3\.HA\^_(( MV8VK"C=-24F\X>H>_B[7RER19!4B2K`/@/0(DRZV#)"G' MBW%G(\]AY#FP$N/QNA%6H`]*D,9]R($XC-B/7-LQO@N^KA0:F+^#1@7M"-+PWMV@X;CSC+;! MYM<66OU*&YTVA;,^4^XSO5X6;%PAFW.\Y/_EV%6)^L&Q>HQ?!H[,/$$1HXLV MZGJ7\^C3/C](5[O\7%/MI`K-HFJZQG8P9)W25J=/X7(<\QY#GOW@>S_&-\,3 MYD"#\R!1A\N$4#]/IZB?4RCJ[B:*W/N%HKZ9I&B75>IJ9U73Z">4^NJ'%:;' M(<ZA.B!X$72/\(^@",ST5\:?XL//^ M.YA1Y/D6>6ZHU/>"Q0.8@@D_E8_^-@&>;`YX[`Y,&/R`'(^1XQ$.WF-\8(^F MFE@T7;_#\/TR@@,)HW3G'[4-\(2M\(05V,,4<"CZ!/P@:G#$.G1^!H.>(,>3 M(#32*Q"`YF,8MT<`W<,_L3XQ+EHE]0]=4^,?:KK:/\2:4A(O2D+"J0FR&#K- M)8.D@;PAO>0%V4N>DXOD$?D>!'A!'A`YN454U#6PZ*2&REBE0]'^H:FKJ2A# M2D'L*3'Q)V,DE@R1#(ROP8AN\@=R_$XND=_(+_AO$)DP'CP[15?I'=!26HY9 M$R+7)M0_E#HE)\;4.'$FPV0V>4>68GP9>48ZR$/D>$"ND9_)$_(#$9/K>/H, M3:5Y4$,Y8XNVPO&)-_R''?H7/4(4%!UKF$'>$V_RDBPD?Y)\\I@(,?=^U[3ZF#O)98?RAYBO7\ M3EI!TB/D-JKX$C6#Q`'CTDS25^E9XRPXMI6TS6%8!EN7#UYU>"K^`:^QT M+/B!:^137_#("D=11U?MBEZH^@FC4OH!TYWT;89WM/NUI!;-8'D16)0^71ZT M&#URS%2/BH_]`-BS#YYLSV*<6>3:/0?O^5#45A\7^JK`3'IKT(!ZO==5XTR+ MMYX+C.2ALTUD$8%FLGG>%M(%;M;2Q+W9&`/OM#V#D$W(-0`N=J,V01(A#4M- MJ=*41"HK64"/3SAC[#?GB<\,;VF4J1>\A[=LOKF/+-K<5[IP;PYR@(/;D&BER;X,E\@##>%FH M\2)9Q%XP;S=JV88\&Y&G#\$`2S(;<.8[*>+0ZT2SZL^A&:_:09_6^XNV6KM2 MF\Y63=>L5UIH5R@<]$KDWA]R(+:CGO5XY8(C1>A7%T#'SN"`^F%#2NUP$D4= MF6K4;E%D[Q!%;9=3M'7P#WTJ78UVY8R]X/!NU+T-T8WQU>BKDF$UPN!'+,$1 M\BD.WSEL]%D8I3.`PDF(^6.8BJ/0_@$IC;971=\+#N]"K,%X)CB6TT5(#,;/ MA!\QQA!R$3DNX"!^"MA^BJ;S/$1]%DW.6;#H["0.A8S:!RQLPG@!IBE';YJ$ M\7/05[FA+S(X@QS7]''AX%*^C$-P"=J_!.U_AJ;Q`KS,I==H!N5D.\9W8_V- MZ`NS,$TLQ@?!5SJ@!IV+R'$#.;[`P;N*R^LJ-OHJ8'?E%,:B:;L&LW5]G*S& M>!;VKQ@<6P(.16"\[R%";/"8%CP1N0F>?N.#9W&8OP0XKZ/8ZZCE.GYXXW>8 M]'=$2>A$1J:#&5;D+7$G?Y$P:&T1])X.7I1#:1SH;37YENPC7Y-/R0W\[3J> MN$I&010%.4W]0YM0)\A!)R/$D+PBMN"-#[0Z%[Q8!KT7DCN$2;XA_=#L/HS[ MC'P.%5\"62X0N".P:#]8]H^TX!F(.OF;&(%W#N!%$+F+6NZ0',Q;#_KT MD6;:&K]']P@]ZATR?:T#SJ^8V8X"DW5!R%^5/) M%5*-%?20T^0@^02K.(95'D4-NR@E;9V:2KM;0VEV#0$N'P4,Q\"20_"UVVEY+0^>"*^NM*X"2PY/1?'#U[J'#Z^ M"X[XR/`Q?`&672,V6/U>#(^KN=FU%6)->9$ M:9'DZ'`2'UU#BXSZ:-K,D#L6AJZ3O@8N+,!_>3J M__C%2P2_D"9E4<0_UXWRR,NA[',WT$TSO]'13)/.T$Q26$R+D]OJQ,J= M]:/EWEO`K@U3#$0M/:B%CSP5R+L$_LP#?8D!VX2:QEE,J7.[*1K[*D78XQ#7 M/Q2M4JFI7JR8KIFOL-J*'!LQ9@WR]*">9K`H$WXD`O*RADS)!AR!81!OX@=[.`"PD MNY%C)P[/3FS8#IC%[3!:VP&&'>BI=MW"A?*0;$/M:\`Q#M9>Q$$-X&`0_(@# M,*&S"SGVX_#NQ4'>AX.T#[#9AUKV0OM[T3#MNX[#]#W9`(ZU87P->K)TH"$* MZ)V)\3;H3Z>A;'($+#R,@W<8E^IAP/(Q\@AS'71#P9,>Q<<>QM\>Q4<=1R\?P59]5$,W/&A^-72["W$:VKT.#=XC'X-:1T&?O\&@ M%\CS!"Q[0*SA,3SA-&:1+\"/R_`.YT@I.458>+Z?'(;R#I*S(,E7(-)O<#;O MR6[DN&<*[Z$!BP8&_0R6W2)VF,47*IV'IY=!\2LQEH'G>_'\1ZCD4[(#3VU# MY9M!T#64E/8E]/Z-&2%WP+(?B!IF,$;MCM!\,.:.QWS9&-=`MH!#&Y!I+7ZZ M%K,-P.GT$#'5!D]SS@]7CRNN(DL@'T?R"AAT$BP[!#[O`S^V@\WKX.WZP<-> M5-0#.G6B!CX9I9B40JU.3:5S&%[C$%AV"$?@,%AV%,?A$!BTBYB3K220K,%Z MNDDM$9#UA`L2L[$/362$JJ3D:BO5E#J9ZDK3G6#&-GBI+;-P7E'3.OBR`?BR MC90:ZG4@[=C;%JJ!-%+[22WU$U5&B6F9-+G&4K!HH8;"?.XTI?UZ:'P`1[`/ MN3J1BP]?UHR:&K&V.@,]4FH<3F6;EE/))MO4X@UN:D=J39@&:2DLO;05=BZZ M"F<'`X7G`*[`7G"L`]S@H;]L1*]:BO6MP/H6^U%D7H`7F1641?D%]-.=?2[K M&#F]MM:V5]CIV,OM=1SD3KI.WP8ERPIP'UE$#JR8B0.(K8+34G M%LL2B>&R5MJTI+-TM<6O-&B+E!IJT>A?HI33-2*4YFL@QS[4TK'D7X8UH::@&6)D@$5-#U'X(%D+=O5CSBZ, M9>.QE>!`+/HZ#TC+$)Z&"*9AD1[X(3:>C7N?(T#!$'8K&A4A_$S[+;(V_3\O M")[5H*]+0H^`CQ?(.LBY M%RQC8(I\]&0+P`%?]%4V8-&T?N18@\,[X/PO4U=APE6`S2H8KG[P;`"&;<,9 M,H#47#"X')A;SH6/@A_R!*HL,%YSBH5;P,)-$-4F[.LF+'HC'EX/V&[8`,Z" M(5M/$"'P5H_QV>C)8L&A()3I`A;-F/*5.Z=XBL._$Y?>3OBZ7=CT75.-,(K= MB;W=B3IV?0Q'HPX%Z(,HYO`+3M"M'W0?`6XL`C=2T77D@QEUT!\?FN^%AK9" MAR?P^^?0\FWH_R%Y0(?_`(-^!,MNPD]]`>]Q#BS[!"P["I;M_:#]*CS?`NWW M0O?;H,./\?H%]/0CZ/:,?&-$R&VP[#;RW`#++H%EGX!E!^'+]J"6K20-BBW& ML\U0?P_I0HX.Y.C"TYT@7SM(>@%]V"436$:P["H8=`XL.PB6[2`S,>_<_[2? MCV>;L9IN.+SM8,!Y,.`[5/8$A!LA1]'/'<.V?PR6?8(C^3$8M`]Z24A M&!N'Y[/`C%K0K`>_[T%,.:R?227ZNQ(B(KM"_KW&=N`8;8Y,$S0P2K=5%16B>5PNE/]?PH:FTG.@J71OTV&;3 ME)9=X$8;Y,19\"]_RN&EN85F[GA$7=_F@8ZZ MA=R`;JXR4+=4&6I:R\P_Y(`7XTPQ#!ZJ'#S,!EOCL$_>J$MOOC;1@)^BQU03 MVORM%#7_6XK,'<0$"HJ:I:310E7JW6"/,/%?AC6AEDK4DHVK-1)_MP132#H. M80HV*A5_2<4Y3X=64F$(4G#G)\/++)>1GJ1_.)OPY%QR9!PXY@R7Z MT".IT$1B:*X(ST@E^=8"$';HV<$Q@#_:%8B(LE(N)N(`5'TP4P#"U;R0]6#<37J@87BX)Z4.! M!E>PQ`S3:/1,L1`'MP=U].`#[\"'UPGSUH%".P&[KBDF;B`\E%8%O*T`)N=C MK!\8Z@@.FL#3T=$?DG7@V%I: M[Y!/;`@Y`9:=QE$Z!08=!,NV@F4#8%D[UL1%+4RHM1[KJ<7(*N2HQ!.58$`Y M7%<9.+('UG,/MGT/=+H7QVDW?,<:Y!&BQV2`974D$N.22!&(48B9\[`#>:@T M!\3+`H$SP;)-V.X-8-G:*>^"'K,?QZ$+#&H&$\NQQRO!LFS0(AV_I^#=Y9AA M*79\,3Z!1-P("628K,+5TXWCTPX/Q$>/R;+&4<254@8&98%ER<0+S\60A9@] M&KLX%S5$8O?",?]L<#`8/:H0_.%#IRW@1@..407:\GS((\40^J<@<\J.S*;B M2"!53WRHW<2#NDDY4^\H.TI)6=#^43-54VFV0JOLV'_Y,V4S"E!3*O@:`Y;Y M6N#>-9U.S,W"B:%%&:5MOIFF/N,K-9K)")TR_D>-,OF'3C/]1_U#CBF&12,' M^%,`[J2"K3$S<6CKAFHC\32"(F&YF*PV(4`1#P:G7@8BT5;\/=/811N?^#@ M%,,8J*46>0HQ+A%<\P8/IH,+9#D.\E)L]#(L,AFP2D7#M0(,R4*>3`@J\R@1 M_LL*<"02LG(`LG0A#'#DX!+EX*`\_+(3F2@&7E,W MZ$*:ICB&'/7XL!JPV`;PL!$YFI&#B1RL M+B($QQI1=P'>3L#8()3H!(Z9@&/J4QQKQ<'E8RT!6*(&7V<&7[4\@Y5K.'UZ#C*;-_)?P<@R0EV5X_S[[/BIT:,'2^0 MYQE8]@0Z&X)E)\1B/$L>9==2KA)VU,*`%K3672#/>1AT"I8=AF5[V6-VB_EP9QGEUN)5JFA-`[6YRI!OP9"GR/RR.(5W M.0G+'AN+_60J/`*#]I*G!W_7S'XL"#^VHOTJ^N5>:%)!2\IA:ADM+H7>)7#D M"-PXC!U_$$GL2Z?;F0[]Y`F39RLLJZ1O2O":Q918C9M917^LI*=7T'/Y>*KE MX@VQ#WWM0:<##%TW2W,[^Z=FEI0:&%1"GI7TS5+JD@.Y%M.BKT/)>=1A+GO4 M3+SE7>*O8@!]]J#5CFRF\'R6>>JTB25I'7VT!`9EPK*9],LT6C&9OIC`:I-. M^;&L3+>PST[5_B/ZXOQI95FOIT[52*L4N[$M_`DWR5T7Y70?/LY M88?O5Y@"O$?J1XA[6`[X$X(_U?"P%&GDP?NI]+=&^\0,YNE,*CH+(,QF89[- M0CS[7.Q_TF2\;?FP+A@681IOEUZ,NFP@3S9><2QM9(GAI)-RT.TR])+'7,_' MG.2QR5B._UCVC-B)G+NI2SMU:;2>9X$H\F;`H='P1!3!L=48X#5HKIB;K0,X M94"B`C!4DJ?\88MA/>3IH%PC9R4LR47+4_`DR557_1@Y*EF$[B5'%>VI!A2U M"#V(R.MW6WO)7O#4SCUKD?4:$).)+">@YZ1@W(]M`_"U='0M%:T#./7`HH$< MS8B]=%93-I:DS>#L='KA:K_HQ%L`F#&NS]&15MLSO.L4YR=#!Q.N1")A_DT9;.YCC+^D47 M_C$$`S?`P%SXEP'_)E,V#8[IN^(AGL7@:_CP[LH])]0+>?'#L'XNQ( M$1?%.)0\F=5T)KN<`+XG!^^Q@IE=!'/*4$DU.@XQ4]LA43\_]^.,'H$'0^)Y MANY9\OP`!IUC%G\;ECT*RQYD?N\1N>QS"BBW#GYLA`$UG*WPHQ<*[.,\CH+. M6H^_GH)EWR//&?(U-3+JAY!<2WLR1I0?!#_$$31DFA;X5`-;FL+ MU!FBJ4.P;(AI"0NO$#)Q8@&N7<&TQ+:KB9XBSEYH=A"6G.9\6 M^^'&7K2U&[T/L#?L93ITD"=(GDJ86$P?%T*-%?S,@V1+(>G=W"4'/Y1-.Q;! M@5TLQ7W(J8LIU#8M-IWJ6%(VPJ#5Y,F&B0O$''JX`.YLI)=:(.0>,I\47V,7 M.XV5I1N-=3#L+6BU'EG=1YW*D?IJ]G2+8-!4\MQ.FR;`YG'4;`RM'$U?^%@7 M4L1+8A0LZ\R/\:>!/#4+8QZHB.ET-WR=GA;_'C:=AKJX*`F]>IG(H]@O))_' M&+R,N%\776@^LCSV'*E&^BC:58R\=Y?6/+?ZT(<=&I%`'?ZJHRSKR+&(_-X:<="?^B1P+J%P.0%K*7%]*?990 MGUSV07=_1W23HX/V-%.7;>391'T*^7T63/%)+U7`1%Y!CA49,3^UAASWH-U2 MA+8><9;N%CV%,5LA]X)!SC(NR6:[-!D]C^(4ZYG$)0QZ">:U%#AN`#25@&83 M.;8`B9JHZ&5+$N6>+9S5I"_$HMP)AV[C=,L]8343>#/UV$2.S73\9G)L`7*U MP*9>>JIVT4LHREE/ZC+*9?/6="S*K9PF/!+U+*#;R!$D1Y#^"%+1>G(T`+JF M)NNY62\<:^'>F\%;(>6R"$\!+V-`KD%S10L3MYE%M!G3V[PX5N$PP`VS`8S( M!T$=HH,NKB-E*4C)@7VS*#<)BY,*7G3)L6[),7)TD*-C8=R3T5&=5+B3&^V( M)K[#+]'^1/MOXO9?^\Y/;5SB.S\3\R71_NNT_\8XOBE&"+K%84<,TW#2>>73 MGUQ)'%_Z\:\18K>*;8Y8!3M71Q!4W^H(ON>9%$[TZY=^%.]TQMBA.&+)+*=J M[+08(7AEJB9&4NS/$WW]11X/N=([SH#-VN:8Y8BGP6J,0>DV,T40F:TM9.48+RB8:8I^;,TX5>G1B! MSW=$)SM"$5T3+XZP.+'X1TT33G&ZB`I3"9Y%L([@E2N;YQY(#,MU MC[-N\:X:\S)&LY18E3;"TF58`_<3983EP&E_LP>3=%G^#_9@V*5SL8,`+L/( M30R,[3CE#(T3VF(E]([L8\,QF%)RW8I?L4;3KXRF(:.9]F#0*AY0=2@?%10J MP2R=X3SH<#&U?[IYQRTR7EVDKE3J3JS-LQZ^/&,/ZM8S&<7[)VD<0K<'\PV9 M4UTD1PQZ#*%KJE>ME#D=^XE4]\SE`S?%*/W=$7EBC.%10C\SZ4WC=PX=T7<3 MU(Z7HZF,T40+@.*8+7C)4IQV4167AA-Y0S$GAJ;I^F55AX9N.LQ1NFEXM'^K MT8.7;[AQ"SD-_0RZSO&0P]`,?9$B+DV8NJK#9+1A"&.-+;A;CJ:NIZH#KPE# M-9M9S`5=73D_8-AT/4>IE(]%3N0KP:,N5Y*N!J^L^_6--FYU/ET-%=(?GG)% M1YH+?7@5``I3#L=1.P`U:Y!<#B,B]6D/I@G=*0S3 M]*K5'W_7MCTOWPRH_(T:R!^?DJ3Y[#&W1S,9C0]LP4F&%)R6;@N^XM(E0+4W MG>Y$TR*V8"T[.1AX0MT0"%BI.-@9'A3O_84]^'KJZ#%W+E.K__%-;"I?^_ZA M'GND:+3NQC8LM>_L#*DB4U<-O6Z8AK[0_N0#?NJ:/EIAK5RZ5%;Z#'V4RURH M`-"K^[PI14H]UY[Z-+$#N-Y8#I3,G3%&T:''Z])-E]N^#?;IAL&"9%_ZGF1\ M74(=8YAL)@F%@%MUTRM,U4*FS;SGT(5_),;A\QU_?M7^^^11;J_;,,;;W8Y+ M8X>F*]MU9`A8/;OMS[=P^1XA=BDZ3'&-GUVFW/IBHO>_P./#?>5S,_S^28H1 MD8K3M/EV'0)5MS"3;,'GA9&4Y$E1]F)3\A]X-]&W7_KQZ2>_?]\>,3T>MRE< M]C&JT8UD5Y+A>L_.2E_:S"6;]US'+26._\VQ_?9QJ4EI7D_[\.!ET^US>Y-' MS[$/7.#@FXD.^\H<+_WPT8/['CAIM_FIIG=25LV1O;;@F41G?>6/C''-EV[8 MQHG_\_$5:']7J%=^PE44M+7W19L:&KO\\W)RLOV9_OF!P`)_?GM[..0O:&MM MW]$5BOJ+(L&L.?ZZ<-AO7=KICX8Z0]'N4'V6:`WO",9;E/V7^M!*^9?E6;P>VMZTJHC7=W+^ MU%54$7NM5T3")??$7]\2:2LIC>44'[5WK=AP-7]G=WGAU7AS7?'ZV%_0:WDM M;6OE-;=1=DE_8\7&V&OMOO[&@I+XZ]?$)A$6(=$D(OR,"+\H$.N(K169U@<[ MVL1VWFOBFB:QVKHB1%1^:+SE,ZX-B_7#7OLI);\*[9]6J0ZQ@_*Q/3=PQ>_A[@]&:IN!O'_Z8[+(&5[-?>S]>N]A] M@MQ??KP]+!J(MEYK7Z>MSL/JN3UR;.+P;/).H0,EEX>U.62[7Z;89N5KL>[7 M;;TK/TB?/^R>G]V?7'UIYRNW#;_CV^:+][V5-I]DD](%%$< MQ[^S)4*L!64F4O!.M@=7!NU@'8S=]6_*MJQKI@BRSK[9'9V=G=[,;B4>0H@N M0=8QNEC123J&!P\=`@\1@F)=(N@H&02"EY#M-S.[[HC:@S?O,[__O]][0%TH M;9IZ@`%YPQ;)_BB[.S[!ZC=0AP8$02NM6&8DD1AVF6QQ9.U]A>2)7Q&>S/I[V<89; M"O$R\4W%%!0GD"(>*"E9)^8.L6QD-(/DEXF[,I:2)R;?P%-G%EZ9]A#0?04X M];DFF["`Y7?`I=::+-0,7!P#5CIKLMVD.Q^I:=U2.SMKS:Z]>+1_4EJW02>S-Q5Q>P1/@R\_`EH;IM M_L#-$RN8#X66S=FL0Y8[6-@Y.EF$7@AGL4+>+-IX M*/%,._)ZL=KO.=I!;HR.T$GS"JCIUW0;RH:GV# MSH70_J2*OE&/I?.:/9CR.-!MZ/'A"L,HQ&][,;%CVM%D-;Y5&NFMRF?2MQ)T MMI#\QFQAR+%I(M_07"XUYK&4FLO%XA5>Q3AT<&@PZ&N`(8E^1!&&"8$"5-)H M9*&1E+LV@MC"[+&6.A(^9J3?)I]MU^<>BN3M>-U!-(Z%MH,(3/XF_Y:WY"7Y MK?QKL:48JFD6Q)2FK#_[0W&=S-6X%6VE)B^^0GDCI-61)6G^H"?+5ZFO.M58 M;*E%%(5_R@J\/_-3N_/_\'S;`!:`IE;F1S=')E86T*96YD;V)J"C$V(#`@ M;V)J"CDA27<\5V?2%*`3[1KU2QP#GA<3SNW[PD777%G%.$\D?N)RP-? M@'^S8M<$O`+\/L1IF&D685(GA@+F+ MV-TP]C9UP(VBD:E,JTEE7?FD/%/>*9^5'>4IT,>UJI8`-5468-%?^DTL>=O4]C!LND)KS6<`[>($*%2@]1'7"#C*EX1PU[ M;6K(ZQ$+%/)[Y;U8=3[4.:I]*\S?#K5U0X:'/1/3$+U#U-TR;D=JP=Y:V9B, M5]T9>WY].[&ULF\V>CC=;-A/'\R#,XJ_C3.LU\1RAFS^VXEJ\?J_Y,'?^@.? ML?!1"F5N9'-T7W\EL6,[3NRF M^6SKA#H)H:4)3=J&$DIHTS;0=:4J3$AH&IO(/C308$.@"8F)C5\+TS292-L0 M8M/X^!$Q^,&431H3TS:80!H5;-!XS[F^:6$;VK\MR1.?<^_U.>_SO.]YSK$) M)838R7U$(&,G5I?.D9=I#E=>`5XZ.'4\M)M?YVZ]!5"W#_&\Y53N"`^9?X1^N^@GSRU M>N%2\CWB),3C0G_Z[)TGEK1*YB'TCZ&?75VZ=(YI[#+Z7T)?N6-I=?F)XN'O MH_\]]//G[OS\!983S.B_AO[^<^>7SS4(Z2;$&T7?Q`,EG`]G9"8_XV.0(\:5 M_^MWV)?M-"W[-LZ]G#^YH?-"_35YF; M#)(I*C3(--YV/="[U2#2UIXV\AN,]A>`+>Z)($42"0&=P`!0!Q:`%>!NX`'@ M4>!IX%G@1:!]$:.Z&L2_"10V2)SX2:_;,[!!4@A:0JM!AK8PN)D,D0X@#52` M">`FX';@(O!EX!'@*>`GP"^!]D6$^#H:;P%L<8/4C-')!H(+$Z&[0>JN#5+% MZ+Q==?$`PJ2N3QM&6.HF?Z)!LGC-0B]O>40H]\:9W^=@HD/P^^*LW%NI!LP= M>!FE#JHETOU]:(W0_KX>IB4P]$F"FI2;*MW>PT2PY)4-LDN:^6[IP>ZG11I7=TI.IA5J<_MYPF'+?[ND:W_Z:F M?%:SU)ZLQ6I)W3'\R.MEY%4FWVX0!;ISP^`24)!5`"L(6W'=R1_7Y0BVLA!$ M%H+(0A!9""(+060AB"P$D84@LA!$%H+(0A!9""(+P9TL!)&%(+(`[;U8_WPR M+_0VD9C>-F%2@K*RX]6U52S1<@_E\OE]7-JJQJ7M8?U](Q"\@SXQ)YR<'S]3 M3YTY??2>P)QGIIHLQ=O#Y:E2>3==.CK7OW!^Y/2%8_/%W<%L)=YU>"+7KWN2 M#;S?!6\%#OIP@^0*/`#U:@`YP`[F=M2XW.(K@Z\,OC+XRN`K@Z\,OC+XRN`K M@Z\,OC+XRN`K[_"5P5<&7]#"B*0`WF$X'9\J#-XBR>AM$>V$(7["52Q555XZ MZ19U7ETC[!KYE-HJOUOI_R=GF/),#X6*Z@PYNOV:- MYP936C$F_5E*^E8O%>>_,)FH#V,\&,T(AF=?(PD]^TXHTK,%#C&2U6_'<-M&RGK;AO8@W)NW!\$AY=5$ MK;]'N$8"2\0A<`X9+2[P[@A-M5+)5Q*_05]>/.!B9CG?'QN];3P5*M:+I=DH MLP6RHZ5@CQ9@LU3;5<_.7E0EW_8/@CVU_+X]@9[KBDI1=DW1C>,LF(DX!XZ> M'RC,#,C)+I:>VIT4O6JX>SCMV3L3J?\P.5?OG1S.')XL!M+<#IL?X]_[["4D MZ:L;)&"49,"ENYH=KF;?<34[7,T.5[/#U>PP#CMS MP]7L<#6[[FJ\D+W(O+?`1X65;/'-#1T*>`J\&JQ7JR'.%R"$AL,(9>\(A3Z& M-J+>URO"+&:\#STR.V0)!X+C6KI/,)GHWKE1T7)=O7*KPH;92U4;=R#4XDS^",]\'O/H^\,FEC]EA)!0S;G;FZQJ!E M`KHF"GS4!MFU943C`E3P*1FZEKB-`>'-5KM[\U_5-8M&5_ADMV7<9I'[#R2O MKJS.[K;X(H%Q34M9Q9&Y`='GE^*)E">1;Q/VS^UILP4[^R)]Q^/21*FRJ#(O M:[OR$76F^\/A;%*Q]L6WWZ"2.A1PA+WV;%Q2[=L-6NG8'5!RD?9R5[FKU,6N MOU:/W)/O_9_5X[_7XG^I0*UZZNQG5J!+9_Y9%3@#_W4W+S,K.+IA++]ND"2F M3P%)UXY+HH^V#1L!P:NGY<$>>+`'I>1!37G@P1YXL`<>[($'>^#!'GBP!Q[L M@0=[X,&>'0_VP(,]N@?;,%JT=6*)0LOHCI91:!F%EE%H&86646@9A991:!F% MEE%H&86646@9A991#`T75'&FY7JI6+OM2!9OMW/W-BS;!NX`'@4>!IX%G@18!72%>K(OC^G+ZZ/\>-RHB[6LLMN-6JD#+W<4ZTM5BT M:EN+H[%#W_[(H2H3M7PY4#M3SX3[IGK[#J:9A[K#?=/ET7V1\G1Q`D<5&)8O MK/DMNV^^:[`PLTM.]D[^JOO(9&%Z=^>1Z=Y)LK,N[F%>\!;U^/3YJWJ%XF^0 M]@:J:7,KAI-G9DMFG]L'%_.Y[%:3S^*P[%F,LQ`OS+=B^T)RSFJB]"AC$_UW M\K$_Q'F@H9]OG]G`PE-TJC)H=^&DR-M=+77]4->_HZX?>OFAKA_J^J&N'^KZ MH:X?ZOJAKA_J^J&N'^KZH:X?ZFZ`BI]TZ7NIO@EL;F$W.) MZD0R.5Y1`YE2.%1*!_V)+G^DE/*S6:4ZG4]/#:6#:7XG$_#)66]^C*[F1S-N M7VI7,I93@S;)VQ'Q=L2]%EL@$^W=EW6[T\/=\;P:EFS>CK#'%W*:\]A-U.9' MM,:^"SE+AL,X#9K[CZB)9<%!C7/#M3-UU5NN M_E:94PZ[#M>8X)6[@LZXTVD/MOMD1L=.PGL>?71J^^=VGQ12O*+`9DQM3I_5 M9:7%*?WC/''">RS8R>+D`P$AQ& M@L-(![/3LMAM!`7U03CUXLU[:7O4NG8"RQTRP93 MC@P?>9:%$<$R?8P#UO[0]AVZELWGFP7Z=\S;`1_GM'?FYO-YKL[B,68)M&;Q MBGHN,V*<\O)\DMZT^`8;.GJTSYF,V:(VIUUQ*L6T^C[II1U04FQ^P+"T`1L;:;[-W[4@S#8_YGTV M0MSL8'.37M_\F/Z^^2$=)"K+$2?[@'2B_SS&BY(HM=`O,0=;$TQ"0J@(KYIJ MIC?;;F[[FKEB_J+Y'3$KWJKS\9+SB%,%6M':^$<4=MSX1H=R_?3K9A(A9/KZ MF;WU@]W[E\]>7+ZP0-PIE;F1S=')E86T* M96YD;V)J"C(Q(#`@;V)J"C,Q-S`*96YD;V)J"C(R(#`@;V)J"CP\("]4>7!E M("]&;VYT1&5S8W)I<'1O9`<5WE_K^]K>KKGOF=ZSCUFC]G=V5G- MGMI3TEJ65\>R*TN6==HREB6#LY$I)W$(F$*D@B&Q8ZY0)L2(6(0%3'FE!6-" M08C+H384D!11"'^$A!!0H&P"J9C=?.]US[&'7-'J=;_WNJ??]_O>[[MZ!F&$ MD(8>1RP:.WWAY"7\':8",Z]">^7TTB,I[L_PIQ#"S\`X=N[2?1?^]M[/?03& M+T`[=-^#CYY+_^J_EA%B)82L/[G_[,DSMWR7]R"4_2C&,-G4.JA MDQ?.OG;MS$F$\C!$K9MO92U>O@H\[,[?\QT-BF,;?M#AZ:@$0D(1EZ"E+I"BXXZO2Z&QG(1![D13[D MWV&%`+0@M!`*TW$$6A3%X!A'"92D+L"I+O6O@^9*ZGIU/TGSRQS.7J&"V>O+':E MEM&AA?-P/+Q@+8\M1NO=LXN+57@.1Y[#T>=<680G/.`\X0'Z!'C`;^`FOCB; M6F;S=RW,+2P_/AE='IMC%J+BW"74)<4SK]S/N3(+(+, M0AMT)/LIA^`9\(C%*U><$9.WEE^^UP"9ZJP$<3B"$?%:$3A%:`QA[O+N&TSOA]"::W M9X0I]W4R8D\"QCJ327?">(3!IJ++]&M5;)%J$P19(Q5-`4C-QU-&=LV[@;J@%LSIF<7T0AA MDK/Q;MAR-VR\F]Y$^E/TIG#7-E[<0-W.,ZZC4?C\#31>OWWV9HT:5:+BJJWB M%M@-A8K48JQ2S]@@2I42!6\G"EG&AQ`\EBQ@]PAY;)+T.J392AXO)5<@J+,- MBN4+(YCL)"ZYK)C7&[-<>HJ<4[J[)1<.YUK%[SFT9`X\_Q>L3GB^A\[8S[U=2NKI9>EQQ*%D*E MD8RJ9D9*O0.&T=?2M2NE4@-IA<.G&1T868$_\*$U1G)$71Q1ES.1)Q-Y6W]E MT%@7U5C9Z"Y5?(%>?Z8\@BLC(@%7MOPZ!K1<,(')A7Z"M9#1V4I!_*:H?DY5 M>,:(I%+)D-LE8EY2O(E"6\&05/GK7D53\<\4361?.[D8`&P:(VM\<>+@D;FQ M%LQS6-,P)S'=^T^>O3?OT6"DXG`RQD?3/ODO;]U"="^KP,=/`A]WH6.KJ%AG M7]%F7Q'85P0@Q2:WX2/8?#8V!;12HA]0@`T^8$.AYC8*P(8"_:-NHU(0B!5V M@BTV'`C88A!P)G`S"6QR"")3/:H*LI2*)]XR-+1T3[5ZS]+0P-&)-I$7&>T^ ME>':!P9OK` M^G_*7KQ[^OQ,QAH_-[7^@E=>PNFYL;$Y_([U3E%FM.+>$[T#]\ZTP$Z#F',; M/V-.01QO1R=70>,\;!995H1E\VN(@''$N(DVW&Y[C"IW'X'2GVN3+84_[O&N-PW\&Y)(EY2DM9= M7AF0O58??^4&.-"7/ZJX#JGF7YDJP!%M@(+K>:]ZW*50;I*]N0CX]#ZEF%=U>5'141W#=>!7.[J/1*O: M'KD,FV=*G6`^7UZTZ/8#P&AS;` MZ$5YHO*:#Q$,1)(,1V!$!$9V[C.(8>VRN4FV8S4!9"]9H+$\7;2NRZ_".@-H M=)4:8;IN9D6B,1>L%=^^WC:-=9>LWC(X([8RPCH2D&"4V5%9E01/C?;FCQ1= M>O4SLDMU*>N24JA.)<2&UDYQH40ZYE%DC=-PZ2EP0M3]LC*7*X_$7]BNP,L+ M0KJSIYA@%=;&MO$?S*.`+8RZ-S/#88*W:QN]&XYEL]P-, M%7R"K+]$D+WH]_3TE]LBJOD+X.[/&PK&U7WW3;4&9)87M"9"87/]E][RX&!W MBN%%;#.8Q('2Q@>89R$.%M`LNKJ"[@!`^Z&Y;D(?T`8!;9",P2%VU")!!^Q6 M!T2"#IIO%]8(Q^`VN&6FEG?/`/89"*`S3K"HZ8DA:F&:]!0C$[&&1VYQ/#)1 M^'5(H9P<:QRBZC@(.4ZC*E\ID.06$@8[1VK$UOY*@B56SM8RK4;@#0KY6JAE M0H\*O"SR'J]7Z!WL.?+PV-C#1WK(.5&-\/Z`(;)7K<&.J*BZY5`ER8+PQ"X<[Y:#'Z:QN!.]"0ADVT!N;IO[(86OUT,MF^1 M0?MQ.`?6".=N0&4<1SPPK!8F_$2__B:%MY&)-EOA%@B!G=ABI[B*D^*2,.&$ M;;;<2PA*R)KNPD3A^2W1`[-7BY95O'J*]47C(2.P9FI+(W-G+JY_L.9;NQ^R M`@%K_=95/I8MI$.,"0ST/&?>.75D;I-[L.VQ%7*SMP(GQ]&?KJ`)H,XDM`E2 MYZR1*JA1"4[22M"N?T*(LZD7`NJ%@'HAJB,W7!JP+\G0"4-KA;9S-5B$Q:-. M'FA7@X.UM&X0"#@(!!RD!*R(P1%,$C:G'!3`5,DPCH,U:CJTXX@**>TJ;]^G M`0_DW-C=HW,7=D>SU7UW[JMF^W9G]@T5M"F5AP*KTDTMT3MFM>_*>!1>,DTSH;B]LBJ\CQ,@J7.%BR/Y[DI M*^,.A!6W`%!BP*]IR".2Z*@=GZ*-^$2Q:P2[UI1#.#EN8Z(135:144^8#,/. MMB)K]9C6V\B%(,*`,QO!@S3A>P7V_UH]`?+4>M><<+>DFI\W57I8OT(#'D9' M8/^_"':10P=6P3AX9-)5)>!HG+Y*(J,X0:$!":R:;PD268-VA.!J^\;!#$%8&<3ZU,,.SXT-$YYVSY[=M>NL[/M-HE_OOYZM:>GBK5Z('E] M_&B_W]]_=+P^1_D;!KV_$^0O`POM7":[/3K?@-V`\I`&`]!A&OR24('RJ!&7 M.]EZ``@F1.+5?O(MW8AF2(]^=Y+CCR6Z?/+8UX(3"0$*V82L_D70?O&,HQ+&?G&7$H MU/\8Y#Z##B!;YB%HAV^;67C(A,<&0S+7+(UQI7IOK].K`V0JO<0].W%O"V!. MS#2%O"T3/8X&/ON/@5`ZJS&Z%??YUD27*Q!-Q`+D-89T57*Y?,&`R3*$MR*Z?=[!$;P!@(>59-?%%FL!V+Q:,"E29HNWOG`VXL]#Y^9U526%(TR MT[K[X)%#N]M922$Q4I#9MJ&9\;)F5"=FJGDL\623>8G-#4Q.#'I]0Q,3`UF6 MSJIL<>+P_*'=+0P4KC2.(>9!O`(5<`^:1)MS&&4'\]HA')9@2_*4ZR6CEKH1 MA=CY`6$(6!OQROF&:H5,(5/!WWA.T!@UV]J:]KO^WI4JC22@PGB:521%9G[, M*K*HL#W/'=1X/K)_?GZFBY4)(61^[\7W3M-R6N1,GT\4?3Z3$YFG/DNXD0>; MG,8O@>M<6H7PP4'51R1KL^OE-O"Y;2!L6Y-CE0D4N0FLETQX;?O,U0)[#NPS M!_:9H]Y:!I?;95^2H!."U@*-FNYFO^K4T:2,#L3Q#F5TD,F#G^&E?-^(53E_ ML*?GX/E*]X%JAA-E[82*@ZWE1*S:F4AT5F/A4B$,O,#/57ROR`HR[_>[]7AG,M41UQ67(?`2)X).AC=N,1;^%J!^:)7H`PR(Z$0' MSXA)7I[OVNQ6&ZH(D8E0TT2:3*1K[_:P4TB3VBA-"VG\!GS((+4VIF_Y:'`& M?^L3['K-[F^O307\O^O_^B7(!#5-^!+.VIWUJFJ:*GY)4WE%$Q9.R_H[=7E. M=C^A2QH6U/5WJ>`A./T/P@0C\%@'C#ET[RIUI;;W#9+X6*]%XT3Z>!,M)&\B-T.I/VZ@3]L M2TXPO)>B.2Z[KU!,=EXQ"0<%;-*+>DDTXT`@.YJAS>;8$+N1'``!-U=(-&!@ MY1MNTW33`UYI*(_T\&/0H^OV@P[WP+H#Z#2IW[BM]5MS+&ZLO4VI;U+9W0`R M(:117VL1Z2!18YL-%^P-$_L*6"N^Q5T65?\Y;[N]V?TTR_9EB1ZO;HZS* MAB&O*IZW<-Y0Q*_[1<`D_;>[MY1G*#PV8.4+6=>*#5Y:W.BNA-EB,]L$*2)#O68/6^H^`L.$VZY MU56U3@;!>,J0<9^S*;8\A-,G0)X>]-NKI+HC>]).JCN2?W/-%6BS(,K6+*DQ MD2`3B::=Z203G;7J+T$SE9W%.298ZJ@:'^?`C\ M.7D?_USC>Y8,K3:XG:H-\A5,>(V\7"?[`;>0=SIND/A?J/#`W.5R*T M)@8_P.N&G23`DTV::'YINOEKA:1! M7ND1JE=JU5=ADU-L>G7Z_?ORJ6S;CUSL9R3WP[FIOE2J;RJW_C^LZ]92+)F* M7FOL_6-::J"]6$DY!L!`48Z8711?)WI/K>YLQD?JSL+_%Y]34.Z$;]O6;P7< MMAUPKAEPW0;2^>;2\Y_>TY',I=9?UX5KJOM>-ASUF^(KJI=?[!Y=G%W_BJ3_ M^L%D,!K]1$,'3PAMG2V\!,F-)CWA&>V?FJ;*H'D-?@/L8`9]=07M`0O8"VT/ MB-8+5.^%/K-&WEK`O%-K]AKDO8Y3:P;H7QZ:76L"-=8(8>RZLUI37Q745P7U M59O2(\=%[!1KX*)!WGHZ!A(%`XF"@43I(J0J':T9R"@8R"@8R.B.52G7E`_Y M=RA,:Z;47S[0JO*JR+:.[,ON.M0?Z=Y[9&]W/)^7(Z5""+N&5$Z1I%QY=W;X M2%^(7O0GDG)B:C"//_0$R\NJ2_:WE./%4H14H*8I8UG3()EBA-_E6%E2I'BQ M'&SK"BNRZ7.;,@,W*1Q/:[T\<%&`_"))WA.#7NN9`=K\'9.R-47>%A<;$P:9 M,&Q-NW"U3'W]8S#OSC]6-V*'F_6WI!AV&OP[#78;K7WIKG&\:-4$*+V\;$Z1"4IE"BADSM!5ZK='14-/X% MS<0?OMDR4X['RS,M-VMH7LM;5OZU>I3$J`C[,@*8=J&YVV9YW62B^\TRE$;* M;U>(\7HU:-_R!&L0L(X"UA9TO^T)DW5/**[=@*U*(DR_*";?B8762/J. M-N]40P5A,A%NFLB2B:RM`H-T[`2@?%NX06_]:PK\Z/.6 M$^ZA7^(P^V.2`GT]$5FKGX,;'X"JOPWND^T?8=#/(&9C0T(^;F']TQN+W,"V MWP#E\>NH!T.MSYQ&%K0LM"+S;=0*K0IMCOF(W5@%S>%WHV.U.3*&?LD9M\+G M8C!W!/IA=AG%X=P"/]:!+Z_=`?A&O#]%J1SLW`.4_;1]`T7?\T M_950&OX^`?7<3YEYYGML'_M)3N`N<]?X"'^,_[[PC)@5OREEI7=)/Y2?D&\I MEY6?J'>I?P@V?EC[GNN,ZSOZ47?$_9C[WXQCQBNV+L!+/8E8>"KC:$@A8122 M'>QHV./H1R#K'YT^.C,YUSYQ\=*ELV^[].#)1\YVC%]\\$SMEU+P;^.CY+<%E1($J>;#V%@@;[6"-G5`&EU`?*D,U48%*8A<$DTDTC?:@O>@. M="@M:0'>3;Z?L]\FP:'O[EX'6*12!9VM(@A&_:80A@&>` MMO:(@5'C&MMTYPU`R"&11&_[UT8(_1_1"I\0"F5N9'-T"!;("TS-#0@+3(T.2`Q,#@Q(#DQ M,R!=("]&;VYT3F%M92`O6D9:1T11*T-O<'!E%=I9'1H(#$Q,3(@ M+UA(96EG:'0@-#0S("]&;VYT1FEL93(*,C0@,"!2(#X^"F5N9&]B:@HR-R`P M(&]B:@I;(#,P-2`U,#`@-3`P(#4P,"`U,#`@-3`P(#4P,"`U,#`@-3`P(#4P M,"`U,#`@-3`P(#4P,"`U,#`@-3`P(#4P,"`V,3$*-3`P(#8Q,2`U,#`@-3`P M(#4P,"`U,#`@-3`P(#8Q,2`U,#`@-3`P(#4P,"`U,#`@-3`P(#4P,"`U,#`@ M-3`P(#7!E("]"87-E1F]N="`O6D9:1T11*T-O<'!E-KE>PMT6]69[MY'DB5+EBQ9DO5^'CUL698LRY(L2Y8?D1T[3AP[L1,[+R?$ M(0D0S"HIA9:AE+9`,M,6NN[0:9G+=*93IK2%"9T"P7T,`Z4#M)WKU=M++\&K M+RZT0[F4VY;20BW?;^]S),LATWDL9JV[UE7R^^QS=,[>^___[W_M?40H(:2) MW$P49/#HJ2/7]-_XGC_!E6\30EN.7G?:3_B'_HC]O?R:XZ?T[@?OEL[I[N-7 MW7#Y7_[LB0HABAY"LK>?.'9D\7^_>/VSA.2_BMNS)W"AX0'%'IS_&N>A$Z=. M7W_OB&&>D#X[GI^Z:NGHD6G-<"LAA1/X_O.GCEQ_C7!,82*D:,&Y_^HCIXY] MXWM/OH!S]$\BURQ=>[KQ[QJ_@?,#.'_FFG<=N^8\(1V$]+?A7,DF2BB?1?_>!F0<$>59$&M:91JVO2&YJ-F$"+V6)MM1%B=SA=;H^7^(@_$!1#81*) MMK7'.N*$=":27:GN=$\FF^O-]Q6*_:6!P:'A+>61T:UCX]LFMN^8W$G^$SY3 MT[MV_WONAWSB$^=)X]3<@Y1^=/X\7?_P^3+Q/$H:B6+A4.=Y0N-^_\C)\CEZ M&"="'!=B`;04<..\_ZS\[OGC6/^H_<63QG#+,C_CBV-GYI/\< MV3UW$G]GY@+G!N==M>:Q^?D^]*-D_2AY/V?GT<,5<@]7\![0P1IN4L4G_.<4 MD:FYZ;ES-Y==YP;+\ZY`P#]R[K&IN7./E5V!^7GQ&'^AB_NQ9^4R(!,X]=O:LZRPXX5?$P'E*Y`O@E-VC"(^!B%\2`&,`\YLOHNS$^L7MN!#,)S'<",Z0;V'E<`/")FN@@9%42K`(0X8`I M$#8%3'2YLR6EYQN3R\0# M%"LZSA./<9G`+GB[UAP)CLTKTKTF^>B0K[M6NE+F MM%ILINE<6@W*B)Q$-2EJ1+XKAF\[\&T3OAU2D0OH[&60<'#(!0!W M$0>H'90'C8/F02=!-X#.@#X)N@_T*.AID/Z@U'\&_6;E?C$JKA16I3D.K$(K M3JZ191*5&8D:-R0?K4U+19QXG'4DM;I2.=%+;=9TIJ3(]"2$),VTVM()&LV( M5H/":O$*-E."VC)>M`V"PIK`7=FK9S77+>:ZIOH"8G?64CQ@F;4H'KA>=),#BZ# M.1UG3VF$.!MPV@J*@+*@4=`>T.6@ZT"W@NX"W0MZ&/1-D/X@E/(_T'@1)!R$ MY-20'($=,+[!74XT4,;XMX>V]A?'AB9WMK;W/7GM3VYZWX_>=?RUZX:O?]<2 MH>MOK!?(]_B^M9#WWKH6P]]ZZ%O/?2MA[[U MT+<>^M9#WWKH6\_U;6(:;93GI4Z7*---%)JR6AH:!_F40H.C_<4GC_\",[IV MJ??:%VYZ[X\AJR[8:AM]$T(:6,:IP.=%F2&"&E:DMF8%O=,DXYQ-7B5/'J/A M!A6.C;`^"@3`SH",=(9.EB]<*%^@ON>?+^,_.MZ]?C5YG"S!5#J9O9":O1`9 M97NIB58JXY4#13>P!K(=-,`+4U-L?%QG8VO(*YEHI#'5QAK][.)\-$RNY?P M85?7?['^&EV`SA3<^Y$DDT%7JI&F*6VM/#=&VX3GUZS"S[G/BZV_+@C"D\1& MTN1;YTD/;LZ`>L"='=S9&3NK'(&$^[P(RQU`HZ`]+.T`70>Z%707Z%[0PZ!O M@F0$$B`00T';&>8]8,N&58X?`_!CJ.+'`/P8@!\#\&,`?@S`CP'X,0`_!N#' M`/P8@!\#\&,`?@SH'E(PPURQVM42NW<3M:F M!YT#`\5.M[NS.##@;#NZMUC<>S0:G9G:FO7YLENG9EA[+.OW9\>F9KAF]N+/ M(N2J)2+#9Z.,3QF/),D9ZJHRU4&F.LA4!YGJ(%,=9*J# M3'60J0XRU4&F.LA4!YGJ(%,=M\D@>FQE82HIC2#A`+*V$RL/(5&@0?*\+'9% M2@($+3!!JPT*=2`3*"ERDI.%H(7X+&T.9L+N[G"KK;/<&2YG117];Y7_TA#- M#0<"I2Z/6)Q.],X5W/09_T"WKR68](1[NY+NUN[A^8&)0#H>M5@3^;%D]_:T M*[+E`).M9_UU6H$\2A2R-1(3GXP1`'#)(G5)_DD#66BJLM!`%AK(0@-9:"`+ M#62A@2PTD(4&LM!`%AK(0@-9:"`+#62Q#'"9B(L'DB"NN'A$"D(#<5PW\K,X MI-2Y*DDM(^D@@W$SU7$S&#>#<3,8-X-Q,Q@W@W$S&#>#<3,8-X-Q,Q@W@W$S M7`[RY]KLCEBO M;WR[,$L#I;EL]_QP=&`HUAOHVYG(3&<]PJPQD`YFQUK#*5>+2J6D?SJF,(GI M@#\MFO>.Y/84O*[L=&;PD$$P;^M*C25LP>),VM<;<^3S[KBGF?D?-TORH4L% M#'IZF9<)-2?-'?1&.L6.QE4YG]-R,]#(9L!Y7TKGOOG>`V*P)7:\C_.LC]DIVU MPBU6DSQ!3MQ8]\JD9'-PQ%`L58C9[>\[KST1MT&NH-)TH M'2SY0J699&C<)D2$JR1N>5VV2WSV.&&*-V8O1NQPXW8X4;L<"-VN!$[ MW(@=;L0.-V*'&['#C=CAKL8.-V*'FXF5R;@=,FZORK@=,F[G__*@<=`\Z"3H M!M`9T"=!]X$>!3W-,A/852.TEEYE\SI/\LR^$L`=FVC"R,`7D,''?%V(M^UR M=DE6(6?D3R@G'NX.`59\9[KU\<[!R9B:9F2F(\ M);0?FL[T/>'L*`1\^;C#$>L+!`H=#EZOR'[0A]C]0P8(R1/&C"RX^.7@@H19 M0J@?TO-7I>>']/R0B1_2\T-Z?DC/#^GY(3T_I.>']/R0GA_2\T-Z?J80ILD8 M-!F#)F/09`R:C$&3,6@R!DW&H,D8-!F#)F/09`R:C%4U&8,F8SP+4'-/23;7 M4TTD*:=6RR0L^[QPG>Q9]I[NSE;=E:2";,YF@$8BM$[LS`IN1=X^_X%W1X?G MNM-[2D%/?B;;,V<7E).3Z6W48(ED`[YTV-HW^X+] ML^F>N9*8Z13^^+9>>L27[X"\LYY`,>EV=O9QS/-\3%#QVC+W]LQ3*6>>#2ND M/N.LMV)X9&2<)CBDQY>6Z%U+2Y7G>-XF\%SS"=ZWD8Q907F/",3B&2J/7)>053Q3#?0+ M`6L7_6U%LUPNWUHN7VI<95**9@WX1BE5;]9P)FQ5)3"HDMY7W/)BZ:7R/Q!A M_4T,?(?P#,]UP_*3U7J=R-Z20/X"FP7OR4739@6J[8`M39^^07C/%RHO'YFB MBA+]WXRV%KXA3BD3KZ[FCAWR``XIWU## MPM15"U/S;]M!>=`X:!YT$G0#Z`SHDZ#[0(^"G@:Q&,#N=W"=MB??*9_7LLHB MF8ZTU+`2!():<$PP*PP"2(R)(!C2R36%SLBD)]:DUXHVX=(S9Z0PTR!2Y,]U M:40DFE"(BMJW]W_=EXO9MTY77J#SF>F<>W0XG4N)QLZ>C.VOG_/V=CBW#M!/ MO*"VQR/Y/$VO9<7\MNCP`8-@V9W/;K-JM2JZ=NL;.E="+)8Y/CK67Q,^CYHF M3$XM$Z^L`Z\47;R8GQ<^R0N?Y(5/\L(G>>&3O/!)7O@D+WR2%S[)"Y_DA4_R M5GV2%S[)RVICIDJCK$J&.HGS!B/W^8IZA\/R])JG:17*"YJ>R<7>7>^?C;?O MNG'WF7L,"PIO9CPY>*#@=A?V#TZQ3P!@K@?X(N1\WXN::[;-?- MS#I-F?,$N,U2S1S^NN\\1OK(\IR&YMX(1[]_K@9]N,6&'14:S\X_\2O(4] MO<7]);^[<'"H;6MO1+V@S4T?[YM]_VQ'8NZFJ8$;Y^?I]5.IV8%0]E M-I0.IU-&N ML(+H(EFJ-\U(NWD>%'-`7;1CGT#??6*?4+F=SZ%_[0D;WKPG?A2V8 M47E^ZSQI2[*HA"-&M&!$RSNZ-M2.7KWP%E]/"RVGAY;3P M3@LOIX67T\++:>'EM/!R6LG+->,QR;,MPZ-+=B-*:T/"IF)I M4SYO$#[L+AX:&CI4=%>/"QU[;IZ=O7E/1_5(CV5/SJ33,R>SU>/X;2?Z^T_< M-HYCJ73BMII?OPSZTT""9\X3:[)^)0CGO)Z%PB2.5>!85>58A:FKP+$*'*O` ML0H.,42O65Q8+O0KF#I&: MR$F*J!`S\BK'Y,+/Q)BS2:D2!+7VBN9FC2`H=+:H;ZAP[>4=WWQE2]'56>21 M(645DTYG-AG1M21[LDYG5]3=(+1<-K1WL?+([\K9:,JCE>PU#'LY"GO)DX^P M',4GYR@LJ[/P-L>XL;969X%,+%696"`3"[\S#QH'S8-.@FX`G0%]$G0?Z%'0 MTR"F\>Y5J=?"*L]A0G4Y3.Y2.4Q#K4(5-T#?(&U[.U"3ZMAC"9JZ6 M9RXY.,6*K,],P/K:PJMK3R+=N%5X[]04[VL;9`[GA=*7APXI+]0:ZZLG&3E: MWG?SAE3@`9&H!B,9UFAEH?+VA87]AR]?N/OL;1^G`GVJTGOXZ-'#[/BQ#YZ1 M]JZ%8WS>CDV^5EJVDNJC@!D04XAF>KQR])^$;U_^%B#TI\*5:WQ#"YQ^',\W MD\R_&$&D?J0M!:EEN+AOWC^+),)___N%.X5[CG]:^),CCQS]K/`9C/6`'$BR MPMS:Y^0Y+_(8$I5W@+3)C;I.@3O4?)1&N059*](HD11FQ"CQM[^]XIN/G7[K ME2N6O_0NNE2YDT8KS]$ENA^EDDW2Y=AZ@2J`>37+]=2RS-5RQ4I7Y9QO(__: M7)_2C`B]BB:J^,I7KA0^4?[]X;+"?HD]C&INH4(J0!L\FL" MZP7R%3Z'',O7:"U?HW55<\/JICV3S9F4A\5#:]J$67R@K/AT^?<_8W=V4XT0 M$1[%[!VU?90-N4G1E$K2HDT7MG[IH=$+PJ.5G?1$Y<_H@WQ>'Z*_7G_XHOT= M#PUDZ*^W=7=S/E\6MI,OOFVO!EXKVGK+X![A^8]]3(K%H?77!:U@0HT]3)Y8 M)D79U(L\&W#*4N>QN(A87$0L+B(6%Q&+BXC%1<3B(F)Q$;&XB%A<1"PN(A87 M$8N+U5A<1"PNPAVQY<<0*7+O;4JR^O$\<4*"\15IM9NU4VBGDI*FRTRR.7G! M+\?7O3]O2/MR5;V]H";KM#KU:W=`B]L:C.;$Y'(N%:>O>EG;1IFGQ M6/UA2Z-:)\E^"V3?"1NRHRJX'U5SDBT/DMKR((M[]KJ5X821[7!)UZK[*`:V MJRYY?0>\OJ/J]1W\'ZOK\Z!QT#SH).@&T!G0)T'W@1X%/PGPQN\\JT((Q M5(C'2]$64Z38T=X?-;-0.&+SM6ABXY?EJFZG M=74[_8LY5:2P(]Y_H-_KZ]]?.'JM8:]FZT!;7\AD#)<2V4&ZD-@2MW9,'.OK M.S(:.7&X..S/E$/1\=Y@=L,>#<"$&9CXBI0+6>5E2VMU5VZ%[16]DSER:RW7 ME]K5'=I6_MH#*,E>?0@2*[?=5FZS1$H\F^'_J[FP1_9\'E;Q7Y0+JUA=L%ET M:>M-QE"QHQX,]`Z.F82E'C.5B[!P07BF\AN;SZSIX(C9%H]TC-9DIP`^M)#& M_F5D,E*F9#$R&9*:#"WRMA;AFSEL<9/G]*$:'TYY']+)HXJEEEB'V`,,`P&V M,(\L4%9^+I"55X^9263IWU2^+[1&,@&V$S(SHQO)QDIM+91^4+#F]H]DYH=" M@J^TOS1WFO9X,VTV6S3[0+K;G>P/)D_,Y=O&+BL4%L?:YJ2X3MN%[P*7.^OS M&6FM@,U>ORH=+=6U"<9[=7^GGF4B>TO65M7R'C'3DP5H;1FV_=#@H:+UZ.SB M8M"G<^J:?$VCXWOIT*Y3:E02BQPN]"QMVK)0EJZ]G-0N;V>T MLY4.1&>Q?O.%H7+35ET,D5MNU);#O3:/7U[^KKG6P53I"]F341= M=%9HZY\(W7CZU5AOT&`*][6W]8I&$QP>?6Y;1T=ZYY%$9F%KK+,KV#&6]C1: M_+987\AXTY^)^5$Q7.[Q^3/#P=!87F2^;A!_7H$?<++=2Z>L2@9(@^SWF.=W MRE'"N;&;OI%/L#5[LUS0F_FBF=-L7+:ENH, M:05>J(3$0MS>VU7Y*SH3&^EV:ZT!.S5!H*G9F>%RTZ<.+CVEJ`"MM9_A9Q+ZM/,LBZEO(U6?;F&'855>1]$*VM2>XE] M$#//PCMH,!*ULAPXN11S;[`?WJD((LL+6@@VA\K-KP5QOG>$-:#;"O\EOL MTC<+U8:_VCC'&S"7559]Z^6W$-@H;2MLC889#D;F5]G*<7RU5CDC!4FR/62- MO(;.F-?DBSDJ]]/AXEB++V9'ZWUM^9`I$>MJF]M> MDQGLQP3?.;)YC:O>?A3<%TF!K%7FCES*>BYI,WS"=19S;4::X47FZH'O?Y!P_UEPX.^OV#!TO]AP;]5$B.=SN=W>/)Y'C* MZ4R-)_.7C;>WCU^6SQ\=C\7&C\JY<@&YLNG_T5R9)NOSX_J\68ZU%^7*&=5_ M+%=6P1MK-R?+HY6WI\H<;P7DD2:>1]Y7S2.U_\EYI!:]VE:DEYNUM=Q1:DM5 M'F%0K\\4ZS/(MV>-E,?GS5FCZ3^6-5:.",^,;,X:*Z]+OJ(??W8(9KB&J%2" MU_PKYJROZK=1]@:-AAS[RA8V-:[^F3LX+8SA:5Z485F0Y45;.;+/\;0AG[6V( M:I7#VC[IK8@:8*/LE>6W;0'57H`\/2N$BI,=T9T#44^RW^\M=ODL_JC9VAYL M11D=S&^+!T=R8O?$W$2W/1RW.%-1^V>ZMK2W-$=*R7!WP*)6Z\V>5HNCN:'1 M$G`D!\+-)K$WVMWK,UF#`;O/V*"U1?GR-J$>X=/PY_LO_5ZN0GYOEIW;5B7= MT?K^.$0MO23($.Q<>0W_3]&_7WL+S)ECYBWC^'5MG'/SLW&GAJH,G MA'$DQII']01"&+V[M,^9L/`V+BM]Z_/@==YQZZDN7 M?^#&4]18>>W99ZGMU8<>8F_XK7=S7;$W$#9X:>$\M-1FWB+/7"5+1D>3P=OLB8F>LC#.6:CLM=DURDF5LCG0P^4/ M_TJ?P9B-J$WJ]PXWO[.;LP8R`9H)6`.M],N5AVFQOH)CA:&C M5;.`?LJ<0*:D0`-N@&9&S1&?Q6#S&HU>F\'BBYA'NYM;=$JKV]/8Z'%;E;J6 M9N$OBJ9`RO^P,^XSE8W>N.LA/Q!<;';XFA^.=/L,5"$8_2GQ$://WBSO2:YW MD#L5+9?(BZMKERR.[B@K6G[O4/Q4>L8..7BX'`8V[]77\ZZ6WZ?L7+EHG=8) M+4A%55?*9F7ZE!C,5'GNH-9T518VJT$ABQ/(*+^P:917G:5?!DCGDA] M+>-=JFN2BWDX+AF]E&6S8-\L!_OZ7S&_IIT4W@I(4Z"(`=5D"15 MK+\AS)$N7-]-/\R_WTUWK/\"W\=`>T%VD`?D!HF@"'N>WP?"LPGV/#_>OOZF M<#^9%+Y+.H3'<#P**H'>(!T8:Y=P-]IQ,JDX3J9PSP[AM^CK=EQCS]Q.PKA7 MP/5M>(XH[B%-[(CGQMA\<"08HYNR7YW^8/UEP4%"PC39(A]#[$C;\$P)[3CJ MPQ^@%O_!^J\$-3N2$<4L&637^??L.3Q#=Y!^].>C!=+(OD/;(/R&F(0&THBV MAOZ(M.*>+CR_`T<[_3SL@%$K9-G*W^ETX]\M]`"]E_Y2B`@SPN7"S<)=BF'% M"<5KRF=5;M67&TZK$^H#ZGO47U5?4/]&$]&\W#C7^%CC+[5>[0/:I[1OZIRZ M1=U?-Y6;OJ@OZE?TOS'$#=L-MQH>-OS$\-OF4'.Y>4_S%<8VXV.F;M-*2V_+ MA\Q9\^WF+YE?LP0M1/3)Y[-W'N"_@G_4_9[^7O,1GAK__V,!_0]D$LVCF/[5H0:YC MX4O=-N1/#DC-P[>Z_9A-"+EJ!/&_#8EP#/5,@B0A\Q3Z3R,3R9(0HWS"/\=;7!E("]&;VYT M("]3=6)T>7!E("]4-J=6'ML6]49/^=A_*0T&;K\_W.N>>>\WV_[SN_[UP32@BQD_-$(*6# M)V9/D7_0.]#S%N3JP;.GPT3[T._SWT.G#I]HDE^\K+?IGL/'[SOTK?>__20A M[&^$.(X?69B=__O2N9\1XBIC>/$(.BPO""UH7T2[_^+4/0NGEM&/]BK:)FXHH9K!=F(AO^!SD+U&SU=]&/FZCT#^_X]I73-# M+,1*&D@C-!O98-C81!Q$)-QW%VDF;@)DB`3Q$`*_4N/+I'&B_"*EE>EENO;P M\@@)O((9A)D[T\N$IL+AT:,C2_0`&BR%CF0$FI`*CRT)L;'=964ZO!A>W#J_ M&!X+'YF=7S+%M"MN+"Q.J^$ELJ=\%+^WE2-+I6G_NKHP/=V/>4Q\'I,VS^(T M9CAFS'!,FP$37,<@FF%Y<-%HL'EEZ=7'1OPA/M!XELDR) MT0%/^1@A-KI,2Q/:K9(2\?,.):)$8,?T".9N3(WO*8_"DLATFL<[AQ1YC?&X M6A$%>*#"537;'8NX(C%7Q$6KM?/T?.TQ\G=.V3M8_H0^Q=;6[^#$(/B\Q4H?2AV@=W4X^3_?6Z MI.=K>.U?S,?A1Y\U^K-J++.HE<4@1,@:9 M@AR"G(4\`KD$N0)Y&?(ZI&G_S6;R.RCO0]A^[F8SZ87IW"`8M@HXG#4#SG>L+)'ZR2-MS+:5/ET!-`3]#H`8KY(9K/ M!9GD<5BDEB#+YXJ]0>K-9VC!U9-A2M3!S%*+`TJ&%7J&6.^0D*V8LDEWI%6D M(.RCK:,M"6@;8,M&6@+0-M&6C+0%L&VC+0EH&V M#+1EH"W7T9:!M@RT@9\73,"G]#IYUD0TW0*TR&JVF^8S`@>BCH_BH'4X\CEZ MZ;M"\I;)S*:Y$24^,MM_^(+C,6MO/I+QV^V!3/0.NC.WM=N7'#\\V#\[ECA^ M.-L75/OEP$!W:#VG,NPJ^"=)?KI,NI"T'JA\>0^63W(3$.&V#US9X;8/7-GAM@]&V#US9X;:M[;8/7-GBMS^[#K#Y5 MU_7LPC[PP@PS\HB;808B`3`EUP-.GDTB"6BY0V_("YY#7BGO4EQ*AMX(%GW. M+JM*1`TYF@)917^_*Y6:@H/JG)`'0R&!S*RG![X MTS"[6OLTGDAOF^TISF]/QY(Y)^+;9P^_F>ZP9^.]N3_0,^8Y$US MPP.S8_'8R-S&\@/!!ZU#78,EVB_&H]Z;+@[>-95/;IWO'YS?DIC8[^L:TCF+ M_VQ'7#UDIJH5,FZ`@,4MP)C@ZEXA.D!*YRN_*N?$$I]!3S.6^!@V\)4$6:K,S-M0;\K5:JMT*+NS-]29IDW:ONC'[QNPC=>*7AY"MAY"!C&MZ+K%N#:N:O6D MJB&O#X0-!25`L?P;E0J;/'-FXOHU9N:Q^6QN_^=C8UZ]H09P#_HKW$0,)<9S MP@3R+TT>K.)'?R[MY"%L6@]A`!M$WRI&"$&W,=QW:@3,>]7Z*@Z('S9W(*/Y M(QVXV0"15G0]NL(?;2`=>+1*4H9F8*MO.>D+J@ZTE@16I=!?\80BMJ@BLHI5 MB@6#2K.I(N?&.HL[O=*N[OQ.F3'S]6LT%5=;&[WQM+?V'@W[U)BW)9IIJ[U+ M]^8VIUIZHMEXJF.,K.>+&ZFR_>OSA:EZVU?W]G_,E<(-N9*>0JYP2[^0*UOT MNLQKPT;8Y09C_0;08;%.58=0SUA.XQIG:J<[<";AOH`S"3@31VO(6<@CD$N0 M*Y"7(:]##,XDX$RB<68G9@VN:BQL)K_'WOU0(U-,WPBE%=()Z8-LA4Q#CD+N M@SP&^0'D!<@KD#!8/#YV<./&N;$X9:'!3""0&0R%!E195@="0_.; MX_'-\T-#"YL3BAN>B[KD( MS\6ZY]P%$9Z+\%R$YR(\%^&Y",]%>"["B_!)&<:2>5[0&?(F),?B_R:3J#[H!-M;W#(8UHNQ6ZH1QPW[/]"/D@_ M@XVG%AV(9@--]H"J1-4@O];>J;"V7=F^R3Y9[B]OS$ZTL?UR>C`4YNBI0&\P M+=/GKX]]'$^DMAWHZ5VX-1-/#AM[@GX'V$FDNZJ]/G#CI/4]8'"\P]CA#HWC M&XBCGO>ZJ1YO(WQFX1'39U#.Y/)B5*"W[AULMD?$:5$T/U\SVBRV947F/^+Q%G[)Z=- MVEY[#;09[`!M4LZ%0@=L$A%Y?1V^Q1M5O;9O4*OZ&[VVNQK6-8>A86VW(AA? M=QY?]O!/'I]AY<4I-G/IV2?*;!^6?8;>67N:SH"W[Z@]AW>M:^"9)JPI(4U1 M++&.6ZVOS==S&W.;];G='JG%8K7$$Q+?OT5:>.>)N]F9IWYN\UTV']OP@\)[R]EB`!TS=K%];VFHI?^O_"2_]- MM4_8$`E#XNR@=@W0[:#57:1(<8[A(BR2?M[&?3ZF2!^&WHIQ!XB%]PL97*UK MUS"_C&^&;",':)`NLC`[R]X0/,*(<$#XHREE>LM\S'S%DK(\8'G=2JRZ=5[4 M+H83,3.\L'%*9T>-?V,H7B-U'RS8'V1XQ^[;=HQW;5DX?G;A]-&#LSL6SBRD MAT\>GU__/V;MA_P]_2L^7NT?&2?>C3:1$=3.S60+B'Z\@D MZNGMI$SVDGW\OZ'_`I3^B3D*96YD7!E("]&;VYT("]3=6)T>7!E("]4'0I"B]4:71L92`H475I8VM2969EF4@,S<@+U)O;W0@,3D@,"!2("]);F9O(#,V(#`@4B`O240@6R`\ M8C0S,V-D9# Message-ID: Apparently, I had mis-specified the content type for PDF as "pdf", rather than "application/pdf," as specified in a listing of MIME types (see "Webmaster Toolkit :: listing of mime types" at http://www.webmaster-toolkit.com/mime-types.shtml). My apologies; this is a re-re-send, to ensure that future PDF attachments will also get through. -- Benjamin L. Russell On Fri, 07 Nov 2008 16:15:29 +0900, Benjamin L.Russell wrote: >The PDF attachment to the following forwarded message was mistakenly >content-filtered away, so I have modified the filtering options to >include PDF files. > >This is a retransmission, with the PDF file reattached; if this >attempt fails, I shall need to do some research on specifying >filtering options for content types in Mailman before attempting yet >another retransmission. > >-- Benjamin L. Russell > >On Fri, 07 Nov 2008 15:40:25 +0900, Benjamin L.Russell > wrote: > >>The following one-page Haskell Quick Reference was posted earlier >>today on Haskell-Cafe; I am forwarding it to this list as a reference >>for any interested beginners. >> >>-- Benjamin L. Russell >> >>On Thu, 6 Nov 2008 13:41:13 +0000, in gmane.comp.lang.haskell.cafe >>Malcolm Wallace wrote: >> >>>Some time ago, there was a thread about a "CheatSheet" for Haskell >>>beginners. As I recall, the CheatSheet was more than 12 pages long. >>> >>>For a Haskell tutorial I was running at a conference recently, I needed >>>a "Quick Reference Guide" that would fit onto a single side of A4. So I >>>knocked one together quickly, and it is attached as a PDF. I send it to >>>this list, with permission for anyone to distribute it more widely as >>>they wish, in the hope that it might be useful. >>> >>>Doubtless it is incomplete, and I have no particular desire to fix >>>errors or maintain this document, so if anyone is interested and would >>>like to adopt it, I can pass on the editable sources. It was originally >>>created as an Apple Numbers spreadsheet (simply for speed of creation) >>>but could be converted to Excel or CSV, for import into other tools. >>> >>>Regards, >>> Malcolm From andrew at swclan.homelinux.org Fri Nov 7 09:03:43 2008 From: andrew at swclan.homelinux.org (Andrew Sackville-West) Date: Fri Nov 7 08:58:28 2008 Subject: [Haskell-beginners] (re-re-send) (fwd) Haskell Quick Reference (1-page PDF) - QuickReference.pdf (0/1) - QuickReference.pdf (0/1) In-Reply-To: References: Message-ID: <20081107140342.GB21882@localhost.localdomain> On Fri, Nov 07, 2008 at 04:23:23PM +0900, Benjamin L.Russell wrote: > Apparently, I had mis-specified the content type for PDF as "pdf", > rather than "application/pdf," as specified in a listing of MIME types > (see "Webmaster Toolkit :: listing of mime types" at > http://www.webmaster-toolkit.com/mime-types.shtml). > > My apologies; this is a re-re-send, to ensure that future PDF > attachments will also get through. Unless I misunderstand something, this still didn't come through properly. How about a link? A -------------- next part -------------- A non-text attachment was scrubbed... Name: not available Type: application/pgp-signature Size: 197 bytes Desc: Digital signature Url : http://www.haskell.org/pipermail/beginners/attachments/20081107/14e3b3a1/attachment.bin From Alistair.Bayley at invesco.com Fri Nov 7 09:06:26 2008 From: Alistair.Bayley at invesco.com (Bayley, Alistair) Date: Fri Nov 7 09:01:10 2008 Subject: [Haskell-beginners] (re-re-send) (fwd) Haskell Quick Reference(1-page PDF) - QuickReference.pdf (0/1) - QuickReference.pdf (0/1) In-Reply-To: <20081107140342.GB21882@localhost.localdomain> References: <20081107140342.GB21882@localhost.localdomain> Message-ID: <125EACD0CAE4D24ABDB4D148C4593DA9049E969F@GBLONXMB02.corp.amvescap.net> > From: beginners-bounces@haskell.org > [mailto:beginners-bounces@haskell.org] On Behalf Of Andrew > Sackville-West > > > > My apologies; this is a re-re-send, to ensure that future PDF > > attachments will also get through. > > Unless I misunderstand something, this still didn't come through > properly. How about a link? I got about three list emails with attached PDFs from Mr Russell. But a link might be more reliable. Alistair ***************************************************************** Confidentiality Note: The information contained in this message, and any attachments, may contain confidential and/or privileged material. It is intended solely for the person(s) or entity to which it is addressed. Any review, retransmission, dissemination, or taking of any action in reliance upon this information by persons or entities other than the intended recipient(s) is prohibited. If you received this in error, please contact the sender and delete the material from any computer. ***************************************************************** From andrew at swclan.homelinux.org Fri Nov 7 10:35:40 2008 From: andrew at swclan.homelinux.org (Andrew Sackville-West) Date: Fri Nov 7 10:30:27 2008 Subject: [Haskell-beginners] (re-re-send) (fwd) Haskell Quick Reference(1-page PDF) - QuickReference.pdf (0/1) - QuickReference.pdf (0/1) In-Reply-To: <125EACD0CAE4D24ABDB4D148C4593DA9049E969F@GBLONXMB02.corp.amvescap.net> References: <20081107140342.GB21882@localhost.localdomain> <125EACD0CAE4D24ABDB4D148C4593DA9049E969F@GBLONXMB02.corp.amvescap.net> Message-ID: <20081107153540.GC25699@localhost.localdomain> On Fri, Nov 07, 2008 at 02:06:26PM -0000, Bayley, Alistair wrote: > > From: beginners-bounces@haskell.org > > [mailto:beginners-bounces@haskell.org] On Behalf Of Andrew > > Sackville-West > > > > > > My apologies; this is a re-re-send, to ensure that future PDF > > > attachments will also get through. > > > > Unless I misunderstand something, this still didn't come through > > properly. How about a link? > > I got about three list emails with attached PDFs from Mr Russell. But a > link might be more reliable. http://www.haskell.org/pipermail/haskell-cafe/attachments/20081106/ed21f119/QuickReference-0001.pdf A -------------- next part -------------- A non-text attachment was scrubbed... Name: not available Type: application/pgp-signature Size: 197 bytes Desc: Digital signature Url : http://www.haskell.org/pipermail/beginners/attachments/20081107/bbd87680/attachment.bin From jgbailey at gmail.com Fri Nov 7 12:09:35 2008 From: jgbailey at gmail.com (Justin Bailey) Date: Fri Nov 7 12:04:17 2008 Subject: [Haskell-beginners] Haskell Cheat Sheet v1.4 In-Reply-To: References: Message-ID: The recent Quick Reference posting reminded me I had never announced this to the beginners list - my apologies. I've created a "cheat sheet" for Haskell. It's a PDF that tries to summarize Haskell 98's syntax, keywords and other language elements. It's currently available on my blog[1] and hackage[2]. Once downloaded, unpack the archive and you'll see the PDF. A literate source file is also included. If you install with "cabal install cheatsheet", run "cheatsheet" afterwards and the program will tell you where the PDF is located. I wrote this for beginning to intermediate Haskell programmers. I found it difficult to look up some of the less-used syntax and other language stumbling blocks as I learned Haskell over the last few years, so I hope this document can help others in the future. With that in mind, I welcome your comments or patches[3]. Justin [1] http://blog.codeslower.com/2008/10/The-Haskell-Cheatsheet [2] http://hackage.haskell.org/cgi-bin/hackage-scripts/package/CheatSheet [3] git://github.com/m4dc4p/cheatsheet.git From jeffd at techsociety.ca Fri Nov 7 22:02:30 2008 From: jeffd at techsociety.ca (Jeffrey Drake) Date: Fri Nov 7 21:58:00 2008 Subject: [Haskell-beginners] Parsing Custom TeX Message-ID: <1226113350.22707.6.camel@darky> I am getting frustrated when trying to implement a parser for a minimal TeX subset. I am essentially trying to implement something that recognizes \commands (no parameters yet), paragraphs (two newlines), and text (almost anything else). The code I have so far is: module UnTeX where import Text.ParserCombinators.Parsec import Text.ParserCombinators.Parsec.Prim import Text.ParserCombinators.Parsec.Language import qualified Text.ParserCombinators.Parsec.Token as T data UnTeX = Command String | Text String | Paragraph deriving Show command :: Parser UnTeX command = do char '\\' cmd <- many1 (letter <|> digit) "command" return $ Command cmd paragraph :: Parser UnTeX paragraph = do newline newline return $ Paragraph text :: Parser UnTeX text = do txt <- many1 (alphaNum <|> space) return $ Text txt I have no illusions that this is probably far from what I actually need to be doing. But I am finding documentation on all this to be spotty. The 'parsec.pdf' is 7 years old and code doesn't always work. Can anyone point me in the right direction? I just want something to able to do this simply. After an initial version works, I would like to have commands with parameters - something like \command[param][param]{body} but need to have something working first. Thank you for any help you can provide. Jeffrey. From jason.dusek at gmail.com Sat Nov 8 04:00:20 2008 From: jason.dusek at gmail.com (Jason Dusek) Date: Sat Nov 8 03:55:01 2008 Subject: [Haskell-beginners] Parsing Custom TeX In-Reply-To: <1226113350.22707.6.camel@darky> References: <1226113350.22707.6.camel@darky> Message-ID: <42784f260811080100u401c413ds1e552aa4c68d0190@mail.gmail.com> Each one of the little combinators seems to work as advertized. Are you having trouble fitting them together? -- _jsn module UnTeX where import Text.ParserCombinators.Parsec import Text.ParserCombinators.Parsec.Prim import Text.ParserCombinators.Parsec.Language import qualified Text.ParserCombinators.Parsec.Token as T data UnTeX = Command String [String] String | Text String | Paragraph deriving Show -- I don't remember TeX very well, so I'm not sure this is right. command :: Parser UnTeX command = do char '\\' cmd <- ident p <- orNot params [] b <- orNot body "" return $ Command cmd p b where params = many1 $ between (char '[') (char ']') ident body = do char '{' text <- many1 $ noneOf "}" char '}' return text ident = many1 $ letter <|> digit orNot p n = choice [try p , return n] paragraph :: Parser UnTeX paragraph = do newline newline return $ Paragraph text :: Parser UnTeX text = do txt <- many1 (alphaNum <|> space) return $ Text txt From take at informatik.uni-freiburg.de Sat Nov 8 04:38:46 2008 From: take at informatik.uni-freiburg.de (Moritz Tacke) Date: Sat Nov 8 04:33:26 2008 Subject: [Haskell-beginners] Lost in binary input In-Reply-To: <814cf9120811080131v6a45a00eud7297c242573b0bc@mail.gmail.com> References: <814cf9120811080131v6a45a00eud7297c242573b0bc@mail.gmail.com> Message-ID: <814cf9120811080138s2f5bc968wf5245bc9034844eb@mail.gmail.com> Hi! I'm desperately trying to read a binary file into a list of Word16s. After heavily borrowing from the http://www.haskell.org/haskellwiki/DealingWithBinaryData - tutorial (which accounts for the only few working lines of my code), I am still left totally lost. What I need is a piece of code that reads these Word16s and gives them to me in a way that I can apply usual functions on it - should be easy, was my first thought some hours ago... Here is my code: module BinFileReader where import qualified Data.ByteString.Lazy as ByteString import Data.Binary.Get import Data.Word data FileData = FileData { source_filename::String, data = [Word16] } deriving (Show) readBinaryString::FilePath -> IO ByteString.ByteString readBinaryString filename = do input_string <- ByteString.readFile filename putStrLn ((show (ByteString.length input_string) ) ++ " Bytes read") return input_string -- Problems start here: Why the hell does the next function know where its -- data come from? There are no parameters; if I wanted -- to apply another function inside readAsWord that takes the bytestring as well as -- other items, how would I do that? readAsWords::Get [Word16] readAsWords = do empty <- isEmpty if empty then return [] else do v <- getWord16be rest <- readAsWords return (v : rest) readBinaryFile::FilePath -> IO FileData readBinaryFile filename = (FileData filename raw_data) where raw_data = readBinaryString filename word_list = runGet readAsWords raw_data string_length = length word_list -- And here, it ends... I've been trying my best to find a function -- that glues all of the above together, but without any success. -- It should be so trivial, but, somehow, it isn't Any hints? Greetings! Moritz From alexey.skladnoy at gmail.com Sat Nov 8 05:55:09 2008 From: alexey.skladnoy at gmail.com (Alexey Khudyakov) Date: Sat Nov 8 05:50:39 2008 Subject: [Haskell-beginners] Lost in binary input In-Reply-To: <814cf9120811080138s2f5bc968wf5245bc9034844eb@mail.gmail.com> References: <814cf9120811080131v6a45a00eud7297c242573b0bc@mail.gmail.com> <814cf9120811080138s2f5bc968wf5245bc9034844eb@mail.gmail.com> Message-ID: <200811081355.09759.alexey.skladnoy@gmail.com> On Saturday 08 November 2008 12:38:46 Moritz Tacke wrote: > Hi! > > I'm desperately trying to read a binary file into a list of Word16s. > After heavily borrowing from the > http://www.haskell.org/haskellwiki/DealingWithBinaryData - tutorial > (which accounts for the only few working lines of my code), I am still > left totally lost. > What I need is a piece of code that reads these Word16s and gives them > to me in a way that I can apply usual functions on it - should be > easy, was my first thought some hours ago... > You should use runGet to escape from Get monad. For example: > import qualified Data.ByteString.Lazy as ByteString > import Data.Binary.Get > import Data.Word > > readAsWords::Get [Word16] > readAsWords = do > empty <- isEmpty > if empty > then return [] > else do v <- getWord16be > rest <- readAsWords > return (v : rest) > > main = do > binary_data <- ByteString.readFile "your_file" > let > words :: [Word16] > words = runGet readAsWords binary_data > -- Now you can do whatever you want > return () From byorgey at seas.upenn.edu Sat Nov 8 08:23:22 2008 From: byorgey at seas.upenn.edu (Brent Yorgey) Date: Sat Nov 8 08:18:02 2008 Subject: [Haskell-beginners] Parsing Custom TeX In-Reply-To: <1226113350.22707.6.camel@darky> References: <1226113350.22707.6.camel@darky> Message-ID: <20081108132322.GA350@seas.upenn.edu> What you have looks good. Can you specifically describe the problems you are having? -Brent From jeffd at techsociety.ca Sat Nov 8 18:22:27 2008 From: jeffd at techsociety.ca (Jeffrey Drake) Date: Sat Nov 8 18:17:53 2008 Subject: [Haskell-beginners] Parsing Custom TeX In-Reply-To: <42784f260811080100u401c413ds1e552aa4c68d0190@mail.gmail.com> References: <1226113350.22707.6.camel@darky> <42784f260811080100u401c413ds1e552aa4c68d0190@mail.gmail.com> Message-ID: <1226186547.22707.20.camel@darky> *This message was sent in reply to Jason Dusek but the reply went to him, not the list. I plan to have Command String, CommandParams [String], CommandParamsWithArgs [String] [String] or something to that effect. If each of these are combinators, then I imagine you can use <|> with them. But realistically, I have no idea how to get this to take a string input (or something like getContents) and have [UnTeX] come out the other end. The problem that I have also is that while Command* can come anywhere in the text, everything goes back to Text unless it is a Paragraph. The spaces after a Command* up till the next letter have to be ignored, and superfluous spaces within Text itself also should be. I also can't have two Paragraphs right beside each other, because that makes little sense. So from what I can guess - I need a lexer, I think it was called a lexeme lexer. The syntax for Command* is like this: \command \command[arg] \command[arg][arg][...] \command[...]{body} \command[...]{body1}{body2}{...} The reason why this is necessary is because you could have something like \frac{a}{b}. I am trying to be more consistent with my use of this than LaTeX/TeX is. I might need to implement something like a table generator eventually, but this would be hopefully for the backend. Because I would like to translate this stuff into HTML and other outputs eventually. Thank you for your help, Jeffrey. On Sat, 2008-11-08 at 01:00 -0800, Jason Dusek wrote: > Each one of the little combinators seems to work as > advertized. Are you having trouble fitting them together? > > -- > _jsn > > > module UnTeX where > > import Text.ParserCombinators.Parsec > import Text.ParserCombinators.Parsec.Prim > import Text.ParserCombinators.Parsec.Language > import qualified Text.ParserCombinators.Parsec.Token as T > > data UnTeX > = Command String [String] String > | Text String > | Paragraph > deriving Show > > > -- I don't remember TeX very well, so I'm not sure this is right. > command :: Parser UnTeX > command = do > char '\\' > cmd <- ident > p <- orNot params [] > b <- orNot body "" > return $ Command cmd p b > where > params = many1 $ between (char '[') (char ']') ident > body = do > char '{' > text <- many1 $ noneOf "}" > char '}' > return text > ident = many1 $ letter <|> digit > orNot p n = choice [try p , return n] > > > paragraph :: Parser UnTeX > paragraph = do > newline > newline > return $ Paragraph > > text :: Parser UnTeX > text = do > txt <- many1 (alphaNum <|> space) > return $ Text txt From lpillay at webafrica.org.za Sun Nov 9 01:37:29 2008 From: lpillay at webafrica.org.za (Logesh Pillay) Date: Sun Nov 9 01:34:23 2008 Subject: [Haskell-beginners] should function composition operators affect memory use? Message-ID: <49168529.2070503@webafrica.org.za> I wrote the following program a while ago :- > import List > > sumFacDigits 0 = 0 > sumFacDigits n = product [1 .. mod n 10] + sumFacDigits (div n 10) > > lenFacCycle n = length (nub (take 60 (iterate sumFacDigits n))) > > main = do > print ( sum [ 1 | n <- [1 .. ((10^6) - 1)], lenFacCycle n == 60 ] ) It compiles and runs fine. To get rid of the brackets, I used the function composition operators . and $. (Incidentally why does nobody tell you that you can use . provided the last composition operator is $?) It now reads:- > import List > > sumFacDigits 0 = 0 > sumFacDigits n = product [1 .. mod n 10] + sumFacDigits n `div` 10 > > lenFacCycle n = length . nub . take 60 $ iterate sumFacDigits n > > main = do > print ( sum [ 1 | n <- [1 .. ((10^6) - 1)], lenFacCycle n == 60 ] ) This compiles. When I run it however, it exits with the stack exceeded message. Why? Are the function composition operators more than syntactic sugar for the brackets? From aslatter at gmail.com Sun Nov 9 02:01:34 2008 From: aslatter at gmail.com (Antoine Latter) Date: Sun Nov 9 01:56:13 2008 Subject: [Haskell-beginners] should function composition operators affect memory use? In-Reply-To: <49168529.2070503@webafrica.org.za> References: <49168529.2070503@webafrica.org.za> Message-ID: <694519c50811082301w77d96a96hf12dbc1a818238a4@mail.gmail.com> On Sun, Nov 9, 2008 at 12:37 AM, Logesh Pillay wrote: > I wrote the following program a while ago :- [snip] > > This compiles. When I run it however, it exits with the stack exceeded > message. > > Why? Are the function composition operators more than syntactic sugar for > the brackets? Your problem is probably in this expression: > sumFacDigits n `div` 10 Becuase function application binds tightest, this is the same as: > div (sumFacDigitss n) 10 whereas your original was: > sumFacDigits (div n 10) So your transformed program is not the same as your original. I hope that helps. -Antoine From jeffd at techsociety.ca Sun Nov 9 21:05:33 2008 From: jeffd at techsociety.ca (Jeffrey Drake) Date: Sun Nov 9 21:00:59 2008 Subject: [Haskell-beginners] Parsing Revisited Message-ID: <1226282733.22707.27.camel@darky> I believe it might be beneficial for me to ask a more general question than I asked in 'Parsing Custom TeX': Given a set of combinators that parse specific parts of a document, how can you string them together so that you can get the whole document parsed? Within this, a consideration for extraneous whitespace should be considered - where you might have specific rules for when to drop whitespace. Thank you again. Jeff. From rendel at daimi.au.dk Sun Nov 9 22:33:54 2008 From: rendel at daimi.au.dk (Tillmann Rendel) Date: Sun Nov 9 22:28:32 2008 Subject: [Haskell-beginners] Parsing Revisited In-Reply-To: <1226282733.22707.27.camel@darky> References: <1226282733.22707.27.camel@darky> Message-ID: <4917ABA2.9080800@daimi.au.dk> Jeffrey Drake wrote: > Given a set of combinators that parse specific parts of a document, how > can you string them together so that you can get the whole document > parsed? The general idea is to build parser for complex formats out of parsers for simple formats. The structure of the parser often more or less follows the structure of the data. For example, the following data type could be a first approach to capture the lexical structure of TeX: data TeX = Letter Char -- for example: A | Command String -- for example: \begin | Group [TeX] -- for example: {abc\something{...}} The idea is to parse "a\test {bc}" into the following list of TeX values: [Letter 'a', Command "test", Group [Letter 'c', Letter 'd']] Note how the use of lists of TeX values allows to actually represent whole documents; and how the Group data constructor allows to capture the recursive structure of TeX programs. Let start by writing the parser for a single TeX value. The datatype definition shows that a such a value can be a letter, a command or a list of TeX values enclosed in braces. We can capture the fact that we have three choices directly in parsers: tex :: Parser TeX tex = texLetter <|> texCommand <|> texGroup Note how the combinator <|> corresponds to the | syntax in the datatype declaration. Given this parser for TeX values, we can write the parser for a list of such values using the many combinator: texList :: Parser [TeX] texList = many tex Note how the many combinator corresponds to the list type constructor. Now we have to define the parser for the three data constructors. texLetter is easy: texLetter :: Parser TeX texLetter = do l <- letter return (Letter l) Note how the fact that texLetter just wraps letter corresponds to the fact that Letter just wraps Char. Commands are more interesting, because they eat all spaces after the name of the control sequence. texCommand :: Parser TeX texCommand = do char '\\' name <- many letter many (char ' ') return (Command name) By implementing the space eating feature of commands as part of the texCommand parser, we can be sure that spaces not following commands will not be eaten. Finally, I would consider the parser for groups the most interesting. The inside of a group looks looks just like the whole TeX document itself. Fortunately, we have already implemented a parser for whole TeX documents, namely texList, which we use for the texGroup parser as follows: texGroup :: Parser TeX texGroup = do char '{' content <- texList char '}' Note how the mutual recursion between texList and texGroup corresponds to the recursion in the TeX data type. Of course, the examples in this messages are not meant to be production code. Actually, they are not tested at all. But I hope that they help you get started with Parsec. Tillmann From jeffd at techsociety.ca Sun Nov 9 23:35:38 2008 From: jeffd at techsociety.ca (Jeffrey Drake) Date: Sun Nov 9 23:31:01 2008 Subject: [Haskell-beginners] Parsing Revisited In-Reply-To: <4917ABA2.9080800@daimi.au.dk> References: <1226282733.22707.27.camel@darky> <4917ABA2.9080800@daimi.au.dk> Message-ID: <1226291738.21523.5.camel@darky> This helps a lot, and I can go over this in the morning. The only final question I have is what you would use to apply all this to an arbitrary string. For example, in the following partially fictitious code: (based on something I saw) main = getContents >>= ... What would ... be so that you can turn the [Char] into [TeX]? Or can I specifically use the combinators only? - Jeff On Mon, 2008-11-10 at 04:33 +0100, Tillmann Rendel wrote: > Jeffrey Drake wrote: > > Given a set of combinators that parse specific parts of a document, how > > can you string them together so that you can get the whole document > > parsed? > > The general idea is to build parser for complex formats out of parsers > for simple formats. The structure of the parser often more or less > follows the structure of the data. > > For example, the following data type could be a first approach to > capture the lexical structure of TeX: > > data TeX > = Letter Char -- for example: A > | Command String -- for example: \begin > | Group [TeX] -- for example: {abc\something{...}} > > The idea is to parse "a\test {bc}" into the following list of TeX values: > > [Letter 'a', Command "test", Group [Letter 'c', Letter 'd']] > > Note how the use of lists of TeX values allows to actually represent > whole documents; and how the Group data constructor allows to capture > the recursive structure of TeX programs. > > Let start by writing the parser for a single TeX value. The datatype > definition shows that a such a value can be a letter, a command or a > list of TeX values enclosed in braces. We can capture the fact that we > have three choices directly in parsers: > > tex :: Parser TeX > tex = texLetter <|> texCommand <|> texGroup > > Note how the combinator <|> corresponds to the | syntax in the datatype > declaration. > > Given this parser for TeX values, we can write the parser for a list of > such values using the many combinator: > > texList :: Parser [TeX] > texList = many tex > > Note how the many combinator corresponds to the list type constructor. > > Now we have to define the parser for the three data constructors. > texLetter is easy: > > texLetter :: Parser TeX > texLetter = do l <- letter > return (Letter l) > > Note how the fact that texLetter just wraps letter corresponds to the > fact that Letter just wraps Char. > > Commands are more interesting, because they eat all spaces after the > name of the control sequence. > > texCommand :: Parser TeX > texCommand = do char '\\' > name <- many letter > many (char ' ') > return (Command name) > > By implementing the space eating feature of commands as part of the > texCommand parser, we can be sure that spaces not following commands > will not be eaten. > > Finally, I would consider the parser for groups the most interesting. > The inside of a group looks looks just like the whole TeX document > itself. Fortunately, we have already implemented a parser for whole TeX > documents, namely texList, which we use for the texGroup parser as follows: > > texGroup :: Parser TeX > texGroup = do char '{' > content <- texList > char '}' > > Note how the mutual recursion between texList and texGroup corresponds > to the recursion in the TeX data type. > > Of course, the examples in this messages are not meant to be production > code. Actually, they are not tested at all. But I hope that they help > you get started with Parsec. > > Tillmann From rendel at daimi.au.dk Mon Nov 10 00:10:32 2008 From: rendel at daimi.au.dk (Tillmann Rendel) Date: Mon Nov 10 00:05:10 2008 Subject: [Haskell-beginners] Parsing Revisited In-Reply-To: <1226291738.21523.5.camel@darky> References: <1226282733.22707.27.camel@darky> <4917ABA2.9080800@daimi.au.dk> <1226291738.21523.5.camel@darky> Message-ID: <4917C248.50409@daimi.au.dk> Jeffrey Drake wrote: > This helps a lot, and I can go over this in the morning. The only final > question I have is what you would use to apply all this to an arbitrary > string. You can use parseTest for testing, e.g. in ghci. parseTest texList "hello\world {example}" That will either print the resulting {TeX], or a parser error message. For normal processing, use parse. case parse texList "" "hello\world {example}" of Left problem -> error (show problem) Right texList -> convertToHTML texList Tillmann From jeffd at techsociety.ca Tue Nov 11 01:20:15 2008 From: jeffd at techsociety.ca (Jeffrey Drake) Date: Tue Nov 11 01:15:37 2008 Subject: [Haskell-beginners] Parsing Revisited In-Reply-To: <4917C248.50409@daimi.au.dk> References: <1226282733.22707.27.camel@darky> <4917ABA2.9080800@daimi.au.dk> <1226291738.21523.5.camel@darky> <4917C248.50409@daimi.au.dk> Message-ID: <1226384415.11437.30.camel@darky> I have decided to go in another direction, so the parser here is going to be different, but it works without error correction. I am using a wiki style right here, where I am testing headers level 1 to 5. I believe I need to essentially throw an error here, normally I would think might be appropriate, but it doesn't seem to apply in this case. The problem is that a1, a2 must satisfy two conditions: a1 == a2 1 <= a1 <= 5 If it doesn't, then an error must be output. It appears that is just an operator for 'label'. Which goes to labels, which does eventually go to construct Error, but not sure in the correct context. Again, any help is appreciated, I am getting a feeling for this I think. - Jeff. Code is below: module Main where import Control.Monad import Text.ParserCombinators.Parsec import Text.ParserCombinators.Parsec.Char import Text.ParserCombinators.Parsec.Combinator data Wiki = Heading Int String | Other String deriving Show {- a1/a2 heading level 2 5 3 4 4 3 5 2 6 1 :. 7 - a1 -} heading :: Parser Wiki heading = do (a1, s, a2) <- within (length `liftM` many1 (char '=')) (length `liftM` many1 (char '=')) (many1 (alphaNum <|> space)) return $ Heading (7 - a1) s where within open close p = do a1 <- open x <- p a2 <- close return (a1, x, a2) On Mon, 2008-11-10 at 06:10 +0100, Tillmann Rendel wrote: > Jeffrey Drake wrote: > > This helps a lot, and I can go over this in the morning. The only final > > question I have is what you would use to apply all this to an arbitrary > > string. > > You can use parseTest for testing, e.g. in ghci. > > parseTest texList "hello\world {example}" > > That will either print the resulting {TeX], or a parser error message. > > For normal processing, use parse. > > case parse texList "" "hello\world {example}" of > Left problem -> error (show problem) > Right texList -> convertToHTML texList > > Tillmann From nenekotan at gmail.com Tue Nov 11 06:40:19 2008 From: nenekotan at gmail.com (Bas van Gijzel) Date: Tue Nov 11 06:34:51 2008 Subject: [Haskell-beginners] Pointfree style Message-ID: Hi, I'm trying to understand pointfree style better, but it's not coming along as well as I'd like it to. The thing I can't get to work is to reduce an argument that is used more than once in a function. My function looks like this now (which works like it should): f x = g ((h . i) x) x But I'd like to reduce the last argument x. I've looked at the wiki[1] but I couldn't find a systematic way to obtain pointfree functions when they get more complicated. Any pointers to pages or papers with more examples of obtaining pointfree functions are appreciated. Thanks, Bas van Gijzel [1]http://www.haskell.org/haskellwiki/Pointfree -------------- next part -------------- An HTML attachment was scrubbed... URL: http://www.haskell.org/pipermail/beginners/attachments/20081111/444ea4fd/attachment.htm From daniel.is.fischer at web.de Tue Nov 11 08:01:06 2008 From: daniel.is.fischer at web.de (Daniel Fischer) Date: Tue Nov 11 07:53:19 2008 Subject: [Haskell-beginners] Parsing Revisited In-Reply-To: <1226384415.11437.30.camel@darky> References: <1226282733.22707.27.camel@darky> <4917C248.50409@daimi.au.dk> <1226384415.11437.30.camel@darky> Message-ID: <200811111401.06395.daniel.is.fischer@web.de> Am Dienstag, 11. November 2008 07:20 schrieb Jeffrey Drake: > I have decided to go in another direction, so the parser here is going > to be different, but it works without error correction. I am using a > wiki style right here, where I am testing headers level 1 to 5. > > I believe I need to essentially throw an error here, normally I would > think might be appropriate, but it doesn't seem to apply in this > case. > > The problem is that a1, a2 must satisfy two conditions: > > a1 == a2 > 1 <= a1 <= 5 > > If it doesn't, then an error must be output. > > It appears that is just an operator for 'label'. Which goes to > labels, which does eventually go to construct Error, but not sure in the > correct context. gives you the opportunity to construct a helpful error message if the parser fails. You provide information what the parser expects and if it fails you get the message "unexpected whatever, expecting x, y, z or w" > > Again, any help is appreciated, I am getting a feeling for this I think. > - Jeff. > > Code is below: > > > module Main where > > import Control.Monad > > import Text.ParserCombinators.Parsec > import Text.ParserCombinators.Parsec.Char > import Text.ParserCombinators.Parsec.Combinator > > > data Wiki > = Heading Int String > > | Other String > > deriving Show > > > {- > a1/a2 heading level > 2 5 > 3 4 > 4 3 > 5 2 > 6 1 > > :. 7 - a1 > > -} > heading :: Parser Wiki > heading = do (a1, s, a2) <- within > (length `liftM` many1 (char '=')) > (length `liftM` many1 (char '=')) > (many1 (alphaNum <|> space)) > return $ Heading (7 - a1) s > where within open close p = do > a1 <- open > x <- p > a2 <- close > return (a1, x, a2) Perhaps heading :: Parser Wiki heading = do a1 <- length `liftM` many1 (char '=') title <- many1 (alphaNum <|> space) count a1 (char '=') notFollowedBy (char '=') return $ Heading (7-a1) title ? Although that doesn't check that there are at most 5 '=', so you might use the combinators upTo 0 p = do notFollowedBy p return [] upTo k p = (do a <- p as <- upTo (k-1) p return (a:as)) <|> return [] upTo1 k p = do a <- p as <- upTo (k-1) p return (a:as) exactly k p = do as <- count k p notFollowedBy p return as as in heading = do a1 <- length `liftM` upTo1 5 (char '=') ("1 to 5 '='s") title <- many1 (alphaNum <|> space) exactly a1 (char '=') (show a1 ++ " '='s") return $ Heading (7-a1) title > > On Mon, 2008-11-10 at 06:10 +0100, Tillmann Rendel wrote: > > Jeffrey Drake wrote: > > > This helps a lot, and I can go over this in the morning. The only final > > > question I have is what you would use to apply all this to an arbitrary > > > string. > > > > You can use parseTest for testing, e.g. in ghci. > > > > parseTest texList "hello\world {example}" > > > > That will either print the resulting {TeX], or a parser error message. > > > > For normal processing, use parse. > > > > case parse texList "" "hello\world {example}" of > > Left problem -> error (show problem) > > Right texList -> convertToHTML texList > > > > Tillmann > > _______________________________________________ > Beginners mailing list > Beginners@haskell.org > http://www.haskell.org/mailman/listinfo/beginners From daniel.is.fischer at web.de Tue Nov 11 08:20:03 2008 From: daniel.is.fischer at web.de (Daniel Fischer) Date: Tue Nov 11 08:12:17 2008 Subject: [Haskell-beginners] Pointfree style In-Reply-To: References: Message-ID: <200811111420.03154.daniel.is.fischer@web.de> Am Dienstag, 11. November 2008 12:40 schrieb Bas van Gijzel: > Hi, > > I'm trying to understand pointfree style better, but it's not coming along > as well as I'd like it to. > The thing I can't get to work is to reduce an argument that is used more > than once in a function. > > My function looks like this now (which works like it should): > f x = g ((h . i) x) x > > But I'd like to reduce the last argument x. I've looked at the wiki[1] but > I couldn't find a systematic way to obtain pointfree functions when they > get more complicated. > Any pointers to pages or papers with more examples of obtaining pointfree > functions are appreciated. lambdabot can pointfree your functions, the command is @pl: lambdabot> @pl \x -> \y -> (y,x) flip (,) lambdabot> @pl \x -> g ((h . i) x) x g =<< h . i (the monad here is ((->) a), where x :: a, I think, you need Control.Monad.Instances for that to be in scope). I'm not sure reading lambdabot's sources is a good way to learn how to systematically pointfree functions, but looking at lambdabot's results should help. > > Thanks, > > Bas van Gijzel > > > [1]http://www.haskell.org/haskellwiki/Pointfree Cheers, Daniel From byorgey at seas.upenn.edu Tue Nov 11 13:51:50 2008 From: byorgey at seas.upenn.edu (Brent Yorgey) Date: Tue Nov 11 13:46:21 2008 Subject: [Haskell-beginners] Pointfree style In-Reply-To: References: Message-ID: <20081111185150.GA25855@GRW057-25.cis.upenn.edu> On Tue, Nov 11, 2008 at 12:40:19PM +0100, Bas van Gijzel wrote: > Hi, > > I'm trying to understand pointfree style better, but it's not coming along > as well as I'd like it to. > The thing I can't get to work is to reduce an argument that is used more > than once in a function. > > My function looks like this now (which works like it should): > f x = g ((h . i) x) x > > But I'd like to reduce the last argument x. I've looked at the wiki[1] but I > couldn't find a systematic way to obtain pointfree functions when they get > more complicated. > Any pointers to pages or papers with more examples of obtaining pointfree > functions are appreciated. If you're doing this just to learn, great. If you're doing this because you think a pointfree style is somehow 'better', you should know that there are limits. =) In the case of your function f above (and, in general, with any function that uses its argument more than once) I would leave it as it is. The really important things to know are composition, i.e. f x = g (h (x)) becomes f x = (g . h) x and eta-reduction, i.e. f x = foo x becomes f = foo. There are other things that can be nice, such as flip, and various Arrow combinators (such as (&&&), (***)) for the (->) instance of Arrow [1] for use with functions involving tuples. Going much beyond that is often just obfuscation, IMO. But to answer your question, a systematic way to transform functions which use their argument more than once into pointfree versions is to use the ((->) e) (aka reader) monad [2]: f x = g (h x) x becomes f x = (h >>= g) x Essentially, in the ((->) e) monad, (>>=) is a combinator to do exactly what you are asking about -- compose two functions with a duplicated input. Of course, if you dig into the implementation of (>>=) for the ((->) e) monad, you will eventually find a function which is not point-free -- this is unavoidable at some level; you can't actually duplicate an arbitrary thing without giving it a name. Applying this to your example: f x = g ((h . i) x) x f x = ((h . i) >>= g) x f = (h . i) >>= g -Brent [1] http://haskell.org/ghc/docs/latest/html/libraries/base/Control-Arrow.html [2] http://haskell.org/ghc/docs/latest/html/libraries/base/Control-Monad-Instances.html From nenekotan at gmail.com Tue Nov 11 14:49:21 2008 From: nenekotan at gmail.com (Bas van Gijzel) Date: Tue Nov 11 14:43:52 2008 Subject: [Haskell-beginners] Pointfree style In-Reply-To: <20081111185150.GA25855@GRW057-25.cis.upenn.edu> References: <20081111185150.GA25855@GRW057-25.cis.upenn.edu> Message-ID: Wow, thanks for the thorough answer :). I already understood quite a bit about composition and eta reduction, but your response made it clear for me that this example couldn't be solved that easily. Thanks for the information, it really helps. Bas On Tue, Nov 11, 2008 at 7:51 PM, Brent Yorgey wrote: > On Tue, Nov 11, 2008 at 12:40:19PM +0100, Bas van Gijzel wrote: > > Hi, > > > > I'm trying to understand pointfree style better, but it's not coming > along > > as well as I'd like it to. > > The thing I can't get to work is to reduce an argument that is used more > > than once in a function. > > > > My function looks like this now (which works like it should): > > f x = g ((h . i) x) x > > > > But I'd like to reduce the last argument x. I've looked at the wiki[1] > but I > > couldn't find a systematic way to obtain pointfree functions when they > get > > more complicated. > > Any pointers to pages or papers with more examples of obtaining pointfree > > functions are appreciated. > > If you're doing this just to learn, great. If you're doing this > because you think a pointfree style is somehow 'better', you should > know that there are limits. =) In the case of your function f above > (and, in general, with any function that uses its argument more than > once) I would leave it as it is. The really important things to know > are composition, i.e. > > f x = g (h (x)) becomes f x = (g . h) x > > and eta-reduction, i.e. > > f x = foo x becomes f = foo. > > There are other things that can be nice, such as flip, and various > Arrow combinators (such as (&&&), (***)) for the (->) instance of > Arrow [1] for use with functions involving tuples. Going much beyond that > is often just obfuscation, IMO. > > But to answer your question, a systematic way to transform functions > which use their argument more than once into pointfree versions is to > use the ((->) e) (aka reader) monad [2]: > > f x = g (h x) x becomes f x = (h >>= g) x > > Essentially, in the ((->) e) monad, (>>=) is a combinator to do > exactly what you are asking about -- compose two functions with a > duplicated input. Of course, if you dig into the implementation of > (>>=) for the ((->) e) monad, you will eventually find a function > which is not point-free -- this is unavoidable at some level; you > can't actually duplicate an arbitrary thing without giving it a name. > > Applying this to your example: > > f x = g ((h . i) x) x > f x = ((h . i) >>= g) x > f = (h . i) >>= g > > -Brent > > [1] > http://haskell.org/ghc/docs/latest/html/libraries/base/Control-Arrow.html > [2] > http://haskell.org/ghc/docs/latest/html/libraries/base/Control-Monad-Instances.html > _______________________________________________ > Beginners mailing list > Beginners@haskell.org > http://www.haskell.org/mailman/listinfo/beginners > -------------- next part -------------- An HTML attachment was scrubbed... URL: http://www.haskell.org/pipermail/beginners/attachments/20081111/c4bef8ce/attachment.htm From c.chryssochoidis at gmail.com Tue Nov 11 15:34:03 2008 From: c.chryssochoidis at gmail.com (Christos Chryssochoidis) Date: Tue Nov 11 15:28:33 2008 Subject: [Haskell-beginners] Unicode in GHCi Message-ID: Hello, I'd like to type in GHCi some non-latin characters, but when I try it, no characters are inserted at all. Latin characters though are typed in fine, and in any other shell except GHCi I try non-Latin characters get typed without problem. I mean I'm not able to type in GHCi an expression like '?' == '?' (can't type in the ?) Is this a known GHCi restriction on the character set it accepts, or something is wrong with my setup of GHCi/terminal? I'm using GHC 6.10.1 in Mac OS X Terminal. Thank you very much, Christos From kyagrd at gmail.com Wed Nov 12 02:11:07 2008 From: kyagrd at gmail.com (Ahn, Ki Yung) Date: Wed Nov 12 02:09:31 2008 Subject: [Haskell-beginners] Re: Unicode in GHCi In-Reply-To: References: Message-ID: Christos Chryssochoidis wrote: > Hello, > > I'd like to type in GHCi some non-latin characters, but when I try it, > no characters are inserted at all. Latin characters though are typed > in fine, and in any other shell except GHCi I try non-Latin characters > get typed without problem. You should use the utf8-string library to print multibyte string literals in GHC. http://hackage.haskell.org/cgi-bin/hackage-scripts/package/utf8-string Linux distributions usually have this packaged. Otherwise, you can to install this using cabal. I am not sure whether there is a direct support for wide characters in Haskell. > I mean I'm not able to type in GHCi an expression like > > '?' == '?' (can't type in the ?) > > Is this a known GHCi restriction on the character set it accepts, or > something is wrong with my setup of GHCi/terminal? > > I'm using GHC 6.10.1 in Mac OS X Terminal. From c.chryssochoidis at gmail.com Wed Nov 12 06:35:12 2008 From: c.chryssochoidis at gmail.com (Christos Chryssochoidis) Date: Wed Nov 12 06:29:40 2008 Subject: [Haskell-beginners] Re: Unicode in GHCi In-Reply-To: References: Message-ID: Thank you for your response! Indeed utf8-string works fine for printing and reading utf8 strings! I would also like to use multibyte characters in GHCi, but as the guys at #Haskell told me yesterday, GHCi 6.10.1 switched from using readline for line edting to the editline lib, and the latter can't handle unicode characters, at least for now. But in GHCi 6.8 and the older versions there shouldn't be any problem with unicode characters in GHCi. Thanks very much again! Christos On Wed, Nov 12, 2008 at 9:11 AM, Ahn, Ki Yung wrote: > Christos Chryssochoidis wrote: >> >> Hello, >> >> I'd like to type in GHCi some non-latin characters, but when I try it, >> no characters are inserted at all. Latin characters though are typed >> in fine, and in any other shell except GHCi I try non-Latin characters >> get typed without problem. > > You should use the utf8-string library to print multibyte string > literals in GHC. > > http://hackage.haskell.org/cgi-bin/hackage-scripts/package/utf8-string > > Linux distributions usually have this packaged. > Otherwise, you can to install this using cabal. > > I am not sure whether there is a direct support for wide characters in > Haskell. > >> I mean I'm not able to type in GHCi an expression like >> >> '?' == '?' (can't type in the ?) >> >> Is this a known GHCi restriction on the character set it accepts, or >> something is wrong with my setup of GHCi/terminal? >> >> I'm using GHC 6.10.1 in Mac OS X Terminal. > > _______________________________________________ > Beginners mailing list > Beginners@haskell.org > http://www.haskell.org/mailman/listinfo/beginners > From cppljevans at suddenlink.net Wed Nov 12 08:54:19 2008 From: cppljevans at suddenlink.net (Larry Evans) Date: Wed Nov 12 07:43:34 2008 Subject: [Haskell-beginners] [Fwd: Re: [Hat] How to use Control.Monad.State?] Message-ID: <491AE00B.1040504@suddenlink.net> Since the hat mailing list seems a bit unresponsive, (or I seem to be impatient), I'm forwarding the attached post here. I've also attached the Makefile that produced the error message shown in the attachment. When the Makefile target is run, it works. However, with target=hat, It produces the error shown in the forwarded msg: Hat/tickSimple.hs:4:0: Bad interface file: /usr/lib/haskell-packages/ghc6/lib/hat-2.05/ghc-6.8.2/Hat/Prelude.hi Something is amiss; requested module main:Prelude differs from name found in the interface file hat-2.5:Hat.Prelude Please, how should the Makefile be modified to avoid this error? -Hopefully, Larry -------------- next part -------------- MAIN=Insort MAIN=tickSimple INCS=/usr/lib/haskell-packages/ghc6/lib/hat-2.05/ghc-6.8.2/Hat GHC.FLAGS=-P$(INCS) GHC.LANG=-XMultiParamTypeClasses -XFunctionalDependencies -XFlexibleInstances GHC.OPTS=$(GHC.FLAGS) $(GHC.LANG) run: runghc $(GHC.LANG) $(MAIN).hs hat: hmake -hat $(GHC.OPTS) $(MAIN) -------------- next part -------------- An embedded message was scrubbed... From: Larry Evans Subject: Re: [Hat] How to use Control.Monad.State? Date: Mon, 10 Nov 2008 11:30:21 -0600 Size: 4879 Url: http://www.haskell.org/pipermail/beginners/attachments/20081112/3d2989f0/HatHowtouseControl.Monad.State.eml From DekuDekuplex at Yahoo.com Wed Nov 12 22:20:32 2008 From: DekuDekuplex at Yahoo.com (Benjamin L.Russell) Date: Wed Nov 12 22:15:11 2008 Subject: [Haskell-beginners] Re: Unicode in GHCi References: Message-ID: On Wed, 12 Nov 2008 13:35:12 +0200, "Christos Chryssochoidis" wrote: >Thank you for your response! >Indeed utf8-string works fine for printing and reading utf8 strings! >I would also like to use multibyte characters in GHCi, but as the guys >at #Haskell told me yesterday, GHCi 6.10.1 switched from using >readline for line edting to the editline lib, and the latter can't >handle unicode characters, at least for now. But in GHCi 6.8 and the >older versions there shouldn't be any problem with unicode characters >in GHCi. Incidentally, does anyone know the reason that GHCi 6.10.1 switched from using readline to editline? -- Benjamin L. Russell From byorgey at seas.upenn.edu Wed Nov 12 23:06:23 2008 From: byorgey at seas.upenn.edu (Brent Yorgey) Date: Wed Nov 12 23:00:48 2008 Subject: [Haskell-beginners] Re: Unicode in GHCi In-Reply-To: References: Message-ID: <20081113040623.GA19093@seas.upenn.edu> On Thu, Nov 13, 2008 at 12:20:32PM +0900, Benjamin L.Russell wrote: > On Wed, 12 Nov 2008 13:35:12 +0200, "Christos Chryssochoidis" > wrote: > > >Thank you for your response! > >Indeed utf8-string works fine for printing and reading utf8 strings! > >I would also like to use multibyte characters in GHCi, but as the guys > >at #Haskell told me yesterday, GHCi 6.10.1 switched from using > >readline for line edting to the editline lib, and the latter can't > >handle unicode characters, at least for now. But in GHCi 6.8 and the > >older versions there shouldn't be any problem with unicode characters > >in GHCi. > > Incidentally, does anyone know the reason that GHCi 6.10.1 switched > from using readline to editline? I think it's because readline uses a GPL license, which technically means that it can't be bundled with GHC since GHC isn't GPL. Why this was suddenly deemed important I'm not sure. -Brent From Sayali.Kulkarni at kpitcummins.com Thu Nov 13 02:57:50 2008 From: Sayali.Kulkarni at kpitcummins.com (Sayali Kulkarni) Date: Thu Nov 13 02:55:25 2008 Subject: [Haskell-beginners] Profiling haskell code Message-ID: <82C3BC9106BCE149B63464D79D0A22FD07581498@sohm.kpit.com> Hello, I am new to Haskell. I have written a small quicksort function in Haskell. I want to profile it for time. I have GHC 6.10.1 version and I have also installed the extra-libs that it has on the Haskell home page. I followed the following steps for installing the extra-libs: $ cd /to/the/library/source $ runghc Setup.hs configure --enable-library-profiling $ runghc Setup.hs build $ runghc Setup.hs install Following is the quicksort code that I'm using: quicksort [ ] = [ ] quicksort (x : xs) = quicksort larger ++ [x ] ++ quicksort smaller where smaller = [a | a <- xs, a <= x ] larger = [b | b <- xs, b > x ] When I compile the code with the following command : $ ghc --make Project.hs -prof -auto-all Then I tested it with the following command : $ Project +RTS -p It generates the .hi and the .o file but I cannot get the .prof file. Please let me know if any of the steps is missing or where could I check my profiling info. Regards, Sayali. -------------- next part -------------- An HTML attachment was scrubbed... URL: http://www.haskell.org/pipermail/beginners/attachments/20081113/4351dc75/attachment-0001.htm From byorgey at seas.upenn.edu Fri Nov 14 15:53:34 2008 From: byorgey at seas.upenn.edu (Brent Yorgey) Date: Fri Nov 14 15:47:54 2008 Subject: [Haskell-beginners] Profiling haskell code In-Reply-To: <82C3BC9106BCE149B63464D79D0A22FD07581498@sohm.kpit.com> References: <82C3BC9106BCE149B63464D79D0A22FD07581498@sohm.kpit.com> Message-ID: <20081114205334.GA30261@seas.upenn.edu> > > quicksort [ ] = [ ] > > quicksort (x : xs) = quicksort larger ++ [x ] ++ quicksort smaller > > > where > > > smaller = [a | a <- xs, a <= x ] > > > larger = [b | b <- xs, b > x ] > > > > > > When I compile the code with the following command : > > > > $ ghc --make Project.hs -prof -auto-all > > Then I tested it with the following command : > > $ Project +RTS -p > > It generates the .hi and the .o file but I cannot get the .prof file. > > Please let me know if any of the steps is missing or where could I check > my profiling info. > Hi Sayali, Is the code shown above *everything* in your Project.hs file? You will also need a main function for it to actually do anything. If there is more to your Project.hs file that you have not shown, could you send the complete version? Do you get any errors? Does Project produce the output that you expect? -Brent From streborg at hotmail.com Sat Nov 15 19:15:29 2008 From: streborg at hotmail.com (Glurk) Date: Sat Nov 15 19:10:00 2008 Subject: [Haskell-beginners] Parsing arithmentic expressions Message-ID: Hi, I'm just trying to learn how to use Parsec and am experimenting with parsing arithmetic expressions. This article gives a good example -> http://www.haskell.org/haskellwiki/Parsing_expressions_and_statements However, like most other examples I could find, the grammar for the expression doesn't take operator precedence into account, and allows for expressions of any size by defining expr recursively, eg :- expr ::= var | const | ( expr ) | unop expr | expr duop expr So, you can keep extending the expression by adding another operator and expression. The data to hold the expression is then very easily derived :- data Expr = Var String | Con Bool | Uno Unop Expr | Duo Duop Expr Expr The grammar I want to parse is slightly different in that it allows for operator precendence. Part of the grammar is something like :- expression = SimpleExpression {relation SimpleExpression}. SimpleExpression = ["+"|"-"] term {AddOperator term}. So, instead of recursively defining expression, it is made up of multiples occurrences of SimpleExpression joined together with Relation operators. Where I am confused is how I should best represent this stucture in my data. Should I have something like :- data Expr = Expr SimpleExpr [(RelOp, SimpleExpression)] ie, an initial SimpleExpr, followed by a list of operator and SimpleExpression pairs. I haven't seen any example similar to this, so I was wondering if I'm going down the wrong track ? Perhaps another alternative is to modify the grammar somehow ? I guess, the question is, in general how do you handle such repeated elements as definied in an EBNF grammar, in structuring your data ? Any advice appreciated ! Thanks :) From bjpop at csse.unimelb.edu.au Mon Nov 17 00:35:02 2008 From: bjpop at csse.unimelb.edu.au (Bernie Pope) Date: Mon Nov 17 00:29:46 2008 Subject: [Haskell-beginners] Parsing arithmentic expressions In-Reply-To: References: Message-ID: <57383C16-16DD-4032-9CBC-5D6CC27A6E6E@csse.unimelb.edu.au> Hi, Have you seen the buildExpressionParser combinator in Parsec? http://legacy.cs.uu.nl/daan/download/parsec/parsec.html#buildExpressionParser It allows you to specify precedence and associativity for operator parsers declaratively, and it generally saves you from lots of refactoring in the grammar. You could probably stick with the straightforward data representation of expressions. Cheers, Bernie. On 16/11/2008, at 11:15 AM, Glurk wrote: > Hi, > > I'm just trying to learn how to use Parsec and am experimenting with > parsing > arithmetic expressions. > > This article gives a good example -> > http://www.haskell.org/haskellwiki/Parsing_expressions_and_statements > > However, like most other examples I could find, the grammar for the > expression > doesn't take operator precedence into account, and allows for > expressions of > any size by defining expr recursively, eg :- > > expr ::= var | const | ( expr ) | unop expr | expr duop expr > > So, you can keep extending the expression by adding another operator > and > expression. > > The data to hold the expression is then very easily derived :- > > data Expr = Var String | Con Bool | Uno Unop Expr | Duo Duop Expr Expr > > The grammar I want to parse is slightly different in that it allows > for > operator precendence. Part of the grammar is something like :- > > expression = SimpleExpression {relation SimpleExpression}. > SimpleExpression = ["+"|"-"] term {AddOperator term}. > > So, instead of recursively defining expression, it is made up of > multiples > occurrences of SimpleExpression joined together with Relation > operators. > > Where I am confused is how I should best represent this stucture in > my data. > Should I have something like :- > > data Expr = Expr SimpleExpr [(RelOp, SimpleExpression)] > > ie, an initial SimpleExpr, followed by a list of operator and > SimpleExpression > pairs. > > I haven't seen any example similar to this, so I was wondering if > I'm going > down the wrong track ? > > Perhaps another alternative is to modify the grammar somehow ? > > I guess, the question is, in general how do you handle such repeated > elements > as definied in an EBNF grammar, in structuring your data ? > > Any advice appreciated ! > > Thanks :) > > _______________________________________________ > Beginners mailing list > Beginners@haskell.org > http://www.haskell.org/mailman/listinfo/beginners From Sayali.Kulkarni at kpitcummins.com Sun Nov 16 23:05:26 2008 From: Sayali.Kulkarni at kpitcummins.com (Sayali Kulkarni) Date: Mon Nov 17 03:10:58 2008 Subject: [Haskell-beginners] Profiling haskell code In-Reply-To: <20081114205334.GA30261@seas.upenn.edu> Message-ID: <82C3BC9106BCE149B63464D79D0A22FD0761A60E@sohm.kpit.com> Hello Brent, I just have written a quick sort program. There is nothing more in the code than that I have shown. What is it about the main function? What do I need to do in the main function? I do not get any errors. And I get the expected output. The only thing that I am stuck at is that I do not get the ".prof" file which will give me the profile details of the code. Also it would be great if you could through a light on whether there is any other method to profile a code in Haskell? Regards, Sayali. -----Original Message----- From: beginners-bounces@haskell.org [mailto:beginners-bounces@haskell.org] On Behalf Of Brent Yorgey Sent: Saturday, November 15, 2008 2:24 AM To: beginners@haskell.org Subject: Re: [Haskell-beginners] Profiling haskell code > > quicksort [ ] = [ ] > > quicksort (x : xs) = quicksort larger ++ [x ] ++ quicksort smaller > > > where > > > smaller = [a | a <- xs, a <= x ] > > > larger = [b | b <- xs, b > x ] > > > > > > When I compile the code with the following command : > > > > $ ghc --make Project.hs -prof -auto-all > > Then I tested it with the following command : > > $ Project +RTS -p > > It generates the .hi and the .o file but I cannot get the .prof file. > > Please let me know if any of the steps is missing or where could I check > my profiling info. > Hi Sayali, Is the code shown above *everything* in your Project.hs file? You will also need a main function for it to actually do anything. If there is more to your Project.hs file that you have not shown, could you send the complete version? Do you get any errors? Does Project produce the output that you expect? -Brent _______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners From byorgey at seas.upenn.edu Mon Nov 17 09:07:57 2008 From: byorgey at seas.upenn.edu (Brent Yorgey) Date: Mon Nov 17 09:02:09 2008 Subject: [Haskell-beginners] Profiling haskell code In-Reply-To: <82C3BC9106BCE149B63464D79D0A22FD0761A60E@sohm.kpit.com> References: <20081114205334.GA30261@seas.upenn.edu> <82C3BC9106BCE149B63464D79D0A22FD0761A60E@sohm.kpit.com> Message-ID: <20081117140757.GA13235@seas.upenn.edu> On Mon, Nov 17, 2008 at 09:35:26AM +0530, Sayali Kulkarni wrote: > Hello Brent, > > I just have written a quick sort program. > There is nothing more in the code than that I have shown. > > What is it about the main function? > What do I need to do in the main function? > > I do not get any errors. > And I get the expected output. The only thing that I am stuck at is that > I do not get the ".prof" file which will give me the profile details of > the code. > > Also it would be great if you could through a light on whether there is > any other method to profile a code in Haskell? > > Regards, > Sayali. Hi Sayali, Just writing a quicksort function by itself is fine if you want to test it interactively in ghci. But if you want to profile it you will have to make an executable, which means you will need a 'main' function which says what to do when the program is run. Your main function might look something like this: main = do print "Sorting..." print (length (quicksort (reverse [1..1000000]))) print "Done!" Of course, sorting a list in reverse order might not be a very representative task; you might also want to look into the System.Random module to generate a list of a million random elements and sort that. -Brent > > -----Original Message----- > From: beginners-bounces@haskell.org > [mailto:beginners-bounces@haskell.org] On Behalf Of Brent Yorgey > Sent: Saturday, November 15, 2008 2:24 AM > To: beginners@haskell.org > Subject: Re: [Haskell-beginners] Profiling haskell code > > > > > quicksort [ ] = [ ] > > > > quicksort (x : xs) = quicksort larger ++ [x ] ++ quicksort smaller > > > > > > where > > > > > > smaller = [a | a <- xs, a <= x ] > > > > > > larger = [b | b <- xs, b > x ] > > > > > > > > > > > > When I compile the code with the following command : > > > > > > > > $ ghc --make Project.hs -prof -auto-all > > > > Then I tested it with the following command : > > > > $ Project +RTS -p > > > > It generates the .hi and the .o file but I cannot get the .prof file. > > > > Please let me know if any of the steps is missing or where could I > check > > my profiling info. > > > > Hi Sayali, > > Is the code shown above *everything* in your Project.hs file? You > will also need a main function for it to actually do anything. If > there is more to your Project.hs file that you have not shown, could > you send the complete version? > > Do you get any errors? Does Project produce the output that you expect? > > -Brent > _______________________________________________ > Beginners mailing list > Beginners@haskell.org > http://www.haskell.org/mailman/listinfo/beginners > From michael at snoyman.com Tue Nov 18 13:02:20 2008 From: michael at snoyman.com (Michael Snoyman) Date: Tue Nov 18 12:56:29 2008 Subject: [Haskell-beginners] Type polymorphism with size Message-ID: <29bf512f0811181002k7ea715f3o8d797aae6a4b3855@mail.gmail.com> I am trying to write some code to read flat files from a mainframe system. This includes some character fields. This is a fixed width file, so each field will have a consistent length between records, but there are fields of different length within a record. For example, I might have a "name" field length 20 and an eye color field length 5. I am trying to use the binary library to read in this file. I've written a binary type, MFChar2, for reading in a 2-length character field. It is defined as such (you can safely ignore the ebcdicToAscii piece, it is just doing character conversion): data MFChar2 = MFChar2 [Word8] instance Binary MFChar2 where put = undefined get = do ebcdic <- replicateM 2 getWord8 return $ MFChar2 $ map ebcdicToAscii ebcdic What I would like to do is have some kind of generic "MFChar" data type which could take any character length, but I can't figure out how to do it. Any help would be appreciated. Thanks, Michael -------------- next part -------------- An HTML attachment was scrubbed... URL: http://www.haskell.org/pipermail/beginners/attachments/20081118/3349841f/attachment.htm From byorgey at seas.upenn.edu Tue Nov 18 14:18:22 2008 From: byorgey at seas.upenn.edu (Brent Yorgey) Date: Tue Nov 18 14:12:30 2008 Subject: [Haskell-beginners] Type polymorphism with size In-Reply-To: <29bf512f0811181002k7ea715f3o8d797aae6a4b3855@mail.gmail.com> References: <29bf512f0811181002k7ea715f3o8d797aae6a4b3855@mail.gmail.com> Message-ID: <20081118191822.GA9270@seas.upenn.edu> On Tue, Nov 18, 2008 at 10:02:20AM -0800, Michael Snoyman wrote: > I am trying to write some code to read flat files from a mainframe system. > This includes some character fields. This is a fixed width file, so each > field will have a consistent length between records, but there are fields of > different length within a record. For example, I might have a "name" field > length 20 and an eye color field length 5. > > I am trying to use the binary library to read in this file. I've written a > binary type, MFChar2, for reading in a 2-length character field. It is > defined as such (you can safely ignore the ebcdicToAscii piece, it is just > doing character conversion): > > data MFChar2 = MFChar2 [Word8] > instance Binary MFChar2 where > put = undefined > get = do ebcdic <- replicateM 2 getWord8 > return $ MFChar2 $ map ebcdicToAscii ebcdic > > What I would like to do is have some kind of generic "MFChar" data type > which could take any character length, but I can't figure out how to do it. > Any help would be appreciated. Hm, interesting! The problem is that 'get' does not take any arguments, so must determine what to do from the type at which it is called. So the number of words to be read needs to be in the type. We can't put actual Int values in a type -- but there is actually a way to do what you want, by encoding natural numbers at the type level! I don't know whether this really belongs on a 'beginners' list but I couldn't resist. =) data Z -- the type representing zero data S n -- the type representing the successor of another natural -- for example, Z, S Z, and S (S Z) are types representing -- zero, one, and two. -- the n is for a type-level natural representing the length of the list. data MFChar n = MFChar [Word8] -- add a Word8 to the beginning of an MFChar, resulting in an MFChar -- one word longer mfCons :: Word8 -> MFChar n -> MFChar (S n) mfCons w (MFChar ws) = MFChar (w:ws) instance Binary (MFChar Z) where get = return $ MFChar [] instance (Binary (MFChar n)) => Binary (MFChar (S n)) where get = do ebcdic <- getWord8 rest <- get -- the correct type of get is -- inferred due to the use of mfCons below return $ mfCons (ebcdicToAscii ebcdic) rest Now if you wanted to read a field with 20 chars, you can use get :: Get (MFChar (S (S (S ... 20 S's ... Z)))) Ugly, I know. You could make it slightly more bearable by defining some type synonyms at the top of your program like type Five = S (S (S (S (S Z)))) type Ten = S (S (S (S (S Five)))) and so on. Then you can just say get :: Get (MFChar Ten) or whatever. This is untested but it (or something close to it) ought to work. Of course, you may well ask yourself whether this contortion is really worth it. Maybe it is, maybe it isn't, but I can't think of a better way to do it in Haskell. In a dependently typed language such as Agda, we could just put regular old natural numbers in the types, instead of going through contortions to encode natural numbers as types as we have to do here. So I guess the real answer to your question is "use a dependently typed language". =) If you have problems getting this to work or more questions, feel free to ask! -Brent From michael at snoyman.com Tue Nov 18 17:18:46 2008 From: michael at snoyman.com (Michael Snoyman) Date: Tue Nov 18 17:12:54 2008 Subject: [Haskell-beginners] Type polymorphism with size In-Reply-To: <20081118191822.GA9270@seas.upenn.edu> References: <29bf512f0811181002k7ea715f3o8d797aae6a4b3855@mail.gmail.com> <20081118191822.GA9270@seas.upenn.edu> Message-ID: <29bf512f0811181418v4698d586u979454b051de85da@mail.gmail.com> On Tue, Nov 18, 2008 at 11:18 AM, Brent Yorgey wrote: > Hm, interesting! The problem is that 'get' does not take any > arguments, so must determine what to do from the type at which it is > called. So the number of words to be read needs to be in the type. > We can't put actual Int values in a type -- but there is actually a > way to do what you want, by encoding natural numbers at the type > level! I don't know whether this really belongs on a 'beginners' list > but I couldn't resist. =) > > > data Z -- the type representing zero > data S n -- the type representing the successor of another natural > > -- for example, Z, S Z, and S (S Z) are types representing > -- zero, one, and two. > > -- the n is for a type-level natural representing the length of the list. > data MFChar n = MFChar [Word8] > > -- add a Word8 to the beginning of an MFChar, resulting in an MFChar > -- one word longer > mfCons :: Word8 -> MFChar n -> MFChar (S n) > mfCons w (MFChar ws) = MFChar (w:ws) > > instance Binary (MFChar Z) where > get = return $ MFChar [] > > instance (Binary (MFChar n)) => Binary (MFChar (S n)) where > get = do ebcdic <- getWord8 > rest <- get -- the correct type of get is > -- inferred due to the use of mfCons below > return $ mfCons (ebcdicToAscii ebcdic) rest > > > Now if you wanted to read a field with 20 chars, you can use > > get :: Get (MFChar (S (S (S ... 20 S's ... Z)))) > > Ugly, I know. You could make it slightly more bearable by defining > some type synonyms at the top of your program like > > type Five = S (S (S (S (S Z)))) > type Ten = S (S (S (S (S Five)))) > > and so on. Then you can just say get :: Get (MFChar Ten) or whatever. > > This is untested but it (or something close to it) ought to work. Of > course, you may well ask yourself whether this contortion is really > worth it. Maybe it is, maybe it isn't, but I can't think of a better > way to do it in Haskell. In a dependently typed language such as > Agda, we could just put regular old natural numbers in the types, > instead of going through contortions to encode natural numbers as > types as we have to do here. So I guess the real answer to your > question is "use a dependently typed language". =) > > If you have problems getting this to work or more questions, feel free > to ask! > Very interesting solution to the problem. I tried it out and it works perfectly... but it's just too much of a hack for my tastes (no offense; I think it was very cool). I thought about it a bit and realized what I really want is a way to deal with tuples of the same type, which led to this kind of implementation. class RepTuple a b | a -> b where toList :: a -> [b] tMap :: (b -> b) -> a -> a instance RepTuple (a, a) a where toList (a, b) = [a, b] tMap f (a, b) = (f a, f b) And so on and so forth for every kind of tuple. Of course, this runs into the issue of the single case, for which I used the OneTuple library (actually, I wrote my own right now, but I intend to just use the OneTuple library). I can then do something like this (which I have tested and works): data MFChar w = MFChar w deriving Eq instance (RepTuple w a, Integral a) => Show (MFChar w) where show (MFChar ws) = map (chr . fromIntegral) $ toList ws instance (Integral a, Binary w, RepTuple w a) => Binary (MFChar w) where put = undefined get = do ebcdic <- get let ascii = tMap ebcdicToAscii ebcdic return $ MFChar ascii type MFChar1 = MFChar (OneTuple Word8) type MFChar2 = MFChar (Word8, Word8) type MFChar4 = MFChar (Word8, Word8, Word8, Word8) type MFChar5 = MFChar (Word8, Word8, Word8, Word8, Word8) type MFChar10 = MFChar (Word8, Word8, Word8, Word8, Word8, Word8, Word8, Word8, Word8, Word8) If I wanted, I could do away with the tMap function and just include the ebcdicToAscii step in the show instance. Michael -------------- next part -------------- An HTML attachment was scrubbed... URL: http://www.haskell.org/pipermail/beginners/attachments/20081118/8a75bca1/attachment-0001.htm From haskell-beginners at iorange.fastmail.fm Tue Nov 18 17:20:47 2008 From: haskell-beginners at iorange.fastmail.fm (haskell-beginners@iorange.fastmail.fm) Date: Tue Nov 18 17:14:54 2008 Subject: [Haskell-beginners] help In-Reply-To: <20081118221257.A04EA32446B@www.haskell.org> References: <20081118221257.A04EA32446B@www.haskell.org> Message-ID: <1227046847.25371.1285516523@webmail.messagingengine.com> On Tue, 18 Nov 2008 17:12:57 -0500 (EST), beginners-request@haskell.org said: > Send Beginners mailing list submissions to > beginners@haskell.org > > To subscribe or unsubscribe via the World Wide Web, visit > http://www.haskell.org/mailman/listinfo/beginners > or, via email, send a message with subject or body 'help' to > beginners-request@haskell.org > > You can reach the person managing the list at > beginners-owner@haskell.org > > When replying, please edit your Subject line so it is more specific > than "Re: Contents of Beginners digest..." > > > Today's Topics: > > 1. Re: Profiling haskell code (Brent Yorgey) > 2. Parsing arithmentic expressions (Glurk) > 3. Re: Parsing arithmentic expressions (Bernie Pope) > 4. RE: Profiling haskell code (Sayali Kulkarni) > 5. Re: Profiling haskell code (Brent Yorgey) > 6. Type polymorphism with size (Michael Snoyman) > 7. Re: Type polymorphism with size (Brent Yorgey) > 8. Re: Type polymorphism with size (Michael Snoyman) > > > ---------------------------------------------------------------------- > > Message: 1 > Date: Fri, 14 Nov 2008 15:53:34 -0500 > From: Brent Yorgey > Subject: Re: [Haskell-beginners] Profiling haskell code > To: beginners@haskell.org > Message-ID: <20081114205334.GA30261@seas.upenn.edu> > Content-Type: text/plain; charset=us-ascii > > > > > quicksort [ ] = [ ] > > > > quicksort (x : xs) = quicksort larger ++ [x ] ++ quicksort smaller > > > > > > where > > > > > > smaller = [a | a <- xs, a <= x ] > > > > > > larger = [b | b <- xs, b > x ] > > > > > > > > > > > > When I compile the code with the following command : > > > > > > > > $ ghc --make Project.hs -prof -auto-all > > > > Then I tested it with the following command : > > > > $ Project +RTS -p > > > > It generates the .hi and the .o file but I cannot get the .prof file. > > > > Please let me know if any of the steps is missing or where could I check > > my profiling info. > > > > Hi Sayali, > > Is the code shown above *everything* in your Project.hs file? You > will also need a main function for it to actually do anything. If > there is more to your Project.hs file that you have not shown, could > you send the complete version? > > Do you get any errors? Does Project produce the output that you expect? > > -Brent > > > ------------------------------ > > Message: 2 > Date: Sun, 16 Nov 2008 00:15:29 +0000 (UTC) > From: Glurk > Subject: [Haskell-beginners] Parsing arithmentic expressions > To: beginners@haskell.org > Message-ID: > Content-Type: text/plain; charset=us-ascii > > Hi, > > I'm just trying to learn how to use Parsec and am experimenting with > parsing > arithmetic expressions. > > This article gives a good example -> > http://www.haskell.org/haskellwiki/Parsing_expressions_and_statements > > However, like most other examples I could find, the grammar for the > expression > doesn't take operator precedence into account, and allows for expressions > of > any size by defining expr recursively, eg :- > > expr ::= var | const | ( expr ) | unop expr | expr duop expr > > So, you can keep extending the expression by adding another operator and > expression. > > The data to hold the expression is then very easily derived :- > > data Expr = Var String | Con Bool | Uno Unop Expr | Duo Duop Expr Expr > > The grammar I want to parse is slightly different in that it allows for > operator precendence. Part of the grammar is something like :- > > expression = SimpleExpression {relation SimpleExpression}. > SimpleExpression = ["+"|"-"] term {AddOperator term}. > > So, instead of recursively defining expression, it is made up of > multiples > occurrences of SimpleExpression joined together with Relation operators. > > Where I am confused is how I should best represent this stucture in my > data. > Should I have something like :- > > data Expr = Expr SimpleExpr [(RelOp, SimpleExpression)] > > ie, an initial SimpleExpr, followed by a list of operator and > SimpleExpression > pairs. > > I haven't seen any example similar to this, so I was wondering if I'm > going > down the wrong track ? > > Perhaps another alternative is to modify the grammar somehow ? > > I guess, the question is, in general how do you handle such repeated > elements > as definied in an EBNF grammar, in structuring your data ? > > Any advice appreciated ! > > Thanks :) > > > > ------------------------------ > > Message: 3 > Date: Mon, 17 Nov 2008 16:35:02 +1100 > From: Bernie Pope > Subject: Re: [Haskell-beginners] Parsing arithmentic expressions > To: Glurk > Cc: beginners@haskell.org > Message-ID: <57383C16-16DD-4032-9CBC-5D6CC27A6E6E@csse.unimelb.edu.au> > Content-Type: text/plain; charset=US-ASCII; format=flowed; delsp=yes > > Hi, > > Have you seen the buildExpressionParser combinator in Parsec? > > http://legacy.cs.uu.nl/daan/download/parsec/parsec.html#buildExpressionParser > > It allows you to specify precedence and associativity for operator > parsers declaratively, and it generally saves you from lots of > refactoring in the grammar. > > You could probably stick with the straightforward data representation > of expressions. > > Cheers, > Bernie. > > On 16/11/2008, at 11:15 AM, Glurk wrote: > > > Hi, > > > > I'm just trying to learn how to use Parsec and am experimenting with > > parsing > > arithmetic expressions. > > > > This article gives a good example -> > > http://www.haskell.org/haskellwiki/Parsing_expressions_and_statements > > > > However, like most other examples I could find, the grammar for the > > expression > > doesn't take operator precedence into account, and allows for > > expressions of > > any size by defining expr recursively, eg :- > > > > expr ::= var | const | ( expr ) | unop expr | expr duop expr > > > > So, you can keep extending the expression by adding another operator > > and > > expression. > > > > The data to hold the expression is then very easily derived :- > > > > data Expr = Var String | Con Bool | Uno Unop Expr | Duo Duop Expr Expr > > > > The grammar I want to parse is slightly different in that it allows > > for > > operator precendence. Part of the grammar is something like :- > > > > expression = SimpleExpression {relation SimpleExpression}. > > SimpleExpression = ["+"|"-"] term {AddOperator term}. > > > > So, instead of recursively defining expression, it is made up of > > multiples > > occurrences of SimpleExpression joined together with Relation > > operators. > > > > Where I am confused is how I should best represent this stucture in > > my data. > > Should I have something like :- > > > > data Expr = Expr SimpleExpr [(RelOp, SimpleExpression)] > > > > ie, an initial SimpleExpr, followed by a list of operator and > > SimpleExpression > > pairs. > > > > I haven't seen any example similar to this, so I was wondering if > > I'm going > > down the wrong track ? > > > > Perhaps another alternative is to modify the grammar somehow ? > > > > I guess, the question is, in general how do you handle such repeated > > elements > > as definied in an EBNF grammar, in structuring your data ? > > > > Any advice appreciated ! > > > > Thanks :) > > > > _______________________________________________ > > Beginners mailing list > > Beginners@haskell.org > > http://www.haskell.org/mailman/listinfo/beginners > > > > ------------------------------ > > Message: 4 > Date: Mon, 17 Nov 2008 09:35:26 +0530 > From: "Sayali Kulkarni" > Subject: RE: [Haskell-beginners] Profiling haskell code > To: "Brent Yorgey" , > Message-ID: <82C3BC9106BCE149B63464D79D0A22FD0761A60E@sohm.kpit.com> > Content-Type: text/plain; charset="us-ascii" > > Hello Brent, > > I just have written a quick sort program. > There is nothing more in the code than that I have shown. > > What is it about the main function? > What do I need to do in the main function? > > I do not get any errors. > And I get the expected output. The only thing that I am stuck at is that > I do not get the ".prof" file which will give me the profile details of > the code. > > Also it would be great if you could through a light on whether there is > any other method to profile a code in Haskell? > > Regards, > Sayali. > > -----Original Message----- > From: beginners-bounces@haskell.org > [mailto:beginners-bounces@haskell.org] On Behalf Of Brent Yorgey > Sent: Saturday, November 15, 2008 2:24 AM > To: beginners@haskell.org > Subject: Re: [Haskell-beginners] Profiling haskell code > > > > > quicksort [ ] = [ ] > > > > quicksort (x : xs) = quicksort larger ++ [x ] ++ quicksort smaller > > > > > > where > > > > > > smaller = [a | a <- xs, a <= x ] > > > > > > larger = [b | b <- xs, b > x ] > > > > > > > > > > > > When I compile the code with the following command : > > > > > > > > $ ghc --make Project.hs -prof -auto-all > > > > Then I tested it with the following command : > > > > $ Project +RTS -p > > > > It generates the .hi and the .o file but I cannot get the .prof file. > > > > Please let me know if any of the steps is missing or where could I > check > > my profiling info. > > > > Hi Sayali, > > Is the code shown above *everything* in your Project.hs file? You > will also need a main function for it to actually do anything. If > there is more to your Project.hs file that you have not shown, could > you send the complete version? > > Do you get any errors? Does Project produce the output that you expect? > > -Brent > _______________________________________________ > Beginners mailing list > Beginners@haskell.org > http://www.haskell.org/mailman/listinfo/beginners > > > ------------------------------ > > Message: 5 > Date: Mon, 17 Nov 2008 09:07:57 -0500 > From: Brent Yorgey > Subject: Re: [Haskell-beginners] Profiling haskell code > To: beginners@haskell.org > Message-ID: <20081117140757.GA13235@seas.upenn.edu> > Content-Type: text/plain; charset=us-ascii > > On Mon, Nov 17, 2008 at 09:35:26AM +0530, Sayali Kulkarni wrote: > > Hello Brent, > > > > I just have written a quick sort program. > > There is nothing more in the code than that I have shown. > > > > What is it about the main function? > > What do I need to do in the main function? > > > > I do not get any errors. > > And I get the expected output. The only thing that I am stuck at is that > > I do not get the ".prof" file which will give me the profile details of > > the code. > > > > Also it would be great if you could through a light on whether there is > > any other method to profile a code in Haskell? > > > > Regards, > > Sayali. > > Hi Sayali, > > Just writing a quicksort function by itself is fine if you want to > test it interactively in ghci. But if you want to profile it you will > have to make an executable, which means you will need a 'main' > function which says what to do when the program is run. Your main > function might look something like this: > > main = do print "Sorting..." > print (length (quicksort (reverse [1..1000000]))) > print "Done!" > > Of course, sorting a list in reverse order might not be a very > representative task; you might also want to look into the > System.Random module to generate a list of a million random elements > and sort that. > > -Brent > > > > > -----Original Message----- > > From: beginners-bounces@haskell.org > > [mailto:beginners-bounces@haskell.org] On Behalf Of Brent Yorgey > > Sent: Saturday, November 15, 2008 2:24 AM > > To: beginners@haskell.org > > Subject: Re: [Haskell-beginners] Profiling haskell code > > > > > > > > quicksort [ ] = [ ] > > > > > > quicksort (x : xs) = quicksort larger ++ [x ] ++ quicksort smaller > > > > > > > > > where > > > > > > > > > smaller = [a | a <- xs, a <= x ] > > > > > > > > > larger = [b | b <- xs, b > x ] > > > > > > > > > > > > > > > > > > When I compile the code with the following command : > > > > > > > > > > > > $ ghc --make Project.hs -prof -auto-all > > > > > > Then I tested it with the following command : > > > > > > $ Project +RTS -p > > > > > > It generates the .hi and the .o file but I cannot get the .prof file. > > > > > > Please let me know if any of the steps is missing or where could I > > check > > > my profiling info. > > > > > > > Hi Sayali, > > > > Is the code shown above *everything* in your Project.hs file? You > > will also need a main function for it to actually do anything. If > > there is more to your Project.hs file that you have not shown, could > > you send the complete version? > > > > Do you get any errors? Does Project produce the output that you expect? > > > > -Brent > > _______________________________________________ > > Beginners mailing list > > Beginners@haskell.org > > http://www.haskell.org/mailman/listinfo/beginners > > > > > ------------------------------ > > Message: 6 > Date: Tue, 18 Nov 2008 10:02:20 -0800 > From: "Michael Snoyman" > Subject: [Haskell-beginners] Type polymorphism with size > To: beginners@haskell.org > Message-ID: > <29bf512f0811181002k7ea715f3o8d797aae6a4b3855@mail.gmail.com> > Content-Type: text/plain; charset="utf-8" > > I am trying to write some code to read flat files from a mainframe > system. > This includes some character fields. This is a fixed width file, so each > field will have a consistent length between records, but there are fields > of > different length within a record. For example, I might have a "name" > field > length 20 and an eye color field length 5. > > I am trying to use the binary library to read in this file. I've written > a > binary type, MFChar2, for reading in a 2-length character field. It is > defined as such (you can safely ignore the ebcdicToAscii piece, it is > just > doing character conversion): > > data MFChar2 = MFChar2 [Word8] > instance Binary MFChar2 where > put = undefined > get = do ebcdic <- replicateM 2 getWord8 > return $ MFChar2 $ map ebcdicToAscii ebcdic > > What I would like to do is have some kind of generic "MFChar" data type > which could take any character length, but I can't figure out how to do > it. > Any help would be appreciated. > > Thanks, > Michael > -------------- next part -------------- > An HTML attachment was scrubbed... > URL: > http://www.haskell.org/pipermail/beginners/attachments/20081118/3349841f/attachment-0001.htm > > ------------------------------ > > Message: 7 > Date: Tue, 18 Nov 2008 14:18:22 -0500 > From: Brent Yorgey > Subject: Re: [Haskell-beginners] Type polymorphism with size > To: beginners@haskell.org > Message-ID: <20081118191822.GA9270@seas.upenn.edu> > Content-Type: text/plain; charset=us-ascii > > On Tue, Nov 18, 2008 at 10:02:20AM -0800, Michael Snoyman wrote: > > I am trying to write some code to read flat files from a mainframe system. > > This includes some character fields. This is a fixed width file, so each > > field will have a consistent length between records, but there are fields of > > different length within a record. For example, I might have a "name" field > > length 20 and an eye color field length 5. > > > > I am trying to use the binary library to read in this file. I've written a > > binary type, MFChar2, for reading in a 2-length character field. It is > > defined as such (you can safely ignore the ebcdicToAscii piece, it is just > > doing character conversion): > > > > data MFChar2 = MFChar2 [Word8] > > instance Binary MFChar2 where > > put = undefined > > get = do ebcdic <- replicateM 2 getWord8 > > return $ MFChar2 $ map ebcdicToAscii ebcdic > > > > What I would like to do is have some kind of generic "MFChar" data type > > which could take any character length, but I can't figure out how to do it. > > Any help would be appreciated. > > Hm, interesting! The problem is that 'get' does not take any > arguments, so must determine what to do from the type at which it is > called. So the number of words to be read needs to be in the type. > We can't put actual Int values in a type -- but there is actually a > way to do what you want, by encoding natural numbers at the type > level! I don't know whether this really belongs on a 'beginners' list > but I couldn't resist. =) > > > data Z -- the type representing zero > data S n -- the type representing the successor of another natural > > -- for example, Z, S Z, and S (S Z) are types representing > -- zero, one, and two. > > -- the n is for a type-level natural representing the length of the list. > data MFChar n = MFChar [Word8] > > -- add a Word8 to the beginning of an MFChar, resulting in an MFChar > -- one word longer > mfCons :: Word8 -> MFChar n -> MFChar (S n) > mfCons w (MFChar ws) = MFChar (w:ws) > > instance Binary (MFChar Z) where > get = return $ MFChar [] > > instance (Binary (MFChar n)) => Binary (MFChar (S n)) where > get = do ebcdic <- getWord8 > rest <- get -- the correct type of get is > -- inferred due to the use of mfCons below > return $ mfCons (ebcdicToAscii ebcdic) rest > > > Now if you wanted to read a field with 20 chars, you can use > > get :: Get (MFChar (S (S (S ... 20 S's ... Z)))) > > Ugly, I know. You could make it slightly more bearable by defining > some type synonyms at the top of your program like > > type Five = S (S (S (S (S Z)))) > type Ten = S (S (S (S (S Five)))) > > and so on. Then you can just say get :: Get (MFChar Ten) or whatever. > > This is untested but it (or something close to it) ought to work. Of > course, you may well ask yourself whether this contortion is really > worth it. Maybe it is, maybe it isn't, but I can't think of a better > way to do it in Haskell. In a dependently typed language such as > Agda, we could just put regular old natural numbers in the types, > instead of going through contortions to encode natural numbers as > types as we have to do here. So I guess the real answer to your > question is "use a dependently typed language". =) > > If you have problems getting this to work or more questions, feel free > to ask! > > -Brent > > > ------------------------------ > > Message: 8 > Date: Tue, 18 Nov 2008 14:18:46 -0800 > From: "Michael Snoyman" > Subject: Re: [Haskell-beginners] Type polymorphism with size > To: "Brent Yorgey" > Cc: beginners@haskell.org > Message-ID: > <29bf512f0811181418v4698d586u979454b051de85da@mail.gmail.com> > Content-Type: text/plain; charset="utf-8" > > On Tue, Nov 18, 2008 at 11:18 AM, Brent Yorgey > wrote: > > > Hm, interesting! The problem is that 'get' does not take any > > arguments, so must determine what to do from the type at which it is > > called. So the number of words to be read needs to be in the type. > > We can't put actual Int values in a type -- but there is actually a > > way to do what you want, by encoding natural numbers at the type > > level! I don't know whether this really belongs on a 'beginners' list > > but I couldn't resist. =) > > > > > > data Z -- the type representing zero > > data S n -- the type representing the successor of another natural > > > > -- for example, Z, S Z, and S (S Z) are types representing > > -- zero, one, and two. > > > > -- the n is for a type-level natural representing the length of the list. > > data MFChar n = MFChar [Word8] > > > > -- add a Word8 to the beginning of an MFChar, resulting in an MFChar > > -- one word longer > > mfCons :: Word8 -> MFChar n -> MFChar (S n) > > mfCons w (MFChar ws) = MFChar (w:ws) > > > > instance Binary (MFChar Z) where > > get = return $ MFChar [] > > > > instance (Binary (MFChar n)) => Binary (MFChar (S n)) where > > get = do ebcdic <- getWord8 > > rest <- get -- the correct type of get is > > -- inferred due to the use of mfCons below > > return $ mfCons (ebcdicToAscii ebcdic) rest > > > > > > Now if you wanted to read a field with 20 chars, you can use > > > > get :: Get (MFChar (S (S (S ... 20 S's ... Z)))) > > > > Ugly, I know. You could make it slightly more bearable by defining > > some type synonyms at the top of your program like > > > > type Five = S (S (S (S (S Z)))) > > type Ten = S (S (S (S (S Five)))) > > > > and so on. Then you can just say get :: Get (MFChar Ten) or whatever. > > > > This is untested but it (or something close to it) ought to work. Of > > course, you may well ask yourself whether this contortion is really > > worth it. Maybe it is, maybe it isn't, but I can't think of a better > > way to do it in Haskell. In a dependently typed language such as > > Agda, we could just put regular old natural numbers in the types, > > instead of going through contortions to encode natural numbers as > > types as we have to do here. So I guess the real answer to your > > question is "use a dependently typed language". =) > > > > If you have problems getting this to work or more questions, feel free > > to ask! > > > > Very interesting solution to the problem. I tried it out and it works > perfectly... but it's just too much of a hack for my tastes (no offense; > I > think it was very cool). I thought about it a bit and realized what I > really > want is a way to deal with tuples of the same type, which led to this > kind > of implementation. > > class RepTuple a b | a -> b where > toList :: a -> [b] > tMap :: (b -> b) -> a -> a > > instance RepTuple (a, a) a where > toList (a, b) = [a, b] > tMap f (a, b) = (f a, f b) > > And so on and so forth for every kind of tuple. Of course, this runs into > the issue of the single case, for which I used the OneTuple library > (actually, I wrote my own right now, but I intend to just use the > OneTuple > library). > > I can then do something like this (which I have tested and works): > > data MFChar w = MFChar w > deriving Eq > instance (RepTuple w a, Integral a) => Show (MFChar w) where > show (MFChar ws) = map (chr . fromIntegral) $ toList ws > instance (Integral a, Binary w, RepTuple w a) => Binary (MFChar w) where > put = undefined > get = do ebcdic <- get > let ascii = tMap ebcdicToAscii ebcdic > return $ MFChar ascii > > type MFChar1 = MFChar (OneTuple Word8) > type MFChar2 = MFChar (Word8, Word8) > type MFChar4 = MFChar (Word8, Word8, Word8, Word8) > type MFChar5 = MFChar (Word8, Word8, Word8, Word8, Word8) > type MFChar10 = MFChar (Word8, Word8, Word8, Word8, Word8, > Word8, Word8, Word8, Word8, Word8) > > If I wanted, I could do away with the tMap function and just include the > ebcdicToAscii step in the show instance. > > Michael > -------------- next part -------------- > An HTML attachment was scrubbed... > URL: > http://www.haskell.org/pipermail/beginners/attachments/20081118/8a75bca1/attachment.htm > > ------------------------------ > > _______________________________________________ > Beginners mailing list > Beginners@haskell.org > http://www.haskell.org/mailman/listinfo/beginners > > > End of Beginners Digest, Vol 5, Issue 10 > **************************************** -- israel orange iorange@fastmail.fm From byorgey at seas.upenn.edu Tue Nov 18 20:16:37 2008 From: byorgey at seas.upenn.edu (Brent Yorgey) Date: Tue Nov 18 20:10:44 2008 Subject: [Haskell-beginners] Type polymorphism with size In-Reply-To: <29bf512f0811181418v4698d586u979454b051de85da@mail.gmail.com> References: <29bf512f0811181002k7ea715f3o8d797aae6a4b3855@mail.gmail.com> <20081118191822.GA9270@seas.upenn.edu> <29bf512f0811181418v4698d586u979454b051de85da@mail.gmail.com> Message-ID: <20081119011637.GA25277@seas.upenn.edu> On Tue, Nov 18, 2008 at 02:18:46PM -0800, Michael Snoyman wrote: > > Very interesting solution to the problem. I tried it out and it works > perfectly... but it's just too much of a hack for my tastes (no offense; I None taken. =) > > class RepTuple a b | a -> b where > toList :: a -> [b] > tMap :: (b -> b) -> a -> a > > instance RepTuple (a, a) a where > toList (a, b) = [a, b] > tMap f (a, b) = (f a, f b) > > And so on and so forth for every kind of tuple. Of course, this runs into > the issue of the single case, for which I used the OneTuple library > (actually, I wrote my own right now, but I intend to just use the OneTuple > library). > This is reasonable too. It's just a tradeoff of hackishness vs. code length/tediousness. I.e. in the solution with type-level naturals, you don't need a separate instance like this for every number you're going to use. And no one really likes writing things like tMap f (a,b,c,d,e,g,h,i,j) = ... =) -Brent From dpfrey at shaw.ca Tue Nov 18 22:58:24 2008 From: dpfrey at shaw.ca (David Frey) Date: Tue Nov 18 22:52:32 2008 Subject: [Haskell-beginners] Type polymorphism with size In-Reply-To: <29bf512f0811181002k7ea715f3o8d797aae6a4b3855@mail.gmail.com> Message-ID: On 11/18/2008, "Michael Snoyman" wrote: >I am trying to write some code to read flat files from a mainframe system. >This includes some character fields. This is a fixed width file, so each >field will have a consistent length between records, but there are fields of >different length within a record. For example, I might have a "name" field >length 20 and an eye color field length 5. > >I am trying to use the binary library to read in this file. I've written a >binary type, MFChar2, for reading in a 2-length character field. It is >defined as such (you can safely ignore the ebcdicToAscii piece, it is just >doing character conversion): > >data MFChar2 = MFChar2 [Word8] >instance Binary MFChar2 where > put = undefined > get = do ebcdic <- replicateM 2 getWord8 > return $ MFChar2 $ map ebcdicToAscii ebcdic > >What I would like to do is have some kind of generic "MFChar" data type >which could take any character length, but I can't figure out how to do it. >Any help would be appreciated. > >Thanks, >Michael Is this something that could be accomplished using template Haskell? I don't know anything about template Haskell, but maybe someone else on the list can comment on this suggestion. From michael at snoyman.com Wed Nov 19 00:37:16 2008 From: michael at snoyman.com (Michael Snoyman) Date: Wed Nov 19 00:31:23 2008 Subject: [Haskell-beginners] Type polymorphism with size In-Reply-To: <20081119011637.GA25277@seas.upenn.edu> References: <29bf512f0811181002k7ea715f3o8d797aae6a4b3855@mail.gmail.com> <20081118191822.GA9270@seas.upenn.edu> <29bf512f0811181418v4698d586u979454b051de85da@mail.gmail.com> <20081119011637.GA25277@seas.upenn.edu> Message-ID: <29bf512f0811182137i37bc20faqe0cfbb614da88e5d@mail.gmail.com> On Tue, Nov 18, 2008 at 5:16 PM, Brent Yorgey wrote: > > class RepTuple a b | a -> b where > > toList :: a -> [b] > > tMap :: (b -> b) -> a -> a > > > > instance RepTuple (a, a) a where > > toList (a, b) = [a, b] > > tMap f (a, b) = (f a, f b) > > > > And so on and so forth for every kind of tuple. Of course, this runs into > > the issue of the single case, for which I used the OneTuple library > > (actually, I wrote my own right now, but I intend to just use the > OneTuple > > library). > > > > This is reasonable too. It's just a tradeoff of hackishness vs. code > length/tediousness. I.e. in the solution with type-level naturals, you > don't need a separate instance like this for every number you're going > to use. And no one really likes writing things like > tMap f (a,b,c,d,e,g,h,i,j) = ... =) > > -Brent > I agree that it's not something people want to code; I was just thinking that a RepTuple kind of library might be useful for other purposes (ensuring lists of certain length essentially). Michael -------------- next part -------------- An HTML attachment was scrubbed... URL: http://www.haskell.org/pipermail/beginners/attachments/20081118/f8e54b53/attachment.htm From byorgey at seas.upenn.edu Wed Nov 19 07:52:20 2008 From: byorgey at seas.upenn.edu (Brent Yorgey) Date: Wed Nov 19 07:46:25 2008 Subject: [Haskell-beginners] Type polymorphism with size In-Reply-To: References: <29bf512f0811181002k7ea715f3o8d797aae6a4b3855@mail.gmail.com> Message-ID: <20081119125220.GA25089@seas.upenn.edu> On Tue, Nov 18, 2008 at 07:58:24PM -0800, David Frey wrote: > On 11/18/2008, "Michael Snoyman" wrote: > > >I am trying to write some code to read flat files from a mainframe system. > >This includes some character fields. This is a fixed width file, so each > >field will have a consistent length between records, but there are fields of > >different length within a record. For example, I might have a "name" field > >length 20 and an eye color field length 5. > > > >I am trying to use the binary library to read in this file. I've written a > >binary type, MFChar2, for reading in a 2-length character field. It is > >defined as such (you can safely ignore the ebcdicToAscii piece, it is just > >doing character conversion): > > > >data MFChar2 = MFChar2 [Word8] > >instance Binary MFChar2 where > > put = undefined > > get = do ebcdic <- replicateM 2 getWord8 > > return $ MFChar2 $ map ebcdicToAscii ebcdic > > > >What I would like to do is have some kind of generic "MFChar" data type > >which could take any character length, but I can't figure out how to do it. > >Any help would be appreciated. > > > >Thanks, > >Michael > > > Is this something that could be accomplished using template Haskell? I > don't know anything about template Haskell, but maybe someone else on > the list can comment on this suggestion. Yes, in the sense that you could use Template Haskell to generate all the repetitive boilerplate code that you'd rather not write yourself, e.g. one instance of Binary for each number of Words. In this particular case it seems sort of overkill, in the sense that it probably wouldn't be worth the pain of learning how to use it. (For those who don't know, Template Haskell [1] is a GHC feature + library that lets you do compile-time metaprogramming/code generation.) -Brent [1] http://www.haskell.org/haskellwiki/Template_Haskell From cm at raytheon.com Sat Nov 22 20:56:15 2008 From: cm at raytheon.com (cm) Date: Sat Nov 22 20:50:16 2008 Subject: [Haskell-beginners] Possible to update Haskell syntax Message-ID: I'm very interested in learning Haskell, but one frustration is that lists always require commas. As an example [1,2,3,4] is a valid expression, but [1 2 3 4] is not. In this ideal world, another example would be that [(fun1 3 4) 7] would be a valid expression and be a two-element list equivalent to [fun1 3 4, 7]. If what I am suggesting is syntactically possible and doesn't break more advanced features of the language that I (as a beginner) am unaware of, I'm interested in patching the open source for my own use (as well as others who might want it). From rkosara at gmail.com Sat Nov 22 21:53:37 2008 From: rkosara at gmail.com (Robert Kosara) Date: Sat Nov 22 21:47:32 2008 Subject: [Haskell-beginners] Trouble with formatting, Real World Haskell example Message-ID: <9100c1840811221853g6405da6esaa047c692a34a3cb@mail.gmail.com> I'm having some trouble getting the InteractWith example from Real World Haskell's Chapter 4 to compile. When I use spaces (like below), it says "Interact.hs:10:30: Empty 'do' construct." When I use tabs (4 spaces per tab), I get "Interact.hs:16:13: parse error on input `='." In either case, I don't see the problem. Any help would be greatly appreciated. I'm also confused about the formatting of the example in the book (page 72). The last line ("myFunction = id") seems to be indented between the where and the next line, why is that? Is that simply a layout problem? To me, it seems it should be on the same level as the where. Below is my program: -- Interact.hs, simple filter in Haskell import System.Environment (getArgs) interactWith function inputFile outputFile = do input <- readFile inputFile writeFile outputFile (function input) main = mainWith myFunction where mainWith function = do args <- getArgs case args of [input, output] -> interactWith function input output _ -> putStrLn "Usage: Interact inputFile outputFile" myFunction = id Regards, Robert -------------- next part -------------- An HTML attachment was scrubbed... URL: http://www.haskell.org/pipermail/beginners/attachments/20081122/e2f2318b/attachment.htm From ed at edmccaffrey.net Sat Nov 22 22:41:29 2008 From: ed at edmccaffrey.net (Ed McCaffrey) Date: Sat Nov 22 22:35:23 2008 Subject: [Haskell-beginners] Trouble with formatting, Real World Haskell example In-Reply-To: <9100c1840811221853g6405da6esaa047c692a34a3cb@mail.gmail.com> References: <9100c1840811221853g6405da6esaa047c692a34a3cb@mail.gmail.com> Message-ID: <86f16dc10811221941g5c81e757l93fde7ba773a8d2e@mail.gmail.com> On Sat, Nov 22, 2008 at 9:53 PM, Robert Kosara wrote: > I'm having some trouble getting the InteractWith example from Real World > Haskell's Chapter 4 to compile. When I use spaces (like below), it says > "Interact.hs:10:30: Empty 'do' construct." When I use tabs (4 spaces per > tab), I get "Interact.hs:16:13: parse error on input `='." In either case, I > don't see the problem. Any help would be greatly appreciated. > I'm also confused about the formatting of the example in the book (page > 72). The last line ("myFunction = id") seems to be indented between the > where and the next line, why is that? Is that simply a layout problem? To > me, it seems it should be on the same level as the where. > > Below is my program: > > -- Interact.hs, simple filter in Haskell > > import System.Environment (getArgs) > > interactWith function inputFile outputFile = do > input <- readFile inputFile > writeFile outputFile (function input) > > main = mainWith myFunction > where mainWith function = do > args <- getArgs > case args of > [input, output] -> interactWith function input output > _ -> putStrLn "Usage: Interact inputFile outputFile" > > myFunction = id > > > Regards, > > Robert > > > _______________________________________________ > Beginners mailing list > Beginners@haskell.org > http://www.haskell.org/mailman/listinfo/beginners > > -------------- next part -------------- An HTML attachment was scrubbed... URL: http://www.haskell.org/pipermail/beginners/attachments/20081122/e37ea330/attachment.htm From ed at edmccaffrey.net Sat Nov 22 22:41:47 2008 From: ed at edmccaffrey.net (Ed McCaffrey) Date: Sat Nov 22 22:35:42 2008 Subject: [Haskell-beginners] Trouble with formatting, Real World Haskell example In-Reply-To: <86f16dc10811221941g5c81e757l93fde7ba773a8d2e@mail.gmail.com> References: <9100c1840811221853g6405da6esaa047c692a34a3cb@mail.gmail.com> <86f16dc10811221941g5c81e757l93fde7ba773a8d2e@mail.gmail.com> Message-ID: <86f16dc10811221941k5ad3c008w9168e08cb0e6bfa2@mail.gmail.com> I hope the spacing is preserved by my email client; here's a formatting that compiles: import System.Environment (getArgs) interactWith function inputFile outputFile = do input <- readFile inputFile writeFile outputFile (function input) main = mainWith myFunction where mainWith function = do args <- getArgs case args of [input, output] -> interactWith function input output _ -> putStrLn "Usage: Interact inputFile outputFile" myFunction = id On Sat, Nov 22, 2008 at 9:53 PM, Robert Kosara wrote: > I'm having some trouble getting the InteractWith example from Real World > Haskell's Chapter 4 to compile. When I use spaces (like below), it says > "Interact.hs:10:30: Empty 'do' construct." When I use tabs (4 spaces per > tab), I get "Interact.hs:16:13: parse error on input `='." In either case, I > don't see the problem. Any help would be greatly appreciated. > I'm also confused about the formatting of the example in the book (page > 72). The last line ("myFunction = id") seems to be indented between the > where and the next line, why is that? Is that simply a layout problem? To > me, it seems it should be on the same level as the where. > > Below is my program: > > -- Interact.hs, simple filter in Haskell > > import System.Environment (getArgs) > > interactWith function inputFile outputFile = do > input <- readFile inputFile > writeFile outputFile (function input) > > main = mainWith myFunction > where mainWith function = do > args <- getArgs > case args of > [input, output] -> interactWith function input output > _ -> putStrLn "Usage: Interact inputFile outputFile" > > myFunction = id > > > Regards, > > Robert > > > _______________________________________________ > Beginners mailing list > Beginners@haskell.org > http://www.haskell.org/mailman/listinfo/beginners > > On Sat, Nov 22, 2008 at 10:41 PM, Ed McCaffrey wrote: > > > On Sat, Nov 22, 2008 at 9:53 PM, Robert Kosara wrote: > >> I'm having some trouble getting the InteractWith example from Real World >> Haskell's Chapter 4 to compile. When I use spaces (like below), it says >> "Interact.hs:10:30: Empty 'do' construct." When I use tabs (4 spaces per >> tab), I get "Interact.hs:16:13: parse error on input `='." In either case, I >> don't see the problem. Any help would be greatly appreciated. >> I'm also confused about the formatting of the example in the book (page >> 72). The last line ("myFunction = id") seems to be indented between the >> where and the next line, why is that? Is that simply a layout problem? To >> me, it seems it should be on the same level as the where. >> >> Below is my program: >> >> -- Interact.hs, simple filter in Haskell >> >> import System.Environment (getArgs) >> >> interactWith function inputFile outputFile = do >> input <- readFile inputFile >> writeFile outputFile (function input) >> >> main = mainWith myFunction >> where mainWith function = do >> args <- getArgs >> case args of >> [input, output] -> interactWith function input output >> _ -> putStrLn "Usage: Interact inputFile outputFile" >> >> myFunction = id >> >> >> Regards, >> >> Robert >> >> >> _______________________________________________ >> Beginners mailing list >> Beginners@haskell.org >> http://www.haskell.org/mailman/listinfo/beginners >> >> > -------------- next part -------------- An HTML attachment was scrubbed... URL: http://www.haskell.org/pipermail/beginners/attachments/20081122/8fa7b437/attachment-0001.htm From steven.e.ashley at gmail.com Sun Nov 23 00:00:17 2008 From: steven.e.ashley at gmail.com (Steven Ashley) Date: Sat Nov 22 23:54:11 2008 Subject: [Haskell-beginners] Possible to update Haskell syntax In-Reply-To: References: Message-ID: Hi cm, An ambiguity arises when you have a list containing functions. For instance consider: fmap ($3) [id id id id] Cheers, Steven 2008/11/23 cm : > I'm very interested in learning Haskell, but one frustration is that lists > always require commas. As an example [1,2,3,4] is a valid expression, but > [1 2 3 4] is not. > > In this ideal world, another example would be that [(fun1 3 4) 7] would be a > valid expression and be a two-element list equivalent to [fun1 3 4, 7]. > > If what I am suggesting is syntactically possible and doesn't break more > advanced features of the language that I (as a beginner) am unaware of, I'm > interested in patching the open source for my own use (as well as others who > might want it). > _______________________________________________ > Beginners mailing list > Beginners@haskell.org > http://www.haskell.org/mailman/listinfo/beginners > From steven.e.ashley at gmail.com Sun Nov 23 00:10:24 2008 From: steven.e.ashley at gmail.com (Steven Ashley) Date: Sun Nov 23 00:04:17 2008 Subject: [Haskell-beginners] Trouble with formatting, Real World Haskell example In-Reply-To: <9100c1840811221853g6405da6esaa047c692a34a3cb@mail.gmail.com> References: <9100c1840811221853g6405da6esaa047c692a34a3cb@mail.gmail.com> Message-ID: Hi Robert, The contents of the do block must be indented at-least as much as mainWith on the previous line. For instance: import System.Environment (getArgs) interactWith function inputFile outputFile = do ....input <- readFile inputFile ....writeFile outputFile (function input) main = mainWith myFunction ....where mainWith function = do ....................args <- getArgs ....................case args of ..............................[input, output] -> interactWith function input output .............................._ -> putStrLn "Usage: Interact inputFile outputFile" ....................myFunction = id The haskell wikibook has some more detailed information of http://en.wikibooks.org/wiki/Haskell/Indentation Regards, --Steven 2008/11/23 Robert Kosara : > I'm having some trouble getting the InteractWith example from Real World > Haskell's Chapter 4 to compile. When I use spaces (like below), it says > "Interact.hs:10:30: Empty 'do' construct." When I use tabs (4 spaces per > tab), I get "Interact.hs:16:13: parse error on input `='." In either case, I > don't see the problem. Any help would be greatly appreciated. > I'm also confused about the formatting of the example in the book (page 72). > The last line ("myFunction = id") seems to be indented between the where and > the next line, why is that? Is that simply a layout problem? To me, it seems > it should be on the same level as the where. > Below is my program: > -- Interact.hs, simple filter in Haskell > import System.Environment (getArgs) > interactWith function inputFile outputFile = do > input <- readFile inputFile > writeFile outputFile (function input) > main = mainWith myFunction > where mainWith function = do > args <- getArgs > case args of > [input, output] -> interactWith function input output > _ -> putStrLn "Usage: Interact inputFile outputFile" > myFunction = id > > Regards, > Robert > > _______________________________________________ > Beginners mailing list > Beginners@haskell.org > http://www.haskell.org/mailman/listinfo/beginners > > From malcolm.reynolds at gmail.com Sun Nov 23 17:28:23 2008 From: malcolm.reynolds at gmail.com (Malcolm Reynolds) Date: Sun Nov 23 17:22:15 2008 Subject: [Haskell-beginners] Efficient sieve of erastothenes, for solving project euler problem #10? Message-ID: Hello all, I'm attempting to learn Haskell by going through the project euler problems. Number 10, http://projecteuler.net/index.php?section=problems&id=10 , involves summing prime numbers. It's easy in terms of coding something up that works, but I'm having a lot of trouble getting decent performance. I've learned a reasonable amount of ML at uni but Haskell is the first lazy language I've used.. I think the inefficiency is possibly due to the laziness but I'm not positive. I'd love if someone could show me how to do this in Haskell somewhere near as fast as C - at the moment I have a C version which runs in about a tenth of a second ( http://github.com/malcster/project-euler-solutions--c-/tree/master/10.c ). My haskell attempts are http://github.com/malcster/project-euler-solutions/tree/master/10better.hs (using the sieve) and http://github.com/malcster/project-euler-solutions/tree/master/10.hs (using possibly an even worse method, but seems to be a bit faster). If anyone could point out any neat strictness annotations or anything else I could put in, that would be cool. Cheers, Malcolm From c.chryssochoidis at gmail.com Sun Nov 23 19:32:52 2008 From: c.chryssochoidis at gmail.com (Christos Chryssochoidis) Date: Sun Nov 23 19:26:43 2008 Subject: [Haskell-beginners] Efficient sieve of erastothenes, for solving project euler problem #10? In-Reply-To: References: Message-ID: Sorry, I pressed inadvertently the "send" button... The previous code has some typos... :-) The code is this: ------------------------------ isPrime :: Integer -> Bool isPrime n = isPrimeAux n 2 where -- First param is the number to be tested -- for primality. Second param the current -- divisor. isPrimeAux :: Integer -> Integer -> Bool isPrimeAux n k | fromIntegral k > sqrt (fromIntegral n) = True | otherwise = if n `mod` k == 0 then False else isPrimeAux n (k+1) main :: IO () main = print $ sum $ filter isPrime [2..1999999] ------------------------- I compiled the code with "ghc --make prob10.hs", and although it wasn't lightning fast I got the answer after a little less than a minute on my system. Hope it helped, Christos From dpfrey at shaw.ca Mon Nov 24 00:48:45 2008 From: dpfrey at shaw.ca (David Frey) Date: Mon Nov 24 00:42:36 2008 Subject: [Haskell-beginners] Efficient sieve of erastothenes, for solving project euler problem #10? In-Reply-To: Message-ID: On 11/23/2008, "Malcolm Reynolds" wrote: >Hello all, > >I'm attempting to learn Haskell by going through the project euler >problems. Number 10, >http://projecteuler.net/index.php?section=problems&id=10 , involves >summing prime numbers. It's easy in terms of coding something up that >works, but I'm having a lot of trouble getting decent performance. >I've learned a reasonable amount of ML at uni but Haskell is the first >lazy language I've used.. I think the inefficiency is possibly due to >the laziness but I'm not positive. > >I'd love if someone could show me how to do this in Haskell somewhere >near as fast as C - at the moment I have a C version which runs in >about a tenth of a second ( >http://github.com/malcster/project-euler-solutions--c-/tree/master/10.c >). My haskell attempts are >http://github.com/malcster/project-euler-solutions/tree/master/10better.hs >(using the sieve) and >http://github.com/malcster/project-euler-solutions/tree/master/10.hs >(using possibly an even worse method, but seems to be a bit faster). > >If anyone could point out any neat strictness annotations or anything >else I could put in, that would be cool. > >Cheers, > >Malcolm Hi Malcom, I have a solution to Project Euler problem #10 that runs in 7.3 seconds on my computer when compiled with -O2. I am neither a math expert nor a Haskell expert, so others may be able to offer a better solution. module PE010 where import ProjectEuler(primes2) main = putStrLn output output = show result result = sum $ takeWhile (\x -> x < 2000000) primes2 -- This is the relevant stuff from ProjectEuler.hs primes2 :: [Integer] primes2 = getPrime [] primeCandidates where getPrime :: [Integer] -> [Integer] -> [Integer] getPrime ls (x:xs) = let maxDiv = floor $ sqrt $ fromIntegral x in if isDivisibleByAny (takeWhile (\n -> n <= maxDiv) ls) x then getPrime ls xs else x : getPrime (ls ++ [x]) xs primeCandidates = 2 : (oddsFrom 3) oddsFrom n | odd n = [n, n+2 ..] | otherwise = [n+1, n+3 ..] isDivisibleByAny ls n = or $ map (\d -> n `mod` d == 0) ls I didn't get a chance to look at your version, but obviously, 7.3 seconds is a lot slower than the 0.1 seconds you saw with your C version. From apfelmus at quantentunnel.de Mon Nov 24 05:14:08 2008 From: apfelmus at quantentunnel.de (apfelmus) Date: Mon Nov 24 05:08:07 2008 Subject: [Haskell-beginners] Re: Efficient sieve of erastothenes, for solving project euler problem #10? In-Reply-To: References: Message-ID: Malcolm Reynolds wrote: > I'm attempting to learn Haskell by going through the project euler > problems. Number 10, > http://projecteuler.net/index.php?section=problems&id=10 , involves > summing prime numbers. It's easy in terms of coding something up that > works, but I'm having a lot of trouble getting decent performance. See also http://haskell.org/haskellwiki/Prime_numbers Note that your C version uses a different algorithm than your Haskell version, the former uses an array with random access while the latter uses a linked list. Regards, apfelmus From levi.stephen at gmail.com Mon Nov 24 07:00:35 2008 From: levi.stephen at gmail.com (Levi Stephen) Date: Mon Nov 24 06:54:27 2008 Subject: [Haskell-beginners] GTK + Reactive Message-ID: <8341e4f40811240400v44ebb53fid50080311634f2f2@mail.gmail.com> Hi, I'm trying to set up a simple program combining Reactive and GTK. I have the program below so far, but mainQuit is never called. After looking at a couple of adapters I tried adding the commented out line, but this didn't work for me. I'm sure I've probably missed something, but I'm not sure what. Thanks, Levi main = do initGUI clock <- makeClock (windowDestroy, sink) <- makeEvent clock w <- windowNew w `onDestroy` sink () widgetShowAll w -- forkE (tSync clock) $ quitOnDestroy windowDestroy mainGUI quitOnDestroy :: Event () -> Event (IO ()) quitOnDestroy e = fmap (const mainQuit) e tSync :: Clock TimeT-> ITime -> IO () tSync clock t = sleepPast (cGetTime clock) (exact t) -------------- next part -------------- An HTML attachment was scrubbed... URL: http://www.haskell.org/pipermail/beginners/attachments/20081124/90a1b4ee/attachment.htm From kelanslists at gmail.com Mon Nov 24 09:23:49 2008 From: kelanslists at gmail.com (Kurt Hutchinson) Date: Mon Nov 24 09:17:39 2008 Subject: [Haskell-beginners] Trouble with formatting, Real World Haskell example In-Reply-To: References: <9100c1840811221853g6405da6esaa047c692a34a3cb@mail.gmail.com> Message-ID: On Sun, Nov 23, 2008 at 12:10 AM, Steven Ashley wrote: > The contents of the do block must be indented at-least as much as > mainWith on the previous line. > main = mainWith myFunction > ....where mainWith function = do > ....................args <- getArgs This is the reason that I format 'where' clauses like so: main = mainWith myFunction ....where ....mainWith f = do ........args <- getArgs etc. I think one more line of vertical space is worth all of the horizontal space you end up saving. Kurt From kelanslists at gmail.com Mon Nov 24 09:56:33 2008 From: kelanslists at gmail.com (Kurt Hutchinson) Date: Mon Nov 24 09:50:22 2008 Subject: [Haskell-beginners] Efficient sieve of erastothenes, for solving project euler problem #10? In-Reply-To: References: Message-ID: On Sun, Nov 23, 2008 at 5:28 PM, Malcolm Reynolds wrote: > Hello all, > > I'm attempting to learn Haskell by going through the project euler > problems. Number 10, > http://projecteuler.net/index.php?section=problems&id=10 , involves > summing prime numbers. It's easy in terms of coding something up that > works, but I'm having a lot of trouble getting decent performance. I realize that these early prime number related Euler problems are about writing your own efficient prime generator, so you may want to ignore this message for now. But later on when the problems just happen to involve primes, but the generator is kind of assumed, you may want to check out this collection: http://www.cs.hmc.edu/~oneill/code/haskell-primes.zip The file "ONeillPrimes.hs" contains what is, I think, generally considered to be one of the fastest pure-Haskell prime generators. In particular, this program: > import ONeillPrimes ( primesToLimit ) > > main = ( print . sum . primesToLimit ) 2000000 Gives the correct answer on my machine in about 0.3 seconds. From rkosara at gmail.com Mon Nov 24 09:56:44 2008 From: rkosara at gmail.com (Robert Kosara) Date: Mon Nov 24 09:50:33 2008 Subject: [Haskell-beginners] Trouble with formatting, Real World Haskell example In-Reply-To: References: <9100c1840811221853g6405da6esaa047c692a34a3cb@mail.gmail.com> Message-ID: <9100c1840811240656p5dbbfe3fmd30dcce432fbed8f@mail.gmail.com> Kurt, that's a good idea, that also groups the elements in the where much better. Thanks everybody for your responses (I don't think I've responded to the list so far). Regards, Robert On Mon, Nov 24, 2008 at 9:23 AM, Kurt Hutchinson wrote: > On Sun, Nov 23, 2008 at 12:10 AM, Steven Ashley > wrote: > > The contents of the do block must be indented at-least as much as > > mainWith on the previous line. > > > main = mainWith myFunction > > ....where mainWith function = do > > ....................args <- getArgs > > > This is the reason that I format 'where' clauses like so: > > main = mainWith myFunction > ....where > ....mainWith f = do > ........args <- getArgs > > etc. I think one more line of vertical space is worth all of the > horizontal space you end up saving. > > Kurt > _______________________________________________ > Beginners mailing list > Beginners@haskell.org > http://www.haskell.org/mailman/listinfo/beginners > -------------- next part -------------- An HTML attachment was scrubbed... URL: http://www.haskell.org/pipermail/beginners/attachments/20081124/89b1be3f/attachment.htm From byorgey at seas.upenn.edu Mon Nov 24 12:12:53 2008 From: byorgey at seas.upenn.edu (Brent Yorgey) Date: Mon Nov 24 12:06:43 2008 Subject: [Haskell-beginners] Possible to update Haskell syntax In-Reply-To: References: Message-ID: <20081124171253.GA20578@seas.upenn.edu> In general, the point is that there is already a 'whitespace operator' in Haskell corresponding to function application. So it would be ambiguous for whitespace to also indicate separation of list elements. Also, I rarely need to write explicit lists of any length, so I think you will find that having to write an explicit comma in between elements is not that much of an annoyance. With all that said, you may also find the new 'quasiquoting' functionality in GHC 6.10.1 to be of interest. Quasiquoting allows you to specify arbitrary parsers for specially quoted strings. In particular, you could implement a list quasiquoter so that you could write something like [ls| 1 2 3 4 |] which could parse to the list [1,2,3,4]. I haven't had a chance to play around with the quasiquoting stuff myself yet, however, so I don't have a good idea of how difficult this would be. -Brent On Sun, Nov 23, 2008 at 06:00:17PM +1300, Steven Ashley wrote: > Hi cm, > > An ambiguity arises when you have a list containing functions. For > instance consider: > > fmap ($3) [id id id id] > > Cheers, > > Steven > > > 2008/11/23 cm : > > I'm very interested in learning Haskell, but one frustration is that lists > > always require commas. As an example [1,2,3,4] is a valid expression, but > > [1 2 3 4] is not. > > > > In this ideal world, another example would be that [(fun1 3 4) 7] would be a > > valid expression and be a two-element list equivalent to [fun1 3 4, 7]. > > > > If what I am suggesting is syntactically possible and doesn't break more > > advanced features of the language that I (as a beginner) am unaware of, I'm > > interested in patching the open source for my own use (as well as others who > > might want it). > > _______________________________________________ > > Beginners mailing list > > Beginners@haskell.org > > http://www.haskell.org/mailman/listinfo/beginners > > > _______________________________________________ > Beginners mailing list > Beginners@haskell.org > http://www.haskell.org/mailman/listinfo/beginners From byorgey at seas.upenn.edu Mon Nov 24 12:22:28 2008 From: byorgey at seas.upenn.edu (Brent Yorgey) Date: Mon Nov 24 12:16:16 2008 Subject: [Haskell-beginners] Trouble with formatting, Real World Haskell example In-Reply-To: <9100c1840811221853g6405da6esaa047c692a34a3cb@mail.gmail.com> References: <9100c1840811221853g6405da6esaa047c692a34a3cb@mail.gmail.com> Message-ID: <20081124172228.GB20578@seas.upenn.edu> On Sat, Nov 22, 2008 at 09:53:37PM -0500, Robert Kosara wrote: > > main = mainWith myFunction > where mainWith function = do > args <- getArgs > case args of > [input, output] -> interactWith function input output > _ -> putStrLn "Usage: Interact inputFile outputFile" > > myFunction = id > I think the point is that this 'where' block is supposed to introduce two definitions: one for 'mainWith' and one for 'myFunction'. The 'myFunction = id' should not be part of the do-block (it wouldn't make sense, and isn't even syntactically correct). The layout rule is this: the column of the first thing following the 'do' determines the indentation for the rest of the do-block. The first line which is indented *less* than that is the first line following the end of the do-block. So: do foo bar baz not part of the do-block! or: mainWith function = do start of the do-block (doesn't necessarily need to be indented past 'mainWith') another line in the do-block this is not part of the do-block I would indent the code like so: > main = mainWith myFunction > where mainWith function = do > args <- getArgs > case args of > [input, output] -> interactWith function input output > _ -> putStrLn "Usage: Interact inputFile outputFile" > > myFunction = id Also, you should never use tabs -- it's hard to predict how they will be interpreted by the layout rule, and haskell files using tabs are also non-portable, in the sense that if you send it to someone else they may have different tab settings, etc. It should be possible to tell your favorite editor to automatically convert tabs into spaces. -Brent From v.dijk.bas at gmail.com Mon Nov 24 19:28:15 2008 From: v.dijk.bas at gmail.com (Bas van Dijk) Date: Mon Nov 24 19:22:03 2008 Subject: [Haskell-beginners] GTK + Reactive In-Reply-To: <8341e4f40811240400v44ebb53fid50080311634f2f2@mail.gmail.com> References: <8341e4f40811240400v44ebb53fid50080311634f2f2@mail.gmail.com> Message-ID: CCing this to the Reactive mailinglist. See: http://www.haskell.org/mailman/listinfo/reactive Bas On Mon, Nov 24, 2008 at 1:00 PM, Levi Stephen wrote: > Hi, > > I'm trying to set up a simple program combining Reactive and GTK. I have the > program below so far, but mainQuit is never called. After looking at a > couple of adapters I tried adding the commented out line, but this didn't > work for me. > > I'm sure I've probably missed something, but I'm not sure what. > > Thanks, > Levi > > main = do > initGUI > > clock <- makeClock > > (windowDestroy, sink) <- makeEvent clock > > w <- windowNew > w `onDestroy` sink () > widgetShowAll w > > -- forkE (tSync clock) $ quitOnDestroy windowDestroy > > mainGUI > > quitOnDestroy :: Event () -> Event (IO ()) > quitOnDestroy e = fmap (const mainQuit) e > > tSync :: Clock TimeT-> ITime -> IO () > tSync clock t = sleepPast (cGetTime clock) (exact t) > > > _______________________________________________ > Beginners mailing list > Beginners@haskell.org > http://www.haskell.org/mailman/listinfo/beginners > > From andre.panm at gmail.com Mon Nov 24 02:04:12 2008 From: andre.panm at gmail.com (Andre Paulo Machado) Date: Mon Nov 24 21:26:27 2008 Subject: [Haskell-beginners] Help in Haskell Message-ID: <99bc91850811232304x4bc5fc87hd1757c5703b7f331@mail.gmail.com> Hi folks..... Somebody could help me, please? Please, I would like a help in haskell programming, because I have with following question: I need to create a list of strings, like as a graph. See: initiaList = [ ("BSB,"SSA"), ("CNF","SSA"), ("CNF","GIG"), ("CNF","GRU"), ("GIG","CNF"), ("GIG","GRU"), ("GRU","BSB"), ("GRU","GIG"), ("GRU","CNF"), ("SSA","CNF") ] With this list above, I will create a function that returns a path with max number of links: example: maxLink = 4 (result until 4) command: myFunction "BSB" "GRU" 4 result: 1st Option: BSB -> SSA -> CNF -> GRU 2nd Option: BSB -> SSA -> CNF -> GIG -> GRU ---------------------------------------------------------------------------- command: myFunction "BSB" "GRU" 3 result: 1st Option: BSB -> SSA -> CNF -> GRU ---------------------------------------------------------------------------- How do this? I'm waiting from you, thank you so much. Andre -------------- next part -------------- An HTML attachment was scrubbed... URL: http://www.haskell.org/pipermail/beginners/attachments/20081124/5af12ad8/attachment.htm From allbery at ece.cmu.edu Tue Nov 25 01:27:39 2008 From: allbery at ece.cmu.edu (Brandon S. Allbery KF8NH) Date: Tue Nov 25 01:21:30 2008 Subject: [Haskell-beginners] Possible to update Haskell syntax In-Reply-To: <20081124171253.GA20578@seas.upenn.edu> References: <20081124171253.GA20578@seas.upenn.edu> Message-ID: <874C8497-1E56-44F8-8797-A0F60253134C@ece.cmu.edu> On 2008 Nov 24, at 12:12, Brent Yorgey wrote: > In general, the point is that there is already a 'whitespace operator' > in Haskell corresponding to function application. So it would be > ambiguous for whitespace to also indicate separation of list elements. The other generality I'd add is that Haskell isn't Scheme, and it's best to get used to it. (Although there is Liskell if you're feeling weird.) -- brandon s. allbery [solaris,freebsd,perl,pugs,haskell] allbery@kf8nh.com system administrator [openafs,heimdal,too many hats] allbery@ece.cmu.edu electrical and computer engineering, carnegie mellon university KF8NH From DekuDekuplex at Yahoo.com Tue Nov 25 03:11:29 2008 From: DekuDekuplex at Yahoo.com (Benjamin L.Russell) Date: Tue Nov 25 03:05:27 2008 Subject: [Haskell-beginners] Re: Help in Haskell References: <99bc91850811232304x4bc5fc87hd1757c5703b7f331@mail.gmail.com> Message-ID: <7ibni4ti4uk7fmaki89jd88h49o2oeq6b1@4ax.com> This looks like a homework question. While we are all here to help you figure out a solution, it would be unethical just to give you a solution to a homework problem; rather, we are here to help you figure out the solution yourself. As such, first, please follow the homework help procedure outlined in "Homework help - HaskellWiki" (see http://www.haskell.org/haskellwiki/Homework_help) (substitute "haskell-beginners or haskell-cafe" for "haskell-cafe," and just ignore the part about the existence of "stupid questions"--there is no such thing as a "stupid question"; however, there are such things as appropriate questions and inappropriate questions, and in order for us to help you appropriately in this context, you need to show us more specifically what you have done and where you are stuck, so that we can provide help that would be appropriate in this context). Specifically, please follow the following procedure first: > 1. Read the problem carefully and make sure you understand what is being asked of you. > 2. If you can't solve the whole problem, try breaking the problem down into parts and solving those parts. > 3. If you can't write it in Haskell, try writing it in English (or your native language) first. > 4. If you can't write code, try at least writing a type signature. > 5. Look through the libraries provided by Haskell, particularly those parts which have been pointed out to you in class or in your course notes. There may be something there which helps you. If you are still stuck, then it might be useful to follow the following steps from the procedure listed on the above-mentioned homework help page: > 4. Try to make your question as specific as possible. Say what problem (or subproblem) you are stuck on as succinctly as you can. If the original homework question is long, don't copy it verbatim (though if it's available on the web, a link couldn't hurt). > 5. Say what you've done so far, and include code. People are much more likely to help you fix your incorrect code than write correct code for you. Moreover, if the problem is that you don't understand something, your incorrect code will probably reflect this, and fixing your misunderstanding is much more valuable than fixing your code. In the above-mentioned procedure, the more detail you provide, the more helpful we can be in our hints. -- Benjamin L. Russell On Mon, 24 Nov 2008 05:04:12 -0200, "Andre Paulo Machado" wrote: >Hi folks..... Somebody could help me, please? > >Please, I would like a help in haskell programming, because I have with >following question: > >I need to create a list of strings, like as a graph. >See: > >initiaList = [ ("BSB,"SSA"), > ("CNF","SSA"), > ("CNF","GIG"), > ("CNF","GRU"), > ("GIG","CNF"), > ("GIG","GRU"), > ("GRU","BSB"), > ("GRU","GIG"), > ("GRU","CNF"), > ("SSA","CNF") ] > >With this list above, I will create a function that returns a path with max >number of links: >example: > >maxLink = 4 (result until 4) > >command: myFunction "BSB" "GRU" 4 >result: 1st Option: BSB -> SSA -> CNF -> GRU > 2nd Option: BSB -> SSA -> CNF -> GIG -> GRU >---------------------------------------------------------------------------- >command: myFunction "BSB" "GRU" 3 >result: 1st Option: BSB -> SSA -> CNF -> GRU >---------------------------------------------------------------------------- > >How do this? >I'm waiting from you, >thank you so much. > >Andre From rendel at daimi.au.dk Tue Nov 25 06:10:06 2008 From: rendel at daimi.au.dk (Tillmann Rendel) Date: Tue Nov 25 06:04:03 2008 Subject: [Haskell-beginners] Possible to update Haskell syntax In-Reply-To: References: Message-ID: <492BDD0E.3010308@daimi.au.dk> cm wrote: > In this ideal world, another example would be that [(fun1 3 4) 7] would > be a valid expression and be a two-element list equivalent to [fun1 3 4, > 7]. But [(fun1 1 3 4) 7] already is a valid expression, equivalent to [(fun1 1 3 4 7)] and [fun1 1 3 4 7]. The "whitespace operator" can have only one meaning. Haskell, being a functional language, makes function application as easy as possible. Lisp, being a list processing language, makes construction of lists as easy as possible. Tillmann From colin at colina.demon.co.uk Tue Nov 25 12:52:06 2008 From: colin at colina.demon.co.uk (Colin Paul Adams) Date: Tue Nov 25 12:45:55 2008 Subject: [Haskell-beginners] Ensuring consistency in typeclass instances? Message-ID: Hello, I'm just reading through Real World Haskell - chapter 6 (typeclasses). The definition of Eq is shown, and it mentions that you can define either one or both of the two classes. What would happen if I were two define both == and /= for an instance, in such a way that they were not opposites? If I were doing this in Eiffel, the function definitions would have postconditions to state the relationships, and the first execution would trigger a violation, telling me what was wrong. Is there any similar facility in Haskell? -- Colin Adams Preston Lancashire From byorgey at seas.upenn.edu Tue Nov 25 13:59:13 2008 From: byorgey at seas.upenn.edu (Brent Yorgey) Date: Tue Nov 25 13:52:58 2008 Subject: [Haskell-beginners] Ensuring consistency in typeclass instances? In-Reply-To: References: Message-ID: <20081125185913.GA13923@seas.upenn.edu> On Tue, Nov 25, 2008 at 05:52:06PM +0000, Colin Paul Adams wrote: > Hello, > > I'm just reading through Real World Haskell - chapter 6 (typeclasses). > > The definition of Eq is shown, and it mentions that you can define > either one or both of the two classes. > > What would happen if I were two define both == and /= for an instance, > in such a way that they were not opposites? > > If I were doing this in Eiffel, the function definitions would have > postconditions to state the relationships, and the first execution > would trigger a violation, telling me what was wrong. Is there any > similar facility in Haskell? Nope. You will just get (possibly) inconsistent results. There are many other typeclasses like this as well (Functor, Monoid, Monad...) where the methods are supposed to satisfy certain laws about how they relate to one another, but Haskell has no way to guarantee this. A meta-level point is that Haskell (and strongly-typed languages in general) are all about *static* (compile-time) verification. Having a program which dynamically (at run-time) checks that certain properties hold, a la Eiffel, is generally a rather un-Haskellish way of doing things. As much as possible, I would like to know for sure that if my Haskell program compiles, it will not exhibit any run-time errors. So, to check constraints statically rather than dynamically, they must be put in the type system. But the sorts of constraints you're asking about (type class laws) often need dependent types (which Haskell doesn't have) to be expressed elegantly. -Brent From voigt at tcs.inf.tu-dresden.de Tue Nov 25 07:37:58 2008 From: voigt at tcs.inf.tu-dresden.de (Janis Voigtlaender) Date: Tue Nov 25 21:42:38 2008 Subject: [Haskell-beginners] Not quite another Haskell tutorial, but ... Message-ID: <492BF1A6.1010503@tcs.inf.tu-dresden.de> ... I submitted my Habilitation thesis last week. The first few chapters of it try to give an introduction to Haskell with emphasis on types and reasoning principles. That might be an interesting read for some, so I made it accessible at http://wwwtcs.inf.tu-dresden.de/~voigt/habil.pdf. And yes, the November HCAR will also be coming. Rather soon now that this cause for delay is out of the way. Ciao, Janis. -- Dr. Janis Voigtlaender http://wwwtcs.inf.tu-dresden.de/~voigt/ mailto:voigt@tcs.inf.tu-dresden.de From cm at raytheon.com Tue Nov 25 22:18:10 2008 From: cm at raytheon.com (cm) Date: Tue Nov 25 22:12:06 2008 Subject: [Haskell-beginners] Possible to update Haskell syntax References: <492BDD0E.3010308@daimi.au.dk> Message-ID: <15AE040F656F44A0B35A469A9A46699C@dhcp.ess.us.ray.com> The logic of making "function application as easy as possible" in Haskell is compelling, yet I can't help but wonder if an alternate context dependent syntax would be desribable? Specifically, when inside a pair of brackets make construction of lists as easy as possible as opposed giving priority to functions. There was an earlier reply also about mapping of a "$" construct, but I don't quite understand that issue yet. I appreciate the answers by Haskell experts to my somewhat unusual question. ----- Original Message ----- From: "Tillmann Rendel" To: "cm" Cc: Sent: Tuesday, November 25, 2008 3:10 AM Subject: Re: [Haskell-beginners] Possible to update Haskell syntax > cm wrote: >> In this ideal world, another example would be that [(fun1 3 4) 7] would >> be a valid expression and be a two-element list equivalent to [fun1 3 4, >> 7]. > > But [(fun1 1 3 4) 7] already is a valid expression, equivalent to [(fun1 1 > 3 4 7)] and [fun1 1 3 4 7]. The "whitespace operator" can have only one > meaning. > > Haskell, being a functional language, makes function application as easy > as possible. Lisp, being a list processing language, makes construction of > lists as easy as possible. > > Tillmann > From rendel at daimi.au.dk Tue Nov 25 23:25:07 2008 From: rendel at daimi.au.dk (Tillmann Rendel) Date: Tue Nov 25 23:19:04 2008 Subject: [Haskell-beginners] Possible to update Haskell syntax In-Reply-To: <15AE040F656F44A0B35A469A9A46699C@dhcp.ess.us.ray.com> References: <492BDD0E.3010308@daimi.au.dk> <15AE040F656F44A0B35A469A9A46699C@dhcp.ess.us.ray.com> Message-ID: <492CCFA3.9090000@daimi.au.dk> cm wrote: > The logic of making "function application as easy as possible" in > Haskell is compelling, yet I can't help but wonder if an alternate > context dependent syntax would be desribable? Specifically, when inside > a pair of brackets make construction of lists as easy as possible as > opposed giving priority to functions. I guess that would be possible, but there are some technical problems, e.g. what to do with binary operators. Would [a + b c] mean [(+) a (b c)], [(+) a b, c], [a, (+), b, c], [a, (+), b c] or something else? Currently, it means the first of these choices. However, I don't see why it would be a good idea. The obvious disadvantage is making the syntax more complicated, and more fragile. For example, you no longer could move an expression inside a brackets while refactoring your code. Regarding possible advantages: Do you have a specific use case in mind, which could be written easier or cleaner with this list syntax? Tillmann From cm at raytheon.com Wed Nov 26 00:09:47 2008 From: cm at raytheon.com (cm) Date: Wed Nov 26 00:03:48 2008 Subject: [Haskell-beginners] Possible to update Haskell syntax References: <492BDD0E.3010308@daimi.au.dk> <15AE040F656F44A0B35A469A9A46699C@dhcp.ess.us.ray.com> <492CCFA3.9090000@daimi.au.dk> Message-ID: From: "Tillmann Rendel" [...] > > However, I don't see why it would be a good idea. The obvious disadvantage > is making the syntax more complicated, and more fragile. For example, you > no longer could move an expression inside a brackets while refactoring > your code. > > Regarding possible advantages: Do you have a specific use case in mind, > which could be written easier or cleaner with this list syntax? I would just like as simple an input syntax as possible (minimum of punctuation) for interactive use, for both lists and tuples. For instance, if all entries in a list or tuple are numbers, then I think eliminating the commas would be convenient and look nicer. As a use case, one might have " permute (2 3 4) [7 9 11 0 1 5]", which would be a function which cyclically permutes elements 2 3 4 of a list. Regarding your question of what [a + b c] in "altered consciousness syntax" would resolve to in real world Haskell, it would be [a, (+), b, c]. [(a + b) c] would resolve to [a + b, c]. The rule would be that whitespace inside a bracket becomes a comma delimiter. If there are parentheses inside the bracket, then the expression inside the parentheses reverts to normal syntax. These are probably not workable ideas. I'm just annoyed by extra punctuation which I consider to be visual clutter. From byorgey at seas.upenn.edu Wed Nov 26 10:33:25 2008 From: byorgey at seas.upenn.edu (Brent Yorgey) Date: Wed Nov 26 10:27:08 2008 Subject: [Haskell-beginners] Possible to update Haskell syntax In-Reply-To: References: <492BDD0E.3010308@daimi.au.dk> <15AE040F656F44A0B35A469A9A46699C@dhcp.ess.us.ray.com> <492CCFA3.9090000@daimi.au.dk> Message-ID: <20081126153325.GA29890@seas.upenn.edu> On Tue, Nov 25, 2008 at 09:09:47PM -0800, cm wrote: > From: "Tillmann Rendel" > [...] >> >> However, I don't see why it would be a good idea. The obvious disadvantage >> is making the syntax more complicated, and more fragile. For example, you >> no longer could move an expression inside a brackets while refactoring >> your code. >> >> Regarding possible advantages: Do you have a specific use case in mind, >> which could be written easier or cleaner with this list syntax? > > I would just like as simple an input syntax as possible (minimum of > punctuation) for interactive use, for both lists and tuples. For instance, > if all entries in a list or tuple are numbers, then I think eliminating the > commas would be convenient and look nicer. I can probably count on one hand the number of times I've had to literally type in an explicit list of more than three or four elements -- mostly because Haskell has so many easy ways to algorithmically construct lists (list comprehensions, Prelude functions like filter, map, unfoldr, replicate, repeat, etc.). But I can see how this would be annoying when doing certain things. Why not use a lightweight custom list-parser function? Something like this: l = map read . words Then you could type permute (2,3,4) (l "7 9 11 0 1 5") which is still a little extra clutter, but surely much nicer than typing all the commas. -Brent From michael at snoyman.com Wed Nov 26 10:39:22 2008 From: michael at snoyman.com (Michael Snoyman) Date: Wed Nov 26 10:33:05 2008 Subject: [Haskell-beginners] Possible to update Haskell syntax In-Reply-To: References: <492BDD0E.3010308@daimi.au.dk> <15AE040F656F44A0B35A469A9A46699C@dhcp.ess.us.ray.com> <492CCFA3.9090000@daimi.au.dk> Message-ID: <29bf512f0811260739v7c1ec09bl7aa2e7dfb9ccd06d@mail.gmail.com> On Tue, Nov 25, 2008 at 9:09 PM, cm wrote: > I would just like as simple an input syntax as possible (minimum of > punctuation) for interactive use, for both lists and tuples. For instance, > if all entries in a list or tuple are numbers, then I think eliminating the > commas would be convenient and look nicer. > > As a use case, one might have > " permute (2 3 4) [7 9 11 0 1 5]", which would be a function which > cyclically permutes elements 2 3 4 of a list. > You might be interested in this article I saw on variadic functions in Haskell: http://okmij.org/ftp/Haskell/vararg-fn.lhs. The first example shows how you could create a build function to create a list. Michael -------------- next part -------------- An HTML attachment was scrubbed... URL: http://www.haskell.org/pipermail/beginners/attachments/20081126/ed64a00b/attachment.htm From colin at colina.demon.co.uk Wed Nov 26 12:04:52 2008 From: colin at colina.demon.co.uk (Colin Paul Adams) Date: Wed Nov 26 11:58:36 2008 Subject: [Haskell-beginners] Ensuring consistency in typeclass instances? In-Reply-To: <20081125185913.GA13923@seas.upenn.edu> (Brent Yorgey's message of "Tue\, 25 Nov 2008 13\:59\:13 -0500") References: <20081125185913.GA13923@seas.upenn.edu> Message-ID: >>>>> "Brent" == Brent Yorgey writes: Brent> On Tue, Nov 25, 2008 at 05:52:06PM +0000, Colin Paul Adams wrote: >> Hello, >> >> I'm just reading through Real World Haskell - chapter 6 >> (typeclasses). >> >> The definition of Eq is shown, and it mentions that you can >> define either one or both of the two classes. >> >> What would happen if I were two define both == and /= for an >> instance, in such a way that they were not opposites? >> >> If I were doing this in Eiffel, the function definitions would >> have postconditions to state the relationships, and the first >> execution would trigger a violation, telling me what was >> wrong. Is there any similar facility in Haskell? Brent> Nope. You will just get (possibly) inconsistent results. Brent> There are many other typeclasses like this as well Brent> (Functor, Monoid, Monad...) where the methods are supposed Brent> to satisfy certain laws about how they relate to one Brent> another, but Haskell has no way to guarantee this. Brent> A meta-level point is that Haskell (and strongly-typed Brent> languages in general) are all about *static* (compile-time) Brent> verification. Having a program which dynamically (at Brent> run-time) checks that certain properties hold, a la Eiffel, Brent> is generally a rather un-Haskellish way of doing things. I don't see why. Eiffel is strongly typed too. But current compiler technology doesn't necessarily permit us to check all we would like statically (as you say below). It seems to me, having read further, that QuickCheck does just this (and is an answer to my own original question). But so far I'm only reading. I guess when I try it out I might find out different. Brent> So, to check constraints statically rather than Brent> dynamically, they must be put in the type system. But the Brent> sorts of constraints you're asking about (type class laws) Brent> often need dependent types (which Haskell doesn't have) to Brent> be expressed elegantly. -- Colin Adams Preston Lancashire From hthiel.char at zonnet.nl Wed Nov 26 12:30:26 2008 From: hthiel.char at zonnet.nl (Hans van Thiel) Date: Wed Nov 26 12:23:36 2008 Subject: [Haskell-beginners] Not quite another Haskell tutorial, but ... In-Reply-To: <492BF1A6.1010503@tcs.inf.tu-dresden.de> References: <492BF1A6.1010503@tcs.inf.tu-dresden.de> Message-ID: <1227720626.3315.16.camel@dhcppc0> On Tue, 2008-11-25 at 13:37 +0100, Janis Voigtlaender wrote: > ... I submitted my Habilitation thesis last week. The first few chapters > of it try to give an introduction to Haskell with emphasis on types and > reasoning principles. That might be an interesting read for some, so I > made it accessible at http://wwwtcs.inf.tu-dresden.de/~voigt/habil.pdf. I've downloaded it. Thanks! Hans van Thiel From byorgey at seas.upenn.edu Wed Nov 26 15:04:00 2008 From: byorgey at seas.upenn.edu (Brent Yorgey) Date: Wed Nov 26 14:57:42 2008 Subject: [Haskell-beginners] Ensuring consistency in typeclass instances? In-Reply-To: References: <20081125185913.GA13923@seas.upenn.edu> Message-ID: <20081126200400.GA740@seas.upenn.edu> On Wed, Nov 26, 2008 at 05:04:52PM +0000, Colin Paul Adams wrote: > >>>>> "Brent" == Brent Yorgey writes: > > I don't see why. Eiffel is strongly typed too. But current compiler > technology doesn't necessarily permit us to check all we would like > statically (as you say below). > > It seems to me, having read further, that QuickCheck does just this > (and is an answer to my own original question). True, I should have mentioned QuickCheck in my previous email. It's not *quite* the same thing -- in particular, it tests properties you specify on randomly generated values, rather than testing the actual values which occur at runtime. But in many cases that's just as good, and has the additional benefit that it separates the property testing from execution -- so you can have confidence in certain semantic properties without the possibility of run-time exceptions. -Brent From cm at raytheon.com Wed Nov 26 15:27:47 2008 From: cm at raytheon.com (cm) Date: Wed Nov 26 15:21:41 2008 Subject: [Haskell-beginners] Possible to update Haskell syntax References: <492BDD0E.3010308@daimi.au.dk> <15AE040F656F44A0B35A469A9A46699C@dhcp.ess.us.ray.com> <492CCFA3.9090000@daimi.au.dk> <29bf512f0811260739v7c1ec09bl7aa2e7dfb9ccd06d@mail.gmail.com> Message-ID: Thanks to Tillman Rendel for describing some of the philosphy behind Haskell syntax and for Brent Yorgey and Michael Snoyman for suggesting how the Haskell language itself could be used to produce a cleaner input syntax. The multi-variable input functions are definitely of interest (but I have to understand how they work). On another line of thought, I've always liked the syntax of the old PostScript language. It then ocurred to me to search on the words "haskell postfix notation", and, naturally, someone in the Haskell world has considered this. -------------- next part -------------- An HTML attachment was scrubbed... URL: http://www.haskell.org/pipermail/beginners/attachments/20081126/176e4937/attachment.htm From al at beshenov.ru Wed Nov 26 15:32:58 2008 From: al at beshenov.ru (Alexey Beshenov) Date: Wed Nov 26 15:26:43 2008 Subject: [Haskell-beginners] FFI, Foreign.Marshal.Array, etc. Message-ID: <200811262332.59200.al@beshenov.ru> Hi! I'm playing with the FFI. Could anyone help me with a practical example? I have a function int solve_sys (double **a, int n, double b[]); where a is an array of size n*n and b is an array of size n (it contains the needed result if solve_sys returns 0). How could I wrap it in something like solveSys :: [[Double]] -> [Double] -> [Double] ? -- Setting Orange, Aftermath 38 YOLD 3174 Alexey Beshenov http://beshenov.ru/ From al at beshenov.ru Wed Nov 26 17:16:17 2008 From: al at beshenov.ru (Alexey Beshenov) Date: Wed Nov 26 17:10:00 2008 Subject: [Haskell-beginners] FFI, Foreign.Marshal.Array, etc. In-Reply-To: <200811262332.59200.al@beshenov.ru> References: <200811262332.59200.al@beshenov.ru> Message-ID: <200811270116.18409.al@beshenov.ru> On Wednesday 26 November 2008 23:32:58 Alexey Beshenov wrote: > Hi! > > I'm playing with the FFI. > Could anyone help me with a practical example? > > I have a function > > int solve_sys (double **a, int n, double b[]); > > where a is an array of size n*n and b is an array of size n > (it contains the needed result if solve_sys returns 0). > > How could I wrap it in something like > > solveSys :: [[Double]] -> [Double] -> [Double] > > ? Something like this: foreign import ccall "linear.h solve_sys" lSolve :: Ptr (Double) -> Int -> Ptr (Double) -> IO (Int) solveSys :: [[Double]] -> [Double] -> IO() solveSys a b = do aptr <- newArray (concat a) bptr <- newArray b sol <- lSolve aptr n bptr x <- peekArray n bptr free aptr free bptr print x where n = length a Does the trick, but I wonder is there a way to get a function returning [Double]... -- Setting Orange, Aftermath 38 YOLD 3174 Alexey Beshenov http://beshenov.ru/ From ajb at spamcop.net Wed Nov 26 18:18:45 2008 From: ajb at spamcop.net (ajb@spamcop.net) Date: Wed Nov 26 18:06:14 2008 Subject: [Haskell-beginners] Homework help (was Re: Help in Haskell) In-Reply-To: <7ibni4ti4uk7fmaki89jd88h49o2oeq6b1@4ax.com> References: <99bc91850811232304x4bc5fc87hd1757c5703b7f331@mail.gmail.com> <7ibni4ti4uk7fmaki89jd88h49o2oeq6b1@4ax.com> Message-ID: <20081126181845.3xqbqnu3kgso0c8s-nwo@webmail.spamcop.net> G'day Benjamin. Quoting "Benjamin L.Russell" : > As such, first, please follow the homework help procedure outlined in > "Homework help - HaskellWiki" (see > http://www.haskell.org/haskellwiki/Homework_help) (substitute > "haskell-beginners or haskell-cafe" for "haskell-cafe," and just > ignore the part about the existence of "stupid questions"--there is no > such thing as a "stupid question"; however, there are such things as > appropriate questions and inappropriate questions, and in order for us > to help you appropriately in this context, you need to show us more > specifically what you have done and where you are stuck, so that we > can provide help that would be appropriate in this context). It's a wiki. If the wording is bad, fix it! Cheers, Andrew Bromage From al at beshenov.ru Wed Nov 26 18:40:56 2008 From: al at beshenov.ru (Alexey Beshenov) Date: Wed Nov 26 18:34:39 2008 Subject: [Haskell-beginners] FFI, Foreign.Marshal.Array, etc. In-Reply-To: <200811270116.18409.al@beshenov.ru> References: <200811262332.59200.al@beshenov.ru> <200811270116.18409.al@beshenov.ru> Message-ID: <200811270240.56977.al@beshenov.ru> On Thursday 27 November 2008 01:16:17 Alexey Beshenov wrote: > Something like this: > > foreign import ccall "linear.h solve_sys" lSolve :: Ptr (Double) -> > Int -> Ptr (Double) -> IO (Int) > > solveSys :: [[Double]] -> [Double] -> IO() > solveSys a b = do > aptr <- newArray (concat a) > bptr <- newArray b > sol <- lSolve aptr n bptr > x <- peekArray n bptr > free aptr > free bptr > print x > where n = length a > > Does the trick, but I wonder is there a way to get a function > returning [Double]... Eh, I have to do unsafePerformIO. Sorry about that, I'm quite new to Haskell :-I -- Setting Orange, Aftermath 38 YOLD 3174 Alexey Beshenov http://beshenov.ru/ From allbery at ece.cmu.edu Thu Nov 27 01:03:21 2008 From: allbery at ece.cmu.edu (Brandon S. Allbery KF8NH) Date: Thu Nov 27 00:57:07 2008 Subject: [Haskell-beginners] Possible to update Haskell syntax In-Reply-To: References: <492BDD0E.3010308@daimi.au.dk> <15AE040F656F44A0B35A469A9A46699C@dhcp.ess.us.ray.com> <492CCFA3.9090000@daimi.au.dk> <29bf512f0811260739v7c1ec09bl7aa2e7dfb9ccd06d@mail.gmail.com> Message-ID: <59BFD975-4C0C-40D6-BFA8-B570DF7F4202@ece.cmu.edu> On 2008 Nov 26, at 15:27, cm wrote: > On another line of thought, I've always liked the syntax of the old > PostScript language. It then ocurred to me to search on the words > "haskell postfix notation", and, naturally, someone in the Haskell > world has considered this. Have you ever looked at Forth? -- brandon s. allbery [solaris,freebsd,perl,pugs,haskell] allbery@kf8nh.com system administrator [openafs,heimdal,too many hats] allbery@ece.cmu.edu electrical and computer engineering, carnegie mellon university KF8NH -------------- next part -------------- An HTML attachment was scrubbed... URL: http://www.haskell.org/pipermail/beginners/attachments/20081127/42981e15/attachment.htm From DekuDekuplex at Yahoo.com Thu Nov 27 02:44:34 2008 From: DekuDekuplex at Yahoo.com (Benjamin L.Russell) Date: Thu Nov 27 02:38:31 2008 Subject: [Haskell-beginners] Re: Homework help (was Re: Help in Haskell) References: <99bc91850811232304x4bc5fc87hd1757c5703b7f331@mail.gmail.com> <7ibni4ti4uk7fmaki89jd88h49o2oeq6b1@4ax.com> <20081126181845.3xqbqnu3kgso0c8s-nwo@webmail.spamcop.net> Message-ID: On Wed, 26 Nov 2008 18:18:45 -0500, ajb@spamcop.net wrote: >G'day Benjamin. > >Quoting "Benjamin L.Russell" : > >> As such, first, please follow the homework help procedure outlined in >> "Homework help - HaskellWiki" (see >> http://www.haskell.org/haskellwiki/Homework_help) (substitute >> "haskell-beginners or haskell-cafe" for "haskell-cafe," and just >> ignore the part about the existence of "stupid questions"--there is no >> such thing as a "stupid question"; however, there are such things as >> appropriate questions and inappropriate questions, and in order for us >> to help you appropriately in this context, you need to show us more >> specifically what you have done and where you are stuck, so that we >> can provide help that would be appropriate in this context). > >It's a wiki. If the wording is bad, fix it! Actually, initially I had to fight the urge not to rewrite it in a less elitist manner, in order to avoid the possibility of offending the original author. In fact, I had been thinking about changing that page since about December of 2007, when I think I first saw it, but had hesitated out of a concern that doing so would have gone against the intent of the original author of that page. On a related issue, I had previously encountered a number of participants on Haskell-Cafe who had reacted negatively against what they apparently thought were "stupid questions": One of them even asked (in private e-mail) that a participant not "pollute" Haskell-Cafe by asking about whether screen resolution was important in determining the precision of an algorithm to compute prime numbers by picking points randomly from a square. I refrained from changing the page because of the possibility that the original author may have been an elitist, who could have changed it back immediately. Part of my original purpose in suggesting the creation of Haskell-Beginners was to create a more non-elitist, beginner-friendly atmosphere. More specifically, since HaskellWiki is also visible to participants on Haskell-Cafe, and not just to those on Haskell-Beginners, if I changed the original intent of the sentence by rephrasing the following sentence (see http://www.haskell.org/haskellwiki/Homework_help): >Your lecturer/instructor may have told you that there is no such thing as a stupid question. Inside your classroom, that is correct. Outside your classroom, there are smart questions and stupid questions. If you ask a smart question of the Haskell community, you will probably get a helpful answer. If you ask a stupid question, you will probably get an unhelpful answer or, more likely, no answer at all. to the following sentence: >Your lecturer/instructor may have told you that there is no such thing as a stupid question. Indeed, that is correct. However, independent of the context, there are appropriate questions and inappropriate questions. If you first attempt to solve a problem with a decent amount of effort, then get stuck, and then ask for a hint from the Haskell community, your question will most likely be viewed as appropriate, and you will probably get a helpful answer. If you do not attempt to solve the problem, but try to get somebody else to solve the entire problem for you, your question will most likely be viewed as inappropriate, and you will probably get an unhelpful answer or, more likely, no answer at all. I could have risked going against the cultural attitude of the original author, who had deliberately used the pejorative term "stupid question." The term "stupid" has certain condescending connotations that are not suggested by the relatively neutral term "inappropriate." Perhaps those connotations had actually been deliberate, and not coincidental, in which case changing the connotations could have started a revision war, which I didn't want. I disagree with the cultural attitude suggested by the term "stupid question." To me, there is no such thing as a "stupid question." If somebody asks an inappropriate question, it should be sufficient just not to answer the question, or to suggest an alternative question, rather than to respond in a hostile or condescending manner. Nevertheless, this is just my personal opinion. Everybody is entitled to an opinion. I didn't change the original wording, even though I had to fight a desperate urge to do so, because I had thought that the original author had just as much right to his/her wording as I did to mine, and I wasn't sure if possibly changing the original intent, as opposed to just the original wording, was appropriate. However, if I had been the original author, I would have definitely worded the sentence in a less elitist manner. -- Benjamin L. Russell From DekuDekuplex at Yahoo.com Thu Nov 27 04:32:01 2008 From: DekuDekuplex at Yahoo.com (Benjamin L.Russell) Date: Thu Nov 27 04:26:01 2008 Subject: [Haskell-beginners] Re: Homework help (was Re: Help in Haskell) References: <99bc91850811232304x4bc5fc87hd1757c5703b7f331@mail.gmail.com> <7ibni4ti4uk7fmaki89jd88h49o2oeq6b1@4ax.com> <20081126181845.3xqbqnu3kgso0c8s-nwo@webmail.spamcop.net> Message-ID: Nevertheless, there is such a thing as a consensus, and given the role of this mailing list, it does seem that rewriting the "Homework help - HaskellWiki" page in a more egalitarian manner may be worth a try. After all, any changes can be immediately reversed, and I can't see any harm in rewriting the page in a more beginner-friendly manner. Therefore, I have taken the liberty of revising the above-mentioned HaskellWiki page in a less elitist manner, which had long been my eventual intent. We'll see what happens. With luck, the new egalitarian tone will stay. -- Benjamin L. Russell On Thu, 27 Nov 2008 16:44:34 +0900, Benjamin L.Russell wrote: >On Wed, 26 Nov 2008 18:18:45 -0500, ajb@spamcop.net wrote: > >>G'day Benjamin. >> >>Quoting "Benjamin L.Russell" : >> >>> As such, first, please follow the homework help procedure outlined in >>> "Homework help - HaskellWiki" (see >>> http://www.haskell.org/haskellwiki/Homework_help) (substitute >>> "haskell-beginners or haskell-cafe" for "haskell-cafe," and just >>> ignore the part about the existence of "stupid questions"--there is no >>> such thing as a "stupid question"; however, there are such things as >>> appropriate questions and inappropriate questions, and in order for us >>> to help you appropriately in this context, you need to show us more >>> specifically what you have done and where you are stuck, so that we >>> can provide help that would be appropriate in this context). >> >>It's a wiki. If the wording is bad, fix it! > >Actually, initially I had to fight the urge not to rewrite it in a >less elitist manner, in order to avoid the possibility of offending >the original author. > >In fact, I had been thinking about changing that page since about >December of 2007, when I think I first saw it, but had hesitated out >of a concern that doing so would have gone against the intent of the >original author of that page. On a related issue, I had previously >encountered a number of participants on Haskell-Cafe who had reacted >negatively against what they apparently thought were "stupid >questions": One of them even asked (in private e-mail) that a >participant not "pollute" Haskell-Cafe by asking about whether screen >resolution was important in determining the precision of an algorithm >to compute prime numbers by picking points randomly from a square. > >I refrained from changing the page because of the possibility that the >original author may have been an elitist, who could have changed it >back immediately. > >Part of my original purpose in suggesting the creation of >Haskell-Beginners was to create a more non-elitist, beginner-friendly >atmosphere. > >More specifically, since HaskellWiki is also visible to participants >on Haskell-Cafe, and not just to those on Haskell-Beginners, if I >changed the original intent of the sentence by rephrasing the >following sentence (see >http://www.haskell.org/haskellwiki/Homework_help): > >>Your lecturer/instructor may have told you that there is no such thing as a stupid question. Inside your classroom, that is correct. Outside your classroom, there are smart questions and stupid questions. If you ask a smart question of the Haskell community, you will probably get a helpful answer. If you ask a stupid question, you will probably get an unhelpful answer or, more likely, no answer at all. > >to the following sentence: > >>Your lecturer/instructor may have told you that there is no such thing as a stupid question. Indeed, that is correct. However, independent of the context, there are appropriate questions and inappropriate questions. If you first attempt to solve a problem with a decent amount of effort, then get stuck, and then ask for a hint from the Haskell community, your question will most likely be viewed as appropriate, and you will probably get a helpful answer. If you do not attempt to solve the problem, but try to get somebody else to solve the entire problem for you, your question will most likely be viewed as inappropriate, and you will probably get an unhelpful answer or, more likely, no answer at all. > >I could have risked going against the cultural attitude of the >original author, who had deliberately used the pejorative term "stupid >question." The term "stupid" has certain condescending connotations >that are not suggested by the relatively neutral term "inappropriate." >Perhaps those connotations had actually been deliberate, and not >coincidental, in which case changing the connotations could have >started a revision war, which I didn't want. > >I disagree with the cultural attitude suggested by the term "stupid >question." To me, there is no such thing as a "stupid question." If >somebody asks an inappropriate question, it should be sufficient just >not to answer the question, or to suggest an alternative question, >rather than to respond in a hostile or condescending manner. > >Nevertheless, this is just my personal opinion. Everybody is entitled >to an opinion. I didn't change the original wording, even though I >had to fight a desperate urge to do so, because I had thought that the >original author had just as much right to his/her wording as I did to >mine, and I wasn't sure if possibly changing the original intent, as >opposed to just the original wording, was appropriate. However, if I >had been the original author, I would have definitely worded the >sentence in a less elitist manner. > >-- Benjamin L. Russell From rendel at daimi.au.dk Thu Nov 27 08:22:13 2008 From: rendel at daimi.au.dk (Tillmann Rendel) Date: Thu Nov 27 08:16:05 2008 Subject: [Haskell-beginners] Re: Homework help (was Re: Help in Haskell) In-Reply-To: References: <99bc91850811232304x4bc5fc87hd1757c5703b7f331@mail.gmail.com> <7ibni4ti4uk7fmaki89jd88h49o2oeq6b1@4ax.com> <20081126181845.3xqbqnu3kgso0c8s-nwo@webmail.spamcop.net> Message-ID: <492E9F05.8060509@daimi.au.dk> Benjamin L.Russell wrote: > I refrained from changing the page because of the possibility that the > original author may have been an elitist, who could have changed it > back immediately. > > [...] > > I could have risked going against the cultural attitude of the > original author, who had deliberately used the pejorative term "stupid > question." The term "stupid" has certain condescending connotations > that are not suggested by the relatively neutral term "inappropriate." > Perhaps those connotations had actually been deliberate, and not > coincidental, in which case changing the connotations could have > started a revision war, which I didn't want. > > [...] > > I wasn't sure if possibly changing the original intent, as opposed to > just the original wording, was appropriate. As I understand them, the point of a wiki in general and the Haskell wiki in particular is to involve readers with developing not only the wording, but also the content and underyling ideas of the texts. I would therefore consider changing the original intent as not generally inappropriate. Moreover, you do not start an edit war by editing, you start or continue an edit war by reverting again and again. If the original author decides to revert your change, you can still avoid an edit war by not reverting the revert. Tillmann From abdullah.ak2002 at gmail.com Thu Nov 27 13:10:57 2008 From: abdullah.ak2002 at gmail.com (abdullah abdul Khadir) Date: Thu Nov 27 13:04:39 2008 Subject: [Haskell-beginners] Re: [Haskell] Re: Help : A problem with IO In-Reply-To: References: <719881900811260812p207fcbb2y9ad6d1f33a13ed10@mail.gmail.com> <719881900811260818n5899ab93v51b509cd38dba166@mail.gmail.com> Message-ID: <719881900811271010r313d3becqefa9fa4b772b5666@mail.gmail.com> Thanks all, I got it working finally. What did i learn ? a) I need to put a do after else for more than one instruction (?) b) All similar type of questions are to be redirected to haskell-beginner and haskell-cafe Points noted. Thank you once again, Abdullah Abdul Khadir On Wed, Nov 26, 2008 at 10:56 PM, wman <666wman@gmail.com> wrote: > if it should really read whole line, it must try to somehow chain the > values into the string / list of chars (using (:) ) > > getMyLine :: IO [Char] > getMyLine = do > c <- getChar > if (c == '\n') > then return "" -- imho [] looks nicer ;-) > else do > rest <- getMyLine > return $ c : rest > > -- or > > getMyLine :: IO [Char] > getMyLine = do > c <- getChar > if (c == '\n') > then return "" -- imho [] looks nicer ;-) > else getMyLine >>= return . (c:) > > -- or even shorter and still equivalent ;-) > > getMyLine :: IO [Char] > getMyLine = getChar >>= (\c -> if (c == '\n') then return [] else fmap > (c:) getMyLine) > > > > 2008/11/26 abdullah abdul Khadir > >> Hi, >> >> The function getMyLine written by me is intended for getting a >> complete string from the standard input. >> >> import IO >> >> getMyLine :: IO [Char] >> getMyLine = do >> c <- getChar >> if(c == '\n') >> then return "" >> else cs <- getMyLine >> return [c] >> >> However I keep getting the following error: >> >> io.hs:14:2: Parse error in pattern >> Failed, modules loaded: none. >> >> I fail to understand what the error is. I tried out various things >> such as changing the alignment and so on to no avail. The following program, >> however, compiled successfully though it has the same structure as the >> previous program. >> >> checkd :: IO Bool >> checkd = do >> c <- getChar >> if(c=='d') >> then return True >> else return False >> >> Prelude> :load ./io.hs >> [1 of 1] Compiling Main ( io.hs, interpreted ) >> Ok, modules loaded: Main. >> *Main> checkd >> d >> True >> >> >> _______________________________________________ >> Haskell mailing list >> Haskell@haskell.org >> http://www.haskell.org/mailman/listinfo/haskell >> >> > -------------- next part -------------- An HTML attachment was scrubbed... URL: http://www.haskell.org/pipermail/beginners/attachments/20081127/d7715dac/attachment.htm From voigt at tcs.inf.tu-dresden.de Fri Nov 28 02:00:17 2008 From: voigt at tcs.inf.tu-dresden.de (Janis Voigtlaender) Date: Fri Nov 28 04:45:00 2008 Subject: [Haskell-beginners] ANNOUNCE: Haskell Communities and Activities Report (15th ed., November 2008) Message-ID: <492F9701.9010707@tcs.inf.tu-dresden.de> On behalf of the many, many contributors, I am pleased to announce that the Haskell Communities and Activities Report (15th edition, November 2008) http://www.haskell.org/communities/ is now available from the Haskell Communities home page in PDF and HTML formats. Many thanks go to all the people that contributed to this report, both directly, by sending in descriptions, and indirectly, by doing all the interesting things that are reported. I hope you will find it as interesting a read as I did. If you have not encountered the Haskell Communities and Activities Reports before, you may like to know that the first of these reports was published in November 2001. Their goal is to improve the communication between the increasingly diverse groups, projects, and individuals working on, with, or inspired by Haskell. The idea behind these reports is simple: Every six months, a call goes out to all of you enjoying Haskell to contribute brief summaries of your own area of work. Many of you respond (eagerly, unprompted, and sometimes in time for the actual deadline ;-) to the call. The editor collects all the contributions into a single report and feeds that back to the community. When I try for the next update, six months from now, you might want to report on your own work, project, research area or group as well. So, please put the following into your diaries now: ---------------------------------------- End of April 2009: target deadline for contributions to the May 2009 edition of the HC&A Report ---------------------------------------- Unfortunately, many Haskellers working on interesting projects are so busy with their work that they seem to have lost the time to follow the Haskell related mailing lists and newsgroups, and have trouble even finding time to report on their work. If you are a member, user or friend of a project so burdened, please find someone willing to make time to report and ask them to "register" with the editor for a simple e-mail reminder in April (you could point me to them as well, and I can then politely ask if they want to contribute, but it might work better if you do the initial asking). Of course, they will still have to find the ten to fifteen minutes to draw up their report, but maybe we can increase our coverage of all that is going on in the community. Feel free to circulate this announcement further in order to reach people who might otherwise not see it. Enjoy! Janis Voigtlaender -- Dr. Janis Voigtlaender http://wwwtcs.inf.tu-dresden.de/~voigt/ mailto:voigt@tcs.inf.tu-dresden.de From t-otto-news at gmx.de Fri Nov 28 16:53:32 2008 From: t-otto-news at gmx.de (Torsten Otto) Date: Fri Nov 28 16:47:10 2008 Subject: [Haskell-beginners] Wrapping random Message-ID: Hi all, I teach a high school class in Computer Science. The current programming goal is to implement chat-bots, and we're using Haskell of course. Now one of my students had the seemingly easy idea of having the bot answer with a random sentence if it doesn't have "good" answer. Random in Haskell has its problems. I understand why you can't just call a function as you would in Java. I'm not firm enough with monads myself (and certainly don't want to go there in the class beyond I/O) so I'm calling for help here: Is there a way to wrap the generation of random numbers so that for the students it works like a function? We have this working: > import System.Random > main = > do randomNumber <- randomRIO (1::Int,2) > print (randomAnswer randomNumber) > randomAnswer r > | (r == 1) = "Nope!" > | (r == 2) = "Absolutely!" > | otherwise = "Error!" Now, how can we use it for something like this: >findAnswer [] = "h" >findAnswer (x:xs) > | (z == "unknown") = findAnswer xs > | otherwise = z > where z = findWord x lexikon where instead of getting "h" we'd like to call a function that would give us one of the strings out of randomAnswer. (findAnswer looks through a list [(keyword,response)]. I've looked at realworldhaskell and the wikibook among other sources, but I can't manage to piece anything useful together. How do I manage to get something of type IO to represent itself as a String? Any help would be greatly appreciated. Regards, Torsten Otto From steven.e.ashley at gmail.com Fri Nov 28 18:27:36 2008 From: steven.e.ashley at gmail.com (Steven Ashley) Date: Fri Nov 28 18:21:22 2008 Subject: [Haskell-beginners] Wrapping random In-Reply-To: References: Message-ID: Hi Torsten, An option would be to use "randoms" to generate an infinite list of random numbers before hand and pass these numbers to your functions. Of course that will mean you have to keep track of what numbers you have used. Control.Monad.Random would take care of this stuff for you however it requires a simple understanding of monads. Best of luck, Steven 2008/11/29 Torsten Otto : > Hi all, > > I teach a high school class in Computer Science. The current programming > goal is to implement chat-bots, and we're using Haskell of course. Now one > of my students had the seemingly easy idea of having the bot answer with a > random sentence if it doesn't have "good" answer. > > Random in Haskell has its problems. I understand why you can't just call a > function as you would in Java. I'm not firm enough with monads myself (and > certainly don't want to go there in the class beyond I/O) so I'm calling for > help here: Is there a way to wrap the generation of random numbers so that > for the students it works like a function? > > We have this working: > >> import System.Random > >> main = >> do randomNumber <- randomRIO (1::Int,2) >> print (randomAnswer randomNumber) > >> randomAnswer r >> | (r == 1) = "Nope!" >> | (r == 2) = "Absolutely!" >> | otherwise = "Error!" > > Now, how can we use it for something like this: > >>findAnswer [] = "h" >>findAnswer (x:xs) >> | (z == "unknown") = findAnswer xs >> | otherwise = z >> where z = findWord x lexikon > > where instead of getting "h" we'd like to call a function that would give us > one of the strings out of randomAnswer. > (findAnswer looks through a list [(keyword,response)]. > > I've looked at realworldhaskell and the wikibook among other sources, but I > can't manage to piece anything useful together. How do I manage to get > something of type IO to represent itself as a String? > > Any help would be greatly appreciated. > > Regards, > Torsten Otto > _______________________________________________ > Beginners mailing list > Beginners@haskell.org > http://www.haskell.org/mailman/listinfo/beginners > From michael at snoyman.com Fri Nov 28 18:44:59 2008 From: michael at snoyman.com (Michael Snoyman) Date: Fri Nov 28 18:38:35 2008 Subject: [Haskell-beginners] Wrapping random In-Reply-To: References: Message-ID: <29bf512f0811281544n912c84ck3e6aea7a897684c6@mail.gmail.com> On Fri, Nov 28, 2008 at 1:53 PM, Torsten Otto wrote: > Hi all, > > I teach a high school class in Computer Science. The current programming > goal is to implement chat-bots, and we're using Haskell of course. Now one > of my students had the seemingly easy idea of having the bot answer with a > random sentence if it doesn't have "good" answer. > > Random in Haskell has its problems. I understand why you can't just call a > function as you would in Java. I'm not firm enough with monads myself (and > certainly don't want to go there in the class beyond I/O) so I'm calling for > help here: Is there a way to wrap the generation of random numbers so that > for the students it works like a function? > > We have this working: > > > import System.Random > > > main = > > do randomNumber <- randomRIO (1::Int,2) > > print (randomAnswer randomNumber) > > > randomAnswer r > > | (r == 1) = "Nope!" > > | (r == 2) = "Absolutely!" > > | otherwise = "Error!" > > Now, how can we use it for something like this: > > >findAnswer [] = "h" > >findAnswer (x:xs) > > | (z == "unknown") = findAnswer xs > > | otherwise = z > > where z = findWord x lexikon > > where instead of getting "h" we'd like to call a function that would give > us one of the strings out of randomAnswer. > (findAnswer looks through a list [(keyword,response)]. > > I've looked at realworldhaskell and the wikibook among other sources, but I > can't manage to piece anything useful together. How do I manage to get > something of type IO to represent itself as a String? > > Any help would be greatly appreciated. > I believe you are looking for unsafePerformIO ( http://haskell.org/ghc/docs/latest/html/libraries/base/System-IO-Unsafe.html#v%3AunsafePerformIO). I'm not sure if it will work properly for random number generation, however,due to optimization issues. Michael -------------- next part -------------- An HTML attachment was scrubbed... URL: http://www.haskell.org/pipermail/beginners/attachments/20081128/5fc09b0c/attachment.htm From isaacdupree at charter.net Fri Nov 28 18:59:20 2008 From: isaacdupree at charter.net (Isaac Dupree) Date: Fri Nov 28 18:53:04 2008 Subject: [Haskell-beginners] Wrapping random In-Reply-To: References: Message-ID: <493085D8.6000401@charter.net> Torsten Otto wrote: > We have this working: > > > import System.Random > > > main = > > do randomNumber <- randomRIO (1::Int,2) > > print (randomAnswer randomNumber) > > > randomAnswer r > > | (r == 1) = "Nope!" > > | (r == 2) = "Absolutely!" > > | otherwise = "Error!" could be more concisely > randomAnswer r = ["Nope!", "Absolutely!"] !! r and 0-based rather than 1-based: > main = do > randomNumber <- randomRIO (0::Int,1) > print (randomAnswer randomNumber) for example, although it worked fine as-is, and it's possible to abstract more nicely than what I showed here too -Isaac From colin at colina.demon.co.uk Sat Nov 29 06:40:53 2008 From: colin at colina.demon.co.uk (Colin Paul Adams) Date: Sat Nov 29 06:34:31 2008 Subject: [Haskell-beginners] Recommended GUI library? Message-ID: Looking at the wiki, it says that none of the high-level libraries are in a really good state for production usage (i.e. they are still all reasearch-level). What would people recommend? I'd really prefer to use a high-level library. -- Colin Adams Preston Lancashire From abdullah.ak2002 at gmail.com Sat Nov 29 07:45:55 2008 From: abdullah.ak2002 at gmail.com (abdullah abdul Khadir) Date: Sat Nov 29 07:39:29 2008 Subject: [Haskell-beginners] Memoization Message-ID: <719881900811290445o77fa6b77pd34870504be1a662@mail.gmail.com> Hi, I am a student and we had an assignment in Haskell. The question, was given a string of the form "1-2+3*5-7+4-6+3" i.e., any sequence of integers as well as some operators between them we had to find a maximum possible value for the expression as well as the expression itself . So for maxval "1-2+3*5-7+4-6+3" it is (76,"(1-((2+3)*((5-(7+4))-(6+3))))"). The function we had to write was maxval :: String -> (Int,String). For further details on the question, have a look at our sir's web page here. I solved the question, we had to use memoization, and submitted the solution. It is given below. Now the problem is I am just wondering if it can be solved in a better manner. Translation : Is there some way in Haskell to do it in a more simpler way and as well as to reduce the number of lines of the program. > {- > > --------------------------------------------------------------------------------------------------------------------------- > *********************** module Memo.hs > ****************************************************** > > --------------------------------------------------------------------------------------------------------------------------- > -} > module > Memo(Table,emptytable,memofind,memolookup,memoupdate,memoupdateArray) where > > data (Eq a) => Table a b c = T [(a,a,(b,c),(b,c))] > deriving (Eq,Show) > > emptytable :: (Eq a) => (Table a b c) > emptytable = T [] > > memofind :: (Eq a) => (Table a b c) ->(a,a)-> Bool > memofind (T []) _ = False > memofind (T ((y,z,(v1,s1),(v2,s2)):l)) x > | x == (y,z) = True > | otherwise = memofind (T l) x > > memolookup :: (Eq a) => (Table a b c) -> (a,a) -> ((b,c),(b,c)) > memolookup (T ((y,z,(v1,s1),(v2,s2)):l)) x > | x == (y,z) = ((v1,s1),(v2,s2)) > | otherwise = memolookup (T l) x > > memoupdate :: (Eq a) => (Table a b c) -> (a,a,(b,c),(b,c)) -> (Table a b c) > memoupdate (T l) x = T (x:l) > > memoupdateArray :: (Eq a) => (Table a b c) -> [(a,a,(b,c),(b,c))] -> (Table > a b c) > memoupdateArray t [] = t > memoupdateArray t (x:xs) = memoupdate (memoupdateArray t xs) x > > {- > > --------------------------------------------------------------------------------------------------------------------------- > ***********************End of module > Memo.hs*********************************************** > > --------------------------------------------------------------------------------------------------------------------------- > -} > > > {- > > --------------------------------------------------------------------------------------------------------------------------- > ******************The actual program , > assign-6.hs****************************************** > > --------------------------------------------------------------------------------------------------------------------------- > -} > > minArray :: [(Int,String)] -> (Int,String) > minArray ((x,expr):[]) = (x,expr) > minArray ((x,expr):l) |((min x (fst (minArray l))) ==x) = (x,expr) > |otherwise = (minArray l) > > maxArray :: [(Int,String)] -> (Int,String) > maxArray ((x,expr):[]) = (x,expr) > maxArray ((x,expr):l) |((max x (fst (minArray l))) ==x) = (x,expr) > |otherwise = (minArray l) > > import Memo > import Char > > type Tuple = (Int,Int,(Int,String),(Int,String)) > > maxval :: String ->(Int, String) > maxval expr = snd (memolookup (buildmemo expr 1 emptytable) (1,length > expr)) > > initmemo :: (String) -> (Table Int Int String) > initmemo expr = (memoupdateArray (emptytable) > [(i,i,(toInt(expr!!(i-1)),[expr!!(i-1)]), > (toInt(expr!!(i-1)),[expr!!(i-1)]))|i<-[1..length > expr],j<-[0,1],i `mod` 2 ==1]) > > buildmemo :: (String)->Int -> (Table Int Int String)-> (Table Int Int > String) > buildmemo expr col memo | (col > length expr) = memo > | (col == 1) = buildmemo expr 3 (memoupdateArray > (emptytable) > [(i,i,(toInt(expr!!(i-1)),[expr!!(i-1)]), > > (toInt(expr!!(i-1)),[expr!!(i-1)]))|i<-[1..length expr],i `mod` 2 ==1]) > | otherwise = buildmemo expr (col+2) (memoupdateArray > (memo) (createList expr memo (1,col))) > > createList :: String-> (Table Int Int String) -> (Int,Int) -> [Tuple] > createList expr memo (i,j) | j > (length expr) = [] > | otherwise = (i,j,min_expr,max_expr):(createList expr > memo (i+2,j+2)) > where > min_expr = minArray [x | (x,y) <- list] > max_expr = maxArray [y | (x,y) <- list] > list = [(compute memo (i,k) (k+2,j) > (expr!!k))|k<-[i..j-2],k `mod` 2 ==1] > > compute :: (Table Int Int > String)->(Int,Int)->(Int,Int)->Char->((Int,String),(Int,String)) > compute memo (x1,x2) (y1,y2) op |op == '+' = > ((min1+min2,"("++min1_expr++"+"++min2_expr++")"), > > (max1+max2,"("++max1_expr++"+"++max2_expr++")")) > |op == '-' = > ((min1-max2,"("++min1_expr++"-"++max2_expr++")"), > > (max1-min2,"("++max1_expr++"-"++min2_expr++")")) > |op == '*' = (minArray xs,maxArray xs) > where > xs = [(min1*min2,"("++min1_expr++"*"++min2_expr++")"), > (min1*max2,"("++min1_expr++"*"++max2_expr++")"), > (max1*min2,"("++max1_expr++"*"++min2_expr++")"), > > (max1*max2,"("++max1_expr++"*"++max2_expr++")")] > ((min1,min1_expr),(max1,max1_expr)) = (memolookup memo > (x1,x2)) > ((min2,min2_expr),(max2,max2_expr)) = (memolookup memo > (y1,y2)) > > minArray :: [(Int,String)] -> (Int,String) > minArray ((x,expr):[]) = (x,expr) > minArray ((x,expr):l) |((min x (fst (minArray l))) ==x) = (x,expr) > |otherwise = (minArray l) > > maxArray :: [(Int,String)] -> (Int,String) > maxArray ((x,expr):[]) = (x,expr) > maxArray ((x,expr):l) |((max x (fst (maxArray l))) ==x) = (x,expr) > |otherwise = (maxArray l) > > toInt :: Char -> Int > toInt x = ord x - ord '0' > > {- > > --------------------------------------------------------------------------------------------------------------------------- > ***********************End of program > assign-6.hs******************************************* > > --------------------------------------------------------------------------------------------------------------------------- > -} -------------- next part -------------- An HTML attachment was scrubbed... URL: http://www.haskell.org/pipermail/beginners/attachments/20081129/a402cc23/attachment-0001.htm From andrew at swclan.homelinux.org Sat Nov 29 12:02:23 2008 From: andrew at swclan.homelinux.org (Andrew Sackville-West) Date: Sat Nov 29 11:55:59 2008 Subject: [Haskell-beginners] Wrapping random In-Reply-To: References: Message-ID: <20081129170223.GD25356@localhost.localdomain> On Fri, Nov 28, 2008 at 10:53:32PM +0100, Torsten Otto wrote: > Hi all, > > I teach a high school class in Computer Science. The current programming > goal is to implement chat-bots, and we're using Haskell of course. Now > one of my students had the seemingly easy idea of having the bot answer > with a random sentence if it doesn't have "good" answer. Perhaps instead of using a random number, you could simulate randomness with some other technique. For example, if there is no good response in a particular situation, you could hash the input and map it to some predetermined responses. This would keep you in the IO monad (I think. I'm a total rookie at this). You could then useit as a vehicle to teach some other stuff such as the meaning of random in a computer environment (vs true randomness) and concepts of hashing (even looking into collisions in a simple way because the students will see that different situations reliably give rise to the same outout). .02 A -------------- next part -------------- A non-text attachment was scrubbed... Name: not available Type: application/pgp-signature Size: 197 bytes Desc: Digital signature Url : http://www.haskell.org/pipermail/beginners/attachments/20081129/21f097d8/attachment.bin From colin at colina.demon.co.uk Sat Nov 29 16:39:46 2008 From: colin at colina.demon.co.uk (Colin Paul Adams) Date: Sat Nov 29 16:33:21 2008 Subject: [Haskell-beginners] Installing Gtk2hs Message-ID: The install instructions seem very straight-forward, but they are not working for me. I did: ./configure --enable-docs --disable-deprecated make su -c'make install' but the demos won't compile (they can't find the libraries). checking the stderr from make shows: ghc-pkg: Unversioned dependencies found: base ghc-pkg: Unversioned dependencies found: base ghc-pkg: Unversioned dependencies found: base ghc-pkg: Unversioned dependencies found: base ghc-pkg: Unversioned dependencies found: base ghc-pkg: Unversioned dependencies found: base ghc-pkg: Unversioned dependencies found: base ghc-pkg: Unversioned dependencies found: mtl make: *** Deleting file `package.conf.inplace' package.conf.inplace: openBinaryFile: does not exist (No such file or directory) package.conf.inplace: openBinaryFile: does not exist (No such file or directory) ghc-pkg: Unversioned dependencies found: base ghc-pkg: Unversioned dependencies found: base ghc-pkg: Unversioned dependencies found: base ghc-pkg: Unversioned dependencies found: base ghc-pkg: Unversioned dependencies found: base ghc-pkg: Unversioned dependencies found: base ghc-pkg: Unversioned dependencies found: base ghc-pkg: Unversioned dependencies found: mtl make[1]: *** Deleting file `package.conf.inplace' package.conf.inplace: openBinaryFile: does not exist (No such file or directory) package.conf.inplace: openBinaryFile: does not exist (No such file or directory) on the commandline: Warning: -fffi is deprecated: use -XForeignFunctionInterface or pragma {-# LANGUAGE ForeignFunctionInterface#-} instead package.conf.inplace: openBinaryFile: does not exist (No such file or directory) make[1]: *** [glib/System/Glib.o] Error 1 make: *** [all] Error 2 My environment is Fedora 10 (64-bit). Ghc 6.10.1. Any suggestions? -- Colin Adams Preston Lancashire From ajb at spamcop.net Sat Nov 29 18:25:59 2008 From: ajb at spamcop.net (ajb@spamcop.net) Date: Sat Nov 29 18:19:32 2008 Subject: [Haskell-beginners] Re: Homework help (was Re: Help in Haskell) In-Reply-To: References: <99bc91850811232304x4bc5fc87hd1757c5703b7f331@mail.gmail.com> <7ibni4ti4uk7fmaki89jd88h49o2oeq6b1@4ax.com> <20081126181845.3xqbqnu3kgso0c8s-nwo@webmail.spamcop.net> Message-ID: <20081129182559.x91flp4moogwc4g4-nwo@webmail.spamcop.net> G'day all. Quoting "Benjamin L.Russell" : > Actually, initially I had to fight the urge not to rewrite it in a > less elitist manner, in order to avoid the possibility of offending > the original author. It was me, and I'm not offended. By putting words on a Wiki, rather than, say, a personal blog, I feel that I'm explicitly inviting others to be bold and modify them. > I could have risked going against the cultural attitude of the > original author, who had deliberately used the pejorative term "stupid > question." Actually, the reason why I used that term is simpler than that: I'd just read the "smart questions" FAQ, and my brain was pre-conditioned in that direction. Go ahead and change it. Cheers, Andrew Bromage From alexander.dunlap at gmail.com Sat Nov 29 19:43:22 2008 From: alexander.dunlap at gmail.com (Alexander Dunlap) Date: Sat Nov 29 19:36:54 2008 Subject: [Haskell-beginners] In-place lazy I/O In-Reply-To: <57526e770811291641t76101901q99d95d3a55b7927c@mail.gmail.com> References: <57526e770811291641t76101901q99d95d3a55b7927c@mail.gmail.com> Message-ID: <57526e770811291643g476bf2bewdd707ef29e4f62da@mail.gmail.com> Hi all, Suppose my program has one or more persistent files that it reads at or near the beginning of its execution and writes at or near the end. Thus, an extremely simplified model of my program could be > main = do > h <- openFile "some-file" ReadMode > c <- hGetContents h > w <- openFile "some-file" WriteMode > hPutStr w (f c) where f is some arbitrary function. My question is how to do this. It seems like the data from h won't necessarily be forced until f is called when it is written, and there is no guarantee that all of the data will even be used by f until it is written. Thus, I will get a file-locking error when trying to write the file. Do I have to rig things so that I know f will consume all of its input? Is it better to use strict I/O? Is there a better idiom for this entirely? Thanks for all of your help. Alex From lazycat.manatee at gmail.com Sat Nov 29 20:17:50 2008 From: lazycat.manatee at gmail.com (Andy Stewart) Date: Sat Nov 29 21:43:37 2008 Subject: [Haskell-beginners] Re: Installing Gtk2hs References: Message-ID: <87skpaau69.fsf@debian.domain> Hi, Colin, I found same problem with me. I think gtk2hs can't compile success with GHC 6.10.1 So i back to 6.8 Regards, -- Andy. Colin Paul Adams writes: > The install instructions seem very straight-forward, but they are not > working for me. > > I did: > > ./configure --enable-docs --disable-deprecated > make > su -c'make install' > > but the demos won't compile (they can't find the libraries). > > checking the stderr from make shows: > > ghc-pkg: Unversioned dependencies found: base > ghc-pkg: Unversioned dependencies found: base > ghc-pkg: Unversioned dependencies found: base > ghc-pkg: Unversioned dependencies found: base > ghc-pkg: Unversioned dependencies found: base > ghc-pkg: Unversioned dependencies found: base > ghc-pkg: Unversioned dependencies found: base > ghc-pkg: Unversioned dependencies found: mtl > make: *** Deleting file `package.conf.inplace' > package.conf.inplace: openBinaryFile: does not exist (No such file or directory) > package.conf.inplace: openBinaryFile: does not exist (No such file or directory) > ghc-pkg: Unversioned dependencies found: base > ghc-pkg: Unversioned dependencies found: base > ghc-pkg: Unversioned dependencies found: base > ghc-pkg: Unversioned dependencies found: base > ghc-pkg: Unversioned dependencies found: base > ghc-pkg: Unversioned dependencies found: base > ghc-pkg: Unversioned dependencies found: base > ghc-pkg: Unversioned dependencies found: mtl > make[1]: *** Deleting file `package.conf.inplace' > package.conf.inplace: openBinaryFile: does not exist (No such file or directory) > package.conf.inplace: openBinaryFile: does not exist (No such file or directory) > > on the commandline: > Warning: -fffi is deprecated: use -XForeignFunctionInterface or pragma {-# LANGUAGE ForeignFunctionInterface#-} instead > package.conf.inplace: openBinaryFile: does not exist (No such file or directory) > make[1]: *** [glib/System/Glib.o] Error 1 > make: *** [all] Error 2 > > My environment is Fedora 10 (64-bit). Ghc 6.10.1. > > Any suggestions? From colin at colina.demon.co.uk Sun Nov 30 00:47:58 2008 From: colin at colina.demon.co.uk (Colin Paul Adams) Date: Sun Nov 30 00:41:31 2008 Subject: [Haskell-beginners] Re: Installing Gtk2hs In-Reply-To: <87skpaau69.fsf@debian.domain> (Andy Stewart's message of "Sun\, 30 Nov 2008 09\:17\:50 +0800") References: <87skpaau69.fsf@debian.domain> Message-ID: >>>>> "Andy" == Andy Stewart writes: Andy> Hi, Colin, I found same problem with me. I think gtk2hs Andy> can't compile success with GHC 6.10.1 So i back to 6.8 Thanks Andy. I removed ghc 6.10.1 then did a yum groupinstall haskell. I then tried again. This time the configure failed because it couldn't find haddock. I had to manually add a link from haddock to haddock-0.9 in /usr/bin. Clearly a problem with the rpm packaging for Fedora. Now make fails with: svgcairo/Graphics/Rendering/Cairo/SVG.chs:201:2: Couldn't match expected type `()' against inferred type `CInt' Expected type: Render () Inferred type: Render CInt In the expression: liftIO $ (\ (SVG arg1) (Cairo arg2) -> withForeignPtr arg1 $ \ argPtr1 -> rsvg_handle_render_cairo argPtr1 arg2) svg cr In the expression: do cr <- ask liftIO $ (\ (SVG arg1) (Cairo arg2) -> withForeignPtr arg1 $ \ argPtr1 -> rsvg_handle_render_cairo argPtr1 arg2) svg cr make[1]: *** [svgcairo/Graphics/Rendering/Cairo/SVG.o] Error 1 make: *** [all] Error 2 -- Colin Adams Preston Lancashire From magnus at therning.org Sun Nov 30 02:04:12 2008 From: magnus at therning.org (Magnus Therning) Date: Sun Nov 30 01:57:49 2008 Subject: [Haskell-beginners] In-place lazy I/O In-Reply-To: <57526e770811291643g476bf2bewdd707ef29e4f62da@mail.gmail.com> References: <57526e770811291641t76101901q99d95d3a55b7927c@mail.gmail.com> <57526e770811291643g476bf2bewdd707ef29e4f62da@mail.gmail.com> Message-ID: <49323AEC.4060609@therning.org> Alexander Dunlap wrote: > Hi all, > > Suppose my program has one or more persistent files that it reads at > or near the beginning of its execution and writes at or near the end. > Thus, an extremely simplified model of my program could be > >> main = do >> h <- openFile "some-file" ReadMode >> c <- hGetContents h >> w <- openFile "some-file" WriteMode >> hPutStr w (f c) > > where f is some arbitrary function. > > My question is how to do this. It seems like the data from h won't > necessarily be forced until f is called when it is written, and there > is no guarantee that all of the data will even be used by f until it > is written. Thus, I will get a file-locking error when trying to write > the file. Do I have to rig things so that I know f will consume all of > its input? Is it better to use strict I/O? Is there a better idiom for > this entirely? I think a fairly common way to solve this is to change your program to basically do main = do h <- openFile "some-file" ReadMode c <- hGetContents h w <- openFile "temp-file" hPutStr w (f c) hClose w renameFile "temp-file" "some-file" Of course there may still be some laziness issues to keep in mind. But I believe that should take care of any locking issues your OS might throw at you. /M -- Magnus Therning (OpenPGP: 0xAB4DFBA4) magnus?therning?org Jabber: magnus?therning?org http://therning.org/magnus Haskell is an even 'redder' pill than Lisp or Scheme. -- PaulPotts -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 197 bytes Desc: OpenPGP digital signature Url : http://www.haskell.org/pipermail/beginners/attachments/20081130/d61131fa/signature.bin From colin at colina.demon.co.uk Sun Nov 30 04:08:57 2008 From: colin at colina.demon.co.uk (Colin Paul Adams) Date: Sun Nov 30 04:02:33 2008 Subject: [Haskell-beginners] Re: Installing Gtk2hs In-Reply-To: (Colin Paul Adams's message of "Sun\, 30 Nov 2008 05\:47\:58 +0000") References: <87skpaau69.fsf@debian.domain> Message-ID: >>>>> "Colin" == Colin Paul Adams writes: >>>>> "Andy" == Andy Stewart writes: Andy> Hi, Colin, I found same problem with me. I think gtk2hs Andy> can't compile success with GHC 6.10.1 So i back to 6.8 Colin> Thanks Andy. Colin> I removed ghc 6.10.1 then did a yum groupinstall haskell. Colin> I then tried again. This time the configure failed because Colin> it couldn't find haddock. I had to manually add a link from Colin> haddock to haddock-0.9 in /usr/bin. Clearly a problem with Colin> the rpm packaging for Fedora. Colin> Now make fails with: Colin> svgcairo/Graphics/Rendering/Cairo/SVG.chs:201:2: Couldn't Colin> match expected type `()' against inferred type `CInt' Colin> Expected type: Render () Inferred type: Render CInt In the Colin> expression: liftIO $ (\ (SVG arg1) (Cairo arg2) -> withForeignPtr arg1 Colin> $ \ argPtr1 -> rsvg_handle_render_cairo Colin> argPtr1 arg2) svg cr In the expression: do cr <- ask liftIO Colin> $ (\ (SVG arg1) (Cairo arg2) -> withForeignPtr arg1 Colin> $ \ argPtr1 -> rsvg_handle_render_cairo Colin> argPtr1 arg2) svg cr make[1]: *** Colin> [svgcairo/Graphics/Rendering/Cairo/SVG.o] Error 1 make: *** Colin> [all] Error 2 So I tried changing Render () to Render CInt in four places in SVG.chs. Now it installs OK with 6.8.3, and all the demos run. I'd have a go at getting it to work with 6.10.1 if I knew what to do. It appears the library structure has changed incompatibly (and ghc didn't even change its version number - that's pretty bad). Is there a document anywhere that details the structure changes? -- Colin Adams Preston Lancashire From colin at colina.demon.co.uk Sun Nov 30 04:24:31 2008 From: colin at colina.demon.co.uk (Colin Paul Adams) Date: Sun Nov 30 04:18:05 2008 Subject: [Haskell-beginners] Re: Installing Gtk2hs In-Reply-To: (Colin Paul Adams's message of "Sun\, 30 Nov 2008 09\:08\:57 +0000") References: <87skpaau69.fsf@debian.domain> Message-ID: >>>>> "Colin" == Colin Paul Adams writes: Colin> Now it installs OK with 6.8.3, and all the demos run. Well, not quite all: mozembed fails to compile with: TestEmbedMoz.hs:5:7: Could not find module `Graphics.UI.Gtk.MozEmbed': Use -v to see a list of the files searched for. make: *** [testembedmoz] Error 1 And the svgviewer programs fail at runtime with: svgviewer: user error (Pattern match failure in do expression at SvgViewer.hs:11:2-9) and: svg2png: user error (Pattern match failure in do expression at Svg2Png.hs:9:2-18) and for treelist: make: *** No rule to make target `TreeSort.hs', needed by `treesort'. Stop. and for opengl: ghc --make RotatingCube.hs -o cube RotatingCube.hs:7:17: Could not find module `Graphics.UI.Gtk.OpenGL': Use -v to see a list of the files searched for. make: *** [cube] Error 1 and for sourceview: ghc --make SourceViewTest.hs -o sourceview SourceViewTest.hs:5:7: Could not find module `Graphics.UI.Gtk.SourceView': Use -v to see a list of the files searched for. make: *** [sourceview] Error 1 -- Colin Adams Preston Lancashire From dons at galois.com Fri Nov 28 19:15:30 2008 From: dons at galois.com (Don Stewart) Date: Sun Nov 30 21:26:44 2008 Subject: [Haskell-beginners] Re: [Haskell-cafe] ANNOUNCE: Haskell Communities and Activities Report (15th ed., November 2008) In-Reply-To: <492F9701.9010707@tcs.inf.tu-dresden.de> References: <492F9701.9010707@tcs.inf.tu-dresden.de> Message-ID: <20081129001530.GN27887@scytale.galois.com> Good work! It is always interesting to see the secret Haskell projects that only get announced via the HCAR. Things not on haskell@ or on hackage. For example, this under-the-radar project: http://www.haskell.org/communities/11-2008/html/report.html#sect7.7 7.7 IVU Traffic Technologies AG Rostering Group Haskell to solve constraints on EU bus timetables! In production use! -- Don voigt: > On behalf of the many, many contributors, I am pleased to announce > that the > > Haskell Communities and Activities Report > (15th edition, November 2008) > > http://www.haskell.org/communities/ > > is now available from the Haskell Communities home page in PDF and > HTML formats. From duncan.coutts at worc.ox.ac.uk Sun Nov 30 17:33:54 2008 From: duncan.coutts at worc.ox.ac.uk (Duncan Coutts) Date: Sun Nov 30 21:27:08 2008 Subject: [Haskell-beginners] Re: Installing Gtk2hs In-Reply-To: References: <87skpaau69.fsf@debian.domain> Message-ID: <1228084434.10115.96.camel@localhost> On Sun, 2008-11-30 at 09:08 +0000, Colin Paul Adams wrote: > Colin> Now make fails with: > > Colin> svgcairo/Graphics/Rendering/Cairo/SVG.chs:201:2: Couldn't > Colin> match expected type `()' against inferred type `CInt' > Colin> Expected type: Render () Inferred type: Render CInt In the > So I tried changing Render () to Render CInt in four places in > SVG.chs. Aye, the cairo C library changed it's API from 1.6 to 1.8. It added an int return type to several functions that previously returned void. > Now it installs OK with 6.8.3, and all the demos run. > > I'd have a go at getting it to work with 6.10.1 if I knew what to do. > It appears the library structure has changed incompatibly (and ghc > didn't even change its version number - that's pretty bad). The version of ghc did change of course, 6.8 -> 6.10, but perhaps you mean the versions of the libraries? They changed also, to reflect the API changes. > Is there a document anywhere that details the structure changes? Yes, the ghc-6.10 release notes. Duncan From duncan.coutts at worc.ox.ac.uk Sun Nov 30 17:43:45 2008 From: duncan.coutts at worc.ox.ac.uk (Duncan Coutts) Date: Sun Nov 30 21:27:28 2008 Subject: [Haskell-beginners] Re: Installing Gtk2hs In-Reply-To: References: <87skpaau69.fsf@debian.domain> Message-ID: <1228085025.10115.106.camel@localhost> On Sun, 2008-11-30 at 09:24 +0000, Colin Paul Adams wrote: > >>>>> "Colin" == Colin Paul Adams writes: > > Colin> Now it installs OK with 6.8.3, and all the demos run. > > Well, not quite all: > > mozembed fails to compile with: > > TestEmbedMoz.hs:5:7: > Could not find module `Graphics.UI.Gtk.MozEmbed': > Use -v to see a list of the files searched for. > make: *** [testembedmoz] Error 1 This almost certainly is because you didn't build the mozembed component of gtk2hs. The ./configure script lists all the bits that it's going to build. By default if the corresponding C devel package is not available then the binding will not be built. If you really want to build it then use ./configure --enable-firefox or --enable-xulrunner and it will stop and report exactly what bits it needed but could not find. > And the svgviewer programs fail at runtime with: > > svgviewer: user error (Pattern match failure in do expression at SvgViewer.hs:11:2-9) That's kind of by design, it's a simple demo program that does no error checking on the command line arguments. See that line in the source code: (file:_) <- getArgs So if you call it with a single .svg file parameter it should work. > and: > > svg2png: user error (Pattern match failure in do expression at Svg2Png.hs:9:2-18) Same issue. > and for treelist: > > make: *** No rule to make target `TreeSort.hs', needed by `treesort'. Stop. Good catch, that file is missing from the tarball. > and for opengl: > > ghc --make RotatingCube.hs -o cube > > RotatingCube.hs:7:17: > Could not find module `Graphics.UI.Gtk.OpenGL': > Use -v to see a list of the files searched for. > make: *** [cube] Error 1 Same as the fist problem. You built gtk2hs without the opengl component. Use ./configure --enable-opengl and it'll tell you what you're missing. > and for sourceview: > > ghc --make SourceViewTest.hs -o sourceview > > SourceViewTest.hs:5:7: > Could not find module `Graphics.UI.Gtk.SourceView': > Use -v to see a list of the files searched for. > make: *** [sourceview] Error 1 Same problem again, but for the sourceview component. ./configure --enable-sourceview Basically you need to install a bunch of -devel fedora packages so that the Haskell bindings can be built. The thing to check is the summary produced at that end of running ./configure Duncan