[auto ekmett@gmail.com**20090407062534 Ignore-this: 4b1df6cf5d7cd8ca198795add3dbd910 ] { hunk ./doc/html/unboxed-containers/Data-Set-Unboxed.html 22 ->unboxed-containers-0.0.1: Self-optimizing unboxed sets using view patterns and data familiesunboxed-containers-0.0.2: Self-optimizing unboxed sets using view patterns and data families
Portability | non-portable (type families, view patterns, unboxed tuples) |
Stability | experimental |
Maintainer | ekmett@gmail.com |
An efficient implementation of sets. +
Since many function names (but not the type name) clash with + Prelude names, this module is usually imported qualified, e.g. +
import Data.Set.Unboxed (USet) + import qualified Data.Set.Unboxed as USet +
The implementation of USet is based on size balanced binary trees (or + trees of bounded balance) as described by: +
Note that the implementation is left-biased -- the elements of a + first argument are always preferred to the second, for example in + union or insert. Of course, left-biasing can only be observed + when equality is an equivalence relation instead of structural + equality. +
Modified from Data.Set to use type families for automatic unboxing +
getBoxed :: a |
| Data.Set.Unboxed | ||
unboxed-containers-0.0.1: Self-optimizing unboxed sets using view patterns and data familiesunboxed-containers-0.0.2: Self-optimizing unboxed sets using view patterns and data familiesunboxed-containers-0.0.1: Self-optimizing unboxed sets using view patterns and data families | unboxed-containers-0.0.2: Self-optimizing unboxed sets using view patterns and data familiesunboxed-containers-0.0.1: Self-optimizing unboxed sets using view patterns and data familiesunboxed-containers-0.0.2: Self-optimizing unboxed sets using view patterns and data families -{------------------------------------------------------------------------------ --- | --- Module : Data.Set.Unboxed --- Copyright : (c) Edward Kmett 2009 --- (c) Daan Leijen 2002 --- License : BSD3 --- Maintainer : ekmett@gmail.com --- Stability : experimental --- Portability : non-portable (type families, view patterns, unboxed tuples) --- --- An efficient implementation of sets. --- --- Since many function names (but not the type name) clash with --- "Prelude" names, this module is usually imported @qualified@, e.g. --- --- > import Data.Set.Unboxed (USet) --- > import qualified Data.Set.Unboxed as USet --- --- The implementation of 'USet' is based on /size balanced/ binary trees (or --- trees of /bounded balance/) as described by: --- --- * Stephen Adams, \"/Efficient sets: a balancing act/\", --- Journal of Functional Programming 3(4):553-562, October 1993, --- <http://www.swiss.ai.mit.edu/~adams/BB/>. --- --- * J. Nievergelt and E.M. Reingold, --- \"/Binary search trees of bounded balance/\", --- SIAM journal of computing 2(1), March 1973. --- --- Note that the implementation is /left-biased/ -- the elements of a --- first argument are always preferred to the second, for example in --- 'union' or 'insert'. Of course, left-biasing can only be observed --- when equality is an equivalence relation instead of structural --- equality. --- --- Modified from "Data.Set" to use type families for automatic unboxing --- ------------------------------------------------------------------------------ --} - -module Data.Set.Unboxed ( - -- * Set type - USet -- instance Eq,Ord,Show,Read,Data,Typeable - , US - , Boxed(Boxed) +----------------------------------------------------------------------------- +-- | +-- Module : Data.Set.Unboxed +-- Copyright : (c) Edward Kmett 2009 (c) Daan Leijen 2002 +-- License : BSD3 +-- Maintainer : ekmett@gmail.com +-- Stability : experimental +-- Portability : non-portable (type families, view patterns, unboxed tuples) +-- +-- An efficient implementation of sets. +-- +-- Since many function names (but not the type name) clash with +-- "Prelude" names, this module is usually imported @qualified@, e.g. +-- +-- > import Data.Set.Unboxed (USet) +-- > import qualified Data.Set.Unboxed as USet +-- +-- The implementation of 'USet' is based on /size balanced/ binary trees (or +-- trees of /bounded balance/) as described by: +-- +-- * Stephen Adams, \"/Efficient sets: a balancing act/\", +-- Journal of Functional Programming 3(4):553-562, October 1993, +-- <http://www.swiss.ai.mit.edu/~adams/BB/>. +-- +-- * J. Nievergelt and E.M. Reingold, +-- \"/Binary search trees of bounded balance/\", +-- SIAM journal of computing 2(1), March 1973. +-- +-- Note that the implementation is /left-biased/ -- the elements of a +-- first argument are always preferred to the second, for example in +-- 'union' or 'insert'. Of course, left-biasing can only be observed +-- when equality is an equivalence relation instead of structural +-- equality. +-- +-- Modified from "Data.Set" to use type families for automatic unboxing +-- +----------------------------------------------------------------------------- + +module Data.Set.Unboxed ( + -- * Set type + USet -- instance Eq,Ord,Show,Read + , US + , Boxed(Boxed, getBoxed) + + -- * Operators + , (\\) hunk ./doc/html/unboxed-containers/src/Data-Set-Unboxed.html 58 - -- * Operators - , (\\) - - -- * Query - , null - , size - , member - , notMember - , isSubsetOf - , isProperSubsetOf - - -- * Construction - , empty - , singleton - , insert - , delete - - -- * Combine - , union, unions - , difference - , intersection - - -- * Filter - , filter - , partition - , split - , splitMember - - -- * Map - , map - , mapMonotonic + -- * Query + , null + , size + , member + , notMember + , isSubsetOf + , isProperSubsetOf + + -- * Construction + , empty + , singleton + , insert + , delete + + -- * Combine + , union, unions + , difference + , intersection + + -- * Filter + , filter + , partition + , split + , splitMember + + -- * Map + , map + , mapMonotonic + + -- * Fold + , fold hunk ./doc/html/unboxed-containers/src/Data-Set-Unboxed.html 90 - -- * Fold - , fold - - -- * Min\/Max - , findMin - , findMax - , deleteMin - , deleteMax - , deleteFindMin - , deleteFindMax - , maxView - , minView - - -- * Conversion - - -- ** List - , elems - , toList - , fromList - - -- ** Ordered list - , toAscList - , fromAscList - , fromDistinctAscList - - -- * Debugging - , showTree - , showTreeWith - , valid - ) where - -import Prelude hiding (filter,foldr,null,map) -import qualified Data.List as List -import Data.Monoid (Monoid(..)) -import Data.Word -import Data.Int - -{- --- just for testing -import Test.QuickCheck -import Data.List (nub,sort) -import qualified Data.List as List --} - -#if __GLASGOW_HASKELL__ -import Text.Read -#endif - -{-------------------------------------------------------------------- - Operators ---------------------------------------------------------------------} -infixl 9 \\ -- - --- | /O(n+m)/. See 'difference'. -(\\) :: (US a, Ord a) => USet a -> USet a -> USet a -m1 \\ m2 = difference m1 m2 - -{-------------------------------------------------------------------- - Sets are size balanced trees ---------------------------------------------------------------------} -type Size = Int - --- | A set of values @a@. -data Set a = Tip - | Bin {-# UNPACK #-} !Size !a !(USet a) !(USet a) - -class US a where - data USet a - + -- * Min\/Max + , findMin + , findMax + , deleteMin + , deleteMax + , deleteFindMin + , deleteFindMax + , maxView + , minView + + -- * Conversion + + -- ** List + , elems + , toList + , fromList + + -- ** Ordered list + , toAscList + , fromAscList + , fromDistinctAscList + + -- * Debugging + , showTree + , showTreeWith + , valid + ) where + +import Prelude hiding (filter,foldr,null,map) +import qualified Data.List as List +import Data.Monoid (Monoid(..)) +import Data.Word +import Data.Int +import Data.Complex + +{- +-- just for testing +import Test.QuickCheck +import Data.List (nub,sort) +import qualified Data.List as List +-} + +#if __GLASGOW_HASKELL__ +import Text.Read +#endif + +{-------------------------------------------------------------------- + Operators +--------------------------------------------------------------------} +infixl 9 \\ -- + +-- | /O(n+m)/. See 'difference'. +(\\) :: (US a, Ord a) => USet a -> USet a -> USet a +m1 \\ m2 = difference m1 m2 + +{-------------------------------------------------------------------- + Sets are size balanced trees +--------------------------------------------------------------------} +type Size = Int + +-- | A set of values @a@. +data Set a = Tip + | Bin {-# UNPACK #-} !Size !a !(USet a) !(USet a) + +class US a where + data USet a + + -- | Extract and rebox the specialized node format + view :: USet a -> Set a hunk ./doc/html/unboxed-containers/src/Data-Set-Unboxed.html 160 - -- | Extract and rebox the specialized node format - view :: USet a -> Set a - - -- | Apply the view to tip and bin continuations - viewk :: b -> (Size -> a -> USet a -> USet a -> b) -> USet a -> b - viewk f k x = case view x of - Bin s i l r -> k s i l r - Tip -> f - - -- | View just the value and left and right child of a bin - viewBin :: USet a -> (# a, USet a, USet a #) - viewBin x = case view x of - Bin _ i l r -> (# i, l, r #) - Tip -> error "Data.Set.Unboxed.viewBin" - - -- | /O(1)/. The number of elements in the set. - size :: USet a -> Size - size = viewk 0 size' where - size' s _ _ _ = s - - -- | /O(1)/. Is this the empty set? - null :: USet a -> Bool - null x = size x == 0 + -- | Apply the view to tip and bin continuations + viewk :: b -> (Size -> a -> USet a -> USet a -> b) -> USet a -> b + viewk f k x = case view x of + Bin s i l r -> k s i l r + Tip -> f + + -- | View just the value and left and right child of a bin + viewBin :: USet a -> (# a, USet a, USet a #) + viewBin x = case view x of + Bin _ i l r -> (# i, l, r #) + Tip -> error "Data.Set.Unboxed.viewBin" + + -- | /O(1)/. The number of elements in the set. + size :: USet a -> Size + size = viewk 0 size' where + size' s _ _ _ = s + + -- | /O(1)/. Is this the empty set? + null :: USet a -> Bool + null x = size x == 0 + + -- | Smart tip constructor + tip :: USet a hunk ./doc/html/unboxed-containers/src/Data-Set-Unboxed.html 184 - -- | Smart tip constructor - tip :: USet a + -- | Smart bin constructor + bin :: Size -> a -> USet a -> USet a -> USet a hunk ./doc/html/unboxed-containers/src/Data-Set-Unboxed.html 187 - -- | Smart bin constructor - bin :: Size -> a -> USet a -> USet a -> USet a - - -- | Balance the tree - balance :: a -> USet a -> USet a -> USet a - balance x l r - | sizeL + sizeR <= 1 = bin sizeX x l r - | sizeR >= delta*sizeL = case viewBin r of - (# v, ly, ry #) - | size ly < ratio*size ry -> bin_ v (bin_ x l ly) ry - | (# x3, t2, t3 #) <- viewBin ly -> bin_ x3 (bin_ x l t2) (bin_ v t3 ry) - | sizeL >= delta*sizeR = case viewBin l of - (# v, ly, ry #) - | size ry < ratio*size ly -> bin_ v ly (bin_ x ry r) - | (# x3, t2, t3 #) <- viewBin ry -> bin_ x3 (bin_ v ly t2) (bin_ x t3 r) - | otherwise = bin sizeX x l r - where - sizeL = size l - sizeR = size r - sizeX = sizeL + sizeR + 1 - - - -instance (US a, Ord a) => Monoid (USet a) where - mempty = empty - mappend = union - mconcat = unions - -{- -instance US a => Generator (USet a) where - type Elem (USet a) = a - mapReduce _ (null -> True) = mempty - mapReduce f (view -> Bin _s k l r) = mapReduce f l `mappend` f k `mappend` mapReduce f r --} - -{-------------------------------------------------------------------- - Query ---------------------------------------------------------------------} --- | /O(log n)/. Is the element in the set? -member :: (US a, Ord a) => a -> USet a -> Bool -member x = go where - cmpx = compare x - go = viewk False $ \_ y l r -> case cmpx y of - LT -> go l - GT -> go r - EQ -> True - --- | /O(log n)/. Is the element not in the set? -notMember :: (US a, Ord a) => a -> USet a -> Bool -notMember x t = not $ member x t - -{-------------------------------------------------------------------- - Construction ---------------------------------------------------------------------} --- | /O(1)/. The empty set. -empty :: US a => USet a -empty = tip - --- | /O(1)/. Create a singleton set. -singleton :: US a => a -> USet a -singleton x = bin 1 x tip tip - -{-------------------------------------------------------------------- - Deletion ---------------------------------------------------------------------} - --- | /O(log n)/. Delete an element from a set. -delete :: (US a, Ord a) => a -> USet a -> USet a -delete x = go where - go = viewk tip $ \ _ y l r -> case compare x y of - LT -> balance y (go l) r - GT -> balance y l (go r) - EQ -> glue l r - -{-------------------------------------------------------------------- - Subset ---------------------------------------------------------------------} --- | /O(n+m)/. Is this a proper subset? (ie. a subset but not equal). -isProperSubsetOf :: (US a, Ord a) => USet a -> USet a -> Bool -isProperSubsetOf s1 s2 = (size s1 < size s2) && (isSubsetOf s1 s2) - --- | /O(n+m)/. Is this a subset? --- @(s1 `isSubsetOf` s2)@ tells whether @s1@ is a subset of @s2@. -isSubsetOf :: (US a, Ord a) => USet a -> USet a -> Bool -isSubsetOf t1 t2 = (size t1 <= size t2) && (isSubsetOfX t1 t2) - -isSubsetOfX :: (US a, Ord a) => USet a -> USet a -> Bool -isSubsetOfX _ (null -> True) = False -isSubsetOfX (null -> True) _ = True -isSubsetOfX (view -> Bin _ x l r) t = found && isSubsetOfX l lt && isSubsetOfX r gt - where - (lt,found,gt) = splitMember x t - - -{-------------------------------------------------------------------- - Minimal, Maximal ---------------------------------------------------------------------} --- | /O(log n)/. The minimal element of a set. -findMin :: US a => USet a -> a -findMin (view -> Bin _ x (null -> True) _) = x -findMin (view -> Bin _ _ l _) = findMin l -findMin _ = error "Data.Set.Unboxed.findMin: empty set has no minimal element" - --- | /O(log n)/. The maximal element of a set. -findMax :: US a => USet a -> a -findMax (view -> Bin _ x _ (null -> True)) = x -findMax (view -> Bin _ _ _ r) = findMax r -findMax _ = error "Data.Set.Unboxed.findMax: empty set has no maximal element" - --- | /O(log n)/. Delete the minimal element. -deleteMin :: US a => USet a -> USet a -deleteMin (view -> Bin _ _ (null -> True) r) = r -deleteMin (view -> Bin _ x l r) = balance x (deleteMin l) r -deleteMin _ = tip - --- | /O(log n)/. Delete the maximal element. -deleteMax :: US a => USet a -> USet a -deleteMax (view -> Bin _ _ l (null -> True)) = l -deleteMax (view -> Bin _ x l r) = balance x l (deleteMax r) -deleteMax _ = tip - -{-------------------------------------------------------------------- - Union. ---------------------------------------------------------------------} --- | The union of a list of sets: (@'unions' == 'foldl' 'union' 'empty'@). -unions :: (US a, Ord a) => [USet a] -> USet a -unions ts - = foldlStrict union empty ts - - --- | /O(n+m)/. The union of two sets, preferring the first set when --- equal elements are encountered. --- The implementation uses the efficient /hedge-union/ algorithm. --- Hedge-union is more efficient on (bigset `union` smallset). -union :: (US a, Ord a) => USet a -> USet a -> USet a -union (null -> True) t2 = t2 -union t1 (null -> True) = t1 -union t1 t2 = hedgeUnion (const LT) (const GT) t1 t2 - -hedgeUnion :: (US a, Ord a) => (a -> Ordering) -> (a -> Ordering) -> USet a -> USet a -> USet a -hedgeUnion _ _ t1 (null -> True) = t1 -hedgeUnion cmplo cmphi (null -> True) (view -> Bin _ x l r) = join x (filterGt cmplo l) (filterLt cmphi r) -hedgeUnion cmplo cmphi (view -> Bin _ x l r) t2 = join x (hedgeUnion cmplo cmpx l (trim cmplo cmpx t2)) (hedgeUnion cmpx cmphi r (trim cmpx cmphi t2)) - where - cmpx = compare x - -{-------------------------------------------------------------------- - Difference ---------------------------------------------------------------------} --- | /O(n+m)/. Difference of two sets. --- The implementation uses an efficient /hedge/ algorithm comparable with /hedge-union/. -difference :: (US a, Ord a) => USet a -> USet a -> USet a -difference (null -> True) _ = tip -difference t1 (null -> True) = t1 -difference t1 t2 = hedgeDiff (const LT) (const GT) t1 t2 - -hedgeDiff :: (US a, Ord a) => (a -> Ordering) -> (a -> Ordering) -> USet a -> USet a -> USet a -hedgeDiff _ _ (null -> True) _ = tip -hedgeDiff cmplo cmphi (view -> Bin _ x l r) (null -> True) = join x (filterGt cmplo l) (filterLt cmphi r) -hedgeDiff cmplo cmphi t (view -> Bin _ x l r) = merge (hedgeDiff cmplo cmpx (trim cmplo cmpx t) l) (hedgeDiff cmpx cmphi (trim cmpx cmphi t) r) - where - cmpx = compare x - -{-------------------------------------------------------------------- - Intersection ---------------------------------------------------------------------} --- | /O(n+m)/. The intersection of two sets. --- Elements of the result come from the first set, so for example --- --- > import qualified Data.Set as S --- > data AB = A | B deriving Show --- > instance Ord AB where compare _ _ = EQ --- > instance Eq AB where _ == _ = True --- > main = print (S.singleton A `S.intersection` S.singleton B, --- > S.singleton B `S.intersection` S.singleton A) --- --- prints @(fromList [A],fromList [B])@. -intersection :: (US a, Ord a) => USet a -> USet a -> USet a -intersection (null -> True) _ = tip -intersection _ (null -> True) = tip -intersection t1@(view -> Bin s1 x1 l1 r1) t2@(view -> Bin s2 x2 l2 r2) = - if s1 >= s2 then - let (lt,found,gt) = splitLookup x2 t1 - tl = intersection lt l2 - tr = intersection gt r2 - in case found of - Just x -> join x tl tr - Nothing -> merge tl tr - else let (lt,found,gt) = splitMember x1 t2 - tl = intersection l1 lt - tr = intersection r1 gt - in if found then join x1 tl tr - else merge tl tr - -{-------------------------------------------------------------------- - Filter and partition ---------------------------------------------------------------------} --- | /O(n)/. Filter all elements that satisfy the predicate. -filter :: (US a, Ord a) => (a -> Bool) -> USet a -> USet a -filter p = go where - go = viewk tip - (\_ x l r -> - if p x - then join x (go l) (go r) - else merge (go l) (go r) - ) - --- | /O(n)/. Partition the set into two sets, one with all elements that satisfy --- the predicate and one with all elements that don't satisfy the predicate. --- See also 'split'. -partition :: (US a, Ord a) => (a -> Bool) -> USet a -> (USet a,USet a) -partition p = go where - go = viewk (tip,tip) - (\_ x l r -> - let - (l1,l2) = go l - (r1,r2) = go r - in if p x - then (join x l1 r1,merge l2 r2) - else (merge l1 r1,join x l2 r2) - ) - -{---------------------------------------------------------------------- - Map -----------------------------------------------------------------------} - --- | /O(n*log n)/. --- @'map' f s@ is the set obtained by applying @f@ to each element of @s@. --- --- It's worth noting that the size of the result may be smaller if, --- for some @(x,y)@, @x \/= y && f x == f y@ + -- | Balance the tree + balance :: a -> USet a -> USet a -> USet a + balance x l r + | sizeL + sizeR <= 1 = bin sizeX x l r + | sizeR >= delta*sizeL = case viewBin r of + (# v, ly, ry #) + | size ly < ratio*size ry -> bin_ v (bin_ x l ly) ry + | (# x3, t2, t3 #) <- viewBin ly -> bin_ x3 (bin_ x l t2) (bin_ v t3 ry) + | sizeL >= delta*sizeR = case viewBin l of + (# v, ly, ry #) + | size ry < ratio*size ly -> bin_ v ly (bin_ x ry r) + | (# x3, t2, t3 #) <- viewBin ry -> bin_ x3 (bin_ v ly t2) (bin_ x t3 r) + | otherwise = bin sizeX x l r + where + sizeL = size l + sizeR = size r + sizeX = sizeL + sizeR + 1 + + + +instance (US a, Ord a) => Monoid (USet a) where + mempty = empty + mappend = union + mconcat = unions + +{- +instance US a => Generator (USet a) where + type Elem (USet a) = a + mapReduce _ (null -> True) = mempty + mapReduce f (view -> Bin _s k l r) = mapReduce f l `mappend` f k `mappend` mapReduce f r +-} + +{-------------------------------------------------------------------- + Query +--------------------------------------------------------------------} +-- | /O(log n)/. Is the element in the set? +member :: (US a, Ord a) => a -> USet a -> Bool +member x = go where + cmpx = compare x + go = viewk False $ \_ y l r -> case cmpx y of + LT -> go l + GT -> go r + EQ -> True + +-- | /O(log n)/. Is the element not in the set? +notMember :: (US a, Ord a) => a -> USet a -> Bool +notMember x t = not $ member x t + +{-------------------------------------------------------------------- + Construction +--------------------------------------------------------------------} +-- | /O(1)/. The empty set. +empty :: US a => USet a +empty = tip + +-- | /O(1)/. Create a singleton set. +singleton :: US a => a -> USet a +singleton x = bin 1 x tip tip + +{-------------------------------------------------------------------- + Deletion +--------------------------------------------------------------------} + +-- | /O(log n)/. Delete an element from a set. +delete :: (US a, Ord a) => a -> USet a -> USet a +delete x = go where + go = viewk tip $ \ _ y l r -> case compare x y of + LT -> balance y (go l) r + GT -> balance y l (go r) + EQ -> glue l r + +{-------------------------------------------------------------------- + Subset +--------------------------------------------------------------------} +-- | /O(n+m)/. Is this a proper subset? (ie. a subset but not equal). +isProperSubsetOf :: (US a, Ord a) => USet a -> USet a -> Bool +isProperSubsetOf s1 s2 = (size s1 < size s2) && (isSubsetOf s1 s2) + +-- | /O(n+m)/. Is this a subset? +-- @(s1 `isSubsetOf` s2)@ tells whether @s1@ is a subset of @s2@. +isSubsetOf :: (US a, Ord a) => USet a -> USet a -> Bool +isSubsetOf t1 t2 = (size t1 <= size t2) && (isSubsetOfX t1 t2) + +isSubsetOfX :: (US a, Ord a) => USet a -> USet a -> Bool +isSubsetOfX _ (null -> True) = False +isSubsetOfX (null -> True) _ = True +isSubsetOfX (view -> Bin _ x l r) t = found && isSubsetOfX l lt && isSubsetOfX r gt + where + (lt,found,gt) = splitMember x t + + +{-------------------------------------------------------------------- + Minimal, Maximal +--------------------------------------------------------------------} +-- | /O(log n)/. The minimal element of a set. +findMin :: US a => USet a -> a +findMin (view -> Bin _ x (null -> True) _) = x +findMin (view -> Bin _ _ l _) = findMin l +findMin _ = error "Data.Set.Unboxed.findMin: empty set has no minimal element" + +-- | /O(log n)/. The maximal element of a set. +findMax :: US a => USet a -> a +findMax (view -> Bin _ x _ (null -> True)) = x +findMax (view -> Bin _ _ _ r) = findMax r +findMax _ = error "Data.Set.Unboxed.findMax: empty set has no maximal element" + +-- | /O(log n)/. Delete the minimal element. +deleteMin :: US a => USet a -> USet a +deleteMin (view -> Bin _ _ (null -> True) r) = r +deleteMin (view -> Bin _ x l r) = balance x (deleteMin l) r +deleteMin _ = tip + +-- | /O(log n)/. Delete the maximal element. +deleteMax :: US a => USet a -> USet a +deleteMax (view -> Bin _ _ l (null -> True)) = l +deleteMax (view -> Bin _ x l r) = balance x l (deleteMax r) +deleteMax _ = tip + +{-------------------------------------------------------------------- + Union. +--------------------------------------------------------------------} +-- | The union of a list of sets: (@'unions' == 'foldl' 'union' 'empty'@). +unions :: (US a, Ord a) => [USet a] -> USet a +unions ts + = foldlStrict union empty ts + + +-- | /O(n+m)/. The union of two sets, preferring the first set when +-- equal elements are encountered. +-- The implementation uses the efficient /hedge-union/ algorithm. +-- Hedge-union is more efficient on (bigset `union` smallset). +union :: (US a, Ord a) => USet a -> USet a -> USet a +union (null -> True) t2 = t2 +union t1 (null -> True) = t1 +union t1 t2 = hedgeUnion (const LT) (const GT) t1 t2 + +hedgeUnion :: (US a, Ord a) => (a -> Ordering) -> (a -> Ordering) -> USet a -> USet a -> USet a +hedgeUnion _ _ t1 (null -> True) = t1 +hedgeUnion cmplo cmphi (null -> True) (view -> Bin _ x l r) = join x (filterGt cmplo l) (filterLt cmphi r) +hedgeUnion cmplo cmphi (view -> Bin _ x l r) t2 = join x (hedgeUnion cmplo cmpx l (trim cmplo cmpx t2)) (hedgeUnion cmpx cmphi r (trim cmpx cmphi t2)) + where + cmpx = compare x + +{-------------------------------------------------------------------- + Difference +--------------------------------------------------------------------} +-- | /O(n+m)/. Difference of two sets. +-- The implementation uses an efficient /hedge/ algorithm comparable with /hedge-union/. +difference :: (US a, Ord a) => USet a -> USet a -> USet a +difference (null -> True) _ = tip +difference t1 (null -> True) = t1 +difference t1 t2 = hedgeDiff (const LT) (const GT) t1 t2 + +hedgeDiff :: (US a, Ord a) => (a -> Ordering) -> (a -> Ordering) -> USet a -> USet a -> USet a +hedgeDiff _ _ (null -> True) _ = tip +hedgeDiff cmplo cmphi (view -> Bin _ x l r) (null -> True) = join x (filterGt cmplo l) (filterLt cmphi r) +hedgeDiff cmplo cmphi t (view -> Bin _ x l r) = merge (hedgeDiff cmplo cmpx (trim cmplo cmpx t) l) (hedgeDiff cmpx cmphi (trim cmpx cmphi t) r) + where + cmpx = compare x + +{-------------------------------------------------------------------- + Intersection +--------------------------------------------------------------------} +-- | /O(n+m)/. The intersection of two sets. +-- Elements of the result come from the first set, so for example +-- +-- > import qualified Data.Set as S +-- > data AB = A | B deriving Show +-- > instance Ord AB where compare _ _ = EQ +-- > instance Eq AB where _ == _ = True +-- > main = print (S.singleton A `S.intersection` S.singleton B, +-- > S.singleton B `S.intersection` S.singleton A) +-- +-- prints @(fromList [A],fromList [B])@. +intersection :: (US a, Ord a) => USet a -> USet a -> USet a +intersection (null -> True) _ = tip +intersection _ (null -> True) = tip +intersection t1@(view -> Bin s1 x1 l1 r1) t2@(view -> Bin s2 x2 l2 r2) = + if s1 >= s2 then + let (lt,found,gt) = splitLookup x2 t1 + tl = intersection lt l2 + tr = intersection gt r2 + in case found of + Just x -> join x tl tr + Nothing -> merge tl tr + else let (lt,found,gt) = splitMember x1 t2 + tl = intersection l1 lt + tr = intersection r1 gt + in if found then join x1 tl tr + else merge tl tr + +{-------------------------------------------------------------------- + Filter and partition +--------------------------------------------------------------------} +-- | /O(n)/. Filter all elements that satisfy the predicate. +filter :: (US a, Ord a) => (a -> Bool) -> USet a -> USet a +filter p = go where + go = viewk tip + (\_ x l r -> + if p x + then join x (go l) (go r) + else merge (go l) (go r) + ) + +-- | /O(n)/. Partition the set into two sets, one with all elements that satisfy +-- the predicate and one with all elements that don't satisfy the predicate. +-- See also 'split'. +partition :: (US a, Ord a) => (a -> Bool) -> USet a -> (USet a,USet a) +partition p = go where + go = viewk (tip,tip) + (\_ x l r -> + let + (l1,l2) = go l + (r1,r2) = go r + in if p x + then (join x l1 r1,merge l2 r2) + else (merge l1 r1,join x l2 r2) + ) + +{---------------------------------------------------------------------- + Map +----------------------------------------------------------------------} + +-- | /O(n*log n)/. +-- @'map' f s@ is the set obtained by applying @f@ to each element of @s@. +-- +-- It's worth noting that the size of the result may be smaller if, +-- for some @(x,y)@, @x \/= y && f x == f y@ + +map :: (US a, US b, Ord a, Ord b) => (a->b) -> USet a -> USet b +map f = fromList . List.map f . toList hunk ./doc/html/unboxed-containers/src/Data-Set-Unboxed.html 419 -map :: (US a, US b, Ord a, Ord b) => (a->b) -> USet a -> USet b -map f = fromList . List.map f . toList - --- | /O(n)/. The --- --- @'mapMonotonic' f s == 'map' f s@, but works only when @f@ is monotonic. --- /The precondition is not checked./ --- Semi-formally, we have: --- --- > and [x < y ==> f x < f y | x <- ls, y <- ls] --- > ==> mapMonotonic f s == map f s --- > where ls = toList s - -mapMonotonic :: (US a, US b) => (a->b) -> USet a -> USet b -mapMonotonic f (view -> Bin sz x l r) = bin sz (f x) (mapMonotonic f l) (mapMonotonic f r) -mapMonotonic _ _ = tip - - -{-------------------------------------------------------------------- - Fold ---------------------------------------------------------------------} --- | /O(n)/. Fold over the elements of a set in an unspecified order. -fold :: US a => (a -> b -> b) -> b -> USet a -> b -fold f z s = foldr f z s - --- | /O(n)/. Post-order fold. -foldr :: US a => (a -> b -> b) -> b -> USet a -> b ---foldr f z (view -> Bin _ x l r) = foldr f (f x (foldr f z r)) l ---foldr _ z _ = z +-- | /O(n)/. The +-- +-- @'mapMonotonic' f s == 'map' f s@, but works only when @f@ is monotonic. +-- /The precondition is not checked./ +-- Semi-formally, we have: +-- +-- > and [x < y ==> f x < f y | x <- ls, y <- ls] +-- > ==> mapMonotonic f s == map f s +-- > where ls = toList s + +mapMonotonic :: (US a, US b) => (a->b) -> USet a -> USet b +mapMonotonic f (view -> Bin sz x l r) = bin sz (f x) (mapMonotonic f l) (mapMonotonic f r) +mapMonotonic _ _ = tip + + +{-------------------------------------------------------------------- + Fold +--------------------------------------------------------------------} +-- | /O(n)/. Fold over the elements of a set in an unspecified order. +fold :: US a => (a -> b -> b) -> b -> USet a -> b +fold f z s = foldr f z s + +-- | /O(n)/. Post-order fold. +foldr :: US a => (a -> b -> b) -> b -> USet a -> b +--foldr f z (view -> Bin _ x l r) = foldr f (f x (foldr f z r)) l +--foldr _ z _ = z + +foldr f z x | null x = z + | (# x, l, r #) <- viewBin x = foldr f (f x (foldr f z r)) l hunk ./doc/html/unboxed-containers/src/Data-Set-Unboxed.html 449 -foldr f z x | null x = z - | (# x, l, r #) <- viewBin x = foldr f (f x (foldr f z r)) l - -{-------------------------------------------------------------------- - List variations ---------------------------------------------------------------------} --- | /O(n)/. The elements of a set. -elems :: US a => USet a -> [a] -elems x = toList x - -{-------------------------------------------------------------------- - Lists ---------------------------------------------------------------------} --- | /O(n)/. Convert the set to a list of elements. -toList :: US a => USet a -> [a] -toList x = toAscList x - --- | /O(n)/. Convert the set to an ascending list of elements. -toAscList :: US a => USet a -> [a] -toAscList = foldr (:) [] - - --- | /O(n*log n)/. Create a set from a list of elements. -fromList :: (US a, Ord a) => [a] -> USet a -fromList = foldlStrict ins empty - where - ins t x = insert x t - -{-------------------------------------------------------------------- - Building trees from ascending/descending lists can be done in linear time. - - Note that if [xs] is ascending that: - fromAscList xs == fromList xs ---------------------------------------------------------------------} --- | /O(n)/. Build a set from an ascending list in linear time. --- /The precondition (input list is ascending) is not checked./ -fromAscList :: (US a, Eq a) => [a] -> USet a -fromAscList xs - = fromDistinctAscList (combineEq xs) - where - -- [combineEq xs] combines equal elements with [const] in an ordered list [xs] - combineEq xs' - = case xs' of - [] -> [] - [x] -> [x] - (x:xx) -> combineEq' x xx - - combineEq' z [] = [z] - combineEq' z (x:xs') - | z==x = combineEq' z xs' - | otherwise = z:combineEq' x xs' - - --- | /O(n)/. Build a set from an ascending list of distinct elements in linear time. --- /The precondition (input list is strictly ascending) is not checked./ -fromDistinctAscList :: US a => [a] -> USet a -fromDistinctAscList xs - = build const (length xs) xs - where - -- 1) use continutations so that we use heap space instead of stack space. - -- 2) special case for n==5 to build bushier trees. - build c 0 xs' = c tip xs' - build c 5 xs' = case xs' of - (x1:x2:x3:x4:x5:xx) - -> c (bin_ x4 (bin_ x2 (singleton x1) (singleton x3)) (singleton x5)) xx - _ -> error "Data.Set.Unboxed.fromDistinctAscList build 5" - build c n xs' = seq nr $ build (buildR nr c) nl xs' - where - nl = n `div` 2 - nr = n - nl - 1 - - buildR n c l (x:ys) = build (buildB l x c) n ys - buildR _ _ _ [] = error "Data.Set.Unboxed.fromDistinctAscList buildR []" - buildB l x c r zs = c (bin_ x l r) zs - -{-------------------------------------------------------------------- - Eq converts the set to a list. In a lazy setting, this - actually seems one of the faster methods to compare two trees - and it is certainly the simplest :-) ---------------------------------------------------------------------} -instance (US a, Eq a) => Eq (USet a) where - t1 == t2 = (size t1 == size t2) && (toAscList t1 == toAscList t2) - -{-------------------------------------------------------------------- - Ord ---------------------------------------------------------------------} +{-------------------------------------------------------------------- + List variations +--------------------------------------------------------------------} +-- | /O(n)/. The elements of a set. +elems :: US a => USet a -> [a] +elems x = toList x + +{-------------------------------------------------------------------- + Lists +--------------------------------------------------------------------} +-- | /O(n)/. Convert the set to a list of elements. +toList :: US a => USet a -> [a] +toList x = toAscList x + +-- | /O(n)/. Convert the set to an ascending list of elements. +toAscList :: US a => USet a -> [a] +toAscList = foldr (:) [] + + +-- | /O(n*log n)/. Create a set from a list of elements. +fromList :: (US a, Ord a) => [a] -> USet a +fromList = foldlStrict ins empty + where + ins t x = insert x t + +{-------------------------------------------------------------------- + Building trees from ascending/descending lists can be done in linear time. + + Note that if [xs] is ascending that: + fromAscList xs == fromList xs +--------------------------------------------------------------------} +-- | /O(n)/. Build a set from an ascending list in linear time. +-- /The precondition (input list is ascending) is not checked./ +fromAscList :: (US a, Eq a) => [a] -> USet a +fromAscList xs + = fromDistinctAscList (combineEq xs) + where + -- [combineEq xs] combines equal elements with [const] in an ordered list [xs] + combineEq xs' + = case xs' of + [] -> [] + [x] -> [x] + (x:xx) -> combineEq' x xx + + combineEq' z [] = [z] + combineEq' z (x:xs') + | z==x = combineEq' z xs' + | otherwise = z:combineEq' x xs' + + +-- | /O(n)/. Build a set from an ascending list of distinct elements in linear time. +-- /The precondition (input list is strictly ascending) is not checked./ +fromDistinctAscList :: US a => [a] -> USet a +fromDistinctAscList xs + = build const (length xs) xs + where + -- 1) use continutations so that we use heap space instead of stack space. + -- 2) special case for n==5 to build bushier trees. + build c 0 xs' = c tip xs' + build c 5 xs' = case xs' of + (x1:x2:x3:x4:x5:xx) + -> c (bin_ x4 (bin_ x2 (singleton x1) (singleton x3)) (singleton x5)) xx + _ -> error "Data.Set.Unboxed.fromDistinctAscList build 5" + build c n xs' = seq nr $ build (buildR nr c) nl xs' + where + nl = n `div` 2 + nr = n - nl - 1 + + buildR n c l (x:ys) = build (buildB l x c) n ys + buildR _ _ _ [] = error "Data.Set.Unboxed.fromDistinctAscList buildR []" + buildB l x c r zs = c (bin_ x l r) zs + +{-------------------------------------------------------------------- + Eq converts the set to a list. In a lazy setting, this + actually seems one of the faster methods to compare two trees + and it is certainly the simplest :-) +--------------------------------------------------------------------} +instance (US a, Eq a) => Eq (USet a) where + t1 == t2 = (size t1 == size t2) && (toAscList t1 == toAscList t2) + +{-------------------------------------------------------------------- + Ord +--------------------------------------------------------------------} + +instance (US a, Ord a) => Ord (USet a) where + compare s1 s2 = compare (toAscList s1) (toAscList s2) hunk ./doc/html/unboxed-containers/src/Data-Set-Unboxed.html 536 -instance (US a, Ord a) => Ord (USet a) where - compare s1 s2 = compare (toAscList s1) (toAscList s2) - -{-------------------------------------------------------------------- - Show ---------------------------------------------------------------------} -instance (US a, Show a) => Show (USet a) where - showsPrec p xs = showParen (p > 10) $ - showString "fromList " . shows (toList xs) - -{-------------------------------------------------------------------- - Read ---------------------------------------------------------------------} -instance (US a, Read a, Ord a) => Read (USet a) where -#ifdef __GLASGOW_HASKELL__ - readPrec = parens $ prec 10 $ do - Ident "fromList" <- lexP - fromList `fmap` readPrec - - readListPrec = readListPrecDefault -#else - readsPrec p = readParen (p > 10) $ \ r -> do - ("fromList",s) <- lex r - (xs,t) <- reads s - return (fromList xs,t) -#endif - -{-------------------------------------------------------------------- - Utility functions that return sub-ranges of the original - tree. Some functions take a comparison function as argument to - allow comparisons against infinite values. A function [cmplo x] - should be read as [compare lo x]. - - [trim cmplo cmphi t] A tree that is either empty or where [cmplo x == LT] - and [cmphi x == GT] for the value [x] of the root. - [filterGt cmp t] A tree where for all values [k]. [cmp k == LT] - [filterLt cmp t] A tree where for all values [k]. [cmp k == GT] - - [split k t] Returns two trees [l] and [r] where all values - in [l] are <[k] and all keys in [r] are >[k]. - [splitMember k t] Just like [split] but also returns whether [k] - was found in the tree. ---------------------------------------------------------------------} - -{-------------------------------------------------------------------- - [trim lo hi t] trims away all subtrees that surely contain no - values between the range [lo] to [hi]. The returned tree is either - empty or the key of the root is between @lo@ and @hi@. ---------------------------------------------------------------------} -trim :: US a => (a -> Ordering) -> (a -> Ordering) -> USet a -> USet a -trim cmplo cmphi t@(view -> Bin _ x l r) - = case cmplo x of - LT -> case cmphi x of - GT -> t - _ -> trim cmplo cmphi l - _ -> trim cmplo cmphi r -trim _ _ _ = tip - -{-------------------------------------------------------------------- - [filterGt x t] filter all values >[x] from tree [t] - [filterLt x t] filter all values <[x] from tree [t] ---------------------------------------------------------------------} -filterGt :: US a => (a -> Ordering) -> USet a -> USet a -filterGt cmp (view -> Bin _ x l r) - = case cmp x of - LT -> join x (filterGt cmp l) r - GT -> filterGt cmp r - EQ -> r -filterGt _ _ = tip - -filterLt :: US a => (a -> Ordering) -> USet a -> USet a -filterLt cmp (view -> Bin _ x l r) - = case cmp x of - LT -> filterLt cmp l - GT -> join x l (filterLt cmp r) - EQ -> l -filterLt _ _ = tip - - -{-------------------------------------------------------------------- - Split ---------------------------------------------------------------------} --- | /O(log n)/. The expression (@'split' x set@) is a pair @(set1,set2)@ --- where @set1@ comprises the elements of @set@ less than @x@ and @set2@ --- comprises the elements of @set@ greater than @x@. -split :: (US a, Ord a) => a -> USet a -> (USet a,USet a) -split x (view -> Bin _ y l r) - = case compare x y of - LT -> let (lt,gt) = split x l in (lt,join y gt r) - GT -> let (lt,gt) = split x r in (join y l lt,gt) - EQ -> (l,r) -split _ _ = (tip,tip) - --- | /O(log n)/. Performs a 'split' but also returns whether the pivot --- element was found in the original set. -splitMember :: (US a, Ord a) => a -> USet a -> (USet a,Bool,USet a) -splitMember x t = let (l,m,r) = splitLookup x t in - (l,maybe False (const True) m,r) - --- | /O(log n)/. Performs a 'split' but also returns the pivot --- element that was found in the original set. -splitLookup :: (US a, Ord a) => a -> USet a -> (USet a,Maybe a,USet a) -splitLookup x (view -> Bin _ y l r) - = case compare x y of - LT -> let (lt,found,gt) = splitLookup x l in (lt,found,join y gt r) - GT -> let (lt,found,gt) = splitLookup x r in (join y l lt,found,gt) - EQ -> (l,Just y,r) -splitLookup _ _ = (tip,Nothing,tip) - -{-------------------------------------------------------------------- - Utility functions that maintain the balance properties of the tree. - All constructors assume that all values in [l] < [x] and all values - in [r] > [x], and that [l] and [r] are valid trees. - - In order of sophistication: - [Bin sz x l r] The type constructor. - [bin_ x l r] Maintains the correct size, assumes that both [l] - and [r] are balanced with respect to each other. - [balance x l r] Restores the balance and size. - Assumes that the original tree was balanced and - that [l] or [r] has changed by at most one element. - [join x l r] Restores balance and size. - - Furthermore, we can construct a new tree from two trees. Both operations - assume that all values in [l] < all values in [r] and that [l] and [r] - are valid: - [glue l r] Glues [l] and [r] together. Assumes that [l] and - [r] are already balanced with respect to each other. - [merge l r] Merges two trees and restores balance. - - Note: in contrast to Adam's paper, we use (<=) comparisons instead - of (<) comparisons in [join], [merge] and [balance]. - Quickcheck (on [difference]) showed that this was necessary in order - to maintain the invariants. It is quite unsatisfactory that I haven't - been able to find out why this is actually the case! Fortunately, it - doesn't hurt to be a bit more conservative. ---------------------------------------------------------------------} - -{-------------------------------------------------------------------- - Join ---------------------------------------------------------------------} -join :: US a => a -> USet a -> USet a -> USet a -join x (null -> True) r = insertMin x r -join x l (null -> True) = insertMax x l -join x l@(view -> Bin sizeL y ly ry) r@(view -> Bin sizeR z lz rz) - | delta*sizeL <= sizeR = balance z (join x l lz) rz - | delta*sizeR <= sizeL = balance y ly (join x ry r) - | otherwise = bin_ x l r - - --- insertMin and insertMax don't perform potentially expensive comparisons. -insertMax,insertMin :: US a => a -> USet a -> USet a -insertMax x t - = case view t of - Bin _ y l r -> balance y l (insertMax x r) - _ -> singleton x - -insertMin x t - = case view t of - Bin _ y l r -> balance y (insertMin x l) r - _ -> singleton x - -{-------------------------------------------------------------------- - [merge l r]: merges two trees. ---------------------------------------------------------------------} -merge :: US a => USet a -> USet a -> USet a -merge (null -> True) r = r -merge l (null -> True) = l -merge l@(view -> Bin sizeL x lx rx) r@(view -> Bin sizeR y ly ry) - | delta*sizeL <= sizeR = balance y (merge l ly) ry - | delta*sizeR <= sizeL = balance x lx (merge rx r) - | otherwise = glue l r - -{-------------------------------------------------------------------- - [glue l r]: glues two trees together. - Assumes that [l] and [r] are already balanced with respect to each other. ---------------------------------------------------------------------} -glue :: US a => USet a -> USet a -> USet a -glue (null -> True) r = r -glue l (null -> True) = l -glue l r - | size l > size r = let (m,l') = deleteFindMax l in balance m l' r - | otherwise = let (m,r') = deleteFindMin r in balance m l r' - - --- | /O(log n)/. Delete and find the minimal element. --- --- > deleteFindMin set = (findMin set, deleteMin set) - -deleteFindMin :: US a => USet a -> (a,USet a) -deleteFindMin t - = case view t of - Bin _ x (null -> True) r -> (x,r) - Bin _ x l r -> let (xm,l') = deleteFindMin l in (xm,balance x l' r) - Tip -> (error "Data.Set.Unboxed.deleteFindMin: can not return the minimal element of an empty set", tip) - --- | /O(log n)/. Delete and find the maximal element. --- --- > deleteFindMax set = (findMax set, deleteMax set) -deleteFindMax :: US a => USet a -> (a,USet a) -deleteFindMax t - = case view t of - Bin _ x l (null -> True) -> (x,l) - Bin _ x l r -> let (xm,r') = deleteFindMax r in (xm,balance x l r') - _ -> (error "Data.Set.Unboxed.deleteFindMax: can not return the maximal element of an empty set", tip) - --- | /O(log n)/. Retrieves the minimal key of the set, and the set --- stripped of that element, or 'Nothing' if passed an empty set. -minView :: US a => USet a -> Maybe (a, USet a) -minView (null -> True) = Nothing -minView x = Just (deleteFindMin x) - --- | /O(log n)/. Retrieves the maximal key of the set, and the set --- stripped of that element, or 'Nothing' if passed an empty set. -maxView :: US a => USet a -> Maybe (a, USet a) -maxView (null -> True) = Nothing -maxView x = Just (deleteFindMax x) - -{-------------------------------------------------------------------- - [balance x l r] balances two trees with value x. - The sizes of the trees should balance after decreasing the - size of one of them. (a rotation). - - [delta] is the maximal relative difference between the sizes of - two trees, it corresponds with the [w] in Adams' paper, - or equivalently, [1/delta] corresponds with the $\alpha$ - in Nievergelt's paper. Adams shows that [delta] should - be larger than 3.745 in order to garantee that the - rotations can always restore balance. - - [ratio] is the ratio between an outer and inner sibling of the - heavier subtree in an unbalanced setting. It determines - whether a double or single rotation should be performed - to restore balance. It is correspondes with the inverse - of $\alpha$ in Adam's article. - - Note that: - - [delta] should be larger than 4.646 with a [ratio] of 2. - - [delta] should be larger than 3.745 with a [ratio] of 1.534. - - - A lower [delta] leads to a more 'perfectly' balanced tree. - - A higher [delta] performs less rebalancing. - - - Balancing is automatic for random data and a balancing - scheme is only necessary to avoid pathological worst cases. - Almost any choice will do in practice - - - Allthough it seems that a rather large [delta] may perform better - than smaller one, measurements have shown that the smallest [delta] - of 4 is actually the fastest on a wide range of operations. It - especially improves performance on worst-case scenarios like - a sequence of ordered insertions. - - Note: in contrast to Adams' paper, we use a ratio of (at least) 2 - to decide whether a single or double rotation is needed. Allthough - he actually proves that this ratio is needed to maintain the - invariants, his implementation uses a (invalid) ratio of 1. - He is aware of the problem though since he has put a comment in his - original source code that he doesn't care about generating a - slightly inbalanced tree since it doesn't seem to matter in practice. - However (since we use quickcheck :-) we will stick to strictly balanced - trees. ---------------------------------------------------------------------} -delta,ratio :: Int -delta = 4 -ratio = 2 - - - -{-------------------------------------------------------------------- - Utilities ---------------------------------------------------------------------} -foldlStrict :: (a -> b -> a) -> a -> [b] -> a -foldlStrict f z xs - = case xs of - [] -> z - (x:xx) -> let z' = f z x in seq z' (foldlStrict f z' xx) - - -{-------------------------------------------------------------------- - Debugging ---------------------------------------------------------------------} --- | /O(n)/. Show the tree that implements the set. The tree is shown --- in a compressed, hanging format. -showTree :: (US a, Show a) => USet a -> String -showTree s - = showTreeWith True False s - - -{- | /O(n)/. The expression (@showTreeWith hang wide map@) shows - the tree that implements the set. If @hang@ is - @True@, a /hanging/ tree is shown otherwise a rotated tree is shown. If - @wide@ is 'True', an extra wide version is shown. - -> Set> putStrLn $ showTreeWith True False $ fromDistinctAscList [1..5] -> 4 -> +--2 -> | +--1 -> | +--3 -> +--5 -> -> Set> putStrLn $ showTreeWith True True $ fromDistinctAscList [1..5] -> 4 -> | -> +--2 -> | | -> | +--1 -> | | -> | +--3 -> | +{-------------------------------------------------------------------- + Show +--------------------------------------------------------------------} +instance (US a, Show a) => Show (USet a) where + showsPrec p xs = showParen (p > 10) $ + showString "fromList " . shows (toList xs) + +{-------------------------------------------------------------------- + Read +--------------------------------------------------------------------} +instance (US a, Read a, Ord a) => Read (USet a) where +#ifdef __GLASGOW_HASKELL__ + readPrec = parens $ prec 10 $ do + Ident "fromList" <- lexP + fromList `fmap` readPrec + + readListPrec = readListPrecDefault +#else + readsPrec p = readParen (p > 10) $ \ r -> do + ("fromList",s) <- lex r + (xs,t) <- reads s + return (fromList xs,t) +#endif + +{-------------------------------------------------------------------- + Utility functions that return sub-ranges of the original + tree. Some functions take a comparison function as argument to + allow comparisons against infinite values. A function [cmplo x] + should be read as [compare lo x]. + + [trim cmplo cmphi t] A tree that is either empty or where [cmplo x == LT] + and [cmphi x == GT] for the value [x] of the root. + [filterGt cmp t] A tree where for all values [k]. [cmp k == LT] + [filterLt cmp t] A tree where for all values [k]. [cmp k == GT] + + [split k t] Returns two trees [l] and [r] where all values + in [l] are <[k] and all keys in [r] are >[k]. + [splitMember k t] Just like [split] but also returns whether [k] + was found in the tree. +--------------------------------------------------------------------} + +{-------------------------------------------------------------------- + [trim lo hi t] trims away all subtrees that surely contain no + values between the range [lo] to [hi]. The returned tree is either + empty or the key of the root is between @lo@ and @hi@. +--------------------------------------------------------------------} +trim :: US a => (a -> Ordering) -> (a -> Ordering) -> USet a -> USet a +trim cmplo cmphi t@(view -> Bin _ x l r) + = case cmplo x of + LT -> case cmphi x of + GT -> t + _ -> trim cmplo cmphi l + _ -> trim cmplo cmphi r +trim _ _ _ = tip + +{-------------------------------------------------------------------- + [filterGt x t] filter all values >[x] from tree [t] + [filterLt x t] filter all values <[x] from tree [t] +--------------------------------------------------------------------} +filterGt :: US a => (a -> Ordering) -> USet a -> USet a +filterGt cmp (view -> Bin _ x l r) + = case cmp x of + LT -> join x (filterGt cmp l) r + GT -> filterGt cmp r + EQ -> r +filterGt _ _ = tip + +filterLt :: US a => (a -> Ordering) -> USet a -> USet a +filterLt cmp (view -> Bin _ x l r) + = case cmp x of + LT -> filterLt cmp l + GT -> join x l (filterLt cmp r) + EQ -> l +filterLt _ _ = tip + + +{-------------------------------------------------------------------- + Split +--------------------------------------------------------------------} +-- | /O(log n)/. The expression (@'split' x set@) is a pair @(set1,set2)@ +-- where @set1@ comprises the elements of @set@ less than @x@ and @set2@ +-- comprises the elements of @set@ greater than @x@. +split :: (US a, Ord a) => a -> USet a -> (USet a,USet a) +split x (view -> Bin _ y l r) + = case compare x y of + LT -> let (lt,gt) = split x l in (lt,join y gt r) + GT -> let (lt,gt) = split x r in (join y l lt,gt) + EQ -> (l,r) +split _ _ = (tip,tip) + +-- | /O(log n)/. Performs a 'split' but also returns whether the pivot +-- element was found in the original set. +splitMember :: (US a, Ord a) => a -> USet a -> (USet a,Bool,USet a) +splitMember x t = let (l,m,r) = splitLookup x t in + (l,maybe False (const True) m,r) + +-- | /O(log n)/. Performs a 'split' but also returns the pivot +-- element that was found in the original set. +splitLookup :: (US a, Ord a) => a -> USet a -> (USet a,Maybe a,USet a) +splitLookup x (view -> Bin _ y l r) + = case compare x y of + LT -> let (lt,found,gt) = splitLookup x l in (lt,found,join y gt r) + GT -> let (lt,found,gt) = splitLookup x r in (join y l lt,found,gt) + EQ -> (l,Just y,r) +splitLookup _ _ = (tip,Nothing,tip) + +{-------------------------------------------------------------------- + Utility functions that maintain the balance properties of the tree. + All constructors assume that all values in [l] < [x] and all values + in [r] > [x], and that [l] and [r] are valid trees. + + In order of sophistication: + [Bin sz x l r] The type constructor. + [bin_ x l r] Maintains the correct size, assumes that both [l] + and [r] are balanced with respect to each other. + [balance x l r] Restores the balance and size. + Assumes that the original tree was balanced and + that [l] or [r] has changed by at most one element. + [join x l r] Restores balance and size. + + Furthermore, we can construct a new tree from two trees. Both operations + assume that all values in [l] < all values in [r] and that [l] and [r] + are valid: + [glue l r] Glues [l] and [r] together. Assumes that [l] and + [r] are already balanced with respect to each other. + [merge l r] Merges two trees and restores balance. + + Note: in contrast to Adam's paper, we use (<=) comparisons instead + of (<) comparisons in [join], [merge] and [balance]. + Quickcheck (on [difference]) showed that this was necessary in order + to maintain the invariants. It is quite unsatisfactory that I haven't + been able to find out why this is actually the case! Fortunately, it + doesn't hurt to be a bit more conservative. +--------------------------------------------------------------------} + +{-------------------------------------------------------------------- + Join +--------------------------------------------------------------------} +join :: US a => a -> USet a -> USet a -> USet a +join x (null -> True) r = insertMin x r +join x l (null -> True) = insertMax x l +join x l@(view -> Bin sizeL y ly ry) r@(view -> Bin sizeR z lz rz) + | delta*sizeL <= sizeR = balance z (join x l lz) rz + | delta*sizeR <= sizeL = balance y ly (join x ry r) + | otherwise = bin_ x l r + + +-- insertMin and insertMax don't perform potentially expensive comparisons. +insertMax,insertMin :: US a => a -> USet a -> USet a +insertMax x t + = case view t of + Bin _ y l r -> balance y l (insertMax x r) + _ -> singleton x + +insertMin x t + = case view t of + Bin _ y l r -> balance y (insertMin x l) r + _ -> singleton x + +{-------------------------------------------------------------------- + [merge l r]: merges two trees. +--------------------------------------------------------------------} +merge :: US a => USet a -> USet a -> USet a +merge (null -> True) r = r +merge l (null -> True) = l +merge l@(view -> Bin sizeL x lx rx) r@(view -> Bin sizeR y ly ry) + | delta*sizeL <= sizeR = balance y (merge l ly) ry + | delta*sizeR <= sizeL = balance x lx (merge rx r) + | otherwise = glue l r + +{-------------------------------------------------------------------- + [glue l r]: glues two trees together. + Assumes that [l] and [r] are already balanced with respect to each other. +--------------------------------------------------------------------} +glue :: US a => USet a -> USet a -> USet a +glue (null -> True) r = r +glue l (null -> True) = l +glue l r + | size l > size r = let (m,l') = deleteFindMax l in balance m l' r + | otherwise = let (m,r') = deleteFindMin r in balance m l r' + + +-- | /O(log n)/. Delete and find the minimal element. +-- +-- > deleteFindMin set = (findMin set, deleteMin set) + +deleteFindMin :: US a => USet a -> (a,USet a) +deleteFindMin t + = case view t of + Bin _ x (null -> True) r -> (x,r) + Bin _ x l r -> let (xm,l') = deleteFindMin l in (xm,balance x l' r) + Tip -> (error "Data.Set.Unboxed.deleteFindMin: can not return the minimal element of an empty set", tip) + +-- | /O(log n)/. Delete and find the maximal element. +-- +-- > deleteFindMax set = (findMax set, deleteMax set) +deleteFindMax :: US a => USet a -> (a,USet a) +deleteFindMax t + = case view t of + Bin _ x l (null -> True) -> (x,l) + Bin _ x l r -> let (xm,r') = deleteFindMax r in (xm,balance x l r') + _ -> (error "Data.Set.Unboxed.deleteFindMax: can not return the maximal element of an empty set", tip) + +-- | /O(log n)/. Retrieves the minimal key of the set, and the set +-- stripped of that element, or 'Nothing' if passed an empty set. +minView :: US a => USet a -> Maybe (a, USet a) +minView (null -> True) = Nothing +minView x = Just (deleteFindMin x) + +-- | /O(log n)/. Retrieves the maximal key of the set, and the set +-- stripped of that element, or 'Nothing' if passed an empty set. +maxView :: US a => USet a -> Maybe (a, USet a) +maxView (null -> True) = Nothing +maxView x = Just (deleteFindMax x) + +{-------------------------------------------------------------------- + [balance x l r] balances two trees with value x. + The sizes of the trees should balance after decreasing the + size of one of them. (a rotation). + + [delta] is the maximal relative difference between the sizes of + two trees, it corresponds with the [w] in Adams' paper, + or equivalently, [1/delta] corresponds with the $\alpha$ + in Nievergelt's paper. Adams shows that [delta] should + be larger than 3.745 in order to garantee that the + rotations can always restore balance. + + [ratio] is the ratio between an outer and inner sibling of the + heavier subtree in an unbalanced setting. It determines + whether a double or single rotation should be performed + to restore balance. It is correspondes with the inverse + of $\alpha$ in Adam's article. + + Note that: + - [delta] should be larger than 4.646 with a [ratio] of 2. + - [delta] should be larger than 3.745 with a [ratio] of 1.534. + + - A lower [delta] leads to a more 'perfectly' balanced tree. + - A higher [delta] performs less rebalancing. + + - Balancing is automatic for random data and a balancing + scheme is only necessary to avoid pathological worst cases. + Almost any choice will do in practice + + - Allthough it seems that a rather large [delta] may perform better + than smaller one, measurements have shown that the smallest [delta] + of 4 is actually the fastest on a wide range of operations. It + especially improves performance on worst-case scenarios like + a sequence of ordered insertions. + + Note: in contrast to Adams' paper, we use a ratio of (at least) 2 + to decide whether a single or double rotation is needed. Allthough + he actually proves that this ratio is needed to maintain the + invariants, his implementation uses a (invalid) ratio of 1. + He is aware of the problem though since he has put a comment in his + original source code that he doesn't care about generating a + slightly inbalanced tree since it doesn't seem to matter in practice. + However (since we use quickcheck :-) we will stick to strictly balanced + trees. +--------------------------------------------------------------------} +delta,ratio :: Int +delta = 4 +ratio = 2 + + + +{-------------------------------------------------------------------- + Utilities +--------------------------------------------------------------------} +foldlStrict :: (a -> b -> a) -> a -> [b] -> a +foldlStrict f z xs + = case xs of + [] -> z + (x:xx) -> let z' = f z x in seq z' (foldlStrict f z' xx) + + +{-------------------------------------------------------------------- + Debugging +--------------------------------------------------------------------} +-- | /O(n)/. Show the tree that implements the set. The tree is shown +-- in a compressed, hanging format. +showTree :: (US a, Show a) => USet a -> String +showTree s + = showTreeWith True False s + + +{- | /O(n)/. The expression (@showTreeWith hang wide map@) shows + the tree that implements the set. If @hang@ is + @True@, a /hanging/ tree is shown otherwise a rotated tree is shown. If + @wide@ is 'True', an extra wide version is shown. + +> Set> putStrLn $ showTreeWith True False $ fromDistinctAscList [1..5] +> 4 +> +--2 +> | +--1 +> | +--3 +> +--5 +> +> Set> putStrLn $ showTreeWith True True $ fromDistinctAscList [1..5] +> 4 +> | +> +--2 +> | | +> | +--1 +> | | +> | +--3 +> | +> +--5 +> +> Set> putStrLn $ showTreeWith False True $ fromDistinctAscList [1..5] hunk ./doc/html/unboxed-containers/src/Data-Set-Unboxed.html 847 -> -> Set> putStrLn $ showTreeWith False True $ fromDistinctAscList [1..5] -> +--5 -> | -> 4 -> | -> | +--3 -> | | -> +--2 -> | -> +--1 - --} -showTreeWith :: (US a, Show a) => Bool -> Bool -> USet a -> String -showTreeWith hang wide t - | hang = (showsTreeHang wide [] t) "" - | otherwise = (showsTree wide [] [] t) "" - -showsTree :: (US a, Show a) => Bool -> [String] -> [String] -> USet a -> ShowS -showsTree wide lbars rbars t - = case view t of - Tip -> showsBars lbars . showString "|\n" - Bin _ x (null -> True) (null -> True) - -> showsBars lbars . shows x . showString "\n" - Bin _ x l r - -> showsTree wide (withBar rbars) (withEmpty rbars) r . - showWide wide rbars . - showsBars lbars . shows x . showString "\n" . - showWide wide lbars . - showsTree wide (withEmpty lbars) (withBar lbars) l - -showsTreeHang :: (US a, Show a) => Bool -> [String] -> USet a -> ShowS -showsTreeHang wide bars t - = case view t of - Tip -> showsBars bars . showString "|\n" - Bin _ x (null -> True) (null -> True) - -> showsBars bars . shows x . showString "\n" - Bin _ x l r - -> showsBars bars . shows x . showString "\n" . - showWide wide bars . - showsTreeHang wide (withBar bars) l . - showWide wide bars . - showsTreeHang wide (withEmpty bars) r - -showWide :: Bool -> [String] -> String -> String -showWide wide bars - | wide = showString (concat (reverse bars)) . showString "|\n" - | otherwise = id - -showsBars :: [String] -> ShowS -showsBars bars - = case bars of - [] -> id - _ -> showString (concat (reverse (tail bars))) . showString node +> | +> 4 +> | +> | +--3 +> | | +> +--2 +> | +> +--1 + +-} +showTreeWith :: (US a, Show a) => Bool -> Bool -> USet a -> String +showTreeWith hang wide t + | hang = (showsTreeHang wide [] t) "" + | otherwise = (showsTree wide [] [] t) "" + +showsTree :: (US a, Show a) => Bool -> [String] -> [String] -> USet a -> ShowS +showsTree wide lbars rbars t + = case view t of + Tip -> showsBars lbars . showString "|\n" + Bin _ x (null -> True) (null -> True) + -> showsBars lbars . shows x . showString "\n" + Bin _ x l r + -> showsTree wide (withBar rbars) (withEmpty rbars) r . + showWide wide rbars . + showsBars lbars . shows x . showString "\n" . + showWide wide lbars . + showsTree wide (withEmpty lbars) (withBar lbars) l + +showsTreeHang :: (US a, Show a) => Bool -> [String] -> USet a -> ShowS +showsTreeHang wide bars t + = case view t of + Tip -> showsBars bars . showString "|\n" + Bin _ x (null -> True) (null -> True) + -> showsBars bars . shows x . showString "\n" + Bin _ x l r + -> showsBars bars . shows x . showString "\n" . + showWide wide bars . + showsTreeHang wide (withBar bars) l . + showWide wide bars . + showsTreeHang wide (withEmpty bars) r + +showWide :: Bool -> [String] -> String -> String +showWide wide bars + | wide = showString (concat (reverse bars)) . showString "|\n" + | otherwise = id + +showsBars :: [String] -> ShowS +showsBars bars + = case bars of + [] -> id + _ -> showString (concat (reverse (tail bars))) . showString node + +node :: String +node = "+--" hunk ./doc/html/unboxed-containers/src/Data-Set-Unboxed.html 902 -node :: String -node = "+--" - -withBar, withEmpty :: [String] -> [String] -withBar bars = "| ":bars -withEmpty bars = " ":bars - -{-------------------------------------------------------------------- - Assertions ---------------------------------------------------------------------} --- | /O(n)/. Test if the internal set structure is valid. -valid :: (US a, Ord a) => USet a -> Bool -valid t - = balanced t && ordered t && validsize t - -ordered :: (US a, Ord a) => USet a -> Bool -ordered t - = bounded (const True) (const True) t - where - bounded lo hi t' - = case view t' of - Bin _ x l r -> (lo x) && (hi x) && bounded lo (<x) l && bounded (>x) hi r - _ -> True - -balanced :: US a => USet a -> Bool -balanced t - = case view t of - Bin _ _ l r -> (size l + size r <= 1 || (size l <= delta*size r && size r <= delta*size l)) && - balanced l && balanced r - _ -> True - -validsize :: US a => USet a -> Bool -validsize t - = (realsize t == Just (size t)) - where - realsize t' - = case view t' of - Bin sz _ l r -> case (realsize l,realsize r) of - (Just n,Just m) | n+m+1 == sz -> Just sz - _ -> Nothing - _ -> Just 0 - -{- -{-------------------------------------------------------------------- - Testing ---------------------------------------------------------------------} -testTree :: [Int] -> USet Int -testTree xs = fromList xs -test1 = testTree [1..20] -test2 = testTree [30,29..10] -test3 = testTree [1,4,6,89,2323,53,43,234,5,79,12,9,24,9,8,423,8,42,4,8,9,3] - -{-------------------------------------------------------------------- - QuickCheck ---------------------------------------------------------------------} - -{- -qcheck prop - = check config prop - where - config = Config - { configMaxTest = 500 - , configMaxFail = 5000 - , configSize = \n -> (div n 2 + 3) - , configEvery = \n args -> let s = show n in s ++ [ '\b' | _ <- s ] - } --} - - -{-------------------------------------------------------------------- - Arbitrary, reasonably balanced trees ---------------------------------------------------------------------} -instance (US a, Enum a) => Arbitrary (USet a) where - arbitrary = sized (arbtree 0 maxkey) - where maxkey = 10000 - -arbtree :: (US a, Enum a) => Int -> Int -> Int -> Gen (USet a) -arbtree lo hi n - | n <= 0 = return tip - | lo >= hi = return tip - | otherwise = do{ i <- choose (lo,hi) - ; m <- choose (1,30) - ; let (ml,mr) | m==(1::Int)= (1,2) - | m==2 = (2,1) - | m==3 = (1,1) - | otherwise = (2,2) - ; l <- arbtree lo (i-1) (n `div` ml) - ; r <- arbtree (i+1) hi (n `div` mr) - ; return (bin_ (toEnum i) l r) - } - - -{-------------------------------------------------------------------- - Valid tree's ---------------------------------------------------------------------} -forValid :: (US a, Enum a,Show a,Testable b) => (USet a -> b) -> Property -forValid f - = forAll arbitrary $ \t -> --- classify (balanced t) "balanced" $ - classify (size t == 0) "empty" $ - classify (size t > 0 && size t <= 10) "small" $ - classify (size t > 10 && size t <= 64) "medium" $ - classify (size t > 64) "large" $ - balanced t ==> f t - -forValidIntTree :: Testable a => (USet Int -> a) -> Property -forValidIntTree f - = forValid f - -forValidUnitTree :: Testable a => (USet Int -> a) -> Property -forValidUnitTree f - = forValid f - +withBar, withEmpty :: [String] -> [String] +withBar bars = "| ":bars +withEmpty bars = " ":bars + +{-------------------------------------------------------------------- + Assertions +--------------------------------------------------------------------} +-- | /O(n)/. Test if the internal set structure is valid. +valid :: (US a, Ord a) => USet a -> Bool +valid t + = balanced t && ordered t && validsize t + +ordered :: (US a, Ord a) => USet a -> Bool +ordered t + = bounded (const True) (const True) t + where + bounded lo hi t' + = case view t' of + Bin _ x l r -> (lo x) && (hi x) && bounded lo (<x) l && bounded (>x) hi r + _ -> True + +balanced :: US a => USet a -> Bool +balanced t + = case view t of + Bin _ _ l r -> (size l + size r <= 1 || (size l <= delta*size r && size r <= delta*size l)) && + balanced l && balanced r + _ -> True + +validsize :: US a => USet a -> Bool +validsize t + = (realsize t == Just (size t)) + where + realsize t' + = case view t' of + Bin sz _ l r -> case (realsize l,realsize r) of + (Just n,Just m) | n+m+1 == sz -> Just sz + _ -> Nothing + _ -> Just 0 + +{- +{-------------------------------------------------------------------- + Testing +--------------------------------------------------------------------} +testTree :: [Int] -> USet Int +testTree xs = fromList xs +test1 = testTree [1..20] +test2 = testTree [30,29..10] +test3 = testTree [1,4,6,89,2323,53,43,234,5,79,12,9,24,9,8,423,8,42,4,8,9,3] + +{-------------------------------------------------------------------- + QuickCheck +--------------------------------------------------------------------} + +{- +qcheck prop + = check config prop + where + config = Config + { configMaxTest = 500 + , configMaxFail = 5000 + , configSize = \n -> (div n 2 + 3) + , configEvery = \n args -> let s = show n in s ++ [ '\b' | _ <- s ] + } +-} + + +{-------------------------------------------------------------------- + Arbitrary, reasonably balanced trees +--------------------------------------------------------------------} +instance (US a, Enum a) => Arbitrary (USet a) where + arbitrary = sized (arbtree 0 maxkey) + where maxkey = 10000 + +arbtree :: (US a, Enum a) => Int -> Int -> Int -> Gen (USet a) +arbtree lo hi n + | n <= 0 = return tip + | lo >= hi = return tip + | otherwise = do{ i <- choose (lo,hi) + ; m <- choose (1,30) + ; let (ml,mr) | m==(1::Int)= (1,2) + | m==2 = (2,1) + | m==3 = (1,1) + | otherwise = (2,2) + ; l <- arbtree lo (i-1) (n `div` ml) + ; r <- arbtree (i+1) hi (n `div` mr) + ; return (bin_ (toEnum i) l r) + } + + +{-------------------------------------------------------------------- + Valid tree's +--------------------------------------------------------------------} +forValid :: (US a, Enum a,Show a,Testable b) => (USet a -> b) -> Property +forValid f + = forAll arbitrary $ \t -> +-- classify (balanced t) "balanced" $ + classify (size t == 0) "empty" $ + classify (size t > 0 && size t <= 10) "small" $ + classify (size t > 10 && size t <= 64) "medium" $ + classify (size t > 64) "large" $ + balanced t ==> f t + +forValidIntTree :: Testable a => (USet Int -> a) -> Property +forValidIntTree f + = forValid f + +forValidUnitTree :: Testable a => (USet Int -> a) -> Property +forValidUnitTree f + = forValid f + + +prop_Valid + = forValidUnitTree $ \t -> valid t hunk ./doc/html/unboxed-containers/src/Data-Set-Unboxed.html 1016 -prop_Valid - = forValidUnitTree $ \t -> valid t - -{-------------------------------------------------------------------- - Single, Insert, Delete ---------------------------------------------------------------------} -prop_Single :: Int -> Bool -prop_Single x - = (insert x empty == singleton x) - -prop_InsertValid :: Int -> Property -prop_InsertValid k - = forValidUnitTree $ \t -> valid (insert k t) - -prop_InsertDelete :: Int -> USet Int -> Property -prop_InsertDelete k t - = not (member k t) ==> delete k (insert k t) == t - -prop_DeleteValid :: Int -> Property -prop_DeleteValid k - = forValidUnitTree $ \t -> - valid (delete k (insert k t)) - -{-------------------------------------------------------------------- - Balance ---------------------------------------------------------------------} -prop_Join :: Int -> Property -prop_Join x - = forValidUnitTree $ \t -> - let (l,r) = split x t - in valid (join x l r) - -prop_Merge :: Int -> Property -prop_Merge x - = forValidUnitTree $ \t -> - let (l,r) = split x t - in valid (merge l r) - - -{-------------------------------------------------------------------- - Union ---------------------------------------------------------------------} -prop_UnionValid :: Property -prop_UnionValid - = forValidUnitTree $ \t1 -> - forValidUnitTree $ \t2 -> - valid (union t1 t2) - -prop_UnionInsert :: Int -> USet Int -> Bool -prop_UnionInsert x t - = union t (singleton x) == insert x t - -prop_UnionAssoc :: USet Int -> USet Int -> USet Int -> Bool -prop_UnionAssoc t1 t2 t3 - = union t1 (union t2 t3) == union (union t1 t2) t3 - -prop_UnionComm :: USet Int -> USet Int -> Bool -prop_UnionComm t1 t2 - = (union t1 t2 == union t2 t1) - - -prop_DiffValid - = forValidUnitTree $ \t1 -> - forValidUnitTree $ \t2 -> - valid (difference t1 t2) - -prop_Diff :: [Int] -> [Int] -> Bool -prop_Diff xs ys - = toAscList (difference (fromList xs) (fromList ys)) - == List.sort ((List.\\) (nub xs) (nub ys)) - -prop_IntValid - = forValidUnitTree $ \t1 -> - forValidUnitTree $ \t2 -> - valid (intersection t1 t2) - -prop_Int :: [Int] -> [Int] -> Bool -prop_Int xs ys - = toAscList (intersection (fromList xs) (fromList ys)) - == List.sort (nub ((List.intersect) (xs) (ys))) - -{-------------------------------------------------------------------- - Lists ---------------------------------------------------------------------} -prop_Ordered - = forAll (choose (5,100)) $ \n -> - let xs = [0..n::Int] - in fromAscList xs == fromList xs - -prop_List :: [Int] -> Bool -prop_List xs - = (sort (nub xs) == toList (fromList xs)) --} - --- | /O(log n)/. Insert an element in a set. --- If the set already contains an element equal to the given value, --- it is replaced with the new value. -insert :: (US a, Ord a) => a -> USet a -> USet a -insert x = go where - cmpx = compare x - go = viewk (singleton x) $ \sz y l r -> case cmpx y of - LT -> balance y (go l) r - GT -> balance y l (go r) - EQ -> bin sz x l r -{- -{-# SPECIALIZE INLINE insert :: Int -> USet Int -> USet Int #-} -{-# SPECIALIZE INLINE insert :: Integer -> USet Integer -> USet Integer #-} -{-# SPECIALIZE INLINE insert :: Char -> USet Char -> USet Char #-} -{-# SPECIALIZE INLINE insert :: Int8 -> USet Int8 -> USet Int8 #-} -{-# SPECIALIZE INLINE insert :: Int16 -> USet Int16 -> USet Int16 #-} -{-# SPECIALIZE INLINE insert :: Int32 -> USet Int32 -> USet Int32 #-} -{-# SPECIALIZE INLINE insert :: Int64 -> USet Int64 -> USet Int64 #-} -{-# SPECIALIZE INLINE insert :: Word8 -> USet Word8 -> USet Word8 #-} -{-# SPECIALIZE INLINE insert :: Word16 -> USet Word16 -> USet Word16 #-} -{-# SPECIALIZE INLINE insert :: Word32 -> USet Word32 -> USet Word32 #-} -{-# SPECIALIZE INLINE insert :: Word64 -> USet Word64 -> USet Word64 #-} -{-# SPECIALIZE INLINE insert :: Double -> USet Double -> USet Double #-} -{-# SPECIALIZE INLINE insert :: Float -> USet Float -> USet Float #-} -{-# SPECIALIZE INLINE insert :: (Int,Int)-> USet (Int,Int) -> USet (Int,Int) #-} --} - -bin_ :: US a => a -> USet a -> USet a -> USet a -bin_ x l r = bin (size l + size r + 1) x l r -{- -{-# SPECIALIZE INLINE bin_ :: Int -> USet Int -> USet Int -> USet Int #-} -{-# SPECIALIZE INLINE bin_ :: Integer -> USet Integer -> USet Integer -> USet Integer #-} -{-# SPECIALIZE INLINE bin_ :: Char -> USet Char -> USet Char -> USet Char #-} -{-# SPECIALIZE INLINE bin_ :: Int8 -> USet Int8 -> USet Int8 -> USet Int8 #-} -{-# SPECIALIZE INLINE bin_ :: Int16 -> USet Int16 -> USet Int16 -> USet Int16 #-} -{-# SPECIALIZE INLINE bin_ :: Int32 -> USet Int32 -> USet Int32 -> USet Int32 #-} -{-# SPECIALIZE INLINE bin_ :: Int64 -> USet Int64 -> USet Int64 -> USet Int64 #-} -{-# SPECIALIZE INLINE bin_ :: Word8 -> USet Word8 -> USet Word8 -> USet Word8 #-} -{-# SPECIALIZE INLINE bin_ :: Word16 -> USet Word16 -> USet Word16 -> USet Word16 #-} -{-# SPECIALIZE INLINE bin_ :: Word32 -> USet Word32 -> USet Word32 -> USet Word32 #-} -{-# SPECIALIZE INLINE bin_ :: Word64 -> USet Word64 -> USet Word64 -> USet Word64 #-} -{-# SPECIALIZE INLINE bin_ :: Double -> USet Double -> USet Double -> USet Double #-} -{-# SPECIALIZE INLINE bin_ :: Float -> USet Float -> USet Float -> USet Float #-} -{-# SPECIALIZE INLINE bin_ :: (Int,Int)-> USet (Int,Int) -> USet (Int,Int) -> USet (Int,Int) #-} --} - -newtype Boxed a = Boxed a deriving (Eq,Ord,Show,Read,Bounded) - -{-- everything below this point AUTOMATICALLY GENERATED by instances.pl. Don't edit by hand! --} - -instance US Int where - data USet Int = IntTip | IntBin {-# UNPACK #-} !Size {-# UNPACK #-} !Int !(USet Int) !(USet Int) - view IntTip = Tip - view (IntBin s i l r) = Bin s i l r - tip = IntTip - bin = IntBin - -instance US Char where - data USet Char = CharTip | CharBin {-# UNPACK #-} !Size {-# UNPACK #-} !Char !(USet Char) !(USet Char) - view CharTip = Tip - view (CharBin s i l r) = Bin s i l r - tip = CharTip - bin = CharBin - -instance US Int8 where - data USet Int8 = Int8Tip | Int8Bin {-# UNPACK #-} !Size {-# UNPACK #-} !Int8 !(USet Int8) !(USet Int8) - view Int8Tip = Tip - view (Int8Bin s i l r) = Bin s i l r - tip = Int8Tip - bin = Int8Bin - -instance US Int16 where - data USet Int16 = Int16Tip | Int16Bin {-# UNPACK #-} !Size {-# UNPACK #-} !Int16 !(USet Int16) !(USet Int16) - view Int16Tip = Tip - view (Int16Bin s i l r) = Bin s i l r - tip = Int16Tip - bin = Int16Bin - -instance US Int32 where - data USet Int32 = Int32Tip | Int32Bin {-# UNPACK #-} !Size {-# UNPACK #-} !Int32 !(USet Int32) !(USet Int32) - view Int32Tip = Tip - view (Int32Bin s i l r) = Bin s i l r - tip = Int32Tip - bin = Int32Bin - -instance US Int64 where - data USet Int64 = Int64Tip | Int64Bin {-# UNPACK #-} !Size {-# UNPACK #-} !Int64 !(USet Int64) !(USet Int64) - view Int64Tip = Tip - view (Int64Bin s i l r) = Bin s i l r - tip = Int64Tip - bin = Int64Bin - -instance US Word8 where - data USet Word8 = Word8Tip | Word8Bin {-# UNPACK #-} !Size {-# UNPACK #-} !Word8 !(USet Word8) !(USet Word8) - view Word8Tip = Tip - view (Word8Bin s i l r) = Bin s i l r - tip = Word8Tip - bin = Word8Bin - -instance US Word16 where - data USet Word16 = Word16Tip | Word16Bin {-# UNPACK #-} !Size {-# UNPACK #-} !Word16 !(USet Word16) !(USet Word16) - view Word16Tip = Tip - view (Word16Bin s i l r) = Bin s i l r - tip = Word16Tip - bin = Word16Bin - -instance US Word32 where - data USet Word32 = Word32Tip | Word32Bin {-# UNPACK #-} !Size {-# UNPACK #-} !Word32 !(USet Word32) !(USet Word32) - view Word32Tip = Tip - view (Word32Bin s i l r) = Bin s i l r - tip = Word32Tip - bin = Word32Bin - -instance US Word64 where - data USet Word64 = Word64Tip | Word64Bin {-# UNPACK #-} !Size {-# UNPACK #-} !Word64 !(USet Word64) !(USet Word64) - view Word64Tip = Tip - view (Word64Bin s i l r) = Bin s i l r - tip = Word64Tip - bin = Word64Bin - -instance US Double where - data USet Double = DoubleTip | DoubleBin {-# UNPACK #-} !Size {-# UNPACK #-} !Double !(USet Double) !(USet Double) - view DoubleTip = Tip - view (DoubleBin s i l r) = Bin s i l r - tip = DoubleTip - bin = DoubleBin - -instance US Float where - data USet Float = FloatTip | FloatBin {-# UNPACK #-} !Size {-# UNPACK #-} !Float !(USet Float) !(USet Float) - view FloatTip = Tip - view (FloatBin s i l r) = Bin s i l r - tip = FloatTip - bin = FloatBin - -instance US Integer where - data USet Integer = IntegerTip | IntegerBin {-# UNPACK #-} !Size {-# UNPACK #-} !Integer !(USet Integer) !(USet Integer) - view IntegerTip = Tip - view (IntegerBin s i l r) = Bin s i l r - tip = IntegerTip - bin = IntegerBin - -instance US (Boxed a) where - data USet (Boxed a) = BoxedTip | BoxedBin {-# UNPACK #-} !Size (Boxed a) !(USet (Boxed a)) !(USet (Boxed a)) - view BoxedTip = Tip - view (BoxedBin s i l r) = Bin s i l r - tip = BoxedTip - bin = BoxedBin - +{-------------------------------------------------------------------- + Single, Insert, Delete +--------------------------------------------------------------------} +prop_Single :: Int -> Bool +prop_Single x + = (insert x empty == singleton x) + +prop_InsertValid :: Int -> Property +prop_InsertValid k + = forValidUnitTree $ \t -> valid (insert k t) + +prop_InsertDelete :: Int -> USet Int -> Property +prop_InsertDelete k t + = not (member k t) ==> delete k (insert k t) == t + +prop_DeleteValid :: Int -> Property +prop_DeleteValid k + = forValidUnitTree $ \t -> + valid (delete k (insert k t)) + +{-------------------------------------------------------------------- + Balance +--------------------------------------------------------------------} +prop_Join :: Int -> Property +prop_Join x + = forValidUnitTree $ \t -> + let (l,r) = split x t + in valid (join x l r) + +prop_Merge :: Int -> Property +prop_Merge x + = forValidUnitTree $ \t -> + let (l,r) = split x t + in valid (merge l r) + + +{-------------------------------------------------------------------- + Union +--------------------------------------------------------------------} +prop_UnionValid :: Property +prop_UnionValid + = forValidUnitTree $ \t1 -> + forValidUnitTree $ \t2 -> + valid (union t1 t2) + +prop_UnionInsert :: Int -> USet Int -> Bool +prop_UnionInsert x t + = union t (singleton x) == insert x t + +prop_UnionAssoc :: USet Int -> USet Int -> USet Int -> Bool +prop_UnionAssoc t1 t2 t3 + = union t1 (union t2 t3) == union (union t1 t2) t3 + +prop_UnionComm :: USet Int -> USet Int -> Bool +prop_UnionComm t1 t2 + = (union t1 t2 == union t2 t1) + + +prop_DiffValid + = forValidUnitTree $ \t1 -> + forValidUnitTree $ \t2 -> + valid (difference t1 t2) + +prop_Diff :: [Int] -> [Int] -> Bool +prop_Diff xs ys + = toAscList (difference (fromList xs) (fromList ys)) + == List.sort ((List.\\) (nub xs) (nub ys)) + +prop_IntValid + = forValidUnitTree $ \t1 -> + forValidUnitTree $ \t2 -> + valid (intersection t1 t2) + +prop_Int :: [Int] -> [Int] -> Bool +prop_Int xs ys + = toAscList (intersection (fromList xs) (fromList ys)) + == List.sort (nub ((List.intersect) (xs) (ys))) + +{-------------------------------------------------------------------- + Lists +--------------------------------------------------------------------} +prop_Ordered + = forAll (choose (5,100)) $ \n -> + let xs = [0..n::Int] + in fromAscList xs == fromList xs + +prop_List :: [Int] -> Bool +prop_List xs + = (sort (nub xs) == toList (fromList xs)) +-} + +-- | /O(log n)/. Insert an element in a set. +-- If the set already contains an element equal to the given value, +-- it is replaced with the new value. +insert :: (US a, Ord a) => a -> USet a -> USet a +insert x = go where + cmpx = compare x + go = viewk (singleton x) $ \sz y l r -> case cmpx y of + LT -> balance y (go l) r + GT -> balance y l (go r) + EQ -> bin sz x l r + +bin_ :: US a => a -> USet a -> USet a -> USet a +bin_ x l r = bin (size l + size r + 1) x l r + +newtype Boxed a = Boxed { getBoxed :: a } deriving (Eq,Ord,Show,Read,Bounded) + +{-- everything below this point AUTOMATICALLY GENERATED by instances.pl. Don't edit by hand! --} + +#include "UnboxedInstances.hs" + binary ./doc/html/unboxed-containers/unboxed-containers.haddock oldhex *0d0cface00040000000000005682000000000000511b2b00000000000000000000000000000000 *000000000000000100000000000000010000000000000000000000000000000100000000000000 *020000000000000000000000000000000100000000000000030000000000000000000000000000 *000100000000000000040000000000000000000000000000000100000000000000050000000000 *000000000000000000000100000000000000060000000000000000000000000000000100000000 *000000070000000000000000000000000000000100000000000000080000000000000000000000 *0000000001000000000000000900000000000000000000000000000001000000000000000a0000 *0000000000000000000000000001000000000000000b0000000000000000000000000000000100 *0000000000000c00000000000000000000000000000001000000000000000d0000000000000000 *0000000000000001000000000000000e0000000000000000000000000000000100000000000000 *0f0000000000000000000000000000000100000000000000100000000000000000000000000000 *000100000000000000110000000000000000000000000000000100000000000000120000000000 *000000000000000000000100000000000000130000000000000000000000000000000100000000 *000000140000000000000000000000000000000100000000000000150000000000000000000000 *000000000100000000000000160000000000000000000000000000000100000000000000170000 *000000000000000000000000000100000000000000180000000000000000000000000000000100 *0000000000001900000000000000000000000000000001000000000000001a0000000000000000 *0000000000000001000000000000001b0000000000000000000000000000000100000000000000 *1c00000000000000000000000000000001000000000000001d0000000000000000000000000000 *0001000000000000001e00000000000000000000000000000001000000000000001f0000000000 *000000000000000000000100000000000000200000000000000000000000000000000100000000 *000000210000000000000000000000000000000100000000000000220000000000000000000000 *000000000100000000000000230000000000000000000000000000000100000000000000240000 *000000000000000000000000000100000000000000250000000000000000000000000000000100 *000000000000260000000000000000000000000000000100000000000000270000000000000000 *000000000000000100000000000000280000000000000000000000000000000100000000000000 *2900000000000000000000000000000001000000000000002a0000000000000000000000000000 *000101000000000000000000000000000000010000000030000000000000002b03022e00000045 *00000078000000740000007200000061000000630000007400000020000000610000006e000000 *64000000200000007200000065000000620000006f000000780000002000000074000000680000 *0065000000200000007300000070000000650000006300000069000000610000006c0000006900 *00007a0000006500000064000000200000006e0000006f00000064000000650000002000000066 *0000006f000000720000006d00000061000000740000000a000000000000002c03022c00000041 *00000070000000700000006c000000790000002000000074000000680000006500000020000000 *7600000069000000650000007700000020000000740000006f0000002000000074000000690000 *007000000020000000610000006e000000640000002000000062000000690000006e0000002000 *0000630000006f0000006e00000074000000690000006e00000075000000610000007400000069 *0000006f0000006e000000730000000a000000000000002d030236000000560000006900000065 *00000077000000200000006a000000750000007300000074000000200000007400000068000000 *650000002000000076000000610000006c000000750000006500000020000000610000006e0000 *0064000000200000006c00000065000000660000007400000020000000610000006e0000006400 *000020000000720000006900000067000000680000007400000020000000630000006800000069 *0000006c00000064000000200000006f0000006600000020000000610000002000000062000000 *690000006e0000000a000000000000000403010602040000004f00000028000000310000002902 *250000002e00000020000000540000006800000065000000200000006e000000750000006d0000 *00620000006500000072000000200000006f0000006600000020000000650000006c0000006500 *00006d000000650000006e000000740000007300000020000000690000006e0000002000000074 *0000006800000065000000200000007300000065000000740000002e0000000a00000000000000 *0503010602040000004f00000028000000310000002902190000002e0000002000000049000000 *730000002000000074000000680000006900000073000000200000007400000068000000650000 *0020000000650000006d0000007000000074000000790000002000000073000000650000007400 *00003f0000000a000000000000002e030216000000530000006d00000061000000720000007400 *00002000000074000000690000007000000020000000630000006f0000006e0000007300000074 *000000720000007500000063000000740000006f000000720000000a000000000000002f030216 *000000530000006d0000006100000072000000740000002000000062000000690000006e000000 *20000000630000006f0000006e0000007300000074000000720000007500000063000000740000 *006f000000720000000a000000000000003003021100000042000000610000006c000000610000 *006e00000063000000650000002000000074000000680000006500000020000000740000007200 *000065000000650000000a00000000000000310301021000000041000000200000007300000065 *00000074000000200000006f000000660000002000000076000000610000006c00000075000000 *650000007300000020010702010000006102020000002e0000000a000000000000000603010602 *060000004f000000280000006e0000002b0000006d000000290102060000002e00000020000000 *530000006500000065000000200104010000000000000000140000000000000000000000000000 *000102020000002e0000000a000000000000000703010602080000004f000000280000006c0000 *006f00000067000000200000006e00000029021d0000002e000000200000004900000073000000 *2000000074000000680000006500000020000000650000006c000000650000006d000000650000 *006e0000007400000020000000690000006e000000200000007400000068000000650000002000 *00007300000065000000740000003f0000000a000000000000000803010602080000004f000000 *280000006c0000006f00000067000000200000006e0000002902210000002e0000002000000049 *000000730000002000000074000000680000006500000020000000650000006c00000065000000 *6d000000650000006e00000074000000200000006e0000006f0000007400000020000000690000 *006e00000020000000740000006800000065000000200000007300000065000000740000003f00 *00000a000000000000000903010602040000004f00000028000000310000002902110000002e00 *00002000000054000000680000006500000020000000650000006d000000700000007400000079 *000000200000007300000065000000740000002e0000000a000000000000000a03010602040000 *004f000000280000003100000029021a0000002e00000020000000430000007200000065000000 *61000000740000006500000020000000610000002000000073000000690000006e000000670000 *006c00000065000000740000006f0000006e000000200000007300000065000000740000002e00 *00000a000000000000000b03010602080000004f000000280000006c0000006f00000067000000 *200000006e0000002902200000002e0000002000000044000000650000006c0000006500000074 *0000006500000020000000610000006e00000020000000650000006c000000650000006d000000 *650000006e000000740000002000000066000000720000006f0000006d00000020000000610000 *00200000007300000065000000740000002e0000000a000000000000000c03010602060000004f *000000280000006e0000002b0000006d0000002902390000002e00000020000000490000007300 *000020000000740000006800000069000000730000002000000061000000200000007000000072 *0000006f0000007000000065000000720000002000000073000000750000006200000073000000 *65000000740000003f000000200000002800000069000000650000002e00000020000000610000 *002000000073000000750000006200000073000000650000007400000020000000620000007500 *000074000000200000006e0000006f000000740000002000000065000000710000007500000061 *0000006c000000290000002e0000000a000000000000000d03010602060000004f000000280000 *006e0000002b0000006d000000290102140000002e000000200000004900000073000000200000 *007400000068000000690000007300000020000000610000002000000073000000750000006200 *00007300000065000000740000003f0000000a0102010000002001070102040000002800000073 *000000310000002001040100000000000000000d00000000000000000000000000000001020400 *00002000000073000000320000002901020f0000002000000074000000650000006c0000006c00 *000073000000200000007700000068000000650000007400000068000000650000007200000020 *010702020000007300000031010210000000200000006900000073000000200000006100000020 *000000730000007500000062000000730000006500000074000000200000006f00000066000000 *2001070202000000730000003202020000002e0000000a000000000000000e0301060208000000 *4f000000280000006c0000006f00000067000000200000006e0000002902200000002e00000020 *000000540000006800000065000000200000006d000000690000006e000000690000006d000000 *610000006c00000020000000650000006c000000650000006d000000650000006e000000740000 *00200000006f000000660000002000000061000000200000007300000065000000740000002e00 *00000a000000000000000f03010602080000004f000000280000006c0000006f00000067000000 *200000006e0000002902200000002e00000020000000540000006800000065000000200000006d *0000006100000078000000690000006d000000610000006c00000020000000650000006c000000 *650000006d000000650000006e00000074000000200000006f0000006600000020000000610000 *00200000007300000065000000740000002e0000000a000000000000001003010602080000004f *000000280000006c0000006f00000067000000200000006e00000029021e0000002e0000002000 *000044000000650000006c00000065000000740000006500000020000000740000006800000065 *000000200000006d000000690000006e000000690000006d000000610000006c00000020000000 *650000006c000000650000006d000000650000006e000000740000002e0000000a000000000000 *001103010602080000004f000000280000006c0000006f00000067000000200000006e00000029 *021e0000002e0000002000000044000000650000006c0000006500000074000000650000002000 *0000740000006800000065000000200000006d0000006100000078000000690000006d00000061 *0000006c00000020000000650000006c000000650000006d000000650000006e00000074000000 *2e0000000a00000000000000120301021e00000054000000680000006500000020000000750000 *006e000000690000006f0000006e000000200000006f0000006600000020000000610000002000 *00006c000000690000007300000074000000200000006f00000066000000200000007300000065 *00000074000000730000003a000000200000002801070104010000000000000000120000000000 *0000000000000000000001010204000000200000003d0000003d00000020010401000000000000 *000032000000000000000200000000000000030102010000002001040100000000000000001300 *000000000000000000000000000001010201000000200401000000000000000009000000000000 *000000000000000000010203000000290000002e0000000a000000000000001303010602060000 *004f000000280000006e0000002b0000006d000000290102370000002e00000020000000540000 *00680000006500000020000000750000006e000000690000006f0000006e000000200000006f00 *0000660000002000000074000000770000006f0000002000000073000000650000007400000073 *0000002c0000002000000070000000720000006500000066000000650000007200000072000000 *690000006e00000067000000200000007400000068000000650000002000000066000000690000 *007200000073000000740000002000000073000000650000007400000020000000770000006800 *0000650000006e0000000a01022100000020000000650000007100000075000000610000006c00 *000020000000650000006c000000650000006d000000650000006e000000740000007300000020 *00000061000000720000006500000020000000650000006e000000630000006f00000075000000 *6e00000074000000650000007200000065000000640000002e0000000a01022700000020000000 *54000000680000006500000020000000690000006d000000700000006c000000650000006d0000 *00650000006e000000740000006100000074000000690000006f0000006e000000200000007500 *000073000000650000007300000020000000740000006800000065000000200000006500000066 *00000066000000690000006300000069000000650000006e00000074000000200106020b000000 *68000000650000006400000067000000650000002d000000750000006e000000690000006f0000 *006e01020c00000020000000610000006c000000670000006f0000007200000069000000740000 *00680000006d0000002e0000000a01022a00000020000000480000006500000064000000670000 *00650000002d000000750000006e000000690000006f0000006e00000020000000690000007300 *0000200000006d0000006f00000072000000650000002000000065000000660000006600000069 *0000006300000069000000650000006e00000074000000200000006f0000006e00000020000000 *280000006200000069000000670000007300000065000000740000002001040100000000000000 *001300000000000000000000000000000001020c00000020000000730000006d00000061000000 *6c0000006c000000730000006500000074000000290000002e0000000a00000000000000140301 *0602060000004f000000280000006e0000002b0000006d0000002901021b0000002e0000002000 *0000440000006900000066000000660000006500000072000000650000006e0000006300000065 *000000200000006f000000660000002000000074000000770000006f0000002000000073000000 *6500000074000000730000002e000000200000000a010226000000200000005400000068000000 *6500000020000000690000006d000000700000006c000000650000006d000000650000006e0000 *00740000006100000074000000690000006f0000006e0000002000000075000000730000006500 *00007300000020000000610000006e000000200000006500000066000000660000006900000063 *00000069000000650000006e000000740000002001060205000000680000006500000064000000 *670000006501021b00000020000000610000006c000000670000006f0000007200000069000000 *74000000680000006d00000020000000630000006f0000006d0000007000000061000000720000 *0061000000620000006c0000006500000020000000770000006900000074000000680000002001 *06020b00000068000000650000006400000067000000650000002d000000750000006e00000069 *0000006f0000006e02020000002e0000000a00000000000000150103010602060000004f000000 *280000006e0000002b0000006d000000290102200000002e000000200000005400000068000000 *6500000020000000690000006e0000007400000065000000720000007300000065000000630000 *0074000000690000006f0000006e000000200000006f0000006600000020000000740000007700 *00006f00000020000000730000006500000074000000730000002e0000000a0240000000200000 *00450000006c000000650000006d000000650000006e0000007400000073000000200000006f00 *000066000000200000007400000068000000650000002000000072000000650000007300000075 *0000006c0000007400000020000000630000006f0000006d000000650000002000000066000000 *720000006f0000006d000000200000007400000068000000650000002000000066000000690000 *00720000007300000074000000200000007300000065000000740000002c000000200000007300 *00006f00000020000000660000006f00000072000000200000006500000078000000610000006d *000000700000006c000000650000000a010b01022000000020000000690000006d000000700000 *006f0000007200000074000000200000007100000075000000610000006c000000690000006600 *000069000000650000006400000020000000440000006100000074000000610000002e00000053 *000000650000007400000020000000610000007300000020000000530000000a01021f00000020 *00000064000000610000007400000061000000200000004100000042000000200000003d000000 *2000000041000000200000007c0000002000000042000000200000006400000065000000720000 *006900000076000000690000006e000000670000002000000053000000680000006f0000007700 *00000a01022800000020000000690000006e0000007300000074000000610000006e0000006300 *000065000000200000004f00000072000000640000002000000041000000420000002000000077 *0000006800000065000000720000006500000020000000630000006f0000006d00000070000000 *610000007200000065000000200000005f000000200000005f000000200000003d000000200000 *0045000000510000000a01022400000020000000690000006e0000007300000074000000610000 *006e00000063000000650000002000000045000000710000002000000041000000420000002000 *00007700000068000000650000007200000065000000200000005f000000200000003d0000003d *000000200000005f000000200000003d0000002000000054000000720000007500000065000000 *0a01023d000000200000006d00000061000000690000006e000000200000003d00000020000000 *7000000072000000690000006e000000740000002000000028000000530000002e000000730000 *00690000006e000000670000006c00000065000000740000006f0000006e000000200000004100 *00002000000060000000530000002e000000690000006e00000074000000650000007200000073 *000000650000006300000074000000690000006f0000006e000000600000002000000053000000 *2e00000073000000690000006e000000670000006c00000065000000740000006f0000006e0000 *0020000000420000002c0000000a023d0000002000000020000000200000002000000020000000 *200000002000000020000000200000002000000020000000200000002000000020000000200000 *00530000002e00000073000000690000006e000000670000006c00000065000000740000006f00 *00006e00000020000000420000002000000060000000530000002e000000690000006e00000074 *000000650000007200000073000000650000006300000074000000690000006f0000006e000000 *6000000020000000530000002e00000073000000690000006e000000670000006c000000650000 *00740000006f0000006e0000002000000041000000290000000a03010207000000700000007200 *0000690000006e000000740000007300000020010701020c000000280000006600000072000000 *6f0000006d0000004c000000690000007300000074000000200000005b00000041010201000000 *5d01020c0000002c00000066000000720000006f0000006d0000004c0000006900000073000000 *74000000200000005b000000420102010000005d02010000002902020000002e0000000a000000 *000000001603010602040000004f000000280000006e0000002902320000002e00000020000000 *46000000690000006c00000074000000650000007200000020000000610000006c0000006c0000 *0020000000650000006c000000650000006d000000650000006e00000074000000730000002000 *000074000000680000006100000074000000200000007300000061000000740000006900000073 *000000660000007900000020000000740000006800000065000000200000007000000072000000 *650000006400000069000000630000006100000074000000650000002e0000000a000000000000 *001703010602040000004f000000280000006e000000290102460000002e000000200000005000 *00006100000072000000740000006900000074000000690000006f0000006e0000002000000074 *00000068000000650000002000000073000000650000007400000020000000690000006e000000 *740000006f0000002000000074000000770000006f000000200000007300000065000000740000 *00730000002c000000200000006f0000006e000000650000002000000077000000690000007400 *00006800000020000000610000006c0000006c00000020000000650000006c000000650000006d *000000650000006e00000074000000730000002000000074000000680000006100000074000000 *20000000730000006100000074000000690000007300000066000000790000000a010231000000 *200000007400000068000000650000002000000070000000720000006500000064000000690000 *006300000061000000740000006500000020000000610000006e00000064000000200000006f00 *00006e00000065000000200000007700000069000000740000006800000020000000610000006c *0000006c00000020000000650000006c000000650000006d000000650000006e00000074000000 *73000000200000007400000068000000610000007400000020000000640000006f0000006e0102 *010000002701021900000074000000200000007300000061000000740000006900000073000000 *660000007900000020000000740000006800000065000000200000007000000072000000650000 *006400000069000000630000006100000074000000650000002e0000000a01020a000000200000 *0053000000650000006500000020000000610000006c000000730000006f000000200104010000 *000000000000210000000000000000000000000000000102020000002e0000000a000000000000 *001801030106020a0000004f000000280000006e0000002a0000006c0000006f00000067000000 *200000006e000000290102030000002e000000200000000a010201000000200107010401000000 *000000000018000000000000000000000000000000010204000000200000006600000020000000 *730102210000002000000069000000730000002000000074000000680000006500000020000000 *730000006500000074000000200000006f000000620000007400000061000000690000006e0000 *006500000064000000200000006200000079000000200000006100000070000000700000006c00 *000079000000690000006e00000067000000200107020100000066010214000000200000007400 *00006f000000200000006500000061000000630000006800000020000000650000006c00000065 *0000006d000000650000006e00000074000000200000006f000000660000002001070201000000 *7302020000002e0000000a0301020200000049000000740102010000002701023e000000730000 *0020000000770000006f000000720000007400000068000000200000006e0000006f0000007400 *0000690000006e0000006700000020000000740000006800000061000000740000002000000074 *00000068000000650000002000000073000000690000007a00000065000000200000006f000000 *660000002000000074000000680000006500000020000000720000006500000073000000750000 *006c00000074000000200000006d00000061000000790000002000000062000000650000002000 *0000730000006d000000610000006c0000006c0000006500000072000000200000006900000066 *0000002c0000000a01020a00000020000000660000006f0000007200000020000000730000006f *0000006d00000065000000200107020500000028000000780000002c0000007900000029010202 *0000002c00000020010701020200000078000000200102010000002f0102040000003d00000020 *00000079000000200102010000002601020100000026020b000000200000006600000020000000 *78000000200000003d0000003d0000002000000066000000200000007902010000000a00000000 *000000190103010602040000004f000000280000006e0000002902070000002e00000020000000 *540000006800000065000000200000000a01030107010401000000000000000019000000000000 *0000000000000000000101020800000020000000660000002000000073000000200000003d0000 *003d00000020010401000000000000000018000000000000000000000000000000010204000000 *200000006600000020000000730102160000002c00000020000000620000007500000074000000 *20000000770000006f000000720000006b00000073000000200000006f0000006e0000006c0000 *0079000000200000007700000068000000650000006e00000020010702010000006601020f0000 *00200000006900000073000000200000006d0000006f0000006e0000006f000000740000006f00 *00006e00000069000000630000002e0000000a0102010000002001060220000000540000006800 *00006500000020000000700000007200000065000000630000006f0000006e0000006400000069 *00000074000000690000006f0000006e000000200000006900000073000000200000006e000000 *6f0000007400000020000000630000006800000065000000630000006b00000065000000640000 *002e0102010000000a02190000002000000053000000650000006d000000690000002d00000066 *0000006f000000720000006d000000610000006c0000006c000000790000002c00000020000000 *770000006500000020000000680000006100000076000000650000003a0000000a0b01022f0000 *0020000000610000006e00000064000000200000005b00000078000000200000003c0000002000 *000079000000200000003d0000003d0000003e0000002000000066000000200000007800000020 *0000003c00000020000000660000002000000079000000200000007c0000002000000078000000 *200000003c0000002d000000200000006c000000730000002c0000002000000079000000200000 *003c0000002d000000200000006c000000730000005d000000200000000a010235000000200000 *002000000020000000200000002000000020000000200000002000000020000000200000002000 *000020000000200000002000000020000000200000002000000020000000200000002000000020 *0000003d0000003d0000003e000000200000006d00000061000000700000004d0000006f000000 *6e0000006f000000740000006f0000006e00000069000000630000002000000066000000200000 *0073000000200000003d0000003d000000200000006d0000006100000070000000200000006600 *000020000000730000000a02190000002000000020000000200000002000000020000000770000 *0068000000650000007200000065000000200000006c00000073000000200000003d0000002000 *0000740000006f0000004c00000069000000730000007400000020000000730000000a00000000 *0000001a03010602040000004f000000280000006e00000029023b0000002e0000002000000046 *0000006f0000006c00000064000000200000006f00000076000000650000007200000020000000 *74000000680000006500000020000000650000006c000000650000006d000000650000006e0000 *007400000073000000200000006f00000066000000200000006100000020000000730000006500 *00007400000020000000690000006e00000020000000610000006e00000020000000750000006e *000000730000007000000065000000630000006900000066000000690000006500000064000000 *200000006f000000720000006400000065000000720000002e0000000a00000000000000330301 *0602040000004f000000280000006e0000002902130000002e00000020000000500000006f0000 *0073000000740000002d0000006f00000072000000640000006500000072000000200000006600 *00006f0000006c000000640000002e0000000a000000000000001b03010602040000004f000000 *280000006e0000002902190000002e000000200000005400000068000000650000002000000065 *0000006c000000650000006d000000650000006e0000007400000073000000200000006f000000 *660000002000000061000000200000007300000065000000740000002e0000000a000000000000 *001c03010602040000004f000000280000006e0000002902290000002e00000020000000430000 *006f0000006e000000760000006500000072000000740000002000000074000000680000006500 *00002000000073000000650000007400000020000000740000006f000000200000006100000020 *0000006c000000690000007300000074000000200000006f000000660000002000000065000000 *6c000000650000006d000000650000006e00000074000000730000002e0000000a000000000000 *001d03010602040000004f000000280000006e0000002902340000002e00000020000000430000 *006f0000006e000000760000006500000072000000740000002000000074000000680000006500 *00002000000073000000650000007400000020000000740000006f00000020000000610000006e *00000020000000610000007300000063000000650000006e00000064000000690000006e000000 *67000000200000006c000000690000007300000074000000200000006f00000066000000200000 *00650000006c000000650000006d000000650000006e00000074000000730000002e0000000a00 *0000000000001e030106020a0000004f000000280000006e0000002a0000006c0000006f000000 *67000000200000006e0000002902280000002e0000002000000043000000720000006500000061 *000000740000006500000020000000610000002000000073000000650000007400000020000000 *66000000720000006f0000006d0000002000000061000000200000006c00000069000000730000 *0074000000200000006f0000006600000020000000650000006c000000650000006d0000006500 *00006e00000074000000730000002e0000000a000000000000001f03010602040000004f000000 *280000006e000000290102350000002e000000200000004200000075000000690000006c000000 *640000002000000061000000200000007300000065000000740000002000000066000000720000 *006f0000006d00000020000000610000006e000000200000006100000073000000630000006500 *00006e00000064000000690000006e00000067000000200000006c000000690000007300000074 *00000020000000690000006e000000200000006c000000690000006e0000006500000061000000 *720000002000000074000000690000006d000000650000002e0000000a01020100000020010602 *3a00000054000000680000006500000020000000700000007200000065000000630000006f0000 *006e000000640000006900000074000000690000006f0000006e00000020000000280000006900 *00006e000000700000007500000074000000200000006c00000069000000730000007400000020 *000000690000007300000020000000610000007300000063000000650000006e00000064000000 *690000006e0000006700000029000000200000006900000073000000200000006e0000006f0000 *007400000020000000630000006800000065000000630000006b00000065000000640000002e02 *010000000a000000000000002003010602040000004f000000280000006e0000002901024a0000 *002e000000200000004200000075000000690000006c0000006400000020000000610000002000 *00007300000065000000740000002000000066000000720000006f0000006d0000002000000061 *0000006e00000020000000610000007300000063000000650000006e0000006400000069000000 *6e00000067000000200000006c000000690000007300000074000000200000006f000000660000 *002000000064000000690000007300000074000000690000006e00000063000000740000002000 *0000650000006c000000650000006d000000650000006e00000074000000730000002000000069 *0000006e000000200000006c000000690000006e00000065000000610000007200000020000000 *74000000690000006d000000650000002e0000000a010201000000200106024300000054000000 *680000006500000020000000700000007200000065000000630000006f0000006e000000640000 *006900000074000000690000006f0000006e0000002000000028000000690000006e0000007000 *00007500000074000000200000006c000000690000007300000074000000200000006900000073 *000000200000007300000074000000720000006900000063000000740000006c00000079000000 *20000000610000007300000063000000650000006e00000064000000690000006e000000670000 *0029000000200000006900000073000000200000006e0000006f00000074000000200000006300 *00006800000065000000630000006b00000065000000640000002e02010000000a000000000000 *002103010602080000004f000000280000006c0000006f00000067000000200000006e00000029 *0102120000002e0000002000000054000000680000006500000020000000650000007800000070 *00000072000000650000007300000073000000690000006f0000006e0000002000000028010701 *040100000000000000002100000000000000000000000000000001020600000020000000780000 *002000000073000000650000007401020c00000029000000200000006900000073000000200000 *00610000002000000070000000610000006900000072000000200107020b000000280000007300 *00006500000074000000310000002c000000730000006500000074000000320000002901020100 *00000a010207000000200000007700000068000000650000007200000065000000200107020400 *00007300000065000000740000003101021b00000020000000630000006f0000006d0000007000 *000072000000690000007300000065000000730000002000000074000000680000006500000020 *000000650000006c000000650000006d000000650000006e000000740000007300000020000000 *6f00000066000000200107020300000073000000650000007401020b000000200000006c000000 *650000007300000073000000200000007400000068000000610000006e00000020010702010000 *007801020500000020000000610000006e00000064000000200107020400000073000000650000 *0074000000320102010000000a01021b00000020000000630000006f0000006d00000070000000 *720000006900000073000000650000007300000020000000740000006800000065000000200000 *00650000006c000000650000006d000000650000006e0000007400000073000000200000006f00 *000066000000200107020300000073000000650000007401020e00000020000000670000007200 *00006500000061000000740000006500000072000000200000007400000068000000610000006e *00000020010702010000007802020000002e0000000a000000000000002203010602080000004f *000000280000006c0000006f00000067000000200000006e0000002901020d0000002e00000020 *000000500000006500000072000000660000006f000000720000006d0000007300000020000000 *610000002001040100000000000000002100000000000000000000000000000001010224000000 *2000000062000000750000007400000020000000610000006c000000730000006f000000200000 *0072000000650000007400000075000000720000006e0000007300000020000000770000006800 *000065000000740000006800000065000000720000002000000074000000680000006500000020 *0000007000000069000000760000006f000000740000000a022800000020000000650000006c00 *0000650000006d000000650000006e000000740000002000000077000000610000007300000020 *000000660000006f000000750000006e0000006400000020000000690000006e00000020000000 *740000006800000065000000200000006f000000720000006900000067000000690000006e0000 *00610000006c000000200000007300000065000000740000002e0000000a000000000000003403 *010602080000004f000000280000006c0000006f00000067000000200000006e0000002901020d *0000002e00000020000000500000006500000072000000660000006f000000720000006d000000 *730000002000000061000000200104010000000000000000210000000000000000000000000000 *000101021c0000002000000062000000750000007400000020000000610000006c000000730000 *006f0000002000000072000000650000007400000075000000720000006e000000730000002000 *0000740000006800000065000000200000007000000069000000760000006f000000740000000a *022d00000020000000650000006c000000650000006d000000650000006e000000740000002000 *000074000000680000006100000074000000200000007700000061000000730000002000000066 *0000006f000000750000006e0000006400000020000000690000006e0000002000000074000000 *6800000065000000200000006f000000720000006900000067000000690000006e000000610000 *006c000000200000007300000065000000740000002e0000000a00000000000000230103010602 *080000004f000000280000006c0000006f00000067000000200000006e0000002902270000002e *0000002000000044000000650000006c0000006500000074000000650000002000000061000000 *6e000000640000002000000066000000690000006e000000640000002000000074000000680000 *0065000000200000006d000000690000006e000000690000006d000000610000006c0000002000 *0000650000006c000000650000006d000000650000006e000000740000002e0000000a0b023200 *00002000000064000000650000006c00000065000000740000006500000046000000690000006e *000000640000004d000000690000006e0000002000000073000000650000007400000020000000 *3d000000200000002800000066000000690000006e000000640000004d000000690000006e0000 *00200000007300000065000000740000002c0000002000000064000000650000006c0000006500 *000074000000650000004d000000690000006e0000002000000073000000650000007400000029 *0000000a00000000000000240103010602080000004f000000280000006c0000006f0000006700 *0000200000006e0000002902270000002e0000002000000044000000650000006c000000650000 *00740000006500000020000000610000006e000000640000002000000066000000690000006e00 *00006400000020000000740000006800000065000000200000006d000000610000007800000069 *0000006d000000610000006c00000020000000650000006c000000650000006d00000065000000 *6e000000740000002e0000000a0b02320000002000000064000000650000006c00000065000000 *740000006500000046000000690000006e000000640000004d0000006100000078000000200000 *00730000006500000074000000200000003d000000200000002800000066000000690000006e00 *0000640000004d0000006100000078000000200000007300000065000000740000002c00000020 *00000064000000650000006c0000006500000074000000650000004d0000006100000078000000 *20000000730000006500000074000000290000000a000000000000002503010602080000004f00 *0000280000006c0000006f00000067000000200000006e000000290102340000002e0000002000 *000052000000650000007400000072000000690000006500000076000000650000007300000020 *000000740000006800000065000000200000006d000000690000006e000000690000006d000000 *610000006c000000200000006b0000006500000079000000200000006f00000066000000200000 *00740000006800000065000000200000007300000065000000740000002c000000200000006100 *00006e000000640000002000000074000000680000006500000020000000730000006500000074 *0000000a01021e0000002000000073000000740000007200000069000000700000007000000065 *00000064000000200000006f000000660000002000000074000000680000006100000074000000 *20000000650000006c000000650000006d000000650000006e000000740000002c000000200000 *006f00000072000000200104010000000000000000350000000000000002000000000000000402 *190000002000000069000000660000002000000070000000610000007300000073000000650000 *006400000020000000610000006e00000020000000650000006d00000070000000740000007900 *0000200000007300000065000000740000002e0000000a00000000000000260301060208000000 *4f000000280000006c0000006f00000067000000200000006e000000290102340000002e000000 *200000005200000065000000740000007200000069000000650000007600000065000000730000 *0020000000740000006800000065000000200000006d0000006100000078000000690000006d00 *0000610000006c000000200000006b0000006500000079000000200000006f0000006600000020 *000000740000006800000065000000200000007300000065000000740000002c00000020000000 *610000006e00000064000000200000007400000068000000650000002000000073000000650000 *00740000000a01021e000000200000007300000074000000720000006900000070000000700000 *006500000064000000200000006f00000066000000200000007400000068000000610000007400 *000020000000650000006c000000650000006d000000650000006e000000740000002c00000020 *0000006f0000007200000020010401000000000000000035000000000000000200000000000000 *040219000000200000006900000066000000200000007000000061000000730000007300000065 *0000006400000020000000610000006e00000020000000650000006d0000007000000074000000 *79000000200000007300000065000000740000002e0000000a0000000000000027030106020400 *00004f000000280000006e0000002901023b0000002e0000002000000053000000680000006f00 *000077000000200000007400000068000000650000002000000074000000720000006500000065 *000000200000007400000068000000610000007400000020000000690000006d00000070000000 *6c000000650000006d000000650000006e00000074000000730000002000000074000000680000 *0065000000200000007300000065000000740000002e0000002000000054000000680000006500 *000020000000740000007200000065000000650000002000000069000000730000002000000073 *000000680000006f000000770000006e0000000a022200000020000000690000006e0000002000 *00006100000020000000630000006f0000006d0000007000000072000000650000007300000073 *00000065000000640000002c0000002000000068000000610000006e0000006700000069000000 *6e0000006700000020000000660000006f000000720000006d00000061000000740000002e0000 *000a00000000000000280103010602040000004f000000280000006e000000290102120000002e *000000200000005400000068000000650000002000000065000000780000007000000072000000 *650000007300000073000000690000006f0000006e00000020000000280107021a000000730000 *00680000006f000000770000005400000072000000650000006500000057000000690000007400 *0000680000002000000068000000610000006e0000006700000020000000770000006900000064 *00000065000000200000006d000000610000007001020800000029000000200000007300000068 *0000006f00000077000000730000000a0102260000002000000074000000680000006500000020 *000000740000007200000065000000650000002000000074000000680000006100000074000000 *20000000690000006d000000700000006c000000650000006d000000650000006e000000740000 *007300000020000000740000006800000065000000200000007300000065000000740000002e00 *0000200000004900000066000000200107020400000068000000610000006e0000006701020400 *00002000000069000000730000000a010201000000200107020400000054000000720000007500 *0000650102040000002c0000002000000061000000200106020700000068000000610000006e00 *000067000000690000006e00000067010235000000200000007400000072000000650000006500 *00002000000069000000730000002000000073000000680000006f000000770000006e00000020 *0000006f0000007400000068000000650000007200000077000000690000007300000065000000 *200000006100000020000000720000006f00000074000000610000007400000065000000640000 *002000000074000000720000006500000065000000200000006900000073000000200000007300 *0000680000006f000000770000006e0000002e0000002000000049000000660000000a01020100 *000020010702040000007700000069000000640000006501020400000020000000690000007300 *0000200104010000000000000000360000000000000005000000000000000602220000002c0000 *0020000000610000006e0000002000000065000000780000007400000072000000610000002000 *000077000000690000006400000065000000200000007600000065000000720000007300000069 *0000006f0000006e0000002000000069000000730000002000000073000000680000006f000000 *770000006e0000002e0000000a0b010246000000200000005300000065000000740000003e0000 *00200000007000000075000000740000005300000074000000720000004c0000006e0000002000 *0000240000002000000073000000680000006f0000007700000054000000720000006500000065 *000000570000006900000074000000680000002000000054000000720000007500000065000000 *2000000046000000610000006c0000007300000065000000200000002400000020000000660000 *00720000006f0000006d00000044000000690000007300000074000000690000006e0000006300 *0000740000004100000073000000630000004c000000690000007300000074000000200000005b *000000310000002e0000002e000000350000005d0000000a01020300000020000000340000000a *010206000000200000002b0000002d0000002d000000320000000a010209000000200000007c00 *000020000000200000002b0000002d0000002d000000310000000a010209000000200000007c00 *000020000000200000002b0000002d0000002d000000330000000a010206000000200000002b00 *00002d0000002d000000350000000a010202000000200000000a01024500000020000000530000 *0065000000740000003e0000002000000070000000750000007400000053000000740000007200 *00004c0000006e00000020000000240000002000000073000000680000006f0000007700000054 *000000720000006500000065000000570000006900000074000000680000002000000054000000 *720000007500000065000000200000005400000072000000750000006500000020000000240000 *002000000066000000720000006f0000006d000000440000006900000073000000740000006900 *00006e00000063000000740000004100000073000000630000004c000000690000007300000074 *000000200000005b000000310000002e0000002e000000350000005d0000000a01020300000020 *000000340000000a010203000000200000007c0000000a010206000000200000002b0000002d00 *00002d000000320000000a010206000000200000007c00000020000000200000007c0000000a01 *0209000000200000007c00000020000000200000002b0000002d0000002d000000310000000a01 *0206000000200000007c00000020000000200000007c0000000a010209000000200000007c0000 *0020000000200000002b0000002d0000002d000000330000000a010203000000200000007c0000 *000a010206000000200000002b0000002d0000002d000000350000000a01020200000020000000 *0a010246000000200000005300000065000000740000003e000000200000007000000075000000 *740000005300000074000000720000004c0000006e000000200000002400000020000000730000 *00680000006f000000770000005400000072000000650000006500000057000000690000007400 *0000680000002000000046000000610000006c0000007300000065000000200000005400000072 *000000750000006500000020000000240000002000000066000000720000006f0000006d000000 *44000000690000007300000074000000690000006e000000630000007400000041000000730000 *00630000004c000000690000007300000074000000200000005b000000310000002e0000002e00 *0000350000005d0000000a010206000000200000002b0000002d0000002d000000350000000a01 *0203000000200000007c0000000a01020300000020000000340000000a01020300000020000000 *7c0000000a010209000000200000007c00000020000000200000002b0000002d0000002d000000 *330000000a010206000000200000007c00000020000000200000007c0000000a01020600000020 *0000002b0000002d0000002d000000320000000a01020600000020000000200000002000000020 *0000007c0000000a0209000000200000002000000020000000200000002b0000002d0000002d00 *0000310000000a000000000000002903010602040000004f000000280000006e00000029022f00 *00002e000000200000005400000065000000730000007400000020000000690000006600000020 *00000074000000680000006500000020000000690000006e000000740000006500000072000000 *6e000000610000006c000000200000007300000065000000740000002000000073000000740000 *007200000075000000630000007400000075000000720000006500000020000000690000007300 *00002000000076000000610000006c00000069000000640000002e0000000a000000000000002a *03010602080000004f000000280000006c0000006f00000067000000200000006e000000290102 *1e0000002e00000020000000490000006e00000073000000650000007200000074000000200000 *00610000006e00000020000000650000006c000000650000006d000000650000006e0000007400 *000020000000690000006e0000002000000061000000200000007300000065000000740000002e *0000000a0102420000002000000049000000660000002000000074000000680000006500000020 *00000073000000650000007400000020000000610000006c000000720000006500000061000000 *640000007900000020000000630000006f0000006e0000007400000061000000690000006e0000 *007300000020000000610000006e00000020000000650000006c000000650000006d0000006500 *00006e0000007400000020000000650000007100000075000000610000006c0000002000000074 *0000006f0000002000000074000000680000006500000020000000670000006900000076000000 *650000006e0000002000000076000000610000006c00000075000000650000002c0000000a0224 *000000200000006900000074000000200000006900000073000000200000007200000065000000 *700000006c00000061000000630000006500000064000000200000007700000069000000740000 *006800000020000000740000006800000065000000200000006e00000065000000770000002000 *000076000000610000006c00000075000000650000002e0000000a2b0000000000000000000000 *000000000100000000000000020000000000000003000000000000000400000000000000050000 *000000000006000000000000000700000000000000080000000000000009000000000000000a00 *0000000000000b000000000000000c000000000000000d000000000000000e000000000000000f *000000000000001000000000000000110000000000000012000000000000001300000000000000 *140000000000000015000000000000001600000000000000170000000000000018000000000000 *0019000000000000001a000000000000001b000000000000001c000000000000001d0000000000 *00001e000000000000001f00000000000000200000000000000021000000000000002200000000 *000000230000000000000024000000000000002500000000000000260000000000000027000000 *00000000280000000000000029000000000000002a2b0000000000000003000000000000000200 *000000000000000000000000000001000000000000000600000000000000050000000000000004 *00000000000000070000000000000008000000000000000d000000000000000c00000000000000 *09000000000000000a000000000000002a000000000000000b0000000000000013000000000000 *001200000000000000140000000000000015000000000000001600000000000000170000000000 *000021000000000000002200000000000000180000000000000019000000000000001a00000000 *0000000e000000000000000f000000000000001000000000000000110000000000000023000000 *000000002400000000000000260000000000000025000000000000001b000000000000001c0000 *00000000001e000000000000001d000000000000001f0000000000000020000000000000002700 *000000000000280000000000000029000000000000003700000000000000000000000000000001 *030000000000000007000000000000000000000000000000010100000000000000070000000000 *000000000000000000000103000000000000000800000000000000000000000000000001030000 *0000000000090000000000000000000000000000000100000000000000000a0000000000000000 *000000000000000100000000000000000b00000000000000000000000000000001000000000000 *00000c0000000000000000000000000000000100000000000000000d0000000000000000000000 *000000000100000000000000000e0000000000000000000000000000000100000000000000000f *000000000000000000000000000000010000000000000000100000000000000000000000000000 *000100000000000000001100000000000000000000000000000001000000000000000012000000 *000000000000000000000000010000000000000000130000000000000000000000000000000100 *000000000000001400000000000000000000000000000001000000000000000015000000000000 *000000000000000000010000000000000000160000000000000000000000000000000100000000 *000000001700000000000000000000000000000001000000000000000018000000000000000000 *000000000000010000000000000000190000000000000000000000000000000100000000000000 *001a0000000000000000000000000000000100000000000000001b000000000000000000000000 *0000000100000000000000001c0000000000000000000000000000000100000000000000001d00 *00000000000000000000000000000100000000000000001e000000000000000000000000000000 *0100000000000000001f0000000000000000000000000000000100000000000000002000000000 *000000000000000000000001000000000000000021000000000000000000000000000000010000 *000000000000220000000000000000000000000000000100000000000000002300000000000000 *000000000000000001000000000000000024000000000000000000000000000000010000000000 *000000250000000000000000000000000000000100000000000000002600000000000000000000 *000000000001000000000000000027000000000000000000000000000000010000000000000000 *280000000000000000000000000000000100000000000000002900000000000000000000000000 *00000100000000000000002a0000000000000000000000000000000100000000000000002b0000 *000000000000000000000000000100000000000000002c00000000000000000000000000000001 *00000000000000002d0000000000000000000000000000000100000000000000002e0000000000 *000000000000000000000100000000000000002f00000000000000000000000000000001000000 *000000000030000000000000000000000000000000010000000000000000310000000000000000 *000000000000000100000000000000003200000000000000000000000000000001000000000000 *000033000000000000000000000000000000010000000000000000340000000000000000000000 *000000000100000000000000003500000000000000000000000000000001000000000000000036 *000000000000000000000000000000010300000000000000370000000000000002000000000000 *00380000000000000000390000000000000000000000000000000100000000000000003a000000 *0000000000000000000000000100000000000000003b0000000000000002000000000000000401 *000000000000003c0000000000000005000000000000000601000000000000003d000000000000 *003e0000000000000018756e626f7865642d636f6e7461696e6572732d302e302e310000000000 *000010446174612e5365742e556e626f7865640000000000000004626173650000000000000009 *446174612e4c697374000000000000000a446174612e4d6179626500000000000000086768632d *7072696d00000000000000084748432e426f6f6c0000000000000005426f786564000000000000 *00025553000000000000000455536574000000000000000473697a6500000000000000046e756c *6c00000000000000025c5c00000000000000066d656d62657200000000000000096e6f744d656d *6265720000000000000005656d707479000000000000000973696e676c65746f6e000000000000 *000664656c6574650000000000000010697350726f7065725375627365744f6600000000000000 *0a69735375627365744f66000000000000000766696e644d696e000000000000000766696e644d *6178000000000000000964656c6574654d696e000000000000000964656c6574654d6178000000 *0000000006756e696f6e730000000000000005756e696f6e000000000000000a64696666657265 *6e6365000000000000000c696e74657273656374696f6e000000000000000666696c7465720000 *000000000009706172746974696f6e00000000000000036d6170000000000000000c6d61704d6f *6e6f746f6e69630000000000000004666f6c640000000000000005656c656d7300000000000000 *06746f4c6973740000000000000009746f4173634c697374000000000000000866726f6d4c6973 *74000000000000000b66726f6d4173634c697374000000000000001366726f6d44697374696e63 *744173634c697374000000000000000573706c6974000000000000000b73706c69744d656d6265 *72000000000000000d64656c65746546696e644d696e000000000000000d64656c65746546696e *644d617800000000000000076d696e5669657700000000000000076d6178566965770000000000 *00000873686f7754726565000000000000000c73686f7754726565576974680000000000000005 *76616c69640000000000000006696e736572740000000000000004766965770000000000000005 *766965776b00000000000000077669657742696e00000000000000037469700000000000000003 *62696e000000000000000762616c616e6365000000000000000353657400000000000000084748 *432e4c6973740000000000000005666f6c646c0000000000000005666f6c647200000000000000 *0b73706c69744c6f6f6b757000000000000000074e6f7468696e67000000000000000454727565 * newhex *0d0cface0004000000000000582200000000000052a22c00000000000000000000000000000000 *000000000000000100000000000000010000000000000000000000000000000100000000000000 *020000000000000000000000000000000100000000000000030000000000000000000000000000 *000100000000000000040000000000000000000000000000000100000000000000050000000000 *000000000000000000000100000000000000060000000000000000000000000000000100000000 *000000070000000000000000000000000000000100000000000000080000000000000000000000 *0000000001000000000000000900000000000000000000000000000001000000000000000a0000 *0000000000000000000000000001000000000000000b0000000000000000000000000000000100 *0000000000000c00000000000000000000000000000001000000000000000d0000000000000000 *0000000000000001000000000000000e0000000000000000000000000000000100000000000000 *0f0000000000000000000000000000000100000000000000100000000000000000000000000000 *000100000000000000110000000000000000000000000000000100000000000000120000000000 *000000000000000000000100000000000000130000000000000000000000000000000100000000 *000000140000000000000000000000000000000100000000000000150000000000000000000000 *000000000100000000000000160000000000000000000000000000000100000000000000170000 *000000000000000000000000000100000000000000180000000000000000000000000000000100 *0000000000001900000000000000000000000000000001000000000000001a0000000000000000 *0000000000000001000000000000001b0000000000000000000000000000000100000000000000 *1c00000000000000000000000000000001000000000000001d0000000000000000000000000000 *0001000000000000001e00000000000000000000000000000001000000000000001f0000000000 *000000000000000000000100000000000000200000000000000000000000000000000100000000 *000000210000000000000000000000000000000100000000000000220000000000000000000000 *000000000100000000000000230000000000000000000000000000000100000000000000240000 *000000000000000000000000000100000000000000250000000000000000000000000000000100 *000000000000260000000000000000000000000000000100000000000000270000000000000000 *000000000000000100000000000000280000000000000000000000000000000100000000000000 *2900000000000000000000000000000001000000000000002a0000000000000000000000000000 *0001000000000000002b0000000000000000000000000000000101000000000000000000000000 *0000000100013b0000006e0000006f0000006e0000002d000000700000006f0000007200000074 *00000061000000620000006c000000650000002000000028000000740000007900000070000000 *650000002000000066000000610000006d000000690000006c0000006900000065000000730000 *002c00000020000000760000006900000065000000770000002000000070000000610000007400 *00007400000065000000720000006e000000730000002c00000020000000750000006e00000062 *0000006f000000780000006500000064000000200000007400000075000000700000006c000000 *650000007300000029010c0000006500000078000000700000006500000072000000690000006d *000000650000006e00000074000000610000006c0110000000650000006b0000006d0000006500 *0000740000007400000040000000670000006d00000061000000690000006c0000002e00000063 *0000006f0000006d30000000000000002c03022e00000045000000780000007400000072000000 *61000000630000007400000020000000610000006e000000640000002000000072000000650000 *00620000006f000000780000002000000074000000680000006500000020000000730000007000 *0000650000006300000069000000610000006c000000690000007a000000650000006400000020 *0000006e0000006f000000640000006500000020000000660000006f000000720000006d000000 *61000000740000000a000000000000002d03022c0000004100000070000000700000006c000000 *790000002000000074000000680000006500000020000000760000006900000065000000770000 *0020000000740000006f0000002000000074000000690000007000000020000000610000006e00 *0000640000002000000062000000690000006e00000020000000630000006f0000006e00000074 *000000690000006e000000750000006100000074000000690000006f0000006e00000073000000 *0a000000000000002e03023600000056000000690000006500000077000000200000006a000000 *750000007300000074000000200000007400000068000000650000002000000076000000610000 *006c000000750000006500000020000000610000006e00000064000000200000006c0000006500 *0000660000007400000020000000610000006e0000006400000020000000720000006900000067 *0000006800000074000000200000006300000068000000690000006c0000006400000020000000 *6f0000006600000020000000610000002000000062000000690000006e0000000a000000000000 *000503010602040000004f00000028000000310000002902250000002e00000020000000540000 *006800000065000000200000006e000000750000006d0000006200000065000000720000002000 *00006f0000006600000020000000650000006c000000650000006d000000650000006e00000074 *0000007300000020000000690000006e0000002000000074000000680000006500000020000000 *7300000065000000740000002e0000000a000000000000000603010602040000004f0000002800 *0000310000002902190000002e0000002000000049000000730000002000000074000000680000 *0069000000730000002000000074000000680000006500000020000000650000006d0000007000 *00007400000079000000200000007300000065000000740000003f0000000a000000000000002f *030216000000530000006d00000061000000720000007400000020000000740000006900000070 *00000020000000630000006f0000006e0000007300000074000000720000007500000063000000 *740000006f000000720000000a0000000000000030030216000000530000006d00000061000000 *72000000740000002000000062000000690000006e00000020000000630000006f0000006e0000 *007300000074000000720000007500000063000000740000006f000000720000000a0000000000 *00003103021100000042000000610000006c000000610000006e00000063000000650000002000 *000074000000680000006500000020000000740000007200000065000000650000000a00000000 *00000032030102100000004100000020000000730000006500000074000000200000006f000000 *660000002000000076000000610000006c00000075000000650000007300000020010702010000 *006102020000002e0000000a000000000000000703010602060000004f000000280000006e0000 *002b0000006d000000290102060000002e00000020000000530000006500000065000000200104 *010000000000000000150000000000000000000000000000000102020000002e0000000a000000 *000000000803010602080000004f000000280000006c0000006f00000067000000200000006e00 *000029021d0000002e000000200000004900000073000000200000007400000068000000650000 *0020000000650000006c000000650000006d000000650000006e00000074000000200000006900 *00006e00000020000000740000006800000065000000200000007300000065000000740000003f *0000000a000000000000000903010602080000004f000000280000006c0000006f000000670000 *00200000006e0000002902210000002e0000002000000049000000730000002000000074000000 *680000006500000020000000650000006c000000650000006d000000650000006e000000740000 *00200000006e0000006f0000007400000020000000690000006e00000020000000740000006800 *000065000000200000007300000065000000740000003f0000000a000000000000000a03010602 *040000004f00000028000000310000002902110000002e00000020000000540000006800000065 *00000020000000650000006d000000700000007400000079000000200000007300000065000000 *740000002e0000000a000000000000000b03010602040000004f00000028000000310000002902 *1a0000002e00000020000000430000007200000065000000610000007400000065000000200000 *00610000002000000073000000690000006e000000670000006c00000065000000740000006f00 *00006e000000200000007300000065000000740000002e0000000a000000000000000c03010602 *080000004f000000280000006c0000006f00000067000000200000006e0000002902200000002e *0000002000000044000000650000006c0000006500000074000000650000002000000061000000 *6e00000020000000650000006c000000650000006d000000650000006e00000074000000200000 *0066000000720000006f0000006d00000020000000610000002000000073000000650000007400 *00002e0000000a000000000000000d03010602060000004f000000280000006e0000002b000000 *6d0000002902390000002e00000020000000490000007300000020000000740000006800000069 *0000007300000020000000610000002000000070000000720000006f0000007000000065000000 *72000000200000007300000075000000620000007300000065000000740000003f000000200000 *002800000069000000650000002e00000020000000610000002000000073000000750000006200 *000073000000650000007400000020000000620000007500000074000000200000006e0000006f *0000007400000020000000650000007100000075000000610000006c000000290000002e000000 *0a000000000000000e03010602060000004f000000280000006e0000002b0000006d0000002901 *02140000002e000000200000004900000073000000200000007400000068000000690000007300 *00002000000061000000200000007300000075000000620000007300000065000000740000003f *0000000a0102010000002001070102040000002800000073000000310000002001040100000000 *000000000e00000000000000000000000000000001020400000020000000730000003200000029 *01020f0000002000000074000000650000006c0000006c00000073000000200000007700000068 *000000650000007400000068000000650000007200000020010702020000007300000031010210 *000000200000006900000073000000200000006100000020000000730000007500000062000000 *730000006500000074000000200000006f00000066000000200107020200000073000000320202 *0000002e0000000a000000000000000f03010602080000004f000000280000006c0000006f0000 *0067000000200000006e0000002902200000002e00000020000000540000006800000065000000 *200000006d000000690000006e000000690000006d000000610000006c00000020000000650000 *006c000000650000006d000000650000006e00000074000000200000006f000000660000002000 *000061000000200000007300000065000000740000002e0000000a000000000000001003010602 *080000004f000000280000006c0000006f00000067000000200000006e0000002902200000002e *00000020000000540000006800000065000000200000006d000000610000007800000069000000 *6d000000610000006c00000020000000650000006c000000650000006d000000650000006e0000 *0074000000200000006f0000006600000020000000610000002000000073000000650000007400 *00002e0000000a000000000000001103010602080000004f000000280000006c0000006f000000 *67000000200000006e00000029021e0000002e0000002000000044000000650000006c00000065 *000000740000006500000020000000740000006800000065000000200000006d00000069000000 *6e000000690000006d000000610000006c00000020000000650000006c000000650000006d0000 *00650000006e000000740000002e0000000a000000000000001203010602080000004f00000028 *0000006c0000006f00000067000000200000006e00000029021e0000002e000000200000004400 *0000650000006c0000006500000074000000650000002000000074000000680000006500000020 *0000006d0000006100000078000000690000006d000000610000006c0000002000000065000000 *6c000000650000006d000000650000006e000000740000002e0000000a00000000000000130301 *021e00000054000000680000006500000020000000750000006e000000690000006f0000006e00 *0000200000006f000000660000002000000061000000200000006c000000690000007300000074 *000000200000006f0000006600000020000000730000006500000074000000730000003a000000 *200000002801070104010000000000000000130000000000000000000000000000000101020400 *0000200000003d0000003d00000020010401000000000000000033000000000000000200000000 *000000030102010000002001040100000000000000001400000000000000000000000000000001 *01020100000020040100000000000000000a000000000000000000000000000000010203000000 *290000002e0000000a000000000000001403010602060000004f000000280000006e0000002b00 *00006d000000290102370000002e00000020000000540000006800000065000000200000007500 *00006e000000690000006f0000006e000000200000006f00000066000000200000007400000077 *0000006f00000020000000730000006500000074000000730000002c0000002000000070000000 *720000006500000066000000650000007200000072000000690000006e00000067000000200000 *007400000068000000650000002000000066000000690000007200000073000000740000002000 *0000730000006500000074000000200000007700000068000000650000006e0000000a01022100 *000020000000650000007100000075000000610000006c00000020000000650000006c00000065 *0000006d000000650000006e000000740000007300000020000000610000007200000065000000 *20000000650000006e000000630000006f000000750000006e0000007400000065000000720000 *0065000000640000002e0000000a01022700000020000000540000006800000065000000200000 *00690000006d000000700000006c000000650000006d000000650000006e000000740000006100 *000074000000690000006f0000006e000000200000007500000073000000650000007300000020 *000000740000006800000065000000200000006500000066000000660000006900000063000000 *69000000650000006e00000074000000200106020b000000680000006500000064000000670000 *00650000002d000000750000006e000000690000006f0000006e01020c00000020000000610000 *006c000000670000006f000000720000006900000074000000680000006d0000002e0000000a01 *022a0000002000000048000000650000006400000067000000650000002d000000750000006e00 *0000690000006f0000006e000000200000006900000073000000200000006d0000006f00000072 *000000650000002000000065000000660000006600000069000000630000006900000065000000 *6e00000074000000200000006f0000006e00000020000000280000006200000069000000670000 *007300000065000000740000002001040100000000000000001400000000000000000000000000 *000001020c00000020000000730000006d000000610000006c0000006c00000073000000650000 *0074000000290000002e0000000a000000000000001503010602060000004f000000280000006e *0000002b0000006d0000002901021b0000002e0000002000000044000000690000006600000066 *0000006500000072000000650000006e0000006300000065000000200000006f00000066000000 *2000000074000000770000006f00000020000000730000006500000074000000730000002e0000 *00200000000a0102260000002000000054000000680000006500000020000000690000006d0000 *00700000006c000000650000006d000000650000006e0000007400000061000000740000006900 *00006f0000006e000000200000007500000073000000650000007300000020000000610000006e *00000020000000650000006600000066000000690000006300000069000000650000006e000000 *740000002001060205000000680000006500000064000000670000006501021b00000020000000 *610000006c000000670000006f000000720000006900000074000000680000006d000000200000 *00630000006f0000006d00000070000000610000007200000061000000620000006c0000006500 *00002000000077000000690000007400000068000000200106020b000000680000006500000064 *00000067000000650000002d000000750000006e000000690000006f0000006e02020000002e00 *00000a00000000000000160103010602060000004f000000280000006e0000002b0000006d0000 *00290102200000002e0000002000000054000000680000006500000020000000690000006e0000 *0074000000650000007200000073000000650000006300000074000000690000006f0000006e00 *0000200000006f000000660000002000000074000000770000006f000000200000007300000065 *00000074000000730000002e0000000a024000000020000000450000006c000000650000006d00 *0000650000006e0000007400000073000000200000006f00000066000000200000007400000068 *0000006500000020000000720000006500000073000000750000006c0000007400000020000000 *630000006f0000006d000000650000002000000066000000720000006f0000006d000000200000 *007400000068000000650000002000000066000000690000007200000073000000740000002000 *00007300000065000000740000002c00000020000000730000006f00000020000000660000006f *00000072000000200000006500000078000000610000006d000000700000006c00000065000000 *0a010b01022000000020000000690000006d000000700000006f00000072000000740000002000 *00007100000075000000610000006c000000690000006600000069000000650000006400000020 *000000440000006100000074000000610000002e00000053000000650000007400000020000000 *610000007300000020000000530000000a01021f00000020000000640000006100000074000000 *61000000200000004100000042000000200000003d0000002000000041000000200000007c0000 *002000000042000000200000006400000065000000720000006900000076000000690000006e00 *0000670000002000000053000000680000006f000000770000000a010228000000200000006900 *00006e0000007300000074000000610000006e0000006300000065000000200000004f00000072 *000000640000002000000041000000420000002000000077000000680000006500000072000000 *6500000020000000630000006f0000006d00000070000000610000007200000065000000200000 *005f000000200000005f000000200000003d0000002000000045000000510000000a0102240000 *0020000000690000006e0000007300000074000000610000006e00000063000000650000002000 *000045000000710000002000000041000000420000002000000077000000680000006500000072 *00000065000000200000005f000000200000003d0000003d000000200000005f00000020000000 *3d00000020000000540000007200000075000000650000000a01023d000000200000006d000000 *61000000690000006e000000200000003d000000200000007000000072000000690000006e0000 *00740000002000000028000000530000002e00000073000000690000006e000000670000006c00 *000065000000740000006f0000006e00000020000000410000002000000060000000530000002e *000000690000006e00000074000000650000007200000073000000650000006300000074000000 *690000006f0000006e0000006000000020000000530000002e00000073000000690000006e0000 *00670000006c00000065000000740000006f0000006e00000020000000420000002c0000000a02 *3d0000002000000020000000200000002000000020000000200000002000000020000000200000 *00200000002000000020000000200000002000000020000000530000002e000000730000006900 *00006e000000670000006c00000065000000740000006f0000006e000000200000004200000020 *00000060000000530000002e000000690000006e00000074000000650000007200000073000000 *650000006300000074000000690000006f0000006e0000006000000020000000530000002e0000 *0073000000690000006e000000670000006c00000065000000740000006f0000006e0000002000 *000041000000290000000a030102070000007000000072000000690000006e0000007400000073 *00000020010701020c0000002800000066000000720000006f0000006d0000004c000000690000 *007300000074000000200000005b000000410102010000005d01020c0000002c00000066000000 *720000006f0000006d0000004c000000690000007300000074000000200000005b000000420102 *010000005d02010000002902020000002e0000000a000000000000001703010602040000004f00 *0000280000006e0000002902320000002e0000002000000046000000690000006c000000740000 *00650000007200000020000000610000006c0000006c00000020000000650000006c0000006500 *00006d000000650000006e00000074000000730000002000000074000000680000006100000074 *000000200000007300000061000000740000006900000073000000660000007900000020000000 *740000006800000065000000200000007000000072000000650000006400000069000000630000 *006100000074000000650000002e0000000a000000000000001803010602040000004f00000028 *0000006e000000290102460000002e000000200000005000000061000000720000007400000069 *00000074000000690000006f0000006e0000002000000074000000680000006500000020000000 *73000000650000007400000020000000690000006e000000740000006f00000020000000740000 *00770000006f00000020000000730000006500000074000000730000002c000000200000006f00 *00006e00000065000000200000007700000069000000740000006800000020000000610000006c *0000006c00000020000000650000006c000000650000006d000000650000006e00000074000000 *730000002000000074000000680000006100000074000000200000007300000061000000740000 *00690000007300000066000000790000000a010231000000200000007400000068000000650000 *002000000070000000720000006500000064000000690000006300000061000000740000006500 *000020000000610000006e00000064000000200000006f0000006e000000650000002000000077 *00000069000000740000006800000020000000610000006c0000006c0000002000000065000000 *6c000000650000006d000000650000006e00000074000000730000002000000074000000680000 *00610000007400000020000000640000006f0000006e0102010000002701021900000074000000 *200000007300000061000000740000006900000073000000660000007900000020000000740000 *006800000065000000200000007000000072000000650000006400000069000000630000006100 *000074000000650000002e0000000a01020a000000200000005300000065000000650000002000 *0000610000006c000000730000006f000000200104010000000000000000220000000000000000 *000000000000000102020000002e0000000a000000000000001901030106020a0000004f000000 *280000006e0000002a0000006c0000006f00000067000000200000006e00000029010203000000 *2e000000200000000a010201000000200107010401000000000000000019000000000000000000 *000000000000010204000000200000006600000020000000730102210000002000000069000000 *730000002000000074000000680000006500000020000000730000006500000074000000200000 *006f000000620000007400000061000000690000006e0000006500000064000000200000006200 *000079000000200000006100000070000000700000006c00000079000000690000006e00000067 *00000020010702010000006601021400000020000000740000006f000000200000006500000061 *000000630000006800000020000000650000006c000000650000006d000000650000006e000000 *74000000200000006f0000006600000020010702010000007302020000002e0000000a03010202 *00000049000000740102010000002701023e0000007300000020000000770000006f0000007200 *00007400000068000000200000006e0000006f00000074000000690000006e0000006700000020 *000000740000006800000061000000740000002000000074000000680000006500000020000000 *73000000690000007a00000065000000200000006f000000660000002000000074000000680000 *006500000020000000720000006500000073000000750000006c00000074000000200000006d00 *0000610000007900000020000000620000006500000020000000730000006d000000610000006c *0000006c00000065000000720000002000000069000000660000002c0000000a01020a00000020 *000000660000006f0000007200000020000000730000006f0000006d0000006500000020010702 *0500000028000000780000002c00000079000000290102020000002c0000002001070102020000 *0078000000200102010000002f0102040000003d00000020000000790000002001020100000026 *01020100000026020b00000020000000660000002000000078000000200000003d0000003d0000 *002000000066000000200000007902010000000a000000000000001a0103010602040000004f00 *0000280000006e0000002902070000002e00000020000000540000006800000065000000200000 *000a0103010701040100000000000000001a000000000000000000000000000000010102080000 *0020000000660000002000000073000000200000003d0000003d00000020010401000000000000 *000019000000000000000000000000000000010204000000200000006600000020000000730102 *160000002c0000002000000062000000750000007400000020000000770000006f000000720000 *006b00000073000000200000006f0000006e0000006c0000007900000020000000770000006800 *0000650000006e00000020010702010000006601020f0000002000000069000000730000002000 *00006d0000006f0000006e0000006f000000740000006f0000006e00000069000000630000002e *0000000a0102010000002001060220000000540000006800000065000000200000007000000072 *00000065000000630000006f0000006e000000640000006900000074000000690000006f000000 *6e000000200000006900000073000000200000006e0000006f0000007400000020000000630000 *006800000065000000630000006b00000065000000640000002e0102010000000a021900000020 *00000053000000650000006d000000690000002d000000660000006f000000720000006d000000 *610000006c0000006c000000790000002c00000020000000770000006500000020000000680000 *006100000076000000650000003a0000000a0b01022f00000020000000610000006e0000006400 *0000200000005b00000078000000200000003c0000002000000079000000200000003d0000003d *0000003e00000020000000660000002000000078000000200000003c0000002000000066000000 *2000000079000000200000007c0000002000000078000000200000003c0000002d000000200000 *006c000000730000002c0000002000000079000000200000003c0000002d000000200000006c00 *0000730000005d000000200000000a010235000000200000002000000020000000200000002000 *000020000000200000002000000020000000200000002000000020000000200000002000000020 *0000002000000020000000200000002000000020000000200000003d0000003d0000003e000000 *200000006d00000061000000700000004d0000006f0000006e0000006f000000740000006f0000 *006e000000690000006300000020000000660000002000000073000000200000003d0000003d00 *0000200000006d0000006100000070000000200000006600000020000000730000000a02190000 *002000000020000000200000002000000020000000770000006800000065000000720000006500 *0000200000006c00000073000000200000003d00000020000000740000006f0000004c00000069 *000000730000007400000020000000730000000a000000000000001b03010602040000004f0000 *00280000006e00000029023b0000002e00000020000000460000006f0000006c00000064000000 *200000006f00000076000000650000007200000020000000740000006800000065000000200000 *00650000006c000000650000006d000000650000006e0000007400000073000000200000006f00 *00006600000020000000610000002000000073000000650000007400000020000000690000006e *00000020000000610000006e00000020000000750000006e000000730000007000000065000000 *630000006900000066000000690000006500000064000000200000006f00000072000000640000 *0065000000720000002e0000000a000000000000003403010602040000004f000000280000006e *0000002902130000002e00000020000000500000006f00000073000000740000002d0000006f00 *00007200000064000000650000007200000020000000660000006f0000006c000000640000002e *0000000a000000000000001c03010602040000004f000000280000006e0000002902190000002e *0000002000000054000000680000006500000020000000650000006c000000650000006d000000 *650000006e0000007400000073000000200000006f000000660000002000000061000000200000 *007300000065000000740000002e0000000a000000000000001d03010602040000004f00000028 *0000006e0000002902290000002e00000020000000430000006f0000006e000000760000006500 *000072000000740000002000000074000000680000006500000020000000730000006500000074 *00000020000000740000006f0000002000000061000000200000006c0000006900000073000000 *74000000200000006f0000006600000020000000650000006c000000650000006d000000650000 *006e00000074000000730000002e0000000a000000000000001e03010602040000004f00000028 *0000006e0000002902340000002e00000020000000430000006f0000006e000000760000006500 *000072000000740000002000000074000000680000006500000020000000730000006500000074 *00000020000000740000006f00000020000000610000006e000000200000006100000073000000 *63000000650000006e00000064000000690000006e00000067000000200000006c000000690000 *007300000074000000200000006f0000006600000020000000650000006c000000650000006d00 *0000650000006e00000074000000730000002e0000000a000000000000001f030106020a000000 *4f000000280000006e0000002a0000006c0000006f00000067000000200000006e000000290228 *0000002e0000002000000043000000720000006500000061000000740000006500000020000000 *61000000200000007300000065000000740000002000000066000000720000006f0000006d0000 *002000000061000000200000006c000000690000007300000074000000200000006f0000006600 *000020000000650000006c000000650000006d000000650000006e00000074000000730000002e *0000000a000000000000002003010602040000004f000000280000006e00000029010235000000 *2e000000200000004200000075000000690000006c000000640000002000000061000000200000 *007300000065000000740000002000000066000000720000006f0000006d000000200000006100 *00006e00000020000000610000007300000063000000650000006e00000064000000690000006e *00000067000000200000006c00000069000000730000007400000020000000690000006e000000 *200000006c000000690000006e0000006500000061000000720000002000000074000000690000 *006d000000650000002e0000000a010201000000200106023a0000005400000068000000650000 *0020000000700000007200000065000000630000006f0000006e00000064000000690000007400 *0000690000006f0000006e0000002000000028000000690000006e000000700000007500000074 *000000200000006c00000069000000730000007400000020000000690000007300000020000000 *610000007300000063000000650000006e00000064000000690000006e00000067000000290000 *00200000006900000073000000200000006e0000006f0000007400000020000000630000006800 *000065000000630000006b00000065000000640000002e02010000000a00000000000000210301 *0602040000004f000000280000006e0000002901024a0000002e00000020000000420000007500 *0000690000006c0000006400000020000000610000002000000073000000650000007400000020 *00000066000000720000006f0000006d00000020000000610000006e0000002000000061000000 *7300000063000000650000006e00000064000000690000006e00000067000000200000006c0000 *00690000007300000074000000200000006f000000660000002000000064000000690000007300 *000074000000690000006e000000630000007400000020000000650000006c000000650000006d *000000650000006e000000740000007300000020000000690000006e000000200000006c000000 *690000006e0000006500000061000000720000002000000074000000690000006d000000650000 *002e0000000a010201000000200106024300000054000000680000006500000020000000700000 *007200000065000000630000006f0000006e000000640000006900000074000000690000006f00 *00006e0000002000000028000000690000006e000000700000007500000074000000200000006c *000000690000007300000074000000200000006900000073000000200000007300000074000000 *720000006900000063000000740000006c00000079000000200000006100000073000000630000 *00650000006e00000064000000690000006e000000670000002900000020000000690000007300 *0000200000006e0000006f0000007400000020000000630000006800000065000000630000006b *00000065000000640000002e02010000000a000000000000002203010602080000004f00000028 *0000006c0000006f00000067000000200000006e000000290102120000002e0000002000000054 *000000680000006500000020000000650000007800000070000000720000006500000073000000 *73000000690000006f0000006e0000002000000028010701040100000000000000002200000000 *000000000000000000000001020600000020000000780000002000000073000000650000007401 *020c00000029000000200000006900000073000000200000006100000020000000700000006100 *00006900000072000000200107020b00000028000000730000006500000074000000310000002c *00000073000000650000007400000032000000290102010000000a010207000000200000007700 *000068000000650000007200000065000000200107020400000073000000650000007400000031 *01021b00000020000000630000006f0000006d0000007000000072000000690000007300000065 *000000730000002000000074000000680000006500000020000000650000006c00000065000000 *6d000000650000006e0000007400000073000000200000006f0000006600000020010702030000 *0073000000650000007401020b000000200000006c000000650000007300000073000000200000 *007400000068000000610000006e00000020010702010000007801020500000020000000610000 *006e000000640000002001070204000000730000006500000074000000320102010000000a0102 *1b00000020000000630000006f0000006d00000070000000720000006900000073000000650000 *00730000002000000074000000680000006500000020000000650000006c000000650000006d00 *0000650000006e0000007400000073000000200000006f00000066000000200107020300000073 *000000650000007401020e00000020000000670000007200000065000000610000007400000065 *00000072000000200000007400000068000000610000006e000000200107020100000078020200 *00002e0000000a000000000000002303010602080000004f000000280000006c0000006f000000 *67000000200000006e0000002901020d0000002e00000020000000500000006500000072000000 *660000006f000000720000006d0000007300000020000000610000002001040100000000000000 *002200000000000000000000000000000001010224000000200000006200000075000000740000 *0020000000610000006c000000730000006f000000200000007200000065000000740000007500 *0000720000006e0000007300000020000000770000006800000065000000740000006800000065 *000000720000002000000074000000680000006500000020000000700000006900000076000000 *6f000000740000000a022800000020000000650000006c000000650000006d000000650000006e *000000740000002000000077000000610000007300000020000000660000006f00000075000000 *6e0000006400000020000000690000006e00000020000000740000006800000065000000200000 *006f000000720000006900000067000000690000006e000000610000006c000000200000007300 *000065000000740000002e0000000a000000000000003503010602080000004f00000028000000 *6c0000006f00000067000000200000006e0000002901020d0000002e0000002000000050000000 *6500000072000000660000006f000000720000006d000000730000002000000061000000200104 *010000000000000000220000000000000000000000000000000101021c00000020000000620000 *00750000007400000020000000610000006c000000730000006f00000020000000720000006500 *00007400000075000000720000006e000000730000002000000074000000680000006500000020 *0000007000000069000000760000006f000000740000000a022d00000020000000650000006c00 *0000650000006d000000650000006e000000740000002000000074000000680000006100000074 *0000002000000077000000610000007300000020000000660000006f000000750000006e000000 *6400000020000000690000006e00000020000000740000006800000065000000200000006f0000 *00720000006900000067000000690000006e000000610000006c00000020000000730000006500 *0000740000002e0000000a00000000000000240103010602080000004f000000280000006c0000 *006f00000067000000200000006e0000002902270000002e000000200000004400000065000000 *6c00000065000000740000006500000020000000610000006e0000006400000020000000660000 *00690000006e0000006400000020000000740000006800000065000000200000006d0000006900 *00006e000000690000006d000000610000006c00000020000000650000006c000000650000006d *000000650000006e000000740000002e0000000a0b02320000002000000064000000650000006c *00000065000000740000006500000046000000690000006e000000640000004d00000069000000 *6e00000020000000730000006500000074000000200000003d0000002000000028000000660000 *00690000006e000000640000004d000000690000006e0000002000000073000000650000007400 *00002c0000002000000064000000650000006c0000006500000074000000650000004d00000069 *0000006e00000020000000730000006500000074000000290000000a0000000000000025010301 *0602080000004f000000280000006c0000006f00000067000000200000006e0000002902270000 *002e0000002000000044000000650000006c000000650000007400000065000000200000006100 *00006e000000640000002000000066000000690000006e00000064000000200000007400000068 *00000065000000200000006d0000006100000078000000690000006d000000610000006c000000 *20000000650000006c000000650000006d000000650000006e000000740000002e0000000a0b02 *320000002000000064000000650000006c00000065000000740000006500000046000000690000 *006e000000640000004d0000006100000078000000200000007300000065000000740000002000 *00003d000000200000002800000066000000690000006e000000640000004d0000006100000078 *000000200000007300000065000000740000002c0000002000000064000000650000006c000000 *6500000074000000650000004d0000006100000078000000200000007300000065000000740000 *00290000000a000000000000002603010602080000004f000000280000006c0000006f00000067 *000000200000006e000000290102340000002e0000002000000052000000650000007400000072 *000000690000006500000076000000650000007300000020000000740000006800000065000000 *200000006d000000690000006e000000690000006d000000610000006c000000200000006b0000 *006500000079000000200000006f00000066000000200000007400000068000000650000002000 *00007300000065000000740000002c00000020000000610000006e000000640000002000000074 *0000006800000065000000200000007300000065000000740000000a01021e0000002000000073 *00000074000000720000006900000070000000700000006500000064000000200000006f000000 *66000000200000007400000068000000610000007400000020000000650000006c000000650000 *006d000000650000006e000000740000002c000000200000006f00000072000000200104010000 *000000000000360000000000000002000000000000000402190000002000000069000000660000 *002000000070000000610000007300000073000000650000006400000020000000610000006e00 *000020000000650000006d00000070000000740000007900000020000000730000006500000074 *0000002e0000000a000000000000002703010602080000004f000000280000006c0000006f0000 *0067000000200000006e000000290102340000002e000000200000005200000065000000740000 *007200000069000000650000007600000065000000730000002000000074000000680000006500 *0000200000006d0000006100000078000000690000006d000000610000006c000000200000006b *0000006500000079000000200000006f0000006600000020000000740000006800000065000000 *200000007300000065000000740000002c00000020000000610000006e00000064000000200000 *00740000006800000065000000200000007300000065000000740000000a01021e000000200000 *007300000074000000720000006900000070000000700000006500000064000000200000006f00 *000066000000200000007400000068000000610000007400000020000000650000006c00000065 *0000006d000000650000006e000000740000002c000000200000006f0000007200000020010401 *000000000000000036000000000000000200000000000000040219000000200000006900000066 *000000200000007000000061000000730000007300000065000000640000002000000061000000 *6e00000020000000650000006d0000007000000074000000790000002000000073000000650000 *00740000002e0000000a000000000000002803010602040000004f000000280000006e00000029 *01023b0000002e0000002000000053000000680000006f00000077000000200000007400000068 *000000650000002000000074000000720000006500000065000000200000007400000068000000 *610000007400000020000000690000006d000000700000006c000000650000006d000000650000 *006e00000074000000730000002000000074000000680000006500000020000000730000006500 *0000740000002e0000002000000054000000680000006500000020000000740000007200000065 *000000650000002000000069000000730000002000000073000000680000006f00000077000000 *6e0000000a022200000020000000690000006e000000200000006100000020000000630000006f *0000006d000000700000007200000065000000730000007300000065000000640000002c000000 *2000000068000000610000006e00000067000000690000006e0000006700000020000000660000 *006f000000720000006d00000061000000740000002e0000000a00000000000000290103010602 *040000004f000000280000006e000000290102120000002e000000200000005400000068000000 *650000002000000065000000780000007000000072000000650000007300000073000000690000 *006f0000006e00000020000000280107021a00000073000000680000006f000000770000005400 *000072000000650000006500000057000000690000007400000068000000200000006800000061 *0000006e000000670000002000000077000000690000006400000065000000200000006d000000 *6100000070010208000000290000002000000073000000680000006f0000007700000073000000 *0a0102260000002000000074000000680000006500000020000000740000007200000065000000 *65000000200000007400000068000000610000007400000020000000690000006d000000700000 *006c000000650000006d000000650000006e000000740000007300000020000000740000006800 *000065000000200000007300000065000000740000002e00000020000000490000006600000020 *0107020400000068000000610000006e000000670102040000002000000069000000730000000a *0102010000002001070204000000540000007200000075000000650102040000002c0000002000 *000061000000200106020700000068000000610000006e00000067000000690000006e00000067 *010235000000200000007400000072000000650000006500000020000000690000007300000020 *00000073000000680000006f000000770000006e000000200000006f0000007400000068000000 *650000007200000077000000690000007300000065000000200000006100000020000000720000 *006f00000074000000610000007400000065000000640000002000000074000000720000006500 *0000650000002000000069000000730000002000000073000000680000006f000000770000006e *0000002e0000002000000049000000660000000a01020100000020010702040000007700000069 *000000640000006501020400000020000000690000007300000020010401000000000000000037 *0000000000000005000000000000000602220000002c00000020000000610000006e0000002000 *000065000000780000007400000072000000610000002000000077000000690000006400000065 *0000002000000076000000650000007200000073000000690000006f0000006e00000020000000 *69000000730000002000000073000000680000006f000000770000006e0000002e0000000a0b01 *0246000000200000005300000065000000740000003e0000002000000070000000750000007400 *00005300000074000000720000004c0000006e0000002000000024000000200000007300000068 *0000006f0000007700000054000000720000006500000065000000570000006900000074000000 *6800000020000000540000007200000075000000650000002000000046000000610000006c0000 *00730000006500000020000000240000002000000066000000720000006f0000006d0000004400 *0000690000007300000074000000690000006e0000006300000074000000410000007300000063 *0000004c000000690000007300000074000000200000005b000000310000002e0000002e000000 *350000005d0000000a01020300000020000000340000000a010206000000200000002b0000002d *0000002d000000320000000a010209000000200000007c00000020000000200000002b0000002d *0000002d000000310000000a010209000000200000007c00000020000000200000002b0000002d *0000002d000000330000000a010206000000200000002b0000002d0000002d000000350000000a *010202000000200000000a010245000000200000005300000065000000740000003e0000002000 *00007000000075000000740000005300000074000000720000004c0000006e0000002000000024 *0000002000000073000000680000006f0000007700000054000000720000006500000065000000 *570000006900000074000000680000002000000054000000720000007500000065000000200000 *005400000072000000750000006500000020000000240000002000000066000000720000006f00 *00006d00000044000000690000007300000074000000690000006e000000630000007400000041 *00000073000000630000004c000000690000007300000074000000200000005b00000031000000 *2e0000002e000000350000005d0000000a01020300000020000000340000000a01020300000020 *0000007c0000000a010206000000200000002b0000002d0000002d000000320000000a01020600 *0000200000007c00000020000000200000007c0000000a010209000000200000007c0000002000 *0000200000002b0000002d0000002d000000310000000a010206000000200000007c0000002000 *0000200000007c0000000a010209000000200000007c00000020000000200000002b0000002d00 *00002d000000330000000a010203000000200000007c0000000a010206000000200000002b0000 *002d0000002d000000350000000a010202000000200000000a0102460000002000000053000000 *65000000740000003e000000200000007000000075000000740000005300000074000000720000 *004c0000006e00000020000000240000002000000073000000680000006f000000770000005400 *000072000000650000006500000057000000690000007400000068000000200000004600000061 *0000006c0000007300000065000000200000005400000072000000750000006500000020000000 *240000002000000066000000720000006f0000006d000000440000006900000073000000740000 *00690000006e00000063000000740000004100000073000000630000004c000000690000007300 *000074000000200000005b000000310000002e0000002e000000350000005d0000000a01020600 *0000200000002b0000002d0000002d000000350000000a010203000000200000007c0000000a01 *020300000020000000340000000a010203000000200000007c0000000a01020900000020000000 *7c00000020000000200000002b0000002d0000002d000000330000000a01020600000020000000 *7c00000020000000200000007c0000000a010206000000200000002b0000002d0000002d000000 *320000000a010206000000200000002000000020000000200000007c0000000a02090000002000 *00002000000020000000200000002b0000002d0000002d000000310000000a000000000000002a *03010602040000004f000000280000006e00000029022f0000002e000000200000005400000065 *000000730000007400000020000000690000006600000020000000740000006800000065000000 *20000000690000006e0000007400000065000000720000006e000000610000006c000000200000 *007300000065000000740000002000000073000000740000007200000075000000630000007400 *00007500000072000000650000002000000069000000730000002000000076000000610000006c *00000069000000640000002e0000000a000000000000002b03010602080000004f000000280000 *006c0000006f00000067000000200000006e0000002901021e0000002e00000020000000490000 *006e0000007300000065000000720000007400000020000000610000006e000000200000006500 *00006c000000650000006d000000650000006e0000007400000020000000690000006e00000020 *00000061000000200000007300000065000000740000002e0000000a0102420000002000000049 *000000660000002000000074000000680000006500000020000000730000006500000074000000 *20000000610000006c000000720000006500000061000000640000007900000020000000630000 *006f0000006e0000007400000061000000690000006e0000007300000020000000610000006e00 *000020000000650000006c000000650000006d000000650000006e000000740000002000000065 *0000007100000075000000610000006c00000020000000740000006f0000002000000074000000 *680000006500000020000000670000006900000076000000650000006e00000020000000760000 *00610000006c00000075000000650000002c0000000a0224000000200000006900000074000000 *200000006900000073000000200000007200000065000000700000006c00000061000000630000 *006500000064000000200000007700000069000000740000006800000020000000740000006800 *000065000000200000006e00000065000000770000002000000076000000610000006c00000075 *000000650000002e0000000a2c0000000000000000000000000000000100000000000000020000 *000000000003000000000000000400000000000000050000000000000006000000000000000700 *000000000000080000000000000009000000000000000a000000000000000b000000000000000c *000000000000000d000000000000000e000000000000000f000000000000001000000000000000 *110000000000000012000000000000001300000000000000140000000000000015000000000000 *0016000000000000001700000000000000180000000000000019000000000000001a0000000000 *00001b000000000000001c000000000000001d000000000000001e000000000000001f00000000 *000000200000000000000021000000000000002200000000000000230000000000000024000000 *000000002500000000000000260000000000000027000000000000002800000000000000290000 *00000000002a000000000000002b2c000000000000000400000000000000030000000000000000 *000000000000000100000000000000020000000000000007000000000000000600000000000000 *0500000000000000080000000000000009000000000000000e000000000000000d000000000000 *000a000000000000000b000000000000002b000000000000000c00000000000000140000000000 *000013000000000000001500000000000000160000000000000017000000000000001800000000 *0000002200000000000000230000000000000019000000000000001a000000000000001b000000 *000000000f00000000000000100000000000000011000000000000001200000000000000240000 *00000000002500000000000000270000000000000026000000000000001c000000000000001d00 *0000000000001f000000000000001e000000000000002000000000000000210000000000000028 *0000000000000029000000000000002a0000000000000038000000000000000000000000000000 *010300000000000000070000000000000000000000000000000101000000000000000700000000 *000000000000000000000001000000000000000008000000000000000000000000000000010300 *000000000000090000000000000000000000000000000103000000000000000a00000000000000 *00000000000000000100000000000000000b000000000000000000000000000000010000000000 *0000000c0000000000000000000000000000000100000000000000000d00000000000000000000 *00000000000100000000000000000e000000000000000000000000000000010000000000000000 *0f0000000000000000000000000000000100000000000000001000000000000000000000000000 *000001000000000000000011000000000000000000000000000000010000000000000000120000 *000000000000000000000000000100000000000000001300000000000000000000000000000001 *000000000000000014000000000000000000000000000000010000000000000000150000000000 *000000000000000000000100000000000000001600000000000000000000000000000001000000 *000000000017000000000000000000000000000000010000000000000000180000000000000000 *000000000000000100000000000000001900000000000000000000000000000001000000000000 *00001a0000000000000000000000000000000100000000000000001b0000000000000000000000 *000000000100000000000000001c0000000000000000000000000000000100000000000000001d *0000000000000000000000000000000100000000000000001e0000000000000000000000000000 *000100000000000000001f00000000000000000000000000000001000000000000000020000000 *000000000000000000000000010000000000000000210000000000000000000000000000000100 *000000000000002200000000000000000000000000000001000000000000000023000000000000 *000000000000000000010000000000000000240000000000000000000000000000000100000000 *000000002500000000000000000000000000000001000000000000000026000000000000000000 *000000000000010000000000000000270000000000000000000000000000000100000000000000 *002800000000000000000000000000000001000000000000000029000000000000000000000000 *0000000100000000000000002a0000000000000000000000000000000100000000000000002b00 *00000000000000000000000000000100000000000000002c000000000000000000000000000000 *0100000000000000002d0000000000000000000000000000000100000000000000002e00000000 *00000000000000000000000100000000000000002f000000000000000000000000000000010000 *000000000000300000000000000000000000000000000100000000000000003100000000000000 *000000000000000001000000000000000032000000000000000000000000000000010000000000 *000000330000000000000000000000000000000100000000000000003400000000000000000000 *000000000001000000000000000035000000000000000000000000000000010000000000000000 *360000000000000000000000000000000100000000000000003700000000000000000000000000 *0000010300000000000000380000000000000002000000000000003900000000000000003a0000 *000000000000000000000000000100000000000000003b00000000000000000000000000000001 *00000000000000003c0000000000000002000000000000000401000000000000003d0000000000 *000005000000000000000601000000000000003e000000000000003f0000000000000018756e62 *6f7865642d636f6e7461696e6572732d302e302e320000000000000010446174612e5365742e55 *6e626f7865640000000000000004626173650000000000000009446174612e4c69737400000000 *0000000a446174612e4d6179626500000000000000086768632d7072696d000000000000000847 *48432e426f6f6c0000000000000005426f7865640000000000000008676574426f786564000000 *00000000025553000000000000000455536574000000000000000473697a650000000000000004 *6e756c6c00000000000000025c5c00000000000000066d656d62657200000000000000096e6f74 *4d656d6265720000000000000005656d707479000000000000000973696e676c65746f6e000000 *000000000664656c6574650000000000000010697350726f7065725375627365744f6600000000 *0000000a69735375627365744f66000000000000000766696e644d696e00000000000000076669 *6e644d6178000000000000000964656c6574654d696e000000000000000964656c6574654d6178 *0000000000000006756e696f6e730000000000000005756e696f6e000000000000000a64696666 *6572656e6365000000000000000c696e74657273656374696f6e000000000000000666696c7465 *720000000000000009706172746974696f6e00000000000000036d6170000000000000000c6d61 *704d6f6e6f746f6e69630000000000000004666f6c640000000000000005656c656d7300000000 *00000006746f4c6973740000000000000009746f4173634c697374000000000000000866726f6d *4c697374000000000000000b66726f6d4173634c697374000000000000001366726f6d44697374 *696e63744173634c697374000000000000000573706c6974000000000000000b73706c69744d65 *6d626572000000000000000d64656c65746546696e644d696e000000000000000d64656c657465 *46696e644d617800000000000000076d696e5669657700000000000000076d6178566965770000 *00000000000873686f7754726565000000000000000c73686f7754726565576974680000000000 *00000576616c69640000000000000006696e736572740000000000000004766965770000000000 *000005766965776b00000000000000077669657742696e00000000000000037469700000000000 *00000362696e000000000000000762616c616e6365000000000000000353657400000000000000 *084748432e4c6973740000000000000005666f6c646c0000000000000005666f6c647200000000 *0000000b73706c69744c6f6f6b757000000000000000074e6f7468696e67000000000000000454 *727565 addfile ./unboxed-containers-0.0.2.tar.gz binary ./unboxed-containers-0.0.2.tar.gz oldhex * newhex *1f8b0800000000000003ed7d7b7bdb36b277ff3dfc145837cf5adad2b2653b4eea8db2761227d5 *ae13676d67bbfb383e2925d1163794a892542ca7e9f9ecefcc0024c1ab008a4e93be559e582201 *0ce6f21b5c0600399f0ebc853dda187ad3d072a6b61f6c6c75b63adb9bdf34f7d982cf83fbf7e9 *1b3ed96ffadded76f7f6ee3fd8dadbdbf966abbb737fbbfb0dbbdf200fa59f79105a3eb0b22a9d *ac705fc9675e66ffe3fed3a35767474dd481fad8dbdd2db3fff683fb0f32f6dfbdbf0bf6ff2c4a *fcffdcfe4fbdd9adef5c8f43d61ab6d9f6d6d6f7ec687463f923f68f891d86c6a1eb324a0f986f *07b6ffc11e750ce3d41e3941e83b8379e87853664d476c1ed8cc99b2c09bfb439bee0c9ca9e5df *b22bcf9f0426bb71c231f37cfaf6e6a131f146ce9533b49080c92cdf6633db9f3861688fd8ccf7 *3e3823f8118ead10fed840c475bd1b677acd00a823070b0558c80026f70d83c1e72f2ccd55c0bc *ab889da137b2d9044c0d4220cc89a635f03e6092500011616cea85ced0362187133017e82119b9 *d2e928c311543a742d6762fb9d324ea046491b112720e6680edcc5cc08166296f4991114129698 *1076e40de7131b7c3c32d826d8c283149f4dacd0f61dcb0d62bd0b2a64322a2c0913cbf8ca76a8 *3866985a131b59eb079635647ff7a67600bc2769640baa2d1671ca297a7e000cdcb2818d080269 *3c664f4770d746b00043132fb419d7146070049c7e8819bc8264ae9bc0bb0a6f1044025e2c98d9 *43c417147510753e226bca3116045c8ef31ffa67ecece4f9f98f87a7470c7ebf3e3df957ffd9d1 *33f6e43fecfc8723f6f4e4f57f4efb2f7e38673f9c1c3f3b3a3d6387af9ec1dd57e7a7fd276fce *4f4ecf8cb5c33328b9460987affec38efefdfaf4e8ec8c9d9cb2fecbd7c77d2006d44f0f5f9df7 *8fce4cd67ff5f4f8cdb3feab17260302ecd5c9b971dc7fd93f876ce72726559a2fc64e9eb39747 *a74f7f80cbc327fde3fef97fa8bee7fdf35758d7f39353e390bd3e3c3def3f7d737c78ca5ebf39 *7d7d7276c450ac67fdb3a7c787fd9747cf3a503bd4c88efe75f4ea9c9dfd70787c9c96d238f9f1 *d5d129b22e8bc89e1cb1e3fee193e323ac88847cd63f3d7a7a8ed224bf9e82e280bd63d3387b7d *f4b40f3f40174720cbe1e97f4c41f3ece89f6f201324b267872f0f5f8068ad251a01933c7d737a *f4125906359cbd797276de3f7f737ec45e9c9c3c233d9f1d9dfe0b3aabb3bfb2e3933352d69bb3 *23d37876787e48150309d01424c3ef276fcefaa4b3feabf3a3d3d337afcffb27afda60de1f412b *c0e321147d46ca3d7985a202468e4e4eff83445107a47b93fdf8c311dc3f457d92a60e510567a0 *b1a7e77236a80f14786e2432b257472f8efb2f8e5e3d3dc2d413a4f263ffeca80da6ea9f61863e *550bc6873adf90c86822e0caa09f12604d3224eb3f6787cffed547b6456630fd595fc08454f6f4 *07a1ee8e916bff4bfbff27f674389e58fefbce3858b18f59d2ffef6e777732fdfffd07bb0ffee8 *ff3fc7c799cc3c3f6467b741684f3aa7d0317813237df31cfa917e18dd7c8a2db7e7768e16437b *469d49cbfe60b973e844dad93caf2ddf725ddbed9c853ea45f3b766044797e9e5b2e34d0d0e43f *b342ab736687cc0ad85949727f1a8a1cfd72029d371ccc98ed8d61205b6cc216acc766f3105860 *ad09fbee3bb6c6d6daecf16316925c09fb6cd136a07b1edac7d8d14e980b05058d96cb7e9a07d0 *bffec466964fe9fef4aa6d1853c8b3fdbfdd8720d614803485debcc595c8162613bf6edbacf738 *ba682d4cb8be81ae9077f73ebf7d0d845a2dcb1cb4cdebf57539037e20e11a6ef6e2dc49ca80e7 *4f92d625b2a740d3b54c17a8b6c696391eb4db7a350101283fb6da1555629e01d2c6ba2bf5608a *1f1fb30a313f56a9c41c12ab0d6885d28682989458a833d31d466a33c74359738a0c692baf9445 *cc35442688d7bc8e6f621d2fd5f68da9a06f73c405bc739553ea28aa4b4e2e3389e98e24ab98e3 *51da30aa9cdf956dca85c27c23e4974b674c701ed28381399571a175bb66703d797f168e5ec050 *75773b260663e4fd7d76018de0a57cafc742eb3d0cb0598bd710b0eb36a527add81a50b2a1edc5 *798ad0ed743e194037bf061428736807e113f9e28d7c11fdded8a0cb3e5e1b2221e13e608f3678 *5bb9060309982cc0601dabc4363bfaacb17becac834376de7e065956b1059fd8c81c4b7fb0e4c4 *9ab1d695ebcc8086c814b463669e2871f3043b07c112d27c9370d342fa6f3a940368e5d41815cd *3198e6adf526cad089a8b5653edf28f1f946525b86cfbcd6de94a92dcdd99b8cd67ed930227b2e *6748f4be31d97e15433c73014b6986fa6986367ecd8f4dfff8dcfda774fc0f369ccf3aeeca83ff *6f96c77fbb7bf7b3e3ff9d9dbd3fc6ff9fe3f3ed9f36e781bf3970a69bfe7c3ab682f7b6eb1a8f *d9c41bcd5d9bbdc44eaa855d55d49f429a18803f93a3426770d3a554ead7a0bbea9fb0563bba86 *26c6beb2e66e8804fff0f42fe753eaffd11833e8ccdc15eb58e2ff3b7b0fb2febfb7055f7ff8ff *67f848fe3fb37dd730308e8f7e3d8419f64deb830583a1bf1a46301fb099e7deb2d6bd7b6df60b *a34e7f8297e1edcc36ef413e1ce91ebcfb2b1fb643e7e143c3c1c74d0c93d7ccb55672d5ce5d72 *12ce15238accfe590cbad632149f7ad8d02cd8bd2e9248ae90e22f1bdfb237af5e1f3efd07fb76 *e357f6a77472a686deffb1c9a6c8d0eafca5bd99ae4808467f7384e9b6a0f857e357ae9f7856f6 *4b5a3b81ac19b88ba5e0cef70fe23b0798cd995e7938fe8711d22fec82947def9dc98663bf8525 *befbae7dc97e65079c64422cb470f6f35f0f1ad9f575b3207d0e02428e6068b950af4867bd1eeb *b2bf715560cd175b9717dd4bb6cfd65beb30782582ad7513287286eebddb780c799083a8481bf2 *adb7d793aaf8802e90d9910a6fa70aa7b411f1c8eb2eac7aa7ba6a2042cb233d519a5596e6e566 *be330590ffdc9226d46fce228d25b3c791155a7c4c1e2bf3de2fa0f65fcf6118fb49fc7e020267 *5172e67cb42159a805f1285169672ea9aa0f8e7d2311ef31f89b24b492aa8244649791eb257739 *93709b4fe2884e4c93ee0d32797bac883247b637f7b9e6d0aed022c0f09e3d1d0392e0c743fcd3 *ddc3bf3bdbf8776f97fde8f9a387f41712f00b52f00b929e79f301d4f6dcf5ac1073dbd730fce7 *93a4bff27a86de64e24df315c5d453a52282a95ab0b582d9886d0dc71cffe8ebad03e188a2e58a *ed7d41e99724e9b76cfabfdb2cb06d9848871eae48859ec702d7bb3159e0316fe2f0b5c8209c5f *5df1a5c9a1377747ecbfb89c37b059d4878e70d10d9c0d19a57a8d6fb31c7581252e2cf00435f3 *29542acbb69c85f13c05bc77791bb50d3250965f8d6f852cdf33276037d62d0a83527438a3ce74 *e8ce4736ae3fda215f47ec686bcc8cf4569aa69a432f5f9ddcf5cbac5ab299f23115b02b6fb3d6 *de4edf4ea1636ca0ff2f1dffe5133a436b60d5190b2edbffb1757f2f3dfedbdedae9feb1fef359 *3eb83abfff3fff8300cd5bdcf8007fa081d8a774c285e13a437b1ad8fcd693b3673bd19d8d2bc7 *b5f7e1a6d8396458f370ecf982b8d85472d811fb4a7056c86bd92f4a678fecf7f87d700d19dd0e *b4838f0d30d4c0719df09697b017306075684f836b8cbd893db3ae055be3309ced6f6e42296f6a *8db0f426346f23db3786b80ce5f982042e1c19c1edd49b054ec06f9dd9eed586370b9d89f31143 *5f4229d02d8401a32520de17cfac30b47db10583460857d604b883c67e640743dfa1b5b1fd8648 *c63b42f6791f90ddab13ab753077dcd106b6173ca7989693e76e44d664ec71af0ba634b012325b *b08fadbc3ce53322fd602068532cacf5e30ce3c000bb0f7ccbbf859cbcd6117428d3112705f72c *98483ceeb15df6e73fb3476cb7b36dd2fd045d980a8802546df13c5b9d1dbc30c8b65e0050e451 *88603fe6465ee6839bd7e3216916fab07db67135f536401dd30d0f2475add90c54bb116b75e364 *1bb28c6062136c0cc7b635330c7b610fe7802a184344e007a36c0ca2a56fa80171ba01e060f27a *784ee44a8945dc1d52ba285ea7cbd3bb1dba54d58a294673131b862194e7fb2847977446db6bee *5863bf756bf5c7a7e94f69ff4fbedf4c1dcbe2bf5bb9fdbfbb3b0fb6ffd8fffb393ed5f6c7b67f *f53af4ed7fbfbb7dff0ffb7f8ecf72fb17f4fd9a75548effb7b7777677b7b2e3ff07bbdb7f8cff *3fc7271dfbc2984b51e00beff7f02f0f79c18fd27857f6261615912ef8d9967f27912d41391bef *12f5c088381de56a59ed4c7c8b1390825b98a5c71202693929ae54242825f4e88b8b8abf9465a5 *d24240fcdd4e5d248245e4b3f2469529082c48e4249648e44cfbb0ccb60fb9aa1ec6d67da863de *87924d1fb65317290b3f2c31f143751b3f2c31f2c33291bb7b6532434a8f7fc75277f774c40602 *89a8ddbd76fa2a2539afa340745ea39aec44a448f898484efa9ded32e921a5c7bf63e977b675a4 *070289bc3bdbedf4554a7a5e4781f4bc4635e9894891f431919cf47bbb65d2434a8f7fc7d2efed *ea480f041279f776dbe9ab94f4bc8e02e9798d6ad2139122e9632269e97910be487a9ed2e3df5c *7afaa92c3d2720e4a58b76fa2a9132ae232b7d5ca382f411919cf43291bcf4258e2f927ae247a2 *000ddf173424a125ef1797692514fb7f52ada21a8a5b801499bc224ada0091d4133f1245683403 *828624b9d41088cbb4228a9b82a45a45451437062932794594340722a9277e248ad06811040d49 *72a94d1097694514b70a49b58a8a286e175264d28a102b66458a10493df1832b82ff565684a021 *24e757edcc65226f5251561149b50a8a88c9e41491229356045f842cd2034fe9f16fae05faa9ac *044e40084d17edf45522685c475601718d0af2474472e2cb4472bd232da396f48f94d68b7ec57d *245ee8f4924426e919f1b29dbd4ef595516d05bd6554b75a7f290815f59812a1b44ec47614ab5d *a89524b5c7179fb956e867a94e924242eaf846c19d44de987e560f716d0a5a8888e4742013c968 *00d463d224ad5003712ae9519e0c6ace072ba6887125edfc9d1454ca678cd2a471905592392800 *4bc1dc11f3f5588658b1b2962b2cadb48cde56579d82368b355aacd54ac5a6743bcc6bd71c16eb *b750c598b9c78a08976b5a4ddb398de7957e277a573445b9394a4db2cc2a19c38c8a4c638e4a8d *53621f2cd1cbe92caea4da4ceaa62a3257a1c53e97d134ec586dcb2a7b2a98346755bbd8aea65d *65d952e362b15cd64c85cb6dac67e7125b9799fb37b4b826089603610918d4f0500089ab325098 *574b6051810c2c5b943f57b91a40f441520e940aac7c5970a9812035142d479232980af1745d8e *28f37a39a62a6185044a0a1530a28eae7a08ab445935d0be78acd5849f3a049560a883c412308e *abe0688e9500b9049348a5bc6421537ad0ac0fcf65105d8ad2af11a82b60570fbfaa18d6847129 *929d6a2c9b8e2a9a97021a4955162f6130836b5c5034f96266217aa574befa985e3bd55e3fad5a *53952a6b17dd4bafb056adb2ca2bad0a5102895c419c2047b04c854a7acc2933afd04694aaa6e8 *526d97aa7c99dad3aa570a22644817c6114ac8579a42dd1e85462936cc9d1947c360d556ab349d *8af9b226540c371454531272a8ac6cb94935ed5a6adc72037f5623eb1a5ec1fa4b21a00a833c14 *946314255596062a14aa5684461d7c5482a41a28bf39586a014815454a50d2815311a434621c15 *d557443a9419d181586d9c2d05db72c07d91a0ab0f442d342a43521796c5d0d40a972c61a5326a *a2c996365457c3ab1268d580fbd580774540eba35a0bda75e05d0671cd208c025b4b8231b598ac *07f90670af0c7e7507f8aa9da009c7a8e91dda2e52d74dca5d453bcaa3c8e2d270cf0a2ce7e399 *0f3138f6b03c6a19a5f32dd8fdd406f2beee26f2aa8de55265eda27ba9f05dcc48d156f3beb4dd *5c6d774844ae787f489a60990a95f49853665ea18d28554dd1a5da2e55f932b5a755afba79e461 *b909e2fd2345e42b4da16e8f42a3141be6ce8ca361b06aab559a4ec57c5913aa6f33c95653bed5 *a4bcb2e526d5b46ba971cb0dfc598dac6b7805eb2f85802a0cf250d0d99b525465d5069565552b *42a30e3e2a41520d94df1c2cb500a48a222528e9c0a908527a7b5bcaaaafdee1a2c6880ec46ae3 *6c29d89603ee8b045d7d206aa1511992bab02c86a6ee36992a5696ed96d1614b1baaabe15509b4 *6ac0fd6ac0bb22a0f551ad05ed3af02e83b8fee69b656c2ddf84a3cf643dc837807b65f0ab3bc0 *57ed044d38464defd07691ba6e52ee2a7576f7a8b0a8b2cda72ecb79d7e9ee997d7ea4bdcc3392 *1ce2047a3f7390beaf7f9abef0a68c81b8d276f1dd94e125960acfddf7e5c3f76a91a08464712c *284bb45cb1aaea2d5272a1a69b52b7b20daa2c51650f05a3642ca31a28ca5450162b2aa96499ad *f42c566ab772e3dda90535cdbadcb84b4dac6ae79cb1d5434a45d5958795aa2b55337f1d105443 *61091e3e3f286a2145152f6aa8d1824e017e74e250a5955705a39498d041547d5c29a04b05625f *08ce56009f1e043580a88fc64248eac5b1aa59a98e66e930a50fd255a1aa0a5865d47ec9d05d19 *cf7550ad8bed9a002f41b96e484c81b16591b11a4cd6c57d33e8d7f2013d47f8eabca12117a9ef *28b5dc65159f29751cfd409b2a9bcb036ef5995ecd959a74287db7aae15bbf0f076bd4eb56f5bd *fa1eb8b21b56f8629d489e16d32a21bd9585c87be7ceb6d9e70f6c2cf3b9248778be623ff398c8 *befeb3220b6fca80892b6d17df4d814362a9f0a9927df9d1926ab1bd8464716c2f4bb45cb1aaea *2d5272a1a69b52b7b20daa2c51650f05a3642ca31adbcb545016db2ba96499adf42c566ab772e3 *dda90535cdbadcb84b4dac6ae79cb1d5637b45d595c7f6aa2b55337f1d10544361091e3e3f286a *2145152f6aa8d1824e017e74627ba59557c5f69498d041547d5c29a04b05625f08ce56009f1e04 *3580a88fc64248eac5f6aa59a98eede930a50fd255a1aa0a5865d47ec9d05d19cf7550ad8bed9a *002f41b96e6c4f81b165b1bd1a4cd6c57d33e8d7f2013d47f8eabca12117a9ef28b5dc65159f29 *751cfdd89e2a9bcb637bf5995ecd959a74287db7aae15bbf0f076bd4eb56f5bdfa1eb8b21b56f8 *629dd89e16d32ab1bd9585c87be7deaed9e7af2329f3b92487787b483ff31294befe9b500a6fca *80892b6d17df4d814362a9f09d297df9c5296ab1bd8464716c2f4bb45cb1aaea2d5272a1a69b52 *b7b20daa2c51650f05a3642ca31adbcb545016db2ba96499adf42c566ab772e3dda90535cdbadc *b84b4dac6ae79cb1d5637b45d595c7f6aa2b55337f1d10544361091e3e3f286a2145152f6aa8d1 *824e017e74627ba59557c5f69498d041547d5c29a04b05625f08ce56009f1e043580a88fc64248 *eac5f6aa59a98eede930a50fd255a1aa0a5865d47ec9d05d19cf7550ad8bed9a002f41b96e6c4f *81b165b1bd1a4cd6c57d33e8d7f2013d47f8eabca12117a9ef28b5dc65159f29751cfdd89e2a9b *cb637bf5995ecd959a74287db7aae15bbf0f076bd4eb56f5bdfa1eb8b21b56f8629dd89e16d32a *b1bd9585c87827bdead6142fdb2df4b9540ef16edcec2b7e6bbce7b7f0660c18b9d276f1ddc4b8 *69960adf089c7a2db0426c2f45b220b65740b45cb1aaea2d5272a1a69b52b7b20daa2c51650f05 *a3642ca314dbcb575018db2baf6499adf42c566ab772e3dda90535cdbadcb84b4dac6ae79cb115 *637b25d595c4f69656aa66fe3a20a886c2123c7c7e50d4428a2a5ed450a3059d02fc28c7f6aa2a *2f8deda932a183a8fab85240970ac4be109cad003e3d086a00511f8d8590d488ed2d65a522b6a7 *c9943e485785aa2a609551fb254377653cd741b52eb66b02bc04e55ab13d35c62a637bf598ac8b *fb66d0afe5037a8ef0d57943432e52df516ab9cb2a3e53ea389ab13d0d3697c4f656627a35576a *d2a1f4ddaa866ffd3e1cac51af5bd5f7ea7be0ca6e58e18bdab13d5da697c6f69a10a2c03bbb7b *26ffaaf03a290fe7a3bbc7ff26ce12ddd1f285fc69707e37059da4f276d9fd345464e68a9020b3 *aa11ed93c896c4fb7284abd4ada1f512e59799a04143e89867899596184bcd6459c329070373d5 *94c6034bab5230a6be4d2b4d5b6de03b37730de3ab6140090a3a80c8c342236c58526d45e87069 *e5ea50a98d1805e0a8c0e73702517d6869214c0368fa702b029d56acb1928dca80a3323bda405c *158fcab05407e71705d195815b07bfda30ae0be662486bc62a15d85a12b1d466b02ecc1b42bb26 *e875a1ff153840536eb18277d47492d55ca5cc61b4c39eca6c2e8d7ed6667945276ad6976ab954 *3dc7fa6addab61a75bddf75672c1261cb1dc1d6b045335d95608aaae2c44332e7a279eba82c3ae *e2b6bf33e7bd1b976eccb31b70f0e6dcbccad96b456b6b89a114b66d4cac82066067dbe45f15fe *2ce5e10ced6cf3bf89d34577b45c297fe29fdf4de12ca9bc5d763f0d2799b92290c8ac6ac46f25 *b225f1db1ce12a756b68bd44f9652668d0103ae65962a525c6523359d670caf1db5c35a5f1dbd2 *aa148ca96fd34ad3561bf8cecd5cc3f86a185082820e20f2b0d088df96545b11bf5d5ab93a546a *234601382af0f98d40541f5a5a08d3009a3edc8a40a715bfad64a3327eabcc8e361057c5a3322c *d5c1f945417465e0d6c1af368ceb82b918d29af15b05b696c46fb519ac0bf386d0ae097a5de87f *050ed0945bace01d359d643557297318edf8ad329b4be3b7b5595ed1899af5a55a2e55cfb1be5a *f76ad8e956f7bd955cb009472c77c71af15b4db615e2b72b0bd18c8bde89a7aee0b0abb8edefcc *79efc6a51bf3ec061cbc3937af72f65af1db5a6228c56f1b13aba001d8db35f957853f4b793843 *7bbbfc6fe274d11d2d57ca3fd581df4de12ca9bc5d763f0d2799b92290c8ac6ac46f25b225f1db *1ce12a756b68bd44f9652668d0103ae65962a525c6523359d670caf1db5c35a5f1dbd2aa148ca9 *6fd34ad3561bf8cecd5cc3f86a185082820e20f2b0d088df96545b11bf5d5ab93a546a23460138 *2af0f98d40541f5a5a08d3009a3edc8a40a715bfad64a3327eabcc8e361057c5a3322cd5c1f945 *417465e0d6c1af368ceb82b918d29af15b05b696c46fb519ac0bf386d0ae097a5de87f050ed094 *5bace01d359d643557297318edf8ad329b4be3b7b5595ed1899af5a55a2e55cfb1be5af76ad8e9 *56f7bd955cb009472c77c71af15b4db615e2b72b0bd18c8bde89a7aee0b0abb8edefcc79efc6a5 *1bf3ec061cbc3937af72f65af1db5a6228c56f1b132bd3003cf3e603d736f957893f67f2f418ff *c5ff72a793ef28bb12cf5e7c37c659baf276d9fd040559e6b220c9b2aa18bfcd902d88df1612ae *52b786d64b945f6682060da1639e25565a622c3593650da714bf2daca6307e5b59958231f56d5a *69da6a03dfb9996b185f0d034a50d001441e168af1db8a6a4be2b74a95ab43a536621480a3029f *df0844f5a1a585300da0e9c3ad0874caf1dba56c94c66fb5d8d106e2aa785486a53a38bf2888ae *0cdc3af8d586715d3017435a237eabc85645fcb616837561de10da3541af0bfdafc0019a728b15 *bca3a693ace62a650ea315bfd562b3327ebb12cb2b3a51b3be54cba5ea39d657eb5e0d3bddeabe *b7920b36e188e5eea819bfadc1f692f86d234234e3a277e2a92b38ec2a6efb3b73debb71e9c63c *bb01076fcecdab9c5d3b7e5b5b8ca5f1db46c5ca3400cf5dcf0a4dfa5be2cda91c3d463fe80f77 *b7e45ad9852877e1cd185d72a5ede2bb89ddd32c6541916650315a9b225910ab2d205aae5855f5 *1629b950d34da95bd9065596a8b28782513296510ac7e62b288cc59657b2cc567a162bb55bb9f1 *eed4829a665d6edca52656b573ced88a41d692ea4a02ac4b2b55337f1d10544361091e3e3f286a *2145152f6aa8d1824e017e94e3a5559597864a5599d041547d5c29a04b05625f08ce56009f1e04 *3580a88fc642486ac43b97b25211e9d4644a1fa4ab425515b0caa8fd92a1bb329eeba05a17db35 *015e8272ad20a51a6395d1c97a4cd6c57d33e8d7f2013d47f8eabca12117a9ef28b5dc65159f29 *751ccd70a2069b4bc2882b31bd9a2b35e950fa6e55c3b77e1f0ed6a8d7adea7bf53d706537acf0 *45ed689f2ed34b837c4d0891f1cefe34b4af6ddf14df257e97cbd563e2a7f8e22e93bea7ec1322 *7fc9ed18445926dae52989e1f36c669191675a31fe97235d10032c215e6d043d63941ba5c236cd *9a48d372cb2db8dc92ca06cdd955297a585659610c7159856ad6ae67f5a5d65f0e82cf82859a10 *51878a32647491530020c588e492ea4b2293ca4ce8c16a3578a9c24c196dbf25e856c4a23e2675 *b15913a28548558e7daa31541a05d567ac1e7e9bc1b1269e7561fd05a2bb21d0d7077f4d2758cd *174a5c4223f6aac562451c760566577394661da69ee3d4f49fafc78d1af6aed5bd6c356f6bc4e9 *4a7d4f2b225c87e9caf870130234e39177e3992b79e86a8efad5fbeb1db97173eedc885b37e9dd *154eae19bd5e418c25d1ec46856ad6f5efb60968a22968a445f8bd360c77dc5e34df6e34d97edc *413352d99a68c7df57176c6944fe6e04cdb4314fbc853d6296c9bf07256d452e17280a7fd21fee *bec975a9274664daad984e04bd6c0515290914d22c647192664831ee9e225910732f205aad50f1 *3d54536c923b5555a1963555dd8a49976836ae5b2147910d540c91b68652b43c5f41619cbcbc12 *35fb88ef919e9d9252790eca8d56d772adb8b625068ad9d2c8596a5265bb668dab18c92ea9ae24 *82bdb4523d738befb29344caa54b185b82819581d08a1950b473cc718d12d508d183491e2bcab1 *e4aaca4b23c8aa4cd4438ff8be5a0d4509952a7e5520d51cae5a314f9a70898559a1a402e06aa0 *ae087a1a31dba5ac54c46935995a0d8ce2fbba195026d4968aa18cd03b80692b66b326ea62391b *a0a08adfba202e46b25604548db1ca98673d269bc1b6f81e378bf184aa9a747a80bf4bd4b762ce *57046fac82062969b9c34a3e51e6189a51430d369744095762ba595711dfceddb84c425d43e81a *fef3599ca8150bd3900fc4dab9038afadeb5ba8b95fb99763c4d97e9a5d1b32684308c6f7ee79f *f97480f26f0cbd69683953db0f36b63a5b9dedcd67d0246c024237dff01c9d7150b78e2df8eced *eed2377cd2dfddeefded077bdf74bbddbdbdfb0fb6f6f676bed9ea3ee86e75bf615b4d0a5af699 *43cbea032babd2c90af7957cb0fd3c3e7cf5e2cde18b23767e3bb39f5b13c775ecc0644f5fbf36 *d9bfa041786d85a1ed4fe1d64bebda19fe6005639309589ccf672e6616795ecc2d7f0497cf5d7b *e10c5cfb29c0ca5e84d29dbee8ca026caf0dacfee4f579ffe4d5d9bb173f3c651b57536fe3c6f2 *a71bde07db77add9cc995e6fcc04035464a3c90f50639ff0cf4b6f34776d469f7dc610fd1d407f *478889599e7ab35bdfb91e873c4b6bd8664723e075c4fe31b1c3906d6f6d7d4f779f59d6941ddb *ce7fed29dedcc6c2c7ced09e067644ffc9d9b31daa167c8efb1dddb6df23a583eb89e5b89da137 *c12c67a135008b84b7bca4bd98d9be33b1a1988bc9af3d3fce00c9536fba31a35b204d2b0483b2 *abd8a2d4bacf626b0adf6721d9b06d70751c4e997d75e50c1da882391348a2ca42c79b32ef8a05 *76187444d63307c724136b7acbaee6d32165995a13b06d6b300f81979085639b111778bfcd862e *8087dd38e118cbafbdf66d773eb2d7782913723b019b7053c0af7930b75cf716b9009180d3839f *e18673e5d8a30393d99deb8891c74ce4c9198e5137db4e678aa9e4b35b018d8304dd73e03eaf82 *75ccb18e0c0eac00cac0ddcd00c71d03cb45688f36b163b2fc5b16fa362ac3f39118bf80f29b03 *6f3e1d616fcff36fb6b1da911d0c7d6780b76ff745fdf0f90b00c09e8d014a87236b023a7abbb6 *7914db07adb18ffd1651025f61d630dc7cbb6652e9bf7b737f6ab958e773611fb87aed7bd7be35 *9960ee9dd66e7bfffefd9d8dfb7bdb263b1986de00a0d8fdfefb1d4ee1d1380c67fb9b9b373737 *9de0c609828ee574264ed8b147f3cdffb390a3cd274f361f776486ffde61af1c1bfcf7da764366 *4d47eca8f3b2c34e6da8d173479c3288f1842b29b02d7f384ed493d54e24cd59fff025fb6f2212 *f8c76c1ea214dbad6e1b1b2724d3fdfec14ec4cd2b2f04f48d2d0ec38c21c17c9bae7d156e0c1c *b4e226431341369b6722562ca472e5f80188e15fcff13efcb099e5de58b7019bf9f695edfbe842 *1e950d6ce8474726bbf27c70540b2b64ce1489accfa750e93a83847518cddb7eb8de61ec04a598 *fb816db298151468080d883705e40f6ce60d20f707de04dd200e6c822fb83b4860d1a5f3c1726d *74457027211cb4b2b63522870dfdf9309cfbbcb9880a472a82768f7bc295ef4dd85ae40f6b28d1 *3c10be1bb5202497350fbd09d432e4ed07b0cb4935d92a1ba20dc87b333398f40101c03f60188d *6ca652189fcec839e349d4d1cfe6893f32cfc6de8d790a5a4a15849eed2c738346887c506cb26b *3ba45fed4c269c781879e64ea0b5b642cf0f32d95b6fdfb60bb2ff736efbb799acd3b9eb666e61 *6b93b935b127e0bad9a25ef8b2e8be139ccd0156e1c9552e015a0760b93039cf2e74ef1c5e80b9 *0c257b320bb39220b65d3bcce5e50e91b93902470ceda50c4ca0a9cdea827c4d7c65150f70079f *456fc93101dd2238704e967cadcf1d37cce9f4aae8e6ccf243a7403bc10c9cb0e89e3057bece97 *d62c6bf1a23b2f3db0b937758605249e43e39b651a6f1554e64cdf6ebeb4163911a723482aba9b *cbcbcd97cf2dee97e47f5e588394962b37b1163846cdde75a674b710b2d0330568925ce25f6098 *1664cd82fd411644a15790115bd0dced823aa0edb1b1cf70f32442ef301896902e4f7906b76124 *1616e5a8e4853db307f3eb6b6cc2d35403681acfa13f2eb9fd238edfd249d00339697045f12543 *0cbac4588f8d9d1176712dee2f2622d037b18d3301be6da378888672e12089e493877a887707fa *05feddea74daed543abe4a2475a33f4d138016047ae985015311ec0fff0bf341eae6421b957a1d *e53d87cbce3fe7cef0fdd3b13d7ccf523488bbd6743e3003b8a724034c648c6f9d2bf6eedd8be3 *c3b317273fbefbe1f0ec1f47c7c7efde25552ec20ef54fdfda5368b690c5263a5726754a4d10fc *d570a657cec265dfb3b76f19f6de38a9629b27ade97793f666073a689bad27edee7ac7c0de8fed *efe3e09c59267a04b3daacf79877da16dbc8ff32265d243fd9663da90d677077b2dd9c66a0aa80 *4678a9f13c1f9b36a42c1a515198123fb4cb4b68ec1087f3386403679ac368ebc03ae818149ae5 *baa0ec18afcb78f827561a09fd9315051aadb6f4cb30702286531d205b1406b678e3486c1d2d42 *1f66153490f76d1887f1a1eecc1e3a80ef8fa09ea9077e0d4e03c3c2248a08e64d6c98a579389b *c1e816e9505e1c3e835c580386f43018e54ce734940d628aef91e400a9b54836f8518814fc3568 *67ae252a57ec3d5b80268730ece7d52f40e9b14e792890e29758f27d741167400b40c295240ef6 *35bce92091d07c240c0eeab9de286e301c3b2e8dc92d143366096b4c69abf52d7a05bf8ebed9b7 *ed5481bc042c25c2bb440420e7c004c384ab6fdb593160fe02addd5a76a4dd11f5ac4952824777 *d19f71563c9de338056b8de74b50299f03851d2a432e944641346ca5a49eb0c7165dae731c2642 *f09b010882ff7a2c28e0a41ff09001cddb70c089b5ff8df2618f92aefd89e7b94912ea8fd8801f *3db625113f9bc0a08df0388c86b75e12a98e49e64a08e4a64a0cb86997e23547f2096f7a78fc24 *ea89457b8414975192b32f52f0fd44621fb3efe8fb943deab12e6f5a289a0ef7fe5d58e2943dee *e1482cb4fec209c80044c4f9b217e10770f70170770bc0bb05e4659bad8830e4608f988fde4e94 *31b7f8a0e73ad377ec036bd137f2e5deb659668ec46941758b1d18436dc3ff1dacefd146cc1b54 *11d15aec48c4c2edb6b8fa8085fcdb764e4f29a94f7352bb75a5f63352bb0552c3bd8857c8eeb7 *35a5f60ba426a289d80b125b96da03c8f9378e8855469f727424dd47f4e17a13eee5e6924ea324 *3f97f46f9194a0f33bd68d7319d242686ee4100d04a32e2e616bc25b06209dcc4961a839834115 *dca34922bf07ce3bb4c2e85e40434279e5d5c27a5ed8533e782aaa8afaf623681093c49e7046a8 *f1d41ecd81d23b1c2a420b04a639f7e7b43b6d92e24ce4bb622d6adbb1e9c2063d80be482caac9 *995cf69390e627eada922b39974f23cea686493c4cd104b15fe3c1a2eb5db369dca8c77138a95b *f99bc1831c8523c74c33488dbdc88e4dfdb5279969389951f709437f1cebf12925e4887aa4e796 *0bf0bfc7debe63b751274a4e4f056f658f3f3ec744289be0fc45742bc1f7d13f236b1b4be5c5a8 *b92c731cc351163b2901de0d4221c57b2c5646d81c0e52f19f2668267088471a71bfde31f84fea *81b9338ace8edfef61ff6ca4093cf56d2b84b158127ae294924b899adc7f261916a2edeba2ea60 *00409534a5c06718d9684e797970510536c58905be28d06b7135f0c08a0ab0845a44819c4749ce *833a02d76139df89bcadc881a2a10af477e84b6dc9775e6432b89445eab2b8735de3981bfba5e6 *e68214036d18d6624a1c0d5c2d36a3782b0ba8b2bfb1966377d03a74c9a255348adab73b46363c *ab3c87a67621573ae8b200e7d32dea8ee1ea11ef9803181efcf9cfc04b90cedace4ded13398400 *98e1a005b97f4a0aff84450f5868bb6e8098c101063b08ba074c2a8953898360fb0085ac2b5e5c *2eecc21027160cae1e8921479893ecdf3c338826dfab59f1bff39d7b3280a25e2595399bf55d92 *99fa8a54ded458808fc1dad0bc43de2b5c3043b1e4fc30500eb3f77c768d13f4c46d5b6e685269 *f39a9e642885a07947d19833bd74a6cec47271956e813fee6af0803dc684d715b77834e1a6f64e *04b0f35d084dcee2e49cae33867a87ba5a94657f07ba7fd7262b4639dc382fce64cba6dc22cf7e *d2e5b1b1154003909568ada0a127c1b96ecb04b716958243724ef02c9cdb2c913c9f1ffff96d96 *880e59fc38f352d1ad4591e869998a44177d5c98377dd4c395da3cd5ad15da32637a1a7efbe505 *845fd284299e7eb792ecd4b52597efb2a39642a1d22a88852ab3675aa82233b939b3f600a3a505 *0a857263b1d0ca6da9742c54538dc71b9c8f7558936d06ba0b4df3b893e05a4cb4bb059afe03be *5c1fac636c681d9728dcf578097f9d30ba7e00fd31cf55d85b5c702b5c4a0611b9430c69f668e9 *cd3d0b7d67180a4e38f62139d7cda6b80d6f3ce2d38cf61fe0720ae2846f5440dfc17d02f16a7f *12a1c3e1973d1d42831fe20a54a7648bcb3cb0c59424de67b239b647d7f606f1b0c92cf7daf39d *703c210a3f24498cb6eff87249b8d91a38d7c8d54f940746030066e80ac34881ba2b01bc50c631 *a1bf47d86d8b54e8d4b3bd2ba47693541a1f90546f38390addc170b41dfd7c013f29a36148f98a *786d1177b4ae07b6a0d073c1ad0a8924fa7c0cc0ff160891ff9058120198a3ba1efe1d3bd9d2c5 *6edd63fff528a02c96e45e848206b455e2d6712808829f9755553c3ed94eb31ad55444849a14f0 *87897c0b4666ed6cf645c44c923dba85d953239cdc54bfb9a95bb291a0098ab92942425f767a6a *054b9dd69ae67c56f256a105da1a885bf0d25e0ddd4a52a3a6474a25b343258e50e80da43c65ce *99ce42d8113e8aca507051ca76771e4ae40b0605518797645aee19b918a0be13e66a0a4b3d7c82 *9bf1841fa58b2d0a7cae4db5a632470e96f7b8369f8b7f0e97ebcb5b749aa099733a722ca99694 *eb61e6236977207691be1dcc61a205c2da3cb292ea884d1678f266c078bb6ae94654dc2070c6f3 *d06aece11350e5212e083104ea07eceb71e39a201345a711e990952fa1459ae7eb6647ffcce43d *fa39c9fa0e0738efa2f926e59b58009d1e8c2d400fac75d649226187eca7b38eac9d9f989cfcc4 *14bb6c539f548e6a0287d11664aa3b6007ad684b0dbb38bc34938b27976d8c13c876d26cb05265 *4bbc3995a720689fcb13760f52fe1774d9a2cbdc2ef3bbd8136612b7d9629bb9dbccdf0662e838 *0e45591ef73029c4011c57a08ba7848ae6e9c79ef77e3e432a61b24602830637dde5a65804a8ba *db7266bf22f37508cc89ccb8b689513c1e6b88e3777fc735ef05ca249a2fa83d8c6277afbc708c *788554defec48936c6d74b058b0210d4b0cbfc558b06aa4eef7daa14ceeff260482c1ea89f0b87 *ba17e27453f2d0875897c569ac75e3bb0a69bb40b26db009da522b876d5c548f2bcd0c68937400 *2389e08a6fcb80a9c5c8195aa18db103ca5fdead6210acb0ff8c8ace96848b63fdb6de8a3e0b69 *a46c09d601a8a7ef49868ac2c63c349cce26592c952bce84fb61521a7a1da93f5a8541e878d2c4 *cb9b8a1154a9120db19b3cd623d9b5a2dc08a696a526c0b316366e3b87ee649d7c64bd63c420d1 *338d589934c502a544a6ca4c2db09309ffdb2ac642cfce2d55b7dcaee9625b975e2d8b93fdaee9 *47c9e99561ee9cc5e66f09fb532b6b722bf346358f819648a6ac51b974de7643eecc639ed6aca1 *7df1d2cacef42f71888862edeb136bb6cea0eba0687a84576f40a78af02c09b370af15b6c30757 *07b8d3cab68663394478101c10c2f07f3f5c0fd80d0c4dc6b8eec0030be2f804c5cfd3a39e8945 *2714683e0f6eee5cd10800c73b018e870e5a0bf3b67d60b283057bbbd963b7188fbee21b6eaed8 *ed816100ef1278e1ef4040987f0d0492371e67f773d1af0195bfc2584a3434e8d0eeca0ebfdf89 *f6e9a6bd1bc77862a041da8bb74c931a29e213ebd4a4251850c8fb801fc8a01318a8488a748882 *a4becd73eeb37802c4894e98e0e2cd10378cdaa3ce2677e389b3415be55cdc227263b3b1f5c1de *8ff4ff989a898b057b04daea81f0a8ae47a82d1060817b3b5c687e6ef98f4b5634e0e21f2c2bcb *1689c635132405f938d00d704043dac28d56a9926903299844ae343de6f998cc4806fcba050242 *839c29e5e66f417b9dbaf32e093336d703e36ef82668657b5c0fb7fd7d0017c91d3012bd0bcedc *e753da5349d3010fa7a5d0f5624129c6cb1bf541b2c37190dde64825aed847b43685187d7e95ed *e1bc20dca04a2813afc9d7ab6a6323a15f36ef8c72a099e14f9c1f9f3ae9c614dec11db4e647c3 *48b22c805db153af10e0905bbee63ba1e26d8ef236a8c53246587310220ffa60f90edfbcda68cc *5a6ec07220ea187450a17845e0c2ba14c98bc4cf1b9c9823bdbb91951fd708e38e0dfaaf245a1f *29a16308914a858f4426e9c5390954c0d2bac03383216ebf87aeb0a8da885645cd51960884adfd *36bbb8340abbf464bf8a1defd4c8571b7777850b0ff29a034bf2a6571c1cc066b4e92c19f0e15d *ae257e24abd9dd424fe68e4b8ae4473db978917637f1fcaba4e8800e41c2e8628483665c3983f1 *8c052da833b1717fb1c1a4e39d303cbc58407f88fb09622a98b2cf878cd2f919b6a07e3056cba2 *a97dfd292891a82933e6809415a97008d172a6331880f0029270edfce0429631c1c5d1cfe5b048 *34c217a4f2478930ce4a07ec80cc2290c37cc0ed859c76c9c455905d74a2f9ce05c56b2f454fe7 *4927a0c870405026b66ef0169e220e7029ef17bab8a42ff4aecbe4e6e232bab948eeb616fb8b05 *f55d31f17540f46261c8f5ad432f00447bece2e365f63e5208d6f9f4e013fbd8eb2da2ce279331 *e259de3e0b3dd47eba62c86468e3043c7f24ac92da6baf0d9e803c1fc6b0cb50940581d4b615a0 *289b5ba0694092f1307dcbb5a7d7800280104f4e5a1c60bcdba693c6e2d047283acec0e3ae0d23 *644c1ddb30700d66d6d04e9f6db686eff9ed4e440ee690e26c4a14b1f2d9b4d7bb8fcd39676a30 *0fc60e0ec6b019eaf01642b0cbb6086f883d8a4c44768d92efc7c905d0cc7c5a8beefe627b7fb1 *b3bfd8dd5fdc272c96e58d303d8cb665ef463fb6711353bc171174255feeb4d3d7f7e17ab128ab *e45dd5798f225372a9efafa554308d5410d83fb3a9cfee8994167d9de2ad619b4ddd5877994f7e *bf78fc81423da0ffd3c8f9f013db2ec9e3539e0dcc0cd83112dea06a7aa23038ed6dd08e21c8f9 *7ac27020898cb1db402ec377ad8856a562834a997a4ea1aca420510f8c413f068ce328396d0043 *e28f4173fd29b495433e6409f2e3a30eeb4ff1a7f591b6d3e05c5e3c5f034a5ac3903f5923b071 *50883dac98d95f590146ec267638f64601928b561330fac53b6e2400b354875a9521546f395371 *9a2ba055496c3336da8d1d2e4c6ff98f7b34f891db821f76b173e77b01e2cd7fbdcce6bf644826 *b227d7db4d058080171c9235b5afb7fcdc03fe2a388910592ddae2195d4bc207d8984897dbed06 *e741628d6af54f1e00485a084f3f73d2e331e5e035f4841833c47930de780dd2439738638f5977 *abcdee9196300107c4d0d7aec523c235d6e124503ba24b6b101674a2b7095a79cd20e9343ae84e *4641df3a5723bbf8e4316330ff1891ea7ab8086143477c8f0615a034f835f2486dfd11860e638d *ad5138ca5ebc8ec7daa4b59fae26d6eca798a221a8639aa841be7c665f59733734bec550adc81a *1991e7cc5a90bde5a167c1542be1c70cda822511496e2d0233a47b4496f11ec0b7c3b90f14a5b9 *00e46afcb4f59b903f9d297a449208f88bda83f960c3b7a6d776bca4ecf9ceb533b530448eed6d *879dd1e27252da7a8f3344eed14e00fd7efcf0252b489e5313a25aa091070f49b242fab585b061 *78667bea84e2b42a0c830e1332177c33000da5c113e63866b2497558c345d49650960edaf522bd *8500b70540877a48fc8b191acc0b1cdaf8cd77b94127cb238f515dd8101f9f5f960e90282eca69 *53de17e797fc9c7e7ce0162701517cdaf3e810ea85bc998278c28fe08bd74f8fb471dde8ccf5c5 *fbcb0ed5c3de271c5dc81b30ea900166494db47403b72212f43925200452077be15e7279fd4b41 *3e215daa2098125039c8fd08aa270258ecbd7d4bf3052486898f91b79819b1d61ab3440bbaae03 *08e3e9971400a785275ff019ede0073aa5ccdc5881584d15479908c94df5864d7926872da08f03 *16afc0416eac5b521c782637075fd79bfb360c72c4731261d604e585b107767863db5c4e726530 *84778963a78bb173c9e3755c79e2510289370091d81fb038184bc6303d634c503f70bd0332eac1 *d839684a95a4805cd457779f949177ff83c288b0114f9d22af8fa74ffc1c5094465e9e9b5af1a3 *40d9079cbca399538e856889b124d9e74ccbdb2d1bdfb79c343f0bc4d755b2f02e90f318db2cbe *6d08617111a65b9b92528ff2a59a60f8572366b71a1125cbfca2955d6ef8bcd98bf6bec9a7c0b8 *e153a951123ffde5273c240b433c8311abb39654c7f5a54a117053a244abcfe9bd7dc9a6042e95 *9bf07017cb5d67f410aa2688951cc4b11730740c028a451d887d0b20354c470fdafcecd7cc727c *3c2f66875d13fe6cb70fc463eea0a33ac0bb07347881b18b1de416cf30c3018cf2026aa2a1855c *8806122911a16565af29dceec7c53b06efa1150e4466b751f082b9a313b759a0149d82e47089f6 *43493ba1082278c8046e13646e6953563b85a5e2723e951385f03018a6a7d0d5724d3fe29bc32b *dee451701ee5b5ede3b2351a2db264e9c88076af381fbc90ce20889d06b9214134ce152772a5d1 *8886fa71834bda06a9a3cf5c37e6c4f473dbe6188e81b9423087750b435c7ef05b6c2ee6fbfcb0 *684d7514aa810735157421f8d4d0c54b922103c958dc326056223303cdd23d88094c799602b066 *d05a4e2a8fdc386f442a06300d576f631c0b1a129ac51e4481ea3b9ed24dc4d37cc9a4d149297e *c0377492091e1f0bc30402ba74e98131b8bc13c0dc8dd392fa7b31b27f44339c68581fcf06c4d0 *9e963e4c4aa6f2f21c02cd4a0f6813216fbe7cd6170b311448f7604c1484b8dd0cc4d9273d5fc8 *5b366876701e3dcc57e29ac7dd2f9218a798da444f36e66e30f47c98ca87148733859c4269030f *d787dcb2b9842c43fc3c2e5a5382ae658634a32d4db4f212b1233ffa06393ab50360567404512a *d2468e3a25751fca7ca6dc94cffcac20610968955089cd01637c94040f360ec7384fe0dbb30037 *1eaef34cede4841f09110f12229dc642e4046038bd7c3ef7510578008b7616e1026a6c29682aa6 *f8a42d649c8f1da3e966873d411378f45038f1c4ad6548ccdcf32f0b81878422e8094c45c7f4e3 *09f00b3e5f96d01a7ad7d48d74d2fa17594a941c41c472314c71ab0115b1293061e925de90a7e3 *fcc16769d553d80317a0f7997860996f0554013ea6793d80910de8d38c96af5a8f7aed5418462c *620111f0bed6a36c22373ef833674f2847d47d496b56f430425ab8632d8cd92487672edb14bfb4 *47117061a885589dda43182be123979dc8f531c6e4a5db2d674adb5770a301ebd30cf4e739c689 *e653be39d542afbfe5a4fbb47b0d37ae02a101ce52e9701190c403bdccc3bd73e35bce018ef7a2 *65076a12a0d3f9137beef9e17c0a8330dc0de7109d91670748723cf749a1d8a7b18113f2938508 *68dbff00ac7cf8f2020a7f478f6d8829f2fee2a793144e57a23954e6bc328b3773bca474df48e6 *1eb9335822a3b5c0f43863e6e0023d9fe9161f23e5e3a3b8f2a9a7ec23733f32ff23f6d79f52cf *0c13cf6138958f127f4c36f14231a0f83153ec342a762c17230ea292d1d3b12a1f5f253a28be06 *9fe884d6b262c1f93eec191fdeb11978f8347408b4f8e4fd6900b0937d158fa188a2664272a9d9 *0c59d361323de04f434cc65fd2588d36ddc94f419149c4a32c5ae3955684d3cda52123a14eb52d *998034415f526d630195a4b1dee75bfaa576baa9d680d75171b25e723a71ac20e773f4908088d9 *dc195e3c6c2f128b7c0b340b165d94f856e479e5be25fb48b4e73d796c5e8967a58ef62fa272fe *a2d2af7a77f0d89d6488b04fd4e59e381e1a18ac7070506f18d004e3bf1ac4b61a6a286b0e3408 *19217beeac991ba520b68ce4c989ecb178945e34d79d98ee3a16483d329bcfce22fb4e98bb4e8e *9b376a4cc4cf12a1e73ba689305fdece947fe2d4880f020a1fcb116f774f57813b187a18138b2f *a50789e325cce1d2250a15de4ae6c0e9dc34bea86cf30a3a5024b830e316560a003216cf681705 *8aa7a743e25c161225e75a4f5a6b7c066bf2c18acaf69fa4c8eed3d01e376e8945c4021dd3c6e0 *69f23c9535939544760a0d967de44891c1ac45ca60fc527ac23b3758ba8086bd2c852eaa6018c3 *cde52e35570ee256147a489b0b609eea5c554c844fb2293251c1f379944c746a873ebe51254859 *5a5a2c22c55bc278013db58cf6fbcd66f688e7b1e2dd8326bd84440446d6e968154cf7680a2b3f *6c4f3c42bfd8623cd4d48a9f4edc8eb3e79a2e51519c01771753d8a69576958582e0427f772c38 *7fa380b2e0227bb9e02243a1e0387a6b3030950d7c884bb90fa59e90af982fb01f3d1767bb52e1 *a9205ef78f220d5718271fd943e85703f1c01983c587c2921d64930e2eaef81edfc7d9e6db0368 *c471191d508bccc8df5603e369e9b90ff25a6ac49534988cc5a0c92245958299371d09b1b0d4c5 *0d6d33a6b725ad8b69b844010fe3476fcc0971d279d1dd14ec1592bbf7d6726763eb9e4402a827 *ef378aa6fa1d5ea3d839c40725822e57a5440010e45a505a2c3cec741eecde4fe6e4303ab9b67c *9880dbc9cb8ba4c2916af90679f12622119e88a313c9d01bd54f719d58fd74152b1ab763cfa373 *c7ce14df44163803174dcc0d2a553db6ad0f0e7f58215fc616e796e25196d8684881831140dc9f *e08e708942b44260c13c6b8ea1023c2b48d386582e69c7899885d9b2ee422f2f2c0f5324e6b325 *fb39f4ba0f590a102b326a049475dc37133a433789ebf0e30370b191b163d67abb9dbddd3d71aa *375635d4b1dd5128cc4d9f2fdceddcdfd91571da0d76c85cef06775c085a2e6d62a2ad9e141359 *4745d9b8b77b3dfdce828e283e76aec752f959b478416b67be1dbf3d8ca4df100f1f470860d026 *7edf13ee71015c8ebc097f360585a293578ff11d754368026883031d974c424ec8ed077c42f3cc *0ac71e34f0ce109a801b0f9f94811d7cc0c371872e0543f19572c3b1e70cf1bc3434ab230f4d35 *c3f71038e2cd3d5c34d7056af3eb3136077c332b8f5922ca516452762c381e588da6f6e000218f *80316e8be8182bb465f83a250b777cf0f5420c7291634fa5e3b0943b88bddc10d0dacd05ba684b *2d057881ad1b67146d12c166338eb9228889842d36aff3d7def91ef67d82656a88810a296d8346 *45b893dff21d2fa03d3b44000f13fc3c8f9e1b141db5e0f376aaa9327219379951e4d212ed0586 *294174805e10b66973369480fe00e549bc5af8320045f877ecd578d2c0b647304e4a8c66609392 *284b489b042d79cd71c96ca892163fa260a5c928c858f450248c5a500cba9dc8d2a518ea0f8454 *eb06a78ca2f7032606f8006f01ab805e7138b6296a8fa72968e35df4606ab19d3a59bdf3e6fe10 *e34323d1748fed389c39a479e90063a2d7fc19e2f4ba3e2c1fb8f87a08b4f834e5bea276278c89 *20c4b91a08bc924f7079a099c063a62d5e5098f0e72452bcbfd1c6bbe453b8dcf31e89c50743e2 *ca0dd66c48855cc4e4ca876115bef2846ec18868d7e0b77b80a906f736f0153aa7b1b7b6c867e7 *704936391d6bd194839ff71bd0e9182b959bceb2068674682419d2248799a2c3acc999259ca77c *5cc77359741896e6bf3fe39d5686fa3a5be010b2c16752472f856a8260e6601cedd88e4699626b *68e4b3f12906be7b24da29470d2f0fd98a6dafb8a904dfc5878b68e844fcd5331d237a3f95b468 *2e6d1697de43425bbe93ecdc3af2dbad68102fb60304a4dbecf95b796b4baa2432c59bf989353b *e04b3150c17299fb57ec000be3b3050c76801c1cc0dc866d0a3137d31a91823762bc2ded2ea41c *481208212ff4bc827524b96ed27407dfe9c3b9146f434b4a1906bdafe7313677a0a9e329bb57aa *9b7b85a7062fba9dcefd4b20b30bffbfdbd8d886af4f0c7f75e35f3b3ce93e7c29d5477f14aafb *94aaf253b6e64f29063ea933c1e555e14210fc243124d5c8640e19bf6282437c4743aad2421ce3 *9697e8d92ee9f06206d719388614f2a36bfae00919c42666fd21ce054d12f4ef6b6b46f6306392 *39ce18e73592b44a962f388797d9df92087822c3c854e50e2c1f4603f4b7222424de6844859f60 *5e5eae933ae6f1e9ed74ad3ae297be94260ea5b4f1587dba16a884656a71534fb589682542b670 *1600a4b99c6d7e7d44610971c767998d0a48e1471a80d1a8927394cfa2ca702575b7947a4604ce *b22b098142896b57820a614e192ea51049a0ab8d8f1278642d57890f56069066f0a146aac3aa4c *5769b9447db1ad84a9aaf1a043944342809823800881f18b4c2d244b3768999aa979a24bfaf464 *95b4c48b7c5abe4d737f5e73bbc4d2e956ce19098492e281c1146309f262bb247023bee4a11d94 *88df89f92e366919932d98d6b882d50caff87e3dc3a0b7ece1cbc4b852e832f9f4d81af421d014 *0b2b9a2cd17c468ce8b7211b9c9380ee696d9fc44adb0dd3589cd6d850f3308866a577f29c149c *753b57220c842fbde71b2ce35762d3508966861d83ef8fab7e8c24bded416ca433a4bd08708907 *4ba3b9365d50367eecd430a21405f231115e8178177a6a4b6aea22fd428728bf38d3121dc04e35 *889933ebf202096daaf4f0894c784e160f61d02f896aebd1029b06e966eb31dca1031509cd7751 *f36818b18a0ac3e92472a2c565cb3def622ec5f2e777d1f227bdc5eed3a738e191fcd636480786 *939c528adb46098b3795c57c7179a3abd49e072e6462ec72296540d0e0cbb7614849d778448caf *0cf0ebcc33ac938caaf60c3e26aaa29c4965ae19fff4db154f2fa04f8bb89af26db693363696d3 *ef26dff123d51fa949a3a4e063259977d91b502e5a1dc98086c86dd1abd79a6a64cec59b7c9b20 *f7ab81a1bc68a07bd19f86c9e004a31a71ea8237a8f2636630ad8b8738a23c3863d8debaa484ed *54c2ce96b9fd7da7d315893be952e6aeb9673efcdedcded9de31efef98bb3bf073d7bc6f3ef8de *ec6e9b90b00b7f1e9abb908c7f21ff43b8b173d9e40be0a2372137b705cff899c7a870c3346f08 *e8121abb2be73aba2b9f70a7fb3d7c6c13fc1040fa45dc7f692da8f9efb1fb5b5b22cd4cd29e63 *5f4b69d9c4e8cdbc3df6764a2dcdc8f9c0a66c1b9a9a9d7626ef11f4dcb7515ecbbf0ea2b84d74 *e81c0aa237b2efbe63176cfded601d1ce81d1e430e58b4dff9577a315f733daa3f70606aefe3eb *276d2bf0a6d6400eec35f922e3dc8319a6f389e8d3622ef287f3ad3889ef3c820e046e51dc620b *5706dfdbb7e94777f2c3403c0555dddd42a3195121e9514749fde08a688af4d70b3c3d1eadda46 *c5794739a571e014fb86ada8de5ebc724f47c93e61d6c73dcc5d9c9cde4b039d8cf70b83bc60ec *e1d8f3b00d763d73ece4dfe1c93f7f659354e6aeb9b3559e976fd371cd894f8df2a4d76b75f7f7 *41d0760f8b6e9795cc7ca864f48a0628b96d76754aee2425bb1a25254d519da5dc829ca413c958 *2d67031f5b113d2466e29697f553655bce775d1aa724650bdea71a97158f06a05da3add0236c39 *edf8cc4cc1e7577a4169537efcaff8b8c67a73216cff5f99412e7719934fbd4d6c3069ffb678c8 *67f675dafced71e16d42e9cae06fb2f1f1284be2d9f7d85bf2381c8ec387de35ee5ce1bb6ce376 *a8cdd6a28b35f1308e245b322ada827cb435a334d363f4d8687417d238100bd1f25c45a1ee56ba *d0de2e149ad823673ea92845b9684931ca24cd00f8e35a4323560fb863345288556b259a15cd92 *55acdba870ace248e3718e37536705fa71e97c0506f6b5eff8652a312e1319389a0b35772495d6 *0f4de01d2786a6d89bd690039058bc06b10a150fcee5a4051f9ec74f40146f17edc9fb9bdb4249 *9ccfd8ad04c958d9b93cef55f41955fd9e85e97a9ec5afeb1415c9762eaa5414782fa61cb81dad *35899ff8d026c88ea23c72b5f45824513727522da39c67898ce43642d0c2ba1bdc0e25dea2de24 *7efe2e8e6564d4c0a4d445a502487e712ed5974fecf2f57f282f94931cff8a50f032da995e5c39 *4f6ea8f678a77d934b8bf40aa726ad41046368a63199a4956ba41ba9a430753b4a153a915e1e16 *99842ae1ce56e29749fb22e78df6b60a92a9a7f891f7c90f604d4a1f068137e44186a486b2df99 *9a7959fe62a57047aebd1b8b862954bd78c79a2c311692c83df526932a4e32b553f650bcd2a397 *a29cd487f577db510f84ef1e6ad47ed9f74bb5a58a52f3f9f8472204e58159fd2d8ff84a0f8d93 *c9cacf926a4b57b7419b8f1bf19942f874be005fffd36ad1efb76f6951614065f82fca1fb5e461 *a34ac8bcb24652031a6e8916304bb112d26fd4d153034a2c74119369e343bb501d58a6c12e811e *55dd641374c203b6f248b8154de2ee9b305b6dd3b3caa672e34b4fa5bbd8ea74a63469bb8cdade *eae714f3faa247b21658477efe6a2b512deab1173ff63b659bb651f8d670d148496f0da7bd17b4 *3d1adf1211efbd8e0fda88e722057219fe20607c710a64be763ed853beef98de12c19f1ee9db33 *d78acfe7603e3ca44cb9a293751a6f278fdbcccc7b4c726f24c39bf2cb4d528d2f182bf8987d79 *3952b893f7960fa443f68641f34d8d439fc9a9467ec4311f18ff0e9faf2ba8836ee9f8fe133caf *8015885fbfb06b3be43fa16e0ba6b2f1bbc65a473f9ba0769a229af83441f3098ffb739764b878 *75cb5ff334b05ddadb03669d79f8f2b0c337e7272f0fcffb4f0f8f8fffc35e1cbd3a3a3d3c3f7a *8687dea3d851d099b91df68cce5cc2e42bc4b4b1351dfd895150f05b673a74e7239bad894316fd *b8dc3858338c6ffef8fcf1f9e3f3c7e78f4fcdcfff031bded12500fc0100 }