utils-0.93/0000755000175100017510000000000015105376105012216 5ustar runnerrunnerutils-0.93/doc/0000755000175100017510000000000015105376105012763 5ustar runnerrunnerutils-0.93/doc/manual.lab0000644000175100017510000001631515105376105014726 0ustar runnerrunner\GAPDocLabFile{utils} \makelabel{utils:Title page}{}{X7D2C85EC87DD46E5} \makelabel{utils:Abstract}{}{X7AA6C5737B711C89} \makelabel{utils:Copyright}{}{X81488B807F2A1CF1} \makelabel{utils:Acknowledgements}{}{X82A988D47DFAFCFA} \makelabel{utils:Table of Contents}{}{X8537FEB07AF2BEC8} \makelabel{utils:Introduction}{1}{X7DFB63A97E67C0A1} \makelabel{utils:Information for package authors}{1.1}{X8508AD637B79CEE8} \makelabel{utils:Printing Lists and Iterators}{2}{X83686EE47E4D4F66} \makelabel{utils:Printing selected items}{2.1}{X7F6817927F86240F} \makelabel{utils:Lists, Sets and Strings}{3}{X7AE6EFC086C0EB3C} \makelabel{utils:Functions for lists}{3.1}{X7C3F1E7D878AAA65} \makelabel{utils:Distinct and Common Representatives}{3.2}{X82F443FF84B8FCE3} \makelabel{utils:Functions for strings}{3.3}{X8033A2FE80FC2F2A} \makelabel{utils:Number-theoretic functions}{4}{X86E71C1687F2D0AD} \makelabel{utils:Functions for integers}{4.1}{X7D33B5B17BF785CA} \makelabel{utils:Groups and homomorphisms}{5}{X8171DAF2833FF728} \makelabel{utils:Functions for groups}{5.1}{X7E21E6D285E6B12C} \makelabel{utils:Left Cosets for Groups}{5.2}{X7FE4848B7DE6B3FD} \makelabel{utils:Inverse}{5.2.2}{X793E48267EF5FD77} \makelabel{utils:Functions for group homomorphisms}{5.3}{X80A512877F515DE7} \makelabel{utils:Matrices}{6}{X812CCAB278643A59} \makelabel{utils:Some operations for matrices}{6.1}{X802118FB7C94D6BA} \makelabel{utils:Iterators}{7}{X85A3F00985453F95} \makelabel{utils:Some iterators for groups and their isomorphisms}{7.1}{X7BB5350081B27D17} \makelabel{utils:Operations on iterators}{7.2}{X85413EED812C6497} \makelabel{utils:Records}{8}{X7AA1073C7E943DD7} \makelabel{utils:Functions for records}{8.1}{X82B3D1D583CDF0E5} \makelabel{utils:Option records for functions}{8.2}{X7E6207B47B9AA30C} \makelabel{utils:Web Downloads}{9}{X815B0C4B7EBE6E1E} \makelabel{utils:Functions for downloading files from the web}{9.1}{X8758CB7F79EFB6ED} \makelabel{utils:User preference DownloadVerifyCertificate}{9.1.2}{X85182BA486E3C2AA} \makelabel{utils:User preference DownloadMaxTime}{9.1.3}{X79E10E5B83EF929F} \makelabel{utils:Various other functions}{10}{X83EFC3178180D918} \makelabel{utils:File operations}{10.1}{X81A0A4FF842B039B} \makelabel{utils:LaTeX strings}{10.2}{X84D2922D87EDE9E9} \makelabel{utils:Conversion to Magma strings}{10.3}{X79F021B1830B68F6} \makelabel{utils:Obsolete functions}{11}{X7F561B1D803182FF} \makelabel{utils:Operations from AutoDoc}{11.1}{X7A6BB3D084912F35} \makelabel{utils:Functions for printing}{11.2}{X86F322FC7DECE36F} \makelabel{utils:Other obsolete functions}{11.3}{X84A4F0B281FA0F94} \makelabel{utils:Applicable Methods}{11.3.1}{X78B7D1A982BE9866} \makelabel{utils:ExponentOfPrime}{11.3.2}{X7C1AF2467FB55D79} \makelabel{utils:The transfer procedure}{12}{X84AC9613842F014C} \makelabel{utils:Bibliography}{Bib}{X7A6F98FD85F02BFE} \makelabel{utils:References}{Bib}{X7A6F98FD85F02BFE} \makelabel{utils:Index}{Ind}{X83A0356F839C696F} \makelabel{utils:GitHub repository}{1}{X7DFB63A97E67C0A1} \makelabel{utils:PrintSelection for a list of positions}{2.1.1}{X784638AC84D49870} \makelabel{utils:PrintSelection for a first item and a step}{2.1.1}{X784638AC84D49870} \makelabel{utils:DifferencesList}{3.1.1}{X78B7C92681D2F13C} \makelabel{utils:QuotientsList}{3.1.2}{X7975371E865B89BC} \makelabel{utils:FloatQuotientsList}{3.1.2}{X7975371E865B89BC} \makelabel{utils:SearchCycle}{3.1.3}{X86096E73858CFABD} \makelabel{utils:RandomCombination}{3.1.4}{X7EF06CAD7F35245D} \makelabel{utils:distinct and common representatives}{3.2}{X82F443FF84B8FCE3} \makelabel{utils:DistinctRepresentatives}{3.2.1}{X78105CAA847A888C} \makelabel{utils:CommonRepresentatives}{3.2.1}{X78105CAA847A888C} \makelabel{utils:CommonTransversal}{3.2.1}{X78105CAA847A888C} \makelabel{utils:IsCommonTransversal}{3.2.1}{X78105CAA847A888C} \makelabel{utils:BlankFreeString}{3.3.1}{X870C964E7804B266} \makelabel{utils:AllSmoothIntegers for two integers}{4.1.1}{X8191A031788AC7C0} \makelabel{utils:AllSmoothIntegers for a list and an integer}{4.1.1}{X8191A031788AC7C0} \makelabel{utils:smooth integer}{4.1.1}{X8191A031788AC7C0} \makelabel{utils:AllProducts}{4.1.2}{X78BE6B8B878D250D} \makelabel{utils:RestrictedPartitionsWithoutRepetitions}{4.1.3}{X845F46E579CEA43F} \makelabel{utils:NextProbablyPrimeInt}{4.1.4}{X81708BF4858505E8} \makelabel{utils:PrimeNumbersIterator}{4.1.5}{X8021EEE5787FCA37} \makelabel{utils:Comm}{5.1.1}{X80761843831B468E} \makelabel{utils:IsCommuting}{5.1.2}{X803A050C7A183CCC} \makelabel{utils:ListOfPowers}{5.1.3}{X87A8F01286548037} \makelabel{utils:GeneratorsAndInverses}{5.1.4}{X820B71307E41BEE5} \makelabel{utils:UpperFittingSeries}{5.1.5}{X84CF95227F9D562F} \makelabel{utils:LowerFittingSeries}{5.1.5}{X84CF95227F9D562F} \makelabel{utils:FittingLength}{5.1.5}{X84CF95227F9D562F} \makelabel{utils:Fitting series}{5.1.5}{X84CF95227F9D562F} \makelabel{utils:LeftCoset}{5.2.1}{X8340B4537F17DCD3} \makelabel{utils:EpimorphismByGenerators}{5.3.1}{X80C9A0B583FEA7B9} \makelabel{utils:Pullback}{5.3.2}{X7C705F2A79F8E43C} \makelabel{utils:PullbackInfo}{5.3.2}{X7C705F2A79F8E43C} \makelabel{utils:CentralProduct}{5.3.3}{X78DD2C617B992BE2} \makelabel{utils:CentralProductInfo}{5.3.3}{X78DD2C617B992BE2} \makelabel{utils:IdempotentEndomorphisms}{5.3.4}{X801038CB808FC956} \makelabel{utils:IdempotentEndomorphismsData}{5.3.4}{X801038CB808FC956} \makelabel{utils:IdempotentEndomorphismsWithImage}{5.3.4}{X801038CB808FC956} \makelabel{utils:DirectProductOfFunctions}{5.3.5}{X81FA9E6C7F3B9238} \makelabel{utils:DirectProductOfAutomorphismGroups}{5.3.6}{X7CB2D5F27F4182AF} \makelabel{utils:DirectSumDecompositionMatrices}{6.1.1}{X787B89237E1398B6} \makelabel{utils:Iterators}{7.1}{X7BB5350081B27D17} \makelabel{utils:AllIsomorphismsIterator}{7.1.1}{X7F8B54D1806C762D} \makelabel{utils:AllIsomorphismsNumber}{7.1.1}{X7F8B54D1806C762D} \makelabel{utils:AllIsomorphisms}{7.1.1}{X7F8B54D1806C762D} \makelabel{utils:AllSubgroupsIterator}{7.1.2}{X831DA5AE8437578F} \makelabel{utils:CartesianIterator}{7.2.1}{X87395A9181A35301} \makelabel{utils:UnorderedPairsIterator}{7.2.2}{X7C95E27987A812EA} \makelabel{utils:AssignGlobals}{8.1.1}{X84D82EB579B2ACCD} \makelabel{utils:OptionRecordWithDefaults}{8.2.1}{X8322B9377CC590D2} \makelabel{utils:Download}{9.1.1}{X7A7438AE8448635E} \makelabel{utils:DownloadVerifyCertificate}{9.1.2}{X85182BA486E3C2AA} \makelabel{utils:DownloadMaxTime}{9.1.3}{X79E10E5B83EF929F} \makelabel{utils:Log2HTML}{10.1.1}{X7B7ECADF85F748BE} \makelabel{utils:IntOrOnfinityToLaTeX}{10.2.1}{X87DEB2B58266F858} \makelabel{utils:LaTeXStringFactorsInt}{10.2.2}{X7DC642B97CD02F4E} \makelabel{utils:ConvertToMagmaInputString}{10.3.1}{X8768D7707B4CBBD4} \makelabel{utils:PermGroupToMagmaFormat}{10.3.1}{X8768D7707B4CBBD4} \makelabel{utils:PcGroupToMagmaFormat}{10.3.1}{X8768D7707B4CBBD4} \makelabel{utils:MatrixGroupToMagmaFormat}{10.3.1}{X8768D7707B4CBBD4} \makelabel{utils:FindMatchingFiles}{11.1}{X7A6BB3D084912F35} \makelabel{utils:CreateDirIfMissing}{11.1}{X7A6BB3D084912F35} \makelabel{utils:StringDotSuffix}{11.1}{X7A6BB3D084912F35} \makelabel{utils:GetSuffix}{11.1}{X7A6BB3D084912F35} \makelabel{utils:SetIfMissing}{11.1}{X7A6BB3D084912F35} \makelabel{utils:PrintOneItemPerLine}{11.2}{X86F322FC7DECE36F} \makelabel{utils:PrintApplicableMethod}{11.3.1}{X78B7D1A982BE9866} \makelabel{utils:ExponentOfPrime}{11.3.2}{X7C1AF2467FB55D79} \makelabel{utils:OKtoReadFromUtils}{12}{X84AC9613842F014C} utils-0.93/doc/chap4.txt0000644000175100017510000001670415105376105014533 0ustar runnerrunner 4 Number-theoretic functions 4.1 Functions for integers 4.1-1 AllSmoothIntegers AllSmoothIntegers( maxp, maxn )  function AllSmoothIntegers( L, maxp )  function This function has been transferred from package RCWA. The function AllSmoothIntegers(maxp,maxn) returns the list of all positive integers less than or equal to maxn whose prime factors are all in the list L = {p ~|~ p leqslant maxp, p~mboxprime }. In the alternative form, when L is a list of primes, the function returns the list of all positive integers whose prime factors lie in L.  Example   gap> AllSmoothIntegers( 3, 1000 ); [ 1, 2, 3, 4, 6, 8, 9, 12, 16, 18, 24, 27, 32, 36, 48, 54, 64, 72, 81, 96,   108, 128, 144, 162, 192, 216, 243, 256, 288, 324, 384, 432, 486, 512, 576,   648, 729, 768, 864, 972 ] gap> AllSmoothIntegers( [5,11,17], 1000 ); [ 1, 5, 11, 17, 25, 55, 85, 121, 125, 187, 275, 289, 425, 605, 625, 935 ] gap> Length( last ); 16 gap> List( [3..20], n -> Length( AllSmoothIntegers( [5,11,17], 10^n ) ) ); [ 16, 29, 50, 78, 114, 155, 212, 282, 359, 452, 565, 691, 831, 992, 1173,   1374, 1595, 1843 ]   4.1-2 AllProducts AllProducts( L, k )  function This function has been transferred from package RCWA. The command AllProducts(L,k) returns the list of all products of k entries of the list L. Note that every ordering of the entries is used so that, in the commuting case, there are bound to be repetitions.  Example   gap> AllProducts([1..4],3);  [ 1, 2, 3, 4, 2, 4, 6, 8, 3, 6, 9, 12, 4, 8, 12, 16, 2, 4, 6, 8, 4, 8, 12,   16, 6, 12, 18, 24, 8, 16, 24, 32, 3, 6, 9, 12, 6, 12, 18, 24, 9, 18, 27,   36, 12, 24, 36, 48, 4, 8, 12, 16, 8, 16, 24, 32, 12, 24, 36, 48, 16, 32,   48, 64 ] gap> Set(last);  [ 1, 2, 3, 4, 6, 8, 9, 12, 16, 18, 24, 27, 32, 36, 48, 64 ] gap> AllProducts( [(1,2,3),(2,3,4)], 2 ); [ (2,4,3), (1,2)(3,4), (1,3)(2,4), (1,3,2) ]   4.1-3 RestrictedPartitionsWithoutRepetitions RestrictedPartitionsWithoutRepetitions( n, S )  function This function has been transferred from package RCWA. For a positive integer n and a set of positive integers S, this function returns the list of partitions of n into distinct elements of S. Unlike RestrictedPartitions, no repetitions are allowed.  Example   gap> RestrictedPartitions( 20, [4..10] ); [ [ 4, 4, 4, 4, 4 ], [ 5, 5, 5, 5 ], [ 6, 5, 5, 4 ], [ 6, 6, 4, 4 ],   [ 7, 5, 4, 4 ], [ 7, 7, 6 ], [ 8, 4, 4, 4 ], [ 8, 6, 6 ], [ 8, 7, 5 ],   [ 8, 8, 4 ], [ 9, 6, 5 ], [ 9, 7, 4 ], [ 10, 5, 5 ], [ 10, 6, 4 ],   [ 10, 10 ] ] gap> RestrictedPartitionsWithoutRepetitions( 20, [4..10] ); [ [ 10, 6, 4 ], [ 9, 7, 4 ], [ 9, 6, 5 ], [ 8, 7, 5 ] ] gap> RestrictedPartitionsWithoutRepetitions( 10^2, List([1..10], n->n^2 ) ); [ [ 100 ], [ 64, 36 ], [ 49, 25, 16, 9, 1 ] ]   4.1-4 NextProbablyPrimeInt NextProbablyPrimeInt( n )  function This function has been transferred from package RCWA. The function NextProbablyPrimeInt(n) does the same as NextPrimeInt(n) except that for reasons of performance it tests numbers only for IsProbablyPrimeInt(n) instead of IsPrimeInt(n). For large n, this function is much faster than NextPrimeInt(n)  Example   gap> n := 2^251; 3618502788666131106986593281521497120414687020801267626233049500247285301248 gap> NextProbablyPrimeInt( n ); 3618502788666131106986593281521497120414687020801267626233049500247285301313 gap> time;  1 gap> NextPrimeInt( n );  3618502788666131106986593281521497120414687020801267626233049500247285301313 gap> time;  213   4.1-5 PrimeNumbersIterator PrimeNumbersIterator( [chunksize] )  function This function has been transferred from package RCWA. This function returns an iterator which runs over the prime numbers n ascending order; it takes an optional argument chunksize which specifies the length of the interval which is sieved in one go (the default is 10^7), and which can be used to balance runtime vs. memory consumption. It is assumed that chunksize is larger than any gap between two consecutive primes within the range one intends to run the iterator over.  Example   gap> iter := PrimeNumbersIterator();; gap> for i in [1..100] do p := NextIterator(iter); od; gap> p; 541 gap> sum := 0;; gap> ## "prime number race" 1 vs. 3 mod 4 gap> for p in PrimeNumbersIterator() do  >  if p <> 2 then sum := sum + E(4)^(p-1); fi; >  if sum > 0 then break; fi; >  od; gap> p; 26861   utils-0.93/doc/chap3.html0000644000175100017510000004023415105376105014652 0ustar runnerrunner GAP (Utils) - Chapter 3: Lists, Sets and Strings
Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind
 [Top of Book]  [Contents]   [Previous Chapter]   [Next Chapter] 

3 Lists, Sets and Strings
 3.1 Functions for lists
 3.2 Distinct and Common Representatives
 3.3 Functions for strings

3 Lists, Sets and Strings

3.1 Functions for lists

3.1-1 DifferencesList
‣ DifferencesList( L )( function )

This function has been transferred from package ResClasses.

It takes a list L of length n and outputs the list of length n-1 containing all the differences L[i]-L[i-1].


gap> List( [1..12], n->n^3 );
[ 1, 8, 27, 64, 125, 216, 343, 512, 729, 1000, 1331, 1728 ]
gap> DifferencesList( last );
[ 7, 19, 37, 61, 91, 127, 169, 217, 271, 331, 397 ]
gap> DifferencesList( last );
[ 12, 18, 24, 30, 36, 42, 48, 54, 60, 66 ]
gap> DifferencesList( last );
[ 6, 6, 6, 6, 6, 6, 6, 6, 6 ]

3.1-2 QuotientsList
‣ QuotientsList( L )( function )
‣ FloatQuotientsList( L )( function )

These functions have been transferred from package ResClasses.

They take a list L of length n and output the quotients L[i]/L[i-1] of consecutive entries in L. An error is returned if an entry is zero.


gap> List( [0..10], n -> Factorial(n) );
[ 1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800 ]
gap> QuotientsList( last );
[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
gap> L := [ 1, 3, 5, -1, -3, -5 ];;
gap> QuotientsList( L );
[ 3, 5/3, -1/5, 3, 5/3 ]
gap> FloatQuotientsList( L );
[ 3., 1.66667, -0.2, 3., 1.66667 ]
gap> QuotientsList( [ 2, 1, 0, -1, -2 ] );
[ 1/2, 0, fail, 2 ]
gap> FloatQuotientsList( [1..10] );
[ 2., 1.5, 1.33333, 1.25, 1.2, 1.16667, 1.14286, 1.125, 1.11111 ]
gap> Product( last );
10. 

3.1-3 SearchCycle
‣ SearchCycle( L )( operation )

This function has been transferred from package RCWA.

SearchCycle is a tool to find likely cycles in lists. What, precisely, a cycle is, is deliberately fuzzy here, and may possibly even change. The idea is that the beginning of the list may be anything, following that the same pattern needs to be repeated several times in order to be recognized as a cycle.


gap> L := [1..20];;  L[1]:=13;;                                              
gap> for i in [1..19] do                                                     
>        if IsOddInt(L[i]) then L[i+1]:=3*L[i]+1; else L[i+1]:=L[i]/2; fi;
>    od;                                                                  
gap> L;                                                                      
[ 13, 40, 20, 10, 5, 16, 8, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4 ]
gap> SearchCycle( L );                                                       
[ 1, 4, 2 ]
gap> n := 1;;  L := [n];;
gap> for i in [1..100] do  n:=(n^2+1) mod 1093;  Add(L,n);  od;
gap> L; 
[ 1, 2, 5, 26, 677, 363, 610, 481, 739, 715, 795, 272, 754, 157, 604, 848, 
  1004, 271, 211, 802, 521, 378, 795, 272, 754, 157, 604, 848, 1004, 271, 
  211, 802, 521, 378, 795, 272, 754, 157, 604, 848, 1004, 271, 211, 802, 521, 
  378, 795, 272, 754, 157, 604, 848, 1004, 271, 211, 802, 521, 378, 795, 272, 
  754, 157, 604, 848, 1004, 271, 211, 802, 521, 378, 795, 272, 754, 157, 604, 
  848, 1004, 271, 211, 802, 521, 378, 795, 272, 754, 157, 604, 848, 1004, 
  271, 211, 802, 521, 378, 795, 272, 754, 157, 604, 848, 1004 ]
gap> C := SearchCycle( L );
[ 157, 604, 848, 1004, 271, 211, 802, 521, 378, 795, 272, 754 ]
gap> P := Positions( L, 157 );
[ 14, 26, 38, 50, 62, 74, 86, 98 ]
gap> Length( C );  DifferencesList( P );
12
[ 12, 12, 12, 12, 12, 12, 12 ]

3.1-4 RandomCombination
‣ RandomCombination( S, k )( operation )

This function has been transferred from package ResClasses.

It returns a random unordered k-tuple of distinct elements of a set S.


gap> ## "6 aus 49" is a common lottery in Germany
gap> RandomCombination( [1..49], 6 ); 
[ 2, 16, 24, 26, 37, 47 ]

3.2 Distinct and Common Representatives

3.2-1 DistinctRepresentatives
‣ DistinctRepresentatives( list )( operation )
‣ CommonRepresentatives( list )( operation )
‣ CommonTransversal( grp, subgrp )( operation )
‣ IsCommonTransversal( grp, subgrp, list )( operation )

These operations have been transferred from package XMod.

They deal with lists of subsets of [1 ... n] and construct systems of distinct and common representatives using simple, non-recursive, combinatorial algorithms.

When L is a set of n subsets of [1 ... n] and the Hall condition is satisfied (the union of any k subsets has at least k elements), a set of DistinctRepresentatives exists.

When J,K are both lists of n sets, the operation CommonRepresentatives returns two lists: the set of representatives, and a permutation of the subsets of the second list.

The operation CommonTransversal may be used to provide a common transversal for the sets of left and right cosets of a subgroup H of a group G, although a greedy algorithm is usually quicker.


gap> J := [ [1,2,3], [3,4], [3,4], [1,2,4] ];;
gap> DistinctRepresentatives( J );
[ 1, 3, 4, 2 ]
gap> K := [ [3,4], [1,2], [2,3], [2,3,4] ];;
gap> CommonRepresentatives( J, K );
[ [ 3, 3, 3, 1 ], [ 1, 3, 4, 2 ] ]
gap> d16 := DihedralGroup( IsPermGroup, 16 ); 
Group([ (1,2,3,4,5,6,7,8), (2,8)(3,7)(4,6) ])
gap> SetName( d16, "d16" );
gap> c4 := Subgroup( d16, [ d16.1^2 ] ); 
Group([ (1,3,5,7)(2,4,6,8) ])
gap> SetName( c4, "c4" );
gap> RightCosets( d16, c4 );
[ RightCoset(c4,()), RightCoset(c4,(2,8)(3,7)(4,6)), RightCoset(c4,(1,8,7,6,5,
   4,3,2)), RightCoset(c4,(1,8)(2,7)(3,6)(4,5)) ]
gap> trans := CommonTransversal( d16, c4 );
[ (), (2,8)(3,7)(4,6), (1,2,3,4,5,6,7,8), (1,2)(3,8)(4,7)(5,6) ]
gap> IsCommonTransversal( d16, c4, trans );
true

3.3 Functions for strings

3.3-1 BlankFreeString
‣ BlankFreeString( obj )( function )

This function has been transferred from package ResClasses.

The result of BlankFreeString( obj ); is a composite of the functions String( obj ) and RemoveCharacters( obj, " " );.


gap> gens := GeneratorsOfGroup( DihedralGroup(12) );
[ f1, f2, f3 ]
gap> String( gens );                                
"[ f1, f2, f3 ]"
gap> BlankFreeString( gens );                       
"[f1,f2,f3]"

 [Top of Book]  [Contents]   [Previous Chapter]   [Next Chapter] 
Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind

generated by GAPDoc2HTML

utils-0.93/doc/chapInd_mj.html0000644000175100017510000002251515105376105015712 0ustar runnerrunner GAP (Utils) - Index
Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind
 [Top of Book]  [Contents]   [Previous Chapter] 

Index

AllIsomorphisms 7.1-1
AllIsomorphismsIterator 7.1-1
AllIsomorphismsNumber 7.1-1
AllProducts 4.1-2
AllSmoothIntegers, for a list and an integer 4.1-1
    for two integers 4.1-1
AllSubgroupsIterator 7.1-2
AssignGlobals 8.1-1
BlankFreeString 3.3-1
CartesianIterator 7.2-1
CentralProduct 5.3-3
CentralProductInfo 5.3-3
Comm 5.1-1
CommonRepresentatives 3.2-1
CommonTransversal 3.2-1
ConvertToMagmaInputString 10.3-1
CreateDirIfMissing 11.1
DifferencesList 3.1-1
DirectProductOfAutomorphismGroups 5.3-6
DirectProductOfFunctions 5.3-5
DirectSumDecompositionMatrices 6.1-1
distinct and common representatives 3.2
DistinctRepresentatives 3.2-1
Download 9.1-1
DownloadMaxTime 9.1-3
DownloadVerifyCertificate 9.1-2
EpimorphismByGenerators 5.3-1
ExponentOfPrime 11.3-2
FindMatchingFiles 11.1
Fitting series 5.1-5
FittingLength 5.1-5
FloatQuotientsList 3.1-2
GeneratorsAndInverses 5.1-4
GetSuffix 11.1
GitHub repository 1.
IdempotentEndomorphisms 5.3-4
IdempotentEndomorphismsData 5.3-4
IdempotentEndomorphismsWithImage 5.3-4
IntOrOnfinityToLaTeX 10.2-1
IsCommonTransversal 3.2-1
IsCommuting 5.1-2
Iterators 7.1
LaTeXStringFactorsInt 10.2-2
LeftCoset 5.2-1
ListOfPowers 5.1-3
Log2HTML 10.1-1
LowerFittingSeries 5.1-5
MatrixGroupToMagmaFormat 10.3-1
NextProbablyPrimeInt 4.1-4
OKtoReadFromUtils 12.
OptionRecordWithDefaults 8.2-1
PcGroupToMagmaFormat 10.3-1
PermGroupToMagmaFormat 10.3-1
PrimeNumbersIterator 4.1-5
PrintApplicableMethod 11.3-1
PrintOneItemPerLine 11.2
PrintSelection, for a first item and a step 2.1-1
    for a list of positions 2.1-1
Pullback 5.3-2
PullbackInfo 5.3-2
QuotientsList 3.1-2
RandomCombination 3.1-4
RestrictedPartitionsWithoutRepetitions 4.1-3
SearchCycle 3.1-3
SetIfMissing 11.1
smooth integer 4.1-1
StringDotSuffix 11.1
UnorderedPairsIterator 7.2-2
UpperFittingSeries 5.1-5

 [Top of Book]  [Contents]   [Previous Chapter] 
Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind

generated by GAPDoc2HTML

utils-0.93/doc/bib.xml.bib0000644000175100017510000001141715105376105015000 0ustar runnerrunner @manual{ AutoDoc, author = {Gutsche, S. and Horn, M.}, title = {{AutoDoc \texttt{\symbol{45}} Generate documentation from GAP source code (Version 2016.12.04)}}, year = {2016}, note = {GAP package, \href {https://github.com/gap-packages/AutoDoc} {\texttt{https://github.com/}\discretionary {}{}{}\texttt{gap\texttt{\symbol{45}}packages/}\discretionary {}{}{}\texttt{AutoDoc}}}, printedkey = {GH16} } @manual{ GAPDoc, author = {L{\"u}beck, F. and Neunh{\"o}ffer, M.}, title = {{GAPDoc (Version 1.6)}}, organization = {RWTH Aachen}, year = {2017}, note = {GAP package, \href {https://www.math.rwth-aachen.de/~Frank.Luebeck/GAPDoc/index.html} {\texttt{https://www.math.rwth\texttt{\symbol{45}}aachen.de/}\discretionary {}{}{}\texttt{\texttt{\symbol{126}}Frank.Luebeck/}\discretionary {}{}{}\texttt{GAPDoc/}\discretionary {}{}{}\texttt{index.html}}}, printedkey = {LN17} } @manual{ GitHubPagesForGAP, author = {Horn, M.}, title = {{GitHubPagesForGAP \texttt{\symbol{45}} Template for easily using GitHub Pages within GAP packages (Version 0.2)}}, year = {2017}, note = {GAP package, \href {https://gap-system.github.io/GitHubPagesForGAP/} {\texttt{https://gap\texttt{\symbol{45}}system.github.io/}\discretionary {}{}{}\texttt{GitHubPagesForGAP/}}}, printedkey = {Hor17} } @manual{ MAGMA, author = {Bosma, W. and Cannon, J. and Playoust, C.}, title = {{The Magma algebra system. \texttt{\symbol{123}}I\texttt{\symbol{125}}. The user language}}, journal = {J. Symbolic Comput.}, volume = {24}, number = {3\texttt{\symbol{45}}4}, year = {1997}, pages = {235\texttt{\symbol{45}}\texttt{\symbol{45}}265}, note = {Computational algebra and number theory (London, 1993)\texttt{\symbol{125}} \href {https://doi.org/10.1006/jsco.1996.0125} {\texttt{https://doi.org/}\discretionary {}{}{}\texttt{10.1006/}\discretionary {}{}{}\texttt{jsco.1996.0125}}}, mrclass = {68Q40}, mrnumber = {MR1484478}, ISSN = {0747\texttt{\symbol{45}}7171}, doi = {10.1006/jsco.1996.0125}, printedkey = {BCP97} } @manual{ RCWA, author = {Kohl, S.}, title = {{RCWA \texttt{\symbol{45}} Residue\texttt{\symbol{45}}Class\texttt{\symbol{45}}Wise Affine Groups (Version 4.5.1)}}, year = {2017}, note = {GAP package, \href {https://stefan-kohl.github.io/rcwa.html} {\texttt{https://stefan\texttt{\symbol{45}}kohl.github.io/}\discretionary {}{}{}\texttt{rcwa.html}}}, printedkey = {Koh17} } @manual{ ResClasses, author = {Kohl, S.}, title = {{ResClasses \texttt{\symbol{45}} Set\texttt{\symbol{45}}Theoretic Computations with Residue Classes (Version 4.6.0)}}, year = {2017}, note = {GAP package, \href {https://stefan-kohl.github.io/resclasses.html} {\texttt{https://stefan\texttt{\symbol{45}}kohl.github.io/}\discretionary {}{}{}\texttt{resclasses.html}}}, printedkey = {Koh17} } @manual{ XMod, author = {Wensley, C. D. and Alp, M. and Odabas, A. and Uslu, E. O.}, title = {{XMod \texttt{\symbol{45}} Crossed Modules and Cat1\texttt{\symbol{45}}groups in GAP (Version 2.64)}}, year = {2017}, note = {GAP package, \href {https://github.com/gap-packages/xmod} {\texttt{https://github.com/}\discretionary {}{}{}\texttt{gap\texttt{\symbol{45}}packages/}\discretionary {}{}{}\texttt{xmod}}}, printedkey = {WAOU17} } utils-0.93/doc/chap10.html0000644000175100017510000002644415105376105014737 0ustar runnerrunner GAP (Utils) - Chapter 10: Various other functions
Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind
 [Top of Book]  [Contents]   [Previous Chapter]   [Next Chapter] 

10 Various other functions
 10.1 File operations
 10.2 LaTeX strings
 10.3 Conversion to Magma strings

10 Various other functions

10.1 File operations

10.1-1 Log2HTML
‣ Log2HTML( filename )( function )

This function has been transferred from package RCWA.

This function converts the GAP logfile filename to HTML. It appears that the logfile should be in your current directory. The extension of the input file must be *.log. The name of the output file is the same as the one of the input file except that the extension *.log is replaced by *.html. There is a sample CSS file in utils/doc/gaplog.css, which you can adjust to your taste.


gap> LogTo( "triv.log" );
gap> a := 33^5;
39135393
gap> LogTo(); 
gap> Log2HTML( "triv.log" );     

10.2 LaTeX strings

10.2-1 IntOrOnfinityToLaTeX
‣ IntOrOnfinityToLaTeX( n )( function )

This function has been transferred from package ResClasses.

IntOrInfinityToLaTeX(n) returns the LaTeX string for n.


gap> IntOrInfinityToLaTeX( 10^3 );
"1000"
gap> IntOrInfinityToLaTeX( infinity );
"\\infty"

10.2-2 LaTeXStringFactorsInt
‣ LaTeXStringFactorsInt( n )( function )

This function has been transferred from package RCWA.

It returns the prime factorization of the integer n as a string in LaTeX format.


gap> LaTeXStringFactorsInt( Factorial(12) );
"2^{10} \\cdot 3^5 \\cdot 5^2 \\cdot 7 \\cdot 11"

10.3 Conversion to Magma strings

10.3-1 ConvertToMagmaInputString
‣ ConvertToMagmaInputString( arg )( function )

The function ConvertToMagmaInputString( obj [, str] ) attempts to output a string s which can be read into Magma [BCP97] so as to produce the same group in that computer algebra system. In the second form the user specifies the name of the resulting object, so that the output string has the form "str := ...".

When obj is a permutation group, the operation PermGroupToMagmaFormat(obj) is called. This function has been taken from other.gi in the main library where it was called MagmaInputString.

When obj is a pc-group, the operation PcGroupToMagmaFormat(obj) is called. This function was private code of Max Horn.

When obj is a matrix group over a finite field, the operation MatrixGroupToMagmaFormat(obj) is called. This function is a modification of private code of Frank LĂĽbeck.

Hopefully code for other types of group will be added in due course.

These functions should be considered experimental, and more testing is desirable.


gap> ## permutation groups
gap> ConvertToMagmaInputString( Group( (1,2,3,4,5), (3,4,5) ) );
"PermutationGroup<5|(1,2,3,4,5),\n(3,4,5)>;\n"
gap> ConvertToMagmaInputString( Group( (1,2,3,4,5) ), "c5" );        
"c5 := PermutationGroup<5|(1,2,3,4,5)>;\n"
gap> ## pc-group
gap> ConvertToMagmaInputString( DihedralGroup( IsPcGroup, 10 ) );
"PolycyclicGroup< f1,f2 |\nf1^2,\nf2^5,\nf2^f1 = f2^4\n>;\n"
gap> ## fp-group
gap> F2 := FreeGroup( 2 );;
gap> f := F2.1;;  g := F2.2;;
gap> relq8 := [ f^4, g^4, f*g*f*g^-1, f^2*g^2 ];; 
gap> q8 := F2/relq8;; 
gap> ConvertToMagmaInputString( q8 );
no conversion function yet available for fp-groups
fail
gap> ## matrix group
gap> M := GL(2,5);;  Size(M); 
480
gap> s1 := ConvertToMagmaInputString( M );
"F := GF(5);\nP := GL(2,F);\ngens := [\nP![2,0,0,1],\nP![4,1,4,0]\n];\nsub<P |\
 gens>;\n"
gap> Print( s1 );
F := GF(5);
P := GL(2,F);
gens := [
P![2,0,0,1],
P![4,1,4,0]
];
sub<P | gens>;
gap> n1 := [ [ Z(9)^0, Z(9)^0 ], [ Z(9)^0, Z(9) ] ];;
gap> n2 := [ [ Z(9)^0, Z(9)^3 ], [ Z(9)^4, Z(9)^2 ] ];;
gap> N := Group( n1, n2 );;  Size( N );
5760
gap> s2 := ConvertToMagmaInputString( N, "gpN" );;
gap> Print( s2 );
F := GF(3^2);
P := GL(2,F);
w := PrimitiveElement(F);
gens := [
P![ 1, 1, 1,w^1],
P![ 1,w^3, 2,w^2]
];
gpN := sub<P | gens>;

 [Top of Book]  [Contents]   [Previous Chapter]   [Next Chapter] 
Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind

generated by GAPDoc2HTML

utils-0.93/doc/ragged.css0000644000175100017510000000023115105376105014722 0ustar runnerrunner/* times.css Frank LĂĽbeck */ /* Change default CSS to use Times font. */ body { text-align: left; } utils-0.93/doc/chap9.html0000644000175100017510000002615315105376105014664 0ustar runnerrunner GAP (Utils) - Chapter 9: Web Downloads
Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind
 [Top of Book]  [Contents]   [Previous Chapter]   [Next Chapter] 

9 Web Downloads
 9.1 Functions for downloading files from the web

9 Web Downloads

The Download operation has been written by Thomas Breuer, incorporating a number of suggestions from Max Horn, for version 0.77 of Utils. It implements downloading a file from within GAP. It can use the IO or curlInterface packages, or wget or curl, if installed, and it can be extended with other download methods quite easily. It is envisaged that, once other packages have started to use it, and any problems have been addressed, that the functions will be transferred to the main GAP library.

9.1 Functions for downloading files from the web

9.1-1 Download
‣ Download( url[, opt] )( function )

This function downloads the file with the web address url, which must be a string.

The result is a record which has at least the component success, with value true if the download was successful and false otherwise. In the former case, the component result is bound, whose value is a string that contains the contents of the downloaded file. In the latter case, the component error is bound, whose value is a string that describes the problem.

The function calls the methods stored in the global list Download_Methods until one of them is successful. Currently there are methods based on the GAP functions DownloadURL (curl: DownloadURL) and SingleHTTPRequest (IO: SingleHTTPRequest), and methods based on the external programs wget and curl.

An optional record opt can be given. The following components are supported.

maxTime

If this component is bound then its value must be a nonnegative integer n, meaning that the function gives up after n seconds.

A zero value of n means that no timeout is set, the method will never give up in this case.

The default for n is given by the value of the user preference DownloadMaxTime (see 9.1-3).

target

If this component is bound then its value must be a string that is a local filename, and the function writes the downloaded contents to this file; the returned record does not have a result component in this case.

verifyCert

If this component is bound and has the value false then those download methods that are based on curl or wget will omit the check of the server's certificate.

The same effect is achieved for all Download calls by setting the user preference DownloadVerifyCertificate (see 9.1-2) to false and omitting the verifyCert component from opt.


gap> url:= "https://www.gap-system.org/index.html";;
gap> res1:= Download( url );;
gap> res1.success;
true
gap> IsBound( res1.result ) and IsString( res1.result );
true
gap> res2:= Download( Concatenation( url, "xxx" ) );;
gap> res2.success;
false
gap> IsBound( res2.error ) and IsString( res2.error );
true

9.1-2 User preference DownloadVerifyCertificate

The value true (the default) means that the server's certificate is checked in calls of Download (9.1-1), such that nothing gets downloaded if the certificate is invalid.

If the value is false then download methods are supposed to omit the check of the server's certificate (this may not be supported by all download methods).

One can set the value of the preference to be val via SetUserPreference (Reference: SetUserPreference), by calling SetUserPreference( "utils", "DownloadVerifyCertificate", val ), and access the current value via UserPreference (Reference: UserPreference), by calling UserPreference( "utils", "DownloadVerifyCertificate" ).

We recommend leaving this preference at its default value true. Sometimes it can be necessary to change it, e.g. to work around issues with old operating systems which may not be able to correctly verify new certificates. In general it is better to update such a system, but if that is not an option, then disabling certificate checks may be a good last resort.

9.1-3 User preference DownloadMaxTime

The value 0 (the default) means that no timeout is set in calls of Download (9.1-1). If the value is a positive integer n then those download methods that support a timeout will give up after n seconds.

One can set the value of the preference to be val via SetUserPreference (Reference: SetUserPreference), by calling SetUserPreference( "utils", "DownloadMaxTime", val ), and access the current value via UserPreference (Reference: UserPreference), by calling UserPreference( "utils", "DownloadMaxTime" ).

 [Top of Book]  [Contents]   [Previous Chapter]   [Next Chapter] 
Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind

generated by GAPDoc2HTML

utils-0.93/doc/template.xml0000644000175100017510000000174415105376105015326 0ustar runnerrunner Number-theoretic functions
Functions for integers These functions are in the process of being transferred from package &Home;.

They

utils-0.93/doc/chooser.html0000644000175100017510000000745615105376105015327 0ustar runnerrunner GAPDoc Style Chooser

Setting preferences for GAPDoc manuals

Unfold subsections in menus only by mouse clicks: no (default)     yes

Show GAP examples as in sessions with ColorPrompt(true): yes (default)     no

Display side of table of contents within chapters: right (default)     left

Main document font: Helvetica/sans serif (default)     Times/serif

Paragraph formatting: left-right justified (default)     ragged right

Apply settings to last page.

utils-0.93/doc/lists.xml0000644000175100017510000001646515105376105014657 0ustar runnerrunner Lists, Sets and Strings
Functions for lists This function has been transferred from package &ResClasses;.

It takes a list L of length n and outputs the list of length n-1 containing all the differences L[i]-L[i-1].

List( [1..12], n->n^3 ); [ 1, 8, 27, 64, 125, 216, 343, 512, 729, 1000, 1331, 1728 ] gap> DifferencesList( last ); [ 7, 19, 37, 61, 91, 127, 169, 217, 271, 331, 397 ] gap> DifferencesList( last ); [ 12, 18, 24, 30, 36, 42, 48, 54, 60, 66 ] gap> DifferencesList( last ); [ 6, 6, 6, 6, 6, 6, 6, 6, 6 ] ]]> These functions have been transferred from package &ResClasses;.

They take a list L of length n and output the quotients L[i]/L[i-1] of consecutive entries in L. An error is returned if an entry is zero.

List( [0..10], n -> Factorial(n) ); [ 1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800 ] gap> QuotientsList( last ); [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ] gap> L := [ 1, 3, 5, -1, -3, -5 ];; gap> QuotientsList( L ); [ 3, 5/3, -1/5, 3, 5/3 ] gap> FloatQuotientsList( L ); [ 3., 1.66667, -0.2, 3., 1.66667 ] gap> QuotientsList( [ 2, 1, 0, -1, -2 ] ); [ 1/2, 0, fail, 2 ] gap> FloatQuotientsList( [1..10] ); [ 2., 1.5, 1.33333, 1.25, 1.2, 1.16667, 1.14286, 1.125, 1.11111 ] gap> Product( last ); 10. ]]> This function has been transferred from package &RCWA;.

SearchCycle is a tool to find likely cycles in lists. What, precisely, a cycle is, is deliberately fuzzy here, and may possibly even change. The idea is that the beginning of the list may be anything, following that the same pattern needs to be repeated several times in order to be recognized as a cycle.

L := [1..20];; L[1]:=13;; gap> for i in [1..19] do > if IsOddInt(L[i]) then L[i+1]:=3*L[i]+1; else L[i+1]:=L[i]/2; fi; > od; gap> L; [ 13, 40, 20, 10, 5, 16, 8, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4 ] gap> SearchCycle( L ); [ 1, 4, 2 ] gap> n := 1;; L := [n];; gap> for i in [1..100] do n:=(n^2+1) mod 1093; Add(L,n); od; gap> L; [ 1, 2, 5, 26, 677, 363, 610, 481, 739, 715, 795, 272, 754, 157, 604, 848, 1004, 271, 211, 802, 521, 378, 795, 272, 754, 157, 604, 848, 1004, 271, 211, 802, 521, 378, 795, 272, 754, 157, 604, 848, 1004, 271, 211, 802, 521, 378, 795, 272, 754, 157, 604, 848, 1004, 271, 211, 802, 521, 378, 795, 272, 754, 157, 604, 848, 1004, 271, 211, 802, 521, 378, 795, 272, 754, 157, 604, 848, 1004, 271, 211, 802, 521, 378, 795, 272, 754, 157, 604, 848, 1004, 271, 211, 802, 521, 378, 795, 272, 754, 157, 604, 848, 1004 ] gap> C := SearchCycle( L ); [ 157, 604, 848, 1004, 271, 211, 802, 521, 378, 795, 272, 754 ] gap> P := Positions( L, 157 ); [ 14, 26, 38, 50, 62, 74, 86, 98 ] gap> Length( C ); DifferencesList( P ); 12 [ 12, 12, 12, 12, 12, 12, 12 ] ]]> This function has been transferred from package &ResClasses;.

It returns a random unordered k-tuple of distinct elements of a set S.

## "6 aus 49" is a common lottery in Germany gap> RandomCombination( [1..49], 6 ); [ 2, 16, 24, 26, 37, 47 ] ]]>

Distinct and Common Representatives distinct and common representatives These operations have been transferred from package &XMod;.

They deal with lists of subsets of [1 \ldots n] and construct systems of distinct and common representatives using simple, non-recursive, combinatorial algorithms.

When L is a set of n subsets of [1 \ldots n] and the Hall condition is satisfied (the union of any k subsets has at least k elements), a set of DistinctRepresentatives exists.

When J,K are both lists of n sets, the operation CommonRepresentatives returns two lists: the set of representatives, and a permutation of the subsets of the second list.

The operation CommonTransversal may be used to provide a common transversal for the sets of left and right cosets of a subgroup H of a group G, although a greedy algorithm is usually quicker.

J := [ [1,2,3], [3,4], [3,4], [1,2,4] ];; gap> DistinctRepresentatives( J ); [ 1, 3, 4, 2 ] gap> K := [ [3,4], [1,2], [2,3], [2,3,4] ];; gap> CommonRepresentatives( J, K ); [ [ 3, 3, 3, 1 ], [ 1, 3, 4, 2 ] ] gap> d16 := DihedralGroup( IsPermGroup, 16 ); Group([ (1,2,3,4,5,6,7,8), (2,8)(3,7)(4,6) ]) gap> SetName( d16, "d16" ); gap> c4 := Subgroup( d16, [ d16.1^2 ] ); Group([ (1,3,5,7)(2,4,6,8) ]) gap> SetName( c4, "c4" ); gap> RightCosets( d16, c4 ); [ RightCoset(c4,()), RightCoset(c4,(2,8)(3,7)(4,6)), RightCoset(c4,(1,8,7,6,5, 4,3,2)), RightCoset(c4,(1,8)(2,7)(3,6)(4,5)) ] gap> trans := CommonTransversal( d16, c4 ); [ (), (2,8)(3,7)(4,6), (1,2,3,4,5,6,7,8), (1,2)(3,8)(4,7)(5,6) ] gap> IsCommonTransversal( d16, c4, trans ); true ]]>

Functions for strings This function has been transferred from package &ResClasses;.

The result of BlankFreeString( obj ); is a composite of the functions String( obj ) and RemoveCharacters( obj, " " );.

gens := GeneratorsOfGroup( DihedralGroup(12) ); [ f1, f2, f3 ] gap> String( gens ); "[ f1, f2, f3 ]" gap> BlankFreeString( gens ); "[f1,f2,f3]" ]]>

utils-0.93/doc/download.xml0000644000175100017510000001356715105376105015330 0ustar runnerrunner Web Downloads The Download operation has been written by Thomas Breuer, incorporating a number of suggestions from Max Horn, for version 0.77 of Utils. It implements downloading a file from within &GAP;. It can use the IO or curlInterface packages, or wget or curl, if installed, and it can be extended with other download methods quite easily. It is envisaged that, once other packages have started to use it, and any problems have been addressed, that the functions will be transferred to the main &GAP; library.
Functions for downloading files from the web This function downloads the file with the web address url, which must be a string.

The result is a record which has at least the component success, with value true if the download was successful and false otherwise. In the former case, the component result is bound, whose value is a string that contains the contents of the downloaded file. In the latter case, the component error is bound, whose value is a string that describes the problem.

The function calls the methods stored in the global list Download_Methods until one of them is successful. Currently there are methods based on the &GAP; functions and , and methods based on the external programs wget and curl.

An optional record opt can be given. The following components are supported.

maxTime If this component is bound then its value must be a nonnegative integer n, meaning that the function gives up after n seconds.

A zero value of n means that no timeout is set, the method will never give up in this case.

The default for n is given by the value of the user preference DownloadMaxTime (see ). target If this component is bound then its value must be a string that is a local filename, and the function writes the downloaded contents to this file; the returned record does not have a result component in this case. verifyCert If this component is bound and has the value false then those download methods that are based on curl or wget will omit the check of the server's certificate.

The same effect is achieved for all calls by setting the user preference DownloadVerifyCertificate (see ) to false and omitting the verifyCert component from opt.

url:= "https://www.gap-system.org/index.html";; gap> res1:= Download( url );; gap> res1.success; true gap> IsBound( res1.result ) and IsString( res1.result ); true gap> res2:= Download( Concatenation( url, "xxx" ) );; gap> res2.success; false gap> IsBound( res2.error ) and IsString( res2.error ); true ]]> User preference DownloadVerifyCertificate DownloadVerifyCertificate The value true (the default) means that the server's certificate is checked in calls of , such that nothing gets downloaded if the certificate is invalid.

If the value is false then download methods are supposed to omit the check of the server's certificate (this may not be supported by all download methods).

One can set the value of the preference to be val via , by calling SetUserPreference( "utils", "DownloadVerifyCertificate", val ), and access the current value via , by calling UserPreference( "utils", "DownloadVerifyCertificate" ).

We recommend leaving this preference at its default value true. Sometimes it can be necessary to change it, e.g. to work around issues with old operating systems which may not be able to correctly verify new certificates. In general it is better to update such a system, but if that is not an option, then disabling certificate checks may be a good last resort. User preference DownloadMaxTime DownloadMaxTime The value 0 (the default) means that no timeout is set in calls of . If the value is a positive integer n then those download methods that support a timeout will give up after n seconds.

One can set the value of the preference to be val via , by calling SetUserPreference( "utils", "DownloadMaxTime", val ), and access the current value via , by calling UserPreference( "utils", "DownloadMaxTime" ).

utils-0.93/doc/number.xml0000644000175100017510000001332615105376105015002 0ustar runnerrunner Number-theoretic functions
Functions for integers This function has been transferred from package &RCWA;.

smooth integer The function AllSmoothIntegers(maxp,maxn) returns the list of all positive integers less than or equal to maxn whose prime factors are all in the list L = \{p ~|~ p \leqslant maxp, p~\mbox{prime} \}.

In the alternative form, when L is a list of primes, the function returns the list of all positive integers whose prime factors lie in L.

AllSmoothIntegers( 3, 1000 ); [ 1, 2, 3, 4, 6, 8, 9, 12, 16, 18, 24, 27, 32, 36, 48, 54, 64, 72, 81, 96, 108, 128, 144, 162, 192, 216, 243, 256, 288, 324, 384, 432, 486, 512, 576, 648, 729, 768, 864, 972 ] gap> AllSmoothIntegers( [5,11,17], 1000 ); [ 1, 5, 11, 17, 25, 55, 85, 121, 125, 187, 275, 289, 425, 605, 625, 935 ] gap> Length( last ); 16 gap> List( [3..20], n -> Length( AllSmoothIntegers( [5,11,17], 10^n ) ) ); [ 16, 29, 50, 78, 114, 155, 212, 282, 359, 452, 565, 691, 831, 992, 1173, 1374, 1595, 1843 ] ]]> This function has been transferred from package &RCWA;.

The command AllProducts(L,k) returns the list of all products of k entries of the list L. Note that every ordering of the entries is used so that, in the commuting case, there are bound to be repetitions.

AllProducts([1..4],3); [ 1, 2, 3, 4, 2, 4, 6, 8, 3, 6, 9, 12, 4, 8, 12, 16, 2, 4, 6, 8, 4, 8, 12, 16, 6, 12, 18, 24, 8, 16, 24, 32, 3, 6, 9, 12, 6, 12, 18, 24, 9, 18, 27, 36, 12, 24, 36, 48, 4, 8, 12, 16, 8, 16, 24, 32, 12, 24, 36, 48, 16, 32, 48, 64 ] gap> Set(last); [ 1, 2, 3, 4, 6, 8, 9, 12, 16, 18, 24, 27, 32, 36, 48, 64 ] gap> AllProducts( [(1,2,3),(2,3,4)], 2 ); [ (2,4,3), (1,2)(3,4), (1,3)(2,4), (1,3,2) ] ]]> This function has been transferred from package &RCWA;.

For a positive integer n and a set of positive integers S, this function returns the list of partitions of n into distinct elements of S. Unlike RestrictedPartitions, no repetitions are allowed.

RestrictedPartitions( 20, [4..10] ); [ [ 4, 4, 4, 4, 4 ], [ 5, 5, 5, 5 ], [ 6, 5, 5, 4 ], [ 6, 6, 4, 4 ], [ 7, 5, 4, 4 ], [ 7, 7, 6 ], [ 8, 4, 4, 4 ], [ 8, 6, 6 ], [ 8, 7, 5 ], [ 8, 8, 4 ], [ 9, 6, 5 ], [ 9, 7, 4 ], [ 10, 5, 5 ], [ 10, 6, 4 ], [ 10, 10 ] ] gap> RestrictedPartitionsWithoutRepetitions( 20, [4..10] ); [ [ 10, 6, 4 ], [ 9, 7, 4 ], [ 9, 6, 5 ], [ 8, 7, 5 ] ] gap> RestrictedPartitionsWithoutRepetitions( 10^2, List([1..10], n->n^2 ) ); [ [ 100 ], [ 64, 36 ], [ 49, 25, 16, 9, 1 ] ] ]]> This function has been transferred from package &RCWA;.

The function NextProbablyPrimeInt(n) does the same as NextPrimeInt(n) except that for reasons of performance it tests numbers only for IsProbablyPrimeInt(n) instead of IsPrimeInt(n). For large n, this function is much faster than NextPrimeInt(n)

n := 2^251; 3618502788666131106986593281521497120414687020801267626233049500247285301248 gap> NextProbablyPrimeInt( n ); 3618502788666131106986593281521497120414687020801267626233049500247285301313 gap> time; 1 gap> NextPrimeInt( n ); 3618502788666131106986593281521497120414687020801267626233049500247285301313 gap> time; 213 ]]> This function has been transferred from package &RCWA;.

This function returns an iterator which runs over the prime numbers n ascending order; it takes an optional argument chunksize which specifies the length of the interval which is sieved in one go (the default is 10^7), and which can be used to balance runtime vs. memory consumption. It is assumed that chunksize is larger than any gap between two consecutive primes within the range one intends to run the iterator over.

iter := PrimeNumbersIterator();; gap> for i in [1..100] do p := NextIterator(iter); od; gap> p; 541 gap> sum := 0;; gap> ## "prime number race" 1 vs. 3 mod 4 gap> for p in PrimeNumbersIterator() do > if p <> 2 then sum := sum + E(4)^(p-1); fi; > if sum > 0 then break; fi; > od; gap> p; 26861 ]]>

utils-0.93/doc/chapBib.html0000644000175100017510000001354015105376105015204 0ustar runnerrunner GAP (Utils) - References
Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind
 [Top of Book]  [Contents]   [Previous Chapter]   [Next Chapter] 

References

[BCP97] Bosma, W., Cannon, J. and Playoust, C., The Magma algebra system. {I}. The user language, J. Symbolic Comput., 24 (3-4) (1997), 235--265 pages
( Computational algebra and number theory (London, 1993)} https://doi.org/10.1006/jsco.1996.0125 ).

[GH16] Gutsche, S. and Horn, M., AutoDoc - Generate documentation from GAP source code (Version 2016.12.04) (2016)
( GAP package, https://github.com/gap-packages/AutoDoc ).

[Hor17] Horn, M., GitHubPagesForGAP - Template for easily using GitHub Pages within GAP packages (Version 0.2) (2017)
( GAP package, https://gap-system.github.io/GitHubPagesForGAP/ ).

[Koh17a] Kohl, S., RCWA - Residue-Class-Wise Affine Groups (Version 4.5.1) (2017)
( GAP package, https://stefan-kohl.github.io/rcwa.html ).

[Koh17b] Kohl, S., ResClasses - Set-Theoretic Computations with Residue Classes (Version 4.6.0) (2017)
( GAP package, https://stefan-kohl.github.io/resclasses.html ).

[LN17] Lübeck, F. and Neunhöffer, M., GAPDoc (Version 1.6), RWTH Aachen (2017)
( GAP package, https://www.math.rwth-aachen.de/~Frank.Luebeck/GAPDoc/index.html ).

[WAOU17] Wensley, C. D., Alp, M., Odabas, A. and Uslu, E. O., XMod - Crossed Modules and Cat1-groups in GAP (Version 2.64) (2017)
( GAP package, https://github.com/gap-packages/xmod ).

 [Top of Book]  [Contents]   [Previous Chapter]   [Next Chapter] 
Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind

generated by GAPDoc2HTML

utils-0.93/doc/chap2_mj.html0000644000175100017510000001363015105376105015337 0ustar runnerrunner GAP (Utils) - Chapter 2: Printing Lists and Iterators
Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind
 [Top of Book]  [Contents]   [Previous Chapter]   [Next Chapter] 

2 Printing Lists and Iterators
 2.1 Printing selected items

2 Printing Lists and Iterators

2.1 Printing selected items

The functions described here print lists or objects with an iterator with one item per line, either the whole list/iterator or certain subsets:

2.1-1 PrintSelection
‣ PrintSelection( obj, list )( function )
‣ PrintSelection( obj, first, step[, last] )( function )

This function, given three (or four) parameters, calls operations PrintSelectionFromList or PrintSelectionFromIterator which prints the first item specified, and then the item at every step. The fourth parameter is essential when the object being printed is infinite.

Alternatively, given two parameters, with the second parameter a list L of positive integers, only the items at positions in L are printed.


gap> L := List( [1..20], n -> n^5 );;
gap> PrintSelection( L, [18..20] );
18 : 1889568
19 : 2476099
20 : 3200000
gap> PrintSelection( L, 2, 9 );       
2 : 32
11 : 161051
20 : 3200000
gap> PrintSelection( L, 2, 3, 11 );
2 : 32
5 : 3125
8 : 32768
11 : 161051
gap> s5 := SymmetricGroup( 5 );;
gap> PrintSelection( s5, [30,31,100,101] );
30 : (1,5)(3,4)
31 : (1,5,2)
100 : (1,4,3)
101 : (1,4)(3,5)
gap> PrintSelection( s5, 1, 30 );
1 : ()
31 : (1,5,2)
61 : (1,2,3)
91 : (1,3,5,2,4)
gap> PrintSelection( s5, 9, 11, 43 );
9 : (2,5,3)
20 : (2,4)
31 : (1,5,2)
42 : (1,5,2,3,4)

 [Top of Book]  [Contents]   [Previous Chapter]   [Next Chapter] 
Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind

generated by GAPDoc2HTML

utils-0.93/doc/utils.xml0000644000175100017510000000125715105376105014652 0ustar runnerrunner ] > <#Include SYSTEM "title.xml"> <#Include SYSTEM "intro.xml"> <#Include SYSTEM "print.xml"> <#Include SYSTEM "lists.xml"> <#Include SYSTEM "number.xml"> <#Include SYSTEM "groups.xml"> <#Include SYSTEM "matrix.xml"> <#Include SYSTEM "iterator.xml"> <#Include SYSTEM "record.xml"> <#Include SYSTEM "download.xml"> <#Include SYSTEM "others.xml"> <#Include SYSTEM "obsolete.xml"> <#Include SYSTEM "transfer.xml"> utils-0.93/doc/chap6.txt0000644000175100017510000001227615105376105014535 0ustar runnerrunner 6 Matrices 6.1 Some operations for matrices 6.1-1 DirectSumDecompositionMatrices DirectSumDecompositionMatrices( M )  operation In June 2023 Hongyi Zhao asked in the Forum for a function to implement matrix decomposition into blocks. Such a function was then provided by Pedro García-Sánchez. Hongyi Zhao then requested that the function be added to Utils. What is provided here is a revised version of the original solution, returning a list of decompositions. This function is a partial inverse to the undocumented library operation DirectSumMat. So if L is the list of diagonal decompositions of a matrix M then each entry in L is a list of matrices, and the direct sum of each of these lists is equal to the original M. In the following examples, M_6 is an obvious direct sum with 3 blocks. M_4 is an example with three decompositions, while M_8 = M_4 ⊕ M_4 has 16 decompositions (not listed).  Example   gap> M6 := [ [1,2,0,0,0,0], [3,4,0,0,0,0], [5,6,0,0,0,0],  >  [0,0,9,0,0,0], [0,0,0,1,2,3], [0,0,0,4,5,6] ];; gap> Display( M6 ); [ [ 1, 2, 0, 0, 0, 0 ],  [ 3, 4, 0, 0, 0, 0 ],  [ 5, 6, 0, 0, 0, 0 ],  [ 0, 0, 9, 0, 0, 0 ],  [ 0, 0, 0, 1, 2, 3 ],  [ 0, 0, 0, 4, 5, 6 ] ] gap> L6 := DirectSumDecompositionMatrices( M6 ); [ [ [ [ 1, 2 ], [ 3, 4 ], [ 5, 6 ] ], [ [ 9 ] ], [ [ 1, 2, 3 ], [ 4, 5, 6 ] ]   ] ]  gap> M4 := [ [0,3,0,0], [0,0,0,0], [0,0,0,0], [0,0,4,0] ];; gap> Display( M4 ); [ [ 0, 3, 0, 0 ],  [ 0, 0, 0, 0 ],  [ 0, 0, 0, 0 ],  [ 0, 0, 4, 0 ] ] gap> L4 := DirectSumDecompositionMatrices( M4 ); [ [ [ [ 0, 3 ] ], [ [ 0, 0 ], [ 0, 0 ], [ 4, 0 ] ] ],   [ [ [ 0, 3 ], [ 0, 0 ] ], [ [ 0, 0 ], [ 4, 0 ] ] ],   [ [ [ 0, 3 ], [ 0, 0 ], [ 0, 0 ] ], [ [ 4, 0 ] ] ] ] gap> for L in L4 do  >  A := DirectSumMat( L );;  >  if ( A = M4 ) then Print( "yes, A = M4\n" ); fi;  >  od; yes, A = M4 yes, A = M4 yes, A = M4  gap> M8 := DirectSumMat( M4, M4 );;  gap> Display( M8 ); [ [ 0, 3, 0, 0, 0, 0, 0, 0 ],  [ 0, 0, 0, 0, 0, 0, 0, 0 ],  [ 0, 0, 0, 0, 0, 0, 0, 0 ],  [ 0, 0, 4, 0, 0, 0, 0, 0 ],  [ 0, 0, 0, 0, 0, 3, 0, 0 ],  [ 0, 0, 0, 0, 0, 0, 0, 0 ],  [ 0, 0, 0, 0, 0, 0, 0, 0 ],  [ 0, 0, 0, 0, 0, 0, 4, 0 ] ] gap> L8 := DirectSumDecompositionMatrices( M8 );; gap> Length( L8 );  16   The current method does not, however, catch all possible decompositions. In the following example the matrix M_5 has its third row and third column extirely zero, and the only decomposition found has a [0] factor. There are clearly two 2-factor decompositions with a 2-by-3 and a 3-by-2 factor, but these are not found at present.  Example   gap> M5 := [ [1,2,0,0,0], [3,4,0,0,0], [0,0,0,0,0], >  [0,0,0,6,7], [0,0,0,8,9] ];; gap> Display(M5); [ [ 1, 2, 0, 0, 0 ],  [ 3, 4, 0, 0, 0 ],  [ 0, 0, 0, 0, 0 ],  [ 0, 0, 0, 6, 7 ],  [ 0, 0, 0, 8, 9 ] ] gap> L5 := DirectSumDecompositionMatrices( M5 );  [ [ [ [ 1, 2 ], [ 3, 4 ] ], [ [ 0 ] ], [ [ 6, 7 ], [ 8, 9 ] ] ] ]   utils-0.93/doc/chap0.html0000644000175100017510000004577315105376105014664 0ustar runnerrunner GAP (Utils) - Contents
Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind
 [Top of Book]  [Contents]   [Next Chapter] 

utils

Utility functions in GAP

0.93

13 November 2025

Thomas Breuer
Email: sam@math.rwth-aachen.de
Homepage: https://www.math.rwth-aachen.de/~Thomas.Breuer

Sebastian Gutsche
Email: gutsche@mathematik.uni-siegen.de
Homepage: https://sebasguts.github.io/

Max Horn
Email: mhorn@rptu.de
Homepage: https://github.com/mhorn

Alexander Hulpke
Email: hulpke@math.colostate.edu
Homepage: https://www.math.colostate.edu/~hulpke

Pedro García-Sánchez
Email: pedro@ugr.es
Homepage: http://www.ugr.es/local/pedro

Christopher Jefferson
Email: caj21@st-andrews.ac.uk
Homepage: https://caj.host.cs.st-andrews.ac.uk/

Stefan Kohl
Email: stefan@mcs.st-and.ac.uk
Homepage: https://www.gap-system.org/DevelopersPages/StefanKohl/

Frank LĂĽbeck
Email: Frank.Luebeck@Math.RWTH-Aachen.De
Homepage: https://www.math.rwth-aachen.de/~Frank.Luebeck

Chris Wensley
Email: cdwensley.maths@btinternet.com
Homepage: https://github.com/cdwensley

Abstract

The Utils package provides a space for utility functions in a variety of GAP packages to be collected together into a single package. In this way it is hoped that they will become more visible to package authors.

Any package author who transfers a function to Utils will become an author of Utils.

If deemed appropriate, functions may also be transferred from the main library.

Bug reports, suggestions and comments are, of course, welcome. Please contact the last author at cdwensley.maths@btinternet.com or submit an issue at the GitHub repository https://github.com/gap-packages/utils/issues/.

Copyright

© 2015-2025, The GAP Group.

The Utils package is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

Acknowledgements

This documentation was prepared using the GAPDoc [LN17] and AutoDoc [GH16] packages.

The procedure used to produce new releases uses the package GitHubPagesForGAP [Hor17] and the package ReleaseTools.

Contents

1 Introduction
2 Printing Lists and Iterators
3 Lists, Sets and Strings
4 Number-theoretic functions
5 Groups and homomorphisms
6 Matrices
7 Iterators
8 Records
9 Web Downloads
10 Various other functions
11 Obsolete functions
12 The transfer procedure
References
Index

 [Top of Book]  [Contents]   [Next Chapter] 
Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind

generated by GAPDoc2HTML

utils-0.93/doc/chap0_mj.html0000644000175100017510000004673515105376105015351 0ustar runnerrunner GAP (Utils) - Contents
Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind
 [Top of Book]  [Contents]   [Next Chapter] 

utils

Utility functions in GAP

0.93

13 November 2025

Thomas Breuer
Email: sam@math.rwth-aachen.de
Homepage: https://www.math.rwth-aachen.de/~Thomas.Breuer

Sebastian Gutsche
Email: gutsche@mathematik.uni-siegen.de
Homepage: https://sebasguts.github.io/

Max Horn
Email: mhorn@rptu.de
Homepage: https://github.com/mhorn

Alexander Hulpke
Email: hulpke@math.colostate.edu
Homepage: https://www.math.colostate.edu/~hulpke

Pedro García-Sánchez
Email: pedro@ugr.es
Homepage: http://www.ugr.es/local/pedro

Christopher Jefferson
Email: caj21@st-andrews.ac.uk
Homepage: https://caj.host.cs.st-andrews.ac.uk/

Stefan Kohl
Email: stefan@mcs.st-and.ac.uk
Homepage: https://www.gap-system.org/DevelopersPages/StefanKohl/

Frank LĂĽbeck
Email: Frank.Luebeck@Math.RWTH-Aachen.De
Homepage: https://www.math.rwth-aachen.de/~Frank.Luebeck

Chris Wensley
Email: cdwensley.maths@btinternet.com
Homepage: https://github.com/cdwensley

Abstract

The Utils package provides a space for utility functions in a variety of GAP packages to be collected together into a single package. In this way it is hoped that they will become more visible to package authors.

Any package author who transfers a function to Utils will become an author of Utils.

If deemed appropriate, functions may also be transferred from the main library.

Bug reports, suggestions and comments are, of course, welcome. Please contact the last author at cdwensley.maths@btinternet.com or submit an issue at the GitHub repository https://github.com/gap-packages/utils/issues/.

Copyright

© 2015-2025, The GAP Group.

The Utils package is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

Acknowledgements

This documentation was prepared using the GAPDoc [LN17] and AutoDoc [GH16] packages.

The procedure used to produce new releases uses the package GitHubPagesForGAP [Hor17] and the package ReleaseTools.

Contents

1 Introduction
2 Printing Lists and Iterators
3 Lists, Sets and Strings
4 Number-theoretic functions
5 Groups and homomorphisms
6 Matrices
7 Iterators
8 Records
9 Web Downloads
10 Various other functions
11 Obsolete functions
12 The transfer procedure
References
Index

 [Top of Book]  [Contents]   [Next Chapter] 
Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind

generated by GAPDoc2HTML

utils-0.93/doc/chapBib.txt0000644000175100017510000000341115105376105015053 0ustar runnerrunner References [BCP97] Bosma, W., Cannon, J. and Playoust, C., The Magma algebra system. {I}. The user language, J. Symbolic Comput., 24, 3-4 (1997), 235--265 pages, ( Computational algebra and number theory (London, 1993)} https://doi.org/10.1006/jsco.1996.0125 ). [GH16] Gutsche, S. and Horn, M., AutoDoc - Generate documentation from GAP source code (Version 2016.12.04) (2016), ( GAP package, https://github.com/gap-packages/AutoDoc ). [Hor17] Horn, M., GitHubPagesForGAP - Template for easily using GitHub Pages within GAP packages (Version 0.2) (2017), ( GAP package, https://gap-system.github.io/GitHubPagesForGAP/ ). [Koh17a] Kohl, S., RCWA - Residue-Class-Wise Affine Groups (Version 4.5.1) (2017), ( GAP package, https://stefan-kohl.github.io/rcwa.html ). [Koh17b] Kohl, S., ResClasses - Set-Theoretic Computations with Residue Classes (Version 4.6.0) (2017), ( GAP package, https://stefan-kohl.github.io/resclasses.html ). [LN17] Lübeck, F. and Neunhöffer, M., GAPDoc (Version 1.6), RWTH Aachen (2017), ( GAP package, https://www.math.rwth-aachen.de/~Frank.Luebeck/GAPDoc/index.html ). [WAOU17] Wensley, C. D., Alp, M., Odabas, A. and Uslu, E. O., XMod - Crossed Modules and Cat1-groups in GAP (Version 2.64) (2017), ( GAP package, https://github.com/gap-packages/xmod ).  utils-0.93/doc/groups.xml0000644000175100017510000004103115105376105015023 0ustar runnerrunner Groups and homomorphisms
Functions for groups This method has been transferred from package &ResClasses;.

It provides a method for Comm when the argument is a list (enclosed in square brackets), and calls the function LeftNormedComm.

Comm( [ (1,2), (2,3) ] ); (1,2,3) gap> Comm( [(1,2),(2,3),(3,4),(4,5),(5,6)] ); (1,5,6) gap> Comm(Comm(Comm(Comm((1,2),(2,3)),(3,4)),(4,5)),(5,6)); ## the same (1,5,6) ]]> This function has been transferred from package &ResClasses;.

It tests whether two elements in a group commute.

D12 := DihedralGroup( 12 ); gap> SetName( D12, "D12" ); gap> a := D12.1;; b := D12.2;; gap> IsCommuting( a, b ); false ]]> This function has been transferred from package &RCWA;.

The operation ListOfPowers(g,exp) returns the list [g,g^2,...,g^{exp}] of powers of the element g.

ListOfPowers( 2, 20 ); [ 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 1048576 ] gap> ListOfPowers( (1,2,3)(4,5), 12 ); [ (1,2,3)(4,5), (1,3,2), (4,5), (1,2,3), (1,3,2)(4,5), (), (1,2,3)(4,5), (1,3,2), (4,5), (1,2,3), (1,3,2)(4,5), () ] gap> ListOfPowers( D12.2, 6 ); [ f2, f3, f2*f3, f3^2, f2*f3^2, of ... ] ]]> This function has been transferred from package &RCWA;.

This operation returns a list containing the generators of G followed by the inverses of these generators.

GeneratorsAndInverses( D12 ); [ f1, f2, f3, f1, f2*f3^2, f3^2 ] gap> GeneratorsAndInverses( SymmetricGroup(5) ); [ (1,2,3,4,5), (1,2), (1,5,4,3,2), (1,2) ] ]]> These three functions have been transferred from package &ResClasses;.

Fitting series The upper and lower Fitting series and the Fitting length of a solvable group are described here: https://en.wikipedia.org/wiki/Fitting_length.

UpperFittingSeries( D12 ); LowerFittingSeries( D12 ); [ Group([ ]), Group([ f3, f2*f3 ]), Group([ f1, f3, f2*f3 ]) ] [ D12, Group([ f3 ]), Group([ ]) ] gap> FittingLength( D12 ); 2 gap> S4 := SymmetricGroup( 4 );; gap> UpperFittingSeries( S4 ); [ Group(()), Group([ (1,2)(3,4), (1,4)(2,3) ]), Group([ (1,2)(3,4), (1,4) (2,3), (2,4,3) ]), Group([ (3,4), (2,3,4), (1,2)(3,4) ]) ] gap> List( last, StructureDescription ); [ "1", "C2 x C2", "A4", "S4" ] gap> LowerFittingSeries( S4 ); [ Sym( [ 1 .. 4 ] ), Alt( [ 1 .. 4 ] ), Group([ (1,4)(2,3), (1,3) (2,4) ]), Group(()) ] gap> List( last, StructureDescription ); [ "S4", "A4", "C2 x C2", "1" ] gap> FittingLength( S4); 3 ]]>

Left Cosets for Groups Since &GAP; uses right actions by default, the library contains the operation RightCoset(U,g) for constructing the right coset Ug of a subgroup U \leq G and an element g \in G. It has been noted in the reference manual that, by inverting all the elements in Ug, the left coset g^{-1}U is obtained.

Just for the sake of completeness, from August 2022 this package provides the operation LeftCoset(g,U) for constructing the left coset gU. Users are strongly recommended to continue to use RightCoset for all serious calculations, since left cosets have a much simpler implementation and do not behave exactly like right cosets.

The methods for left cosets which are provided generally work by converting gU to Ug^{-1}; applying the equivalent method for right cosets; and, if necessary, converting back again to left cosets.

G acts on left cosets by OnLeftInverse: (gU)^{g_0} = g_0^{-1}*(gU) = (g_0^{-1}g)U.

a4 := Group( (1,2,3), (2,3,4) );; SetName( a4, "a4" ); gap> k4 := Group( (1,2)(3,4), (1,3)(2,4) );; SetName( k4, "k4" ); gap> rc := RightCosets( a4, k4 ); [ RightCoset(k4,()), RightCoset(k4,(2,3,4)), RightCoset(k4,(2,4,3)) ] gap> lc := LeftCosets( a4, k4 ); [ LeftCoset((),k4), LeftCoset((2,4,3),k4), LeftCoset((2,3,4),k4) ] gap> AsSet( lc[2] ); [ (2,4,3), (1,2,3), (1,3,4), (1,4,2) ] gap> LeftCoset( (1,4,2), k4 ) = lc[2]; true gap> Representative( lc[2] ); (2,4,3) gap> ActingDomain( lc[2] ); k4 gap> (1,4,3) in lc[3]; true gap> (1,2,3)*lc[2] = lc[3]; true gap> lc[2]^(1,3,2) = lc[3]; true ]]> Inverse The inverse of the left coset gU is the right coset Ug^{-1}, and conversely. This is an abuse of the attribute Inverse, since the standard requirement, that x*x^{-1} is an identity, does not hold.

Inverse( rc[3] ) = lc[3]; true gap> Inverse( lc[2] ) = rc[2]; true ]]>

Functions for group homomorphisms This function has been transferred from package &RCWA;.

It constructs a group homomorphism which maps the generators of G to those of H. Its intended use is when G is a free group, and a warning is printed when this is not the case. Note that anything may happen if the resulting map is not a homomorphism!

G := Group( (1,2,3), (3,4,5), (5,6,7), (7,8,9) );; gap> phi := EpimorphismByGenerators( FreeGroup("a","b","c","d"), G ); [ a, b, c, d ] -> [ (1,2,3), (3,4,5), (5,6,7), (7,8,9) ] gap> PreImagesRepresentativeNC( phi, (1,2,3,4,5,6,7,8,9) ); d*c*b*a gap> a := G.1;; b := G.2;; c := G.3;; d := G.4;; gap> d*c*b*a; (1,2,3,4,5,6,7,8,9) gap> ## note that it is easy to produce nonsense: gap> epi := EpimorphismByGenerators( Group((1,2,3)), Group((8,9)) ); Warning: calling GroupHomomorphismByImagesNC without checks [ (1,2,3) ] -> [ (8,9) ] gap> IsGroupHomomorphism( epi ); true gap> Image( epi, (1,2,3) ); () gap> Image( epi, (1,3,2) ); (8,9) ]]> If \phi_1 : G_1 \to H and \phi_2 : G_2 \to H are two group homomorphisms with the same range, then their pullback is the subgroup of G_1 \times G_2 consisting of those elements (g_1,g_2) such that \phi_1 g_1 = \phi_2 g_2.

The attribute PullbackInfo of a pullback group P is similar to DirectProductInfo for a direct product of groups. Its value is a record with the following components:

directProduct the direct product G_1 \times G_2, and projections a list with the two projections onto G_1 and G_2. There are no embeddings in this record, but it is possible to use the embeddings into the direct product, see .

s4 := Group( (1,2),(2,3),(3,4) );; gap> s3 := Group( (5,6),(6,7) );; gap> c3 := Subgroup( s3, [ (5,6,7) ] );; gap> f := GroupHomomorphismByImages( s4, s3, > [(1,2),(2,3),(3,4)], [(5,6),(6,7),(5,6)] );; gap> i := GroupHomomorphismByImages( c3, s3, [(5,6,7)], [(5,6,7)] );; gap> Pfi := Pullback( f, i ); Group([ (2,3,4)(5,7,6), (1,2)(3,4) ]) gap> StructureDescription( Pfi ); "A4" gap> info := PullbackInfo( Pfi ); rec( directProduct := Group([ (1,2), (2,3), (3,4), (5,6,7) ]), projections := [ [ (2,3,4)(5,7,6), (1,2)(3,4) ] -> [ (2,3,4), (1,2)(3,4) ], [ (2,3,4)(5,7,6), (1,2)(3,4) ] -> [ (5,7,6), () ] ] ) gap> g := (1,2,3)(5,6,7);; gap> ImageElm( info!.projections[1], g ); (1,2,3) gap> ImageElm( info!.projections[2], g ); (5,6,7) gap> dp := info!.directProduct;; gap> a := ImageElm( Embedding( dp, 1 ), (1,4,3) );; gap> b := ImageElm( Embedding( dp, 2 ), (5,7,6) );; gap> a*b in Pfi; true ]]> This function was added by Thomas Breuer, following discussions with Hongyi Zhao (see https://github.com/gap-packages/hap/issues/73).

Let G1 and G2 be two groups, Z1 be a central subgroup of G1, and Phi be an isomorphism from Z1 to a central subgroup of G2. The central product defined by these arguments is the factor group of the direct product of G1 and G2 by the central subgroup \{ (z, (Phi(z))^{-1}) : z \in Z1 \}.

The attribute of a group G that has been created by is similar to for pullback groups. Its value is a record with the following components.

projection the epimorphism from the direct product of G1 and G2 to G, and phi the map Phi. Note that one can access the direct product as the value of the projection map, and one can access G1 and G2 as the two embeddings of this direct product, see . g1 := DihedralGroup( 8 ); gap> c1 := Centre( g1 ); Group([ f3 ]) gap> cp1 := CentralProduct( g1, g1, c1, IdentityMapping( c1 ) ); Group([ f1, f2, f5, f3, f4, f5 ]) gap> IdGroup( cp1 ) = IdGroup( ExtraspecialGroup( 2^5, "+" ) ); true gap> g2 := QuaternionGroup( 8 ); gap> c2 := Centre( g2 ); Group([ y2 ]) gap> cp2 := CentralProduct( g2, g2, c2, IdentityMapping( c2 ) ); Group([ f1, f2, f5, f3, f4, f5 ]) gap> IdGroup( cp2 ) = IdGroup( ExtraspecialGroup( 2^5, "+" ) ); true gap> info2 := CentralProductInfo( cp2 ); rec( phi := IdentityMapping( Group([ y2 ]) ), projection := [ f1, f2, f3, f4, f5, f6 ] -> [ f1, f2, f5, f3, f4, f5 ] ) gap> Source( Embedding( Source( info2.projection ), 1 ) ) = g2; true ]]> An endomorphism f : G \to G is idempotent if f^2=f. It has an image R \leqslant G; is the identity map when restricted to R; and has a kernel N which has trivial intersection with R and has size |G|/|R|.

The operation IdempotentEndomorphismsWithImage(genG,R) returns a list of the images of the generating set genG of a group G under the idempotent endomorphisms with image R.

The attribute IdempotentEndomorphismsData(G) returns a record data with fields data.gens, a fixed generating set for G, and data.images a list of the non-empty outputs of IdempotentEndomorphismsWithImage(genG,R) obtained by iterating over all subgroups of G.

The operation IdempotentEndomorphisms(G) returns the list of these mappings obtained using IdempotentEndomorphismsData(G). The first of these is the zero map, the second is the identity.

gens := [ (1,2,3,4), (1,2)(3,4) ];; gap> d8 := Group( gens );; gap> SetName( d8, "d8" ); gap> c2 := Subgroup( d8, [ (2,4) ] );; gap> IdempotentEndomorphismsWithImage( gens, c2 ); [ [ (), (2,4) ], [ (2,4), () ] ] gap> IdempotentEndomorphismsData( d8 ); rec( gens := [ (1,2,3,4), (1,2)(3,4) ], images := [ [ [ (), () ] ], [ [ (), (2,4) ], [ (2,4), () ] ], [ [ (), (1,3) ], [ (1,3), () ] ], [ [ (), (1,2)(3,4) ], [ (1,2)(3,4), (1,2)(3,4) ] ], [ [ (), (1,4)(2,3) ], [ (1,4)(2,3), (1,4)(2,3) ] ], [ [ (1,2,3,4), (1,2)(3,4) ] ] ] ) gap> List( last.images, L -> Length(L) ); [ 1, 2, 2, 2, 2, 1 ] gap> IdempotentEndomorphisms( d8 ); [ [ (1,2,3,4), (1,2)(3,4) ] -> [ (), () ], [ (1,2,3,4), (1,2)(3,4) ] -> [ (), (2,4) ], [ (1,2,3,4), (1,2)(3,4) ] -> [ (2,4), () ], [ (1,2,3,4), (1,2)(3,4) ] -> [ (), (1,3) ], [ (1,2,3,4), (1,2)(3,4) ] -> [ (1,3), () ], [ (1,2,3,4), (1,2)(3,4) ] -> [ (), (1,2)(3,4) ], [ (1,2,3,4), (1,2)(3,4) ] -> [ (1,2)(3,4), (1,2)(3,4) ], [ (1,2,3,4), (1,2)(3,4) ] -> [ (), (1,4)(2,3) ], [ (1,2,3,4), (1,2)(3,4) ] -> [ (1,4)(2,3), (1,4)(2,3) ], [ (1,2,3,4), (1,2)(3,4) ] -> [ (1,2,3,4), (1,2)(3,4) ] ] ]]> The quaternion group q8 is an example of a group with a tail: there is only one subgroup in the lattice which covers the identity subgroup. The only idempotent isomorphisms of such groups are the identity mapping and the zero mapping because the only pairs N,R are the whole group and the identity subgroup. q8 := QuaternionGroup( 8 );; gap> IdempotentEndomorphisms( q8 ); [ [ x, y ] -> [ of ..., of ... ], [ x, y ] -> [ x, y ] ] ]]> Given group homomorphisms f_1 : G_1 \to G_2 and f_2 : H_1 \to H_2, this operation return the product homomorphism f_1 \times f_2 : G_1 \times G_2 \to H_1 \times H_2.

c4 := Group( (1,2,3,4) );; gap> c2 := Group( (5,6) );; gap> f1 := GroupHomomorphismByImages( c4, c2, [(1,2,3,4)], [(5,6)] );; gap> c3 := Group( (1,2,3) );; gap> c6 := Group( (1,2,3,4,5,6) );; gap> f2 := GroupHomomorphismByImages( c3, c6, [(1,2,3)], [(1,3,5)(2,4,6)] );; gap> c4c3 := DirectProduct( c4, c3 ); Group([ (1,2,3,4), (5,6,7) ]) gap> c2c6 := DirectProduct( c2, c6 ); Group([ (1,2), (3,4,5,6,7,8) ]) gap> f := DirectProductOfFunctions( c4c3, c2c6, f1, f2 ); [ (1,2,3,4), (5,6,7) ] -> [ (1,2), (3,5,7)(4,6,8) ] gap> ImageElm( f, (1,4,3,2)(5,7,6) ); (1,2)(3,7,5)(4,8,6) ]]> Let A_1,A_2 be groups of automorphism of groups G_1,G_2 respectively. The output of this function is a group A_1 \times A_2 of automorphisms of G_1 \times G_2.

c9 := Group( (1,2,3,4,5,6,7,8,9) );; gap> ac9 := AutomorphismGroup( c9 );; gap> q8 := QuaternionGroup( IsPermGroup, 8 );; gap> aq8 := AutomorphismGroup( q8 );; gap> A := DirectProductOfAutomorphismGroups( ac9, aq8 ); gap> genA := GeneratorsOfGroup( A );; gap> G := Source( genA[1] ); Group([ (1,2,3,4,5,6,7,8,9), (10,14,12,16)(11,17,13,15), (10,11,12,13) (14,15,16,17) ]) gap> a := genA[1]*genA[5]; [ (1,2,3,4,5,6,7,8,9), (10,14,12,16)(11,17,13,15), (10,11,12,13)(14,15,16,17) ] -> [ (1,3,5,7,9,2,4,6,8), (10,16,12,14)(11,15,13,17), (10,11,12,13)(14,15,16,17) ] gap> ImageElm( a, (1,9,8,7,6,5,4,3,2)(10,14,12,16)(11,17,13,15) ); (1,8,6,4,2,9,7,5,3)(10,16,12,14)(11,15,13,17) ]]>

utils-0.93/doc/chap11.html0000644000175100017510000001733715105376105014741 0ustar runnerrunner GAP (Utils) - Chapter 11: Obsolete functions
Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind
 [Top of Book]  [Contents]   [Previous Chapter]   [Next Chapter] 

11 Obsolete functions
 11.1 Operations from AutoDoc
 11.2 Functions for printing
 11.3 Other obsolete functions

11 Obsolete functions

11.1 Operations from AutoDoc

The file functions FindMatchingFiles and CreateDirIfMissing were copied from package AutoDoc where they are named AutoDoc_FindMatchingFiles and AutoDoc_CreateDirIfMissing.

The string function StringDotSuffix was also copied from package AutoDoc, where it is named AUTODOC_GetSuffix.

The function SetIfMissing was also transferred from package AutoDoc, where it is called AUTODOC_SetIfMissing. It writes into a record provided the position is not yet bound.

As from version 0.61, all these functions became obsolete in Utils, but continue to be defined in AutoDoc.

11.2 Functions for printing

The function PrintOneItemPerLine was used to prints lists vertically, rather than horizontally. Since a very similar result may be achieved using the GAP library functions Perform and Display, this function became obsolete in version 0.61.


gap> s3 := SymmetricGroup( 3 );; 
gap> L := KnownPropertiesOfObject( GeneratorsOfGroup( s3 ) );;
gap> Perform( L, Display );
IsFinite
IsSmallList
IsGeneratorsOfMagmaWithInverses
IsGeneratorsOfSemigroup
IsSubsetLocallyFiniteGroup
gap> Perform( s3, Display ); 
()
(2,3)
(1,3)
(1,3,2)
(1,2,3)
(1,2)

11.3 Other obsolete functions

11.3-1 Applicable Methods

The function PrintApplicableMethod, which was included in versions from 0.41 to 0.58, has been removed since it was considered superfluous. The example shows how to print out a function.


gap> ApplicableMethod( IsCyclic, [ Group((1,2,3),(4,5)) ], 1, 1 );
#I  Searching Method for IsCyclic with 1 arguments:
#I  Total: 7 entries
#I  Method 4: ``IsCyclic'' at /Applications/gap/gap4r9/lib/grp.gi:30 , value: 
36
function( G ) ... end
gap> Print( last );
function ( G )
    if Length( GeneratorsOfGroup( G ) ) = 1 then
        return true;
    else
        TryNextMethod();
    fi;
    return;
end
gap> ApplicableMethod( IsCyclic, [ Group((1,2,3),(4,5)) ], 0, 3 );
function( <1 unnamed arguments> ) ... end
gap> Print( last );                                               
function ( <<arg-1>> )
    <<compiled GAP code from GAPROOT/lib/oper1.g:578>>
end

11.3-2 ExponentOfPrime

The function ExponentOfPrime was originally transferred from package RCWA. The command ExponentOfPrime(n,p) returned the exponent of the prime p in the prime factorization of n.

Since the GAP function PValuation produces the same results, and does so more quickly, this function has been made obsolete.

 [Top of Book]  [Contents]   [Previous Chapter]   [Next Chapter] 
Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind

generated by GAPDoc2HTML

utils-0.93/doc/times.css0000644000175100017510000000026115105376105014615 0ustar runnerrunner/* times.css Frank LĂĽbeck */ /* Change default CSS to use Times font. */ body { font-family: Times,Times New Roman,serif; } utils-0.93/doc/utils.tex0000644000175100017510000030151215105376105014647 0ustar runnerrunner% generated by GAPDoc2LaTeX from XML source (Frank Luebeck) \documentclass[a4paper,11pt]{report} \usepackage[top=37mm,bottom=37mm,left=27mm,right=27mm]{geometry} \sloppy \pagestyle{myheadings} \usepackage{amssymb} \usepackage[utf8]{inputenc} \usepackage{makeidx} \makeindex \usepackage{color} \definecolor{FireBrick}{rgb}{0.5812,0.0074,0.0083} \definecolor{RoyalBlue}{rgb}{0.0236,0.0894,0.6179} \definecolor{RoyalGreen}{rgb}{0.0236,0.6179,0.0894} \definecolor{RoyalRed}{rgb}{0.6179,0.0236,0.0894} \definecolor{LightBlue}{rgb}{0.8544,0.9511,1.0000} \definecolor{Black}{rgb}{0.0,0.0,0.0} \definecolor{linkColor}{rgb}{0.0,0.0,0.554} \definecolor{citeColor}{rgb}{0.0,0.0,0.554} \definecolor{fileColor}{rgb}{0.0,0.0,0.554} \definecolor{urlColor}{rgb}{0.0,0.0,0.554} \definecolor{promptColor}{rgb}{0.0,0.0,0.589} \definecolor{brkpromptColor}{rgb}{0.589,0.0,0.0} \definecolor{gapinputColor}{rgb}{0.589,0.0,0.0} \definecolor{gapoutputColor}{rgb}{0.0,0.0,0.0} %% for a long time these were red and blue by default, %% now black, but keep variables to overwrite \definecolor{FuncColor}{rgb}{0.0,0.0,0.0} %% strange name because of pdflatex bug: \definecolor{Chapter }{rgb}{0.0,0.0,0.0} \definecolor{DarkOlive}{rgb}{0.1047,0.2412,0.0064} \usepackage{fancyvrb} \usepackage{mathptmx,helvet} \usepackage[T1]{fontenc} \usepackage{textcomp} \usepackage[ pdftex=true, bookmarks=true, a4paper=true, pdftitle={Written with GAPDoc}, pdfcreator={LaTeX with hyperref package / GAPDoc}, colorlinks=true, backref=page, breaklinks=true, linkcolor=linkColor, citecolor=citeColor, filecolor=fileColor, urlcolor=urlColor, pdfpagemode={UseNone}, ]{hyperref} \newcommand{\maintitlesize}{\fontsize{50}{55}\selectfont} % write page numbers to a .pnr log file for online help \newwrite\pagenrlog \immediate\openout\pagenrlog =\jobname.pnr \immediate\write\pagenrlog{PAGENRS := [} \newcommand{\logpage}[1]{\protect\write\pagenrlog{#1, \thepage,}} %% were never documented, give conflicts with some additional packages \newcommand{\GAP}{\textsf{GAP}} %% nicer description environments, allows long labels \usepackage{enumitem} \setdescription{style=nextline} %% depth of toc \setcounter{tocdepth}{1} %% command for ColorPrompt style examples \newcommand{\gapprompt}[1]{\color{promptColor}{\bfseries #1}} \newcommand{\gapbrkprompt}[1]{\color{brkpromptColor}{\bfseries #1}} \newcommand{\gapinput}[1]{\color{gapinputColor}{#1}} \begin{document} \logpage{[ 0, 0, 0 ]} \begin{titlepage} \mbox{}\vfill \begin{center}{\maintitlesize \textbf{ utils \mbox{}}}\\ \vfill \hypersetup{pdftitle= utils } \markright{\scriptsize \mbox{}\hfill utils \hfill\mbox{}} {\Huge \textbf{ Utility functions in \textsf{GAP} \mbox{}}}\\ \vfill {\Huge 0.93 \mbox{}}\\[1cm] { 13 November 2025 \mbox{}}\\[1cm] \mbox{}\\[2cm] {\Large \textbf{ Thomas Breuer\\ \mbox{}}}\\ {\Large \textbf{ Sebastian Gutsche\\ \mbox{}}}\\ {\Large \textbf{ Max Horn\\ \mbox{}}}\\ {\Large \textbf{ Alexander Hulpke\\ \mbox{}}}\\ {\Large \textbf{ Pedro Garc{\a'\i}a\texttt{\symbol{45}}S{\a'a}nchez\\ \mbox{}}}\\ {\Large \textbf{ Christopher Jefferson\\ \mbox{}}}\\ {\Large \textbf{ Stefan Kohl\\ \mbox{}}}\\ {\Large \textbf{ Frank L{\"u}beck\\ \mbox{}}}\\ {\Large \textbf{ Chris Wensley\\ \mbox{}}}\\ \hypersetup{pdfauthor= Thomas Breuer\\ ; Sebastian Gutsche\\ ; Max Horn\\ ; Alexander Hulpke\\ ; Pedro Garc{\a'\i}a\texttt{\symbol{45}}S{\a'a}nchez\\ ; Christopher Jefferson\\ ; Stefan Kohl\\ ; Frank L{\"u}beck\\ ; Chris Wensley\\ } \end{center}\vfill \mbox{}\\ {\mbox{}\\ \small \noindent \textbf{ Thomas Breuer\\ } Email: \href{mailto://sam@math.rwth-aachen.de} {\texttt{sam@math.rwth\texttt{\symbol{45}}aachen.de}}\\ Homepage: \href{https://www.math.rwth-aachen.de/~Thomas.Breuer} {\texttt{https://www.math.rwth\texttt{\symbol{45}}aachen.de/\texttt{\symbol{126}}Thomas.Breuer}}}\\ {\mbox{}\\ \small \noindent \textbf{ Sebastian Gutsche\\ } Email: \href{mailto://gutsche@mathematik.uni-siegen.de} {\texttt{gutsche@mathematik.uni\texttt{\symbol{45}}siegen.de}}\\ Homepage: \href{https://sebasguts.github.io/} {\texttt{https://sebasguts.github.io/}}}\\ {\mbox{}\\ \small \noindent \textbf{ Max Horn\\ } Email: \href{mailto://mhorn@rptu.de} {\texttt{mhorn@rptu.de}}\\ Homepage: \href{https://github.com/mhorn} {\texttt{https://github.com/mhorn}}}\\ {\mbox{}\\ \small \noindent \textbf{ Alexander Hulpke\\ } Email: \href{mailto://hulpke@math.colostate.edu} {\texttt{hulpke@math.colostate.edu}}\\ Homepage: \href{https://www.math.colostate.edu/~hulpke} {\texttt{https://www.math.colostate.edu/\texttt{\symbol{126}}hulpke}}}\\ {\mbox{}\\ \small \noindent \textbf{ Pedro Garc{\a'\i}a\texttt{\symbol{45}}S{\a'a}nchez\\ } Email: \href{mailto://pedro@ugr.es} {\texttt{pedro@ugr.es}}\\ Homepage: \href{http://www.ugr.es/local/pedro} {\texttt{http://www.ugr.es/local/pedro}}}\\ {\mbox{}\\ \small \noindent \textbf{ Christopher Jefferson\\ } Email: \href{mailto://caj21@st-andrews.ac.uk} {\texttt{caj21@st\texttt{\symbol{45}}andrews.ac.uk}}\\ Homepage: \href{https://caj.host.cs.st-andrews.ac.uk/} {\texttt{https://caj.host.cs.st\texttt{\symbol{45}}andrews.ac.uk/}}}\\ {\mbox{}\\ \small \noindent \textbf{ Stefan Kohl\\ } Email: \href{mailto://stefan@mcs.st-and.ac.uk} {\texttt{stefan@mcs.st\texttt{\symbol{45}}and.ac.uk}}\\ Homepage: \href{https://www.gap-system.org/DevelopersPages/StefanKohl/} {\texttt{https://www.gap\texttt{\symbol{45}}system.org/DevelopersPages/StefanKohl/}}}\\ {\mbox{}\\ \small \noindent \textbf{ Frank L{\"u}beck\\ } Email: \href{mailto://Frank.Luebeck@Math.RWTH-Aachen.De} {\texttt{Frank.Luebeck@Math.RWTH\texttt{\symbol{45}}Aachen.De}}\\ Homepage: \href{https://www.math.rwth-aachen.de/~Frank.Luebeck} {\texttt{https://www.math.rwth\texttt{\symbol{45}}aachen.de/\texttt{\symbol{126}}Frank.Luebeck}}}\\ {\mbox{}\\ \small \noindent \textbf{ Chris Wensley\\ } Email: \href{mailto://cdwensley.maths@btinternet.com} {\texttt{cdwensley.maths@btinternet.com}}\\ Homepage: \href{https://github.com/cdwensley} {\texttt{https://github.com/cdwensley}}}\\ \end{titlepage} \newpage\setcounter{page}{2} {\small \section*{Abstract} \logpage{[ 0, 0, 1 ]} The \textsf{Utils} package provides a space for utility functions in a variety of \textsf{GAP} packages to be collected together into a single package. In this way it is hoped that they will become more visible to package authors. Any package author who transfers a function to \textsf{Utils} will become an author of \textsf{Utils}. If deemed appropriate, functions may also be transferred from the main library. Bug reports, suggestions and comments are, of course, welcome. Please contact the last author at \href{mailto://cdwensley.maths@btinternet.com} {\texttt{cdwensley.maths@btinternet.com}} or submit an issue at the GitHub repository \href{https://github.com/gap-packages/utils/issues/} {\texttt{https://github.com/gap\texttt{\symbol{45}}packages/utils/issues/}}. \mbox{}}\\[1cm] {\small \section*{Copyright} \logpage{[ 0, 0, 2 ]} {\copyright} 2015\texttt{\symbol{45}}2025, The GAP Group. The \textsf{Utils} package is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. \mbox{}}\\[1cm] {\small \section*{Acknowledgements} \logpage{[ 0, 0, 3 ]} This documentation was prepared using the \textsf{GAPDoc} \cite{GAPDoc} and \textsf{AutoDoc} \cite{AutoDoc} packages. The procedure used to produce new releases uses the package \textsf{GitHubPagesForGAP} \cite{GitHubPagesForGAP} and the package \textsf{ReleaseTools}. \mbox{}}\\[1cm] \newpage \def\contentsname{Contents\logpage{[ 0, 0, 4 ]}} \tableofcontents \newpage \chapter{\textcolor{Chapter }{Introduction}}\label{chap-intro} \logpage{[ 1, 0, 0 ]} \hyperdef{L}{X7DFB63A97E67C0A1}{} { The \textsf{Utils} package provides a space for utility functions from a variety of \textsf{GAP} packages to be collected together into a single package. In this way it is hoped that they will become more visible to other package authors. This package was first distributed as part of the \textsf{GAP} 4.8.2 distribution. The package is loaded with the command \begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example] !gapprompt@gap>| !gapinput@LoadPackage( "utils" ); | \end{Verbatim} Functions have been transferred from the following packages: \begin{itemize} \item Conversion of a \textsf{GAP} group to a ${\sf Magma}$ output string, taken from various sources including \texttt{other.gi} in the main library. \end{itemize} Transfer is complete (for now) for functions from the following packages: \begin{itemize} \item \textsf{AutoDoc} \cite{AutoDoc} (with function names changed); \item \textsf{ResClasses} \cite{ResClasses}; \item \textsf{RCWA} \cite{RCWA}; \item \textsf{XMod} \cite{XMod}. \end{itemize} The package may be obtained either as a compressed \texttt{.tar} file or as a \texttt{.zip} file, \texttt{utils\texttt{\symbol{45}}version{\textunderscore}number.tar.gz}, by ftp from one of the following sites: \begin{itemize} \item the \textsf{Utils} GitHub release site: \href{https://gap-packages.github.io/utils/} {\texttt{https://gap\texttt{\symbol{45}}packages.github.io/utils/}}. \item any \textsf{GAP} archive, e.g. \href{https://www.gap-system.org/Packages/packages.html} {\texttt{https://www.gap\texttt{\symbol{45}}system.org/Packages/packages.html}}; \end{itemize} \index{GitHub repository} The package also has a GitHub repository at: \href{https://github.com/gap-packages/utils} {\texttt{https://github.com/gap\texttt{\symbol{45}}packages/utils}}. Once the package is loaded, the manual \texttt{doc/manual.pdf} can be found in the documentation folder. The \texttt{html} versions, with or without ${\sf MathJax}$, may be rebuilt as follows: \begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example] !gapprompt@gap>| !gapinput@ReadPackage( "utils", "makedoc.g" ); | \end{Verbatim} It is possible to check that the package has been installed correctly by running the test files (which terminates the \textsf{GAP} session): \begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example] !gapprompt@gap>| !gapinput@ReadPackage( "utils", "tst/testall.g" );| Architecture: . . . . . testing: . . . . . . . . #I No errors detected while testing \end{Verbatim} Note that functions listed in this manual that are currently in the process of being transferred are only read from the source package \textsf{Home} (say), and so can only be used if \textsf{Home} has already been loaded. There are no such functions in transition at present. \section{\textcolor{Chapter }{Information for package authors}}\label{sect-author-info} \logpage{[ 1, 1, 0 ]} \hyperdef{L}{X8508AD637B79CEE8}{} { A function (or collection of functions) is suitable for transfer from a package \textsf{Home} to \textsf{Utils} if the following conditions are satisfied. \begin{itemize} \item The function is sufficiently non\texttt{\symbol{45}}specialised so that it might be of use to other authors. \item The function does not depend on the remaining functions in \textsf{Home} \item The function does not do what can already be done with a \textsf{GAP} library function. \item Documentation of the function and test examples are available. \item When there is more than one active author of \textsf{Home}, they should all be aware (and content) that the transfer is taking place. \end{itemize} Authors of packages may be reluctant to let go of their utility functions. The following principles may help to reassure them. (Suggestions for more items here are welcome.) \begin{itemize} \item A function that has been transferred to \textsf{Utils} will not be changed without the approval of the original author. \item The current package maintainer has every intention of continuing to maintain \textsf{Utils}. In the event that this proves impossible, the \textsf{GAP} development team will surely find someone to take over. \item Function names will not be changed unless specifically requested by \textsf{Home}'s author(s) or unless they have the form \texttt{HOME{\textunderscore}FunctionName}. \item In order to speed up the transfer process, only functions from one package will be in transition at any given time. Hopefully a week or two will suffice for most packages. \item Any package author who transfers a function to \textsf{Utils} will become an author of \textsf{Utils}. (In truth, \textsf{Utils} does not have \emph{authors}, just a large number of \emph{contributors}.) \end{itemize} The process for transferring utility functions from \textsf{Home} to \textsf{Utils} is described in Chapter \ref{chap-transfer}. } } \chapter{\textcolor{Chapter }{Printing Lists and Iterators}}\label{chap-print} \logpage{[ 2, 0, 0 ]} \hyperdef{L}{X83686EE47E4D4F66}{} { \section{\textcolor{Chapter }{Printing selected items}}\label{sec-print-select} \logpage{[ 2, 1, 0 ]} \hyperdef{L}{X7F6817927F86240F}{} { The functions described here print lists or objects with an iterator with one item per line, either the whole list/iterator or certain subsets: \begin{itemize} \item by giving a list of positions of items to be printed, or \item by specifying a first item and then a regular step. \end{itemize} \subsection{\textcolor{Chapter }{PrintSelection (for a list of positions)}} \logpage{[ 2, 1, 1 ]}\nobreak \hyperdef{L}{X784638AC84D49870}{} {\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{PrintSelection({\mdseries\slshape obj, list})\index{PrintSelection@\texttt{PrintSelection}!for a list of positions} \label{PrintSelection:for a list of positions} }\hfill{\scriptsize (function)}}\\ \noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{PrintSelection({\mdseries\slshape obj, first, step[, last]})\index{PrintSelection@\texttt{PrintSelection}!for a first item and a step} \label{PrintSelection:for a first item and a step} }\hfill{\scriptsize (function)}}\\ This function, given three (or four) parameters, calls operations \texttt{PrintSelectionFromList} or \texttt{PrintSelectionFromIterator} which prints the \emph{first} item specified, and then the item at every \emph{step}. The fourth parameter is essential when the object being printed is infinite. Alternatively, given two parameters, with the second parameter a list \texttt{L} of positive integers, only the items at positions in \texttt{L} are printed. } \begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example] !gapprompt@gap>| !gapinput@L := List( [1..20], n -> n^5 );;| !gapprompt@gap>| !gapinput@PrintSelection( L, [18..20] );| 18 : 1889568 19 : 2476099 20 : 3200000 !gapprompt@gap>| !gapinput@PrintSelection( L, 2, 9 ); | 2 : 32 11 : 161051 20 : 3200000 !gapprompt@gap>| !gapinput@PrintSelection( L, 2, 3, 11 );| 2 : 32 5 : 3125 8 : 32768 11 : 161051 !gapprompt@gap>| !gapinput@s5 := SymmetricGroup( 5 );;| !gapprompt@gap>| !gapinput@PrintSelection( s5, [30,31,100,101] );| 30 : (1,5)(3,4) 31 : (1,5,2) 100 : (1,4,3) 101 : (1,4)(3,5) !gapprompt@gap>| !gapinput@PrintSelection( s5, 1, 30 );| 1 : () 31 : (1,5,2) 61 : (1,2,3) 91 : (1,3,5,2,4) !gapprompt@gap>| !gapinput@PrintSelection( s5, 9, 11, 43 );| 9 : (2,5,3) 20 : (2,4) 31 : (1,5,2) 42 : (1,5,2,3,4) \end{Verbatim} } } \chapter{\textcolor{Chapter }{Lists, Sets and Strings}}\label{chap-lists} \logpage{[ 3, 0, 0 ]} \hyperdef{L}{X7AE6EFC086C0EB3C}{} { \section{\textcolor{Chapter }{Functions for lists}}\label{sec-lists} \logpage{[ 3, 1, 0 ]} \hyperdef{L}{X7C3F1E7D878AAA65}{} { \subsection{\textcolor{Chapter }{DifferencesList}} \logpage{[ 3, 1, 1 ]}\nobreak \hyperdef{L}{X78B7C92681D2F13C}{} {\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{DifferencesList({\mdseries\slshape L})\index{DifferencesList@\texttt{DifferencesList}} \label{DifferencesList} }\hfill{\scriptsize (function)}}\\ This function has been transferred from package \textsf{ResClasses}. It takes a list $L$ of length $n$ and outputs the list of length $n-1$ containing all the differences $L[i]-L[i-1]$. } \begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example] !gapprompt@gap>| !gapinput@List( [1..12], n->n^3 );| [ 1, 8, 27, 64, 125, 216, 343, 512, 729, 1000, 1331, 1728 ] !gapprompt@gap>| !gapinput@DifferencesList( last );| [ 7, 19, 37, 61, 91, 127, 169, 217, 271, 331, 397 ] !gapprompt@gap>| !gapinput@DifferencesList( last );| [ 12, 18, 24, 30, 36, 42, 48, 54, 60, 66 ] !gapprompt@gap>| !gapinput@DifferencesList( last );| [ 6, 6, 6, 6, 6, 6, 6, 6, 6 ] \end{Verbatim} \subsection{\textcolor{Chapter }{QuotientsList}} \logpage{[ 3, 1, 2 ]}\nobreak \hyperdef{L}{X7975371E865B89BC}{} {\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{QuotientsList({\mdseries\slshape L})\index{QuotientsList@\texttt{QuotientsList}} \label{QuotientsList} }\hfill{\scriptsize (function)}}\\ \noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{FloatQuotientsList({\mdseries\slshape L})\index{FloatQuotientsList@\texttt{FloatQuotientsList}} \label{FloatQuotientsList} }\hfill{\scriptsize (function)}}\\ These functions have been transferred from package \textsf{ResClasses}. They take a list $L$ of length $n$ and output the quotients $L[i]/L[i-1]$ of consecutive entries in $L$. An error is returned if an entry is zero. } \begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example] !gapprompt@gap>| !gapinput@List( [0..10], n -> Factorial(n) );| [ 1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800 ] !gapprompt@gap>| !gapinput@QuotientsList( last );| [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ] !gapprompt@gap>| !gapinput@L := [ 1, 3, 5, -1, -3, -5 ];;| !gapprompt@gap>| !gapinput@QuotientsList( L );| [ 3, 5/3, -1/5, 3, 5/3 ] !gapprompt@gap>| !gapinput@FloatQuotientsList( L );| [ 3., 1.66667, -0.2, 3., 1.66667 ] !gapprompt@gap>| !gapinput@QuotientsList( [ 2, 1, 0, -1, -2 ] );| [ 1/2, 0, fail, 2 ] !gapprompt@gap>| !gapinput@FloatQuotientsList( [1..10] );| [ 2., 1.5, 1.33333, 1.25, 1.2, 1.16667, 1.14286, 1.125, 1.11111 ] !gapprompt@gap>| !gapinput@Product( last );| 10. \end{Verbatim} \subsection{\textcolor{Chapter }{SearchCycle}} \logpage{[ 3, 1, 3 ]}\nobreak \hyperdef{L}{X86096E73858CFABD}{} {\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{SearchCycle({\mdseries\slshape L})\index{SearchCycle@\texttt{SearchCycle}} \label{SearchCycle} }\hfill{\scriptsize (operation)}}\\ This function has been transferred from package \textsf{RCWA}. \texttt{SearchCycle} is a tool to find likely cycles in lists. What, precisely, a \emph{cycle} is, is deliberately fuzzy here, and may possibly even change. The idea is that the beginning of the list may be anything, following that the same pattern needs to be repeated several times in order to be recognized as a cycle. } \begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example] !gapprompt@gap>| !gapinput@L := [1..20];; L[1]:=13;; | !gapprompt@gap>| !gapinput@for i in [1..19] do | !gapprompt@>| !gapinput@ if IsOddInt(L[i]) then L[i+1]:=3*L[i]+1; else L[i+1]:=L[i]/2; fi;| !gapprompt@>| !gapinput@ od; | !gapprompt@gap>| !gapinput@L; | [ 13, 40, 20, 10, 5, 16, 8, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4 ] !gapprompt@gap>| !gapinput@SearchCycle( L ); | [ 1, 4, 2 ] !gapprompt@gap>| !gapinput@n := 1;; L := [n];;| !gapprompt@gap>| !gapinput@for i in [1..100] do n:=(n^2+1) mod 1093; Add(L,n); od;| !gapprompt@gap>| !gapinput@L; | [ 1, 2, 5, 26, 677, 363, 610, 481, 739, 715, 795, 272, 754, 157, 604, 848, 1004, 271, 211, 802, 521, 378, 795, 272, 754, 157, 604, 848, 1004, 271, 211, 802, 521, 378, 795, 272, 754, 157, 604, 848, 1004, 271, 211, 802, 521, 378, 795, 272, 754, 157, 604, 848, 1004, 271, 211, 802, 521, 378, 795, 272, 754, 157, 604, 848, 1004, 271, 211, 802, 521, 378, 795, 272, 754, 157, 604, 848, 1004, 271, 211, 802, 521, 378, 795, 272, 754, 157, 604, 848, 1004, 271, 211, 802, 521, 378, 795, 272, 754, 157, 604, 848, 1004 ] !gapprompt@gap>| !gapinput@C := SearchCycle( L );| [ 157, 604, 848, 1004, 271, 211, 802, 521, 378, 795, 272, 754 ] !gapprompt@gap>| !gapinput@P := Positions( L, 157 );| [ 14, 26, 38, 50, 62, 74, 86, 98 ] !gapprompt@gap>| !gapinput@Length( C ); DifferencesList( P );| 12 [ 12, 12, 12, 12, 12, 12, 12 ] \end{Verbatim} \subsection{\textcolor{Chapter }{RandomCombination}} \logpage{[ 3, 1, 4 ]}\nobreak \hyperdef{L}{X7EF06CAD7F35245D}{} {\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{RandomCombination({\mdseries\slshape S, k})\index{RandomCombination@\texttt{RandomCombination}} \label{RandomCombination} }\hfill{\scriptsize (operation)}}\\ This function has been transferred from package \textsf{ResClasses}. It returns a random unordered $k$\texttt{\symbol{45}}tuple of distinct elements of a set{\nobreakspace}$S$. } \begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example] !gapprompt@gap>| !gapinput@## "6 aus 49" is a common lottery in Germany| !gapprompt@gap>| !gapinput@RandomCombination( [1..49], 6 ); | [ 2, 16, 24, 26, 37, 47 ] \end{Verbatim} } \section{\textcolor{Chapter }{Distinct and Common Representatives}}\logpage{[ 3, 2, 0 ]} \hyperdef{L}{X82F443FF84B8FCE3}{} { \index{distinct and common representatives} \subsection{\textcolor{Chapter }{DistinctRepresentatives}} \logpage{[ 3, 2, 1 ]}\nobreak \hyperdef{L}{X78105CAA847A888C}{} {\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{DistinctRepresentatives({\mdseries\slshape list})\index{DistinctRepresentatives@\texttt{DistinctRepresentatives}} \label{DistinctRepresentatives} }\hfill{\scriptsize (operation)}}\\ \noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{CommonRepresentatives({\mdseries\slshape list})\index{CommonRepresentatives@\texttt{CommonRepresentatives}} \label{CommonRepresentatives} }\hfill{\scriptsize (operation)}}\\ \noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{CommonTransversal({\mdseries\slshape grp, subgrp})\index{CommonTransversal@\texttt{CommonTransversal}} \label{CommonTransversal} }\hfill{\scriptsize (operation)}}\\ \noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{IsCommonTransversal({\mdseries\slshape grp, subgrp, list})\index{IsCommonTransversal@\texttt{IsCommonTransversal}} \label{IsCommonTransversal} }\hfill{\scriptsize (operation)}}\\ These operations have been transferred from package \textsf{XMod}. They deal with lists of subsets of $[1 \ldots n]$ and construct systems of distinct and common representatives using simple, non\texttt{\symbol{45}}recursive, combinatorial algorithms. When $L$ is a set of $n$ subsets of $[1 \ldots n]$ and the Hall condition is satisfied (the union of any $k$ subsets has at least $k$ elements), a set of \texttt{DistinctRepresentatives} exists. When $J,K$ are both lists of $n$ sets, the operation \texttt{CommonRepresentatives} returns two lists: the set of representatives, and a permutation of the subsets of the second list. The operation \texttt{CommonTransversal} may be used to provide a common transversal for the sets of left and right cosets of a subgroup $H$ of a group $G$, although a greedy algorithm is usually quicker. } \begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example] !gapprompt@gap>| !gapinput@J := [ [1,2,3], [3,4], [3,4], [1,2,4] ];;| !gapprompt@gap>| !gapinput@DistinctRepresentatives( J );| [ 1, 3, 4, 2 ] !gapprompt@gap>| !gapinput@K := [ [3,4], [1,2], [2,3], [2,3,4] ];;| !gapprompt@gap>| !gapinput@CommonRepresentatives( J, K );| [ [ 3, 3, 3, 1 ], [ 1, 3, 4, 2 ] ] !gapprompt@gap>| !gapinput@d16 := DihedralGroup( IsPermGroup, 16 ); | Group([ (1,2,3,4,5,6,7,8), (2,8)(3,7)(4,6) ]) !gapprompt@gap>| !gapinput@SetName( d16, "d16" );| !gapprompt@gap>| !gapinput@c4 := Subgroup( d16, [ d16.1^2 ] ); | Group([ (1,3,5,7)(2,4,6,8) ]) !gapprompt@gap>| !gapinput@SetName( c4, "c4" );| !gapprompt@gap>| !gapinput@RightCosets( d16, c4 );| [ RightCoset(c4,()), RightCoset(c4,(2,8)(3,7)(4,6)), RightCoset(c4,(1,8,7,6,5, 4,3,2)), RightCoset(c4,(1,8)(2,7)(3,6)(4,5)) ] !gapprompt@gap>| !gapinput@trans := CommonTransversal( d16, c4 );| [ (), (2,8)(3,7)(4,6), (1,2,3,4,5,6,7,8), (1,2)(3,8)(4,7)(5,6) ] !gapprompt@gap>| !gapinput@IsCommonTransversal( d16, c4, trans );| true \end{Verbatim} } \section{\textcolor{Chapter }{Functions for strings}}\label{sec-strings} \logpage{[ 3, 3, 0 ]} \hyperdef{L}{X8033A2FE80FC2F2A}{} { \subsection{\textcolor{Chapter }{BlankFreeString}} \logpage{[ 3, 3, 1 ]}\nobreak \hyperdef{L}{X870C964E7804B266}{} {\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{BlankFreeString({\mdseries\slshape obj})\index{BlankFreeString@\texttt{BlankFreeString}} \label{BlankFreeString} }\hfill{\scriptsize (function)}}\\ This function has been transferred from package \textsf{ResClasses}. The result of \texttt{BlankFreeString( obj );} is a composite of the functions \texttt{String( obj )} and \texttt{RemoveCharacters( obj, " " );}. } \begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example] !gapprompt@gap>| !gapinput@gens := GeneratorsOfGroup( DihedralGroup(12) );| [ f1, f2, f3 ] !gapprompt@gap>| !gapinput@String( gens ); | "[ f1, f2, f3 ]" !gapprompt@gap>| !gapinput@BlankFreeString( gens ); | "[f1,f2,f3]" \end{Verbatim} } } \chapter{\textcolor{Chapter }{Number\texttt{\symbol{45}}theoretic functions}}\label{chap-number} \logpage{[ 4, 0, 0 ]} \hyperdef{L}{X86E71C1687F2D0AD}{} { \section{\textcolor{Chapter }{Functions for integers}}\label{sec-integers} \logpage{[ 4, 1, 0 ]} \hyperdef{L}{X7D33B5B17BF785CA}{} { \subsection{\textcolor{Chapter }{AllSmoothIntegers (for two integers)}} \logpage{[ 4, 1, 1 ]}\nobreak \hyperdef{L}{X8191A031788AC7C0}{} {\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{AllSmoothIntegers({\mdseries\slshape maxp, maxn})\index{AllSmoothIntegers@\texttt{AllSmoothIntegers}!for two integers} \label{AllSmoothIntegers:for two integers} }\hfill{\scriptsize (function)}}\\ \noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{AllSmoothIntegers({\mdseries\slshape L, maxp})\index{AllSmoothIntegers@\texttt{AllSmoothIntegers}!for a list and an integer} \label{AllSmoothIntegers:for a list and an integer} }\hfill{\scriptsize (function)}}\\ This function has been transferred from package \textsf{RCWA}. \index{smooth integer} The function \texttt{AllSmoothIntegers(\mbox{\texttt{\mdseries\slshape maxp}},\mbox{\texttt{\mdseries\slshape maxn}})} returns the list of all positive integers less than or equal to \mbox{\texttt{\mdseries\slshape maxn}} whose prime factors are all in the list $L = \{p ~|~ p \leqslant maxp, p~\mbox{prime} \}$. In the alternative form, when $L$ is a list of primes, the function returns the list of all positive integers whose prime factors lie in $L$. } \begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example] !gapprompt@gap>| !gapinput@AllSmoothIntegers( 3, 1000 );| [ 1, 2, 3, 4, 6, 8, 9, 12, 16, 18, 24, 27, 32, 36, 48, 54, 64, 72, 81, 96, 108, 128, 144, 162, 192, 216, 243, 256, 288, 324, 384, 432, 486, 512, 576, 648, 729, 768, 864, 972 ] !gapprompt@gap>| !gapinput@AllSmoothIntegers( [5,11,17], 1000 );| [ 1, 5, 11, 17, 25, 55, 85, 121, 125, 187, 275, 289, 425, 605, 625, 935 ] !gapprompt@gap>| !gapinput@Length( last );| 16 !gapprompt@gap>| !gapinput@List( [3..20], n -> Length( AllSmoothIntegers( [5,11,17], 10^n ) ) );| [ 16, 29, 50, 78, 114, 155, 212, 282, 359, 452, 565, 691, 831, 992, 1173, 1374, 1595, 1843 ] \end{Verbatim} \subsection{\textcolor{Chapter }{AllProducts}} \logpage{[ 4, 1, 2 ]}\nobreak \hyperdef{L}{X78BE6B8B878D250D}{} {\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{AllProducts({\mdseries\slshape L, k})\index{AllProducts@\texttt{AllProducts}} \label{AllProducts} }\hfill{\scriptsize (function)}}\\ This function has been transferred from package \textsf{RCWA}. The command \texttt{AllProducts(\mbox{\texttt{\mdseries\slshape L}},\mbox{\texttt{\mdseries\slshape k}})} returns the list of all products of \mbox{\texttt{\mdseries\slshape k}} entries of the list{\nobreakspace}\mbox{\texttt{\mdseries\slshape L}}. Note that every ordering of the entries is used so that, in the commuting case, there are bound to be repetitions. } \begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example] !gapprompt@gap>| !gapinput@AllProducts([1..4],3); | [ 1, 2, 3, 4, 2, 4, 6, 8, 3, 6, 9, 12, 4, 8, 12, 16, 2, 4, 6, 8, 4, 8, 12, 16, 6, 12, 18, 24, 8, 16, 24, 32, 3, 6, 9, 12, 6, 12, 18, 24, 9, 18, 27, 36, 12, 24, 36, 48, 4, 8, 12, 16, 8, 16, 24, 32, 12, 24, 36, 48, 16, 32, 48, 64 ] !gapprompt@gap>| !gapinput@Set(last); | [ 1, 2, 3, 4, 6, 8, 9, 12, 16, 18, 24, 27, 32, 36, 48, 64 ] !gapprompt@gap>| !gapinput@AllProducts( [(1,2,3),(2,3,4)], 2 );| [ (2,4,3), (1,2)(3,4), (1,3)(2,4), (1,3,2) ] \end{Verbatim} \subsection{\textcolor{Chapter }{RestrictedPartitionsWithoutRepetitions}} \logpage{[ 4, 1, 3 ]}\nobreak \hyperdef{L}{X845F46E579CEA43F}{} {\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{RestrictedPartitionsWithoutRepetitions({\mdseries\slshape n, S})\index{RestrictedPartitionsWithoutRepetitions@\texttt{Restricted}\-\texttt{Partitions}\-\texttt{Without}\-\texttt{Repetitions}} \label{RestrictedPartitionsWithoutRepetitions} }\hfill{\scriptsize (function)}}\\ This function has been transferred from package \textsf{RCWA}. For a positive integer \mbox{\texttt{\mdseries\slshape n}} and a set of positive integers \mbox{\texttt{\mdseries\slshape S}}, this function returns the list of partitions of \mbox{\texttt{\mdseries\slshape n}} into distinct elements of \mbox{\texttt{\mdseries\slshape S}}. Unlike \texttt{RestrictedPartitions}, no repetitions are allowed. } \begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example] !gapprompt@gap>| !gapinput@RestrictedPartitions( 20, [4..10] );| [ [ 4, 4, 4, 4, 4 ], [ 5, 5, 5, 5 ], [ 6, 5, 5, 4 ], [ 6, 6, 4, 4 ], [ 7, 5, 4, 4 ], [ 7, 7, 6 ], [ 8, 4, 4, 4 ], [ 8, 6, 6 ], [ 8, 7, 5 ], [ 8, 8, 4 ], [ 9, 6, 5 ], [ 9, 7, 4 ], [ 10, 5, 5 ], [ 10, 6, 4 ], [ 10, 10 ] ] !gapprompt@gap>| !gapinput@RestrictedPartitionsWithoutRepetitions( 20, [4..10] );| [ [ 10, 6, 4 ], [ 9, 7, 4 ], [ 9, 6, 5 ], [ 8, 7, 5 ] ] !gapprompt@gap>| !gapinput@RestrictedPartitionsWithoutRepetitions( 10^2, List([1..10], n->n^2 ) );| [ [ 100 ], [ 64, 36 ], [ 49, 25, 16, 9, 1 ] ] \end{Verbatim} \subsection{\textcolor{Chapter }{NextProbablyPrimeInt}} \logpage{[ 4, 1, 4 ]}\nobreak \hyperdef{L}{X81708BF4858505E8}{} {\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{NextProbablyPrimeInt({\mdseries\slshape n})\index{NextProbablyPrimeInt@\texttt{NextProbablyPrimeInt}} \label{NextProbablyPrimeInt} }\hfill{\scriptsize (function)}}\\ This function has been transferred from package \textsf{RCWA}. The function \texttt{NextProbablyPrimeInt(\mbox{\texttt{\mdseries\slshape n}})} does the same as \texttt{NextPrimeInt(\mbox{\texttt{\mdseries\slshape n}})} except that for reasons of performance it tests numbers only for \texttt{IsProbablyPrimeInt(\mbox{\texttt{\mdseries\slshape n}})} instead of \texttt{IsPrimeInt(\mbox{\texttt{\mdseries\slshape n}})}. For large \mbox{\texttt{\mdseries\slshape n}}, this function is much faster than \texttt{NextPrimeInt(\mbox{\texttt{\mdseries\slshape n}})} } \begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example] !gapprompt@gap>| !gapinput@n := 2^251;| 3618502788666131106986593281521497120414687020801267626233049500247285301248 !gapprompt@gap>| !gapinput@NextProbablyPrimeInt( n );| 3618502788666131106986593281521497120414687020801267626233049500247285301313 !gapprompt@gap>| !gapinput@time; | 1 !gapprompt@gap>| !gapinput@NextPrimeInt( n ); | 3618502788666131106986593281521497120414687020801267626233049500247285301313 !gapprompt@gap>| !gapinput@time; | 213 \end{Verbatim} \subsection{\textcolor{Chapter }{PrimeNumbersIterator}} \logpage{[ 4, 1, 5 ]}\nobreak \hyperdef{L}{X8021EEE5787FCA37}{} {\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{PrimeNumbersIterator({\mdseries\slshape [chunksize]})\index{PrimeNumbersIterator@\texttt{PrimeNumbersIterator}} \label{PrimeNumbersIterator} }\hfill{\scriptsize (function)}}\\ This function has been transferred from package \textsf{RCWA}. This function returns an iterator which runs over the prime numbers n ascending order; it takes an optional argument \texttt{chunksize} which specifies the length of the interval which is sieved in one go (the default is $10^7$), and which can be used to balance runtime vs. memory consumption. It is assumed that \texttt{chunksize} is larger than any gap between two consecutive primes within the range one intends to run the iterator over. } \begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example] !gapprompt@gap>| !gapinput@iter := PrimeNumbersIterator();;| !gapprompt@gap>| !gapinput@for i in [1..100] do p := NextIterator(iter); od;| !gapprompt@gap>| !gapinput@p;| 541 !gapprompt@gap>| !gapinput@sum := 0;;| !gapprompt@gap>| !gapinput@## "prime number race" 1 vs. 3 mod 4| !gapprompt@gap>| !gapinput@for p in PrimeNumbersIterator() do | !gapprompt@>| !gapinput@ if p <> 2 then sum := sum + E(4)^(p-1); fi;| !gapprompt@>| !gapinput@ if sum > 0 then break; fi;| !gapprompt@>| !gapinput@ od;| !gapprompt@gap>| !gapinput@p;| 26861 \end{Verbatim} } } \chapter{\textcolor{Chapter }{Groups and homomorphisms}}\label{chap-groups} \logpage{[ 5, 0, 0 ]} \hyperdef{L}{X8171DAF2833FF728}{} { \section{\textcolor{Chapter }{Functions for groups}}\label{sec-groups} \logpage{[ 5, 1, 0 ]} \hyperdef{L}{X7E21E6D285E6B12C}{} { \subsection{\textcolor{Chapter }{Comm}} \logpage{[ 5, 1, 1 ]}\nobreak \hyperdef{L}{X80761843831B468E}{} {\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{Comm({\mdseries\slshape L})\index{Comm@\texttt{Comm}} \label{Comm} }\hfill{\scriptsize (operation)}}\\ This method has been transferred from package \textsf{ResClasses}. It provides a method for \texttt{Comm} when the argument is a list (enclosed in square brackets), and calls the function \texttt{LeftNormedComm}. } \begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example] !gapprompt@gap>| !gapinput@Comm( [ (1,2), (2,3) ] );| (1,2,3) !gapprompt@gap>| !gapinput@Comm( [(1,2),(2,3),(3,4),(4,5),(5,6)] );| (1,5,6) !gapprompt@gap>| !gapinput@Comm(Comm(Comm(Comm((1,2),(2,3)),(3,4)),(4,5)),(5,6)); ## the same| (1,5,6) \end{Verbatim} \subsection{\textcolor{Chapter }{IsCommuting}} \logpage{[ 5, 1, 2 ]}\nobreak \hyperdef{L}{X803A050C7A183CCC}{} {\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{IsCommuting({\mdseries\slshape a, b})\index{IsCommuting@\texttt{IsCommuting}} \label{IsCommuting} }\hfill{\scriptsize (operation)}}\\ This function has been transferred from package \textsf{ResClasses}. It tests whether two elements in a group commute. } \begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example] !gapprompt@gap>| !gapinput@D12 := DihedralGroup( 12 );| !gapprompt@gap>| !gapinput@SetName( D12, "D12" ); | !gapprompt@gap>| !gapinput@a := D12.1;; b := D12.2;; | !gapprompt@gap>| !gapinput@IsCommuting( a, b );| false \end{Verbatim} \subsection{\textcolor{Chapter }{ListOfPowers}} \logpage{[ 5, 1, 3 ]}\nobreak \hyperdef{L}{X87A8F01286548037}{} {\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{ListOfPowers({\mdseries\slshape g, exp})\index{ListOfPowers@\texttt{ListOfPowers}} \label{ListOfPowers} }\hfill{\scriptsize (operation)}}\\ This function has been transferred from package \textsf{RCWA}. The operation \texttt{ListOfPowers(g,exp)} returns the list $[g,g^2,...,g^{exp}]$ of powers of the element $g$. } \begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example] !gapprompt@gap>| !gapinput@ListOfPowers( 2, 20 );| [ 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 1048576 ] !gapprompt@gap>| !gapinput@ListOfPowers( (1,2,3)(4,5), 12 );| [ (1,2,3)(4,5), (1,3,2), (4,5), (1,2,3), (1,3,2)(4,5), (), (1,2,3)(4,5), (1,3,2), (4,5), (1,2,3), (1,3,2)(4,5), () ] !gapprompt@gap>| !gapinput@ListOfPowers( D12.2, 6 );| [ f2, f3, f2*f3, f3^2, f2*f3^2, of ... ] \end{Verbatim} \subsection{\textcolor{Chapter }{GeneratorsAndInverses}} \logpage{[ 5, 1, 4 ]}\nobreak \hyperdef{L}{X820B71307E41BEE5}{} {\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{GeneratorsAndInverses({\mdseries\slshape G})\index{GeneratorsAndInverses@\texttt{GeneratorsAndInverses}} \label{GeneratorsAndInverses} }\hfill{\scriptsize (operation)}}\\ This function has been transferred from package \textsf{RCWA}. This operation returns a list containing the generators of $G$ followed by the inverses of these generators. } \begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example] !gapprompt@gap>| !gapinput@GeneratorsAndInverses( D12 );| [ f1, f2, f3, f1, f2*f3^2, f3^2 ] !gapprompt@gap>| !gapinput@GeneratorsAndInverses( SymmetricGroup(5) ); | [ (1,2,3,4,5), (1,2), (1,5,4,3,2), (1,2) ] \end{Verbatim} \subsection{\textcolor{Chapter }{UpperFittingSeries}} \logpage{[ 5, 1, 5 ]}\nobreak \hyperdef{L}{X84CF95227F9D562F}{} {\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{UpperFittingSeries({\mdseries\slshape G})\index{UpperFittingSeries@\texttt{UpperFittingSeries}} \label{UpperFittingSeries} }\hfill{\scriptsize (attribute)}}\\ \noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{LowerFittingSeries({\mdseries\slshape G})\index{LowerFittingSeries@\texttt{LowerFittingSeries}} \label{LowerFittingSeries} }\hfill{\scriptsize (attribute)}}\\ \noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{FittingLength({\mdseries\slshape G})\index{FittingLength@\texttt{FittingLength}} \label{FittingLength} }\hfill{\scriptsize (attribute)}}\\ These three functions have been transferred from package \textsf{ResClasses}. \index{Fitting series} The upper and lower Fitting series and the Fitting length of a solvable group are described here: \href{https://en.wikipedia.org/wiki/Fitting_length} {\texttt{https://en.wikipedia.org/wiki/Fitting{\textunderscore}length}}. } \begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example] !gapprompt@gap>| !gapinput@UpperFittingSeries( D12 ); LowerFittingSeries( D12 );| [ Group([ ]), Group([ f3, f2*f3 ]), Group([ f1, f3, f2*f3 ]) ] [ D12, Group([ f3 ]), Group([ ]) ] !gapprompt@gap>| !gapinput@FittingLength( D12 );| 2 !gapprompt@gap>| !gapinput@S4 := SymmetricGroup( 4 );;| !gapprompt@gap>| !gapinput@UpperFittingSeries( S4 );| [ Group(()), Group([ (1,2)(3,4), (1,4)(2,3) ]), Group([ (1,2)(3,4), (1,4) (2,3), (2,4,3) ]), Group([ (3,4), (2,3,4), (1,2)(3,4) ]) ] !gapprompt@gap>| !gapinput@List( last, StructureDescription );| [ "1", "C2 x C2", "A4", "S4" ] !gapprompt@gap>| !gapinput@LowerFittingSeries( S4 );| [ Sym( [ 1 .. 4 ] ), Alt( [ 1 .. 4 ] ), Group([ (1,4)(2,3), (1,3) (2,4) ]), Group(()) ] !gapprompt@gap>| !gapinput@List( last, StructureDescription );| [ "S4", "A4", "C2 x C2", "1" ] !gapprompt@gap>| !gapinput@FittingLength( S4);| 3 \end{Verbatim} } \section{\textcolor{Chapter }{Left Cosets for Groups}}\label{sec-leftcosets} \logpage{[ 5, 2, 0 ]} \hyperdef{L}{X7FE4848B7DE6B3FD}{} { \subsection{\textcolor{Chapter }{LeftCoset}} \logpage{[ 5, 2, 1 ]}\nobreak \hyperdef{L}{X8340B4537F17DCD3}{} {\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{LeftCoset({\mdseries\slshape g, U})\index{LeftCoset@\texttt{LeftCoset}} \label{LeftCoset} }\hfill{\scriptsize (operation)}}\\ Since \textsf{GAP} uses right actions by default, the library contains the operation \texttt{RightCoset(U,g)} for constructing the right coset $Ug$ of a subgroup $U \leq G$ and an element $g \in G$. It has been noted in the reference manual that, by inverting all the elements in $Ug$, the left coset $g^{-1}U$ is obtained. Just for the sake of completeness, from August 2022 this package provides the operation \texttt{LeftCoset(g,U)} for constructing the left coset $gU$. Users are strongly recommended to continue to use \texttt{RightCoset} for all serious calculations, since left cosets have a much simpler implementation and do not behave exactly like right cosets. The methods for left cosets which are provided generally work by converting $gU$ to $Ug^{-1}$; applying the equivalent method for right cosets; and, if necessary, converting back again to left cosets. $G$ acts on left cosets by \texttt{OnLeftInverse}: $(gU)^{g_0} = g_0^{-1}*(gU) = (g_0^{-1}g)U$. } \begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example] !gapprompt@gap>| !gapinput@a4 := Group( (1,2,3), (2,3,4) );; SetName( a4, "a4" );| !gapprompt@gap>| !gapinput@k4 := Group( (1,2)(3,4), (1,3)(2,4) );; SetName( k4, "k4" );| !gapprompt@gap>| !gapinput@rc := RightCosets( a4, k4 );| [ RightCoset(k4,()), RightCoset(k4,(2,3,4)), RightCoset(k4,(2,4,3)) ] !gapprompt@gap>| !gapinput@lc := LeftCosets( a4, k4 );| [ LeftCoset((),k4), LeftCoset((2,4,3),k4), LeftCoset((2,3,4),k4) ] !gapprompt@gap>| !gapinput@AsSet( lc[2] );| [ (2,4,3), (1,2,3), (1,3,4), (1,4,2) ] !gapprompt@gap>| !gapinput@LeftCoset( (1,4,2), k4 ) = lc[2];| true !gapprompt@gap>| !gapinput@Representative( lc[2] );| (2,4,3) !gapprompt@gap>| !gapinput@ActingDomain( lc[2] );| k4 !gapprompt@gap>| !gapinput@(1,4,3) in lc[3];| true !gapprompt@gap>| !gapinput@(1,2,3)*lc[2] = lc[3];| true !gapprompt@gap>| !gapinput@lc[2]^(1,3,2) = lc[3];| true \end{Verbatim} \subsection{\textcolor{Chapter }{Inverse}}\label{subsec-inverse} \logpage{[ 5, 2, 2 ]} \hyperdef{L}{X793E48267EF5FD77}{} { The inverse of the left coset $gU$ is the right coset $Ug^{-1}$, and conversely. This is an abuse of the attribute \texttt{Inverse}, since the standard requirement, that $x*x^{-1}$ is an identity, does not hold. \begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example] !gapprompt@gap>| !gapinput@Inverse( rc[3] ) = lc[3];| true !gapprompt@gap>| !gapinput@Inverse( lc[2] ) = rc[2];| true \end{Verbatim} } } \section{\textcolor{Chapter }{Functions for group homomorphisms}}\label{sec-homomorphisms} \logpage{[ 5, 3, 0 ]} \hyperdef{L}{X80A512877F515DE7}{} { \subsection{\textcolor{Chapter }{EpimorphismByGenerators}} \logpage{[ 5, 3, 1 ]}\nobreak \hyperdef{L}{X80C9A0B583FEA7B9}{} {\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{EpimorphismByGenerators({\mdseries\slshape G, H})\index{EpimorphismByGenerators@\texttt{EpimorphismByGenerators}} \label{EpimorphismByGenerators} }\hfill{\scriptsize (operation)}}\\ This function has been transferred from package \textsf{RCWA}. It constructs a group homomorphism which maps the generators of $G$ to those of $H$. Its intended use is when $G$ is a free group, and a warning is printed when this is not the case. Note that anything may happen if the resulting map is not a homomorphism! } \begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example] !gapprompt@gap>| !gapinput@G := Group( (1,2,3), (3,4,5), (5,6,7), (7,8,9) );;| !gapprompt@gap>| !gapinput@phi := EpimorphismByGenerators( FreeGroup("a","b","c","d"), G );| [ a, b, c, d ] -> [ (1,2,3), (3,4,5), (5,6,7), (7,8,9) ] !gapprompt@gap>| !gapinput@PreImagesRepresentativeNC( phi, (1,2,3,4,5,6,7,8,9) );| d*c*b*a !gapprompt@gap>| !gapinput@a := G.1;; b := G.2;; c := G.3;; d := G.4;;| !gapprompt@gap>| !gapinput@d*c*b*a;| (1,2,3,4,5,6,7,8,9) !gapprompt@gap>| !gapinput@## note that it is easy to produce nonsense: | !gapprompt@gap>| !gapinput@epi := EpimorphismByGenerators( Group((1,2,3)), Group((8,9)) );| Warning: calling GroupHomomorphismByImagesNC without checks [ (1,2,3) ] -> [ (8,9) ] !gapprompt@gap>| !gapinput@IsGroupHomomorphism( epi );| true !gapprompt@gap>| !gapinput@Image( epi, (1,2,3) ); | () !gapprompt@gap>| !gapinput@Image( epi, (1,3,2) );| (8,9) \end{Verbatim} \subsection{\textcolor{Chapter }{Pullback}} \logpage{[ 5, 3, 2 ]}\nobreak \hyperdef{L}{X7C705F2A79F8E43C}{} {\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{Pullback({\mdseries\slshape hom1, hom2})\index{Pullback@\texttt{Pullback}} \label{Pullback} }\hfill{\scriptsize (operation)}}\\ \noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{PullbackInfo({\mdseries\slshape G})\index{PullbackInfo@\texttt{PullbackInfo}} \label{PullbackInfo} }\hfill{\scriptsize (attribute)}}\\ If $\phi_1 : G_1 \to H$ and $\phi_2 : G_2 \to H$ are two group homomorphisms with the same range, then their \emph{pullback} is the subgroup of $G_1 \times G_2$ consisting of those elements $(g_1,g_2)$ such that $\phi_1 g_1 = \phi_2 g_2$. The attribute \texttt{PullbackInfo} of a pullback group \texttt{P} is similar to \texttt{DirectProductInfo} for a direct product of groups. Its value is a record with the following components: \begin{description} \item[{\texttt{directProduct}}] the direct product $G_1 \times G_2$, and \item[{\texttt{projections}}] a list with the two projections onto $G_1$ and $G_2$. \end{description} There are no embeddings in this record, but it is possible to use the embeddings into the direct product, see \texttt{Embedding} (\textbf{Reference: Embedding}). } \begin{Verbatim}[commandchars=@|C,fontsize=\small,frame=single,label=Example] @gapprompt|gap>C @gapinput|s4 := Group( (1,2),(2,3),(3,4) );;C @gapprompt|gap>C @gapinput|s3 := Group( (5,6),(6,7) );;C @gapprompt|gap>C @gapinput|c3 := Subgroup( s3, [ (5,6,7) ] );;C @gapprompt|gap>C @gapinput|f := GroupHomomorphismByImages( s4, s3, C @gapprompt|>C @gapinput| [(1,2),(2,3),(3,4)], [(5,6),(6,7),(5,6)] );; C @gapprompt|gap>C @gapinput|i := GroupHomomorphismByImages( c3, s3, [(5,6,7)], [(5,6,7)] );; C @gapprompt|gap>C @gapinput|Pfi := Pullback( f, i );C Group([ (2,3,4)(5,7,6), (1,2)(3,4) ]) @gapprompt|gap>C @gapinput|StructureDescription( Pfi );C "A4" @gapprompt|gap>C @gapinput|info := PullbackInfo( Pfi );C rec( directProduct := Group([ (1,2), (2,3), (3,4), (5,6,7) ]), projections := [ [ (2,3,4)(5,7,6), (1,2)(3,4) ] -> [ (2,3,4), (1,2)(3,4) ], [ (2,3,4)(5,7,6), (1,2)(3,4) ] -> [ (5,7,6), () ] ] ) @gapprompt|gap>C @gapinput|g := (1,2,3)(5,6,7);; C @gapprompt|gap>C @gapinput|ImageElm( info!.projections[1], g );C (1,2,3) @gapprompt|gap>C @gapinput|ImageElm( info!.projections[2], g );C (5,6,7) @gapprompt|gap>C @gapinput|dp := info!.directProduct;; C @gapprompt|gap>C @gapinput|a := ImageElm( Embedding( dp, 1 ), (1,4,3) );; C @gapprompt|gap>C @gapinput|b := ImageElm( Embedding( dp, 2 ), (5,7,6) );; C @gapprompt|gap>C @gapinput|a*b in Pfi;C true \end{Verbatim} \subsection{\textcolor{Chapter }{CentralProduct}} \logpage{[ 5, 3, 3 ]}\nobreak \hyperdef{L}{X78DD2C617B992BE2}{} {\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{CentralProduct({\mdseries\slshape G1, G2, Z1, Phi})\index{CentralProduct@\texttt{CentralProduct}} \label{CentralProduct} }\hfill{\scriptsize (operation)}}\\ \noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{CentralProductInfo({\mdseries\slshape G})\index{CentralProductInfo@\texttt{CentralProductInfo}} \label{CentralProductInfo} }\hfill{\scriptsize (attribute)}}\\ This function was added by Thomas Breuer, following discussions with Hongyi Zhao (see \href{https://github.com/gap-packages/hap/issues/73} {\texttt{https://github.com/gap\texttt{\symbol{45}}packages/hap/issues/73}}). Let \mbox{\texttt{\mdseries\slshape G1}} and \mbox{\texttt{\mdseries\slshape G2}} be two groups, \mbox{\texttt{\mdseries\slshape Z1}} be a central subgroup of \mbox{\texttt{\mdseries\slshape G1}}, and \mbox{\texttt{\mdseries\slshape Phi}} be an isomorphism from \mbox{\texttt{\mdseries\slshape Z1}} to a central subgroup of \mbox{\texttt{\mdseries\slshape G2}}. The \emph{central product} defined by these arguments is the factor group of the direct product of \mbox{\texttt{\mdseries\slshape G1}} and \mbox{\texttt{\mdseries\slshape G2}} by the central subgroup $\{ (z, (\mbox{\texttt{\mdseries\slshape Phi}}(z))^{-1}) : z \in \mbox{\texttt{\mdseries\slshape Z1}} \}$. The attribute \texttt{CentralProductInfo} of a group $G$ that has been created by \texttt{CentralProduct} is similar to \texttt{PullbackInfo} (\ref{PullbackInfo}) for pullback groups. Its value is a record with the following components. \begin{description} \item[{\texttt{projection}}] the epimorphism from the direct product of \mbox{\texttt{\mdseries\slshape G1}} and \mbox{\texttt{\mdseries\slshape G2}} to $G$, and \item[{\texttt{phi}}] the map \mbox{\texttt{\mdseries\slshape Phi}}. \end{description} Note that one can access the direct product as the \texttt{Source} (\textbf{Reference: Source}) value of the \texttt{projection} map, and one can access \mbox{\texttt{\mdseries\slshape G1}} and \mbox{\texttt{\mdseries\slshape G2}} as the two embeddings of this direct product, see \texttt{Embedding} (\textbf{Reference: Embedding}). \begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example] !gapprompt@gap>| !gapinput@g1 := DihedralGroup( 8 );| !gapprompt@gap>| !gapinput@c1 := Centre( g1 );| Group([ f3 ]) !gapprompt@gap>| !gapinput@cp1 := CentralProduct( g1, g1, c1, IdentityMapping( c1 ) );| Group([ f1, f2, f5, f3, f4, f5 ]) !gapprompt@gap>| !gapinput@IdGroup( cp1 ) = IdGroup( ExtraspecialGroup( 2^5, "+" ) );| true !gapprompt@gap>| !gapinput@g2 := QuaternionGroup( 8 );| !gapprompt@gap>| !gapinput@c2 := Centre( g2 );| Group([ y2 ]) !gapprompt@gap>| !gapinput@cp2 := CentralProduct( g2, g2, c2, IdentityMapping( c2 ) );| Group([ f1, f2, f5, f3, f4, f5 ]) !gapprompt@gap>| !gapinput@IdGroup( cp2 ) = IdGroup( ExtraspecialGroup( 2^5, "+" ) );| true !gapprompt@gap>| !gapinput@info2 := CentralProductInfo( cp2 );| rec( phi := IdentityMapping( Group([ y2 ]) ), projection := [ f1, f2, f3, f4, f5, f6 ] -> [ f1, f2, f5, f3, f4, f5 ] ) !gapprompt@gap>| !gapinput@Source( Embedding( Source( info2.projection ), 1 ) ) = g2;| true \end{Verbatim} } \subsection{\textcolor{Chapter }{IdempotentEndomorphisms}} \logpage{[ 5, 3, 4 ]}\nobreak \hyperdef{L}{X801038CB808FC956}{} {\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{IdempotentEndomorphisms({\mdseries\slshape G})\index{IdempotentEndomorphisms@\texttt{IdempotentEndomorphisms}} \label{IdempotentEndomorphisms} }\hfill{\scriptsize (operation)}}\\ \noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{IdempotentEndomorphismsData({\mdseries\slshape G})\index{IdempotentEndomorphismsData@\texttt{IdempotentEndomorphismsData}} \label{IdempotentEndomorphismsData} }\hfill{\scriptsize (attribute)}}\\ \noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{IdempotentEndomorphismsWithImage({\mdseries\slshape genG, R})\index{IdempotentEndomorphismsWithImage@\texttt{IdempotentEndomorphismsWithImage}} \label{IdempotentEndomorphismsWithImage} }\hfill{\scriptsize (operation)}}\\ An endomorphism $f : G \to G$ is idempotent if $f^2=f$. It has an image $R \leqslant G$; is the identity map when restricted to $R$; and has a kernel $N$ which has trivial intersection with $R$ and has size $|G|/|R|$. The operation \texttt{IdempotentEndomorphismsWithImage(genG,R)} returns a list of the images of the generating set \texttt{genG} of a group $G$ under the idempotent endomorphisms with image $R$. The attribute \texttt{IdempotentEndomorphismsData(G)} returns a record \texttt{data} with fields \texttt{data.gens}, a fixed generating set for $G$, and \texttt{data.images} a list of the non\texttt{\symbol{45}}empty outputs of \texttt{IdempotentEndomorphismsWithImage(genG,R)} obtained by iterating over all subgroups of $G$. The operation \texttt{IdempotentEndomorphisms(G)} returns the list of these mappings obtained using \texttt{IdempotentEndomorphismsData(G)}. The first of these is the zero map, the second is the identity. } \begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example] !gapprompt@gap>| !gapinput@gens := [ (1,2,3,4), (1,2)(3,4) ];; | !gapprompt@gap>| !gapinput@d8 := Group( gens );;| !gapprompt@gap>| !gapinput@SetName( d8, "d8" );| !gapprompt@gap>| !gapinput@c2 := Subgroup( d8, [ (2,4) ] );;| !gapprompt@gap>| !gapinput@IdempotentEndomorphismsWithImage( gens, c2 );| [ [ (), (2,4) ], [ (2,4), () ] ] !gapprompt@gap>| !gapinput@IdempotentEndomorphismsData( d8 );| rec( gens := [ (1,2,3,4), (1,2)(3,4) ], images := [ [ [ (), () ] ], [ [ (), (2,4) ], [ (2,4), () ] ], [ [ (), (1,3) ], [ (1,3), () ] ], [ [ (), (1,2)(3,4) ], [ (1,2)(3,4), (1,2)(3,4) ] ], [ [ (), (1,4)(2,3) ], [ (1,4)(2,3), (1,4)(2,3) ] ], [ [ (1,2,3,4), (1,2)(3,4) ] ] ] ) !gapprompt@gap>| !gapinput@List( last.images, L -> Length(L) );| [ 1, 2, 2, 2, 2, 1 ] !gapprompt@gap>| !gapinput@IdempotentEndomorphisms( d8 ); | [ [ (1,2,3,4), (1,2)(3,4) ] -> [ (), () ], [ (1,2,3,4), (1,2)(3,4) ] -> [ (), (2,4) ], [ (1,2,3,4), (1,2)(3,4) ] -> [ (2,4), () ], [ (1,2,3,4), (1,2)(3,4) ] -> [ (), (1,3) ], [ (1,2,3,4), (1,2)(3,4) ] -> [ (1,3), () ], [ (1,2,3,4), (1,2)(3,4) ] -> [ (), (1,2)(3,4) ], [ (1,2,3,4), (1,2)(3,4) ] -> [ (1,2)(3,4), (1,2)(3,4) ], [ (1,2,3,4), (1,2)(3,4) ] -> [ (), (1,4)(2,3) ], [ (1,2,3,4), (1,2)(3,4) ] -> [ (1,4)(2,3), (1,4)(2,3) ], [ (1,2,3,4), (1,2)(3,4) ] -> [ (1,2,3,4), (1,2)(3,4) ] ] \end{Verbatim} The quaternion group \texttt{q8} is an example of a group with a tail: there is only one subgroup in the lattice which covers the identity subgroup. The only idempotent isomorphisms of such groups are the identity mapping and the zero mapping because the only pairs $N,R$ are the whole group and the identity subgroup. \begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example] !gapprompt@gap>| !gapinput@q8 := QuaternionGroup( 8 );;| !gapprompt@gap>| !gapinput@IdempotentEndomorphisms( q8 );| [ [ x, y ] -> [ of ..., of ... ], [ x, y ] -> [ x, y ] ] \end{Verbatim} \subsection{\textcolor{Chapter }{DirectProductOfFunctions}} \logpage{[ 5, 3, 5 ]}\nobreak \hyperdef{L}{X81FA9E6C7F3B9238}{} {\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{DirectProductOfFunctions({\mdseries\slshape G, H, f1, f2})\index{DirectProductOfFunctions@\texttt{DirectProductOfFunctions}} \label{DirectProductOfFunctions} }\hfill{\scriptsize (operation)}}\\ Given group homomorphisms $f_1 : G_1 \to G_2$ and $f_2 : H_1 \to H_2$, this operation return the product homomorphism $f_1 \times f_2 : G_1 \times G_2 \to H_1 \times H_2$. } \begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example] !gapprompt@gap>| !gapinput@c4 := Group( (1,2,3,4) );; | !gapprompt@gap>| !gapinput@c2 := Group( (5,6) );; | !gapprompt@gap>| !gapinput@f1 := GroupHomomorphismByImages( c4, c2, [(1,2,3,4)], [(5,6)] );;| !gapprompt@gap>| !gapinput@c3 := Group( (1,2,3) );; | !gapprompt@gap>| !gapinput@c6 := Group( (1,2,3,4,5,6) );; | !gapprompt@gap>| !gapinput@f2 := GroupHomomorphismByImages( c3, c6, [(1,2,3)], [(1,3,5)(2,4,6)] );; | !gapprompt@gap>| !gapinput@c4c3 := DirectProduct( c4, c3 ); | Group([ (1,2,3,4), (5,6,7) ]) !gapprompt@gap>| !gapinput@c2c6 := DirectProduct( c2, c6 ); | Group([ (1,2), (3,4,5,6,7,8) ]) !gapprompt@gap>| !gapinput@f := DirectProductOfFunctions( c4c3, c2c6, f1, f2 ); | [ (1,2,3,4), (5,6,7) ] -> [ (1,2), (3,5,7)(4,6,8) ] !gapprompt@gap>| !gapinput@ImageElm( f, (1,4,3,2)(5,7,6) ); | (1,2)(3,7,5)(4,8,6) \end{Verbatim} \subsection{\textcolor{Chapter }{DirectProductOfAutomorphismGroups}} \logpage{[ 5, 3, 6 ]}\nobreak \hyperdef{L}{X7CB2D5F27F4182AF}{} {\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{DirectProductOfAutomorphismGroups({\mdseries\slshape A1, A2})\index{DirectProductOfAutomorphismGroups@\texttt{DirectProductOfAutomorphismGroups}} \label{DirectProductOfAutomorphismGroups} }\hfill{\scriptsize (operation)}}\\ Let $A_1,A_2$ be groups of automorphism of groups $G_1,G_2$ respectively. The output of this function is a group $A_1 \times A_2$ of automorphisms of $G_1 \times G_2$. } \begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example] !gapprompt@gap>| !gapinput@c9 := Group( (1,2,3,4,5,6,7,8,9) );; | !gapprompt@gap>| !gapinput@ac9 := AutomorphismGroup( c9 );; | !gapprompt@gap>| !gapinput@q8 := QuaternionGroup( IsPermGroup, 8 );;| !gapprompt@gap>| !gapinput@aq8 := AutomorphismGroup( q8 );;| !gapprompt@gap>| !gapinput@A := DirectProductOfAutomorphismGroups( ac9, aq8 );| !gapprompt@gap>| !gapinput@genA := GeneratorsOfGroup( A );;| !gapprompt@gap>| !gapinput@G := Source( genA[1] );| Group([ (1,2,3,4,5,6,7,8,9), (10,14,12,16)(11,17,13,15), (10,11,12,13) (14,15,16,17) ]) !gapprompt@gap>| !gapinput@a := genA[1]*genA[5]; | [ (1,2,3,4,5,6,7,8,9), (10,14,12,16)(11,17,13,15), (10,11,12,13)(14,15,16,17) ] -> [ (1,3,5,7,9,2,4,6,8), (10,16,12,14)(11,15,13,17), (10,11,12,13)(14,15,16,17) ] !gapprompt@gap>| !gapinput@ImageElm( a, (1,9,8,7,6,5,4,3,2)(10,14,12,16)(11,17,13,15) );| (1,8,6,4,2,9,7,5,3)(10,16,12,14)(11,15,13,17) \end{Verbatim} } } \chapter{\textcolor{Chapter }{Matrices}}\label{chap-matrix} \logpage{[ 6, 0, 0 ]} \hyperdef{L}{X812CCAB278643A59}{} { \section{\textcolor{Chapter }{Some operations for matrices}}\label{sec-matrix-ops} \logpage{[ 6, 1, 0 ]} \hyperdef{L}{X802118FB7C94D6BA}{} { \subsection{\textcolor{Chapter }{DirectSumDecompositionMatrices}} \logpage{[ 6, 1, 1 ]}\nobreak \hyperdef{L}{X787B89237E1398B6}{} {\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{DirectSumDecompositionMatrices({\mdseries\slshape M})\index{DirectSumDecompositionMatrices@\texttt{DirectSumDecompositionMatrices}} \label{DirectSumDecompositionMatrices} }\hfill{\scriptsize (operation)}}\\ In June 2023 Hongyi Zhao asked in the Forum for a function to implement matrix decomposition into blocks. Such a function was then provided by Pedro Garc{\a'\i}a\texttt{\symbol{45}}S{\a'a}nchez. Hongyi Zhao then requested that the function be added to \textsf{Utils}. What is provided here is a revised version of the original solution, returning a list of decompositions. This function is a partial inverse to the undocumented library operation \texttt{DirectSumMat}. So if $L$ is the list of diagonal decompositions of a matrix $M$ then each entry in $L$ is a list of matrices, and the direct sum of each of these lists is equal to the original $M$. In the following examples, $M_6$ is an obvious direct sum with $3$ blocks. $M_4$ is an example with three decompositions, while $M_8 = M_4 \oplus M_4$ has $16$ decompositions (not listed). } \begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example] !gapprompt@gap>| !gapinput@M6 := [ [1,2,0,0,0,0], [3,4,0,0,0,0], [5,6,0,0,0,0], | !gapprompt@>| !gapinput@ [0,0,9,0,0,0], [0,0,0,1,2,3], [0,0,0,4,5,6] ];;| !gapprompt@gap>| !gapinput@Display( M6 );| [ [ 1, 2, 0, 0, 0, 0 ], [ 3, 4, 0, 0, 0, 0 ], [ 5, 6, 0, 0, 0, 0 ], [ 0, 0, 9, 0, 0, 0 ], [ 0, 0, 0, 1, 2, 3 ], [ 0, 0, 0, 4, 5, 6 ] ] !gapprompt@gap>| !gapinput@L6 := DirectSumDecompositionMatrices( M6 );| [ [ [ [ 1, 2 ], [ 3, 4 ], [ 5, 6 ] ], [ [ 9 ] ], [ [ 1, 2, 3 ], [ 4, 5, 6 ] ] ] ] !gapprompt@gap>| !gapinput@M4 := [ [0,3,0,0], [0,0,0,0], [0,0,0,0], [0,0,4,0] ];;| !gapprompt@gap>| !gapinput@Display( M4 );| [ [ 0, 3, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 4, 0 ] ] !gapprompt@gap>| !gapinput@L4 := DirectSumDecompositionMatrices( M4 );| [ [ [ [ 0, 3 ] ], [ [ 0, 0 ], [ 0, 0 ], [ 4, 0 ] ] ], [ [ [ 0, 3 ], [ 0, 0 ] ], [ [ 0, 0 ], [ 4, 0 ] ] ], [ [ [ 0, 3 ], [ 0, 0 ], [ 0, 0 ] ], [ [ 4, 0 ] ] ] ] !gapprompt@gap>| !gapinput@for L in L4 do | !gapprompt@>| !gapinput@ A := DirectSumMat( L );; | !gapprompt@>| !gapinput@ if ( A = M4 ) then Print( "yes, A = M4\n" ); fi; | !gapprompt@>| !gapinput@ od;| yes, A = M4 yes, A = M4 yes, A = M4 !gapprompt@gap>| !gapinput@M8 := DirectSumMat( M4, M4 );; | !gapprompt@gap>| !gapinput@Display( M8 );| [ [ 0, 3, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 4, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 3, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 4, 0 ] ] !gapprompt@gap>| !gapinput@L8 := DirectSumDecompositionMatrices( M8 );;| !gapprompt@gap>| !gapinput@Length( L8 ); | 16 \end{Verbatim} The current method does not, however, catch all possible decompositions. In the following example the matrix $M_5$ has its third row and third column extirely zero, and the only decomposition found has a $[0]$ factor. There are clearly two $2$\texttt{\symbol{45}}factor decompositions with a $2$\texttt{\symbol{45}}by\texttt{\symbol{45}}$3$ and a $3$\texttt{\symbol{45}}by\texttt{\symbol{45}}$2$ factor, but these are not found at present. \begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example] !gapprompt@gap>| !gapinput@M5 := [ [1,2,0,0,0], [3,4,0,0,0], [0,0,0,0,0],| !gapprompt@>| !gapinput@ [0,0,0,6,7], [0,0,0,8,9] ];;| !gapprompt@gap>| !gapinput@Display(M5);| [ [ 1, 2, 0, 0, 0 ], [ 3, 4, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 6, 7 ], [ 0, 0, 0, 8, 9 ] ] !gapprompt@gap>| !gapinput@L5 := DirectSumDecompositionMatrices( M5 ); | [ [ [ [ 1, 2 ], [ 3, 4 ] ], [ [ 0 ] ], [ [ 6, 7 ], [ 8, 9 ] ] ] ] \end{Verbatim} } } \chapter{\textcolor{Chapter }{Iterators}}\label{chap-iterator} \logpage{[ 7, 0, 0 ]} \hyperdef{L}{X85A3F00985453F95}{} { \section{\textcolor{Chapter }{Some iterators for groups and their isomorphisms}}\label{sec-group-iters} \logpage{[ 7, 1, 0 ]} \hyperdef{L}{X7BB5350081B27D17}{} { \index{Iterators} The motivation for adding these operations is partly to give a simple example of an iterator for a list that does not yet exist, and need not be created. \subsection{\textcolor{Chapter }{AllIsomorphismsIterator}} \logpage{[ 7, 1, 1 ]}\nobreak \hyperdef{L}{X7F8B54D1806C762D}{} {\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{AllIsomorphismsIterator({\mdseries\slshape G, H})\index{AllIsomorphismsIterator@\texttt{AllIsomorphismsIterator}} \label{AllIsomorphismsIterator} }\hfill{\scriptsize (operation)}}\\ \noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{AllIsomorphismsNumber({\mdseries\slshape G, H})\index{AllIsomorphismsNumber@\texttt{AllIsomorphismsNumber}} \label{AllIsomorphismsNumber} }\hfill{\scriptsize (operation)}}\\ \noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{AllIsomorphisms({\mdseries\slshape G, H})\index{AllIsomorphisms@\texttt{AllIsomorphisms}} \label{AllIsomorphisms} }\hfill{\scriptsize (operation)}}\\ The main \textsf{GAP} library contains functions producing complete lists of group homomorphisms such as \texttt{AllHomomorphisms}; \texttt{AllEndomorphisms} and \texttt{AllAutomorphisms}. Here we add the missing \texttt{AllIsomorphisms(G,H)} for a list of isomorphisms from $G$ to $H$. The method is simple \texttt{\symbol{45}}\texttt{\symbol{45}} find one isomorphism $G \to H$ and compose this with all the automorphisms of $G$. In all these cases it may not be desirable to construct a list of homomorphisms, but just implement an iterator, and that is what is done here. The operation \texttt{AllIsomorphismsNumber} returns the number of isomorphisms iterated over (this is, of course, just the order of the automorphisms group). The operation \texttt{AllIsomorphisms} produces the list or isomorphisms. } \begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example] !gapprompt@gap>| !gapinput@G := SmallGroup( 6,1);; | !gapprompt@gap>| !gapinput@iter := AllIsomorphismsIterator( G, s3 );;| !gapprompt@gap>| !gapinput@NextIterator( iter );| [ f1, f2 ] -> [ (6,7), (5,6,7) ] !gapprompt@gap>| !gapinput@n := AllIsomorphismsNumber( G, s3 );| 6 !gapprompt@gap>| !gapinput@AllIsomorphisms( G, s3 );| [ [ f1, f2 ] -> [ (6,7), (5,6,7) ], [ f1, f2 ] -> [ (5,7), (5,6,7) ], [ f1, f2 ] -> [ (5,6), (5,7,6) ], [ f1, f2 ] -> [ (6,7), (5,7,6) ], [ f1, f2 ] -> [ (5,7), (5,7,6) ], [ f1, f2 ] -> [ (5,6), (5,6,7) ] ] !gapprompt@gap>| !gapinput@iter := AllIsomorphismsIterator( G, s3 );;| !gapprompt@gap>| !gapinput@for h in iter do Print( ImageElm( h, G.1 ) = (6,7), ", " ); od;| true, false, false, true, false, false, \end{Verbatim} \subsection{\textcolor{Chapter }{AllSubgroupsIterator}} \logpage{[ 7, 1, 2 ]}\nobreak \hyperdef{L}{X831DA5AE8437578F}{} {\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{AllSubgroupsIterator({\mdseries\slshape G})\index{AllSubgroupsIterator@\texttt{AllSubgroupsIterator}} \label{AllSubgroupsIterator} }\hfill{\scriptsize (operation)}}\\ The manual entry for the operation \texttt{AllSubgroups} states that it is only intended to be used on small examples in a classroom situation. Access to all subgroups was required by the \textsf{XMod} package, so this iterator was introduced here. It used the operations \texttt{LatticeSubgroups(G)} and \texttt{ConjugacyClassesSubgroups(lat)}, and then iterates over the entries in these classes. } \begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example] !gapprompt@gap>| !gapinput@c3c3 := Group( (1,2,3), (4,5,6) );; | !gapprompt@gap>| !gapinput@iter := AllSubgroupsIterator( c3c3 );| !gapprompt@gap>| !gapinput@while not IsDoneIterator(iter) do Print(NextIterator(iter),"\n"); od;| Group( () ) Group( [ (4,5,6) ] ) Group( [ (1,2,3) ] ) Group( [ (1,2,3)(4,5,6) ] ) Group( [ (1,3,2)(4,5,6) ] ) Group( [ (4,5,6), (1,2,3) ] ) \end{Verbatim} } \section{\textcolor{Chapter }{Operations on iterators}}\label{sec-iter-ops} \logpage{[ 7, 2, 0 ]} \hyperdef{L}{X85413EED812C6497}{} { This section considers ways of producing an iterator from one or more iterators. It may be that operations equivalent to these are available elsewhere in the library \texttt{\symbol{45}}\texttt{\symbol{45}} if so, the ones here can be removed in due course. \subsection{\textcolor{Chapter }{CartesianIterator}} \logpage{[ 7, 2, 1 ]}\nobreak \hyperdef{L}{X87395A9181A35301}{} {\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{CartesianIterator({\mdseries\slshape iter1, iter2})\index{CartesianIterator@\texttt{CartesianIterator}} \label{CartesianIterator} }\hfill{\scriptsize (operation)}}\\ This iterator returns all pairs $[x,y]$ where $x$ is the output of a first iterator and $y$ is the output of a second iterator. } \begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example] !gapprompt@gap>| !gapinput@it1 := Iterator( [ 1, 2, 3 ] );;| !gapprompt@gap>| !gapinput@it2 := Iterator( [ 4, 5, 6 ] );;| !gapprompt@gap>| !gapinput@iter := CartesianIterator( it1, it2 );;| !gapprompt@gap>| !gapinput@while not IsDoneIterator(iter) do Print(NextIterator(iter),"\n"); od;| [ 1, 4 ] [ 1, 5 ] [ 1, 6 ] [ 2, 4 ] [ 2, 5 ] [ 2, 6 ] [ 3, 4 ] [ 3, 5 ] [ 3, 6 ] \end{Verbatim} \subsection{\textcolor{Chapter }{UnorderedPairsIterator}} \logpage{[ 7, 2, 2 ]}\nobreak \hyperdef{L}{X7C95E27987A812EA}{} {\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{UnorderedPairsIterator({\mdseries\slshape iter})\index{UnorderedPairsIterator@\texttt{UnorderedPairsIterator}} \label{UnorderedPairsIterator} }\hfill{\scriptsize (operation)}}\\ This operation returns pairs $[x,y]$ where $x,y$ are output from a given iterator \texttt{iter}. Unlike the output from \texttt{CartesianIterator(iter,iter)}, unordered pairs are returned. In the case $L = [1,2,3,\ldots]$ the pairs are ordered as $[1,1],[1,2],[2,2],[1,3],[2,3],[3,3],\ldots$. } \begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example] !gapprompt@gap>| !gapinput@L := [6,7,8,9];;| !gapprompt@gap>| !gapinput@iterL := IteratorList( L );; | !gapprompt@gap>| !gapinput@pairsL := UnorderedPairsIterator( iterL );; | !gapprompt@gap>| !gapinput@while not IsDoneIterator(pairsL) do Print(NextIterator(pairsL),"\n"); od;| [ 6, 6 ] [ 6, 7 ] [ 7, 7 ] [ 6, 8 ] [ 7, 8 ] [ 8, 8 ] [ 6, 9 ] [ 7, 9 ] [ 8, 9 ] [ 9, 9 ] !gapprompt@gap>| !gapinput@iter4 := IteratorList( [ 4 ] );| !gapprompt@gap>| !gapinput@pairs4 := UnorderedPairsIterator(iter4);| !gapprompt@gap>| !gapinput@NextIterator( pairs4 );| [ 4, 4 ] !gapprompt@gap>| !gapinput@IsDoneIterator( pairs4 );| true \end{Verbatim} } } \chapter{\textcolor{Chapter }{Records}}\label{chap-record} \logpage{[ 8, 0, 0 ]} \hyperdef{L}{X7AA1073C7E943DD7}{} { \section{\textcolor{Chapter }{Functions for records}}\label{sec-records} \logpage{[ 8, 1, 0 ]} \hyperdef{L}{X82B3D1D583CDF0E5}{} { \subsection{\textcolor{Chapter }{AssignGlobals}} \logpage{[ 8, 1, 1 ]}\nobreak \hyperdef{L}{X84D82EB579B2ACCD}{} {\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{AssignGlobals({\mdseries\slshape rec})\index{AssignGlobals@\texttt{AssignGlobals}} \label{AssignGlobals} }\hfill{\scriptsize (function)}}\\ This function has been transferred from package \textsf{RCWA}. It assigns the record components of \mbox{\texttt{\mdseries\slshape rec}} to global variables with the same names. } \begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example] !gapprompt@gap>| !gapinput@r := rec( a := 1, b := 2, c := 3 );; | !gapprompt@gap>| !gapinput@AssignGlobals( r );| The following global variables have been assigned: [ "a", "b", "c" ] !gapprompt@gap>| !gapinput@[a,b,c];| [ 1, 2, 3 ] \end{Verbatim} } \section{\textcolor{Chapter }{Option records for functions}}\label{sec-options} \logpage{[ 8, 2, 0 ]} \hyperdef{L}{X7E6207B47B9AA30C}{} { \subsection{\textcolor{Chapter }{OptionRecordWithDefaults}} \logpage{[ 8, 2, 1 ]}\nobreak \hyperdef{L}{X8322B9377CC590D2}{} {\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{OptionRecordWithDefaults({\mdseries\slshape defaults, useroptions})\index{OptionRecordWithDefaults@\texttt{OptionRecordWithDefaults}} \label{OptionRecordWithDefaults} }\hfill{\scriptsize (function)}}\\ This functions has been transferred by Chris Jefferson from other packages. It simplifies the handling of records which are intended to be used for expressing configuration options. \mbox{\texttt{\mdseries\slshape defaults}} represents the "default record", and \mbox{\texttt{\mdseries\slshape useroptions}} lets the user give new values for values in \mbox{\texttt{\mdseries\slshape defaults}}. The function returns a record with the same component names as \mbox{\texttt{\mdseries\slshape defaults}} and which has the same values as \mbox{\texttt{\mdseries\slshape defaults}}, except for those component names in \mbox{\texttt{\mdseries\slshape useroptions}}, where the values in \mbox{\texttt{\mdseries\slshape useroptions}} are used instead. An error is given if \mbox{\texttt{\mdseries\slshape useroptions}} contains any component names not in \mbox{\texttt{\mdseries\slshape defaults}}. If \mbox{\texttt{\mdseries\slshape useroptions}} is an empty list it is treated as an empty record, and if \mbox{\texttt{\mdseries\slshape useroptions}} is a list of length $1$ containing a record, this record is used as \mbox{\texttt{\mdseries\slshape useroptions}}. } \begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example] !gapprompt@gap>| !gapinput@defaults := rec( a := 1, b := 2, c := 3 );;| !gapprompt@gap>| !gapinput@OptionRecordWithDefaults( defaults, rec( a := 6) );| rec( a := 6, b := 2, c := 3 ) !gapprompt@gap>| !gapinput@OptionRecordWithDefaults( defaults, rec( b := 7, c := 8 ) );| rec( a := 1, b := 7, c := 8 ) !gapprompt@gap>| !gapinput@OptionRecordWithDefaults( defaults, [ ] );| rec( a := 1, b := 2, c := 3 ) !gapprompt@gap>| !gapinput@OptionRecordWithDefaults( defaults, [ rec( c := 8 ) ] );| rec( a := 1, b := 2, c := 8 ) !gapprompt@gap>| !gapinput@OptionRecordWithDefaults( defaults, rec( d := 9 ) );| Error, Unknown option: d !gapprompt@gap>| !gapinput@OptionRecordWithDefaults( defaults, [ rec( b := 7 ), rec( c := 8 ) ] );| Error, Too many arguments for function !gapprompt@gap>| !gapinput@OptionRecordWithDefaults( defaults, [6,7,8] );| Error, Too many arguments for function \end{Verbatim} This function is designed to support functions with optional arguments given as a variable record, of the form \texttt{function(x,y,options...)}. In the following, very contrived, example function, \texttt{PrintDimensions}, the defaults are given by the variable \texttt{order} which takes values \texttt{h}, \texttt{w} and \texttt{d} having default values $1$, $2$ and $3$. If there is a second argument, then \texttt{OptionRecordWithDefaults( order, arg[2] );} is used to cvhange the values. These three values then determine the order in which the three dimensions are printed using a \texttt{SortParallel} command. \begin{Verbatim}[commandchars=@|A,fontsize=\small,frame=single,label=] PrintDimensions := function( arg ) local nargs, dim, order, V, L, len, K, i; nargs := Length( arg ); dim := [ arg[1]!.height, arg[1]!.width, arg[1]!.depth ]; order := rec( h := 1, w := 2, d := 3 ); V := [ "height", "width", "depth" ]; if ( nargs > 1 ) and IsRecord( arg[2] ) then order := OptionRecordWithDefaults( order, arg[2] ); fi; L := [ order!.h, order!.w, order!.d ]; len := Length( L ); K := [ 1..len ]; SortParallel( L, K ); Print( "dimensions: " ); Print( V[K[1]], " = ", dim[K[1]], ", " ); Print( V[K[2]], " = ", dim[K[2]], ", " ); Print( V[K[3]], " = ", dim[K[3]], "\n" ); end;; \end{Verbatim} In the example below the first call to \texttt{PrintDimensions} has just one parameter, \texttt{mydim}, so the default order is used. In the second call, alternate values for \texttt{h}, \texttt{w} and \texttt{d} are given, causing the width to be printed first, and then the depth and height. \begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example] !gapprompt@gap>| !gapinput@mydim := rec( height := 45, width := 31, depth := 17 ); | rec( depth := 17, height := 45, width := 31 ) !gapprompt@gap>| !gapinput@PrintDimensions( mydim );| dimensions: height = 45, width = 31, depth = 17 !gapprompt@gap>| !gapinput@PrintDimensions( mydim, rec( h:=3, w:=1, d:=2 ) );| dimensions: width = 31, depth = 17, height = 45 \end{Verbatim} } } \chapter{\textcolor{Chapter }{Web Downloads}}\label{chap-download} \logpage{[ 9, 0, 0 ]} \hyperdef{L}{X815B0C4B7EBE6E1E}{} { The \texttt{Download} operation has been written by Thomas Breuer, incorporating a number of suggestions from Max Horn, for version 0.77 of \textsf{Utils}. It implements downloading a file from within \textsf{GAP}. It can use the \textsf{IO} or \textsf{curlInterface} packages, or \emph{wget} or \emph{curl}, if installed, and it can be extended with other download methods quite easily. It is envisaged that, once other packages have started to use it, and any problems have been addressed, that the functions will be transferred to the main \textsf{GAP} library. \section{\textcolor{Chapter }{Functions for downloading files from the web}}\label{sec-download} \logpage{[ 9, 1, 0 ]} \hyperdef{L}{X8758CB7F79EFB6ED}{} { \subsection{\textcolor{Chapter }{Download}} \logpage{[ 9, 1, 1 ]}\nobreak \hyperdef{L}{X7A7438AE8448635E}{} {\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{Download({\mdseries\slshape url[, opt]})\index{Download@\texttt{Download}} \label{Download} }\hfill{\scriptsize (function)}}\\ This function downloads the file with the web address \mbox{\texttt{\mdseries\slshape url}}, which must be a string. The result is a record which has at least the component \texttt{success}, with value \texttt{true} if the download was successful and \texttt{false} otherwise. In the former case, the component \texttt{result} is bound, whose value is a string that contains the contents of the downloaded file. In the latter case, the component \texttt{error} is bound, whose value is a string that describes the problem. The function calls the methods stored in the global list \texttt{Download{\textunderscore}Methods} until one of them is successful. Currently there are methods based on the \textsf{GAP} functions \texttt{DownloadURL} (\textbf{curl: DownloadURL}) and \texttt{SingleHTTPRequest} (\textbf{IO: SingleHTTPRequest}), and methods based on the external programs \texttt{wget} and \texttt{curl}. An optional record \mbox{\texttt{\mdseries\slshape opt}} can be given. The following components are supported. \begin{description} \item[{\texttt{maxTime}}] If this component is bound then its value must be a nonnegative integer $n$, meaning that the function gives up after $n$ seconds. A zero value of $n$ means that no timeout is set, the method will never give up in this case. The default for $n$ is given by the value of the user preference \texttt{DownloadMaxTime} (see \ref{subsec-DownloadMaxTime}). \item[{\texttt{target}}] If this component is bound then its value must be a string that is a local filename, and the function writes the downloaded contents to this file; the returned record does not have a \texttt{result} component in this case. \item[{\texttt{verifyCert}}] If this component is bound and has the value \texttt{false} then those download methods that are based on \texttt{curl} or \texttt{wget} will omit the check of the server's certificate. The same effect is achieved for all \texttt{Download} calls by setting the user preference \texttt{DownloadVerifyCertificate} (see \ref{subsec-DownloadVerifyCertificate}) to \texttt{false} and omitting the \texttt{verifyCert} component from \mbox{\texttt{\mdseries\slshape opt}}. \end{description} \begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example] !gapprompt@gap>| !gapinput@url:= "https://www.gap-system.org/index.html";;| !gapprompt@gap>| !gapinput@res1:= Download( url );;| !gapprompt@gap>| !gapinput@res1.success;| true !gapprompt@gap>| !gapinput@IsBound( res1.result ) and IsString( res1.result );| true !gapprompt@gap>| !gapinput@res2:= Download( Concatenation( url, "xxx" ) );;| !gapprompt@gap>| !gapinput@res2.success;| false !gapprompt@gap>| !gapinput@IsBound( res2.error ) and IsString( res2.error );| true \end{Verbatim} } \subsection{\textcolor{Chapter }{User preference \texttt{DownloadVerifyCertificate}}}\label{subsec-DownloadVerifyCertificate} \logpage{[ 9, 1, 2 ]} \hyperdef{L}{X85182BA486E3C2AA}{} { \index{DownloadVerifyCertificate@\texttt{DownloadVerifyCertificate}} The value \texttt{true} (the default) means that the server's certificate is checked in calls of \texttt{Download} (\ref{Download}), such that nothing gets downloaded if the certificate is invalid. If the value is \texttt{false} then download methods are supposed to omit the check of the server's certificate (this may not be supported by all download methods). One can set the value of the preference to be \texttt{val} via \texttt{SetUserPreference} (\textbf{Reference: SetUserPreference}), by calling \texttt{SetUserPreference( "utils", "DownloadVerifyCertificate", val )}, and access the current value via \texttt{UserPreference} (\textbf{Reference: UserPreference}), by calling \texttt{UserPreference( "utils", "DownloadVerifyCertificate" )}. We recommend leaving this preference at its default value \texttt{true}. Sometimes it can be necessary to change it, e.g. to work around issues with old operating systems which may not be able to correctly verify new certificates. In general it is better to update such a system, but if that is not an option, then disabling certificate checks may be a good last resort. } \subsection{\textcolor{Chapter }{User preference \texttt{DownloadMaxTime}}}\label{subsec-DownloadMaxTime} \logpage{[ 9, 1, 3 ]} \hyperdef{L}{X79E10E5B83EF929F}{} { \index{DownloadMaxTime@\texttt{DownloadMaxTime}} The value \texttt{0} (the default) means that no timeout is set in calls of \texttt{Download} (\ref{Download}). If the value is a positive integer $n$ then those download methods that support a timeout will give up after $n$ seconds. One can set the value of the preference to be \texttt{val} via \texttt{SetUserPreference} (\textbf{Reference: SetUserPreference}), by calling \texttt{SetUserPreference( "utils", "DownloadMaxTime", val )}, and access the current value via \texttt{UserPreference} (\textbf{Reference: UserPreference}), by calling \texttt{UserPreference( "utils", "DownloadMaxTime" )}. } } } \chapter{\textcolor{Chapter }{Various other functions}}\label{chap-others} \logpage{[ 10, 0, 0 ]} \hyperdef{L}{X83EFC3178180D918}{} { \section{\textcolor{Chapter }{File operations}}\label{sec-log2html} \logpage{[ 10, 1, 0 ]} \hyperdef{L}{X81A0A4FF842B039B}{} { \subsection{\textcolor{Chapter }{Log2HTML}} \logpage{[ 10, 1, 1 ]}\nobreak \hyperdef{L}{X7B7ECADF85F748BE}{} {\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{Log2HTML({\mdseries\slshape filename})\index{Log2HTML@\texttt{Log2HTML}} \label{Log2HTML} }\hfill{\scriptsize (function)}}\\ This function has been transferred from package \textsf{RCWA}. This function converts the \textsf{GAP} logfile \texttt{filename} to HTML. It appears that the logfile should be in your current directory. The extension of the input file must be \texttt{*.log}. The name of the output file is the same as the one of the input file except that the extension \texttt{*.log} is replaced by \texttt{*.html}. There is a sample CSS file in \texttt{utils/doc/gaplog.css}, which you can adjust to your taste. } \begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example] !gapprompt@gap>| !gapinput@LogTo( "triv.log" );| !gapprompt@gap>| !gapinput@a := 33^5;| 39135393 !gapprompt@gap>| !gapinput@LogTo(); | !gapprompt@gap>| !gapinput@Log2HTML( "triv.log" ); | \end{Verbatim} } \section{\textcolor{Chapter }{{\LaTeX} strings}}\label{sec-latex} \logpage{[ 10, 2, 0 ]} \hyperdef{L}{X84D2922D87EDE9E9}{} { \subsection{\textcolor{Chapter }{IntOrOnfinityToLaTeX}} \logpage{[ 10, 2, 1 ]}\nobreak \hyperdef{L}{X87DEB2B58266F858}{} {\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{IntOrOnfinityToLaTeX({\mdseries\slshape n})\index{IntOrOnfinityToLaTeX@\texttt{IntOrOnfinityToLaTeX}} \label{IntOrOnfinityToLaTeX} }\hfill{\scriptsize (function)}}\\ This function has been transferred from package \textsf{ResClasses}. \texttt{IntOrInfinityToLaTeX(n)} returns the {\LaTeX} string for \mbox{\texttt{\mdseries\slshape n}}. } \begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example] !gapprompt@gap>| !gapinput@IntOrInfinityToLaTeX( 10^3 );| "1000" !gapprompt@gap>| !gapinput@IntOrInfinityToLaTeX( infinity );| "\\infty" \end{Verbatim} \subsection{\textcolor{Chapter }{LaTeXStringFactorsInt}} \logpage{[ 10, 2, 2 ]}\nobreak \hyperdef{L}{X7DC642B97CD02F4E}{} {\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{LaTeXStringFactorsInt({\mdseries\slshape n})\index{LaTeXStringFactorsInt@\texttt{LaTeXStringFactorsInt}} \label{LaTeXStringFactorsInt} }\hfill{\scriptsize (function)}}\\ This function has been transferred from package \textsf{RCWA}. It returns the prime factorization of the integer $n$ as a string in {\LaTeX} format. } \begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example] !gapprompt@gap>| !gapinput@LaTeXStringFactorsInt( Factorial(12) );| "2^{10} \\cdot 3^5 \\cdot 5^2 \\cdot 7 \\cdot 11" \end{Verbatim} } \section{\textcolor{Chapter }{Conversion to ${\sf Magma}$ strings}}\label{sec-magma} \logpage{[ 10, 3, 0 ]} \hyperdef{L}{X79F021B1830B68F6}{} { \subsection{\textcolor{Chapter }{ConvertToMagmaInputString}} \logpage{[ 10, 3, 1 ]}\nobreak \hyperdef{L}{X8768D7707B4CBBD4}{} {\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{ConvertToMagmaInputString({\mdseries\slshape arg})\index{ConvertToMagmaInputString@\texttt{ConvertToMagmaInputString}} \label{ConvertToMagmaInputString} }\hfill{\scriptsize (function)}}\\ The function \texttt{ConvertToMagmaInputString( obj [, str] )} attempts to output a string \texttt{s} which can be read into ${\sf Magma}$ \cite{MAGMA} so as to produce the same group in that computer algebra system. In the second form the user specifies the name of the resulting object, so that the output string has the form \texttt{"str := ..."}. When \texttt{obj} is a permutation group, the operation \texttt{PermGroupToMagmaFormat(obj)} is called. \index{PermGroupToMagmaFormat} This function has been taken from \texttt{other.gi} in the main library where it was called \texttt{MagmaInputString}. When \texttt{obj} is a pc\texttt{\symbol{45}}group, the operation \texttt{PcGroupToMagmaFormat(obj)} is called. \index{PcGroupToMagmaFormat} This function was private code of Max Horn. When \texttt{obj} is a matrix group over a finite field, the operation \texttt{MatrixGroupToMagmaFormat(obj)} is called. \index{MatrixGroupToMagmaFormat} This function is a modification of private code of Frank L{\"u}beck. Hopefully code for other types of group will be added in due course. These functions should be considered \emph{experimental}, and more testing is desirable. } \begin{Verbatim}[commandchars=@AB,fontsize=\small,frame=single,label=Example] @gappromptAgap>B @gapinputA## permutation groupsB @gappromptAgap>B @gapinputAConvertToMagmaInputString( Group( (1,2,3,4,5), (3,4,5) ) );B "PermutationGroup<5|(1,2,3,4,5),\n(3,4,5)>;\n" @gappromptAgap>B @gapinputAConvertToMagmaInputString( Group( (1,2,3,4,5) ), "c5" ); B "c5 := PermutationGroup<5|(1,2,3,4,5)>;\n" @gappromptAgap>B @gapinputA## pc-groupB @gappromptAgap>B @gapinputAConvertToMagmaInputString( DihedralGroup( IsPcGroup, 10 ) );B "PolycyclicGroup< f1,f2 |\nf1^2,\nf2^5,\nf2^f1 = f2^4\n>;\n" @gappromptAgap>B @gapinputA## fp-groupB @gappromptAgap>B @gapinputAF2 := FreeGroup( 2 );;B @gappromptAgap>B @gapinputAf := F2.1;; g := F2.2;;B @gappromptAgap>B @gapinputArelq8 := [ f^4, g^4, f*g*f*g^-1, f^2*g^2 ];; B @gappromptAgap>B @gapinputAq8 := F2/relq8;; B @gappromptAgap>B @gapinputAConvertToMagmaInputString( q8 );B no conversion function yet available for fp-groups fail @gappromptAgap>B @gapinputA## matrix groupB @gappromptAgap>B @gapinputAM := GL(2,5);; Size(M); B 480 @gappromptAgap>B @gapinputAs1 := ConvertToMagmaInputString( M );B "F := GF(5);\nP := GL(2,F);\ngens := [\nP![2,0,0,1],\nP![4,1,4,0]\n];\nsub

;\n" @gappromptAgap>B @gapinputAPrint( s1 );B F := GF(5); P := GL(2,F); gens := [ P![2,0,0,1], P![4,1,4,0] ]; sub

; @gappromptAgap>B @gapinputAn1 := [ [ Z(9)^0, Z(9)^0 ], [ Z(9)^0, Z(9) ] ];;B @gappromptAgap>B @gapinputAn2 := [ [ Z(9)^0, Z(9)^3 ], [ Z(9)^4, Z(9)^2 ] ];;B @gappromptAgap>B @gapinputAN := Group( n1, n2 );; Size( N );B 5760 @gappromptAgap>B @gapinputAs2 := ConvertToMagmaInputString( N, "gpN" );;B @gappromptAgap>B @gapinputAPrint( s2 );B F := GF(3^2); P := GL(2,F); w := PrimitiveElement(F); gens := [ P![ 1, 1, 1,w^1], P![ 1,w^3, 2,w^2] ]; gpN := sub

; \end{Verbatim} } } \chapter{\textcolor{Chapter }{Obsolete functions}}\label{chap-obsolete} \logpage{[ 11, 0, 0 ]} \hyperdef{L}{X7F561B1D803182FF}{} { \section{\textcolor{Chapter }{Operations from AutoDoc}}\label{sec-obs-folders} \logpage{[ 11, 1, 0 ]} \hyperdef{L}{X7A6BB3D084912F35}{} { The file functions \texttt{FindMatchingFiles} \index{FindMatchingFiles} and \texttt{CreateDirIfMissing} \index{CreateDirIfMissing} were copied from package \textsf{AutoDoc} where they are named \texttt{AutoDoc{\textunderscore}FindMatchingFiles} and \texttt{AutoDoc{\textunderscore}CreateDirIfMissing}. The string function \texttt{StringDotSuffix} \index{StringDotSuffix} was also copied from package \textsf{AutoDoc}, where it is named \texttt{AUTODOC{\textunderscore}GetSuffix}. \index{GetSuffix} The function \texttt{SetIfMissing} \index{SetIfMissing} was also transferred from package \textsf{AutoDoc}, where it is called \texttt{AUTODOC{\textunderscore}SetIfMissing}. It writes into a record provided the position is not yet bound. As from version 0.61, all these functions became obsolete in \textsf{Utils}, but continue to be defined in \textsf{AutoDoc}. } \section{\textcolor{Chapter }{Functions for printing}}\label{sec-obs-print} \logpage{[ 11, 2, 0 ]} \hyperdef{L}{X86F322FC7DECE36F}{} { The function \texttt{PrintOneItemPerLine} \index{PrintOneItemPerLine} was used to prints lists vertically, rather than horizontally. Since a very similar result may be achieved using the \textsf{GAP} library functions \texttt{Perform} and \texttt{Display}, this function became obsolete in version 0.61. \begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example] !gapprompt@gap>| !gapinput@s3 := SymmetricGroup( 3 );; | !gapprompt@gap>| !gapinput@L := KnownPropertiesOfObject( GeneratorsOfGroup( s3 ) );;| !gapprompt@gap>| !gapinput@Perform( L, Display );| IsFinite IsSmallList IsGeneratorsOfMagmaWithInverses IsGeneratorsOfSemigroup IsSubsetLocallyFiniteGroup !gapprompt@gap>| !gapinput@Perform( s3, Display ); | () (2,3) (1,3) (1,3,2) (1,2,3) (1,2) \end{Verbatim} } \section{\textcolor{Chapter }{Other obsolete functions}}\label{sec-obs-others} \logpage{[ 11, 3, 0 ]} \hyperdef{L}{X84A4F0B281FA0F94}{} { \subsection{\textcolor{Chapter }{Applicable Methods}}\label{subsec-app-meth} \logpage{[ 11, 3, 1 ]} \hyperdef{L}{X78B7D1A982BE9866}{} { The function \index{PrintApplicableMethod} \texttt{PrintApplicableMethod}, which was included in versions from 0.41 to 0.58, has been removed since it was considered superfluous. The example shows how to print out a function. \begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example] !gapprompt@gap>| !gapinput@ApplicableMethod( IsCyclic, [ Group((1,2,3),(4,5)) ], 1, 1 );| #I Searching Method for IsCyclic with 1 arguments: #I Total: 7 entries #I Method 4: ``IsCyclic'' at /Applications/gap/gap4r9/lib/grp.gi:30 , value: 36 function( G ) ... end !gapprompt@gap>| !gapinput@Print( last );| function ( G ) if Length( GeneratorsOfGroup( G ) ) = 1 then return true; else TryNextMethod(); fi; return; end !gapprompt@gap>| !gapinput@ApplicableMethod( IsCyclic, [ Group((1,2,3),(4,5)) ], 0, 3 );| function( <1 unnamed arguments> ) ... end !gapprompt@gap>| !gapinput@Print( last ); | function ( <> ) <> end \end{Verbatim} } \subsection{\textcolor{Chapter }{ExponentOfPrime}}\label{subsec-exponent} \logpage{[ 11, 3, 2 ]} \hyperdef{L}{X7C1AF2467FB55D79}{} { The function \texttt{ExponentOfPrime} \index{ExponentOfPrime} was originally transferred from package \textsf{RCWA}. The command \texttt{ExponentOfPrime(\mbox{\texttt{\mdseries\slshape n}},\mbox{\texttt{\mdseries\slshape p}})} returned the exponent of the prime \mbox{\texttt{\mdseries\slshape p}} in the prime factorization of \mbox{\texttt{\mdseries\slshape n}}. Since the \textsf{GAP} function \texttt{PValuation} produces the same results, and does so more quickly, this function has been made obsolete. } } } \chapter{\textcolor{Chapter }{The transfer procedure}}\label{chap-transfer} \logpage{[ 12, 0, 0 ]} \hyperdef{L}{X84AC9613842F014C}{} { We consider here the process for transferring utility functions from a package \textsf{Home} to \textsf{Utils} which has to avoid the potential problem of duplicate declarations of a function causing loading problems in \textsf{GAP}. If the functions in \textsf{Home} all have names of the form \texttt{HOME{\textunderscore}FunctionName} then, in \textsf{Utils}, these functions are likely to be renamed as \texttt{FunctionName} or something similar. In this case the problem of duplicate declarations does not arise. This is what has happened with transfers from the \textsf{AutoDoc} package. The case where the function names are unchanged is more complicated. Initially we tried out a process which allowed repeated declarations and installations of the functions being transferred. This involved additions to the main library files \texttt{global.g} and \texttt{oper.g}. Since there were misgivings about interfering in this way with basic operations such as \texttt{BIND{\textunderscore}GLOBAL}, a simpler (but slightly less convenient) process has been adopted. Using this alternative procedure, the following steps will be followed when making transfers from \textsf{Home} to \textsf{Utils}. \begin{enumerate} \item (\textsf{Home}:) Offer functions for inclusion. This may be simply done by emailing a list of functions. More usefully, email the declaration, implementation, test and documentation files, e.g.: \texttt{home.gd}, \texttt{home.gi}, \texttt{home.tst} and \texttt{home.xml}. (All active authors should be involved.) \item (\textsf{Home}:) Declare that \textsc{m.n} is the last version of \textsf{Home} to contain these functions, so that \textsc{m.n+1} (or similar) will be the first version of \textsf{Home} to have all these functions removed, and to specify \textsf{Utils} as a required package. \item (\textsf{Utils}:) Add strings \mbox{\texttt{\mdseries\slshape "home"}} and \mbox{\texttt{\mdseries\slshape "m.n"}} to the list \texttt{UtilsPackageVersions} in the file \texttt{utils/lib/start.gd}. \begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example] UtilsPackageVersions := [ "autodoc", "2016.01.31", "resclasses", "4.2.5", "home", "m.n", ..., ... ]; \end{Verbatim} While the transfers are being made, it is essential that any new versions of \textsf{Home} should be tested with the latest version of \textsf{Utils} before they are released, so as to avoid loading failures. \item (\textsf{Utils}:) Include the function declaration and implementation sections in suitable files, enclosed within a conditional clause of the form: \begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example] if OKtoReadFromUtils( "Home" ) then . . . . . . . . . . . . fi; \end{Verbatim} \index{OKtoReadFromUtils} The function \texttt{OKtoReadFromUtils} returns \texttt{true} only if there is an installed version of \textsf{Home} and if this version is greater than \textsc{m.n}. So, at this stage, \emph{the copied code will not be read}, and the transferred functions can only be called if \textsf{Home} has been installed. \item (\textsf{Utils}:) Add the test and documentation material to the appropriate files. The copied code can be tested by temporarily moving \textsf{Home} away from \textsf{GAP}'s package directory. \item (\textsf{Utils}:) Release a new version of \textsf{Utils} containing all the transferred material. \item (\textsf{Home}:) Edit out the declarations and implementations of all the transferred functions, and remove references to them in the manual and tests. Possibly add a note to the manual that these functions have been transferred. Add \textsf{Utils} to the list of \textsf{Home}'s required packages in \texttt{PackageInfo.g}. Release a new version of \textsf{Home}. \item (\textsf{Utils}:) In due course, when the new version(s) of \textsf{Home} are well established, it may be safe to remove the conditional clauses mentioned in item 4 above. The entry for \textsf{Home} in \texttt{UtilsPackageLists} may then be removed. \end{enumerate} Finally, a note on the procedure for testing these functions. As long as a function being transferred still exists in the \textsf{Home} package, the code will not be read from \textsf{Utils}. So, when the tests are run, it is necessary to \texttt{LoadPackage("home")} before the function is called. The file \texttt{utils/tst/testall.g} makes sure that all the necessary packages are loaded before the individual tests are called. } \def\bibname{References\logpage{[ "Bib", 0, 0 ]} \hyperdef{L}{X7A6F98FD85F02BFE}{} } \bibliographystyle{alpha} \bibliography{bib.xml} \addcontentsline{toc}{chapter}{References} \def\indexname{Index\logpage{[ "Ind", 0, 0 ]} \hyperdef{L}{X83A0356F839C696F}{} } \cleardoublepage \phantomsection \addcontentsline{toc}{chapter}{Index} \printindex \immediate\write\pagenrlog{["Ind", 0, 0], \arabic{page},} \newpage \immediate\write\pagenrlog{["End"], \arabic{page}];} \immediate\closeout\pagenrlog \end{document} utils-0.93/doc/rainbow.js0000644000175100017510000000533615105376105014771 0ustar runnerrunner function randchar(str) { var i = Math.floor(Math.random() * str.length); while (i == str.length) i = Math.floor(Math.random() * str.length); return str[i]; } hexdigits = "0123456789abcdef"; function randlight() { return randchar("cdef")+randchar(hexdigits)+ randchar("cdef")+randchar(hexdigits)+ randchar("cdef")+randchar(hexdigits) } function randdark() { return randchar("012345789")+randchar(hexdigits)+ randchar("012345789")+randchar(hexdigits)+ randchar("102345789")+randchar(hexdigits) } document.write('\n'); utils-0.93/doc/nocolorprompt.css0000644000175100017510000000031315105376105016407 0ustar runnerrunner /* colors for ColorPrompt like examples */ span.GAPprompt { color: #000000; font-weight: normal; } span.GAPbrkprompt { color: #000000; font-weight: normal; } span.GAPinput { color: #000000; } utils-0.93/doc/chap1_mj.html0000644000175100017510000002136015105376105015335 0ustar runnerrunner GAP (Utils) - Chapter 1: Introduction

Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind

1 Introduction

The Utils package provides a space for utility functions from a variety of GAP packages to be collected together into a single package. In this way it is hoped that they will become more visible to other package authors. This package was first distributed as part of the GAP 4.8.2 distribution.

The package is loaded with the command


gap> LoadPackage( "utils" ); 

Functions have been transferred from the following packages:

  • Conversion of a GAP group to a \({\sf Magma}\) output string, taken from various sources including other.gi in the main library.

Transfer is complete (for now) for functions from the following packages:

The package may be obtained either as a compressed .tar file or as a .zip file, utils-version_number.tar.gz, by ftp from one of the following sites:

The package also has a GitHub repository at: https://github.com/gap-packages/utils.

Once the package is loaded, the manual doc/manual.pdf can be found in the documentation folder. The html versions, with or without \({\sf MathJax}\), may be rebuilt as follows:


gap> ReadPackage( "utils", "makedoc.g" ); 

It is possible to check that the package has been installed correctly by running the test files (which terminates the GAP session):


gap> ReadPackage( "utils", "tst/testall.g" );
Architecture: . . . . . 
testing: . . . . . 
. . . 
#I  No errors detected while testing

Note that functions listed in this manual that are currently in the process of being transferred are only read from the source package Home (say), and so can only be used if Home has already been loaded. There are no such functions in transition at present.

1.1 Information for package authors

A function (or collection of functions) is suitable for transfer from a package Home to Utils if the following conditions are satisfied.

  • The function is sufficiently non-specialised so that it might be of use to other authors.

  • The function does not depend on the remaining functions in Home

  • The function does not do what can already be done with a GAP library function.

  • Documentation of the function and test examples are available.

  • When there is more than one active author of Home, they should all be aware (and content) that the transfer is taking place.

Authors of packages may be reluctant to let go of their utility functions. The following principles may help to reassure them. (Suggestions for more items here are welcome.)

  • A function that has been transferred to Utils will not be changed without the approval of the original author.

  • The current package maintainer has every intention of continuing to maintain Utils. In the event that this proves impossible, the GAP development team will surely find someone to take over.

  • Function names will not be changed unless specifically requested by Home's author(s) or unless they have the form HOME_FunctionName.

  • In order to speed up the transfer process, only functions from one package will be in transition at any given time. Hopefully a week or two will suffice for most packages.

  • Any package author who transfers a function to Utils will become an author of Utils. (In truth, Utils does not have authors, just a large number of contributors.)

The process for transferring utility functions from Home to Utils is described in Chapter 12.

Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind

generated by GAPDoc2HTML

utils-0.93/doc/chap10_mj.html0000644000175100017510000002712215105376105015417 0ustar runnerrunner GAP (Utils) - Chapter 10: Various other functions
Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind

10 Various other functions

10.1 File operations

10.1-1 Log2HTML
‣ Log2HTML( filename )( function )

This function has been transferred from package RCWA.

This function converts the GAP logfile filename to HTML. It appears that the logfile should be in your current directory. The extension of the input file must be *.log. The name of the output file is the same as the one of the input file except that the extension *.log is replaced by *.html. There is a sample CSS file in utils/doc/gaplog.css, which you can adjust to your taste.


gap> LogTo( "triv.log" );
gap> a := 33^5;
39135393
gap> LogTo(); 
gap> Log2HTML( "triv.log" );     

10.2 LaTeX strings

10.2-1 IntOrOnfinityToLaTeX
‣ IntOrOnfinityToLaTeX( n )( function )

This function has been transferred from package ResClasses.

IntOrInfinityToLaTeX(n) returns the LaTeX string for n.


gap> IntOrInfinityToLaTeX( 10^3 );
"1000"
gap> IntOrInfinityToLaTeX( infinity );
"\\infty"

10.2-2 LaTeXStringFactorsInt
‣ LaTeXStringFactorsInt( n )( function )

This function has been transferred from package RCWA.

It returns the prime factorization of the integer \(n\) as a string in LaTeX format.


gap> LaTeXStringFactorsInt( Factorial(12) );
"2^{10} \\cdot 3^5 \\cdot 5^2 \\cdot 7 \\cdot 11"

10.3 Conversion to \({\sf Magma}\) strings

10.3-1 ConvertToMagmaInputString
‣ ConvertToMagmaInputString( arg )( function )

The function ConvertToMagmaInputString( obj [, str] ) attempts to output a string s which can be read into \({\sf Magma}\) [BCP97] so as to produce the same group in that computer algebra system. In the second form the user specifies the name of the resulting object, so that the output string has the form "str := ...".

When obj is a permutation group, the operation PermGroupToMagmaFormat(obj) is called. This function has been taken from other.gi in the main library where it was called MagmaInputString.

When obj is a pc-group, the operation PcGroupToMagmaFormat(obj) is called. This function was private code of Max Horn.

When obj is a matrix group over a finite field, the operation MatrixGroupToMagmaFormat(obj) is called. This function is a modification of private code of Frank LĂĽbeck.

Hopefully code for other types of group will be added in due course.

These functions should be considered experimental, and more testing is desirable.


gap> ## permutation groups
gap> ConvertToMagmaInputString( Group( (1,2,3,4,5), (3,4,5) ) );
"PermutationGroup<5|(1,2,3,4,5),\n(3,4,5)>;\n"
gap> ConvertToMagmaInputString( Group( (1,2,3,4,5) ), "c5" );        
"c5 := PermutationGroup<5|(1,2,3,4,5)>;\n"
gap> ## pc-group
gap> ConvertToMagmaInputString( DihedralGroup( IsPcGroup, 10 ) );
"PolycyclicGroup< f1,f2 |\nf1^2,\nf2^5,\nf2^f1 = f2^4\n>;\n"
gap> ## fp-group
gap> F2 := FreeGroup( 2 );;
gap> f := F2.1;;  g := F2.2;;
gap> relq8 := [ f^4, g^4, f*g*f*g^-1, f^2*g^2 ];; 
gap> q8 := F2/relq8;; 
gap> ConvertToMagmaInputString( q8 );
no conversion function yet available for fp-groups
fail
gap> ## matrix group
gap> M := GL(2,5);;  Size(M); 
480
gap> s1 := ConvertToMagmaInputString( M );
"F := GF(5);\nP := GL(2,F);\ngens := [\nP![2,0,0,1],\nP![4,1,4,0]\n];\nsub<P |\
 gens>;\n"
gap> Print( s1 );
F := GF(5);
P := GL(2,F);
gens := [
P![2,0,0,1],
P![4,1,4,0]
];
sub<P | gens>;
gap> n1 := [ [ Z(9)^0, Z(9)^0 ], [ Z(9)^0, Z(9) ] ];;
gap> n2 := [ [ Z(9)^0, Z(9)^3 ], [ Z(9)^4, Z(9)^2 ] ];;
gap> N := Group( n1, n2 );;  Size( N );
5760
gap> s2 := ConvertToMagmaInputString( N, "gpN" );;
gap> Print( s2 );
F := GF(3^2);
P := GL(2,F);
w := PrimitiveElement(F);
gens := [
P![ 1, 1, 1,w^1],
P![ 1,w^3, 2,w^2]
];
gpN := sub<P | gens>;

Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind

generated by GAPDoc2HTML

utils-0.93/doc/chap0.txt0000644000175100017510000001522215105376105014521 0ustar runnerrunner  utils   Utility functions in GAP  0.93 13 November 2025 Thomas Breuer Sebastian Gutsche Max Horn Alexander Hulpke Pedro GarcĂ­a-Sánchez Christopher Jefferson Stefan Kohl Frank LĂĽbeck Chris Wensley Thomas Breuer Email: mailto:sam@math.rwth-aachen.de Homepage: https://www.math.rwth-aachen.de/~Thomas.Breuer Sebastian Gutsche Email: mailto:gutsche@mathematik.uni-siegen.de Homepage: https://sebasguts.github.io/ Max Horn Email: mailto:mhorn@rptu.de Homepage: https://github.com/mhorn Alexander Hulpke Email: mailto:hulpke@math.colostate.edu Homepage: https://www.math.colostate.edu/~hulpke Pedro GarcĂ­a-Sánchez Email: mailto:pedro@ugr.es Homepage: http://www.ugr.es/local/pedro Christopher Jefferson Email: mailto:caj21@st-andrews.ac.uk Homepage: https://caj.host.cs.st-andrews.ac.uk/ Stefan Kohl Email: mailto:stefan@mcs.st-and.ac.uk Homepage: https://www.gap-system.org/DevelopersPages/StefanKohl/ Frank LĂĽbeck Email: mailto:Frank.Luebeck@Math.RWTH-Aachen.De Homepage: https://www.math.rwth-aachen.de/~Frank.Luebeck Chris Wensley Email: mailto:cdwensley.maths@btinternet.com Homepage: https://github.com/cdwensley ------------------------------------------------------- Abstract The Utils package provides a space for utility functions in a variety of GAP packages to be collected together into a single package. In this way it is hoped that they will become more visible to package authors. Any package author who transfers a function to Utils will become an author of Utils. If deemed appropriate, functions may also be transferred from the main library. Bug reports, suggestions and comments are, of course, welcome. Please contact the last author at mailto:cdwensley.maths@btinternet.com or submit an issue at the GitHub repository https://github.com/gap-packages/utils/issues/. ------------------------------------------------------- Copyright © 2015-2025, The GAP Group. The Utils package is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. ------------------------------------------------------- Acknowledgements This documentation was prepared using the GAPDoc [LN17] and AutoDoc [GH16] packages. The procedure used to produce new releases uses the package GitHubPagesForGAP [Hor17] and the package ReleaseTools. ------------------------------------------------------- Contents (Utils) 1 Introduction 1.1 Information for package authors 2 Printing Lists and Iterators 2.1 Printing selected items 2.1-1 PrintSelection 3 Lists, Sets and Strings 3.1 Functions for lists 3.1-1 DifferencesList 3.1-2 QuotientsList 3.1-3 SearchCycle 3.1-4 RandomCombination 3.2 Distinct and Common Representatives 3.2-1 DistinctRepresentatives 3.3 Functions for strings 3.3-1 BlankFreeString 4 Number-theoretic functions 4.1 Functions for integers 4.1-1 AllSmoothIntegers 4.1-2 AllProducts 4.1-3 RestrictedPartitionsWithoutRepetitions 4.1-4 NextProbablyPrimeInt 4.1-5 PrimeNumbersIterator 5 Groups and homomorphisms 5.1 Functions for groups 5.1-1 Comm 5.1-2 IsCommuting 5.1-3 ListOfPowers 5.1-4 GeneratorsAndInverses 5.1-5 UpperFittingSeries 5.2 Left Cosets for Groups 5.2-1 LeftCoset 5.2-2 Inverse 5.3 Functions for group homomorphisms 5.3-1 EpimorphismByGenerators 5.3-2 Pullback 5.3-3 CentralProduct 5.3-4 IdempotentEndomorphisms 5.3-5 DirectProductOfFunctions 5.3-6 DirectProductOfAutomorphismGroups 6 Matrices 6.1 Some operations for matrices 6.1-1 DirectSumDecompositionMatrices 7 Iterators 7.1 Some iterators for groups and their isomorphisms 7.1-1 AllIsomorphismsIterator 7.1-2 AllSubgroupsIterator 7.2 Operations on iterators 7.2-1 CartesianIterator 7.2-2 UnorderedPairsIterator 8 Records 8.1 Functions for records 8.1-1 AssignGlobals 8.2 Option records for functions 8.2-1 OptionRecordWithDefaults 9 Web Downloads 9.1 Functions for downloading files from the web 9.1-1 Download 9.1-2 User preference DownloadVerifyCertificate 9.1-3 User preference DownloadMaxTime 10 Various other functions 10.1 File operations 10.1-1 Log2HTML 10.2 LaTeX strings 10.2-1 IntOrOnfinityToLaTeX 10.2-2 LaTeXStringFactorsInt 10.3 Conversion to Magma strings 10.3-1 ConvertToMagmaInputString 11 Obsolete functions 11.1 Operations from AutoDoc 11.2 Functions for printing 11.3 Other obsolete functions 11.3-1 Applicable Methods 11.3-2 ExponentOfPrime 12 The transfer procedure  utils-0.93/doc/chap1.txt0000644000175100017510000001272315105376105014525 0ustar runnerrunner 1 Introduction The Utils package provides a space for utility functions from a variety of GAP packages to be collected together into a single package. In this way it is hoped that they will become more visible to other package authors. This package was first distributed as part of the GAP 4.8.2 distribution. The package is loaded with the command  Example   gap> LoadPackage( "utils" );    Functions have been transferred from the following packages:  Conversion of a GAP group to a Magma output string, taken from various sources including other.gi in the main library. Transfer is complete (for now) for functions from the following packages:  AutoDoc [GH16] (with function names changed);  ResClasses [Koh17b];  RCWA [Koh17a];  XMod [WAOU17]. The package may be obtained either as a compressed .tar file or as a .zip file, utils-version_number.tar.gz, by ftp from one of the following sites:  the Utils GitHub release site: https://gap-packages.github.io/utils/.  any GAP archive, e.g. https://www.gap-system.org/Packages/packages.html; The package also has a GitHub repository at: https://github.com/gap-packages/utils. Once the package is loaded, the manual doc/manual.pdf can be found in the documentation folder. The html versions, with or without MathJax, may be rebuilt as follows:  Example   gap> ReadPackage( "utils", "makedoc.g" );    It is possible to check that the package has been installed correctly by running the test files (which terminates the GAP session):  Example   gap> ReadPackage( "utils", "tst/testall.g" ); Architecture: . . . . .  testing: . . . . .  . . .  #I No errors detected while testing   Note that functions listed in this manual that are currently in the process of being transferred are only read from the source package Home (say), and so can only be used if Home has already been loaded. There are no such functions in transition at present. 1.1 Information for package authors A function (or collection of functions) is suitable for transfer from a package Home to Utils if the following conditions are satisfied.  The function is sufficiently non-specialised so that it might be of use to other authors.  The function does not depend on the remaining functions in Home  The function does not do what can already be done with a GAP library function.  Documentation of the function and test examples are available.  When there is more than one active author of Home, they should all be aware (and content) that the transfer is taking place. Authors of packages may be reluctant to let go of their utility functions. The following principles may help to reassure them. (Suggestions for more items here are welcome.)  A function that has been transferred to Utils will not be changed without the approval of the original author.  The current package maintainer has every intention of continuing to maintain Utils. In the event that this proves impossible, the GAP development team will surely find someone to take over.  Function names will not be changed unless specifically requested by Home's author(s) or unless they have the form HOME_FunctionName.  In order to speed up the transfer process, only functions from one package will be in transition at any given time. Hopefully a week or two will suffice for most packages.  Any package author who transfers a function to Utils will become an author of Utils. (In truth, Utils does not have authors, just a large number of contributors.) The process for transferring utility functions from Home to Utils is described in Chapter 12. utils-0.93/doc/lefttoc.css0000644000175100017510000000047415105376105015142 0ustar runnerrunner/* leftmenu.css Frank LĂĽbeck */ /* Change default CSS to show section menu on left side */ body { padding-left: 28%; } body.chap0 { padding-left: 2%; } div.ChapSects div.ContSect:hover div.ContSSBlock { left: 15%; } div.ChapSects { left: 1%; width: 25%; } utils-0.93/doc/manual.pdf0000644000175100017510000107263015105376105014744 0ustar runnerrunner%PDF-1.5 %ĐÔĹŘ 163 0 obj << /Length 434 /Filter /FlateDecode >> stream xÚu“Koś0…÷ó+Ľ„·ľ~łL˘f˘ôˇH!ꢓ3c Ź*éŻď Qfšn°l>>çXpö‹q¶^ń˙Ś—ŮęÓµćLĄŕP –Lh„Ô0٤‚Vöěg4UÝÇŹŮí ÖY<‰“ ¤a‰Ö e€®†×8šGĹŘ솪mú0­šYEĽW\FMŽ&őĹÝLÉ“»s@çč2†Ć ćĘ7iĆÓ™v Á ÁQž Fl|ocÔŃďăÇ?m}Vú-$*ĘLŤ$¬MI IbĘĘö)źS]v1şČŹ$DÇ©ĐܲD"(77xď·y?TyN¬Çˇß•~Â)˘ę˙–żđ¦íŽ.› L¨¤ęNЋڿäÍ~ q3ÖχyÄ” Ě鉻XĐö~2ÝÎ~ňi¶ŰH­óĐ2ď;pĆŠĺ…’Źj˛ .ÄýF*l(âźą6=ëäŞěŞ~hźËĹűíô EỾ ‰ GéÎŞ|±ôř%:jË:\bÁęł"Ż»Ľ9öëFZµő»C€9H!?0ŕ±!+M_ű×#ţĎŹó9[ý˛“Đp endstream endobj 173 0 obj << /Length 753 /Filter /FlateDecode >> stream xÚŐVËnâ0Ýó^’Enž¤+ÚéK}HU‰ÔĹt&$%‰ŁŘÚYôŰÇ` šJe4e®ě{Ď=Ç>×.Ę‹.z'IĎ9ÇC4€xŕz(™!87”‘ČŘ Q2E_űť(Jn}K®äây.ÄnlVűřÁPćŇë|µ¦ç.“ËĹ.Š!ŽüH­µĂ ‚öů2-IÎ*Â-ŰÇn˙¤µĽaźv´]×úµÝE¶ĆfŰYEŠňČ”™Ć!j3´¸W@Âx#“C„ăfNŞQEDí²˝ľČmBŇśÖ0Ąo»Ů„c/łhP2˝ÎuÉ*ÚŚţ!°0׋VŔr!~ä8 ŤkKUś:݆B8iWĚ˝Ż€)`űRăxhĘŚé„pQÚhpŃ .łż/ŔŞ×ż§@fJ*TG9•?Š9tuaó‚fëN?,ţD58UX$e 5d…Č» ĚŮ™÷[ňlżdňŘă~˝OĘ«śµő¨mDŞťC9ęYa® ¤4e•ŁQ~śŘ%˛ă’>“z*Ż‚ˇ·+›ąĺąý˝žé\UŐG:W-ÉvJĆč´;@_ŮĆ'ăΫiagúď,_r=ŐVΖžBôżô1Ŕ¶đa9ĽÁ ź˝Ôiłß_s;~ BŻ–Žńă7ŠÚjn…ŃgéÚČÎبËZĐ>Ŕ˙˝”ZI-%hXÜ)YJJG#ÝŮ•ľämÁkňŐőąRŢDg3ÚrVďq,§äÉ÷F\Řj0I‡jé‚Iˇ›ĆíI‰‚őąĽ6rĐH5J-…FşűP :[MâkËÇ}–—ű´-®ëŹ*Ů>Ţş©iÇ{đ¬Ś46‘h+`mćśŇďú…P˛FžÓ;Y•;†Ęk—$î.ĹyKęąQâć1„šÎ÷)…®7ťh§IçŁ[eÔ÷ÉĄ}l€*~úżĽR7úIç;OíKFŤ+’ŽTó’ľěSŹtş0EˇRÉ6ůh"ŠZж¦B˝Wň µ†˝…îí÷YŇű Ńr+ endstream endobj 184 0 obj << /Length 1294 /Filter /FlateDecode >> stream xÚťWËnŰ8Ýç+´”š&)‰’f6“ÎLÓŠ"踫¶ Y˘m˘˛hT˙}/_ŠŐ*mŃE úňđňÜ7“C‚“»›—ۛͫ˘JJT—$Ű}B«á$Ś šäɶK>¦Ł˝^}Ţţŕ,!Ő¸öhĘÍ*ĐĺpÔbnpP`śe9ŁĽÎ3†Ę‚$ë¬@+ü™Űť6ŞiͤľF5ŁĚŔÉšRDYé‘Ű#÷ v "˘‹ >Ě>ˇ@™@ç¦ýŇřjM+śž•\‘"}×VBŇĆoh€Ě^*że!Ě%Hǡ5BáĽ8XŃ"m”ŕNRą_`Oóĺ%ŤĚînď—Čg¨ĘňoŘkŤ‘^ű.PmeßóÖđ.n¸9reµ‚ßq Éš@p‹18…g-†CĎý:\†VëŚŕôÍŕĄć(´_=®@Ü\üaÂ7lĺŮńp'WÜú;y}ďW;ŢĘS¸ő$UX=-v‘Läů?Kz4G©4r†ę¬śŰw;\Ý·p49ĺŚŢsĄg>‰±ž,$bMPUÔ?ÍD‹š*fŮţfřžŕbúL®šý¤FTQ@ˇ P…¤šűęÍŢ_Öq~ЎkÎP"g%Ă_Ěť\tŠńoz-Ł1sgިlŻäé)ÂqĚíĹN5ę˛bEŕçě^Ž‡ŐşdeŞřY*ŁNU—©PPÉ*p_çqŕŃL+îN0ëK'iĺ¨4jyo#©N*FÓűž7šGÜ`l‹rJq»čmĽ+—Ň.Ć®®XÚßNü_Qä‰:$sÁ{Ű2óú*nEÎbÜÚç.„6eŽúŻťňĺjŕůoŰď,4ߨ*Óăîd«¶®J—tV&´y/r&[Áť0ŻÇťÚ ha$ě·Ś[SHK ćy·1ĎěhĚY˙±Ů„µŃÇť5lshÎk_»VĚőĆŤ¤ŤăŞ7?˛›Bšgd–űß ¦€Y—Şißßň|QâpüŃ` ś?Ń‚ř ¦?3•²šj~˝ ±@”N­bZ„RŰĆ*±“Á/”ϡ„Ýě›űďŮ!YQú C’ŐĺwS2Ër×Ňíwݏ“©–{㻿₨déEŽŐÚ\˛ ¨{ă]ěVĂđŚĘŚ˙Bťnl&ÚőIvbń§âţ8t9A4/"ěă/ö+€ľ}GĘYsŮçčŃnQ^_ßt»ĘlÚËgXa”ŐŐo°ş{MŘ3¬âă04ZŐđtś'‰k)YYÚ—oË»Q…źŁvŮ+űÎ €nlą/îŰíŁßQÜMG=ť +3éÍcáĹË0ô˘)dn ÜŻrp(Đ~e&Őň3¸¶ÝîwüőZŞĹ0Z˘î­©űwQÉŕ? bî´çí±Ż(:±zďł]hxR.¶Ů˘F%fł‰4‹ß·7_ĹŢ‚„ endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 831 /Length 2305 /Filter /FlateDecode >> stream xÚÍZŰrŰČ}çWĚŁ˝ ć~I©¶$[%Żkí¬KR˛›Řz€(XDD,´ě—ýöśAHŠ"©$U—A÷éÓ===rÂ&’C8ăÄ.%ÎpÇá”H‰FĺŃX˘ŃŹ;bŚ ‚ăĹ@â„%B§=†xˉ€ĆdĘ9Ţ .¤‚H-´hZŐ’ĹŃ9P‚păQĘZ`rÚB;Zç‰fD0f-^Ö 0 ZŔ˘ŇibAq=0•1Äh´>ŕBt2©sÄBžUŠXČłÖ«Ę­E‹tÁx2(äN/Ş`´đi` áu0ozŕ’čśDﲋŚD'äŐpĎĘ$§ü5ůůçÁ«/ŇüŰ/ڱ÷á0 ‡2ňpČÂá:ćá0lž¦ÍÓéë%E2,ÓlJůz5_•®I8Ä]Âá S¬ăĄĺíYór…ń¶ąĽ ‡äa׸1§Ň3j ,^÷r&VŤůÔĽ—¶Ů»żĽy¨űCó¬hş+ঠëËŰď›ŢIŁńžŞµč—Î]Îx.ţ˘0nΆml-ÜiűŮä †ĺ*Â^ĆţňPĎyŁbcJĎŰ‘ţČŕ5DĘ."O› šö”d=±<î2yžŽŔ<é‘vŔ{‚¤· ÂIsX“g űłĆ¤.÷‘őh„»ďĽÎDů˛”Ď †eÄŞU\kpUt]µG­ ÝÎ>ITҶd¸‚ŁűÉT/żŹRIŇNĂOeY˝ î]{>š7‘¶É8µCřŃYŢȵGĚä őKłxÓkô:P˘'&Ť¦˛{|k2hÂw[!”˙#Ú^(–akVÍúŘNwy{D?•óLW€ť·!·ęš¬ŢU#lAĺd+üKBlOé·[cźËJş©Îť†äyčQşO»Óf±Ďe»ŇÁo[‡ÉęÄźnďĐe¸U„gíŇň^Ěőöş—ÎÉůöČÖzbÝ‚ç ť ŢˇfXzÉŻ˘˙˝ÁuőPŮI#ó®_öv5‹®ŇRĆ\»ď)“`ć©f@hjóÂrc—’„Ť“ĹEŘf1ľş€čSž Ď“’|'§$şHľ—¤‘ŢMŤ]ĄĆňm¨‰Ž§Ó ?W;RŘ0X´¦nmÝşş]@{‹–×­¨[Y·µ<]ËÓµ<]ËÓµ<]Ë3µ<ł÷ ç z“ĺ×I^™Ć.Ł_˘÷Ń[\pÂ/C°Č™¦Ü[bś˘acGK•’#úťĎŻJČŚ>¤ÓŰčřđ°ŇWˇťG?{ţ_Mât\fŤ˘"žMârDó»rtÇĂQ2Ą×ÉkŕۢPTc5*l^!¬ś ›1Ô˝9ÄQYÎ Ľ»»ŁŁ?/FŮ$.č›<™'ů€—ś‚KďuŘĹŁ:ěHJG˝Ö[pz3/  ¬xMpHoé|širł/rą˘ 1,¬ yĂ wăžOn‘\ĹEŔKoŇr4ż˘iíNĄ¶’V{oČBŐž*ÂŐjż•“Q–OŹňY9ß oÚ đÄZPţ´Ĺ„lĹóy«Ůf“Ä=pĆ=5Ś4ěą Űăpé6Cz4ĎnŃ€ă¬(ă2ˇÉő|ü1CYŘtGĽ ä@Í-…“wÔ-€Ńź 컳©Ś¦Šé0Ѱa­0ÉIłÍ`ž%×yv4żÉiRěN ŇŞtH28pbŰgÜšż¦hś ăńćx 4Š!’(4ü9yĄˇm˙[đŁ˘<§×yrWĐxHç·»(˝Ą3žŚ2ˇbŽZÇźHG=:,čc{HR{~.±śˇĂ4číV3t™|Ť§G“çިT’"ţ* =DŤűnËÁ|ĎŠŔ:ˇY~ť$ß’q6Kň"TwEt^ńk6ď[¦¨ŇPR B“ÓŤÝfpźćńô–~'WÉđöčcHHgż_ürpĽ¨2Nö0ĺç©0ş©$cT:·Ç:¨eÄîě …ÂŤŁ5Š2,S"YŰ­rŔő]2-ĆÉŹ wqtU¦¨ńóiR†‰sÔJ „®©‚„2°€ď4›7Ŕ &+6Z[=X/UĺOשµ’Ş~,dvZ/9µ˛^rbÇő’­×1¶^ÇŘzăęuŚŰq¬Ä(†B±ć µ 58¦G«í˙Q¬UľĆK8FáĂEŐ‰şb›ŐĚP )so«9/ÓqĄE1ÇEÜZ©”őŁg zŹ/~(z‘{fwnŞY^k‰nÇdĺKŠZěÝń§“lX}ÁßđBÚ endstream endobj 224 0 obj << /Length 1104 /Filter /FlateDecode >> stream xÚíš]oŰ6†ďó+x)ËďŹË-m‚é6$Ć: Ű…j3Ž0Ű $yýű;úr,Ç@MJćz0ICůč}xř’4A DĐíiŹ?MŻŢÝH‚ŔÚhЦOH+,ąDJ(Ě…AÓ9zŚ®łuéÖe1ůkúóÁ5R ”/Pżŕţ¶i’l‰­›$(Vsb›Öč^3¤ß©š@Ź1%„D×e>ˇ&Ęć›Y™fë#żA\a-)\ÔŹ–ÇGŔw##Ťbʱ] řčPdĘS–Ż’:ŠA\6'/Éěďdáš‹dS>gyáčc FxKxkçwÖ¡Žů5"F¸ŽTŻÔľČJ ˛šy ř[ž®Ët˝häąK čŤRëysň±tyR‰Ć”6*ŇXvˇUPĘ62/&ű±néfĄkŁJK· Čp{ľ"Uź‚TîAjÍćŤzî ¦%¨˝Ôc#;¤]ćä^”ŢlÖuň/öňć˛î‹Ţá­żkB=±µžŘVĂy_Kćˇĺ{Đ,9÷ŘĽÎV«n\Ľw/ą+ŔoŔX9a2úgBeä„–ZśŻ6T‚6”Š#;mřý¬M–±‹í[Ť~ěc‚đ~٬ľ¸Ľú‡w7Ćî6-%¦BvÎ8nŞôź.±â¦«Q>»¬öâ®Lg-![`ڎ4˘<ŘĂű ¶ź‰Ä(Ł 8"Weś… 1t‚› Gžźyéüm3cÜĽě çl¸ S®ç´q·LJŘŞ˝…ÚE^ěoוľp^Ő°!VzŮź;÷TvާŘZô­Š·*j©/U>3ĐľĘQ,RÝýzY&8Ă~F’´W•±§”Ç@đ)ă:óź9N1łŞ3>L›*°ĺ¬śňĘ÷ŮŞ]Ě^ŞU¦ě­Ăł"Ů÷ź!:ůFâ°UQű,b‡®î¨FQ‚nĂ9hAúž f ig¬‹!yQQóźLsL €´—řu/ t‹&iř´6ňBÍ;É’­ńH ÷n–ĺóÁ‰ÁŽšĚ(3’<,4čéB]ö”„ŮaSă™Q^·$;ÍúJXć1‚ţŻWX±iäóDÉČ}iäzźU+_×Ë, é~śR‰ł—8ě( ežU»M\Ű=Ë? aK×UÍłŐÖv4'_á­d ~,~’ĹeJŽ“Şú^żO,‹’<Í6ť÷>]F4ĺęr‰9ah§řŹ»gL˛‹čĐá-N*§X0LŔ:ďCĹŹ‡ęě’ íľt^lÝS™5?;5ťU˙”,VÉ!ܸÂFŰ®Z04śš P]öUďnkČüĐYcÁ1á˛÷š¶Ę‡éŐżŻx^• endstream endobj 237 0 obj << /Length 396 /Filter /FlateDecode >> stream xÚĺU;kĂ0Ţý+4ÚŐÓÓŇŘŇ&´K x RGI ©ü€ţüĘ‘câ@‹MK‡t'ÄÝwŹďth‡Í‡4¸› …¬ (Ý"Ş Ü˝H‚5á(Ý UŘÔůˇŠ^ӧ̬A{m*1eĘaťôx«@?BpTîĐđa9o}Ă%\̙ĉ (f+)<*!¶·†!´Ph €pńVŮ©MSá¶)˛:·EuđU<çČBTČ’‘–×…!3ÉQL\źóŔc3q±/ަ\űŕ}.Ą}÷·ű¦¶Ź6›ž“4ÄŃ©N7"¸ÖN\6ťK“–ôĚŤîE§vÍĎÖ¬ď4O–-ýĺXćEť»édqzkdýýŘŔlÂw«÷¦ăĚţÖ QRý;ŇÔOWŔyrRŽąŰLžJ:~¤űޏş\ŐÖô1róÜffÓśnf:ťTAÂC¦GZ¶íx™ÄŇ´Á´®‹ĚTĂęq榍–ý%c}ÄgË«çbc>ľ÷@‡Ş endstream endobj 248 0 obj << /Length 1915 /Filter /FlateDecode >> stream xÚ˝Y[Źă4~ź_ńÔJS×—8—EBZv`±,@Ú]!·u›h“¸$Î ĂŻç8¶ÓIšťK‹xĄqěăsŽ?ç28Ř8¸şŔîůőőĹň5ÇĹ(Š(®·A!Îxq‚MëMđ~ö*{-ëů‚r<#óŹ×o.0Â˙«wÁý×wWNhâ$&F(aЬĽď+]ĎI2S›v­sUY‰N'XË‚QŠSż–3Ú•×™4“—ŻŁÁ’"śD0µ›ô›Î‹ĆNŠ˘¬łÉMŰ‹ő'±“óIůl_«9áł›|#3΄ýĐŔ4iG¶Ş¶c-lë;7ÚVťŤý¶­U9p3§|&ę\új;eŤ1"„{ĺ®^ľť´€#‘‘Na­ě†+gŇZ…\ĎÉLËŤ‘,‹Q‚„!şĂŐj'ufN—±d–WF L4ę›&Żv…´żÝ~hľŕ1S´Ł:ËűëvNđLÜŮőąvÝÇLíA»”Ę„öËĄńüť‘…ýµ’kUJ+«TµSá&oň•×ÇŞ 8ęô7&âˇmýŕŠVgŞn@{j^wZ›ńÁ$k‚űňcZ7ÚľlňF×ůjN1śż±¤“Ů˨Ý48Ýî©§‘J8A?~ĚqÔO Q‚č„:d–¦ Ąa<4ŢÜ•c˝Ő…oĹm®łÖÝđ})Ş7ß^_üua@‡âů!L#”Ŕ•[—ď?â`ßŔűĄIpŰÍ,áRĆÇf]üzń‹%P.EiD#‹ů1uÂpâÔţöoQî yĽ3ŁŔźž˛ő@ý¸SźÁMH’†RPj,“|LÎá•HŠCö°BPĘůçµ8C†W#J¨“g8°=ëôoŢ]Mśu Đ7Žą=ęťŘ墉Y7'÷@`đ~ÁGÔľ5pŠ›íäĚńĽűđ…áäć űĂäËQúś¦>ě  Ö{÷Ů®9ö.ŹQÂÎ<ä3dôj‹„áY€?]„' …ü! aHĹ|HCr„{Ć4E‰GŇëC6ě• Ă7&®8>[IY9Š«EŐle]{öł{Ŕ~[ťĘÄí[~m^ ’•€ …@Ŕ¤ă›N—”ňá$Ŕ.ĆłWč„^«ş1yĎ‚QÚE óSń"cCňX¸÷ň~Ň®VíŢŠěäA4Ěľ· 22Fżę'±+Ĺ”p“3€‰nšjőľŐVŞ EŐî^Ŕ,->™Đ)ťQÖ©ć—ĎT۸eŞ­×Ň˝ä Të˘ÝGw»|îíľ IŚbL‡ˇ­ řh—OéÂ]ˇ}•WŁŁ-…*ňU-ę»yÄg.Śň¤Ë®ěiş :g|ć3  !!LiéSŽ»üĐĽT;††<žÜ—í§gCŹ=˝1śRDcć}órÎLˇľQëIG†˛>©~?ćSŽř:˘ž]}G˘Ń}<¸émxo8݉Rzßf˘ÚÉÍ=÷’L-Ŕq fSDX|ŠŮďdóŞM#'k„~’S¬ţÁ Ee$^Ů>¶Á¤ú‰·!9ɆWżĎÁO/'/,ď†xÚ+€‘ŞÝÍúT@Q ź1?B”E”*=ľ¬?Z˙G• @J ¤˙# ůą2í5Eöb3ČĆzwŃ®}OŰŻ0ɦiueîk)ŞVS„E¨VzžŮ¨őŇÎEűÍv x T.ý_‹ĘĘ_9•¶Ş­6Nˇj¤.ČnKYiá[™pʰyŚGýŕ«  nŇMׂ’Sšs€‡l>s€›¸(ôDîÍ帩ă“O3ůűT-@ zŚ8;:{#ţžŚ¶"ňw*m™ĺái{Tyˇ‡Ť˛i;žžj.`FŮÓ\"!5COj.ť°őQ­M ;"ŚźSkź!Â+ĺ1IÎj;ś!Â+AqG†˙Kk‰@ôM9µµôN>ÜZştoĄř$áĘŁÝÝlzľłŽý ĽKĹgťú2z5€śÎj®ž.ÁSŔŠg´š†˙’mBtáđHÝż˘†éśčżŇĺkŁ endstream endobj 257 0 obj << /Length 2495 /Filter /FlateDecode >> stream xÚ­YëŹŰ¸˙ľ…~¨y|H””Ň6—䀦׻=܇äPheÚVهOŹŰîßr(K¶v×›ä!Фf†óü Í]Ŕ·W»ąúîű( b–Ć\7Ű@&1ă!ĚhÁR7›ŕăj苲»ţíćجÁYĘS·[j&U´ě>Ť{®8ÖˇHYDÖ*b‰ŽÜ¦÷ýőZŞhUtř W‡¦ëŠŰҸپqĎ|oňĎnCżĎč“~O»Yţ9Ű·ľĎ:7{kLM´ëîZ¬ú¬,͆č5mkňľĽ§­÷îŰv¨ë˘ŢťďM×»őOśËŇýO<âwű"ßă1µĐ,U1<‹ÂÔ®7mUÔYo?‰¸%iő¦gzÓ!¨Mzµ˝}ýă˘r#ëŘoę ¨©©AńĘŞůÍÍŐďW–y Ŕ\,RQ Ó„©Tyuőń7l`퇀ĂTÜŮťU ŇE1~W?_ýŰąź˛TKmůĆ)SJ1Ř™jÇţÍ˙˛ęPšsÎJ &tú%¬gâÇVüI=F’ĄIzF! XA| /D˘|‚€€ŕ˘‡…řr^X0™†Ď ÁLŰ_gkwÁ|â§· –NbâĆ!Kŕi ˝ËualżóT,Áé >®#­~2ŮćG ČëµXí Fɵ]xaóĆ‹—ôÖwýwY•l‡{_ŕĆX$đő/Äö©sřü2sĂQőĎVÜąî#ô˙ô$Ö¬W“BŻŰ|_ô„†Źk^9˝0§6y›<Îâm<賥 v=$ŐWË'şô|Ďîü|PvBům ©RĆU°ËĎđlÎĎ  ăoc# Ąť|ńOďÁ!PWw Ó¶MŰąńĆ —bĺÄ7¨xXśqhËÔU¬úŮź–Ü×ĺ௠áĹŕ@J}U5úb ľ ő(0”¶ŕÍęůH¤hD‰dŕÎ>4=‚ťd„W0ÚuŢĆčÜkYtÖ p\ °J"´Zeő•§$˛–¨ćŕ­Úá­ńű :´Đš@Ť{o¶nĂ­qp ÷¶YÝmÁ1˝HüAäŐÔ–WŻZ¨G8Ň«mŰTnÎń…©®ÚܸIŹ"š4č=ôŕë]S™%¦$Z‡6aáë˛{,gPňOVY˝qśşĆqĎłÚMĄ˝%Á†ÎĐćb»(äĂĐŘ% żËAc ™•¨•{ÇĘâd«HĄ *ś&)»•M¶1HnJđŐÍŢX‹B¦Čü nÜł ŰŃÔqŕŐÁ/°Ŕ˘Đ»çˇ5ř#ůÁÝC¦B-Q~n›á;Ŕ–'¨€Ď1"‚sľz_oŻ!M5m•ąŇ±”gč÷ô¦MË©>A čÄy Z‘éx^xSÜÚéăJŢ@Ëá×ŕÝ÷Śr`—0đŮ EźŮţÇnô”Ľ÷Gëɸ!sŹř® ˇVAX<í):Ű č»–śN2>vwż<Ř‚‚ü¦bKâď)VCH…Zčy°nAM ÚĺÎE;#oęM1q˘ŃÝ:°e‡}:嬿„ěľ–˛<µORFóPąuâąź’›vŢŹ­‹ ‹Ľđ9ËúyíN éyTÖ1ę×K‰VÇÎí`ň"lj6ľ9ôQĐł*v{Ţ’Ě61Âň}E_7 âvćČ'ęY‹H0M*ŠľHE›Ć7˛uCrmĚÁÔtż­÷_·¦ĘŠz´éy^Xđ1K–ÄÉ©»>‘k˙Á×Ř~é`¤×»Ń*.[Ł~Çě91̦©itWô”łĹB·Żtú¬nż,n۬˝ź‹~j_ ŔN(}™"ţŃäCŢ=Ɍ޵úeeŢĚt#s-˘•» 8 ÓěZňŐHYQb>;‘–_ćżîíŽLP*K[Ć.RaŞjü „msV€A˘#ű?PFÚć6.–UÉ5lńT˛”RÓq×KĽ’VoŔëŢŃďöÍPnoYşÉ[/nĽ»^a°„eĂ©^ űő`W耽K xÇPýäžÉ›ěX&¦)­Ď>ŹAx(łÜHp{ł3s×TasL.1B#š­˛{7pľŹ«ň>«{÷ęRRĽ* Měš99·hÝďŠžčŤ á†>Zăó"µEťÖó$(_íMy§K஼·‚@A´ĂĎĂn‡M몶0ËŮmŞÎS?Ew¦ĚÁwµŕU)ÄŕTV%€Ť ^HŞ8˛hŐä.:íâ#ăŇu<ŃĐúÉ‹*ąÝü®@7F66I:În"‡řŰyž˙šˇ÷â7›mnď’Qr€HńäP¤„:óm±+jŰ^Śĺí:ň˝ö1¦LĆę9CÍu&.ĚŽxÓ Ô®~6š`ѡgX0ÇĽŇR´6^]®”äčÇE=8§Ĺ$Ö¸uOzŻi{sú¤q4zc…@ďĺ ŻĎćLÖš2Š ‰”ń ĺ±µt—“˝đc_ł+?˙ňŃmˇb–Dń%Eněa6YËćP9«Ř‚“Uľ´–ĄGit(şŞŐ#ŞĚX‰}°CţĂ\ë!ÔńT‹^$P¤"ĄďŹ5’‡«:«¬¦`H˘â¤…Tř0R駲;ĐŠ-ač$„˘;zü»ýóÍĽ^?€éĹjń8iÄ’c»}fĹ$e Ř\”lmŘhíĆF»¦P…'ŘÄę†Ă–ěypp¬¶đń‚±ň-=ĚOa/ľş[í± ~9¦x!ÇŃ„tâhĎÎ5Đh ĘvSKř 4t4Čn‚ůkď˙6 endstream endobj 264 0 obj << /Length 1627 /Filter /FlateDecode >> stream xÚ˝YŰnŰF}×WđQ¬Í^¸· ЉŃÂmě7ÇhyełH•¤ëúď3{ŁD‘¶C‡u€`ąäîÎĚ™™3ł2NnśśÎpą˝űĚqB1‚ňäbťH8ă‰ŕ1Ş“‹›ärţë]¶kLµXRŽçtquńű #śÄ˙Őmr8ýrM‘T’ŘCq˛L5R„ůóţ¨ň˘É‹[ŕY^7µĚŠ˙đËš˛Ş˝° ®;–¤Ą‚†cą!áXŠČwč–\. ĆřH‰ÚlĚŞ1A|ŢmO4KFëhاR/ůâÎ,–ŚČůúľX5yYÔ~zcęU•_Űcó;S…u;+Ü?nĽůö±¬Âxý7(^>äÍ‚Ěďü$+ü|Ú%á{YvÁÖ Ý™* *Ě <˛tn`C| OÖRkasoŃĂ]ą1 «ŕ»˝@ű*Ž+S5Y^ďŻkÓÔď;¸%DRqţJ)﮸\rpÇőŁ?ĺ6_P>˙·uL¶W"Č^űqWÖy€úđµwť{lJ?^Cčć椵ˇŁzŠďӳޙUľ~<Öó+Ć´ŠŞz'tĐ.: "źßŢo˛€iݲ’}´¤9wŃľtPjAÚĆűř?w¸E}9^[ÄŁK_ƶ2/qÁú8u`É ŘŞ:kü#,ÝóE«¸UŮď!XnR)„o» ’<ÍC† áI ş°>šĺ2]"-±[DEŠ@Őý"süGqX¦0aŚůĽKő[Á±ÎVÉĽ So—©¬n®`QÍ^ŔŠHŤ¸¤ßÖ1ˇ.™fiÁ!Ö*knié–Y- iÂćŽM(–ÚÔŞŔ,cüĚ wüh÷–÷•SŔ}ŮeU¶5Ŕgµ;‹ĚWŮfSűoĺÎŇśc•¨R(ĺOřáł•^nĎÚ`ëÚGŔ,I[l<ű X¦Ś!bóü€ŠŹĹ” g ä (¨µ¤Ťë‡»|Ő˛Pu,92ißFMgłTzďB ł±¬4(I#‘¶Qč9r´{=Ű‚ <2 0hŕ^í÷eŤ˙döέŐ$ #ľ‡Óń ‚2Ť«\nY5JĄęćť+á–çl°Řrę8/†JŕóPXL]貍ź>´śŢÄC|Źĺ§-ˇuOË ‹T(xý@šÉ®v?o@‰"sĚćq!ř܆0ćÇé@5ź7Öo¶ęô(ć±-ýäu†‡Ú¬Jç%Ř|h8|Ęüđ‘ÂH a>ň„‚fiOFë –«){Ő˝p‹‘+ŠQ]¨NĹćŃ;Ź1Š$?"Í÷ęź5}t++“ě hł*«şM…sÝěÓĹěź5P¸c'Í0†"“Ővvy…“řÍPťJÜĘ-¤‘ S»o“śĎţôm9ص^Pá•1‘P ch:?ý—mwÓĚ(ôBżFrG{[©ׂ*Ďśť>Ňçń ś(đů‘#˘PĘ4TźgOđťŇÓZüŔQ ÉfjÄűŔrj§'°/ľś¸ZÉ ôˇîJf]}›í>†FĎ‘óa“qřÂ7{ňélá†÷?ůŃV%×(¸Ů%Aâ«?+ü°ü¦q˙`+ć‡GýĺSvÄ˛Ţ ÄűŃŔő±aĹŢ{čů€Î^ }[ŻKč-ÚÍűá$z@9 = ĐŁQęm›:ĆWOĂȪ㽏¨‘~ Ji.TźĽZSFëŃ7…ID$›Ä”î "řBůB>×"ŤW˘o‘pËĆpë¤X˝Ž\G«Ń·s$„x#FÂQÎ^ËH5ďŢÎη[ÓTůęÔRTUŢďö 5ůeě@uţZŘůM„j¸Up‚˝\‡r$;żó‚߲«l” endstream endobj 274 0 obj << /Length 647 /Filter /FlateDecode >> stream xÚ˝—Mo1†ďű+|L¤í0¶gü$@ę hni¨-Q¤´@Äßgvă o»râö°ZËëĚľĎĚěkŐZˇúŘĽ[4Ż>pP˘G­ß” dĆišÔâZ-gżv›íĂ|µ8—ĹVi„qżÚ806H¬~]čÖ4‚ż_4?-CTZâ·¬Ľ1@Ψ«ŰfąBu-Ď΂ŤAýîWŢv«ĺŐĚj«.šĎ ‚L÷‡¨î×ę˙‰/ ‚˘Šťqť¬(ĽSÔˇ<čµ­żţx»—×˙nŇüwBŞĺž}şßÜí.n¶7ó3=»Úmľß]"ăĽöŔí~°´ŘZÝjDąôj?)ëô›ô˛)őŁŮb€I‘®<ăR.F_âń|jŚ©'lĘÄë2ę–;ňnh[ę†}ĆÉŠeed.J(6UČĐ€¶©S¬#kÍÓ@ĺjr ŕ€c•R9ąë`÷@Ňś#DÔÚ ˘b99‘'pTĄDÎ0& Dc5˘żÝÇhĹşr4gŔ˙2Nćśř¬·Ďęd:݇»š‰•g*O6ŁÜu•>b«‡>Ęşh˘oŠuä(6€÷® °ÎžäZĹjr Ůe©S‹@jăƀ̤i«Éd› ®N…DɦĐĹ1 ŰŐhjł,W”Cɵ~!»B$;ÇsÚUlkđ-˛µ}«8eYÖYąJ+q$Q5´RÖIFúhâÓ(“óřX…%©@ę#0D™ŽĂur¸ ŠGpÖśâÁĺjr f9™WááΧŇçi'Ź÷Ĺ‚r$˛r$?.+'Ä8Č4M|4ââ'Ź«8:„ŕN„•:Ń“'(’ł€A–qrďälĂýN)Lp endstream endobj 278 0 obj << /Length 1655 /Filter /FlateDecode >> stream xÚŐZ]oŰ6}÷ŻĐŁ Ô,/ż‰a¶®)VôĄm޲ Đ9ęČ©­lký.%R6-ůC¶›ˇhúęŢËĂĂKň84ąKhňvDýó×ËŃË IF‰RL&—ÓD+"ąL”™M.o“«ôő}öXĺ‹ń„Išňńőĺ»%4 ‹»dýăÇ·Ţ© ÚhpNi2–૿÷ŲZľhÜ}Ę«eÓĘĘ[ßU-ŠňnŮÄń™ÖA.óĄF˙Ţ#'p@ZÉŐ(ĄéĹSySóŇžŽ™Lç~x3—[Oh VĘšI¸mC ţ[1ť"–`ŇĽĽÉ—‹(Ü>dÚ(±Ôhqöl€–8_//LdÓ4Ń´6ih˙A%m^ŞÖ߲”€Uá­÷}Ž%Q\ tŤ‘ä‰&VÓÚ†SN$šŻ¬čÔăŢX‡šŻűźpË Ç$&LjMăâňľ3ç5źî3ßýWžű®j‘•Kí"÷Üš.ćMë1»ůśÝĺMĆ* Ëh ŰˇĚ—ŻgŮr™/Űá­c`lkü]şŚp%’ ŕŕ…gĘďŐŘ (­˛Ďc )şĂŹ"͚ޙ'‚›‡(€BÖ3؇8lrÓNđ|ę=ćĺ]ußëSbEëłěói‰2XÔkÓůś?UŹO•ĎĽşĎ×roľß¸"JŠŤŕtÝH×°µśˇt˰eK?hßĚË*+J, ÝŮĚŁ’˝-ęÖ@oŽNqUăz¨'PFĐ#ă×g§ćĄĎáŞ×'”±`Rô9A ÎĹu/ ˲ę˛ĘkŮUÎ’o7ˇ÷MO” ô%#‰XáşĎG”K˝¸Fo.G_FŽ»QŘ®3Dâ(nFW×4ąĹďŢaÉä8Ôjˇ,rJ»÷fɧчfďCŽa–Š©zŮkK8‚,°Řhśű:曳‡ÇYŢŤŚk’€˛Ç„ŽŇ×uú’p»|ŕ~J,®ńM0<.ĺ\„$ę8úťšmp{Ç»IŕşT p±Ú %Ž-Ú1]ÇÇ·=3m]˝Ät)–AÇ37ŃwŮă+żŤ»÷˘-x˝ŁŮĘ%Vv÷¬?]!Ŕ®ÇH_¸• Ű“W埼±pŰÝO'…m9‡1˘\ ó`:8ăvAbr¸‹­(ş=šr*J=TxŃ<Ť2íJř0ľĺ[\pß’Ŕ|K3ŢŔ2šÜAËCĐĚ4­ëî:   q4­‰°ĎDNü#ÔMÎö”çZ;éŐ_âi¦:3'‡cÓ…WI,ćçᤲ¸eÄÉ@A„â-)‘l˨–°Xâ[žę–ÍÁŽ·äVď§ŕŕv1’x1ĎEAĽbţa8š.şbça Ŕ;"Ä l‹´u1”CJĹPcŚe0VÁX©ýś<¤.*ĚĄů3qŽsÂÔĂąÁĐtŃ‚ŕb6ĎŞuĆn(nÔÔśŚ3 Ë™=‡VgV—/óX¬[µnĚhú÷dšźI¶ă”č•,qŚlgQ¸l˘ŮÂ!¸$żb|aZńÎ}ŇN»sťŰµ;‹ŮěÔî Ń6’îj‡;¤;Ŕ2ÇvJw84KwÎg#Ý5y×bëü(Ö/Ő!Ż´ćßCP:@‹—’sŇ*–?÷Ćqr’|ő‹ńÔ/ĄOTżpG[ ܸÁ%”ßĹÔNFF ‘ń„S›ţR6+D°f‹V.ÔđóIPćyő´(Ăň-¦á'žćé2ýżđ-_Ě·ë{x #ĚÚóč{ śbÇÔ÷ŽÝ9X€RN9Xśŕ"$!E]N9dťâ#¤á/Ďs—ĽiŁĎ¤ďQ‚{솾羼jžY}ë¨ć‹"›ą÷š=óĽގčuáÇM’ yŽëŕUÍpÖ+ü…'۸N°•ţG[…/´$ˇ)(g«+±“÷ 5ë†Ň˝7“ácíÂ…®ÝžOˇ+VŁŹľű¶§E‡Őwżů¦ -UXŽĎĂDŠ] z™¤ĺ@@ąÁL˝!YŻdçý<<’ř0âS¬xUB”ÜoţćfŁ“7ćđ‡+bá endstream endobj 290 0 obj << /Length 2249 /Filter /FlateDecode >> stream xÚĹZ[oă6~ĎŻĐŁĽ“0Ľ_¦şłťE‹ť¶úf%–ˇŽ”µ=íÎüú=IY2})mŤ×€AŠ"Źx>~<J8{ĘpöŻ‹Ü^\:SČ(L˛ŰYF5GŚ’LI‚ áŮí4»Ë?­ŞůrrűtfÁČ`ăzS†Qm7‚mź ě…w{ńź {gVRLdŠRÄ%Í_.îîq6…{?d1Łł?Űž/¶7+ŞąŻŇĂtKž]¬ ÓH)y&şqŠüjfěŽ Dđč,JF("0MÇaĂă!‹čÚT‰®Ć쯻˘ë<ę·!±ô, A„S-×W˝‘~íľ Űu71“Ž1¸IËsćÍ!8’ÍôÓcʉóbą›†ÉxÄBHeČ84Äqđđ>áA{¨üĐhŢjÄqއiś"#LCC~(¸Psç,Ž“~Ję}8XYŠÔ{‹(‚vÔ®b&” Ü*2Fc©xČÓŔy‚1Î)‹Ĺ„čüńůýçÇy9Čy÷K¸ţ@°éçĎ8»˘pEĽg@.ÇÖ>®rlűp˙ŕv×µ–ý”ă*ڏŮ&T Éşv«vŮýú(€AÂ)1éőÂÍką(VUS‡!ťâ›'WL¤…¤Ţnß>W2Qó٧úŃ rWĎ…o~(Kß´ZőrV.ĺÔŹX4/®öZ<ţ^<•nĘrx Ć‚€ĎňsţůýŻđí¶ł F‘Ňťv[ˇż˘\u@ €Ć&Z‚mrĄ@ł ×ę˸Π[¨|Ő4s×°j\ůĆ´žş»óę÷ Áy9˙ěî=NČísĽŞvĺĽ˙ü™Ä,˙őąXŁbŠćŻ‹ň±ZÚŃRäľ­ Â$$ Sţq—.ŕÍčšŐŇ JMËyő`aź ĂaŐA{ˇ¨L¸ałO_ľ|¶+ÇóçrQ^ÚŞČ‹zęÚ^ óµY.«‡ąż*'ŕDţ°8FpŘoEýT‚ÚŚ`RéZ«iYřÚŇ•+@$Ô|§‡Ň zŞęşŞź\S3ŰčcAÝŃżUÔíB¬žaôe«(RbÖĚ獝đźN>#amÍŠa8_/Ąkz-V«rQ»‹ş,§Kßµq=|żEůZşSwµěa˛(ć~Hő2!yéT^fł–‹ľLâebůŘ<ŐŐ— µđC WtśŰâÚĽőäĐsł×łŁ€dhŠţ”*ˇša ÉpLôÝ‹—WoRO†%‡hÍóčČťqööĂ îěa Ôçú$×~ŠŚ0 °Ḭ̂ó›BxŁF;Ź…¤‡b{¸ nŚüÍąű®ŤÓŮ8'®éŕÄř8Óg—„éŃ'®łfá­|Q÷˛KăłËi3 ˛É°ÄČb†¸>Ó›Ž!‘žą °ÂŠĽš9čľ_ţ8ť~_·ŮŇŤĄé]ußĆQí]đꍥ2űÔîß@Ő6—óö´©t9¨Đv´Ý®©ď6«Ćá~2ĽŃ 1i9=Ó3ŇtžĽBBúĽ™Ž‚YşÂ1fŕmütĚ4¤>âx{<hÉÇ Ů„‡¨1Ň{¦86<« §I<śUŇP!xă- H:ŚąÜ~p—ě­qČ› LŚ-gHáqČˢfĽ›ü9Ě—ä Ĺ:1‚” gâ HÍ—zU’u<ąnÖ#˝ÇO'Ć=eÎtDĚ(’}•¨ăuXéPŻßľł[¶ţ7}Óž¸‡ ˛r{ÝLá5,,Ô·ÓiR]ÖîĚٵŽĺÓ“ˇŽW ‚GÍϵ@§ú˙ěÓ“5Ž@ŁĎi-Ç0‹ÔÄÝjé†˙¦ÁK^ 1üżěÜ=×A€b&ÔH˘L'NQËZ˙ŇIŮş–đ‰C›ćúr·eNÇ$†B>sâk]صH3˛¤{Ň)AU‡. 5Ť;¤)éAÂZLô6ŕBŰaŔĽEN`7ŠÉÄ(B”h”E%žť; LTz†mlߊí3‹N ¦…ަdHbĎÉxí'VMmëGâµoÁöˇ™ E &×K1š‚ ާlÄTőżx9Żý–`7šÉXÄp2‰ČHö’$Ă«ă”}ŘCSĐ>šGâµŐě1CĘ#Q’*¤`VÎ\łűÜ´őŁđ:EĄëĂF(:SÎM‰@JËcŁĆ÷ĂT©˙‚)8ýsËT„bU”‹Q˘LĚ€ dežć€ű,µ´ýë†ň0?“5ŹŔ#Z# «t†CVG3ô㡛eeż>XöއÖ{d–¦ăC %c| žMt§|3ýa_"¤<˛cWÇäĐŮčtKW Ć@rÄÔąč&í÷JGÓí¦¬źVĎkr˝ďSĘťOüłšÍĘEY·ç”ĺĆťǦ`2v1ü‚"Nǡ {ş‡4ÉŹŚgÍ1âŇŚ2kÎß´„ŤÓǧUď—äyÇŞSEřI_ś"Ł›ä·TśňµĹ "ü+VŰ/aóăÁî‹>_ţ ŃŤÜ endstream endobj 296 0 obj << /Length 2534 /Filter /FlateDecode >> stream xÚŐZ[oăĆ~÷Ż ś&sç0‹öˇ›ÄŮÝ´hw ´€ë´DËÂJ˘CRŢřß÷Ě•W٦¬ éÍáhxćĚwî‡ÄŃ2ÂŃĺŮ_®Îľ˙Y¨(FIŚItuQĹŁ$Š%A áŃŐ"şžěŞŐşĽ¸ąú‹YD0JpbWS†Rf!zÍvÄa1Ž‚ęĹ3΢‰ŚfL %…}!‚¸}áČ˙˨yűůň,şžŚńäsş]ä›÷ůćvµM«Uľmíů<Ťď&8iňŹŁ…;Â,/ČžQµÖء?c{2ů7Ř>I°l? g‹>_¦3AâÉסm(E‚‡m€$ €7¤\˝ çYańŹ4ńo kĆT‚”áĚ1‰˛4®îWĺĹŚ <ąŰmçćDćî>uÓ·Y榪"Ý–wYQd ÷D‘oěč!ťM—™eY¶u„pDbĚĘ÷ë´,łA… ĄüZ#Í.ELňhFÁČüöˇ˛;Yµ+¶Ž×ÔÍ!Ůńn›‹Lłě$ÔÚŹ0Š’$HhP2a3äIűŐîaťŮ˝ó;{]¬ĘjŕÚ»lťm˛mU¶×8Öˬf”KmHA•†Ůś´°;űéęě·3=–6Ť‘ä (Ťć›łë-ŕ·Ź`! 4â›Yą‰H#aw}9ű‡ő€<<(©´š Ƥ!FbgË?ýžnôá{;GAD&‡lÝb?6ěĂUńçhठBěRDŢ@Â3Á8R ĎR°ľo?o áŮŻˇb>‚Díś®ĺ"őÄçËY'@QżT".‰ő2}řłóÚúą–ĎmNXĎ-¨|÷Ý…ąžK{MwĄđäÜVn"µ—yľŮho¤Ç뼪˛âÉ­s“—YFN&éö©@öťÍ»Ć–ryŚł/mŤ$9‘<Ŕ± ,•GdBÍL(3?_„xr3µwNf:ĆĽ; ÖŁęa-Ś×~$1_äµ=)u'Ň (÷?Ăb7ŕ±˝Ţôź?ďxfűçUµńŰ\Î[h68ÄĂ·xßĂ)¸&ÇIžŁŔ9E‹vÓé(d·\štÔăŔŽ}2JG¤˘?¶Â:“Ľw~KŹ?gĹQ“¬„vAđäQ˙łéĎŢ\Y'¦Q–ľ9€ł×n˙?O›› f m~łrň UM¸§° ‡çÍL!Ěéëňć‘`Ě8ËH:éé+0±zI5&Ď#BŤáĽő 1˙ąŇUĆcV”ézDmµ,\uUîná9¸ÚPRă˙^ŇŠ8,p>”x´­÷ĂC(Šą„g ʆű}j”@ŤÎŘ H' ÇG©G_Ź‚5¸ŇČ“*}IzAŤ˙“ěHµ)ř ţ×_óĹ`—CA&Ä»E©cT9óš»'˝1ť,2Pa3ú¶Şîő¸K;i+?Ş%U_=i8€z˛Sýé űe€KľˇnĹxĄhk?’2ëČű  Ë`Ő J„Ńíkńş,˝.Kă8°î˘$…ě~[VĹÎFOᩬ˛MiAňČ4ëfÚ|ÔXĺżuź3+’H“W¶¤b"ägVsś2íĘŐvéjî•®Z§öf›o‡Ť"`/¶‚ă-˛ů®(ű:ús×:Ę‹•ŐČÖK¸«î7ĄÓ-8D,:ŞőĎűl;(#ĐNFcż1+‚ŘM·+ÓoŔ‰é7{ŻxęGq":ЦŁňµ27h¶5† Dęő˙¦ËŤ”Ä*$śłşĎ,šż¤ëµťő^¬\7 n=ę%¨"xLŤ›‚'´ËtŹ«Én0& Ĺ´µePň” ÚE– «ĎěectŚĂ*©:–š~©Kj×YZ7¤z‰|aóX„ľëĄĂ´×ňň­°ËSúÖgh'’Člbű8ÜNÔí=¦DĆ9˙®=°wâ˘\â@/Z‚ Ś|ÔJab‚[ňnآ ­}ä†*čvZhíPbr›› #D`¸Çluź¸nZn‡ť‚¨;ÉZ/´Tî”Y“öáwP*`˘uç_*;x:ĐZž°ÚOúţ-lY}ÓĹIŢ8%4SŘ0e$Ćč|Ç56Čő„#MÇ?íjN˙ŕ›]•Ö­oOĆ"ˇ5´ŽĐCżfÚŘť˝ĎV·"đ.˝ô@ëÜóĐJUîKŠŮő¬‰B’T7é“ÝéÖí¸+mbňÍíĚC‘kXW ·$µ—:ş ›UYôL>nÜĺ…űŐÇăŐN'Ʋ}üuv×­•‹Őňľň±Źqđ_ůîaŘŻF4Ţü2¨s 4u´čPßOšÇ`#ÓËa§â@Ř+ŘşşĎwËűÎ.Y¶xę|{» )Éâ‡[óŰn5˙jJőâ€ÝßÎgp¸ř8Í|fĆ^ŮĚ˝qŻ—Ä ©äMͤ7pLPȶÄ©·ôŐŢBĂłˇ8’ś¦uL•}Ďv`ëřŁíwţđ'×*öă)ť2ß1ľfSŢë.s¸×+ůŤëšľ;JGy<~}ÄI.O$ŘT'Š äA×F¸óý٦śŽÖµPc igBŽŃµ×8ŤăVŰžřŢĽoÍű¦ý‹úńŚőĎĆ\OĄ?R[JŐźOĂ&Ü4Z0Ň0n6Ő*7eG7ŕŃčőŔô{ÝSůPŽMRq BʬŃÜcľńOÇ6ăŃ0ő‘¦úݵ8Šëöˇ-3ľn[q÷JśâM[«źµ}>ąyŮŚ>T˘ß!źHˇÄŕâ`\Ůö?®îłE‘®/ŤFBN\kâ‡ňďP$]ęÉđ^ôŘJ9ą>öXż“:ŽNbýjÝéäĄÇâ:›TÇřA>S9Ť§Ę56ü jgôMcÓ źŮ×|*í­QÇĐ&Feô™z°@žÇ;ŤJ’Dż|’‡Şä—¬ú[şÉj˝[„×ďç ‘çGV»ŃčôńŤő;uq"€•n»ü Îś·Mţ‹+¬‡żČ@˙źCwę5ú8RŤa_ R |ă'R!ÉäsĆϦÂěMĘđęŐv=šŰţyC89ѧ_DH$9š]Ď}l>ź›ÂđĽÖ©ăčÓhpúřr‚;ѧ\„sÓó;ôS.ÝE{źë÷¦dR•CÖě-˙xŹĆ§±î¨«Ł|ÁĄýqLZId@ĄŇ€Ě56|އÎh}´î¬łkl‘Ó áŤđ=@Ŕ”âM"dŞ 3!<ă FĐǑĎú´Ź#Áa©€ŚqŻB88::pXŁf]ÄHŤm'<, ŕ OďĹt|ü±úČ`詾ŹŐŻŐÁ6lZííčěZ˙&ßĜƸÇăć?‡q×˙«/Y4 endstream endobj 190 0 obj << /Type /ObjStm /N 100 /First 885 /Length 2314 /Filter /FlateDecode >> stream xÚ˝Zďo7ý®ż‚›Çĺpřó`p8-pŚ$‡ë5ČÇŁŽeX2Ňţ÷÷ŢŠÎE•µ’ĄUÜĄ¸äpćÍđÍ0RśqFŠŃ‚6_ÚlTŮ_Ść€Ö› ĹxŻ&úh¤Ş)IŃSkF‹>QťHĹÇ>±Áq¦ŤĘžj$e5ŢqbWń śK:ŹżĚüě…=Áx x E'Ţ%ă“p zsäT {ŞQ±Ľ8Łń»Q_1«xŁÁc ¨ŃŘŚ¦Ęžh´hxIFkbOĆ.ą2¶Ľbf¬4cfďLĚc™~ň \ÂC7Y!ţ ©ăLtÎMĽŻ&ŠâsôFź1XńSŕŢŐ›ż‚J¬€íšX¸w"ÖČž¨ÚCÉeޤšädÎ$…U|“˘ç7)qďAMĘ,“jÄZPq¦y=äÎ E*î‹díH&cŁń9K &'š$“)VFgŹ sĄÁ`‚\ąˇ8î EShżPQ>%<¤:ÁçEa"Ł(§‡şKpü¦â’zئ„BŰ[ŚlJć4P\É4PĆç…‚C°RŁohBŹĺ«ă-őDW XĹüD<ŕ•őX­*…ČčQčÍM¶N|Ĺç v$jJXjŞy 9LďŢŇ3Ý»î§îçî9^/“îŐôraŢj‰@0Áy›aĐ b+ÔĎ6FŸSsrbş×¦{9{33Ý óÝĺŐbjOďłłËgć‡&řw¸$!K8hu6GxKli­6Ö˛Y’—W‹źîßź_|śÎĎfw/OĎż•é…y+°—3ŻL÷ëm„7Ł¶Â 7÷××ď¶ŚŤhi‰]Ć€\{6»Yô˘źö0ö_ťEÄ4`±˝@ůň…±<Ľ@’—/Ż;ż›]ľžB_¦;qfş7Ó?ćÝŞ ¨‹I÷ËNos„‘ŔĎ©čůěţîr:ďcMßőËôĂŐĹŹł?LoD K — ¶T¨üüâS@·ŢwŽĹ¸)÷˛Ť­M­Í­-­­}Ë˝lĄµľµÚÚĐÚŘÚÔÚÜÚŇÚ6ź´ů¤Í'm>ióI›OÚ|Ňć“6ź´ů¤Íç—ó˝ŰÔŇż<€:GŔ±»8‹ Âó˺ʨěŕ]ţqLş¸]Lď¬âZ«RTř´ăé­(nµa™Ŕ.ĺq)ćřđjvceL9´ś- ‰Ţ[w€&l aP~|mřlĹ÷g´UśQ‹-9jĂCĽEČo’­8„ŁôçAmččÚhI ŕ·§4i‡-)jCŹ€Ń@­đ„.Éf˘’­JŮ"Çřč Ř$QuŐň 1ł9Ő-rčččZm®ô•_\ˇÚ 2Ž0ľ6<Ž5DXOlfhC#´!ÚGđr;_m‰%G»ÔE] d:r{ ŁŔ2JʉaPńž˘Ů[p&ž\–ÄVK°85·Č1ľ§h,h™î‰ÍĚ€˛ł)¦-rŚď)ŞÉ¦ ‚l:¦ť!!r ÇŃ4ľ6<â&“€Óé’Ş·) ÇŻtOAa™=?(ĂáŽyt] c‚. É©ŻŞůŽ‚Ě‰„ô}…NTW·ÉáÇ7 !: f¸>2GŽáđUĆ׆*ÂKHŻ}#re8|•cXEH4Ë x—>¨#Ú"ÇřVAâbY§@f‡ML<,HĐ UęčÚŚ $TǦľ†ôŰÓŻz„°!1Š÷ő3hÁłÎfĄÔáDĹŤŻäź`[Č‚Á"4ôySÜ’¨¸#€T< Ďş Ô“ĘDÉźÎG”f«Ź˛ÂDŽ“Á5x˙ ćůNGgzJý˛"ŢŘ"®Ţ@áĚßŕz1~ýeöaٛ֕Żëâ<µ…7š Ž6ä!Wł°…gľÜvŇo¤;=9éčN{'î^w˙~ő3˙ľű´XÜÎ˙Ůu/n˙q{qů;Żěǫŧű÷öjÖÝ/®®çÝłýĹ$ŽÚ§5 ‘ł,÷Úy˘_ľ|±uţç|1ýlgwá¶K©»ŻâZ|ľ>@dưzň¬E!rZćť°¨fÝCµKm^Î>Żhy©Űg«±4äť ćĘĐ‚ąalL°DÚŚnş][a¦+śußP×ij|M%üK(ŹŁŇN^˛˛Ě.˘6ńţ˛ň:‰ Ľţ ´‚VŠig㯠m§¨%î6Ö†É÷¬›Ťż•„Ąż|Oî (¤ő+Řä÷Â7zI»'sIw÷µGĆĆtgÔčcű˘ĎNCŹKśO;Ť Lţé‘Ař˙i–ěi8š˛<‚Qnčó:<ňˇđČ:­c‡ë´6§Cw¸űa“źpŘ<2v#¨ äóčC‘ŐµŔ‹Öŕe·±$ěş“_íěJ›ŁóŞ“‰8ČÚ)X‰ăˇłş5t–r :KÝť+CţבŘ$a·±!cÚt_ďkżŤ&ŰŰiÍ5hŠöź“v1ĹĘĐ-â±±H bđ;ŤŤ ®§u·± 2ďľĂ˙™Oy^ endstream endobj 306 0 obj << /Length 1099 /Filter /FlateDecode >> stream xÚ˝WMsâF˝ó+¦|‚*1;ߣ٭ä°ÎÚ•˝¤âĺćř  “D$±ÉĎOχ„da\ĘJÔóúéÍ›éAKDĐýčólôáNĆHcŁ Eł ±X`Î(ŇŠbCš-Đăx_­Öĺäiö‚9˘b|4ăXR€ra”Ů ŕ_fŁFö!Ak.‘f ĹĐ|3z|"hĎľ"‚ą‰Ńż.rcŁ!µ”hŤľŤţô…AĹ”Mj >D¦0.őăd*™˙E$ŤYŰ;vČ#]ĹdJÇ‘zK#ńHD2R‘öóÚOÝv@k€ĹXzP?ëÉéŃŃAŇKAϢŻ%,„$zÁpŰýdlP±DÝ÷'Ô¦ü°LvżúĄvójŘľ€čŃ)ń{y›o6ůvf5,’mů3-ĘdmóR-¨ RĎET6®‘ź~ ßz…Łökd¬YOveJ^Ç„aĘ…«bźľî—áYűÄc…Ą9ďÝ`448V$> Á°Ő|ťĹŮ@B‚SB0Ě„qk%`Ŕiw.,c &bŘŇ/#Çü…QIצő¶ „ńÝ~;ŻVąő9“dśMŔěyá˙”U±Ú.ËΙę8}‚ łÚCÓé?Ż“íŹ»bBăqš~sů:éNŁ|¸Ł a«X6đŹ2Ďű’wbü°.@ťÜťn%Ş= 6 5Şž•˙ű(´rąC;†ëšŐ*p†aNU+Šdaęmµ;ĺnĘ ( <¦LĂŠŃgĎ«zů˙÷ś„ŰßÓ4ÜrGZ–Eş3Š|ăG»dţ#Y¦ž±ęVY°Ő 凴Ľ]'e™-É2Ć4ŽëX·–.Ľ´hJˇ^‹†w:™rpA‘–űuĺÇyvLYňSůʢMč8śăT»ĄqćČ~Irö•łÚŮĉżĚóÍ./W•ŁF-w»Şąf͆9fn°âş†ny (©.·cÔě~–Ť7“íâX’©€ĆCŔÄŽé&˙™Ţ>'E2Ż ¶u˛F>íMë˘N¤ŕlę®`Ż—˛ÇŽ!©:y†QŁ±Ô´{†u*Ós® ˘ĂĆýň_˛Ů­ŹT#č ]Ę3R÷ę€dŔŠŕuŕš Pâ’šx FM@/űNťś$°I¤>·“[¦uSöń˝O·i‘TąkíĘ?˛ű"ßďťÝo«çtQ$k{ۆ¸G”şä«5wUě­0ÂtWčířú»ÎçIVNd¬đ7ż†sężV }¦z{‰Xb-ζWçĚîŘíj6¬F_OM\ »†M4Çڛܼ퓛FĚŞ˙bĐ=0ůNFQÇPyÎ4JÓ„Ř3ĺ=\3Tšľ¸Baf®ăap ×ŕđ 8%ăOV‹SĚ ˙>¸ą¨`^‚ŃĐ Ë‹š‡ Bfči„—‘͇U¸ţ¨Ş?ą endstream endobj 314 0 obj << /Length 1924 /Filter /FlateDecode >> stream xÚĺZKoŰ8ľçWčh1Ë÷ĹčmѢXtŰ{ČfŐQbomË••mößďđiŃRś¸NsŮC š‡ß|3‘ÁĹu‹·'8<=;yöFŕ‚b$%ĹŮUˇ$LRĨ)Î.‹óŃ«Yąn«f<ˇŹřřâěý F¸ÍuŃýůémPʑҊXĄ¸p4a^ßo7Ë/ ô<{C ł#©5"DĂ'8ń2ą2B%*Š´łŞnĆDŹŞv>ő^ݬ¦íĽ^mĽĄa­N áqI­š Á1XęD(ĐLă<`}ĹąŤGoŇL~â1Ł:ŕ4_µŐuŐ A‚`¨@”™4űAóż\,>/ëşť˝‹“ą©˙Äg¶´ßÇŹęÜ0"™q÷ů”`SŚ 6Ń©ŔťŠĽŻt&ă›ŃW}s‰ł50Ë|(A<Ć.ËŰőéx"‚&Ś»] Í'$bŠĆ1q…€:+2 ;!Ę št¤p¤Ě±L8±¤bŔ.†7O͇„Ëízh&f—÷a"4â†=7´»hfbFÂF{głů&ŹG˙kV†î/UşÚ¦\m®Ş¦©.æ^úÖşś~-Ż+o±Ě¦ĄĚDĄ…}zőÇĽL‹ë"@!Â^Î`,—‡Ę»JDŁ+;ŻŢÚ›0o2r›~íŻßŮBúşďťŇ^|ŰŢ,ľb*F%wvľFŰb^Ą „ŠdŘ^¤¤ŰyşNěvřJ]@č¤"˘gôn[€ă±{ÍNýÓőľe÷ęç;_w벌u čQę ű, âá*î†Q@%&BÄś‡E‡ĹÓÓ ž2šö›Z¨ÇA“j¤yřĆ•‰4ŠF*űt"QÔ7.ö¬ó`#űë„­–á§Ę€D"­őOĘ€çâ”S˘.~b&<­>ŕđůĆřădB̡¤a™PDbQ)ŁHlč$L“t’": T"End.§˘éŰQJ&†‰űą|0.=hÁ,'OĂej ŔQ?ĚĺŐęşťmÉ»(mőü¨d=Ž>˘ ŞS¨R¬T„i +‘wáđ9űfKřÓOEi–?Nřlęä0†ĹťZů“ăČű2ăNďŕ/ˉV|'/ţµÚRm¨ő8ô;Ř }? ř¤ŹC?ˇ’ Ë•©‰éLŕ¸#§B‡¤B'ĺKšĘŞSM(RJ´ă>—eJ‰&&XÍR]Ę&BŰSŐŽFP{l­ČŁT5” D řđÍÔ'łÝ;8»7ńnSYÔ IäQ_“ÇčHfH$©:ćËúátÂjŕű5pN!Éüt"żT Ę‘Y·Ç›%zŘÍŇGw­V_ŢLŰÍ“ß}lüÄwž¤K…äö$=^|<§î@j˙ĂQŞ˙· ńÄÎ߀H2šÖËeąş6©ŘŢTŠĚý7IĹ×aÚÜvčţe,ŘěK/; Ë]vČx ë°Pß]_ _ňpŔ“ěšš[aâéđşZµÍĽÚäs¶ŃÝ{†lsűˇĽ˙TÔlť>aśŽ~«ŰĘ»ź}çŮýW;+ÝŇů¨Úžř6˙Ú.w›LF—U3_]‡Ž+/LĺÝ…pw\mĄn6ŽŐĐł©Ł|ŮÚSj©ý­JW…ĄÝM›¦–›Ę‰*+â.e ×ß΀ô—úf”·Aů— ÓT몝»˙ °)¨Ëqweʞ†`~3&*–ÜagĚ„` üÂns endstream endobj 326 0 obj << /Length 2216 /Filter /FlateDecode >> stream xÚŐ[Ýoă6Ď_ˇGYżŮC ´E·hq8ěí¦čC. hc%1jË9Yąn˙űŠ˘l}X±"Ő@”Hj8ó›·ł4zŚhôÓŐ÷7W_˝“&ŇÄj ŃÍCÄŚ śA¤ "şYE·ńK±Ţěw7żŕf%–Zż›q"I•Ű@¸=W´"ţăÍŐŻÜ"Ť="ąŚ4S„ ÝoŻnďh´Âµ_"J¸5ŃĺÎmV©Ýw›čăŐż=ŹÂF–XĹTy޶„s…Ä$x|yřŹ_’íó&-9hśŚŇPö-G7Ř×%űśP5D‚FŚXc;$"L X‡Ęa ¸ÇJyš‰ 4*6”µĆP §Ë…ËŁććźzm‘˘Á#)Ă3•×ócňü­7łň»@Ą$x<ŁŰĄd2ţnłyźďV/÷‹%ÄĹţ?TŇ[ DÜ]s|†TÔ^cŻ×¬˘Łáčj4;†ÄIĽŽÚT~q»(A€k?˛jäŐ(Zóá]UŁiíó¶ˇýˇi/€:ó> o® Wq-ńB8PJ ·HĘĂ* ­V(‚h¬#«jŻpv.ňgc;+z۱ŔtˇUś`$™[ĄŃ•5óްŔÂ’0g›äđźsPý94ŮŃ tq•€ŃŮΫá+›­EQÂŹwrŚf˘+Ç®Ĺe‡PĽ5||L 26ÉŢŤŕ‚Č»tŠĐ%8´@˘k2~´‹>Ľd÷Ž‹đEŤO»Á°ä–نâŕüŰz7OëýbÉ$Ť!˙ö”TÓźÓ´š*ň$Ű?¤yž®Ş/ňÝÖ?='÷ż'Ź©çX5ű€6ˇU ęż-đďúZ ś•µ=Ň2+śŽ–ŔK€Ęµw ń.ÇĂ  ÚĆĎ»˝ÓŢ#˙s«©_\gEę^ÓĽWEV¦u­ˇ>¶đ‚”aC’­‡îÓÂżďÎäbßË0ti[Ëţ±ŹÄ!¬_;˛:.ĽňLCyČDž/yV-O©źÝ¬÷Ç̧¶Ľ@Ł>8άđöjŔŤű{™b@ľ‚¦a˘°óö˛BVÖȱK7é6ÍŠĘŕN†QÉhs.Bd±äxˇüšmÖż»›%íó9ŽSţî©pi€¦*ä±:ó¬’.?ş±Ę‰$O«‡ÍfçlăŹtEşÁ®şO…˛e’=KcĎ%Îlě˝áčN€Xdjͧ¸ $X‘0“‚ý ˘FńË$ÄoJ\v|F\›żËăBČ Ńͧ˝´ĘÝn!@ďf΂ÇŐĹ›;ť% \aE# ľmm'Ç*ť˝n|%ŻűFËŢÝęş˙+1¸[ťäädf=˛.ęHĘbš3G+E¸<Ű캍Á awUĎ.›˛ZńĎçéĎ´0V»jžĎĐŔhřş ú¬žGŕܵiř¦Ý_î•ݶ’˝ČŰ#äő±zim;Âđ65ÂňGÖÁť[I¨Çňń#L–š–_‹4”ČŻUĘăYęJe8ˇF_&jqŁÂX?sÔŞ«47߬Ô.ËĆCŘŐ‚ĆśŚł9bׂhĚdzbŮ€ăôą¶Ř%ÎşN_‘Ż›öhDş J[VŁ—1m…U‚ş¸iýÁ˙\—ťöňGÚ˛ÝN.˛ĺ·Ů§Ł>ćÜö?箪„&ŚÁ,ö/ńŠĄ'ěźögT‡ź¨z×E°u&Űúşw¶]Ź–´ —„)5©Ţ™BŁf•í” µßUýě(Pmćinrʰ2ć‡î¦ŃÝüWúĄxź»Vćîsňyóçű|˝MΊ9úüě>¦çâÄČÄÉ®% &¸a­ľNóI7Ż4+™–DP1GłŇüť›•7®'”<0ݨâDčS*C…•v3IeŠŰß_nZކZţŐ.Ý{Ö /Š÷ɶ’&Ů÷ťb$Á›r¬‡™×ţ·üaŢĎăĽîČ•ÝÖ/÷ésřO Ż"níçë%+aâőëÂŤ6.0BŁnöţ-{Ů~vý]˙m¶ůÓ?9Ú}ý~嚏µýĽĺ˘TcŇŞ'c†6L͡=»/ŇdUËŢCséŞ §ß=y`ýc"Da*·îÎŃ­ţîá‡ôÓMR޵Áµ[<S^äCÝęV‡Ý]#'nś0»}ąŞÖË߯Á<|™ô ÂýôđŢć2Ăjś§ą GfÎl.żáčN‚哌 $Fŕ2LJ¶¦Đl YPvˇZŁ"QđćZ&óIđ×ßTIó'6Sˇ1„.Ž 0_śĄĐ%’&üI™6FąŇK!|€ŽmŤ’˝$sÓ ¬Fe4eÔP(ç•FŇŚs*¬¤” ÍŚtó×…9]LŚ—¦ Ŕâ .eXҡ7Vť)9lŽRěC9śÍ\ÚŽG§ 0Çđ­ć±8yŹĐ±Ĺqŕ7Zš. KOz)‹c†hËŢjqŘ<†4Zč.n†±YţĐ-š^Ů ({ě‰]ž)f/ô˙€ b ›v»¸||yHČ˙š[e<*ˇPŤ˙ÓňX endstream endobj 334 0 obj << /Length 1578 /Filter /FlateDecode >> stream xÚĹY[ŹÚF~çWXÉ ¨e2÷KÓFj«$J˘6]©›­ä…¬›“Mňë{ćbcBk@ôawîßśóť3gΜ̜Ľür3xöJčD!Ł0Inf Ő1J% 2„'7Óäv¸­˛ĺftwó&ł„`d° ł)C‚”źF„›3ŔüĺÍŕďĉĂCЉDQЏ¤Éd5¸˝ĂÉĆŢ&1Ł“G?sĺfĂÖB$ËäŹÁďADnڤŇmj`ľD*†ż5“D L•Ör4&C) #KŁĄ0Śj"¨ë&Ü(B1'\j…)Öř~©š2pcĘŐÂő3 0Ě+ŐRFŤ''hÓ%ŘXő€ŔşýźĐ&)çI»ăýë#”ް‰Fť§ëÁ^~]Ťâw;0ą *†U¶˛Ďă’“á 4ĽőVşĂ qG‰łw˙M»rk‰„9MőFŚ301’X‡ Č€1ż-ĹÉ „BplŽ!pNĹę;FµvÔY± 1đ)oEŽ{žŠŰ~Z;6Á+ÁµßmW÷¶ÜĽ©l™VEŮŠeÇaž˝" ĆN\ÄÉB‹Đ  ±S·ć„j;;ŚČ„ř€‹!šµV¦őňŰÉb›?l˛/öîĐ^’"Ü„iŔ$M0߉üÄ ĚčÎ,<Űć“*+ňzECÇţ=0fŘ7ÔVaâYşYd›Ń <¬Bk‘Ćî{kcWU¦ůffËŇN㊲X…Ú:ť<¤s$–íëâQ˛ůýŻŽ`Áχn*F‘Ň Ţ ,—ŕF*¸Ćx[j.vĄ†Vi«m™ű!>LcgV;‹o=.˛É"ÎŢćĄ1üčţŮ8­ZŘ€˛vF}y0}l„"ÝLl>Íňy*§¶|îęöŤPéĂࡍ A,Ż˝Řž^ĹÚé’.a&ĘŃĂůveóęÇh‚ôWľď:D-Ŕ…ęĹcµâ0˛´ůĽŠłŠŮŢ`–©GpáÔÂ6@ř&bgÖÍĽNăXó4/€óe¸aś†µÉ™Ú™ă1Ý.±T†} $řŔQńˇF$ ś'®W‡ákŘggš;Hß;™jv¨•ęÄ»Tîm(·ŻU âHşLóI'«‚AăăŤĆ ÓáĘ®ŠňsD,ňÍvĺ-Gßě)n`‚Ť˛T‹ô 7Ś…‚ăŁgâ?úmÜ'쥇Ëčuţ @¶ËC J0äçĐŹŔôë ÷˝­C”p󝑊ĐpŞŮ ¤¦_ý řSw|ĚŞEVŻökćqnp¨8§Ë§qU·~ĎDuZ.ŕ ŢěÄŰÇ]j:ą°»± ĄBT˝Ć‰QH(ŇľţZ9 U1& Ľ-JöňSşZ/mwcHě‘攝;„€Ü×Eú323 j!ŔĺçgeSç`D18ä…Dëë$ń¤”85‰wŢ:ňµ~ eťz¸Ďn䢦 XĎ/’ó÷ç¨K3ä˝đJ»Í\¤é©,ĎŠHr‹<”·!Č8ďBk q†`—ă´-ňÎ~Ş‚śM‚%śÝĽ5â’bzłôć´kĹĽĽŻdĄ<ęOµËú2¤őÖ¸K¤äڞKĽ_ąţ%á)ńľý~íżiWnó嵌-\îtň÷ŠŤ‹i»ç _(”őć K#Ó“k…2@ő٬?ŤOźöžÄ犫‡çJ¨—éÄ…)ű$4‰+8¤Ł®… C«b*ü"fčÍa× T".®ôőŤ3ÇůŮWĘş}Ąě|9pŚw®ď檹ĺ˝ůęRové•(ą±Žžßo&ĽCg-ľ|J H˙Ł:a¦éř./ť)¸łĹ_®¶“x‘{łfÎj—‰K˝©íZS€şÖŔĆĎłNCv4Ţ7Ď}iÓ‡†ěËÝ›ĄŃ 8ćJÇ€÷ťL÷&šBŞz©DłżÂ]ΔF’]É9™¦đćg˙o˘Ů_ă.iR"©/ňC SQÝ*ňHŞŮŰ®ä‚#śó¸?ŁŢŰ쬟J΀ߊ‚8ް˙SIóÓE,˙;±‘Ĺ endstream endobj 340 0 obj << /Length 1432 /Filter /FlateDecode >> stream xÚ˝YKoŰFľëWÉEäÍľu›CíÄHP¨Ł›ë-ݍ$*$]ýőťĺ.)Ń”äRd… Đr5ś™ýć›ŮGłG·>>|8˘IIE4žFJ"ÁD$AŚšhüÝŻçń&·éĹ%x(.Ć_á¨üźÎ˘Ýǻ۠”#ĄqJqtÉ Ň„y}·éŃĂäy“y•ńúÉ/ćÉ ţÁ·x¸™/˛Ućmo ­„#Ć% Z…A«@ä?¸Ý_Śńđóóz’/’upazAĹ0 GśmýkÚ'ČQÚ§Qf*ű­<¸NV«šţ·0%ŘD#M *ÄÍ” "§ëĂg]“ńKőq‹`˝$ÁrW”jD´*EۧM É* PDĽ`‘BFáB†Iа$;R8ŮŘ4vX—Żě"Ęv \2 4 N¦6Úë|`V6ź'%Wâ°ůhíÚŻň4^gS›¦6ČLÓdĺW›xňg<łŢaY3Ja-8+=ľłŮő2Î2›U§Ű…ŔˇTZ`ÎJŤŁŃ%a )ĐáKî,ëá&M.ţµx˛…Ăjű/¶‡ŃĂ)Pooř4â”ěĆoźSŔB&Kˇ—ą‡Cóą  >ĎžWvśň€ęŇ•ĺ"Ë˝¨‹—]O–Ifk‹ -űń§Aác pş,µyć‚:‚mYĺ±Nâĺ2óŘ‘"Úc#Ľ‹Á1OH½d|â˘âŁťćß’teź 42[¨ŠČ >Ť?nň¶¬lśAš‚ŕd5¸ŔŃ|÷rŚŰ^ ÉUDŚBBą÷–Ń÷ÁďľLB\ 2’ĘqeĚ97)÷6?ýŻ6KŰ´Ě(”ćÓ5÷•s2Ă0vL”^dĚ×Ń@OŇEEéđú¸_){ŃAGéćSÖBŶ¦ 8]­ČşŤ»Ű=±6 QżX!‰CrĎâÍÇPęÝ{µŞ˝»áË˝€»ĄŞ˝ĹÓ˝˙pdDC •;tÄŠJYlwyć9ć$ ž˝ćÚkľUĎ½â±÷dĆný÷ď=‹6Ŕ-˛xe{!bë4ĂČ9˘Ľ"r…4cíŘÚ|óŚ"jh§»ą‹ŽŇ îÔ§tPz=§`~LçpT,ę˝^}Πʨ1»Şaʶöľd.±žóĹzvŢ™oÇđÁŃOBgĂ«Á.v­&źrJ‹ çŤĂ­®Í˙3V3CßS GDÉS ~=* cß7‚S6˧0 Aĺ ?5ä/nŚJü]Z7˘ąE8O\ţ(‘> stream xÚÝZYoŰF~ׯŕŁTH뽏¤1Zh›¸čëŠEÉBeIĄč˙ľłÜC¤HY¦ČhíŇłł3ßÎąś,ś\ľą\Ľ:QČ(L’«yB5GŚ’DI‚ áÉŐ,ą>äËŐntső#ł„`d°qÔ”!A€UAF”Ą`ĎqB€ŤÔO8#™L@Z ·H ‚[‡pţe‹¤<}{9H®'c<üiąËž˙2˘x¸<üf»Ę¶ŹłąxC°)«€“ …aNäÔÔ7 jz 6vç?°ŔnÁ˛ĽD1P†%‹ńh"¦ź¶MüCšFbŕI"Řĺ“ŃH)U˘Â›mšMóĺf–”±ŻÔ„i´P ¬BŘhÇăęnąM¨ŔĂůĂúÖ2rł»©˙ü>Mý§<›®wó4ËŇ™_‘mîÝh;˝ý{şHťČ˛j„#˘důí·żŹ`Áë&Sb)M©8–K0š€ťq¤NÝĆQý&L%C’’cg¶§#2ü´­`]9q€‹‰°Ř;+ĹŃ[$B94ĂqyÓđ™:uuů€RÝËŐ‘ůo_Y©™QĄ»Łb/xŔ@‡S÷­¸Ţ)F·›u>]®—ë…›· v°ęVBŔişX ö2ŐăÁ…“ő…H2߬Vţ&cćvz˙ą˛µ.% oÉN­y$ŰĄCa˛ Ä^đăwŰ+ÚφeF„xâ%Ć[× ÇéNőţʇÁ,ĽLCV9ł=RtáÄ€_-řóÔELcÄĎ.‹bŚ´™=ÄÉ$C}ÔsUÔź:Ä’#mziÔ‡&ł‹ŚbtŕĹóN٧ źÁHsŃONŤ}qaű"\´(ÂŰB˝őf™çPC˝Kłe?•7}rĺ]Ű*ďGĘn¬Áş{Ý­!­0S®»§9—÷ö ě!OkµwK&&ĐąÚN<ýŰľţĎŃ•îŕđHü”®ůÝń}Ť íŢ‹1" ĄOGˇŢŹŮnXČç|[đű·Î,M«˝Ů.4gv×3ôÔĄ čľ÷z›îľ]Mwľ±®˝ťjD´9čÓo|á7|ř`ÝÖ §ë™„ƨř.ÜáýÚŢĚÎw.şT×äˇ?jĎ©8p7.ŠíĎełú`·™ç÷«Ô}\ŘrŔ“ežá,ÝÝÂáĄ~Ł»4K_VPXV«řPpŐz&:V¦*Î|—çŰÝ‹‹‹tŤ>.˙^n­§Î–S´ÉöĂ…Wč/ŻËc†Cą†¬fN?^kꢧÇkËŚČ'ö}gě\ËĽDAž’ťŻ;°BH†4éöxÝ…GCčkžéńÚ{čűäąĹyLѶ°ŚeÂŃ®ę M™¬Xúe[ĹöÖO…v÷Q¶Ńłz›–kŹŃM©/˙±~ÇîëóçµËÖud|’Á‰Zż= u !nz’‘"ö•‘ü.ľů×a+izHcŃ*°çć©P´ÖŁ”Ć> stream xÚŐ[KsŰ8ľűW°r˘·, Ţ'•­ňf&©IĄvwbűäń‘h™ĄçT˙űm<‘&d‹˛˘Ş=8¤@°ŃřúCwىŕháčăŮż®Ď~ů T” 4Á$şľŹ¨âQ%’ ”đčzÝĆ›şWçwן 3‹F)NmoĘ Ęt#J÷9ĂNřď×gźé‡8ŇňPÂD”PЏ¤Ńxqv{‡Ł <űaÄR}7=ş7 -D4Ź®Îţ<Ú͟PiTNŁnĂ7 žF)J%•Z­$*“J„áQnš­˙iŐ3ď5RŚŔvŚnG‚ŠřŠź›ëŻďěőęq±Čë˛<‘¸\mÖaí3×ČŰ·n—ôâ$B‚“€ęc †89Ö„#śňC±ľYŻóňCQ×Úb9˝ĘË"ݶř^µ> ľÁéá+S%†h7z"ÂSoíT?6 sD˙]´ži¨ôł[ &ÔőÄě‚·^°yó^0}kźÝuk±vŕ‚ŤY‚`G޶’H¤É«Ŕ&#(K@ť(fŃnÁŃš˝ŕ=40¦ ôŹU¦>6 :€W L-7#ńřÎYŐ˙Ü ę`Dú &I~"o,…(U‡zĎEUoýÁ<«j‡čU]n4hăzSćżĺŐ¸,Öu±ZŮa ÇŞ·¤HŞäCJ‰hÂ:ă yă yóžÚ›öňžú'—Üß^ń7ŽÝĎl°ĘýY Wr"’ H_Čá$[}?mN_¦P’ČŁ°ŠSÄd—UőlçďÚśWD¨“üÜm±q»ś×{˝ËďîŽDOŁXÇł˛"Ń`°úxCV©(yŢI­ F«vâ;Ăň6h"Ä~Qb°¶ý Cj§¤<Ń˝9¤ ˙ŻQb0V}¸!L 9ĘzĆqH:Q⊇‚ÁîAöUîÍZ€Ę©8ÉDĘAďI¦‡Ďą&ÔrZ?´ÄѨ4‘>¨Iz  EAcG#¶›Æëk+Ř®‹Dx^!Ă«;Ů—pľ wkq°PB%RâŮĽ‹C°¦XŔ}Ë|d@¤+`żFUHaí'}ÂNÜĺfĂtŘ-ářs~ą8~żŞňş˛÷÷ç@őUiŔ^(˝Ş:Ő«‹AÚč‚#čŤ(S^ D*bTč ňü»ż| 8m—«´đ‹¸ Ů’–ęô±·MIËk–¸éN°l÷1HÄ]˙©öš$‰oB˘),#îE7‰Š©©m pŚHX¬Ő ŻÖy™é`ĺs›ČťzÜ©ÔđfDa¤ë«b9ÎíP˛[ľĆCxpC}Ľüo°Ć'`›©šN›*×$`<.‹éćq6ÖÚąöŻŹ¶q’ßźg›ąŽÁ”%qýŰGóâk™•ʶ˙xµ¬łÂľ-š><ö“"™0„™×ü‹VĹ›éćbÚÁ¶őžJ!˛yí( ť˘§)âJD#ÂpëÔŞ gkO)ęTSÄĎÚĆ %5/:C°6fĽëć|”˛xRŠ$?—Ő˝•śŮ±ŞÍש)ö„Ć'A±ÜaűÜ‘NLťËÓ‰ň°şřB=‚zÂí–ľŮrâ]ZMóyľČ—a0$°Ň¸*»H‚Š*„_J¦A1 E‘guLJ< °ĹŕXÄ8[=d•Őôkž/mÓrUçŰX,·V6¤`Ś îʢ©"—ů}^ćz9ß·Č–›lnďë‡ĚnÍ€+Čä8ţvNDś—ŽHĐśÍý+NŽĂ®ňŻ…fOx•ěĂ(<ÜO›{źľ›˝Ŕ¬”Ę€Á¶ŽJ@ž."č'jađg‘-ŻHp0ˇqŢŠş NŠŔžÉűˇÂaµúŞťG>AÎhÚ[QŢ5Ú§MUk·śšyšC·TŮL{)÷K/>ýxĽZ¬çyť/óŞŇ]Éřľ\-ěĂËÍÔ ¤ŇF˘VI·­łń,›:‰kŘĆ‚ůżí7;C?ëáF: €‡ëL¤Ť¦7;ÝE2m77‚”ŕ‰KÓ-F}c9a;íôhL@Á·¤řĂ–‚ÜĄµ!zÄ7U^Vv€¬tc‚.«ĺtţh•9€‹`˘¤Ńmĺµ…7nURFřÜÁEwĄ"ŃÁ)-’śôEHw‘"’¨tZ˛[˛I ó(V›ĘţgóńfnlX™U|*śsP~ť%S÷ÎCvNźŕdŰËb3~pcš}Ą•bîçŕ_!L6l‰FÉI;Ëzd0ĘdeŻŕÝś?ĘźŽŞ÷? rĎťłšÍJĐżš×x‰Ę.°+Ż­cˇń"ŻV“ĘţpĐQkÁ@ăď…ť.µ„Đ7­µ2±-SX%`˙č^Ň ®Ę™ýe˝¬ŰsłA/ĂRÄÜľRCŠ=µ‚kĂ cAWÜő’Îďĺ&Ů7ŮU‹CŠÂÚ^ň­ť~¶^ĎG.‘Á°yjw¶áćďMˇSřoúźl®Ł¶ gĆ€.ÇoňűŢş(¶ś¸ČRÜ;ľĺcđ—:±“˘‰:ăXJ‚“trŔqfÂŻÖq R ›!@Ç]ą‹Ä_`}>–áá|¸“”!I˝;ůĎR{ĺ?–ßŔÁĺÁ”’4ĺ˝ćݶ (ÝŽ¶ňvĆś,‡Ý Ń·+¬í}·BËÚ˛M‹˘-Rnł}颲I‰x!Ű ďŇÜ2J°«§ĽŰµ`Ň=Ň n–OD#Ű6J`˙ŢUői. {N¸cŃí ,<«T¦?Í"#J ŕş[8%°9{2ľ'd, BÖwtŔ‡dÓĐ­ő‚¬ë$z˛ťż†2¤ŇmęĐ«4ą‚#©Ńę™ęI$Ě~bWq‹&60&Îyüţ#Óń¶?2s ÄC÷*Lz‹Ď•zM…é"%0,Ů«ŞmŻ‘áÔ )°Ôięľ4ÚKqhÝ7{r čc÷ ű´ßśđ‡šo6ţ(@ç¬-çőżłEľ••ń¦üž5_iŹVXyßj Üe'˛š?‹>Ć5ŰËjţ@†1Wě}Ł{Ö†3oĂŮńm8Ř}JŘÉS­Ľ„Bqđń°rܵakćňčąŢK‘¸Á}Ćý4ëń8Ȇ­ŹĽ€+9ĘÁ1*1˘i÷ŕX·:ł‘=égűPĂć?˛ďŃ™űĹA^üR8|ę}ô8G‰8ѱFĘěßćíü o}§jď9ÚňVĽ°ŰR÷8´ŚZxF‘Âǡ-“píҶSÜjčj`™µÝqŻ[ë¨Ţ}·§ńH<ăűqvđĽűĐQŚ?g)l ŘÁś˝¬®ňöŠń-˝;vô GQ¬· Ç!#l y˘:děëbżüŽŹzr›[ĽĚ˛ÁęaBR[9 Ë0ôˇěŕ:ţ{nÇĚ\Tˇ-,g­wöî]‹žG!ĺpôú€L5UG9şCh%)ër“ďfÎđQűŠëď©ôD§o *ÉÁĚů’ŻËĽ25Kguń-˙ąÎj86}x%17ŹÁ É‘Ý3/z>|<5_ÎOCˇË‰äŇ|ŕúM®#ş°ü“é1™>¸,A`ŁŁĐc”pwTkĆźáÄŕ1űjëó<řTś  %éÁGöšXÜú?ĹŇ“‚Ým{8”>®„Á^ů(l )–ěD†ÚWŘŠŠŃs¤Ô+éŕRąĚÍÁ`ď޵xqN G¦9ßć®˙ĵ˝^ endstream endobj 369 0 obj << /Length 2212 /Filter /FlateDecode >> stream xÚ˝Z[oŰĆ~÷ŻŕI_¨@Ţł÷ĺ¦8N‚DI‚sR}p]€–hY¨D©ťÔ˙ľł7Še٤!0Hí®ffż™ťůfÍ#M.Ţ^]üűH"…´Â$şş‹hÂŁ$R’ Mxt5‹®ă‡r±ÜŽn®~†Ĺ,"i¬ÝjĘ Ę.#Ú¬ąŔ^řű«‹ż.Ě$ŽŚ<¤ĄKMW×78šÁÜĎFL'Ń7»reVj!˘eôËĹ˙ť‰\GiIĄQŞa}©D&¬ę˛xȬň†RA$8页m8ěZ`ŐAF0l˙D˘Łb5ľLŽlŤp„µžn~r¸Úď)V`}F×—‚Šx9˝¦7üŽ&ăŃ%‰ŮÂ2˛“˙…5ěćG/÷9Cz´·32-pĄQb¨Ŕö˘¨č®µmx"‘Đýö^™q‚ŚĘ †$NŽ‹ H7ź¶˘·0Bx#8ÖÇ$pNĹŢk^awÔ¸1 1*ëFŕk{ˇŠ›Âź`ŚăOůăřëŕ8+¶Y#)íg0]RřD¨SuuźŤ`@Ä‹ C80Čăőť›,ĂŞevWş©éz›•.EÜĐ@@ľä"$ÉůHŕř×CÉ”@>c,¬[lşx\,ć÷Ą{Z™˘“$Čřut©ht+ ®ĺyČ0ŚËđţ°üĐUfíJD4­2ü!»9â Ź.k˘ ëPÂă4źpšh.GRÄ&µČĂVĂ3ÍÝ×ŇŰĹńĂÖ˝‡>Ě—e±pkĘĚYáYłě’2†ŕqI N gܧükŠýť0 e˘*gfŕ«í"źfîŐi6c%ě--fîS‘ýő°(˛U–—ă°0}"¤9fžď\S[$áĐTV€[ŘAQ\t@ÎÎs%ĘzXžč`…(!ÖÁ˛›°Më(x.f°őEi˝ę­3ż(_—îĺ~˝śˇv:'âq4}­P¤™>E€*Ť“ üÍü™~˙wşÚ,ŕ9HÝGu;cyô”Ü_„7Ę5"‰<©ť"#ˇ b9W F Q}ą’φ,9bT12¤éĆ|äńAâdç!OݡjŁ-ˇ>*9y2A‰¤/!Oݵ¶ 75žž+LäK<\Ž},LŠ0?Lt†ŞŤ6'I1HpË^&ťµ¶ §P•Éi9­żĘ‰8=)˝ź —H#RÚ‹a[şWgŘ\›ź†Í:đëů´\¬s_ŕďFďëÂ}#’Äë‡M¨ů+řW*ľž·Úî“ńů7dŇ ŰY…H»Ţou]o'Yžią.šjŹK3DKjł bšî5°(gH͉ť6x6'lZ~/a4J<¤ŚR(˝#‚ u€"ÂśÖVáőĆ Ž _y˛+şdŔˇ`ç ať„ć(ż;ŢÉ©ľÍ2?Tiľ˝ËŠ"óů®XŻÜŰ&ťţ™Î=˙–Íë$SEĹŰüĺÝo¦YúďAŞN‘J*’l}ĆrHňĆę:Ý7ěSŮd ąjZ[4nx^¸X…«ÖmnňŰýbzď&Wéfë]Có]tŮ čOńt ÔQ%;Ďlý€Ă¨j7ĺÚ)(ď×¶÷yZ6×P>Şvďă!Ń 4ź;Ŕ± ń/ň2Ëgŕ"‹>ˇĽpŻćšŻ„9ĘźP€\|ČÁ‘ÔĎîŇ´ő$§Nđ]‘yUÖ%¦ŤĐŘ·»UßĚéN‹|‘Ď›vm łżŘißĘű° ¨sí 8?ÂČ4Ýf€ Ç*ţĽ.łđĹÔŻ&ÚÖG”ĎP@}$ě¬Ô*} ‡ał §`q·×7ŮöaY:ăá#•_¸ß+ĄŤôiCň_O¶NLRĵ¦ub’€#“¶N=T·j+ÚŢőśP[OŚŕ ±ž—•'Čf@`Zž‡3(:a}9ńÄ1Ý7žńṈÝdwýLÇĚ›ńnĚ6Oc>{ăb,ÇjoLŤ“±ŢQkóöă |ş;ĚmOQ†8?S÷ÂL¦I_OAţhúŞ"(ĆM¦´óŕČČŕTłÄ9öUújüęţ¦đ7{UsÖ¤ć AüÓܶ`š'´ĹŚ„•?'×n«©ßů­Nýsć7îqů“{^?s&Žť{^Ş.+űąq.nžîżşŁĐ’j çşÍa(?éč˙+˛O+ —[Ň—lő6ËKŕĽ_łĎďv‘ ?nxÄbj˝`P?u†ęî@¶}‘Z:HPSm*¸oâgݧŻo_§OÇQwĹmŰЦs]÷6Cű_÷¤{Ą ™şăÎűţ 3Óýffű3|*ÖѶSĚďťîgNqŠT†{ŁîNńA: tť÷݆N¤Č GQŢ_íu[#l62‰©ž‘ž> ]­iď‡i¤ÄąB3ÄxďPřáw”rŰŻ™7ׯ™·ExnÝ3K·Ź~ÍÚ§˙b={fA„Á8‡:±ÍŢ Zťql»č^r&G0Ďމ2Űôa–U«ŕ†H\‘˘:§¬/ňń˙=ŞrG¬ŰÎvđA.Ö)ŃC°ÎřÍ]sĽńŐ%].-¦ćîŔpÁ‰ů` úX»#xűřÉ [ ôůťűć·Eyż~đ‡bzźM˙ÜI#ť7ÓĆ(\˘+Ä•lđî…~Žkż”%w6ąµilJ3~ž3K´@‚’Ţżem'.nl¨T±ł;žŐˇěu‡§Ť00:­‰+’0$¤|ÉďWݵ¶ — ôîç E$ýCĂdŽF ꓾CîRg!–ĂĐH ą#dÇąWwÍmă9‡ľ÷\AÂRß)DÜőý!Ң6ĘŚ"đí !ÂR\ěBäY†Ţ]yŰ~Ў«e']Rź"#AĚ˙§\Řź Â˙ča$ŕăö Ż~˙őϢy=Ü endstream endobj 379 0 obj << /Length 2360 /Filter /FlateDecode >> stream xÚÍ[Ý“â6źżÂ›'&Šľ?v+©ş$›ÉÜÓÜî<Ýd0Śł€ †ěÝ-K66°†şÚÚ˛ń´şĄ_w˙Ô’eśLśÜÝüüxóĂoB' …Iň8I¨ćQ’(I!JHÓâ(_Y±ÎÓzĚ’Ľđ ¤łtž.Ö~F„0jĆ•‹&©ăh˙ÁS¬Ž®i4{¸Ą¬dmçC6Ä>ěµÇŹŮă1ĽÚă ̵X»!(‘©SŁŘŚ^+‡ë(ťp›Küédv°‡ß6Z- Âvs+őăľIĂtë:=Żëâx`şĘiÝNůÓžńËtç˛×šXٶF\EË€hraÄXM.e&Y#ö˘*fúâ:–‰XÔ ŮWcf4T¬m …E6ĎfĂ•łµÎŁáÔ9řk¶JGë‡U>ŢŚÖ÷ (Úâc2mÓ{’ŻZc—JĐĚ€ ¨j#˝túŰÔRŽ˝@Ŕô0oÜŻ=˙}KEo8ŰxŇ©¨yč.`'_ŤÝ˝źEšĽ=ÉgłÜ*řZŮ(ź/ó…ĺ­÷;ĺ’ŠcŽ0§®Çă&.ë,¨®¨bíńÖňČ”÷Ë­˛ ”Ar`çDv.ŃÍyţĽąDŻd¶)çĄúŢe®„Ú‹ř€p†ŇHf0‘í ‘m™â\Rs±ą¨rf·.*ł†ť4ۇSo“ •&Ű©4ąţF÷śÂdڶĂ(±¬çó…Ü,,X„öŇůK:Cbîy¶p×ők柸ě´î*ő|ęe«kát-ó˘Č^fŢÂ:w×MQ=(˝µYÉz¶M1¸÷)Ö/GŰÁQ¤Qj'IQăü±˛CR0Ä% kŃJ@H×Lů)ť¤«[˘{éb”ľwTwĐÁ ń檏”îşůřxó׍}¶%‘€ †Ha¨bGó›§gśŚáo0jÄ ˙ż–’ó„…„˛ífÉ盹ť@Ä6¤Ňĺ‘0Ą2"ý*ńă†óĺ, -3J@ĘśbşŐ}Uv_–Kü:pB‘íj`:CEŐ Í‘¦ô°·›łżg診ˇ(ŇRvP±Ýä0şÖ®‡}đé.âk5ôŚráw¦ĂĺO~ʶkmŁ4¸˝(skÁoËëűÝőÎÎăe6”?íéSş}÷”ôhźŐżYź—Ĺs%L>|ŘŮŰ7 j*hEdí„ΆNvwŚ\É °jĺŐ®Ě N`Gť ú˛ĺŮWo|gÔBๆ?_+ú…~źýŁŕ?ű­‚-öë»›§–/úÖ <Ű wްşŚ3:#:)„ńµ˛€[™“ł`I‚ßËý&‹¨Űsúůż÷óá4-âý­§.zgÄBĐ©€"ěZ@uYŁ” w@\jĘzO%ż[xá÷ç* |řŰµŚ§˘~¦ž/ÎKť! ˝őŁ­Ë®ă[‰*uj*d'ĄÂőwI+ «]O:ß]Ţ_ťÁý…ˇ:eâJţÂ)JOő×ĂdÇc­wmŽÝ<đYę‹ Ý¦i¦aµ ;hŘ #3)éĂľ®bS'pKźWěáBPůĘ&(8úňą~ME˘ó0B ¬çé•BŽiŚ499ä>ŻW°8ŢŘu=éýšŁU¶ôďS}ÄŐAy±XëŽO±ދĚÔH kßýw 2ş »-bäZ‘!ěž=9yň°;ŮQ6˛ˇRżî~«éŚT6'É‹ÄçČpżU¶JGŰ×[·ť]=…ëŕ›í<ń|Őo-ĘúJíđX˙@¸v 5¦´ł $ř‰™„1Zî-ďlčÚAnŐSö¬”,Ý[A~Ý»Ë২Zh)÷&âšÝŞm˘ěÎB›¤`­g÷äpµąrŤb]źdĚA»FuxÇÎ „8b¸áW"YlÖ'“ě´Í}ÇAÚ_¦¦îO€0µ§ąÂÔ(D¨<áruóq6ßr6LlÓüjĽęyŞ—4Ó ĎdÝÁ ńÖLńKLeT DÔömEműS˛»őpŇ IŻ0ö´o0ôͦ3X!ŢB!©ŘEFD·\¶‹ýÓŮz8.ę´ ;'`¸AŔЧĚxŮ&q[8żC¶2´QS¸ {w&Ä–1X]ł+aËb'C;l#¦fůŢ´¬˝łĹ´Q–/}n6Ţl´ îIďÂűUݡ ˝•›Ć׊|*@óÉîy9×=4ęžşšĽ¸{:cşę=-®•<„!ÎĚÉŮóýKĹHő2ý28v!ŔŃžĐć"»…ĵ˙>c˝Ú¤űg¦îVĂŽCeřy‡ÎŃQw–Ó‚źsPâ ţ°‰Ő kŕś"ŠEű°IűcJ™ ŕ¶ý†uřć—t±^ gĺąšđ|Ţ›SŰ/mďýDs$ÄöH_őaĚ-odďßŐ“‡×,zÔ¶?ö•Ą"R˙}&Óč*j(¨÷âdO<ŮĹÇ>QGż’H·>«9ňÁĚîXäqFĺ_ endstream endobj 389 0 obj << /Length 3016 /Filter /FlateDecode >> stream xÚŐ[[Źă¶~ź_áćÉF×\Ţ)nşšf;ť  6› äR@#˶’±ĺJr6›_ßCR7JÔx<ăNч(‰><üřť Ĺ3x¶™áŮőŐ—·WŻ˙*˘™BZa2»]ĎhÄŁd¦$AšđŮíjöĂüXe÷ĺâ§Űݎ3›Ś4Ö®7eHe»Qbú\áZřlÉ z¶dER¸^·Ű¬\,y¤çëă>©˛|oî˘ůÇÁó¸~ŻVéĘ=żűäÝnó]óúË"=¦Ĺ‚ăů«ĹRđhľÎďďóóŹŮ~ăú¬˛29–%Č/ë˛jë^ý-ßo>eîé÷Ű8wOÄ—ięć€đĚý ÁgĹfć?řp ¸EşĹ’H¤™‚+@µ›ë¶Şĺ›×Ż70ôń%ů‚ĚwŻ7ńay“_âMZľŢƇ×YYˇ©‡ßlÁT˛AÔ%Čü`¶¤L"Ĺ´?ößÓĘ-Á˛/†(ÄUÔHą&ˇu%úđ¦OĽ_…%EHŤ$zZŇ]şXR©ç•]ěÜÝlŠüx(_‡ E¬ťň÷äńCÄî’¤űŞďáFáyyĽłąWů:<+¬Ńú@ XěşĎ+#žOâD9⸝Äűm4%‚Mbď®Y™ďňâ–łs3Yů.8Ö’1Ž$®ĺ‚8e´˛2«Á•Ĺ .npÓĂ î&q“ôEOă†K†Ťe§ŤÄá‘mg«Ń‚yŁŐ€ç«cR…†’©Ž«ôGŚéŢ8ó[ăT̵ڦeZO„GóÍqă”îQV¶˝\cm}TRĺ…»ˇ¶Hµµ/ĎťÁ))¨kۇÂéno&@ŐqÍO+•Ź1Vť´Őž hÖęŢQBôLÉŤE°O0I&IőÔ`Ý{} ‡=_†ŕ@QÖôú˝é˘]xŰĺóĐPF %‡˝čČH}I"QüIZŹTâ}9˝´pv!b'CZ6Ý1n—ŻëÖ§[ýIxPcčKAFI$EëŻŢ§h–O ĆgH‘-ăhŢýň= “És›ľ—ęČ8DKČM<;4žfÉ"0öŞ*˛»ĹŰÔÎÇçţvţâ˙Ţě ¬Ő~ť-/ŁVY0j7šąČyß`hR„;Š^OxNÜy‚jWNöÖäDFú]šîÝŁ¤HăĘx:űřShz23ÝŃĹź`hř%“ ŃűxÉ4xl—ݵ7UQD(jŐĽżż čfGÉ'fC;{DV˝EýD´fşŐnť×jjĚ©“HŠáůMUş§żš”2ľ?¦î'ÍtcwWž+×vÉĄůŤő—n¤~NjIIF Ľ•b’ďůŢD4Č˙|1íQÔ!|üśşüůÁ¬Q!ŞŘD8JY/Żu^á»ýsCĄ4ůźÄ¬†zó"Qň°yAž©Ľ|&X«5ą K)D$3Aü9­×Ĺ…ŽS ‚K±‹A BB‘ÉŁ—j1„IT“¦ŢÉ}“»łűçAL ¸çI\oĹâ$I˲éWżmx`Ú-lď^Ď€áCtî­âwů±HŇФÝ\Ťc«đ˘8ő.´~HשÍÚŇ}’ľŰg0ŹÂhđRy×ęŢ3t ÉúÁ)-™’(˘ÍžoŁéhSa±cŚJ˱%3›!ł Ś· Ěć™v‚†ăĘNÚ¦§mĚŔ~ŇĆú‚J§žós p»™3OÓÝ]şZĂ+ÝKmď¬~ŇđČ<­yTcQoľÇfFX'ń¶4ďšq‚Xă${•ŚvŽA0죱íĆŻŢÝ^ýűĘ, 6žH„ŽćłdwőĂOx¶‚W_CĚb:š}´w° ŤťßĎľ»úÖ}™fiHÖ¨t~C#{a›Ś×Áđ[Ľ;ܧă™ŮOJý„‘=ĺ•UžŁHЇdŕEVm(A€cśíÖpńr ;ś1ľBÁvç2 “IHr\ô*jŰúÁÍy]sç§fź;1ŁłŐĎ „ŐK1†G°ł~:c!ĘÍźőN&÷éójĐHšĆÍ ~—UźţöŁ;™7żăóÄÜ×vYÖeIx6Ţă%c&…"!ˇůüާHŘ൦MC4 Ö4xűęqŚ=[÷ńôm~ _±°QâÉŚ˝Yµ .| wÔz»ču5ä;td|g‡4ÉLö¤Ń5 ňŮ?Ę˝eĎ|ĽfXĂ>ö2”%6é5e«â>@¶łG)ΠŤâĄČ†1ŠšÍř’7ę{ÇoŹq•{{LIćę\:};¨1Ö‘@ _„$,ŠPˇţ%Ó·óŐ# bü…Řfľhöd¶%ôDúF/ͰłÁă+ ôżÁ$GZ©pŕüD ĎÖf<®íiŐËđE0„éÓůr g$oMĆŃ6účäŤţ×’·óń/Sć›â%(Č ÂR˝\îv¶ęăÉS»ę—â+Ő@ôż\ęF˙ďR·óŻ™ůt©.BX˘ň1™ŰŮŽŐƶ×/E5,ĹO¦Z¶_çaçh8ÔśÝB§ 2^†*g6ÂśFIq‘řJ5C”×\)Ҥ›ą9¤ň j‚Ë…®÷áąEđŐ4ĎźÔĄ`—Íź… 1{ČhDŐdtnăA2ľżiČwY~qJÔ#âIĎŻMă{68c|Ą@Šë—±u*ÝaĆmÝť"vµ'5†ą+Ź·ĂnÖE ·Ţ¦w·ćŽľ¶üjĺEŞ ˝Ż8đńšA6©4żŻ ®Ź +çĐě‹ç)=CD}(g$HüŕVs !Iř§r˘™µ…µ0 ÂX}ÔaJPř€"Ř'HĂfđHŘ8ßÝ!ŻŔżŰŻLĄ§9PµUĄWJđ°´Qeś);ÂzeŁB ŰlN1ŠÔzL–ÍQ[‹+µ?Ťč>._Łö‚«­Ëć›ŘhëűžÄ’ci)ëť×? ŹŻâ*žĆl)ęŠźŽ “řuP^áÚóq®éqůgVmovń&ť'’°nEmŇýµńĽDÍ?„f°Y”äPD»Ź#ϸ´ ’“ĺ%Uë…?›Ňk!ç©› «‘ ™é`2¨uá®öm˛ž˛W35QUkCfÝçáJ'†XWt.$G%[1¶Ä¦™µ+jî!T®ňCEăÉvKÁ‘¤ýjUŞD•ö¶W‰ú6<s4J„Ö ×«'§j~Są9ŮŇHÓ°eôfR†áy9vő45•ňkUIW#ĂúšŁçÓuf˛«Vµt˝˘©ł‹a“qwWW†™˙˘W+Öúq›î]Y‘–ŕ[ůi+řÂĹpÄM=é¨üWú:şZ8ۨAµEćň‹‰Ui±OďĂŔFŕŐŰáľ™"¤h9őq›%ŰÁP0-SźőkÖTźgű*-Ę&i7Oěçŕš@”×E‚†\Tł~ˇ”?ĽýĽ˛HaĘÜŰÉýß}î{а=Nü,r÷¤Ľ +x>ˇË‡É˘m1"¦…ÔĄ†ÜTÁĹÖ„Í[W,´6…Č|*°@\)ĹŤSĺë”ép«c‘VÇb_:]bwąĎĘŞVní®UŁ­u¶7m˙©łośŞ˘­7ěwTË—ć?Żü™*Ř+/î•W^yĎئ+ČąBB˛“Ž·H÷«´”úúA{±ŻěŮ™ë<éL)R§}Ś_˛ß%1ݦé?~_ôę endstream endobj 395 0 obj << /Length 2284 /Filter /FlateDecode >> stream xÚ˝[Ksă6ľűW°r’Ş$,ŢŹĚn[™x35•Ý̸jÎh‰¶UĄ—I*3“_źR¤@ɢHë`“ÁF÷×_ Ş‰Ł§G·7˙ľ»ůÇ/BG …It÷QÍŁ$R’ Cxt7ŹîG»|±ĚĆ_î>@gŚ 6®7eHUtŁÔöąÁ^x4ĺ„ M™@Z ×ëî9O)áŁ8ĎÓĹĂbź8éÚÔĄ …”˘Ąô_çÉj»É“uţ~=ߌÉhµI·Ď‹l•ýçńXŕ[řGÚÔ$Š ÎM))Mň]şÎĽî&łM:oÓBáňą9ŚÓŠGZWz~]äĎNćÓd9ĎÚ¤r° łşdô”¬[A)&ʮ۠eqĄŁ)€iĹ=°ERŚűmLÄ(™»ś¤qľX?Ůk<Ę’ÜÝxܤnD‚›€q‚$©LşmSK!­ä^«©dŻ[!d`lĂÔĹ*~JZŤUiQë Z.2ŻđćŃY[نőfÝ6˘ˇq]Š™¶ÂŠ$«´jĺßý»|»ËłjĽéŔg‰0=@żIP`'pÔô˙@‰_­É–ĄŕŚŰɧcTĄT#J*˝6yĽX[?RGßÝq‘Wî´—ëë? ‡§®%^.ÝI¶{xJ7»mć{>¶»[39ßÝČ“Kd´r04Â[tŰBÉv˙Hn>Ú+Ü>´O‡5‡ $ k=wj`ĎťBˇG×·2Żă*ŢnĆĚݨ ÷v™¸Íű”aDŚ9ĺýnÓ“4¸…ŻpbĂ9-Śp,ŽĄ– YŐäNţJŇŤ;ű&73čÖó#O.ć ˙"A çă›÷w7/7bŮE ‰$LĚTńh¶şą˙‚Ł9ÜűaÄŚŽľ=W1 eź[Fźo~w @e‘TDW1&A„‰L9Óß‹WŰeŽ K.şˇľ*ÔçkyJŽ(ŰŃŕqŇGD©§@Čť”@` †¸:ŞEĄ–ĘJv4¬Kź˘fçŰ_¨A_Ć’Ôąú)ŢţäŇ…âąRJ!°ŢŁű© bT¬ŹĹŮŹ˙rÇ{w°ÁE&tÂ&܆ؤÖ:ž’Ń„ÚV{é;¸ű_Ţ˝óăżfP™Đ4Y9ˇ3‚ˇ@ĄäJN€HŇX]ꄹnşŕÖ®.ŰńŹ,Đ!ÜžaX¨($ ×A›bq»áĎIţ[ĽJöεgô|2úÁ^qđ řv'ŔWHôŻD`ó»6xF›ţě3¤ĽkÓ mĚC3Ľ3|ˇ4$ĽâJZ Ă/&x•)Y2—ąr=Q¶í>YŢĎ*Ţ'ĄűcwäBđaÓÂ;8¬b3Hě}@ÂĹ­ÉÉŁśť44(ü%Ě´*\:˘"4lşŻEII†ž’eö>n,ĂŃŻ3J!Đ2h3˙(®dąťšµ­ëĂä^“ÄëjNă°Oé‘cŘĄˇžXţµEŻFk{“3ź"ÎOáÝ­pJaËŐŹ‚2RB‚, ;˝sç@2a'±ń÷/Ʀła!6°Ń—” ár66GŻ%‚÷]mÜňseťag ąŃHĘř…)˘ĺËŞ30äĄÝôUŞŐşZ Ůą˛^ǰ;!†Ždr»^CđČjP#P±0’ďs’j…=HgkB@cĚuň®4b\\šź|\dů~1^ĆYŽeš\fĆÝaú“żLÖOůł}čăéÁŇ–îŕ…řCʦ1"oáRÂs B–ÜŁŻÉ«‰pw=CS!ŻŇ\_‰j‚#ÎĤÂowG(25m†á§”ąt‚+&˙–UŇ…&?\nŠé°z§ĎË’»[™–az4™3đ3ĺ ČNbeŤ>•Q”ÓŘůińq¨:ŰB‰—Ńl¨¬ZŇĽ)T'·§ ęlgfĹOŁ@…%’䪬:ÜP‡ŞłťTĚŘnÓA b†#)Ţ–U'7S' ęng•˛?‘Şa Ň)|eVuŇÝä5©`/=ÁFŠż5Áaę‹agB …@Ä<ˇ‘2ěşĚ;ş=ŽZg“CÔ8]ö@ĚăŽúŤ™wS_ ;bȢf ć1[ŁĆŢ:z'ÂöŐŤWwűC‰mwż*‹>2*5`*XźŠ“"|ŐŽ•@NK°űŠEłjç  Ě Ł°SâőŠ/¦ÔčeçIş¶%_p­GĹďŞmTÄIUŹů˘[«˘„ÝÓű.¶RÉ{щ­vóĹBĹ [Utp7tŃŐŐcÖîĺńbů#°O [ř”zĺ›őň{y–8 eťď¸öbžWGXŤĘÁ–qž/fVWŁŻĎ‹Ůł;ťŐ‹ő2×V”_Ů“Şü޸*‡Eă©Äľ̶{ ]_s毳ýfÝ÷},e• ”ĺ€ö$łx—%ť˝ p¶ŤiÖZ”HŤ@¶(Ů3ŕ·˛Sł8vvU—w­r8˘Ś—]>µ1 ¦ËŞŕ2NuýúĽYúÓ’‡4`ÄQĘ& öÖ«1Ź—ÖQŘÖS%†)­ŁL5Âç•Ö]0t0ŃQ&ÖŞĎD×CD©e0ÚkŇď#ŁTn_­´ŽÂĆ]IvéKż—Ş®ßk399¬ńŇC—żtG*›s˝:Šíaý¦oX_†~ĂÚˇd­•r7¬ÄŘ:˙Ößľůäńű©|óźĺÄę›í:gʎɫ=ZÂ;kŘöN'rŘî…¨+H„Hż¶ŹŚJ ŠĄ}¦ö"üňh%zA[ZGk9,ž¸,í|83ÜŚ˛2†aO…G?/Ň1eöA endstream endobj 401 0 obj << /Length 2232 /Filter /FlateDecode >> stream xÚ˝[[oă¶~ĎŻĐył ™ĺmxéž.ŕâě¦-°íiŢŇ<řdíl€$ö:v/˙ľC‘’%SľPV„ĹB˛Lsfľůf8ä(4{Čhv}őĂÍŐ·ÁdšXMYvłČ¸‘Dp–iĹe2»ůśÝ޶›Ç§×ńÝÍĎ8XdŚK­Í†Søpc®h<›H†“Í&QŕG]?Ž9Śţ3Í_ĆÁŘča˝Ü®üí—ĺ3ţ[Żľ<ľ>‘Ś6d2ˇşş¨ôÚ! MQBůQ¬M{M¸6YmÔw­QwnJq×-â41Zµ‰cŚ•÷ŻMeš@ŢnźiĘ›˝|n•Č)ŃF¦!Ę/D´rଭ*DŕŤ=O`«}’H#ęňrd-WŁ ŇŐń—Ź–«ůz¶y\fŻç›í:ÜoľĚýÍj˝üĽ˝ß8Ů„[N”r˛1”¤őÓÖŁ Ő"-TüLŹéc±ÖC†ýN)oGíá<™­(*Ľk<Ä ęTč^M´8’Ą‰ä­"ť‰ş.ň 1…głGů)‘â´w±F‘"ű¸ąúzĺ0Dőp! SgÇs˙|u{GłĎřÝĎ%5ţłůś1Úýî)űíęWż2a8 ¶Š«"Ii‹`©b2f‚ĚÍžWOóX2®a„)ŰEtC}]¨/‰¶ęŘ4ă(ĆF33Őě’)J% 'Çí .B-Ŕa%şOQ*ˇ)1¦ ˙m[?dÍ˙»nń´Ĺ Ş«‘bš{G?ĚVď}uQü®śĄ°ţ'Ěn'€Ć˝×ďľ÷×kWdüNúŹîŽĺ<ÂŮHâGV}ÁŢ˝ ˛N)_Ö: îUx'نX1ŢŠc1§;ăÍOâ ązśSAŠa–°őPĽŁ:ózÁZpţŃ ŽČˇhřáďźžgó×ţ÷27<Ü܆p?Ă0(Bŕ®ţ]p×]ďţJF;vî((Č_Â੨:Ç…8/íE†óJ?h§BŤ»<ކŠ®Â=eW´UJÖĎß*#%#Ž_3j7ęĘv¦ř‚wKI˘LIŞ5%E ‰ˇßŔ=ux.ß*?%Cy¬% ä@ŢŁśhŮ=dä~ŠúĎăz~żůe]xĎmUŰ–QOV= žYŚşÁ­MqÜALÁş3‘UąÝË"O‹…3oT9ąŢe•»â6Ú Tf'ë›­p9Ů@‚űľÎEâ~‚>Ć5^ĺ‡ľą–ŚX ş„›~¸¦1ŽrmŹcµő+׹9źmÉZdžĂ}řPlIl÷RąťjH3‡ŢýćÓâăöĺŢťÖ5 ĺݺī•iQ˘_®uýq1ĎŘ%¡M/\”.î§»ÖTç ¬§;w‘ŁÉű°n7¦pc#&Ď–î®č 2!r˛É1j\ÉÚ\`„v^˘‹ĘéĂÓóŽĄ‹Ľ¬O§ ďU¶˝5łvDŞ~ČĘ,ˇĺg•(=Żt%ß<·L€ä0©’U‹­Ł®#&.:§»dŽJ ô'——Y^0E8öu3~t$1Ýp Íc_(­ăĹq´źLjJ8…AÔźi“Íeř0J©ËücfFľĐŔ›˘Đř´ŽŽ¶×j3:*¶)×~ŔvőÚhf—ăŮmýpśfŽźŻŤűŃ4ĆřŰň$ľ¶8ŞmÇl´©š@EUŕ©p¦ŻSYF”Şš%Ó"Á2=šň6ÁBĂ«vX{]¦ť§ 6ŠV˝­*ŠJtö{a,1 M¨ ]­˙Î7í]M`×v™¶(Ł ëÚúMŘŁţÜ»V’p!OÉ;«Ý ˘!î˙óń„ęÚŻxŻíhąđĎfŰť;›ß„Ń­Đ(ÜYŃ­űc#ĎĂFśŮKÂf=]!ĂkÝ˙§żÇ 06&ÂÚэ뎨l7«íĆ#S „Ď|Ő=Y„‚-4O„–c­yZ ĹŔžů‹ą ŐT DNußTJ÷í"ęqĆę ¨ IłÄrŃ® ćPÁŇ\݇ů¬vE~¸ů(¬$Lę~šŹApfď±äh!XęX°—,äLQ*ÖSzYóń’9J5.&Ň S° \˙Téę6őÚíăsű§Ńé¸ĹĐŕ:>Đ^I€!X…wD~¶ý´Ě겖Şí÷mďx'ă-ab(ŞKĘ;Sý«iâýëv¶™Ż_Šw Ř>ńzýeľö.;XÓ;üÉŘĹđănť™ˇč.$ŃťŰîł}řOĐýk˙x'ăŤy·˘;çĔݶ¦>=y¨8Ý67nîůŞvÂ*pÖđF/ÎHF2vuŻUŠ>h–lB]ţď𚯳÷ĎÇÍţň0q›Kß/|}řŚ&]»Č@nq×Ŕô0lăÖ`ŐÚ™mËá®=RKŐúőÓb/ľ§}‡w:Z1ŕ«f5ĐëÜ(bË˝`:ŕ×M´[n×÷óĽÎ·Ť–s/'c¬‘T÷µ\KܦɳzźÍʵ~(Ms&sćFńś©ň–±śéś‰śAü7Ř Ŕă'µéÖĆ€%x/€)A¨°µsh´Đjo˙ůÍŕtťbł¤&ҕ܀ڽ> stream xÚ˝Z[oŰ6~ĎŻĐŁ Ř,ď—ÝĂÖËV4ŔÖd°4Š­ÄBm+“ě¦ÝŻßˇHĘ’Ą$V"EÁ‹ČĂď;7ň$ÁŃM„Ł'Ř·żśźĽz/pD1’’Ščü:R &")bÔDç‹č"ţu™ÜnÓb2ŁÇrryţń#…˙ĹMÔ~ţŕ…r¤´"V(ŽfÜ M“wšl‹lž–N’ÇRí!1.©ß#Hđ{$"G]ĚĆ8>Ëש›ß¦E˛ÍňMéĆ×*âÜsYß„ #DB˘ĚÔ@Ay›˘ătľ=ۭߦó|}›—™EÔ«†ÇK°‰F› Y0ž šEVÖ«÷şµĆuaiµđ´±LHÜ‚ó ěÄ,[rXT č´ď,$SaH"n‘`‘BFáj %qĂ«pmĄ°Ąi Ö<`Ć4x’PŔ[!l´“ńűf2cLÇw›Ôő(¦ĚöTü[ľąů‘ąŮ–IîzIůuBpś.Ü0ó¶ËÔíz?!ÖOvk7m]¦ÚçÇ»ÍÜâő»r·)[ß®ŇuşŮşéĘ˝ľ»ţ"X~féE3"‘MÍC‚{× ŔŮ‚Yr7¸ZĺóŻ%šĚ„PńŮnľtÓÚBÂâ;K*)Ý' ă§o‹Üňů–-a_ýp_ţHEî¦>$Ĺü "é3,>Ąµńgµ]ď3ţŮĆÉfľL˙«ë†hmʱŇ·Đű•J„R¤˙îŇrkASj­“lCĎĆ75}P•Ó€ť¸JÝŠd±¨·ĺ­dmwĆđţµÍVe+JĹ5- Ă0‹˙®‘dĄkŰ*¶3Ë´H›kŚ5™Â4µ+˰ň›Ý™Ą'ˇăüşE&Šě&Ű$+ď<ĆfgŃöž2_í¬¦.·évWl˛ÍŤ&®YeĺÖ'Ćk×.š)©¬HÔçśçKË‚AFkx&qM\s›Ű pşo› Ç5»Ô­¨‚ŶK?±Ű,ňůΆMĺś°o•]IńĂ}®sCż[„i7ąA2볥THň¦-ą$pY¸˛ëöZ{…lĹĂžO}bgśÁµ€4VY]oDč¬lŞ­ôJ˙Đ.˛ä&·–uŁ–5ě®W&®ńYĄ*%í3ýiTlT­—!¬Ô4±yĹv°Ş·“٦÷M@#*Ś"HXôŕń Ú€mk!ÜÄÖy•Ś“ÍbŻ;— Öm /*s;?.mŞn:¶gÔaeşŹ˙"Č| ©¦˛‚p.ę7x Ťđëjťc$”xPí Ę÷~WQ˘Ś!rđěEVô'Ďj•ŰtqçBŮ>%l<}Oě]úęCDj^ů§=—°†ç‡Ł‘ ďšŢx«â­^Té $‡.żr9/ßůµE ď,ť»l»të™›7Z/vHˆéǰ‹ ;“nżĽŽ«Ń7Ůjő_¤ÁóBđľj;^+L}Ć˝[f«´ź¶ýś´[y¸ĹÉ@ši¬zsĎČT]…S™LňŇ8\`D<Ůńßfĺí*ůQýdˇ 6IŹ˘ĎáÚč*Ts$áŃtĽ{ŐEµFÄx˝¨ť`{ŤM}‡Vnbfz:Ţé¦Ýë¤f>v—ą˘H ţ,ćö‰Ł™YQNję řđ6Ă~ňGp ¸ËYbxŐšq8Kލ–mÎ"đ‘#q ¸Ë™k¤řHvŢ>mĘ]^ćy”ăíR†Â\é‘Ě uSâ1ε™"ÝĆÁśîr†WŠflÎT#Nʦ\Ç÷Ţű=ĺĐÜO|0ę.qxhĄ_ćJ¤D".ĹSŻÄOoÁýŹĺí#¤÷×0nP% ĄëŹw‹V`×¶ÔĄl”[s$Čá%Úm­Ń:şö_ąŤ9xÔą>ďY!*_µí«NűÎ2G¬©ńř–ąĂ/@üJ>}ÁÁ2XËCxŁ©ź—% t‰ˇH„a=Ž~řŃ]ôJ!LžW|>GF€!Ââ…2‘I¸źZ}ňţęOŮa-Ô¨.›uP{ µi]Ů Łd á íÚD0¨_¨%B"©Íx…ą0®Ť®B9A„«1R:áDňި~M°îŁńńwÓp]žÔ@ŐFGy7F‘Rćč‡Ó1 Ăë2$ Q¦ĆaHˇĄlT†áubĄŘH6Äi©cČ>~˙ Ůţťöoźŕî%šEŠ#c|dQŢú ń?sÎđ2 endstream endobj 303 0 obj << /Type /ObjStm /N 100 /First 872 /Length 1551 /Filter /FlateDecode >> stream xÚŐYMo7˝ëWđĘ%93ü(ŚN·Z  ­aŽ#ŘBRɰd4ý÷}ł’­´ri­Đ ‡DäňíđÍĚă\“óĆrÁ0›PŘ䌞 żÉPCްÓÇٰüĂ%â±3Âú2É<"O&Ć˝Ll? |2%xCĹ”ÖX6ŢÁů‚†Ú Ť‚ˇŚ÷ŔQ 42Á$ž„#AŚgÂdčxŃYěHŇ·`'ÂaŘÇ!öÉa`4o ć@*8çFD †“”ĐČFj§̉'ěM oÉ9b@8FĂxGŕ>é|ŐčII#bŤťF…1AĚ:pR(Ł‘ 0 Eů±FŽĐ2 :DĘZÇꢉŇ#’¨dńź(5Ť$ë4:EQŁčE<Ť64 )‹ŘĚ:ć3'›3ť\ŠŘ€™3{›Ë9f»¸… Ô“–őZµŽ}  ´„V,˛ë.tk¤Úęâ¬ÂL8<ůvČŰŁóÝIĎŕäď›TĎ[IEE–Tě2µIí@—M”¬–›¬Doµ& ~u٦ž2҇ Ţ!ÜuXźłÍŘ^wI°Ł-ĽOţŃJë(÷šłVft.좙W=Ý\‚ß˙ľĘ Űĺ( -Gˇľ…žŇź‚ŐŤ« ËŮnVŤP¤Ëzp­Á† ‰ľ×jDŰŐ†V#ŞŻFD=[L˛8?ÖaYlţ^CĎn;ôyhčK}čKýFЉ6»Łş„˘¸—Ę(`;¶EŞ !‹űQÝ>0Ľň †‹ß—}D×O§3XNnÔ;»˝j´×śL‹ÉôęĎOăéŐâú)®eV\őŞé@˙cŐôa}¶Âˇ +.Y R…ĺŚsyňUXrĹĆR‡ĹŃkľÉÝŞ{˛ŮuŃÚw!Äí… Ź[K÷Öëu{ňÍŃ&ÎuXĎ6úpp,ŐŃ·ŢQ7ÓÝ=ÖŕbËVňcšü\źü\ęéĂnźzv őţęUXĆorrx¬€m*‡ŐÔnul(l]|?ÁĄmĄˇ2Jő2Ją~/ęĂîÚ‹z°}żú°§~•üźö ß~(ĄÇŽl!y;ýyŻôŻťĄV”hĄĚgŞ„­^ĂCŢ”ő<ŞűăŹTW“ĹőÝ{{9ű«ąş¸ůáćâň#B1o®/nšÉ|~‡f˘µ3U‡ěj.ÓNÖĎÝ·ť{×2ç­~§D6á…¬g=·J:5ÍOł·3>™ß˝źŹ[úâłá©éžđrýŞĘŰŠÄVj±¸idŢŁÜ=(ńJQwMg=uŞéÚ—ˇ}ĹżüߡµŻpu–:ĐUÝÁFSb©ĂjF=ÎŇÎŻ˙db=·{FźÝöéµ <˝ęź{*Łß…Ţß@ŘúžH/6:˴ǭ⡅0řşw.Ňf.ŘÉcrÁË/Ěť Ĺú\ÄęS@v×GúÁŘŤŹ3˙!&Ś endstream endobj 417 0 obj << /Length 1873 /Filter /FlateDecode >> stream xÚ˝šKoă6€ďţBO2ŕ°|?Z´@‹Ý]$@ŰÍ-›×Vb¶•ÚJłéŻďP”ŮTlS&„EV4E g>ŽČR8yLpňűč×ŰŃ÷ż ť(d&ÉíCB5GŚ’DI‚ áÉí<ąKźË|ąßß~‚Ć,!l\kĘ ŞjF…m3ÂµđŹ·ŁFö&N¬<¤HĄKšĚVŁ»{śĚáާ#ftňRµ\ŮÖеÉ2ů<úk„TWB›dóěWü]ÁMb‘TZµ HÔĐ'•ĂŤJąÇéÓĎN˝ęąFJ%°]“»+AEzÍÇŐő‡źÜőCľÉfĺççŐ‡ńIłY±z*¶y™ë›iąÉgŮÖÖÁŰö<˝±?ą+C-ů±îţ”=ťüŃHpŇ ?0€«ď&aS{ÉťĂÔyÁweîr__&ŽNw[Üntć]~p÷°;;Ý\ˇx\ĄQ‚^Ä•`Ś43‰ÂfŽ€=$z„ßç-‚x÷&ŽĂ'Ş%FE!*Áe‰f‰’tß}q7©NćÇ©6—÷ŮńŮ*Ž$h&–J#Juß™řˇŘ8$×î’ŻÇ{3ôĽ1µ†ńˇJФVA•QU{tQNŚIygmĄl«‘W X”,ś‘ŹY`¸’0 î‡9Řá«_ő|Íý†żáuĄr‘ŐŢýç&_—o~÷šm'Ý2ľĆ×ßµĘň8LŰ0¦‘Rr ă1ţ^PX*Ňb‡Y°Á>3^5%1Â4É0â¸vá÷ÝčČz¬‹o„ŠZĘ(ć€V"‹ţćë⛚!qFKÄa1ďoN°.ž9t1˘‘FŤKd4j(3Ě!4…6Şo@rŁß[>íâ9mÍÚ7M¤×žéă,¤a°|ÖRAv,â­0’Śöĺý!ß>-§Ż-¬ş˝ÚĹ€LĂ*$Ă1f!4’Jć*ĚŻ˛ŚŞŔŞ7o5gN'nÁvř$8ěUDÉŰ™°ô4,Žx.Ť3 ›ŕS`2Î8G ¬ˇ!„Zŕ3 żHž@)Ňä¤'đŘ‚Mđ)`…¨4q(¸ŠK\ő˘l‚G‰ŹBŤ |V7Á§ b"Ž/p-‘áO á&řŚ$’/(ŽŚ‰B8ąn‡ŹBÄů@q/— ač´ď‘Žp$˘ŰG"đ;JüNŃ® ă „ ÷Ţ˝ÎÖŹĺâ-ľŽ‡łđq2Ó1âaÎ "´öZ"ŹĽŽÁ}újŰ#MÍ.Ę„/‘±SęÔ@Úcůľ˝E€˘V‚™ŁˇçQ, ÜĂýCbĂW4a†#ięđv‘ŤŻ¨ éěyłÉÖĄű±ĘĘE1wĺya'*hş.ʉ«[cpň—Ěţ˙ď4ŰŚ9N'®ÝlZήátąt޶ů×eÝŮĽ=CmŃř Öňôʵ»Y6*=ËĄë(_?şŞĚvömşş˛®—\Xv™‚+ sí•OUR×b¤JWvüćNÍ Ţ#“°©UŹŢěNÖߎá5Dş:bu#şÎßá%µ’ßZ-¦[§F^nťĺ"ßĚ]ÝĆYĺ~L×sŻÁ¬X>ŻÖ®ěL.a‚_ľş†˙e›Â˘V´yxg­N‹uÓl˛»ůP<Ă:ŤáMf]s4_)Í0čäl´ío $dŁşu×…Ö4J›¸K@\ě€ßwÉ©]/c‚Óé¬,6c!Rpy¬Ďn˛ZQWPél™M7Ör[[ľŘÇ ÷şNŕĺjuBtáBÝÍU—"IĐÝW¤’şďÁN‡—Ľ\4üŽwmŢźîúëk§ŞxRĘŽ$«5łc•­Ud]˛9ABńˇ5¤NŁéjJ©Ľ•c”:pׯcŠÓçjĘÂöŘf®X9…-Ŕ„ĺ ÎďÝÍşęií×%ň×°zÎe°Ö zt #F(˛?çî­›TÄaş:ş©ôţť¦Ľž…4r»]{ëł~ѲŐ_BŁĺ5‹VđKd4jŠ8(®g°$a"{ďg‹ý¸ľŮs$:Áößî+V}÷Ŕjńďj"Dźáč|úBb8}Ě–$řÄQRcxr˘pꉱ°ďëNâĺJál<ĽT(2sSCÁ2ÂáA•ŠhYR8¤ťö%Ź‘%Q[ Ňyj@šť zdäôÎO¸¶ľÁŇg˙ bKDŚŘßúaţnŽoó¦ëé›*(’"Î&QŢc“ë KŐô-ĺr8g”sDµ8ŰTŮÔ¨3L ÖÓ7•BHĹYS…0ílKuScÎÝž WÖ·" Ąő@3˝ÝpPý·'E„íIů‹íp€ţ@|ˇ‹˛H`Ť81§żŘ&u0B;>cĺ)k}ţĘĎřŢőśobe]«:éúgŰ÷ůů_̆#ôF@˘•ľ(ݏDFن6HksIŠu:KµŽźn 6ďHsý¸ó—Ş endstream endobj 421 0 obj << /Length 1976 /Filter /FlateDecode >> stream xÚÝZÍs۸żűŻ`{˘g$,ľ6ł;“vR;=ěl7ľą90"mqG$]’j6˙}ř@Š)'”ĎÎb€ŹŔĂĂď}SˇÁc@›+ęÇżß]ýđOEN‰Ö\wŃD hĹŕQp—÷á?¶ńS“V×k®hh®?ŢýëŠt˙ŞÇ`řřëŤg*‰±†9¦4XËX&ß{`7eU#+/L»‰I"¤ć~“2ŔÂo2„}ĂÉÁýšQJĂež˘ĽYXűřpÍUXú»ĹUłű‚ó¦ÄńŃźŔTčwÇ8ÔY~ͧť§¦nĹďqŢĘżÜ Őv,"»¬nîŞLĄđŞÍ6nݤL=šEéI_R?ÁłĂęď"M“ŁMźĽţ6U7iBܡh"ŚDJu&Â#ź÷&˛ČHŢîvۙćHË_3vFŁc#€§ÎÚ˝äv´§°´]Ň Ň  C9ţCĹýŚęˇŹdÇáUĚ„·s‡qN”ě–Ě)C"Cq‘°„J>XE{óë¶ś‹ČZRM HŰšŚŚÎćç=“JźÜŹňoGĹ~ [‚™?4*'Á(a‘ľ ‰XAü6,Ž#ăZXČĘ€oB#;"˛agž¨Gۤ!R®đö—^¬ˇđ†ŁşE»ěSW_ď¦,`]»'>싍§îĺSU&űMxÝŰMé‚bă%rÎosŇ‘+H8Ýü.¬v:hCâ:bÄh; Śő~ł…@ĆX×sŔ A´ĺÍŢ:Ξ-PĎ]x¬Ř7s|‘FŘľ+’ŻłĺDF=Ž.8Ď™"„ 5říľé8;ď<-pĎ™ ëmZĄÍçv¤. "ˇŮú7yV×NA3‚¬…Ď:vź9ß``ű·#›އ)bdďáďŚjó mľ™Ď“@Éě‘ňP-xó–”Hq0ßŮó)±¦÷<Č泌9xçíK´ŕ+ Ucůňĺił-“Nzˇ*pŔl¬Q„Ň^čőzVjI¸„EĘ @Y¤č .şIpË‘zŕÍ^TC%ĘŹđbŚFű¸ý—yĽaüYŔ'üŕxm%"„l@éę/÷Đ8›†™?gÍińn×˝ô«âä5’ŔVćÄâ,{`ĎÚs0M*ÍĂ÷J1<»“qש?5kpĚă/¨áŠQ=ÖXŇb%M¤uVĹźÚrČm=)]4,ę¦Úoüę©Ţ€ĐşP¶xUŻ<ëkNĂ˝_řŰ·°5ą<-:–…'w5—¤áŞ{•xi°®t«j¤|v”Az°,,Pg€m!˝…řJČyľW‡ŠzÖňą"L™SĹÄ‘˝+>ć­ÉyhżµJ›}ŐUíMwxŰU÷$šôőwš  ąÔD+9Ę)Ą+ٱŇwÜ„ms1«{ĘP. î«:őDŻa˝`0)«9™~K˙îČş©Í.žş@C»@ăř ş./Î, ˇÓňŔ§˛ŇşŰ5R7ćî®Ő@iaâífĺ¨CńŰÚęęÝÝŐŻśBXéú]*‚fu“_ݤAďŔ¤úŕs»2Xd2nß.řpőolžAh@4×X‡@±áŢ1cĆ7ď|Ż59Y€É0ťsôH|ăÄ·Ř)?Ăr:Ž9(HčJ˛—°č„0ŠXnźç€ÝŰi)^ŔŁCCđ7b‹Cˇ®ŕvŁĘÝ~˝™Ń5(MXW»ŐŰäcüô“o?ÝľQ+0$` Ş ]żąn‡żýă‡"üŤ÷.Š4˝b×kÖ–äoŢ5·§ÄíŠđ‘˝ő/Ćg 1¸~]Ńë@¬QTž qÖ~ą˘Ü…k5nű°·ÝڵŔń‚ř/oŠżhQz%üĺ ě.Ç˙çô÷¦…×Á=‚ř ™Ü‹`»)¶şD=§‘ڍČ[î=^őyĂzŕ8~ÄaýŽ÷="TŻŚfu ¨•§u['IĄbń-¦@0ÝvzŻcdPkq¶‘óŢí¬?őߍNű÷ELp1lSä©„Ćö2&Hˇvę>ˇëgěeń‘©YÄ “Żd/,‚®ťŰsíĺđĺĚcđĄŕűšĆr„¦ [(-ˇĄ»€i0+1bťľGZťËZ}ë“˝¨)ÖÚá/šQJ,Ä5f±Ěž› ŕâ( Ň^ŠňśŹYźFy1DS”•&ÜčË ¬"bµ8eó˝PžSŕQ.˙ZJ_Ôk) ´ťŻ˘ĄŢţięöĺŕMńś­_ ˇ€?˙öC¸›l}µ^WíI‰ă/UV4 ĽĎăÇôťSŇ.?P·^/7„ăf2üqŚÜľˇţµq-îbá|t_µYxő.ÖÍT˝śÉŘE’3$‚z ¨öiiâ]=š»űŻڦuŚÓKź‹ă‹%ź^žZ"áőKľţĽ„G/†"R›—| { ˙5ŃqŕĎs’NU˙Ioü_rĆż¸˛jx#Á$|7Éőč×VPę˙Čý3® endstream endobj 429 0 obj << /Length 2099 /Filter /FlateDecode >> stream xÚĺYKsăĆľóW |"«ČńĽŢŘUÎĆV­+qb[‡Ti÷‘ hĐ»ú÷îy„I„+‡$ fzzľ~Lcć#Nnś\Ěţz9űúGˇ…ŚÂ$ąĽI¨ćQ’(I!<ąÜ$Wó}“oëŇ˟@%#Ť—¦ ŞśUVf†rĆ 5BP+ĽâŚ jd˛bi)ü$… ÓĎC8‰ŐmrüúëĹ,ąZŚńüűíö·ýőmµ z^îďęwMVĄMYu–~ZŐ×?lŽÍŔÉŠÂaň¦ęŽŚoFS#ŠÁ‚ĚÄ{,°źL°ěĚ&1Măô‹ˇ’LG ĐDZŹ…Gçş.ď¬ň˛SŽЉ֊i´P`­BŘhŻăňc¶XqĘ滴ا[ۦó¬hŞ{ß}ľuŤ& ¶+úIJ†5”AŠ"*Z·ÖMÚdu\.m<Ľń=y)‹mŔ–MVl˛Ť—kJß{pîk5Á^Î%:YČWnüb€Ĺ ™×»t»őÍlAÄüKşhŢm-Ű™ąÔ?ÖŰ´®«˛ÜŮW<Żófďś+ĹŘüűő:«k?fą™Qݺ½~^ͬϠŔB©F‚‰D‚‰B«d˝›]}ŔÉĆ~‚ŠÇ`źv’»„…„˛ó¶Éoł_|ůod`¶Ż/1&A™@*¸éذú Ăw#^˛r˝rčL0OéŔ EâúP€Ú*89GEÉÄ9{Z˙˘=Žâ †0q­G¨8|ŕX×ůâŮŽ_/Bm@ŁĽ!¬Bi¸Mďľ ßb;Żó =îđßcAĹ|ÍÖláZß|ëźv˙¸ˇ{µ-˛¤°CČśŮí´<ôóĄXJ·ĹbyóćÁYŕ1âG®“‘1ă=Ř‚†Śeěu‚ ě$úŇŘÓŤA{H§’a9ÄÍy}§ŹöXßéJ@™·Ç] •ŚÄCć_â7í»~káŹ^»_2Uč•rF*D±yiŇ|ţCMw͢l|ă]ý·˛ČlŇ'ŚőÝa“nJ˙üW‡;üsöĹÎh†¦,żzO/ľ˛>ĎÜÜr3MÂŤvw?b‚ )§I88cRnLE°[çžČĂŃúV1§>:‰UśÁťÍ Zuőh%˙p’ˇŁQö …‹ŚjCárĘ8ÎPű)cc Ť˛o(’5ž&˘ŽxÚśl¨ ŻÝŔ/ ńhŘ}Ëá|˘ů4!Ć qvBŮ’žmůhŘ=Ë9 ´™$ćÜÄ•>y/Ź˝a=0>éÇŁď;>ᆩłŽăçčhaHd¸>çjr†Šp»łňrĂ9…čŢî,ǡ°IGÁEe ‰EKŔŤˇßţy¸Ëűmçž[Vő“ ”%Ú8ě‹ČG"S¨%ROK"»­lđń4ň ŮWEr4¨mÜĄy¸@(ÍÇVCx o‘]E×t0„üň—(ŇqÔŐzáÍ Čv8 ‘ű!0¶P±(ńahËHDt^ż;‡–Ł4Ńw5i„y‹&şŇo9cŻđÍÝľńť®Zgúˇ÷ÓŞnúľÇ.ô cčŰ{xěň‰xÜg„đî‡ň^Fj´Ĺ(Äüq24"ĄĹ4d&…Ś5ZźČfľ`éŢ‘ÁV:aÔ9G†3TDJ@1 gźÎŃaŘ[ş–ŻCŠPKŠ(ör&Ťt‰´>qŽËńLĂ“őŽĆÓ0™ă˝×ěwĹČ+@Ä~yč‰ŕÁń"<埀ŃŢëŔęµvgI6—Ź-öXôĂ[fąčĆnBçŹö\ßůpLŃôµ˛źÁ© «˙cNvĽ»űł¤‘”Sđ”÷ło8Mv*7ŹăQ c<ľ-ÁLb‹eŻŚ´E> stream xÚÝZMsŰ6˝ëWpr’f¤ ß›Ú&™d2™4uOŽšH±5µ%—’ëôßw4)вh±šL6(XĽ·űě’bŮEƲ·źOĎß(›p†avú-ăV‚ŕŤŕPf§łělx»Y\­Gç§ď©łČc.öć’©ĐŤ[ßgŔ ăÔ™eHf”âľóD ît6 ¬Vq<Ž–•ůEV˙řůí ;› clřÇr•Ďćůíp>ű4B6ś.ňő»Í<źnVyŔnĎß su2,›pú„"HŘ6úÄË’p…pF8 0ľ0Ĺâpdş1ž;ĐĘ”»mÎAÉj˛†•÷kˇ’´©÷b«ď†ĹjY©Łą‰°,!™pĚŮhăôr±M¸bĂĘ}”nĎ7·ů˛¸wăŮF@Â4ŮqpŕŃYé‚ĆĚŻ$ó˝ěŇ /ÁšĘĘI« \ȲË?m`Ȭzś·©W‘ŞěqwIlťŠB&ŚúO7ńPş’Ć”ĐÄHÜnnn71 ßňŐuüv›‹Ĺ«áß#TĂyŞEm)$ň–®U*żíe]—Ś&ý»Züé×[ks9ŹŔ‰·Bš2 Pąl‚"Ăxt:‚o%H^yć—iľ™ŻÓe\Ň´˘ârňXÇţ_c5Ôą)C祝1cfx[.Ń!J7\ŁS…¶ç3âÉľ[Ćűźżř:]· -m%XiůC› ýr­„ń’ ,×Ĺ|A*«zb«ĘHĄ¶T¦‘‰j?>ŔHń yod‚¤‹ľÁŘřOm-9.v.J:% QDĹ!µVm=qT ¤ př¶}cb¬3[“Jö%Ţ«˙± JĂĆyë4 $'í{[mš#±á? ţăł‘Ź˛Á>bł˝HS6ňČlř˙ŠŤřŘ<ĽĹnő-6$±×§żžĺă”Ů*ÓBŁÔ˙ëőŕěśe3ş÷žRcA©ŕ]čyťˇŁŚÄřqWŮďßbµ@Çş§ą‰‚ˇÜHh2¦€kŚsľţ>˝ľąš§3S]¨ÝS¦nŔ7>§”k— –Q2J™Ć¶…–’<ŔB !T r·…X˙< â% F9%]ű›¸/„±kTFţ‹Ďo["íȢ%ĽčSC}1˝yUTn~\ŁÔŞ«7E‰ę‡Qh^ĽŚí™›±»ó““­ đ!`e9ÓĐUĺĚΞHś©HwŚÉ#9“Q‡Ou¦O†·Z”Á´= ó‹ő&ÔˇuĎűäągw÷Tęl«€É#)WY ´ń<ŐŮ!ńÜňv,˙łďÜ×˙ŰAęŃ÷ť—úŢĐůâŽ$tE“jűT×ß].č4 —ËŐ¦úú×Ő2¸ľîň¤P †^łUl?ĺ‹eX ýů÷Mű ±żűě ą|‚GŻfý­łÇÓ i:@E—¸?-)OPe&ęqŃĆć<=Á+.ť¤\d,óúŕ˘8ÓJĹKůdĄÄďŠýbz­tvNę_Ę<ëG+T°K[ÔČ›üvľCťgMSá¤>čÉř!6*T¨^`˘xĎâ-Ý/;$uááWĹ*)żT´˙Ƨ/_ endstream endobj 444 0 obj << /Length 1767 /Filter /FlateDecode >> stream xÚŐY[oŰ6~÷Żň$5Ë‹H‰-6 ëÚ`}–čCš٦ma¶äIJŇţűŢdɲ+6 ě!I“ç~ĎÇŕ`ŕŕz„Ý÷·ŰŃŰĎ#!(nA,g<ś Fep;îÂŹ«t[«r<ˇ‡ÉřţöË#řżr´§7׎h„â$&š(&‘D a–ŢŤš弲„ś(手uGx Ü‘‘řw‚1??äł:+ňĘŠĽSNţrL’đ¨Iν”#Ęd#Ŕ >TU¶ĚŻ×Ĺ4]w˝d:‚e@0’XzŰ{¤·Ň´Ţ~N:{ě¶š-Öß0ÇöÁ˘}&N¤Ôź)Őě aś‰ß´ÝĹY#cł‰a†¸lď ç˘meÖf0a’!&(#,Kâv•y×9Bv¶JÝňT)·T—i^-TYŞą;Q;Ú¦łŇĄ˛‹[ ‘FbáEľůřu >4ʵ¶2 QŘ(gĚÂF`ŞG.Dţ¨-ßÔŘßIZŻ”‹;sv<+6Ű"Wyí6‹."<Š{>ę ¨Ł7Ö…%ą4î·ăG˙i™ĄÓµrź˛zµ'`•nÜ(‡Qe4}şý;ŇÄ!7|m"ŽHĚ6Ł»{Ěá§/˝ ś÷d6n"AđX[Źţ˛uĚ$‘Tˇc‰@ RŢ'ů§ďéf»V}ĆŚBň ů Îác#<¤¸¤Ďр҅$äÁ>Np9‡„‚A¶łřy ¶—â ^ …:€Ä®XqĐ®S˝ôÂÍőWK  …p©˛L·żşbŞĎuĘa{ÁTá Ő[Ţýbż ¦˛™IÚýŤĽ±ßiw™şĺYw™ŮŹ®TďßďřcJújÖ ŇĆ1­Úw Đř'9Kűëe¸cšŰfşsöF3Ńl ŞćďúuĐb¸}C$Q_Ä G vtg•¸JŻ\ş]M›ŃěĘîźŃl°X}Íbڍ ?'yXĚP%ŻMž»ôÍôÍěţ"Ů1\ďľéx‚ô — AP"»Aá łŻÄěĺp,P_'hŐ'gݵçĐhÄ€>WśŐwśAÂunšNř Q y·uëB3O kß4řŚGnw=}ŹőŃÚ˘Ar°„Ő¬8•~Őâ@sü»Z¤ëú"ĐŤž Ý:’h)Ć$t‚r$‚1kŔÜí×9FDřP©˛Ř6&챇؂šűÂÓ,ą“]„'[žPŃ@<Ů@<ąń`Ďô‡ýáăŞĚܱ/Ę„ ěŞ wĚA€qJ»ĎaB@7ĆŮdXe<˛oSĺ:X$A |bAźĂlóÍ×檧Ő ľÄ˝Ę.>­˛ŮĘ®§Ą˛kY^«|n”eŘ`uŞě6·+ “°¤Ć„‡ß·Ą‚ÎŔs›iÓcş|(S—K°Ń9Ś&bhöĂ䢌Ŕ7|;ł3A6 ‚wmPí€l&Ż€ţmü«{‘óůá`fÜ˙ĚóîEoWPÁAĐ&yÖŞ'†>ďđp¦ăăQ[ŇŁ\ĄWžÚyýŕńń ý˛ü°Ü ôâ$ăÂU"öž"0g$÷ĚjZJ)Ľ{ŃłRŐĄÎ=Iýš}[Đc‹ěő¨ö,˛×ŁćáÁN Đw”ŞzQč4“~q9¨„.°‰/í`+ŹÍ=4ąí%3Šë.ÇNqîÂÉľC$¤k{‘Q@˝—Ń`ŰëHL—\3µ­-ëyÔ«˘r‚´ĚFěͦ9Đh O c†hL÷äz‚šĄĽ$G r„űz„ă¨O/ç’ŕŤ¶XÁUčĘ‘ľóŞVé*'•2ü K‘!”ec0˝ˇ˛ßvŞĺî§c\ĚDOĎvÁ›P„X§Yîx¦ąf÷ĂNÚî‚©w—µ{Ŕ65Šö2î3 DMüŠÜ?ĐđŹ#ŞC[HNUŠîNq{ĺEZeóU›mýĂ×YUŰQćżf3;TĄµ˝?Ł0=NÁV‚"¶9l¨Ö2h"~˘¦źśŰłą««©ý8 웨]QůŇżU˙|j\oďÂÝŮťěć đ”ŰŻ~ÍEµy¬=¬ší¦jP9% Ąę"O§ú).ăźN_Áş‡an˛_BcĎc3Hx! z(? ÎťA Ü9üçĽ1 wpB_űĆЬ˙Ëę+ŚŰůf÷ż#°``&‚V1˛6¤˛X@˙eňŔT endstream endobj 455 0 obj << /Length 2516 /Filter /FlateDecode >> stream xÚÍ[Ksă6ľűWp}’Şd,ŢŹ™J[ÉnMfŞ’MśÉÁă,Ń’6©•čqüď·ń E ”,Z,Í\A¨Ůýő‡FŁAăd–ŕä_W˙¸˝úű?…N2 “äö1ˇš#FI˘$A†đävšÜ žŠĹr;Ľżý ł„`d°ńŁ)C‚€(7Śa;ć á?Ţ^ý÷Ę>ĉ•‡‰˘qI“Éęęî'SxöS‚3:yv#Wv4ĽZd™üvőď+Ś Űý m’Í,ivüŚŕ&1ČH*­Z$jx'•çÜlĽţŢ«ç~WJqë 0ą»T ~^‹<ű5ť oČ ßL˙XóŇÇńÓ˛Ř~Áݨ©ë±CŠíČwmŇÉîůŘ_Ţ}篞Űäß"÷A­×ělĹUŤ'o6ö 8V`ŐAÄaä GŘö…#@öĐ즡{Ňěfţ″µ#ŃŮŚ i@”¸K1E„}c–îáŻFž˘{řëţU«úvGq ľôínFŚ„âHň ŃW*Ť(Ő§ďťgč}ßDěŚ] ż¤Hę~(%˘ęíD<'Žv7#FB`¸’ Q@ćBľ7¶łîˇ‰ďgűżóí(~öÎŢ΀Ç>c)%{a/§ÉŢŮ{ZílFŚ¤Źš^Š˝ #Žő·Í¦M M=Oí—§ťˇŤ˝)¦–ýđ´â|8ěÜlňMç÷ěĎ,ÎüMľ.,ró»­Ăěë¬\l¤…†\Š}X"IÇ˙Kě|c§ÚQ°ŤşŻeŞ˝GÚÎî‰<,|#za°0´jađmžűĆjś˝„Ř»™=­ŕY±ő]Źů&4ž˛‰uĺafwW:¶[™Ë°Zh cľ«ĺHŤtߌë[ŚşTsŃ ŰF’]„mť•Žíá·!Wińv•°ÇÇŻD (@ĂJĽY(!ś #>şµá±Q, ]Ł@łäW śĘŻÜÎŕ[&ńÎĄî®ěť¦ŰĹ,K§ţ®Čýuű´^盢ůĂđ‹gkľ•»Y8^ú»ńfHô(ĺéd»f‹!péëŕXŤýĺëĐq1~X¦ľ–Đ#K<°ő†0€8T`ňÇá çrPĚSßş®|í ­!ěľ——µĎRţ˝Śňő"‚5!T¦ŞűX&5¬”†7ÚčÁ‡,Ň`ąĚ­ Ď‹lSŤ›ŇŢÍ‹1ÉłbSĂaFĄöîŻńj˝,E5GmÝcËąŞ Č/›EVü°Ä·Î?-vhX}„)Í€wSfĽú”I!‡śaă¦íQŕ‹đhĎw¶ëáĹŹ©~Ţđ^‹Öb&†·_ÓM›’`+)ĘaĎóĹdî_PŚ˙´úĄA9˙ľĺSşm{›-ŹăĘcó¶ ŽzFuc;MZE”T#ĆŮ´Őp bŞâűôU1óńÂd9ŢßpB‘˘Ć{[);_”ÖŃp÷6ů˘T ¨żµŞąň2Lý=¸Ď9š ÷SbgŁ˝ÝÂÜ+UźÎN°¶?ĚÚ¬Ą’ MŞůV-Î~a†É¶ż6ĺąŕgůMůű·auşŁ÷~pµPGţäćDxŻ3ưÁÓÖ†3۲áŚ[+%Żóq6Ký˝'0 ŘAq·ót[ ڤѰ w¦i‘nV‹,­ř†§ş“łCKZ‡aÎrŻĂîňµbónf»{?7ˇ±¶óŢ 7O[K? }Ú$¦é7뿌7ăĺ2]¶! ůS•+'ů ň…)ŠÓ€°ÖpYH8˛pÍ‘V¬Z¸v2$ęZŞó„„eśs˛Ä9Ëř"J%=™;+ˇ9CD©¬Pđ>˛InĎA©ýĹ&l¶·ÍŤ]}ť­2ĚS BÝ5ŽŤĆ cÎ2šŔs ;mWˇĄ·z™Ol‚cŤČŔśrS3´r·CvÁĚÝ×OáşLłĐú®‹÷G člG3öh•÷3VĚ@gÓĺźŇlVĚ8ü™ÝuŚÍ„ĺë~<δBR•ëěbŐ4ň®˛íŽÜ˙ ÍÓ…őřl^ŚšžÓbŢěłŃ4]ŰŚŮ•:ŽaŇŮ eĎ+{r˝‚Ô·(Ť ĎĽ˝füÜ^3ž<ń8†NgÓbt`!$Ş'ĆHćRVĎçVľ\Q€$×ÁękGŹkËp‚{íÇÚőľĘŽÎĘÇös»-býŘ/lĘň®Çʸ)}óű@‰ý˘źËNmăĂÖgŠŤ â3żĆĘäó<ťm‹áa~Ű|< 6éÉ2f.÷–ŮsZý*äČ»ČJ `ŽŃĄł11ÔÚőD ËZŘŤ[ţşż3V¶NLč~Ô†¬Óđđ­Ě§ÖYî|‹Â¨qk]őÜěšž0Ç;«[ŹíYUONĂĚ%»>JłăK˙§ÓxŮYżČDŞ5âĽSCfÁÁ[LŞl?ćĽîjĹ–){ÔCű±Lc„•Ůßôąrď˛ćµ27műî­ÝÎÎJĆvJ›GŐŹťR#Bym‹˛3îÚm ­=nÎŻO"jwc3…=ăčÉťB""M«™źď>B®iÍĽßeöA ňőnĎrgGŮŃ÷ŁćłAélQ ÇHŇž|Ď9¬¶ě (´(ô­ t¶(…jŘôÄ›‚}Ö ¶ĺ ¤ßىt¶'†„Ŕ•ôňĄĄŘ†"i6}LóÎŻmѶTźS‰:CD¨ËY ⸄Ó”©Ë˝ŕ‡¬q š¶ă! G"{ż`L7ŰÂWö'n1rĎóCUK˝;Ă9ĺ¤C!Âwĺ˙q83řĎ“ĄäYPd KáĘn‡·ź ™­ŽMV/¶(Đö‘=,>ZÖOW@â6‡ĄáőĘ˝+ű2ąÄŃzy?ěŐţl®¶ ©¤ŕܡ y™öYYŞ·m‹%Ľ›q5/Á¬l\„Qőµ˝·ç»m|aö+›×ŽNÔŃŁ 1GŹN „kőÚщAŚŃŁG'VLş+Š[ŰV‹L¨Ž3|án'úr}yjc†bÍ’|ŁÜX< ÷,t‡#ß ĺ{_÷i ó5Ăőt+,ĂGËÄ($iÎŰFÜŁĘb(AqźŰűŹÂŤŢĚ(q©Ĺ^Ĺ> "DžűÎQ*Á ČóĘđçČ(Ő ⫼Ě÷4"‘2ô­ßÓřw¤ŔçhŰŔEYćsőĐi±Wde°V˙¬*„Şç/pşű ¦<íĺ# /ŇLµ|\Ű Ĺč$ڧî;¦yüőłíú˙-Ln:[c„m’).ÄiĚ‘Öoćt•2X||Ú°sDŤđýq°;8A\yý¦ t endstream endobj 460 0 obj << /Length 426 /Filter /FlateDecode >> stream xÚ­SËNÂPÝ÷+fYç>¦íĹŕÂřH\ůč]‹ĐDCü{çöyĐEs§3§çÎś9%čÁUt–GÇ—śAŠ.%ů čĚ˘Ń ŇDˇSň:ńÇ´|ť4ókP„Ž\@k¬„Ş‚ĺ1Őäyôů"çĂÔ0¤ZŁM4<˘Î#A!µk 4.Y…x´\Í Żp݆­‡.щżÔ >Fť Iˇşş(Ýá¤|NZŤ#Ö÷»Ť#—˝ţ4Ľ·Ăaą‚YYLű+%ŁęRŃý(©´le V˛UL´.Š(Ę”îAA(éęáĚÁ¸«‰»«˛)‹äęĹöžF§agŐws–Šđ{BˇSIq3.‡ÓsQŰË ¦ ÓŕSöP«8î>/ ýVŰĚ…oµB·Ú:D‚TËč¤né·7m±—˝E]ŰKℊ˙Ǭ¤Q™mfť•^ÍUCÚŘřdĐĘĆ…Ů`ĚćÜݴűO¶.N– »Ăô]´ńŽEĘvShtâí]L!MpÝ„%·‹ÁZŤšXâú®˝;?żqď1â endstream endobj 465 0 obj << /Length 2273 /Filter /FlateDecode >> stream xÚ•XK“Ű6ľűWčHUEÉÉIÖÎl­+)ŻR{pR)J‚$ÖR¤Â‡ÇŢ_żÝh€$8O|P ŔFăë××ä›Ë†oŢľâî˙‡ý«oßhľ‘ś%‰Ô›ýy“&L+˝I´`Jć›ýió!úńZÜ{ÓnwRó(ßţ±˙ç+ÎřĆ˙ÚËfţřţ­ł4K ĺ›]śłL(’÷źm˘#s y?5[ÁŁÇşjŠSG˛ťv Emg9Ď˝­XL2öW›ż}“ĺó=ŽISŘj7ýÔ\ÚJ‹3Ć…đ;›»i‹ľljP*IŁkŃŃŕ`Ś›zlËľ÷‡Ďôżż67żő‡Ö RĚŁo`"QY›öŢ ÜúB{ ú«‡ŰÁâ ăćŚ˙YÔmE4\.¦C-,›]’˛,Ë6;ˇŽť1ÎmsĂ7Dô®řDź›¶Ć3“8:7-Í}Ü Ŕ¸íÜ•DÄYšŇN´x$BçL$ąä·ľ¬ş5ܤ`’ŹłíNĹ*zčIty»Wćf꾣çSł•Ú× ýÎą¬ Ť§K=–ýµ¬×”€·iĺîń×˙±v„NŔ3¤D‹Ń5RHל<#—L‰d¶‹{oőo˘ŤŠjX%Ŕy>Ö«ľĚ3ą†§Ęﲅ ´w×a ±`Ş4f10ÍG E„EiáŻs*zvů{©_–±| ’sQu« * Lu̶ş<–ť*•@‘x¨ń ‡;đfëŹĆjÚ¬!iâ×ĺ v±y€óŚ5ťR–čŃ-KwďC3Ô¶˛§Ŕ—Ż ]ś/DŻÉpŔ2’˙ý‘óŇꎎMÝ[K"ü’™VuâRę`ynC[maŽB@Śł@śŢHŁŞčmÇc…;ĄšřyčP&=ˇZ€I7ŃƱ‘˝é\XĎĂGż;öeA?™îŘ–łL_Ž,¸äşćiş–ňdžáéÜ­Ł! Ë5R*âS8Űő q—u°3‰.Us(*We·î€qĚň\. ÍźďÜ)+0BRŹ'–;ÔĐąĐ` 78ŹšÜHéŇuXJk¦@\pů)|‘ fiôăL§îB·cC­5Ôř4 8{Ź9Ń<"çŢYmjb´UżD‡hŢĆNěl?€O©l ßoď˙µÚRÍŠăy-ťčŐĚMY˘ÔśőAzú±sPfaľhŞľp8Üś«$(÷;)óç’Ą„‹MŐňßŕí•ůyż˙ő˝ůk0Ř<Żć©<8ÔWÝđá—ďH‘ĺ«lů‚„-Rʵ6ŔާˇÎ5ph ţ)>`ŕ[ť¶.*W·łš>b Ń{i‹Űşů!–•:ľgş= ťéĺ3€ół—š=)­^|Ć7;H™çAşíHUsGĎ-\;áčĹ;ʀɫxú<ł~Ž·ĄÖqĆ„.%ćLę‚jüRîş{ś¦Ş¨,ډsLę>·¶no7Üď 6jlÁ/CÄvŕČÂ"«×Üő!·âÓľĽ™/2SŕŁ2]dˇ¬bk•×yĺ¶ ~Ú ż×8:PÚbSóB óÄqá`čż …ş©k뀗-ěďgĐąÓ ÂÚełţq@Á’©g«×ěĄY<}?°dęs;;Ó wgÂs˙ŚľĐA±T'_Ô úč^8k}ę|ŃäHްjfĆ\çôšýźi›Ő˘íżĽ-TIˇ1ăęEMƢuËZ_ű|­ú%t¦˙f٠۬´lđÁF(ۧč†ŕ–µ—éĎAŞäJQeíđ‘sVa‰ÉŮňeę;l4®[)·őßGĆëDľK ź<µM¸>t{kÎPńëăú'ç Z™§%÷ÝöOT†hĎ‚¶3fŃ÷k`×AëŽÔűŰŻđL0¤W|^ČP*ă,‘›1qCMťQŃşBńő *K|‚‚Ń5ţŘşééŘĹç<$Ikž¨2ÁÄô‘ćůîmçw÷źYď…čžśN@«Rüň5s_T” 6ýc˙ę˙Ď.ł7 endstream endobj 477 0 obj << /Length 2615 /Filter /FlateDecode >> stream xÚĹZKsŰČľëW | X%Žç `Ľ•văuy«RŮŘĘćŕÝDIÔ’€–üďÓ=AJ4UĘAĄÁóLK“‘ůş1c’”(ˇĂ4 ]†]ŞĆď3Żpهr]ĺž—ŤáyÇOŢz^kăůĎ3Çݢ)ç’¤JöQ•Ł, ’4°2ŰŐëQU*lfUő(%F2° ?çaiÚ§)=ë5pŻh\mŠÖµś¨ˇ1[™Ůź~t1kLýu§7ő_&JĹŤ_RüN)źĺ­!NiB(E›ČÂm{‡d­ă&ßř–Y ĽfÖşo´ üźĎV…Á!·ÝÜő.@nx˝•E–Ą:aü˝ňŠâ$ĺ˘Sô;ßó<š¶-ĘĄűhç;€kmkł0µ)gŁ&9ĺBÄÓľ-†~ó~5a1HnQ ÜĆd‹Î—§Š6Ć8_$4rxŕző;>}¸‰ľY¬ 8vĎ}%6Aă¶c_i"žăNiÖŮ”s^ŘMĘIÎŇ_ŤĘ'e:EőăĚ‘Ş2„ĽSUF¬ť‰$!R ‚Ϣ®6ŽŁIĎ Ѣ Ővt?0Y–vĽY{ľywóßTŤ0VT” Š%Źf››/Đhcż€ř…΢;s‘)%*ĹuëčóÍż\l.5Ń O\ěQ‹eDJwß?ć›íÚď Y€°DĎÖ=öSË>¸(Ę4âDâ†HIv ‰Ŕ„LŞőy â´R§ą¸‚F`qÎv‰wÓőý:>}ѵŠđËlę4˝Ě·óţŚËKď°Ăůł‚€©âÝ_'¶ůfŐ¶ŰćÝdĘâ·oP›6ßšÖlFJ/ßĺÜ<’U»Yżůá‡aä8Áy=Óë¤}±¨ŽĄM)aYöJҦ‚¤©ú^qצaAŢ.|Ł\ó9ĆâIPk`P}!_, #«,#\Ľ’E+ „_#bŇěf3”¬išáĺç?!üçé%Z8- ňďđ¬w#ˇ˝cüâ]ŹOđľđZşORĚśß«üŹÍŹxŘ»ZĆnÝî]˵,Ěp ?·5ŔŚţJ» —»•ŇŻdńËŐĹ‚=Ö O‘ĽŚQ)ÓžgTďz̸¤D2ţJFŔWk}EDáçöOU‰ »Ěۢ*{±üÖçÖÇÇÇ7Că{ąą4ŹÂ1Şô•"8ˇR^Ł—ń ŕX†  <ĺ/âŤ8ĎôŕÎt‚ó‹·=ćśJ őZÚ§p%â%c<·1ŢÔ5ŐKB<.z[şXśG‘šĄ_Ä–¤Nŕ š='˛_ľë1ăµĹ¨kî`×Đl¤)IdvÍ}ô ţNŹäy Rr©ęßéU8·Ő OL¦D€QY5Ôa:ˤ}C >Ă(ĄńżmĄ ËkŰz²«MöWqb\nĘ&©äĂâ×o]mĺ Đt˛”; T¦Î4;,ÜqĆΗaĄ$šwu“`¶G•HI2uXŃjńąYLŤs@}ľ>ť“—Ťk†â+‹»%#őHčíŐ#]W†lqv1s?PúWÄfµ;ׂpΞS[Dµk}xĆg—쬙°±rÝ­«wI†Ö8¨1Cf]…JmîëąeŐ®\>–¦őµÚĂ·•ôĂ2ďP€8ÇŻyIě »j/¤3-Ň‘€,őDˇ±·űY4cRNಮ’§KŹŚ– *ů@tPľ‡ž}ů>\ŃÍn»­ăç´•űď‹á{¦ł®ŽŁĂŤô‚ě&śĆS§.Ć71ÖÍP¶Î ‚„7ů·N®qŞďČuݵÝűyy(ćNŹ´ÜéŃ~Ž5ĺk"˙,‘ĽPŕ(E!±ôízÜQˇçPwĐoEÝ~\ĂÝ@ĺúďOľ×čýëÇ×|ôń‘ÜĎ)ňQJŠdťŁ}6-Í_=/ c„uĆîébř‰A>ëj༣ď»ÉTP¶›4([HM¸ĘúĘţőDô„ M˛ýűŚó÷)çÂ)_Ď@ËčÎcĹz,ŞRŚP,ŤßŘgĂ7·ţ ŁLÍnRÔ§˘p)K¶l#őXŃÄ×9(R˘Ě;© 1›Á%Ŕµ­ a9ÝŐµ} Äź', lĚ;č}TŇ™ ™ĐWi?eÜoôŐ2®‰bz [”ęÖžü´n§"Ă|9°©ţ)v“1í‚jA®#ÚusN©O–ŚőA"Śoŕ“äóźIé¬T Ŕçłjł1ö)HËxmrŚ…_]‚qĺ Ő‹0Ő¦-č/l˘‚Ž4ŕFÎb®´…uOnůîN5•Ě>W&‹Ťń ŻÖ5]D„˝ď=—ĄAĂÍëo^c”ę…Óúf«Ľ\úđX´·îmĚ%Áčˇü4?ŕ!«úO71Żýk8.jšťĺ ÚE»ňˇw퇫­©óđÎŮÇ–ýOtUĚü|—M á˛‰‹ÉnŻűµou,Wŕ~łvíNGűjö©¬S‹QŘdă>z€ˇÁ#2,ÝŕŇ”ŔęÚ}¸çfáńJ¶mĐŽ%ăÝvćŔ¬QÁg@7"ÎÝ?wÖ[O-l¨.Ü’öűřd 4 ¸čgĂyX<­Úě keذÚR"9Ôö#ž>O{ŮŃTî˙8žć<çËžŔÓűŇ${ Pkűđ8Š%!"ź‚8”‘$» T9yjn댇ů´ăá9X+3çjµ$ȡ€~ôoÄ»'ĐVB céąűÄ9$Ťň9śaŐaŃŮ)¬…•&’=Xv}Řbü\i4‘‚V‰đVťłź±÷ĐÄ`ě$|föâůđYš\źáęw |†»ľNÓNÉ­Ní±Ađg4\Á5»A­žÇÍ\âďݲţʇ†?ľ|wó?Ďě˙˝ endstream endobj 485 0 obj << /Length 1649 /Filter /FlateDecode >> stream xÚŐYYoŰF~ׯ üDŐzďŁE ¤Fâ:H‘6Ú9Z˘ŽVU’Jâß!w—‡E9ˇ©č!r9;3űÍěě7k,\ްűýe::&p@1’’Š`ş”D‚‰@ ‚5ÁtĽ /VŃ.ŹÓń„ <~?}>Âţ/]Í×W—N+GJ+RhĹÁ„¤ ł ˙Fé:ŮgVi’ŻĽţĹ~;Ë×É6łfś§ĄBÂă’:…Bz§`DľÂ­ŕí„`ŚĂgëMě ďâ4:fŽ #„7G˘ĚÔćz|‘,éŻÓß^´Ś| B‚M– 6C“ń˘B×ů3Ý’±Ź ZŠx«ď°ŔVš`Ů)&˝řPŮF7q—b.6ĘK‚BbĄ 2 —B 3$@ľ–Â>š~FaÖ40a†!f$,R)mULW묝ömąáë8vCymłEś¦ńÜÍH“ű´‹f˙DK·.Ů2K!§Ş xuń×&<©×eň­Z\ ?8Ë%$‰ &–ÎMËkĹš^+Îŕăđă0Ns'©ßĺ! 1Ĺ˝˝Ë'żw9E%”zˇM˛|‡1Ýt†a¤Ąčv[)×k/'ÖÍ"‘]ÇUn‡˘Ý.ŽŇjQn? *‡jwĘ×l•ě7s+s;üATi‹ź°×%\*ĽMöEMP2śí!¬ŰÜĎ×c¦ń,OŇ۱ Č  ÇV8.ŕýśÇŰĚŻÂda?9ĎŘís;V{¨Â›}ćFŻ;!¤Z!B+ żC°ÂΨhD´ŞSe´ńް„˝´býRŢ/ŘçÎ1Ö‘„ÍAb„¶ÓĚ&ńłI9Ĺ$Śü'€ĘM¶ţaqg^…i Ałx—{ya\Ďlc݉A¸®HGcPOyµąüĘŇx·‰f円·ëŰ. ’!cVůͦÓCšňfL %!&©c…Śu@ !˛?đÎźŻ_ۇ 2x^o»«2A´¶˝Ď×›ě|žĚΗѮŔ„h–e]NE‡W ÷˝µňiµž­ě#ěű0‹\ŚćŰ,.jbRIąÓ5ʞ<.k×čétô切N:ěs, *ÝŚŢľÇÁľ=‡‰A=ţTJŢÄ($T1oĽýa9ŕčI*Ë++p§ŐÓϺÌBäĄyĺ–÷Şôž‚a}ź`%Č@tîjDCÔÉÎ ¨E/ąWĄG˝˘Ă»ˇ4âT÷PQó«k’bŕŐeG¨K?Á_M&®|CR˙ě¨Q1ŻĹpš– * ž2MJ’Rľžĺéú#lPR gv¬ŕ?Ţ!\ÇÜôŁ•g´˝q9„VJÄ{$hČɇ"Yô~řÉţ2öAśĹޢ(8u=TÇHŔy‹ą‰C@&KMĺ|oˇÎsŠ„|¬ŽIü‰4`wťnő^ý!€ŔF%VŹ ’ořë6ĘW¨˘8ĆCΆN÷ĆĄFZë!gäŢ !a{?" ©ÜLT»¶ŕ>ľ”ú:ZJüť őĆça[›‰S4„ĂÁJÝ9+ÎąłămF»‡®CÍ#ŹÔĂ«HÉokWďOť }1:DčDq=wЎŔçOw„ńâVžßŢ—)˝8\ÖJ3¬š ĐQąśqĐÜĂ5ř3`Eľßţwh›™"»€Npd|Éx‹ąAH˙sOĺ endstream endobj 497 0 obj << /Length 2578 /Filter /FlateDecode >> stream xÚÍZëoŰF˙îż‚pżHµŮ7ąí]k.vS´@šh'hŠ’yˇH•¤’ř®÷żßě)R¶őpl®–Ëٙ߰W˙sŻýóÝŐ™w3!ăŃĎáőXŃQüÇoU‘dóË1Ł0Şň˘|“U§÷ň’`Ő{ żłŚ!+pĐYc‡µŔŔJÆaaLFš‹÷X`ű4Á˛ó8ĺÓúńlh$óë@4¸·”$ňe{ž­˛¨Jň¬~˘­…ŽĘ&L1Ä´¨Ź° ,‰ëű¤O¨ŔŁšýuşé»8vSUfĺ,.Šxęž(ň…-Ăčc8Ź-Dzk)„#âËšĺwŻ~Ă˙2*F‘4FeÔĚr †ä{Ç•˝÷¦˛űqµ*2Çiu;nŠdᆳ1ÁÖH’‡kéňŮĆ#IVĹc"Fó¸¨őו Dئ»ěÍŠľĐ^Jc+ő^öú󀂥¶Cá$k "’ Y/»6hqp€Š".ś—˝6ó1°ľÖôžĽX„•AúěőőŮźg}đ]H0áI®PxŃâěćö¦pë'đ"›~6 Q>ľ~,ő~;űŐP“BJRi óbLZ8p>öúK¸X¦qcAHµÇÎć}ĂĽ|čc40`˘Ŕ 7)€±‘CHÔL0Wů8+·sqŤš j}ëů$ÖAS€tť(Ş'Ţ] ¨ZEŘ~!&ťaÎĂĺ÷.Čëç:aą=a˝€Ţ×ń„ŚęŰDWłÄÎ%aŞ—čiBMü37ő軍se› u°ěŘ`űΠőq§ č.ŞŰŽ*R^źQçôö?˙× L×Ń4Żě »Ý[§őmqK·=éo»AČyß[¤vł‡”P |rŁBŁaR”ŕ  q v5 ˇň śCň„E7îę´ ˛8.MÚU3…IŐ$]l‡”ëŹ>éS4.Ęćü¬rwJRŐŢ‘@fˇT“žüΡ;ľ:śq1!ęeöl,O!‰gŚa{DYKDö–§2ůdnŘ|“-W•Í莑JŇg§’ŔŇ'ÍJä’5'ŰÓI8—„lh„Ĺ|p#Čśy*Ą„ś\q~Ś”RŐ)%$Uś±uF9Ŕ›„Đ*·‚,; LńGůÝżěŕî_Ř!Ď;ęČ×NÝdťUUĽXVĄe Ů\óUÚqh/ec =\á|“kóÚ(h Ý´őó}ÝŹ'Ě÷GQŮÁ]lŻENő(Đą(Čç< ČuL'@ś’!ëfҢ˛Éąo6CÁ7C0^2úáŐ[ĺwt“,‡enŻ:µŐ×Ęý^ůtĹ–y“Q›ŐáÂŤćEľZÚaâ„®îĂĘá/xČş-étOlŢŻM\y˙]ˇóé ĐÉčˇM"PeŁ7:0ľKčő‚8Ęł©ťÔY®ťu·ýŃŞÔ[š…Ë8JŢcLărDf$ĐS¦\hß*âr•V6ŁŚaĆQI•…ÉîĄeě<ć¬Lˇ»‚µë¦ôjŞ#Ŕ€!BɰƉÎu…o˙®Żr„:2é#ÉýŤB‹@ Đüľ\™đű}<č˝T›aC@űĺŔ.D!ş^dĘL‚.˸X¬Şş$#ÎJ4„kXÁµÇòp[!’Ŕ9Ű8Ă[ xĄ‰Ř(^šňF`q[| ‚C6H6ůŚÂ4Ť§HëTŮ*Ů ™Ô^Ľ«˝§KçđŁ9r˛Vá<X č‘ +9ŕP y2Xúp51¨.)‹Y„őTš€ÓöÇg XWĽ®„ţl*dDZz5#"‚NäYź™ö|KH]‰†Ću‰ĺh­–ĹŁbOXąT°¶–Ú҆đmˇKÖ ™ÉŐNC¦6OFĘšôŁć©( ÔÚ:Ł–m‚abϱMÎő{’5¶É}g›†ťöy – ‡äĆ ÔÖöJ,đ¶O¦‘V9»ňiÜm’ü~±ó"ł:Ô™óź©AČŠ©z:V°@u|ú&VŔp*’/věJ!šę†Í'ýĎÄňőzÍłÄä~ĹéT‡Fť‡Đ'tGA° •Çęý÷‰-Č?mŐ¤ăl E:ŮÖ‡Kş}¤E>5‡U4ĐĚz¦:/‹0űč:Pď™Ďďâčăv­ţ8ÍViú°IÎ$GWG)~–qŮÝ­Ö—Ž4IšÖŃ 5ťÖ˝Ä:\MW 㫢ŚŃĐa fwÁr»–÷ů*ťv7< L¦qQǵŤÎ‘ u“ţĆcđď/`É"ÎŞ0Ś şRlŚă‰’Mk Ő¶ŠËjÝôsNă2)»4ŢŢtcş·.éqşnL÷0ę–ű“]·=¶îUĐ!Ő!ô$j&t˘LÔAÝ„Ch86¨’K~š¶ðNěŰuűćŰçY'f¦ý¦'9î0Öž\ŁŻ¶;*}`!ő88 °ĹBu»7˛Mq«AÜl6¬{šW6RÚ~¦…Ýt6őÔ˝`üBčsć˘érâfnÝř6Xż®Ł'˛[ĚÇęPן-Źčú;Ëß@NH˙4Ą?ÝŘ;z^ŇîQtYÄń†oÓ–Ĺwǧ±/Í›´Ó@`ÄŐŢß,Ě6¦Hă8!X·@z÷č‘0Ţ >Ć3꯫N±Ô|ł}1.âôĎ ‹ĺŤ‹ ·ÜťIóf4{11{ˇîüvRç ł[úb^üđáHZŘÂľCźĘŇ…„5{[ú¦ .éKŁ#ą3}09AËÉ9’Ś}夬ĆühůŐîőa¦ é†čň+Â(’ľłČ,·˛FűɉqÝUf®Ş™yݧIá§0IuOŐ­ÔťévĘPnO¦v—˘ńaGůÄ‹PŚ|ę¬iB=Âřλö×ß´žę›@ýĺ‚ţrůŔ,°~dbý±ŇÁ=€¨żr×˙ÎÉÎ endstream endobj 508 0 obj << /Length 1088 /Filter /FlateDecode >> stream xÚ˝YMo7˝ëW°>I€2!‡ßq“C‹8hPi­S•ŕ&Ş Ŕ’UKŽ˘?ľł»ÜXĺUą&Ă Äĺß›7ĂáŘśÍgz?ŤzŻ/´cĽĺ‚ŤţbčHĚ^(6úĘĆý‡Íüv=(Fi±d‚çľ^Ť´ SŐ2iĘ5=Śżőţî•9+핚YDPŮ—Eo\pö•ž}d¤wě±Zą(WÓÖZł[vÝű­Ç¦«_í<»ź±Ý‰ß ĺ™oĐ”°č%-h%:¸)ö4ɤąM0ńĽ…îC,(Ç+†‡q'oá6žLéSEG˛s„¬Ĺnü|·ü6˝ßŚî.ËH¸™-n~Y®6×›űůrVFÉ`;°Ş8Ę-é.‹˝î hź%Z ŤÂÉÚ§g{ItQşˇNˇĎBŞĺ§ĂIvQ:điŐlş\ď.×o˙0Ć!§Q”/ ›I5C5äEő˝¨m” Öţvü·ś|>’ÓűÔ*0 _ćS †ŔX.„)ůâ]Mé¬ňć1~`ś=M&c­ěš‰ź(Ă6OÖ$fľKöEěNÍiYRLS‘!Z2¬%<’ÁÄ|¤kM> Aš ţs'Â1FÉpbFt_pG!ÉAń­ŚÝ;˝Zx$yP˝v&Ź2„JQi©•Ů;m[H$#IPiö"ŹÜ€˘łĽ!ŃT‡üÉ›Gř5mîu´W„*P´ä@úž1lëł@vHçjpůvŐ­‡ş†µIB“0–.ţú4•K[Fb×ʵűGĂöđGyřůňč›đa> stream xÚ˝YŰnŰF}÷Wđ‘˘ÍŢ/ Z ŤkÁ­§µ>¤EAK+‹­DŞ$×ýúÎr—”hJr yH¸"—3gÎ\—ĆŃ}„ŁÉ×ďoĎ^_Qڤ¤"şťGJ"ÁD$AŚščv}Šß-’ue‹Ń 2úýöÇ3ŚpÔü+îŁÝźżL‚TŽ”VÄIĹѤ óŻďĘ|i+ë%Î7Ů´Jó¬ô‚¶ZáqIˇ@`Aú?@˘Oc‚1ŽŻ×¶HĽŻłç+˙ëíţŰTůy>}ŠE#McĄą‡p»Ç2ţ cşl~tĚy}ˇÍ®B”€¤ZÄEšÍŢ'Őt‘f÷éÄK^ë*&Î\ŐĽ•dł}˛AŘ4{Ţ6©ěyZ\Îß§e ˘AĹ~ŃiÜĘ~°EcČ4_§¶ÖŤ™‹ ­Ł1aHżu^8ţa&^'Óż’{ëĺËŽ|M2¬˙vÄv™~ F0dX»ůaáÁ8 MDü~&í,YŮ˝t¦S´Őěµţ(Bë‡(, L=ÎůS‰8ĽYĂMWWëĐćýpČ 蕺Q†<é„$éĘ®ŁŽb—Uá¤Őë&ćöAÔ. [Ń7ő[çyuł™ĎÓöŃ)É['ŚŽ“ŇëI–eîW!8Ľö:ÜęHO®É˙ NŘó+NhNQZ…kv0 ĆL‚^ež8čăíőůő»?&öF ˝ Ć॑6rŹK8ĹGÝ i Łq­Ž„˘RŃóSâ}Ŕ äD‘dĺÜ…sD­żv„[s"Č GčG@9ná9G8,i@7M–ËCžÚL§„4~hé8V§(R\lÝ1f@Ęeĺ+řC‘V6Ôö4«rżJüĄ°ÓĽůőşČ]ůśÎl¸S-BZçeZ{ĎK Ҳ<¨x´aq—o˛Y#X? .÷¦aMZv*mQzáđú-.ŕÎĄż8Jë÷o[HýäÎN!Ľý:ß¶NŘfűޤđ–Ĺ0"-ę9ωY$™y‘éżÍfäÜ-â›4›ÚШ¤‚Ńv] ÉǀϠďŃýâq™®ŇeRřG…-7ËĘ?X%Źţ¦ .w#ölG­€™ş© f˝ty»/ř!F4”™ŔÓä퇽ˇďĆ™fĎ2˝+’"č?:ľ)×Ű÷ŔaóĽXí `† 5žA7ͦó´\/…=ŇË Ý<ĺ®\¤ĄgĘ/2ŞK~ľb5ÖygöNĂŽn…‚®BŐywöĂíŮßg®]@ú5Ç$K#˘éęěÓď8šÁł!ąŃŃC˝sĆÁ¤«Ü{ËčćěgÖx€URéËD4“ ŚAOŐř˙$«őŇö53¨VDš/QÝŻjř®v¨c2ŕř‚ ¸ë©A4°L^""€ Ć@¤Ç%€ÍňŠ—Čh`h ˨"¶ĹT€uťęęnü2ŮăkµĂ NlŽp÷Éú»P¬Ý{ťr˝{ĂląY˛Q}ýć[˝y\­, ´Ó â"߬Ăűga+Ü oŢ<é ‡p7eľx-׉ęs­’ś~%®!˝(Ő_ĘőU—ꟲü!űPäk×H\Ą¶Ľž_ßýi§Ő–ó‰ÍÜ1;Ż·ŔóI×%ĺŽONîťÁÔö˝#’Z~%ď@ˤę‹3!´ž-·WŻüŐuÇľë$[ŠOÂđ`zú W2@Äaţ„@Ś„čľ,áT€~×hÁÖÜ]X)yđ00Éđ7+­®`D;‚°ň>~ަ§!ßťĺˇůüOÓţ}rżJ~M«Ĺeöf [ß>bŰ``}ۨ‡ľSŘÓ‡–zŔ¶»Jď]Y;bĎ`0}{0C†śĆWX!nZ_ÝlîJ[]Á± ěq˝ĎśÉ3& ĆÓ3‰˙ř«TWçrÁéÉŞkɶĺŐ·>}yÎOźbŤO10 â1Žş_ŚŤaZű ĄF‹“WIF·Ŕé+ö öÁĘűř…tźÝO_$ˇĆ·đÉłđ‡ęîŁçvöąB Ęř.üWô«ď[Ŕ()Nbpşďđ˙| ŐŢÇO1Śéü$P8H“Žžă°ň>~¬•ćEÇŘ—ČhaDőKNô_.!|q°>Ú$9§bŃ~™čţ!¶ű…ĘĐú¨¬82&|`dŞó5\úľÜף endstream endobj 414 0 obj << /Type /ObjStm /N 100 /First 872 /Length 1452 /Filter /FlateDecode >> stream xÚŐYŰn7}߯ŕcűÂĺ\xŚN§ HňĐÖČCâ…Ń@*|ҿ“h­•Ci•´,ë=Îś9^¤D.8%v*NCt%ă)9Nx¤â$E|ăŠS.rĹ7»$äRĆźâQ\¦Ňer9Á«+!áĆÔĐÉ•jÖŞ«ë\QŔ q°‘ Ĺ Âh”ęrt$"ťŠ ‘ŃIÔ‘2ˇWjNqvěĂ&Ą?¤:Ę#+ sTa¸dŚ-ÉQ%ŘA”ríĂ1¸\3\VEĐśŠ+@ńˇŤhć ŐĚ«ĘĆ« ă04™;Ť ęČĚY#‚´¨ŽłĹS žGŚPĹ^U'1k"'„„,ޤNŘşQ‘:MÉIóŘh€~I &‘% ,]Ő:ĂnFěšŰâd`$ĂJµŢĂRĹFĎ@ľĄR,ýŮ\ŔřD‚'ř€ł5.lÖŃ#=ńĘ20„gÄÔš;06Ł×ÎEä˙)h †a“W5i!^ ‹‰qF1ż*Ł #´Ňi±† \“‹‰0DUł1Yaą$Ăr…¸#”k„jěˇNAľBđ'…Á;u‰Ě2üO""ÜH’ S]2˝EH:! ‹ siN nHé‹C#›ľŃ« Y¤Ą’RwrŇőOÝąÂJp/]˙ëożc¶ř9j|»ĺí‡oşGŹ„†âŤőölµĽq''®?)Ýő:#xÎŔú©ĚóçWb¦»'ŚŤůs÷€©|1Ą¦O&0ĎZş{Ö9]?©ÍĽu/8Őż¸Z]ĽZܸs׿xzćú׋Ź7îłżŻ˙ţko˙XtýřľXŢ\C‹s]˙rq˝ş˝şX\egř×óĹűË·ŹWÝąą‚dzĆ`EÉ—úŁ˝˝‚ Ŕe€o0H› ĆÁśŐ#ă»Dęrśâe#ÂyŮŕůP&¶™¨3™ŕĐÄÄt-»,ŮHż‹ůč%}ěŽY2EÁńŰBĂÔö Ő»eFŤŃ<˝QGźD\·¤Ăy®tJ»tĘŇ™ŔRň¶´`±vúÚč8đ s ë¦G-oĂFń“ĂęôHHŁz4®Ě;TGR¶t$i¦Ž$7ëhýŠŽ¦°T|Tţ^yŮÉţQ¦´ęV*ÚĽT¨4§býJ*&°;+ü\¬°ç|tčÔöjVĹ “˘ËU=™a}·­ŕ”ă–’ŁěĄäď+9ę·Ůáa·.ăpËÜpë·÷ŕ·šJhş\®`ń|8îšK÷FŢwý«Űw7Ăó/—Ë?»ţńęęýâj!ĽéęîźśÓđ`>] w˝ŹĂA/xĆé VnÉŔť<˝rýłŐë•É?\ßľ»FçËŐŇWŹŠôŁńł‘¤ÍĹsýJńśŔî,XśÁ˝äÔ†Uěq‹’ Ń˝÷ŇŁŠôĐ~yTÇ6KסÎۧÎgJ8Ż%l+ëo=¦¤9ě]Jâ«]HŐŕĹn Ĺś¸EŇĽ)陬ŕT–ě˛OĽbIŞ`FpÓŁ#zCŃŰF•áM˛ ,©ž‡k<ő5ÓŢŢ<*HótĎiâx şklâ4·ŮeBnÄÂî ÄŰ„ŃR9ŢiŘMj G<Š”íE¦ĚÝ5”ö^ö(áeŹ>»ă6d&t×ţwËXj˘dQ9:TQđ´ţŹ6Ŕu{±©s›:sqK›‹ G_ěW‡ĚŘéPfÄ~(äk’ÉzqyłđĎOź=?˝_:k{鬩}šMawÝM`c.^¦v4SX…S:><‹ţ+G;/(¬xŰŹ#źzU‚Á2GđökÉ=Áǰ×5R¤pŻvŰ3˙ť#PĽ»[ŮŚhf„Ä­Óf }xÚLaw­8ł±÷–śS»äm endstream endobj 521 0 obj << /Length 1815 /Filter /FlateDecode >> stream xÚŐYYoŰF~÷Ż Đ‡H€µŢűp\i ÚÚu„ö! F˘$"’¨đ“ţúΤDSÂXÚ‚KrwŽoŽťĺŕháčęä—ńÉŮŻBG …I4žETsÄ(‰”$ČŤ§Ń›AU¦Ëbřnü &ł`d°ńł)C‚)7Ťi;çâ0GČqIíägQ#ŁHKá‚_†pT_ů<Ú}Ľ˝:‰ŢŚĆxp].’|8˘˛E¶LĘÄ?ÍŞő¤Lłu±GPE'Ž`2˘Ěl™#Ňýł!Íf™NâËŔů÷¤\dÓßP–/<ęůŽn­ôRÉ÷řjł»Lh¤Ť®ń˝ÉÓuůlËťÖű,CFLÓzé©e§w‹t˛°C1¸< /Fşž,«i2őźŇµűyHÄ É ‡Şű2Ëł•˙†'ţ]™Őo„>őĂEM÷C’8˝˘Q Q wp`ůą‰ 2’JUĘ Ć¤#†Y@ëEУâiľ‡uK|eĹçIÎŃŔEĽô>'8y ‰Z&‘„Ď)ř~XŠGШŠîĽ‰mÎŔş•Dě‹Ű«=¶6@QĽÂ5$‡yĽą )É.k%ĄÝ>- đŕ&' Gdř¤đ ÇŇŇJÄ®·ńmŠĽÚ&3?BŐ== co»: † zů1»ŚŇÍůÎmĆŐź[Đ–qQyčŹFPE?ŽÓpŽ$ăm§i4Ţă:;JoˇşzQ°y\b`*Ś"©‚¤3ŻÁoÉz^.vKÖIî3\–׳¦`x d¶Łź[»ŘÖé­V˘aęqČ"Ž»NiŠňú€RVy0x™WÉÓjô–ˇ«hzcŤ” N–Er@ňŢl;’sĂĄÇ17éúżĂ8˙úGňĄ´˛őC_Ôn“Í^}ú ÓŐGŠę8–ŕš# [„Ď!é!Á{sí .áŕHÔqWpHTĽ ‡„ďÍą+ĽPPr“c$n.12<€~pďĎ´+7cůcvp§kcŘ˙á ĂťąFčŹw×dŚAÝWc a¦*,/(ŐzŻčÓ{gŔËď+=ű«ĐEéö9.köß-=űŁŃGęnE"°‹,=/.Ŕ‹FÄşŐĺĺ·”ˇýěčČě/D-ŹłĹ`‚ ˝..&Ůj“.ëąrç鸞döaš„-î/´źts{}=vgël“äÍíÄsˇôĺĺĂ8ôW˘‹p68†©™6Pů¨oجzóěJ­ţâQżVCŁ#©Őc~3?‚DřUo)đĂ8‡˘‹öŻúvC©&Ć­1ĺNW‰öč*˝ř˛ÉÖ°\Ď Ď­’oę$±ťN'r›$ö´‘$µDÝ jsž´Ż¤íąŚ×kšŚe•ĺé<]ÇËĺWűlĎFńş%ąkĘ8Y\€ÚŃ&ž|Śçlw¨´D„7Í­Űç…m°í‘ÎJ7mFäI7šCŢXĹëé>ĹGÎČ$ôť¸Ů@âŞ[L ¬ŘY J`Gl÷#‹Ě¶Ĺ¶Ź†ŤXUOŮě'ˇMC¤Îßk¸żŃx·Ż;`e»ŰĺU ý«Ů˝)›Ú˝:rÁâ÷mË`¤Ť*ľGŘ!íŰdÎY&%řÉ?±ß¸‚4{9ŰĘ€¨{0·Y·0BľŁČŕ¤Č8k›öµo2¬śd{ÜŽs8e5ľČŢľ6Ö ĂCˇĹ ÚR»ů+^Vńvj›¨€©´éČnňlZM’b+¬ń*Śň¤¨–eU4Łt`Ü˝žfőš"ó÷U–‡%źŞtň˘Rş_ËŚ ›ˇ«ˇPĄ¦ŐÝ®Z÷X]×ÖŤVń4i7ŰQ+9íTT˙°“=Ď endstream endobj 530 0 obj << /Length 2312 /Filter /FlateDecode >> stream xÚ˝YYsŰF~ׯ`é ¬ŤFs`pxkäő§b;»QvW $!e`0Š˙ý~=HPcÉZy÷ÁĆ==}~ÝCńŮzĆgŻĎ¸ű>ż>»|ĄůLr–$RĎ®ofi´ҳD ¦d>»^Í>Dß»ˇěćRóHČůÇëÎ8ă3˙Ż[ĎŽ§˙|í¸Ć,ÍRA\ůě"ÎY&”ex˝)-łˇ+šţĆłŢus‘Eí˛\íͨ´79aÁSÍg9Ď=O­Xl9ţ{žńći´l›ľZ¦mĘάgѰq»wô˝ťÜ´ŽĐËŇUÍڮ쇪®†ĎŽnß,‡ ¬-ł›ąşvk'…ă[,?k#őĺ«d"¬ŠSĆaOnĹýľÝ:˛©NJ2ĄO5´!VB°ôŔéČ؇XÁú±öT·›ją!*řAh¦ăxv!ľÎĂ›‚ÔŠşŇ|‹ąäŃô_[­Ü–1»v(›ˇ*jšk.ęrk÷Úű]íwuµ,wdU.ë˘+ĽýŽ űńÖµłe±ď­0©Űb5NÜe˝˝şjBâSÝ^_ý´Źb<ööaÖ6 \MOżśJÄV{%ÔqĐzX„L1•&_ám-FŞ˘®-ËŤ3ľĐ‘»ł)¶Ą»ŻťĘ›@l»­ĺźĺ“HŽBŹAđýű·/{ĺÄWŕ\X¬.‘̉‹Km©&9‡Xé\×Ő§ą@ľ×źí†‰Z¬/J;ďJ˛ŘĘťę¶I–*áĺ9%l“”ł,©-d$QÇ›/új[!ĚçZ# .â8ŹŢ4NŔMĺŕfYôĄ_sź@Ć ćL„śˇI–4ždUŞNłŠVÚ˛·¤M;ŘAŃUđt_B"• @oĺ(*wćvS8R‹XŢďĘĆË·Ő°±ë"‡ €´± ˘^ĚQXň1ÂŻćpů~h_´ËŤ/<ůDwŞ6CEÂr•N L1Q:w¦U:JôiŃć ÖCË>ٰQxRlŠfMjÓÔÍ·­§Y¶[ç‚ š( W„…ŠDp뮺Ę3j÷őmHzŕźJňCI˘‰Eë •r…v.5Ř®ě^WîJşÝΦ@+Eł˛'«¦Ń"ŞÇm¬řHĽY08†3LĄ‰f"ë!©JňóInú@2°űbQ[آČ!aV«jŚNnÓ4ĺ.ň±ż-ŞĆ.ŐŐ˘+şĎvň+ç˛.i+ÁČNëş]5[‡Â)ÎđcĘ’]B0!âFví®ěÂĚ”b™T‡raŚősŐ,ËQĄÎ)ukGXÜVýş"ďýŁö6•ďä¤ü Šś‘0&:-XÝ‚ŠY°_!ÝöĆVbLN-ŠľZÚ!éq€őűĄ# ˇÔ0{ŠçoŢ˝říőŹďź_ý˛E"řG@nřş‹*¤‡éĽ0ů•kľ ¨đşőuµŢ µ“Ľ¦x·6ˇţSäS› ‹łaEńÔTč8ŔOřFŃ7pXÔÂ`Q–Ť«v7ř° eÝ/®˝P±·+2ą¨aúv3.sĺ—HĚučIKRVůF7­OOÇNGýPîz»{[QE§ĹĹz“!ŘR5vo[|™ă¬r8€×  |±Ů`ů`k)EüČRÎ&]:šr8“ÄĄín Ť8!ú*n$(FĘHuO2g<…}fŁDôţ†Ll^JNw%3ŰďÓ:’·F›Ů6ČfűĘH;[J.ßčŚ k·¶j›Ňíş•0V[ŘĬ°źşę;2+mşđŹţÄoFD–\Do[ !x‚ôĺÍžŠK˘MŞeĘ^gwm bpT Ş;%âYsXD™.űÁ0eÂśl—ű‘Ě.9řuŚJ¶fĎB qŇfoŕ&¶^C/Ggw„fʕї–UőÍX ý,)2"y¸@Äi>a÷網ÓÇě¸DâW––'ŘBkűaÓvÁúM»ŻWÍě7T]™ öiÚ!qY†¬™äťüĺťĚňč… B›SQŚžQ¸+S;b ÖBoCü3¦¸ś€Ë ĹhŕŢ…YdńčXďܵ<4¨ “Ysv˝ }žQ®†^są|đ5'đćSGk®@l—cEčť#*Qš ĽÚŃnčŮB¦qÂâ8ý_Ű.í<Á_€Ś<îĆXüµ(”ĚkHĆţůăBŽ#ĚŇ˝Zi@Ó7`2u$ěŕÉÔ×řA«|âyú¨¦• 罂áńӮܶtÂĄť)˙Üa'tĽű]ą¬n>‡Ktž ,ÄIűńĹĘŞŁů}cSŘOWţľŻşŇáĂń»čđ|ÔéÔ@ŕ+{‡žĽW+¨EŽN¨ómďĺ+Žŕř9­ŮˇĎ8'T=B*g©–wú„D‰G˘ó-k‚Ľ®ú8,HHZr[ŻCŐD˛ĂO4Ć?YĂ˙‹Ú3™` \'¨pQ,B€É}¶Č†nÄÓ…Iť´Ăô[d‰gŇ%žuÝŔpu¸Ř sś4g/ŻĎ~?ŁŞÉgxËđl†DëŮr{öá#ź­°‰7S¨a·†t‹âGńHF«g?źýĂţ^ ‰r–'¨ś¦H–§Ěb&qŇ\úňĎ‚şŹ»W+… Ćëíż¸úXţq„ž„ßs|ďaÂgÖ=eˇá´|Oa1JÁa -îgľ:Ç»ů‹b<‡—Cä)Ëóä<î:S ÷ôN!¤3u'ćç"2qoR©źýí®—˝ZŹ) V–Wü“Ô’¨ßHE‘ĺ,‘.F?XůĎѵčĎ ŰZ€ň¸µ\śwŹnŹ–+ [ŠoöD—©Śđ^¤đ\ę> stream xÚ˝YÝ“ŰĆ żż‚ă—ňf¬ő~ď2ítĆť±S'iâ&×é“J¤î8ˇČ Iůâ˙ľŔ~P¤Dť­ŢŤ_¤ĺ.°Ŕo&· Mľ˝úÇÍŐ«·Ę&†d†˛äf›p+‰ŕ,1š‘ŚÉä¦H>¤űˇŞűëßnľb‘0J2šyj.bŔĘ‘IŠ4W40OV’JBąHVB«•§úď]U—×+!t:ÜąI‡îšĄyÓoË®÷3yhÖeŐÜúá./Ę—0T6­?Uň˛ďËf¨KXŢĺ&o®™J?ů‡¦Ľć*}đ4q¶¬Ú¦÷ËíÖ«©gj ‘Fł¨ç?Ű]ąd Á‰Ń¸4ě±,]âŃ.V˙öőű3%4+čż\+•şĎ7żC`ú‡˘ę l»O×:&?Ňpgü(tIô×ó#0ĹĎľ®źU“c§ä’Ćě 2uaăęÖ!Żš±=×őQ­zŃOşV¸r“ć ¶<çTŻydJĹłôMázSP·ű0đm.•M›˝_rAŠKó®AXĹšÝQˇAĘsŇGÁ ‡śŔËÂÖN@ăí3ŹÂ® ˇĺÖŁIWDzٔ¸˝QpvÝůl8„?ŘĺÍĂ˝öŹ^$€ŕF¸ĐV§ďŰľŻÖŃŽ¤$ąg —Mŕĺ·SGĚë¸#Ü|¨ =ąKĐo…4ÓËCH Pî»PA? đŽkóˇŕ ¤KΉ•ěó  µăMŰú ˝&°_]!*ăÔrÜ@’' żĚç"Ř ×®üc_y_€Ýô„µj1­„°gDB¨:kĐyď_|×l[r»$ěĹĘInň¬ŕ‘'•ąĚ '`Š -vX§`jżj%Ňw Ąä,- —†ćXű®ÇεÔ2}Ŕ®‡[wŢ룱pvb,°÷|‘lŮjŠiŐg/AAt6zkčân%B r‡€Í×ŕ§w®»‹’"Ž!Í/J$‰]lH`]Kj}ľuakFŘ8…síYŻW|ݞ‘ŹÍü¶qmĚ;ŐŕȤŇ˙ĺëÉnBv‚‹ŔŁ  łm»Ĺľ>úł_`;~HęĎÄ“¤šH9Ź'ç;!¨~@`éąjMŤiú.ć%®?6Kzçő )lH-±P–Ě\ţm–­]ľe¸02ą x‹#ŤđďoY@Ň·)‹}Ńhž|Ă_ΞşŹp(K_÷~ľn#qfňů ţ)|ŮqL'×™×IC‚pěaŻPKÝlj?Á˘˝öŤpR ç ÇlĹ—¤‰b<倡/|Ý dą0z…ńĺ Öa©ĂRÉŤÎĄ–Ě(_q!Ć8Ľľt"™Čçî]? m@ś}^¨‚ U µ›ćs37%$}ŢąßÝĘK] CŤőC›ÁÍł^ÜÖpH/v-ŐŚ0ć\ś|x˛:Ö ję+VŹ]…M¨ÄV’™X‡čPž,ÉÉ´!FŤ;ą™Ż†~x…†r‰K˝|Ó­„P®ď3Ťç]ţ;eHńűýásY>śË]§ö<ÔýŃ—5ü>6VCGâBZTxM|¬Š}üľ3žö„ŃfˇVŤ˙on®ţ2vOr endstream endobj 562 0 obj << /Length 1614 /Filter /FlateDecode >> stream xÚ­KSŰH€ďü ĄŞh<ďÇŢ`łPÄY¶ r¶°˝ŘeIE¨­Ýßľ=š‘m “Ŕ,ŹzzýőË888>Ŕţóýč`p$p@9RZ‘`t(‰ä1®Ń$¸ /ŇŰt¦Ů8-˘ďŁOk 0ť#M=±`»yWďĎŤúŢš\ĹDp^F††(Š…ŕáűĽX&ď˘X2~ňc‡I–ĺ™L˛‰­ßŠđ|‘<ćUQ"«{pDpkTRxÖ°^˝ŤŃ,ułĎ’ŕpşLś’d1µßÓ8|s2ĹcQ¦ËF/“Űz 3 Ňčý§sq$SŤČďťz°FäßýZü•Řs€l3I': C‚'T`Ł+.’lZąŁÖçs ´í$9bš6 Ŕ5ŃCbŚ‚µÖ&<Ě—÷U™”óöëw`ŠáR¶<Ü©QG\ţ" t‡¶đÝËçSĂ>ľŤOÓ;xž¤#hŤk‚ą1ĎL˘z ŹçĺIusÁÜ­WÁ`¶˛ĆěŚÝB€ÜĂ6¬„7QqdSTşĽ_ÔxŰMŢć+÷&Ĺ|ńčž«bžMÝŁŰ›{~˛C‚‡@Ă<ó¤K‰´Ţ1|M#ĚŇhÝő®­B"h;ńÎ`ß`DűĽ€P†Úův¸ ůL‘ÖÂŻqcŕQ>ńŕľx'¨Ó«÷‰y޸l«ťŚć-m=娎ă°ĂÁłA0$Fő&±!š…Q;H˙AJËgD%Oąf×q›Bśńr‹n¶!±†ňâđ2‚Ť »‹‚Ś~_Ť„Z‹\¤Ĺ|RĄÝşřv¶Ť÷W ‡‹¤(:UAé¸U˝@ŐeĄ×ĽHÝő om]yŤ1Íěrů˘ş/śDwä·’pDzq ąő©ZăÎ)ó¸Ă÷ŘV"ą[NĽÂ(Ľ1O\<ŕ6Ébú΂±ń…Őř!AłrąŘS@!č/RŢ[—ŘšČ>ĘožRNąv”Cľ‡rŽä&"5Ni7P`7IČ>Љ0ŤČ×´ě©Öc?CćČVݶ&IËůŘťk« .ÜŤßî©q0'čOTéA–Q@nąY 逰-d“š!ÍÚH6QěéŁ6~uÔ¶ŐîËIM‹±;ń x…†P*ńĆĽr ÷Áš:Zx^O?wÔ”`Ůtli×?˝fŠß¤ă;÷µ®¦íĂ™˙9­˛Ů5“ň6˘PŔ‚!dő'Ú®kÁ¶h«µôPo€đŢZU!%·?Iá…]˙rtâfčlSE©^“RŽʶĐ3oĐ MolÉĂĂZ&ŕ$D«‡r'őŃ$üw´J˛;tZĄő}“pŕ®h0Ď&éŹýđHiöÓđ´ÜĆÓŃ—ŕD®vHşŚµ©nţË·¨l-gŤ`Z„ęO © Kłb‘Ú¦č1’˘î6q}H ÷~dčGľL’›¤đ®ŻŃŹ^ó/ő­XTÝ2đ­Öţu–OşS>†¶Sďkíô¦}9ty||âöš«… qvCv§Ž0­‘á;ńé0)IwµĄ<ů™ÂcşU pAĂąíú„/Ví@Oc"Ę{[B …íź?ŔĽ/Ů ýäő=!G‹ç{B“ Ú9Ń"¶Ő,ţX‚¸łnŻ»@÷Ą{ŰP+94Nµ{@wˇśfNZ˛G˙/üĹK endstream endobj 637 0 obj << /Length 1580 /Filter /FlateDecode >> stream xÚĹY]sâ6}ĎŻđ#ĚŻäl?f“Ą%›4ˇ3Ű>Ał¶ÄČr6ů÷•ü‘ÚFÄÁŘíc†ÁWGŇŃą÷\ckăö4žź—źf.0,Çô|ËĐđ¦¦k»ĆÔ&„ž±ÜßFsşÁ/ăż—?ż˝řićf‚ě-`L\hBPĽpEó„ĹŚďw$‰őŞÇ®ľá;¦ëňĹě…źňč&0ňŹë:ßőo/ŚoË#kú.šI|mÓu-¦ąĂćH0®­ŔśşŢ@řĘč@W‹ďk*ńĹ+¬G}Óö­ˇĐŃ›Ë÷ŔŮ&] ívN-ŔŽx ý>žG~źqŚź'tŰ»ŞAëcŞ–a‚ůW śDł Lnˇv×ôm{ ý+‚Wąu…©ŕ¨” íöů’ť% ´l_ĽF¨:¤9•K2-Ů4­Ś^ÇĆâXŲ˛˙täS‹ÎÁ€0ú÷'r˝2I Ď8é? AŘ! ĺđ–ŃäYj¤‚őN÷6d:ş3*ń%»CŰeÜÚ§â¸N@G~·»RĚvëąeR†«ŻÇHŕkÂçá‘bJ·§ăµŐ|UuĽ&a9¦kś,TRí[ÓK>9wĽĹż/室â­ÄşÍźvwü© ¬ÎĹi[&.˘żu¦ Ňµ ŚęÚ®iť“_K˘)Łk>Ąń5^łxŻ2MBŔ;$iľ>"Ó łq:MžájŔ6’mD®UŁŚ[gR‘çoz&ČŘrGĎŞČÂIżşjŠp] *ĄT ):.ĄgŮŤV)­ÚŤ·ýd?hÄĐFÇqMř]Ő©…]Ep-;ô˛$1î]Đ=Fą*.÷űHzęU„ď°Ř±Íů–ń`{Šĺlcąđ Bqď]Đńžp„łŢÝŃ[ÉzťŘĽ”T.‚—÷’D"oŢPUŕý‰“ń>v)yp9ĘÂü™ŮŐ”> stream xÚ˝ZKo9ľëWđ89„ÍŞbń10đLŕĚł@dť rPdměM"–Śd.űŰ÷«e˱­HvG-©şX¬ë+’X\pJŮĹ\)N98ŞŠ‘×ěł“*ĐJGŮčÔĹĚ^Ő‘‚NµâąşżW—ż ŘJudc˝°«öŽ«|%: „Dń xÜ ?ŤTlz¶wě}L¬„$&’ى52Ôţ*k28=ĺŐđë^\Ě'ݦK÷Ću/žť¸îőôëŇ]MőúďĎSü1~?użaÚélą@ř’˝>ę^NóË‹ÉtŃç„ţ§LOĎǿοş7ÁOUϬDňĄľĹlă °0ÇíÉ7ĎacńÚ/>çčďŇÓ Ň•ž‡|€v˘Ąč͇¦M•<ĽhRŃč‰g'Z ŢÜű>€ď!`ďpÎqĂ6\ŕ瀓#%ŇŁĽCÂ-ďŕňX層{GÝĂ;nÓ"™űt§ięŃ™±€ÝHI}Ô´-'ő5Äýţ†)oX|Ó®¤)·Ś,é‘F–Ľł‘o6#ő¶-ďB‹8ó1îDŠťŮKŢŤmD¶ľ+YÜA*µŔÍŐ÷ĺň[+reăÄ·lśÂClÜĎfsp|Ó×g&’•g«q%°¦ő÷ŇĆUXXe¶úżŃ)µ‘Ű(mŚmlüµńÓő{ŤoÓŁ•c6~Ł^ÎQ÷ëüâtzŃ/-Ľí~ďţč~Ă” oMh•Ą73@Gĺ˘Äěµj(TŻ.ß-Á±űó|öˇ;>:ęůwÇ“ĺů|Ö˝ęţůňűüt¶\~^üÜu§ós?żxßQđ(LR÷ßĹdî©Öä±>Św‰Ů&qý,wKMý—µÔ¨_=ę™+©SôŐjÓµÔÇ˝ó˝rÝóůëąëţô.áEź¸{Dřľ¦ąW´G^¬Ä¦ęs_ ü®űëęýůňěňťźĚ?uďÇźź~O>@ČEw|ąś?›OžUFΞ°—J†“a§‹†8ďŻ5čë?ăŮÓółŹj»|űłĺ§ŹĂĺŰŚ Ŕ¶|%xŃ•^ ţ˘‚Y±a2#@ů±`´( ‚‘ÓÖt1ů8^,¦‹auMGś®ĹZ¦Ľ)ţĐY&AŃŹ © J*vČäk}@ę˙ňĺ‹˙4^žů‹/Ëł§ăńäl:ó§Óî'ăŮ˙çĺôÝtňˇClb#čÎg§ÓŻĂŞqťi$Š·¦‰Ő›ÖÂBŕfú1Qż$óó «r¨%d:ĄÄávĐŻźć§ŹĎ +€ĚŐę, ]ÉÄ|@ęEÖC \IŤb›°ĺ^K˝K`I´3ÎşAú0˝IK5 °KŘ$–ť§|¬» a(˝ŮŤ6Ą§şmÔ|7Ľ‹–É[orZËüÖG߉V˙‰÷‡˙›߬ČNz>¦ŠÝ„`÷€)Ţ‚©ÁĽÜ`^kQXwz56x—ĽkXčµĆôjl°.7~Ąń+Ť_iüJăWżŇř5DmíčŐŘř•ĆŻ6~µń«Ť_müjăWżÚřŐĆŻ6~uĹĎ:Đ«‘ÚČm”6Ć6jSsK?jü¨ńk­äDŤ5~ÔřQăGŤ5~Ôřµ>dâĆŹ?nü¸ńăĆŹżćb‰żÖÝJŇř mÝűor Ql‰e!ŘŠ·"HácŘVڦá€ŰžgÉ Đ:‚LšHČĘ*‡‘*Şr„ÜB#łą€a<¨4‚ťÉ`KA’Zł?ęBĐűe ĐKÔÚJÜNŁ§ĐźľÁHé0BPBŐÓźiF/šÇŮ[ŕ(öBs !P6gé{…ˇ l®* ÷ÜÖČĘ`U52łmŔv.I cî­şŢ"DŇ«‹ťşĹ«$±IˇÚŘbŤ!»#ŘÚ‹!ÖÔQ11ÔLľ=”5*Ę ”- LÜ··Š] P(D¶Ä‡!ŰDěŁQł•ąďYW0FÔź%HTĚv™ "6• ĎhB‘Ůć? gG`Ąţ„żĺ쬔˖%Ţ/íHšsĽvĚ`x¸FF]QPX·¤@Ö+};k}P[úY. l;Ľ]Eɵ?ź•ŚŚ· eÉĂg*‰Ř/솴˘`4ČŽBę~!Ě–Ś—ÂĹlEô¶‰Á‡mŰĆ›8‘QŰ‘©çvŰEŘđŃLج>nŕ  …“¬ZŇZ¶µOâ€B@é §„2°u±ÝôAŤŚ‡Ôg=Pt®ę[dňUyËŔłŔßĘR0|âběžvÇÇzYČ‹ ˛­ó!<|t2¶ĎB×`±}ć˛M>UZ/(˘¤\§JŽ@ܢ˘yD°zâńl™·ąÄ UťmÝvSy›-Wb+©Xłx‹Ę2 $ě’žĺi˛1ůjwKDţćm‚ÜkXu'vđ†Äe‡ĺ„Ň’h›5~@ˇOpĂ WXú¤ÂÄ ŃJKdHo×őĘĘ= •e =Čîą®éˇa7dÖ5ˇĐÔp cH¬ČÖâÁ&]4±·{°ßmŠ é•Đ´ô]ëJZ}i·[żŰ°¤¦ńýĺ^$j»eˇkX*ĘJŮVÓń€[WDX˛]śµ«ř »bm'Ö[ŹK‡”ĺC´«±JvëC­)”í2Š9@üĄo‰`ó,¤ĹŘ+ěJ7lR·ĺë8¤Ę·Ë_Úg';• vߎ‚,qZő &Ív5 e]¸·€]2a»ĺą öü?_kŁű endstream endobj 647 0 obj << /Length 311 /Filter /FlateDecode >> stream xÚĄRMkÂ@ĽçWĽcÍúŢ~$Ůk? …RăÉötŤ ÖČf…öß7-¦„íaYXfgćÍ<„FÁm †*”é ň%đL2Á Ň„& ůfáÎŰu˝ĺŹ X!Ó¨[4LQCu€I±Çx$ 3}ŽĄ Ću±P,KTűib 7_Ý}ÎצO!á żnZ~†ĐĄ$¸ş/Łf1Wvü@Ü’ĹÔ–ú$ďÇË'[×vS^H/Ň.=v™ë÷Şň«čµo"Rai\$ńâ9DŻĐ)@ďď÷•źě–Wá+"˙řß(?›kES«8ÝTnaśY<ÖŐăýhˇ+|ĺú $.ň+äŮďu$?ŹcşÝ7´Ţ7ˇLŚł{s˝»KHL¦WďV7±żî‡<ř¬`Ç endstream endobj 649 0 obj << /Length 203 /Filter /FlateDecode >> stream xÚµĐ1‚@Đ%$Óx纡Ú1‘ÂD+ cĄ–m…ŁyŹ`IAXgVYâl^˛ó“™źŤâqš ŹA„Ł'Ć!8CŇÔÇiđŤö'Č  S š,–x˝ÜŽ łŐ éťă6@EŽB§!-Q2špWSŕikćI LŐˇzDGią[ZKÓáôÔ.ă˝x;SŇEĄé˘ÖĂĺ ŻS<Uý4űG˝ľŁá“jmdľP1žąĚ XĂŠf\$ endstream endobj 650 0 obj << /Length 202 /Filter /FlateDecode >> stream xÚµĐ1‚0ŕ’·pŢ´ÂD‚ŘÁD'㤎]…ŁqŽŕČ@Dţ˘&$:ş|IűÓöńá8ŽŘĺG!‡>ď=:‘w›.OĽ>Ů)U$×ěÇ$çÝ6IµŕËůz ™.§Ü­3ŢxěnIe,D^!Ú;hŔ´90ZÄ pľ D ČÁm.ÍCS˙B§úX[żÇĘ?`i`^©…Źmü‚]a˛ňO㙼cG—Vˇ©ťŻâúęni¦hEOE^˘ endstream endobj 651 0 obj << /Length 105 /Filter /FlateDecode >> stream xÚ31Ół´P0P04Q04W01R02VH1ä*ä22Š(Ae’sąś<ąôĂŚĚąô≠ô=}JŠJSąôťś ąô]˘  bą<]ę˙˙?đ˙˙˙Č$ĆĺęÉČ`)( endstream endobj 656 0 obj << /Length 244 /Filter /FlateDecode >> stream xڭбNÄ0 `ź:Tň’G_Ň–pŚ•ŽC˘L č&`ĽáĚÍđJ~”>ă UŤťqě,ßŕĉý_¶ç]¤†"ťµŻhÝŃK‹ŚťZ_”“ç=n Ź; ·ZĆ0ÜŃűŰÇ+†Íý5µ¶ôÔRłĂaK~Ş€Ě5C%âśČ'†>;˝*\ Ż$UÂŐ+u+Ů}e'€ž}‘Í^őܧ_Ç"¸dj_V˛Ëż*'ď˙1Ůď§S•9}q2Ë.¶WźlÇâňî 9¨–É’CТfe×D´E3ÔvgZ¶y–Ů´·ńfŔüĹČ…Ĺ endstream endobj 657 0 obj << /Length 200 /Filter /FlateDecode >> stream xڭб Â0ŕH‡Â-}ď LS˘Ž…ZÁ ‚N⤎ŠÎíŁőQú;”Ć\Ohť ä» ąűçj–hŚ1ńW/qˇđ˘ŕšz1•ôpľAf@Pkßi¶ř|Ľ® łÝ }ťăQa|“cꜢp®ÂůĂ–Ôq•đŻ®A# KN2lÉ wŇő:R°E9˛9[“ŃCűO#űë/ž„§JÇŽ¶mÇűÝgâóˇ¬ě'7Îóäl9gXŘĂÉŁ Đ endstream endobj 658 0 obj << /Length 213 /Filter /FlateDecode >> stream xڭб Â0ŕ‡Â-}{O`­´ŇÉ@U° “8©Ł˘ŕ ­›ŻĺćkTíf†ĐXiĄł$ůŕĎÝô{NłíR‹őĽuZ:¸A×Wůő`±Ć D{J®ŹöPý˘Žh·ÝŻĐĆ=RąO3µ9ǰOŚX",“@,scmĆ$€†61ž/ĺ©Vńq©?*ţÜ{b\ Słđ–šg%· n…‚•»ĄQ¤í«6Z‹—šiŐüÔ/Z€Ët‡"ďMęĆdî·ÉĎ!Nđ rˇş… endstream endobj 659 0 obj << /Length 137 /Filter /FlateDecode >> stream xÚ35Ô32Q0P0bK3C…C®B.3 ßÄI$çr9yré‡+qé{Eąô=}JŠJSąôťś€|…hCX.Oű˙@đŁDţůŹüÇŔ˙€‘˛H2ü`‘ #d˙˙˙ů˙?#˙˙˙ ËrązrrÓ„Ľ endstream endobj 660 0 obj << /Length 204 /Filter /FlateDecode >> stream xÚ}Î1‚@Đ!$Ópćş,A+ÄD ­,Ś•ZZh´ŽĆQ8–[lXH4âĆć2ógƧQL!E4áĎ)átâxĹ81aHI4LŽĚ d;Šd+#+Ötż=ÎȲ͂8˛śöśÂ9•\-µ®<­~¦žH+O”•Ű _* ޱµh ť~Ą[ťę+ş"S'FÖľ1¨ýƦßµMO¤•MW¤`”ĺHG>?Şö-(őĎRÚMĹÇ éôÍS¸,p‹/”ŇŠ) endstream endobj 661 0 obj << /Length 225 /Filter /FlateDecode >> stream xÚ}1nĂ0 Ed0ŔEG0/ĐĘ ě¬Ň¨‡íԡȔděĐ ťíŁ©7É dńPä÷KŢ#Oŕ'ÁOŞ Ź«Ú*kě!X¬něôKůVĽőzÎ>uÓ©g^ý3eőÝ‹}źNę7ŻOÔoí#Xµ×nkRţ 0,‹HŚ"`˘näX€Ľ,2…Ąd;‹ŇF)ĆÔ"Ź»G— ٦Ěě)ôeŤC$9ŮŽ‰}Ě‘űÜîr˛ź9HĎ>Gi§´mÉe2ľbâÖżřÉŻäꢻNßôŐÇ€f endstream endobj 662 0 obj << /Length 208 /Filter /FlateDecode >> stream xÚ•Ź;n1†äÂŇ4Ásâ5,Ůr%[D ˘")S$"őr4ĹGpéí`ó(RF}Ĺ?Ň˙»—iÍ7> stream xÚĄĎ1NĂ@ĐYą°4ŤŹŕą¬78n-… ĹT)U L‘(Ô›Ü,ąI¸ÓÉdřŢU´Đq n„µľ#Ét«-l#ľkř‘ż&Ä–H endstream endobj 664 0 obj << /Length 225 /Filter /FlateDecode >> stream xÚuŹ1NÄ0E”ÂŇ49BćŕM¶˛´,) ˘@T@ąĹ"č’Łĺ(9‚K–‡ń. #ëÉú3š?p—W=w<đ…ă~(ďÍŃ‘6[;îŻĎť×íF˛OĽŮ’˝S™ěxĎź_ďdw7ěČîůŮq÷Băž™#h%^˛J"¨s-ł,&ĂŻ&˘ M€ í ŰuôŠägTi:żČ d)ȧźÖżHeeÓ_čć3ľŐ Y}‘őET“ÔĽ4©’ĹÇrsŔ$˛jYĐhÔ%¦t;Ň#ýăk}– endstream endobj 665 0 obj << /Length 166 /Filter /FlateDecode >> stream xÚĹŽ1 Â@EH!Ě%ś¸»qµ1‚[ZY•±´P´UŹ–ŁxŚ!㎝Védó˙đů7Ę<[Çőž§WŽÎä-ëÄSŤĂ‰Š@fËŢ’YF•LXńőr;’)ÖsvdJŢ9¶{ %Č_@"-0*rŕˇZ'épGŇb†4ľ"mz!I¤•o¨ÖôMů´řSKÖ?ř´´ˇ7ĂW€´ endstream endobj 666 0 obj << /Length 141 /Filter /FlateDecode >> stream xÚ35Ô32Q0P°bS3#…C®B.c3 ßÄI$çr9yré‡+›qé{Eąô=}JŠJSąôťś ąô]˘  bą<]0000˙€ěP„XÉŔţ?Poý˙?„=``´Dý˙˙˙ń˙ âśx–ŕrőä äç"cn endstream endobj 667 0 obj << /Length 127 /Filter /FlateDecode >> stream xÚ35Ô32Q0P0b33C…C®B.cK ßÄI$çr9yré‡+[ré{Eąô=}JŠJSąôťś€|…hCX.Oű˙ę˙˙c`ř'Ŕ\{ÁŔ0 ű˙˙˙˙¨€ř˙?0ć‚%¸\=ąąRřm endstream endobj 668 0 obj << /Length 175 /Filter /FlateDecode >> stream xÚÍĘ1‚@ĐO¶Řä7Á—5pÄD ­,Ś•ZZh´:JŻDâ<‚Ü@J ÂbbŁ˝™â%3ŘţŔď•ŔŠďËÚňŽ®ń»iµĺ0f3—Ŕc3n[6ńDűă†M8ŠeÉŠ·ä8˘šNDÉRÂrpEńäÖ””ŔEV’n4TK­U‘®Tí|(Uő“B•MҸĐHÎČżňľđ(ć?‘—§· endstream endobj 669 0 obj << /Length 170 /Filter /FlateDecode >> stream xÚĹĎ1 ÂP ŕt*dńÍ |­ĽB·B­`A'qRGEççŃ<ŠGčŘáń~óě"^Ŕ!äO2¤,¦3+ąZe.Öʱŕ ŰJűO‡37›­ŘŠÍRS6ÝJn×ű‰MłžKÁ¦•ťnîąk…(QíS<É… =!8 *TŔS ¤Cí)ú"=‹7ęăKú5üßĂŢÁgń« ďŚŽÉ8ĺEÇ~P„z§ endstream endobj 670 0 obj << /Length 202 /Filter /FlateDecode >> stream xÚ•Ź=‚@…ˇ ™†#0Đeĺ't$ţ$Rhea¬ÔŇBŁ5ŤŁpJ â¸ě6´&“WĚdŢű^¦ç‹”cÎy¦9ÍĆąjzPReĚiî.—;-+RGN R[ł&Uířő|ßH-÷+Ö¤Ö|Ňź©Z3Ľ/€P ”¨ĄDx"_řâ ‚ň {ÔMءl˘Q5Űň łRékŔźńő†żDĚŰ0qM]†Isâ Fk,š…´¸ÜU°el­± m*:Đ9‡n˝ endstream endobj 671 0 obj << /Length 172 /Filter /FlateDecode >> stream xڽα Â0ŕ@áˇ÷¦Ńε‚ťÄIťÓG‹88úö2:H“ştöŕ>řď8¸ˇęő5g<­G¬5oHÇYc\lö”’ËINÍŚOÇóŽd>ł"YđJq¶&S°"©…E™˘śE\˝¸-îu׋ôáŁpť*X&.ÎEZ7ľź-}ËęK÷7-^D¨_~¶41´ 7Îyiő endstream endobj 672 0 obj << /Length 177 /Filter /FlateDecode >> stream xڭб Â0ŕ+ ·ř˝Đ4%q-Ô ftr'ëč čś>šŹâ#tě =/uÔ ßđ˙ÜAÎęIn(ŁśĆšŚ!k©ÖxBŁ%ĚČN_ÍţĄCµ!ŁQ-$Fĺ–t9_¨ĘŐŚ$­h+3;tA|yÉ=8úŢ‚™ŕĹřM?´żě˙Źé`Ń|Ň‹-xąI ,vQ°Oz€xřEÄÜÉ:ćVôv§Ü„#J‰s‡k|jVmx endstream endobj 673 0 obj << /Length 194 /Filter /FlateDecode >> stream xÚuʱ Â0ŕ‡Â-y„ŢFcÁĹB­`A'qRGE·ÚöŃň(}„Ś 1A¬Xđŕ>ř˙»©Ť%E4v+g$'txE»ůčÇ ¦9ňÉůʵČó5ÝoŹ3ňtł <Ł˝ č€yF•­k¬U̶Ö6áW߼ŻL0Ĺ€PŢúŻ ©‡^ř•)oŘ|D—=+ă-:ÁY´nzš˘Ó˝€§)˝zŢYé¤3iBÝS1'«¸Ěq‹/ő§„g endstream endobj 674 0 obj << /Length 224 /Filter /FlateDecode >> stream xÚeʱn1 †}şÉ Źp~r©Ôí$ 7 ÁÔ1ŃŽZ••äŃň(y„c+ť±‰ ůd˙Žíß/Ídj©¦™<űJvF ~ŁU­ÖT ‡/śwhŢÉZ4+QŃtkúý9~˘™oÔ YŇ®ˇzŹÝ’ZŽ˝ăČϬ2+ą Ś#€*´>łő ąÚI8ęĺů&,Ż‚•Ŕ}bTş l+źb˙ݏřřY\µ«¸č„2ÍĹLÝ5N{« ÍâG™Ľąäs/PÜ ěÁé 1ťÓ?3Wń­Ă-Ţ%_}Ý endstream endobj 675 0 obj << /Length 251 /Filter /FlateDecode >> stream xÚ]Î1NĂ@б\Dš&Gع؎íHT+… á * ” ()@ĐŻÇŕ*>ĘÁĺV†ťu,7O«?Ňţ_fç«‚RĘél•SqAENOľbQú4Ąőúxz|ÁM…É=%&×>Ǥşˇ÷·ŹgL6·—”a˛Ą‡ŚŇV[2Ü(¶Ě­ćŽŮvŁ’ ×Řô9LJĺt€¸¨'XX=µY¶jâ˛UÍI+.¬†“ť­˝‘›ş÷‚ëĹ~ЉűŕgPws•ť+CFŐ`󯄹őÄCHe‚ŽDó%ĺć;ř#µć7ČR¨ą ĘÇŠCwX‡}xUáţß~Ç endstream endobj 681 0 obj << /Length 111 /Filter /FlateDecode >> stream xÚ340Ôł0Q0P04W01P°0U05PH1ä*ä23ŠĹaRÉą\Nž\úá fć\ú@q.}O_…’˘ŇT.}§gC.}…hCX.Oű˙ĐPe€Ň˙Ä€k‡ČĺęÉČ­\g› endstream endobj 687 0 obj << /Length 171 /Filter /FlateDecode >> stream xÚ31Ół´P0P0´PеP05Q03VH1ä*ä26Š(BĄ’sąś<ąôĂŚMąô=€â\úžľ %EĄ©\úNÎ @ľ‹B´ˇ‚A,—§‹˙˙˙ä˙˙€NŘ$ěě0‰z8Q‡…ř'ţ`Śâ&ÁŚ >`ěâ&ÁŹ `ň˘“°G${÷˙˙ â?Q’ŕrőä ä¬`E endstream endobj 688 0 obj << /Length 171 /Filter /FlateDecode >> stream xÚ}Ď1 Â@…á aš!sÝÄ51VBŚŕ‚VbĄ–жnŽ–Łä–â¸Y-D›ćMőŇŢ(ŁúÔÍHg”jÚĹxDť¸1˘aüţlT+Ň Ş™›Q™9ťO—=Ş|1!w´Ž)Ú )ć Bćú—  đTˇ§{@Ŕ6\%ž –ç.ĐöÜ:žZ@Ě ˙äZćř|aŮeŕÔŕ_U/b˙ endstream endobj 689 0 obj << /Length 143 /Filter /FlateDecode >> stream xÚ=Ę1 Â@„á‘wŠą€n^˛Xb·´˛«hiˇ(ŘmŽę,-‚q#(|Őüc§“YÁ„j9ÖŚYJUT΢y¦öך“TNĚ–š‹Y† Ć­x˝ÜŽbŞőś*¦ćN™ěĹŐÄŁ7˘ń ý‹ľ”ŕĎq‡ň˙D˙€o‡R˛p˛‘äŽ,˘ endstream endobj 690 0 obj << /Length 99 /Filter /FlateDecode >> stream xÚ31Ół´P0P0´Ɔ †† )†\…\@Ú$l‘IÎĺrňäŇ pé{€IO_…’˘ŇT.}§g ßE!¨'–ËÓEźÁţ@ýú˙!Äncŕrőä ä…˙h endstream endobj 691 0 obj << /Length 143 /Filter /FlateDecode >> stream xÚ31Ół´P0P04W06P01S05WH1ä*ä2‰(™CĄ’sąś<ąôĂŚ,¸ô=€â\úžľ %EĄ©\úNÎ †\ú. ц ±\ž. ü ĚäŘŘŕ˙€ŔňŔ¸AţA=¨g€a{nř‡Š@ř×CqĂ ®`°aŕrőä äSĹ<ö endstream endobj 692 0 obj << /Length 193 /Filter /FlateDecode >> stream xÚeĚ˝‚0đ’[xî "~-’ &2čä`śÔŃAŁ+°ůZlľ›+› ÄzĄ1­xéý’»K˙Á°7ه}ę`€|8CŕÓě‰Qö'p7řŕ.h n˛Äëĺv7ZͶ1néË’c!•ĺ­…+ Ý—Đ”>•–ô!´uďBG3´¤%9mM5›®F­4«®VŮŐ.”çŐŻˇfÖšRŇ×FiHkĄţ˛7e0Î)#˙W^ažŔ>ć endstream endobj 693 0 obj << /Length 253 /Filter /FlateDecode >> stream xÚuĐ˝JÄ@đ˙’bašĽ;/ ą@λ«ç ¦´˛8¬ÔŇBQ°“7ńQĚŁäRZ,;În<9›ËĚîÎGu|´ZňŚ|Xrµâů‚oKz ŞÔŕŚçË)ssO놊+®J*Î4LEsÎOŹĎwT¬/NXŁŢę›kj6 ŘѨCŢ"®yď`E¤Cžt>WëŃ ĐöY´3Şč]>š}vrŚćĂž}Ô©ŻĐ:xA­jmüµMľýcHúoŤ„¤¨Ů/ĂOvjaOýÍMö±b˝S»j“ŇÇTt0qşŐ;Ů­'KjíŹiyq ć:<č´ˇKú~)§ endstream endobj 694 0 obj << /Length 186 /Filter /FlateDecode >> stream xÚ}Đ= Â0Ŕńá-=Bß LŠMŃ©P+AĐÉAśÔŃAŃŐöh=ŠGptă{1ęb$˙đ#CH–÷†Tا©3Ô9nRŘVČ–|°ŢAi@.P+Úi¦x<ś¶ ËŮS.ST+0ŠÚ6”°¶±Ž–úâ6kË‰î… ±§ĺ‚$Dâi¸ Qx¬Ą7üĄ~qvy7™»+DDDž¤Ct> stream xÚ31Ół´P0P0a3S3…C®B.C ßÄI$çr9yré‡+ré{Eąô=}JŠJSąôťś€˘. Ń@-±\ž. ő˙?000ü˙˙+ ‘e8IvůÉ!ŕ#ĺ!d>ŇB2ŕ#ëÁdn’ťáĐ҆?`c±’ö ŚňČXY˙ţc%˙e˙0pązrr«ĆeT endstream endobj 696 0 obj << /Length 262 /Filter /FlateDecode >> stream xÚuĐAJĂ@ŕ˛x›ąAóN`’bŠ‚¤P+… «.ÄUëŇ…˘ŕ"8…ŔčEB‰x‘xq7‹@|/Ģ.†oţa7üű“˝ĂJhĚ+Ë(›Đ*Ĺ[Ě$'ełĽÁYń‚˛1Ƨ|ŠqqF÷w×ĎÎŹ)ĹxN—)%WXĚ Ś0 A×@'X!”ÔöTW®@• čF-@´…\ČáČő”žGaÎóÉLŁ@Č+„?QožwćI« Sj˝i„ç°çŐóâŮ*¦Ő•ŕTĄjÁí`t Áµ^3ü˙żÖđłüĎ@ đü#=ÖŇŁňuţf¸‚'^ŕ¬^Ťü endstream endobj 697 0 obj << /Length 215 /Filter /FlateDecode >> stream xÚ}бn0ŕ‹ná|OPBP:!‘T*C¤fĘeJ;fhŐ®GăQxŹ çî(JXbŮźtgËţĺ4{y]SLK^+ž}&řŤiƵ–˛qľ`Q˘=Pšˇ}ç.ÚrGż?_h‹Ź %h·tL(>aą%Č˝w•÷ęGkµ‘]ßBŕ r˘QĂN &C‹Âv&ĚŤ¸ßAÔĚ FťČ—FŽ™Śš7"'1uŔ©Ś&ä<˝Ú©­Z‹Ü†dTęő©Ú?s1ÚÝ­řC&őíűřVâo‡¶} endstream endobj 698 0 obj << /Length 234 /Filter /FlateDecode >> stream xÚ}бJA ŕ,[ ¤ąG¸Ľ€Î.Îťg5pžŕ‚V‡•ZZ(Ú‰;ʶʞba;ĺËĆ$‹'X„ŻHógÂňřlEťĐQMaE‹%=ÔřŚ!Hł˘Ĺé4ąÂuţ–B@)môÍ˝ľĽ=˘__źSŤ~CŰšŞ;l6-30sofs0GĐ©čzÇ*pR[3šóf“Kć鯢ق:Ş…““w#ÄťhI˘Ą;3Yžî×˝:3]VKq4‡Cî;˝ŕżźy˛ż˛,ďmÜw–Žű˝%wf’iˇ_ đxŃŕ ţxŻ endstream endobj 699 0 obj << /Length 262 /Filter /FlateDecode >> stream xÚu1NĂ@Eż•"Ň4>‚çŕXq ©,… á *Š ()@ QaK\ĚŮ#¤ĂEČđg ’¶xŇÎĚţyÚňäxµÔ™.ô¨ĐrĄ‹S˝/äIĘ9‹,/‡ÎÝŁ¬kÉo´śK~Á˛äőĄľ<ż>Hľľ:ÓBňŤn ťÝJ˝Q Ý'PŮGĚ>&f_S3 H#ł>%«X‡¦…h:řî—ÉţŹY›ô˙3…đIžC¤E2Đ•ů%3żĐ¤UëmŠ€r»8™ĆŔÉ8vĚaĹ;7;ł­×«Ög*ŚŘzÉ´”šîĐđ'H âű8o3.Ů7F…>sÁ·Äe弖ků« …" endstream endobj 700 0 obj << /Length 222 /Filter /FlateDecode >> stream xÚmϱjĂ0ŕ3 ·ř|/ČŮm&CšB=Ú©CéÔděЬ¶ÍŹâGđˇäúKÎř@ŇÝ’«×›G)Ĺ–˛˛RURŐ˛·üËÎá´”ęávőýĂ͇ۖ8ÇćçlÚW9Ď6Ű·'±lvňiĄüâv'˝…NŞcŁó˝Ëm6Qrˇ¨é…ňĹ‘Ň9n6S±8ř–¨iÉ·DEHěČ·DEČ5řGľ%jě‚×`XIŘâ[Bž óŮ6śtÄ ŐOR%˘L@©˘śEaMÄĎ-żó?Č€N endstream endobj 701 0 obj << /Length 217 /Filter /FlateDecode >> stream xÚuĐ˝jĂ0†á/dś%wĐś+¨ěâüM‚$…z´S‡Ň©íء% ĹęĄőRr =+:źˇÔĐô‘xq1»^.4Ó"íéŤNgúšË‡ó4g6ÚĹË»¬JqŹZĚĹÝĄSqĺVwźű7q«űµćâ6ú”kö,ĺF1‰16đ©í? Ľ­€amť¬ăŁuŇő-ŕżńŕAcv­­‰‚D J+tµôh‡Řń%J/Đż¨OŻH=‘'ňüTOęIi Şř^ĹźŃöŰđ¤†Ü–ň g‡ív3 endstream endobj 702 0 obj << /Length 219 /Filter /FlateDecode >> stream xÚMϱJ1ŕ˙Ř"0Í>Bćt7ô¬ÎÜBĐĘB¬ÔňŠ­“GËŁě#\yĹ’ßY•C_„ü“‰—ç×kíőJςƵƠoAö{]VĽř˝yÝÉf”îIc/Ýť•Ąďőóăë]şÍĂŤé¶ú´‘q«hĎ H<äŚY­N˘™WĚÍŚ!»#|i~8 -€v:Qţđ,Ëăb#–ÇâX}n™}ö–’‡ÉHŮ’Śj`ţO:AŘoŞm®"•Äj™¬Ak1°µäęxp3–Yäv”Gů-mŞ endstream endobj 703 0 obj << /Length 235 /Filter /FlateDecode >> stream xÚuĎ=NÄ0ŕ‰\Xš&Gđ\’hČV––E"T+* ¤D49šŹâ# ‘'»¤@Đ|Ĺ{SĽY®O7-Ő´ˇ“†–-­ÖôĐŕ3.ư¦Ő١ąÂm‡Ő--Z¬.sŚUwEŻ/oŹXmŻĎ©ÁjGű†ę;ěvd°)Ă3v†(&â_*rő) Ô—(éGśĎ^KoĽNP=€:źF±ô#îČ™b0caúߨ‰`Źč‘Ň˙`śu`;ŕž}!ŔA%ŕg‘yY€$â᥇÷éő<đ˘ĂüK~ endstream endobj 704 0 obj << /Length 210 /Filter /FlateDecode >> stream xÚ…Ď1NÄ0ĐĄ4ŤŹŕą8fŁ•Ąe‘H˘‚-·AK|´%GŘ2…•amCEágé[ö|wýůő·[>‹Ü]rů-Ň;mzM[î.NGŻÚžxÓS¸ÓśÂpĎź_{ ۇŽvüą}ˇaÇ@Z€JhD2ĽČ„$2c4dvÇJŕŽuź›N¸Éͨłźü’˛ˇ Łńý—Ő(˙łžpöŠ7Rłîi‚čřj…/M)ÖvAm+«¬uő˛ÓżĐí@ŹôÄ"SĘ endstream endobj 705 0 obj << /Length 232 /Filter /FlateDecode >> stream xÚmαNĂ@ `W"yąG8ż˝DJS:ťTŠD$02€Ęš»ľY%ĽAĆC:Îř d)˛ô ¶ĺßM»ÜśSE-ťŐÔ¬iŐŇSŤŻŘT”kµţť<ľŕ¶CsGM…ćJÚhşkÚż˝?ŁŮŢ\PŤfG÷5UŘíT4 vFĎ@˙i&žŕ ţ ř3ČŤŻŽ9 8 6”ôTP“š=B9éA°ţČčŕŹţSFBÔpŠž±ţYvľĎČě­Ďńb‰·µ|•T¦dv©ŕdp°Qvđ˛Ă[ü6˘}é endstream endobj 706 0 obj << /Length 221 /Filter /FlateDecode >> stream xÚUŽ1N1E´…Ąi|ĎŔk˛¬BµR[ AEQAĘ h±ŹćŁř.SD;Ě&ÂOÖÍź×ő—7+nyĹ»kîżz§eŻaËÝŐyňş§őHţ™—=ů{ŤÉŹüůńµ#ż~Ľĺ@~ĂŰŔí Ť† ,¤FŽ€“I# Š$HŽy!pą9ÂsPŘ SlQ¸ S]BS‡ 3ľO?9Cź”˙Čz řĂô Ý5I[lŠIďŞÝ†‚\…ŔNÍ+*iDę=‹kçěśtSËčn¤'úá-oś endstream endobj 707 0 obj << /Length 190 /Filter /FlateDecode >> stream xÚ}Î;‚@Đ%$Ópç.$ë‡1q ­,Ś•ZZh´ŽćQ8%aśaŐÄD)öeç—3&SŚĐČKp4ÁC g0GĘg‚Ô‚Ţ 1 śm—x˝ÜŽ ÓŐ cĐncŚv`3TJyĨ€ě€J6ď$ޤ(úr&¨;«;ĂŇ/X™y9p˙ő‰¨áEDí]•—K»ş÷Úv6}zÎşOßYő8ËŹywf.'+ú¶yWana OŮq endstream endobj 708 0 obj << /Length 286 /Filter /FlateDecode >> stream xÚu‘żJÄ@Ćgą"0…y„ťĐü!¦ą…óSZY•ZZ(ÚÉ]-ŹrʰvABÖůs… .™ťoçűv›ĺI{F%Őt\×tZSSŇc…/Ř´\-iY¶žqÝaqKM‹Ĺ%×±č®číőý ‹őő9UXl订ň» dŁ› Ěyb¤R.ńęaaČ ůäçŕcʏXŚ"ëť`?±5̆éo,Š,Ş ß«Üďő°0Č„gó_R°Pg¶)‡¸Ď$ý.îz…4ü/é@ciJÖKJîĘ“núČyAĚ u%¬>@+âŔŚż +ĂÖ0«@®:Éťs <#ŚNĆz3‘›ĄĚb:‹ÉŮ%č^txßŰşšó endstream endobj 709 0 obj << /Length 207 /Filter /FlateDecode >> stream xÚ}Ď; Â@ŕ‹Ŕ4Á9›´ řSZY•ZZ(Úf=ZŽ"xS¦g7⢠űÁ?łĚ2AŘôÉĄ®Ü ¤^H[ř’]McłÇaŚjIŹj*UTńŚNÇóŐp>"ŐVąkŚÇQrtaäő‡ŤüźÍĘě—Q ŕd,Éą±Ľuî懹|›Š--Ö"1ł^źJ˝ťBňňRŁĚ‰*Šz˘¶&v:ÍNĄµ°{X5gšSć\óUäo«.Nb\ŕłŢ endstream endobj 710 0 obj << /Length 168 /Filter /FlateDecode >> stream xڕʱ Â0ŕ+…[|ď LBŞŐI¨Ě čä Nęč čjúh}Á±x&A… Ü˙—ő»ĂIĘÝfŠz9mPk—ĄŹţ°ŮcaP,IkSע03:Ď;Ĺ|L EI+ErŤ¦$€ä éÍŃ4ßř.ő/­ţć ćú@'PE ‚ő\b<<÷I ya™9PńűpbpO)T< endstream endobj 711 0 obj << /Length 210 /Filter /FlateDecode >> stream xÚ•Đ; Â@ŕYRÓx„Ětóđ•J ¦´˛+µ´P,Äx4Ź’#XZHĆŮ ş6.ěWü» 3Óę4ŁyP#đ©P»KkwF’zÔí˝źV[ŚÔs #ÔcÉQ':ěŹÔńt@>ę!-|ň– äśäާŕäźL=Ěż;üw3ĂÔ'EP+Člę7·âjÓŻ›´äňĽäiŁĘ=|áĽ:›ľs›Ň+°bŮĚ-ŐS–J}ł—e GrŔQ‚3|‘d± endstream endobj 712 0 obj << /Length 221 /Filter /FlateDecode >> stream xÚ}Ď˝ Â0ŕCá–>Bî ŚĹZt řvtr'utPtSß,ŹŇG›B1ŢEAA1$$wąKҬŃí`[´Ú43\%°…4Ł}Řr`ą^j†ijD§ ň1îw‡5¨Ţ¤Ź ¨Îl.  0NĐđ×ßš`Íýłţ´ügTj*Yó˛úO8Ű:u‹‹Č±qÉJËę‚˝Sy®XN’…äD!uаڻ·7ÎÔ— ĺ»:Ô1âDž„&Ź/eń6¦ľ•ŕŇôş ýŇxúEá˝3Ţ~űŚÂ0‡)<|…] endstream endobj 713 0 obj << /Length 159 /Filter /FlateDecode >> stream xÚ31Ół´P0P0b#S3…C®B.cS ßÄI$çr9yré‡+›ré{Eąô=}JŠJSąôťś ąô]˘  bą<]ę˙``ř˙˙Q"?ŕ ŘÁÄ?8€ 8{0Á€¨u¸ â‚Lü€ő˙˙˙?Ä˙ ` .WO®@.ŇR_^ endstream endobj 714 0 obj << /Length 177 /Filter /FlateDecode >> stream xÚ}ʱ Â0€áJ‡Â-}…{ÓB(u*Ô ftr'utPt+¦Ź–Gé#t¬<Ż¦â –Źüpw‘Éx’b„1?™˘ŚpĂ dÂsÔŤÝaw„\XŁL@Ěy B-đrľ@äË)Ć ÜđĎ-¨=/4ˇńmVgu𤆚€čN-÷ń.‘ő»µő´Ń¦ôtĄ+.űôĆJf{mß?FN3Äwę!cľt›1˛šýÖ]a¦`/B…‘' endstream endobj 715 0 obj << /Length 190 /Filter /FlateDecode >> stream xÚmĎ1 ÂP ŕ·,ÁśŔ÷jE§B­`A'qRGE×>ŹÖŁ<€;”ĆôµB‡|?NsŇ4“2!Mgohéu۶ÓăŐžL€j-)ŞtCŹűó‚*Ţ.ÉG•ĐÁ'}Ä4!rđ8çFüćJüp-27˝sŢŚ¬X;+ÄŇYôJ>É!űůPöDťő°žhťxŐ°#±qĘ©eŻĺŇĘ#\Y.Dţ·›â*Ĺ~ąěps endstream endobj 716 0 obj << /Length 217 /Filter /FlateDecode >> stream xÚeÎ=nĂ0 †áĎđ €‹Ź ^ •Őů™ä¨‡íÔ!Č”těĐ"YkMGŃ4z0ÂR :]Ţ"ħ™=,\ó‚'ž›7žOž>i:×aÍÍăýĺřAë–ÜOçäžtL®}ćó×ĺťÜúeÞܖ÷žëµ[V($FFŔĘUG"@'ŇC‚„âŞ;ĺMBM„IUŽ (“í5«[€rĐĂ÷ßč·eúsKüMô˛˝§SCŻéĐ©AĎgC4jě FĺV"jČĆ"k‘ńJh×Ň+ýĚbo endstream endobj 717 0 obj << /Length 247 /Filter /FlateDecode >> stream xÚuĐżNĂ0đ/ę`é–<‚ďJUe˛TŠD$02´‚µî›ŃGÉ#dô|ś­¶ĘP,ë'Ëç?źÝ.®n–\óĽáůuÍí’ŰšßÚP›¦k^śkoź´ę¨zÖETÝkŞîż¶ßT­oąˇjÍ/ ׯԭ€ € 6~ô˛‡˙9Ŕ‹Hźŕ$Ř€Bz“ÜĎF…Ş{bÝa˛ĂIźu=L®šţ’1;˘> stream xÚ}Í= Â0ŕ” …·ôľkŃI¨Ě čä Nęč čÜ­ŕEz„ŽbźIJĄSď÷›$ť.(qfc.1‘xŤáIjsźşĆĺ™qÄ$±µUj‡Żçű"ŰŻ1‘ă)Fy•#łŻ¨ŇśN&"’Yy 2śľä$úPË5sŁÎšŐÖĘ®TzÝ)ŢzÍ@=°q†ťőQg5椳ü[Ůo¨× Ô}6 đdůcq endstream endobj 719 0 obj << /Length 222 /Filter /FlateDecode >> stream xÚmŽ=NÄ0…_äÂŇ4{2ÇlX…ĘҲH¤@‚j D” (ĽGËQr—.L†±(  ů4óŢüĽ~sr>pÇ>öÜźqďůŃÓ ­«Řqúă<<Óv$·çő@îJeră5ż˝ľ?‘ŰŢ\°'·ă;ĎÝ=Ť;b`důD+R*b…(™ÚbŘb2L± M¶ó?H@2ĐKĐh)˘jĐKXŐ^Eµ¬Ěj…ŠU:ŇůÔŞ•Ă/`rś`Sśu8&]‹iÖx2UľD”š6ýöaő]ŽtKßĺqü endstream endobj 720 0 obj << /Length 187 /Filter /FlateDecode >> stream xÚuĎ˝‚@ đ^Hşđô.€Á‰1ńťŚ“::htŤGᵇ“ ÷K®˙6iŁéd–P@ Ť5EĹ5^0ŚĄP¬ßÉጙAKaŚţRĘč›Ý®÷úŮzNňĎi§)ŘŁÉ F8ő/nOőź‚™+y\Ń–Ň—Â…ĺ1DgiP-¸ đĘŇ–>Őę™an,O»´ś”Ęzŕ±˝Rę¸0¸ÁĘž^Ŕ endstream endobj 721 0 obj << /Length 187 /Filter /FlateDecode >> stream xÚeÎ=‚@ŕ!$Ópćş? b"…‰VĆJ--4Úş{4ŽÂ¶¤ Ś»ÄFiľâÍĽÉ$é˛Č)¤ś%)Ĺ]"Ľcś™0¤ä;9ß°jP(ÎPlLŚ˘ŮŇóńş˘¨v+ŠPÔtŚ(> stream xÚmͱ‚0ŕ# $·đ˝'°ĐČ" b"‰NĆI4ş)ňh< ŹĐ±Z{upФý’»ëýMGlL%ö¦%ícĆ4ĎgŠł WřöfY endstream endobj 723 0 obj << /Length 198 /Filter /FlateDecode >> stream xÚuޱ Â@ †st(dé#'đZzNZÁ‚N⤎ŠÎ˝GóQî:vĎ䔢|đ'$f4śŚ)§’ŰŚ©śĐˇŔ3Ă9—(‹ý §5ę zÁSÔő’®—Űőt5ŁuEŰ‚ňÖAŕňJŘţˇO:{OZ€ŕ*3yÓ”‡ŚW¬xasz YäĘ:áŕ-FĄq˝D1ýýG̢8p|”)˘u©üă䨍˘…FţüačůŚ“ŕĽĆ5ľ8×oó endstream endobj 724 0 obj << /Length 179 /Filter /FlateDecode >> stream xÚmÎ; Â@€áY¶L“#8'p“ŕ+U F0… •…X©Ą…˘­Ů›éQr„”)$ă¬kń ě?Sě`ÔO'QÉD4Ó>Ć&)ą"Ď÷fwÄĽDł¦$E3—ڦ\Đĺ|= É—SŠŃ´‰)ÚbY€¶Á üč‰LTŽĹ´łUB3Kşî2Pmr/*qűŁOźrZźv_ŕÔľ°ţ~˝bnąýĺÎJ\á Ćü\T endstream endobj 725 0 obj << /Length 244 /Filter /FlateDecode >> stream xÚ]ÁNĂ0 @qäK?ˇţŇjÝ`§Jc“č N'ĆqŇ@p%ý´~J>ˇÇŞŰa)OŽýśDiV—ëkŞh)«YÓňŠö5ľał}Ą[mĽpÓax¤fáVŞş;úx˙|Ĺ°ążˇĂ–žjŞž±Ű€?DËypĚ“”™g€‚YÚĺěY”ÜC;@ě!‚&_Ň@„b•“Ë”Š?§ŐłGóá‡efoŻČTčö8gĽ•~˛Ńц’év@´Q6Ńtozazkz4‘Utü_)ł’ΔQÇMŞE¶¬˙˙óŃw>ŕ7čĽx@ endstream endobj 733 0 obj << /Length 146 /Filter /FlateDecode >> stream xÚ%É1 Â@EŃ/ßd y+p2dbśBĐĘB¬˘Ą…˘ť`–6;Ń%XZ„<–÷\WĚć%Rp9śE^ŕhő˘™1…µ˙ÓžµöjvČśšŐČjü·ëý¤¦Ţ,0v˝EzPß`ŇK$%îb†$$üTˇâŔđ$ŮńE §döňę+ĄÄoѥ׭ţ°{/ endstream endobj 734 0 obj << /Length 197 /Filter /FlateDecode >> stream xÚŤŽ± ‚`…Ź4wéş/Pj–)‚äÔÔMŐŘPÔš>šŹâ#46Č_Gth ľĺŢË=監(TW˝©Cő# |=yr•±Ď­«3Ż;/’fâět싳â^śl­÷Űă,Nş™+ç…î=u’-',ž]Ł˙Ć BR"/𠬽wý‚]ˇOJ HŃ4äMJ‡ę˙0?_9ş¨¤čÂŮÂ.6˛—í­†ŐľŃŤ†ô¤-ťiN«Í‹e™ÉVľ‘ťLŹ endstream endobj 735 0 obj << /Length 196 /Filter /FlateDecode >> stream xÚŤŹ= Â@…ź¤¦Éś čćGb¬Ťŕ‚VbĄ–Š‚•ńh%GH™"¨/ŮÂVřšťeŢűf Ć©šj?Ő8Ň$ÖC(g‰b…îg’©łŃ(łŕXŚ]ęőr;Š™®fĘw¦ŰPťŘLď@ |Čů “~‰nŻFç <z/ř¤@—”đ:ŽşMrpíńďß\3]8[ŘĹFö˛ÝiäÍÝhHOÚŇ™ćô˙´AĽHćVÖňxuO’ endstream endobj 736 0 obj << /Length 110 /Filter /FlateDecode >> stream xÚ31Ół´P0P0´TеP01Q03VH1ä*ä22Š(BĄ’sąś<ąôĂŚL¸ô=€â\úžľ %EĄ©\úNÎ @ľ‹B´ˇ‚A,—§‹Bý˙˙QŔż? C ýGőĐG\®ž\\0ńoy endstream endobj 737 0 obj << /Length 112 /Filter /FlateDecode >> stream xÚ31Ół´P0P0VеP0˛P03VH1ä*ä22 (Bd’sąś<ąôĂŚL¸ô=€Â\úžľ %EĄ©\úNÎ @ľ‹B´ˇ‚A,—§‹Bý˙˙‘@ý˙˙ öC Ő˙˙Źę…\®ž\\ĽHB€ endstream endobj 738 0 obj << /Length 179 /Filter /FlateDecode >> stream xÚ31Ół´P0P0UеP01R03VH1ä*ä26 (Bd’sąś<ąôÌ͸ô=€Â\úžľ %EĄ©\úNÎ @ľ‹B´ˇ‚A,—§‹Bý†˙@Ä0Ń"00Ô†ú@‚D0˙Śô @Žař"ţW"í˙Ý "Řá,°X¬îL/=  p¸Ô€†ŐŃ ISŔˇËĺęÉČŽőp endstream endobj 739 0 obj << /Length 106 /Filter /FlateDecode >> stream xÚ31Ół´P0P0UеT01RĐ5RH1ä*ä26 (C$’sąś<ąôÌ͸ô=Ěąô=}JŠJSąôťś ąô]˘  bą<]ę˙˙˙˙Lń˙!ÁĺęÉČW51ń endstream endobj 740 0 obj << /Length 180 /Filter /FlateDecode >> stream xÚŤN; Â@Ůnš!swCM*!Fp A+ ±RK E;!/–Ł^`%mȸöÚ ĂűŰŃ0ĎČĐ2˛ Ů1í> stream xÚ31Ół´P0P04SĐ54V06R04TH1ä*ä24 (™Ŕä’sąś<ąôĂ Mąô=€\úžľ %EĄ©\úNÎ †\ú. ц ±\ž. ěř?Č˙°˙a˙˙Ů˙“˙Ç˙ŹýCĂ?†?Ś@Čü˙ý‡˙ţřßPÇ`ÁŔĺęÉČŃ4,r endstream endobj 742 0 obj << /Length 96 /Filter /FlateDecode >> stream xÚ31Ół´P0P0Ć@ÚP!Ĺ« H(€ą`™ä\.'O.ýp —ľôôU()*MĺŇw pVň]˘zbą<]äěęüőěä¸\=ąąŠŽ– endstream endobj 743 0 obj << /Length 162 /Filter /FlateDecode >> stream xÚ31Ół´P0P0UеP01R03VH1ä*ä26 (Bd’sąś<ąôÌ͸ô=€Â\úžľ %EĄ©\úNÎ @ľ‹B´ˇ‚A,—§‹<bĆ@‚N° ?8$äÁD° ­ő ˘Dü`#ř2î©fâ2X3Iq,63© ă*@—«'W yK/ endstream endobj 744 0 obj << /Length 104 /Filter /FlateDecode >> stream xÚ31Ół´P0P0Ć@d©bČUČehäą`™ä\.'O.ýpCC.} 0—ľ§ŻBIQi*—ľS€łPÔE!¨'–ËÓEAžÁľˇţŔ˙0XŔľAž0Ŕ®ŹËŐ“+ 9Ü-I endstream endobj 745 0 obj << /Length 157 /Filter /FlateDecode >> stream xÚ…‹±‚0EkHŢŇOčý-„ŔD‚ŘÁD'㤎]‰źÖOá:2b˝g»'g•/Ë18Ç‚S¤ ŇW¦qîY2ąËťjCúÎHo mvx=ß7Ňő~ &ÝŕÄĎdDVvĘUý„r˛‹¬ř»Đ9ő+†€ŻĽňŇG^´Â‹a÷ŇUněF;~ZQÚ:Đ?¸8 endstream endobj 746 0 obj << /Length 111 /Filter /FlateDecode >> stream xÚ31Ół´P0P0V04W01Q0¶PH1ä*ä21PA#CLr.—“'—~¸‚‰—ľPKßÓWˇ¤¨4•Kß)ŔYČwQ6T0ĺňtQ°˙˙˙˙źz ńď?*‹1pš¶ËŐ“+ ĎJS endstream endobj 747 0 obj << /Length 102 /Filter /FlateDecode >> stream xÚ31Ół´P0P°P04W0¶T02VH1ä*ä26PA3Dr.—“'—~¸‚±—ľ‡‚—ľ§ŻBIQi*—ľS€ł‚!—ľ‹B´ˇ‚A,—§‹Bý˙˙?ţ˙˙˙ĸ\=ąąE:(“ endstream endobj 748 0 obj << /Length 118 /Filter /FlateDecode >> stream xÚ31Ół´P0P04P0"sSs…C®B.#3 ¨‚‘9T*9—ËÉ“K?\ÁČŚKß(ÎĄďé«PRTšĘĄďŕ¬`ČĄď˘m¨`Ëĺé˘`ĂŔĎPÇ ßđźÁţ!\Ď`߀ ĚŔ‡Aöpązrr]7˝ endstream endobj 749 0 obj << /Length 190 /Filter /FlateDecode >> stream xÚ31Ół´P0P0bSSs…C®B.ßÄ1’sąś<ąôĂLڏô=€˘\úžľ %EĄ©\úNÎ †\ú. ц ±\ž. ö P߀ ˙ŔJ2~~€‡dţüť|"ŮţŔN‘üţ`%ĺę°’ö ő ěhL˛¨ FÖ˙˙'˙˙y“ü´Ťńű,$3üŔŔŚę˙3Ř˙o€˙AŚYśËŐ“+ H0‚6 endstream endobj 750 0 obj << /Length 198 /Filter /FlateDecode >> stream xÚ}ϱ Â0ŕ” …[|„ŢTkŃI¨Ě čä Nęč čj}´>Jˇc†Ň 4č „|4ůÓ;.ˇł)JąťŤq’ă)…+dią#Ç  Ä3 bĺnA¨5ŢoŹ3błŔD‰űĺT‰•µšYk[Âz^Dí«yĂ’Ć1 ¸é‰<­ý§QřSH¨hUsjD0NÍű/ëýŐňŁQG<óżTá]×ăKĹDbh@CŁ6„“3K[xŁGśj endstream endobj 751 0 obj << /Length 230 /Filter /FlateDecode >> stream xڥбJÄ@Ćń/¤LłŹ°óş Éi¬ç ¦´˛+µ´P®Ű©¸©ysÎĎ˝Q­‡%oÚőćé•¶=ą{®[r×é\Ăďź/ä¶·—\‘ŰńCĹĺ#ő;üĐ"ŹÓL EĐĹ(đJŁdťäG)‚2Ł3!_±#2±C˘[°â•Ă{GEţÁňŔá{˙űĺʰ :Z2 fFŠ…€bÖ9eŮ)úQSŤFĘO?žV2C—şę鎾?9ru endstream endobj 752 0 obj << /Length 197 /Filter /FlateDecode >> stream xÚ31Ół´P0P0bS3…C®B.C ßÄI$çr9yré‡+ré{Eąô=}JŠJSąôťś€˘. Ń@-±\ž. ő˙˙700ü˙˙˙ü&˙É˙ @Y 4űĆ˙€$ý)&ů?€Hö ’L2ţA ˙Č:0Y&íq‘ Ržbb¦ůőH.©C¸ ŮÍ_@|ńťü¸ŻA! HČŔCé,ô !ÉĺęÉČÝI endstream endobj 753 0 obj << /Length 149 /Filter /FlateDecode >> stream xÚ31Ół´P0P0bSS3…C®B.C ßÄI$çr9yré‡+ré{Eąô=}JŠJSąôťś€˘. Ń@-±\ž. ő˙˙˙˙Ă$ţ˙ĂBÖIć uD“6`’ůD2ţŔJţ˙OÄĄj2ŰřÁ¤|©$(4ţ7üÇA‚e¸\=ąąWD–Ü endstream endobj 754 0 obj << /Length 141 /Filter /FlateDecode >> stream xÚ31Ół´P0P0bS3…C®B.rAÉą\Nž\úá &\ú@Q.}O_…’˘ŇT.}§gC.}…hCX.O…ú˙˙˙˙űŹ€$ţ3``°'LČ|DřAü˙ŹŹŔ¦jĺDý˙ ˙˙Ŕ Ŕ\®ž\\,µ endstream endobj 755 0 obj << /Length 230 /Filter /FlateDecode >> stream xÚ•˝NĂ0€/Ęé?Bî¨Ő…vŠÔ©`b@LбÖŢ Ţ$R_ŕ¤.•ĺjźKĹŠ-}o¸ďł»ͦTĐ®JrŽ&7ôRâ+ş‚ÂťLăäy‹óíąíÚ?Ł­oéýícv~· í’K*ž°^ŔdňĂ`dĎPÉ‘ˇaŹDľ„ÓZN{¨8;@Ά:0śGdśzT €”Ű š3’Î#ěň§˙'dč!Q M„4·éňł† ýú™¨«â>ˇŠ1šĄšŁ5ßČŽĂ—t*Ś«ďńďć5 endstream endobj 756 0 obj << /Length 114 /Filter /FlateDecode >> stream xÚ31Ół´P0P0bSS3…C®B.ßÄ1’sąś<ąôĂLڏô=€˘\úžľ %EĄ©\úNÎ †\ú. ц ±\ž. ő˙ŕč˙˙p„,Îü~č˙˙˙ÉBÄ„—«'W NÁ§P endstream endobj 757 0 obj << /Length 105 /Filter /FlateDecode >> stream xÚ31Ół´P0P0bS3…C®B.c# ĚI$çr9yré‡+qé{Eąô=}JŠJSąôťś ąô]˘  bą<]ę˙˙˙÷ €ÄŘ0 %ŚË\®ž\\6Qg? endstream endobj 758 0 obj << /Length 231 /Filter /FlateDecode >> stream xÚ]ϱnÂ0`Ł ‘nÉ#äž' v ¨D$:1 N…±Clđf1tě#4ŹŃCd÷?Ka@–?Ů>ŮţĎŚúŻ/śńÓŽx›Ó7™Śe`+…Ď/š¤×l2Ň ś’.–|Řw¤§«ç¤çĽÉ9ű bÎe«ĘÖ;U:ŕ”.âJĄ•p΂ZĐł j@¨ARô&ÎB n î˛ú~ťŕÁßxąëŕä)É[yŮF ‘ßę^Ó}®l—EťůĆŞ‹‚é#Ô ŞŃ`"­¦ţ‰P ·‚Ţé0Đ~? endstream endobj 759 0 obj << /Length 126 /Filter /FlateDecode >> stream xÚ31Ół´P0P0bS3…C®B.rAÉą\Nž\úá &\ú@Q.}O_…’˘ŇT.}§gC.}…hCX.O…ú˙ę˙˙``ř'ę!P‚Č:„°'–¨˙`ŕb˙¸\=ąą”…jo endstream endobj 760 0 obj << /Length 201 /Filter /FlateDecode >> stream xÚ­Đ1 Â@Đ‹Ŕ4ąÎ \kP1‚)­,ÄJ--!9™D,,˝î¶T×]…S[Ěů3ŐçnĄQ§*9z¸K5—¦.s˝WÍj“9ú!˛!qެ«SdaŹVËő ™ßo“, ‘ţcP$”nPPBĄz@QÉČ(>Z°öđălíl/5.§žâŇ×ÄK=&MŁŘĄÄĆ(o9)Ť÷Ś[‘·•ä-Ç_m0ÂÍv˘ž`é®Ţfsě„8Ŕ„‰‰ endstream endobj 761 0 obj << /Length 199 /Filter /FlateDecode >> stream xÚeČ1 Â0Ćńá-ÁwÓ–ZtPˇ*ŘAĐÉAśÔŃAQPPRo¦7iqpT· Ą±I( 8Ľďű{~ŁÝBÝâĽ&6}\9°Ol[Lń,7„@gčą@GEŽqż;¬“>:@8wĐ^@8@–’ŹX&äaüĆs!Ëe—V^Äz“ŇHř4˝ ¦±6Qľµ±25> stream xÚÍ=‚@…ÇXLĂ č˛ň#V› &na˘•…±RK Ť¶ÂŃö(Ň‚°.CÇ lľâ˝ć}/N竌BJh&)^P˛¤«ÄF© ]ś Í厹Fq¤(E±u1 ˝Ł×ó}C‘ď×$Qt’žQĘZŰ‚gmľµ‡J9Ő€eĘ ‚şđë€7FçĐ´Ó?oaŚFňú˝ k©ďÄ öŞ,Íú|_ÂçŕFă&Ťh endstream endobj 763 0 obj << /Length 182 /Filter /FlateDecode >> stream xڭϱ Â0ŕHá^Â{ÓZěZ+AĐÉAśÔŃAŃŐöŃú(}„Ž$ç] 8Nů ąäżKšMó9&čxĄgž,\ÁĺĽOd+…ă f‡.łâS0~Ť÷Űă ¦Ř,Đ‚)qo19€/±"jőB¨.P«;UuĚD÷ŚFŻ Âó'a¸üyŁbhŚçF±Ą4j-iMËđO*Ş˙·ů"`éa oőĆ…t endstream endobj 764 0 obj << /Length 217 /Filter /FlateDecode >> stream xÚĹĐ1nÂ@ĐŹ(,Mă#ě\€¬j%C¤¸* ”*I™"ZŻo+íMđ|k7cŁÜ€ćšůž?¬Wśđ‚giĆóG^,ů#ĄoĘrI^ާ÷/*JŇ{ÎrŇĎ’“._řt<’.^7ś’Ţň!ĺäŤĘ-Çi˘<â”PÁ™‚q¶†j,˙QŃ?ĽĐvŔôŢtÂDđđQ[ ňź˝ba~®Ôęҧú‚±ĐWJő‡!†Id“řö†©G”‰›‘ČŃSI;úŚ%  endstream endobj 765 0 obj << /Length 218 /Filter /FlateDecode >> stream xڝн 1 ŕČ Y|óÚ;©‹‚?ŕ ‚N⤎ŠÎ磝ř"®äb/YÄÁÁ>JÚ¤ˇ¶Ýču)˘&Őc˛jµiă­őÉZ=Ůěq Y’µh¦>Ť&™ŃéxޡÎGŁÓ*¦hŤÉR. eÎى/É".ŕ‹Ҭt ÖňŇŞŞ®ôwčťđŁVűhOé/oé»2C óxźűB§©’ŮbM•nŐ˙ĽćĄ7÷íÝĄ| "çţĂÔ€3ź©ŕĂŻ>ŕ$Áľ$ťJ endstream endobj 766 0 obj << /Length 250 /Filter /FlateDecode >> stream xÚuŹ1NĂ@E'raiš=ÂÎŔ1IL¨,… á ŞФDöѶăą.·ţü ‘(öigö˙?łÓęřlnc›ŮQiÓ›ťÚşÔ'ťTl˛=˙yąĐEŁĹĘ&•—lkŃ\ŮËóëF‹Ĺőą•Z,í¶´ńť6KłNZäa|„ ř 9€ŕ|t5»ˇîˇiĂ»H†„ť˙…ű JňŽbz<„Ź„ëĽrd'ľĄ0Ő´ †˝(9qp&8 %? cFżűiŤ=¶H^†Qčů #tü)„g/pxLkDĎ…3zô˘ŃýŠA endstream endobj 767 0 obj << /Length 127 /Filter /FlateDecode >> stream xÚ31Ół´P0P0bSS3…C®B.ßÄ1’sąś<ąôĂLڏô=€˘\úžľ %EĄ©\úNÎ †\ú. ц ±\ž. ő˙ Dü?€‹üĂ`ĎŔOY$Ů€$ ;Rţ˙?ó˙¬$X–ËŐ“+ V—Xę endstream endobj 768 0 obj << /Length 174 /Filter /FlateDecode >> stream xÚÝĘ1 Â@…á )Óä™ čfaµ Än!he!Vjiˇhť-GɶL2ކ€ŕ „á+ţ7&ť.擦‰&“R’ŇYă Ť‘S2–Ós‹jOĆ ZKFe7ô¸?/¨ňí’4Ş‚šâ#Ú‚J®"nëŚÝŻĂę;€ţĘĽQŻýşO„7ZBŘU$fMYDĚ@Č ÷˘ĎťěŢfň‚+‹;|WWŚ endstream endobj 769 0 obj << /Length 197 /Filter /FlateDecode >> stream xÚ}ÎÁ ‚@ŕÂ\|çjUÔę$A‚:uNŐ±CQWőŃöQô /¤mU˛%vř˙?,ăÓĹślriâç“ĐŮÁz® mňgCsşb” Ű“ç"[ËY˛ˇÇýyAm—ä ‹éŕ}Ä$¦ě–ČE'ÂŹ}2´FZ_V 7 W?ÓWăei f ĺßĘ˙Ą)XąĘP>•Vž*5y«ÔŕMg9V/«Îz¬VJAđf9ô'ŕ*ÁľLCx8 endstream endobj 770 0 obj << /Length 210 /Filter /FlateDecode >> stream xڍϱjÂ@Çń_pţKŢŔűż@{98Sj@-4 “8µ •¶ä-ŹrŹpn‘âA0fČňľżé§ăÇá€#Vü XÇÜŹů]Ń–´ö1âţÓeyŰĐ8%ąd­IľúL2ťń~÷ůAr<ź°"9ĺ•âhM锳AiËtJwďeB# LX‰6vs`ÔRaFčŘ$˙i4ł•‡š÷ ;ą˘QWytExÝ­'{¸úgk~ç϶É,O*Ť¨™áŹ$˝=t č%Ąť~©–§ endstream endobj 771 0 obj << /Length 242 /Filter /FlateDecode >> stream xÚmбnÂ@ P#$/ů„ř ¸…¨ť"•š©L :vhŐ®ÉńgáO@ü@$2D¸v."PtOńůâłĹă× h"+šŇ4¦}ßih¨/»/śĄhÖMĐĽË.štIż?źhfs Ń,hR°ĹtA ×đď÷LZ5;¨Á·: —GÍÄÄŢkŃ?ŞŢ±R/ęčRŞ7ux;©¬¸xl;µđ3{gúßşjmĺkŮÝx®şNš®|סëÖuޔΚ‰˛v:ťTć-tjO¬Ŕ;Á°‚Q ądŮć,żĹ˛Z8ÝŽËâ[Š+üRô endstream endobj 772 0 obj << /Length 220 /Filter /FlateDecode >> stream xÚuŹ=NÄ@ …_”b%79Âř ŐHË"‘ * D[n‚–™Łĺ&ě¶Ü"ŠyămafôY˛źíyýĹéő•.ő\O:í/µďô­“wa\ňögÇĘëVV´O¬K{Ç´´Ă˝~~|m¤]=Ü(łk}fĎ‹ kEÚ¨m&fhĚF í€hĆrá°ž +'Ř2ľ©ʉ3Ůq4|PYáÂŮŘš0eܦŃ齳súźÉ5ɧĄ\Ó@ÜńďeÝ'ýXćĆĆreSU¤4ąäQ~MQdĹ endstream endobj 773 0 obj << /Length 206 /Filter /FlateDecode >> stream xÚĄĎ˝ Â0đ+Â->‚÷Z+©Sˇ*ŘAĐÉAśÔŃAŃą}´>ŠŹ±bđĽ$*.b†áBîţ§zíá€:ÔĄVDJQÜŁm„T‘;÷ýËfŹi†á’T„áTĘf3:Ď; Óů¤:¦•üYc6¦\®ľ›;żlhkb¬Ě⍹„€™/N-ęÄZ6*±¨ńp·—§ąë™|ZX›?šĽ4®Źďěő˝>uóÎćsľ’—n—‚«Ý tněĆÍ N2\ŕKKv endstream endobj 774 0 obj << /Length 205 /Filter /FlateDecode >> stream xÚŤŹżn1 ‡]1śä%oĐó ´ą”Ň)$n@˘S‡Š Z•µ—ľY…G¸‘!бi…ÄÖ _¤Ď˛ýł=ľŚ©ˇgzpäźČ;Ú:üŔˇ٨ąT6{ś´hßhčŃ.DŁm—ôőyءť¬¦äĐÎčÝQłĆvF0ŕ`ř80¸cfṉ́bč˘9)zA}T$"ÜË'ŻS|_Qůź(·˝ÝŞ(ăM I +ëT÷PG“eyĹ?żŃ4dѸY÷z‚Ü1…ó_ń ° S endstream endobj 775 0 obj << /Length 220 /Filter /FlateDecode >> stream xÚťĐ; Â@ŕ )„isÁJĐůEü"Ăřb=A×Ű çaÄS~]ż endstream endobj 776 0 obj << /Length 216 /Filter /FlateDecode >> stream xÚuŹ1NÄ0E˙*…Ąir„ĚŔ › ¨,-‹D $¨(VT@I‚văŁů(>–)VľAĐaYOňŘóçą??˝ĽĐV=é´˙ŢĎťĽÉz`±ŐţěçćéU6Łř]âoX?ŢęÇűç‹řÍÝ•vâ·şë´}”q«¨µE XĚX™Í¨ĚŽp‹[PĎ0ÔLhB M ‘‡ŔĆ4ě‘™ćň±Ŕ¸ţEâ ŚĆţS“«D¸ĚiDf( šD“śE‹TłHIc %)>—/Đ~Ĺ’\Źr/_})oG endstream endobj 777 0 obj << /Length 164 /Filter /FlateDecode >> stream xÚ31Ół´P0P0bSs…C®B.c3 ĚI$çr9yré‡+›qé{Eąô=}JŠJSąôťś ąô]˘  bą<]˙300°˙?ŔŔ ˙˙C=ř˙˙„`üĎ˙ůřÁţ€ýcf ‚¨˙˙˙˙?€F€%5…Ć„ý˙˙@.ý‡N€%¸\=ąąCStň endstream endobj 778 0 obj << /Length 275 /Filter /FlateDecode >> stream xÚ…=NÄ@ …ĄÉMŽ_ňĂ(‚†‘–E"T+* ¤A·ÚDâ \%7!H9Ec{·BHLńidű=żßźťRI'tT×äň%=Vř‚ľ–jIM}h=<ăŞĹâŽ|ŤĹ•Ô±hŻéíőý ‹ŐÍUX¬iSQyŹíš ŤÉłă:ţ˛ś!1¦{.g˝‹éě ›t<A9ŔN¤tÂÂż´É˝ęŕ`nę [˘Yč'ă(3’@řÉ üĘ~sPşoŁi5ąÝE,b”ł6ÂyÔ0ɬ1$ÄV¸ ç îÁ˙ÁŮş[›ěLző #¸ňşh»&Ű;‚ţˇÄł$˛^MR} ^¶x‹?máĘ endstream endobj 779 0 obj << /Length 165 /Filter /FlateDecode >> stream xÚĹɱ Â@ ŕ: Yúć Ľkąť µ‚7:9“utPtľ>ZĄŹpcÁŇ(¸ÔÍÁ@>ţ?1ét>CŤ1ŻI0I±ŚŕFş–*áx†Ü‚Úˇ‰A­ř Ę®ńv˝ź@ĺ›F  ÜG¨` t>ŕˇö»îĺč'C/fťH=ű b‰¨účłš­'b6l öÁí¶˙ŃQă¨"ňDőĐ÷–¶đi—Ť¶ endstream endobj 780 0 obj << /Length 137 /Filter /FlateDecode >> stream xÚ31Ół´P0P0bCSs…C®B.cc ßÄI$çr9yré‡+sé{Eąô=}JŠJSąôťś ąô]˘  bą<]řŔů(B¬Ž`˙¨­ţ˙ ÂD00 ˘ţ˙˙˙ ˙aDś€HpązrrȧYA endstream endobj 781 0 obj << /Length 168 /Filter /FlateDecode >> stream xÚŐĎ1‚@Đ!&Ópćş, `E‚¸…‰VĆJ--4ÚęÍŁě(-Śă!¶¶ţä5˙W? Ć9E”R?Ö”$4Ěh§ńqÓF”ĺí´=`iP­(ÎQͤGećt>]ö¨ĘĹ„4ŞŠÖš˘ šŠ| ¸Ź°ţęşf˙!ĚNÔ^ :ŕ˙^Ă]寸3„˘° l™nüO(řÜôŘN .ń ú‹k7 endstream endobj 782 0 obj << /Length 217 /Filter /FlateDecode >> stream xڭνnÂ0pŁH·ä¸'Ŕ ¤Q™"•𠦉věP+ŽÄ‹eëkdëšŃU‡˙ÇGkÉ?é>í4ëž8ć^¸iĆŹż%ôIi?Ä1B–4,ČľrÚ'ű˛d‹ ŻW›w˛Ăé˛cž'/¨łkL8âďëTó¶E‚ŃĹňĆkŐä%t:u€­=|đş?őQ ;D»ńN÷ üd~UôČ7úĺ ł˛S[Řv0ŘĽ?˝b¶j®vĘ?Ł ¶kµ1Nš\*ďÎÖ7V§*=4Ł#SăŚ÷ endstream endobj 783 0 obj << /Length 123 /Filter /FlateDecode >> stream xÚ31Ół´P0P0b#S3…C®B.c3 ßÄI$çr9yré‡+›qé{Eąô=}JŠJSąôťś ąô]˘  bą<]ę˙``¨˙˙á?ś¨‡ ŚĂ—¨˙˙˙˙0Ä˙?€ „—«'W íâg• endstream endobj 784 0 obj << /Length 161 /Filter /FlateDecode >> stream xÚ31Ół´P0C …C®B.sD"9—ËÉ“K?\ÁÄśKß(ĘĄďé«PRTšĘĄďŕ¬`ČĄď˘m¨`Ëĺé˘ŔŔřńC}˙ţ? ˙ď˙“˙Çđ˙˙ű˙ ň˙˙Y–o`*á?Ŕţ˙ü„Ř!*9 °ţŹ=ţ˙g„˙˙Ő!ډ@dą\=ąąŞ÷ endstream endobj 785 0 obj << /Length 159 /Filter /FlateDecode >> stream xÚĹÉ1 Â@б¦Éś¸»a­1‚[ZY•ZZ(Zo޶Gɶ 2΢]ŕŔ<ţź±óérAšrY;#«ébđŽ6uťj ç–ŐlŽj#WTnKĎÇ늪ܭȠŞčhHźĐUE‹€[îĹ7ł(S˙ô‹#“dť5"${‹ÝŔö?zn<×Ě‘9 ý~qípŹ%8} endstream endobj 786 0 obj << /Length 198 /Filter /FlateDecode >> stream xÚŤŹ1‚@Eżˇ ™†#0Đe‰V$Љ&ZY+µ´Đh+{4ŽÂ(- ă˛ŘÚĽâOćĎ›$ͦń„‡š“1'šOš®§6ŚşÄMŽš¤v§¤V6&U¬ů~{śIÍ7 Ö¤rŢkŽTä ď dR" "/x"oř­ß"x AŤa…Ě„ˇÉ,Ş ŞŇ˘~~Űć5˙˘µÍo×U9ôőú“ö¸qNČ©9I§‹Ręď Ý3´,hKí`• endstream endobj 787 0 obj << /Length 221 /Filter /FlateDecode >> stream xڭбnÂ0ŕßb¨t ŹŔ˝@›Yť"QČP‰Ntě@łóhyÁc×s U‡.•đđÉş“Ďżm˧ç ç<ćÇqÎÖ˛Íy[ĐŽlˇŐśË[kóIÓš˛w¶e ­SVżňţëđAŮtůÂZťńJ­©ž10ô€óU¤QĎ"-D×±×ÉŻ<Ś´ĂNmA…Q/Ŕ%n®:¨~ŰDG˙´şú9ir2ÝL¤y?ŮRÎ<ÚÂč[S|—é\ŽŽčłÝO§÷éżéOýeęŇĽ¦7úF©ŹW endstream endobj 788 0 obj << /Length 229 /Filter /FlateDecode >> stream xڭϱJAŕ?lq0Í=ÂÍ ÝÓ%Ä*#xE@+ I-SD´5_,9Č ,Ř9nś˝sck‘ćc™ů˙őŁáő_ńĹĄc?fďřą¤5yŻSÇŁ´Z®hZ‘}dďÉŢéśl5ç·×÷˛Óű.ÉÎř©d· jĆ0í rů ŔDŞČWŔ@ä`D$ Łć ˘“€˘FˇŹ]ç67@–üHš€¶łů·mňtçt9OYŞć»®‰®´Őwě–µ±gßąďß˙Ů«…če&ÚĄśOM«“&Ć˙ú7§ŰŠč`źŹß endstream endobj 789 0 obj << /Length 172 /Filter /FlateDecode >> stream xÚµÎ1 A ĐÔiĽ“832VÂş‚SZY•ZZ(ZĎXYzŹâĹ#lą…lĚŰXZäÁOř7荆d¨/ă9C;‹GtV˛ibsŘ0ó¨Wä,ę™lQű9ťO—=ęl1!Ůć´–Ę}NĐ)!0„ZĽ2ó-ygŽÉg"(.’0P5tĹ·ÔAUɲĺ+Yü0ţÉŔ\%ĺ-nľĘ§—ř¦YW endstream endobj 790 0 obj << /Length 218 /Filter /FlateDecode >> stream xÚMŽ1JÄ`…ßbÂÜ`w. ~7»hXW0…ŕVbµZ * vnâUr”aË!ă›,ÍÇđ˝™Ç”ëó«K-t­gQË -Ł>Gy—劲p3%űWŮÔtą’pK-ˇľÓĎŹŻ ›űkŤ¶úµx’z«X §™ý 33䎅Łr¤CF40Ś@:bŞ #µŕLÉ‚ĽŞÁ‰Yő.ąŠdÄŚ Çć›¶ĺAîČş ălBĽł–{,ŞZxËĎŽ`1K{Żď+ćoürSËN~±ˇo' endstream endobj 791 0 obj << /Length 160 /Filter /FlateDecode >> stream xÚ31Ół´P0P0RĐ5T01P05PH1ä*ä26 ą†™ä\.'O.ýpcs.} 0—ľ§ŻBIQi*—ľS€łď˘m¨`Ëĺé˘ŔŔĎň $ő˙˙˙?Ä˙ ` ŇÍ#…ř$`'0ö üřÄů ě  ć˙˙˙˙S˙dÖ.WO®@.’Ř] endstream endobj 792 0 obj << /Length 159 /Filter /FlateDecode >> stream xÚ31Ół´P0P0RĐ5T01U0¶TH1ä*ä21 (@e’sąś<ąôĂLڏô=€Â\úžľ %EĄ©\úNÎ †\ú. ц ±\ž. ő˙`ř˙ů˙,dýF Éř}üH¤<´’ę00ügü˙żá?`¨G"í˙?’ü˙›˛Ě˙¸\=ąąkqt endstream endobj 793 0 obj << /Length 174 /Filter /FlateDecode >> stream xÚ31Ół´P0P0bScK…C®B.ßÄ1’sąś<ąôĂLڏô=€˘\úžľ %EĄ©\úNÎ †\ú. ц ±\ž. ő˙ě˙7ü˙ßP˙˙& ‘eüŔŔü€Jţ``ŔŔ$ŔČ? ü@˛†ż•´cg@%ĺ4*ÉßPF˛řF2?ü€F2~~€F2ü?€NÖ7 H{ ćrőä äóV endstream endobj 794 0 obj << /Length 195 /Filter /FlateDecode >> stream xÚuν Â@ đĄŹĐ> stream xÚmν Â0ŕCáˇ÷¦Ő(v©ŕAĐÉAśÔŃAѵͣŐ7Q|ÁĹAŚwݤéGr—»śé6ł&آßt°ťá&…=>'|äÍz z¦zBQĐvŠÇĂi z0b z„Ë“Řö˝óoUúł÷ YU¨X)Ő§Ź-ČŘ˝ČFĹFç'{»“őÇ…¬yVůJtlÉHź!˛rł&µué]ĹŠ;7ä­ŘRš“ąĚCSQń‹¦ iť¬ĘÓŔěw…HČÂŘÂ>Ęłh endstream endobj 796 0 obj << /Length 237 /Filter /FlateDecode >> stream xÚeαNĂ0ŕ‹2Dş%Źŕ{pŇŠ.±TŠD$: &ĘČ‚‰73âEňa+RĹ‘sÔĆ‚ÁßđźÎ÷—óăĹ)eTĐQ‘S9Ł“mr|IJŇŚćűŃÝ.kÔk* ÔCŽşľ¤ç§—{ÔË«3ĘQŻč&§ěëµl [f۲cv’ŚÓ¨‡¸h+ÂŢÄ켍÷ R PPĂ›Lm5éÄÄ5“ťwŰQ?Ú‹_"|Źv“ŻŢÖ‰&ÔŠ*ţZýł ÜIM ę]4ŢO©`9k”—ĺ b{0ý‘ýD>€Ř7ĆóŻńůík endstream endobj 797 0 obj << /Length 171 /Filter /FlateDecode >> stream xÚŤÎ1 Â@…á aŹŕśŔM@ Fp A+ ±RK EۉGó(Á2EČ:/u ‹ý—ŮýŠ™Í§éB"IěĚIR9Ç|c»#Ľ¦ÝÇéĘ…g··™Ýş«ßČăţĽ°+¶K‰Ů•r%:˛/%!Ô•ĄéI­DăŻeň±äoKő˛ĘhĐѰ±Śj#0#0Ł?Y¦` ¦` ¦`Š]ÚĐ“nS^yŢńĘiô endstream endobj 798 0 obj << /Length 218 /Filter /FlateDecode >> stream xÚĄ1n@E?˘@š†#ě\ ^ c)‘ěĘ…•*qé"QŇŽĆQ8%ĹŠő2[$rëćłŇţ˙~ţ¸y.9áśRÎ3.žř#ĄOĘÖcÂEé_Ţ/T·¤Źś•¤_Ü™tűĘß_?gŇő~Ë)é†O)'oÔ6Ś`ŮPv*;ťťk . ,¢ UŹPC< ”èzDNř‚ůĆe™{ŕĘććÓÎĄÍ˙Â]—É·’~+|ç˘ 2˘%‚˘ęĄE_†IÖqh×Ň®ţ xË endstream endobj 799 0 obj << /Length 143 /Filter /FlateDecode >> stream xÚ31Ół´P0P°bSs…C®B.crAÉą\Nž\úá Ć\ú@Q.}O_…’˘ŇT.}§gC.}…hCX.OćöĚĹň@lĹő˙``âz ţĂç¸˙C?’ľĆö˙˙˙¨‡ŕ?P ćsązrrěRZö endstream endobj 800 0 obj << /Length 232 /Filter /FlateDecode >> stream xÚmŽżNĂ0‡‘K·xe‹ź'´ 0Y*E"L ‰vdÁÚřŃú(~ŹŞwH‘`¸Oş»ďţ,»óë+ßř•ÄňÂŻ.ý¶ĄwZt’7šjăőŤÖ=…'żč(ÜI•Bď??ľvÖ7ľĄ°ńĎ­o^¨ßx¸#€Č `Î0Ě#,óŽyB=:F̧0¤AĚè.O€=ˇđĚ {Ĺ™sŘ2tâÝ÷ 9ČůF˘štJ´Łş:ZëTTwHsÍŞćT«U‹ůŹ!‹Ş,†)b"†)3ţÚČtŰÓ#}ťçwo endstream endobj 801 0 obj << /Length 239 /Filter /FlateDecode >> stream xÚMбNĂ@ `G"yÉĘv~ö%-aŠÔ‰ H0u@LбCQ»’¸nŃ館Ń?I}űL§ŻóýúeCú-˝”żc»%H0Ź0cŽRb†LčÝ5áÁh†¦šRă"Ě&\/d Ŕ/©„솄Ná^J¬+J™ŻĘx#jC˙(Ńďä^ť ‡NwŚÚ6d`âNůVř?‰1F3:=Şł0+¸(-Ş…¶ř aO"{|lńdy‚ endstream endobj 802 0 obj << /Length 217 /Filter /FlateDecode >> stream xڭαŠÂ@ŕ‘Â4ű;/ ›ś„@NÁÂYY•ZZ(ÚšÄWŮGÉ#¤Lqě:ŁÂqĺ5_1ĂĚ˙÷ÓîxD1 ¨“P˙)í> stream xÚm1NÄ0E'risĎ v7,•Ąe‘HÄV ()@Đ&9šŹâ#¤L<| Q`ÉŻŹćżń¦9»ÜÉJ¶rZËć\¶ň\óŻQŢýĽ<˝ňľĺę^Ö W7(sŐŢĘÇűç Wű»+©ą:ČC-«GnBä"éLdT‰¬ę@.Ă«ęGH‹„F3ĺ”16’ 6P9¸€nü\ęŃŃ Pbfç4Ręu˘YůĄšHq_#őB}Č!Űĉ¨\0ćşĐgřÜś!TF¨ŮIŕěÍAŘCÉ$ŁyńDE‚Ě}Hâ#°‰A _·|äoť_« endstream endobj 804 0 obj << /Length 187 /Filter /FlateDecode >> stream xÚ•Í1 Â@Đ‹Ŕ49‚sÝ„$«@Śŕ‚VbĄ–Š‚•z´%GH™bQgqŇ80Żĺ˙ ‡qL…Ô÷) (ŃÎÇ#rô(Šë—íSŤjEAŚjĆgTzNçÓeŹ*]LČG•ŃÚ'o:Ł+đĽx*Á´P§dÜ‚éĺśHđá.ń'oÇÓśR(@RBľŃšü­)Ó`ëęÎňŰn±˙´a˙ţ —§—řöđ\# endstream endobj 805 0 obj << /Length 232 /Filter /FlateDecode >> stream xÚu=NĂ@…źĺ"Ň4>ÂÎ`mŮ ¦Z) HPQ *HI‚çh{”=‚KV†ń)‚ćóóľyÓlÎ/[.ąáłŠ›š×üRŃŐs±äu»tž_iŰ‘ŕş%ŁeňÝ-ĽîÉo﮸"żăÇŠË'ęvŚ\8I@/#2‘Ł–D°R9ÇL˘’Kp)°Lz ż€ěO±nPY†]D‘ 5Ĺ>ć˘Lr‘é>AáĘŤ¶»pgżW·łiŇŰ˙9Ô«ËÔo°0ËZTăţľj~]wtOßý endstream endobj 806 0 obj << /Length 261 /Filter /FlateDecode >> stream xÚmбJÄ@ŕ )ÓěyÍĹ»‹gµpž` Á«,ÄJ--m/ŰůZy”€/0`0ěřďh#„Żeg˙?‹ćä|%3YĘq-‹SYžÉcÍ/> stream xÚ%Ë; 1Fá;ŐŔ]]ţÄĚřhÇL!he!Vjiˇh7­eIY@Č5`űNçćýK¸nŤn…»ĺ;[ŃŔ.ţĺöäÁł>ĂYÖűʬýź÷÷Áz8nQuÄĄ>Wö#¨ŤD*…LŤµ"Q‰¤C–¤ŠÄ¶5e"š ŃŚwžOü©)B endstream endobj 812 0 obj << /Length 132 /Filter /FlateDecode >> stream xÚ31Ö3µT0P0S01T0¶P05TH1ä*ä26 (Be’sąś<ąôĂŚ ąô=€Â\úžľ %EĄ©\úNÎ @Q…h žX.OĆ 2ě˙ěř˙7ÔÉ˙?đĎţ˙ç?őó˙˙řÇţ˙Ăć˙~0ü?PŔ`ĎŔĺęÉČG(Ç endstream endobj 813 0 obj << /Length 192 /Filter /FlateDecode >> stream xÚ…Ž1‚PD‡PlĂŘ čÄŠ1‘ÂD+ cĄ–m…ŁqŹ@IAű;“WÍÎÎL0›† vŮ xólÎaĚgŹnäű˘şEăétĄ4'µgß'µťTľáÇýy!•n—ě‘Ęřŕ±{¤> stream xÚ…O; ÂP±lăÜ č{IüÄ* L!he!Vj)¨hť-GÉ,-$qĚ´ÂT;ß…ĂńL­NuihuéÉ—›ŹV'Ç/2OĹě4Ĭx“®őqžĹĚ7 őĹ$ş÷Ő$Mô |€ ¨,G\ WÂ{ˇűFÇ9úé^Ů€"J[|šĽ ¬µĐîrč’YÁ"Ö±4nT?…”pGrjݬc_e*[ů«ËM* endstream endobj 815 0 obj << /Length 167 /Filter /FlateDecode >> stream xÚ31Ö3µT0P0U0Q0¶T01SH1ä*ä26Š(%’sąś<ąôĂŚŤąô=€˘\úžľ %EĄ©\úNÎ †\ú. ц ±\ž. L@ĚŔß$äAD=ř$˙Ä˙€Ä?€Ä ‹łĂĹíáâ˙áâ?Ĺ@âP˘&VVĚŚ.ó.ó.S—áG—;ě&.WO®@.n=Ţ endstream endobj 816 0 obj << /Length 96 /Filter /FlateDecode >> stream xÚ31Ö3µT0P0´TĐ5W02S0µPH1ä*ä2 (™Be’sąś<ąôĂ̸ô=€Â\úžľ %EĄ©\úNÎ †\ú. ц ±\ž. (\®ž\\&Q# endstream endobj 817 0 obj << /Length 162 /Filter /FlateDecode >> stream xÚ]ʱ Â0†‡Â->‚˙ÄK…N…ZÁ ‚N⤎ŠÎú¨>‚c‡bMN8¤>Č÷] çy’°ČáÁü GGbŽÎÂO%ÎT2[0“YFK&¬p»ŢOdŞőŽLŤťÝS¨AZZFý˘HW 2"ĂňL}¦ľTß©oţýď»­® ËĐ"ІľÖş?¦ endstream endobj 818 0 obj << /Length 114 /Filter /FlateDecode >> stream xÚ31Ö3µT0P04WĐ5W01T0µPH1ä*ä22Š(™BĄ’sąś<ąôĂŚŚąô=€â\úžľ %EĄ©\úNÎ †\ú. ц ±\ž. ő˙˙ü˙˙†ţüa`üč?’›îçrőä ä—5ez endstream endobj 819 0 obj << /Length 116 /Filter /FlateDecode >> stream xÚ31Ö3µT0P0VĐ5W02W0µPH1ä*ä22 (™Bd’sąś<ąôĂŚŚąô=€Â\úžľ %EĄ©\úNÎ †\ú. ц ±\ž. ő˙˙ü˙˙‚ę˙˙c`¨ü¨ć`°›˙pązrrléI endstream endobj 820 0 obj << /Length 152 /Filter /FlateDecode >> stream xÚ31Ö3µT0P0UĐ5W0¶T0µPH1ä*ä26 (™Bd’sąś<ąôĂŚŤąô=€Â\úžľ %EĄ©\úNÎ †\ú. ц ±\ž.  @đNü5 ˘DŘ{!Ź €?8$ŘÁÄ Á &> F0ßTtŁ꩏a*`gŕrőä äW:Ő endstream endobj 821 0 obj << /Length 175 /Filter /FlateDecode >> stream xÚµ± Â0DQXúKä'2҆ á * D” ¨Ăh%#¤¤Âü#6HáWÜYňóMíÄČŕ0žĂp śsş‘µfąŘś®Tz2{XKfÍ1żÁăţĽ)·Käd*rdGň”RŹ/ĄRA-ś%ˇa|¸˝Ý Đ‚´ťV$‘Q¬ůµńžî†·ęŢoÄ×e«úżUżďG+O;ú‚a endstream endobj 822 0 obj << /Length 171 /Filter /FlateDecode >> stream xÚµ± Â0EQ Ýů €miCp˘ ” ¨“Ń…(©0ľó i~ńϧ{~37ő <& ¸ ~‰łĄ9—JąĎ“öJu }€s¤7©&¶xÜźŇőnKşÁŃÂś(4č^J©řĺřqÄ^©.JůNQrŚ?)F#ŚPäëQ1H˘)3Rź;™Ę;ŮJ~.؆xCŮ?ZÚÓOYbÍ endstream endobj 823 0 obj << /Length 113 /Filter /FlateDecode >> stream xÚ31Ö3µT0P04F ¦F )†\…\††@ľ –IÎĺrňäŇW04äŇ÷ sé{ú*”•¦ré;8+E]˘zbą<]äěęü€ÖŔ ĺPş‰őěä¸\=ąąAQ@ endstream endobj 824 0 obj << /Length 148 /Filter /FlateDecode >> stream xÚ31Ö3µT0P04U02R06P05TH1ä*ä24Š(YBĄ’sąś<ąôĂ M¸ô=€â\úžľ %EĄ©\úNÎ †\ú. ц ±\ž. ü ňě?Ô¨˙„ę˙Ř˙‘˙Ă˙‡ˇ ˙0ü`řÁřńóöěřŘ7Ô7ügř.`ŕrőä äj'.ç endstream endobj 825 0 obj << /Length 171 /Filter /FlateDecode >> stream xÚ31Ö3µT0P0S0W0¶P01VH1ä*ä26Š(›%’sąś<ąôĂŚ ąô=€˘\úžľ %EĄ©\úNÎ @Q…h –X.OćöX±űŽěěţ±ř÷źýŕż˙ÇŹ˙ű˙üü?ű˙˙đ˙˙˙€ů˙˙Ć˙˙ę˙€1 ÉÔ€Ô‚őő‚Ě™2—} ·pązrr«xSş endstream endobj 826 0 obj << /Length 116 /Filter /FlateDecode >> stream xÚ31Ö3µT0P0V0S01T01QH1ä*ä26ŠE-ŔÉą\Nž\úá Ćć\ú@Q.}O_…’˘ŇT.}§gC.}…hCX.O† řA-Âţ˙˙˙€ř˙4‚Šv@  Ăą\=ąąemH™ endstream endobj 827 0 obj << /Length 136 /Filter /FlateDecode >> stream xÚ31Ö3µT0P04UĐ54R0˛ R ą ą M€Â FĆ0ąä\.'O.ýpC.} —ľ§ŻBIQi*—ľS€ł‚!—ľ‹B´ˇ‚A,—§‹üűő?€đÚ˙‘˙Ă˙‡áÆŚ??°PŕĂ P—«'W źŇ,5 endstream endobj 828 0 obj << /Length 99 /Filter /FlateDecode >> stream xÚ31Ö3µT0P04F †† )†\…\@Ú$l‘IÎĺrňäŇ pé{€IO_…’˘ŇT.}§g ßE!¨'–ËÓEAžÁľˇţŔ˙0XŔľAžËŐ“+ ‰;“ endstream endobj 829 0 obj << /Length 157 /Filter /FlateDecode >> stream xÚ31Ö3µT0P0UĐ5W0¶T0µPH1ä*ä26 (™Bd’sąś<ąôĂŚŤąô=€Â\úžľ %EĄ©\úNÎ †\ú. ц ±\ž. ě@ĚŔß#äÁHĚDŘ:Q'ţ€@Ě&> f0ńd82î>3Ń dfâ ¸™˘Dpązrr@Ä:Ő endstream endobj 830 0 obj << /Length 107 /Filter /FlateDecode >> stream xÚ31Ö3µT0P04F Ćf )†\…\††@ľ –IÎĺrňäŇW04äŇ÷ sé{ú*”•¦ré;8+E]˘zbą<]äěęüőěäđě:¸\=ąą{-= endstream endobj 831 0 obj << /Length 155 /Filter /FlateDecode >> stream xÚ31Ö3µT0P04UĐ54R06P06SH1ä*ä24 (XŔä’sąś<ąôĂ M¸ô=€\úžľ %EĄ©\úNÎ †\ú. ц ±\ž. ü ňěÔ€Aűňřđ Žöęá´˙#˙‡˙Æ ?0`˙ ˙ ţŔ˙†˙@ˇ.WO®@.…8Ź endstream endobj 832 0 obj << /Length 110 /Filter /FlateDecode >> stream xÚ31Ö3µT0P0V04S01T06QH1ä*ä26 (Z@d’sąś<ąôĂŚÍąô=€Â\úžľ %EĄ©\úNÎ †\ú. ц ±\ž. ő˙˙˙˙Ä˙ °‘§\®ž\\şâAŠ endstream endobj 833 0 obj << /Length 145 /Filter /FlateDecode >> stream xÚ31Ö3µT0P04Q0˛P0˛T05WH1ä*ä !P"•śËĺäÉĄäré{Ĺąô=}JŠJSąôťś ąô]˘  bą<],j˙0˙a˙Áţ˙€||=CC ţař†˙üđ˙Ă˙˙ÔˇýűňŘpązrrÇŕ/° endstream endobj 834 0 obj << /Length 103 /Filter /FlateDecode >> stream xÚ31Ö3µT0P0W04S06W02TH1ä*ä2 (B$’sąś<ąôĂŚ,ąô=Ląô=}JŠJSąôťś ąô]˘  bą<]ę˙˙˙đ˙˙˙0 âsązrrŹĺ$~ endstream endobj 835 0 obj << /Length 117 /Filter /FlateDecode >> stream xÚ31Ö3µT0P°T02W06U05RH1ä*ä22 ()°Lr.—“'—~8P€KßLzú*”•¦ré;8+ré»(D*Äryş(Ř0Č1Ôá†úl¸ž;¬c°ÇŠí Čl ärőä äÇ\+ß endstream endobj 836 0 obj << /Length 168 /Filter /FlateDecode >> stream xÚ31Ö3µT0P0bCSC…C®B.cs ßÄI$çr9yré‡+›sé{Eąô=}JŠJSąôťś€|…hCX.Ovţ;˘ů†: ÁPNŘ˙˙˙˙˙˙F0Ř1ü`€uŚ@˘†ńQÄf ńů„Ŕf2ŘJĆěó~ ń€ż‚ń;—«'W ÇžsË endstream endobj 837 0 obj << /Length 239 /Filter /FlateDecode >> stream xÚŤŹ1NÄ0Dg•"Ňo|ű$Q6ÍZZ‰HPQ *–’‚ŐŇ!ěŁýp!eŠUĚ8âiľý=o¶ýŐpíZ·-§uC玝|H?ĐŻ¶\ĽľË~”ćÉő4wśJ3Ţ»óéóMšýĂŤŁ?¸çε/2"Pĺ<>Ďĺ uÁfA@5ĂŁž`cťĚO4ęs´1dµ1gőĘ®šîęɧď:ŮôeÔPř~•KŮś-ŞËşQvőOÔhů9–ŚXŇŔÜ…H$%Ë RM źŇZÉlémb– „d·Ůr)}ŮA!·Ł<Ę/}L~ü endstream endobj 838 0 obj << /Length 184 /Filter /FlateDecode >> stream xÚmÉ=‚` ŕ’.žŔŹß‰1‘ÁD'㤎]…Ä‹‘8p n #ˇ~ $(}úö­ëL<źL˛ĺ¸6y6í-<ˇÓvf{¶ŹÝĂĹšĹ\¶(â]Î׊p9% ED‹Ě-Ć4 đ•ÓžgŹö&ëÉ{ôĽřâ!1îĺĄqú?µ\ŔÜ PůCÁµ#ýA“dZz–4Ŕu ×,işÔu8‹q…/ÂaoM endstream endobj 839 0 obj << /Length 190 /Filter /FlateDecode >> stream xÚ}ʱ‚0†K:ÜÂ#pO`iŔ‰1±‰NĆI4ş ŹćŁđő®ŘîK˙ëÝůÓdąĘ0FM•j\iĽjx@½%\îPPGL2P[ę‚2;|=ß7PĹ~Ť¤K<ŃäL‰•sŤ ´Â9×óËy|Ą9#l K#‚vÓś_ó[ąZ˛˝äC„N Ň_‹¦CŁ•čFôŚĎ,úa8č—‘[NÔřXT®®ţQ­€Ťü÷âŠÝ endstream endobj 840 0 obj << /Length 218 /Filter /FlateDecode >> stream xÚťĎ1NĂ@Đą°4ŤŹą¬—ŤQY AÂT (‘A‹ĂÍrÁĺ 3AzšWĚJ˙_¤ăć”kN|yą9á‡H/”–v¬ąIű—ű'Zun8-)\Ř™BwÉoŻďŹVWg)¬ů6r}GÝšĹ3J•~ ZýôŞýT™MčĄŘa.ĺĘ)Ąś- ™oö̤Ĺ/˝ó`t™śÝ˙ţRôř27ČäVÖŻ˝ifđöíh·ľhăŰ`+-·RűˇÔŃŇěNç]Ódvg9 endstream endobj 841 0 obj << /Length 183 /Filter /FlateDecode >> stream xÚ31Ö3µT0P0bCSC…C®B.c ßÄI$çr9yré‡+[pé{Eąô=}JŠJSąôťś€|…hCX.O…ú˙˙ţ˙˙D|?€bŘ0˙ ˙AD}°ň€˙Á&> f0ńH0b!ţO ¶n%Řrv¸Ŕîł?só?Ŕ>ű ćË `źsązrríÇG endstream endobj 842 0 obj << /Length 147 /Filter /FlateDecode >> stream xÚ31Ö3µT0P0b#SC…C®B.c ’HÎĺrňäŇW0¶äŇ÷Šré{ú*”•¦ré;8+ů. ц ±\ž. ő˙˙˙˙Ä˙ Řć Ś„ † ‚`|$€lthv›b)ŘŚ‡6 ˘ŽäŁ˙Q Ř.WO®@.ĚŚ‡r endstream endobj 843 0 obj << /Length 145 /Filter /FlateDecode >> stream xÚ31Ö3µT0P0bCSC…C®B.c ßÄI$çr9yré‡+[pé{Eąô=}JŠJSąôťś€|…hCX.O…ú˙˙˙˙â˙Hěó" Á€ř$`@±ŘCLÁmQDý˙ ˙!Ä( ,ĆĺęÉČćxô endstream endobj 844 0 obj << /Length 227 /Filter /FlateDecode >> stream xÚŤĐ=NĂ@ŕ±\¬4ŤŹŕą¬ťŤĄPY AÂT(PR$‚ÖŢŽkÍ ¸7eŠU†ŮI"QŇ|Ĺěß{;—Ý5袥ůŚş˝´¸Á°ĐaC]8®<żár@˙HaţVÇč‡;zß~Ľ˘_Ţ_S‹~EO-5kVE*#TňÉPËŽaaĄ'\¦Bٰű‰«očąŇť\Qéő4÷pf<á˘`2éß”˛Oŕ$‡ĚgăßëíµúD> stream xÚ31Ö3µT0P0b#SC…C®B.c ’HÎĺrňäŇW0¶äŇ÷Šré{ú*”•¦ré;8+ů. ц ±\ž. ő˙ţ˙ů˙źń˙?cŔŔ€ęÄ˙˙˙±4± Nŕô%—«'W ž‡ä endstream endobj 846 0 obj << /Length 108 /Filter /FlateDecode >> stream xÚ31Ö3µT0P0bc SC…C®B.crAÉą\Nž\úá Ć\ú@Q.}O_…’˘ŇT.}§g ßE!ÚPÁ –ËÓEˇţ˙˙˙˙˙˙Ă >˙†Áޱą›ËŐ“+ H¨X~ endstream endobj 847 0 obj << /Length 156 /Filter /FlateDecode >> stream xÚ31Ö3µT0P0UĐ5T0҆ )†\…\Ć&@A ×"“śËĺäÉĄ®`lÂĄďćŇ÷ôU()*MĺŇw pV0äŇwQ6T0ĺňtQ``˙˙ż˙˙˙HXŚůĂ`'$@DśřŹD°?`řÇŔ˙€ˇžAH¨?Ŕ`ň•ü˙˙ @Oţj˙˙hPśËŐ“+ UX‹ endstream endobj 848 0 obj << /Length 218 /Filter /FlateDecode >> stream xÚEĎ=nÂ@ŕE.,MĂvN€m M,ń#ĹE¤PĄR%)S€B‹9QPr„ř.]¬lŢŰȢŘOš·ŇüLŇŃt¦±Žń&cť&ú•ČFRf1K~|ţČ<—čMÓ™DĎH%Ę_ôw»ű–hţşPÔK}O4ţ|©…3EÓµ¦s|–Ć@F öÄAÖ¤ĂŘČHaŔž8pnŔ…\]Ď­GĐť-8¶j<ě\  8hP÷Ăý˙ř­žHF¬é–=a…‹,oËÚ>“U.ką9‰s endstream endobj 849 0 obj << /Length 123 /Filter /FlateDecode >> stream xÚ31Ö3µT0P0bCSC…C®B.cs ßÄI$çr9yré‡+›sé{Eąô=}JŠJSąôťś€|…hCX.O…ú˙ţ˙˙€L€ĹŚÁN|Ś? ę˙˙˙˙ă?*űŔĺęÉČé f’ endstream endobj 850 0 obj << /Length 177 /Filter /FlateDecode >> stream xÚ31Ö3µT0P0b#SC…C®B.c ’HÎĺrňäŇW0¶äŇ÷Šré{ú*”•¦ré;8+ů. ц ±\ž. őř˙ü˙Ŕ ˙Bü`°˙W$ţđ‰ü{Ş1y ꑉůŚ0˘źń1Śh†í͇ÄqŃ|ĽFĽ‡Ťď™aÄ Ń𕨠‚l˘č·?`ż!°—«'W ±, endstream endobj 851 0 obj << /Length 194 /Filter /FlateDecode >> stream xÚUĎ-Â@ŕ%&c¸Ě 迨¤”„ P‚$ޤu˝Ö’[GEÓev›¶ ćKŢ1Çî»hŃ8ş&nLŘ-;CFąXďŔA_ í>ˇôpŠÇĂi ş?!ĺ—&+ŚRĺ"c˘(ɉ(§N+ƵGÍSro‰›‚W\ŻŠ‹"­ŕЬćüĎ ¦+éŐtI…–đߣmĹ›h5|Ö ¸ü‹˘dXB]/†qsřş‰| endstream endobj 852 0 obj << /Length 170 /Filter /FlateDecode >> stream xÚĹ1 Â@ERÓx„ĚtłŽ)R-Än!he!VĆŇBŃÖä¨9‚ĄEŘq™Š†Wüßü7sžće”ÓÄ”Ϩ¶xAćƇćxĆŇŁŮ3šUŚŃř5Ý®÷šrł ‹¦˘˝Ąě€ľ"h é`,ň‚T¤'ŔuID §x¸/„¶H˙ ťˇřŮ÷®î9 ›ZŞŻšëpéq‹oˇlŞ endstream endobj 853 0 obj << /Length 174 /Filter /FlateDecode >> stream xÚ31Ö3µT0P0bSC…C®B.cs ĚI$çr9yré‡+›sé{Eąô=}JŠJSąôťś€|…hCX.O…ú˙˙0ü˙˙˙ř"ţ3Ĺţ70`řHŘţ@‚ýŚ`?€#^¬„ůŠ^°Q`CĆ-YÉ ˛śä f€˛ Ô$ę˙700€ F"Ŕb\®ž\\ć„wN endstream endobj 854 0 obj << /Length 209 /Filter /FlateDecode >> stream xÚĹĐ1nÂ0Ćń/Ę€ô–!ďÔ &HYj‰‚Ô •Ú©CŐ @°Ć9jŹ1CäÇ‹KŞŢ ’őěĺű{iËŠs.y^,ŘV\.x_Љ¬ŐŰśWËűÓîHëšĚ[KćEďÉÔŻ|9_dÖoĎ\ŮđgÁůŐ† ůĆHŹLd€ pÝLiŕˇ'ŇîAi ű?’NIű¬ iďÚ&tZÁéŕ0÷^gú±Č…ź¶X{cąţ‚Y7‘öÉ01ÖŢńż<¶5˝Ó Ż endstream endobj 855 0 obj << /Length 197 /Filter /FlateDecode >> stream xڕСÂ0ŕ›jrfŹĐ{Ř::"#a‚‚ ‰€€îŢ eŹ0‰XvtmC‚ůÄßöîOőhŽ)¦„Š´¦TŃ^á µ˛aLiâOvGĚ ŚÖ¤FscT,črľ0Ę–S˛iNűf‹EN†`ćŇY9†»Q‰¶3p‚qNĘNŮ3Ľ˙¶ßO0ďÉn‹ßč¶ ×ÄZż’J4˝&}ţ5tĘň›¦y+™A˛ý ˝-ŘĽ+Ô€łWř2>z endstream endobj 856 0 obj << /Length 236 /Filter /FlateDecode >> stream xÚuŹ1NÄ@ E˝Ú"’›a|„$ŐHË"‘ * D”H»$*âŁĺ\!GŘ2HQĚw€‰ćÉă˙m˙©«ăćT ©ĺ¨”şćDJŢsŐ ‰gő­Ü?ń¦ĺx#UĂńmŽíĄĽ<ż>rÜ\ťIÉq+·ĄwÜn…™ĺş2űĐĚĚ4w„C0Mý€¤LúNÔéL”túAř ¨9ÁçŇ„Éa=tCą6”8y€ÇF˘Ě›ÔaĄOÚ2éý/ňaÁ<Ăô&ÄŘůE>oůšżĺxv endstream endobj 857 0 obj << /Length 124 /Filter /FlateDecode >> stream xÚ31Ö3µT0P0b#SC…C®B.c ’HÎĺrňäŇW0¶äŇ÷Šré{ú*”•¦ré;8+ů. ц ±\ž. ő˙˙˙˙Ä˙˙ˇęęđ@†H0 zÂţ˙(Q˙˙—ËŐ“+ +ňT¬ endstream endobj 858 0 obj << /Length 167 /Filter /FlateDecode >> stream xÚŐË1‚@…áG(L¦áĚtYY +ÄD ­,Ś•ZZh´†ŁqŽ@IaGhôf'_ńϬ‹gÉ‚#}SËÎqbůléF.b27§+e™=»ĚZ3™bĂŹűóB&Ű.Ů’Éů`9:R‘s)U*µH]JóíŘý^‡żwźř¤Ôč¨%ÂH«´RQCôŞ/ťę‰~ú´*hGo8‚ endstream endobj 859 0 obj << /Length 189 /Filter /FlateDecode >> stream xÚeĚ;‚@€á!$Ópćş,Ź‚Š1q ­,Ś•ZZh´.FÇ5¸”\5šo’2ăąs? ›šqňň9ť8^Ń}G›|ç»9^0ČväČV2#kşßgdŃfAYL{NöELi iŰwĐw?>Í,Ŕ¨Ě Ěʰ ]’ xBi ż´LHäĘ›1VŢL0óJRţa”…˘Vču¦čZ ŔĄŔ-ľňVi endstream endobj 860 0 obj << /Length 197 /Filter /FlateDecode >> stream xÚŤĎŻ ÂPđ#†Á)>‚çt»şËÂśŕ‚ É &5mÂ.řb_CY°N wíztřo,ČżđNřěvÓéE‚‚ě69‚ćWh .-rZůe¶D/@sL¶@łĎ5šÁ€6ëíMoŘ%n}šđϟ :š–ßć}v%Ö$@ö—F•´T÷iX°zŇűÓ[őń¬żVÎÉ!zyMŽě-ąŤß+_ŞX=”Ey>JÍ3CN™.°ŕď{ťŚK endstream endobj 861 0 obj << /Length 226 /Filter /FlateDecode >> stream xÚEÎ1nÂ@б\ MĂ<'m ŐJ„Hq”T)"* L‘(i˝–RřZt)ąG L±ÚᏱEáçÝďÝńźW‹Ą2Ă3źÉ˘”}Éź\YVŘÖ>ě>xUsţ&Ő’óg¤ś×ůţú9pľzyě×ň^J±ĺz-NS={ťčĹkg`ŐgÉ?EJ €EŁAJ>.˝€dÝśŔôt &Ú¤JIˇ0rĎî熻ÇqžMÎţ ű›ű5¬·.M_Íf…[݆{ÂG¨čZµ>’݉±_ő?ŐüĘW®Kq{ endstream endobj 862 0 obj << /Length 182 /Filter /FlateDecode >> stream xڥϱ Â@ €á”Y|„ć Ľ–¶ j;:9“::(ş¶}´{”{„ŽŇ3‘ŢŇŐ!äŽH–ÎóĹ”ÉÄ”'tIđŽiÎűo•Źó ËőŇő†_Q×[z>^WÔĺnEĽWtL(>a]Qáś3-c'4‘aŠÎÓÓ|` ÁBAőž™I=E’zNGţKCö ¬8e  śŽpެ“‹&Č•×5îń űÚlÎ endstream endobj 863 0 obj << /Length 191 /Filter /FlateDecode >> stream xÚmĚ= Â@ŕ Óx„ť¸ ‰‚Ő‚?` A+ ±RK E[“›™Łä)S,;Îh%Xěűfćůh<Ą” }ĺ:exĹ\łTż:8^pV˘ÝQ>E»’mą¦űíqF;ŰĚ)C» }FéËEÜ$ s­´ŕXB×^H”Č©ÁĂ@ž?|Źbe¨®źŕzY©E—â˙đTZ_Őq×-`öRĹ!a~…„®K<.KÜâj/\ endstream endobj 864 0 obj << /Length 187 /Filter /FlateDecode >> stream xÚťŽ= Â@…g°¦ń™„Ä"•#¸… •…X©Ą…˘­ÉŃr”aË€!ăN;±ćď˝GÓY‡®âg!źBşR¤ł@[]/”ňw%äŻÜ”|łćűíq&?Ý,ŘőďÝĺLĆą©ż+đx•“Ŕ—´€"ҡ@±y‰Rx Ś-¶0ޱéŤţ~Đ*ž?˘uîmÖ˝rç!0±eĄć] ÔEÓ`ç%ĐŇĐ–Ţ*Ĺsz endstream endobj 865 0 obj << /Length 182 /Filter /FlateDecode >> stream xÚŤŽ1 Â@Eż¤¦Ik—9›°° Än!he!Vjiˇh›äh%G°L2ΦĐÖ…}đgŮ?of§óÇśęťĹlS>'t#k5Ń?ś®”;2{¶–ĚZ§d܆÷ç…Lľ]rB¦ŕCÂń‘\Á¤"iJzŚDĆ=á[5/”ČjLAOĺQ~Ńý‰ßʎ@«B_ŐZŻh4čĘJ—â5ˇÎ«µ^RMuZ9ÚѲuEJ endstream endobj 866 0 obj << /Length 193 /Filter /FlateDecode >> stream xڕα‚@ ŕ’.<} L— &Ţ`˘“qRGŤ®â›áŁřŚ—;[pqÓᾤ˝´ý 5)+ĘHń+•9ís<ˇ’^&Ą|ěŽXLפ*LçÜĹÔ,črľ0­—S⺡MNŮMC±€Ä  ˙$z1Ú1Ţwxď!"Ëűâ>ô<ćôZ™iá&łN°?â>cíH ăRa¸ĘÉHŽ'c Ë:ÇŃ´m™¸O,Î ®đ —şYK endstream endobj 867 0 obj << /Length 201 /Filter /FlateDecode >> stream xÚmޱŠÂPEď’âÁ4ů„ĚěK¬® ›BĐĘB¬Ôr‹mM>í}ĘűËâě}VĚ™;Üą“úł™i©“ÔĄÖS=Tň'uĂů9&a˙+óNüFëFü·â»ĄžO—ŁřůęK+ń ÝVZî¤[(˛€ÂĐŰ f#2ł;ÜJ>ÂPD´Cv@Z }•„‹÷c˝C  ¤7¸ľĐ'Đ* 4u‘ö.ć7úąmp Ěb2rćcŔňÝÉZţI÷_ţ endstream endobj 868 0 obj << /Length 154 /Filter /FlateDecode >> stream xÚ31Ö3µT0P0asSC…C®B.cßÄ1’sąś<ąôĂŚŤąô=€˘\úžľ %EĄ©\úNÎ @ľ‹B´ˇ‚A,—§‹˙ű@â˙Ć˙˙Aűźz ńHđ?°*;&pő˙˙˙š4A€ĹđkŁa˙˙˙[~ `1.WO®@.ňĹ^Ł endstream endobj 869 0 obj << /Length 253 /Filter /FlateDecode >> stream xÚ}ʱJÄ@†˙#E`š}!óšÄä”k.pž` A+ ±RK E»#›ÎÇđUň(y„”[,g‚Ť˛ěǰó˙˙ĚÖŐÉzĂźňqąáşâęśźJzĄş`;ëłźÖă íZĘď¸.(żŇwĘŰk~űx¦|wsÁ%ĺ{ľ/ąx vĎ’€4¸lnfxYé•DdöItÁ§S¶n\Ĺ#7@efd=ş`’El6X4jB*˛`„éáľfŔ}EŹ_éh0‡íb•ôj“1SLÍ€,xÝ>v*‹Ĺ!*:MĂö–Ƣó˝:ť˛?-y‰%ۧF‚Í@—-ÝŇ7ăč‚> endstream endobj 870 0 obj << /Length 161 /Filter /FlateDecode >> stream xÚ31Ö3µT0P0bcSC…C®B.ßÄ1’sąś<ąôĂL ąô=€˘\úžľ %EĄ©\úNÎ @ľ‹B4Pe,—§‹Bý ř˙ť¬“Ś‘ň@dý ůó˙? ůű˙ ůB~°o’äAdü ÉŔ$˙É?Häz“ő˙ťř˙˙Ç˙˙I8—«'W zú endstream endobj 871 0 obj << /Length 132 /Filter /FlateDecode >> stream xÚ31Ö3µT0P0bcKS#…C®B.cC ßÄI$çr9yré‡+ré{Eąô=}JŠJSąôťś€˘. Ń@-±\ž. ě ň ŘţĂÄ@ňx@ý˙@ü€á?×C1;}pý˙˙ţ˙˙˙†A|.WO®@.üŘO) endstream endobj 872 0 obj << /Length 169 /Filter /FlateDecode >> stream xÚÍŹ= Â@…_°¦Đ#d. ›Íź B Fp !VbĄ–жnŽ–ŁxK q\‘`eďŔWĽďńЉŁ~2â€cîé!Gš“·š¦ÎO¤j‰Ô .»m÷Ońë1üęâţdX÷„ČVîŽ|ą˘-M -č§úX endstream endobj 873 0 obj << /Length 198 /Filter /FlateDecode >> stream xÚťĚ;‚@ŕ%$Ópçň.¨H)L´˛0VjiˇŃV¸‰Wá(xŚ…[Ć_­Ĺ~Éüłó‡Á0ŠŃEź_čcäáĆ=’ą2Ęb˝4gA ΄Spň)§-8él„ôŚsĂQąyŔ endstream endobj 874 0 obj << /Length 115 /Filter /FlateDecode >> stream xÚ31Ö3µT0P0b e¨bČUČeläą ‰ä\.'O.ýpc.} (—ľ§ŻBIQi*—ľS€łď˘m¨`Ëĺé˘P˙˙Ă˙˙‰zÁŔ<Śú˙˙˙7ń˙,ĆĺęÉČî{\W endstream endobj 875 0 obj << /Length 171 /Filter /FlateDecode >> stream xÚ˝Š= Â@…·[&GČ\@7!Q°1#¸… •…X©Ą…˘ő^,7đć[n±ě8šÎČŹ÷WĂŃ3ä‚r„Ĺ9śAl&’ř]ö'¨-Ť\Ŕ,¤c—x˝ÜŽ`ęŐ s0 nĺąŰ =śî=Cężbq䙣Ň1 SĄe¬”ö‰K•vI'ě’ö‡mr˙/)Tžňě8R`ßűľ‡ą…5ĽízfĘ endstream endobj 876 0 obj << /Length 155 /Filter /FlateDecode >> stream xÚ31Ö3µT0P0bcc3…C®B.ßÄ1’sąś<ąôĂL ąô=€˘\úžľ %EĄ©\úNÎ @Q…h ĘX.O…úňţ˙¨˙$ţ˙$˙˙ĎŔP˙D2ţ˙`ß$ČČů@’Hţ“Čô&ë˙?:ń˙˙Ź˙˙7 “q.WO®@.‹Łll endstream endobj 877 0 obj << /Length 183 /Filter /FlateDecode >> stream xÚ}Ž=‚@…‡XLĂvNŕBL¬H·0ŃĘÂX©Ą…F[ŮŁíQ8Ą…a†‚Îb^2ď}ą™KJ)*%ł K†w4÷Ň‹ó +‹ú@¦@˝á)j»ĄçăuE]íV”ˇ®éQzB[Ä_PĄ ˘:…đá9o’.ęAµ@9(ˇdq%ź»7@â'aʏý/=ßµÓGĂ.^¬ÄTyhĆ ‰”pÁ A!\\[Üă>ťP: endstream endobj 878 0 obj << /Length 200 /Filter /FlateDecode >> stream xÚĄŹ= Â@…g°¦ń™ čfI"¦üSZY•ZZ(ښͣä[.(w“€–‚S|Ĺć˝7q4HRYs_Ź8Ö ů éL‘WCNâvµ?Ń$#µá(%µp:©lÉ×ËíHj˛š˛&5ă­ćpGŮŚs” V,ČS*7;(& A‰]t,ľŕ -Ŕ•ÇýGTÎŔťµ@Ű8×=ÓF–>Ľ®á ˇŻ†ľ$ÚńĽË_ČĄ÷ŞůF­Ń<Ł5˝ŢŻě endstream endobj 879 0 obj << /Length 211 /Filter /FlateDecode >> stream xÚ­Ď= Â@ŕ‘ ÓäÎ4 ŮVŔ‚VbĄ–ж&7đJ{Żŕ Ligł Z 6_ńBŢĽŐq;éQH1µ˘.é„â­#ܡŽ$ )ŃŻO«-ö3 ć¤# Ć’cMč°?n0čO$éňÓł!W© ÉľČůb Á|3ŕ1łőP˘_6Äć¬ri©Ölxz+=ŐŹ>jO=®Ů]qÝużôěŞĘç÷B·V–źĹ´~…ş[ëÎ˙)×DĹ\|kse8Ă'á·vG endstream endobj 880 0 obj << /Length 158 /Filter /FlateDecode >> stream xÚ­É1 Â@ĐźJř—đźŔÝuŁÄj!Fp A+ ±RKAEëőh9JĽAĘÁqc!Ú[Ě™Ií`4-ĂÔËŢđ™m»îjw쎜{Vk±«y\Yů…\/·«|9ĂŞŤ˝e_Hx’+5ĐCôŃ8´äÂ#‚$ŇRC®ˇąš\őˇě¸˙B˙"¨żxo<óĽâőőIw endstream endobj 881 0 obj << /Length 185 /Filter /FlateDecode >> stream xÚMË1 Â@Đ‹Ŕ4!s7q5Ć@T0… •…X©ĄEÁĘÍŃrŹr‹ń,,Ţ2łó˙ÔŽg©D’€MĹ&rŽůĆv‚=ę×ţpşr^°Ů‹ť°Yă—M±‘Çýya“ołYĘ!–čČĹRČůr¨ęGB®ů7 }Kď˙´DŤ#"×eZS¨ˇWˇ˙!§("P÷B Ca÷Ł}­˘9Şť6A«Ş=> stream xÚ31Ö3µT0P0bc 3…C®B.cS ßÄI$çr9yré‡+›ré{Eąô=}JŠJSąôťś ąô]˘  bą<]ä€Ŕž˘ţ˙˙˙ @üżA€ĹH2…‚ů`€ťhŕŔ ß €AţAý~ [@ó˙ Ś˙€LxŔŔĺęÉČţ:B„ endstream endobj 883 0 obj << /Length 148 /Filter /FlateDecode >> stream xÚ31Ö3µT0P0bcc3…C®B.ßÄ1’sąś<ąôĂL ąô=€˘\úžľ %EĄ©\úNÎ @Q…h ĘX.O…úĚ˙ţ˙`˙…¬˙Á $0đ()ŹDÚÉ? őţÜĆđęd=”˙H2˙c˙ĎŔĺęÉČÄŁd> endstream endobj 884 0 obj << /Length 186 /Filter /FlateDecode >> stream xÚ5Í= Â0ŔńW:oéúN`úĄĐĹB­`A'qRGE7©…^Ě­×č ęء4ľŘ”É? ‰Âé,&ŹžQ@áśÎ>Ţ0ÔÍÓ[}pşb*Qě)ŚQ¬ą˘zÜźévI>ŠŚ>yG”˝•Ą:ĹôJ•^ý›]S |Á-,ZHZX:Č^<rś[CÂ×Á准’qĘz¤b&Őg¤aě¦QŚĄŔ˝†żŔ•Äţ$›Lă endstream endobj 885 0 obj << /Length 174 /Filter /FlateDecode >> stream xÚ31Ö3µT0P0bcc3…C®B.ßÄ1’sąś<ąôĂL ąô=€˘\úžľ %EĄ©\úNÎ @Q…h ĘX.O…ú˙ `Ôđ˙?ĂŮaCÄŮ00~ @2?ŔDv`˛N2~¨+ţߎ ż#ȏߏ``’ ?ꇓżżG#«ľg``¨?řA6 Hű†@Ržˇ†ËŐ“+ Éťm˘ endstream endobj 886 0 obj << /Length 202 /Filter /FlateDecode >> stream xÚEŚ; ÂPEoH!LăśřŁ‚UŔBĐĘB¬ÔŇBŃN!…۲łt î@Ë!ăL@,ŢaćĚ»·µ{¸ŁŻŰá¨ĎŰ™ lµĂfOÄܒŁą©ZrÉŚOÇóŽÜp>âÜW!kJĆ‹/źLnRüQ;”Hˇ(Ô+€Řű­Üp{ÍçhĽŻ€/ O ¨.†ęçę«oźk> ą¶´¬4¶ú…Ą4Wč¬&F&ž”™äRŠ˘Ş§ÚŃ$ˇ}¨xY& endstream endobj 887 0 obj << /Length 237 /Filter /FlateDecode >> stream xÚEαjĂ@ ŕßd‚ÁzöěŘ)ÍCšB=Ň©CÉ”dĚĐŇnĆvČĐ×jé‹:tÍ&É=Žűîî$%ńÍpÄ!ř:şădŔń-Ż"zĄXŁ!—Znh’‘yćxDćQâd˛żż}¬ÉLć÷‘™ňKÄႲ)—ÖłŤµ[{˛v§Č­Ťőöđ+ďđOPy5Ŕ‘ Ć@®˛äĚ©¤äUíđ·-G˙[ůŮ;zżĘßŕµ[*ö‚l”ăŽBÉ;Ąv\ÉĽHer”;ĺSúľH‹R §Z88 ľ~íKôŃťßÍa{ endstream endobj 888 0 obj << /Length 176 /Filter /FlateDecode >> stream xÚ}Ž1 ÂP †S2Y<‚9ŻĹ*BˇVđ ‚N⤎Š®­Gó(ď¤Ď¤c‡|?!?É'ăéśSžčä3>gt#Í”»Ő§+•žÜ^wrëŽ~ĂŹűóB®Ü.9#Wń!ăôHľâ"Ć…ôPŚ‚˘x+š—"B I Ŕ/ >Ў€i`¦$fŕ_Ł…$hЎ¨†˘Šj(ŞˇD{Ł{-ĐĘÓŽ~ćęb° endstream endobj 889 0 obj << /Length 203 /Filter /FlateDecode >> stream xÚť= Â@…_°L“#8ĐMLRŘđL!he!Vjiˇh'šŁĺ({„”!qś-–6߲ó`ö}›ÄĂtĚ!'<8 9ń1˘ Ĺ© ĺ»äp¦iNfËqJf)c2ůŠo×ű‰Ět=ăĚśw‡{ĘçŚŢ@в¶^m ´­…ו„ű•WĂ·¨”x:ô däTLdOń”€_Öű'¤X`–*şw]!WҢqťµ˝z¨‘ş9KőUóďĐ"§ }}ŤdĂ endstream endobj 890 0 obj << /Length 141 /Filter /FlateDecode >> stream xÚ31Ö3µT0Pac S#…C®B.# ßÄI$çr9yré‡+Ypé{Eąô=}JŠJSąôťś ąô]˘  bą<]Řř XŠí¸˙7001;×ńľÄójä‘Ô®˙˙˙Á˙˙˙?Ŕ0ĎĺęÉČĹFJÜ endstream endobj 891 0 obj << /Length 222 /Filter /FlateDecode >> stream xÚeŹ1N1E˙*…Ąi|„Ě đ.›-V Ab $¨(U ¤A›ÝŁů(>BĘŃóÓ„,?kĆ˙ŹWíEwĄµ®¸kí.őµ‘i;ŻO%/¶ď˛$=iŰIşó®¤á^ż>żß$­n´‘´ŃçFë6Šx0ڄʬ íÍŽX⌾T†~ÂčËϰśfGvÄlŽâgŘ×ÎOČ —Ŕ<|žđHTGÇ‚+µ§Ë‡D5˙WôTŚL3ü*١¸=·‡2š˙Đţ‚˝,·<Ę8hń endstream endobj 892 0 obj << /Length 226 /Filter /FlateDecode >> stream xÚEĐ˝NÄ0 đ˙é†J^ňń @ZÚHH•îC˘L @°Ň>ZĺáƧúl·ŔźDZăTĺe}Í9W|Qp•s}ĹŻ}PYkP·ĺ|ňňN›–Ň#—5Ą[ SjďřëóűŤŇć~ËĄ?ś?S»c„€Nz¬DČDF‘âM&4=:4§WâLě• Ť«hLşVĆÚšÄQ—5Aýâ1;Í,ňw×Ki üs°Ä™ăÇ…ŕ Îdw;«Ň-Ż—y"źÍ§\ŰĽ>ą˙í[z 3áVc4 endstream endobj 893 0 obj << /Length 181 /Filter /FlateDecode >> stream xÚ•Ď=‚@ŕ!$Ópć.ż bâ&ZY+µ´Đh ŤŁpJŠŤëL±hë$ó%ó^5YşĚ Š(áÍĘşÄxÇT˛HN)Î7¬4ŞĄŞ §¨ô–žŹ×Uµ[QŚŞ¦cLŃ uMţÁÄ„B9ÓĚĆ›‹‘ńGĐ3aç(if ăMŽĹ( Ś/˝#ěŤ`Ëc„÷—V2öOZËżZ;ý®5îńÜţtý endstream endobj 894 0 obj << /Length 207 /Filter /FlateDecode >> stream xÚĄÎ= Â@ŕ‹Ŕ4{„Ětł&)!ŕBĐĘB¬ÔŇBŃÖ,xŻ’ŁxË’qFEĐÖćťŮ}o“¸ťv)˘„ZŽ’RGk‡;ŚSʱóÚ¬¶ŘĎŃÎ)NŃŽeŚ6źĐaÜ íOäĐiá(Zb>$Ă\CČĚßČĚüÇą.ě5ďŞTĘÂş)ń7˘ ˝śůPĐ €ů\č)'…ß'ĺ-,e›ů$9óŇ‘• i«ĚŚţ `ľAYŇ Öš G9Îđ-˛c— endstream endobj 895 0 obj << /Length 241 /Filter /FlateDecode >> stream xÚmŽ1NÄ0E”"Ň4ąž @’T––E"Th+ ¤Ř´±ŹćŁř)S„ ăÍ“ü=3˙uíEĹ5w|ŢpWsÉ/ ©í5ÔgűýóüF»ŞGn{Şn5¦j¸ă÷ÓÇ+U»űkn¨ÚóSĂő†=6™Ě@! `dŐHpŃëłÎ糢˘˘Ś°0g0ş°żp ă†\ĎŤF<'ź"D´MÖbLz[‚Îë€őZj6]*7DEńă?°?(Łj”A…LP5ăË GŐÔˇµ(O•Y*GŇ@BRć ›č ţ5pI endstream endobj 896 0 obj << /Length 183 /Filter /FlateDecode >> stream xÚ•Í˝ Â0ŕ+Â-ľŢ hÓ NB­`A'qRGEÁÉöŃú(}„ޤzW©Eqń _Čĺ~3°#ň) ľ¦Ŕ';¤ťĆ#ËI~š×Ďö€ˇCµ"cQÍ8ŤĘÍé|şěQ…‹ iT­5ůt]ăÁ‘ Ů'é`ś010%p1ßŕ ­‚içBĆt*R¦—€t 2;nB)Ľű˝˘¦•×4㪙_T+~Ѭý‹.ś:\âăM† endstream endobj 897 0 obj << /Length 213 /Filter /FlateDecode >> stream xÚ}O» Â@ś`q°M>!űz‰I «€0… •…X©Ą…˘­É§ĺSü„”Áő˛WŘp w»3s3Y:Ę'sĆĂ„łó1şPš»ˇ{¦~s8Ó´$»ĺ4'»tc˛ĺŠo×ű‰ět=ă„ěśw Ç{*ç Ó(¤DžĽ`D:„ťy#jAÔ BQ»SQ]9h@ř”˘9…׆mđĆ 3/"-PI˙oÓ™n•§ ŐŞË×ŮńÍó?|ÉR3{żľ‡6ŇnÚRűúć}Z”´ˇëĺn endstream endobj 898 0 obj << /Length 245 /Filter /FlateDecode >> stream xÚmŹ1NÄ@ EmÉÍa|HB’b«‘–E"Tjˇ¤`í&G›ŽkřéHĹü 4ŇÓŘŁńnęóv+Ą4rVISJ{!Ożrݢ‰˛ţ~9Ľđ®ăâ^ę–‹k´ąčnäířţĚĹîöR*.öňPIůČÝ^(ź‰(`)3SÚŤčçą1›É+-:%ô8p'?, ó\üú‡%ᔀ^ĂŠ‚úH˝"Č4źť)ÂMˇń©úP¨9%7ąHič/üŠ!©Ż Gó«dLşâ!n&{„ÁŹČë•|ÚŇöÍ J™MřŢc_u|Ç_ž!r· endstream endobj 903 0 obj << /Length 100 /Filter /FlateDecode >> stream xÚ33Đ37T0P04P02R05T0˛TH1ä*ä21PAs¨Lr.—“'—~¸‚‰—ľ‡‚9—ľ§ŻBIQi*—ľS€ł‚!—ľ‹B4Đ X.O…ú˙˙˙˙űŹ €eą\=ąą¤˙3á endstream endobj 910 0 obj << /Length1 1460 /Length2 6185 /Length3 0 /Length 7176 /Filter /FlateDecode >> stream xÚŤwT“[Ó5ҤXĄIP@Š„Ţ{ŻŇEj! I¤ ˝÷^Ą+˝PŞ€(UĄ#EŠŠŇ;_Pď˝ď}˙­ď[Y+yΞ=sfÎě9ë ;ë}}^9”5L…Äń‚ů@â--50 đ@üěěpöNÁnĂ`á(¤ř000Ź)Bpx˘ P„€`aq°8ŕÄţ"˘0âE Ü ĹPG!aX vÚ·łÇá÷ůëŔ ĺ€ĹÄDîýrČ9Á0p( Đ‚ŕěaNřˇ@…Ăpî˙ Á)iŹĂˇĹ@WWW>–…±“ćşp…ăěz0, ăłś— І8Áţ”ĆGÁ0°‡côQ¶8WŔ8†Äâ]!m`~w€ľš&@ Cţ&kţ&Üü9üw¸?ŢçŕČ_Î(儆 ÝáH;€-č(kňáÜp÷¤Í9‚Ŕ˘đţ±Ć~Ą(Ëé ř ˙Ô‡…bŕh– Gś×<?f%¤ŤĘÉ †Äa)ÎóS„c`Püą»˙4׉rEzţµ˛…#mlĎ˰y„"áÎŹ`jŠ8xâ̆DED…0gĚ j<ßŔŔ űeźĂřĽ=Ń(4Ŕ_Ěn Ă˙Pxb!.0óćíůź†Ż(Ŕ`€ ŠXĂěŕHŠ˘ăaíď5ľ˙¸Ŕ„—:˙üýdŽW ‰p˙‡ţ«Ĺ@-uU=-ž?%˙m”—Gą ¸ěO)7Ľ¬űŇs±Ŕd×ÓCđ4w«µUžcÂą"Iá1W3ĺ•–˙ôp |S M­ŠPđpušßőŞp›7×ěqBx—y´8 }›ű@°d=[k ĽÉ×z»lrˇ3dçV)aŚ A±vNÉá¶ÝŰnT …K±_ÄáşÇÉ:a@›]ëAňüţu Łá6;ážÜ.JBéO÷Î~J7'ëřŞ :ÉNôęÇ›¸i{=[yréšiĨçᏖŢi%,ęČ^µ÷ć˝6Éuů ­nŻ˙j\tD‹ÜÜvSv8×Hăč·K-ĹR~d|bĎľd¬o Ř12leH]a1mµd9ł>CY^˙!Ďd”?{Řý¤˙bý¦ńm–oô„‹ő™éŻç ›«¨‡ĘXťX®€„|ö ţÍ&×íe#ŞŇ;ŠŢ;?Č&3c»LŻ´|«­;<,÷·+ľBÚ¶nmĘPń˛jµŹ,˛~ĚőĘŐÄjĘrHřQý€@Ä}ߎâZŠ=˝~C`.Écoô)ďđší¸r4nIŃĹô0ZÝZAęm͵1[FÂd+j¸ =Ľ’bŤá| b\Q=©éňAúQłXwŃŃŽ9÷,"¬ăŇ~xô7‘A(ű-ĺIÖ®‘ĐLu‚7x†&¨G.\ýj\WÍ߇Fe(e”„µşI÷Ů~P­94e17PÚ}ĺ¦×ćä9˘\\¤[¤ĄPM#D=Lš«·łÓ3UYŤö¦ülęYë}%lsó ®~ż·pčB{ŞÍ=5.ÁăńîúĹ4—7ňuGf]»¤!ÎÝÖÂKŕHµĂ¦A *Ž@Řű±˝X©5ۦzÉÇQ#lŽŤÝvËm'6sŞT±ŢN˙śĄŽÍţÇ S)ďî=ßű]c Eć„FŤe)OxZĽh±% úü-§Ě3Tsxť#¤˝ť˘ďA¦ŘB_áÜáŢ÷şYiżk‹µ9{Qßő\ÓFćĹ)‚oĄĂš6(€›äˇÍ+ĚLŻnŇą}kĽâŚ[žxëß|[ÄwÓ0g{čÝNł<”ŔU$J¬Ż7ň ŃýŤd¶–ß!QǢeŢż™Š˝ýR´afsŕś§ôh$0§´â™‚jv 4Č^ęý=yĂć‹§=ť tMŘE WĹ²0Ým›+ťDk¸ŤÉĹśl[ť ú\@‚©ÚOľ«IŽvtt«g{çŃĐí2 čę˛%Ŷôń›cÔT>7ÓµĆ7ý‡îůľźî Ż‘˛Ą2A }«}3…tů ßĚl`ě•4QňďźAŤÔč+‰„9-1Z·÷Cq6ľľţÓϵ×ř͡pČü®ŕÖ™Ôó[Lę ÷É { îWŞźŞĽĚ¶?š„ş^«cĐZϸÇ]×ć"äÍ÷Ľ@¬đFeömaHK-őÉjšw ‘đ3~o ĐwKŁJşÁ'€EÂí>ýˇ MGů¸îSÄwi׸™k’źUM"+»‰Ý\h^^óö]TćeKżťnMËĘYçᨨ«gŤ“¨éą˛ęßŘ™éHą¨Mż+X6B*xş=[3uć Çťne7¬űĽŞšśłđ‹Dż_ĄîeC–´őĘ[Y‰ý1Ř*‡˛)g8EîqŕAĚAˇĚŕÍH AŘ·”–fËíňŔ‹Ôö:dĆ3ď Šł‹€¦÷b#qĺB;—Ţ ÔŤ}$÷«âťŐ41zřÜú«ŕ,ÓĐŁ:iĄQÇjßjÖ]íš1­őűO{b “+wÓZÁCU¦^äđ©{z'̰»űě(G<•† `ô2gT§..3z4ůMk—s$2$¨Ś‚eë‚ř€b„=CjÖŢ){$°¶ú~j!>Ř »9Ďĺ0“»ST»zW=QUÖpłNZ':ĆW›TąŁÜŢ×;”Ov˫֙Bdć^Ç…Ľ!Óśe´ňD˝žţÖ)K/Ł#$0Ç”ÎcjŔ6ĄĘ—&ů­÷´©-˝ˇ ťŔ{ËĎgĺTńÎĎËëu8IÚĚx˛FĐßĘZWď PĺbÂčîĆÔ1ë íć=6¸i­é ”r¤ůzsOJ×5WçT„Nč8äŁxâ‡{ą†–tš÷ebëzúnh+”/ëkíŽÁ7Ć.OH'^ˇî~·˛tié§÷‡;Ć™Šk˘+ál›#^›Y¬ Ęał}aŤ§ «šń–Ź)lt“ÔŐŘꛓ:Lz9?ޤsŇs^ą¶—§nz3ÎÇvśŠHě^R‰pÍç–ŕĂĽWĺ‹őgLú÷HdŔŃ2ţd”[ărŁ]łîÎ' ššŢá^ä°mĆĐ|˙şBŢN_â$;ĚMwc@+3©ÔDX`¬cÇ;‘4ţ*âjĄę*zůć*é­Űdfů'Ż©€Ă#·”ŚH<3Áˇ[ŕŞD#Í“a!wc /ßá­…ä^ő¸‹ůň6«FRĺź&Ú ĆŐ}Z–M«[ëNǬN\rNŃHŚżá%-#ăçé»|_®™đâVRSV+ËŞů=2Ç~ĆSHę ăŔuÎi«ÖiËaŮÍjëtCĚ–\™S·F-aTJWôq— ˇB_ß*Ěˆ?Au Qő¸i*ľm“K «|ŇĄ]Čü^Ź  ţ-öŰm™_‘3éÉ2§zbůüÝĐłěĺŽO-‘ţźů03d•D·¶”Lźń•ž4|Ýą˛â_ěçń2i)SNrumn­@ţ9Ą&!0,ć‹xŁ<Ý`|懯 cÖđ ř‘0ČkĺG·ťč•ÖĎYE'=[ÄąúCľú„—Ú±ĺESVw’cÁüöŃ Ť[ĺNáÓ˛3–ůrw—?´?li§!»Ç¦#wU4%*‹lŹDűô˙(˙JIú`*^îDÔIÎăÓΗ b›Vm‰Ű‹©>7I‡âŠ[Ńł-»É×éT ŻřĆkżĎ®Śęśő’h\ü.LŐ.7»7ÚceµŘę ¤$ĽAđ°&Ú÷ěÔ°ťűPŃěăV˝üň|üD¬dßÚŇý64‘C™o{÷Şk.^</ĎW>šŐp< xiXĐŐ˙»bŇśéčťKaö§Ş°vqŁďŕV*Bq~ đ˘ŹÜë\¸”JT*ů´‚±uí݉×k>Ďdhe0b•ÂYD7ńX,…çű[¦F¦OOŃlŽźT˘«µlJĎă”U#ť¸foĚä ”âfő–ŕé6»›#ë‰B޸ŻŘęËAŢŢŽ>šC˛_ľ•ľľÜŻ"ŐiQb˙qŤË±"˝ N.j=»/‹µ¸±ď¦rĆDvuý¦Î^PÚĂđď Ę´S-ď/ßclř3čMVbmjóň?š9ůBÁ¨*žĺÇdÁËłÄľŻ”Ö‚­7Âď)”;oupť<¸¶®–—Ţ=šBŚyi6Y˙úÉ›łĎGz0”•KÜ|3ĆćZćë»ŃňŠ Ű1…Áë¤UĎĆ›ŚIvŃAŁ[ޤąţ˝r9,TśźĚµé?P_%§˘ÝťŠ±đ+ÓI¬BLż{ď.Ĺ´]lá!¤áGďÁvú¤úmÔ暴Ž~)÷ĐľĄ |bE˘ţ6ţÔ1ĽĄi@EÉ~”cEćş ďÚ\9ŁUb悬X8k ĘLV3bl®‡ŁüzŐŁ­â.÷«=C‰ ^Ą!†ĄŔxÔ ëĎÓmB‹ mÇ/ůZĄKľj¸9 tĚ˝±Ä1—ĄŻĆĽ÷2ţŔĘZVŠ•­hNŕŰŕ·ĂÔgs2«J—ÂV&îL׌JTě}ěůđ4ŔŰÉ8c•÷gťÖĽÜ Ö kí“ńé¤Ű(KkŹm&g-(‡´\Ő‰Sz]’Śř>co¦be}arK4?­Ťsfł×ÂPŕZ…sZíčÎĆ–Éí’3—¶đƇSj‚H™”ěĂ©~9摆e!ľb¬x«yŁ„*yŕËjD[m5”–fń”ŕ~ÁŢ6+Ś,orŤŽúdöÄZK%ĆOť8—’xrGTâŇă§›µg[Xbćl‹µJ);…ą±µ~Ó2+ë<.JDZšÇ·`|đ˙Uă+B¸cĘŽ­a…g"*vQM)oĹŻČK‰±í\üŮł~“-ť»A8vç°×su‡ŐźśV*±ŇĹwظ‹ŻŘĆgO夔2?HN?# ^¬/tW†=wľ;ĐXQ’PF5Žţb—Ż}ÁŐÝ|vÜ,c ËďěôýT&‹ďcFýᮄçÎŽA“ઠöě×ŃEÚąŁTs¤­Žësť6snŻÔ앤zü‹B ĚăĚ1¸vďËÍßŐž}K矦/żsą 8őt­Ë”Ľ2™b,účÄ˝ÉPĎĎqŽ(˙FR×ĘXňÖŻ-(Ŕ«ĺÁýŃŁ—]ś«3CkNž./Ł:´qÜŮ?Ó TŠ©U q”–8ÇŃŢôĚ5Afö˘˘zĺâŤTúKűÓߪ.Ééds–aßŘV±sNˇ'Uoós¤đ˘Ă(56|*C­¶XĄ)mé®&$“q®+JJÔ8Tvö5Î~R[:ŕÇŇ2çÖĎÉŐÚ©ÄżŐÖď vóŹ7ŔĐđM/Ś)DY(Čç̇ŻTŇJMcb†¬’6i3ÎeśüćÓm©Ú0ĆLŤ•P óW™˘a48iď'ĄEdĘćÚëÔV÷}ôĎX¤4¦Ďd”–5ÓÓ9jx¶Bó0flüäl¦"€năhV‚őĎ&†OKťýIę¸ ­r0€g{r”eń†˘Ý=]¨n4öÓÁeĄ‚]„c‘µ,R—gk@B/6™Ęďţ.¨‚.ŕS˝÷­+«5Ś üď”2ĚGd%˘•Ä[]ű2ł†č” 4”ńŮĄRj;«ˇEę=V?Ţ$<ŕŇsۉ[Ť!ęt#â›°/ľCÖ¬¨Jż–ý ÔK­óyŐD§^pi!¨qĂŻ@Ü™®»×Ţ]cşöTYBŇä,ű}ŕ±O‡×fIĂ,ů(őµm ¦í¤ĄbC®Óz­Ą'ŻöhQĘŽđŘĄA|°_âď+h jŐOo.Ë(Ýů©‡ŢKĽ˝6ďxg:{;NV?çĐKť’ël[ŐŚ‘”Öű^°‹ˇŚ˘$—o҆y~úIţ÷Ä?âJ?Ď¬ŞĽďˇ~OBĐfŔ¶˘¦µ;ďN&J'ÔböŞlh»“-e%ĚĐMBH‹»|mPÔ±ďµ]t2.´Ľg9Kňrĺ˘Vłš»ZÖ‡@Ľ ÝŘ—Ľ|ę™čŰ˝r˛Ëî˛/żŃ}y$% $lOBwŁqC ”n”‰[;<tÜ"őŞď,÷u%·o‚]°:ľMţj&Ç„’m`“TŁŞümŤŃ"KÎîzĂ’=·ćÝ(Ą¶y3\BŹUŢŃzWš4}÷€¦ŽnWĽăĺ‚ţt2źĺ,ŐLKZ0¶ vá3(¬şÚĆV6đV2˙Ů"đt¶Hźť‰C«Ń=2ĎD!?Üú`ˇ±0’‡\ÎőşFĹŢKSYlyž’đ"3Â,I*xşŻŐgÉ`n’ęs7ĹĄ‚ůHFםÂa.đ}Vţ|ÂăW”)^Ľ•PM*â€íZbęěď>˝ÔÔ„gŚš‡ A"Łe*<Űűłĺ#ŞfĂÚÖ¤ɸ9ü DJD}ÇÜIžënC$ľeą^ĎRÝő˛Ń^ý¨ˇđUS.§Cä™ő7ť”.‚ńt8DÓB4lTÖľĹJ5»”ö€‡öž˛płD+Óűo&ówLÖP?ö@ ů÷L•ÔŘ”Q)=Ž?ęăč }ň‘´»(˙±fź ¨všwlaBßJáÁgAZ>]‘¤u%Ť«n®ÄëX1 ˙äÓqcs‹sűBý3j˙A#}Niżť¨† ­ĺwP «ß8jŰŁĐŘ˙Ç@?\Ľ‡Ô¸…g“8Y٦ĄíxÜ€ŘőË3¬s°Ai«ýaĚÄÚ¦f<‡¸±IXgKj,`Áîy~ť¦ŤtDh0ˇĆĹô˲GcfßőµĹEźćŃݵ#^-ś%3”™áZŐłf:š@E4ř¦¬H‡ _^čěńáJ!׉Ł(yÖóŔUč-đv˙Ľ—cj1'Śž xsF˝¤U…˛q.ţVĎΫ,&ÖęŽ=zČ`•˝sséŻ^§t÷ŕ!ůpń×^~ˇű–•Ťf/5>ˇGݬtďçíŤ?á˛úů,YW·§~•óřâž`ĽĐÍÄ‹"˙™€'´Zł¨f2!n+™·zĘZĹ—ç:|OÇě˘ÖĐí¶ł„H˘S‚VˇnđU›Ňü¦Řoťë4¦šîŤÎäµňíől˛wéCú„WYŤ×ç(c•®×w«5mďß;R3xĹy:čžţ)ř{üŐ$4ĽiůĚjźe~Á19űTącZĽé5•Nţ*ŰťŢ02VEńb‚pj‚@v.‹´› éZnń'˝=·-5“e^ŰĐpŠŹ6řÍEÜ8ż6 ˘)Ëď‹¶p3ń»1gaű­%w˘jĚ5u@Üűőß?đ4ČJĂřx'PĎG˘WNčËéŻ'=íöEôQmt™ůĐëń\gsé@%)¤NŘÍ’ťşű¬ĺ¬@XB.}QÔFbV¸7vË=rĘí÷ý?í›úqvq·ź-Ź;ó•‡÷í3·Mż/ľŃ9X°ŢH0rŘ1Č|~i—]ÓÚÔZßc¤V%3¦˙épîęuźOkě(üş¤,ťă-ĽîĂpu°ËEmOĎuö ^Ó…,Ţžě&>”,Ó4I˝…ćĺ¬ ^Ô…ĐhÍ—ŢmŐ$­¸§žV—Ć>žÜZzŠy°§'z˛3§‰…ŠžµąuPoş¨h“Š`´TM÷>*%űşó€cFZj-Üß˝ńâ)ZF†´*;Ńň%<˝]ÄYD˝śâöô>® ę’8Ŕµ>nĚďŐżc?~lhs—/1Ăb›1îÓuźçóü‚Ă™]nJÇśÚpË QŃD¨BŘ]±>âĄÉnĆ^l©úěDţü&5üÍDô g†v›˙Ćü˛»âײ;ÔVÖxŘ‹·Ť§ąĽ8 {’ůřO[ É oIËIŽ{ťŢ­]«‘pyçYŕ]ďbxĚßŬ:ŕµ˙îÔlf5…ŤZ±9j‚^ËçĚekUÍ*‘wÍ ŃµŠŽ–÷!!91Ô_¶„ÔěgŽCAĹ‹;XcYÔ˝jç=Čf?Đ ł¦š¬V1Wc±bÝ« A=@¤×/ĽËB‰n’îPjĘä«É cżĐl†MŢż«-ńŘý“¬[ŕe1đáĆ =úq•ŃVćCÍWĹřłˇ]ŁĎâÚ‡d_#8-˝)Ť”ç7ű×O‚JĐnöVë¶fZ_~Âr“TŚuB~: Ăľ]/§‰çĄ93ѧłztbńŞ˛Ľ˘Ý˘)ä$§©űżöé endstream endobj 912 0 obj << /Length1 1461 /Length2 6296 /Length3 0 /Length 7276 /Filter /FlateDecode >> stream xÚŤtTÔ[×>!-Ň%5 )9tI3tw3ŔŁĂ Ct"Ą(Ý ¤ HI ( H7Ň HIJ|cÜ{ßűţ˙k}ßšµ~sÎóě˝ĎŢg?űp˛ (9#! %–¨č…¢‚ÂÂ"Äśś&P ň&ć4 ˝ ¸Ě¨ !`SŁ0vş8@ËŠ€2@Iaa€°°ô_†¤ @ěuč ´p1§ ÂĂ uuCaŽůk ŕq⥥%ůą”Ü!H¨ĐŁÜ îťŔ0€1 Aů˙+Źś ĺ!#$äëë+v÷D ]ĺyůľP”ŔâAú@ś? čÝ!ż+$ć¸A˝~ăĆ”/ `Ô ÷ÂxxĂť!Hćp€±¦@ß˙m¬óŰ€đçn@Aŕßáţx˙ …˙r;9!Ü=Ŕp(Üŕ…Aú A”І;˙4ĂĽ° ;b ~e€” `LĘórBB=P^‚^PŘĎ…~†ÁܲÜYáîŁĽć§ EBś0×î/ô»ł÷ŕ_x༫ îěňłgo!S8ÔÓ˘©úÇ˙ąBPqaaaIiQÄńsrúŢÄßň‹ţ„1z <." ÁPćŹ8Đ ě ŢŕŔ˙$ţ˝#ÎP'Ŕâ …˙C\~ď1ÍGBýÖÂíÂ?Żl1ňrFŔaţ˙˙ꯩH_UŹďwĹsĘĘ?@ €0@@D\ü)2IĚ"řßa ŔĐ?iü‡Ż&Üţť-ćšţĘŘçŹxţ /ŕß±ôŐB<˙ÜFX\Ř óţźĄţËĺ˙§đźQţ7‘˙wB oěÍó‹˙h°;ć˙Ç#Zoft1€˙·©9ä÷ĐęBśˇŢî˙Íj˘ŔAP‚»ÂţľF¨ęq6€˘śÜ~«ĺ7núsĘ`P8Äáýů¬0­ů/3ZN÷0O‡F’ż(frţ}¤Ü áüsÄDÄ%`$ěOŚi2f'bfŃâ÷KÄ!A8…q`Ę ¸ Ä?;* 9"ÁN÷ ×Ďő“üŤ‹ţŤ˙îŕ_„ĆâéŤiÔ_FYBGţŻbŔ?č?î˙JÜɉ!Qż¤…©ęŻý݇ń8OŤ#śd#ďÖD6źT)1ú ¬Ţá\5Ć+8…lń>»Ađ„·2+|y¤ô¤Ż|vYŤçPqšő"póM-ALcŞaÓŹ sűdŁáŐ&âÉ!Úw‹6•^u31 (®]x™…ÝĂ}ýV‹3ĎÓ[ę†AŐ‰o—şß«nôLôřŞáZĄ„6É9ú“@‚éC›°ŁśůŽŮcôěř(fÂŰ”»~dهG#”ąŻXµ’ů·D‹­EťŽĚ˝4ńjcŕ`°˘gĆ=¤ěć TŢHÓ˘›,)ž}7é÷F®5—”˙鬹ŕ†Hf%Ô(^ßYíÓ?Ő \É{äf|Gµ’Z]ZOmŹd×§©l˛Ź§BU‹Ţ0o´ş(Ď5™µ»Ü}Ę4-ýéŐ`”ÔŇm3´ˇ=đG­ç\ßűwÇŃOOúęß/·›żPčV`rőŢVsłŽ›ť‘Éd~ЇF ŕ´™C4©Éů§}žHťăŁäĂ÷”Ďn—Š„…­¤đ:±ű™ľ‰çí= .ŻŰŐk]Ą€ůRÚF\EHč]9ľ}ş»[Äŕ&ŞćÍ“ź©Öţ >‘ŰP¶R7Ú],§T-őgŐIYźÜëá(ÓTď\ť¨č‹ł ÷ż{*](řܴͬ)IĽĐme+^``Ł.¬W9"ŞKúČyc騬LŮŽć Âět·Ü7VąďŃgÉČü­Fˇąm^úéęJń8ĎŹ—Ç:‰om›(ű°ą×'’™›Ü9[h{~îËŹÖTĺä.žŇíÖţ"4e;©ZÜÉPŞHűŕ°>T¤¦E˙„ëzůÜ#άµÜ[ö-}őf{—7•ŤMN n,buN|Xfű0ĽĚ+·y!ÖŐŽ Kćb›XÍ8X¸Ăó0îŇ%®aŢÔW©vš©:sôda«·˙šň-‚QajůÁ- @Q)wÖĽN1őŐxjÎÝĄ€lĹ3ÖĆ;^65óÔ‡rQewlÚ,±9TbMż ­ťK<Éýä§žoď)cĚcXVrŽ?Îa›&ÖÁ˘«¶ÎÉ řľ\ÂËöĐ%Ę"śĐi"žkYnŚ›ş·&1mĎĘ@T-ź-R@¦š‚›bńrHé†YĄ ŢTWŤŠÖ – ŤĹŐ(‰ź$QM|+Ěl¨s¨msl\cŚ1ő ^¨ôý Đ„«/;Hüq˘ďžq,GPĺUÂPnp}đ) ɰĂý×rŮ,@áŇ Âô+ą¦/î;µő§“Yó}n»óy‘ ĺ_B ëꪪ2ú$Ó6iIěűó𬟴HůȉÇî >žh`M“‘ĘJ¤żiFj{żţČ0UÁÂfĐÖj Ęk†G‚ŹüéYĆ/ď;±pÚ,xî„Ú46®‰é‹ů°YgÚk6TíĽŞ<§y·ćSxąl_WëT7×Rře˘O Äýăq›“N2׳/]”áÎ1îăl“O–Ú‚łÚô_űxŰůéÔßk‚cU¬”ŐsZYýgxnÄisGwŠč Ź=­Đ4ŕŕ€ýřrö˛A •nŃşŤ~s2ĐŇs“A»‚K„Óő±ce@̱V?C:ż7âľîK‘.ú€yď”ôĽQ‰ŰM·ź“vw– _Iż,YPč*Ô~LëÄK˙áăńg›]×\T9—BéňŁŹ]ßŔńM6}[Rך9ňśőlT2‹§őŹĆ?*›‹ř±nHy˛é8ŞXfDlŢ_š =ěUľŁXýýl›M8ĄÝ2pʱ}:tÜĘŮUţv¸ŹĆ÷óüg[şsPaˇ éöĚ{#_ŮýźN¦xp2Í™°´×_â8ĽmzŔ "-‰¤×‹ďűr• lŽTU樜”HĄżÓËť˛ÂÓѬyî¦wV;¸˘O ¸ń «ăă4ćN­{ŢĆŐË®»őŐ˝K±Ţ|,şśľ¨Ü}Ö‘SxęŢí3‡ŚM‚®üÔ…T!—ĂÎlX §šHľ ‹™ݱ˛ŽĐššö›8Z%G©pá8&[řˇŤ„çV㤄źÂNŹő +R*Đh‘BŃŢeBÇłboľ‹ă¨t˘„Đ%±§yjN±pÉ”ÜB꿢»q%Z–Wm×r Fĺ°*ę7󅲱@{¬Ź_‹úłÜJ_v"ÓŐťRď¶şłĆuyŐđń!(ź†>-cďĐ’Ż€\›4SN4Wf ^7ăMş6kÜ;eŕĎß ›±cDIŰ@[ÜŇJčÁE·d n´č\ő;ąöśŢŢzĐÂ,–‚®çŕ»a^%©‰ÁŐˇODŢ)1ä=ŠÇĺôÍd[ęYCŞ7í^RäC>XŕMÂcáńx’˝˘ ť„čMŤ°ĎpéŤ}Uîő;«2 ËmôJOee˘._ŹŁGh´lŕşź(¬ÜP”vĂĚLv2ży vä)e…ľ ~Î"”żYJŞlś%b«3:Ę5÷ŽÍťEEvĐâ™6čÄ$ßńÇłäVł°G0kE{ö´ă§ň„9¶† ôXÚ؛ϧ`1C ]U˙}@™ô’§YqĂ‹ţb@Š—Ý˝í/çG™đÉí„ĺ…ëE2ăL:9 ¶Ź(vŃH’¸ât„ŹžjkĽ®ş¤4‡¦ô’+UiŇ•ń3&ᏣE”ŇŻŰ—Ó&ZÝ4(Ҥ¤D˙Ţ':5dţ¬€k˝îÄru˘–{jË|zh5‚«­@8LpÉ@“!%‚N}ň&r̹١B,ŐÓ ¤Q<–+ŠMě/¸oťç÷fiTň.Gg_÷Pú(h-Vh<)âčűĎ €*-ú¦ąIďƤÚ_3GŇÍžÎĆrĄL–OŇæČ׏ŇrIťŘnN\­b`v#•†’)×~öMšzÝńçÝ/ˇ<,J×aőTĂ߀łRŢ‚Ţ|ß–§ŘĎäewůCúj‡9‰M• y~¸˝ÂĎĽÂ)Ć{(Í żŹßF7ž.\/Ý“ęüĚüë¦)†łŮmoܧúÂĂgżť4›9:9ýh˛»D©,ý€Ţ`©R®<ëBˇťo—Ha ÝÓ‹Ť×®ÂΑ-lű:š ťńŕ“L>Ô;{Ž-»řąŘůňeÇŹmě”rňó…ŰÍqrďžç?Y¤Băzµ=—–«SO$UQs2űRŕ¶ŘŇ×ĹIc:*F´t- SD„p “Z؇EE›Ź ¤'¤·¬Ľ¤c°ą–ËYH·Óć§2zŹ‹·z˝F{׳*â»D\ϲc6ź‹âóĄ,…¬qŚŠďPŐřÎE˝ŰŇ—vĽ*\eמKő~ŔĽó6ŇvNčą?úˇa5QlßcĂ'Ś ŰčY¨ í^†ťŕČŮľP×!˘(ÚÓä•^ٶdb%!źQúř–5˛8óĽ×ň°›jŰŇÜ\=Ét˝8ţxŇ2Ćŕě;ń ŰT­`ëŕňáîvDŰ™ĆCîš:yl+CĹA2Í©EgáĘUZV›u ŻdWëyžŰ <űz5ĂKîŃpÇk“Î=n dČčBşÜţWK'ź–„'M‘¸f=ďĂPqyťs 6¨naf×î^¦ă|üë}ÚmťĘB[Âp‘i>ö›îŔóXJźĄť…ŮƵ±ÔďŔg!THwĄ«o^O¨;ŢěĂ­po§7Ý)=~ďu¸‹Č¤vT Lö'!dSQaŤ¤s"4±z˝µĂ˛&L'Ytôrő2xćĚ!0lsT98šÉĄ#çńöeŚęzĐ›ű™µRg‚}]iŻů\{üK|"X?Ű×(TĽŹÉŤţ.˘ŕ3ÚLŹóő ůp"¦Ó\Č&Ĺ0VäNś6Cďę;ĹF@Lx"ą "˛Tô7¶˝ż•‹“^~ C(Źy™JÄš–íĂ&|şQz~}náě[©ÚŘ:6ÜĺÄŔO,T#*Ź&č+ůy­ěŚ:Ë85ą%»¨ňwń©óµ“Ď6ě#eÖř'Ŕ´Áôm'q˝i´‡Ľ¤V“ňĹAť—׮<ßKýh ůo ä­+–¤RŐ˝şÂdXŤ8¤m%¨ąbĎÜý+xˇu q>}_îv™—Äët)Ű1)ao7ý^ŮçMXfËÔ뾨Ľ¶°öm†z'Ž€ęQS9YcHɡ»EQ‹ÝSůlÁóŹżmŞr™3…ö˘WĆ -Ţpŕk,ĽX'ëGi•7…ôŽ NY2í)NÂiĘiäöß·ŕła„¤­úçË(%=<RxZüS<űyZ;ű¨Wꔺű9´ďeXކ¶K´•cćw% ]ŻŰgY+“ĺoŔŢz$Gß,+ám‹~ť}ZWĽ/” K`ĚŔ}ÝîÍˇĚ ęšVő]ĹŻÔ~eŻ"Ôx„ŐßË6ŇĚzâ<*íy|Ď„űÍnąlŽ\’'#|rĹ; ÓQ¦ZtÄn>%öLžčňüT¦°?T1ćkc*4vŢgôá‹ –iĄéNżŹ|ăŮ©ă di„ô® ą{č‰kKb›_@â‚x;g&çÁqiĺ‹VoF*ĹĽLßvw­w~/Á§6 ł}Hł|˛őë”m[“pÔrµd$—A›sĂ©X­˛a‹ĺGćĺ©~M[ĆPc|ŕ1ŕÖÁH#…ŰŤ~kĂh7´ĄŔjř}cäĄ?X k`©^:6$Ë"}-ÉöZé0ť%m|”˘xhĘÜÂ0ĎM⓬dy’ěÎú>UŤ»1äË^4HšpżŮ4â5ÁůéˇńĘĘüŹ÷žVLĂşdąŇ*oÉ­OgTíC’x]†W@™ő=ő ËšNXŠĆ\irWxÍ)ß®A|ŕXRTaŮ p&›ełj´h÷¸\‰ÍßżyYfo„Ź:lj­Đo/-ÜńŁîĺřĎB.Á˘ i™›ž÷,ł«—¦Q”Żs»čz ڞZ›^źŐŐ7XvŐ%Ř‘„ŽNpŢčaÓh݉×׸"ěxÄjú:^v#¦fp?$yI«Á'˙FMíě-bŽ)4Ů ·Š›Bxş\¤1ýsÓö‡Şö=ĹÔrúl˘ đËÚPętĄ§¸č/0„9v­.Ď~">«ţĹ­‡‰!¸eŕÝŃ Žs…C#·&,ď"d±šmµö<˙pÄ ăýVŕă|µĘg;w=Ŕv$a“n›ú÷p˛ëże.{śś]/—ňöźĺ@î§Í<ń&v vňěäo÷żĎv1g;–}ĆxҶuĂ”ż»•Ç»•ŃŘĎkŐŹęšá©°‡č‡}a™µ^záÓĘżôŢXěP—‰ýĽ×‘•©aeĂ™hşí3نĹB:°lGżřA9Áź3TĎd©áµčú ‹ÍE…fwj­”ZŃČcfčň„†âlRËÇ‹{ F‚›™‡>ܡ=î‚”ÜĆËŞMýS0˙sVzÉTÚ‚ë–‡ă*ŻĘ»ÝżÔŮ˝®T÷·WĎ$8©›>˙A†z8JrąĐż´KĽ(ö Xʵ˙ˇ*ěĎ·ć‚v•vă`>+éƶUÜŃ=u´űôF]űHVĽ żČ·głéÚŠ&ŇsG©DÔE)|Á’ęý2´cnĄsżexgëĄ%’ü łęá‘Lb´3 Q1î U Eq}SťÄOÍ»ÔFő5ş-}”¶}á}EhĽN/­ťÂIŃe˘] ¶ŕXńuíK}­a˝„ăĎčŮQčM“'íŞů.ą¸Î ´f›S]pKGr€ę•éÇŽ$ß&Ëľ–‹—V2;ë]‹şł€o÷ë`!S6ĆlďEś›A×^n±ŇŚĎĆnÔfĽł›–`ü&”ă?üĂĽ›OůĽ—4Îşr0ŽÜáSkżZNa‡ďÍvĽ-0 ăőü€5čľ8’Ž2řîűŞő>Ĺ…q«ÁÝ!~dk;ćŻńŇWá1^Źž Ăo߼Q S°* 8ňž2^ľa]j›ŐC@g«·đ<Ŕˇ¶„łĂ!­ŕŰÜŰ>/´BŁĎ‡¦wv6çn§ĐŚ_ľ˙\˘çčĹ7ÓÜ:™`'JzaJÔ0|ŕúŐuĽň(É»”7ś.×Ieqć?×€~9„sv»§×őčJLÁBĶ#I¬D#c  sb?Ă®}ČS‚¨Ézfş}p˙úqqJʤüﻢt xRNcIą’$ű—@Őh#9!Ô…nwĎ÷SŻŐçˇ?îIkZ|Oq),ÍĆ]şúxńŹjęą…ÚÖ‹4ň^ÁŻźŮÚ†:ŮokÍKŢh›¶d©$dÚŔŰą;CĘĚőiJiCë:_ŮZěŰ7M„”Ó”wÓôňW9$|jŚošXR<¸5C_ˇóôJlđĹ·u…L¬ŹÜG[Çť§! :g3uťq~ľuZ/š—ę—E‹vB Ąžµť×úްÝv“˝<=µby©ZŠRĽ.z ˇĚČĚÝĐťT”żË+gîć°˘Ű+5QĐwu˙3dqŰLUk,čicŁYđđ d\/Ý;“^ĄŢ ú śg…)Ź ‚eńâŘGšµŹFn &›äŐߟ٬߼8¶MĹeľ‰K"›NÔôŐ jÓNŞá=*qeŘ}1ôŚ;ŰP´×QÖďVĂ#VŃVă~ô]GŠíΔV2üű|ý«oYĚHłů°?ŰŞ7řÍňĽK;ąíu¶ˇ°ěS\qD+ąőzţH–ś_Ź«„› ZgS­gŘ®ąŻ1:đ}µMÁDf[q´C·®wEB`lŃ>'\-÷’·ÉmŃ|?¬EĚĺ HµŢ-qFpň• Żť1ްKÜ7ř‚ź$ÖJŻAŤfHű{ĺ1‰%I‚¤. côhW´ů“ ńëIÔöĺĄĺgq‡D:Đ}űLżö„\Óś xn‹”şžHuE2Óqr MÖôČőŮ#ůs™>3ű8}ňcĎĄok ÓŽÔٰNŇîšNĽŰëó^eąŕöOE,”ĽçUKŠ•" ?7-Î:óĺ­ŘuĄŠű@ă9*łč|÷Vń›ĘYšX7Ď’â¬f/©ŔĹbm\uÉÄeöň áś5ôŮ*Ŕj?Ŕ+(*<¸°Kg¬Ö*®X&Ô=ćŢü˘CIt'q|×D¤ëCň¸ő+çúÉÔs­,›ŮW´,ĺLű´N[Óôˇç§dAřP­wĂď2•Ö‘—q4mĂ— ýZ>üÚ¬AŘDűµQźÍ'%e?;Ď4ڬµžť—3m·aş>=ŁŕÄwÄąXM´­×4«l,.}Ńţ ;ťĂŢ9Ţ•őĘuĂäKóÜŠťc©y7!ţ OÍmŔC_ü—'Ľ4qS—Łě¨őŘĺť–ĹrĹŃ\tȧ˛JΚ*ŚB±aÁÄwŘ6`űdýqYÚb7o„i 0LĚ™ŻÄT(ˇŐą#şh»fĎč^ }ęWŰ™Ň0l§«dٶ\1ď¨ő—Ű5Ĺ(7Kř.şw“ĺ«ń¶Ňž®ď©‹G6nŕ“V|z8ď|“˙ڤ˙Éňe‰Ć~csĆI@±Ů§íȤ¬lY¬ök| ţ°‡1QŰ €m¦ŻşkÎ5çălC Uź ŁxˇN­7Ôn˝1zb»ÂçÁ˝nÉü¬WI~đű 6h”EjGz÷šđ`]ď uiG}Ý|ű±YžaË^ç#ăÉEwëBk˝Č˛B>#¤»ŐDްýXČĺ5Cľ} ŠóÖ#1XŽűąź•ęqj˛Gń!ë´uâÎ5:ĹĄµS‹µZ?ë` yřp?O{ˇó®':gé-â!Žň<Éł?ř öWÝ·¶Z)6aXzŁÄďűę×G쫨¬:P·?ËĹWĐdĺ‡ěŤ§ˇëg8;Фbfc-ëŮNtt"ňi\ž‘6eĘč'‹ Wo˙N¶áT 9KexŻ”ˇäęMľař–˘ś‹[­{büµfkĎWŞ©ň>·˝+±gw}o…8AÍŘöÍŮW1ąN°ŕüúX{©ĆÖŞ¸é•ëů+‚Ś÷É*Eµą4đšŰea!˛™‰ů8r‰âťˇE#VÁDµÉĎŤPvôgď(+sŤ‰ś:vK<Ţj@Z â:ZŚâŁc…ÉÚ?ChęĽnűŮťŕŤ`‰$_Ě~ó;ď´Ńµď6 O='Č‹>ć×ÇăŞĘĐĚÝŰĘ2;d1Ůżnř%LŇ€ś† p~ĂÜ'¤ CďHO)§*®äű´ńt€B¨Šńs ÓĐŘCŇlŤ´˝yc˛=ęČzttďÜhPčkP•^Ř8©¤˘ťź-@]4.üVâhS»F€x›~¸ĺ÷Ś,‹đ§‹ę%„ ö) ŹÄüŃ]WĹ1¦YĐ/Lj_?%í¦éń Ś·Ő·ąÔ›Nź‘ŃfѸˇč)qɡZµ­úĽ´Ŕ1ű>žµ)ĹŕđäŃS!1S'ÁR úkĎř˙Ë+a endstream endobj 914 0 obj << /Length1 1473 /Length2 6794 /Length3 0 /Length 7778 /Filter /FlateDecode >> stream xÚŤwT”]×6" ŇŇÍŤtÝ )ÝŇ5ŔCĚ3””„„‚ Ý !Ą”H Ň)ÝÝ ~čSďóţ˙Zß·îµćľŻ˝Ż˝ĎŢç\ű¬5LôZş\26p+"†äâĺ‰ręşşĽ âçř°ô H'Č_v,&} ‡‰ýCÎ FŢÚäÁČ[˘:¨¸;ĽüŻݰđ@˘ánb€<Řj¨s*pĹ$wńvÚŮ#o×ůë`µfxEE…9‡2Î7¨5¨‘öçŰ­ÁN€.Ü Az˙+«„=é"ĆĂăééÉ vFpĂÝě¤Ř8O(ŇĐ nŕWË€ŘňgkÜXL€ž=ń‡Cn‹ô»A€[ÔC܆¸Ăl nŔíꀮ˛ éýAVűŔ üą9/7ďßéţŚţ• ű ¶¶†;»€aŢP` u‚šŠjÜH/$'†Ůü"‚ťđŰx°ę¶ş%ü. (ĘhŕŰ˙ěaíuA"¸P§_=ňüJs»Í 09¸ł3†D`ýŞO걾Ýwož?×÷„ůü…lˇ0Ű_mظ»đ\BĽź „Eż§ŃC˙,ă?B•a¶p@ôŹjo·éŻŠ=ţ”ëźóÁü;—üV¸€őť›‚AÖ·?Ľ˙gµ˙ů˙‰üW–˙Uç˙]‘˘»“Óo?ë„˙Çv†:y˙ɸ®;ňvÔá·ŁűoŞäŹÉU‡Ř@Ýť˙Ű«Śß ĚÎé"ˇ^-(ŇÚţ˝üaňkŇś 0ýu·\Ľ ĐůnÇËÚńöţ@ÜŠň· r;=˙^Rf ·ů5f|‚BŘÍ ěŤşŐź  ŕĂ{;Ź6Żß2x¸apämpŰž` wĂúu¦ÂŹĘ/ÓHŕQ˙‰Ţ"đß÷v$xěţŢFÚ˙xś˙ĽBňČxĽ~ĂUoíîćv;ÄżvŰÚ_ř÷ŤxA¬±&FáÖâ!! gďe¨<ą–żaĚÎ7FÄu„ "™Ç˛|ěŐîĄ<t•µ´)%ďIÔ/ őĄbß9ëó2mI śIPĘD˘(t,Ęîqewź¶ŘAhmŕ”vý‰‹vcµiđ-MĐLXâ FŻž ·ňŻ–­ä]7"VŤE7g ˙„€> %“Ѹ‰iDĎ8ŹüjdJMčf’ä®§ü¤˙5}*Űđ’âÜ{Ń$:ůëŹ]iť‰ü9ŞmĺBĄˇDÄOUč3z^ˇ ‰MSů@a–<‘+ŠăßnCÉęůŠ1¸…ăgĄÝv¤ťžčq7âî˝OÖ†w)7őkâwčÔj_bRŠÁŮ<%­¸ođA-őh…ťuŃ zĹÚĆiYuó ­}_Ľ>íä›AW4FÍ%ŮNŻĆ†˘±/ >,Ă#˝Ä÷ÂŔîV8‹ťËžIôťďe~Jŕ#ě@´ÔTóuy“C./Aî›ss.-c~HPâqYđÄ9[Uuć5Q/ ÁrÂŔzMLęÁ+í;ěTСÁ–áK,pj{Źşó$4ź_(‰¦â 5™<őZ“ČÎFQ¶—čp€Böň®Ď&–»ď=1Ţşëšł§/Ź)ăĚÓ.”şź˝ä‹°ň"}_Ý˝™űČbńQŇÓűvĎIg‚&ĚfŃAĚś8Vw¦tʦ¦sźÁ §&9ššŮÖ ßW0ťĚĚá"őDľ÷æ4Yľĺľ+ŔO˘üR=V^ͶCu#ʸşd·‘ń10Çz” sôx˝ŻcÍŐ`ç€U–3ëŐ"`M¸®˙l8ÝĎeG&žŤÉ’#° "Îë‰oY»ę´i˙ąŢzZŤľ[Tm[m.Ř‚ŞÓzŇčbź¸Gc*§öĄËAsâg;ŰĘ7{ď{nAé ®Ů?¸>)@ńVŢK|úŘł>ęĐŻř\&‰ăÜĄWś}·˛Ĺňłîs)_yë-#ŇŤMÜo¨/ą8=&&×Ü+I:lLčýćµaęűçqq[1î˘ â(ůŐ(őÁď>†;¨V­9nżck(& ëčTŤĚ𠸟ß|qź tő3Ęăë”"óşţ´‘ŤC2~çSOéă†Ü ßnkŔô’,aM/.$đ†)E<Ń…O[Ć@5ÄUřD¸Ę!Ó–bRZ>íű{ˇ§ŻZ!5GÎ);!RâqeˇIËTyjĘ›'f¶Ą­z,Í Ä´ †©’™· ¤Ž4tC¨˘ÉP_Tšf<6ŇOâ<ĘÍ3ŇĐđ.˙z Jn`"ÔFKtZжµ·ń ńř”čgüó×±oIÜşŁeőżA^8[şI˝=ˇŇ×í}v(â#L]ÜçwW‹«7ëľůé™G`¶[?MĚV6ŁHôą‰wŚ BWë‘ţfg@ޞ‰3»ÎÎÜZpň¬Ť)íť…íViĂ(ôÝը𕱼Ń;ÜŞ!™÷ë=Ś_óvĆ#Gq›g>Š’ěm‹g\ˇĹlqk_şć4Ybšlń5Ň60’óMsâüř{ËŢv ´éµÄ–yOXÚLS¸Wř ”¸•$™órȰł~'ŕa›3Ŕ†uXŤ«I.k{·śs”›©+¶őŠôë7ÂŤ¶C)ۢyQ0[ Ký±·/Xä*ăJ…ŽžzU‡şx(ţ°ąÎ|e×mßó‹yzhE­ř 7„a˙ÁeűvN!U‚»é!Ť^±čtÂŹY˛Ĺ!,fď¸wĂÁz-kňő·ř°ľ™zźRs§D»ŹxhJXkź:Ů’.—ËLő)B·»×)>¨ß²ȡęÝKŤ®ÜŞ`*Eř©w Ń Ĺó%•{ĐĽżlŻK=eh!{mĐ`Xv T”©<Ä™=*ĹşeuĘGƂڞ\eQ˛ę·MY-.¬˘•#r|Šś|Kv=mĺáj-2ľL›®ˇýV)zÍľ(°áue$Í1řy*çzÉ9ź“®÷$‹»»=ˇe˝ŕ»}?­kxĹHç[Ż|žüDlôÓ˘!Ţ;’€O¶aFë®} Ą~âX–ĺ˛ÂÄľľđü&ŞbyćQlş°äW”Oę$˝~~$ďK5úă„ösü‚oЇ§ęçČÝźĚAÄe!'45Č|ě*ÎĆ®2Ă7ßµßä(O¦[¦9Ô‘ćieV>}pXđă=*qmžÜÚŮł«µ-čě Ýăt¦„.GÂdĂT­'I ÜËUçay_bzŢň×ö¦iÖůlŠłćJś“^łŹčôKP Řm­/˛öŃ|—zz‡UYúđĚ>El4}°ĹśCXăůcž'2đ<>AbtDŽÓYôÍW% Ż:üŁ˝Üç;ÄŐzGŘHůô`=éë zK 3űşYŚćĺ{hU:)řyŢĂŰwBĽĐŹ{˘ľŘflÍ?˛ČĽ˛g6m;eśµ3H.łHGYrÍď×ßžL%~? T÷3ąBĺSG·ř'A˛0<†o‰ÄXɢ‹\ĹËű˘wKřN‡ş<ůµĽĹ-:ËOŹ–ß×ݫĥě-ČlK±˛ł&ĎkWlö!čWä€PS |»ś@®nxô\řÍę¶{ÇÔŁĽtŚA`6¬‘< łCú÷%?;µÉ›dŚíň¤ŕh…ţšµ ;›q<ĺ}‘›úB‘çďřł‡F´Úy=Č˙sąL*ęń•yxýĽk—ńqcŔeőÄ‚âfezw˘®IO” »á\í”Iµ1/7VVĎ¸ŠŽ7z6ŔłaiţÇVČ”9Pń†qž§ťd$QšňĄdr<±µŇT8 uËt_Ç6ôÚůiń‘e©ËE L/6﬉qř!ěNőŞ~ťTQbcě~ýkĘřa\îš 0bÁó\ÁKP:4úćĺCđ7 a|^Ţ>ŃŞ©˘đmVÇ˝IđF6ĚÝ絫ydČsť¦&s—ă5k«G/ü.ŇëQáůołţŢçÜ©ĺqÎ8ĐŰ˝ÖgÜVůO·=]ęŃÁ—Ř3(r»n{ f±˘+8{Z~kXja;Yw-O'Ă™ńű.ěxÎ/ý˝¸Ú˛NÍÔű.Ó=µeŘ—0U¬¶Ăęî±Ĺ÷'hăő§ĄÍś%Ö‹JÇĺRŕ7úH c3 ¤^<\üđöŢFÁŇăúb±‡xŘřMCś\s4…Úx@¨4©˛*’ë¸`&]ĽŁ„Ű…ţCÖ2_JěîQ¸É$Ǩˇ[YóéwÔN¤QĺXśŇ·YÖBJşůĽÚ6ĺz÷ŐŔâ3 ‡Ă©Fáú'ăzMLŽoĆŞ‚ň‰ŹŚť,|XÉ ŢďCł zq¤çk©ŤŤ–“ş¤dĺG̤»7ESřfÔě*-˘ ‰pçťBY»E(ôٶĄč"Ő˛ŁśĄwŚĹ¤bí«k©îŘĐ´ - Iyź6Xµ¸ÜCüxŻTUŚLYO]Ś…·őYř×vj%8Çö&oIô«Ď…ÉPíT~ň¦Ţv~1üŔŢm.Ű;äÉ5Hcb :«”äÇ[‘çqŕç_p¬s“Úžéśl‰CřńeüŐ¦é¸ĂĶYx‘ÖáÄi9ĎV6 ŐÍ•ä.†Vâ¦C,bßSٙ˵ !Ř)AYÇđ˛ÉŢ-ŚE{ŽRż\•âHK}MR[.Đ“«|ŔÓŁ‰ţ\zé9Ž ĺÜ;ńݦý—śS&3Ü­#őR›‰%ivéĘśo^*~äa×äÜЉ;ŁĚŽ,Ë-1yIś(‹Ť{Ü`Ş'ÄWżš;KµęśŮ>¤«¸k6ÚŕnµoîŁ-Ř;8•( ˛—q~ř™{ÔމŇŽĽ/)ęźŮXvĚ˝ź}ó¸%~-ŻçD€ •–ÎŢ,Yń¤µ¨ŻŁĐJ1^ů‰íýäĄ,š˝ŃÝI3:ş0x<&MÖSE´înSşÍű}PĆČýL’T&C:‡Š—/° Yő>¸Ţ1.e®âr˙^$í˛˘¤b!–sĐPpí!˛mW`O©as®bŤ8EpŇWżĆ›*ź,ˇ—WÄz˘¸źąvš}µ˛2~Ékk^ěZNÇł™ĹM]+ôŠ .t˛‡¶îÝmâ9¸Ń€b–Hń0ú“|@ó |Iś×‹ĺ{¬`yR‡/öšł  îäÄQĂÉE™¦źGk•L…9ő«K…#ď°Ţ_áŇfąśš›/âN˝©“’w+äŤ]!tV Sg8D}zÉz1 ßÁµĆűť ÔD»µY©{˛:rďíOÚ%5qU,#Ňľô‡cBFĘÁ6}M˛=x¦Kß—žŔÎJ1D&YĽ•>†ôY”·«Ä©Ú1‚n1cĘrrŁ•†¤×˛?ŹZ”ÄN…Şé ÎŁ‰ĚĚT)uĄ+`ÉdóěF¤m”cmžáçV›vF-‡ÔĆ€_Č?Yy€¶wôŚłüč µůcÁO:Yţ÷ň^|ÔÓÔ¶W'wÜk!ýŞĘ3Ń…?2®Ôô9÷˝ëŽÇ´ľó3Z _{°ďËL·îľ+§A‰&¦sŘA´1t×1•¦âŃĽzCäŢČô‘yÓşÇPő2z”Ö}ůÁf{_ľîAěűw{/ŠCc5Ě»–@ LÉ }üÇP‰±Źš… ŤjĺaśŮK“‡˛˛ÎĘGµ{Ćhó-Uß*[ź(úŹçRuFË9ÚľĘc±ŕDŕü1¨sąAZ~z¨.f÷±éż`Č˙Ŕ¨Ä·®ĐŽ(ğȬm$?¨s5vżx^0+*čYжű1gů˘şü;<Ş«lEÓ 9|\w^uK¨µŮS,µ˘É¦¶ű aěÁ/®ëĆzÔ6.ÉÜČČÜŞm“ćz™—ÖČ€GY1žµłŻ{_˧¬=ÎD®g!đ­›VçˇŇ™ŽÉ@Mř¨n‘Đő¤yTξ农ßCĄŻ]To!F†#˙ű ±ű"ĚĚÔgą9O¶ŐDvl˛]*f…ëhÉne˘Ż ÝţĂ6K1¦‰›°sňzÚ&ó˛bÂjkž˛şhCá(˝đŮÔBWŔ[qŁź ž±÷ϲhĹ>ŤśŞč(·P︞ř;Š1¶Q˛o¬ó­™›-§”Ź/ýúcúÔ"No¬ů`9×h©±ď»ä ¬©!‰{IšŻˇ:ĎĂgŠÎČ™O¦{ŃűťÜźĹ›ż"ayĆF; K$­ąn:ĄSxIęMÖČ»,n(Z¸ň‰¦•1G;ÎgHiűŃ´oŐR+2ůS«Ě{§G’ł‡aV~Ľeˇž~±vµ¤…ţ0úúˇŤ¨áöŃžŘţku&‰ó3٤0®¦…ĹÎ ěoˇĆ!Ízf¦VnrËgóó^üL›R'ΰK.2™gäÔ?_P]w©8ˇ" sy?iH'dmŞ^ľčv+’¤vş˝!’-’ńĽĘö!¶7M-nőĎ^ňÉ©˛?ýţ ÔŻŮżµ·ä˛Ă‚zsŻ^÷Ƭ\Ú¸ex|íÂĽG™ďń”0@2D°îčX+přbžŃŠŮL 6éči„żjŘŽT†SIŽ»ŢµŘWďT‹í—Ëé@±k|JĽ02‘LÍý Ă0ݤSGfLŮűßő• ůާ0Rĺ ±Ṟ̌°0›>Ł1Í·ĽŐŽ˝ôÜ>>ú°—?[ “ÝhUuŇÝREĐÔy˛?¸O«Ü8żń]§Í{6-’úáw)mş2‡m9Č[î§řb×IĽ‘*b‚™ę1îŘë:…Ž Hx8ě»­ ZâôGz…1 …”0 Ű\JČĐť:î˛p$BďAĽŹRĂŤÉÉk]É_E5¸ŻlgKKśĹ|z"( ňŤŁţK± Ű-sKŕ9}’OÔ4Ó\Ží‹ôwܰ]§µ ‚0ć7gYsTöb0oń7dş ń~QâäoÎέBž©¸fS:´Błp­0Żż©ˇ<»ŢŘZb˛UÄ[Ž nx‡ňyú‡ÖGżGGFh”2_L{›gÖď-+žm”Ňj7€ş&=ĘÔ>;Ş‘4׊Zpŕ44„HÂo8idz¶Ź˝Yći$­Wö`˘†Úu6c_‹s’¤ň*Tös{í:{0Çć‰zoONo¦×â!ĺ± ¬ĄşĆÚ™3CŃ”łDź‹Č sűPĽFqN“VĂ8s†E©t^"J#9 1ˇ[ŮĐW’‡Ë=UWJJ'\, 5Tz†ę¤l­pśőÝÓ) ‚7˙Žn"ť…3á±,LwŞDɸ„áĐÇXčÓgWelët%”(ť´5˙†ţyGŃdÖOCĘžö$đYęťT®ÖC@ŕYTaúŕńÇűŤŽfˇG¸ÚaŹJwúCŢ9ÉßSÉ>zŤTV›ÂË>ö•śÓ&Ş…P­‡ĹS¨­ Ew_ńöÁ޵ľs‚Ude˙T]3‚{wu·ľx%ř8şńő‘Yfbu.«MŽŔ«•¬Y#’"Ű"†űóĚĂ"*HŞ^X''ϲ_śÔQTZ^§ÇNZč‹{aďőQŮŠ-ŰŘzwf/7÷ľBÎJzł6ž۶[.߼«Ěŕ”˘şi‹‚f¬Er0ĄEYŽg„ëT‡ëNĺşŘ©ăxÝȲ…]uĐ8›‰•\«H–¤'gäç^Őw7­'”–ɬ}ĐRĺ};Č­'?9CYÓÎ'ı÷ëîipű^—*¬Vĺ•­Ä+7Ůđ~"tŢ2j~n$É÷ŐOOŤČW3ᙫĘ&^}wkLsę]‘Ůü€Ŕ·~L4ĎfRbű+'˘ćÓP¬f. Laäł/öWi”k’8sHŽ/`Mć9×řbÖŠ®„©ô,•GxäÝ '„WBÓěĐ ĘCZÂpŤkÝá{Ójöüޙ⾠kaěöZu­“ęn #0şŚUH*3ţł6 endstream endobj 916 0 obj << /Length1 1414 /Length2 6457 /Length3 0 /Length 7423 /Filter /FlateDecode >> stream xÚŤwTSëŇ6 é"ťĐ;^¤÷Ň[ „’@J@¤ŠTA@şHUzU¤HďMz“. ˝( z<÷Ţs˙­ď[YkgĎĚ3óÎĽďóě˝6;łľżaQEŔŃüB@)€’Ž‘‘0… ŘŮŤahWČß~vCŔĄţˇ„„€Đ×>eú¨€4=]B"!1)!q)  Jţ D ĄĘ / #ĐDŔ!(v%„; stB_Żó÷-€Ë $))Î÷; ŕAÂ@p€íq»^Ńä 0B8Ŕ hĚ?JpÉ8ˇŃîR‚‚ŢŢŢ 7”é(ÇÍđ†ˇť†é~Ť ĐąAţŚ&@Ŕ0v‚ˇţ ! ho¸v¸Â pÔuŠ' A®WihôÜ!đżŔÚř6 $ ôŻr˛‚Á'nî 8w@a®€žŞ¶ÚÍÁÁż€ Wâ:䂹‚쯿[T  ë ˙̇r@ÂÜŃ(Ěő׌‚żĘ\oł ¬„psŔŃ(‚_ý)Çë}Çţ9\8Âî÷·…ÁÁĐ_c€=ÝÂaž ĺ?kÁż}Ž4@Jď Ź“ௌ1îßAˇ_îëüýÜîčőrýGŕ‡yAh¤'Äßď?˙´„„``q„Á ţ]ýÚ ţe_ź?ć°^ÓOüőűםő5ĂŔ¸+ćßđßG,¨®l¤®­Âűgä>?~1aż°¨@R\ .*đ˙g}ěOŔ§jŔˇ€ä_Ý^oÓß{ýˇ×}pţYKqM\€ëß<·Š®/B˙g¶˙Nů˙‘üW•˙•ç˙Ý‘Ş§«ëď8×_€˙'rąbţ ®‰ë‰ľâZ đ˙†šBţR® ótűď¨t-¸Łëż6†R…ů@Ŕú0´Ó_|ůË˙đ—Ň\ap>űőlđ ˙»–—ËőóuMĘß!ȵzţठÜţ%3aQ1‰a€×\ř ]ë ńůMc€ ľN\Źç€"żÎT\ ¨óËőŰ’Ľ¶@˙˛„€"AÇ˙0%‚nżÍ´ŕŕ‰D^+ń7M®űűŰţ-{Äâ@0=pu® m8«P óć_Ŕ[XjŠ3ďEsLfů9ißJSűäˇh.ĄîKÖź* ™xDÇł{6čcŐ’ô9IýKĄcEqź?»çűQ‹#„Ś uOŽX!Ű{nŔ@bgyÓ’3Átââ‰x«ČzŮ—ĽË&Ôş…äŔ đú„”9‰ŁŮ´u#Ęś™m ÝknEúŚi™âi¬ńpčňFěŮ©bC4ÍwĚŠĺłÔŢůůîŚÎŽd‘Ă­¶r±Ň0 J_MćĚľř.š»Ď34kQXŠ˘'J…qáE'Łn–L"­ -xLvËźXŽl;szÝ"ÚęSx`vĺ"4e¤ł ®,KŐ2·ÍýČ™(óćiTÄś±¶őô˘ľ“j­k8M?#ˇôîźłD+ĆKqUŠú…Ľ&ŮSŢĄOéŹOWęD‰Í-)2¤LŃ#čBa…‡ÉŚ#öŚA-˝cę€jř,”łR†`Śľ÷v«Ú‹ceÝoÓÚęďcĄSâă¦*ůPŤvÔWúą[.Ď­_2”‰(GkjŃ[?{çť2ĽŁĹ÷ę«ĎölűT6Ű n]jĽâDX6ňIVě&=F™sľÂ…’Ëz ÓqŞŹ@˝šŤOn":ŚľuúáäŔ(ćçmÝîŹŰlS!'ý·ó~ćČm޵ňmŻĚ6íşšÖ .>Ť鬯ś‰Ú˘Zű·MI‰.ŐµC|‚uă«îŹAýKúą[¸±ĚĐ­>Ű~ŕÎęô•7ĄÝbg*ň[ ń‘~wçVŹÉ #ŐÇ=S2v:$ Ħ˘ß3 ±ć3›?ď˝ Ç9N¸YşĎžÂq°LŘOě 9ĚłĘ÷ď˝q$rµ0ŻTŮŕ 6e8„·“|ÜpĐÍŐÄĐQ°›2Ň•śütĘÖ"h:ÝZÜÉMx˛V–äKId±uĹ#6WćŐçü©xŐ=L[ąléd$pś ¨†,&s+­9i©Wfᥧ3놗Cĺ8‡ĹžĂ–3¬ĆBKĘH˙x+F¶Â­ň‚6č-7«¦ŮąiĘ«‹Ľű3ˇŐĎu+}só-Ü?|tŐ·őźÇůY«ţ06;>źŇ;"ĹtČ<¦V~Ç&tč^5P}h‡żo«µÖŞwëkMG=ĚçĽ>§v#ÄnG‰€ŕuZ·ElH°ÍkŤĄ*p•Ť^Ž&Ă4lpwIěü¦›‡,°JµQˇ—Ëö–ťÄé™ Ň49w!jĺ±Vž<Ő•^fß——ž)©@ŽtîRÍÚi(—Éďsţ˛É[a’CBť_ˇ?óZô…7‚Že¬MFÇŞ·iűDľö-Úe‹lýLt&jek쨦k¶”{8ń–~G"Î [Őq9ęöJ–ËçÁ lZ>Ţđs”—o Ęŕa6i %ĺ«])Vsn‰ÂS™<<ŁgĄÁ%ą Łź±Xét ˝ËŁ# ¦Wţ‚LĄ®/ť§^ŢůĘ$¬QZřb.«‚m©óčçžÜ+·š5$>“*^‹ż-I~ľşÓť(MQ<°TzU}šm¶y4Ľfbr¨űQ¦gí&Żđ{±ľhňň÷{»ScˇĎЍ6Eź ˘ţ·~Ę˝YŽš˘3g¶K śdé4¦6Ҹ®nťŽŃ@y­Łź€ÎS˝Ë©F† •Í—ť?ń°$îowßî¶żEčŞüűÍÓţ˝›‘|fš,Oô]tt+›)Y5ÝŐlÚ©JĹĽŞ¤ôkmÂGŢ2ł9©AäŐ¬ ź-îÇôĚőŻ}°~§$eŃÂţ™śűŞhqJ(ť›;ţŐ¤P:ű|öË˝ŁŰ†ąsŃü'hŞ 7ÂsŮÚ÷¶%g8›cżNEŚú®sJ']‡ üśFâÇę@^ϧuÚ±”Ţ›ćNymJMO=¦źn «ko°ct7üú~©G~PŠĺ¨Uź^&!ăíÁŁMOč~–ęŤO9<¸Çyĺ"üfîKG´E¶aa ˘ŮUTÝ'¬;a“”Ďwp¬“X´ +^’/v\Ěßĺ/¦/ů_sAyşi+ďçÝÁ.—|5ąssá3“«’Ľ~q{ěńŇX%“µg^IjcǤň{¨!â:7d8o´Ç–ĐĄÍ’?MÎöˇŘ˝Éł.w·R˛?Q|ţ«útYFťkň»íüŹťÇůUa·‡çęÎSGëUť»&zk˘xď,îö€Úá[dĺóŐt÷¤u•3:+SnŇ÷â±MŃ©Ë˙´thBŢőí\ÇYŰ´ŕ[^% T.8,R9{¨®A÷Š$Öť:˛Ó9f÷x¤o™ęËt‰H}̰“µúm‘%ÇPŐ4†Wą˝v]ŃďX …íŃ}J"©Šq¤g.EüÔ´[ęľń….‡;vGuŽ)|Ů Ę:JĎ@@šJś9%Ç=ŮČ-˝b—S{žĹ™"ćO®y\DçvĂ1/ěŠ#óaÁB÷čÂé6s‡„ě)8ů Ĺ%>1á®ĐÇHPíú5e|ŚîămöŤßĚ•đRYsâ^wn˛C×,‚Úí‚ÂCб]©bűGŘ- Éţ--¤ ^Š4/UÝF?iHń«ÁôBYÚŃ÷ +îdÉÁ¨ ˛µ¶"•h…¬irÓ }Vá•Ôq?OԾϾ‹,syШfŁÓűI!Ë`ž” )hŚ`:ŻÄ¨ýjâ´{‘Çň¶”zľ ď6¦vÖ(Üű*yßËczł|—Ý/i,˛1 đě^÷>çć¦çjVĚ9Mř:©ö‡–Ţ#“ŻŢúE¤MdÎő°B5ŻUQŞ:YÍÍçŕ~W©âč.–÷EőM¶l ´O="• «­X§&Ół•ĄćŢŞyŚ ţB7Ĺ´Ü|äKĽF %óm©'bŹŘćNľµÔ@ňş‘-2K¦śe±dĄ¨Ľe,iHעAŁuކCk}‹#ĄüČ.âÝ<źŃ,=ÓPcÄí‹ůO>U/»mGfŁBz+·Ä;„6?„Bw\˘ěŘcdDM8ň¤„Ctş_ž“­]¸9‘ř xÉľ§ĄŠc'@„ňĚÜEi×,µ?J^!=˝&î·ßͮǙ…nPꑺ]˛cJ9::jbĄÚ]ö'¸H…ÇĆę·X”îŇV–Îđ ĚëŦ‹Xź}óďHűtn/ϵBEŰf©1RqňŔf:íëqŹż"MąbEGC'óő™oëČ&ö×ČâS7#RëoR%îZä}XŔš ň蓊{’ó4×™‰$!ě°02)Č*ź oiŕĐŇqyŚőŔX‚•Ůü˝SÄĄ7LÉZď=Ľ7¬,A{>ě®+»iÍú†ŤkłHÔ"-’˝łKK]=šňsŹ”śŚÝ-ęµ#j{Żcô{§•®ĺžşžŞŮÂ;Ďäĺ7€‰śşůÝËkßÔCc0ęNöxájb8Ó'_†’o4Żô Ţ:oü¨˝1>ÖŃ©B[%ö>ý=żA¸˝ĽĺUAý‚XKLßG-;q\ő³ĒěŢůĚs+ÔŢËqU\VĘ1•ţxޡÓ4üśýiŻJ»÷=ő¸ÖyE-Ŕ;d ŰĐןɛ°ww¤XžĎ0q{™;łşx.˝ę88wžˇťí˝]3€Sç§ťÝÜ7ĎŽő˙ »B陦g‚ű^.őľ}ý+YQvä «˘~ľČČ!Đ˙N‡0a`ŔšşUtEş áÎ+K ¬+ń†źë{fŮÚ7vól;í´dHuŞžîŚ˝’E·ź{e»č v,8͵Đ.Ä5‰/ŻľKß+ NYŰá čU$©|ahŔIÁę6Č…Ív"K^ÎPs0ú}*ďSVă ďF'–‚ŰW,´™s}-GJée3%[ŤSýůKômŹEłqŁŠŠ]ÖÉ•(gh’xKku×ec+ś”×\}ÇpôŢ´´Ż‹*ň”޸đy4úă*sůçóčgł{OîW–¤>Ć]SŔoʎ”8ż( ś0s>UČöÝę€33ű„żî~·ŁCŃ®/›$ 5Žmi ĂbŮÔ´U&ĺ‚íýźŇ¬®čÄů|݉:§Lëô“f|xx? Ą=†°dí”ýŮÜËLâÂ`{tXrPˇĹ*ŐŰAWM†E”Ű ·mÁßőD뀾íŃ·ř#ő˝cŘĘS·H™˙účd~-;XéúÍĹ7ÄQşJdâÖ c_Ë úůi6ź3řQIĽ°ńňşćYđěxĎŇíB*ś„ŽrçÓn¶˝ŻpnęŤ[ÇÎ=цúNş”q|v˘'ÚúDĚ‚¦:ÔĘď H6},4Ý×­â…¬‹ ;˝měščI‰Ťcsš%br¬+n€ŕ|łLĐ磚<âŹmîj 7âćíúTĺ2 _Ýö?6üa˘z’ľy\Dbť§»/f©+Mő„^đö¦×eŽď±A˙Ţ–8˘mb±ĹnżĆXg9˘ip/ /`’ÁxFJµ4äÍň4ŕ¶§śĎóŁű@NľH†UňîÄv”bq˙F7Đělű§ú»šÜą°öT0%v"Ôk;@\EžµŘhsz׎-­f´î6(Ä:ĎŐ¨ÁFŢ™l[Ë_ i ˘ć‰Ąy‡·_î6đĐ7â ?CŇ :–Í…éadŁ˙ ®÷ł·"zńžĽ?Úł©ŃŹšWśk'ݬ§ťÉҲ‡/űÚĘgÖ®roÍł\‡Ó­~4ĚTl>1Wr«ČĐܧř.:‰JŞX"ŕVfϦĚçu­ç=Űîś“îT^¸’%8-łlü\»‰®Šó,öScŃR!)FőÉîŞű{âRWášmdü‚Ő4ŠôB…|Âó´:s Ňă—¸îZ™,Ź´ř O¦l1ܰ޵Řw’ďqbŽĺÝ–‰p(Ţ4Ś 8ăăJťĚ+ľöşâŁËDëF_ćň˟픓q®sBLzlČ ´ŕ5«Ž÷\quÝ]9JWľ[ĂÇdűLho˘¸K Cš‹Lëı\Şęž>E‰Iö¶qç"¶ău›_őČo©ÉľŚ[‰ąSc#ż”ĂŹö\$*ă\â´6 öđĽ%B‰¸žz™×ht¶÷ ÇŇíEflóUŘ» šőĆđă4pĆľšJ\"dŘVöť­®:ÖĚf»í·ŤÉ9O’kEvżÄ·nM<5n3aŐ”bÓYgˇŢŔŢÉđç¬÷Ô–v~3hÖ9nË€*‹Ĺ·ÍŮT.&b?ÓąŮ$Ř<@ďÇ%FMDz¨¤Ě|•'䫏 "|*żçDÂy\ YÎSČ—.7mě$;Ś-f:P]ĄŻŤnÚŘŠ†ÍHŹpÇ´X{ŇPś3"÷o¸Ó%Ź.”ŢßbŃďŮ}{[ŇąĄ¸ÔDT$xxÔ .Pţ¶•§ŕH”őšuĎy }U}vŃu?hËZő5Ó =É÷łPťĆÔÁŢź<Č9–¦lqŠ˘gĚ_HŠâé|áčˇCéŘíu<ăµ'6†ňâX…®§gdt‡ďB–“䧦`X‹Ë8G;ńűfx@ů`-Ééh+Ą1Sőa—÷Ľ®:šűJŰ ĘG€čŤ·ÇR~}Mf‘˛Ů!“ijňЬ8Cyó¬(ĺµЇôćĄ\čýŮ4ôÇĚ­†Ëŕő›Ë©>Ql`’i(öíjPfSďű¶¬9zśz-cř(|¦!Fc¨ČčSaţĽË}ˇpOć°°(…šëÜ®F‚ś~łÁV‚‰ěGiű3mۤŹ\1¤{iŰ Šę,Ţa ů yĘoÍň‰±¸&|…ó“L7č–%ÖŐ‚ ůÁkß×J]ďĽĐ††uQ6SgúěŞ]Äz­qeçŔĚ?ęĽg÷É9ś'"˝3°ďŐú…ˇQ/šÂmÔµVoDÉ'D-=Ź!<3şÝ%ŕĘÍ#@? f=?+ŮٶÄ˨•óOĽXłücW’6^Ý6ýcŮş˘ŻwäHťČ™)_4Iaj/#9¦óxĐ"N†‰ÖG_ů…?ʤËy{ńƤ‰CwŤ%¬ĄĽß÷‰™RżÓÝO{OęťHß3ş/ăęIE†§µł‘Ńôô°ŁîŹOdťę"bÝoYĂWé‚Fý$SĄ¦Ň5Ú «9Čşzď[Ą¤ź˝č|řĆ'ĎĺѨ…q«{dٸć˝é ň~«‘č¤~Ôe6¸DST§\SLâΰЖţĺ]†ăV$°®ÚĽ—0ý!@tß|Úęü8‡fH§&=řVGŕËĎ#˛W€Ň‘«–ŐăĎb\řÜ u»ě6ŤrŰuYĂ Ç÷·]ŕ{ľĚˇ?ÜăČŞK?XÔ,,űÚ,w7ćgµ…ż$ét„Gac¦ŕíČ{:vş>ÍOľÚ†9{Żôž^ö&‰HtőŲ'.$şŔýĄÖńÖś3´0Ě’=wrhu‰iú˘ź¦- üXOApqxIţL•B4LŁh€ŃB 5ß‹®"xK/ÜÎ"Üź“ç[…Ąc'*±;đ>Lôżŕµľ] ˛žÖ|ś\)ö%w0Cďí­Ö[@śz~!#5Č+(ňÇ3–An†…Âr&şQ6Ń®”>˙áUĆ<Üü7ŁbAü˘TZŇ–ţ{·ö'đR“SÜN„:ćÖ’ÇfuDÓV˘ĹŰjý•=8uĎń«#Ť–-šqułŃtđßŰśţNÉÉR0‡góci€‘ěa”2+’&{­á8|»^µdŇ˝\(™Ű§>Č ®|#íł_"vČB…,ŁKťYűMá;.F 7šiŻçĐZúů*ţ=˙ÄčG}LÖ)X?Ťş×şŐďĺ©)ű3µ‹ H%‰Ă•cp„ŠŁí‚”ćÄV¶źđ0,SUüŻmk endstream endobj 918 0 obj << /Length1 1574 /Length2 7461 /Length3 0 /Length 8514 /Filter /FlateDecode >> stream xÚŤ¸TÓ}7Ž€€H#]ééîînĆŘ`06b4H§ Ý‚tHŁ‚’ŇÝ ‚tŞÄ;őľďçąź˙˙ś÷=;gű}?W_×çúng,Śz†<ň{° Žäŕĺ—(jš đřů…xůůqYXŚ Hřo—Ĺěá EŔ%ţKCŃ D˘0% Ą¨Ť€4Ľ`!€€„€¨??@ź_üoE„‡@ č uhó4p°'.‹"ÂÍĎęč„DĹůűŔâ‹‹r˙6Č»‚=    D:]QA@Ŕ‚‚‘~˙rÁ.ĺ„DşIđńůřřđ]=yŽ2Ü(Ň `ö{xżJč]Á•Ć‹Ë0r‚zţ" H €`Pî‰2ń‚;€=¨čCu-€®ţGYëŹ7ŕŻćxţq÷—ő/GPřoc „puÂý pG tU´x‘ľHnîđKóD ěŢ@( hŹRřť: "Ż˘*ü«>OÔ éÉë …ýŞ‘ď—T›•áŠWW0é‰ű+?%¨„ę»ß_Ău#|ŕź P¸äW^n|Ćp¨»X]é/„űĚŚó‹‹ Ŕî°/ȉďW#?7đoáoUCP€ A•‚BŔ¨ÜO 7€ôđü·ŕß'\€„ءpÜ˙xGÁ`Čź3jţP_€%?Š~ţ_Żž¬Q s@Ŕa~˙Q˙=b>-CSM}®żJţG¨ €đđŠxÄEř"QQa@Đżýčˇĺń_¶ęp ţ']TźţNŮű/°˙µ €űŇA  °˙‡čVüÂü Ô›Ŕ˙3Ý›ü˙±ü——˙+Ń˙7#/ě·śýŹÂ˙Gt…ÂüţŇ@1× ‰Úmjŕ˙«j ţłşÚ`¨—ë˙JŐ‘@Ô6ČĂQŚćxÄË˙čőTú‚ô HÓÖüÁŤí ë!<ˇżn”?˙˙ČPKrAÝ"ž(jţQ;ôď¸ĘpÂáײ ‹€@?\Ô¬Q'a@€j+ŔľżÉ ŕă…#(ŞĆ áűk°BB>”ÂçϸP˛?0 őDµę邏Ó?¸ż€Ďčń_€ đ‚Ŕ00ů_°Đ_đżýŠř@P ěóňüELJ˛˙µŐ˙`‚( †Şěî…âĆß( t…Â˙ËÝŐ †„şˇúń űWs@^(źżYŚęÜßçß×ě á.Ě"@’ÎŻ"Ţ\ÖÉÓřđ|ÁZ]ëM2ďŤF˛Î=pŇÂÎQťtW°s¨ˇĘÔ›Żš ¤áÜżőµzźş’ˇV€DSîÝP8ä)ř~ňŢLvÍŚÝ >HÖ§#´łÄ´dK5ť˝ŠíÚzůĄřşĂsËB|ŕ (='bĚ A&Čçwě˘?1gd^Cš[=%ń°Ěň2R7»F}zˇđ&žę»ß†ĺÓěÁŹ?äőőf iv׊ÔD‘R=đ×`ĚJé§"KÎÓhńDcU>W¬HOb˘*qŤb]Á°]ů9UÔ÷:ą_Č«ÉQG1ôľîăáfŻ„đ¬t~×Ę1­íf®Ńw>|ĘÖ”X'îşLf–Z´óÁ¬Z!XA7&9=«ˇcéV{ QV~a®…ľŘŹý8\ČćË8ĺĄ]BN˛€ uş4L¬˙Ó =˝ŰÄtńJ*@JÍBŞ§ŽˇĂčĽć5ô›÷ěE/´ĘŚ!~şÝúáÍ`Wô!‚yźŽl24ÉěmÎnĎNr‹şđů4± §˛˛^sŃiË‘ź8lPŹ©÷şCUŇBN|~ś)ŃD°ĐxÎHk -KçžąD¤|Č©Ë~ÝËĹj‘áçŇa­Ňéb!üŹ—Ćď(éK$Şß¸Żßőý®M’˝Ç!ź ŽŤfA‡…“]™›ňQ´y7éj[Á|2ôPtvĄ@áĆ8Ř–´ü±U$áçÓł­Ó¦3ů† XlZçdđ†í‹aş·}OiłŢŤë~Ë–ľĺ«ÖôăóÔ~PU˘ź)˘VŐś(Ü®ř±Ź,Öز¨őć´ÇŁkŇ|úOŔňBňŃf¨›Ív“ÎŰĎJw% !Ű|¤¸ĐFŤv«x&^ŚI°ţ™ >pĽ)Lp΋ćiĆÝ„Éj.’íZ2?iŤ#nřˇęvxŢMű‘´˝ž–OŁßtQ¦"öÓ[Ohůź™®Č?yDgýţăÝ-kSwĄ0í6¬óG«e'Q­ÄEć‰3ĂEfzʇZׂ¶‚m÷kÚ*j鸾“TvŘ:ßxQľFŕ_ž˙0Őa 3ČQN;.ÝËnKśB?ýÉš¶‘cPą%· Ö"F7pxIŻ’oTZ3Ä ĂWĽ´”–,u±ăDĐzCfá\1Ę<íÝ=††  ,-s%†iżĆ&Ř ú‹uĄkÔ&Ń4´,BłRw`ň)ŁúýřWSŻ~nQžßŘ"§L%ł;‡Ź˛ú˝äŘV"9‡ËH§î?Ď Ü8;Ó }V)‡a¤wśůbVÓ`O"SÔLĺË»jÖ%MVĆođŰ„› 2—ĽŰóżĄČv5¤1H¦ĺŐK-ËpGôm”UuX1U}oNϡ0Ř»ëm >_‚™§Żä„KE0%gËťßO>”GřÖ…„<ÁŰ’WżÔłAŻlČöYČ!-uPPówa]…űţL˘Źýf8h¬§Ţ Đ­ń¤ŽÄŰ1Ż}S¸Ç÷Íű}âeaŰĎyúV-ÝBąÝlµđ¨T©=¶§/†–‚˝“g¸ű™śŚË´eOve×RÝ8g#D˝ ć(¤—ô<6T SĺŠuR„m…ŇcŤ>7AÚŁÔ~úĄŃámşŤřŐü˘S_&Y"ďE¨â˙H1đAzrů=nC¬ä´|*µYť˝®>´3ôă]ßBľ§ „MńÄoe˝Î¶˙ĺÔK9k˝Xj=śZÔť-śęËÍ«G.şŇ{7UrłĆ€”ňe÷G=„ň“Š/.čÓŮś˘8î–‹ŚXß.~´ŚÎoOY!^‡ŮĚ1·°Ć>9¶&Ą'n¶x¶±FDĽçKZ_·áČa4úÜÄ?A_«Ţ_oX#}kČT(™¸ť~ĺef‹+/|ś-˘ MĽTä _Ę6ÚŔ©ÉN¬{Ă9qQAj͇5Â3Ń7 W0•Áő„6Jpçşu,m4N}š ¨ÄשC;pbńü^ůő0€Ö6·¦SL¶ůąÚdqs´?ĽX‘c}ş-;ĂŤ‡ľwlŹ,„Ąf9‰$ßęĆxwŮ–a|nO2Ř`čí1ę»]Ü{źDsŃć!rńć˝dIEĆvgߦ÷<˝¸ žńSň&µ?7IjĄą @Ş3Őž@޸ġA„uőÇ\{UEY&–°@đÇĆíúŚ‘„ˇ˝mć/-m·o§9Ţ>U~8ż]âŔVÝýą“†§­ď M/€ĺčiPôB'Müü2žëPd­ĹuO‘ŘػӅĐĐIÓâÁzu\®–ZÉt»ćňéIs>GÖ¶{>×ÜČÜ/˝wäuIAî\R[íářk;ąl~¬k¶ÓĽ±úńó ¤aů@1ˇěÇz32LRöpóđČž Ó&ów{*óRŰ A _]–ş±W öŘgĆlçYřŃ寮żąFĽF‹%ü t GL}řVńJ˙s;YMDˇß3ŇŔÔÄEo’®ÇIĹô=iĘM §ÓŻ0R´űvçřjÎéČw‘ó‘Wjඨ=ĹĆŻŢ:ű[LŞ"AxĄßđ÷± ň­› ĺ)’ŢŧqnŐ±o¶™Ě­Ć©–WĂDĂ4!4¦üW< l÷¤Ş2°U>Š2Ó”˛wRv§×GPůó-74/řOju[D¶Ĺ*ݡď{ÄCř}Ť_yĎ­9ŽÚÂđGë‰|˙Zt5NLÇ5ŞůVůÍ´¶÷o‘°ŽúQµëBK4ŁP_ĎQí"şH˝XÎĆç`pEb)¤´ÍÇe1š’ţRM€C§<Ę”0Ţ}ĆĚO7ÚXŐm" í$!‰ő?Ůëë ě,‘q¸uö3ĘIín2qí˙’ąFĺ^6ě¨8H•|’|0˙®=玸˙ÝןŤbW‚ůzŹŰ“{ł˘î–!č8÷2Ĺăű<ĆfÔź"śkŤ÷4ĎI}ť ŰyďqcŤ\rŮ ÔÍľ:ÂëVĎ…)ič[`…^4ëńŔ§oŽß˛IŤ›ż]Ĺó|ŕ»$/ ŤçT~é}TŚxš`­X)Ă|ˇrĎß‘q<†ó˘mę®sÜ4ŹÎĎĐ˝‘’‘ıXbŻ¦ŹľăÇ·’@Ö-žÂ Lq–ä˘ {Í}Źc|Q>ű»N“s'ÔLł }ɤ™ÍÁâdXžn‘ă|˙|ě~ĂŚŃ›4âîě¤%­ŃUŤÝăŻ6JĐňkËŇC O©gË­‚]ŚGVŚŁć˘e<Äú.l± ™0ŽŰq× ş¸š ”ľŤĎAýžéÖ ÔëĆÚöĚ?*Ł´ů9•—ŽËŃM>„»Žű˝t s• 0±â@hîŮ ^ĘAFmSć<-Q0ďW>•rš¶!ţ˘ ¤AŢZ{:/­ωšŞ“@/ä9xsÖŐíx_#Ń(WWżžzk{¸#?,T¶®OöµSŢäô1óˇ¸rQ;y’ł4îkY@Őöłź»µ¶„ÂB%*űŽSť Źž)dooć~“/Ż"Y{ëţjěpaőÝĘÄŁ&ě8účâ¤ń}—zĘé{Ő'Üł†˝"§oîŇ>÷(.łLţřŢŰîŢ›¦úź §ťÁľŞĚ·4%;cĽA…mŁ÷‡ÓZĘ)–Ç:TF˛Ó@uő9ÉaŇ”5ď!Św8‡ŢVňbńmů`őĵłË-,<Éńǵľ•ëÖaUwÍĚ˙řBĆŚńk:řhPnFN`zË4i˘¨¶}ůLlÚ…b&ů®”ßežŽ>0 {§¤üm/oiß:R§±¤'&řЍŐE^Ý:šBű’0¸Ů°čË­yĆĽ‰:, +;q†µśÓć)]2ŰHŤpťňеe Pju´·8ó˘~‚zŻŽävgˇ’+ DPŇ,UřŘŹÍő›§T¶ń×Pq7FŰô2ý7‹g›lĄ:ąŞŤkwłdĐ{ËGŢ9[7’ŔO„Ěd4 ýe”öB¤u.#U‡ăÓ%¸SŘ›łË0-qn?éq)÷şD¬Ç]˘-BNbŐ6şđ•|ÖŰ.­‹CđŢŇ$‘í:<PN!,é~âş@µ–MĚËLf˛¶ĺDŤĚ;÷wavqa¶~´[K†y‚´ţ¨%z­iš!w·“;M'ĎiŤRÝ;T&Ä0mofä‰S:ỤúÓŘ·E®šOXý%Ąf:ó±B]Ź7,ˇ˘Ăc䍻y/ŽŘ8ÉŻÝÍBŚîŔŹ‘R43ń.Ç|8˛‚®TůCcÓ¶Ú˝ôµő˘Kż‡ěµv,‹•4DeŚoôéóřřY=W}ŰN![ U\Ő3O”W,‘‹Žşš´ ú/0ż’~@ý)l.OvÇANÄAd-TIťA°3C;Ć©¤FŰMťýµ$_RŃáĹZÖÝ··TuśŻ T©‰:c@‘žtČô=U¶‹uE«Śv7ĚŽs¬›<[†â"Žúö¶ą%M÷µµŰq›"đÝűĽY›k/W? é 5kYx6řéy$“{ľi«»ÔËÂĹ󬦢ĐřIf˝Ę™ńĄÓkÍѨ(®Ş7“ć`QRYţ*öôs¨ MŽV٤٠¶ř{vsuž¤xÝËł}I»˛­/ňă8jŤ/źŻ™«ŃŮ ¤6­żVëhő ď7°1źČˇ"ŕĆ}άR>ťˇ¦´plB-ëvŚí7‘Ůö@o…EEúuXWźB4ÖůÂyˇŞćĽžSĂcťFËVLőAŰťEśC#r˙•IČ˝­{RSińWˇw졾••f5ŘŢ\Ż}d¶ 2¸‡E†˝lUBĽ®#č)ž Ľ4D…ží4{Żítžk.™äiO­ÉÎ%&Th[—0Ą’|@ěÍI”u×l]ňn„CĘ˝Ř23ŇD^˝5uIŮFŁâďýOňoçĆÖ›/ĂS¤'Ěânî_§7ľ‹ ńŃFĘřI×Fqn„Ú+bt<¶Á‹ěĄ‘÷¨/„±5_ö–¦_ťÜ±:˝/ Ő Eß /ÔKeE" ŃĎ˝Tý%5-žL$ĐK¶xq0}mü±lžŃĺývčđęLńql§Fřkľ&cŢ:~™-,ôS®eMý©~*¦Á©Ş éÝĐ#ĎŻ+{áľ 뵹JĆaź+ÝŹĽAOňC»CÁÂćE&ëC \ŐÄ%-Ő5ď®čDăŚ=Ăr^ÎVôům}ěIĹ6*WľRőp\7Ćę!fNŚÎŚg ¬KlęŚĂyśţQµrs^,?sż°KŰűó*»3˛,|c€4V?Ú˵µîŐG6ĄŚÔťO¦Žq%ŕŤń´ćđžeĹxBGĘůáś¶°­ž75¤óď$#­´źfŮ%ćÁ‰ő˛ç‘Q¤ŮŹč5cŁ1+z·‹»*¶IĺâóŚŞÓ3lŔs&–>Í@;}Í OE6Ž˝”˘ňRc ‚NXC®{ÄÄyŻgË^oŮS{+€¸‚•;ądń„KcXaâ§fmz2ăpÇÓ{ę*[˛]Č´ů$,CcÝQPł ˘«eɧ*]Q™PÓ.%EoчĚjŮÂ_íÓ•’ç’uI—˝šÓYÓB88/yÎEËŕe?¤ˇ>Ę@˛™Ą;‰s)‹Öęlbád;Ä‹ôZÇ»¶=㋦şßwD”˙zî)Y‰µ7Ősô(,óŚó„éé×lĆlĺ˝g˘*˛ʱg=Bńőă¦Ü÷Ž© qĎâG{ôöźžJ*Řč'ęV¤ }ďäT¸/ÔîŤÁܲŞŢG°s[`«‹ľ±›ĆeČb~·jÄ#N¦Ď×SňY»’/;˙ľ`g˛®é=Ń7§M ë¸RűĂÎ{×__ďTŮîJM\Ždôqa}CŇvUÖYŽĺŐÇPiŢTčĘłh'«‡­|ĹG–6Í{c…GÍXQ·ńŮoLtk›¨ ň ߎrą¨4—dU´Ć/{šO…ŃÍU·í…ΕQĄÝLeŤ_N÷“fq ú,ɦ´âś Đźš“5pĚ#„E]ČVoR˛c«ĄXˇqWűŽžzÖzúĺK©holFĎßŮs*»ßf!2N‰ćĘ˝2ádČcjA’H€1ŞAÉÖRw1(]ľąěŁóůYV)Ë|©+ĽŞ·áÓm;«ĚǨą";>Ädóy⻣űŤ8=DąŹ]ŇŤIúfšăÍuQőÜ›QÚ Ý»§űýh׎d§Ě-%+ uµ\]„B1CóZϧî™ëěŞĺAĂić—ú?é'µN‹N’[É}ł|î}ę(Ą‹Ti]ɽˊ˙)bS9Uf$*°YŇ“°Ďű'Ë%Ăb­‘ĺhËú ŚǤšiLíś°Z…áwôöť‘đrĐO&÷˛đł}đĘČ)µň…=×Ö{Ý(ëyX­ď'6źă łWŠDťJšôşŘTďŁ!ąěŽr>ÖR“ěˇ.ËťŕÇ»ń*ßżŇŰĘ yWßë_×Íőž¬ĄmĽăŤ‡ë˙ăłQëĘŹ!ţ…ŹěžçޱĚő÷K™aĆ T/ąĚg:Čłc H’ľëg*Óył)ó#ąvËOîKďm›ńÚśß)t«Iö2ĄüěE+`ڬľ‰í‡wĺ*˘§Ňqx 1—ŢzmîXˇuŤ aĘ ľ`óÚ $c”YúÉß@Ńýć…ÍĚË4JŽ™lž€ÝĶ:ÝŮ‚Dĺ]Ť„ľ¶wqbô{qN}Ç“×ß\^żÎĎeš«„ĺÚžűK¶Őg©űÍX)ĎÝ}?´ëćQ×"‡%×f}÷\(= Ö=‹4ĽřŇĂBşÇ±ÍçfĐą˛đ®’‰R°É 7Kś"|ÉŐłPçYfqĚFŤó ľ­ě,ëÓ–}Śţ+ęÓĂ:CIsď9 ‰ŠÚŰ› Ťh%dý1 /©¦ż•θ­«Ť rĺlî °‰ŕ$±´6‚”ăO¨¨ßäS±Ä$µń‚ŕD«Ě€@Ě܇T&ÂN}Óöçáş×gÉŹ8uý¶ó‚ZOśAiUć¬W«Ëóóc¤‰ßv¤wEIŇĚ)łĎ/?îpË ĂŐWUâŇůňd݆ă˛×𭞼Ť:|7Š3ŻŃ Ë×j‘ŞÂüľA`:{qśLC*ÖďyŐ8_Ců?{t|ŞŇ(ŁW IľzŠ®ScŐ)kóm?oŰľbŕőĂ;6 ÍI;7ĐiF"ăň’í-ŢąZMÝe\[ÂǸ¨ä“ş€Ś^ňĹ µNW $"íSŇĘŽč`UÇjr~~KÇ‚=Tf9ĎB·¸ŚţyD\ŞC»ĘL'„ËĚT•u?đÔ‰^CßGŤÚęFĂČ–a‘®ÍWB۵ŘňaŽäçiăÉëčÔmjĹR·’Z*ô6 Ű@Ĺ/VR“–—g´!ϡ,AXe®ŹşčÓĺNčrL Ä–3Ôťř™ Zyď`5š»s·G‰éËe‚™tźŐowążŚÄŤže>“ˇ&Ý`BëGď{¸Äüjqśo´\Kč ŕĂťo_lĹŔڞŐĹ}5‘Ç8Űď˘tUX÷!¡G×sV~Ě Ăď·ďxÇ/lŠXďöY í oµőrD“ľ˙\Ĺr)RTH§Ń|7[%&s\ f4ěş?íoÔźzĎz—ŁţëÇ|Ýoí8SÂOńѦm?ťU|„~+7g×Kq{řęńňť÷C5`-[#®Ô Q’fÖ­ę h/•Hâ_ş+¶‘×ÜĺŠ ČZmÓYŕYÜ‚ż+ĹŢČŰkŽ3©Ť0(Ň(Upز8mq˛íů >™AtŢk AFyŇ Ś’ďV1ú»Ü V<gëf·ĽŻ­JÎŤ˘×Óť)ж*RâW,»KőÖ1UúLś¦†5Ű2ŃĂ1ţůVQ¦zg…%šű'].J ĚL©ýą{˝O]?K¶ŞŤtňŞBzß%©Ç•a=)¤m×đąMΊ ÁTiJFt%`¦ĄÜî&{-†~Äf3a™8 ç~˙ ÓúÓó†Őõpö´ô<Ţ®“3ČňN\„V©I›^aż€UޱťüÁ Ă•â'ăŔ%\LäL~tűp‡41ůȧ|Íuďřö–g¸'G˝±śÉűâýž/פ±ő‰eoÓˆø„\tĽ]’MŐ×…˘ůӇ̽“îďľß1#Ľ©ÔXwƶ)[vH\‚“ź„e<2˛5uÉ^Z´ Ą´Đg­çÔúcdCý›,ô<:Eŕ¬ÚÎ żš‚UJyö•ť–*ŻŤ¤9Sô+‡ĺЧż6y7čoq“2&Ľ‰–üąÚV ĚcElŤ3ü<ő WńŢ>ľŠë9EżÍCŻĹ  @rú§…;d¸îLTËŢ ß—~H©{jpLť “éîžŔż©¦¦ÚĎ\ş6Ád,1|+6évpG!Ň[ű™"ď;K*®j·Z+ }ČýfS÷9; Żo= źĚlZŻ&gbiîm zc Z0éT«"ZN@ÝĂ– ůčµPżÉ•c´Ş&¦‰Ć<¶ČIÄH##ő„Üg¦Ă@ŚS´çzt•±N"A®Úq&±ěş<űŠÎřL˙pëjˇ]Ţ aŽÉć+Ůĺę2•u˝Ä˙b qבǓ­ž©6Ř;óhíŽ]Ř-ŮÜľěNg[>‰ť¸–ÖĎŰO]"¦Đ "»vÁîXU»C“˛˛s“äjŮÄęIng ¤îĽśŻÜ¡‚“đ»;xą 0óJĐëÍââŐÍäߢ–NĽf‘ qż8"IHňÓđE¦ľ§h ©‡5káťąĘeÜ-ZXąňĂqšĘß~´yżEú¶%2n8[;ü9_d6Áł>jÁÝŢÔ©â÷yunź^0*éç‹©ČjŰ_nŚ”3>nĚîĹÎżdžĽK)ĺTÁb-ËY!ŰÓ¬•‹^Ž×{[wMŢßK4ô†ŽĹC{.4ş\Tż J7ž°ePŐŐ(îűK9WµÜh_=®-é¨ f}$$Ä—Éé?Џ˘đĚ /./ŐS)Çš”Ę;¦\=×ęx¸¦‹|Ć F·aܳĒ+,«ç•Äđj88Ŕ8ťRU¦»µöyŘ”5!˝rgb‘­d¤Łvwô.C_-ü˛wË»<ň4“ŤUĐňDKUç¬˙ĂC„ăEiĺVďb€˙‰Nv!Ď ßŮu÷ mĄťYl¦n,ć‘5ġÜ(€T/Óň,D^ÉMŰ/•ßW–žĎ´1>ĺX›>ç;­ÍsOľëÓ,>,wËŻD„!a¦Ń’ŞS·˛_ŹÜ¸Q«×M1ĂĎľo®óÇŐĂí\4ČłC#kńѸŚVž–X*“Uô^Ą@üČ9–ŕ”VŻ8żiOKΛH^ś—VşîUśO>Ät|–ŇŇóxmáš©’ŚĂĘř?8ćř‡=çWVĹ1ą­‘•¬6rňY5˘b&ýAuq´ř>z‰<.‘ÔŁ¦;ĺ2¦˝>K¤ÁÓźólOšÄ#Wh^ó« żŰ˝%:!3Łń×)aÍüâ#5înśĹ7ý¨÷^µ„ŻĚ"{kTíTĄ6š30Ţźę˙žÇĂ endstream endobj 920 0 obj << /Length1 1320 /Length2 6517 /Length3 0 /Length 7425 /Filter /FlateDecode >> stream xÚŤt4\íÚ¶ŢK-ÚD7z Ńť!˘E†Ś2ĂĚčD‰Ţ»(QŁD「˝F'HH„(źäÍ{ÎyĎ˙Żő}kݵ÷óÜ÷u÷ëެş ~ÂŞŠ€Łů…€Ň-‚–ŠÂD0´ôo9Çc(CŔĄ˙ˇ„„‚Ń72e0ú¨»8„DBâŇBŇ@ @”ú@J”Á®0@K Ž€CQDJ'$ĚĆ- ř×ŔeĹ ’’’ŕűmPp„"aV`8@ ڶ…:ŢD´;@+íń\˛¶h´“´  ›››Ř%€@ÚČqóÜ`h[€>EşB!€_%´ÁŽĐ?Ą q la¨ż „5Ú Ś„n0+(ucâ‡@‘€›čĐ#M€ŽţXó/ŕOsBB˙r÷Çú—#ü·1ŘĘ áč†{Ŕŕ6k ŁŞ)€vGóŔpČ/ Ř…¸±»‚a`ËŔďÔÁU=ř¦Â?őˇ¬0'4JsřUŁŕ/77mVC”ŽŽP8Eô+?ejuÓwÁ?õ‡#Üŕ^߬apőŻ2 .N‚†pł ô‘ňĚŤčß2( ’’@ťPw+[Á_ <ś ż•żĹ75řx9!śÖ7e@}`ÖĐ›‘ ě  ‘.PŻ˙TüóF$$€Ŕ¬ĐK¨ Nôoď7b¨ő_÷›ů#aîSŕ ý„Ŕ_ĎżNć7 ŕ˙†˙± ‚ˇž÷OÉ˙R**"Ü^’~QńşŠ„nx đů§]0ěO˙aúnŤHü•íM›ţÎŘő¸ţě7ŕźľ´7Ä…¸ţÍs3 Đęć%ôfűo“˙Éyů_yţß©ş88üÖsýřô`GÇ_(ňżFĐżöU ą8ţ·ö|ł p‡µ†R…ąC!ş0´•í_,ů-‡Ţ˙ź¶*p+ä×–‹‰ŔH$ŘxCa11€—ĐÍ:A îżY€#Đ7&'´Ŕ$ú51Q€ …B ˇÎ.7aŔ7­¸Aý#Š• ył+ży“Âß÷ß‹ …şC­ćgV2vŐ­g• nü[Ł÷'9¶Ś^ró{Í#Ű\.Čđ“¸+2> O’şo-m¨pťźö\.5FuŇłÓ›Đ1aźPOpz)î&«ÓÎzĺ/őÍą7˘ěZIć«yó©®e»/RR\-#¡I&Ţч¤‘ëX;uă/0Iĺ#j¨’Oďδ9F!ňËťą”ćÓÄâęy=Ą#ÖŤą† ľÓ¶xŇŇz4PÜů}ȤÇčśŇnŢś˘7––+prß36ŽYÚT=“á7`Üá.ŕr,/Q™=í¶ĐźŇrúřUޑ䀆Ź#á븱g3üňVl$ř= őbňe×$eřźIü*\X5ŤzÂŐ ,ŘeŇ!•–rŇŽ«Bµ¶Đ«Á‡«"ş%űŇTF?Źy4CÎ1ĄéFfô|HľŔx}[L‡•ďĹéqŢ#z‹ß úAŕŘŃV®3||'Ýăs•éŕŔţš¤°ÝÄD-qĂú‘Ś Ömúe_ş;ě=×@‹ĺN–[ ßZ%Á ,·ď3ů%‰ouĄG!JÖś(”ćí#Ř»"dýůK1ôëˇů6÷Ţ}ě×Ő…IŮ™úać7 ę é ĎĹňú{b=Ü 7ľK3É“ńsŞOJ®%Ý~‹—ŃÁöŢ-2vóŻşÎL˙=ďŰăjť÷K_ŃŃ®€đk1đ"_¤š×Ů!T”— h?2¦öq(´®ůéĎ(ż¤mwoŇ϶éĹ—SŃá\âĆ }J‚;ÍĎrZ‰8‘ŕ’ŘżKneşĐš”^ŐĘymsŢěĺ ŕ´gWTA‰qרü7?ÂČŐCŔł|Ryn-„’Ňé·kł®˝tÉ3(6ľ.ŞëI ćC&\p2aú^ <µ´H’ëyf"óM/X?㊴řG-–]ăWüjĆ;•’ŁáĆŇźČ$őP”ČËŞ3˘Żâ _ćJvLôş_­?̲?Ń ;®É–áqÚW›K?[k‰ůšOM­ČáăSă\<üöžZŁ(†±waą÷S‡ˇ…Ž1•¨^y5ýy Úc‰s#—_őŐÔ˙Řt\aŐ“Ý)Ýđ0¦`»ÔX«‰ź›îÇř$$ ź T‹¨ +ŮßŐ\{iń°±…ĂO‚9ý9—rŁŃěşöđe? A¬·iďlńrŮŢmt˘Écüňš¸ÜF>`ż™:vĚÂ3{msýŞęiň gJgŞÎRZyl™šxd˛ăËĂô B# ;'I5 źŻz3ĽÚŇq‚—÷¨:R›BŃĹ%I=Ëbč` Kĺ…îó+ś‹ .,×"“”FŐľ°ËŽ,ş!N^#ÇĎžŞĘS9®Ń»ľ2üoÄâ4VŕŢ Dĺ>ą*1…‘Ü>,a:“ÖKZŘŚGž¤ôŘű›¤Źrżó< ó2™›;5$~Ây©L˙©űěÍĘýjŠWńm†ďîB&Íä_p|m}•ÍŽzę©­·#Ű'ń˘1Çíh2oq1´…|v/öďč@Ç6âJ˛,,1P>ş/ŻŇ®>“$ç±,ÖŮ8˝1PŞŻ’¤čČn9Śđú …{aᱸdź´ŚĺOCäő.:ü¶;„°ři—¬ßΰ<–¶—{ưł%ŻqÂ{_„ :• (¶Â "BNźx(tŇÄŢ—łh*˙v%‡Ž(äá­oŘ^7*ÚąýĐ6ôÎyŤ}&+aőNŽ+ăí‡|s«ăg,}XyN ý~QdĆuU…Ö†,´řĺÖËÜDńâ­:Żíý]řĺ'CąŢ‡ˇLÄęmh¤Đ”Ť5 6§ń|–ť…’—ş Lţ{U9¶Ö_Ś?̰śĺ¦¶\$ď~rËiHŽĚ—Ş>6ďąCµ9ÚnůIÎҲňc°ŢâŢE™%RY}‹âI(¶ŰĽ7ě`¸0®#˘’aČřyTÜçbź çe·ú‰Q" ĺQŇ‹ţ¸o`RĽ¬ˇ¬âš…Wô xGşýđú¸ Zq]@$xńqßńi˝÷ăšl%’“Óyxď¸é'â—Bđe ąÖňc¤Rv{ă–ę;đbáfőj¤"ëöś/xZ•ŤwáŹŰ h°%ě!Üú…˝m2Ćń©#yŮĘ*Î+ćëşŢ"©Ó DZýAśó *®×ľáLňîéü—6÷C™4NQýRŇoa0Ý „t)ĆţkÎ\źtí˝|í¬¶‡ëÉsŇĽ ĺś }šC}§ÔâŹÓŇëĐŢŔ´}Ą,ŇďâłńĚ)[qL«Ň7Źň^ĺ-‰]Sĺ;”ŰĺDď{ÚZT±Čm2w"Hy7jĂGc»ť DwG]Ň× .…Ź”­3ͧîô˘đŰjCŹĄÇ„fń6ä‚őŠď­Ľßödíżć9}ťúő"Aşš|€Ť {Z&LµňbŤđ}Ú^x=ůpş`X(Ńö[%'<ë¬ę§omý't+ęR´ň$ˇ„ćG¡úo«Ué° †Ç˶żě”±ół˛”Ůł|˘"‰ ®ŻŮ‰ŐŚ˝ďqFËÇo'Ś5eۆ‹ď4]7*n(ť'ˇĽ÷ížB*d?é¤ajl=é¦;lÉ6™MĹhŇ^óIŽZ®¤¬Ý6uË\)~ś˙©ĺ!ú[xŤYůgsއiŮa{={Ď]Ú2^Üłđ’NďÎjڧđŰS’I´™´ęe0/̧KŘÇÁő÷öp>ŘGÉÉĂ—Ią%9č.îéwéq {– Si’^Ľ¶Ó˝ÚtĚ_ő«#ÍSÜtćßMl%Ĺű™amDóěˇĚŐá Ź‰ćTÚěé#{UZ#­W‚AF-ÁĽ‰E:…CŁš¸ µKđY€Ía–ŠŃÉ'űtxĘ$I^¦|Yş’żµ­pŃĺ¦.}0ő‘˛a¬F$;n–*Ánz6í°bę ő“Ź>ŰľZ°ńv¨ ŕÖ $VťÖ}0[Éč?/Y^ö†±v^]Ż©Ţ·W0"Eťž`B~D&_éo´Z‘Pń.†GŃPlJŮĂýö‡Ňr‡Ńć“©3wŠšĄ~.hp Š”\ň“’E…ŞŤ4ń€SU/ÍOů‡/JŠ4cOvDDÓ?Ôč|}˘Ôą”‹ĆˇU©ľ7C믯¶ľ]‹Oůú.ć}ikVc ¬ĚKˇ—qř¨Î|˛Ö„YYC J{Цs_~®łűôuMűnq%D¶‹í„čĘĄJ«jä3ÉÔ݉ËC1ěSćvĽS©đn Đú升ÎV ůäoŚR5¨)ŹEn’2ßÝŠ K</|+9r+Y ·v]vÎ&ËvwcŃ™Ś4fý4ˇ…*zöÖëŐVaëŰĚcÝzőS—ÉŘ ,ňźzT°Ë-Üű5›¬¶Ď/‡í"DNDŁÍĆDşö–CȇŐ& a˛ŽĄ\6 Ç TYç…(űŢëş™7LŁŃ÷Ůc¤˝WÔk«A` ŁNmé¸Ţöł”wýo ăëÓ¬ŇŃm‰ß¦ŮvČqMe썭nő»2 A™ńĚň6ĎIj>ŕšq$ţ\v´?ÁеLńł}Ec~ć· yZnʱ+v”Ťą'pOóeÁpĄ§7âîÇÓ‹ `/›ÓHw«»tČđÍ#; śöÄy?śUŔ„ł$·e©çî´¤đŃ…ĹM®o*C=» ÖűB^ęřŤ·Xőä7†đ˝:h?-4űˇ˘^N2Ń~ꄯ–ĽpŞRęµMMJHrA1ŁÂT˘&+¬Ĺ´ĹľuéXjAüѨËâˇa˙;ú±ô†Ăź¨\‚[1"±ţvŔ˝¶Cw]–2úąZ8đŔrVĎćjś‘ ułqď)˙dâgsŞą/ĺíĹlŽqą(öŃř=Í'Ôűq6vtÉËóŽŘ(Ý5[ŢőÚöú„®˝Ëöúě);Â-Ó˛ Ó÷‘<ó^Ä»ŢĐȢćŃô ·ŰÔęQqđŇä§Ir2aőqńÝeĚĺÂz{Qž“‘.®AEpyĹ·}<Üo„5 ŢŕM\™ô´Ăب˘ťńM-ŔÓĹBßę˛_˝2źĎŮKbbKFóćefšIĽÖŁ-:âa""ŚíÁÜXólŞ 6:ˇŇvG^=’›®čř‹>żv‘Ĺ JbxßécÉát˙ęyĚެpSŕĘ[Č€ôŢuěŕy)Kvj{řه<]E=XĘ”‚üꇣé×o^ gĎé%lŘňßŰ•đ·ďŤzśMřxvŰw<3řÖěĄüs˛’ř»ć{ř¤‡÷Q/dËP_•0‹đňWŃÄ3V«5¨Ă¶ďtur‰›!šsŃŢfç™=ÂŘJśŠnŤIµ7áXłŰ‘‚ŇCŘśľďtuz§ÎńWŹ×>¤´učĚđm†‰Ú˝˙bĐ>-Dţ‚2ţEo;Ó\ ý ÍâőčT0Áí‰Qü»ţűŞÖ’%ŤŽ% š"¤CBďÝŹ=Ck†ě'¨/,p~¦ŢR˙Rją„ß,Ĺ9e@é¬iŔĆpď%ŮbĹÂâTŔ·r;ú0žł(G™çÄ໩÷¸…S˘.TIOÚG†ÉJ*ßÝ'„ËŚŚFíä÷`Žg-?Éńîś´(¦7zĽŕS0eQđđvĄ;Ĺa• °u7WŽUžçĚOXA]‹}÷p1Ü!Ĺžˇ–``ÓUݍ8NVäúňń¨iőŁe4ýÂÚÔŠ¦Á^ÁÁJ±nšfK¸=Dč\ÝHĤ̷ůâöÜ3ÍÄóضĆhvçÔÓrě»ĺš LéĎěĄČ'+ŹĂę7nM& TŮC»ŞĹ'*”+S ©Ů'&ŢE|LËe¨µs3٨ăY|*JšX-¦U=^Ŭqf¤Ý˛«sť±Ö´‡Ç!7â˛Ď‰^ Ý´5Sq [™*VpJ?ő`Hę=ěI„Ľ ëÇ~~ě19űĚ6¦ĂŐŔ¬čŔu¤wÓ_Ň-µ]cH;´d!KÖ˘.‰5÷±”ü˝čŚ2ůžMYú}Ö𬂎Ě[çNtĆ[łÇxö.ÂťfťíÖ’ţ¤ ŻvtŘŤ[đ'úîIďňCś¨¸˛S§±C›Ď†•ű ­öWB›¨,T8ÎľÚŔI:‹íť­¤¬čS©Ű1]|–ŹbhďŚÝµě3ż\uĂqzkŕĘu"[9 Ł–E.˛AžÄŤ>Ŕ4Ů#ÚćÂRF…;·Heő¸x?ń*řÎŞ§AUńšäDz"%„O¨KŇz'&U6›\ű šő§*|÷ť(®eMKçٸ˝ëI)"x׉nb•8›KŞôýË-ła±Čűľ˙žű«óŮâ­ŹEŠ!+GâĐŢu‡)ÚAçC~4?Ż‹¸>2¨I®–bákĚÔ˘Ľv¸u¤ě¨ ‰¸­›Vů}š‡¶ÜIÚźîäGC¬7ŢҰwÂÜćNń- qž[š4s8{`őą&śhÚOŮ…pŚx‡FłvD‰îXfö«Új3Ár‘§ţl4ÉčGOlK™ę2'"›v-_3¨y;» Ő2µOgçż?&‰ĺzwĆąAĐT *zbřáŽYĂŔ€{ý@EFŽĺőeCÝ IA(źŽao Ą†Łv0y2Ůś˝XcLë˛DáąKN˙!>Q wuĺd©ňŔÎľżR`&[ź> stream xÚ­T{ 'öGd”ň—!Ä ‘Đh`Ż!ŃĘ 043±Â/›‰`mn˝ďꉀźl2±‘h oÚ„(jýŹď“µă3W&„R„{âŹL ľZ9„aËf㊊n;Ţňź¶hÉa8†dî íť9§r±JĹ‚¶—ĐćFâⶬs—JŠă/˘7âr’[—GĚ]:htE`3•wŚőax‹ţHGăú†ŮđD‘Ú>-˝¦â•u®YŚ$‡ť“Í}”ľw˛ßë‘DĄÉ×#Ozü¶†ťť[˘.¸fĆ^:9ŁŻĹ+Ž—_?Í’‹…NVQ¨_qElUĺ™±:™Ďg¦7´t¶·µŢ’lV5Č?"­m *ĆžÓĚÂřě×—ˇ» /ÚśÎňZUö}Wéѵ˝äÇ·Ů•e¶H™D¨Ě/ÚWěfÄF ‰ËuMbÚ¦ŚK w¦2^¤×yUޱ| µÍˇĽ©Łnĺćűj$c7RľŔ±¶SBŃtő~Á»¬Łłĺ7Whhmkn{ĄĐĽ=ɬkIY7ßLt粠§Öą'ĹŇc!«“v?ř)Ë–Ł´«)vńű%upF¨™äĐŃč7żćxÎKŰ\ľ—¨ g|е3Bµď;b©2S!îҢĹÄd•RÍĘÄąŮÔü$ű*†#Ë“sŹČ&®}X•‘“Ô›aó¸áyO/)ő«R–˘ ~dŇóĹĚ´÷xWŇ+Ńçl8ľÎ±ÖÔC…qÎ5˝Źéü+ąĘń ÚěżöBę„dS^Jäâ‘%˛Ŕµ:Z˛CéĘű¨RĐ•(kmQĘŮWuţH…§W×…˘°ôLŚ‘9Jđ‹P«8â]=…JUß5Ě˝­ĂδŮsw˛!Ą|ÜV~]Ńz.kHYGşDŐ´ćž%ç›±©ú’îă"űžÖ’ř‹„Á—Ó  =Ő?ęb möhňšĄ%QKlż`¦˝#,›o…žË]-vJYVšĽbŕ솟|׎Qě\ČNcłăît©.ËĽýÉ*Íu%F 4ÎÍGĽÚ˝e˛KÄŇÔ#ÎN)Ť”®˝»Ěď¶ďĘ”‹¬ŐşÓuţ:Ô’–jťSša}aHPÉ˙+Ćz»ĺOŽľąD XzN±Jg2Ô`ţ‘×d·C9É~P\Ĺ0 Ľ´g­úěëc>‡6ÜĘźęËŃË+(K˛bvÇNř(žźÔ«zî¶2µóeőđF‰ˇqű8«čvĺ_¶eN#?h·\^gŰÇ2[St’ö(ŠŰ},ĐÝWŻ`(Ýř®‡§8P§ű¬3˙ÂËĆŞçőĺŠq»2÷…űr–'ą©'Dősněj'RžNţVMĺ!*~”ÝKžßP35.ąH l€¸&ţܨyű‰fĚ+6–vő7¶¸µ[kłŹkŐ™čf3gŢ{sPVĹç˝+ľM©)ÁgĄ‘K¸iăÉĄŠőŽ~Ţś »Óţ«(¦5—*~/´ó^v2Ň j®p íŢ/n§e%ߡžű¦Çzvµ,óŤ±< Ą8ç8Ý9\đ˘ąňÎń#;zVĹđGř…ŚTSóŕř´ Ë´#×múúča1ĺSę†Y+xUm伝|ő0·4ň–ŃƆxÉoő÷W¦Ó.·÷)čěi«đ4ĂVDý”©Zt­fÝű§,p| ”ee/ÉyÎ%ޏÇÂz+%ý¬·ď˝%ŢCŘ Ěĺżo×'•ŚÎZî8f?‚îqtörŃ:*-f}y“n ­4ÎC˝5ŐęÝ뉌卭sî­Űňzž×ď/I㬠ĺ*‹So˛ó´&ͨýˇ4!g(—ËW`Ô×PĄF Ć,nfä–g†™·[? = 0·|h ç— ŮDşËÓ>‘éWF|=HćJeU»†śWXhä%şz䩸}čXÇóĽ,ÖuI?v{ž«®RÂz`롆Úć‚•Ę—©ň‹~<řŠö"_ă”3KµŻPÓ“¬ŘôÓ[dóî]Ë›őiś'ęVĆ)hck ÜGmç#Ď]ěżÓ»Ú¦âő«ßÖšóO$ČgÝz“«ÉäÁŻŽ,ă-µ «—°!zqéă×ĆϨ_PHk?[H×(VŞ9śćwź“SŘş\޸żż%ôgHs¬€öÄę•]”Ľ_Çc>¦~P0TÇá¸)q¨ŻYbčüÔ‰řP#ňű™Mö×ßם¦ý}1ŰMĆ&Âă@Be&ý˝Š¶cô×1·ž¸hçßJŽżů}„×R^ź^ÍîŮ án‚5¦}r]˛ŹNM/Ö†ţÂJá^ endstream endobj 924 0 obj << /Length1 1144 /Length2 5332 /Length3 0 /Length 6094 /Filter /FlateDecode >> stream xÚuUw<śŰş6:ѢGD7Śm0:ŃKD F™3Ń["z ’ zďť D‹%%Z%‚¨Wöľűě{ö9÷÷ýń­ő<ďz޲žď÷ńr™‚ (;¸& ‰‰‹‚ĺw;,Ú†Ô™Ŕť°Ŕ+PFÎËk†Ŕ¸Á˙ľ"Ô<á0 …T‡a®x3g,Pć ”ĹÁň`Yyiń«5XňŻ@”§<ĐČáŽňÁ1pO7ňŠRGŮcÝáHŚ)ÖĂĂ w0ŁQXO{8ZčxUŮfŞˇöÎbżSšá<ŕâżaŇ!ŔĎĺt„ąˇáGřŐ‹Ü ó‚1žXx€ß˙%ţ}G..t@Řc€vp§«kř[ý †;ţą×‡a<>@+°(,˙~ţµ˛ľşPŇ ÷w¸ĚSšéZÜţgď˙ŠRUE]I‚ÄoIA˛ŇWNąR”“–ü§˘ ńż˙>¬tDĺţ,üjbď÷D_ą(đ‡a˙®d€Â ěá@żMr, ľňÇŐKüżšçßř˙jˇćĐÄşąýŃżŔźŤŻ:Gő€ż{wyţG8Ěá†ű/ţh˙Óç˙ŹŽ憰‡"ťÜţ5&Záw0B`ěť˙4Ćź¸9ŇáŹ/n„B#~ł@¸´ř?83g„˝+ŽF_ąď ŽtřGJ ¤=Ętšb®üótřđ›¶Çzz^ŤçŹ ş:ű×ŢqU î·'źťFŮ+„»Ô„·WAY˝Akď${dĚ/±śRä±n€Qünf×bV©—?eS˛ŐŤ†ś•*¬ô ń¬±·Ľ]ĺTŰEIhéŃâkG±l‰Ö*ČSě’ Śí{Xž0§=ßTĂőiďp•Zň*©ŤĐšF ‚ŘŹď­o<4$fĺ(Í+'3Ü”c< ýn¨íh,O<9Сv ŤL»¦ŰŮ0ţ‹_÷޵†­#şňvÚSÓ˝Ş”ŇA“Zäš];VËâ[ň#ť'Îí·U:]"Ż˘_đŻ˙ľvńy@h’‚9)}ž‚Š™y4DZĎ]aÖž”5s*··}\`€BöŠ|đͮқ;zÁ·8ç3VŹDëóň§ă¦a‰ˇ™ö(ÇNÖOÂűéŰšzeŢ™vgšź°úâĄÖÝq{ieŻú>ž1[Ş2)Ô ‚jřęŻcjű:/CF+®EĘEšŻ¸S÷€ÔQźťHĘů5‡}}ÔtÇf߆ŹHĨô°×o†eĺ¬\FĄ—ß¶ đňR[kĆ9]W¦‡úŘĄ âÔŹáŔ5»Ů ç`Ĺ×Mí´Ëň‡Ô>ę&GZ±ÝÄöń}ßľďY˘h5đˤ(śĎA{j„mTÂqŮ~dBťéĆÁoá›Ođé…¶ÖćÔrĚńi”éÂăú łÂ©y'`đ‹'Ź (rů đň+“ĄÖ/*”şdÜJ-’yă÷^ f…l EĹô+Wg2ÜţéE[%ů@÷Ŕ·Č.b0l@p‡ż:ń|±[{ä®é!2OŃk‚T)r:$­yMÂî\"ă¦ĚwȬ7d[G=Aˇ™éA°„*zćí[± *ާ$¸{6!4•‘P—QuEcçţ]Uä€učiÔr”ŇÁşÄŰĄj)Żęt«rÚ„N¤…űŰ>Ó4˝xcĆP“˛,É˝DoŃf°t6CmsőηÎŰWî{˘‹ńŽ[s#d=F4'˛>m=|ăÂ`®Jş GňŢEŰSžrµ™ë˛u[Ři4Žľüs1îč@\ ą˘˘Ć†đ€ÚýřqXD1ľ*Xv$Tq3®Écg|y…6®ËâŽ|”ÂÍvHw<0§c·mxĚŞ°Ă2,ܲúšMÝ0=ŹíÓŹŁwÍ|ż•Ď޸˛ą§ě'†=YLVŠ)Đ>µ&–äëłĐ_Ú:˝~â¬Ďb;"‡W±ř.»(é˝ńá #ů,# µčiË}Ŕ&ů19sŃůé4ŢÓk¸´ć–»Ź†$Ł?8ľâe39îc­Z=ÎĎ'r y¦‡CŞ%ŰŽąWŽ-ĺg{ʕНńőÜßm ­Ůýk"˛ń>Áß±|é4ť‹sWXÖv™ĎţŐ’¨V">3§XÎeü ˘py3q23„ÇßWęůőˇ˙qÎŘnŐ§)^¶čäŇ âÖ  ńí‚Wľ«s< %ěÝěł°¸ĺ>ş™{¬HqČýî;·›ś¨—>dł˛×‘ť:ĺťöó@Ü&1Š-Ĺ9–1  *¤MćĄč›ŕÇMÔ~ó/ÖÎĂ"_ąEč˘olŘ'=¨Ď× ®ŤY§ w– ʸIş˛Ń–«MZš2|¬ďĄ¤™ä€Ů2Vء>g –$Ŕ/u¤>*ăŕcĘŔ˝1Ş2·Š)nĘŞđ°¤°%€|¶ŃJń;J_xş ŻoÇ šMOUÍÎÜÍ–L2ý9ؤcź nąŁApYkw¬}7őë&vI˘ş›â}č·§[‚ˇ’R¤śd|ím#şČß°”CŢ™Y:ĂÓ¨d‹ň6RM÷éÜ”‚ëixę»Ó—ż^ŚK2[«˙šbĘĚ»ß"ĘíťE7§“|˙‰B—ś0ѵ•öÂŐĐĽł*1Rb*‘¨%şć»]‹÷*~Rfş–şČňgŞ Ö$Ĺ[Kß××5„w˛x¦x?÷“ěC3ĽpýÝ$Î/ěmŐrżZ†÷[>źóUüŮPÉ·ž˝ëŔBiÄVš^˝v˙ÇÂďxO F“şîôV+ě#ߎô mUž[9Ól‚ÓćTeűÎÎíxpB"ąkg…†ř†acł°Ę~§u|Ýă:h+·‹Á~NřďİMťôŇô˝yBa'¦ç*míXŻ]˛óę,.}Ń´=çĐy!v»gěź^ř~ÚY¦%›§k˝M‘nuťĐ7è<[*Jí%4B˝>ú•í´-J’_–•*?÷[qěŃŃ®$đâ]WéV>L’ľI4&DS‘8ą/z&•ďhź$@đi~·Ţ1Ý^üÖŃpÂŹ†—{ąEwf\!ą‹Ś´~ńŁÔŃíl2& ŚŃď´Ă\•[łń\9:|$”ך‰LžY·z$ůŮÍA Ľăɧ»ť‡r«ŤšOą…ĎW‚Ăű¦ę>hEÚ™mç=ťuLm.)ĎJ§ž^ä‘9ÉI*ÖÜ,€?#o2=öŮPĄĺc¦ÍŰ^ëTáó<ĺ Sí)^ß{b7ź—eHtÇe®TłÍäşĚoAevűę§YěDÉëĺ„yđ–ţY…ĘŞ†@cŁľţö”A"‘§7°Ćălë ˛ę&7®âťE·C“ZéÜgGßSŇ#Íë»á'“„ěGń‡‚’5˘oG´?°uݨ[e › lH±7¦0±&ZJIĄ¤Ş8ő¦1"ÔŃ>ú"ŤŃL<â§ ˇ bą7-‡üž.%Áëz=ýČXHźK=5I•OŞÇfŢ9ëp>@űâeŻěŁ]Ňw††nŻíÇő’ŕŢÚč]Vh0´‘GŚń¤Ľč/ď©&ÇdŇË\TSŞ'ľ×dWXŕM‘ :ŤĎŤ]Păă›ňŐ+˛· ˘[Đć©GmâđžŹP„"ťŚ§¨Ą/Ŕ·ÖČ‚„XIë÷GŰ” ö‹>ß}]Â-ö“Ú»­@łć3űg?Ő¶Ő/F&ú·Ź—·íýŇ"űöÖ‹‡FĆś¦şĄÜ˝5n±“Ű„µĚŠ ‡ I}üŃ^a@uCČëë–ŽăR"ŽąÔÖžK_5—î`~Ř”ö‹ĎdÄĚônń©č7xgžŮ1ĺ“C`!&Á±ÂÖ@´Šzę2tc–Ěyo.At` ‰¤6péń#oôąµ8sZC± ¸čÖɬůžÓxK>·gc,T.+Žy HüA͵ÍiâDą’Ú_}®z3=ź˘SßĚpç+«ÎkάĺÚeÚEm‚Ĺ•} Ö] Ş»OHÍÂ’ęű|ĺ­`óB=-D˙َs˛˝Q-ýk 1ÂĹŠĄ qcôŔÖ*›%Z–žZwZ‡Ëű1z«g˝@z-‘öŚaŰrŮhĄŚůx™O@U®Cż Y8¸‰sAňpĘĐ©·|ĎäęĎ Á:Ďń0ţP#‰kŇöNÚÓ5xt”Ďź†[–ň«¦ R$, ľˇ™xŞtŁLTľ•®¦¬ę€űÖN©ŘY˝©Nçł­Îm}– ĺ$ęäŞV^îJ<Ĺšrž ôŁű.ďI¸3hĽo)~tRd Gă#ˇj ŐëQęe’O¶Ç_Z›zŐĚHYŕý¨¦p?(Ô®`\[­<ăŁ#|yôĘ!Áëú Ú ÇŻ¸â]*ˇ‹'°ň'3aű·˘˘V ŮŠő({$'Ą¤Hö)_”^G7Čś~vkV“ń]xy–řŞ€**mĹl6záđŇĽ“ĚD˙:ĺ›úN÷p>‹5UöN3ÎrR~°¤ČjÚÚÎ{ňÁ¦6Óĺxol´vÚá|oŘFW˝”¸[)Ůüą m=4±šˇň7ĺŘ2•Ô;k «ó$e |{2Ň?4đ]ĚXűÎu+t~ ôŽ"t=Z2ÝŻlbËaXY´blte'žzďSÄĎwĘE‚" Óůfł¬›ÂÁńt60 (ś8ÚxůLÔ´_÷+Wím[Ě+ËPÁ»Áł"—r‚Ť0˘ÝW˛0˛u‰Ť`ß4L‰Ź-Ą[ ™ŮČbv:(â'ĹńדgQŞÁű Ç%z´ÁĄa˘L¶6RĐ&Nď˘ÓÁ ®E¤Ă7—Şć䨬Ä`X Ă‚˝”HE7côÍ·¸ŢáąG±_Ő©tD.n}¶–Fb3?Ş2żV1t‘5Đ3@¨Í(ü¬Đývń®5ÝĂZ ËMĺÓö|í§ 0şH'˝ O÷ÝL‘ääwÎo*{xú¦BĆ/«_&ú§®«ŢŃĐy‘3†XŻ7*?ˇhÖ+:[Qj=x'ŢŐ<śmŕńŐ¸˝ZĘĄËýL#g”ž×%+ZÁZ,vîň´@ĎÖsťhyÇ”mźĽżÄ’ä^§7ąÍ®ŽóŇEşˇęďźîť-źĚ2îˤÍż˘Ě üÄ&+f2—ęöšÂR}Ę%ÇËC5—QXĎUÔ¤ďěľsÇćDÄŕ–r„`ďP›#.źˇ˘ÂŢ"K•ůťî}ű–ÍXYZ—čěg!˘ÇĚ0¦%Dž„ŔůÍŃŠNá»›çEN˛›©9+Kp’‡'ÓĂ=S-”Ży=ŁUF/á¨ÜşĆEŹo?ýůE”ňXčRMÇL˝˛C“‡ŢHěľńGAŕTÖŘ‘1w}łĄ=Ő¦k‚´C{•l3] GLS^ĂRĎC°l·b‘ôę!ľ’1çű"úí¨ĎÉ걳Şb4/KއT°şu«ÉćŻVŚđA$§x›Ö¬îęĄÎGťcÂaSšMëâÉZTžź}ÖÚÁ´ AÔęMjć\4¸›"ű<÷>I…@Ś‚ëa>zébO¶íK¸Tc_~Q!ŕ‚uŹö,ŘWÎ>+¤çŻLż;´)e Çş*ͬ?.ŕqtI^¸ôq¨Ĺ5J,Ťu°ą\rL^ëRŁw“Ň/èGŠn¦éž.ŇőÝ xY±‚Í ·§ňkôjë=Qü™˙Ń'»ëŁ&Ň|d„Î<Í5Şą–S™šuţ@4ůp'úxť†“†I?]Pi9D#µ.5xf8’sźő1gÉYćË›÷-”Bc1)Оźvťż6~ôfJN˙RáŽ|y›Ňţ4i¬ŞRćdęS ŕXȧÇJ—|áűbB—µŻő¸¬e„Ę©»›—k¤3Ś‹NŚł~›yą§8ä¶ 龫ݑE?_,wđ‹\<¶ĚLA’‘ÄńÂÓİUÄ–)Ú~Xr <ănśĽ‚P>QďšÁF¬ t1‘đc¬KZ®çb_g;ă/E×*$ ›yóY‚ôcŞ˝ČŘÜ3Âç–Ţ„Ż[ł¬Ě‚ö­}út čeŐëpŞ_4Řoa÷íđ ^{±+’„ňyuľ.ľIÖU›l"%= µt ç¸}BXv ŢEő8I¶HMżP,íKłÓ&p˘„XbűôşoŹÇŹ|KX`WM€÷3‰â§<`.°Ô6tátKŤ ^mCŇgtÝ“ALwp}VC€ÝňkhlěÁ‘zŻ0Bś zý†"¸/äjŐ•Ýí˝ĆĚ˝éǵ‚BiSĄ&Sf^˝ˇS ]jĺűDőŰ•4¸@s  Ő«u1qvi‹ţĚő|Ů}ź¤)íYĹý´Đ<:âű'—ŇŤ’U{Ű‚OFśu™ę{ş ˛§ăĆŤ‰Ţwµ¦¸ÍKąŔŠÖJŚĺµ˘_ÍO®űđńYO1“LQAr’Ă—č$Ë=ZhW)®×ëÔ÷jĘď1ń\+c˙şC•ľ?r1íu¸]/Ďô˝‡°ďű`C6–rž™qbŽÜjŹÉ“OY좵í%Eč<icĂ-qZŹ)Luš­Ňźáu4 =6)Ő÷3úµąRdBĄS%§?{şžëĐm‘<śđmýx O¦Š˘X7~°˘fJ˝ą~ťüę?ö©•î1˝·Ăáfşí7ÓĽ,*Gۉ:Ňśę0 !/b*öJçÄ×vµŘ4úĎ$é5ş0ž} ë]r Đ÷ŁŽ;;.?Sî@o=ĺ9Í=˝›;|aôϦ>ťVÉk)Ę›L>@,s×ËI ˛Ý 1y5ö¦â׌‘ŘPĆ#«U(Űóž‚y,© îéaG~üüxU_,>«żäCś Śł=ś±Ĺ΢Ŕ5ů†Ľ‡@íÔ$ü DěŔV Ěs)a>E¸†ńHá¶ěęÎř»ČFVŘ,Łĺy¶ĐáGPy‰sĺlS˛X57>yŕÜţW’*«¤˘´?çÁôEÔžëOýX“ř Ň7¦ú·«´ú&O?ťÇĽ=á/Ö‘Q:f»ĂáV-mVő—đbÍĽ¶Ě8—ř\Î.w{[zVm ş .óęS$whŔíRL˘` ›†žÇ·T"ǧřŠŻÔÉ{WďĎŽňä D§ĹµÜ‡››ČĹ·+=9ň¸µĄv Í©°ÓĄďjTwW€ î-§Ůdm±ę°=»M58µĄ˙ÁGA­˛ €†Ka™îňůľRSuŘ*ĆYKÖA‰-)Ź#«Ą’_㺡Ý5>GŮýµ‹D3`l{*ţˇŻëRĐýP˘# ÷šk:`b'‚UÜmCzî ~oL‡™-ő( ţzlą»×7k"Ď‘}k Á†~xîÓR„»Ív=÷>uµňióiꀞöŁg9ö2gf'ĎZg-~@0d!™x0˙Ü^ BĚ«ťq‘ß˝›oß'{ëµúíÖzźŘ4EµÜh¬¬p w—ĺŃ“§ Đňë ţŞ}"^ŔÜŕ;Y߯†m‰@{‹‚ÚßÝ•ŻÖ¶ĽńTŃÄĆ Ô»ú‘.Ľ•"xŰř5kŠ’ćq}5­îĆmˇ«(đúť» Nk3üŞżęfłlFC˛«3OhéiÍ@ŨéKç.mxë˝§.ö˙´ řĐ`âĘHä5ÝuŢ‹4QśÓÉlÁľË‘¦oTđŕŞR´íµ‹żé´g¤C:0 žxsć‡ňE˘¬JŢń›äÄGĐLy>jMä~¤Du~îáj¤YÜ>s.5{Ę÷˛TúŹKú…ß>—ň⛿ĽŢЉ反śXĂkÓ„eFo…}u}ůÂlYŃňSťż*ď[uˇk¤í˙a©V endstream endobj 926 0 obj << /Length1 1614 /Length2 1050 /Length3 0 /Length 1860 /Filter /FlateDecode >> stream xÚ­T{\W….Ćâ*v±‹bŻP^…„(DĘK Ek‡Ě ĚLg&š€‚ŠZ\uĄVD¬ŹĐâ*,´Z€ÔdU mP‘ş<,˘¶7ˇ>–Ý?ÜßúO&÷|ç~çńťsfDË„8ťiŠJDb_ ă1 ÇX\¦U…±ŮÄłóXńMa<ô1J5’óŔC$R©TŕćŃŚ–%•›ä˛Šôqµ;nZŞ~ű«_š»ŹĚŃ˙é¶č˝%©\(8pbué7Ü2« S*L™Ő]e:ľőĎů!ď;ř;ż^nŇ©N=Ő˛70ÄŞŰlׄ†´ŚÔV]˙ek[żľö(Óµšţ‡–ý8<ĆĎ:6…É–žÝż§tőľ±Î]6Sźž+ô]•¶kňŽXßĚĂ}žąAţva¸‹~î§$Ţ c,W$Ć×)‹çţ%wŔꙸ޲¤»Ő1¸vŘ×Už?ôÝţďľţdAýĂ›EÁî'ťď|<»Sµ˛éŇŤ Ďvź’ŕŁÓEŠ3j[˙€oĘß±ÖÇ]üËîŔ¤^aĽé˛…ÖfŤvŘ÷ńéĺ+Öť› Ë{-ľÚoęiź. |tŞÚ©˛~ŚîJĹŕ“Á'ąńvÇCµ"÷·‚üËa¦öâ§Ă뼊ńťc™CëŽŮÇW^Öß›’QuĹŻęţ­Ĺ3†úęźÚî‹=¨°KOiî+Ş˙ُăÉŕßťšxiË Ămv^ŰPúÄ™ oqE-y 75n? ë]‚"Źü°\Űłű'Ć˙VááS>Ť‹*_ę¬-k?Pâ}#ółvłÉ“Ě> ÜÓ”SłtkËptâ×seÓo]k®µS´ťW™„Ą(/¶VYô´ő´:ŐˇqäöžZľŘüî±Tĺ‚zOî«LűŤuľMě/ ¶Y档k˙:}ĚżŘ Cn•–g«f¶ôäsň]©Ťá)~z›˘{Ëmę&8ęďm)šőVvváÉił­6kfmóYu6ý™Ř¦ZŻÍýňš¦źg#ţüqţ¦îžÉ߲ée9ťö!Nµ] ą+S/W—fé|÷48ĺM5É÷k±ýĽŞ9Ť endstream endobj 928 0 obj << /Length1 1626 /Length2 15831 /Length3 0 /Length 16681 /Filter /FlateDecode >> stream xÚ¬·eT\ł%Śkpw·ŕîÜ]Ó@cŤ4N°`ÁÝÝÝ ÁÝÝÝ‚;<ď;wî¬űÍ÷gćţčµú”ěÚU»ÎYÝ4ŞĚâ 3€4ČĚĚÎÂ&@® ´7suQŮ+ř™•@ňżvn$š/ÎS0ä i ë,Č%ćääěüüüH4ä_@ŽžÎ@+k09˝–ş##ÓZţ !7óüĎßL •9íß/n;Ł=Ŕüâ˙:Q [Č-vň/*ŞzrĘ2äô2ĘZä2€ł©ąŞ«™Đś\hpp0[‚śÉíţ} 79X˙iÍ…ĺ/–¸ ą)ą‹#Ŕř7 ŕapüÇĹDîp¶ş¸üýNt!·r6u˙ťDt0·sµř‡Ŕ_»%č_„ťA#ě˙úţ‚©‚\Ŕ.ćÎ@G0ůßŞŞ’Ň˙ć ¶6˙SŰř×M˛üi2wý§ĄůţÂüő‚M.ä`€řźZfr  ‹Łť©çßÚÁť˙˘áęt°úOLäÎ+Sg ;€‹Ë_żŘ˙Lç?ű$˙ßş7ut´óüW6č_Q˙‹ě°łdAbçř[Óü·¶Đ‰őź]‘s°‘łłýŰnáęř>7€óżD˙ĎÎ0ü%ajr°ó$·X"±*ŔK’Ó˙ß©Ěňß'ňÄ˙-˙·Čű˙&îŐč»Ä˙Ż÷ůżBK»ÚŮ)›Ú˙]€ż1äSňżď ą"ů?Ť«ý˙'ĹÔhçů˙—ô_Łu˙f+˛łřŻ>9°éß‘;Xý•…Ť…íßF ‹4Đ`ˇ ›[“[šÚýť×żěZg; ௮˙)93;ŰńiZÍmţ€űß.€ĹĄ˙WŞ‘g•–UWPŐcü?<®˙ Tý»`MOÇżÜţg+J ‹˙uřFBäAîÍĚÎĂGÎĚÉĹţ÷îý%ÄĎĂöí˙Pň_@ě˙yV2;=Č ţöÍĆţŻî˙çç?O†˙FĘÁdńĎÚh€M,ţnÚ˙2üă6wuvţ+đż.˙ß®˙ăüŻť<ćH+‹ sÁ ›ÔŚ4p-^ÎฤAo7;ô`°cIfaľ5¨Ë/5l›żÂäOM0Kă¤Ŕ{‹ç©ăŰľüçán\;ş®dŔEń7*†ž|Ś Ú6^Ć@VŁ”´3ťHďËyĹ-}6íťq5uŁâ?p$“mśÎ—Ź ţTnůţŘÔލľć)ő18í荵§g´ ÇŹtý#C]×°=űDŚŮ14‚¦xľI§‰`Oç»ówŘ7^G­WG}ů•/,qM­éJ–Uźý2Xű«tYvjŞní•’´ #%ěŠ%Ő\kŽgëdś`šűűH bÓ)Ę`_´b»ŁšŔ0ˇ#‡HÓĽlܬµ°ňś•µżčXucý8`&)UđŕŠńćŕNš* ¨3óĺVţ#b–~č¸ë9á?‡ŃK÷Zľ F3[-Ň-B¸&‹’jl[rĹź ó MÍPĚĺ_ő˘żÚ6J…ÎĹ„»Ś‹gŃŤ®Ú6Ŕ.z ,řł™#Ŕ\=}Ľj艄7 \]ÄN;ŘLÖ˝łŞdŢř&úXúNŔ2ö I<_4ŁČxNö.ŤöPÁh|Ďö*%LRBQsűĚoµĆMnŔ‡€™`ä¤Đ 7ÍßÔ×·› ą¤-JIÍ=OI=!ťgéÁ‘©˙ ~UâR.b&ĺ­iz¸ gt¨„‰Jś¦g7UśH2ĂÚ˛´ ŠýňáńŁąk¬´öwĹę@čĘüˇyÎB¬;3)…Ç(6«.ć ”ĺ4:G4ÚMµ›ţ1”őlîŻý.k3÷ m!I(ĹRˇ-glňuÖI+éîĺˇçű _><86Ëĺ´ÍňbŻC׸ČĘĽĂńëÖ„á»~ô]\“OflÍ–%Ż ˛˙Řv«dá€h}ĆÉu„őç`ăwË®aVÇ”ĘQűô⻆{µ¦ëŤ f ÂÇŃVZĐ+—y•Ń\ĹŞ śYş;Ł;żNn/Ţ4N«Z\ör_°i, Iňy)§{Ľ ‘°čçZçÇUBj±_]«¬'.ŮŽ%~ť÷_ř=Ť9 4ü·S A™z˛ĺÁśo/őĐ‹ o{˝ř]F¸[…ßâMn'… µSŘ ?R¬Áň“% ä2‘nře˙+ŘÎĚűĐRłbŐýş¦¶™I–H%*+«źŚ8L=Ö -±0G°ä¨Ů.ţ»˝BJ*Žçćc,ćř+ţ3Wář~¶. ę Ozńű®ďËK<”á|Q2#Ę$,Zë"k•FÚTűH ňJ°/!ŁÚ VqqBĆű¬z©!xYÚěx˛ŔŤf~«ieÂŻ*Î@,=¸.ɧé˘Ý­Î˝UoQmôÚ (mKfŰT{Ş~’hĽÜO°G@kŕÇ ĐP5­OSż´éöÖţV‚B3AĎ úPHÁÍěž&ĄOczxąx«RCq&Đ~$G­ŽI8OŞ–ČňŻĹM zu¶©±?ťYç "Č“8±F@ĹÖz®›0rlB^ľĐřIÚGŻĆ…5r¤1ŞÔsĘk}ŕův폧W,ߍ+Á/Ńř=Ź$AnŻ3ůăgX´ [wŹ™ľ#;Ě3M»Ů¬Ź‘U§ µ{\‹c&'Ă“’b`Ěú!C:7ţMxtźš­ľ`ÜšźýŰ1ß T¨] «Jݢ;Č@ń®ó  ŰűVđ=„ájX9´ĐÄłęyĄ.¶ěÖŞcpí¶,éú ±˛tOłÎťçč 7lŮŇşÎ|“‚şęÁýł”ńZAÚ<š†Dµ˝ă0ň4üŤSd©şGbŇź"§BVzUEJ?WvžöéŁĺ\FáwŤŠâo,Î@ o˙ŕ,k#ۡƕ4˝ě“â°făaR®Ps)[‚·ŇMťÂĹĺÝ~µťć^Śő°uŚUó:ó?S¶ěüĽŠ¬ři™śąŚÍ?bŹÇuÎ2IĚąĺŮšíáâirB\Î#›ř« KUlŻ˘ŮR•ݨǸ,JŤĹč١•N_®zŃ&Zíä~ś©—±Żăäů&[ vI™»l;­1×,28;MČË޵ýú€żOS%;¤ŰÜŁcř2w´´„˝ÝşBĂwVďZx±„•Éd4Ŕ6kÜś)¦ › Y"iFvLŘ7:m-_Qm?yOţÇĽ/ nŔ‹)lŘó,Í.`qQnÖRYÉŻŁ 8wŕŐăő?FBkđE‚ŇÍ’OI Wy7§ ™Ď 7Đ}‹ó$¤ĂN/Ş)\:ڱ,…łżCivú %eŞNĘĹĦچ5=ÇźP—fŘÜq×rmŮŞ ¦ešÍeőQ;×%›ü^ąąőŰóëíI-¤1.5A}ăĺ_‚´}B‡ˇ7»T¬[hX~Ťň*X ˛(<6[űáĚ@/mőă@ú°čŞĺÚ¶QŤaਲ਼ŕţĆ“ ”5J¬Ć´-y«e:Só(¸í ç Ńśź _‡‹ćĽŃôu/ˇ±©Úr]DŇ´gĹ—l%`­cnçŠR~ótHß”î?Ľ¦Çô§EĎÉ[×L"†kSĆşěM÷‹««IHŤď`”lJ,0~ǦĆJtĽ^ĘŁä´qĺáĹźiUŔÎt­ĆŘőâôůQř ľ‰ˇ—X­ŞV•‹uĎ…šÖ‰É„(硊GĎQ‡ČHÓ ç(H0† ßšv•,GĄC_§=6óĄ•–ŇłëĂô¦×ŢÜPżśçn‘ĐÂĆ…oE»“{!ü>~Í".J)t?3ôEˇrÔňd•R‚WUU†1¤ž÷-cÔĘČαŰ[lµ“+”D‰âmĺÜ;,şĂEŤ'ö»k†2ě·›Ő]áF?Ą‡YôÄ8A)%ĽŇOHTxŻ)šřäi_ Ó54 h°’­ĽCa ŤąěYl5/î|´ĄŐŤő˘ńwąç6`÷ r…"`PBą‘uEŻ Fh¬`uiXeĎíÍ/ůš“só—JŐŢíl¤­ą™\ňG”ţ¤`ćE{ď"Š_yµnŹF°tŚ2=fÚ®’ńrt šżA^´ČcÍżćÖŻś°c v“č»lSŇô0úŐ´,wS…Hőjaí”wĚŚHa¸='ö ›0Ë+Xg@íÎCCBW#őřŤŁŐýB ĘbýŽ×ť)[8Î4„©ŽŐďLbŁ/±C ‹‚ݏfö”(;›ŘÂEŻß¨™Ňë›Ô˙ňýÖȱĘÎM˘•˛$Ç>űii“‡©ź‡í'qť}âc, śÔŁ^2t_â,21Ţ50î*ú\çĽoé“[žaĘm°›‚ é\<‰BlĘfEV!+C5[ŇĂÖ8X±$TcpܸĚŕYdĐ”Ďál™7) +­"Ö&Űeąah9<˙,Sđe[ö¦ôł§B.ĘT[Ěő&ŞSD¦ŹYm%ÓţQŻżnÖΡ:şý/ sÄ&Ţőçr ­7űbŇ“”2b}"Ôo÷S-Ľ$˘÷t?ąŃłŃťjC†_#îśA‹_´ľJżÓCwҡx¶zł:Ýh«ă,~…_Â5ŘĂŮŕtR2n–X–çD:ÜÔ±˝ĘĆUWÇqeZxÝ8ŕ.;kťđ€@~up`îxHfüfąiăÂĘ’[%IµÖ_;eĘđ'd^ sąáfçdl*üř‚)ę´6É\‚ťâľ _dčyôós+mîň5 Ť-ĽÉlĺŚĐd†xN´s.p±É`!6ë’ň˝ťŕ ěwB7ě–LdôpŞL3ăq@˝[ťË{2đVż¦V>­¤Ś‹ á«ńěĐ](/‰8„ʧ˲ ‹—+¬uśćŁŕ'ÄąWŃ~ţÝ=—b¶óćĺĚUü—kť"&ľÎŐFěM$CyAWŇŽZU ©Á˝±ĆÂŘrtΞŻhäŽë-ÎŃě-N‘;’:_Ĺ™`K4YÄ"˘ÉBVľlĐ4¶ň:>r#îĹÇ#×05’`ľýéĎgĽNäa aBď›a/!Fđ÷dP¤®v%íÓýś¦ Ž8“6·?L®o OH~—Ş™‚*Źt’Áß|9‡"PtÝ4uýCčG˛ţD<´ď÷Ö&6 }”ź© µţîĘa%w¤`˛Ŕ&ź;VSů±|Á“ľuX°®EZ‡…6gY]ťď?íďĂ'ń}ccx%‘’‰Ěkds˘ĽYľď’SÄăú*΋w kwKÔř˘É”oüy@hOX:K:çÝň5_”Ď‘5¤Ĺ‘\s}ҨŢŔ„ďˇ(vJß˝´+dăńuĽNě±ó@‘˝–±©H 8¶ś<‘0Ë ŽĆ}Ţő†óBsĐĽxnBŞŔV¬Ď—˛Ů§cm»¨ńŐî"wĆťOZĘ=Ö˘Łˇ Tí˘"âCŻĚńNRJ©Cş¶Ř%üěOË@®ÂŐ5·łÇ'6q›o™#˙ą3o 5bUÓ벧Ą‡żTŞţd;a›­Ő˛ěl†€ĄÁtA–N%Gú9­oY¦´iY¬Xýý†§ąî;ÖYI™Î_w#1îw]{Rh ­«nť7O(ÉŘÂbĂ«NkŠ„CdFăó'MLŐ–ř˝ŘŰŠŻîM#Ö–$µPC*?G2J THÝë˙D> ‡~#´DQŐţŘbwívÚ[Ł(đOC“`ŰŘ@:(Z[MY„€`ç"Ęz–8â¸çd25ă1ČD\4qŃőŹÓ±)ÎlaJ¦259ˇd;ći߆×ä;űJŇ}D FŮëŠ2•jíhÍî¸ŰpQŇ˙&™6K'cA;ĂŐŮŐ ą&Vc…¶ž€Ô× ˇČsD2O•ÇF-ÇË:ynEqťl7“¦"n˘űŮN5ĺ·ęčGţUŰ0%™Ó=IY“ůŰ•pÓá¬{‡…ťĄą“-¨0/ ŻŇĽľsđ1ěsĂŔkă8™ ­×&¸|ÜYonŔS}Ý-5EöĆ5˘Ĺ‘î‡*Çr›‘şCŻý>Éą ËĽ%YY¨Ŕü ‡‘ätQ 5ę|Śť—Îé˝/¶ É@f…†ĐfŹnh«> ¶Źq2—ëFl‡rëkŇĎ=ROw™­„EJlĺ& Č": ÷żűŤÁĺIźg#Ojy‰ŻĘIŔOś‰jÂŚŻÓ¦ĽíăÎŹ0`Řä‰řeëŤ}ˇĚÜQŠĚĚĄŘ#´p9¸IĽ,ŰÁ뇪`Ň–CKĆj|Gl™jEş-ŻąqôA`‹~Žm">c›0@k7‡ëĺňĚݰXLřĺ§—í\‘´5íŁÔ‰ŃźUWęµę…ŃYNyö‰2&ĘË˝bÄŚşż?ĄžwîĎĚŚîyţ€cd«IĄË/OĹ“,]2ńúß¶ĹȱĺŻgŇyÉEbÜέIą‡„›HYLgŃ%­,91űś?uH(…ě=×!1¤GéSCEOúŚ«kŘú–Ź—ţx#řűč›T[Ë!őçÚ6 V÷Ż:~)úžňU—ţąÄŇ@S“¤Éa¦+ĹJSdp§ŚQov+•rÉyx’”Őĺ ‘…±#ŰjgDŠ^äz֌ȱOą3ŘŚ˛˝2Z#ňí§iʏ$úô8˙ş`Ţ(řl¨la˝Ě–÷ËëY{]UM¤é*ÇĄuď‡Ćs…#‡%ŹĽ¶ĹFQ_¦ÇŹH ő¤úo ĆCĽl`yŞ/-ť_6éŹęĽ˛R+؇ŠĘůáěn¤ŢąJ„ĚŕěîÉ‹—H¸7˙śV}Eď¬ňŐťŇGŃŘ<Ý q5őŰłŇĹxí“Ńfé2ú»Ď9!‘ţ8ŐÜô±$]“ńÔL Am „eđ!{ářÉeŰ'– F*­ÚŁ42 ä¤,!Ý+kÉűđl[í3e4ŐÖędŽWÜ;ś…ÇĐĂĽf†'̉4őú\É1xçŃZ_ÜzMŕNjP–H•BŠ™%Ć‘îBĐ*v•n`Ŕá_~{č4rť ŠQ9p©–ëmZ ~·„jćדLx¤™ 1µŻ'ýňŤ2&dNü0öţÓăf×Ůč§ {p{¨¤aůŕ†ęÍ~Q7i&2…(†ąŤuÂ+ńÉH¶ ˝_#—dR÷ČÝ!@_†ĎVë)ź´Ť§?KâxŕĹŻ {‚M!émÇłëĆŮúß;÷· ”fFâ—u6vçí~tghť¦ŤF%4n°‡óţ®}«9f+×…+NUQ"z1¸›ţIď”\qÚŕpFk芚AúĺˇQćs×üejŔßG Wí#ž–˙Ţ+[ôć Ď‰pb{éJ¤F®3Ă"@q§ťę[\ÎśŻ˘kääjÍsچ/„dŽ 5ׄCmć®TsŞÓs§v•}ř2ÎÚU´ M#Ôçôę4¸Ţ!‘Ä–vŢŮ5µŚÂłMŐëíÉbŻ“+b=ú (ć3_ÚÜjćßQńO];+ËmYŕe7F˝7ŞĆĂF1†Ź“¦ećŇËľľ6߬ä;_˘çYąIů­É #ŕó¦TŻýö!ť$đ5O÷Ö'ăŮ$«qžÎčµ=Q%»?µ¨ ’ hó§`·ęóL›wČ.?†ÓŃá0r¬^UÁ¸fUĄ.·}˘Ö¶ux‹üÎZß@3©¬Ö2¤Ę‘çž.§•oZg‹Â‡».żřĂču˘LJ™ĆŁ ¦×Qle\YwĄ[ˇ™ÓY}Ď˙^ĘͶ›×ăgűăĄ[UMúG΄˛«ýzšÎűW6D8Ř‘AÂźŹ,ĽNc}N{â7đű^Q•¤MŠŚ‡×Żd}˝7&2f™Z–ˇgśçlźď×řä/§âďČśíe٤7IUw7Ł|ÄFq8 ˙q&şŽgÎç4?ď:oĐö7˝”ŕÂ`č• Í¦jĄzP ělĽ°Ř[ŁĐ-H7č׫ČAsŐ Ě¦mť^šďÍnt… Ű„J‚´-—pUmb„ î€YÚ1şň‹SS®‹H˝P“ăF͙ڌ~dJ|ś7r„:dí_CÖyß*n#x)żČ_^@'­ÎΦgnř–ZÉHG%‚•‰Ź%*ŤÖ˙3RŮŃł„¨>¸Á/7c”»o~L=ńóŇiľG m˛5~ şěą7k+Eú'‹ úÎÇ ÷ď)·_đĺ¤~¶#W«HŔVôŇ}ÚŇ»°R¤ľ1‚ ĄŹŰôýٸV˘âń]ç”JMI¨a”ˇEŔÎZ˛…O˛ć,ňPË•ľő+Ţĺ]şçĹ~Ru&˛ ľÓ~m şÉ3b%ď“*|U'Ça؇!¤Xýňĺ(/ýzµŤ^â(6°nŘ=ö¤Íë»ó‡+aj‹‹Ź=äŕRş›>_Č äXz̵˝ĽěKÓus[^"ĂËďMŚJkdÉ{YŻ‘~± ż:Zô¬Á󟩨f…öč‘Đ#QRČZ(ÇŃŃ|zi84Ý©łç ‡Ż¤Ů„‚I|ý¸ë¬+ř üţ‘x"mxą)ÂŃßwťč0ĘeĹQ `çś~Ć_3BŠ_ ósŢFZC›p™éI9‰î ?–¤/ŚńůM<ŕ'Ĭ+Kś´oŢe7sú¨)đkuęÍÉ~’!۰˙ÁĎ•Ďrĺ8e*›•ĄzMÄö-S˘°żvŠvţ’ëł*c3î0s>X“#zNx Ř„»o”05’ąusÖ^:Wqµ§o>ĹřHjô°’8ţ±€6w(ĹÚő”Xj\łđĆhrT5dDĆPŤ=’µJ•+-‹;l“ČÚ Ćú6±c?:i‚O“G.Ç­‡óhżśE‹CČÁ>u–»6ôRáˇSł´öq¤Ë%€‰Pö0ňál!× nţj q›P>ęyg:Ó\í¬(.r=§UKá?ÓćŹď®…ÓXÜyČßmNec)¸¬’:ň€O ‰ś$%dk[뉶L•Ą]rdĹKĆŚpíه=śfťýăä¨˙]Ô+ÇÝŮbOŽhä”T<­› %Ďël%wŻ2ă"F_E6rËTaJ8šZÔ’nf‚T€ âđj8ĹH‚éoÚă¦G˝ÜýJ@—Rmi+h(ß8Ui|7äç$Ĺ› ŁBDgť#˙źë©ÁóÇ`Şčč©c¨XşPčŰ‹ę€LZrJmµ4v}©’u€˝siĐÁ|ÂxŽ5aN2ÔóÔO}0fŠâÇäys )Áçö_*g`?ÖŇQ1Íy–hC8#uÜ2R Ô&¦Ŕö%ݨ:+ÍYÇËDń Aĺ2'\m§ˇgéoFć]R˝Cyç^Xľß HŚ^凰Ő?_Vr{¶™€áťnżq[fŇŠâí©î;Ł9ăúÝ'©U˘B †QR'öĐŞýŹZůFâͨRŔL řIíŁ}ńîJF} Ő +yłG´QŰĆ„şMćŁ÷ŠSŔÝüv‚î8ňÚߣ˘5QÔ…4ĄsL¤íĐ/W.ŁÂż„eţîgŹj˙%‡ĺ©fíŹYÄ«"?YI"bŚ(ď/I5Čh´Ú3!3u˝/1 líÍ5ĄFßĚ1ZUî óYK­›_P‹¤X3 Ĺý1JmµÍďá6pH<ÜŚ‘"ÉŞ‡ µa c$,ŰŠUW¤‡ANeé TÝÁpsŢ?ü­ô[Ń@Ě÷rXŢMůŃ3ry”¤8ű“áĹ[¬ĎÔ‰ďăąIë%dNŃ(đ{uřVćŐj9‰Q“đ•őúb„-řz lä­Č''ä eĆ2*Š/OrN‚h<Ů«ň…K«\ú—q&r7~śĎú„Ąň›ţ§ĺٵä€Ç1 uĽąVTĆ–(!{ľ»™J5â˘&ćËSŁ3›˘Ŕ€Üú§ŕŘŻo9O9‡ŢNT™^ׯZč#€:óÚ\ú‡đˇk"ÁÜĂ*ŻpŚÄ€¨ŇJŇV‚ĂŠ±LhÉ˝)p±ÝPäËď-TdúĚ(ź—!YQşďÇí™A ě¤ű0*ôz‹nťX ˛­ŃâÖ±őUüĘ‹4Ń­Ué–ߍŹ]N˘/ÍHałž=Ę;Ă”H‡oݤי\#ĹašĐ3‘xŐ_i©źs­h>ĎiˇJ˘đ>ýÇOMZľ¦źČŕ¬[ŤšÇ;ď Ó’üµÓ!áďŇżcß×D?‡[’qÓ‰­ľt:'˙ě¶âú˘âP%ű*9†ů-­Ô%ŃboĽßŘáxiŠłüń3ÂĄ¬˙Đî§ĹŻ×ľS×yq‰ˇÖ·Í@O—j^4¬źd«±íP•›á SWĐÇIĺ°řäNŐxQŁěśkµONćaá°lV#†Śľ‹ü ćî^wŢU>‘=ôsdÜÔ·–ăÝŮ×tĘ"úx*„îČÚĚ„Ą_µëíął¬ő…×RWń_‡ÓČ-‚ÁƱĽJäjż Ě2¶ÜńmĘŹ?E­-ŽthśP`Žwč›Č˝înŃ»¶)¦şW¬Â˛”Ĭš´­EăXB7¶Ť™ă7š?6¦Ë+HKvĆ5)!iěbř˙ü`¤7|€ĺ ň.“3;ĎÔŘŹ<\í…’zł;ĘOč…¤Ş“BŞ\­ŕ…UVAe¶ńI€<éĎ…Âň»Ô'spŰᡠü+č2ń)%ź’L‹ˇôyđő ‡ľónt÷Äĺ9,;Ŕ/ď×$.ő“¶ôcĹhšĚb¬śÚä&·COýeâ…fzt^Ź.ŽF •ń¦|)–đ:śÎ÷ĎBąiăLĘ ÷ŃQ>g”á†;­ĹoúĎŞkż5‹W7Ő!9%jÜEłŠ…ŮÚ;ükp[E[!†Zw2Pźęޕ͓© !´Łqű"Š4§ö?&zoÍ Ű©\g¶¸ś–ą’ęřÉcOŽW59%nű5{Ďg]F<ąîth”m”ů´"ÍB‡ AŁ+ź´8kQO("~1 Ř…{©± aćlĹ =’±˛ľýő,TśAöA»{ß„lĘ+¤µZ?g.Ń´˙l˘nŘçŽŕö E í,n”ůĆÄ˙H:¸fűÔ«N*_1·łúřäjddnŤT.ľßq~ µ(ŕ-ţDćĂć×ĚűFŰ˝A8Âܜ=c„TŢ˙ŐEÔÄ]ËN¨?Ż—˛(q™Ćľ˙Ć%5Ŕ Á/qr€#áđů‚Çé.}N*Ößů,é)Ą{ěřl@¦Ë óČÔÂüŁWŕ—´%—X0¦înŘŞ„ŚjM é&pďPŰŃެáűNŢ‰ŁťŐş;ú¸‡qíµŃx1i\šĎşuH©ŐY"n˝p‘΀±®M‡Ć†°QZŞ{¸(qE *kůŰUž˙hđJL«$ŻĹa1…ű ™ŰO @č"Ú!Ç.ŰŃŐú©BU•¸+°ŰžţŞ`˘ Ţßĺ­=9ĐžaćJŕŞ7q)ß?„Ű&<ž†­Š& ôT¨_PĐ1‚îî^ÜôĆ2 ˇLĽxţ ŰNŻĽ'f¶×?;Á®n*ŤÓ+ôć:Ćs#„|úU«Š.˛tA›'Ľńô AŁÝ>ůˡB8or źÄ™OyQ˘íĽ#!‰.ňu”}@ *=±‰Vk7…?ĐYx˝ö|=eBFP;ŇK72±p·ŮŃŽBď4—÷+ĐđMĐ"Ţ~{(ěÎDéUĚŢW(–# ţfeC+á0–ńYň×RÓK1ČnÇaQg ľhë&ßŘ<ÄŐ‹ťr¸~ĘáŽŮĘUÜaD&|ť4­’S€‡Y /°%¨  &ÓđîÚ é̸Ę,ćúíÖ S÷ěÜ[ÄnŐI_ĹAť8Ţfů§Ŕ˝î1ôŇ썶•5)ĹŐeQ7ŚmľkłH‡ń˛q%D˙ČgyňU8źËWű52ĄŽ/)5|vćNn,±"&I˘fpÄHŁićóđ˝KÉţyő‚[ĎĆ`‚ę‘F®‡:Ťé\”é/Łń „áđô=<ÚtbOzN…Ço„_ůM­C> ŠRHýbquó˛J*/v?ů 6+>¬ÂřK'#éOąËĽ$î«LÁÎA@0ľůLŠŞ€-¬M€5HTe7l»ęLötMxÜ{W‚+ÄNl}ŞÄüe­ńß&·!·m‡ę®;q JÜý»Q.§R:jŢIÍ@źľ ˛Ľâ’©r±Ć}ť,ĚK¦`iĘO.É7âju3M—mů0Q‰Č’Ë Üú}_jEeKXú6?čď*őUÚŞ bt'“=Çb©zO'sNo˙…ůeŔ†żÝ~^GĽ‹•rŠ…g Ó±Žźđąž+ ćŞţś†_-y ÚČjDý°ĹPvÉ*S]±ąRżó¨D&ŘƢ,hzřă3IxŠôJ ŚË±ÁÔ0KâgEç„{dŻcc‚ćł·Ë’ŃĽ1»jhÚŰ_G·{{ˇž=ĂZKÍć=Á]˘ş?ƶ˝ˇäú Y­>y÷¨]J0ÍéD Ĺë‰üŇťU™d¸ Úń_álĽ}t9Ť†ű¬ŢOăŔ”îÔĹuC‚ŕ2z% ľeż;]ŕ Â/ű)Ŕ9í´ő’‡ř˝ts㣂Ž+o¦dU~Jˇ5v[¬›ýHÉ÷CÁuĐ6͉VĐG¨z¸ňđŤďŽ„ôő» Jł¸íjPřĆ»ś"ÎxšĐN$rĆ ’Đ(&Ţ•JS}Â*Ő»‘s•‹ť\~„Ăe0ď ŤŇ–Ź¦0i Ň,ôY­¨í‚ŕłĆ=}›}oę…{śÉň_'VťÂ;˝űŐňýÔ6Ĺ÷ŃiWľc…ŔY Ô˛/»h *>óƲ ¶ĚgmĂ4ĚpŐł·ŠŠËqʢř~0ôŇi|6Ůy}ęěř”wšźů¸U? uđn'^_cvjZx(„Y.­­Ll+g’ Żb–ZWíş<ÜŘ~®úÁ,Ë[>Č€6Ż«.Z)ŇB‡şaWN‘3);ń”ő»Ô\żŰB˛Ťy‡®AĂáőŢÍÎ[iPDNCňé°,©s+¬jc™ĘšDĘ–XśF‰Ť u6›%‡SęÝśB°ĄÜ_ťę™ Ž™ţ‘5]ň=Ň>śĚĹęQXüűć–85§Bj ć|"ć’šŞö!é>&@ѱлň]†8@w!˙“O° =n¨B˙lJĺ:˘…řťî’Ü˙FîϱąRĹÁF´MZń0ň¶? ©(1ËĂçôíB‰ÇŤ3ë] ô’ŘIMЧ’'\1„Tş±P‘"'ÉńŮ~ Ö#űńś+nóźř< Ń!CäŻŢO˙Vú{%8Ű0•‹‡zćM¶wbů Ů˙Đ´¤kIc@‡ĹuŻĽÜŔĹPâíS|ňˇÉuëaĂ™qß@ ?‹ ź"SÄ•Ä6°™#îyÔkŢł˘čď“§žŢîχrŹ—N6/Z:”WX4ę7Ţ?EKŠĽ%Y>BuÜĘ˝FGvâ©2WýČÔ(—ęÇI˙f.ŤyĹö˝íÇ-Ć-EĂUCÍÍ"‚kůâV ą}1¸>q­°D˘1MÉŰý ý®&“Ch¨ Ů^k‰“M˛ŕŘK Đŕy:őÇç/Ô ť-($BGüXá.ž°ULź¦k˛Řî={X°Ý}báIu•ŐV.ŃŃ“§Ő•ÔiěőL‰T{ŹóLA bąTÍřÁeűËń¨AäĘö˘öb­ GÜÎ+ę]]zýóőÔń©OGWÝŞyéżLçR’ę§žŮĘÉ‹Ěkîw›µ±vżŠó)7,´Sˇ ¸e‡Ź¸[ÔcIĽ›®•LN‚ÓŃ`[Żs"‘ 79±,ĘlśS‡[¨ŰýGJű/x®™2öí}™Üí Žüë˘7%yI(? KŘţ-–®…Ľ%:ΊŻTăë?9*¶9űu}§jŐŮí7l´SçŐCd;!•|§wî÷¶LÔžÓ8´ĚN"ÚU©úŰü‰Sů 5ŘGg©¦"ŔVĘŽŰj8^DÇ ćľ¨QéŇKqĺř´ë9ħÓkńál@ß î·k«˝ 7 ݇«ëŘ´Ë ʖľÝ·vŚë ——q“w6«„“čqjŽ€ź¶ěć”đş®Q\6Üý „Ńńo7̧嗎őŮŞĄŔ„!ë˙„Ř/JŢ=¨čl h…Ď0r&šTĘĘ|j‚˛»Tá ßš} öóQ'˛/\‘CATZ‰HĘŘ1C¤ú}±ŁľŐÚKRX˝uzźc5ůĽ+€;®öűîń3{źÚĆ(7Ĺ!8nŽQńńdD’(|LŞĺśéSEĺ~sřě™·ŠJ~Ú!ţěúFj–î'qN†@^ú á§"1ű›ŠáŠÇ1°ĎŔµPvlLq"ÇÎéÜ&t'»doâÇ7!O·x… ? UćSÄýüYnNc’‰A«B˘ |Âo"]Şć]lťß"˝Ç…Rä,¶RĄ´íšŔÍŘŃ2:MٞxŽŕ@Ô”ź™F¶Ż«ëö5?^´°Ś"*Úż‡$E˘˙č|XŃ›cL‹ótŔ ęÝ˝ćÎŇM”¬ýp)ž_˛VŇůă.…k%3¬ďq`ç̇â˛8*Ä ůÝ.Ňiô:Jţ@-ŞůY&ďÇ“^­¶¨ÇŽ‚ą™FŽo~Úes¶lˇJÚłĘ!‡\7íľęU×÷7‚‡n+ôNťhĘ ·w Š<şFWD±5§§Śâ.śČ›Ŕc=–±gkÂ_le¸i,ĺ Řâşő*îĺN‚2ĚY#_‘í4ĂÚężŘŮúÔ—cqëŻMĺ„^hżqaŁ·„~ęjęĘ3–Wş ˝§ňBńsó’üc{‚0ŰÖI€×qď mÝó𡡣!oË@e_µ ÂĘzC.n'p·§›×qí‚ĎĆďŻöNÔŐZ§ú0Âv)DX©KĹŞŞ·0’=šOËiŰńA R¸°E)–4Űô<˝"řzLú‰1ďبŠkBdMߢ%)'%ŽîĐ;?—z©Ă‚)ŔüGůűʬ8îÁ_`.ă*|Y1Fl¨ĆRBÂÝÂô4LţŞĘł%ÝÁ@”Ę!óĄ•&GC™± é88B§ ®śŠ¨2ÂĚ †¨ !Ź?ž]Ž·‚+÷ď»ć•·”E^Ăáî»V7šôI?Ęájś%¬K Ú©^ĹI”ä¬úÝo:böÓ“ĺöţ^źŚŢŞoX#M×SQňµ!Eăol{¨.4*»îŞČ?M¬<ňŽJ–&-ŐwÄ;QdŽ0Ž­%ŮóµíT^řŠB ±MÂvTJń±|éOŮ1Ř“;I§ę.0*š|j/kĄřxŮ‘–\ݬ_ą(ŁĹe5Ę÷b2†ě 5X7ĹÂŦGCťĺŰ$¬VuľÜk­O-±Öźëíyj;ŇŢ·˝äŠ“¬‘ws\-ń¬™®űł…ăľ‚€e.~UŁďJŕ?âŘë8qÖ šxŁ]š,„ĺ˙ó5k'ô’˝Ö–@Sě“*T~íRßý×9WÂ{\ZZ#\Oč…‰đ‰Ęá7Ű˦şděÍh'Â"YČ3‹řŰ%$ É5J@Hôž„ą×ëeüĺÜŤ‘¶±ÇÂkÓ䏝`N5dăŽWN1u&Í["˘:FăFGR7­Q-g(6ÎÄĘŢž‰Ő^ľ+›G#Sçoö'ÔÜ Ň™‡ÖŹČfłŰýZu4(ć ?W ȉȫ-uhUßZŔŔ…”_Ř»&Nł0Ą Âąo&Ć“ş‘ň\N´s ĚhQâ’…U , [h]^’;,8÷ŃăčcË˝|7‰ČđľÜ;Vż/#gS_ËťvC°Wü4هFŰ ÉĚo3¬–4L%µ‚dÁžkŕ<ăťý±%‡ţ:}fóŠC0€0Črv‡ď§ĹÍéuŢ©ćb’šš•ń3Á6͇ć×eXîä`ŻVËŔ‚áÂčÂđm~‹Oĺ˛9ŘÉW7~É&E¸ Ă•5ż…żf«D6Ő.b{©á·~i?qmk9ĺęf'-ăT A-k-hđ—ţ±?Ĺs‹·}e†…Ş^Đd“ĺSŰbf Ą˝SJžĂ aŁúâ§.Ť OÇžŁŕÇö˛RšfĚCﲄ€lŚ@ä/7Ž ¨Î##ó†mDÎ*ăioR (ŮÂŤJć‡nÍ‹Ô1„pâăf&EÓ— BÓKÝęşH‚z.ßi‰&žç/ńÜ…O¶}AÔÖ26Ťđ¬~®>gşňóq ‰gă0Ó(¶ř¤ă‡–uĹMšĐs×EÁ÷ 9±fß«šh›úCNŻŁF˲ľî|ő¸¨±-©´Ířh.€Ľ»¶[ÎŘII9IÚ-AUc}Ö/ţáË»]ÓíŹéUAŢ|ÄÉĆ@Ř %¶©ÖL COŁ0G®y4ólWi˘Ë;ŁeŘ ŕíŻ`kk ýä¬V+˝›ýtéIą‘Ď4‡N±€* qÂý§źćĹ%Ôh5”ΤHěMuöÔţ•ŐşM*&e˘M"ę«[ر0Ó}#iеRŔs˙$ÁŚ”]~.¬kúĂP¦÷âÉ#Y­ °á0ŕ]çyfLµa+řă|™ÔH3ׂi—Śy'jFs nS LŠAQHńÝ`âEÜU„Ä Ívfůţ‰ŔǢ¤noa5L™Ik»Ĺ¬@<¸®hÔ{Bŕüđb,Ň9Ű–(e:»A˛ěá;?i˘›Ű­>uZ¤|Pq4ďů¶=ńŤNűxţM­´.[InĐyI€™Qĺúň¬»o˛ěb­SÂÖyň+ʉwíšIAÓý(y˘ęśŽ8ćhťp@Äë{;EY{ŕâ>Úć,óq.]÷j@Çí łç€Mć˝ď‹„± ąŚş‰çzXĂĐ1E9çg¨Üi,füďŰ蟪ş·Y<× Ó/đ~-ęAqž=|G¤jńFÁ}É$Ś@ËŞľu„î‰I5rɇ‚H"4Wĺoľš•iH©ô˛®/mővŚ9ě ň‘ýd1Kôź MĹú.J2˘#Ĺ&â÷ł˝Ü´‹&#3-ëD`Ô*äĹwvHţŃ×ĂašBâ¸P4H¨h2ep‘‹!l2s/rŽ1¶uÜD¬T.*#x7-™Ó™ýZq ŰP olęŁ@ä¤BĚ>‰–g^Ňd:‰VďV%˙+‘«Š#"b·`…ěĐ:“`ű­ÔéR+é§iMtźGř/ŇÄžAYÂÍń[“ –ěA͇öéK´Ér6ƨń® ę2w4çF•®ťb—ŻŢ€g‘‚ßăäuĽ„`xf c)©¨¸çŹ`:t´đś:óqZÄš)Ecíú‘ÚőTLRÖ=× H@ł}뢄ż'˛™ŠIM2 jńϸ›4-#.ső+Č~źKy»–Ĺö«wżáĄ‰˘çĎ<<1'ĺ™ŮňF‘Kfd0j¨† ¦ť~ö¦mkU¤"E4×’2ÂĄăĂÎ,Öł3–lاŠh?ŰÜÄ㇠NÉŚ^ď^wÓ¶Z…q‹Ť6*Şî´ü.Ž•P°+wś>Fî…{źľfPťą¦Žt­ď:ŻF°MF6 \łW˘,z\¨‘Ţ@n>źQĘ,ťu*'­|ۢ“ĎĎĆr»AĆ/"}LL}=/yűµ|üi»t~%Sőćš<MXĄ%#ť:k›ăÓĘúĎŰ9˘'-D=*ę­¨—4Eć Ű˝@ž–*#!:Ŕ˛X˙pž9rąŇHr+d»ŕśŚîJ˙ÎÚťŮ0 ˝źăÖ63ËáË:äýÄ" ť\4Ć2š'Iü çĽů!AbR+Â|2O ĆźĘń݆\Ý!ĺ»ŕB‘˘VdCôř ŽWgş•Ő^™BŃŘdEéŕ)Í…Ę€Q\ě‘ă=]`ďÚ›¦¶I}ľóőÉ2Ž`LI·MJJ |–×öó4Ż9çúC9Ďu`ж<ë{­ ä¶<˙Ź-o˙X»Î/*ďňţsOí8péE›m”t¸s`ł‚uÄ$…SnEu=ýě㎠endstream endobj 930 0 obj << /Length1 1630 /Length2 17903 /Length3 0 /Length 18747 /Filter /FlateDecode >> stream xÚ¬şctem·&;ŮaĹN*¶mkǶm۶m۶­J*Ű•Żž÷íÓ§Çůş˙tź{ŚuO\׼çkŚMN¬ L'hlgh"fgëLÇDĎČł°1tqR˛ł‘łă”ˇS21sü•łÁ‘“ ;šť-ělE€Î&\uc€‰€™ŔÄÉÉ G¶ł÷p´03wPŞ*©SŃĐĐţ§ä€ˇÇhţz:YŮ(ţ>¸šXŰŮŰŘ:˙…řżvT618››L-¬MÂň š’râJq9U€¸‰­‰#Đ ŕbhma±02±u2ˇÚ9¬˙}ŮŮ[üSšý_,A'ŕdobdń×ÍÄÝČÄţ-ŔŢÄŃĆÂÉéď3Ŕ `ć´uţŰg;€…­‘µ‹ń? ü•›Úý+!{G»ż6uÁěśśťŚ-읣*ý;Ogs ó?±ť,ţŞv¦-ŤíŚ\ţ)é_şż0µÎ@ ['€ł‰»ó?± MĆNöÖ@Źż±˙‚Ů;Zü+ ' [ł˙Ě€ŕhbt4¶6qrú óűźîügť€˙Ąz ˝˝µÇżĽíţeő?s°pv2±6Ą‡cbţÓČůol3 [8†fEŇÖÔŔÄřoోýč\M˙Ő Ęf†ęo@c;[k€±‰)śťóßĘ˙;–é˙űHţo řż…ŕ˙z˙ßČýŻý/—ř˙ő>˙Wh1kk9 Íßř÷Žü]2@[Ŕß=üłh¬Ž˙? Ť…µÇ˙ÉëżZ«›ü;Ý˙¤3đo[mÍţRĂHĎřoˇ…“…»‰±‚…ł‘9Ŕhý·g˙’«Ú›8Z[Řšüĺö_mĐ112ţťŠą…‘•í?$°ý[ebkü_+řK׿ňgP““Q˘ůß,Ř*ügűżąýŹjdíŚ˙çá!!;w€;€Ž™éďýű›'3«Ď˙&俀ţó, tv´ph˙­›‘é_Ő˙Źßžt˙ ڍ­‘ťń?ŁŁě ´5ţ;m˙SđŹÚČĹŃń/É˙Z«ţŹóżćŢÄÄÝÄncŐÎ;Ř2=+Ăą+otZD{°ź |4Äľ¬IĄ¸ĐżÖ®Ď/=|źłĘŕŁ.„ľy–ëO‡ÇĘoűĎc)ęźăýÖßűRM® đ}H© Qv(ş~Đü dĐ+CĚ8WŹöş^–ŮĐbgTűy0­¨¤WúE0ŰĹâsýLĺOęZčŹNödŹäk”Ö‡Ńý­µľč÷9EŇŻç§ďĂcŁ#}·Çx4ąq°äÜ@,ß”ßÄÉÎŽMF ß\8UŻd·©×˘$©şy⽯ş‘=ĆîŁ1e\˛š} ‚1 ¬ĆI»]……ÂÇ2'ňŃM Ď©Hé5tŻJžŻło^4ňqĄ[e­sĆZŔź4G­Š§“łíţAQŁ^ÎŇ M0–Pcäř–ˇ¨©Ĺ;÷µ—ź\”)J Ţ˘2ů@ $FŻËه†·¤F%}¨!ç\n”ל.†éÄ-ňÁ‡Q@@Ó2”ú<ú úM©‚5–˙,u§S¨rƲzqtš?˝%¶ĄÎMúęśĺ ' EbǦ™+Z2ŹüŢű>EŻ­O»§7]”-q‰ß`ît°YşôĆŁiTS˘÷¤\–/V.ß—5Eëüiٰn¤ą™V;ę—Î~^v§PjV_$űa27Aŕéšó•_µ u1Ô=Ň i)v¤UjôQźÁŚŃúLŞV¶ŔÝĄ…­mÚřR)jg¸~ŕ'ó1ł -ü¦ć–\ĺ¶ťßaEAnëíęšµźźWAzÔC¸ňěŇß╊ĄąP˘cß”aż=ç •˝•o^lh5nTK ž Ц2ĂףŘ"…Wážçę®bµű$“­8eg"C®Í-íMÓW#nLZĄ1â'ŃX"“#RĂfóÍ& ´\?Ä˝ÁIíŰ“«{=:Ócˇ‹  •óAă›ň˝ŕe±úK d$‹¨±¶~pqľÜ¦/D{ÝĺS˘<]~Í«Čń«-‹“ľ­»&ëA´ Ç]Ü–߀% ,ß…b1đă×Áň@¨-_ $脜nî™LÎ=^űO‘“°»ĂŠĽőP­eą*a¤ĄĚţt=)zĚJ:Ű!nN»3c&˛m ż]ŘĄułłë]ÉÁ ‘O–zéâß3—M§KĎý9jZƨՌ±˝áÄŕŘ ęY`ł€:±Ţ$Ŕ2_§GzŤZLá’ÝŹ2q¤Ršř} äĘÇ OG•újlĎYŞjË˝âl;¶™Ş¤fU¦ěÜ…7ŰťźoqonâçY-3 TxýN,L[Űż}e2ÁÁ&",ńiçqpףXćëŮhج“Ň}7€?s4G ĆŁĹEěđřy(‡äJőżeW©ü)†!?yű±IĺÖpúp˛`?H©—vĆ+Ü3d™~{˝ |ë±q?ü¶iö.S›ôąŐŻ$dË“"Ěő͸@é±9ÚÁíwĆ)H(°`łŽ“­\gőŻŹŇX 8%IM™A [Uxâ0ŔŁŃ\Ę—ULä9•đ–‡Íb(EîŚÎ˛˙rĽ×8é¤WM"~דůô[l—ŃČÁBR„0ÍCŁ >ĺ!ľ›Ą čtť»Ó:÷žş„ä3H?äS^ďĄKŔZĚ»)J-.®’nśZ %ŘłđóX×ßĐ“Ś+~B"Jź +ŕâJs€”„,‰rźśOší<¸ˇ¤‚™dŇO)(']s~g™'âĚkdŤcŐ+±É#{ďx§–4[>ď‚]dkţѶú Řp­ˇë7(ꙉůC†Ő2ě\ń 懝—JCÎg bz†é䂾ŕs%ÜĺFťz)3Bk9¨G¦ç€—-( -Ďz;Ä|ä*łQÍĎGĽ ŕë¶ĆKL™¨çöRH@,pŤ®ř°Îőˡ±)A´¤,äř˛¬'Š5U‡–É–Ńź1*ÄoËÚ@i÷÷ iî3żÂ}o§7ÓuÔaŻŕ#ƆŘ"˙†Ąëý‰µęĄ_użž‹]rŃ!fb"č ˙´Ż"÷˛'ţˇnQ&7K&·[,ťÄ#lmÓť¤Ż¤Ś}«’ć›fŘlńúŁąŽbŃőXÖX#ő]f’gŰŇxŕ­›B•Ťô˛MmLó뇍p‹jzž4gÜş×ŕź(ô:ṗťGTýoßáq»%Ż Ľęüąßoĵ֜źž0Ýś§w÷`ĺ¤QK$ŮŘ_@¤{ĄbYČtęSwú©ľĹŕ˝řĄÓ4xĄU¶›ld™v±Ŕ"¬†µR“—žĹĂŽŢ ”s~ˇ÷É«ĺÎŞěMÚÇ$®O°OUr>ˇőj‰’áëÔ )"3ľG3]ŽĎă+GÁe€'Ř3ĚĎ˝:Ą¦ˇĘŃ «u™4*!éóá‡)š0đűě—â˝eđi›ů HPŻ~Č#ýPÍěźŕ880N´<3{¬Śď»Ć@!íđóŹ|íŮĎ.\‰ŞÝdRb¸éźc&Ĺ%p“7NMęDÍÇ„Ą\™˛]Ä)B+ůňîůś™ lqŰrhZ?7™äÖ‰ßÉő>ČHÓ¬‚/]ňŤ¦‘~z§őH!W8ćś»ag>ŘmĘ‹í˙±ZdGĘӯžz¦ŚB,ç V=Ń|¨ŞĂ;>Ŕ÷ű!ăJDÇ_ÓG5JĘg×? ďÓĺĆINjˇÂ/,Őnźż7&_˙«żÜîxrIĘs7ç·˙ęĽ*ąŃ†AŻŢĹďdsITá·?Ôfőő,řŰPn0`łß›‡(‰D?r8€,]Ç’˛ZăZFɇoĂîXpmĽ)A4‰é{ôcö¶ynăůŇJŮ#ź]n¬‹žoů¤ŢěŢ×ß­µťž©Ă{R±ßÓĽ6ŠŻĚU$5ž!{¬ N§ŠćĂ…ť’V!ŢhŃü¬Şš˝n§ĺl“î ß%"W(ek’ě•]sËC¤«—â?%[ľ·ŚĐ¦mßą6޸tVĄéh}’Ő^z+'!Ľ¸fvZp3}ľüĬľÍO^C`' Á?ÖzwňŢÂG^‹ž°ŽâCČn»˘ł*Ţ×5d›ÚU§-ÉX’kˇ¬"úHŘJľ:ݬ  n6— U‘×(ŇBA,ăÎň+ÖC¶ iÁm»öo‰źPÄč˘j‘aŞ—>Í2öŐ¦ň©×ŤwĐĺţžă‰ĆŘ~fÔIě l±+ Ôkf4rWjĎúKşžY™!kđ(śĚśnil„qôBËólQđµ ZŘ\q}c%v¦sÓ±šá śśÍŃĺ{X?Aש~…+,xăě© P’9ĄĹŰřśDdÔ}Cq‰Źĺ—RŰ~JŽŐÄzüÁ´âĂYÖ=[ç­7vŞßáĚ Ęa† l4Pýi#×tÁúsJF´ąˇBôŮyĄ†pµ˛Ó© :,ăfŐ%D śqW`1°JÖ N–b…}p¨wýÓł¸J˛ăűAůÝć¬}v^•9…dóĚjŢü}Ą5‘É·Ó[¸µ–ŹőčÁ‰oÚM‘¦fŇď{Ďă{ôőŢ1ş’ĄłęźWHŤ8„Bď^ś! jŘögŇyŞŢbň¤[ĹݤŽ%âµQŠ€¸bĆ ŹĐôC}lĄž´_śŇ3lIuT" "ĺ6pĐ8íÉů®/éĆÜ[\ĹKPJĐUűíAÝĎLşŇőf#ĹĎ·¸ĽÔdž÷ĚŰuŔýŹLošď31ĽÝ>Eît6O·{™ŻSŢĽĂ9Ř!eW6Y|˘ˇźZWß©Ž|ŻÝFQFRŻ_Š/Ü˙UJOPębˇ~/•§ą»ĺ?»˝.>ĄÄHFm>!®Ľ,o^‚¶(żE  D3ż„’i¤ŘŔ/Ô]Fűć$L·W—Íę=›NV¦H"n{IShý~¤ď|Ö»ÓÇýĽ˘zNElŽ^náâOĂÁ Ö‰y ™†•z¤íUďßYdÁqřŮň­sŇp©Z…ÝßÓ•ĎšAXÇ _RL‘´`,5ő–đ‘ştŞE…žĄđč3g˙PÂ~• 4źíÁl8ţ«čřuÇ—›ú"ŇŚó×VŁ…˘RCډLüžµGhü2qęË ŽÎ ź„Ö´őF8oČеTä"[ٙŚ+×=CžMÎ:Kő"c€ům0†bzŐ»o$Z·č;¶ş57ąDQ€<ľőä póŃ6„ă扰3áÖś6BýŮŠť¶ň&ŹžÍźH˝Őä’Dëęm6¨M=@q…Mr.כíw _|Ą ôzTe \ß»|ÍfÎ#i?ëB÷·Ö×ú$¤é4 4PŤ˘ÔNľýŚ‘E@ëC/;—qU„jÁ>^¦6ćĐß-«đÓČtŃ´ź›č*pÄQ§6hTŮr}«;”Đ޵{§ď-„±Ţ˛rŹ&LśţG ¬ü8X5)EíÎń“uˇî@­Hi­ůŃQ_â’ vŃÁńݶDů~ö:u˛y‹a+΂´wQ1Jnţ#J‡snEŇ[T+‡ŻEŰMЏâëK Qć@€a®É)K”ĐW–î=^xŇ0¶2–Ĺ”´PCdA¬čSąĽkqó¬d`éľůGK*‚9kűÜxąDÔTGú“úÓ3Łő祆8…ż-ą0­R§fŠO;mř7xř-Îüśň-Njoî7óŇÁľźő+1ţ[‰GGTsÇMh'!ÎŇ5–zÓ‰z¶ĺßríVř:t5éť’˘d!t’vV/˛ßç">ĘžÜ. Ť3Ž“´T’_ŹhdĆŁ2ŤŞ|ńY„ł„ř’áŰź7N/ż¨ôňj˘»:ZQźŹ~”nbąuc xé« ÓľQ”üz™‰‘é!O±Gâ⮆;‘‘˝0˛Höö­1n•r×ĺÖ(&ßĂÓt¨ř‘5"FF}Đ[±ŢďŢ…ŮŃ~0ń’>qqĹ:Ć1zÇóp/•}śLeŢŚ(Fŕ{JĺrŘhűYTšJ,ĺ€Á˙ę«ďČŤ99ÝTü«ž™ŮĘó›§ź™×'y… ź * |ŁĽŹ*ż?o#&~[‰¨EIŽQśh úFú^.ü¦“Úľş«Â÷"Ůą‰0üCp®çąŞú¬ý‹šËfĽ^­_sď"w豇#wraż–qčŹSwíó×X؆(üśéŘ×--q‘`ÖŤâď´GOVHcňT´qsĽOf&+BęŐ>öĆΗp›šVŠ˙ÉĂeđďĄ=|®Xîyݤ¦ď¶5Ău(¶ę+ź›`ÂHÚ#«eÎ2X5ÉáŮ cĆ__ű # !OąÔ٦DN«,™m…«^ÎŚ§´L2k Ô—5‚Ą9Î(E-š)urKŻŕZÇëČ:5 –WW÷}ٶ>Ľý•SŚ=‡ČE?jŐěwŢ÷(LKR°ě/EG–K>şŰ˝YÜ1¤#-–÷* Čáö÷GÁůçR5…XMąć?A!8łZŔQ ˘*‰–Ś—MľÄ36ÚUVI=d ;şUYÔ±Ť.Ĺ]( oĎ@]ކC÷ŔúŐSý:"¤â¬[mŽ$ÎďPS…ě'RýŢ YצŚE ňÖ}Ä5ݤÇk—âB±9đf‘ÍÄM\2ÂL­ÚyئF!)Ĺhôµ.íźz  Ś`ö#NŞwµůzâ·ýv`x€{6Şkţ<ę÷ˇ)F¶c-Č=ĆGm1ť^§ ĐťDÁ~:R§ÔÍ·ÁÓŮ8ą2ńď –寫'ß(C׍Ř}C¸›µÝ!ÜşOE/Ý[?¸p,6ŢČş?¶”F*dÓŗ̌ÝîWć^-ۆ;ôÄMvVť®Á`öŹ\C$B®‰)í´’ľ,!ĚGç­‡pÚÖVŃ÷ÇŢÇXÔŕ•Ń6áZ4fc"1CÝľeŇŕnsÎŰ/K‰ÜÂToĘ} „Ú«*C¬ĘŻ‘ú#SşŹÄ“$r„i;·˛ ł¦—Ő:B)ţs|M˘yٰÍ^™nő KšˇS+‹ĎÜXł%—ŽGöňü ¶ÇdóÝq»ůÇ0 {ZđĄ(X» rĂëĎmn”ŐĄA«=Oä—ŻÂ<± *břĹ?c%4m—¦¬uűŤ’ź6+efkÜňeŕM©¬rľ~ü¸Ş×śĎ•«Ç° OŘHťm5ÜČI Năe¤ěŻßĘ´p{ŃüÓÁźa]XľćűŤ­R›ô$=ď_ÚůŁlúu¤±±Ěy)Uâ‚0…˘ ńK!;¸]őîÎÓZÂuo5;ť‡[ßI<¸WĄh¦™C(śTVÍ cPÍIDŚËÄ5®oçńtíLá‰îŠčňĂIměÁÝ6Wޡ/Pˇłť%Ş.ý`zÚ•)ňď×)X=†HT0§kÂ{ 1|Ěçß§ňŤ©aż\ ?YiźŐ«ř ŔQ+ÁvIŃ'¦ÄŤ*©aÎŰy)Aŕű†wńÄôGČÉcMŹň…ÂĎń¬ľd RpM=“$yĄ$ţ€ďŠŮ· É[Tü)6°*˙t¸‹Îľc‚—i:š,X!ÝtyrM§^ăË·!#úB.Ańµűöv—ŢëĄ/ał–/AŠUV§E śÝŰ#mc!ĚúźÇ»˝kŤˇ!{6xÖł‚oe± G•Ż•öVzôË)ŞŹ§h]¦T‚Ö1HˇĂĚB;÷Ŕü°T[ &˙Ąä»řŢÓ‰^łx&])lVb˙o{ZĺF:&Ţn:]îšŇ_®V‚ ŁNg.ČС'h“51XbdöÇlŁäú÷Ű’şs‚‡ôp¦\ďŹ~Ęú6âžĐ™żŐeăŘíúĎ2 đ,y•´áĆI]ÍţČ”#»őRä5öçÔµ­y„!”iSţú„ ±őYĐ&<-ËjßÁ&lŻŘçá7ÄŁťu3ŘI–Wa¸łlŞ•2C’lA5NĹj÷Ł<˝ Ď”ŠFΉٿb硣ĂaŰN 04grđř 뼣DÂě×üś\ÔĘqĐům­óhë»WTkK˙[TG}W„P$fշ߇g˘ĺsKÓC¦‹jFÔ{ŮÝ{ݤW¤†ŹyH3w…Éną˛)XşRâó…TÓ¸2b`Lߊ¤UEő ”•Ą2~D:Ó—ëŮűŹqpŻžÜ•&ÍüjuBčś®®w÷ů(FDuhđIđ)ĎüCí¦áčü˝4Ě˝ŽYVZĹľxď(iAJA˙‡ń5łQÓԇ㎠÷qLşăŔîp(ĵ͌ćNSŰe©U™ń]öUťNE´ćmŚZr„UµĂ˙Ş*»ę â<ŤfŽÍv/Đp—acGß$Ć0Ë:»şP’A q쬮?-Â4űbµÎŁŁŚüzvęex§˘ !×}gu«ň-ţó őčŐÓ {­”ú˝OÁ×ĐÄú”ű\i°ý•M±|§ô[çÍdŹ·]ŁűY/…÷ďG‘/Bp>Ľ/TÔµy¬}5«çO ŮŚxZ.tgCP2nNcl7ş›?őKä™|†ě§E ôŃą‘‡oâ Í[,'ÍŻpÉŔµc'xöŠöx(Ծܣ–¶\év§É`g[Žé˝ixkeĂ(?ζíôéj"}|Ç›Xa‚˘/Ę/n˛@îrަ7ŮŰčZ‚Żb-·AĎ-xÎĐó…O.’xŚc·y}/"ó”* T+ĹFú&#j rŮŞI¨( ŁxXáxyqŞ ńk­ű~š‹ÝÁ¤ŤmZż.D*řĹ%HgOÓ9ć§ŚĐúxPwžŔ GÍV<) ü1Cn™ĘN,®c„L-äNôJÄú•ç1-–Q¸ÁhşćL›ź‘_FŃ…C#ť„|1â4‘‡čÇŔ7*Z_©Df µtĚľÁ?ßčsÖĆăPH‹ď0S’=ăł4·ú­Ĺ‚.Ôţ-ĘŞ˙¸WűůQ`˝Ż©űëUđ9ľť–ą­pfÎe¤á˝`µĐ!ľüŔ‘ĘŘEń Zî Yĺ]±‹­„UĹŕŰo+Ąwĺ*¤ŽÄÍo” ˇŇ„ľVî°ă —ë Ëę”4‰}@~伢CPjŕ-ľLʍžuׂO0Ă…ŠŽăîŰ[űźYđrŰO?´¤,Kz|RĺĄigůBă€púl-şvpŠh§¤*&pˇÁoćwű5 „“#m~Ŕn†Ą8ě«zňPĄo OyŞ/µ#BgyžŐ5Óâ]żľ§räWŕL)¸îÓGĆQ'Ě, đ‡®üĽńd5ۨ–‚ů ďňşŤąĘYpÎŞâVA©ăÓÎË;Ä>jŢŞíąx|¬9S. LčríâŐ—očTýLh8Ć,Äвˇ»%]ţňgÁN>ëksQe«ŽBQ&đÉă"—¸Žu(ă±Îű}@-•…ÍA;m–Ř ¦…Á+ri.¨Ť s»MY ŐŘç;•y¬ţµnď)q´łŢ7¨5r—,čpÍÂĆzłěČČw©ˇ‰,ű°^3ÚÂ-Đo˝\˙łUe}uвÇj4„ňš?DëaQQ(X[=ŔzǡfCâü«žqhń¬‘ěŘ´f[SĐöŽ’őb5IÎFҡb^ňłŻmÔ÷;vśě¶ßŕë„JEž+łť±ĄśT°|ó›ĎÓ(’rvY:F˝˛ŹęÂűŰ ŘťçĂNŞ1Y J0¸^ŇX É+Ć`ú™|qtvŻRśá‘dř<ÜIŇ‘_Ná-ˇ\ÂźźŠ$AĆĽYe˝/aíÔĂĹühń+Ł{źkŻOIŇĽ±Ś ˘VXY5ĺcŠ0_Đ,®SĎN¸lü ?pÎařqę™Ô˛ÂµFyCl–˘ďËÁ$`R%›ăMrÖę,?‰†ęVTČws #ş ’XŢć}¦ŤwoĂiš8‰ąkΨA´íšĚŽÚř«„¬â¬Ä‰š«t­eČ\đéš,ŃĄ…ž6RRÎh?µ{˝‘é@jBč$$#ëŤo‡ü [©t›Ë¶lÜGäÂ"[)~˛¨”´”0Ç(Ĺ@)$Ńýeü$V €.›6büZ9/Cw &ŕűŚ˙¨Á ÷…ţmĘ““s“¬~ŞŃ}3‘ĺ ő[rdŢĆŇwK†ą/śßuôť#oŞR>cŃ\^ß"˘h÷KÝďśżd]§4ő;çíD  l¤ 8:ńIN'Üi'ž¦ÁĄŹ?˛ĹűfŞ%V˘j™ ňU†¬Q”ęsh—tîý §˝ F­b.Ľkë—ű!GQŤŹJţËrŢ{ďoj]Ë&9EŘźFĐËŻU/ß-É]úɰ'żďc[PhŇĂ.-ŻĹĽćŢÚB«Žëwý8C Ô¶:ČŞ‡÷ŞPםƑňOB 3]ńC_Ô߸U1ţ!1'ô^e´óI©Ŕ|JP×zľ@[%K]Ó¨íë‘#íňď@€G3|ś:a_IAG}°ľ'_RôLeĚ›_ 5ąř…2iŞí łÝyÝűF·ó¶ ĺEě ş®‡ŁĐ6Â\?ß5»&×2SHá„3 3UęqâkíđŔ›1¬ĹK\›&1w>¤ dN‹ö\¸ó-”cą.OW 5Fbő˛ś(Y_ü/†€¶ALĚ3P̦RůÖüńâď­Ľ‘$o§ęD)BPS˝řŽęŕ1}¸IsYĂ$FkMZ˝F^U.năçŇÓáŐ2eµÄřFš>kÉ#¤$Ű1l_káČh|Ú’4şôÍ­€‘B>đóߥőŤˇńܧ]µ<’'`§—áŮŠ§¨îÜ·äqż”ĐĄńÚ`c<Ą&Ż‚VP0Ą•›J(pmT?ĚËX~Ď“’H[LĹt•ř{y/˛«0Â(Â}Ě÷ =db™‘-×OćęMM=¸LVĂh©˘•Väś™Éúę Ź/建ůFͱKä„5î>ŘjôŘO ÉUęmÖIů´L˘öUđŚ=µE÷oÄxČ…\2ys8E­Víĺ⺣kĺúó‚ľ%-÷B¬w~®,Ó|žßą +$8żXsú—=–TmŐf őֿv¤i–ş·¶^~|†Śv$0Ç@›H؄ϳaÓQČÓĘl]Ѳ şŻ•Ĺ—8_°Ö‡ÍôŽ‹7,HÖŻźFş„«˛»ŔÓmw­!îÝ`$ăgíëäĽďŚ,©“SâCö§I…úµďÜę\Ů?iŁ"}‘ůËÓlĂ›/Ý`ŤMŽZËR)±äÁ*X‚ޤ$$ÔŹć®f&_ľŽžĄŃ“›0Qŕl4QŔQkŐQč1cĘşőźž&˙9q™­‰×ÍoPqĘođîd7VúeÓśýĘ _ź…#`ŕ{˘8™ä—°Ë¨‡ŁrNł5Öí‚Pâ<Ű.ďˇbűcž”ФŘ;ötordż`Íę´ubúŁ'Xź–*”k) _µL‰)Á¤xy#*đŚ5óÜé$Ę/µĐXźŁaę°ąłMŻŞ6‹NÄŞD_!8`Aڦ[nµ‹˝ČŽ 9bÔJ¨âčôhk‰Ŕ4|P0.ZşŻ;˘ĺˇxóSűO9oüO‹÷Ů9 ¤]XЍ «µ„.gVQ-şĂµÜô—>¸ˇ!—1ťiD©Ň›®µQw;3Fˇ„S|W•"ÇęqU9ňŐ]}„b‚ÄEl$eMGśhłPuÄĆ,Gű8›7Ň4âÝc·z (XÄdë©>\WL ąµV;ćwŐénÚBjcă Ôú-‡µ@ô÷ĄĹ‡¶Ć7“C=5±Ł¬É̶JY×ĺŰČ…™%DĚtc@ž Ő®lăťO➍óJgä9 ÉÜöńAŘL)u^m…UFMŢ÷4w°`ó×ă2˛ł3¬E=é#ěx¦$bžü|-X{#ČHÂm+ăĚgéws9 P(®Â”ż‡äRń@¨ÜÔ¬y5űĘtZçÚyH޲,𸄊gaÇ—Ĺńvć ’tô–Ü#`V±ÎÄČ. -^Íů ŚdÄkhérHX­÷“QfŚ?;ę¶(-2$lśăfřŇi¨Ň€JQŠ’e®&îÄ&~lÝŃŠIzĂpĎĄľ¸źoý!ÎE)!xSľĽ%QqiŇÓÂLŚ\ú°J]W+ߪŁfšÜ PαÝŐ˘ćŃ˝vu+>=üřđÁĄV QZńYđĎËWý33Ű ÓU írŃynŽŔ¨ěß3ţä%]ˇĺîžô%@š‡˘ş°Řk~q_íí‚™c"HP)3vęy…ŽÉ"Äś[‰W­©/&™Š<&+… ŚyááxxjŇDŠĄéŚ>ĘÚMwmEäÖ÷ŕLPm!5ę„uQIĎŻôŮĘqQ &söŃE‰rźx)źSĽo«7ć)˘ÎčŕsNěn!ó˛v‚ňÁ3ŽŻŹ7­öx%jĚÝ"Űď\ěD-F?b˘uľĂ‡ZąQÖśžů÷ĽágĎ,zîUf^d#I@±ÄS)šsşň?XCM¨ L"ąéhFŕ a iŞu†˘©“?éH}diűŐUKŔUŃŹĂlý ™álě3•zŘń-ź‘čÝa:ń˝íĚOŠnYźôúŤ‚c±s)7n9)ň.Eęşî$Sý8eŇ»ph§jTáSö6Z©ď`Ď„Ó ŰšżýŘ@Q|´jXeEźjw߬},đ,Dˇ}—χHýš)4ĺÚłŚ;bX»ůî VÂ4ůÖ°VŁ clÄŮúĆ© Ţ7ŤŢ=ŻĚŚ-Ěä1:ŕźňŰ%´ť ň÷/NŻd'׎”R´\ŮNç'¨6\ đ-ÖöŔűéřµ8›°ŕn8憟z\ôÍ Ę&“ęŐ^–tNĘÚŻ_Ä›ňcV÷XcL>óQ~Jv¤Oó¬´Př‚S»ľµ6 Ą űđáżÍaUd=˝¸,ůůY®ĆöĚ­#‚“ßa];tˇÍ ŻD×Öš¸Ź~oŕ¨HŞ»°Ć„6ŢV¤«ĄČ*Ľ1Ó)‹[z]ö˛cşxl~­â?!ż3:ެI†2፷©ÄIu¨ßĘQ.31Đď˘Uzś‹ýÖî/p˛O]Ú:ʏśu¦člČǕճ©ąîĆ–Ą°–+gf78§»i «gŚ“÷\¦×2Ń–¸áE´µÎôčLĂő”d”!Ž(ťÍP_I˙É*âI_Ó%Űůü¤˘4O÷ĽI;ÖL&†j‘Ď:Űŕ[?Ž˙ŠĹÂHO¤4>3"»h“ó"gż–SSů¸}tzr€AwF»űÜkÓňĄv8´"Jţ¸@őcň¤0źS’%‘Ć}ĹŹ$:/ W{ú8ţIŘ—€=lUüę»Ô Ď#Ě}:b.¤Ă6¦|` 2xż"˙S9–Mgî©äöqo?¬÷4ľ€î7ßÜRČ‚‡Ë`z­H¶ ۉ_âbîRÔä{6Ż3 ¬Šw×yűÎÝöĂH¶OJ\饹Y9 % ÖRüŰź3ˇ[şSĘn›Nód-jô†^ű35¨±úç[T´Ť6.đľo–ž\őYČuĘ…GCʼn?:r…‚B@éâJôźBFe”m|č¨F~Vo†C9Ő9Ö̱ů÷hĐ>·Ä9Ůľ˛,Ô’4ů—Čů™Ń­‘ŻQ˛"K;ŤY3~d2ڞ5÷>ôźľa§ŢŚźŮÜ€ĺ’.Ň}ď@ Ó7`ruyénÍńvOŹßť}]łŰ, ´†úÜôj>[ąUÚ=}+üTäiK{g“/z´m⨹ç3äőHÄ»<ÝpÚoĂRw¦˛zYxÖ.bŇ|„˛hłí…ć-̡šsâFAôńVǵ2‹»‰ŰĎK…ć€6”lč4„ć’…k ­Ŕ drČ ďvr8˛^€¬<…|řĘ«°†]˘Łä‰KeM„3áđ–ŃN¦]§¤Lţ|rTý´TrČ”ţá)í°üöžŰŇšŞ‚ž‹Ĺ“˙<%PČXpŇ ­–Wí:4âŰ8’X´ÍB¸®OGIS¶Ff4¨Š´!>ó±4–”±ď9­©Ő 7ź…/öËnź°!)ß• úűŕ!şótş‡źjśí7Ç/řÄ—đ÷(hĂŞ<͵`Kµ_6˝áFľĚűć«~¸éqú{®śě7nĹ»˝ŁáŃQŞTźwd-ő5'Ęt¤<{N f73ĆBWšAۡNiBt.XŻ|Ô•ŘĂ^DZS”T {If4¸Ň˝#ĚŽrKX.đPFžřAĹ®6VŚ%‡űaľ¶Ł150’~‘iŹCçî'Ëńw-Îë©'ŕE-ÂÚýőŤĺ¤§9f&őósD/šĹsĚ®×Đá>UzŚMV$´Żv )í€Ĺcµ¬šoĎ9źßęx2Q ĺ+ĄďZ>ŠđĽAľ„XW™QÖSŁ;pq4vöWŹSÜ™Ţ0xÄ 3żö–§Ó¸ł’Ë-'ŢíůGC[żG>¬W[\Ž6Ý>Ľ?;FŇI6 ÚUr‰ż|÷9ăXú˙?¸câ•°Ż\™w8ăŘËM¨Óuˇř;ކÝαÜ@}ÝAmŤ=°,»cńOHd'sŠŠČńş>—tđC~l_-ź…Ë÷e ±­¨?Aż3ĽţăĎ©OŚ$ŚĘ%Jä¦\É8DwŐűĆ+.—ˇ”i0A3A6ć´şér,tPi“ŠzĚvďDmJű©G"PH'Śś"“­ĺr]W;ÞؑB"U Nčâ&ŐĚKXFǵÔZyD2Gţ‚;™XFëY °Ęĺ‘ý«« zS#¬F›F'3±Ş,MŤM¦ź>ČpśâĎ 1\+°= ľhÓÝŮźbjŢmaIʸT>śă”6¦ $1 }T8™ýmCżÝúńŢ˝˝Ý­TXş‘3Ęě[”?pçď­Ł¤“ő¬Ú &϶Ű’âĄČáH=…đ‘tu‰śí óŃω×äÉRźáZ1 iČńOŠ7ŁeçžJŔ€Ö*´^łÍ„;Ą™"íw>®}-đŕc@{KŤ»5&źm%˛H&đ( Y8·ˇe[˘CCž›ß«"f·t©83(܆$g¬ÓÖÉ—Éȧl%đŤ#–E úo2jďŕ ý—™Ů`4 X`kß«ĆfŹűfUL;ă§öô–JÇë´*Nżąľ¨cm®5ˇďاńp ¨ĘmŤÇó¤ő+'ÍxËîĽYĎb¤Ę́6˙TRGXěü6đ¦FęrĂ«[E@'Ü ďëGéDÔźŚZ‡})ď‘ĐîQî_6j0ś}Ź-ăJcü“Ävݤ©€ŤÖ/€+îre7;ĄN{ýkgĺe7‰„YŽĄRĎËôÇ6™~f´ÇĎđîz§ŔC3¬#”čŕČľ4¬Đ¸ŃcnË+Rµ@>jÓŽ'™•d˘Kä0ą…ˇÂSš—iţńâѡ¦˙ŔGf„ç{‡˝¬ŰJoóÜ*(S˝ÖóíŘŰîű…¶źŚďSëľĂĎ ćâŮB;Q˛8f֢э*–ŰŞ— ęÔ–EÍc/Ď"Ć’o Ö‘đKů„h´¬ fęD÷±Őhş«Ą{pP…»XÂa_řÍŔž‹-‘—üČrä# řHřwyČ™ŰęLẎŽjä=nŕ×U!ç$® ’­’ç äŤ• ‘x°áqKÜŠÔ™[”†řĄXoX¦SýV(™_šŘGçFŘǤ®ŁńµW™gŕ ţů’OĽ¶˛ ®Fč´yhűńŰMBÄ I?!JôA) %Ű®ŕwqнጠoëĚw=<Ú»W n¦-ťnŘ|éĽ]aßë˙`†•ŔA°™"Ă\ŽĂSáÝ%yČhRÚńć|…Éd–Zˇ„ĺ»ěßd7…12ňz×5ZT¦ŮkÜ’ł„¬Ź»X ˝»JE) ä+H~áŇÝ}tÝxhŞ3Mć[?¸Ę%˛ŚEć××Aguśç4c Ť"‘$37],Ţ¶Śľ<Ô ?±¦ShˇăĹđyâËs)TË_Ů˵uGă' WWuű7ĽH+”Ě6ŘI±ÓňÂx«úÜťó›_ĺcLĘ}ą‹ Űjâ4S÷YlŃiTrg© 6—'wRONJ’ČA-ŢÓ7lŮŔüóô–‘{ł˝-L@zWWk[ĹçĽ!ľ ˘ŇF„‚6Š40żzŞ)PםŔ‚ż[|ÄWtś:—âµ7ýD‘Ö…ÍR–,Ü1‰Ť4·¸¬÷ń°'k°AőěŚěy…kí\+çf:~bĽ.ĽvÚqŰÍěc^\uĆ+ád‰1–·¸C—üŇeű‚źÜłĺhđmôĺˇo˛îÉ9FŰ'ŰőŁÝţč6‰Řľ2±h|Q­äA ZĂŞÎä¤×ČIž”b“ŹăVć¶žP@ i„uÎ^×4®Ćđ5OAWt›˛¨Ř!:‰[=#\ňňÉóÝ—@S(vÖĚ9™‹˛ŮâęzpXö)QXƵľée\ˤHKuKm­°Ýi 0Ť‚‰nÇŘŚI%˝Ď…‘7®‰"ͥ۲FĹ˝Ś¸ŚÂ€z[|đśőë~ŐOßCâČ?·RUŕ©Tů†ˇ`,˘Ńâ#͸ăÚm´Ź˙”ëo”—eäŰ[ć9+Ö›î˘^!ţ±\ÔĂ^íĽBá˝K™­{{Ł3XšľTGÍ…΢…{5Rµß ~ćż%eä7ĆĘ=y-ö©,úôč1¬7P“´ŤB‡·Ů”‰· #˘<ŮŐŠąr…Ćń,®´ 6šçÍÔňÇY—gV˛ĽW畍Řa`w°ŕŚđqßĺí€őŕsň|Ó´wĐkăÁ˛ F‹3bzĆĐňńőł—AîŇF•ĚeĘ}žýYy)Ël »‹Ää×ٸPeĂ9^dCO µű‡É»ĺ'ň@ë*ř(őĂ4B˛Ë cV3{_ń~ăëź}†§•/3öäżéĘ-îĆźWA4sŇč‘t}ßiŽí3–š1üćšFÁw–Wö– 4ł­ Ńr+I_^|Ŕ˛[°Ľ’3ĺ­©h”[Çq]BđĘ“Ř ßíî%mk53÷l&hČČÁ$ŚĘĐŃ”/qn¬ÝçJiW(émdó…łZĎ®”Bš“…ěˇő'‡ ͬoçꆬěRĄůxm˛đžĄ¦@Ě·-c1íU4ÁQ·$ŠBşŮż+)ň‡—Ü©4±;I˝ŤDU\Éĺ Eť` UťGLŻř§“Îlh•89"X,W4O´ůůű–kcaŠńbčłŔöëö”hŇEeHé(n˘KŁA Ä=Ť5Żźl˝»řťëľßFÔCv ęŐĹ”uí Âŕďě4CłYÚ„Iä`Ź ¦‘şĺl°řwśÔ­öđĚőp—Ⴕ´‘ůB"Ll 01’vŻ[ëĎoíÖÉĆOJÚ[6Ä™ŢqŤjĐ#2äłř‰ –y`Ďß6ü©Š8 Á +Ż|¬ě“1ŮÝ7Ůɢß(˙ěb¬ô…ř5lOűFťÝµ÷iĎ»3˝úĎŘ…dżĄ:Ř~—¦Ę%HĐ+•˛Sň ęŞiôśáLíCĎoŚ!‡ÝM úŔ©ęĎvsEÔ8Ó}"U͆J˛oN¸Ň ÇSe*§č#­"ĐŁ‹Lł¤ě;C7cđç;Ž(ÎÉł4,^ŮU8,Ď«në+—ŢŢž{őEÎs¤ĹC‰^Ň€BD|ŕcšÓ®f3É“Çëp$hqâA3MĹŻ[gp÷ËD‚JM1ŕ{ÍI¦2i†Ě+u Qí3&Öb!1r——Ęů‘ďćzăśý6{­X¨§KÚ‰Łx 'äÂoX«$¤}Mlő08ÜôKEc:Ť¦ľô›A6ä@…xĎ4YŚą5ŢĹä¶Y­´Ng˙˝ Ĺ÷®‚_6l /čźLýĘLx>˝§h~¤Ľ(+ˇ”»”Ë Ź9@j«j ‹XďÝpđ±ŔÚ¬ř!XŁ6Ţş¦ć‹Ý‰yOJSÝ}ţ§8Ď'GĺČI[5ŞűuKŹ¬ŠŠ–ŠâMŻđěŻÖaí?ľ/JWťëśâžq‘&‹Ł :ks1"LŃq­¦Ydĺ^ŕÔұr+lďč˘Ü •Ű a“ý+7-ű¶Dž’TĎ÷ ĎhfżŇ`'=+Éű•AÍŢ0®J iŐ%ě.µ°5ÁSˇCE;g. eđ8IôN6Á~ej:.äÖ‰i tGĆm;â•ďQX÷§ ţůcÔ&dgźm§á¶‹,–wŁŁVú~v+2ÔqäSVěm˙c›WĹš-]ź8á"÷V.ć]HáÖlzóë„2AŰ|ťäľO„<y‘‡ŃëŃ ˇa‚5N§I8éAĚSň[äÄhüĎ&őł™—,ËFŐf˝ŃˇcbÎ";O‡Úyŕ2q?a~j:ű Ë'n˛LUĘ(EŔk´V«–…Ţł;·í¦—ňîM®¨ř©…$ěţ˛É踮8Ö˝•˝S/K+,”ňmÚe]S3Ň™;Â'čĄÝw8ţ „ߣ8O’@x•‡ă’fTo˘·r¨ę’ç;Î`ăěMZľWŽr“s~¨©%lčÔŇQřaśqׇ®*;ŇއЀÚ"ĘżŻ”‹t- Nrßm*hüµĐ}‰u±M'»B^ÁZ‹‚a§šYl čţkžC:=5memk0 },LI…ڏăýčVb_R: JŰCăFş+;\Ź,úŢ©)ăî´·P>ŕÓśÎ%¶§ ţjL–tpq^ű?ř™”ĆSÓ#Ú4iű@Z€ú=µ¸0 ć0Ň{Ŕn-EDîda*=ŽŽÉgÇţ–şŘ2™0çËfžł5ŢŁ  ;ú9îRýIŇßë?SočŮs/ű{»wdň®ÚX®Ďí˛v›5śLh Ŕk+k⺦G´ňsĎ“(uDv˝<ż‘¶ŐŐN]błÜF1ţ!˙GŘ)Ú|ë=ĺh&Ę“⥙đ_SlGÚ÷ X5¸HO?ţżěö8‚ů·[ór$íb™_)çţ®řZĂzeÄ!Ž7î$¶/ú°p}Ďvß}…‡ZÍo e  ËQ´$>N¸X^ŕ>–ĂĄłĘśş`GŠ&ĚŤ[~Ä !–×!ŕ®Tň»‰š^ Ĺ@6"ÂÜ®˙¸\x ČĂű˘tů±Pkv6S‰tW-sÇ iˇâ_Ő¨•_ ë\.Źß#R<9’]z}I'Ź% ö¸’0ö'küÔ¸ˇ˘_8e§µńÝ`Sҧ(ą>óÎ}’©Ýżä†Ň‚AśĆé T^‰.vžßBy­”Hí‡Űd̸Uń!Íńh/’g2ނɽd<Ł˝%AŞ5˛†Ŕ%1ÔŇë4)=9`qüŤ©4E«m6&IÂíŞe7ĐŘŤĺ‰ĹŃŽĂđą2„Č< ^^%˛b€Î=‚\éoGĄŔ0ÍđNŢSÚtđ©ăFś|@ ?ŰĘTCwpčçZĎF/—â}ôMCr|Uăí‰ăp¦©Dr”4îš.@uP¶ëąáAßŮ$@Dl?ť‰î¤˙ěŢš §gTňn‹áFÔH°Ä *ۧ`yŔÁ5Ĺ˝Śç‚·*yň–mâĎďç%@Ő˝Lóx&ÉXÎcţQăL¶3Y^Fśhěí¦/BrVŻ`7锌Ҡ׶7ůFÖ28§»u8V©ˇÄŇi•mBDÉ:3nŁ© J‰Č8Č5/>íwk;sµĐʡŁ8g«Š=UX¶±a¶ŰoţŤ‹ŽŔ45­¸Ű„äű{żN~ŐزkSĹ:ł˛ăkd…Ű@Ľúo´u4)śĽw"¤&UKV¨ňÇŠ3<;jŞhFžŻ{E8qźÓN"»ë0E<úăgśP¤ç@vŠą¨rÇ0Zhe(źâ†Żî,HĎ"K~yM±éÍă·”(jőż9űśŔP;>ô(É×í"] 0ň«>î»ÖĂÖ*˛^ó-Ř7)Sőń• TşŘm:ěň5Y5¬‘Ă?-źG§Ůyx-™J­Ź­Żb ×w ‰;\ jEă^9pĚňbéCjb):~ąmJóÍç2›“B÷ˇű¨Kôţ"4?wÇfQša‰ţYŐ7ĐýdŐč *<şă˘F¸*Öů ĂgM± ˝ ?K*y1ôš~°y_ŕíÖő’…RmAÍ `}Ü>blU‚ăő„Ě\îAęebĹś\(řű‘ďĚAEFYzWZaJĹ–2Ö!J×°ľzA-ţgą*śŘvĺÇč™SÓfĂĐ:$ß΋™IóŰ';:hăN¨«4wűÝ’ˇG e#ť“€(ţ1Ę •/2ˇ¦D58öź=[¸Ă@ ˛SH1Ż©\Ő7şĆž;şyÝE°·şV9śżÖěÇŠFQď¬Tä´“üÜJµďËţ¦¶c%‡‹Ť•rvú8}5@h Hqá“űA¨Ć,Ŕ­5ŠüÜxVVŠ])k#9 „Čĺabűd>‘ř{0dvŇ6ćÎówóyĚkČ*Ő t áŐĽÚh1Ĺj˙ĐĘî2ÎßW?ĂuŢó»tĚn—őĆT=\u˛w{ŇÇ©ˇčˇ‹ź»|ŘŇ®ëôŰ ĽgOcCk§ă´?ĘŔ´f`ŕTÜÓ!ô%ćÁŠĺR ÝX±r/ő'0“„ŠÂYTčKWîfçßvp?ą­'ËRÖŇ7ÓY7ŮżU!úÜÄ–‰`)§&9S'2G-3óÂú|XžírÍVÁŐYj}¨AiJ žBa¸Ą‡ˇ›~\ü\mi Č~¸×÷ÖţâŚ.™_jż˝eŔšµjăŘb’Q[“–$Ë·S¬A endstream endobj 932 0 obj << /Length1 1644 /Length2 6246 /Length3 0 /Length 7086 /Filter /FlateDecode >> stream xÚ­VuXÔm—¦Q$¤¤†”îA:Ą¤{ bf`†îF‘’)AB锑AJi$vôÝďűözw÷źÝďŻů=ç~Î}â>Ďą†E˙ ż"‚Ş!ŕh~a!€.Ěä2D¸ę"¤uř ˇŚ]śCŮ DĂp *0…B*P0@D ,--MÄPF }ÜaŽh—±ˇ)7//ßż,żŻ@>˙@0ž(Ŕ‰ůđ„ş ®P8Cńv|…ĐŽP€=Ě PÖÓ7×ÔUp©ëÔˇp¨;Đ ďr:00Ž‚rěî—ż0ý. %€áRD€ †aÜ Ţ`(ň7Ä@BÝ]a(ćCÜp4¦h»x@~'€±Ű#ţ$„tG`n¸b0 ™>…FÝaH4U_EíŻ<ŃŽ@ôďŘ( ě17!°Çď’ţ` ŠÂŕ(ęŤţ @`(¤ ĐC†t‡ýIĂ;ü+>€;Ôčq˘P ÷ďîü«NŔ©DşřüńFüąőĎ`hÔĹ^€HXŚĆÄv€Á‰ĎŠ&ÜúËń@ţó„ş˙i×ď™áĆ$„ ŕ.>ÔžHPĆ„pýßTř÷‰üořß"đżEŢ˙ź¸×čż<â˙ď{ţ;µš‡‹‹.Đ3ífÉáĚžč~/ űóşÂ\|ţ7Żżß6…ţ•î˙B¦‰bÚ˘wŔHĂ/- &%$ýC©ÁĽˇ}ě°ş`úöÇn ‡@Ý]`p(Fß?­đ ý 3r„ťáż…˙ ‚Â!Ż#ŮźUŐ´+óţ÷%Ë˙Ä3l¶Â’ąčcĆmä„ţ3žéc䟇߄JJo€ż°„€_DJó1©I‹üÁ˙ ˙ëüv‡y,…„„„1¤ż…~Çţ§`ý7U8ů=HOĐ@83{˙4ü†ÁîîÉ˙¬Lý˙8˙yP¨7Lôy– wJĎĘ@WÓäö ©XvuăöE ‹ëŚ ‚+íAéŃKŇoě.«"ęGd®›|¦¶‘WkZ<ëýÔ.ÚSˇ{ů lÜťä_9[$y×CmŠI2ľ›>÷ŰźÔYÄł2Y_20´y}IŔ8Ň"ę~k˙”;Íł řű ’4śVOőž¬‹˘úŐöwΤo§'z>ôő¶˙Ŕď\Łç͉żÍ! ¤ LŮfIFűŘąŐŻń/<%QĺSŮŤ¦•äIĆ^ľôż¦=ŮŹă–(…3vE™n±W…Mâµ˝ö˘"‰ăD _Čó1*ŹiŮÔĽźÖü>+1·S+/“îś5+#Ţ¨Ź™VOg+_¸&7áz¤Ń3™e™Ń0’"Ë007‰y8*)Vs_CUž4ćQuđ@YňňŁ˘X›tÓ­‡mXFéÝ5/żëó÷=„áňÇ ox=;r“zôČÜ)’çűó ĂR±8…ąű8©_멕ʆťĘ?ő}Ć'TH×J^好·Ę!zAE®ńŐµžYćąf.ǡ˙aŠMc»ek[şŞx(É„‚ÝčfW˝öëĺ[>u}ćm»X%Ú·ĺătóĹR,ľ_‘N‚Şzëëů,cľY-˝ˇĎnVJÍj&±’,Ë8ŮŁ^áôT0ÎO$‰ô~ćL:×[Mˇ5€}l+č 䲥Uiv» ŰbCki_{–˙LŐ'4»¤s92#Są{¨¸[hzVÁJ‰˙L† 1¤µ ĎY1xD€ÉÓť Ä{Wµ{ňBŹ?Żâ\emO .О…{èŖź+úüŚ˙â ßéÄ{[~Ç H&tł<Ů™Ż —ŻŔ§ÇеÎŮ҉°:¤·®˛ősĄ4w6ŇbR·‰[™t"ł#ÝFËJJ€şŚŢ-+ŤŘ‚łĎ›-ÜžuŘÚ_Đě űŞr%Z­]¸=ĽR·9qÚńŇÄBQ.tŇÍRŠK«oš…3r ´Šóg˘ŽĄĚ*©±”‹.‹ŐI_ó&,qŢ-;.őu7ŞNäˇőá.wZ,Ě@żIŞ1–”-8oľztáĄţ=ë-ă067}J”JřËüv@­N&.ÎŔS'ľ1şűł1˘cŐâĽâ.Iéź’€QŢŐH_á+ â#†ě¸•äf †YŹâ',Úbt}’pc›D˙öĐcť‰î‡­Ç0]„}[«Í°ó[Źľ‰®—{ňt6ńľcą·üÖŁăň×;¶e.ůzÔFĺŁ;ń—ččĽ-÷·›ŹNĂű4O¬^“¶°ËŔ™}5aui›/é©ŕúN_XLućY WţĚe˘»łu'=ń‚µi(-W'˘°Üßń™ąTšú €·:ĂŠý䜌Ă@óY0Ë®ÎěŰl‚ľëŚöěý5Öá=Ťo{Rúiĺź_DäuňzJ=Í}’Řj­•·jě ăä«Ţ?[–˝˛Ť5Eˇ0a\łŔ(rĎZšý!~Bé]Ý®IÁžábĘ;­ę‘6ÜH›µÇHV´eyĘ™Äéýs7{Ä×puF® ÂÎćI¤ŚMˇŰkżťwîĎWz6»7äŽ@±řI»ţ9<őŐ´Úý™řĂüÜĚ¸Ź•˘p?U¤R ÎBW«ßsw;qŢ•­öŰ娔mŞ xŞŽŮÚ0Ěiü’®MNă[-đâ'BE€†|T»ëÝ6ô”÷aÚPŐ&(ČLĐ>Î~«s(,U¬„iÔ‚ő%/őľ×«Doý@ĹŮ'Ţúmé eŕa®ýşBÄ/ąkU€žé˘´3;ŇçY“_˘.w9ctyCo‹˛Ą3¬ĹM˘™›(äČX ß¶ĽŽK¦Ě”{w»´Greźöm’]jąŁľ‰îťE±ş~ˇĄvá;:*}=ĐÓ7ţ×ó»ŕ×/śđŚ*“ĺ ľ^1źżË­ŻćÄĽéuÁŁ=žu00¤żudŤ6 Ń»?¤ägjÔ4Š˝ź{ţt„>Z6ć”]§w™ëĽőÚŃí…Šî oî<ëýT&#ď< nýęĄIµŞ"ł˙k€}ÜűÍ9śŐ̡ł=6¦›m®2ëîză{í—Kćţçé-ZřF–izŞ|µs'™łZýK§ÄYßM˶ť9Ü/ď֓׉ "|łM_’ýφ¨¬Ç ĄiÇ9ÚYghn3É näjô%ÜO0[ĐúEQ?¸JTÉLĚ%Jеő‰l¦É}2ąŞ¨-Ě-Hr ˙:ŞpçKĐ˝•Ň´#Ó» žüÜţvşł¬˘ź8#l_hl9Ť*ó UI&¨µň÷P¶ý1î÷­ŤŹŰĹ E¤źHŻËs’x¶hçńşßP©c=Źböş¶Ść¨W®rß }§{'©<°ěĺiŇkÁîĄŢ»Ć%Z>Ź÷]V®ĆŇ], ŤżJŮlćŞëL-fk‘N˘­˙T"qË>}-•ÍQ71ÖRĎŮťyuʱ¶Ę= 6oře)ť .–ŰX‡zĄ¤önîHÜcĆťźŽMÜ’Č€*ŠN¦Ľ6m<ěż™Őéľśh˙Ô4=˝\ë×Xcşúh‘żÇX˝ZŽĎdo´˘?ť—˝šëöl•}óv(O#żňžCę]Ą•@ĽT¨ń—~»IŢjů]˙/Jkî±t÷JëLÄĘ3’źŔîp«ŽłťŤ\Ë*©n…jGJ–ä¬Ve%ž Ę5sŮv•»ŰÔřşˇS^—/^®v”é*Ôm(?’Îőă"›”.‰?÷uş˙36T‰0*ŕ sˇH¨Ômo1iţĺ‘Öłk:ÂXµëL:‡÷°¶mk“ÎźOT:fűe|©&ŰŚ—´?+pŚđ÷Ç^®L ™ŤÖDÂ\ŰěryýÍÚ2nĽü„Ú7ˇˇ•»€xx 4ÚěS°|e ’2şĽGÉY´ &(Ď'ýYčü¤ŤáľĎ—ňěşLç®'…¸\Ż“âéŰEŤŞ˛A‘§:%JAće‚(^Šf˛Ć†jNŮ«Ť=đČçźżzŇą5Lů7‚ăLnŠí'› ů\ {krőT/Z)ĂürPćŮfç ,‹żś†çvŹbŹŐ{ą'G)ËŐW$yU §] ×Ő–L´č&'k>ýp'Ö&2pęm—®P‘ 7ß·*ô7ĄłTĽ‹ćx+eŞv»ËŘ5d =ăË-f.ťÚ+)ŢY­‚7& Üŕ›ČlÔ…˝vň Äĺz4žÍŞ3ÜşţŇrXGďŠú˝ołµ­íí‹7‹i/¦ŻE$ÁVf©HÉXń'đO!-{B+ťÁÍš-E9‰qzŻś ĆÔëÖ\88„ÉĿܾďé‘ČSŘţF,d&Ĺş#ZŚK˙'ÁZźp%ž{e䇑ł©e읡DĐ4>őłáěâÖźí?'v`÷HÖ ëSőz«žÎQ?.djÎyřřÖÇWęŻĺžš éö< R¦ü©26řő«±§ÎçÂ/žÜňwX%·eŘ & +˝Ë˝1ĺšKBŤZ}Ű`G“Ľ^ßĎpx*ĄĹŤ$.Ż=Â^%jxoĂ·3“RŰöŁrvŚHfsż„vÄužŤŔ„çţ ·p#‘`Çę×­Z‚Ż8ÜuA†Ř=«ź¶ż|‹xâ˙Ay.W^§ĂK‚Ŕ'r5íóŐ2®ŠË·ľ÷GľŹypU@ůly‘ î(ŁDýűĘÇŢęß{«˘ú÷‹¶f©˝ş*˛k#ű:ďĆîŚ6*Đ—~Ż8qRÝ[Y~ČtÁ©ńĺAřÍď;ŔÇšwO3ú"Ľ”§żľ˙¦˘Ęĺń1‹áëëeĐ —źĚÉwDf˝â3‹—řZôĽ»Ň9Ţ$ ®ú€{vń®ş#! GÔß“e,\ý4žďx%3}+éă˛ęş˙š¦'ůÓ;‡vFJQË cߊ«gŘÁŘĆ•R$;RJôw˛gŔ†>ß“MóătĘ»™‡ž‡mdd^rŹî„ćÓýJµ#ąĺ#:´ţ˝őJŔ±~§Ö#9,řy‘€{LÚm°lÝi5l8¸ŃŠŕŞ µ™öÔÓđĹęô’ÁŽ2ž_Ýš­G2uł’IęĎőśúbkŁĆńÚ\:ľí˛ Ăa$™¸šŘÝ-Űőťö.7Ţ>V[FŞ ‹ RQYu´Ż^sMŕŔü«ŘŰ–¸BaŃ×~ÖÚSíë k¬úk«e.Yëí\^ńpžź<‡»6M™ťtďşxşŁÉfUýĺř'\UŮq%çhŘPSž.’ŤE¦kĐĂ—TgŃ|S[x* ÝĺśTvÂÎ65ŕ´öUq_Óňm§…hŠ=3±ů¸Áô+í•¶Řáń“ áŤíŠ-ß|ÖĎüQ5"‰ ĹzS3·Iź $?ŃŐ~PĆ©ČÖŠĽ†dřv€FF©+ÜKLˇT1g)Ć\lµŘT+v›óĺ\`_%”T{Dpp"¨'˝" ú^bçD%Ń’:1Ź=Ëô×ŔKUGk†¨âŤ5Ń/°Q¸ÝĆÚK±Ś·ši“ę¦8ýZ“ĆI2Ç.‰h GkK”Ľé'5Ó?˙Ŕ€[ý“łoÝů•8Â~ś­#:|ëS@çÍ厜ÎP%ńäNÚbŠRŘćWóZŽZÉqpĐ)¤v9Lł×ÖG;ÄwqŚŐ&Wh¬WYHłĆűf©±ĐbÁëÂ1P­˝ŤŻń‡ˇ°č•¤Ř¸¤Qe ¶Š®S’Řć8Ě2<Śžâ‡ű¬}Şč’ĺÓ7ć‚t¦ýŞMyőÎSŹ˝Q˛ ´lĽŇ 8 ýHĐťs »ÖŤ\¶7VĎ™IČkJD–Fú†Řőş^łdlť­OK˛$şrxýŮĹg¬‹îΆ vĚýęąe<Â:„tzöŹ˙ć)´«EĂá 4íx“ Q>“iáyŐ\ůYČöĐ*’źŰžq“’ϡč&oŻăZ„đ‹iýQQ€ýÁ¶FŻ!_ĽÉä`’äC˘q˝ýĆj)OyźŢ€{šR%Ěő@NGýÚ„ć‰Dť)ÇrÇ0#ju‹ĐŤŃn¸Íq×xóJćžů WĐúŘÜ‘˛ŹîńK7OŔž]é ´cčKžĆ[śIlŮbŽ5^]x˛°ăJóHçWQüŽ”˙% ř‹¬ć=há,{U° ’šnő ™Álí8ĹpžŢDÄ“Tý°đţ+ŰĽćeP¸#ĎGěËŘ˝°“×&,ý”Ǭźç%îß˝áëSÖĘPýF­á\+(QmnŐu|˝°Ŕm ÷¶ąiąn3Ë‹ë7ZĽ×ČRĚz^ §wZ©-đź+fOÉ —âČňÉJVKžÜ…üšQ^Ĺ•n-š“€Ó…C¬„4§7Ĺ)v?ľó PÓ«ĎëM»ËcJj_ť«u6ËŤś_âö]Ąě§šŚlů\PćŐĺ/ÖŮz)ŮőJ×ďÖÖ˙Fń ü\Đ‚śĺŰČĄot§ÚĂ}VÂÇ%/K{˝”¦‘ŰËNK¦ É*Í ܓڶËËdš.{ĘťŽDY}!=ěJk,$Ó‡\eđDăö{żJ`ńr ’Ĺ×xöůť÷ąX ^¸tméĘ:gyjđŮöő2ÎŚń'’qľŽěĎäś ž-Ssîşe)Ă‚M}§ŃÜ1Jbx ¬C°zXnK 0ĆóťÖŇý§Ű’Ź•¸ %ěyÉ“NÝř3„gđ—Eq™Ţ.ĆrTt2ŹŢŽA´ž¨>ͰŐ5j¤ÖâŚËú®xúÁÍ#ślsś&š>7N€4ýH GbůţQřĘ•Cçţńٰˆ3Opc+‹ł#›Ç˘i Ľ$ćă1Ž^Ľ‚Ć–´ënvŤ)Ť‡í-ń%Ztů3UR·ůcgnďš§żÎstęůz€ëW ” ýNN4Ż ď} WHËúšÉn~ŕÖ’8^…c3DéřŐ'x7VçĆřô“"PZm)mÄ«DĐq€?źń§ę÷[ťO;˘'´ď%.çD®:ŇjŻŞ ďÔo^®ĐűdîAm€ËĎßú…8=Źeňů+¬Ď€f.› UëbüüC¶gÔŢÖ)źQ?ÉřE]6SPGřqçݦkÝ/Ť…ęs:öôý˛ď˝ ÖffÇЛҠčx ÷ŹG÷͚ȟѱ—Aްá^˛XZŠËĹ0JąěⲔ‘ăžÚ‚ihIÁ.[ffýÇžnž'’\¬ŕâîŃxě«‹ikŚßsËšŞłŠŇ™\?űŞĽ6+OšżW@Órř{ĽŽfŤ¬h‰˛5t?ă˘PĺK÷ZźłŞHA>ŁâýĐ멏tóF„¸2fZ+ĽŤňëCřµán 9»Ď/‰CööŕŚ—q}J޶«ůŮí¤xńWfQ»7üI(s*şJęśřüÁč°q~‚˛‰oo1.­i¤Úb¸öĄĎó 1´6±]ćQbšÎÝ™ěľřš˘…Ŕ3Í ^ŃăZą^úSĶqI•1窲mńSŕzvČǨF}>1lAoŮ=Ɖ1Ý·Áó"řűΔôćU\,>ŢŕIĐ%ěBEÉń‹= ~І까áÜŢo¸Ă(uƱ;3BZ%ĐçŮŽeŢHőŐÔ,´€”żŮőż›O᣽ŹcZaŤű…b1вŶľŹ ĄŕMă‹ď¸’ką”®®jĽšV`ă)ŕçËžGŚ—nĐţż¸U>¨I%ßĚčşFo¤ô¦®ńw„3…čJí 0ÓĆ ’:5őُ;›ĘŇ~¸ÓO!ż&1P´vöëÇ6%`üĽ¶Mň‚Ę ăŐqĺ i Öaëî· —Y`hšB0Un4 ŚđHŮĚ”=®QÓh‘Ďßźręćnë`( éÉ­ ·QÁꉆ$&d‘Ý{x:–”l6ްś b’EřKi•PXhÔČ4ďŰ 6ĚýYúśZÔBWv@‘-줻F—” űSÉĆ™W\AMĚ ô‚ŠŽ¤ Ý%±dů xŤÄ3!©9Ůu^ÍI’‹{ŹlŢ*h2_QSS± }l‘Ą=>–,âyL fe±bÂű›łŐ¦Jęö»7ßu䪞{M»ĂîĽ6Ôűĺr¶˝¨—Á ŘŞ ë> stream xÚ­wct$ܶměŽÍŠ:¶mŰv*¶Ń۶Ť;ěضíîŘćË÷ť{îąăĽw˙ÜwTŤÚkî5ćÚkŚ"'VTˇ2µ7ŠŰŰąĐ1Ń3rä-mŤ]ť•ímĺíądé”ć®R.F6€OŚ Žś\Ä häbio'jäähM˘@33€‰‹‹ Ž bďŕédiná TSÖ ˘ˇˇý—ĺŻ+cĎ"źžÎ–ćv€Żź?Ü€6ö¶@;—OŠ˙±Ł p±Ě,m€E-)y Ą„Ľ@htú,BŃŐŘĆŇ ki´sRĚěť6˙8LěíL-˙*Í™ţ“KČ`pvšX~ş=L€A´ “­Ąłóço€Ą3ŔÜÉČÎĺł.öK;WÓżř´›Ů˙ť“ýç ŰOě“LŃŢŮĹŮÄÉŇÁđUQTüyşXąüŰŮňŘ›}Ţ4µ7qý«¤ż±OšOÔĹČŇÎŕôpů+–1`jéě`cäůű“ĚÁÉňď4\ť-íĚ˙•-Ŕ hnädjtvţ¤ůäţ«;˙Şđ_Ş7rp°ńüŰŰţď[˙™Ą‹3ĐĆŚމů3¦‰ËglsK;8†żćEĘÎĚŔÄř»©«Ă?17 Óß ˘ükf¨>“02µ·łńÍŕäí]>C(˙g*Ó˙ď‰üż ń˙ŠŔ˙+ňţ˙‰űďý—Gü˙űž˙ťZÜŐĆFŢČösţ±gź‹ĆČđąk˛€ż–ŤŤ‘௅ciňąŮZÚxţwÎ˙~[řʬ˙óßᄲ3˙TމŤžífKgqK ©˘Ą‹‰ŔĚČćłyŰŐěLN6–vŔO‘˙îď§#ăżaŞ–&Öv©Áöhgúď5|ęöw šRę˘bJ4˙Ͷýű˛âçT¸¨z:˙ICÎŢô?Q Ű{ĽéŘątĚŚźŹńó9r1ł~˙„ý›é_g9#'K€#=##ŕóűźźťôţŤFĚÎÄŢôŻ9Rq1˛3ý˝˙4ü›¸:9}*ţ÷6ř¬üźçżč4[Y´7á ˛JËLw©ĹĘŐéíf v(ý©ZTŕWmßĺ›¶ÍUiřZLß0ÉýŢęąpěđ¶/M}0ÜŤiCŃ•<ĎÇ˙NJŐS€˛ńµŤć €AżôKú‰F”÷ĹĽě„6;ŁúÁθ’˛~É+Ád‹ĚĹ•©[:Ů˝˘ŹIj},F;rjmáńÉ×ÄÇ{Šţ‘ˇÁ®+Čž}<šśXXr#,źäcâ$OC§Űź&ďĎn®đî_ĽŃŇß\IýíHŇěEęĽfźý(ŰJo'u…Sť®X40z] ŢZđ‘Bń_38ľů‹×’Ć„\_"ď÷ňÜ!1â'oŇH«et¸iúÝý\NůňMś’%ăTĘăÚ(OĂH“Ő˘™G|•RyŤ ^ĺ^ŘU©éĐ=!?{Ée|0ş+š¨¦^¦çg±ťEüáKTÁȦűˇdÉ7ą!Ő › rTŻřÜç#’űS'aĺj3ţ㺵ƒJ«•¨kŻ×z IźIeôN´|´ŮďúýR?@ż ]1<435UßtýŮěŔ.ĎYeź®b;OĚáĄ|IVş=8‚Љľ¬.ŮE^čĆ{‹ŐNßĘV¤ó—ĽŇc‹´đWţÄÂú9µ8«#[oJ-—Šg®ôĹÇpřĽdë<Éś(nŃ0zd±/¦N36ëś–÷ÁSě˘č?7l^-v—‰Ź1˘”üIŻ†Îş#¨1úNö>přśę˛0’óÔĺ_ ĘtÜ˝7R)„Ř™ĽěúmB aGÚ:ł żiĹ;n{(@#TK#'m‡Dű{Ş»aľß:,Ń‹ăűy^ŁzĘąá›§|­PčźäżBmTY~ŐŇŚL VôxÖgON“Ë- pF¶Jű]Ů ćQDçŃŘV5ÔŠty5bŕĘ‘ĹwĚsÁĐG=äé¶qq—3ŔÖZ^Y€[ő‰CKmjd–ťU2čžUx®Ę5˛t`ßWÓLô‰.ú~e­ ő&ŠÚ ćĂBŤ"ćzZ4|ĚŞáë™Őžqcd9\ŻCň´‘Q¦n÷‡nTÚŽ O^A=ÝńÖ Š%ä‹ďä˝Ő‘*}#l)QÓdFżŰ‹Dą»®ÝR»ŤŹ{ę>=ş6\ÄIĚ5˝© î„Î'"šĂ,QöěP ĆÁ),ćťíó̱y±8Šśqľ9Ťq®#0F7§ďgľ°××T–~rÚaăÎVîaľÚrXF .2U‡†źW!čv!î_ß>lG€ěiväĆĹh‰ţo sBŘÖž¤íR"2j'(Ö8˝j‚wú~f¨˙Ţj´Ă  VŠÔϲ L=šęĆ»ßjÓóâ›”©é`ĹQB &ÚçčńٔɀÜÄV´snŘK^+c ŻlŞ?ÉMőł„g:Ľ˙]ţç…Ő*ű¶ąöDDk¸Şô­98´NHŚŹŹ{–ěbĄúęEĆiŚ‘‘ u©$ †Ď~ ~NüýÜ5Lţ¶ubç4Šţńŕ–¤Ęrne"p­l[vŁąŹS°í6”'ĐáĚ=P®éŘUS°äŮ›@«çRÁM"ř:U""ÉUjҰyîó‚Ö ĆóíÍ»'ÓE˝Ś †Őňśý[ĎŁ˙‡×TH&Á~†çdRÖY“ĘÂ+>F}ŕnr.?ZŇ=1}Ö NĆf 7ÝKâţ缊úVgíĄi=­čśćBżö5÷FÝn 3ȵ, of4ńv0©‡lŻ›U%iöGËÍHĎ•˙Zď÷‹ÍeöhŻ9(&Îƶ®Î)™Ë3!ś/9ĂBmő2úÜCg 6q™wHŮ‚’áöąD'Ľź“yx‘NÜ6Hđ™rúóťáokµHláő ™wŤx‘ůŐŹqŁĺÉ”K1ş~k Ľ(‡ Ś_q ú5ʧIÜ®°MŤ ď–l¬¶?żëťY˝†ýérL[jż§`ăČbÝč»ů˛4Wč=0íNH«¶ÔT¨ĚGlĎqv €vĽĐjt­>î%Žm+ŔR°ž÷¶yɢę`‚Tvi÷¤Ľ?Őđ3»aI óß5M„|ŕ+¬RĹhŕkIyÓRŠŽEW'ĆłRéÔŚe+čXçU#XXČg:’/+4 o2Ťś§Ő ]¤JçëS3€gî†éKÍ™o"?©;R% ÷Ű|ÁkŮ1^ş — ąEúÍvçgáĂjµŤÉhţĄ?úDD)’ ˙Ƥ±î$›PçÂŻađäi“t7;¤wČ’39ŐŢ?‡©|Űá -Yo“léÄ 7´ŞŞÍ;‘*C‹‹wNűű¦ľĎôHɦÂ$źŽv‘ㇽß#yš¨N ČXÓô¨Ä ¨ľAhF8!)ŃŹę‹ĂťŔ&Ş©ĺΊł8Ƣ­â‡‰tŤ[ɉšëđüČ\äbRhĎůş »ň3ixá~őp•ŃUÜp̆ ŃnŘůÔ‡ĄHź Ó!NI}`EťŢŻ3öߢŇPI¦fhâ'VěJüĄ˝¸Íh 04ĺž*ą;Ź´nbś1–Ů V„ĂAĎpÔi#ť^}ŃÓůs7Ä4sJi‚Ge ŁqřiŞxu `\îĹY/QdÝĐ%‰ ­Ö– BČ4"ÓĽťq›ô‰ńëĆ˙ÓňňRô•ŰŮ“/Î0ŕ/=´ öł;5.·$l˘ęúňNˇ­¶G¨9”±(»×?łˇfŔůČů®ťDÎ0©F©Đ’ę«[»Žv&Ć®Hß6řhÉܱ]@7zĆĐ_#Âpş62ÔZQSçkŢęJshP¸»ĐýeŇ®K3[ʉ¨”j`Çq[ŹűÜtV‘ ß5Wő,:ÎM`Ęîa n°]oö ăó‘rČŢüŃ c Ź˘84˙ţ­»úîÇŚv—ŚÄšO’¶–óĂ3}wdA9YfĎbĺďⓨşęt5ő7`™˝žĆşťh¬¸oX×+uQcel–1p ×9ďăű% ţXí€÷Scý J 'ź|Y:_˘’N `R©™}ËŤŁ˘wH—9ý—cTp hëÇźš–´ßöŢ$]Őu}„f¦HP 'ÔŘb%łÖvf¸%µvâÎP ‹Ćf÷‡$ŹôjK0Ńďá_‹¸Ń¶Ô·¦YżćU'¬`U©©“iŁP2śÜ쯌ź#˝‡Ź?@2ÓÇÔ°1 )|?‘é:ÉťRşž&aŕ®Mđ[Zü0EÓĚ©©Ćej©ÜD:)RÖŻŽFYżłŁNË- @î&MúAĘXyśö_ö X8>wíÔ»Ąt“¨Ý¬'ĎŤAϦ=&>ŻB3őëĘE°ň#Bh˛űc+(^UL:S‡wŻA¸~uŤi©ďŘýŕ°f˝ëNK€-żĚ±:" LRzä«0ˇňIť‰Ş{ţęhęB:r©S™ň„ču¦p[{đkÍNýˇág«Ol{ ·ŞKE™CČ1rqęŽ1ŐŁł,"¬=.(nŔé©=Ćź›ŰH!Rě¤5 fq·/˛Ús ‰ő9#~ wŚ,_fćtM‘ös”ł‡äŹú~°Ĺ˲N«Ţś˛7ŤŐ81M1®ó4 !”ä¦eëDHŇÄ2 \:MUDEŹŻ°ÜűśMž–´ŮcgĆNú'â KÖ©Śgq›kĘ®â—Zą°îSU,OCH„wM Úü0óĺm™/UأҠбĂZńčÇNÓźÄ_0Ëb 7U{Ôô­ l¶ă‹â5ž U#—Ł»w ÎŔÁ&ń¤‡Hj$lâ&#…oă±AÁgąV|ď^äöŮwá<ĐŚćşKj𨏲ýˇęeŚýĆíy=Aş”p–ŹrT©]|őMiŤ8Ŕ¬úŚ1ŁYĹ…¬˙pŇŘ.íOĽîD|ď¶;s¦“!­‚ů-;}¬Ý’häÁ2Ň%-ĂÍěôçʬ1 ŃfjÚ~Żg\ޱę2jěç¬ęŚŘŚił!V·ŽÖ¦vWho‹m•ŮÖű á±ŰúžEµÍ˝ç?'=Ѳ7ɤ-őµ Z Ť6§;qéÉÜa5ýÜ+÷aáV–=“ꡫ>q°«úąĺ+ÂIr©•Z=RÇđ%|ŽpY>ÍrňíďÍe¦K}Ż5Ôp6ÓNY ît%Đs ŁqŮ˝_.IWŐĽ¤Öđ—;…b_Pb°2Ę Ö6$Ľ§âcńÍeň„őĘá Ĺe,î^壿ő`l<š*ŽŰÄ1Fcv'·­đ˘ASĽ¨˙á6HBßáđ^q¶Leăŕęą]ŮľfŰđ´tŔÖčžw˝çŮ}ă4잯@¬”q’măzż5‡ng?ŮéG$+čiąx;,ÂëĹ„WĆ~ŹPđŁPézßQ˘}Źv\ŕPŰ—Î1ţÔŮú›rX˝—ŤÉŐ÷k~Bdcj ÜŤu?)˛%+ć‹&˛Ămđ¬ŽŃ,fÓ{*™‹)ť–UĎF!©CnĄn™Ź—Y"nźÂ¨Š¸owÍR“Řâxĺ Ú46öŚÓôOPĘÉb΀5é}ÄÍ·AÖÄĺÖ G‰&č6ߪÝ%­Â?…„bČw8¶O|˝t*őřąĄĺ*×ks\HŰZ§2 ?řE­t~üâ(âĹ‚š¬ZAĎ.OݏťV«ĚŐl´%X«^ µFă­I–¦ńčłţr»˛Ŕexx%&$Hx5ú˛öD5«s(q——•EŃ{ž÷šźŔ7\WeÎ`Ń€„5zŘ9,Áż•AtHôÍ'ňóňI×Dę;°a+8ˇ6>´‡‰U‚x÷“Ş˝°§t|®„ĹňvďoĹ4çĆmĘp†¤©á¸4͸–wú%b·[ó»ľőFiJ&ôĐ[kÇÓ _%–8îMd ą“AÄ$Ą“ćÁU*ЬV/=Ç|ühŕR™•)„%öó—Ż;ô&ő¶XMó|JżŮŃ«T{ăpu˛ľ~ŞSRťűpĄ¬Ć^z tąEŮpŇU*ŮfÜÚKZö˝í­HhJˇ”Ö™u#•"`uj)ąÂÁęáĹ6őFNË{°˘'ÔcőIX‰Éd٩̏„ÝŞ…}‰fz(¬”3Ď%rCŹWď]7/Çń5Ź=mpE ´0pÍ@ç®ĆxQ¬˘®›#‹˙¦ť~[HKëšÓ#ŃÖ&î¦"‘ć32x^öÄřfŠ^¤:ďd*Ďâ/ĘdŞČňrňŕşö(ßvţÚ8˘¤+ń Bâůáb˙j ^1Ąäí^ĹßrMë2Őĺ2‡lk.–ç5¦őŢ©Vžiřţá˛}ąSť±z©·iśrŕ‘ŇŤď/áúšě|z¸@5?ÂŐŮťF(ăťá?łĺněšŰjüâĹ c2š.Ń„‡>^NKXl˝–ÜČä7ň¶c`Âí/*ő‹wsc$ĐĆ#žËÓjÉž8—Lkv˘ŠM?6 LCá›SĽLgN8©%E'(‹žĐ]"Ö­ôÉĚH ĺ‚,†$x¬úŤ$öG±ť^µJŐ⇤ÔĎĆťubźŤ g€mżúż,7P‰KPš{Ó9›Âň\XŁ×‡@ŢŢé‡<ůľk$#n*ĄĐv*f~ę¶ÄmJ°îhp«şěĚ’íxRţőFm`ö{Ŕî§-Hć’Îóť_ř!Á Ď‘2zUj…Wyôŕ˘ňWG 6h Ď€ęGó1›ß&ýq2žęřŹ‘F¸r8ÂňË•áqřš©ő¤ űSezŁs.jéÍ•îátäí űžBňégZ¬0_ťębBŰÎtčÔĐ‹V\Dš# Ő®˝9–żzŕŁFy*¸wđ‚ę"Ú¤Î}ŔżĹ¸“U±F 粅cr[ĄđL@¨¤„čÁ’â´'¦Y°ă řÄßâ"ýnKIy®Ďµć˛ŤbÜŚÜ ťnCÄtł“ŃN|Ç×°ë¸`UHÂçmÜF¬Ž«wcčqKĎ÷Üs=a9Ö…HcńÝŕ—K'J´ßŘľĺ'gs”í92säfŻ‹Łä’Ę·žB.ËŞ˝ń 77”s*€ Ió3¶O…¬vĂž›vJľ˛…ŮMŹŘ4ęČśM濫á_ÍÝŹÜŔôŚź×ŘżpąCN™śŮ FdĄ•›Q#XMhţrĘ®$ś:˝z'P’ĺ»–;R·Z›Ił4}…ÍmRŤđŚ Ń¶xMŁ0Ĺé ŔÂw2‡żZŽËrK¦A»ČQc”ĆŢRE>?ÝŮąĘc‘ůcNá"`ÖU€Ú!iŢ…©·mî˝:ĺŇ7uÍđ s®ş‹EÄĽł3ü"ŢÖmý±Ňg¶sZŤ»‘îÖK‰’Vk§˘tçß„üťąJ1E ††5<Ämkc! NL“z 7„•źÓޑֽČŇířĘ9‚˝_üŇ˝nąąČ¤oŤŐŤđj¦b$h©€q…Ś–Y ˇIÂ{f3€"ź>ᣩ!•áO}ąKlÁĺÝ’í6ĺvŻjaO°÷»tP„˝ďĄ%}7B*¬‹”ŰŹ⦼*„Ł—˛ eá­­›*ŮC9ôëgâ ČţfÂîÜĆjşąBĺ±KoٰË%BŘy­08îrúçCÜY¬¤ĚŮ…YßÍĽ.„ ň.9•uţĐîHö ŹőŁÉ‹TWę­eąX,5ąR¬óÖÖź‡˛›Ż`}’š–íg*Ă„Ń7ÓŰő2†Mşw¤­đ Ś„jôâćĽ(k++ß ť_ĽÉŞĺ}ŠĂ$ŕ&Ń8z7Á>ędâ^Ň«Ąůޱ]$RďSď“d _˛şđÎj`¤•v! uóč•ÔT pe“pÔVJgžOŐż"Ő\şŇąŮL`´öôk60–„_ťuĽ ‘Aú5)šJČÁ©ÖËö|ËyÁxDfšMš ¦łp˛ }SwkŹ’Ľ9Î0”4ę¸ls@y9V)ÎÂć—ŠÖď'M30yřĄ_ ŽJSgij­ŕqT„ćY{úˇ5Ů*žŞ¬˝ÚGÇ™(/ČÁŔ§ZyT ©ŻXśŃ†ćX‘ä —T&ˇiúÂç-ÜL'ţñˇÉŘp†^×ăąyŢĆÝ,DYh í­'o xŁŰX O“Ş<‚ť.´k__Äóî˝'ÉÖŔ†§—˛ń/F2ĺÉľbyc=TĺÍŐÝ|w?ŹžtuŞßTd5‚6*…±ďÇäx«'‰”ĘoŮyŚŠ ëWřć8kűOűľđÇ‘ěýUo’M)fť-,FĐeŞ‹Q‹µťéąĺw/—Cm‹Ľ>ű.Ô/;çEăŃŃÔ9řWątú,]u™#¸—\ ¤}B­ełmćř M6) rl Ç(!Î:ŔÓJ_ŞůŕŘ.ĚŇÎ0qĚHETń®Ě}Ý<(ŇŠťĚ#VĚZ¶SĆăb®đ—qă©âČ7 ţŞ×eۡ`Ňť:‚®]pÓdýYhTŢ ‘a”ęběóᏛ"ËKo~0Čć Ť%‹6°jÔ“kťúńd›“ÓK‰ÎŤýĄ{™|ö‚,®_ŔjIéωÝÇgşp{z'ú@ł“śÚH˝ŃpĂ%Ęvů‚ Ó‚š{ľCžé ©¶Ďęwxď8–żąŔ¸ĄTA~ 3{»4a–ys‚xM›öU?L(VhGľÚ<®Ľ¨?bţ~,ňůB ¬F†ÔôZsÁ‘Ea,*O#yz'`ĂŘűpÄdťwÉ´Éß%“y/Q¶P+ëżW=ţµ˛’‘ĺÖ6ŽJɖ΀TB(÷ĽË­uÁl8B]K‘Í2śĆ„ł$NŻPVŢ0GVáćE JŔc«–Đ;nGÚ~Ý.mY»YZ…“ĺŽk3 .…{¸Q[!äó:5)l®řł„†č[}B=´Gˇ˘ŤĺÔŹfň÷bDŤˇ?0őČ{(Ú‹ÁKsüžąÜĚĐđdŕ‰G˙Çő‚(žR{žĘ!^ŹOňŰçW4˙4¨@®ÔŽxąF…˙ÔCxYdśľw$ŁÇPIöջ¦JÄÇ<ů.4Ö–ćdšIăfÉďtNj`X˘ąµ"îW’Yň˘âÔâJŕ`ë©÷‡¦—)üŮßĂv~‘ŕo<Ô~¸Ny>B‡öR ďúOőfKŠO=:Ť›?QŰiВ첋÷#!Ü€/öHĂĂ©q®pxő·á±›M´‚č˝$Îď|a!XbĚâá”TŁďöJIıÜÁ6,ć©fEYD»˙(ŘŹäx청3ĐŽçú¬îţłý‚~üËÇw&±P)  ®ý†G¶c-űőĂâeriţ#Š‘ąŤś&ŮRi% !VC;çĽéňŞ?Á* |ĽQ_›˛‹ŇŘAˇiĹVŤůn4˘ÂYŮióóĚ*ŹmxbIŁw¬7™OĘîŘĎľˇ@24ľ+iŐZű3ÔxâĎhćK=1Qđ ”:r1~Eě˙¶6$‘/çá$ÉËčśą°ˇ­<óΊ\Čţ~HVmÇcbŰă› ţîš+BLűţháv\š®Ćc3¤qaŤÎôëUdqb ˇ¬ëbr€•¸nλ(Ćď×ÂÁ޸ůÔ;–/ĹzŚ4ď«%)Ď™Ľü&Ąý«#Đ{Ťc^hŠşr˘¶Ź#žŽ­řĘřĽrOl÷ ą©žč/ÉŘ{Ř-ݶ&1`Ď&ĹŠ1ý‹oßx+ŁçcŽ2¤-*¦ aĄoGiᲯďpă”Đ~h0fy8<¶Ň×§ \¤Ůq)rUŻč/|°PŚ\šĹSN«ŢΛr k yś6ĐH=6PWţ$]˙ ł‘Ő=0ămăNÜdŠÖ…“nĐc•2vY‚ĂŐ4·+Đň8±QĚéő°bĚž™†Žą5Ôśâ’őڬ'c˘r’šĘ:ŚĘĐJ΢˘i©oóň’ęá@'ËÄj÷Íä­’OĘ?0÷҇^nRěŹfŇľM«o]uăeBĘSŐ·ô:úÍ›÷9(řéĂ‚e‹Ů6w'ˇ€ăńŚX5"i×ÉQ'-Ă 52zÖÔM˛Vég*leŃNöňĂ9Q`~4P6”}ľ»Ô )lŃž×k<É&sö4Ęn—nŔ˙ü•h©‡,ŇŁ¤dł„;ďŘ‹Eu^›Ťłši“ăËŻ6,Ćü¸ &.‚H•8ŽŤĺš¸vĚLµą<~±ߓ´›‚ŻKř<•Íş`4Ŕô}?î@K2Ż;>ÜÜęĂÍNo_ç| űË"ŕ.ÂVçÉ'˛ ¬câö#˛ě<|řŽĐŻpĆ|<öŃaxłäĺY6dČň¤±}8Űçj§rá„´3ő­•ßźMčĐ„ Ąî¶ňˇn˛î9\H+Č@~îhöĂ ĽČ[9&÷–­ć‘Ű[úqÔdÍ"żł;äŠ,© äRQj—Zî­;N8Ĺ[řţ®Â|«Qm`{I‡Ö 1ŕôłÁôl˝'9CK3¶eTř!:ťőt™çáËfę?¦ĄmaxO&Ö\APRyťI5›]‡Qx†đôŃëÎôě0,*вÂú[âkÓńĎ½…íĂźA)Ľ0ŻóC7±g…"%ŻFçoZÚő98K{ö€ÖE‡(BÉî†ő)ç$¶XQŃ)†©ő(Xv (çĽÎČJš‡ĄÇ¶Vűx'j żE›•Ń;+0I9núvx‹ÖKp"ţBtˇ1FM˝˘ÚPł˝´ĘŞlľŃŽ4żfÉňÎÉť&ć×á |rŔ“˙m4Ŕ>č>Ź&cN(G)+ ”D‚žwÉŢ‹ĂÚ*#§ŻŞKi™Łęď[«%bá †˙Ď-ŞVW÷x B Ń9r.%6¶Ţ\vú0Đ€b˘JÄĐB`5µ Á‰n*ÉôăŢżí›p%ćŤ*©aę5řsë<ˇ_áęĚ$śaŽďěÜuiç®ň­‚N«S"j]0wţÉ7‚ *äfĐ®Á’ú˘xĽ?Đúâž7 uÚqÎĆlŰކgëA±§Éů ąeöSLŤ<<ĂD7¶©Ł…±VóËÚybNRGŮđ§‰'\¦E“ –Ą Új=ŐDŻDˇÄŻLáů5„5‡ĚŞÜö2úwŃćÖ®­˙¦ń‘xÓd<„o~Ď”ÚÍ3ťçO™+çSBďÝšÝěŔbť×Ľ čhÜ~÷O†Ö!NÄÝę]™É’tsRň‡ÂEŕiâT ‹f#ăF,ÝÖWĽítŁm‘U~˛¤šk0Ë+bJ4Đ^p‰Ňl/o‡›\9¤Źö gÉ(Ť!ö€f75TCgŚY}SđŐÄ ”WÓůĎÜčÔ1š…ęţ±[Ŕ:(ˇđ–z@,•zGÓo Ď{°h“Ŕ€F+Z‘0Ć Ë.ťCHf:Ľ>Ś!5nĎ3ʆ šłĄ"äA/çâlQ>f¶\ę<fßDĆŘąT«w»§°ŤjöRŁbʢîfśl×Ő{ˇ¦Â4i:Z_¬ŔT\E÷rNz˝î«rÝ6uľ„ăFĂ1u6€WÓČee“\Ů b×çKÝón•’,~_ďwŻ Çx÷?”ÝéŠ ĽËŕ$@1ŰBRą0nÖŠxA\Ş©¤łzUÉšŢËzlśôŘ…Iž×ě٧qŞŻŹ˙Ĺî˛ĺźÇXHäbćŽv %ć1ˇA«ö«Ľ±‘e}ÜÂ7ÔMެ€0ć›|“ĽHćUňäprŻÄ—:ĚbutęĎ€~Š67Mü/Z^żm.>jL)µ‹‘“IMmŤ~Ę–ßÍ+˘Q˱ŤŢұiR˛¸_>˘g/Ô°Źq™Z9Ţ8ĽÇú'YEP›HVí¸ăŐŽ6ˇĽţěRśôv;?IçĽĆR‚™U˘1—\Q}čŚ §ŽBŤ[:G§%®»‡őR+… m4‘—T[«/h]?Ćٙǥ|˝Č8ňŰ )=ŁU#NfŐxJ[’ŽÝÎtôr´>3_b÷č^ŔSX9çÓz,äŔÁµ}©T<p:éÁ§1j}ńëŮş›Ě;ŮEN/2:4Ľâ÷€Trm`ËŞmgÝÁj °Dôü¶ŕ”- Ař Ţţő‚öµY;R‹9ĹmćĹ“'oˇ4´Š‘“ţŮ»O˙óm)˝4_źdűµ€řjlţ>ÂY@˘#š–Śß•cqľŚľW˝â‹ÎjâÄĄzV)xpŠ_M¦61t\ŤÖIYts*áďÁÄăWaOML\«,Ě{8>ß±űʸÍ[h&´ĄÎÍŞÎu3ön$ĹÝrX6`úÄŕýE( ęĚŘGHsJE…’ýý‡&IP•ÇN)űt†ý䷢Ң/d  †Pă]‰Ăłb”„-—ÇŠŰł§"gűěiśÖ˘—ý…1Lć}ęÍŇ5CŤ°°w Lł‹¸gŦ@F3hăF‘Ľ9çřŠv&źB”1dKĽÚďî@°ü››źĽljň›+–vH#đÖΆAh-ě‰ýÂŻŠĄ’ůňô4Ď\ş•Ȱ@\ě΋t53ÂÔä™ä-2žu‚íćŐpř9 KŰŢűźŚ$s ą®·š!u$ŃÜęĐ´[ot1ů›§öőÇëiT?zťEĽĘf˙hLé»±NEÄ›€3ńqŇź˝ó8Đ_šf4=óÁśsĄa–+D_\ôßĚ‚edÓÇx. ÎpĎqUľŞuž\+XJÄ.čĎ2ź3ą3sOxďíuUŞ1ŹČDjzžŕTj?˙ł6šÖxüV†Çľz€ÂDqOĺě¶gđgp łŘä÷d#‹‘JŹcĽ i×/E9Ą?-ÂëC–ËśUŔpo۸˛f98Ü$ůŐÎ}†ŰşVw|ă¬›U´±ôÇP{L>WăV¶!Giݏ ĐßJ*0 –öĂĐßšodO0o›$ôÔÉ5>€©g ‹!hR߇z”ż®ßÔ'ć.ní3Á8ŘB®lÝ.ł…ÄÜD¸YW×÷V×OĹüÓ{[čµSx»Ý:6^őaţ“P~ˇ‡ůŨ0bř⮟đbć|úlˇÖGÚ*ĐżGIč"ŮżßHčĆ~ ”\ÎP .­s&†c™őRÔ±Ů˙ žP·>pküsJ—^ţF ]ůHËq˘m(’@ĽľrÔ ÖZ7Ů:ńM› V¸c*⎭7’L´׏%Ă>?¨wĘĆSâđ›zP©aj‡äřĂT!ś(y[Fbo¦˛ŘŮnQ;q˘aŢöT] UĎ«vó[6„ł±…ÝÁśćˇ•ĂŹ°ź0E‹ŻłżË’Ś—´@ Ń0˝†Ç¶{¬řŤ.C¨`h U”ńFEß^żglŘ‘&ŚEóąTóްřąJ…sU˘˘’4=¸‘tÜş×_A~­ÜlůEµn˝Ř§§™Óđ†łZ.HÓýÉpŞ[@0?íČuqő7>! ŐÄK¬la âŰmßźB&RíŞn@^·nß Bź…&uŠŃş(Ý/Ý/PŹ’6×íU%Q´Ů–›çD`¦¬ÓŹÇĄéF&ďş[É3[ţD‹ňü8E°™ţůeOX{I¨Aţ+ąUa‚„Äç´Ź+ę$݇ŹTWĽě:ËZBWKŮRšÂ0ć¶€îCFÇíÍ…ő•ňôąđŘ[ ¶­ó…ÎȤú$aŕò‰ú‰ˇQh‡d§%í|ëd./].Ëäľľ”‡A’*ú…‚%¸ůŁm–u“í¬Î©uĐ%"©¤F\tČ8-ŮB§Đ9p€Ń´pÄs@µF™şcň!ć$sk!đ~)ůL¦D¬ęÍ<~ľe¤ł_1ĚŽËyę‹4í5Ň®‡vČY$X¶Ű)Ł•ů~KVrdęČ„é9˙ž'Arµ^ZZž„ŇÇf6(nţ=… >IŤř#nNśŞÝ@_m eď)Ş—ĐcZ"W|ş9Ut‡˛iX„ wcňö \¤Ff‡J”XĚkDŁrDŢĺźL„âäÓ‰µ^†EERú?šĹ+cďćý'±ÝgFŚ„yé´C_ ţ@}¬Î±Ž¤’¶jäLîÚčn)Pt/—÷ *™úÔ/ߡQz"¦‡,Ďx˶;CˇË¬Ń˝1ĂZÚöŚpĄřY;†#›V~ÍŽ‘ĆÎ˙ýŞ&~°ş”8ŞňE–…Ůň©FhőT¸rUłŞ4wű{Ľ“•Ť(ľöXąŐAúű„~¸‰bŠĄ„*'{án…•7É i¨",µF˛më!Ý©#…Ţjv”a‚#ń±€Ü¬D×@ÎŤ\ç1đA\ßćˆ˝CšúŕO‹Ş‡V‹= ÷4fBW-˛ĆŤ§ú–y“euďĺ|¦¨3Żb‚ýŕ°("ŹĄX&{ÉWb‹,čl XÔĎa‘WĐ_MćÓČ'mĐvÓ¤‘2Űz:cűڦ=Ĺ]Ł×ʸÚGó ®Jô€ôrZŁBŕ!y­çĺ7s«Ś Ćť:Ë`G)×nłB>Kߪő·ŕbt*łÝ Tv7–iżĐńMW]7mÉaHpâ“ÝÄtžä}×ÇUý!|+–'äq>#3ÉżRăÄŮ<}ęń!őÖ«T,CBÔâËţ’}?Řda˘ â.‚¬iPŐßńzô źęb4ęĹFr-×Xęł i u73CŽt'µßP!!+ťŰEŁĆlk+î¬ý–Ěđă«Ŕ}sä{.ÍČC†şĐí±=iű&m•—˛w‘ÖÇ5h|LŰZľ ň¨ą`DJ—fËYłG¸Ir ^ÜÎ.k—iŕČ““őőn¦+&GŠŔ›U;SŔĄ ‡Bk‹~?oÖKŘfě{d±â´˛Î®Â·~+4ŇŔßd‰KŞč‡#‹ńy°9ż‹~Ą|évćJa¬«Ů˝.aÚĺ :,E€©[ôň׏ü*ćD‘(Ĺ(ě‰ç,y ř¶C›llßý€ łbDîŕyjt§ňg9ć"Ža6ć‘ lšAaś&ŽÚrC;:t¤^xr µhAíú±Ä“Ň~™t»÷âŽmlľűRóą R‘VloE‹vˇ«CťŞc%~/É–”ř ü×$×[Č™$Îňţ˛ž%ň5˘ $ü±×ěj/ćü¤¬Í‹‰°…ŹĚ“kŤ•9#ZµĹ@‹…ŮĘlÉkřa orŔ6©ÉVöűť(Y)" ž¤vh 'á…T~c+·†Ţ_wf ôŐŢ}<Ľ&-÷`P‚ôĐ-‰a±îńŘ7ŮĘVŐöĹk#qJV›CĐ>T`čr00łËOŁ… `t=⪠ł ŇŁ ĹbÖS»w§ßz@anP±;̇`ŰŮ‚«M”ąľń h#9Ă ×xXÚôLŢ»M)źŇ[\qʏy'ľą9ýcÇRŢů™âź¶îC*Vh=bŃ`ŮvlR3kćö/ĄćµÄxWX·¨kő"‹ľ'§­’2^Űɨ›îM†ĺ-3†ŃÄ—Ww—4zË”TĘŹ=Răm˛*‘‰âřxyFöe‘5LŚVĘűc¶e-üHШČ3Ř<¨•ÂłŇcÝ żĚč;˙v }z¶ű ‘ĘÖ{čľ«ţ‹;âiĹ”âŔAłhˇđď…Mä÷˘”Q7tH“"=vkŔ¤ö"ż{ŤŇšáq¦E»jVCy)¶ŤZ 4> stream xÚmTMoâ0˝çWx•ÚĹ$ !Ů ‘8l[•jµWHL7IP‡ţűő¬V=MžßĚĽń s÷ëu;ŃU··őČŮ›=w—ľ´“ě÷îÝÝĺ]yil;<[[Ůj<=?±×ľ+·v`÷Ů&ß´őđŕČ›¶<^*;˛~&űQ·‚>ěţÝţť”MS >Ů_ęăP·ň{=éÇsć@öd”ôÇöçşkźxäś;`ÝVY×`Śs4˝JaÓQܡn«ţއíˇ.’Uu9\ßčY6î>Ľý<¶Ů´‡.Z.ŮôÍž‡ţ“4>DÓ—ľ˛}Ý~°űŻŇÜŃör:-d0­V¬˛WŃÍ˙Ľk,›ţ8ăŤóţy˛LŇ»đşĘ®˛çÓ®´ý®ý°Ń’ó[Ĺ*˛mőíLrź˛?ŚÜÔqůĄă• â5F8@ š=@Šđ)&°  Č8Ôą€ÂĹRx u€Dş\j2H—†ŞˇĐVÁą0CzL]ř Âb°ct‘I ©g$`htŃ‹0śĆ\F„áŚ0ä†sę‡á jd< —Ię6ś»őńzgóńşË»ţę W ¤qČ’Ł+—ź#ö•ńĚÇkÄŢ .‰bŞsťŹré…¤šáćÄç†bďmŽXúľ„Kß7ǵHß7Géű„űľnb§>&jĘصäuśŻĽú•ń1ÜV™÷•âÜăâµÇ‰Ou$ŐźqWčS/%1{\řxB!€§ÔK(hH©—TĐ–ćž»J©ĎĎŻv×ÜëÁ=küŇ2řĄUđKĎ‚_:~é$řĄÓŕ—ÖÁ/ťżŚ ~™Eđ+7żčˢ/ ˙lěˇŰŇ(/}ďö -+ZXukoűěÔťE?Z„ăćĹŰKýqíÄ endstream endobj 937 0 obj << /Length 739 /Filter /FlateDecode >> stream xÚmUMoâ0ĽçWx•ÚĹvHU„dçCâ°mUŞŐ^!1ÝH ý÷ëń#xŮö?ŹźgěÁÜýx]OTÝmÍ$|äěÍśşs_™Iöss îîň®:L;<S›zś==±×ľ«Öf`÷Ů*_µÍđ`É«¶Úźk3˛ľ'ióŃ´ž‚}Řý»ů=©˝ŕ“íąŮM;áŕľ7ĂŢrľ›f¶ĆnjĚ-ůeúSÓµOLg~ĽŔ8÷ă ăâţČ)okŕ çA„8 ö$`I\čÎ×3`çAfŽă<ČZ]Â!‹„ę xNkÇyăąăĐđ"ś7Áż _Ąă“§Ěq âH`ňáö•‚núĄ¤kĚÂđRONH=CpB:# =Ń%8“88QA~ˇ!*ÉzĆśřĐäT?!~Ž> étw©8éÄy*ásŁ¤ĎŤ }nÔĚçFE>7*öąQ‰ĎŤR>7О˘ G]Ľ;~îó¤ŠŰ<©ň6OšßćI‹ŻyŇňkžtčó¤g>O:ňyұϓN|žôÜçI/|ž´ňyŇÚçIg>O:÷yŇ…Ď“.}ž2îó” ź§Lú> stream xÚmUMoâ0ĽçWx•ÚĹvHB˛ó!qض*ŐjŻn$HPý÷ëń#xŮö?ŹźgěÁÜýxÝLTŐîĚ$|äěÍôíą+Í$ýą=wwY[žŹ¦žŤ©L5ÎöOěµkËŤŘ}şÎÖM=ŮťëĂP7ň{=,éŰyf‹ě¶Čܢ_¦ëë¶ybâ‘sn ySĄí6ú`z‘Â¦Ł¸}ÝTÝEŰA] $«ęr¸ŚÜwy´çĹ›Ď~0Çułoĺ’Mßěd?tźNăC0}é*ÓŐÍ»ż•f§6çÓé` ń`µb•ŮŰŽÖ˙óöhŘô[ŹWÎűçÉ0éĆ‚t•meúÓ¶4ݶů0Á’ó[Ĺ*0Mőß\B+vű‘šX*źă+TŃ*XĘĐbŁŔ-¶L†š s[ ‹#*X,caq˘\Áâ`™`2IŃ ôPčˇ×]¬®QA2•¶ÝE;XĆŃXJKŞC kŕá8˘8pLŘőąěěÖB§Ňő$qŚĆ©/0Îü8Ĺ8˙‡?rŠŰxÂy!ÎBŔ=ÉXú„óŔő Řy©ă82VA× pČ"ˇşžÓZÇqŢxć8t9ĽçMDđ/ČWářä)uśś8|¸}Ą Ű†~)é3ŕ„0|‡ÔSRĎśÎHCOt‰Î$"NN”“_h ň…ž1'>4$ŐÁOźˇOB:Ý]*N:qžJřÜ(ésŁBź5óąQ‘ĎŤŠ}nTâsŁ”ĎŤ˘¬(čQů<©ü6O޸͓ć·yŇâkž´üš'ú<é™Ď“Ž|žtěó¤ź'=÷yŇ ź'­|ž´öyҩϓÎ|žtîó¤ ź§”ű<ĄÂç)•>Oéězgî—ď~éx›đ’^ź˝ňÜuöEtĎ­{čđÄŐŤąľČ§ö„UîăžňńżŁ—"ř ›tŞ” endstream endobj 939 0 obj << /Length 740 /Filter /FlateDecode >> stream xÚmUMoâ0ĽçWx•ÚĹvHB˛ó!qض*ŐjŻn$HPý÷ëń#xŮö?ŹźgěÁÜýxÝLTŐîĚ$|äěÍôíą+Í$ýą=wwY[žŹ¦žŤ©L5ÎöOěµkËŤŘ}şÎÖM=4$ŐÁOźˇOB:Ý]*N:qžJřÜ(ésŁBź5óąQ‘ĎŤŠ}nTâsŁ”ĎŤ˘¬(čQů<©ü6O޸͓ć·yŇâkž´üš'ú<é™Ď“Ž|žtěó¤ź'=÷yŇ ź'­|ž´öyҩϓÎ|žtîó¤ ź§”ű<ĄÂç)•>Oéězgî—ď~éx›đ’^ź˝ňÜuöEtĎ­{čđÄŐŤąľČ§ö„UîăžňńżŁ—"ř ŐŞž endstream endobj 940 0 obj << /Length 900 /Filter /FlateDecode >> stream xÚmUMoŰ:ĽëW°‡éÁ5?$R. ¤d9ôMđđ®ŽÄä eC¶ů÷Źłk›m‘CŚŐpą;;†wź~>Î|żŽ3óEŠ_ń¸?O]ś5ß¶‡âî®Ýwç]Oßcěc]=~?§}÷OâľyhĆáô9%?ŚÝŰąŹ×¬Ź“B|Ćś‚>âţ)ţ;ëvÇw%gĎçáí4Ś3‰ä§áô–’>\ ‚‚6ý§ă°ż őEJ™€őŘ7űĆ8ó 1ż’{Ć~şđĎ`W(-úˇ;]ľč·Ű%=°ůńýxŠ»‡ńe_,—bţ+-OÓ;qü\ĚL}ś†ńUÜ˙I--=ž‡·B«•čăKŞć˙ľÝE1˙pĆ[ÎÓű! Mߊyuű>Ű.NŰń5K)WbąŮ¬Š8ö­iÇ[ž_®ąuĘ•MúŃzQ­ŠĄŇ)V†€Ú(TŘ€ŕxżŕޢ žjy‹°°!ŔĐÔ•µZÔŔ2ŕP="¦ZdÔ0\ĂG©R\ˇ·”).–2*ÎШa!„UĽÄ,†łÔŰHđ° `+jĐĂ.¸5Nα@čâ°čĐVK-ŕxź%ôÜ3š% A°YÓ€zˇÎšÔ>kP#¬ł¦ő™5m0WŁoš¦Ăľžj­®§Üý·ť.†ĐZˇŽT$X/©)n)ć#W—„o(ć“oŔRZŢ $K˘p4’ŽZ¶-bâ\­1¦Ü°Jä ćP"Gń‘XÔQ¬‚i/8şkÉ^€ÂZqŚ:ZsŚ˝š9”d š­Bů Ž)ßsLů-ď7˝ćxĎJ›ˇľŇ`ŻažÉ˝)fĄÉ$†µ’1™¸ dŃŠcŞCZCů<Ł7Ă3JĘgózĚnřţHȰíáĚYÉšäTśŻa…ŠďŻĆ,_»ś-ź—Oë87Ë}ęŰKÔ´Ü—LląoKńšň+Ęg­JĚâ.ľGZyóş‹VđŹc­48¸’ďĽäŘWtů]Í:P~`ŹáŚń±–rZŽq.nÍ1]Ç ÇŕS˙ć/©ßP•ýďuöż7Ů˙ľĚţ÷Uöż·Ů˙Ţe˙ű:ű?Čě˙ ˛˙Îţ&ű?”Ů˙!d˙‡&űż1y–¦ĽÍH·śn5ţąă)ş˝ÝyšŇ“Bď˝x#†1Ţž´Ăţ€]ôGoáőńĹ׏Mń?®Xę endstream endobj 941 0 obj << /Length 1022 /Filter /FlateDecode >> stream xÚmVMoŰ8˝ëWhŇk’â‡THÉrضh‚Ĺ^‰I IJ!ۇüűňÍŘćf‘Ť§Ń|ĽŽžt÷×ĎÇ™öĎqV}ĺŻxÜź§>ÎÚż7‡âî®Ű÷ç]Oßcâp˝{üVţśöýc<•÷íC÷0nO_’óĂŘżť‡xőúÜ)Ä×í]P§ĽŠ˙ÎvÇÍNŠŮóyűvÚŽ3ç§íé-9}zżLĆňٱ¤ âtÜîÇoĄü*„H†Ő8´űÚ8ó •r~%÷˛‡é§|»BŞrŘö§Ëý÷»4?ľOq÷0ľě‹Ĺ˘ś˙J7ʧéť8~)ć?¦!NŰńµĽ˙H-Ýz<o4JQ,—ĺ_RĆÔ˙÷Í.–óO{Ľů<˝b©čZ2Ż~?ÄăaÓÇi3ľĆb!IJ\¬×Ë"ŽĂ˙î)Á!Ď/Wß.ůŠUúSĘ7Ëb!ĺD2(\‘Á`O!•N† ő*IÖĆŔ€ŠBT·J MŞNÄŘ(öđ0ŔŰhĘQŁŠAĂUZ©1‹p{©B†b§Z„X„Ű@I[ł·Ôś˛(ë@̱J¶0 ‡kŘęr\¶AH@Hyb-p«nKSżŽWŠŰĽűß›ér4)N¦8Á9T< Ź6µdŘG3&»¶©í„c ĘĘ­+ŕ†1ůĐđd‹¶D`Ś©–ëâĎÂ×8yÁgŚZ’¸Iâ&ąµG-y:ä—šsR¬aŚIËŁ XÇvňŻŮŽş˛a;8Kćé 3OOţ-ű GŮ1Ĺ<»yzšűBżŠř¤A[ĆČŻorŞš— üŐU3W<Cy:ŽE/Š—Ŕ›ZsÚv®ëŕ_q]:—Šęzn•c˛S]QQ,/¸·ęÂů+ćŔ±ĚÁ:ŕ矊ĎÎÁ®éŚL ĚűÓ˘ÍÜjić0CÍ3ˇŮjćfÁ_ל‡pĂ|<çÄnčŽíŕ¬WŚÁYŻłá=75¨+„Ă»ŃŃÍ»ÁŹ?ď°DNìAʆ{”Či)gĄŕců‘U¨kąÇŽěÜ#í§˝ô°Üc‹ś–g«ÉÎłŐô¤+ćIf¨i·Ý%?ćć8ż$Ěů+ps—ü„iVŽ4Ęń™ ś…ăşt‡űj0źú?űěq X/łVx•µÂWY+ĽÎZáMÖ ď˛Vř:k…o˛VxźµÂwY+üę¦$e¤\˛ţ(d~ťE$¨,"ˇĘ"t‘`˛›E$¸,"ˇÎ"š,"Ág !‹Hhł„.‹HXe ë,"­Č"ŇVyč­ľFnďNĽéoŻĺţ> stream xÚmTÁnâ0˝ç+Ľ‡Jíb'$8B ‘8l[•jµWHL©$Q€•ú÷;oĆĐ.Z ˘ńóĚĽ7/Žo~<ŻGYÝmÝ(ş×ęĹşÓPąQţsÓ77EWťö®=>:W»úĽ{xPĎCW­ÝQÝć«bŐ6Ç;J^µŐÇ©vç¬˙'-Ü[Ó~Ą€GÝľşßŁţýĎÖ#úiä˝6ÇÚżŢR´V—µâÔ_n84]ű Ě˝Öš€e[çÝşÁŘs«ńYÍ®iëÁ P[Č L¨ę¦:ú?«=€âőçáčö«v׳™żĐćá8|˛˛»`ü4ÔnhÚ7u{QEčúÔ÷ ”ćsU»5ŁY7{§Ć×C]¶_?{§B^QSuµ;ô›Ę ›öÍ3­çjV–óŔµőŐž‰Ąd»;ç&”«§x‰™°D\20-0–b“Ň# “ !Ú‡\§)&q)€% 1Oą‘NĐÔ"Ű‚%”’4˘8ť0`rČH%ĂDdč‘ĺÜ#CŹ ýŠ©K Đ.%Łí˛ŔÜ"l é%˛Ë€ěR„Q ÎNÄúěLőľČđë°HáI(Ł$ôçuôµ†x-LமĄüÚJĽ@śJś!^H Ń:ggM«5ă9¤ć7F7ĚFŚăN°ž|[{}&ţF“Č„űf*śpŃdkć_Îś˘‹NĹ0VG9×ú×ʱçĐúwţDKŚů¬Ä4XĂ=CřaCÉ–g2)4X( ÍĆrb0§/sŽů4ęlƵ¬Ç.‡ËĂÄÜúÉb®]ĘŚĚ[r<ÎÔs!?őďŤf*µŚ{.ř“z.ôI=ÎmZoŕJ™+Î9ÇRŕĘ ńŤĎ¨xč?Wúđáârą\Őič¦ŕo|˙Më.—Tßő¨â?ßnçű«§2ř Ý7rX endstream endobj 943 0 obj << /Length 700 /Filter /FlateDecode >> stream xÚmTÁnŁ0˝óŢCĄöƆ@LE"¤¶­šjµ×ś©D’•ú÷;oƤÝjĄŤźgć˝y_ýxÜN˛ş{q“čV«'wěÎCĺ&ůĎ]\]]u>¸ötď\íęq÷x§‡®Úş“şÎ7ŦmN7”Ľi«÷síƬ˙'­ÜkÓ~¦€G]?»ß“ţíĎ`‡ ý4ňž›Ó;íßR´V—µâÔ_n86]{§Ě­Öš€u[çÝşŹÁÔs«é¨fß´őŕ¨Č L¨ę¦:ů?«€âíÇńä›vß‹…š>Ńćń4|°˛›`ú0ÔnhÚWu}QEčöÜ÷ď ”–KU»=5ŁYďw§¦ß‡şl?ôN…Ľ6˘¦ęjwěw•ví« Z/Ő˘,—këo{&–’—ý›P®žăaffIŔqÉŔĽ ŔXŠMJŹ0Lf„hrť¦dÄĄ–€ÄP<çF:AS‹l –PJŇâtĆ€É #• ˇG–sŹ =2ô+㬠(@»–Ś´ës‹°5¤—Č.W PL˛KF1 ťőčLő¶Čđë°HáI(Ł$ôçuôą†x-ĚமĄüÚJĽBśJś!^I Ń:ggM«5ă9¤ć7F7ĚFŚáN°ž}Y{}&ţF“Č„űf.śpŃdkć_ Îś˘‹NĹ0VG9×ú×ʱçĐúwţDKŚů¬Ä4XĂ=CřaCÉ–g2)4X( ÍĆrb0§/sŽů4ęlƵ¬Ç®‡ËĂÄÜúÉb®]ËŚĚ[r<ÎÔs!?őďŤf*µŚ{.ř“z.ôI=ÎmZoŕJ™+Î9ÇRŕĘ ńŤĎ¨xč?Wúđáârą\Őyč¦ŕo|˙Më.—Tßő¨â?ßnăý‰ŐCü_er¨ endstream endobj 944 0 obj << /Length 997 /Filter /FlateDecode >> stream xÚmVËnŰHĽó+¸ÎAŃđM‚y€›±±Ř«LŽ˝,R ¤˙~§ş(ŻłđÁr«Ř]]ýŕŚnţřů°ŃĂüä7ŮW˙ň§ů˛ô~c˙ÜŁ›7÷—źÎß˝üp}zú˙\ćţÁźă[{ďî§ńü%8ßOýëeđWŻĎťŚ§˙\'ľ}ôoާ·eŢ<]Ć×ó8m|Çókđůěq°ř7,–żürçé[ś|UJ ť;PĂ)Ú®:âíUŮó8 Ë*&~‚´(IăaěĎë7ůěˇ~x;ťýá~zžŁÝ.Ţţ OçĺM~‰¶?–Á/ăôßţ¦,x¤Ą7¨Ą«Ű2¶ ¶•.ĄˇOŔC+¤©BÇ89Ň Ň:¦u mŃđ¶#)„u:#@‡,B:¦ 6f{bÓ\‡Ú˙ł_Â> stream xÚmTÁnŁ0˝óŢCĄöƆ@LE"¤¶­šjµ×ś.RC˙~çÍ8i·Z)Aăç™yoĆ7?ž·“¬îönÝkőâNÝy¨Ü$˙ąë››˘«ÎG׎ŹÎŐ®ľěžÔóĐU[7ŞŰ|SlÚfĽŁäM[˝źkwÉúŇĘ˝5íg xÔí«ű=éÇăŢúiä˝6ă;íßR´V×µâÔ_n85]ű Ě˝Öš€u[çÝşOÁÔs«éE͡iëÁ P{Č L¨ę¦ýŠźŐ‘ @ńöă4şă¦=tÁbˇ¦/´y‡VvLź†Ú Mű¦nŻŞÝžűţÝAŇÁr©jw f4ëăîčÔôűP×í׏ީ×FÔT]íNý®rĂ®}sÁBëĄZ”ĺ2pmýmĎÄR˛?\rĘŐs<ĚĚ, X#.K±Ié†ÉŚ€íC®Ó€Ś¸ŔŠçÜH'hj‘mÁJIQśÎ09d¤’a"2ôČrG†~Ĺ\€5h×’Q€v]`n¶†ôŮ劊 @v)Â(†A'b}q¦úłČđë°HáI(Ł$ôçuôą†x-ĚமĄüÚJĽBśJś!^I Ń:ggM«5ă9¤ć7F7ĚFŚáN°ž}Y{}&ţF“Č„űf.śpŃdkć_ Îś˘‹NĹ0VG9×ú×ʱçĐúwţDKŚů¬Ä4XĂ=CřaCÉ–g2)4X( ÍĆrb0§/sŽů4ęlƵ¬Ç®‡ËĂÄÜúÉb®]ËŚĚ[r<ÎÔs!?őďŤf*µŚ{.ř“z.ôI=ÎmZoŕJ™+Î9ÇRŕĘ ńŤĎ¨xč?Wúđáârą^Őyč¦ŕo|˙Më®—Tßő¨â?ßn—ű«§2ř %ôrg endstream endobj 641 0 obj << /Type /ObjStm /N 100 /First 929 /Length 6001 /Filter /FlateDecode >> stream xÚÍśisÜ6¶†żëWđăLĄDb_ŞRSĺ%Îf%Žĺ¬.×­¶Ô±5‘ÔŠ–,óëďű‚öćnGńLŮd“ ž<8 ĺ¤hDă¤l¤ÖřUŤrżşŃ1ŕ×4VKüÚĆ9_×řčń뛨y_h¤pĽ16RFwŕ”@I ·*iň(ŐH‘GéFz…Ň•id°¶‘1*¸FIĹ<ľQĘâi(BéŔrb٬’ĎSÎ"R> ŹFžśFžč¨Cl´x„¶8°xşqŤ–TA«F+Š=µˇÚ4ÚÚpŕ .ą<—¤s—˘…˘&4Fjlc XcęÇYŐ[)“a8kăn‡Ć[y`‚hLdĹz×XéP ÷¨QV‹(ËđRllD%9dĆA€ĽČ5$ ŠUŽ’«ŘóŔ°BőŁţŠOŽ˘ ÚĽlĽÄí¬bŻQ˝©ŢEś!5Hžˇ2ă%ÔHŕÎC%T!ę—Łqú 84Jl\ lćhP šWşŕŃ’Ž-.PNÄUÔm˘ŔUEÍŽZGÍDć7ŤGEpĚADÁ6 f–GŠ÷:!O„8 ,XV}¤ÖĂL#MŐ9Ź’Ń(W"ĚSzéx•’iď"-Ň[TS¤%úp•e†; GžĆZڍ’ú¨Ś€m'ŁGőGč§„€µy˘€ť(Ď#ŹňTŕŐhpNĂ•ídQ4j¤á „ÓŠi–ÁÖĆ`ĚĎQJôâHzsđńÇÝ‹?ŻćM÷ŕňrq{Đß˝ľMçOĎ.9č.®Oç×/ًūîłîóîŃK™Nşçó“ŰćĄ6şĄ˝›ZZĐÖµZ[[aň=h>ţ¸éŽ›îÓĹ‹EÓ=nţq5{3o•űgóŻŕ˙_Â(Űžńşő0vŘA«Ń`&ŘÖjłYmďOm}‹~ŔŢÚÂ,µ­—쳲ŤÁn–A†{”ÁTj|‹ŁÍ}K÷glhŤŢŇŇßgE(”'Ąu+<|ťłřőôgm~Kk{4 ZK˙*ckUňŞ­10-[­ý‡© cDk٠ѡ „Egń0SQîĂŘ%k (¤jé5ŚVÉFŕ+[-·tyŹÍńľĺ0­ „Ѱ‰ć´ ѡ6 aÄ}6‡j5›CĂ] “XŰ*O™|«¬ŢâŞâ}ş*Ů/4* ŇMËO+x.#?E crlThc`Ƶ™´-F¦k–ÜZrK6K V rŮb–÷*4†łŢŔű€´Đ B`ś řŤ[„Đá>]•ě 'ma Áľy\—Ů6zݧ«bź4hŃ: » qŮâ©îSé[-.ľ–Â`ęô´!ú"C»”€s ŞŚ]Ŕ*Č”¸˙Q g©Ë(xk} H C%[‚%…HĐîC«Â‹¸Og)h…äú–łF aI‹úńŰF.yż 1bI>łT:đ 9)AŁx·ëđů¸yé0éÍó¦űáÇźO2µ Ôháţ/ďÎĎ_mĘJő5'l J)ߑٻT.&¶-ćYÓĽO—·IÖ'V¤I@şëÉ0?ëO,§=!ťŕ®îŮőâäxŽjhşgŹź4Ý‹ů·Í«iÍ>¶Ý#>żĽ˝Ád6•Ĺú»YÜ]źĚoŇü6%ÍOĎf4©Ćmäěš`PĄ5ůlvŤ"]ôŮS›Ýŕáś_S$NŻű_Ó˙š!Ý é¦Ou?mĎš§gĆś˘e¨@‚č™=Fmłm´–÷Ř1µCGl<&TŇĐřćN 2Á9l¬ďŃ-Jse<-FŚ“śO ®=@Vo¬ő= ÍŤbBajI;eż ě?Đ8©„ ‰ ç~°Šć±sްĄ9Ô=D —"Im„I U0PA&×z­wťŰĐuÝ\Rĺ98ŘUg1q#»z[©ĎD}Đ}5»ŕ5©]˙ŕŁŮíő]FËŕEŞ–|ôŞĎń0ą”Ć5‡ˇ08ÝĽŞÝ_çó TČĂćU’őÉŮőÍíŁ·łkĚ ş§łáD*ś}vzűö&ä’Oúäňdqzvů&EćR ó˛ř›ŁcĘ| ¦Žˇ—öň_–Ż˙}UµJÖröóĎs¸dVâKc»ă”®kaµ§óźQ?ş›1°*•©-mijŢä¬ěë*ew‡ç3^ĄŇ¦‡–QǶwş ŢbZʧ Ś”ěaďiĽa<ŽżÜ,g5$řƄغúČ«´ZF¨0lČ˝jr¬bÄľżŁO'Ď}›"Ż­RŘSô«ťíY™U{‹ާ6-šCÔŞ.˙}ŤÚů‰QËѨ˝[6jďWŚÚ‡Ň>V¶ŕŇ~żlP«©9e}ţŐ«űią»äÚ–{#wľ›Ą Ö‹M{¤ b|()Átł`š`LJ°Ś/)wEŘćxWŚHÁ†¦ćNr÷-ôŘ{{ăÖ˘ęg"01íx·äÝŚăJ5摆‰†śZ%:&2–î«ÄTwŠ)9vU®!ŘÁ&RŘÁ¨ľła8á:Í}Kn6ęë\îëťŇ©ÜŐ…Ŕ™.g2­ůä3tngË×\9cG÷ĺŚef9P úůLr.g”‹Ű‘äç" Ý…/˛(.YK±ŁÉł~^z‡ł{W—zĄ« JWĎÇÓ®šř Żs?ă—©†Ż°2|…Őá+ŚĂ¨ f÷qaęî,é€ůSÓď-l Ő$Ü0÷Zk:ÖtĚk»nŞ*Łß÷ĄĎa˘ß÷)ué1ËÉ3’ E›¶#0ȇŮ.\»eôe¸;-I7\ŇŇ˝CéÚńĚ \.źů8»Ş<ަ%PŽEQŐ›ÓKż˘ÂXEăŃ.{tݱ~vżm‡BÓn}j~ŢReĎ{íűýÚ¬ĘŰ!g?˘§}H&Óď“?OŐÜďűIŐľÚUŐä}3Ą§y†ťŁ>¦Ć¸*A¶o™8 >(mÉĚß—ă¸ţ‘B0 f\( ˛Í9‚łO¶ ÁŔ‰$ ŕ´M"ĐľbčEK‡çJ–hŠ’÷U•qÝĬŮçÚŻ{ÚĎO‰}űP‚GŔKöŻ@¶6QĹKqqyꥼZá®7ż ˛§p;¦ĽĘ—s¬Ţ·ś2}Öę“ĹÖkő•żc/¶\yŹI€e¤7 N¤¤Ĺ”1ĐÁđí°ÁÍ’ĘJŞĂŔÁYë:D”6ô呉<ĘKŰ”ŔŔ.ĂĺX^PHᦉg%OÁƧDÜ™6®ŮŹ©ËDÝDłÄoŘÂj㎳a°pGÖ~©qΓz׸ł O¸c”1T3)ŃĂ ¤J䣕Ç[4_/éé…sŁŤŕbć!ĂW62äpXR™·Ř1Ł‘Oń”|ÂOľÇł4[á`̆fp1ß*‰áóbE8OQ@‘ărE<4äřM#Oz‘eC±^č.˝0\za+¸ôÂUpéĹš@PÎĂŠxzY%xY%x©*(…KŻ ”Ký#”zi+(ő˛Č‚Ľô˘b *g|z¬€Ő«f9–°ň5‡|ĆńOŹŔşH-ĂT!ŹWc9|— źĎt‚¶´‰´ďQ™×4ěŽ)Ęoö°é:´V¶?6j”+ľ*?=“LŔĺ!?Yţ®şĺrXFŢU˙ZZÚ\Š/”sźęSőňő±†¤ĺ«óćßô,ëĘyĘÇtëJ˝¤zĂŻáŘ9Č•eä3ňo­Źąĺt?Ü;ŃŹu>”źË Śüĺ¦VŮ1z2ˇÁH"‹·‹Â:MxŽ áeଔCś&1ˇÇ*ިřŐQeY&•d0 řR램UJUI•Ę7=ŘôĆńÎ1wż×I3ZĺÓýéŘĄôtĽ3…¸'‰G&Ü#ąG!ű°G!ű±ŽÂŕĚÖÁŃ>p°?NlÎűW@GüMP´Šçóî_îżl Š´K ß•[B9ÎŕÉŘ3&dtÆ.5“ţ¤ wXÜaq‡Ĺwđő[1‚žäÁ\B?l.‡Ű°á)^dÄç4ÂGî´%Ć;|${`“üš"h0*… ů@a äEąöánľÄéţ.äNŻŁ?îÂRl®ßi_°sç&čMf #¸F™Oř"nć´¸7b¤Eo :bHČK·DGo2a Ő› ;x†/|G¨,|‡±9ľ­„ÂwD^(ÎśäŇ0‘ …â8Čł|38s“ĹCMɆ‡šŻPθ‘d}Y[p.…^††päŘôy9f‡“Ľ ×…˝µ# űĄiŽ‘Q<´DF=GHö%2ĘĽDF}Lá…‚ĎľFZâ˘+;˛´/QŃ€–+AQ‚u‰‰Çײó $(Ń@ľ«Űk7"·×…żąľ+ţö5űšżý„żý„żý„żý„żý„żý„żĂ„żĂ„żĂ„żĂ„żĂ„żĂ„żĂ„żĂČß%„šĆC¬i<ŠšĆŁ¬i<ŽÁdö]…–}45©—IC˾̚·—iWÂĽ.˛¤·ěG¦'ÓeöLśé|Ď fţ«Y5ĺő}đ<ç+÷ ÇqŕĹśž™3q'¬(1Š÷ô,›Y7ĎĘ1eř”ża/Ô[fŢáľť)̬ˇ0U-›©uËfŚSˇ%ŕ&lxÓ›P,űĽ‚b1;ľŢŕF·|=˝ÚP´’ţßÝ˙ďI´›\˙«rď˛ß†i#ĚYĚn h ·č°éwa6µ Ţ0* ­Ř¸ę>br§íťč†ÍÜ °•X6Ĺ‘ ›!Ł•¸/m˙M@Kď5pgÖ˘đGĺX Ťá ”QXs‰ÁŚJ€ ŚJ| XJěΰh7â\P~Äą0" †Fś *Ž8Ć€!$(cq® yÄą2âťBđČveĽ#Ű•áŽlWF;Je°#ۆ„ZŚltá4ÖAzAh%ŚćXŁ~DŔP†QÇ‘0Ž ů—B!_Çĺ5"`(° \ …;ÁAˇp§gąđ á"ĐČÁT<LĹÁV<lĹÁV<lĹÁV<lĹÁV<lĹÁV<lĹÁU<Ƶz<´i¤˝•,íMڤJŚ2}˛W 詣`c(Hů3bc¨VúůTWac¨VúńÜqĄŘĆ•~ ůa\é6†qĄ_đ% UacWúŤˇ‚Öa#6†ZȡŘFhEż #´˘c†ZaŻ!Ôo„Z%5u…Ťˇ‚V.uÚ Ă­ŔĆ0B+ńj„VE0†Ů"®BĘP…‰ą^© ’dĚËHćׄUSřt /îŽl«ËŠ˘÷sýëĂńŇëDGľé¤â˝żţół6» lnn~Ľ÷žo?DQăřÍAô ŮÓ şMÝ×RĐv‡ ş„Ĺ• şď ˘ó ďD/–‚2ňF9ůék™TTń ĎAtZP ŽÇ~Täűy\ß91)“)Kť$}],ÖYĎóo\+ĎŻLôüÖZńźQYµDÎ1y!"5‘&K<éÇŘ*›ô¶z‚ce%Ą_ăÉk=µZE˝ęy 5đmúÜÜ9­7‘!Ťy«őcu1‹”.őí¸™Ş)–7Ş•çŽőV›_ÖdÓFą6^ćśąş–·z­ŁŢęyě;MÝ™ué|;gIšµłîĄ•źjÖýjM÷çwŮ«Ý? eY—ťÖШ×ĐnÖÚé‹8a©ňÓE/ţň"Ë(Ń´(Ő˛¶Š†EŻţŤ¤PĄŠŞŞLýż*§9¨*´v6Čé*nN`ř­ÓË=Ăq‰LT‘ŚaĄ¬ä[çtä‡h"ýZ%–€]~#jŤ“É«Ż9ç˛čvwŞr€PťŻů*-»/¦.€Ę1uzŐŘŞ1–·ŇR%Ž4lym2oĺ¦Á4ꍂeSXéuy-uy¦ţwő›ĘLz)fµ <Źç7'×gW·‹ëž\zÜ9úâłOź}ôčččs)pá|öć¦15Űbâr¨Ňk&˝ČO4nNŇ·N9Í®>›ź˝y{ËeJĆĽżv(yńóŰŮůŮÉË7çs¤ ářv~ńÔ>č~î2Zö CDúGw˛¸¸uWóëłĹiws>»yŰĂf,ášů˙ŮËöä %FYŢľßE×oź?ůúńWĐőů&UŤČŞ2*űţŞŠ¬¨‹}}=;ůe~{>˙ů6'»ůŻwłó“Ą‹éhŤîjÝýôÓ§ź<îÇÇ›”w˛W>2:năfÝyşî>TşSëţEwÔÍş7ÝŰíţęeöŃëłÇÇź=ý¤×KmĐ+ŮŻl"ű¨ ]/·QŻ^«‹©>n}ž˙äËo¨ĎŹ›Ú SŚĂčř×fŘ÷vTű~ýŃŤf:»ľ^üŢ&ć&č7ż\ĚnßvŻg×ÉlçĹ€űţŮťś]źśĎŻÎďn:\»Ŕł»óůÍMoŐg—Hż¸;ż=»:˙sZOaźzzđí‹oľ<ţččřÁцz ͡Á4^ň+;ôg]·»Ş«É˛Ör5‰ ŤľĄ†¨Ýâ:éu9íĄj/őăW/ŽľřúŁŻÎ.^ßÝĎ.ź>\śź®7éusČOΩؤę°^ML§Ĺ”ôt”FŽJZ­j%tźvϦšíçĽřâűďjÍžĎßÜmŇĚ@Ě^«F·µUÓy9ŐLN5Ó4 ¶RLé©bŹşÇÝ¨ÇŹŹşŻ»gÝóîE÷m÷}÷şóëî¤;íćÝĎčŘg,¸»ěÝuwÇu7­˝×§Ďž~r|üŃńíěňtv}züçĹÓĂcšĎ˙I~ň´¶^‡'~Á*"Ç(YŤOV,ŤOľ®˝Ôä‡1×LeÖ˘®–«·gSĺöňbO>{ţ峇Ö~ľ¸řjźňűé Š9tVm†ěáŰęľ:uiQÔz‰¸Ń”ëţęä´Ĺ¦6˙¤´úÝ—ÝS´ýW©őżAű' řn°ŮěäîvžLádqľ¸ …f‘žăřů ˙™,î®ÓŔööĎ«·óKĚYó/í\ž]Îa@ ěŻÖň™}~MFv3˙ ĄÜśýs»}{=źw·ż/ş»îîôl~=ż9»é~ë~ďţčţěţÓýg~˝6Ú^.ő»Ł'ź?~ľÔh[z)M…ÜhĘTŤĆˇżj4+'˝ÔíĐKŤű´Yn1¶×Ou‹m¤¬×wççóŰĄ=Y\ýŮ_ŰvţÇÉůě˘nâóÍ­üď•v.íôîOcćŻÝŻw‹Űůéëóţ ĎŃ›ÂĹY/ěh ďozŻqéń'_=ZcďtY÷e$ŁÇÚb%ôĎ«~Yď5PýđůwŹ?ůfŤŞ”f“’ 2ţĹ;şä%%ÝTIžVD¦—‰Ě®‡gąyÄűÁłż5Ž]+îé¬ę.ľ(™_ď’‰m6«5cŕ†ŕłJBťcΞ»X6|. W¶żN0ľů—şKßo‡n8™5R¶¤EîűGŇ>ŐCę;©őť<őÖÜą†nĆýö+¸äűSísřŠ^ívŇëx¦`Sü»jŚ«ÁńĂŠÇţ‹ń,‹ŘqôSü“ łk0Ęn¨QĆŤž‡$tt ďţ+0¶‡ł›yúł +ńIżIr2-DT«®ZĹp˛ú±'S•ż±¦Žâţ-Oj—%ŠË‰‰@®j4·"ű ´<{\H­Xµ­Ť'E ±*Ü_ ŤżeÉVěŰŐ«†AT«†aůsD˝FVőżi*·,«Ý*«ä<4ż“–?\Ú.¬Ţ_ŘwMł–e^éR¨‰1ŞęP¬z4cöqŰdiYĽ•žR ?_5ÜĄFËź ř‚±¦ endstream endobj 946 0 obj << /Length 699 /Filter /FlateDecode >> stream xÚmTÁnŁ0˝óŢCĄöƆ@LE"¤¶­šhµ×ś.RC˙~çÍ8i·Z)Aăç™yoĆ7?ž·“¬î^Ý$ş×ęĹťşóPąIţsß77EWťŹ®ť«]}Ů==¨çˇ«¶nT·ů¦Ř´ÍxGÉ›¶z?×î’ő˙¤•{kÚĎđ¨Űťű=éÇă`‡ ý4ňvÍřNűß·­Őu­8ő—NM×>(sݵ&`ÝÖyw„îS0őÜjzQshÚzđÔ+ä&TuSŤ~ĹĎęH xűqÝqÓş`±PÓÚ<ŤĂ+» ¦OC톦}S·WU„nĎ}˙î @é`ąTµ;P3šőqtjú}¨ëöîŁw*äµ5UW»SżŻÜ°oß\°Đz©eą \[Ű3±”Ľ.ą ĺę9ff–¬— Ě ŚĄŘ¤ôĂdF@ö!×iŠ @F\ ` H Ĺsn¤4µČ¶` Ą$Ť(Ng 2RÉ0zd9÷ČĐ#Cżb.Ŕš€´kÉ(@».0·[Cz‰ěrĹĹ »aĂ ‹±ľ8SýŮäřuX¤đ$”Qúó:ú\CĽ–AfpGÇR~m%^!N%ÎŻ$†hťłł&„ŐšńR ó›Łć#Ćżp'XĎľ¬˝>˙‹AŁIä Â}3N¸h2Ž5óŻgNŃE'b«ŁśkýkĺŘżsč ý»˘%Ć|Vâ ¬áž!ü°ˇäŔË3™¬?Đfc91ÓŠ—9Ç|u 6ăZÖcW‚Cĺabî ýd1×®eFć-9žAgęąźú÷Ć3•ZĆ=üI=ú¤ž ç6-Ä7pĄĚçśă?)pe…řĆgT<ôź«?}řpqą\Żę< tSđ Ä·ľ˙¦u×KŞďzTńźo·Ëý‰ŐSü¨r· endstream endobj 948 0 obj << /Length 700 /Filter /FlateDecode >> stream xÚmTÁnŁ0˝óŢCĄöƆ@LE"¤¶­šjµ×ś.RC˙~çÍ8M»])AăÇĚĽ7ĎĆW?·“¬î^Ü$şŐęÉ»ÓPąIţs×WWEWť®ďť«]}~{ĽSŹCWmݨ®óM±i›ń†’7mővŞÝ9ë˙I+÷Ú´—đ¨ëg÷{ŇŹ‡ˇ±Ă„~‰ĎÍřF ßŢ)ÔPśüË Ç¦kŐZ°nëĽ;@ú1zz5= Ú7m=x ꊪş©Fżâgu PĽ}?Žî°i÷]°X¨é˝<ŽĂ;k» ¦C톦}U×YoO}˙ć Aé`ąTµŰS7š÷~wpjúm®Ź÷Ďď˝S!ŻŤč©şÚű]ĺ†]űę‚…ÖKµ(ËeŕÚúźw&–’—ý97ˇ\=ÇĂĚĚ’€5â’yA€±›”aĚŃ>ä:M1ČK,‰ˇxÎŤt‚¦Ů,ˇ”¤Ĺ錓@F*&" CŹ,çzdčWĚXP€v-h×ćakH/‘]® d—"Śbtv"ÖggŞ?»|ż‹ž„2JB^G—5Äkdwt,uŕ×VââTâ ńJbÖ9;kBX­Ď!Ő0ż‰0şaţ0büw‚őěÓÚë3ńW M";÷Í\8á˘É8ÖĚżś9EťŠa¬Žr®őŰʱßsč ýŢ?Ńc>+q ÖpĎ~ŘPrŕ‡ĺ™L Ö hł±śĚiĹËśc>Ť:‚›q-ë±+ÁˇÁňÁ01÷„~˛k×2#ó–Ď 3ő\ČOýľńÁLĄ–qĎRĎ…>©çÂąM ń \)sĹ9çřO \Y!ľńýçęO>\\/÷Auş*řâ[ßÓşŹkŞďzTńźď·ó%ŠŐCü0tÄ endstream endobj 949 0 obj << /Length 700 /Filter /FlateDecode >> stream xÚmTÁnŁ0˝óŢCĄöƆ@LE"¤¶­šjµ×ś.RC˙~çÍ8M»])AăÇĚĽ7ĎĆW?·“¬î^Ü$şŐęÉ»ÓPąIţs×WWEWť®ďť«]}~{ĽSŹCWmݨ®óM±i›ń†’7mővŞÝ9ë˙I+÷Ú´—đ¨ëg÷{ŇŹ‡ˇłĂ„~‰ĎÍřF ßŢ)ÔPśüË Ç¦kŐZ°nëĽ;@ú1zz5= Ú7m=x ꊪş©Fżâgu PĽ}?Žî°i÷]°X¨é˝<ŽĂ;k» ¦C톦}U×YoO}˙ć Aé`ąTµŰS7š÷~wpjúm®Ź÷Ďď˝S!ŻŤč©şÚű]ĺ†]űę‚…ÖKµ(ËeŕÚúźw&–’—ý97ˇ\=ÇĂĚĚ’€5â’yA€±›”aĚŃ>ä:M1ČK,‰ˇxÎŤt‚¦Ů,ˇ”¤Ĺ錓@F*&" CŹ,çzdčWĚXP€v-h×ćakH/‘]® d—"Śbtv"ÖggŞ?»|ż‹ž„2JB^G—5Äkdwt,uŕ×VââTâ ńJbÖ9;kBX­Ď!Ő0ż‰0şaţ0büw‚őěÓÚë3ńW M";÷Í\8á˘É8ÖĚżś9EťŠa¬Žr®őŰʱßsč ýŢ?Ńc>+q ÖpĎ~ŘPrŕ‡ĺ™L Ö hł±śĚiĹËśc>Ť:‚›q-ë±+ÁˇÁňÁ01÷„~˛k×2#ó–Ď 3ő\ČOýľńÁLĄ–qĎRĎ…>©çÂąM ń \)sĹ9çřO \Y!ľńýçęO>\\/÷Auş*řâ[ßÓşŹkŞďzTńźď·ó%ŠŐCü¬2tâ endstream endobj 999 0 obj << /Producer (pdfTeX-1.40.25) /Author(\376\377\000T\000h\000o\000m\000a\000s\000\040\000B\000r\000e\000u\000e\000r\000\040\000;\000\040\000S\000e\000b\000a\000s\000t\000i\000a\000n\000\040\000G\000u\000t\000s\000c\000h\000e\000\040\000;\000\040\000M\000a\000x\000\040\000H\000o\000r\000n\000\040\000;\000\040\000A\000l\000e\000x\000a\000n\000d\000e\000r\000\040\000H\000u\000l\000p\000k\000e\000\040\000;\000\040\000P\000e\000d\000r\000o\000\040\000G\000a\000r\000c\000\355\000a\0004\0005\000S\000\341\000n\000c\000h\000e\000z\000\040\000;\000\040\000C\000h\000r\000i\000s\000t\000o\000p\000h\000e\000r\000\040\000J\000e\000f\000f\000e\000r\000s\000o\000n\000\040\000;\000\040\000S\000t\000e\000f\000a\000n\000\040\000K\000o\000h\000l\000\040\000;\000\040\000F\000r\000a\000n\000k\000\040\000L\000\374\000b\000e\000c\000k\000\040\000;\000\040\000C\000h\000r\000i\000s\000\040\000W\000e\000n\000s\000l\000e\000y)/Title(\376\377\000u\000t\000i\000l\000s)/Subject()/Creator(\376\377\000L\000a\000T\000e\000X\000\040\000w\000i\000t\000h\000\040\000h\000y\000p\000e\000r\000r\000e\000f\000\040\000p\000a\000c\000k\000a\000g\000e\000\040\000/\000\040\000G\000A\000P\000D\000o\000c)/Keywords() /CreationDate (D:19700101000000Z) /ModDate (D:19700101000000Z) /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.141592653-2.6-1.40.25 (TeX Live 2023/Debian) kpathsea version 6.3.5) >> endobj 947 0 obj << /Type /ObjStm /N 95 /First 835 /Length 3790 /Filter /FlateDecode >> stream xÚťZ[ŹÜČ­~ź_ˇÇL‚őT‘u!…]“MlgŹťËÁ"ŰŤÝěc¦'8çßR*©KRu;ë‡Id±řńRd•Z6Pe*¦˛ŃŹčť\Mĺťş­‚\ŃÚ*ę5„Šäę,V¬W+käĆ[™Ŕ:{śÜ€PŘË –[ ÇČ ČM$ąÁĘzT˛Śń¬CeňQţ"Ě!dśN&7!\Yqě„oCFY*°–É YĹRŚ Ä(ËX'“˛ u1V$#=ÉUçŻHĆEU”q$óEGb˝¸X0WˇÁX‰ĐT>3X † Áqĺ¨BdNĆa¤+±ťĚ/ˇG$·ęID…Qć$µQƱĚ/Ş‘e~Şś‡8u1\±ÄÂȰ÷•C‰ ńş$V:u4UŢDő/W~˛Y˘çĹ–đy˛Qn@,ŕqŔ* őW,†/˙8x1Vă)ěhd ‡XEŤ8ËŃËd¸ŠQâȢ&˛NmEpąĚ@zâTŚW]Ež†ŔĄ(cq.ë‘4NĹśe#(ÎdRPĆŞĄČy"Ôx’ąbŃc *X’d5e’Ô11(MăΤ4ŇäDZ楎Ó4łAâÂ>kG`¬Ů$`ĺNtXqÓłćśÇ3‹°ây–,˛Aď4T¨ľeMR$ľúţű«›żýß—Cu3<ÜŻnŢ=ż?ŽŹJ´W7ÍíÓA9ŐÍ?^?to˙đćîóűç§·źß<đ«ďŢ~yľE»ĂӇǻ/LJGń‰•eůVčwŹOÇö×ŰÇ ®n^ÝÎ÷^žţy÷ńřë“84NCűűďî‘ŕ™‰ň·‡żßß ń ‹5ڤ—/Üź~řG×˙OîÇŰOČţdńß9ÎÖ]†LżrW~Ý ÷îÓíýńß6ÄpÜ—ÔʡŰyţ輇ţăí/‡§«›öáY€†+y~<ČťÖÉQü/wźŞI®ęŁÁéJÓ3@şb®nŚúĎߢ|š#¤9ă|ŤÓ•xş˛˙fhFŮJëx…ôŚé'8‰}›Ž`¦9Ć&×®”®˛”őęĚ·ëpfň•łé &]'Rń¦ë·oÓáN?ůÄ…ô“NJĎ~‹›ëđS•F=ĺ•Ovxtúd‡ök:ථr3¸ŻâÄ(¬@4)9mJ t s 09ë« €ÎéĐÝĘô«‰áÜ,”‚6˝úëóńÓݽʍU¤r“>­!ă6g|š¦´n˝;~:čćhbײý™jŢ w*M?>ţ3î’ň˛2Icw ¬RËćĺÝ^,ď§B´Î˙Â’[@•1ĄťČŞ çE¸ŚâÍíçěQ×=|řîÝńöńx­ďÓĆýęď~8>ż°×˛Ř1#€\F@%ä"NSÚ&‚ż_ ޛߛWwźďŽ•ó°ź·°FzPqČć‹JČ1‘¦W/~Š$űʶ®ÉĹšÚkYq]@Ş[rťcŠćZVgÜŘĆŢ"S#şÝäÔú «(°3bÔÄ–!í`°( ťĎgngk&hz¦ ö¦Soâöˇˇ†"uŕM'Ö@.ŰuĐf—č e˛Ś˝#±üĐEqĆĚĺřf{ ^LhFTqkk}Qşh8÷Öô2ű‡k}÷ ŘĆš&Đ †çŞCÓ`gȱ…5‹Ňa:q¦ˇ#/s4C/ÜĄ@ťą'ç( ®KçÉ[[±Ť=;ě:q‹›ŹžkĂwč‹ŇEĂë>ôCk(´¦o¦gšŘ·u7řč$ľ€sn#+ʲ Hb(<ČLkm=€ qhĽď"k¶ÄŚ‹íc'ŮR×uđŞ×fÜhüµ8žz§¨ dř}QşhxËľ‡(+«& }­ľÍ4ĐÉqp– Ö|0™ibăIć!’¬`75‡Äm†cŰśFÜdNë†&`ͱ±5µÔ-đ·ۇČËZ˛ †Ď/^Ö†ďĐĄ‹†÷Llś¬ÄşF#*Ü Ŕ`‚„¸@ÚYßőÜë2a›s úFP5P·­–ľéHą5|‡ľ(]4ÜŞ»€Ň±EX×řĚp/ĺş©eŹŃc µ·¬Ű’ěz±ď;]ëÁ±öqĚÜâkŚaĺQ\ u;ăĂˇŹ˛™Łv¨›±_äÜ>ÚÖ©šĐ™Z«ş-F|‡ľ(]4< ’ÎC+Ą_VC[R¶Ö˘T·ŕúHĆ5 éŠyUŹČľ–\˛5z4V ĎR=ŠMMdw%-»×¨…,â1ěTµµMÓi.e;íË’D ›N'ő_Kîôîbkř}Qşh¸Č4 u[Ě’ š®¦Ůó~˝ýr<<ţ^Ź807Ů…(´ł™‰¨Ç'ÜP¤ŢĚťˇÉ0k‹Ýi&ÚÁ_x XěZ‹Ň6$)BvĹ©K×$MÍŤşUß­´\{6ň,J‰ŢÜŐf’7€dÍĎKţĂÝńđ˘~>>ČŮQ‘çä?Ö?NTâśzwüÓóűń—™ááQƨś®=đŚŘŢ÷şţăëZ3Ôg:ß¶˙¬µL@N;<µźnźžOĘÉq˙ôúáŁŇ’żNÍ;f&‚žRyw„Î1,wH'†n9ćsęYѬ(Ú“ć}çDŃl€ŐmɸŁ‹Ľ_´.ŁÎ×0äęž ¬(ăćÉdÍĺ{tB«!şöŘ”qĹëÓ¨2.P÷pČ'Dݤĺ¸Ŕ)…rŠ®»˘č+XIŤŤ  Lµ.ŁÎÓŠ4w˙‰˘mŃĺ1A­O+‚ŃÍHn jUNż•&ŠnXB(ă˘ëÓ¨2.T÷ÄÜtT÷ĐJ©ş‡WcĆCnŤuoóŘę&Ń©ÖeÔ`zDĆÜR-ߣpF‡ä(śľř ů˘t »®•”čÓ{ä=.ľ>Ť*ăŇłąËuę¦Ďç ˘îó0ęö#ćVBšăéđáx÷p˙ű±|/Âťů¸°…§ ŚâfbmóV~!m5k/¬bšÜ‘U—Ům_r(ëŃçP+W!Î]n!Źp¬ĺY5îČ: lŕĂ8‡_Q‰€g '<«Ńg±Ł‚Ů*ĹcI^ݸ«Řă•čâ–¨okí–¨olý9̸ň·> 9¨Î°q_Co·D™4nśG:’pK”‘›Ä{Á:’ĎBq¬ď!?żĎóptÖĽQXóĆ8»ůĆ–§%’‹rc*ř%»3žMĽůŢ–§1‚]Ů- .H^2&)7× ‹ ČŇLśëö†Ąť…ËRZUą¤kt){ÁDŘ[8É]2'ǢŮÄMóˇ-ł´·Yşŕ€Š,Ý ˇ)˛Ć]ŃĄ&¬{ąKúd…ŰgŽOV¸Pd©‹¬qńuK,°¦wÁ@żŹ ˙jý´¤p©9k ntEÖřCGYJm§˛”ÚÎe)µťăEa*Ť[ąË˘6HW¨ !•!»Ç |‘ĄEKRSíBWd©”3 ±îĺ.H ŞŰ/Jxü*'©ŔE–BŤeָɼTIhꇓÜbĹüYžKźĺůt éÓ•Ň•/ýryńפ)}nĘi·ÍélĂ©ur:ęqđ˙ő‹ůóď®fťÉštŔćÔ8yśÓiŠ÷ľ,ż6Úť.“žôs"§ßś–+§fĎéSTŽń+D·ŹP:LpJNÇ;NëžS÷bÂó{Ýó3)I•‚ÓŻ¦śú§=§ý.˙¶öUNşô+§"Ä©•rzĂÄéËcŢovň¤;ݦ;<ÉhćÂWűííńöÓĂ/WÓwާO[ç/PłO ĆeÎóWq:ţőĂÇĂÍßźoî#áŐíűç§ďżżyóüůé_FnŢÝt/_ÂtSÝĽ;VđňĺĎ‚ŕćŻ_÷ő¶˛nůŢâ˙r¨Ű endstream endobj 1000 0 obj << /Type /XRef /Index [0 1001] /Size 1001 /W [1 3 1] /Root 998 0 R /Info 999 0 R /ID [<45922D68FCC87C00835492A052CD5F85> <45922D68FCC87C00835492A052CD5F85>] /Length 2564 /Filter /FlateDecode >> stream xÚ%ŘytĺÇńyçŢÜ@’!B7 $, a ČN a ŰiO‹ jÝŞEq©b­ËA[Ź‹zÜí"Zµo«Ĺ zÄ*hëŽĹĄĹµU[­Vúű>ýçĂĽĎĚäŢ;ĎoŢw ‚“a„ ˛öęźŔĎ ÄŢjjBjMÔŞ& Imµ4Ă HQ[LmĂL@­“Z%ĂE­›ÚT† ›ÚfjS†!úJé j s`(µljĺ ‡A.µ!Ô&3Ě|jĄÔ&1#¨M¤VĆp$P›Im"ĂQPHm>µ GCµŤÔJޱÔě;ŹgX ăT‹P+ahڧ–EmCű¨ĺQłÓěĂ˨SËĐľřdj%Ôě#íGWPłßQÄĐ.ŘTjµÔěëÚĹžFmµB†Ö¨*jÖ#ű©Öäj-Ô ÖÂtj­Ôě2Í€:j«¨Ť`X3©Ůu±K< fSłë’Ďp4„ĘG@ÍÚÓs©Ys6Án{Iťßš-Âěžv.xň m „„ Vď¶aR 6}e°ełh– ú«í¸A|5f•ô`Č›‡±c[6çÁhî‚o¦ě\›|G‚MąŁŔ&ZfĚt‘ N?iÇŤ›Y‹a ”¸ŕś l/Sišą3Íd™žL‘ér`bLWÂ ę‚ ·ŘiöťÓŔü—®f˝t-0ץ@˝ŮyźťQł€Ů,=‡KbW¨]pÍvÜ\h‚y°Â"h‡VXě‚›ŽÚK ,4›ŮZˡV@› ö¬·3:ˇ şˇz\đŔą¶w%¬‚^XŠĘľ˝¶w ¬˘‡l)*ż{ÔöZË6)‰©Ĺ–űLçŞ>·!9•Ă-6$*1 s¬ű…V#41‘ŠA6vÇ9.xí;ލÄĂ€”Ä„+d#f…Ť \đÎyv0‰ HLbúŹqÁű‡m/‰m­µĹµlIµ5”XĶrÚ˛Xá‚O-„ń~۶C\邯§Ř[*‰ELĎă*Ý*e¶ĂÖF[ mő#±­yóaś¸h|<Űą}v.Ů›h˛}†Ć‹śË;fÇ©XÄK0Ä„!n2‹îÇ44îr®đ6;—¨Ä=`“ÝŹÉALJâŐĚuölÇZç&fŘië¸ŮK"â~çĘo´$"&1«ZĘ9·ţ+[g¸÷S çę‡ŰĐVˇd°ż—yíÜÜívđ`ȡŔl‘Ę…ŃďÜ’í¸á0FBŚ‚BcˇJ`<”ÂD(I0ʡ¦ŔTł ČąÎcöąi¨ćúŮź,T©J`µJŮóK#ŘS ]MŮłĘ|°'”…ŔsIŞĂhnöÔ2X­ĐíĐťĐݰz€Ö¦VA/ôµ–'µÖÁz`ýHm€Ť° 6=¦ŘŠ{¬H˝Ś2€†F44˘ˇ Ťhhd36ĐËhĐІF6ýÓĐĆGů@/#úÍ‹¬—ş?zwŘ× ÓŃH’ĺ’ÓŹZŤţFô7˘ ýŤ ťűÖ Ű[âÜÖłçNąFśzŹŐ쉂îGt?šäÜi[´÷ô»Ĺ¶ÇÄďŠ3Ů:ëuqöPqNµ8w«8ďqţ â»gŠ ć‹ á{ b{ݏ¨GěX%.ţ¶n¶Ď%\áŠWD¸˘Jç.yÇö©¨ ,W5PëÜÎ;ő.˝M\‹Ë/WÔďçŠ+'«ř»¶‹«Ď?xF\󙸶J\w…¸~ź¸áŘť-nl7ť"~t‡řńóâć7Ĺ-ťâ'g/~ëŐâ§‹=÷ŠŰî·?"îx[ÜY)îŞwCÜĂŐ¸—ŻqWčţ˝âýöŰx‚Šx–Šęa&ÇŰ*Rö•ţůâ|ńłŕŘ{•xćýj©Ř×.öóąűéĚŻźżá‡ĎŹĚ„ŹÄŁüŢß>!ü«â÷yâ±rńx| péĐé'ö?ľ$ž$‡^OOźĎä‹ĂMâY>íOkÄs«ĹóŰÄ‘ëĹŃÄ‹šÝźKÄ_8řĄSĹË»Ĺ+śöę‡âµ·Äë^Ľ±_㲿ů€řë­âřĹ[ôüíŁâ].Äß2Ĺßéů‰Rń?ć}ş˙A™ř°Y|´S|ĽCüFý“Oűäâł„řěß‹ĎičOXS "&¨ *jrîËŃÚű% řę)ńßWÄ×\ˇ“ęL\+ś>( ‹Ä řT$!ăc‘zPdŢ$čţµŞą0«”—pĐ‘­ľP ™-rŠ@?5złĆią—§ľ…ůď‰#Äȱ‚çŔ°@×/,,]şp´îаh—Łž‡c/Ĺ—Šq|Ťu&ť(UĂ ŠTX–>cŇÓb˛–+4á”ńbŞRVÎÓtaĂt«¨ęŐJXXى"¬ýĄ~»A­N·_XĄŮ&f)§áěbNŁhĐ,6^ ćęŽ ›ľ#ćmó‰bˇB.boó]b±B.9 ZtۇK•ńpyR´* a[…hW®ÂŽłEç˙§Ö”5%bM‰ą°ËŞ5%bM‰XS"{€dM‰–»°{·ŇęÂm¶DGm.Üő…mµ»đŢ#¶ŐáÂËl«Ó…'’¶Őĺ™¶NGÝ.‘űm­p‰Š˙ŘVŹKÔěł­•.qvźm­r źm[˝.ńrŤmőąd®rź®ľ% t—%‹ŠE±ćÎd©şś¤«›¬¸LTŞŤÉꢕ׮şM“ÝĎÚ‚A`ďx˝ ¨{ż1ě­FÔ˝Ŕ±·VłÁžÖ ć‚˝ż˛˙ŘŮ›ť°ě%–ýźÝ^‹,{˛–Ár°—!mĐ`/¶şŔ^g­€X öޤú`5¬µ`Ź`ëˇß%WęţHn˝.řĐ× endstream endobj startxref 289425 %%EOF utils-0.93/doc/chap6_mj.html0000644000175100017510000002063415105376105015345 0ustar runnerrunner GAP (Utils) - Chapter 6: Matrices
Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind

6 Matrices

6.1 Some operations for matrices

6.1-1 DirectSumDecompositionMatrices
‣ DirectSumDecompositionMatrices( M )( operation )

In June 2023 Hongyi Zhao asked in the Forum for a function to implement matrix decomposition into blocks. Such a function was then provided by Pedro García-Sánchez. Hongyi Zhao then requested that the function be added to Utils. What is provided here is a revised version of the original solution, returning a list of decompositions.

This function is a partial inverse to the undocumented library operation DirectSumMat. So if \(L\) is the list of diagonal decompositions of a matrix \(M\) then each entry in \(L\) is a list of matrices, and the direct sum of each of these lists is equal to the original \(M\).

In the following examples, \(M_6\) is an obvious direct sum with \(3\) blocks. \(M_4\) is an example with three decompositions, while \(M_8 = M_4 \oplus M_4\) has \(16\) decompositions (not listed).


gap> M6 := [ [1,2,0,0,0,0], [3,4,0,0,0,0], [5,6,0,0,0,0],                       
>            [0,0,9,0,0,0], [0,0,0,1,2,3], [0,0,0,4,5,6] ];;
gap> Display( M6 );
[ [  1,  2,  0,  0,  0,  0 ],
  [  3,  4,  0,  0,  0,  0 ],
  [  5,  6,  0,  0,  0,  0 ],
  [  0,  0,  9,  0,  0,  0 ],
  [  0,  0,  0,  1,  2,  3 ],
  [  0,  0,  0,  4,  5,  6 ] ]
gap> L6 := DirectSumDecompositionMatrices( M6 );
[ [ [ [ 1, 2 ], [ 3, 4 ], [ 5, 6 ] ], [ [ 9 ] ], [ [ 1, 2, 3 ], [ 4, 5, 6 ] ] 
     ] ]

gap> M4 := [ [0,3,0,0], [0,0,0,0], [0,0,0,0], [0,0,4,0] ];;
gap> Display( M4 );
[ [  0,  3,  0,  0 ],
  [  0,  0,  0,  0 ],
  [  0,  0,  0,  0 ],
  [  0,  0,  4,  0 ] ]
gap> L4 := DirectSumDecompositionMatrices( M4 );
[ [ [ [ 0, 3 ] ], [ [ 0, 0 ], [ 0, 0 ], [ 4, 0 ] ] ], 
  [ [ [ 0, 3 ], [ 0, 0 ] ], [ [ 0, 0 ], [ 4, 0 ] ] ], 
  [ [ [ 0, 3 ], [ 0, 0 ], [ 0, 0 ] ], [ [ 4, 0 ] ] ] ]
gap> for L in L4 do 
>        A := DirectSumMat( L );; 
>        if ( A = M4 ) then Print( "yes, A = M4\n" ); fi; 
>    od;
yes, A = M4
yes, A = M4
yes, A = M4

gap> M8 := DirectSumMat( M4, M4 );; 
gap> Display( M8 );
[ [  0,  3,  0,  0,  0,  0,  0,  0 ],
  [  0,  0,  0,  0,  0,  0,  0,  0 ],
  [  0,  0,  0,  0,  0,  0,  0,  0 ],
  [  0,  0,  4,  0,  0,  0,  0,  0 ],
  [  0,  0,  0,  0,  0,  3,  0,  0 ],
  [  0,  0,  0,  0,  0,  0,  0,  0 ],
  [  0,  0,  0,  0,  0,  0,  0,  0 ],
  [  0,  0,  0,  0,  0,  0,  4,  0 ] ]
gap> L8 := DirectSumDecompositionMatrices( M8 );;
gap> Length( L8 ); 
16

The current method does not, however, catch all possible decompositions. In the following example the matrix \(M_5\) has its third row and third column extirely zero, and the only decomposition found has a \([0]\) factor. There are clearly two \(2\)-factor decompositions with a \(2\)-by-\(3\) and a \(3\)-by-\(2\) factor, but these are not found at present.


gap> M5 := [ [1,2,0,0,0], [3,4,0,0,0], [0,0,0,0,0],
>            [0,0,0,6,7], [0,0,0,8,9] ];;
gap> Display(M5);
[ [  1,  2,  0,  0,  0 ],
  [  3,  4,  0,  0,  0 ],
  [  0,  0,  0,  0,  0 ],
  [  0,  0,  0,  6,  7 ],
  [  0,  0,  0,  8,  9 ] ]
gap> L5 := DirectSumDecompositionMatrices( M5 ); 
[ [ [ [ 1, 2 ], [ 3, 4 ] ], [ [ 0 ] ], [ [ 6, 7 ], [ 8, 9 ] ] ] ]

Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind

generated by GAPDoc2HTML

utils-0.93/doc/chap5.txt0000644000175100017510000005773015105376105014540 0ustar runnerrunner 5 Groups and homomorphisms 5.1 Functions for groups 5.1-1 Comm Comm( L )  operation This method has been transferred from package ResClasses. It provides a method for Comm when the argument is a list (enclosed in square brackets), and calls the function LeftNormedComm.  Example   gap> Comm( [ (1,2), (2,3) ] ); (1,2,3) gap> Comm( [(1,2),(2,3),(3,4),(4,5),(5,6)] ); (1,5,6) gap> Comm(Comm(Comm(Comm((1,2),(2,3)),(3,4)),(4,5)),(5,6)); ## the same (1,5,6)   5.1-2 IsCommuting IsCommuting( a, b )  operation This function has been transferred from package ResClasses. It tests whether two elements in a group commute.  Example   gap> D12 := DihedralGroup( 12 );  gap> SetName( D12, "D12" );  gap> a := D12.1;; b := D12.2;;  gap> IsCommuting( a, b ); false   5.1-3 ListOfPowers ListOfPowers( g, exp )  operation This function has been transferred from package RCWA. The operation ListOfPowers(g,exp) returns the list [g,g^2,...,g^exp] of powers of the element g.  Example   gap> ListOfPowers( 2, 20 ); [ 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384,  32768, 65536, 131072, 262144, 524288, 1048576 ] gap> ListOfPowers( (1,2,3)(4,5), 12 ); [ (1,2,3)(4,5), (1,3,2), (4,5), (1,2,3), (1,3,2)(4,5), (),  (1,2,3)(4,5), (1,3,2), (4,5), (1,2,3), (1,3,2)(4,5), () ] gap> ListOfPowers( D12.2, 6 ); [ f2, f3, f2*f3, f3^2, f2*f3^2, of ... ]   5.1-4 GeneratorsAndInverses GeneratorsAndInverses( G )  operation This function has been transferred from package RCWA. This operation returns a list containing the generators of G followed by the inverses of these generators.  Example   gap> GeneratorsAndInverses( D12 ); [ f1, f2, f3, f1, f2*f3^2, f3^2 ] gap> GeneratorsAndInverses( SymmetricGroup(5) );  [ (1,2,3,4,5), (1,2), (1,5,4,3,2), (1,2) ]   5.1-5 UpperFittingSeries UpperFittingSeries( G )  attribute LowerFittingSeries( G )  attribute FittingLength( G )  attribute These three functions have been transferred from package ResClasses. The upper and lower Fitting series and the Fitting length of a solvable group are described here: https://en.wikipedia.org/wiki/Fitting_length.  Example   gap> UpperFittingSeries( D12 ); LowerFittingSeries( D12 ); [ Group([ ]), Group([ f3, f2*f3 ]), Group([ f1, f3, f2*f3 ]) ] [ D12, Group([ f3 ]), Group([ ]) ] gap> FittingLength( D12 ); 2 gap> S4 := SymmetricGroup( 4 );; gap> UpperFittingSeries( S4 ); [ Group(()), Group([ (1,2)(3,4), (1,4)(2,3) ]), Group([ (1,2)(3,4), (1,4)  (2,3), (2,4,3) ]), Group([ (3,4), (2,3,4), (1,2)(3,4) ]) ] gap> List( last, StructureDescription ); [ "1", "C2 x C2", "A4", "S4" ] gap> LowerFittingSeries( S4 ); [ Sym( [ 1 .. 4 ] ), Alt( [ 1 .. 4 ] ), Group([ (1,4)(2,3), (1,3)  (2,4) ]), Group(()) ] gap> List( last, StructureDescription ); [ "S4", "A4", "C2 x C2", "1" ] gap> FittingLength( S4); 3   5.2 Left Cosets for Groups 5.2-1 LeftCoset LeftCoset( g, U )  operation Since GAP uses right actions by default, the library contains the operation RightCoset(U,g) for constructing the right coset Ug of a subgroup U ≤ G and an element g â G. It has been noted in the reference manual that, by inverting all the elements in Ug, the left coset g^-1U is obtained. Just for the sake of completeness, from August 2022 this package provides the operation LeftCoset(g,U) for constructing the left coset gU. Users are strongly recommended to continue to use RightCoset for all serious calculations, since left cosets have a much simpler implementation and do not behave exactly like right cosets. The methods for left cosets which are provided generally work by converting gU to Ug^-1; applying the equivalent method for right cosets; and, if necessary, converting back again to left cosets. G acts on left cosets by OnLeftInverse: (gU)^g_0 = g_0^-1*(gU) = (g_0^-1g)U.  Example   gap> a4 := Group( (1,2,3), (2,3,4) );; SetName( a4, "a4" ); gap> k4 := Group( (1,2)(3,4), (1,3)(2,4) );; SetName( k4, "k4" ); gap> rc := RightCosets( a4, k4 ); [ RightCoset(k4,()), RightCoset(k4,(2,3,4)), RightCoset(k4,(2,4,3)) ] gap> lc := LeftCosets( a4, k4 ); [ LeftCoset((),k4), LeftCoset((2,4,3),k4), LeftCoset((2,3,4),k4) ] gap> AsSet( lc[2] ); [ (2,4,3), (1,2,3), (1,3,4), (1,4,2) ] gap> LeftCoset( (1,4,2), k4 ) = lc[2]; true gap> Representative( lc[2] ); (2,4,3) gap> ActingDomain( lc[2] ); k4 gap> (1,4,3) in lc[3]; true gap> (1,2,3)*lc[2] = lc[3]; true gap> lc[2]^(1,3,2) = lc[3]; true   5.2-2 Inverse The inverse of the left coset gU is the right coset Ug^-1, and conversely. This is an abuse of the attribute Inverse, since the standard requirement, that x*x^-1 is an identity, does not hold.  Example   gap> Inverse( rc[3] ) = lc[3]; true gap> Inverse( lc[2] ) = rc[2]; true   5.3 Functions for group homomorphisms 5.3-1 EpimorphismByGenerators EpimorphismByGenerators( G, H )  operation This function has been transferred from package RCWA. It constructs a group homomorphism which maps the generators of G to those of H. Its intended use is when G is a free group, and a warning is printed when this is not the case. Note that anything may happen if the resulting map is not a homomorphism!  Example   gap> G := Group( (1,2,3), (3,4,5), (5,6,7), (7,8,9) );; gap> phi := EpimorphismByGenerators( FreeGroup("a","b","c","d"), G ); [ a, b, c, d ] -> [ (1,2,3), (3,4,5), (5,6,7), (7,8,9) ] gap> PreImagesRepresentativeNC( phi, (1,2,3,4,5,6,7,8,9) ); d*c*b*a gap> a := G.1;; b := G.2;; c := G.3;; d := G.4;; gap> d*c*b*a; (1,2,3,4,5,6,7,8,9) gap> ## note that it is easy to produce nonsense:  gap> epi := EpimorphismByGenerators( Group((1,2,3)), Group((8,9)) ); Warning: calling GroupHomomorphismByImagesNC without checks [ (1,2,3) ] -> [ (8,9) ] gap> IsGroupHomomorphism( epi ); true gap> Image( epi, (1,2,3) );  () gap> Image( epi, (1,3,2) ); (8,9)   5.3-2 Pullback Pullback( hom1, hom2 )  operation PullbackInfo( G )  attribute If Ď•_1 : G_1 -> H and Ď•_2 : G_2 -> H are two group homomorphisms with the same range, then their pullback is the subgroup of G_1 Ă— G_2 consisting of those elements (g_1,g_2) such that Ď•_1 g_1 = Ď•_2 g_2. The attribute PullbackInfo of a pullback group P is similar to DirectProductInfo for a direct product of groups. Its value is a record with the following components: directProduct the direct product G_1 Ă— G_2, and projections a list with the two projections onto G_1 and G_2. There are no embeddings in this record, but it is possible to use the embeddings into the direct product, see Embedding (Reference: Embedding).  Example   gap> s4 := Group( (1,2),(2,3),(3,4) );; gap> s3 := Group( (5,6),(6,7) );; gap> c3 := Subgroup( s3, [ (5,6,7) ] );; gap> f := GroupHomomorphismByImages( s4, s3,  >  [(1,2),(2,3),(3,4)], [(5,6),(6,7),(5,6)] );;  gap> i := GroupHomomorphismByImages( c3, s3, [(5,6,7)], [(5,6,7)] );;  gap> Pfi := Pullback( f, i ); Group([ (2,3,4)(5,7,6), (1,2)(3,4) ]) gap> StructureDescription( Pfi ); "A4" gap> info := PullbackInfo( Pfi ); rec( directProduct := Group([ (1,2), (2,3), (3,4), (5,6,7) ]),   projections := [ [ (2,3,4)(5,7,6), (1,2)(3,4) ] -> [ (2,3,4), (1,2)(3,4) ],   [ (2,3,4)(5,7,6), (1,2)(3,4) ] -> [ (5,7,6), () ] ] ) gap> g := (1,2,3)(5,6,7);;  gap> ImageElm( info!.projections[1], g ); (1,2,3) gap> ImageElm( info!.projections[2], g ); (5,6,7)  gap> dp := info!.directProduct;;  gap> a := ImageElm( Embedding( dp, 1 ), (1,4,3) );;  gap> b := ImageElm( Embedding( dp, 2 ), (5,7,6) );;  gap> a*b in Pfi; true   5.3-3 CentralProduct CentralProduct( G1, G2, Z1, Phi )  operation CentralProductInfo( G )  attribute This function was added by Thomas Breuer, following discussions with Hongyi Zhao (see https://github.com/gap-packages/hap/issues/73). Let G1 and G2 be two groups, Z1 be a central subgroup of G1, and Phi be an isomorphism from Z1 to a central subgroup of G2. The central product defined by these arguments is the factor group of the direct product of G1 and G2 by the central subgroup { (z, (Phi(z))^-1) : z â Z1 }. The attribute CentralProductInfo of a group G that has been created by CentralProduct is similar to PullbackInfo (5.3-2) for pullback groups. Its value is a record with the following components. projection the epimorphism from the direct product of G1 and G2 to G, and phi the map Phi. Note that one can access the direct product as the Source (Reference: Source) value of the projection map, and one can access G1 and G2 as the two embeddings of this direct product, see Embedding (Reference: Embedding).  Example  gap> g1 := DihedralGroup( 8 );  gap> c1 := Centre( g1 ); Group([ f3 ]) gap> cp1 := CentralProduct( g1, g1, c1, IdentityMapping( c1 ) ); Group([ f1, f2, f5, f3, f4, f5 ]) gap> IdGroup( cp1 ) = IdGroup( ExtraspecialGroup( 2^5, "+" ) ); true gap> g2 := QuaternionGroup( 8 );  gap> c2 := Centre( g2 ); Group([ y2 ]) gap> cp2 := CentralProduct( g2, g2, c2, IdentityMapping( c2 ) ); Group([ f1, f2, f5, f3, f4, f5 ]) gap> IdGroup( cp2 ) = IdGroup( ExtraspecialGroup( 2^5, "+" ) ); true gap> info2 := CentralProductInfo( cp2 ); rec( phi := IdentityMapping( Group([ y2 ]) ),   projection := [ f1, f2, f3, f4, f5, f6 ] -> [ f1, f2, f5, f3, f4, f5 ] ) gap> Source( Embedding( Source( info2.projection ), 1 ) ) = g2; true  5.3-4 IdempotentEndomorphisms IdempotentEndomorphisms( G )  operation IdempotentEndomorphismsData( G )  attribute IdempotentEndomorphismsWithImage( genG, R )  operation An endomorphism f : G -> G is idempotent if f^2=f. It has an image R leqslant G; is the identity map when restricted to R; and has a kernel N which has trivial intersection with R and has size |G|/|R|. The operation IdempotentEndomorphismsWithImage(genG,R) returns a list of the images of the generating set genG of a group G under the idempotent endomorphisms with image R. The attribute IdempotentEndomorphismsData(G) returns a record data with fields data.gens, a fixed generating set for G, and data.images a list of the non-empty outputs of IdempotentEndomorphismsWithImage(genG,R) obtained by iterating over all subgroups of G. The operation IdempotentEndomorphisms(G) returns the list of these mappings obtained using IdempotentEndomorphismsData(G). The first of these is the zero map, the second is the identity.  Example   gap> gens := [ (1,2,3,4), (1,2)(3,4) ];;  gap> d8 := Group( gens );; gap> SetName( d8, "d8" ); gap> c2 := Subgroup( d8, [ (2,4) ] );; gap> IdempotentEndomorphismsWithImage( gens, c2 ); [ [ (), (2,4) ], [ (2,4), () ] ] gap> IdempotentEndomorphismsData( d8 ); rec( gens := [ (1,2,3,4), (1,2)(3,4) ],   images := [ [ [ (), () ] ], [ [ (), (2,4) ], [ (2,4), () ] ],   [ [ (), (1,3) ], [ (1,3), () ] ],   [ [ (), (1,2)(3,4) ], [ (1,2)(3,4), (1,2)(3,4) ] ],   [ [ (), (1,4)(2,3) ], [ (1,4)(2,3), (1,4)(2,3) ] ],   [ [ (1,2,3,4), (1,2)(3,4) ] ] ] ) gap> List( last.images, L -> Length(L) ); [ 1, 2, 2, 2, 2, 1 ] gap> IdempotentEndomorphisms( d8 );  [ [ (1,2,3,4), (1,2)(3,4) ] -> [ (), () ],   [ (1,2,3,4), (1,2)(3,4) ] -> [ (), (2,4) ],   [ (1,2,3,4), (1,2)(3,4) ] -> [ (2,4), () ],   [ (1,2,3,4), (1,2)(3,4) ] -> [ (), (1,3) ],   [ (1,2,3,4), (1,2)(3,4) ] -> [ (1,3), () ],   [ (1,2,3,4), (1,2)(3,4) ] -> [ (), (1,2)(3,4) ],   [ (1,2,3,4), (1,2)(3,4) ] -> [ (1,2)(3,4), (1,2)(3,4) ],   [ (1,2,3,4), (1,2)(3,4) ] -> [ (), (1,4)(2,3) ],   [ (1,2,3,4), (1,2)(3,4) ] -> [ (1,4)(2,3), (1,4)(2,3) ],   [ (1,2,3,4), (1,2)(3,4) ] -> [ (1,2,3,4), (1,2)(3,4) ] ]   The quaternion group q8 is an example of a group with a tail: there is only one subgroup in the lattice which covers the identity subgroup. The only idempotent isomorphisms of such groups are the identity mapping and the zero mapping because the only pairs N,R are the whole group and the identity subgroup.  Example   gap> q8 := QuaternionGroup( 8 );; gap> IdempotentEndomorphisms( q8 ); [ [ x, y ] -> [ of ..., of ... ], [ x, y ] -> [ x, y ] ]   5.3-5 DirectProductOfFunctions DirectProductOfFunctions( G, H, f1, f2 )  operation Given group homomorphisms f_1 : G_1 -> G_2 and f_2 : H_1 -> H_2, this operation return the product homomorphism f_1 Ă— f_2 : G_1 Ă— G_2 -> H_1 Ă— H_2.  Example   gap> c4 := Group( (1,2,3,4) );;  gap> c2 := Group( (5,6) );;  gap> f1 := GroupHomomorphismByImages( c4, c2, [(1,2,3,4)], [(5,6)] );; gap> c3 := Group( (1,2,3) );;  gap> c6 := Group( (1,2,3,4,5,6) );;  gap> f2 := GroupHomomorphismByImages( c3, c6, [(1,2,3)], [(1,3,5)(2,4,6)] );;  gap> c4c3 := DirectProduct( c4, c3 );  Group([ (1,2,3,4), (5,6,7) ]) gap> c2c6 := DirectProduct( c2, c6 );  Group([ (1,2), (3,4,5,6,7,8) ]) gap> f := DirectProductOfFunctions( c4c3, c2c6, f1, f2 );  [ (1,2,3,4), (5,6,7) ] -> [ (1,2), (3,5,7)(4,6,8) ] gap> ImageElm( f, (1,4,3,2)(5,7,6) );  (1,2)(3,7,5)(4,8,6)   5.3-6 DirectProductOfAutomorphismGroups DirectProductOfAutomorphismGroups( A1, A2 )  operation Let A_1,A_2 be groups of automorphism of groups G_1,G_2 respectively. The output of this function is a group A_1 Ă— A_2 of automorphisms of G_1 Ă— G_2.  Example   gap> c9 := Group( (1,2,3,4,5,6,7,8,9) );;  gap> ac9 := AutomorphismGroup( c9 );;  gap> q8 := QuaternionGroup( IsPermGroup, 8 );; gap> aq8 := AutomorphismGroup( q8 );; gap> A := DirectProductOfAutomorphismGroups( ac9, aq8 );  gap> genA := GeneratorsOfGroup( A );; gap> G := Source( genA[1] ); Group([ (1,2,3,4,5,6,7,8,9), (10,14,12,16)(11,17,13,15), (10,11,12,13) (14,15,16,17) ]) gap> a := genA[1]*genA[5];  [ (1,2,3,4,5,6,7,8,9), (10,14,12,16)(11,17,13,15), (10,11,12,13)(14,15,16,17)   ] -> [ (1,3,5,7,9,2,4,6,8), (10,16,12,14)(11,15,13,17),   (10,11,12,13)(14,15,16,17) ] gap> ImageElm( a, (1,9,8,7,6,5,4,3,2)(10,14,12,16)(11,17,13,15) ); (1,8,6,4,2,9,7,5,3)(10,16,12,14)(11,15,13,17)   utils-0.93/doc/obsolete.xml0000644000175100017510000000762715105376105015335 0ustar runnerrunner Obsolete functions
Operations from AutoDoc The file functions FindMatchingFiles FindMatchingFiles and CreateDirIfMissing CreateDirIfMissing were copied from package AutoDoc where they are named AutoDoc_FindMatchingFiles and AutoDoc_CreateDirIfMissing.

The string function StringDotSuffix StringDotSuffix was also copied from package AutoDoc, where it is named AUTODOC_GetSuffix. GetSuffix

The function SetIfMissing SetIfMissing was also transferred from package AutoDoc, where it is called AUTODOC_SetIfMissing. It writes into a record provided the position is not yet bound.

As from version 0.61, all these functions became obsolete in Utils, but continue to be defined in AutoDoc.

Functions for printing The function PrintOneItemPerLine PrintOneItemPerLine was used to prints lists vertically, rather than horizontally. Since a very similar result may be achieved using the &GAP; library functions Perform and Display, this function became obsolete in version 0.61.

s3 := SymmetricGroup( 3 );; gap> L := KnownPropertiesOfObject( GeneratorsOfGroup( s3 ) );; gap> Perform( L, Display ); IsFinite IsSmallList IsGeneratorsOfMagmaWithInverses IsGeneratorsOfSemigroup IsSubsetLocallyFiniteGroup gap> Perform( s3, Display ); () (2,3) (1,3) (1,3,2) (1,2,3) (1,2) ]]>

Other obsolete functions Applicable Methods The function PrintApplicableMethod PrintApplicableMethod, which was included in versions from 0.41 to 0.58, has been removed since it was considered superfluous. The example shows how to print out a function.

ApplicableMethod( IsCyclic, [ Group((1,2,3),(4,5)) ], 1, 1 ); #I Searching Method for IsCyclic with 1 arguments: #I Total: 7 entries #I Method 4: ``IsCyclic'' at /Applications/gap/gap4r9/lib/grp.gi:30 , value: 36 function( G ) ... end gap> Print( last ); function ( G ) if Length( GeneratorsOfGroup( G ) ) = 1 then return true; else TryNextMethod(); fi; return; end gap> ApplicableMethod( IsCyclic, [ Group((1,2,3),(4,5)) ], 0, 3 ); function( <1 unnamed arguments> ) ... end gap> Print( last ); function ( <> ) <> end ]]> ExponentOfPrime The function ExponentOfPrime ExponentOfPrime was originally transferred from package &RCWA;. The command ExponentOfPrime(n,p) returned the exponent of the prime p in the prime factorization of n.

Since the &GAP; function PValuation produces the same results, and does so more quickly, this function has been made obsolete.

utils-0.93/doc/record.xml0000644000175100017510000001161515105376105014767 0ustar runnerrunner Records
Functions for records This function has been transferred from package &RCWA;.

It assigns the record components of rec to global variables with the same names.

r := rec( a := 1, b := 2, c := 3 );; gap> AssignGlobals( r ); The following global variables have been assigned: [ "a", "b", "c" ] gap> [a,b,c]; [ 1, 2, 3 ] ]]>

Option records for functions This functions has been transferred by Chris Jefferson from other packages. It simplifies the handling of records which are intended to be used for expressing configuration options. defaults represents the "default record", and useroptions lets the user give new values for values in defaults.

The function returns a record with the same component names as defaults and which has the same values as defaults, except for those component names in useroptions, where the values in useroptions are used instead. An error is given if useroptions contains any component names not in defaults. If useroptions is an empty list it is treated as an empty record, and if useroptions is a list of length 1 containing a record, this record is used as useroptions.

defaults := rec( a := 1, b := 2, c := 3 );; gap> OptionRecordWithDefaults( defaults, rec( a := 6) ); rec( a := 6, b := 2, c := 3 ) gap> OptionRecordWithDefaults( defaults, rec( b := 7, c := 8 ) ); rec( a := 1, b := 7, c := 8 ) gap> OptionRecordWithDefaults( defaults, [ ] ); rec( a := 1, b := 2, c := 3 ) gap> OptionRecordWithDefaults( defaults, [ rec( c := 8 ) ] ); rec( a := 1, b := 2, c := 8 ) gap> OptionRecordWithDefaults( defaults, rec( d := 9 ) ); Error, Unknown option: d gap> OptionRecordWithDefaults( defaults, [ rec( b := 7 ), rec( c := 8 ) ] ); Error, Too many arguments for function gap> OptionRecordWithDefaults( defaults, [6,7,8] ); Error, Too many arguments for function ]]> This function is designed to support functions with optional arguments given as a variable record, of the form function(x,y,options...). In the following, very contrived, example function, PrintDimensions, the defaults are given by the variable order which takes values h, w and d having default values 1, 2 and 3. If there is a second argument, then OptionRecordWithDefaults( order, arg[2] ); is used to cvhange the values. These three values then determine the order in which the three dimensions are printed using a SortParallel command.

1 ) and IsRecord( arg[2] ) then order := OptionRecordWithDefaults( order, arg[2] ); fi; L := [ order!.h, order!.w, order!.d ]; len := Length( L ); K := [ 1..len ]; SortParallel( L, K ); Print( "dimensions: " ); Print( V[K[1]], " = ", dim[K[1]], ", " ); Print( V[K[2]], " = ", dim[K[2]], ", " ); Print( V[K[3]], " = ", dim[K[3]], "\n" ); end;; ]]> In the example below the first call to PrintDimensions has just one parameter, mydim, so the default order is used. In the second call, alternate values for h, w and d are given, causing the width to be printed first, and then the depth and height. mydim := rec( height := 45, width := 31, depth := 17 ); rec( depth := 17, height := 45, width := 31 ) gap> PrintDimensions( mydim ); dimensions: height = 45, width = 31, depth = 17 gap> PrintDimensions( mydim, rec( h:=3, w:=1, d:=2 ) ); dimensions: width = 31, depth = 17, height = 45 ]]>
utils-0.93/doc/chap7_mj.html0000644000175100017510000002731015105376105015344 0ustar runnerrunner GAP (Utils) - Chapter 7: Iterators
Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind

7 Iterators

7.1 Some iterators for groups and their isomorphisms

The motivation for adding these operations is partly to give a simple example of an iterator for a list that does not yet exist, and need not be created.

7.1-1 AllIsomorphismsIterator
‣ AllIsomorphismsIterator( G, H )( operation )
‣ AllIsomorphismsNumber( G, H )( operation )
‣ AllIsomorphisms( G, H )( operation )

The main GAP library contains functions producing complete lists of group homomorphisms such as AllHomomorphisms; AllEndomorphisms and AllAutomorphisms. Here we add the missing AllIsomorphisms(G,H) for a list of isomorphisms from \(G\) to \(H\). The method is simple -- find one isomorphism \(G \to H\) and compose this with all the automorphisms of \(G\). In all these cases it may not be desirable to construct a list of homomorphisms, but just implement an iterator, and that is what is done here. The operation AllIsomorphismsNumber returns the number of isomorphisms iterated over (this is, of course, just the order of the automorphisms group). The operation AllIsomorphisms produces the list or isomorphisms.


gap> G := SmallGroup( 6,1);; 
gap> iter := AllIsomorphismsIterator( G, s3 );;
gap> NextIterator( iter );
[ f1, f2 ] -> [ (6,7), (5,6,7) ]
gap> n := AllIsomorphismsNumber( G, s3 );
6
gap> AllIsomorphisms( G, s3 );
[ [ f1, f2 ] -> [ (6,7), (5,6,7) ], [ f1, f2 ] -> [ (5,7), (5,6,7) ], 
  [ f1, f2 ] -> [ (5,6), (5,7,6) ], [ f1, f2 ] -> [ (6,7), (5,7,6) ], 
  [ f1, f2 ] -> [ (5,7), (5,7,6) ], [ f1, f2 ] -> [ (5,6), (5,6,7) ] ]
gap> iter := AllIsomorphismsIterator( G, s3 );;
gap> for h in iter do Print( ImageElm( h, G.1 ) = (6,7), ", " ); od;
true, false, false, true, false, false,

7.1-2 AllSubgroupsIterator
‣ AllSubgroupsIterator( G )( operation )

The manual entry for the operation AllSubgroups states that it is only intended to be used on small examples in a classroom situation. Access to all subgroups was required by the XMod package, so this iterator was introduced here. It used the operations LatticeSubgroups(G) and ConjugacyClassesSubgroups(lat), and then iterates over the entries in these classes.


gap> c3c3 := Group( (1,2,3), (4,5,6) );; 
gap> iter := AllSubgroupsIterator( c3c3 );
<iterator>
gap> while not IsDoneIterator(iter) do Print(NextIterator(iter),"\n"); od;
Group( () )
Group( [ (4,5,6) ] )
Group( [ (1,2,3) ] )
Group( [ (1,2,3)(4,5,6) ] )
Group( [ (1,3,2)(4,5,6) ] )
Group( [ (4,5,6), (1,2,3) ] )

7.2 Operations on iterators

This section considers ways of producing an iterator from one or more iterators. It may be that operations equivalent to these are available elsewhere in the library -- if so, the ones here can be removed in due course.

7.2-1 CartesianIterator
‣ CartesianIterator( iter1, iter2 )( operation )

This iterator returns all pairs \([x,y]\) where \(x\) is the output of a first iterator and \(y\) is the output of a second iterator.


gap> it1 := Iterator( [ 1, 2, 3 ] );;
gap> it2 := Iterator( [ 4, 5, 6 ] );;
gap> iter := CartesianIterator( it1, it2 );;
gap> while not IsDoneIterator(iter) do Print(NextIterator(iter),"\n"); od;
[ 1, 4 ]
[ 1, 5 ]
[ 1, 6 ]
[ 2, 4 ]
[ 2, 5 ]
[ 2, 6 ]
[ 3, 4 ]
[ 3, 5 ]
[ 3, 6 ]

7.2-2 UnorderedPairsIterator
‣ UnorderedPairsIterator( iter )( operation )

This operation returns pairs \([x,y]\) where \(x,y\) are output from a given iterator iter. Unlike the output from CartesianIterator(iter,iter), unordered pairs are returned. In the case \(L = [1,2,3,\ldots]\) the pairs are ordered as \([1,1],[1,2],[2,2],[1,3],[2,3],[3,3],\ldots\).


gap> L := [6,7,8,9];;
gap> iterL := IteratorList( L );; 
gap> pairsL := UnorderedPairsIterator( iterL );;                              
gap> while not IsDoneIterator(pairsL) do Print(NextIterator(pairsL),"\n"); od;
[ 6, 6 ]
[ 6, 7 ]
[ 7, 7 ]
[ 6, 8 ]
[ 7, 8 ]
[ 8, 8 ]
[ 6, 9 ]
[ 7, 9 ]
[ 8, 9 ]
[ 9, 9 ]
gap> iter4 := IteratorList( [ 4 ] );
<iterator>
gap> pairs4 := UnorderedPairsIterator(iter4);
<iterator>
gap> NextIterator( pairs4 );
[ 4, 4 ]
gap> IsDoneIterator( pairs4 );
true

Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind

generated by GAPDoc2HTML

utils-0.93/doc/print.xml0000644000175100017510000000455515105376105014652 0ustar runnerrunner Printing Lists and Iterators
Printing selected items The functions described here print lists or objects with an iterator with one item per line, either the whole list/iterator or certain subsets: by giving a list of positions of items to be printed, or by specifying a first item and then a regular step. This function, given three (or four) parameters, calls operations PrintSelectionFromList or PrintSelectionFromIterator which prints the first item specified, and then the item at every step. The fourth parameter is essential when the object being printed is infinite.

Alternatively, given two parameters, with the second parameter a list L of positive integers, only the items at positions in L are printed.

L := List( [1..20], n -> n^5 );; gap> PrintSelection( L, [18..20] ); 18 : 1889568 19 : 2476099 20 : 3200000 gap> PrintSelection( L, 2, 9 ); 2 : 32 11 : 161051 20 : 3200000 gap> PrintSelection( L, 2, 3, 11 ); 2 : 32 5 : 3125 8 : 32768 11 : 161051 gap> s5 := SymmetricGroup( 5 );; gap> PrintSelection( s5, [30,31,100,101] ); 30 : (1,5)(3,4) 31 : (1,5,2) 100 : (1,4,3) 101 : (1,4)(3,5) gap> PrintSelection( s5, 1, 30 ); 1 : () 31 : (1,5,2) 61 : (1,2,3) 91 : (1,3,5,2,4) gap> PrintSelection( s5, 9, 11, 43 ); 9 : (2,5,3) 20 : (2,4) 31 : (1,5,2) 42 : (1,5,2,3,4) ]]>

utils-0.93/doc/chap12.html0000644000175100017510000001771015105376105014735 0ustar runnerrunner GAP (Utils) - Chapter 12: The transfer procedure
Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind

12 The transfer procedure

We consider here the process for transferring utility functions from a package Home to Utils which has to avoid the potential problem of duplicate declarations of a function causing loading problems in GAP.

If the functions in Home all have names of the form HOME_FunctionName then, in Utils, these functions are likely to be renamed as FunctionName or something similar. In this case the problem of duplicate declarations does not arise. This is what has happened with transfers from the AutoDoc package.

The case where the function names are unchanged is more complicated. Initially we tried out a process which allowed repeated declarations and installations of the functions being transferred. This involved additions to the main library files global.g and oper.g. Since there were misgivings about interfering in this way with basic operations such as BIND_GLOBAL, a simpler (but slightly less convenient) process has been adopted.

Using this alternative procedure, the following steps will be followed when making transfers from Home to Utils.

  1. (Home:) Offer functions for inclusion. This may be simply done by emailing a list of functions. More usefully, email the declaration, implementation, test and documentation files, e.g.: home.gd, home.gi, home.tst and home.xml. (All active authors should be involved.)

  2. (Home:) Declare that m.n is the last version of Home to contain these functions, so that m.n+1 (or similar) will be the first version of Home to have all these functions removed, and to specify Utils as a required package.

  3. (Utils:) Add strings "home" and "m.n" to the list UtilsPackageVersions in the file utils/lib/start.gd.

    
    UtilsPackageVersions := 
      [ "autodoc",     "2016.01.31", 
        "resclasses",  "4.2.5", 
        "home",        "m.n",
        ...,           ... 
      ];
    
    

    While the transfers are being made, it is essential that any new versions of Home should be tested with the latest version of Utils before they are released, so as to avoid loading failures.

  4. (Utils:) Include the function declaration and implementation sections in suitable files, enclosed within a conditional clause of the form:

    
    if OKtoReadFromUtils( "Home" ) then
    . . . . . . 
     <the code> 
    . . . . . . 
    fi;
    
    

    The function OKtoReadFromUtils returns true only if there is an installed version of Home and if this version is greater than m.n. So, at this stage, the copied code will not be read, and the transferred functions can only be called if Home has been installed.

  5. (Utils:) Add the test and documentation material to the appropriate files. The copied code can be tested by temporarily moving Home away from GAP's package directory.

  6. (Utils:) Release a new version of Utils containing all the transferred material.

  7. (Home:) Edit out the declarations and implementations of all the transferred functions, and remove references to them in the manual and tests. Possibly add a note to the manual that these functions have been transferred. Add Utils to the list of Home's required packages in PackageInfo.g. Release a new version of Home.

  8. (Utils:) In due course, when the new version(s) of Home are well established, it may be safe to remove the conditional clauses mentioned in item 4 above. The entry for Home in UtilsPackageLists may then be removed.

Finally, a note on the procedure for testing these functions. As long as a function being transferred still exists in the Home package, the code will not be read from Utils. So, when the tests are run, it is necessary to LoadPackage("home") before the function is called. The file utils/tst/testall.g makes sure that all the necessary packages are loaded before the individual tests are called.

Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind

generated by GAPDoc2HTML

utils-0.93/doc/matrix.xml0000644000175100017510000000773115105376105015021 0ustar runnerrunner Matrices
Some operations for matrices In June 2023 Hongyi Zhao asked in the Forum for a function to implement matrix decomposition into blocks. Such a function was then provided by Pedro García-Sánchez. Hongyi Zhao then requested that the function be added to Utils. What is provided here is a revised version of the original solution, returning a list of decompositions.

This function is a partial inverse to the undocumented library operation DirectSumMat. So if L is the list of diagonal decompositions of a matrix M then each entry in L is a list of matrices, and the direct sum of each of these lists is equal to the original M.

In the following examples, M_6 is an obvious direct sum with 3 blocks. M_4 is an example with three decompositions, while M_8 = M_4 \oplus M_4 has 16 decompositions (not listed).

M6 := [ [1,2,0,0,0,0], [3,4,0,0,0,0], [5,6,0,0,0,0], > [0,0,9,0,0,0], [0,0,0,1,2,3], [0,0,0,4,5,6] ];; gap> Display( M6 ); [ [ 1, 2, 0, 0, 0, 0 ], [ 3, 4, 0, 0, 0, 0 ], [ 5, 6, 0, 0, 0, 0 ], [ 0, 0, 9, 0, 0, 0 ], [ 0, 0, 0, 1, 2, 3 ], [ 0, 0, 0, 4, 5, 6 ] ] gap> L6 := DirectSumDecompositionMatrices( M6 ); [ [ [ [ 1, 2 ], [ 3, 4 ], [ 5, 6 ] ], [ [ 9 ] ], [ [ 1, 2, 3 ], [ 4, 5, 6 ] ] ] ] gap> M4 := [ [0,3,0,0], [0,0,0,0], [0,0,0,0], [0,0,4,0] ];; gap> Display( M4 ); [ [ 0, 3, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 4, 0 ] ] gap> L4 := DirectSumDecompositionMatrices( M4 ); [ [ [ [ 0, 3 ] ], [ [ 0, 0 ], [ 0, 0 ], [ 4, 0 ] ] ], [ [ [ 0, 3 ], [ 0, 0 ] ], [ [ 0, 0 ], [ 4, 0 ] ] ], [ [ [ 0, 3 ], [ 0, 0 ], [ 0, 0 ] ], [ [ 4, 0 ] ] ] ] gap> for L in L4 do > A := DirectSumMat( L );; > if ( A = M4 ) then Print( "yes, A = M4\n" ); fi; > od; yes, A = M4 yes, A = M4 yes, A = M4 gap> M8 := DirectSumMat( M4, M4 );; gap> Display( M8 ); [ [ 0, 3, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 4, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 3, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 4, 0 ] ] gap> L8 := DirectSumDecompositionMatrices( M8 );; gap> Length( L8 ); 16 ]]>

The current method does not, however, catch all possible decompositions. In the following example the matrix M_5 has its third row and third column extirely zero, and the only decomposition found has a [0] factor. There are clearly two 2-factor decompositions with a 2-by-3 and a 3-by-2 factor, but these are not found at present.

M5 := [ [1,2,0,0,0], [3,4,0,0,0], [0,0,0,0,0], > [0,0,0,6,7], [0,0,0,8,9] ];; gap> Display(M5); [ [ 1, 2, 0, 0, 0 ], [ 3, 4, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 6, 7 ], [ 0, 0, 0, 8, 9 ] ] gap> L5 := DirectSumDecompositionMatrices( M5 ); [ [ [ [ 1, 2 ], [ 3, 4 ] ], [ [ 0 ] ], [ [ 6, 7 ], [ 8, 9 ] ] ] ] ]]>

utils-0.93/doc/chapInd.html0000644000175100017510000002162315105376105015223 0ustar runnerrunner GAP (Utils) - Index
Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind

Index

AllIsomorphisms 7.1-1
AllIsomorphismsIterator 7.1-1
AllIsomorphismsNumber 7.1-1
AllProducts 4.1-2
AllSmoothIntegers, for a list and an integer 4.1-1
    for two integers 4.1-1
AllSubgroupsIterator 7.1-2
AssignGlobals 8.1-1
BlankFreeString 3.3-1
CartesianIterator 7.2-1
CentralProduct 5.3-3
CentralProductInfo 5.3-3
Comm 5.1-1
CommonRepresentatives 3.2-1
CommonTransversal 3.2-1
ConvertToMagmaInputString 10.3-1
CreateDirIfMissing 11.1
DifferencesList 3.1-1
DirectProductOfAutomorphismGroups 5.3-6
DirectProductOfFunctions 5.3-5
DirectSumDecompositionMatrices 6.1-1
distinct and common representatives 3.2
DistinctRepresentatives 3.2-1
Download 9.1-1
DownloadMaxTime 9.1-3
DownloadVerifyCertificate 9.1-2
EpimorphismByGenerators 5.3-1
ExponentOfPrime 11.3-2
FindMatchingFiles 11.1
Fitting series 5.1-5
FittingLength 5.1-5
FloatQuotientsList 3.1-2
GeneratorsAndInverses 5.1-4
GetSuffix 11.1
GitHub repository 1.
IdempotentEndomorphisms 5.3-4
IdempotentEndomorphismsData 5.3-4
IdempotentEndomorphismsWithImage 5.3-4
IntOrOnfinityToLaTeX 10.2-1
IsCommonTransversal 3.2-1
IsCommuting 5.1-2
Iterators 7.1
LaTeXStringFactorsInt 10.2-2
LeftCoset 5.2-1
ListOfPowers 5.1-3
Log2HTML 10.1-1
LowerFittingSeries 5.1-5
MatrixGroupToMagmaFormat 10.3-1
NextProbablyPrimeInt 4.1-4
OKtoReadFromUtils 12.
OptionRecordWithDefaults 8.2-1
PcGroupToMagmaFormat 10.3-1
PermGroupToMagmaFormat 10.3-1
PrimeNumbersIterator 4.1-5
PrintApplicableMethod 11.3-1
PrintOneItemPerLine 11.2
PrintSelection, for a first item and a step 2.1-1
    for a list of positions 2.1-1
Pullback 5.3-2
PullbackInfo 5.3-2
QuotientsList 3.1-2
RandomCombination 3.1-4
RestrictedPartitionsWithoutRepetitions 4.1-3
SearchCycle 3.1-3
SetIfMissing 11.1
smooth integer 4.1-1
StringDotSuffix 11.1
UnorderedPairsIterator 7.2-2
UpperFittingSeries 5.1-5

Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind

generated by GAPDoc2HTML

utils-0.93/doc/manual.js0000644000175100017510000001011315105376105014572 0ustar runnerrunner/* manual.js Frank LĂĽbeck */ /* This file contains a few javascript functions which allow to switch between display styles for GAPDoc HTML manuals. If javascript is switched off in a browser or this file in not available in a manual directory, this is no problem. Users just cannot switch between several styles and don't see the corresponding button. A style with name mystyle can be added by providing two files (or only one of them). mystyle.js: Additional javascript code for the style, it is read in the HTML pages after this current file. The additional code may adjust the preprocessing function jscontent() with is called onload of a file. This is done by appending functions to jscontentfuncs (jscontentfuncs.push(newfunc);). Make sure, that your style is still usable without javascript. mystyle.css: CSS configuration, read after manual.css (so it can just reconfigure a few details, or overwrite everything). Then adjust chooser.html such that users can switch on and off mystyle. A user can change the preferred style permanently by using the [Style] link and choosing one. Or one can append '?GAPDocStyle=mystyle' to the URL when loading any file of the manual (so the style can be configured in the GAP user preferences). */ /* generic helper function */ function deleteCookie(nam) { document.cookie = nam+"=;Path=/;expires=Thu, 01 Jan 1970 00:00:00 GMT"; } /* read a value from a "nam1=val1;nam2=val2;..." string (e.g., the search part of an URL or a cookie */ function valueString(str,nam) { var cs = str.split(";"); for (var i=0; i < cs.length; i++) { var pos = cs[i].search(nam+"="); if (pos > -1) { pos = cs[i].indexOf("="); return cs[i].slice(pos+1); } } return 0; } /* when a non-default style is chosen via URL or a cookie, then the cookie is reset and the styles .js and .css files are read */ function overwriteStyle() { /* style in URL? */ var style = valueString(window.location.search, "GAPDocStyle"); /* otherwise check cookie */ if (style == 0) style = valueString(document.cookie, "GAPDocStyle"); if (style == 0) return; if (style == "default") deleteCookie("GAPDocStyle"); else { /* ok, we set the cookie for path "/" */ var path = "/"; /* or better like this ??? var here = window.location.pathname.split("/"); for (var i=0; i+3 < here.length; i++) path = path+"/"+here[i]; */ document.cookie = "GAPDocStyle="+style+";Path="+path; /* split into names of style files */ var stlist = style.split(","); /* read style's css and js files */ for (var i=0; i < stlist.length; i++) { document.writeln(''); document.writeln(''); } } } /* this adds a "[Style]" link next to the MathJax switcher */ function addStyleLink() { var line = document.getElementById("mathjaxlink"); var el = document.createElement("a"); var oncl = document.createAttribute("href"); var back = window.location.protocol+"//" if (window.location.protocol == "http:" || window.location.protocol == "https:") { back = back+window.location.host; if (window.location.port != "") { back = back+":"+window.location.port; } } back = back+window.location.pathname; oncl.nodeValue = "chooser.html?BACK="+back; el.setAttributeNode(oncl); var cont = document.createTextNode(" [Style]"); el.appendChild(cont); line.appendChild(el); } var jscontentfuncs = new Array(); jscontentfuncs.push(addStyleLink); /* the default jscontent() only adds the [Style] link to the page */ function jscontent () { for (var i=0; i < jscontentfuncs.length; i++) jscontentfuncs[i](); } utils-0.93/doc/chap12.txt0000644000175100017510000001310515105376105014602 0ustar runnerrunner 12 The transfer procedure We consider here the process for transferring utility functions from a package Home to Utils which has to avoid the potential problem of duplicate declarations of a function causing loading problems in GAP. If the functions in Home all have names of the form HOME_FunctionName then, in Utils, these functions are likely to be renamed as FunctionName or something similar. In this case the problem of duplicate declarations does not arise. This is what has happened with transfers from the AutoDoc package. The case where the function names are unchanged is more complicated. Initially we tried out a process which allowed repeated declarations and installations of the functions being transferred. This involved additions to the main library files global.g and oper.g. Since there were misgivings about interfering in this way with basic operations such as BIND_GLOBAL, a simpler (but slightly less convenient) process has been adopted. Using this alternative procedure, the following steps will be followed when making transfers from Home to Utils. 1 (Home:) Offer functions for inclusion. This may be simply done by emailing a list of functions. More usefully, email the declaration, implementation, test and documentation files, e.g.: home.gd, home.gi, home.tst and home.xml. (All active authors should be involved.) 2 (Home:) Declare that m.n is the last version of Home to contain these functions, so that m.n+1 (or similar) will be the first version of Home to have all these functions removed, and to specify Utils as a required package. 3 (Utils:) Add strings "home" and "m.n" to the list UtilsPackageVersions in the file utils/lib/start.gd.   Example   UtilsPackageVersions :=   [ "autodoc", "2016.01.31",   "resclasses", "4.2.5",   "home", "m.n",  ..., ...   ];   While the transfers are being made, it is essential that any new versions of Home should be tested with the latest version of Utils before they are released, so as to avoid loading failures. 4 (Utils:) Include the function declaration and implementation sections in suitable files, enclosed within a conditional clause of the form:   Example   if OKtoReadFromUtils( "Home" ) then . . . . . .    . . . . . .  fi;   The function OKtoReadFromUtils returns true only if there is an installed version of Home and if this version is greater than m.n. So, at this stage, the copied code will not be read, and the transferred functions can only be called if Home has been installed. 5 (Utils:) Add the test and documentation material to the appropriate files. The copied code can be tested by temporarily moving Home away from GAP's package directory. 6 (Utils:) Release a new version of Utils containing all the transferred material. 7 (Home:) Edit out the declarations and implementations of all the transferred functions, and remove references to them in the manual and tests. Possibly add a note to the manual that these functions have been transferred. Add Utils to the list of Home's required packages in PackageInfo.g. Release a new version of Home. 8 (Utils:) In due course, when the new version(s) of Home are well established, it may be safe to remove the conditional clauses mentioned in item 4 above. The entry for Home in UtilsPackageLists may then be removed. Finally, a note on the procedure for testing these functions. As long as a function being transferred still exists in the Home package, the code will not be read from Utils. So, when the tests are run, it is necessary to LoadPackage("home") before the function is called. The file utils/tst/testall.g makes sure that all the necessary packages are loaded before the individual tests are called. utils-0.93/doc/iterator.xml0000644000175100017510000001232515105376105015341 0ustar runnerrunner Iterators
Some iterators for groups and their isomorphisms Iterators The motivation for adding these operations is partly to give a simple example of an iterator for a list that does not yet exist, and need not be created.

The main &GAP; library contains functions producing complete lists of group homomorphisms such as AllHomomorphisms; AllEndomorphisms and AllAutomorphisms. Here we add the missing AllIsomorphisms(G,H) for a list of isomorphisms from G to H. The method is simple -- find one isomorphism G \to H and compose this with all the automorphisms of G. In all these cases it may not be desirable to construct a list of homomorphisms, but just implement an iterator, and that is what is done here. The operation AllIsomorphismsNumber returns the number of isomorphisms iterated over (this is, of course, just the order of the automorphisms group). The operation AllIsomorphisms produces the list or isomorphisms.

G := SmallGroup( 6,1);; gap> iter := AllIsomorphismsIterator( G, s3 );; gap> NextIterator( iter ); [ f1, f2 ] -> [ (6,7), (5,6,7) ] gap> n := AllIsomorphismsNumber( G, s3 ); 6 gap> AllIsomorphisms( G, s3 ); [ [ f1, f2 ] -> [ (6,7), (5,6,7) ], [ f1, f2 ] -> [ (5,7), (5,6,7) ], [ f1, f2 ] -> [ (5,6), (5,7,6) ], [ f1, f2 ] -> [ (6,7), (5,7,6) ], [ f1, f2 ] -> [ (5,7), (5,7,6) ], [ f1, f2 ] -> [ (5,6), (5,6,7) ] ] gap> iter := AllIsomorphismsIterator( G, s3 );; gap> for h in iter do Print( ImageElm( h, G.1 ) = (6,7), ", " ); od; true, false, false, true, false, false, ]]> The manual entry for the operation AllSubgroups states that it is only intended to be used on small examples in a classroom situation. Access to all subgroups was required by the XMod package, so this iterator was introduced here. It used the operations LatticeSubgroups(G) and ConjugacyClassesSubgroups(lat), and then iterates over the entries in these classes.

c3c3 := Group( (1,2,3), (4,5,6) );; gap> iter := AllSubgroupsIterator( c3c3 ); gap> while not IsDoneIterator(iter) do Print(NextIterator(iter),"\n"); od; Group( () ) Group( [ (4,5,6) ] ) Group( [ (1,2,3) ] ) Group( [ (1,2,3)(4,5,6) ] ) Group( [ (1,3,2)(4,5,6) ] ) Group( [ (4,5,6), (1,2,3) ] ) ]]>

Operations on iterators This section considers ways of producing an iterator from one or more iterators. It may be that operations equivalent to these are available elsewhere in the library -- if so, the ones here can be removed in due course. This iterator returns all pairs [x,y] where x is the output of a first iterator and y is the output of a second iterator.

it1 := Iterator( [ 1, 2, 3 ] );; gap> it2 := Iterator( [ 4, 5, 6 ] );; gap> iter := CartesianIterator( it1, it2 );; gap> while not IsDoneIterator(iter) do Print(NextIterator(iter),"\n"); od; [ 1, 4 ] [ 1, 5 ] [ 1, 6 ] [ 2, 4 ] [ 2, 5 ] [ 2, 6 ] [ 3, 4 ] [ 3, 5 ] [ 3, 6 ] ]]> This operation returns pairs [x,y] where x,y are output from a given iterator iter. Unlike the output from CartesianIterator(iter,iter), unordered pairs are returned. In the case L = [1,2,3,\ldots] the pairs are ordered as [1,1],[1,2],[2,2],[1,3],[2,3],[3,3],\ldots.

L := [6,7,8,9];; gap> iterL := IteratorList( L );; gap> pairsL := UnorderedPairsIterator( iterL );; gap> while not IsDoneIterator(pairsL) do Print(NextIterator(pairsL),"\n"); od; [ 6, 6 ] [ 6, 7 ] [ 7, 7 ] [ 6, 8 ] [ 7, 8 ] [ 8, 8 ] [ 6, 9 ] [ 7, 9 ] [ 8, 9 ] [ 9, 9 ] gap> iter4 := IteratorList( [ 4 ] ); gap> pairs4 := UnorderedPairsIterator(iter4); gap> NextIterator( pairs4 ); [ 4, 4 ] gap> IsDoneIterator( pairs4 ); true ]]>

utils-0.93/doc/manual.css0000644000175100017510000001575415105376105014766 0ustar runnerrunner/* manual.css Frank LĂĽbeck */ /* This is the default CSS style sheet for GAPDoc HTML manuals. */ /* basic settings, fonts, sizes, colors, ... */ body { position: relative; background: #ffffff; color: #000000; width: 70%; margin: 0pt; padding: 15pt; font-family: Helvetica,Verdana,Arial,sans-serif; text-align: justify; } /* no side toc on title page, bib and index */ body.chap0 { width: 95%; } body.chapBib { width: 95%; } body.chapInd { width: 95%; } h1 { font-size: 200%; } h2 { font-size: 160%; } h3 { font-size: 160%; } h4 { font-size: 130%; } h5 { font-size: 100%; } p.foot { font-size: 60%; font-style: normal; } a:link { color: #00008e; text-decoration: none; } a:visited { color: #00008e; text-decoration: none; } a:active { color: #000000; text-decoration: none; } a:hover { background: #eeeeee; } pre { font-family: "Courier New",Courier,monospace; font-size: 100%; color:#111111; } tt,code { font-family: "Courier New",Courier,monospace; font-size: 110%; color: #000000; } var { } /* general alignment classes */ .pcenter { text-align: center; } .pleft { text-align: left; } .pright { text-align: right; } /* layout for the definitions of functions, variables, ... */ div.func { background: #e0e0e0; margin: 0pt 0pt; } /* general and special table settings */ table { border-collapse: collapse; margin-left: auto; margin-right: auto; } td, th { border-style: none; } table.func { padding: 0pt 1ex; margin-left: 1ex; margin-right: 1ex; background: transparent; /* line-height: 1.1; */ width: 100%; } table.func td.tdright { padding-right: 2ex; } /* Example elements (for old converted manuals, now in div+pre */ table.example { background: #efefef; border-style: none; border-width: 0pt; padding: 0px; width: 100% } table.example td { border-style: none; border-width: 0pt; padding: 0ex 1ex; } /* becomes ... */ div.example { background: #efefef; padding: 0ex 1ex; /* overflow-x: auto; */ overflow: auto; } /* Links to chapters in all files at top and bottom. */ /* If there are too many chapters then use 'display: none' here. */ div.chlinktop { background: #dddddd; border-style: solid; border-width: thin; margin: 2px; text-align: center; } div.chlinktop a { margin: 3px; } div.chlinktop a:hover { background: #ffffff; } div.chlinkbot { background: #dddddd; border-style: solid; border-width: thin; margin: 2px; text-align: center; /* width: 100%; */ } div.chlinkbot a { margin: 3px; } span.chlink1 { } /* and this is for the "Top", "Prev", "Next" links */ div.chlinkprevnexttop { background: #dddddd; border-style: solid; border-width: thin; text-align: center; margin: 2px; } div.chlinkprevnexttop a:hover { background: #ffffff; } div.chlinkprevnextbot { background: #dddddd; border-style: solid; border-width: thin; text-align: center; margin: 2px; } div.chlinkprevnextbot a:hover { background: #ffffff; } /* table of contents, initially don't display subsections */ div.ContSSBlock { display: none; } div.ContSSBlock br { display: none; } /* format in separate lines */ span.tocline { display: block; width: 100%; } div.ContSSBlock a { display: block; } /* this is for the main table of contents */ div.ContChap { } div.ContChap div.ContSect:hover div.ContSSBlock { display: block; position: absolute; background: #eeeeee; border-style: solid; border-width: 1px 4px 4px 1px; border-color: #666666; padding-left: 0.5ex; color: #000000; left: 20%; width: 40%; z-index: 10000; } div.ContSSBlock a:hover { background: #ffffff; } /* and here for the side menu of contents in the chapter files */ div.ChapSects { } div.ChapSects a:hover { background: #eeeeee; } div.ChapSects a:hover { display: block; width: 100%; background: #eeeeee; color: #000000; } div.ChapSects div.ContSect:hover div.ContSSBlock { display: block; position: fixed; background: #eeeeee; border-style: solid; border-width: 1px 2px 2px 1px; border-color: #666666; padding-left: 0ex; padding-right: 0.5ex; color: #000000; left: 54%; width: 25%; z-index: 10000; } div.ChapSects div.ContSect:hover div.ContSSBlock a { display: block; margin-left: 3px; } div.ChapSects div.ContSect:hover div.ContSSBlock a:hover { display: block; background: #ffffff; } div.ContSect { text-align: left; margin-left: 1em; } div.ChapSects { position: fixed; left: 75%; font-size: 90%; overflow: auto; top: 10px; bottom: 0px; } /* Table elements */ table.GAPDocTable { border-collapse: collapse; border-style: none; border-color: black; } table.GAPDocTable td, table.GAPDocTable th { padding: 3pt; border-width: thin; border-style: solid; border-color: #555555; } caption.GAPDocTable { caption-side: bottom; width: 70%; margin-top: 1em; margin-left: auto; margin-right: auto; } td.tdleft { text-align: left; } table.GAPDocTablenoborder { border-collapse: collapse; border-style: none; border-color: black; } table.GAPDocTablenoborder td, table.GAPDocTable th { padding: 3pt; border-width: 0pt; border-style: solid; border-color: #555555; } caption.GAPDocTablenoborder { caption-side: bottom; width: 70%; margin-top: 1em; margin-left: auto; margin-right: auto; } td.tdleft { text-align: left; } td.tdright { text-align: right; } td.tdcenter { text-align: center; } /* Colors and fonts can be overwritten for some types of elements. */ /* Verb elements */ pre.normal { color: #000000; } /* Func-like elements and Ref to Func-like */ code.func { color: #000000; } /* K elements */ code.keyw { color: #770000; } /* F elements */ code.file { color: #8e4510; } /* C elements */ code.code { } /* Item elements */ code.i { } /* Button elements */ strong.button { } /* Headings */ span.Heading { } /* Arg elements */ var.Arg { color: #006600; } /* Example elements, is in tables, see above */ div.Example { } /* Package elements */ strong.pkg { } /* URL-like elements */ span.URL { } /* Mark elements */ strong.Mark { } /* Ref elements */ b.Ref { } span.Ref { } /* this contains the contents page */ div.contents { } /* this contains the index page */ div.index { } /* ignore some text for non-css layout */ span.nocss { display: none; } /* colors for ColorPrompt like examples */ span.GAPprompt { color: #000097; font-weight: normal; } span.GAPbrkprompt { color: #970000; font-weight: normal; } span.GAPinput { color: #970000; } /* Bib entries */ p.BibEntry { } span.BibKey { color: #005522; } span.BibKeyLink { } b.BibAuthor { } i.BibTitle { } i.BibBookTitle { } span.BibEditor { } span.BibJournal { } span.BibType { } span.BibPublisher { } span.BibSchool { } span.BibEdition { } span.BibVolume { } span.BibSeries { } span.BibNumber { } span.BibPages { } span.BibOrganization { } span.BibAddress { } span.BibYear { } span.BibPublisher { } span.BibNote { } span.BibHowpublished { } utils-0.93/doc/chap8_mj.html0000644000175100017510000002342415105376105015347 0ustar runnerrunner GAP (Utils) - Chapter 8: Records
Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind

8 Records

8.1 Functions for records

8.1-1 AssignGlobals
‣ AssignGlobals( rec )( function )

This function has been transferred from package RCWA.

It assigns the record components of rec to global variables with the same names.


gap> r := rec( a := 1, b := 2, c := 3 );;                                      
gap> AssignGlobals( r );
The following global variables have been assigned:
[ "a", "b", "c" ]
gap> [a,b,c];
[ 1, 2, 3 ]

8.2 Option records for functions

8.2-1 OptionRecordWithDefaults
‣ OptionRecordWithDefaults( defaults, useroptions )( function )

This functions has been transferred by Chris Jefferson from other packages. It simplifies the handling of records which are intended to be used for expressing configuration options. defaults represents the "default record", and useroptions lets the user give new values for values in defaults.

The function returns a record with the same component names as defaults and which has the same values as defaults, except for those component names in useroptions, where the values in useroptions are used instead. An error is given if useroptions contains any component names not in defaults. If useroptions is an empty list it is treated as an empty record, and if useroptions is a list of length \(1\) containing a record, this record is used as useroptions.


gap> defaults := rec( a := 1, b := 2, c := 3 );;
gap> OptionRecordWithDefaults( defaults, rec( a := 6) );
rec( a := 6, b := 2, c := 3 )
gap> OptionRecordWithDefaults( defaults, rec( b := 7, c := 8 ) );
rec( a := 1, b := 7, c := 8 )
gap> OptionRecordWithDefaults( defaults, [ ] );
rec( a := 1, b := 2, c := 3 )
gap> OptionRecordWithDefaults( defaults, [ rec( c := 8 ) ] );
rec( a := 1, b := 2, c := 8 )
gap> OptionRecordWithDefaults( defaults, rec( d := 9 ) );
Error, Unknown option: d
gap> OptionRecordWithDefaults( defaults, [ rec( b := 7 ), rec( c := 8 ) ] );
Error, Too many arguments for function
gap> OptionRecordWithDefaults( defaults, [6,7,8] );
Error, Too many arguments for function

This function is designed to support functions with optional arguments given as a variable record, of the form function(x,y,options...). In the following, very contrived, example function, PrintDimensions, the defaults are given by the variable order which takes values h, w and d having default values \(1\), \(2\) and \(3\). If there is a second argument, then OptionRecordWithDefaults( order, arg[2] ); is used to cvhange the values. These three values then determine the order in which the three dimensions are printed using a SortParallel command.


PrintDimensions := function( arg ) 
    local nargs, dim, order, V, L, len, K, i; 
    nargs := Length( arg ); 
    dim := [ arg[1]!.height, arg[1]!.width, arg[1]!.depth ]; 
    order := rec( h := 1, w := 2, d := 3 ); 
    V := [ "height", "width", "depth" ]; 
    if ( nargs > 1 ) and IsRecord( arg[2] ) then 
        order := OptionRecordWithDefaults( order, arg[2] ); 
    fi; 
    L := [ order!.h, order!.w, order!.d ]; 
    len := Length( L );
    K := [ 1..len ]; 
    SortParallel( L, K ); 
    Print( "dimensions: " ); 
    Print( V[K[1]], " = ", dim[K[1]], ", " );
    Print( V[K[2]], " = ", dim[K[2]], ", " );
    Print( V[K[3]], " = ", dim[K[3]], "\n" );
end;;

In the example below the first call to PrintDimensions has just one parameter, mydim, so the default order is used. In the second call, alternate values for h, w and d are given, causing the width to be printed first, and then the depth and height.


gap> mydim := rec( height := 45, width := 31, depth := 17 ); 
rec( depth := 17, height := 45, width := 31 )
gap> PrintDimensions( mydim );
dimensions: height = 45, width = 31, depth = 17
gap> PrintDimensions( mydim, rec( h:=3, w:=1, d:=2 ) );
dimensions: width = 31, depth = 17, height = 45

Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind

generated by GAPDoc2HTML

utils-0.93/doc/chap11_mj.html0000644000175100017510000001774215105376105015427 0ustar runnerrunner GAP (Utils) - Chapter 11: Obsolete functions
Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind

11 Obsolete functions

11.1 Operations from AutoDoc

The file functions FindMatchingFiles and CreateDirIfMissing were copied from package AutoDoc where they are named AutoDoc_FindMatchingFiles and AutoDoc_CreateDirIfMissing.

The string function StringDotSuffix was also copied from package AutoDoc, where it is named AUTODOC_GetSuffix.

The function SetIfMissing was also transferred from package AutoDoc, where it is called AUTODOC_SetIfMissing. It writes into a record provided the position is not yet bound.

As from version 0.61, all these functions became obsolete in Utils, but continue to be defined in AutoDoc.

11.2 Functions for printing

The function PrintOneItemPerLine was used to prints lists vertically, rather than horizontally. Since a very similar result may be achieved using the GAP library functions Perform and Display, this function became obsolete in version 0.61.


gap> s3 := SymmetricGroup( 3 );; 
gap> L := KnownPropertiesOfObject( GeneratorsOfGroup( s3 ) );;
gap> Perform( L, Display );
IsFinite
IsSmallList
IsGeneratorsOfMagmaWithInverses
IsGeneratorsOfSemigroup
IsSubsetLocallyFiniteGroup
gap> Perform( s3, Display ); 
()
(2,3)
(1,3)
(1,3,2)
(1,2,3)
(1,2)

11.3 Other obsolete functions

11.3-1 Applicable Methods

The function PrintApplicableMethod, which was included in versions from 0.41 to 0.58, has been removed since it was considered superfluous. The example shows how to print out a function.


gap> ApplicableMethod( IsCyclic, [ Group((1,2,3),(4,5)) ], 1, 1 );
#I  Searching Method for IsCyclic with 1 arguments:
#I  Total: 7 entries
#I  Method 4: ``IsCyclic'' at /Applications/gap/gap4r9/lib/grp.gi:30 , value: 
36
function( G ) ... end
gap> Print( last );
function ( G )
    if Length( GeneratorsOfGroup( G ) ) = 1 then
        return true;
    else
        TryNextMethod();
    fi;
    return;
end
gap> ApplicableMethod( IsCyclic, [ Group((1,2,3),(4,5)) ], 0, 3 );
function( <1 unnamed arguments> ) ... end
gap> Print( last );                                               
function ( <<arg-1>> )
    <<compiled GAP code from GAPROOT/lib/oper1.g:578>>
end

11.3-2 ExponentOfPrime

The function ExponentOfPrime was originally transferred from package RCWA. The command ExponentOfPrime(n,p) returned the exponent of the prime p in the prime factorization of n.

Since the GAP function PValuation produces the same results, and does so more quickly, this function has been made obsolete.

Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind

generated by GAPDoc2HTML

utils-0.93/doc/chap2.txt0000644000175100017510000000535615105376105014532 0ustar runnerrunner 2 Printing Lists and Iterators 2.1 Printing selected items The functions described here print lists or objects with an iterator with one item per line, either the whole list/iterator or certain subsets:  by giving a list of positions of items to be printed, or  by specifying a first item and then a regular step. 2.1-1 PrintSelection PrintSelection( obj, list )  function PrintSelection( obj, first, step[, last] )  function This function, given three (or four) parameters, calls operations PrintSelectionFromList or PrintSelectionFromIterator which prints the first item specified, and then the item at every step. The fourth parameter is essential when the object being printed is infinite. Alternatively, given two parameters, with the second parameter a list L of positive integers, only the items at positions in L are printed.  Example   gap> L := List( [1..20], n -> n^5 );; gap> PrintSelection( L, [18..20] ); 18 : 1889568 19 : 2476099 20 : 3200000 gap> PrintSelection( L, 2, 9 );  2 : 32 11 : 161051 20 : 3200000 gap> PrintSelection( L, 2, 3, 11 ); 2 : 32 5 : 3125 8 : 32768 11 : 161051 gap> s5 := SymmetricGroup( 5 );; gap> PrintSelection( s5, [30,31,100,101] ); 30 : (1,5)(3,4) 31 : (1,5,2) 100 : (1,4,3) 101 : (1,4)(3,5) gap> PrintSelection( s5, 1, 30 ); 1 : () 31 : (1,5,2) 61 : (1,2,3) 91 : (1,3,5,2,4) gap> PrintSelection( s5, 9, 11, 43 ); 9 : (2,5,3) 20 : (2,4) 31 : (1,5,2) 42 : (1,5,2,3,4)   utils-0.93/doc/chap1.html0000644000175100017510000002072615105376105014654 0ustar runnerrunner GAP (Utils) - Chapter 1: Introduction
Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind

1 Introduction

The Utils package provides a space for utility functions from a variety of GAP packages to be collected together into a single package. In this way it is hoped that they will become more visible to other package authors. This package was first distributed as part of the GAP 4.8.2 distribution.

The package is loaded with the command


gap> LoadPackage( "utils" ); 

Functions have been transferred from the following packages:

  • Conversion of a GAP group to a Magma output string, taken from various sources including other.gi in the main library.

Transfer is complete (for now) for functions from the following packages:

The package may be obtained either as a compressed .tar file or as a .zip file, utils-version_number.tar.gz, by ftp from one of the following sites:

The package also has a GitHub repository at: https://github.com/gap-packages/utils.

Once the package is loaded, the manual doc/manual.pdf can be found in the documentation folder. The html versions, with or without MathJax, may be rebuilt as follows:


gap> ReadPackage( "utils", "makedoc.g" ); 

It is possible to check that the package has been installed correctly by running the test files (which terminates the GAP session):


gap> ReadPackage( "utils", "tst/testall.g" );
Architecture: . . . . . 
testing: . . . . . 
. . . 
#I  No errors detected while testing

Note that functions listed in this manual that are currently in the process of being transferred are only read from the source package Home (say), and so can only be used if Home has already been loaded. There are no such functions in transition at present.

1.1 Information for package authors

A function (or collection of functions) is suitable for transfer from a package Home to Utils if the following conditions are satisfied.

  • The function is sufficiently non-specialised so that it might be of use to other authors.

  • The function does not depend on the remaining functions in Home

  • The function does not do what can already be done with a GAP library function.

  • Documentation of the function and test examples are available.

  • When there is more than one active author of Home, they should all be aware (and content) that the transfer is taking place.

Authors of packages may be reluctant to let go of their utility functions. The following principles may help to reassure them. (Suggestions for more items here are welcome.)

  • A function that has been transferred to Utils will not be changed without the approval of the original author.

  • The current package maintainer has every intention of continuing to maintain Utils. In the event that this proves impossible, the GAP development team will surely find someone to take over.

  • Function names will not be changed unless specifically requested by Home's author(s) or unless they have the form HOME_FunctionName.

  • In order to speed up the transfer process, only functions from one package will be in transition at any given time. Hopefully a week or two will suffice for most packages.

  • Any package author who transfers a function to Utils will become an author of Utils. (In truth, Utils does not have authors, just a large number of contributors.)

The process for transferring utility functions from Home to Utils is described in Chapter 12.

Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind

generated by GAPDoc2HTML

utils-0.93/doc/transfer.xml0000644000175100017510000001146315105376105015336 0ustar runnerrunner The transfer procedure We consider here the process for transferring utility functions from a package &Home; to &Utils; which has to avoid the potential problem of duplicate declarations of a function causing loading problems in &GAP;.

If the functions in &Home; all have names of the form HOME_FunctionName then, in &Utils;, these functions are likely to be renamed as FunctionName or something similar. In this case the problem of duplicate declarations does not arise. This is what has happened with transfers from the &AutoDoc; package.

The case where the function names are unchanged is more complicated. Initially we tried out a process which allowed repeated declarations and installations of the functions being transferred. This involved additions to the main library files global.g and oper.g. Since there were misgivings about interfering in this way with basic operations such as BIND_GLOBAL, a simpler (but slightly less convenient) process has been adopted.

Using this alternative procedure, the following steps will be followed when making transfers from &Home; to &Utils;. (&Home;:) Offer functions for inclusion. This may be simply done by emailing a list of functions. More usefully, email the declaration, implementation, test and documentation files, e.g.: home.gd, home.gi, home.tst and home.xml. (All active authors should be involved.) (&Home;:) Declare that m.n is the last version of &Home; to contain these functions, so that m.n+1 (or similar) will be the first version of &Home; to have all these functions removed, and to specify &Utils; as a required package. (&Utils;:) Add strings "home" and "m.n" to the list UtilsPackageVersions in the file utils/lib/start.gd. While the transfers are being made, it is essential that any new versions of &Home; should be tested with the latest version of &Utils; before they are released, so as to avoid loading failures. (&Utils;:) Include the function declaration and implementation sections in suitable files, enclosed within a conditional clause of the form: . . . . . . fi; ]]> OKtoReadFromUtils The function OKtoReadFromUtils returns true only if there is an installed version of &Home; and if this version is greater than m.n. So, at this stage, the copied code will not be read, and the transferred functions can only be called if &Home; has been installed. (&Utils;:) Add the test and documentation material to the appropriate files. The copied code can be tested by temporarily moving &Home; away from &GAP;'s package directory. (&Utils;:) Release a new version of &Utils; containing all the transferred material. (&Home;:) Edit out the declarations and implementations of all the transferred functions, and remove references to them in the manual and tests. Possibly add a note to the manual that these functions have been transferred. Add &Utils; to the list of &Home;'s required packages in PackageInfo.g. Release a new version of &Home;. (&Utils;:) In due course, when the new version(s) of &Home; are well established, it may be safe to remove the conditional clauses mentioned in item 4 above. The entry for &Home; in UtilsPackageLists may then be removed.

Finally, a note on the procedure for testing these functions. As long as a function being transferred still exists in the &Home; package, the code will not be read from &Utils;. So, when the tests are run, it is necessary to LoadPackage("home") before the function is called. The file utils/tst/testall.g makes sure that all the necessary packages are loaded before the individual tests are called. utils-0.93/doc/chap8.html0000644000175100017510000002300415105376105014653 0ustar runnerrunner GAP (Utils) - Chapter 8: Records

Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind

8 Records

8.1 Functions for records

8.1-1 AssignGlobals
‣ AssignGlobals( rec )( function )

This function has been transferred from package RCWA.

It assigns the record components of rec to global variables with the same names.


gap> r := rec( a := 1, b := 2, c := 3 );;                                      
gap> AssignGlobals( r );
The following global variables have been assigned:
[ "a", "b", "c" ]
gap> [a,b,c];
[ 1, 2, 3 ]

8.2 Option records for functions

8.2-1 OptionRecordWithDefaults
‣ OptionRecordWithDefaults( defaults, useroptions )( function )

This functions has been transferred by Chris Jefferson from other packages. It simplifies the handling of records which are intended to be used for expressing configuration options. defaults represents the "default record", and useroptions lets the user give new values for values in defaults.

The function returns a record with the same component names as defaults and which has the same values as defaults, except for those component names in useroptions, where the values in useroptions are used instead. An error is given if useroptions contains any component names not in defaults. If useroptions is an empty list it is treated as an empty record, and if useroptions is a list of length 1 containing a record, this record is used as useroptions.


gap> defaults := rec( a := 1, b := 2, c := 3 );;
gap> OptionRecordWithDefaults( defaults, rec( a := 6) );
rec( a := 6, b := 2, c := 3 )
gap> OptionRecordWithDefaults( defaults, rec( b := 7, c := 8 ) );
rec( a := 1, b := 7, c := 8 )
gap> OptionRecordWithDefaults( defaults, [ ] );
rec( a := 1, b := 2, c := 3 )
gap> OptionRecordWithDefaults( defaults, [ rec( c := 8 ) ] );
rec( a := 1, b := 2, c := 8 )
gap> OptionRecordWithDefaults( defaults, rec( d := 9 ) );
Error, Unknown option: d
gap> OptionRecordWithDefaults( defaults, [ rec( b := 7 ), rec( c := 8 ) ] );
Error, Too many arguments for function
gap> OptionRecordWithDefaults( defaults, [6,7,8] );
Error, Too many arguments for function

This function is designed to support functions with optional arguments given as a variable record, of the form function(x,y,options...). In the following, very contrived, example function, PrintDimensions, the defaults are given by the variable order which takes values h, w and d having default values 1, 2 and 3. If there is a second argument, then OptionRecordWithDefaults( order, arg[2] ); is used to cvhange the values. These three values then determine the order in which the three dimensions are printed using a SortParallel command.


PrintDimensions := function( arg ) 
    local nargs, dim, order, V, L, len, K, i; 
    nargs := Length( arg ); 
    dim := [ arg[1]!.height, arg[1]!.width, arg[1]!.depth ]; 
    order := rec( h := 1, w := 2, d := 3 ); 
    V := [ "height", "width", "depth" ]; 
    if ( nargs > 1 ) and IsRecord( arg[2] ) then 
        order := OptionRecordWithDefaults( order, arg[2] ); 
    fi; 
    L := [ order!.h, order!.w, order!.d ]; 
    len := Length( L );
    K := [ 1..len ]; 
    SortParallel( L, K ); 
    Print( "dimensions: " ); 
    Print( V[K[1]], " = ", dim[K[1]], ", " );
    Print( V[K[2]], " = ", dim[K[2]], ", " );
    Print( V[K[3]], " = ", dim[K[3]], "\n" );
end;;

In the example below the first call to PrintDimensions has just one parameter, mydim, so the default order is used. In the second call, alternate values for h, w and d are given, causing the width to be printed first, and then the depth and height.


gap> mydim := rec( height := 45, width := 31, depth := 17 ); 
rec( depth := 17, height := 45, width := 31 )
gap> PrintDimensions( mydim );
dimensions: height = 45, width = 31, depth = 17
gap> PrintDimensions( mydim, rec( h:=3, w:=1, d:=2 ) );
dimensions: width = 31, depth = 17, height = 45

Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind

generated by GAPDoc2HTML

utils-0.93/doc/chap7.txt0000644000175100017510000001572315105376105014536 0ustar runnerrunner 7 Iterators 7.1 Some iterators for groups and their isomorphisms The motivation for adding these operations is partly to give a simple example of an iterator for a list that does not yet exist, and need not be created. 7.1-1 AllIsomorphismsIterator AllIsomorphismsIterator( G, H )  operation AllIsomorphismsNumber( G, H )  operation AllIsomorphisms( G, H )  operation The main GAP library contains functions producing complete lists of group homomorphisms such as AllHomomorphisms; AllEndomorphisms and AllAutomorphisms. Here we add the missing AllIsomorphisms(G,H) for a list of isomorphisms from G to H. The method is simple -- find one isomorphism G -> H and compose this with all the automorphisms of G. In all these cases it may not be desirable to construct a list of homomorphisms, but just implement an iterator, and that is what is done here. The operation AllIsomorphismsNumber returns the number of isomorphisms iterated over (this is, of course, just the order of the automorphisms group). The operation AllIsomorphisms produces the list or isomorphisms.  Example   gap> G := SmallGroup( 6,1);;  gap> iter := AllIsomorphismsIterator( G, s3 );; gap> NextIterator( iter ); [ f1, f2 ] -> [ (6,7), (5,6,7) ] gap> n := AllIsomorphismsNumber( G, s3 ); 6 gap> AllIsomorphisms( G, s3 ); [ [ f1, f2 ] -> [ (6,7), (5,6,7) ], [ f1, f2 ] -> [ (5,7), (5,6,7) ],   [ f1, f2 ] -> [ (5,6), (5,7,6) ], [ f1, f2 ] -> [ (6,7), (5,7,6) ],   [ f1, f2 ] -> [ (5,7), (5,7,6) ], [ f1, f2 ] -> [ (5,6), (5,6,7) ] ] gap> iter := AllIsomorphismsIterator( G, s3 );; gap> for h in iter do Print( ImageElm( h, G.1 ) = (6,7), ", " ); od; true, false, false, true, false, false,   7.1-2 AllSubgroupsIterator AllSubgroupsIterator( G )  operation The manual entry for the operation AllSubgroups states that it is only intended to be used on small examples in a classroom situation. Access to all subgroups was required by the XMod package, so this iterator was introduced here. It used the operations LatticeSubgroups(G) and ConjugacyClassesSubgroups(lat), and then iterates over the entries in these classes.  Example   gap> c3c3 := Group( (1,2,3), (4,5,6) );;  gap> iter := AllSubgroupsIterator( c3c3 );  gap> while not IsDoneIterator(iter) do Print(NextIterator(iter),"\n"); od; Group( () ) Group( [ (4,5,6) ] ) Group( [ (1,2,3) ] ) Group( [ (1,2,3)(4,5,6) ] ) Group( [ (1,3,2)(4,5,6) ] ) Group( [ (4,5,6), (1,2,3) ] )   7.2 Operations on iterators This section considers ways of producing an iterator from one or more iterators. It may be that operations equivalent to these are available elsewhere in the library -- if so, the ones here can be removed in due course. 7.2-1 CartesianIterator CartesianIterator( iter1, iter2 )  operation This iterator returns all pairs [x,y] where x is the output of a first iterator and y is the output of a second iterator.  Example   gap> it1 := Iterator( [ 1, 2, 3 ] );; gap> it2 := Iterator( [ 4, 5, 6 ] );; gap> iter := CartesianIterator( it1, it2 );; gap> while not IsDoneIterator(iter) do Print(NextIterator(iter),"\n"); od; [ 1, 4 ] [ 1, 5 ] [ 1, 6 ] [ 2, 4 ] [ 2, 5 ] [ 2, 6 ] [ 3, 4 ] [ 3, 5 ] [ 3, 6 ]   7.2-2 UnorderedPairsIterator UnorderedPairsIterator( iter )  operation This operation returns pairs [x,y] where x,y are output from a given iterator iter. Unlike the output from CartesianIterator(iter,iter), unordered pairs are returned. In the case L = [1,2,3,...] the pairs are ordered as [1,1],[1,2],[2,2],[1,3],[2,3],[3,3],....  Example   gap> L := [6,7,8,9];; gap> iterL := IteratorList( L );;  gap> pairsL := UnorderedPairsIterator( iterL );;  gap> while not IsDoneIterator(pairsL) do Print(NextIterator(pairsL),"\n"); od; [ 6, 6 ] [ 6, 7 ] [ 7, 7 ] [ 6, 8 ] [ 7, 8 ] [ 8, 8 ] [ 6, 9 ] [ 7, 9 ] [ 8, 9 ] [ 9, 9 ] gap> iter4 := IteratorList( [ 4 ] );  gap> pairs4 := UnorderedPairsIterator(iter4);  gap> NextIterator( pairs4 ); [ 4, 4 ] gap> IsDoneIterator( pairs4 ); true   utils-0.93/doc/chap9_mj.html0000644000175100017510000002664115105376105015354 0ustar runnerrunner GAP (Utils) - Chapter 9: Web Downloads
Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind

9 Web Downloads

The Download operation has been written by Thomas Breuer, incorporating a number of suggestions from Max Horn, for version 0.77 of Utils. It implements downloading a file from within GAP. It can use the IO or curlInterface packages, or wget or curl, if installed, and it can be extended with other download methods quite easily. It is envisaged that, once other packages have started to use it, and any problems have been addressed, that the functions will be transferred to the main GAP library.

9.1 Functions for downloading files from the web

9.1-1 Download
‣ Download( url[, opt] )( function )

This function downloads the file with the web address url, which must be a string.

The result is a record which has at least the component success, with value true if the download was successful and false otherwise. In the former case, the component result is bound, whose value is a string that contains the contents of the downloaded file. In the latter case, the component error is bound, whose value is a string that describes the problem.

The function calls the methods stored in the global list Download_Methods until one of them is successful. Currently there are methods based on the GAP functions DownloadURL (curl: DownloadURL) and SingleHTTPRequest (IO: SingleHTTPRequest), and methods based on the external programs wget and curl.

An optional record opt can be given. The following components are supported.

maxTime

If this component is bound then its value must be a nonnegative integer \(n\), meaning that the function gives up after \(n\) seconds.

A zero value of \(n\) means that no timeout is set, the method will never give up in this case.

The default for \(n\) is given by the value of the user preference DownloadMaxTime (see 9.1-3).

target

If this component is bound then its value must be a string that is a local filename, and the function writes the downloaded contents to this file; the returned record does not have a result component in this case.

verifyCert

If this component is bound and has the value false then those download methods that are based on curl or wget will omit the check of the server's certificate.

The same effect is achieved for all Download calls by setting the user preference DownloadVerifyCertificate (see 9.1-2) to false and omitting the verifyCert component from opt.


gap> url:= "https://www.gap-system.org/index.html";;
gap> res1:= Download( url );;
gap> res1.success;
true
gap> IsBound( res1.result ) and IsString( res1.result );
true
gap> res2:= Download( Concatenation( url, "xxx" ) );;
gap> res2.success;
false
gap> IsBound( res2.error ) and IsString( res2.error );
true

9.1-2 User preference DownloadVerifyCertificate

The value true (the default) means that the server's certificate is checked in calls of Download (9.1-1), such that nothing gets downloaded if the certificate is invalid.

If the value is false then download methods are supposed to omit the check of the server's certificate (this may not be supported by all download methods).

One can set the value of the preference to be val via SetUserPreference (Reference: SetUserPreference), by calling SetUserPreference( "utils", "DownloadVerifyCertificate", val ), and access the current value via UserPreference (Reference: UserPreference), by calling UserPreference( "utils", "DownloadVerifyCertificate" ).

We recommend leaving this preference at its default value true. Sometimes it can be necessary to change it, e.g. to work around issues with old operating systems which may not be able to correctly verify new certificates. In general it is better to update such a system, but if that is not an option, then disabling certificate checks may be a good last resort.

9.1-3 User preference DownloadMaxTime

The value 0 (the default) means that no timeout is set in calls of Download (9.1-1). If the value is a positive integer \(n\) then those download methods that support a timeout will give up after \(n\) seconds.

One can set the value of the preference to be val via SetUserPreference (Reference: SetUserPreference), by calling SetUserPreference( "utils", "DownloadMaxTime", val ), and access the current value via UserPreference (Reference: UserPreference), by calling UserPreference( "utils", "DownloadMaxTime" ).

Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind

generated by GAPDoc2HTML

utils-0.93/doc/chap6.html0000644000175100017510000002013715105376105014655 0ustar runnerrunner GAP (Utils) - Chapter 6: Matrices
Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind

6 Matrices

6.1 Some operations for matrices

6.1-1 DirectSumDecompositionMatrices
‣ DirectSumDecompositionMatrices( M )( operation )

In June 2023 Hongyi Zhao asked in the Forum for a function to implement matrix decomposition into blocks. Such a function was then provided by Pedro García-Sánchez. Hongyi Zhao then requested that the function be added to Utils. What is provided here is a revised version of the original solution, returning a list of decompositions.

This function is a partial inverse to the undocumented library operation DirectSumMat. So if L is the list of diagonal decompositions of a matrix M then each entry in L is a list of matrices, and the direct sum of each of these lists is equal to the original M.

In the following examples, M_6 is an obvious direct sum with 3 blocks. M_4 is an example with three decompositions, while M_8 = M_4 ⊕ M_4 has 16 decompositions (not listed).


gap> M6 := [ [1,2,0,0,0,0], [3,4,0,0,0,0], [5,6,0,0,0,0],                       
>            [0,0,9,0,0,0], [0,0,0,1,2,3], [0,0,0,4,5,6] ];;
gap> Display( M6 );
[ [  1,  2,  0,  0,  0,  0 ],
  [  3,  4,  0,  0,  0,  0 ],
  [  5,  6,  0,  0,  0,  0 ],
  [  0,  0,  9,  0,  0,  0 ],
  [  0,  0,  0,  1,  2,  3 ],
  [  0,  0,  0,  4,  5,  6 ] ]
gap> L6 := DirectSumDecompositionMatrices( M6 );
[ [ [ [ 1, 2 ], [ 3, 4 ], [ 5, 6 ] ], [ [ 9 ] ], [ [ 1, 2, 3 ], [ 4, 5, 6 ] ] 
     ] ]

gap> M4 := [ [0,3,0,0], [0,0,0,0], [0,0,0,0], [0,0,4,0] ];;
gap> Display( M4 );
[ [  0,  3,  0,  0 ],
  [  0,  0,  0,  0 ],
  [  0,  0,  0,  0 ],
  [  0,  0,  4,  0 ] ]
gap> L4 := DirectSumDecompositionMatrices( M4 );
[ [ [ [ 0, 3 ] ], [ [ 0, 0 ], [ 0, 0 ], [ 4, 0 ] ] ], 
  [ [ [ 0, 3 ], [ 0, 0 ] ], [ [ 0, 0 ], [ 4, 0 ] ] ], 
  [ [ [ 0, 3 ], [ 0, 0 ], [ 0, 0 ] ], [ [ 4, 0 ] ] ] ]
gap> for L in L4 do 
>        A := DirectSumMat( L );; 
>        if ( A = M4 ) then Print( "yes, A = M4\n" ); fi; 
>    od;
yes, A = M4
yes, A = M4
yes, A = M4

gap> M8 := DirectSumMat( M4, M4 );; 
gap> Display( M8 );
[ [  0,  3,  0,  0,  0,  0,  0,  0 ],
  [  0,  0,  0,  0,  0,  0,  0,  0 ],
  [  0,  0,  0,  0,  0,  0,  0,  0 ],
  [  0,  0,  4,  0,  0,  0,  0,  0 ],
  [  0,  0,  0,  0,  0,  3,  0,  0 ],
  [  0,  0,  0,  0,  0,  0,  0,  0 ],
  [  0,  0,  0,  0,  0,  0,  0,  0 ],
  [  0,  0,  0,  0,  0,  0,  4,  0 ] ]
gap> L8 := DirectSumDecompositionMatrices( M8 );;
gap> Length( L8 ); 
16

The current method does not, however, catch all possible decompositions. In the following example the matrix M_5 has its third row and third column extirely zero, and the only decomposition found has a [0] factor. There are clearly two 2-factor decompositions with a 2-by-3 and a 3-by-2 factor, but these are not found at present.


gap> M5 := [ [1,2,0,0,0], [3,4,0,0,0], [0,0,0,0,0],
>            [0,0,0,6,7], [0,0,0,8,9] ];;
gap> Display(M5);
[ [  1,  2,  0,  0,  0 ],
  [  3,  4,  0,  0,  0 ],
  [  0,  0,  0,  0,  0 ],
  [  0,  0,  0,  6,  7 ],
  [  0,  0,  0,  8,  9 ] ]
gap> L5 := DirectSumDecompositionMatrices( M5 ); 
[ [ [ [ 1, 2 ], [ 3, 4 ] ], [ [ 0 ] ], [ [ 6, 7 ], [ 8, 9 ] ] ] ]

Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind

generated by GAPDoc2HTML

utils-0.93/doc/chapBib_mj.html0000644000175100017510000001412115105376105015666 0ustar runnerrunner GAP (Utils) - References
Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind

References

[BCP97] Bosma, W., Cannon, J. and Playoust, C., The Magma algebra system. {I}. The user language, J. Symbolic Comput., 24 (3-4) (1997), 235--265 pages
( Computational algebra and number theory (London, 1993)} https://doi.org/10.1006/jsco.1996.0125 ).

[GH16] Gutsche, S. and Horn, M., AutoDoc - Generate documentation from GAP source code (Version 2016.12.04) (2016)
( GAP package, https://github.com/gap-packages/AutoDoc ).

[Hor17] Horn, M., GitHubPagesForGAP - Template for easily using GitHub Pages within GAP packages (Version 0.2) (2017)
( GAP package, https://gap-system.github.io/GitHubPagesForGAP/ ).

[Koh17a] Kohl, S., RCWA - Residue-Class-Wise Affine Groups (Version 4.5.1) (2017)
( GAP package, https://stefan-kohl.github.io/rcwa.html ).

[Koh17b] Kohl, S., ResClasses - Set-Theoretic Computations with Residue Classes (Version 4.6.0) (2017)
( GAP package, https://stefan-kohl.github.io/resclasses.html ).

[LN17] Lübeck, F. and Neunhöffer, M., GAPDoc (Version 1.6), RWTH Aachen (2017)
( GAP package, https://www.math.rwth-aachen.de/~Frank.Luebeck/GAPDoc/index.html ).

[WAOU17] Wensley, C. D., Alp, M., Odabas, A. and Uslu, E. O., XMod - Crossed Modules and Cat1-groups in GAP (Version 2.64) (2017)
( GAP package, https://github.com/gap-packages/xmod ).

Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind

generated by GAPDoc2HTML

utils-0.93/doc/chap3_mj.html0000644000175100017510000004100115105376105015331 0ustar runnerrunner GAP (Utils) - Chapter 3: Lists, Sets and Strings
Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind

3 Lists, Sets and Strings

3.1 Functions for lists

3.1-1 DifferencesList
‣ DifferencesList( L )( function )

This function has been transferred from package ResClasses.

It takes a list \(L\) of length \(n\) and outputs the list of length \(n-1\) containing all the differences \(L[i]-L[i-1]\).


gap> List( [1..12], n->n^3 );
[ 1, 8, 27, 64, 125, 216, 343, 512, 729, 1000, 1331, 1728 ]
gap> DifferencesList( last );
[ 7, 19, 37, 61, 91, 127, 169, 217, 271, 331, 397 ]
gap> DifferencesList( last );
[ 12, 18, 24, 30, 36, 42, 48, 54, 60, 66 ]
gap> DifferencesList( last );
[ 6, 6, 6, 6, 6, 6, 6, 6, 6 ]

3.1-2 QuotientsList
‣ QuotientsList( L )( function )
‣ FloatQuotientsList( L )( function )

These functions have been transferred from package ResClasses.

They take a list \(L\) of length \(n\) and output the quotients \(L[i]/L[i-1]\) of consecutive entries in \(L\). An error is returned if an entry is zero.


gap> List( [0..10], n -> Factorial(n) );
[ 1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800 ]
gap> QuotientsList( last );
[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
gap> L := [ 1, 3, 5, -1, -3, -5 ];;
gap> QuotientsList( L );
[ 3, 5/3, -1/5, 3, 5/3 ]
gap> FloatQuotientsList( L );
[ 3., 1.66667, -0.2, 3., 1.66667 ]
gap> QuotientsList( [ 2, 1, 0, -1, -2 ] );
[ 1/2, 0, fail, 2 ]
gap> FloatQuotientsList( [1..10] );
[ 2., 1.5, 1.33333, 1.25, 1.2, 1.16667, 1.14286, 1.125, 1.11111 ]
gap> Product( last );
10. 

3.1-3 SearchCycle
‣ SearchCycle( L )( operation )

This function has been transferred from package RCWA.

SearchCycle is a tool to find likely cycles in lists. What, precisely, a cycle is, is deliberately fuzzy here, and may possibly even change. The idea is that the beginning of the list may be anything, following that the same pattern needs to be repeated several times in order to be recognized as a cycle.


gap> L := [1..20];;  L[1]:=13;;                                              
gap> for i in [1..19] do                                                     
>        if IsOddInt(L[i]) then L[i+1]:=3*L[i]+1; else L[i+1]:=L[i]/2; fi;
>    od;                                                                  
gap> L;                                                                      
[ 13, 40, 20, 10, 5, 16, 8, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4 ]
gap> SearchCycle( L );                                                       
[ 1, 4, 2 ]
gap> n := 1;;  L := [n];;
gap> for i in [1..100] do  n:=(n^2+1) mod 1093;  Add(L,n);  od;
gap> L; 
[ 1, 2, 5, 26, 677, 363, 610, 481, 739, 715, 795, 272, 754, 157, 604, 848, 
  1004, 271, 211, 802, 521, 378, 795, 272, 754, 157, 604, 848, 1004, 271, 
  211, 802, 521, 378, 795, 272, 754, 157, 604, 848, 1004, 271, 211, 802, 521, 
  378, 795, 272, 754, 157, 604, 848, 1004, 271, 211, 802, 521, 378, 795, 272, 
  754, 157, 604, 848, 1004, 271, 211, 802, 521, 378, 795, 272, 754, 157, 604, 
  848, 1004, 271, 211, 802, 521, 378, 795, 272, 754, 157, 604, 848, 1004, 
  271, 211, 802, 521, 378, 795, 272, 754, 157, 604, 848, 1004 ]
gap> C := SearchCycle( L );
[ 157, 604, 848, 1004, 271, 211, 802, 521, 378, 795, 272, 754 ]
gap> P := Positions( L, 157 );
[ 14, 26, 38, 50, 62, 74, 86, 98 ]
gap> Length( C );  DifferencesList( P );
12
[ 12, 12, 12, 12, 12, 12, 12 ]

3.1-4 RandomCombination
‣ RandomCombination( S, k )( operation )

This function has been transferred from package ResClasses.

It returns a random unordered \(k\)-tuple of distinct elements of a set \(S\).


gap> ## "6 aus 49" is a common lottery in Germany
gap> RandomCombination( [1..49], 6 ); 
[ 2, 16, 24, 26, 37, 47 ]

3.2 Distinct and Common Representatives

3.2-1 DistinctRepresentatives
‣ DistinctRepresentatives( list )( operation )
‣ CommonRepresentatives( list )( operation )
‣ CommonTransversal( grp, subgrp )( operation )
‣ IsCommonTransversal( grp, subgrp, list )( operation )

These operations have been transferred from package XMod.

They deal with lists of subsets of \([1 \ldots n]\) and construct systems of distinct and common representatives using simple, non-recursive, combinatorial algorithms.

When \(L\) is a set of \(n\) subsets of \([1 \ldots n]\) and the Hall condition is satisfied (the union of any \(k\) subsets has at least \(k\) elements), a set of DistinctRepresentatives exists.

When \(J,K\) are both lists of \(n\) sets, the operation CommonRepresentatives returns two lists: the set of representatives, and a permutation of the subsets of the second list.

The operation CommonTransversal may be used to provide a common transversal for the sets of left and right cosets of a subgroup \(H\) of a group \(G\), although a greedy algorithm is usually quicker.


gap> J := [ [1,2,3], [3,4], [3,4], [1,2,4] ];;
gap> DistinctRepresentatives( J );
[ 1, 3, 4, 2 ]
gap> K := [ [3,4], [1,2], [2,3], [2,3,4] ];;
gap> CommonRepresentatives( J, K );
[ [ 3, 3, 3, 1 ], [ 1, 3, 4, 2 ] ]
gap> d16 := DihedralGroup( IsPermGroup, 16 ); 
Group([ (1,2,3,4,5,6,7,8), (2,8)(3,7)(4,6) ])
gap> SetName( d16, "d16" );
gap> c4 := Subgroup( d16, [ d16.1^2 ] ); 
Group([ (1,3,5,7)(2,4,6,8) ])
gap> SetName( c4, "c4" );
gap> RightCosets( d16, c4 );
[ RightCoset(c4,()), RightCoset(c4,(2,8)(3,7)(4,6)), RightCoset(c4,(1,8,7,6,5,
   4,3,2)), RightCoset(c4,(1,8)(2,7)(3,6)(4,5)) ]
gap> trans := CommonTransversal( d16, c4 );
[ (), (2,8)(3,7)(4,6), (1,2,3,4,5,6,7,8), (1,2)(3,8)(4,7)(5,6) ]
gap> IsCommonTransversal( d16, c4, trans );
true

3.3 Functions for strings

3.3-1 BlankFreeString
‣ BlankFreeString( obj )( function )

This function has been transferred from package ResClasses.

The result of BlankFreeString( obj ); is a composite of the functions String( obj ) and RemoveCharacters( obj, " " );.


gap> gens := GeneratorsOfGroup( DihedralGroup(12) );
[ f1, f2, f3 ]
gap> String( gens );                                
"[ f1, f2, f3 ]"
gap> BlankFreeString( gens );                       
"[f1,f2,f3]"

Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind

generated by GAPDoc2HTML

utils-0.93/doc/gaplog.css0000644000175100017510000000227715105376105014756 0ustar runnerrunner/* ####################################################################### */ /* ## ## */ /* ## gaplog.css GAP *.log - File Style Stefan Kohl ## */ /* ## ## */ /* ####################################################################### */ body { background: #FFFFFF; color: #000000; margin-top: 5mm; margin-bottom: 5mm; margin-left: 5mm; margin-right: 5mm; font-family: Helvetica,Verdana,Arial,sans-serif; } pre.logfile { font-family: "Courier New",Courier,monospace; font-size: 100%; } em.prompt { font-size: 100%; font-style: normal; color: #FF0000; } em.input { font-size: 100%; font-style: normal; color: #0000FF; } em.output { font-size: 100%; font-style: normal; color: #284D49; } a:link { color: #0000AE; text-decoration: none; } a:visited { color: #0000AE; text-decoration: none; } a:active { color: #000000; text-decoration: none; } /* ####################################################################### */ utils-0.93/doc/chap4.html0000644000175100017510000003017715105376105014660 0ustar runnerrunner GAP (Utils) - Chapter 4: Number-theoretic functions
Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind

4 Number-theoretic functions

4.1 Functions for integers

4.1-1 AllSmoothIntegers
‣ AllSmoothIntegers( maxp, maxn )( function )
‣ AllSmoothIntegers( L, maxp )( function )

This function has been transferred from package RCWA.

The function AllSmoothIntegers(maxp,maxn) returns the list of all positive integers less than or equal to maxn whose prime factors are all in the list L = {p ~|~ p leqslant maxp, p~mboxprime }.

In the alternative form, when L is a list of primes, the function returns the list of all positive integers whose prime factors lie in L.


gap> AllSmoothIntegers( 3, 1000 );
[ 1, 2, 3, 4, 6, 8, 9, 12, 16, 18, 24, 27, 32, 36, 48, 54, 64, 72, 81, 96, 
  108, 128, 144, 162, 192, 216, 243, 256, 288, 324, 384, 432, 486, 512, 576, 
  648, 729, 768, 864, 972 ]
gap> AllSmoothIntegers( [5,11,17], 1000 );
[ 1, 5, 11, 17, 25, 55, 85, 121, 125, 187, 275, 289, 425, 605, 625, 935 ]
gap> Length( last );
16
gap> List( [3..20], n -> Length( AllSmoothIntegers( [5,11,17], 10^n ) ) );
[ 16, 29, 50, 78, 114, 155, 212, 282, 359, 452, 565, 691, 831, 992, 1173, 
  1374, 1595, 1843 ]

4.1-2 AllProducts
‣ AllProducts( L, k )( function )

This function has been transferred from package RCWA.

The command AllProducts(L,k) returns the list of all products of k entries of the list L. Note that every ordering of the entries is used so that, in the commuting case, there are bound to be repetitions.


gap> AllProducts([1..4],3); 
[ 1, 2, 3, 4, 2, 4, 6, 8, 3, 6, 9, 12, 4, 8, 12, 16, 2, 4, 6, 8, 4, 8, 12, 
  16, 6, 12, 18, 24, 8, 16, 24, 32, 3, 6, 9, 12, 6, 12, 18, 24, 9, 18, 27, 
  36, 12, 24, 36, 48, 4, 8, 12, 16, 8, 16, 24, 32, 12, 24, 36, 48, 16, 32, 
  48, 64 ]
gap> Set(last);            
[ 1, 2, 3, 4, 6, 8, 9, 12, 16, 18, 24, 27, 32, 36, 48, 64 ]
gap> AllProducts( [(1,2,3),(2,3,4)], 2 );
[ (2,4,3), (1,2)(3,4), (1,3)(2,4), (1,3,2) ]

4.1-3 RestrictedPartitionsWithoutRepetitions
‣ RestrictedPartitionsWithoutRepetitions( n, S )( function )

This function has been transferred from package RCWA.

For a positive integer n and a set of positive integers S, this function returns the list of partitions of n into distinct elements of S. Unlike RestrictedPartitions, no repetitions are allowed.


gap> RestrictedPartitions( 20, [4..10] );
[ [ 4, 4, 4, 4, 4 ], [ 5, 5, 5, 5 ], [ 6, 5, 5, 4 ], [ 6, 6, 4, 4 ], 
  [ 7, 5, 4, 4 ], [ 7, 7, 6 ], [ 8, 4, 4, 4 ], [ 8, 6, 6 ], [ 8, 7, 5 ], 
  [ 8, 8, 4 ], [ 9, 6, 5 ], [ 9, 7, 4 ], [ 10, 5, 5 ], [ 10, 6, 4 ], 
  [ 10, 10 ] ]
gap> RestrictedPartitionsWithoutRepetitions( 20, [4..10] );
[ [ 10, 6, 4 ], [ 9, 7, 4 ], [ 9, 6, 5 ], [ 8, 7, 5 ] ]
gap> RestrictedPartitionsWithoutRepetitions( 10^2, List([1..10], n->n^2 ) );
[ [ 100 ], [ 64, 36 ], [ 49, 25, 16, 9, 1 ] ]

4.1-4 NextProbablyPrimeInt
‣ NextProbablyPrimeInt( n )( function )

This function has been transferred from package RCWA.

The function NextProbablyPrimeInt(n) does the same as NextPrimeInt(n) except that for reasons of performance it tests numbers only for IsProbablyPrimeInt(n) instead of IsPrimeInt(n). For large n, this function is much faster than NextPrimeInt(n)


gap> n := 2^251;
3618502788666131106986593281521497120414687020801267626233049500247285301248
gap> NextProbablyPrimeInt( n );
3618502788666131106986593281521497120414687020801267626233049500247285301313
gap> time;                     
1
gap> NextPrimeInt( n );        
3618502788666131106986593281521497120414687020801267626233049500247285301313
gap> time;             
213

4.1-5 PrimeNumbersIterator
‣ PrimeNumbersIterator( [chunksize] )( function )

This function has been transferred from package RCWA.

This function returns an iterator which runs over the prime numbers n ascending order; it takes an optional argument chunksize which specifies the length of the interval which is sieved in one go (the default is 10^7), and which can be used to balance runtime vs. memory consumption. It is assumed that chunksize is larger than any gap between two consecutive primes within the range one intends to run the iterator over.


gap> iter := PrimeNumbersIterator();;
gap> for i in [1..100] do  p := NextIterator(iter);  od;
gap> p;
541
gap> sum := 0;;
gap> ## "prime number race" 1 vs. 3 mod 4
gap> for p in PrimeNumbersIterator() do 
>       if p <> 2 then sum := sum + E(4)^(p-1); fi;
>       if sum > 0 then break; fi;
>    od;
gap> p;
26861

Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind

generated by GAPDoc2HTML

utils-0.93/doc/chap11.txt0000644000175100017510000001041415105376105014601 0ustar runnerrunner 11 Obsolete functions 11.1 Operations from AutoDoc The file functions FindMatchingFiles and CreateDirIfMissing were copied from package AutoDoc where they are named AutoDoc_FindMatchingFiles and AutoDoc_CreateDirIfMissing. The string function StringDotSuffix was also copied from package AutoDoc, where it is named AUTODOC_GetSuffix. The function SetIfMissing was also transferred from package AutoDoc, where it is called AUTODOC_SetIfMissing. It writes into a record provided the position is not yet bound. As from version 0.61, all these functions became obsolete in Utils, but continue to be defined in AutoDoc. 11.2 Functions for printing The function PrintOneItemPerLine was used to prints lists vertically, rather than horizontally. Since a very similar result may be achieved using the GAP library functions Perform and Display, this function became obsolete in version 0.61.  Example   gap> s3 := SymmetricGroup( 3 );;  gap> L := KnownPropertiesOfObject( GeneratorsOfGroup( s3 ) );; gap> Perform( L, Display ); IsFinite IsSmallList IsGeneratorsOfMagmaWithInverses IsGeneratorsOfSemigroup IsSubsetLocallyFiniteGroup gap> Perform( s3, Display );  () (2,3) (1,3) (1,3,2) (1,2,3) (1,2)   11.3 Other obsolete functions 11.3-1 Applicable Methods The function PrintApplicableMethod, which was included in versions from 0.41 to 0.58, has been removed since it was considered superfluous. The example shows how to print out a function.  Example   gap> ApplicableMethod( IsCyclic, [ Group((1,2,3),(4,5)) ], 1, 1 ); #I Searching Method for IsCyclic with 1 arguments: #I Total: 7 entries #I Method 4: ``IsCyclic'' at /Applications/gap/gap4r9/lib/grp.gi:30 , value:  36 function( G ) ... end gap> Print( last ); function ( G )  if Length( GeneratorsOfGroup( G ) ) = 1 then  return true;  else  TryNextMethod();  fi;  return; end gap> ApplicableMethod( IsCyclic, [ Group((1,2,3),(4,5)) ], 0, 3 ); function( <1 unnamed arguments> ) ... end gap> Print( last );  function ( <> )  <> end   11.3-2 ExponentOfPrime The function ExponentOfPrime was originally transferred from package RCWA. The command ExponentOfPrime(n,p) returned the exponent of the prime p in the prime factorization of n. Since the GAP function PValuation produces the same results, and does so more quickly, this function has been made obsolete. utils-0.93/doc/chap5.html0000644000175100017510000010372515105376105014661 0ustar runnerrunner GAP (Utils) - Chapter 5: Groups and homomorphisms
Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind

5 Groups and homomorphisms

5.1 Functions for groups

5.1-1 Comm
‣ Comm( L )( operation )

This method has been transferred from package ResClasses.

It provides a method for Comm when the argument is a list (enclosed in square brackets), and calls the function LeftNormedComm.


gap> Comm( [ (1,2), (2,3) ] );
(1,2,3)
gap> Comm( [(1,2),(2,3),(3,4),(4,5),(5,6)] );
(1,5,6)
gap> Comm(Comm(Comm(Comm((1,2),(2,3)),(3,4)),(4,5)),(5,6));  ## the same
(1,5,6)

5.1-2 IsCommuting
‣ IsCommuting( a, b )( operation )

This function has been transferred from package ResClasses.

It tests whether two elements in a group commute.


gap> D12 := DihedralGroup( 12 );
<pc group of size 12 with 3 generators>
gap> SetName( D12, "D12" ); 
gap> a := D12.1;;  b := D12.2;;  
gap> IsCommuting( a, b );
false

5.1-3 ListOfPowers
‣ ListOfPowers( g, exp )( operation )

This function has been transferred from package RCWA.

The operation ListOfPowers(g,exp) returns the list [g,g^2,...,g^exp] of powers of the element g.


gap> ListOfPowers( 2, 20 );
[ 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384,
 32768, 65536, 131072, 262144, 524288, 1048576 ]
gap> ListOfPowers( (1,2,3)(4,5), 12 );
[ (1,2,3)(4,5), (1,3,2), (4,5), (1,2,3), (1,3,2)(4,5), (),
 (1,2,3)(4,5), (1,3,2), (4,5), (1,2,3), (1,3,2)(4,5), () ]
gap> ListOfPowers( D12.2, 6 );
[ f2, f3, f2*f3, f3^2, f2*f3^2, <identity> of ... ]

5.1-4 GeneratorsAndInverses
‣ GeneratorsAndInverses( G )( operation )

This function has been transferred from package RCWA.

This operation returns a list containing the generators of G followed by the inverses of these generators.


gap> GeneratorsAndInverses( D12 );
[ f1, f2, f3, f1, f2*f3^2, f3^2 ]
gap> GeneratorsAndInverses( SymmetricGroup(5) );     
[ (1,2,3,4,5), (1,2), (1,5,4,3,2), (1,2) ]

5.1-5 UpperFittingSeries
‣ UpperFittingSeries( G )( attribute )
‣ LowerFittingSeries( G )( attribute )
‣ FittingLength( G )( attribute )

These three functions have been transferred from package ResClasses.

The upper and lower Fitting series and the Fitting length of a solvable group are described here: https://en.wikipedia.org/wiki/Fitting_length.


gap> UpperFittingSeries( D12 );  LowerFittingSeries( D12 );
[ Group([  ]), Group([ f3, f2*f3 ]), Group([ f1, f3, f2*f3 ]) ]
[ D12, Group([ f3 ]), Group([  ]) ]
gap> FittingLength( D12 );
2
gap> S4 := SymmetricGroup( 4 );;
gap> UpperFittingSeries( S4 );
[ Group(()), Group([ (1,2)(3,4), (1,4)(2,3) ]), Group([ (1,2)(3,4), (1,4)
  (2,3), (2,4,3) ]), Group([ (3,4), (2,3,4), (1,2)(3,4) ]) ]
gap> List( last, StructureDescription );
[ "1", "C2 x C2", "A4", "S4" ]
gap> LowerFittingSeries( S4 );
[ Sym( [ 1 .. 4 ] ), Alt( [ 1 .. 4 ] ), Group([ (1,4)(2,3), (1,3)
 (2,4) ]), Group(()) ]
gap> List( last, StructureDescription );
[ "S4", "A4", "C2 x C2", "1" ]
gap> FittingLength( S4);
3

5.2 Left Cosets for Groups

5.2-1 LeftCoset
‣ LeftCoset( g, U )( operation )

Since GAP uses right actions by default, the library contains the operation RightCoset(U,g) for constructing the right coset Ug of a subgroup U ≤ G and an element g â G. It has been noted in the reference manual that, by inverting all the elements in Ug, the left coset g^-1U is obtained.

Just for the sake of completeness, from August 2022 this package provides the operation LeftCoset(g,U) for constructing the left coset gU. Users are strongly recommended to continue to use RightCoset for all serious calculations, since left cosets have a much simpler implementation and do not behave exactly like right cosets.

The methods for left cosets which are provided generally work by converting gU to Ug^-1; applying the equivalent method for right cosets; and, if necessary, converting back again to left cosets.

G acts on left cosets by OnLeftInverse: (gU)^g_0 = g_0^-1*(gU) = (g_0^-1g)U.


gap> a4 := Group( (1,2,3), (2,3,4) );; SetName( a4, "a4" );
gap> k4 := Group( (1,2)(3,4), (1,3)(2,4) );; SetName( k4, "k4" );
gap> rc := RightCosets( a4, k4 );
[ RightCoset(k4,()), RightCoset(k4,(2,3,4)), RightCoset(k4,(2,4,3)) ]
gap> lc := LeftCosets( a4, k4 );
[ LeftCoset((),k4), LeftCoset((2,4,3),k4), LeftCoset((2,3,4),k4) ]
gap> AsSet( lc[2] );
[ (2,4,3), (1,2,3), (1,3,4), (1,4,2) ]
gap> LeftCoset( (1,4,2), k4 ) = lc[2];
true
gap> Representative( lc[2] );
(2,4,3)
gap> ActingDomain( lc[2] );
k4
gap> (1,4,3) in lc[3];
true
gap> (1,2,3)*lc[2] = lc[3];
true
gap> lc[2]^(1,3,2) = lc[3];
true

5.2-2 Inverse

The inverse of the left coset gU is the right coset Ug^-1, and conversely. This is an abuse of the attribute Inverse, since the standard requirement, that x*x^-1 is an identity, does not hold.


gap> Inverse( rc[3] ) = lc[3];
true
gap> Inverse( lc[2] ) = rc[2];
true

5.3 Functions for group homomorphisms

5.3-1 EpimorphismByGenerators
‣ EpimorphismByGenerators( G, H )( operation )

This function has been transferred from package RCWA.

It constructs a group homomorphism which maps the generators of G to those of H. Its intended use is when G is a free group, and a warning is printed when this is not the case. Note that anything may happen if the resulting map is not a homomorphism!


gap> G := Group( (1,2,3), (3,4,5), (5,6,7), (7,8,9) );;
gap> phi := EpimorphismByGenerators( FreeGroup("a","b","c","d"), G );
[ a, b, c, d ] -> [ (1,2,3), (3,4,5), (5,6,7), (7,8,9) ]
gap> PreImagesRepresentativeNC( phi, (1,2,3,4,5,6,7,8,9) );
d*c*b*a
gap> a := G.1;; b := G.2;; c := G.3;; d := G.4;;
gap> d*c*b*a;
(1,2,3,4,5,6,7,8,9)
gap> ## note that it is easy to produce nonsense: 
gap> epi := EpimorphismByGenerators( Group((1,2,3)), Group((8,9)) );
Warning: calling GroupHomomorphismByImagesNC without checks
[ (1,2,3) ] -> [ (8,9) ]
gap> IsGroupHomomorphism( epi );
true
gap> Image( epi, (1,2,3) );                                            
()
gap> Image( epi, (1,3,2) );
(8,9)

5.3-2 Pullback
‣ Pullback( hom1, hom2 )( operation )
‣ PullbackInfo( G )( attribute )

If ϕ_1 : G_1 -> H and ϕ_2 : G_2 -> H are two group homomorphisms with the same range, then their pullback is the subgroup of G_1 × G_2 consisting of those elements (g_1,g_2) such that ϕ_1 g_1 = ϕ_2 g_2.

The attribute PullbackInfo of a pullback group P is similar to DirectProductInfo for a direct product of groups. Its value is a record with the following components:

directProduct

the direct product G_1 Ă— G_2, and

projections

a list with the two projections onto G_1 and G_2.

There are no embeddings in this record, but it is possible to use the embeddings into the direct product, see Embedding (Reference: Embedding).


gap> s4 := Group( (1,2),(2,3),(3,4) );;
gap> s3 := Group( (5,6),(6,7) );;
gap> c3 := Subgroup( s3, [ (5,6,7) ] );;
gap> f := GroupHomomorphismByImages( s4, s3, 
>             [(1,2),(2,3),(3,4)], [(5,6),(6,7),(5,6)] );; 
gap> i := GroupHomomorphismByImages( c3, s3, [(5,6,7)], [(5,6,7)] );; 
gap> Pfi := Pullback( f, i );
Group([ (2,3,4)(5,7,6), (1,2)(3,4) ])
gap> StructureDescription( Pfi );
"A4"
gap> info := PullbackInfo( Pfi );
rec( directProduct := Group([ (1,2), (2,3), (3,4), (5,6,7) ]), 
  projections := [ [ (2,3,4)(5,7,6), (1,2)(3,4) ] -> [ (2,3,4), (1,2)(3,4) ], 
      [ (2,3,4)(5,7,6), (1,2)(3,4) ] -> [ (5,7,6), () ] ] )
gap> g := (1,2,3)(5,6,7);; 
gap> ImageElm( info!.projections[1], g );
(1,2,3)
gap> ImageElm( info!.projections[2], g );
(5,6,7) 
gap> dp := info!.directProduct;; 
gap> a := ImageElm( Embedding( dp, 1 ), (1,4,3) );; 
gap> b := ImageElm( Embedding( dp, 2 ), (5,7,6) );; 
gap> a*b in Pfi;
true

5.3-3 CentralProduct
‣ CentralProduct( G1, G2, Z1, Phi )( operation )
‣ CentralProductInfo( G )( attribute )

This function was added by Thomas Breuer, following discussions with Hongyi Zhao (see https://github.com/gap-packages/hap/issues/73).

Let G1 and G2 be two groups, Z1 be a central subgroup of G1, and Phi be an isomorphism from Z1 to a central subgroup of G2. The central product defined by these arguments is the factor group of the direct product of G1 and G2 by the central subgroup { (z, (Phi(z))^-1) : z â Z1 }.

The attribute CentralProductInfo of a group G that has been created by CentralProduct is similar to PullbackInfo (5.3-2) for pullback groups. Its value is a record with the following components.

projection

the epimorphism from the direct product of G1 and G2 to G, and

phi

the map Phi.

Note that one can access the direct product as the Source (Reference: Source) value of the projection map, and one can access G1 and G2 as the two embeddings of this direct product, see Embedding (Reference: Embedding).

gap> g1 := DihedralGroup( 8 );
<pc group of size 8 with 3 generators>
gap> c1 := Centre( g1 );
Group([ f3 ])
gap> cp1 := CentralProduct( g1, g1, c1, IdentityMapping( c1 ) );
Group([ f1, f2, f5, f3, f4, f5 ])
gap> IdGroup( cp1 ) = IdGroup( ExtraspecialGroup( 2^5, "+" ) );
true
gap> g2 := QuaternionGroup( 8 );
<pc group of size 8 with 3 generators>
gap> c2 := Centre( g2 );
Group([ y2 ])
gap> cp2 := CentralProduct( g2, g2, c2, IdentityMapping( c2 ) );
Group([ f1, f2, f5, f3, f4, f5 ])
gap> IdGroup( cp2 ) = IdGroup( ExtraspecialGroup( 2^5, "+" ) );
true
gap> info2 := CentralProductInfo( cp2 );
rec( phi := IdentityMapping( Group([ y2 ]) ), 
  projection := [ f1, f2, f3, f4, f5, f6 ] -> [ f1, f2, f5, f3, f4, f5 ] )
gap> Source( Embedding( Source( info2.projection ), 1 ) ) = g2;
true

5.3-4 IdempotentEndomorphisms
‣ IdempotentEndomorphisms( G )( operation )
‣ IdempotentEndomorphismsData( G )( attribute )
‣ IdempotentEndomorphismsWithImage( genG, R )( operation )

An endomorphism f : G -> G is idempotent if f^2=f. It has an image R leqslant G; is the identity map when restricted to R; and has a kernel N which has trivial intersection with R and has size |G|/|R|.

The operation IdempotentEndomorphismsWithImage(genG,R) returns a list of the images of the generating set genG of a group G under the idempotent endomorphisms with image R.

The attribute IdempotentEndomorphismsData(G) returns a record data with fields data.gens, a fixed generating set for G, and data.images a list of the non-empty outputs of IdempotentEndomorphismsWithImage(genG,R) obtained by iterating over all subgroups of G.

The operation IdempotentEndomorphisms(G) returns the list of these mappings obtained using IdempotentEndomorphismsData(G). The first of these is the zero map, the second is the identity.


gap> gens := [ (1,2,3,4), (1,2)(3,4) ];; 
gap> d8 := Group( gens );;
gap> SetName( d8, "d8" );
gap> c2 := Subgroup( d8, [ (2,4) ] );;
gap> IdempotentEndomorphismsWithImage( gens, c2 );
[ [ (), (2,4) ], [ (2,4), () ] ]
gap> IdempotentEndomorphismsData( d8 );
rec( gens := [ (1,2,3,4), (1,2)(3,4) ], 
  images := [ [ [ (), () ] ], [ [ (), (2,4) ], [ (2,4), () ] ], 
      [ [ (), (1,3) ], [ (1,3), () ] ], 
      [ [ (), (1,2)(3,4) ], [ (1,2)(3,4), (1,2)(3,4) ] ], 
      [ [ (), (1,4)(2,3) ], [ (1,4)(2,3), (1,4)(2,3) ] ], 
      [ [ (1,2,3,4), (1,2)(3,4) ] ] ] )
gap> List( last.images, L -> Length(L) );
[ 1, 2, 2, 2, 2, 1 ]
gap> IdempotentEndomorphisms( d8 );               
[ [ (1,2,3,4), (1,2)(3,4) ] -> [ (), () ], 
  [ (1,2,3,4), (1,2)(3,4) ] -> [ (), (2,4) ], 
  [ (1,2,3,4), (1,2)(3,4) ] -> [ (2,4), () ], 
  [ (1,2,3,4), (1,2)(3,4) ] -> [ (), (1,3) ], 
  [ (1,2,3,4), (1,2)(3,4) ] -> [ (1,3), () ], 
  [ (1,2,3,4), (1,2)(3,4) ] -> [ (), (1,2)(3,4) ], 
  [ (1,2,3,4), (1,2)(3,4) ] -> [ (1,2)(3,4), (1,2)(3,4) ], 
  [ (1,2,3,4), (1,2)(3,4) ] -> [ (), (1,4)(2,3) ], 
  [ (1,2,3,4), (1,2)(3,4) ] -> [ (1,4)(2,3), (1,4)(2,3) ], 
  [ (1,2,3,4), (1,2)(3,4) ] -> [ (1,2,3,4), (1,2)(3,4) ] ]

The quaternion group q8 is an example of a group with a tail: there is only one subgroup in the lattice which covers the identity subgroup. The only idempotent isomorphisms of such groups are the identity mapping and the zero mapping because the only pairs N,R are the whole group and the identity subgroup.


gap> q8 := QuaternionGroup( 8 );;
gap> IdempotentEndomorphisms( q8 );
[ [ x, y ] -> [ <identity> of ..., <identity> of ... ], [ x, y ] -> [ x, y ] ]

5.3-5 DirectProductOfFunctions
‣ DirectProductOfFunctions( G, H, f1, f2 )( operation )

Given group homomorphisms f_1 : G_1 -> G_2 and f_2 : H_1 -> H_2, this operation return the product homomorphism f_1 Ă— f_2 : G_1 Ă— G_2 -> H_1 Ă— H_2.


gap> c4 := Group( (1,2,3,4) );; 
gap> c2 := Group( (5,6) );; 
gap> f1 := GroupHomomorphismByImages( c4, c2, [(1,2,3,4)], [(5,6)] );;
gap> c3 := Group( (1,2,3) );; 
gap> c6 := Group( (1,2,3,4,5,6) );; 
gap> f2 := GroupHomomorphismByImages( c3, c6, [(1,2,3)], [(1,3,5)(2,4,6)] );; 
gap> c4c3 := DirectProduct( c4, c3 ); 
Group([ (1,2,3,4), (5,6,7) ])
gap> c2c6 := DirectProduct( c2, c6 ); 
Group([ (1,2), (3,4,5,6,7,8) ])
gap> f := DirectProductOfFunctions( c4c3, c2c6, f1, f2 ); 
[ (1,2,3,4), (5,6,7) ] -> [ (1,2), (3,5,7)(4,6,8) ]
gap> ImageElm( f, (1,4,3,2)(5,7,6) ); 
(1,2)(3,7,5)(4,8,6)

5.3-6 DirectProductOfAutomorphismGroups
‣ DirectProductOfAutomorphismGroups( A1, A2 )( operation )

Let A_1,A_2 be groups of automorphism of groups G_1,G_2 respectively. The output of this function is a group A_1 Ă— A_2 of automorphisms of G_1 Ă— G_2.


gap> c9 := Group( (1,2,3,4,5,6,7,8,9) );; 
gap> ac9 := AutomorphismGroup( c9 );; 
gap> q8 := QuaternionGroup( IsPermGroup, 8 );;
gap> aq8 := AutomorphismGroup( q8 );;
gap> A := DirectProductOfAutomorphismGroups( ac9, aq8 );
<group with 5 generators>
gap> genA := GeneratorsOfGroup( A );;
gap> G := Source( genA[1] );
Group([ (1,2,3,4,5,6,7,8,9), (10,14,12,16)(11,17,13,15), (10,11,12,13)
(14,15,16,17) ])
gap> a := genA[1]*genA[5];  
[ (1,2,3,4,5,6,7,8,9), (10,14,12,16)(11,17,13,15), (10,11,12,13)(14,15,16,17) 
 ] -> [ (1,3,5,7,9,2,4,6,8), (10,16,12,14)(11,15,13,17), 
  (10,11,12,13)(14,15,16,17) ]
gap> ImageElm( a, (1,9,8,7,6,5,4,3,2)(10,14,12,16)(11,17,13,15) );
(1,8,6,4,2,9,7,5,3)(10,16,12,14)(11,15,13,17)

Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind

generated by GAPDoc2HTML

utils-0.93/doc/intro.xml0000644000175100017510000001166315105376105014647 0ustar runnerrunner Introduction The &Utils; package provides a space for utility functions from a variety of &GAP; packages to be collected together into a single package. In this way it is hoped that they will become more visible to other package authors. This package was first distributed as part of the &GAP; 4.8.2 distribution.

The package is loaded with the command LoadPackage( "utils" ); ]]>

Functions have been transferred from the following packages: Conversion of a &GAP; group to a &Magma; output string, taken from various sources including other.gi in the main library.

Transfer is complete (for now) for functions from the following packages: &AutoDoc; (with function names changed); &ResClasses; ; &RCWA; ; &XMod; .

The package may be obtained either as a compressed .tar file or as a .zip file, utils-version_number.tar.gz, by ftp from one of the following sites: the &Utils; GitHub release site: https://gap-packages.github.io/utils/. any &GAP; archive, e.g. https://www.gap-system.org/Packages/packages.html; GitHub repository The package also has a GitHub repository at: https://github.com/gap-packages/utils.

Once the package is loaded, the manual doc/manual.pdf can be found in the documentation folder. The html versions, with or without &MathJax;, may be rebuilt as follows:

ReadPackage( "utils", "makedoc.g" ); ]]>

It is possible to check that the package has been installed correctly by running the test files (which terminates the &GAP; session):

ReadPackage( "utils", "tst/testall.g" ); Architecture: . . . . . testing: . . . . . . . . #I No errors detected while testing ]]>

Note that functions listed in this manual that are currently in the process of being transferred are only read from the source package &Home; (say), and so can only be used if &Home; has already been loaded. There are no such functions in transition at present.

Information for package authors A function (or collection of functions) is suitable for transfer from a package &Home; to &Utils; if the following conditions are satisfied. The function is sufficiently non-specialised so that it might be of use to other authors. The function does not depend on the remaining functions in &Home; The function does not do what can already be done with a &GAP; library function. Documentation of the function and test examples are available. When there is more than one active author of &Home;, they should all be aware (and content) that the transfer is taking place.

Authors of packages may be reluctant to let go of their utility functions. The following principles may help to reassure them. (Suggestions for more items here are welcome.) A function that has been transferred to &Utils; will not be changed without the approval of the original author. The current package maintainer has every intention of continuing to maintain &Utils;. In the event that this proves impossible, the &GAP; development team will surely find someone to take over. Function names will not be changed unless specifically requested by &Home;'s author(s) or unless they have the form HOME_FunctionName. In order to speed up the transfer process, only functions from one package will be in transition at any given time. Hopefully a week or two will suffice for most packages. Any package author who transfers a function to &Utils; will become an author of &Utils;. (In truth, &Utils; does not have authors, just a large number of contributors.)

The process for transferring utility functions from &Home; to &Utils; is described in Chapter .

utils-0.93/doc/chap3.txt0000644000175100017510000002401615105376105014525 0ustar runnerrunner 3 Lists, Sets and Strings 3.1 Functions for lists 3.1-1 DifferencesList DifferencesList( L )  function This function has been transferred from package ResClasses. It takes a list L of length n and outputs the list of length n-1 containing all the differences L[i]-L[i-1].  Example   gap> List( [1..12], n->n^3 ); [ 1, 8, 27, 64, 125, 216, 343, 512, 729, 1000, 1331, 1728 ] gap> DifferencesList( last ); [ 7, 19, 37, 61, 91, 127, 169, 217, 271, 331, 397 ] gap> DifferencesList( last ); [ 12, 18, 24, 30, 36, 42, 48, 54, 60, 66 ] gap> DifferencesList( last ); [ 6, 6, 6, 6, 6, 6, 6, 6, 6 ]   3.1-2 QuotientsList QuotientsList( L )  function FloatQuotientsList( L )  function These functions have been transferred from package ResClasses. They take a list L of length n and output the quotients L[i]/L[i-1] of consecutive entries in L. An error is returned if an entry is zero.  Example   gap> List( [0..10], n -> Factorial(n) ); [ 1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800 ] gap> QuotientsList( last ); [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ] gap> L := [ 1, 3, 5, -1, -3, -5 ];; gap> QuotientsList( L ); [ 3, 5/3, -1/5, 3, 5/3 ] gap> FloatQuotientsList( L ); [ 3., 1.66667, -0.2, 3., 1.66667 ] gap> QuotientsList( [ 2, 1, 0, -1, -2 ] ); [ 1/2, 0, fail, 2 ] gap> FloatQuotientsList( [1..10] ); [ 2., 1.5, 1.33333, 1.25, 1.2, 1.16667, 1.14286, 1.125, 1.11111 ] gap> Product( last ); 10.    3.1-3 SearchCycle SearchCycle( L )  operation This function has been transferred from package RCWA. SearchCycle is a tool to find likely cycles in lists. What, precisely, a cycle is, is deliberately fuzzy here, and may possibly even change. The idea is that the beginning of the list may be anything, following that the same pattern needs to be repeated several times in order to be recognized as a cycle.  Example   gap> L := [1..20];; L[1]:=13;;  gap> for i in [1..19] do  >  if IsOddInt(L[i]) then L[i+1]:=3*L[i]+1; else L[i+1]:=L[i]/2; fi; >  od;  gap> L;  [ 13, 40, 20, 10, 5, 16, 8, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4 ] gap> SearchCycle( L );  [ 1, 4, 2 ] gap> n := 1;; L := [n];; gap> for i in [1..100] do n:=(n^2+1) mod 1093; Add(L,n); od; gap> L;  [ 1, 2, 5, 26, 677, 363, 610, 481, 739, 715, 795, 272, 754, 157, 604, 848,   1004, 271, 211, 802, 521, 378, 795, 272, 754, 157, 604, 848, 1004, 271,   211, 802, 521, 378, 795, 272, 754, 157, 604, 848, 1004, 271, 211, 802, 521,   378, 795, 272, 754, 157, 604, 848, 1004, 271, 211, 802, 521, 378, 795, 272,   754, 157, 604, 848, 1004, 271, 211, 802, 521, 378, 795, 272, 754, 157, 604,   848, 1004, 271, 211, 802, 521, 378, 795, 272, 754, 157, 604, 848, 1004,   271, 211, 802, 521, 378, 795, 272, 754, 157, 604, 848, 1004 ] gap> C := SearchCycle( L ); [ 157, 604, 848, 1004, 271, 211, 802, 521, 378, 795, 272, 754 ] gap> P := Positions( L, 157 ); [ 14, 26, 38, 50, 62, 74, 86, 98 ] gap> Length( C ); DifferencesList( P ); 12 [ 12, 12, 12, 12, 12, 12, 12 ]   3.1-4 RandomCombination RandomCombination( S, k )  operation This function has been transferred from package ResClasses. It returns a random unordered k-tuple of distinct elements of a set S.  Example   gap> ## "6 aus 49" is a common lottery in Germany gap> RandomCombination( [1..49], 6 );  [ 2, 16, 24, 26, 37, 47 ]   3.2 Distinct and Common Representatives 3.2-1 DistinctRepresentatives DistinctRepresentatives( list )  operation CommonRepresentatives( list )  operation CommonTransversal( grp, subgrp )  operation IsCommonTransversal( grp, subgrp, list )  operation These operations have been transferred from package XMod. They deal with lists of subsets of [1 ... n] and construct systems of distinct and common representatives using simple, non-recursive, combinatorial algorithms. When L is a set of n subsets of [1 ... n] and the Hall condition is satisfied (the union of any k subsets has at least k elements), a set of DistinctRepresentatives exists. When J,K are both lists of n sets, the operation CommonRepresentatives returns two lists: the set of representatives, and a permutation of the subsets of the second list. The operation CommonTransversal may be used to provide a common transversal for the sets of left and right cosets of a subgroup H of a group G, although a greedy algorithm is usually quicker.  Example   gap> J := [ [1,2,3], [3,4], [3,4], [1,2,4] ];; gap> DistinctRepresentatives( J ); [ 1, 3, 4, 2 ] gap> K := [ [3,4], [1,2], [2,3], [2,3,4] ];; gap> CommonRepresentatives( J, K ); [ [ 3, 3, 3, 1 ], [ 1, 3, 4, 2 ] ] gap> d16 := DihedralGroup( IsPermGroup, 16 );  Group([ (1,2,3,4,5,6,7,8), (2,8)(3,7)(4,6) ]) gap> SetName( d16, "d16" ); gap> c4 := Subgroup( d16, [ d16.1^2 ] );  Group([ (1,3,5,7)(2,4,6,8) ]) gap> SetName( c4, "c4" ); gap> RightCosets( d16, c4 ); [ RightCoset(c4,()), RightCoset(c4,(2,8)(3,7)(4,6)), RightCoset(c4,(1,8,7,6,5,  4,3,2)), RightCoset(c4,(1,8)(2,7)(3,6)(4,5)) ] gap> trans := CommonTransversal( d16, c4 ); [ (), (2,8)(3,7)(4,6), (1,2,3,4,5,6,7,8), (1,2)(3,8)(4,7)(5,6) ] gap> IsCommonTransversal( d16, c4, trans ); true   3.3 Functions for strings 3.3-1 BlankFreeString BlankFreeString( obj )  function This function has been transferred from package ResClasses. The result of BlankFreeString( obj ); is a composite of the functions String( obj ) and RemoveCharacters( obj, " " );.  Example   gap> gens := GeneratorsOfGroup( DihedralGroup(12) ); [ f1, f2, f3 ] gap> String( gens );  "[ f1, f2, f3 ]" gap> BlankFreeString( gens );  "[f1,f2,f3]"   utils-0.93/doc/bib.xml0000644000175100017510000000631215105376105014243 0ustar runnerrunner SebastianGutsche MaxHorn <C>AutoDoc - Generate documentation from GAP source code (Version 2016.12.04)</C> 2016 GAP package, https://github.com/gap-packages/AutoDoc FrankLübeck MaxNeunhöffer <C>GAPDoc (Version 1.6)</C> RWTH Aachen 2017 GAP package, https://www.math.rwth-aachen.de/~Frank.Luebeck/GAPDoc/index.html MaxHorn <C>GitHubPagesForGAP - Template for easily using GitHub Pages within GAP packages (Version 0.2)</C> 2017 GAP package, https://gap-system.github.io/GitHubPagesForGAP/ http://magma.maths.usyd.edu.au/magma/ WiebBosma JohnCannon CatherinePlayoust <C>The Magma algebra system. {I}. The user language</C> Computational algebra and number theory (London, 1993)} https://doi.org/10.1006/jsco.1996.0125 J. Symbolic Comput. 24 1997 3-4 235--265 0747-7171 68Q40 MR1484478 10.1006/jsco.1996.0125 StefanKohl <C>RCWA - Residue-Class-Wise Affine Groups (Version 4.5.1)</C> 2017 GAP package, https://stefan-kohl.github.io/rcwa.html StefanKohl <C>ResClasses - Set-Theoretic Computations with Residue Classes (Version 4.6.0)</C> 2017 GAP package, https://stefan-kohl.github.io/resclasses.html Chris D.Wensley MuratAlp AlperOdabas Enver OnderUslu <C>XMod - Crossed Modules and Cat1-groups in GAP (Version 2.64)</C> 2017 GAP package, https://github.com/gap-packages/xmod utils-0.93/doc/chap7.html0000644000175100017510000002662215105376105014663 0ustar runnerrunner GAP (Utils) - Chapter 7: Iterators
Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind

7 Iterators

7.1 Some iterators for groups and their isomorphisms

The motivation for adding these operations is partly to give a simple example of an iterator for a list that does not yet exist, and need not be created.

7.1-1 AllIsomorphismsIterator
‣ AllIsomorphismsIterator( G, H )( operation )
‣ AllIsomorphismsNumber( G, H )( operation )
‣ AllIsomorphisms( G, H )( operation )

The main GAP library contains functions producing complete lists of group homomorphisms such as AllHomomorphisms; AllEndomorphisms and AllAutomorphisms. Here we add the missing AllIsomorphisms(G,H) for a list of isomorphisms from G to H. The method is simple -- find one isomorphism G -> H and compose this with all the automorphisms of G. In all these cases it may not be desirable to construct a list of homomorphisms, but just implement an iterator, and that is what is done here. The operation AllIsomorphismsNumber returns the number of isomorphisms iterated over (this is, of course, just the order of the automorphisms group). The operation AllIsomorphisms produces the list or isomorphisms.


gap> G := SmallGroup( 6,1);; 
gap> iter := AllIsomorphismsIterator( G, s3 );;
gap> NextIterator( iter );
[ f1, f2 ] -> [ (6,7), (5,6,7) ]
gap> n := AllIsomorphismsNumber( G, s3 );
6
gap> AllIsomorphisms( G, s3 );
[ [ f1, f2 ] -> [ (6,7), (5,6,7) ], [ f1, f2 ] -> [ (5,7), (5,6,7) ], 
  [ f1, f2 ] -> [ (5,6), (5,7,6) ], [ f1, f2 ] -> [ (6,7), (5,7,6) ], 
  [ f1, f2 ] -> [ (5,7), (5,7,6) ], [ f1, f2 ] -> [ (5,6), (5,6,7) ] ]
gap> iter := AllIsomorphismsIterator( G, s3 );;
gap> for h in iter do Print( ImageElm( h, G.1 ) = (6,7), ", " ); od;
true, false, false, true, false, false,

7.1-2 AllSubgroupsIterator
‣ AllSubgroupsIterator( G )( operation )

The manual entry for the operation AllSubgroups states that it is only intended to be used on small examples in a classroom situation. Access to all subgroups was required by the XMod package, so this iterator was introduced here. It used the operations LatticeSubgroups(G) and ConjugacyClassesSubgroups(lat), and then iterates over the entries in these classes.


gap> c3c3 := Group( (1,2,3), (4,5,6) );; 
gap> iter := AllSubgroupsIterator( c3c3 );
<iterator>
gap> while not IsDoneIterator(iter) do Print(NextIterator(iter),"\n"); od;
Group( () )
Group( [ (4,5,6) ] )
Group( [ (1,2,3) ] )
Group( [ (1,2,3)(4,5,6) ] )
Group( [ (1,3,2)(4,5,6) ] )
Group( [ (4,5,6), (1,2,3) ] )

7.2 Operations on iterators

This section considers ways of producing an iterator from one or more iterators. It may be that operations equivalent to these are available elsewhere in the library -- if so, the ones here can be removed in due course.

7.2-1 CartesianIterator
‣ CartesianIterator( iter1, iter2 )( operation )

This iterator returns all pairs [x,y] where x is the output of a first iterator and y is the output of a second iterator.


gap> it1 := Iterator( [ 1, 2, 3 ] );;
gap> it2 := Iterator( [ 4, 5, 6 ] );;
gap> iter := CartesianIterator( it1, it2 );;
gap> while not IsDoneIterator(iter) do Print(NextIterator(iter),"\n"); od;
[ 1, 4 ]
[ 1, 5 ]
[ 1, 6 ]
[ 2, 4 ]
[ 2, 5 ]
[ 2, 6 ]
[ 3, 4 ]
[ 3, 5 ]
[ 3, 6 ]

7.2-2 UnorderedPairsIterator
‣ UnorderedPairsIterator( iter )( operation )

This operation returns pairs [x,y] where x,y are output from a given iterator iter. Unlike the output from CartesianIterator(iter,iter), unordered pairs are returned. In the case L = [1,2,3,...] the pairs are ordered as [1,1],[1,2],[2,2],[1,3],[2,3],[3,3],....


gap> L := [6,7,8,9];;
gap> iterL := IteratorList( L );; 
gap> pairsL := UnorderedPairsIterator( iterL );;                              
gap> while not IsDoneIterator(pairsL) do Print(NextIterator(pairsL),"\n"); od;
[ 6, 6 ]
[ 6, 7 ]
[ 7, 7 ]
[ 6, 8 ]
[ 7, 8 ]
[ 8, 8 ]
[ 6, 9 ]
[ 7, 9 ]
[ 8, 9 ]
[ 9, 9 ]
gap> iter4 := IteratorList( [ 4 ] );
<iterator>
gap> pairs4 := UnorderedPairsIterator(iter4);
<iterator>
gap> NextIterator( pairs4 );
[ 4, 4 ]
gap> IsDoneIterator( pairs4 );
true

Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind

generated by GAPDoc2HTML

utils-0.93/doc/chap10.txt0000644000175100017510000001503015105376105014577 0ustar runnerrunner 10 Various other functions 10.1 File operations 10.1-1 Log2HTML Log2HTML( filename )  function This function has been transferred from package RCWA. This function converts the GAP logfile filename to HTML. It appears that the logfile should be in your current directory. The extension of the input file must be *.log. The name of the output file is the same as the one of the input file except that the extension *.log is replaced by *.html. There is a sample CSS file in utils/doc/gaplog.css, which you can adjust to your taste.  Example   gap> LogTo( "triv.log" ); gap> a := 33^5; 39135393 gap> LogTo();  gap> Log2HTML( "triv.log" );    10.2 LaTeX strings 10.2-1 IntOrOnfinityToLaTeX IntOrOnfinityToLaTeX( n )  function This function has been transferred from package ResClasses. IntOrInfinityToLaTeX(n) returns the LaTeX string for n.  Example   gap> IntOrInfinityToLaTeX( 10^3 ); "1000" gap> IntOrInfinityToLaTeX( infinity ); "\\infty"   10.2-2 LaTeXStringFactorsInt LaTeXStringFactorsInt( n )  function This function has been transferred from package RCWA. It returns the prime factorization of the integer n as a string in LaTeX format.  Example   gap> LaTeXStringFactorsInt( Factorial(12) ); "2^{10} \\cdot 3^5 \\cdot 5^2 \\cdot 7 \\cdot 11"   10.3 Conversion to Magma strings 10.3-1 ConvertToMagmaInputString ConvertToMagmaInputString( arg )  function The function ConvertToMagmaInputString( obj [, str] ) attempts to output a string s which can be read into Magma [BCP97] so as to produce the same group in that computer algebra system. In the second form the user specifies the name of the resulting object, so that the output string has the form "str := ...". When obj is a permutation group, the operation PermGroupToMagmaFormat(obj) is called. This function has been taken from other.gi in the main library where it was called MagmaInputString. When obj is a pc-group, the operation PcGroupToMagmaFormat(obj) is called. This function was private code of Max Horn. When obj is a matrix group over a finite field, the operation MatrixGroupToMagmaFormat(obj) is called. This function is a modification of private code of Frank LĂĽbeck. Hopefully code for other types of group will be added in due course. These functions should be considered experimental, and more testing is desirable.  Example   gap> ## permutation groups gap> ConvertToMagmaInputString( Group( (1,2,3,4,5), (3,4,5) ) ); "PermutationGroup<5|(1,2,3,4,5),\n(3,4,5)>;\n" gap> ConvertToMagmaInputString( Group( (1,2,3,4,5) ), "c5" );  "c5 := PermutationGroup<5|(1,2,3,4,5)>;\n" gap> ## pc-group gap> ConvertToMagmaInputString( DihedralGroup( IsPcGroup, 10 ) ); "PolycyclicGroup< f1,f2 |\nf1^2,\nf2^5,\nf2^f1 = f2^4\n>;\n" gap> ## fp-group gap> F2 := FreeGroup( 2 );; gap> f := F2.1;; g := F2.2;; gap> relq8 := [ f^4, g^4, f*g*f*g^-1, f^2*g^2 ];;  gap> q8 := F2/relq8;;  gap> ConvertToMagmaInputString( q8 ); no conversion function yet available for fp-groups fail gap> ## matrix group gap> M := GL(2,5);; Size(M);  480 gap> s1 := ConvertToMagmaInputString( M ); "F := GF(5);\nP := GL(2,F);\ngens := [\nP![2,0,0,1],\nP![4,1,4,0]\n];\nsub

;\n" gap> Print( s1 ); F := GF(5); P := GL(2,F); gens := [ P![2,0,0,1], P![4,1,4,0] ]; sub

; gap> n1 := [ [ Z(9)^0, Z(9)^0 ], [ Z(9)^0, Z(9) ] ];; gap> n2 := [ [ Z(9)^0, Z(9)^3 ], [ Z(9)^4, Z(9)^2 ] ];; gap> N := Group( n1, n2 );; Size( N ); 5760 gap> s2 := ConvertToMagmaInputString( N, "gpN" );; gap> Print( s2 ); F := GF(3^2); P := GL(2,F); w := PrimitiveElement(F); gens := [ P![ 1, 1, 1,w^1], P![ 1,w^3, 2,w^2] ]; gpN := sub

;   utils-0.93/doc/toggless.js0000644000175100017510000000420515105376105015151 0ustar runnerrunner/* toggless.js Frank LĂĽbeck */ /* this file contains two functions: mergeSideTOCHooks: this changes div.ContSect elements to the class ContSectClosed and includes a hook to toggle between ContSectClosed and ContSectOpen. openclosetoc: this function does the toggling, the rest is done by CSS */ closedTOCMarker = "â–¶ "; openTOCMarker = "â–Ľ "; noTOCMarker = " "; /* merge hooks into side toc for opening/closing subsections with openclosetoc */ function mergeSideTOCHooks() { var hlist = document.getElementsByTagName("div"); for (var i = 0; i < hlist.length; i++) { if (hlist[i].className == "ContSect") { var chlds = hlist[i].childNodes; var el = document.createElement("span"); var oncl = document.createAttribute("class"); oncl.nodeValue = "toctoggle"; el.setAttributeNode(oncl); var cont; if (chlds.length > 2) { var oncl = document.createAttribute("onclick"); oncl.nodeValue = "openclosetoc(event)"; el.setAttributeNode(oncl); cont = document.createTextNode(closedTOCMarker); } else { cont = document.createTextNode(noTOCMarker); } el.appendChild(cont); hlist[i].firstChild.insertBefore(el, hlist[i].firstChild.firstChild); hlist[i].className = "ContSectClosed"; } } } function openclosetoc (event) { /* first two steps to make it work in most browsers */ var evt=window.event || event; if (!evt.target) evt.target=evt.srcElement; var markClosed = document.createTextNode(closedTOCMarker); var markOpen = document.createTextNode(openTOCMarker); var par = evt.target.parentNode.parentNode; if (par.className == "ContSectOpen") { par.className = "ContSectClosed"; evt.target.replaceChild(markClosed, evt.target.firstChild); } else if (par.className == "ContSectClosed") { par.className = "ContSectOpen"; evt.target.replaceChild(markOpen, evt.target.firstChild); } } /* adjust jscontent which is called onload */ jscontentfuncs.push(mergeSideTOCHooks); utils-0.93/doc/manual.six0000644000175100017510000003670715105376105015002 0ustar runnerrunner#SIXFORMAT GapDocGAP HELPBOOKINFOSIXTMP := rec( encoding := "UTF-8", bookname := "Utils", entries := [ [ "Title page", "0.0", [ 0, 0, 0 ], 1, 1, "title page", "X7D2C85EC87DD46E5" ], [ "Abstract", "0.0-1", [ 0, 0, 1 ], 64, 2, "abstract", "X7AA6C5737B711C89" ] , [ "Copyright", "0.0-2", [ 0, 0, 2 ], 82, 2, "copyright", "X81488B807F2A1CF1" ], [ "Acknowledgements", "0.0-3", [ 0, 0, 3 ], 92, 2, "acknowledgements", "X82A988D47DFAFCFA" ], [ "Table of Contents", "0.0-4", [ 0, 0, 4 ], 101, 3, "table of contents", "X8537FEB07AF2BEC8" ], [ "\033[1X\033[33X\033[0;-2YIntroduction\033[133X\033[101X", "1", [ 1, 0, 0 ], 1, 5, "introduction", "X7DFB63A97E67C0A1" ], [ "\033[1X\033[33X\033[0;-2YInformation for package authors\033[133X\033[101X\ ", "1.1", [ 1, 1, 0 ], 71, 6, "information for package authors", "X8508AD637B79CEE8" ], [ "\033[1X\033[33X\033[0;-2YPrinting Lists and Iterators\033[133X\033[101X", "2", [ 2, 0, 0 ], 1, 7, "printing lists and iterators", "X83686EE47E4D4F66" ], [ "\033[1X\033[33X\033[0;-2YPrinting selected items\033[133X\033[101X", "2.1", [ 2, 1, 0 ], 4, 7, "printing selected items", "X7F6817927F86240F" ], [ "\033[1X\033[33X\033[0;-2YLists, Sets and Strings\033[133X\033[101X", "3", [ 3, 0, 0 ], 1, 9, "lists sets and strings", "X7AE6EFC086C0EB3C" ], [ "\033[1X\033[33X\033[0;-2YFunctions for lists\033[133X\033[101X", "3.1", [ 3, 1, 0 ], 4, 9, "functions for lists", "X7C3F1E7D878AAA65" ], [ "\033[1X\033[33X\033[0;-2YDistinct and Common Representatives\033[133X\033[\ 101X", "3.2", [ 3, 2, 0 ], 117, 11, "distinct and common representatives", "X82F443FF84B8FCE3" ], [ "\033[1X\033[33X\033[0;-2YFunctions for strings\033[133X\033[101X", "3.3", [ 3, 3, 0 ], 169, 12, "functions for strings", "X8033A2FE80FC2F2A" ], [ "\033[1X\033[33X\033[0;-2YNumber-theoretic functions\033[133X\033[101X", "4", [ 4, 0, 0 ], 1, 13, "number-theoretic functions", "X86E71C1687F2D0AD" ], [ "\033[1X\033[33X\033[0;-2YFunctions for integers\033[133X\033[101X", "4.1", [ 4, 1, 0 ], 4, 13, "functions for integers", "X7D33B5B17BF785CA" ], [ "\033[1X\033[33X\033[0;-2YGroups and homomorphisms\033[133X\033[101X", "5", [ 5, 0, 0 ], 1, 16, "groups and homomorphisms", "X8171DAF2833FF728" ], [ "\033[1X\033[33X\033[0;-2YFunctions for groups\033[133X\033[101X", "5.1", [ 5, 1, 0 ], 4, 16, "functions for groups", "X7E21E6D285E6B12C" ], [ "\033[1X\033[33X\033[0;-2YLeft Cosets for Groups\033[133X\033[101X", "5.2", [ 5, 2, 0 ], 120, 18, "left cosets for groups", "X7FE4848B7DE6B3FD" ], [ "\033[1X\033[33X\033[0;-2YInverse\033[133X\033[101X", "5.2-2", [ 5, 2, 2 ], 169, 19, "inverse", "X793E48267EF5FD77" ], [ "\033[1X\033[33X\033[0;-2YFunctions for group homomorphisms\033[133X\033[10\ 1X", "5.3", [ 5, 3, 0 ], 185, 19, "functions for group homomorphisms", "X80A512877F515DE7" ], [ "\033[1X\033[33X\033[0;-2YMatrices\033[133X\033[101X", "6", [ 6, 0, 0 ], 1, 24, "matrices", "X812CCAB278643A59" ], [ "\033[1X\033[33X\033[0;-2YSome operations for matrices\033[133X\033[101X", "6.1", [ 6, 1, 0 ], 4, 24, "some operations for matrices", "X802118FB7C94D6BA" ], [ "\033[1X\033[33X\033[0;-2YIterators\033[133X\033[101X", "7", [ 7, 0, 0 ], 1, 26, "iterators", "X85A3F00985453F95" ], [ "\033[1X\033[33X\033[0;-2YSome iterators for groups and their isomorphisms\\ 033[133X\033[101X", "7.1", [ 7, 1, 0 ], 4, 26, "some iterators for groups and their isomorphisms", "X7BB5350081B27D17" ], [ "\033[1X\033[33X\033[0;-2YOperations on iterators\033[133X\033[101X", "7.2", [ 7, 2, 0 ], 72, 27, "operations on iterators", "X85413EED812C6497" ], [ "\033[1X\033[33X\033[0;-2YRecords\033[133X\033[101X", "8", [ 8, 0, 0 ], 1, 29, "records", "X7AA1073C7E943DD7" ], [ "\033[1X\033[33X\033[0;-2YFunctions for records\033[133X\033[101X", "8.1", [ 8, 1, 0 ], 4, 29, "functions for records", "X82B3D1D583CDF0E5" ], [ "\033[1X\033[33X\033[0;-2YOption records for functions\033[133X\033[101X", "8.2", [ 8, 2, 0 ], 27, 29, "option records for functions", "X7E6207B47B9AA30C" ], [ "\033[1X\033[33X\033[0;-2YWeb Downloads\033[133X\033[101X", "9", [ 9, 0, 0 ], 1, 32, "web downloads", "X815B0C4B7EBE6E1E" ], [ "\033[1X\033[33X\033[0;-2YFunctions for downloading files from the web\033[\ 133X\033[101X", "9.1", [ 9, 1, 0 ], 12, 32, "functions for downloading files from the web", "X8758CB7F79EFB6ED" ], [ "\033[1X\033[33X\033[0;-2YUser preference \033[10XDownloadVerifyCertificat\ e\033[110X\033[101X\027\033[1X\027\033[133X\033[101X", "9.1-2", [ 9, 1, 2 ], 77, 33, "user preference downloadverifycertificate", "X85182BA486E3C2AA" ], [ "\033[1X\033[33X\033[0;-2YUser preference \033[10XDownloadMaxTime\033[110X\\ 033[101X\027\033[1X\027\033[133X\033[101X", "9.1-3", [ 9, 1, 3 ], 100, 33, "user preference downloadmaxtime", "X79E10E5B83EF929F" ], [ "\033[1X\033[33X\033[0;-2YVarious other functions\033[133X\033[101X", "10", [ 10, 0, 0 ], 1, 34, "various other functions", "X83EFC3178180D918" ], [ "\033[1X\033[33X\033[0;-2YFile operations\033[133X\033[101X", "10.1", [ 10, 1, 0 ], 4, 34, "file operations", "X81A0A4FF842B039B" ], [ "\033[1X\033[33X\033[0;-2YLaTeX strings\033[133X\033[101X", "10.2", [ 10, 2, 0 ], 29, 34, "latex strings", "X84D2922D87EDE9E9" ], [ "\033[1X\033[33X\033[0;-2YConversion to \033[22XMagma\033[122X\033[101X\\ 027\033[1X\027 strings\033[133X\033[101X", "10.3", [ 10, 3, 0 ], 65, 35, "conversion to magma strings", "X79F021B1830B68F6" ], [ "\033[1X\033[33X\033[0;-2YObsolete functions\033[133X\033[101X", "11", [ 11, 0, 0 ], 1, 37, "obsolete functions", "X7F561B1D803182FF" ], [ "\033[1X\033[33X\033[0;-2YOperations from AutoDoc\033[133X\033[101X", "11.1", [ 11, 1, 0 ], 4, 37, "operations from autodoc", "X7A6BB3D084912F35" ], [ "\033[1X\033[33X\033[0;-2YFunctions for printing\033[133X\033[101X", "11.2", [ 11, 2, 0 ], 21, 37, "functions for printing", "X86F322FC7DECE36F" ], [ "\033[1X\033[33X\033[0;-2YOther obsolete functions\033[133X\033[101X", "11.3", [ 11, 3, 0 ], 49, 38, "other obsolete functions", "X84A4F0B281FA0F94" ], [ "\033[1X\033[33X\033[0;-2YApplicable Methods\033[133X\033[101X", "11.3-1", [ 11, 3, 1 ], 52, 38, "applicable methods", "X78B7D1A982BE9866" ], [ "\033[1X\033[33X\033[0;-2YExponentOfPrime\033[133X\033[101X", "11.3-2", [ 11, 3, 2 ], 85, 38, "exponentofprime", "X7C1AF2467FB55D79" ], [ "\033[1X\033[33X\033[0;-2YThe transfer procedure\033[133X\033[101X", "12", [ 12, 0, 0 ], 1, 39, "the transfer procedure", "X84AC9613842F014C" ], [ "Bibliography", "bib", [ "Bib", 0, 0 ], 1, 41, "bibliography", "X7A6F98FD85F02BFE" ], [ "References", "bib", [ "Bib", 0, 0 ], 1, 41, "references", "X7A6F98FD85F02BFE" ], [ "Index", "ind", [ "Ind", 0, 0 ], 1, 42, "index", "X83A0356F839C696F" ], [ "GitHub repository", "1.0", [ 1, 0, 0 ], 1, 5, "github repository", "X7DFB63A97E67C0A1" ], [ "\033[2XPrintSelection\033[102X for a list of positions", "2.1-1", [ 2, 1, 1 ], 14, 7, "printselection for a list of positions", "X784638AC84D49870" ], [ "\033[2XPrintSelection\033[102X for a first item and a step", "2.1-1", [ 2, 1, 1 ], 14, 7, "printselection for a first item and a step", "X784638AC84D49870" ], [ "\033[2XDifferencesList\033[102X", "3.1-1", [ 3, 1, 1 ], 7, 9, "differenceslist", "X78B7C92681D2F13C" ], [ "\033[2XQuotientsList\033[102X", "3.1-2", [ 3, 1, 2 ], 29, 9, "quotientslist", "X7975371E865B89BC" ], [ "\033[2XFloatQuotientsList\033[102X", "3.1-2", [ 3, 1, 2 ], 29, 9, "floatquotientslist", "X7975371E865B89BC" ], [ "\033[2XSearchCycle\033[102X", "3.1-3", [ 3, 1, 3 ], 59, 10, "searchcycle", "X86096E73858CFABD" ], [ "\033[2XRandomCombination\033[102X", "3.1-4", [ 3, 1, 4 ], 101, 11, "randomcombination", "X7EF06CAD7F35245D" ], [ "distinct and common representatives", "3.2", [ 3, 2, 0 ], 117, 11, "distinct and common representatives", "X82F443FF84B8FCE3" ], [ "\033[2XDistinctRepresentatives\033[102X", "3.2-1", [ 3, 2, 1 ], 120, 11, "distinctrepresentatives", "X78105CAA847A888C" ], [ "\033[2XCommonRepresentatives\033[102X", "3.2-1", [ 3, 2, 1 ], 120, 11, "commonrepresentatives", "X78105CAA847A888C" ], [ "\033[2XCommonTransversal\033[102X", "3.2-1", [ 3, 2, 1 ], 120, 11, "commontransversal", "X78105CAA847A888C" ], [ "\033[2XIsCommonTransversal\033[102X", "3.2-1", [ 3, 2, 1 ], 120, 11, "iscommontransversal", "X78105CAA847A888C" ], [ "\033[2XBlankFreeString\033[102X", "3.3-1", [ 3, 3, 1 ], 172, 12, "blankfreestring", "X870C964E7804B266" ], [ "\033[2XAllSmoothIntegers\033[102X for two integers", "4.1-1", [ 4, 1, 1 ], 7, 13, "allsmoothintegers for two integers", "X8191A031788AC7C0" ], [ "\033[2XAllSmoothIntegers\033[102X for a list and an integer", "4.1-1", [ 4, 1, 1 ], 7, 13, "allsmoothintegers for a list and an integer", "X8191A031788AC7C0" ], [ "smooth integer", "4.1-1", [ 4, 1, 1 ], 7, 13, "smooth integer", "X8191A031788AC7C0" ], [ "\033[2XAllProducts\033[102X", "4.1-2", [ 4, 1, 2 ], 37, 13, "allproducts", "X78BE6B8B878D250D" ], [ "\033[2XRestrictedPartitionsWithoutRepetitions\033[102X", "4.1-3", [ 4, 1, 3 ], 61, 14, "restrictedpartitionswithoutrepetitions", "X845F46E579CEA43F" ], [ "\033[2XNextProbablyPrimeInt\033[102X", "4.1-4", [ 4, 1, 4 ], 85, 14, "nextprobablyprimeint", "X81708BF4858505E8" ], [ "\033[2XPrimeNumbersIterator\033[102X", "4.1-5", [ 4, 1, 5 ], 111, 15, "primenumbersiterator", "X8021EEE5787FCA37" ], [ "\033[2XComm\033[102X", "5.1-1", [ 5, 1, 1 ], 7, 16, "comm", "X80761843831B468E" ], [ "\033[2XIsCommuting\033[102X", "5.1-2", [ 5, 1, 2 ], 27, 16, "iscommuting", "X803A050C7A183CCC" ], [ "\033[2XListOfPowers\033[102X", "5.1-3", [ 5, 1, 3 ], 46, 17, "listofpowers", "X87A8F01286548037" ], [ "\033[2XGeneratorsAndInverses\033[102X", "5.1-4", [ 5, 1, 4 ], 68, 17, "generatorsandinverses", "X820B71307E41BEE5" ], [ "\033[2XUpperFittingSeries\033[102X", "5.1-5", [ 5, 1, 5 ], 86, 17, "upperfittingseries", "X84CF95227F9D562F" ], [ "\033[2XLowerFittingSeries\033[102X", "5.1-5", [ 5, 1, 5 ], 86, 17, "lowerfittingseries", "X84CF95227F9D562F" ], [ "\033[2XFittingLength\033[102X", "5.1-5", [ 5, 1, 5 ], 86, 17, "fittinglength", "X84CF95227F9D562F" ], [ "Fitting series", "5.1-5", [ 5, 1, 5 ], 86, 17, "fitting series", "X84CF95227F9D562F" ], [ "\033[2XLeftCoset\033[102X", "5.2-1", [ 5, 2, 1 ], 123, 18, "leftcoset", "X8340B4537F17DCD3" ], [ "\033[2XEpimorphismByGenerators\033[102X", "5.3-1", [ 5, 3, 1 ], 188, 19, "epimorphismbygenerators", "X80C9A0B583FEA7B9" ], [ "\033[2XPullback\033[102X", "5.3-2", [ 5, 3, 2 ], 222, 20, "pullback", "X7C705F2A79F8E43C" ], [ "\033[2XPullbackInfo\033[102X", "5.3-2", [ 5, 3, 2 ], 222, 20, "pullbackinfo", "X7C705F2A79F8E43C" ], [ "\033[2XCentralProduct\033[102X", "5.3-3", [ 5, 3, 3 ], 273, 20, "centralproduct", "X78DD2C617B992BE2" ], [ "\033[2XCentralProductInfo\033[102X", "5.3-3", [ 5, 3, 3 ], 273, 20, "centralproductinfo", "X78DD2C617B992BE2" ], [ "\033[2XIdempotentEndomorphisms\033[102X", "5.3-4", [ 5, 3, 4 ], 324, 21, "idempotentendomorphisms", "X801038CB808FC956" ], [ "\033[2XIdempotentEndomorphismsData\033[102X", "5.3-4", [ 5, 3, 4 ], 324, 21, "idempotentendomorphismsdata", "X801038CB808FC956" ], [ "\033[2XIdempotentEndomorphismsWithImage\033[102X", "5.3-4", [ 5, 3, 4 ], 324, 21, "idempotentendomorphismswithimage", "X801038CB808FC956" ], [ "\033[2XDirectProductOfFunctions\033[102X", "5.3-5", [ 5, 3, 5 ], 392, 22, "directproductoffunctions", "X81FA9E6C7F3B9238" ], [ "\033[2XDirectProductOfAutomorphismGroups\033[102X", "5.3-6", [ 5, 3, 6 ], 419, 23, "directproductofautomorphismgroups", "X7CB2D5F27F4182AF" ], [ "\033[2XDirectSumDecompositionMatrices\033[102X", "6.1-1", [ 6, 1, 1 ], 7, 24, "directsumdecompositionmatrices", "X787B89237E1398B6" ], [ "Iterators", "7.1", [ 7, 1, 0 ], 4, 26, "iterators", "X7BB5350081B27D17" ] , [ "\033[2XAllIsomorphismsIterator\033[102X", "7.1-1", [ 7, 1, 1 ], 11, 26, "allisomorphismsiterator", "X7F8B54D1806C762D" ], [ "\033[2XAllIsomorphismsNumber\033[102X", "7.1-1", [ 7, 1, 1 ], 11, 26, "allisomorphismsnumber", "X7F8B54D1806C762D" ], [ "\033[2XAllIsomorphisms\033[102X", "7.1-1", [ 7, 1, 1 ], 11, 26, "allisomorphisms", "X7F8B54D1806C762D" ], [ "\033[2XAllSubgroupsIterator\033[102X", "7.1-2", [ 7, 1, 2 ], 46, 27, "allsubgroupsiterator", "X831DA5AE8437578F" ], [ "\033[2XCartesianIterator\033[102X", "7.2-1", [ 7, 2, 1 ], 80, 27, "cartesianiterator", "X87395A9181A35301" ], [ "\033[2XUnorderedPairsIterator\033[102X", "7.2-2", [ 7, 2, 2 ], 105, 28, "unorderedpairsiterator", "X7C95E27987A812EA" ], [ "\033[2XAssignGlobals\033[102X", "8.1-1", [ 8, 1, 1 ], 7, 29, "assignglobals", "X84D82EB579B2ACCD" ], [ "\033[2XOptionRecordWithDefaults\033[102X", "8.2-1", [ 8, 2, 1 ], 30, 29, "optionrecordwithdefaults", "X8322B9377CC590D2" ], [ "\033[2XDownload\033[102X", "9.1-1", [ 9, 1, 1 ], 15, 32, "download", "X7A7438AE8448635E" ], [ "\033[10XDownloadVerifyCertificate\033[110X", "9.1-2", [ 9, 1, 2 ], 77, 33, "downloadverifycertificate", "X85182BA486E3C2AA" ], [ "\033[10XDownloadMaxTime\033[110X", "9.1-3", [ 9, 1, 3 ], 100, 33, "downloadmaxtime", "X79E10E5B83EF929F" ], [ "\033[2XLog2HTML\033[102X", "10.1-1", [ 10, 1, 1 ], 7, 34, "log2html", "X7B7ECADF85F748BE" ], [ "\033[2XIntOrOnfinityToLaTeX\033[102X", "10.2-1", [ 10, 2, 1 ], 32, 34, "intoronfinitytolatex", "X87DEB2B58266F858" ], [ "\033[2XLaTeXStringFactorsInt\033[102X", "10.2-2", [ 10, 2, 2 ], 49, 35, "latexstringfactorsint", "X7DC642B97CD02F4E" ], [ "\033[2XConvertToMagmaInputString\033[102X", "10.3-1", [ 10, 3, 1 ], 68, 35, "converttomagmainputstring", "X8768D7707B4CBBD4" ], [ "PermGroupToMagmaFormat", "10.3-1", [ 10, 3, 1 ], 68, 35, "permgrouptomagmaformat", "X8768D7707B4CBBD4" ], [ "PcGroupToMagmaFormat", "10.3-1", [ 10, 3, 1 ], 68, 35, "pcgrouptomagmaformat", "X8768D7707B4CBBD4" ], [ "MatrixGroupToMagmaFormat", "10.3-1", [ 10, 3, 1 ], 68, 35, "matrixgrouptomagmaformat", "X8768D7707B4CBBD4" ], [ "FindMatchingFiles", "11.1", [ 11, 1, 0 ], 4, 37, "findmatchingfiles", "X7A6BB3D084912F35" ], [ "CreateDirIfMissing", "11.1", [ 11, 1, 0 ], 4, 37, "createdirifmissing", "X7A6BB3D084912F35" ], [ "StringDotSuffix", "11.1", [ 11, 1, 0 ], 4, 37, "stringdotsuffix", "X7A6BB3D084912F35" ], [ "GetSuffix", "11.1", [ 11, 1, 0 ], 4, 37, "getsuffix", "X7A6BB3D084912F35" ], [ "SetIfMissing", "11.1", [ 11, 1, 0 ], 4, 37, "setifmissing", "X7A6BB3D084912F35" ], [ "PrintOneItemPerLine", "11.2", [ 11, 2, 0 ], 21, 37, "printoneitemperline", "X86F322FC7DECE36F" ], [ "PrintApplicableMethod", "11.3-1", [ 11, 3, 1 ], 52, 38, "printapplicablemethod", "X78B7D1A982BE9866" ], [ "ExponentOfPrime", "11.3-2", [ 11, 3, 2 ], 85, 38, "exponentofprime", "X7C1AF2467FB55D79" ], [ "OKtoReadFromUtils", "12.0", [ 12, 0, 0 ], 1, 39, "oktoreadfromutils", "X84AC9613842F014C" ] ] ); utils-0.93/doc/title.xml0000644000175100017510000000613415105376105014632 0ustar runnerrunner utils Utility functions in &GAP; 0.93 Thomas Breuer
sam@math.rwth-aachen.de https://www.math.rwth-aachen.de/~Thomas.Breuer
Sebastian Gutsche
gutsche@mathematik.uni-siegen.de https://sebasguts.github.io/
Max Horn
mhorn@rptu.de https://github.com/mhorn
Alexander Hulpke
hulpke@math.colostate.edu https://www.math.colostate.edu/~hulpke
Pedro García-Sánchez
pedro@ugr.es http://www.ugr.es/local/pedro
Christopher Jefferson
caj21@st-andrews.ac.uk https://caj.host.cs.st-andrews.ac.uk/
Stefan Kohl
stefan@mcs.st-and.ac.uk https://www.gap-system.org/DevelopersPages/StefanKohl/
Frank LĂĽbeck
Frank.Luebeck@Math.RWTH-Aachen.De https://www.math.rwth-aachen.de/~Frank.Luebeck
Chris Wensley
cdwensley.maths@btinternet.com https://github.com/cdwensley
13 November 2025 The &Utils; package provides a space for utility functions in a variety of &GAP; packages to be collected together into a single package. In this way it is hoped that they will become more visible to package authors.

Any package author who transfers a function to &Utils; will become an author of &Utils;.

If deemed appropriate, functions may also be transferred from the main library.

Bug reports, suggestions and comments are, of course, welcome. Please contact the last author at cdwensley.maths@btinternet.com or submit an issue at the GitHub repository https://github.com/gap-packages/utils/issues/. © 2015-2025, The GAP Group.

The &Utils; package is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This documentation was prepared using the &GAPDoc; and &AutoDoc; packages.

The procedure used to produce new releases uses the package GitHubPagesForGAP and the package ReleaseTools.

utils-0.93/doc/chap8.txt0000644000175100017510000001362515105376105014536 0ustar runnerrunner 8 Records 8.1 Functions for records 8.1-1 AssignGlobals AssignGlobals( rec )  function This function has been transferred from package RCWA. It assigns the record components of rec to global variables with the same names.  Example   gap> r := rec( a := 1, b := 2, c := 3 );;  gap> AssignGlobals( r ); The following global variables have been assigned: [ "a", "b", "c" ] gap> [a,b,c]; [ 1, 2, 3 ]   8.2 Option records for functions 8.2-1 OptionRecordWithDefaults OptionRecordWithDefaults( defaults, useroptions )  function This functions has been transferred by Chris Jefferson from other packages. It simplifies the handling of records which are intended to be used for expressing configuration options. defaults represents the "default record", and useroptions lets the user give new values for values in defaults. The function returns a record with the same component names as defaults and which has the same values as defaults, except for those component names in useroptions, where the values in useroptions are used instead. An error is given if useroptions contains any component names not in defaults. If useroptions is an empty list it is treated as an empty record, and if useroptions is a list of length 1 containing a record, this record is used as useroptions.  Example   gap> defaults := rec( a := 1, b := 2, c := 3 );; gap> OptionRecordWithDefaults( defaults, rec( a := 6) ); rec( a := 6, b := 2, c := 3 ) gap> OptionRecordWithDefaults( defaults, rec( b := 7, c := 8 ) ); rec( a := 1, b := 7, c := 8 ) gap> OptionRecordWithDefaults( defaults, [ ] ); rec( a := 1, b := 2, c := 3 ) gap> OptionRecordWithDefaults( defaults, [ rec( c := 8 ) ] ); rec( a := 1, b := 2, c := 8 ) gap> OptionRecordWithDefaults( defaults, rec( d := 9 ) ); Error, Unknown option: d gap> OptionRecordWithDefaults( defaults, [ rec( b := 7 ), rec( c := 8 ) ] ); Error, Too many arguments for function gap> OptionRecordWithDefaults( defaults, [6,7,8] ); Error, Too many arguments for function   This function is designed to support functions with optional arguments given as a variable record, of the form function(x,y,options...). In the following, very contrived, example function, PrintDimensions, the defaults are given by the variable order which takes values h, w and d having default values 1, 2 and 3. If there is a second argument, then OptionRecordWithDefaults( order, arg[2] ); is used to cvhange the values. These three values then determine the order in which the three dimensions are printed using a SortParallel command.   PrintDimensions := function( arg )   local nargs, dim, order, V, L, len, K, i;   nargs := Length( arg );   dim := [ arg[1]!.height, arg[1]!.width, arg[1]!.depth ];   order := rec( h := 1, w := 2, d := 3 );   V := [ "height", "width", "depth" ];   if ( nargs > 1 ) and IsRecord( arg[2] ) then   order := OptionRecordWithDefaults( order, arg[2] );   fi;   L := [ order!.h, order!.w, order!.d ];   len := Length( L );  K := [ 1..len ];   SortParallel( L, K );   Print( "dimensions: " );   Print( V[K[1]], " = ", dim[K[1]], ", " );  Print( V[K[2]], " = ", dim[K[2]], ", " );  Print( V[K[3]], " = ", dim[K[3]], "\n" ); end;;  In the example below the first call to PrintDimensions has just one parameter, mydim, so the default order is used. In the second call, alternate values for h, w and d are given, causing the width to be printed first, and then the depth and height.  Example   gap> mydim := rec( height := 45, width := 31, depth := 17 );  rec( depth := 17, height := 45, width := 31 ) gap> PrintDimensions( mydim ); dimensions: height = 45, width = 31, depth = 17 gap> PrintDimensions( mydim, rec( h:=3, w:=1, d:=2 ) ); dimensions: width = 31, depth = 17, height = 45   utils-0.93/doc/chap12_mj.html0000644000175100017510000002027415105376105015422 0ustar runnerrunner GAP (Utils) - Chapter 12: The transfer procedure

Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind

12 The transfer procedure

We consider here the process for transferring utility functions from a package Home to Utils which has to avoid the potential problem of duplicate declarations of a function causing loading problems in GAP.

If the functions in Home all have names of the form HOME_FunctionName then, in Utils, these functions are likely to be renamed as FunctionName or something similar. In this case the problem of duplicate declarations does not arise. This is what has happened with transfers from the AutoDoc package.

The case where the function names are unchanged is more complicated. Initially we tried out a process which allowed repeated declarations and installations of the functions being transferred. This involved additions to the main library files global.g and oper.g. Since there were misgivings about interfering in this way with basic operations such as BIND_GLOBAL, a simpler (but slightly less convenient) process has been adopted.

Using this alternative procedure, the following steps will be followed when making transfers from Home to Utils.

  1. (Home:) Offer functions for inclusion. This may be simply done by emailing a list of functions. More usefully, email the declaration, implementation, test and documentation files, e.g.: home.gd, home.gi, home.tst and home.xml. (All active authors should be involved.)

  2. (Home:) Declare that m.n is the last version of Home to contain these functions, so that m.n+1 (or similar) will be the first version of Home to have all these functions removed, and to specify Utils as a required package.

  3. (Utils:) Add strings "home" and "m.n" to the list UtilsPackageVersions in the file utils/lib/start.gd.

    
    UtilsPackageVersions := 
      [ "autodoc",     "2016.01.31", 
        "resclasses",  "4.2.5", 
        "home",        "m.n",
        ...,           ... 
      ];
    
    

    While the transfers are being made, it is essential that any new versions of Home should be tested with the latest version of Utils before they are released, so as to avoid loading failures.

  4. (Utils:) Include the function declaration and implementation sections in suitable files, enclosed within a conditional clause of the form:

    
    if OKtoReadFromUtils( "Home" ) then
    . . . . . . 
     <the code> 
    . . . . . . 
    fi;
    
    

    The function OKtoReadFromUtils returns true only if there is an installed version of Home and if this version is greater than m.n. So, at this stage, the copied code will not be read, and the transferred functions can only be called if Home has been installed.

  5. (Utils:) Add the test and documentation material to the appropriate files. The copied code can be tested by temporarily moving Home away from GAP's package directory.

  6. (Utils:) Release a new version of Utils containing all the transferred material.

  7. (Home:) Edit out the declarations and implementations of all the transferred functions, and remove references to them in the manual and tests. Possibly add a note to the manual that these functions have been transferred. Add Utils to the list of Home's required packages in PackageInfo.g. Release a new version of Home.

  8. (Utils:) In due course, when the new version(s) of Home are well established, it may be safe to remove the conditional clauses mentioned in item 4 above. The entry for Home in UtilsPackageLists may then be removed.

Finally, a note on the procedure for testing these functions. As long as a function being transferred still exists in the Home package, the code will not be read from Utils. So, when the tests are run, it is necessary to LoadPackage("home") before the function is called. The file utils/tst/testall.g makes sure that all the necessary packages are loaded before the individual tests are called.

Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind

generated by GAPDoc2HTML

utils-0.93/doc/chap2.html0000644000175100017510000001323615105376105014653 0ustar runnerrunner GAP (Utils) - Chapter 2: Printing Lists and Iterators
Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind

2 Printing Lists and Iterators

2.1 Printing selected items

The functions described here print lists or objects with an iterator with one item per line, either the whole list/iterator or certain subsets:

  • by giving a list of positions of items to be printed, or

  • by specifying a first item and then a regular step.

2.1-1 PrintSelection
‣ PrintSelection( obj, list )( function )
‣ PrintSelection( obj, first, step[, last] )( function )

This function, given three (or four) parameters, calls operations PrintSelectionFromList or PrintSelectionFromIterator which prints the first item specified, and then the item at every step. The fourth parameter is essential when the object being printed is infinite.

Alternatively, given two parameters, with the second parameter a list L of positive integers, only the items at positions in L are printed.


gap> L := List( [1..20], n -> n^5 );;
gap> PrintSelection( L, [18..20] );
18 : 1889568
19 : 2476099
20 : 3200000
gap> PrintSelection( L, 2, 9 );       
2 : 32
11 : 161051
20 : 3200000
gap> PrintSelection( L, 2, 3, 11 );
2 : 32
5 : 3125
8 : 32768
11 : 161051
gap> s5 := SymmetricGroup( 5 );;
gap> PrintSelection( s5, [30,31,100,101] );
30 : (1,5)(3,4)
31 : (1,5,2)
100 : (1,4,3)
101 : (1,4)(3,5)
gap> PrintSelection( s5, 1, 30 );
1 : ()
31 : (1,5,2)
61 : (1,2,3)
91 : (1,3,5,2,4)
gap> PrintSelection( s5, 9, 11, 43 );
9 : (2,5,3)
20 : (2,4)
31 : (1,5,2)
42 : (1,5,2,3,4)

Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind

generated by GAPDoc2HTML

utils-0.93/doc/others.xml0000644000175100017510000001211715105376105015013 0ustar runnerrunner Various other functions
File operations This function has been transferred from package &RCWA;.

This function converts the &GAP; logfile filename to HTML. It appears that the logfile should be in your current directory. The extension of the input file must be *.log. The name of the output file is the same as the one of the input file except that the extension *.log is replaced by *.html. There is a sample CSS file in utils/doc/gaplog.css, which you can adjust to your taste.

LogTo( "triv.log" ); gap> a := 33^5; 39135393 gap> LogTo(); gap> Log2HTML( "triv.log" ); ]]>

&LaTeX; strings This function has been transferred from package &ResClasses;.

IntOrInfinityToLaTeX(n) returns the &LaTeX; string for n.

IntOrInfinityToLaTeX( 10^3 ); "1000" gap> IntOrInfinityToLaTeX( infinity ); "\\infty" ]]> This function has been transferred from package &RCWA;.

It returns the prime factorization of the integer n as a string in &LaTeX; format.

LaTeXStringFactorsInt( Factorial(12) ); "2^{10} \\cdot 3^5 \\cdot 5^2 \\cdot 7 \\cdot 11" ]]>

Conversion to &Magma; strings The function ConvertToMagmaInputString( obj [, str] ) attempts to output a string s which can be read into &Magma; so as to produce the same group in that computer algebra system. In the second form the user specifies the name of the resulting object, so that the output string has the form "str := ...".

When obj is a permutation group, the operation PermGroupToMagmaFormat(obj) is called. PermGroupToMagmaFormat This function has been taken from other.gi in the main library where it was called MagmaInputString.

When obj is a pc-group, the operation PcGroupToMagmaFormat(obj) is called. PcGroupToMagmaFormat This function was private code of Max Horn.

When obj is a matrix group over a finite field, the operation MatrixGroupToMagmaFormat(obj) is called. MatrixGroupToMagmaFormat This function is a modification of private code of Frank Lübeck.

Hopefully code for other types of group will be added in due course.

These functions should be considered experimental, and more testing is desirable.

## permutation groups gap> ConvertToMagmaInputString( Group( (1,2,3,4,5), (3,4,5) ) ); "PermutationGroup<5|(1,2,3,4,5),\n(3,4,5)>;\n" gap> ConvertToMagmaInputString( Group( (1,2,3,4,5) ), "c5" ); "c5 := PermutationGroup<5|(1,2,3,4,5)>;\n" gap> ## pc-group gap> ConvertToMagmaInputString( DihedralGroup( IsPcGroup, 10 ) ); "PolycyclicGroup< f1,f2 |\nf1^2,\nf2^5,\nf2^f1 = f2^4\n>;\n" gap> ## fp-group gap> F2 := FreeGroup( 2 );; gap> f := F2.1;; g := F2.2;; gap> relq8 := [ f^4, g^4, f*g*f*g^-1, f^2*g^2 ];; gap> q8 := F2/relq8;; gap> ConvertToMagmaInputString( q8 ); no conversion function yet available for fp-groups fail gap> ## matrix group gap> M := GL(2,5);; Size(M); 480 gap> s1 := ConvertToMagmaInputString( M ); "F := GF(5);\nP := GL(2,F);\ngens := [\nP![2,0,0,1],\nP![4,1,4,0]\n];\nsub

;\n" gap> Print( s1 ); F := GF(5); P := GL(2,F); gens := [ P![2,0,0,1], P![4,1,4,0] ]; sub

; gap> n1 := [ [ Z(9)^0, Z(9)^0 ], [ Z(9)^0, Z(9) ] ];; gap> n2 := [ [ Z(9)^0, Z(9)^3 ], [ Z(9)^4, Z(9)^2 ] ];; gap> N := Group( n1, n2 );; Size( N ); 5760 gap> s2 := ConvertToMagmaInputString( N, "gpN" );; gap> Print( s2 ); F := GF(3^2); P := GL(2,F); w := PrimitiveElement(F); gens := [ P![ 1, 1, 1,w^1], P![ 1,w^3, 2,w^2] ]; gpN := sub

; ]]>

utils-0.93/doc/chap5_mj.html0000644000175100017510000010473315105376105015347 0ustar runnerrunner GAP (Utils) - Chapter 5: Groups and homomorphisms
Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind

5 Groups and homomorphisms

5.1 Functions for groups

5.1-1 Comm
‣ Comm( L )( operation )

This method has been transferred from package ResClasses.

It provides a method for Comm when the argument is a list (enclosed in square brackets), and calls the function LeftNormedComm.


gap> Comm( [ (1,2), (2,3) ] );
(1,2,3)
gap> Comm( [(1,2),(2,3),(3,4),(4,5),(5,6)] );
(1,5,6)
gap> Comm(Comm(Comm(Comm((1,2),(2,3)),(3,4)),(4,5)),(5,6));  ## the same
(1,5,6)

5.1-2 IsCommuting
‣ IsCommuting( a, b )( operation )

This function has been transferred from package ResClasses.

It tests whether two elements in a group commute.


gap> D12 := DihedralGroup( 12 );
<pc group of size 12 with 3 generators>
gap> SetName( D12, "D12" ); 
gap> a := D12.1;;  b := D12.2;;  
gap> IsCommuting( a, b );
false

5.1-3 ListOfPowers
‣ ListOfPowers( g, exp )( operation )

This function has been transferred from package RCWA.

The operation ListOfPowers(g,exp) returns the list \([g,g^2,...,g^{exp}]\) of powers of the element \(g\).


gap> ListOfPowers( 2, 20 );
[ 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384,
 32768, 65536, 131072, 262144, 524288, 1048576 ]
gap> ListOfPowers( (1,2,3)(4,5), 12 );
[ (1,2,3)(4,5), (1,3,2), (4,5), (1,2,3), (1,3,2)(4,5), (),
 (1,2,3)(4,5), (1,3,2), (4,5), (1,2,3), (1,3,2)(4,5), () ]
gap> ListOfPowers( D12.2, 6 );
[ f2, f3, f2*f3, f3^2, f2*f3^2, <identity> of ... ]

5.1-4 GeneratorsAndInverses
‣ GeneratorsAndInverses( G )( operation )

This function has been transferred from package RCWA.

This operation returns a list containing the generators of \(G\) followed by the inverses of these generators.


gap> GeneratorsAndInverses( D12 );
[ f1, f2, f3, f1, f2*f3^2, f3^2 ]
gap> GeneratorsAndInverses( SymmetricGroup(5) );     
[ (1,2,3,4,5), (1,2), (1,5,4,3,2), (1,2) ]

5.1-5 UpperFittingSeries
‣ UpperFittingSeries( G )( attribute )
‣ LowerFittingSeries( G )( attribute )
‣ FittingLength( G )( attribute )

These three functions have been transferred from package ResClasses.

The upper and lower Fitting series and the Fitting length of a solvable group are described here: https://en.wikipedia.org/wiki/Fitting_length.


gap> UpperFittingSeries( D12 );  LowerFittingSeries( D12 );
[ Group([  ]), Group([ f3, f2*f3 ]), Group([ f1, f3, f2*f3 ]) ]
[ D12, Group([ f3 ]), Group([  ]) ]
gap> FittingLength( D12 );
2
gap> S4 := SymmetricGroup( 4 );;
gap> UpperFittingSeries( S4 );
[ Group(()), Group([ (1,2)(3,4), (1,4)(2,3) ]), Group([ (1,2)(3,4), (1,4)
  (2,3), (2,4,3) ]), Group([ (3,4), (2,3,4), (1,2)(3,4) ]) ]
gap> List( last, StructureDescription );
[ "1", "C2 x C2", "A4", "S4" ]
gap> LowerFittingSeries( S4 );
[ Sym( [ 1 .. 4 ] ), Alt( [ 1 .. 4 ] ), Group([ (1,4)(2,3), (1,3)
 (2,4) ]), Group(()) ]
gap> List( last, StructureDescription );
[ "S4", "A4", "C2 x C2", "1" ]
gap> FittingLength( S4);
3

5.2 Left Cosets for Groups

5.2-1 LeftCoset
‣ LeftCoset( g, U )( operation )

Since GAP uses right actions by default, the library contains the operation RightCoset(U,g) for constructing the right coset \(Ug\) of a subgroup \(U \leq G\) and an element \(g \in G\). It has been noted in the reference manual that, by inverting all the elements in \(Ug\), the left coset \(g^{-1}U\) is obtained.

Just for the sake of completeness, from August 2022 this package provides the operation LeftCoset(g,U) for constructing the left coset \(gU\). Users are strongly recommended to continue to use RightCoset for all serious calculations, since left cosets have a much simpler implementation and do not behave exactly like right cosets.

The methods for left cosets which are provided generally work by converting \(gU\) to \(Ug^{-1}\); applying the equivalent method for right cosets; and, if necessary, converting back again to left cosets.

\(G\) acts on left cosets by OnLeftInverse: \((gU)^{g_0} = g_0^{-1}*(gU) = (g_0^{-1}g)U\).


gap> a4 := Group( (1,2,3), (2,3,4) );; SetName( a4, "a4" );
gap> k4 := Group( (1,2)(3,4), (1,3)(2,4) );; SetName( k4, "k4" );
gap> rc := RightCosets( a4, k4 );
[ RightCoset(k4,()), RightCoset(k4,(2,3,4)), RightCoset(k4,(2,4,3)) ]
gap> lc := LeftCosets( a4, k4 );
[ LeftCoset((),k4), LeftCoset((2,4,3),k4), LeftCoset((2,3,4),k4) ]
gap> AsSet( lc[2] );
[ (2,4,3), (1,2,3), (1,3,4), (1,4,2) ]
gap> LeftCoset( (1,4,2), k4 ) = lc[2];
true
gap> Representative( lc[2] );
(2,4,3)
gap> ActingDomain( lc[2] );
k4
gap> (1,4,3) in lc[3];
true
gap> (1,2,3)*lc[2] = lc[3];
true
gap> lc[2]^(1,3,2) = lc[3];
true

5.2-2 Inverse

The inverse of the left coset \(gU\) is the right coset \(Ug^{-1}\), and conversely. This is an abuse of the attribute Inverse, since the standard requirement, that \(x*x^{-1}\) is an identity, does not hold.


gap> Inverse( rc[3] ) = lc[3];
true
gap> Inverse( lc[2] ) = rc[2];
true

5.3 Functions for group homomorphisms

5.3-1 EpimorphismByGenerators
‣ EpimorphismByGenerators( G, H )( operation )

This function has been transferred from package RCWA.

It constructs a group homomorphism which maps the generators of \(G\) to those of \(H\). Its intended use is when \(G\) is a free group, and a warning is printed when this is not the case. Note that anything may happen if the resulting map is not a homomorphism!


gap> G := Group( (1,2,3), (3,4,5), (5,6,7), (7,8,9) );;
gap> phi := EpimorphismByGenerators( FreeGroup("a","b","c","d"), G );
[ a, b, c, d ] -> [ (1,2,3), (3,4,5), (5,6,7), (7,8,9) ]
gap> PreImagesRepresentativeNC( phi, (1,2,3,4,5,6,7,8,9) );
d*c*b*a
gap> a := G.1;; b := G.2;; c := G.3;; d := G.4;;
gap> d*c*b*a;
(1,2,3,4,5,6,7,8,9)
gap> ## note that it is easy to produce nonsense: 
gap> epi := EpimorphismByGenerators( Group((1,2,3)), Group((8,9)) );
Warning: calling GroupHomomorphismByImagesNC without checks
[ (1,2,3) ] -> [ (8,9) ]
gap> IsGroupHomomorphism( epi );
true
gap> Image( epi, (1,2,3) );                                            
()
gap> Image( epi, (1,3,2) );
(8,9)

5.3-2 Pullback
‣ Pullback( hom1, hom2 )( operation )
‣ PullbackInfo( G )( attribute )

If \(\phi_1 : G_1 \to H\) and \(\phi_2 : G_2 \to H\) are two group homomorphisms with the same range, then their pullback is the subgroup of \(G_1 \times G_2\) consisting of those elements \((g_1,g_2)\) such that \(\phi_1 g_1 = \phi_2 g_2\).

The attribute PullbackInfo of a pullback group P is similar to DirectProductInfo for a direct product of groups. Its value is a record with the following components:

directProduct

the direct product \(G_1 \times G_2\), and

projections

a list with the two projections onto \(G_1\) and \(G_2\).

There are no embeddings in this record, but it is possible to use the embeddings into the direct product, see Embedding (Reference: Embedding).


gap> s4 := Group( (1,2),(2,3),(3,4) );;
gap> s3 := Group( (5,6),(6,7) );;
gap> c3 := Subgroup( s3, [ (5,6,7) ] );;
gap> f := GroupHomomorphismByImages( s4, s3, 
>             [(1,2),(2,3),(3,4)], [(5,6),(6,7),(5,6)] );; 
gap> i := GroupHomomorphismByImages( c3, s3, [(5,6,7)], [(5,6,7)] );; 
gap> Pfi := Pullback( f, i );
Group([ (2,3,4)(5,7,6), (1,2)(3,4) ])
gap> StructureDescription( Pfi );
"A4"
gap> info := PullbackInfo( Pfi );
rec( directProduct := Group([ (1,2), (2,3), (3,4), (5,6,7) ]), 
  projections := [ [ (2,3,4)(5,7,6), (1,2)(3,4) ] -> [ (2,3,4), (1,2)(3,4) ], 
      [ (2,3,4)(5,7,6), (1,2)(3,4) ] -> [ (5,7,6), () ] ] )
gap> g := (1,2,3)(5,6,7);; 
gap> ImageElm( info!.projections[1], g );
(1,2,3)
gap> ImageElm( info!.projections[2], g );
(5,6,7) 
gap> dp := info!.directProduct;; 
gap> a := ImageElm( Embedding( dp, 1 ), (1,4,3) );; 
gap> b := ImageElm( Embedding( dp, 2 ), (5,7,6) );; 
gap> a*b in Pfi;
true

5.3-3 CentralProduct
‣ CentralProduct( G1, G2, Z1, Phi )( operation )
‣ CentralProductInfo( G )( attribute )

This function was added by Thomas Breuer, following discussions with Hongyi Zhao (see https://github.com/gap-packages/hap/issues/73).

Let G1 and G2 be two groups, Z1 be a central subgroup of G1, and Phi be an isomorphism from Z1 to a central subgroup of G2. The central product defined by these arguments is the factor group of the direct product of G1 and G2 by the central subgroup \(\{ (z, (\textit{Phi}(z))^{-1}) : z \in \textit{Z1} \}\).

The attribute CentralProductInfo of a group \(G\) that has been created by CentralProduct is similar to PullbackInfo (5.3-2) for pullback groups. Its value is a record with the following components.

projection

the epimorphism from the direct product of G1 and G2 to \(G\), and

phi

the map Phi.

Note that one can access the direct product as the Source (Reference: Source) value of the projection map, and one can access G1 and G2 as the two embeddings of this direct product, see Embedding (Reference: Embedding).

gap> g1 := DihedralGroup( 8 );
<pc group of size 8 with 3 generators>
gap> c1 := Centre( g1 );
Group([ f3 ])
gap> cp1 := CentralProduct( g1, g1, c1, IdentityMapping( c1 ) );
Group([ f1, f2, f5, f3, f4, f5 ])
gap> IdGroup( cp1 ) = IdGroup( ExtraspecialGroup( 2^5, "+" ) );
true
gap> g2 := QuaternionGroup( 8 );
<pc group of size 8 with 3 generators>
gap> c2 := Centre( g2 );
Group([ y2 ])
gap> cp2 := CentralProduct( g2, g2, c2, IdentityMapping( c2 ) );
Group([ f1, f2, f5, f3, f4, f5 ])
gap> IdGroup( cp2 ) = IdGroup( ExtraspecialGroup( 2^5, "+" ) );
true
gap> info2 := CentralProductInfo( cp2 );
rec( phi := IdentityMapping( Group([ y2 ]) ), 
  projection := [ f1, f2, f3, f4, f5, f6 ] -> [ f1, f2, f5, f3, f4, f5 ] )
gap> Source( Embedding( Source( info2.projection ), 1 ) ) = g2;
true

5.3-4 IdempotentEndomorphisms
‣ IdempotentEndomorphisms( G )( operation )
‣ IdempotentEndomorphismsData( G )( attribute )
‣ IdempotentEndomorphismsWithImage( genG, R )( operation )

An endomorphism \(f : G \to G\) is idempotent if \(f^2=f\). It has an image \(R \leqslant G\); is the identity map when restricted to \(R\); and has a kernel \(N\) which has trivial intersection with \(R\) and has size \(|G|/|R|\).

The operation IdempotentEndomorphismsWithImage(genG,R) returns a list of the images of the generating set genG of a group \(G\) under the idempotent endomorphisms with image \(R\).

The attribute IdempotentEndomorphismsData(G) returns a record data with fields data.gens, a fixed generating set for \(G\), and data.images a list of the non-empty outputs of IdempotentEndomorphismsWithImage(genG,R) obtained by iterating over all subgroups of \(G\).

The operation IdempotentEndomorphisms(G) returns the list of these mappings obtained using IdempotentEndomorphismsData(G). The first of these is the zero map, the second is the identity.


gap> gens := [ (1,2,3,4), (1,2)(3,4) ];; 
gap> d8 := Group( gens );;
gap> SetName( d8, "d8" );
gap> c2 := Subgroup( d8, [ (2,4) ] );;
gap> IdempotentEndomorphismsWithImage( gens, c2 );
[ [ (), (2,4) ], [ (2,4), () ] ]
gap> IdempotentEndomorphismsData( d8 );
rec( gens := [ (1,2,3,4), (1,2)(3,4) ], 
  images := [ [ [ (), () ] ], [ [ (), (2,4) ], [ (2,4), () ] ], 
      [ [ (), (1,3) ], [ (1,3), () ] ], 
      [ [ (), (1,2)(3,4) ], [ (1,2)(3,4), (1,2)(3,4) ] ], 
      [ [ (), (1,4)(2,3) ], [ (1,4)(2,3), (1,4)(2,3) ] ], 
      [ [ (1,2,3,4), (1,2)(3,4) ] ] ] )
gap> List( last.images, L -> Length(L) );
[ 1, 2, 2, 2, 2, 1 ]
gap> IdempotentEndomorphisms( d8 );               
[ [ (1,2,3,4), (1,2)(3,4) ] -> [ (), () ], 
  [ (1,2,3,4), (1,2)(3,4) ] -> [ (), (2,4) ], 
  [ (1,2,3,4), (1,2)(3,4) ] -> [ (2,4), () ], 
  [ (1,2,3,4), (1,2)(3,4) ] -> [ (), (1,3) ], 
  [ (1,2,3,4), (1,2)(3,4) ] -> [ (1,3), () ], 
  [ (1,2,3,4), (1,2)(3,4) ] -> [ (), (1,2)(3,4) ], 
  [ (1,2,3,4), (1,2)(3,4) ] -> [ (1,2)(3,4), (1,2)(3,4) ], 
  [ (1,2,3,4), (1,2)(3,4) ] -> [ (), (1,4)(2,3) ], 
  [ (1,2,3,4), (1,2)(3,4) ] -> [ (1,4)(2,3), (1,4)(2,3) ], 
  [ (1,2,3,4), (1,2)(3,4) ] -> [ (1,2,3,4), (1,2)(3,4) ] ]

The quaternion group q8 is an example of a group with a tail: there is only one subgroup in the lattice which covers the identity subgroup. The only idempotent isomorphisms of such groups are the identity mapping and the zero mapping because the only pairs \(N,R\) are the whole group and the identity subgroup.


gap> q8 := QuaternionGroup( 8 );;
gap> IdempotentEndomorphisms( q8 );
[ [ x, y ] -> [ <identity> of ..., <identity> of ... ], [ x, y ] -> [ x, y ] ]

5.3-5 DirectProductOfFunctions
‣ DirectProductOfFunctions( G, H, f1, f2 )( operation )

Given group homomorphisms \(f_1 : G_1 \to G_2\) and \(f_2 : H_1 \to H_2\), this operation return the product homomorphism \(f_1 \times f_2 : G_1 \times G_2 \to H_1 \times H_2\).


gap> c4 := Group( (1,2,3,4) );; 
gap> c2 := Group( (5,6) );; 
gap> f1 := GroupHomomorphismByImages( c4, c2, [(1,2,3,4)], [(5,6)] );;
gap> c3 := Group( (1,2,3) );; 
gap> c6 := Group( (1,2,3,4,5,6) );; 
gap> f2 := GroupHomomorphismByImages( c3, c6, [(1,2,3)], [(1,3,5)(2,4,6)] );; 
gap> c4c3 := DirectProduct( c4, c3 ); 
Group([ (1,2,3,4), (5,6,7) ])
gap> c2c6 := DirectProduct( c2, c6 ); 
Group([ (1,2), (3,4,5,6,7,8) ])
gap> f := DirectProductOfFunctions( c4c3, c2c6, f1, f2 ); 
[ (1,2,3,4), (5,6,7) ] -> [ (1,2), (3,5,7)(4,6,8) ]
gap> ImageElm( f, (1,4,3,2)(5,7,6) ); 
(1,2)(3,7,5)(4,8,6)

5.3-6 DirectProductOfAutomorphismGroups
‣ DirectProductOfAutomorphismGroups( A1, A2 )( operation )

Let \(A_1,A_2\) be groups of automorphism of groups \(G_1,G_2\) respectively. The output of this function is a group \(A_1 \times A_2\) of automorphisms of \(G_1 \times G_2\).


gap> c9 := Group( (1,2,3,4,5,6,7,8,9) );; 
gap> ac9 := AutomorphismGroup( c9 );; 
gap> q8 := QuaternionGroup( IsPermGroup, 8 );;
gap> aq8 := AutomorphismGroup( q8 );;
gap> A := DirectProductOfAutomorphismGroups( ac9, aq8 );
<group with 5 generators>
gap> genA := GeneratorsOfGroup( A );;
gap> G := Source( genA[1] );
Group([ (1,2,3,4,5,6,7,8,9), (10,14,12,16)(11,17,13,15), (10,11,12,13)
(14,15,16,17) ])
gap> a := genA[1]*genA[5];  
[ (1,2,3,4,5,6,7,8,9), (10,14,12,16)(11,17,13,15), (10,11,12,13)(14,15,16,17) 
 ] -> [ (1,3,5,7,9,2,4,6,8), (10,16,12,14)(11,15,13,17), 
  (10,11,12,13)(14,15,16,17) ]
gap> ImageElm( a, (1,9,8,7,6,5,4,3,2)(10,14,12,16)(11,17,13,15) );
(1,8,6,4,2,9,7,5,3)(10,16,12,14)(11,15,13,17)

Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind

generated by GAPDoc2HTML

utils-0.93/doc/_entities.xml0000644000175100017510000000053015105376105015466 0ustar runnerrunnerAutoDoc'> {\sf MathJax}'> ResClasses'> RCWA'> XMod'> Home'> {\sf Magma}'> Utils'> utils-0.93/doc/chap9.txt0000644000175100017510000001443615105376105014540 0ustar runnerrunner 9 Web Downloads The Download operation has been written by Thomas Breuer, incorporating a number of suggestions from Max Horn, for version 0.77 of Utils. It implements downloading a file from within GAP. It can use the IO or curlInterface packages, or wget or curl, if installed, and it can be extended with other download methods quite easily. It is envisaged that, once other packages have started to use it, and any problems have been addressed, that the functions will be transferred to the main GAP library. 9.1 Functions for downloading files from the web 9.1-1 Download Download( url[, opt] )  function This function downloads the file with the web address url, which must be a string. The result is a record which has at least the component success, with value true if the download was successful and false otherwise. In the former case, the component result is bound, whose value is a string that contains the contents of the downloaded file. In the latter case, the component error is bound, whose value is a string that describes the problem. The function calls the methods stored in the global list Download_Methods until one of them is successful. Currently there are methods based on the GAP functions DownloadURL (curl: DownloadURL) and SingleHTTPRequest (IO: SingleHTTPRequest), and methods based on the external programs wget and curl. An optional record opt can be given. The following components are supported. maxTime If this component is bound then its value must be a nonnegative integer n, meaning that the function gives up after n seconds. A zero value of n means that no timeout is set, the method will never give up in this case. The default for n is given by the value of the user preference DownloadMaxTime (see 9.1-3). target If this component is bound then its value must be a string that is a local filename, and the function writes the downloaded contents to this file; the returned record does not have a result component in this case. verifyCert If this component is bound and has the value false then those download methods that are based on curl or wget will omit the check of the server's certificate. The same effect is achieved for all Download calls by setting the user preference DownloadVerifyCertificate (see 9.1-2) to false and omitting the verifyCert component from opt.  Example   gap> url:= "https://www.gap-system.org/index.html";; gap> res1:= Download( url );; gap> res1.success; true gap> IsBound( res1.result ) and IsString( res1.result ); true gap> res2:= Download( Concatenation( url, "xxx" ) );; gap> res2.success; false gap> IsBound( res2.error ) and IsString( res2.error ); true   9.1-2 User preference DownloadVerifyCertificate The value true (the default) means that the server's certificate is checked in calls of Download (9.1-1), such that nothing gets downloaded if the certificate is invalid. If the value is false then download methods are supposed to omit the check of the server's certificate (this may not be supported by all download methods). One can set the value of the preference to be val via SetUserPreference (Reference: SetUserPreference), by calling SetUserPreference( "utils", "DownloadVerifyCertificate", val ), and access the current value via UserPreference (Reference: UserPreference), by calling UserPreference( "utils", "DownloadVerifyCertificate" ). We recommend leaving this preference at its default value true. Sometimes it can be necessary to change it, e.g. to work around issues with old operating systems which may not be able to correctly verify new certificates. In general it is better to update such a system, but if that is not an option, then disabling certificate checks may be a good last resort. 9.1-3 User preference DownloadMaxTime The value 0 (the default) means that no timeout is set in calls of Download (9.1-1). If the value is a positive integer n then those download methods that support a timeout will give up after n seconds. One can set the value of the preference to be val via SetUserPreference (Reference: SetUserPreference), by calling SetUserPreference( "utils", "DownloadMaxTime", val ), and access the current value via UserPreference (Reference: UserPreference), by calling UserPreference( "utils", "DownloadMaxTime" ). utils-0.93/doc/toggless.css0000644000175100017510000000167215105376105015332 0ustar runnerrunner/* toggless.css Frank Lübeck */ /* Using javascript we change all div.ContSect to div.ContSectOpen or div.ContSectClosed. This way the config for div.ContSect in manual.css is no longer relevant. Here we add the CSS for the new elements. */ /* This layout is based on an idea by Burkhard Höfling. */ div.ContSectClosed { text-align: left; margin-left: 1em; } div.ContSectOpen { text-align: left; margin-left: 1em; } div.ContSectOpen div.ContSSBlock { display: block; text-align: left; margin-left: 1em; } div.ContSectOpen div.ContSSBlock a { display: block; width: 100%; margin-left: 1em; } span.tocline a:hover { display: inline; background: #eeeeee; } span.ContSS a:hover { display: inline; background: #eeeeee; } span.toctoggle { font-size: 80%; display: inline-block; width: 1.2em; } span.toctoggle:hover { background-color: #aaaaaa; } utils-0.93/doc/chap4_mj.html0000644000175100017510000003063315105376105015343 0ustar runnerrunner GAP (Utils) - Chapter 4: Number-theoretic functions
Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind

4 Number-theoretic functions

4.1 Functions for integers

4.1-1 AllSmoothIntegers
‣ AllSmoothIntegers( maxp, maxn )( function )
‣ AllSmoothIntegers( L, maxp )( function )

This function has been transferred from package RCWA.

The function AllSmoothIntegers(maxp,maxn) returns the list of all positive integers less than or equal to maxn whose prime factors are all in the list \(L = \{p ~|~ p \leqslant maxp, p~\mbox{prime} \}\).

In the alternative form, when \(L\) is a list of primes, the function returns the list of all positive integers whose prime factors lie in \(L\).


gap> AllSmoothIntegers( 3, 1000 );
[ 1, 2, 3, 4, 6, 8, 9, 12, 16, 18, 24, 27, 32, 36, 48, 54, 64, 72, 81, 96, 
  108, 128, 144, 162, 192, 216, 243, 256, 288, 324, 384, 432, 486, 512, 576, 
  648, 729, 768, 864, 972 ]
gap> AllSmoothIntegers( [5,11,17], 1000 );
[ 1, 5, 11, 17, 25, 55, 85, 121, 125, 187, 275, 289, 425, 605, 625, 935 ]
gap> Length( last );
16
gap> List( [3..20], n -> Length( AllSmoothIntegers( [5,11,17], 10^n ) ) );
[ 16, 29, 50, 78, 114, 155, 212, 282, 359, 452, 565, 691, 831, 992, 1173, 
  1374, 1595, 1843 ]

4.1-2 AllProducts
‣ AllProducts( L, k )( function )

This function has been transferred from package RCWA.

The command AllProducts(L,k) returns the list of all products of k entries of the list L. Note that every ordering of the entries is used so that, in the commuting case, there are bound to be repetitions.


gap> AllProducts([1..4],3); 
[ 1, 2, 3, 4, 2, 4, 6, 8, 3, 6, 9, 12, 4, 8, 12, 16, 2, 4, 6, 8, 4, 8, 12, 
  16, 6, 12, 18, 24, 8, 16, 24, 32, 3, 6, 9, 12, 6, 12, 18, 24, 9, 18, 27, 
  36, 12, 24, 36, 48, 4, 8, 12, 16, 8, 16, 24, 32, 12, 24, 36, 48, 16, 32, 
  48, 64 ]
gap> Set(last);            
[ 1, 2, 3, 4, 6, 8, 9, 12, 16, 18, 24, 27, 32, 36, 48, 64 ]
gap> AllProducts( [(1,2,3),(2,3,4)], 2 );
[ (2,4,3), (1,2)(3,4), (1,3)(2,4), (1,3,2) ]

4.1-3 RestrictedPartitionsWithoutRepetitions
‣ RestrictedPartitionsWithoutRepetitions( n, S )( function )

This function has been transferred from package RCWA.

For a positive integer n and a set of positive integers S, this function returns the list of partitions of n into distinct elements of S. Unlike RestrictedPartitions, no repetitions are allowed.


gap> RestrictedPartitions( 20, [4..10] );
[ [ 4, 4, 4, 4, 4 ], [ 5, 5, 5, 5 ], [ 6, 5, 5, 4 ], [ 6, 6, 4, 4 ], 
  [ 7, 5, 4, 4 ], [ 7, 7, 6 ], [ 8, 4, 4, 4 ], [ 8, 6, 6 ], [ 8, 7, 5 ], 
  [ 8, 8, 4 ], [ 9, 6, 5 ], [ 9, 7, 4 ], [ 10, 5, 5 ], [ 10, 6, 4 ], 
  [ 10, 10 ] ]
gap> RestrictedPartitionsWithoutRepetitions( 20, [4..10] );
[ [ 10, 6, 4 ], [ 9, 7, 4 ], [ 9, 6, 5 ], [ 8, 7, 5 ] ]
gap> RestrictedPartitionsWithoutRepetitions( 10^2, List([1..10], n->n^2 ) );
[ [ 100 ], [ 64, 36 ], [ 49, 25, 16, 9, 1 ] ]

4.1-4 NextProbablyPrimeInt
‣ NextProbablyPrimeInt( n )( function )

This function has been transferred from package RCWA.

The function NextProbablyPrimeInt(n) does the same as NextPrimeInt(n) except that for reasons of performance it tests numbers only for IsProbablyPrimeInt(n) instead of IsPrimeInt(n). For large n, this function is much faster than NextPrimeInt(n)


gap> n := 2^251;
3618502788666131106986593281521497120414687020801267626233049500247285301248
gap> NextProbablyPrimeInt( n );
3618502788666131106986593281521497120414687020801267626233049500247285301313
gap> time;                     
1
gap> NextPrimeInt( n );        
3618502788666131106986593281521497120414687020801267626233049500247285301313
gap> time;             
213

4.1-5 PrimeNumbersIterator
‣ PrimeNumbersIterator( [chunksize] )( function )

This function has been transferred from package RCWA.

This function returns an iterator which runs over the prime numbers n ascending order; it takes an optional argument chunksize which specifies the length of the interval which is sieved in one go (the default is \(10^7\)), and which can be used to balance runtime vs. memory consumption. It is assumed that chunksize is larger than any gap between two consecutive primes within the range one intends to run the iterator over.


gap> iter := PrimeNumbersIterator();;
gap> for i in [1..100] do  p := NextIterator(iter);  od;
gap> p;
541
gap> sum := 0;;
gap> ## "prime number race" 1 vs. 3 mod 4
gap> for p in PrimeNumbersIterator() do 
>       if p <> 2 then sum := sum + E(4)^(p-1); fi;
>       if sum > 0 then break; fi;
>    od;
gap> p;
26861

Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 Bib Ind

generated by GAPDoc2HTML

utils-0.93/doc/chapInd.txt0000644000175100017510000000504415105376105015075 0ustar runnerrunner Index AllIsomorphisms 7.1-1 AllIsomorphismsIterator 7.1-1 AllIsomorphismsNumber 7.1-1 AllProducts 4.1-2 AllSmoothIntegers, for a list and an integer 4.1-1 for two integers 4.1-1 AllSubgroupsIterator 7.1-2 AssignGlobals 8.1-1 BlankFreeString 3.3-1 CartesianIterator 7.2-1 CentralProduct 5.3-3 CentralProductInfo 5.3-3 Comm 5.1-1 CommonRepresentatives 3.2-1 CommonTransversal 3.2-1 ConvertToMagmaInputString 10.3-1 CreateDirIfMissing 11.1 DifferencesList 3.1-1 DirectProductOfAutomorphismGroups 5.3-6 DirectProductOfFunctions 5.3-5 DirectSumDecompositionMatrices 6.1-1 distinct and common representatives 3.2 DistinctRepresentatives 3.2-1 Download 9.1-1 DownloadMaxTime 9.1-3 DownloadVerifyCertificate 9.1-2 EpimorphismByGenerators 5.3-1 ExponentOfPrime 11.3-2 FindMatchingFiles 11.1 Fitting series 5.1-5 FittingLength 5.1-5 FloatQuotientsList 3.1-2 GeneratorsAndInverses 5.1-4 GetSuffix 11.1 GitHub repository 1.0 IdempotentEndomorphisms 5.3-4 IdempotentEndomorphismsData 5.3-4 IdempotentEndomorphismsWithImage 5.3-4 IntOrOnfinityToLaTeX 10.2-1 IsCommonTransversal 3.2-1 IsCommuting 5.1-2 Iterators 7.1 LaTeXStringFactorsInt 10.2-2 LeftCoset 5.2-1 ListOfPowers 5.1-3 Log2HTML 10.1-1 LowerFittingSeries 5.1-5 MatrixGroupToMagmaFormat 10.3-1 NextProbablyPrimeInt 4.1-4 OKtoReadFromUtils 12.0 OptionRecordWithDefaults 8.2-1 PcGroupToMagmaFormat 10.3-1 PermGroupToMagmaFormat 10.3-1 PrimeNumbersIterator 4.1-5 PrintApplicableMethod 11.3-1 PrintOneItemPerLine 11.2 PrintSelection, for a first item and a step 2.1-1 for a list of positions 2.1-1 Pullback 5.3-2 PullbackInfo 5.3-2 QuotientsList 3.1-2 RandomCombination 3.1-4 RestrictedPartitionsWithoutRepetitions 4.1-3 SearchCycle 3.1-3 SetIfMissing 11.1 smooth integer 4.1-1 StringDotSuffix 11.1 UnorderedPairsIterator 7.2-2 UpperFittingSeries 5.1-5 ------------------------------------------------------- utils-0.93/read.g0000644000175100017510000000152615105376105013305 0ustar runnerrunner############################################################################# ## #W read.g The Utils package Chris Wensley ## #Y Copyright (C) 2015-2023, The GAP Group, ## ## read the actual code ReadPackage( "utils", "lib/files.gi" ); ReadPackage( "utils", "lib/groups.gi" ); ReadPackage( "utils", "lib/iterator.gi" ); ReadPackage( "utils", "lib/latex.gi" ); ReadPackage( "utils", "lib/lcset.gi" ); ReadPackage( "utils", "lib/lists.gi" ); ReadPackage( "utils", "lib/magma.gi" ); ReadPackage( "utils", "lib/maps.gi" ); ReadPackage( "utils", "lib/matrix.gi" ); ReadPackage( "utils", "lib/number.gi" ); ReadPackage( "utils", "lib/print.gi" ); ReadPackage( "utils", "lib/record.gi" ); ReadPackage( "utils", "lib/string.gi" ); if IsBound(DOWNLOAD_FROM_UTILS) then ReadPackage( "utils", "lib/download.gi" ); fi; utils-0.93/makedoc.g0000644000175100017510000000226115105376105013772 0ustar runnerrunner## makedoc.g for the package Utils ## This builds the documentation of the Utils package. ## Needs: GAPDoc & AutoDoc packages, latex, pdflatex, mkindex ## call this with GAP from within the package root directory ## LoadPackage( "GAPDoc" ); LoadPackage( "AutoDoc" ); AutoDoc( rec( scaffold := rec( ## MainPage := false, includes := [ "intro.xml", "print.xml", "lists.xml", "number.xml", "groups.xml", "matrix.xml", "iterator.xml", "record.xml", "download.xml", "others.xml", "obsolete.xml", "transfer.xml" ], bib := "bib.xml", entities := rec( AutoDoc := "AutoDoc", ResClasses := "ResClasses", RCWA := "RCWA", XMod := "XMod", Home := "Home", Magma := "{\\sf Magma}", MathJax := "{\\sf MathJax}" ) ) )); utils-0.93/lib/0000755000175100017510000000000015105376105012764 5ustar runnerrunnerutils-0.93/lib/latex.gd0000644000175100017510000000165015105376105014417 0ustar runnerrunner############################################################################## ## #W latex.gd GAP4 package `Utils' Stefan Kohl ## #Y Copyright (C) 2015-2025, The GAP Group ############################################################################# ## this function has been transferred from ResClasses ## #F IntOrInfinityToLaTeX( n ) . LaTeX string representing integer or infinity ## DeclareGlobalName( "IntOrInfinityToLaTeX" ); ############################################################################# ## this function has been transferred from RCWA ## #F LaTeXStringFactorsInt( ) ## ## Returns the prime factorization of the integer as a string in LaTeX ## format. ## DeclareGlobalName( "LaTeXStringFactorsInt" ); ############################################################################# ## #E latex.gd . . . . . . . . . . . . . . . . . . . . . . . . . . . ends here utils-0.93/lib/number.gi0000644000175100017510000001511415105376105014577 0ustar runnerrunner############################################################################# ## #W number.gi GAP4 package `Utils' Stefan Kohl ## #Y Copyright (C) 2015-2025, The GAP Group ############################################################################# ## this function has been transferred from RCWA ## #F AllSmoothIntegers( , ) #F AllSmoothIntegers( , ) ## BindGlobal( "AllSmoothIntegers", function ( maxp, maxn ) local extend, nums, primes, p; extend := function ( n, mini ) local i; if n > maxn then return; fi; Add(nums,n); for i in [mini..Length(primes)] do extend(primes[i]*n,i); od; end; if IsInt(maxp) then primes := Filtered([2..maxp],IsPrimeInt); elif IsList(maxp) and ForAll(maxp,p->IsInt(p) and IsPrimeInt(p)) then primes := maxp; else return fail; fi; if not IsPosInt(maxn) then return fail; fi; nums := []; extend(1,1); return Set(nums); end ); ############################################################################# ## this function has been transferred from RCWA ## #F NextProbablyPrimeInt( ) . . next integer passing `IsProbablyPrimeInt' ## BindGlobal( "NextProbablyPrimeInt", function ( n ) if -3 = n then n := -2; elif -3 < n and n < 2 then n := 2; elif n mod 2 = 0 then n := n+1; else n := n+2; fi; while not IsProbablyPrimeInt(n) do if n mod 6 = 1 then n := n+4; else n := n+2; fi; od; return n; end ); ############################################################################# ## this function has been transferred from RCWA ## #F RestrictedPartitionsWithoutRepetitions( , ) ## ## Given a positive integer n and a set of positive integers S, this func- ## tion returns a list of all partitions of n into distinct elements of S. ## The only difference to `RestrictedPartitions' is that no repetitions are ## allowed. ## BindGlobal( "RestrictedPartitionsWithoutRepetitions", function ( n, S ) local look, comps; look := function ( comp, remaining_n, remaining_S ) local newcomp, newremaining_n, newremaining_S, part, l; l := Reversed(remaining_S); for part in l do newcomp := Concatenation(comp,[part]); newremaining_n := remaining_n - part; if newremaining_n = 0 then Add(comps,newcomp); else newremaining_S := Set(Filtered(remaining_S, s->s [] then look(newcomp,newremaining_n,newremaining_S); fi; fi; od; end; comps := []; look([],n,S); return comps; end ); ############################################################################# ## this function has been transferred from RCWA ## #F PrimeNumbersIterator( ) #F PrimeNumbersIterator( chunksize ) ## BindGlobal( "PrimeNumbersIterator", function ( arg ) local next, copy, chunksize, maxdiv, nrdivs, offset; if Length(arg) >= 1 and IsPosInt(arg[1]) then chunksize := Maximum(arg[1],100); # must be bigger than largest else chunksize := 10000000; fi; # prime gap in range looped over maxdiv := RootInt(chunksize); offset := List(Filtered([2..maxdiv],IsPrimeInt),p->[p,0]); nrdivs := Length(offset); return IteratorByFunctions( rec( NextIterator := function ( iter ) local sieve, range, p, q, pos, endpos, maxdiv_old, maxdiv, i, j; if iter!.index = 0 then sieve := ListWithIdenticalEntries(iter!.chunksize,0); if iter!.n = 0 then sieve[1] := 1; fi; for i in [1..iter!.nrdivs] do p := iter!.offset[i][1]; if p > iter!.n then pos := 2 * p; else pos := iter!.offset[i][2]; fi; if pos = 0 then pos := p; fi; endpos := pos + Int((iter!.chunksize-pos)/p) * p; if pos <= iter!.chunksize then range := [pos,pos+p..endpos]; if IsRangeRep(range) then ADD_TO_LIST_ENTRIES_PLIST_RANGE(sieve,range,1); else for j in range do sieve[j] := sieve[j] + 1; od; fi; fi; if endpos <= iter!.chunksize then iter!.offset[i][2] := endpos + p - iter!.chunksize; else iter!.offset[i][2] := iter!.offset[i][2] - iter!.chunksize; fi; od; iter!.primepos := Positions(sieve,0); fi; iter!.index := iter!.index + 1; p := iter!.n + iter!.primepos[iter!.index]; iter!.p := p; iter!.pi := iter!.pi + 1; if iter!.index = Length(iter!.primepos) then iter!.index := 0; iter!.n := iter!.n + iter!.chunksize; maxdiv_old := iter!.maxdiv; iter!.maxdiv := RootInt(iter!.n + iter!.chunksize); for q in Filtered([maxdiv_old+1..iter!.maxdiv],IsPrimeInt) do Add(iter!.offset,[q,(q-iter!.n) mod q]); od; iter!.nrdivs := Length(iter!.offset); fi; return p; end, ShallowCopy := function ( iter ) return rec( chunksize := iter!.chunksize, n := iter!.n, p := iter!.p, pi := iter!.pi, index := iter!.index, primepos := ShallowCopy(iter!.primepos), nrdivs := iter!.nrdivs, maxdiv := iter!.maxdiv, offset := StructuralCopy(iter!.offset) ); end, IsDoneIterator := ReturnFalse, chunksize := chunksize, n := 0, p := 0, pi := 0, index := 0, primepos := [], nrdivs := nrdivs, maxdiv := maxdiv, offset := offset ) ); end ); ############################################################################# ## this function has been transferred from RCWA ## #M AllProducts( , ) . . all products of -tuples of elements of #M AllProducts( , ) . . . . . . . . . . . . . . . . . . . . for lists ## InstallMethod( AllProducts, "for lists (RCWA)", ReturnTrue, [ IsList, IsPosInt ], 0, function(l,k) return List(Tuples(l,k),Product); end ); ############################################################################# ## #E number.gi . . . . . . . . . . . . . . . . . . . . . . . . . . . ends here utils-0.93/lib/matrix.gi0000644000175100017510000001705115105376105014615 0ustar runnerrunner############################################################################# ## #W matrix.gi GAP4 package `Utils' Pedro A. Garcia-Sanchez ## #Y Copyright (C) 2023, The GAP Group InstallMethod( DirectSumBlock, "for a matrix", [ IsMatrixOrMatrixObj, IsInt, IsList, IsList ], 0, function( M, level, blocks, answer ) local nrM, ncM, nM, nr0, nc0, found, nlzr, nlzc, ntzr, ntzc, nlz, ntz, B, nrB, ncB, nB, nr, nc, i, j, k, i0, j0, nzr, nzc, rest, sub, bls, nrbls, ncbls, pr1, diag0, up0, low0, imax, jmax, len1, ok, ans; nrM := NumberRows( M ); ncM := NumberColumns( M ); nM := Minimum( [ nrM, ncM ] ); ## deal with the diagonal case first if IsDiagonalMatrix( M ) then bls := List( [1..nM], i -> [ [ M[i,i] ] ] ); if ( ncM > nM ) then sub := ExtractSubMatrix( M, [nM], [nM..ncM] )[1]; bls[nM] := [ sub ]; fi; if ( nrM > nM ) then sub := ExtractSubMatrix( M, [nM..nrM], [nM] )[1]; bls[ nM] := [ sub ]; fi; blocks[1] := Concatenation( blocks[1], bls ); ans := Concatenation( blocks[1], blocks[2] ); if not ( ans in answer ) then Add( answer, ans ); fi; return 0; fi; ## check for leading or trailing rows or columns of zeros nlzr := 0; found := false; i := 0; while not found do i := i+1; if ForAll( [1..ncM], j -> M[i,j] = 0 ) then nlzr := nlzr + 1; else found := true; fi; od; nlzc := 0; found := false; j := 0; while not found do j := j+1; if ForAll( [1..nrM], i -> M[i,j] = 0 ) then nlzc := nlzc + 1; else found := true; fi; od; ntzr := 0; found := false; i := nrM + 1; while not found do i := i-1; if ForAll( [1..ncM], j -> M[i,j] = 0 ) then ntzr := ntzr + 1; else found := true; fi; od; ntzc := 0; found := false; j := ncM + 1; while not found do j := j-1; if ForAll( [1..nrM], i -> M[i,j] = 0 ) then ntzc := ntzc + 1; else found := true; fi; od; ## add any leading or trailing blocks [ [0] ] nlz := Minimum( [ nlzr, nlzc ] ); if ( nlz > 0 ) then blocks[1] := Concatenation( blocks[1], ListWithIdenticalEntries( nlz, [ [0] ] ) ); fi; ntz := Minimum( [ ntzr, ntzc ] ); if ( ntz > 0 ) then blocks[2] := Concatenation( ListWithIdenticalEntries( ntz, [ [0] ] ), blocks[2] ); fi; B := ExtractSubMatrix( M, [nlz+1..nrM-ntz], [nlz+1..ncM-ntz] ); nrB := NumberRows( B ); ncB := NumberColumns( B ); nB := Minimum( [nrB, ncB] ); bls := [ ]; if ( nrB = 1 ) or ( ncB = 1 ) then Add( blocks[1], B ); ans := Concatenation( blocks[1], blocks[2] ); if not ( ans in answer ) then Add( answer, ans ); fi; return 0; fi; ## find first non-zero entry in column 1 found := false; pr1 := 0; while ( not found ) and ( pr1 < nrB-1 ) do pr1 := pr1 + 1; found := B[pr1,1] <> 0; od; ## determine ranges for i0 and j0 diag0 := nB+1; i := nB+1; while ( i > 1 ) do i := i-1; if ( B[i,i] <> 0 ) then diag0 := i; fi; od; up0 := [diag0,diag0]; j := 1; found := false; while ( not found ) and ( j < ncB ) do j := j+1; k := Minimum( [ j-1, nrB ] ); for i in [1..k] do if ( B[i,j] <> 0 ) then up0 := [i,j]; found := true; fi; od; od; low0 := [diag0,diag0]; i := 1; found := false; while ( not found ) and ( i < nrB ) do i := i+1; k := Minimum( [ i-1, ncB ] ); for j in [1..k] do if ( B[i,j] <> 0 ) then low0 := [i,j]; found := true; fi; od; od; imax := diag0; jmax := diag0; if ( up0[2] < low0[2] ) then jmax := low0[2] - 1; fi; if ( low0[1] < up0[1] ) then imax := up0[1] - 1; fi; if ( up0[1] < low0[1] ) then imax := Minimum( imax, low0[1] - 1 ); fi; if ( low0[2] < up0[2] ) then jmax := Minimum( jmax, up0[2] - 1 ); fi; if ( low0[1] > nrB ) then imax := up0[1]; fi; if ( up0[1] > ncM ) then jmax := low0[2]; fi; i0 := 0; while ( i0 < imax ) do i0 := i0 + 1; i := i0; j0 := 0; while ( j0 < jmax ) do found := false; j0 := j0 + 1; if ( j0 <= pr1 ) then j := j0; rest := MutableCopyMatrix( B ); nr := NumberRows( rest ); nc := NumberColumns( rest ); i := i0; j := j0; nzr := true; nzc := true; while nzr or nzc do nzr := ForAny( [1..i], i1 -> ForAny( [j+1..nc], j1->rest[i1][j1]<>0 ) ); nzc := ForAny( [i+1..nr], i1 -> ForAny( [1..j], j1->rest[i1][j1]<>0 ) ); if nzr then j := j+1; fi; if nzc then i := i+1; fi; od; bls := List( [1..i], i1 -> rest[i1]{[1..j]} ); ## check if we have filled all columns and rows nzc := ntzc - ntz; nrbls := NumberRows( bls ); ncbls := NumberColumns( bls ); if ( nzc > 0 ) and ( ncbls + nzc = ncB ) then ## add zero columns at the end of the block j := j + nzc; bls := List( [1..i], i1 -> rest[i1]{[1..j]} ); fi; nzr := ntzr - ntz; if ( nzr > 0 ) and ( nrbls + nzr = nrB ) then ## add zero rows at the end of the block i := i + nzr; bls := List( [1..i], i1 -> rest[i1]{[1..j]} ); fi; Add( blocks[1], bls ); len1 := Length( blocks[1] ); rest := List( [i+1..nr], i1 -> rest[i1]{[j+1..nc]} ); if ( rest <> [ ] ) then ok := DirectSumBlock( rest,level+1,blocks,answer ); else ans := Concatenation( blocks[1], blocks[2] ); if not ( ans in answer ) then Add( answer, ans ); fi; fi; blocks := [ blocks[1]{[1..len1-1]}, blocks[2] ]; fi; od; od; return Length( answer ); end ); InstallMethod( DirectSumDecompositionMatrices, "for a matrix", [ IsMatrixOrMatrixObj ], 0, function( M ) local L, blocks, answer, a, ma; blocks := [ [], [] ]; answer := [ ]; L := DirectSumBlock( M, 1, blocks, answer ); ## check that the answers are correct for a in answer do ma := DirectSumMat( a ); if not ( ma = M ) then Display( ma ); Error( "direct sum of decomposition <> original matrix" ); fi; od; return answer; end ); utils-0.93/lib/groups.gi0000644000175100017510000000737215105376105014635 0ustar runnerrunner############################################################################# ## #W groups.gi GAP4 package `Utils' Stefan Kohl ## #Y Copyright (C) 2015-2025, The GAP Group ############################################################################# ## this function has been transferred from ResClasses ## #M Comm( [ , ] ) . . . for arguments enclosed in list brackets ## InstallOtherMethod( Comm, "for arguments enclosed in list brackets (ResClasses)", true, [ IsList ], 0, LeftNormedComm ); ############################################################################# ## this function has been transferred from ResClasses ## #M IsCommuting( , ) . . . . . . . . . . . . . . . . . fallback method ## InstallMethod( IsCommuting, "fallback method (ResClasses)", IsIdenticalObj, [ IsMultiplicativeElement, IsMultiplicativeElement ], 0, function ( a, b ) return a*b = b*a; end ); ############################################################################# ## this function has been transferred from ResClasses ## #M UpperFittingSeries( ) . . . . . . . . . . . . . . . . default method ## InstallMethod( UpperFittingSeries, "default method", true, [ IsGroup ], 0, function ( G ) local series, F, phi; if IsTrivial(FittingSubgroup(G)) then return [ TrivialSubgroup(G) ]; fi; F := FittingSubgroup(G); series := [ TrivialSubgroup(G), F ]; while F <> G do phi := NaturalHomomorphismByNormalSubgroup(G,F); F := PreImage(phi,FittingSubgroup(Image(phi))); if series[Length(series)] = F then break; fi; Add(series,F); od; return series; end ); ############################################################################# ## this function has been transferred from ResClasses ## #M LowerFittingSeries( ) . . . . . . . . . . . . . . . . default method ## InstallMethod( LowerFittingSeries, "default method", true, [ IsGroup ], 0, function ( G ) local series, F; series := [ G ]; F := G; while not IsTrivial(F) do F := Reversed(LowerCentralSeries(F))[1]; if series[Length(series)] = F then break; fi; Add(series,F); od; return series; end ); ############################################################################# ## this function has been transferred from ResClasses ## #M FittingLength( ) . . . . . . . . . . . . . . . . . . . default method ## InstallMethod( FittingLength, "default method", true, [ IsGroup ], 0, function ( G ) if not IsSolvableGroup(G) then return infinity; fi; if HasUpperFittingSeries(G) then return Length(UpperFittingSeries(G)) - 1; else return Length(LowerFittingSeries(G)) - 1; fi; end ); ############################################################################# ## this function has been transferred from RCWA ## #F ListOfPowers( , ) . . . . . . list of powers ^1 .. ^ ## BindGlobal( "ListOfPowers", function ( g, exp ) local powers, n; powers := [g]; for n in [2..exp] do Add(powers,powers[n-1]*g); od; return powers; end ); ############################################################################# ## this function has been transferred from RCWA ## #M GeneratorsAndInverses( ) list of generators of and their inverses #M GeneratorsAndInverses( ) . . . . . . . . . . . . . . . . . for groups ## InstallMethod( GeneratorsAndInverses, "for groups", true, [ IsGroup ], 0, G -> Concatenation( GeneratorsOfGroup(G), List( GeneratorsOfGroup(G), g->g^-1 ) ) ); ############################################################################# ## #E groups.gi . . . . . . . . . . . . . . . . . . . . . . . . . . . ends here utils-0.93/lib/lists.gi0000644000175100017510000002315315105376105014447 0ustar runnerrunner############################################################################# ## #W lists.gi GAP4 package `Utils' Stefan Kohl ## #Y Copyright (C) 2015-2025, The GAP Group ############################################################################# ## these functions have been transferred from ResClasses ## #F DifferencesList( ) . . . . differences of consecutive list entries #F QuotientsList( ) . . . . . . quotients of consecutive list entries #F FloatQuotientsList( ) . . . . . . . . . . . . dito, but as floats ## BindGlobal( "DifferencesList", list -> List( [ 2..Length(list) ], pos -> list[ pos ] - list[ pos-1 ] ) ); BindGlobal( "QuotientsList", function( list ) local len, pos, quot; len := Length( list ); quot := ListWithIdenticalEntries( len-1, 0 ); for pos in [1..len-1] do if IsZero( list[pos] ) then quot[pos] := fail; else quot[pos] := list[pos+1]/list[pos]; fi; od; return quot; end ); BindGlobal( "FloatQuotientsList", list -> List( QuotientsList( list ), Float ) ); ############################################################################# ## this function has been transferred from ResClasses ## #M RandomCombination( S, k ) . . . . . . . . . . . . . . . . default method ## InstallMethod( RandomCombination, "default method", ReturnTrue, [ IsListOrCollection, IsPosInt ], function ( S, k ) local c, elm, i; if k > Size(S) then return fail; fi; c := []; for i in [1..k] do repeat elm := Random(S); until not elm in c; Add(c,elm); od; return Set(c); end ); ############################################################################# ## this function has been transferred from RCWA ## #F SearchCycle( ) . a utility function for detecting cycles in lists ## BindGlobal( "SearchCycle", function ( list ) local preperiod, cycle, startpos, mainpart, mainpartdiffs, elms, inds, min, n, d, i, j; n := Length(list); mainpart := list{[Int(n/3)..n]}; elms := Set(mainpart); cycle := [elms[1]]; startpos := Filtered(Positions(list,elms[1]),i->i>n/3); if Length(elms) = 1 then if ValueOption("alsopreperiod") <> true then return cycle; else i := Length(list); repeat i := i - 1; until i = 0 or list[i] <> elms[1]; preperiod := list{[1..i]}; return [preperiod,cycle]; fi; fi; i := 0; repeat i := i + 1; inds := Intersection(startpos+i,[1..n]); if inds = [] then return fail; fi; min := Minimum(list{inds}); Add(cycle,min); startpos := Filtered(startpos,j->j+i<=n and list[j+i]=min); if Length(startpos) <= 1 then return fail; fi; mainpartdiffs := DifferencesList(Intersection(startpos,[Int(n/3)..n])); if mainpartdiffs = [] then return fail; fi; d := Maximum(mainpartdiffs); until Length(cycle) = d; if Minimum(startpos) > n/2 or n-Maximum(startpos)-d+1 > d or list{[Maximum(startpos)+d..n]}<>cycle{[1..n-Maximum(startpos)-d+1]} then return fail; fi; if ValueOption("alsopreperiod") <> true then return cycle; else i := Minimum(startpos) + Length(cycle); repeat i := i - Length(cycle); until i <= 0 or list{[i..i+Length(cycle)-1]} <> cycle; preperiod := list{[1..i+Length(cycle)-1]}; return [preperiod,cycle]; fi; end ); ############################################################################## ## this function has been transferred from XMod ## #M DistinctRepresentatives( ) ## InstallMethod( DistinctRepresentatives, "for a list of sets", true, [ IsList ], 0, function( L ) local n, rep, U, len, i, j, k, used, found, S, T, M, P, x, y, z; if not ( IsList( L ) and ( ForAll( L, IsList ) or ForAll( L, IsSet ) ) ) then Error( "argument should be a list of sets" ); fi; n := Length( L ); U := [1..n]; len := 0 * U; for i in U do S := L[i]; if IsList( S ) then S := Set( S ); fi; len[i] := Length( S ); if ( len[i] = 0 ) then Error( "subsets must be non-empty" ); fi; if not ForAll( S, j -> ( j in U ) ) then Error( "each set must be a subset of [1..n]" ); fi; od; rep := 0 * U; used := 0 * U; rep[1] := L[1][1]; used[ rep[1] ] := 1; for i in [2..n] do found := false; S := L[i]; j := 0; while ( ( j < len[i] ) and not found ) do j := j+1; x := S[j]; if ( used[x] = 0 ) then rep[i] := x; used[x] := i; found := true; fi; od; # construct the graph component T := ShallowCopy( S ); M := List( T ); P := 0 * U; for x in M do P[x] := i; od; j := 0; while not found do j := j+1; x := M[j]; k := used[x]; if ( k = 0 ) then # reassign representatives y := P[x]; while ( y <> i ) do z := rep[y]; rep[y] := x; used[x] := y; x := z; y := P[x]; od; rep[i] := x; used[x] := i; found := true; else for y in L[k] do if not ( y in T ) then Add( M, y ); P[y] := k; T := Union( T, [y] ); fi; od; fi; if ( ( not found ) and ( j = Length( M ) ) ) then Print( "Hall condition not satisfied!\n" ); return false; fi; od; od; return rep; end ); ############################################################################## ## this function has been transferred from XMod ## #M CommonRepresentatives( , ) ## InstallMethod( CommonRepresentatives, "for a pair of lists/sets", true, [ IsList, IsList ], 0, function( J, K ) local U, i, j, k, m, n, lenJ, lenK, S, L, I, rep, perm, common; if not ( ForAll( J, IsList ) or ForAll( J, IsSet ) ) then Error( "first argument should be a list of sets" ); fi; m := Length( J ); if not ( ForAll( K, IsList ) or ForAll( K, IsSet ) ) then Error( "second argument should be a list of sets" ); fi; n := Length( K ); if not ( m = n ) then Error( "lists and have unequal length" ); fi; U := [1..n]; lenJ := 0 * U; lenK := 0 * U; for i in U do S := J[i]; if IsList( S ) then S := Set( S ); fi; lenJ[i] := Length( S ); if ( lenJ[i] = 0 ) then Error( "sets must be non-empty" ); fi; S := K[i]; if IsList( S ) then S := Set( S ); fi; lenK[i] := Length( S ); if ( lenK[i] = 0 ) then Error( "sets must be non-empty" ); fi; od; L := List( U, x -> [ ] ); for i in U do S := J[i]; for j in U do I := Intersection( S, K[j] ); if ( Length( I ) > 0 ) then Add( L[i], j ); fi; od; od; rep := DistinctRepresentatives( L ); perm := PermList( rep ); K := Permuted( K, perm^-1 ); common := 0 * U; for i in U do I := Intersection( J[i], K[i] ); common[i] := I[1]; od; return [ common, rep ]; end ); ############################################################################## ## this function has been transferred from XMod ## #M CommonTransversal ## InstallMethod( CommonTransversal, "for left and right cosets of a subgroup", true, [ IsGroup, IsGroup ], 0, function( G, H ) local R, ER, EL, T; if not IsSubgroup( G, H ) then Error( " must be a subgroup of " ); fi; R := RightCosets( G, H ); ER := List( R, Elements ); EL := List( ER, C -> List( C, Inverse ) ); Info( InfoUtils, 3, "right cosets: ", ER ); Info( InfoUtils, 3, " left cosets: ", EL ); T := CommonRepresentatives( EL, ER ); return T[1]; end ); ############################################################################## ## this function has been transferred from XMod ## #M IsCommonTransversal ## InstallMethod( IsCommonTransversal, "for group, subgroup, list", true, [ IsGroup, IsGroup, IsList ], 0, function( G, H, T ) local eG, eH, oG, oH, g, h, t, pos, ind, found; if not IsSubgroup( G, H ) then Print( "second group must be subgroup of first\n" ); return fail; fi; oG := Size( G ); oH := Size( H ); eG := Elements( G ); eH := Elements( H ); ind := oG/oH; found := 0 * [1..oG]; for t in T do if not ( t in eG ) then Print( "element of T not in G\n" ); return false; fi; for h in eH do g := t*h; pos := Position( eG, g ); found[pos] := found[pos] +1; g := h*t; pos := Position( eG, g ); found[pos] := found[pos] + 1; od; od; for t in [1..oG] do if not ( found[t] = 2 ) then Print( eG[t], " found ", found[t], " times\n" ); return false; fi; od; return true; end ); ############################################################################# ## #E lists.gi . . . . . . . . . . . . . . . . . . . . . . . . . . . ends here utils-0.93/lib/matrix.gd0000644000175100017510000000102315105376105014600 0ustar runnerrunner############################################################################ ## #W matrix.gd GAP4 package `Utils' Chris Wensley ## #Y Copyright (C) 2023, The GAP Group ############################################################################# ## This function ... ## #O DirectSumDecompositionMatrices( ) ## DeclareOperation( "DirectSumDecompositionMatrices", [ IsMatrixOrMatrixObj ] ); DeclareOperation( "DirectSumBlock", [ IsMatrixOrMatrixObj, IsInt, IsList, IsList ] ); utils-0.93/lib/lists.gd0000644000175100017510000000371715105376105014446 0ustar runnerrunner############################################################################## ## #W lists.gd GAP4 package `Utils' Stefan Kohl ## #Y Copyright (C) 2015-2025, The GAP Group ############################################################################# ## these functions have been transferred from ResClasses ## #F DifferencesList( ) . . . . differences of consecutive list entries #F QuotientsList( ) . . . . . . quotients of consecutive list entries #F FloatQuotientsList( ) . . . . . . . . . . . . dito, but as floats ## DeclareGlobalName( "DifferencesList" ); DeclareGlobalName( "QuotientsList" ); DeclareGlobalName( "FloatQuotientsList" ); ############################################################################# ## this function has been transferred from ResClasses ## #F RandomCombination( S, k ) ## ## Returns a random unordered -tuple of distinct elements of the set . ## DeclareOperation( "RandomCombination", [ IsListOrCollection, IsPosInt ] ); ############################################################################# ## this function has been transferred from RCWA ## #F SearchCycle( ) . . . a utility function for detecting cycles in lists ## DeclareGlobalName( "SearchCycle" ); ############################################################################# ## these functions have been have been transferred from XMod ## #O DistinctRepresentatives( ) #O CommonRepresentatives( , ) #O CommonTransversal( , ) #O IsCommonTransversal( , , ) ## DeclareOperation( "DistinctRepresentatives", [ IsList ] ); DeclareOperation( "CommonRepresentatives", [ IsList, IsList ] ); DeclareOperation( "CommonTransversal", [ IsGroup, IsGroup ] ); DeclareOperation( "IsCommonTransversal", [ IsGroup, IsGroup, IsList ] ); ############################################################################# ## #E lists.gd . . . . . . . . . . . . . . . . . . . . . . . . . . . ends here utils-0.93/lib/maps.gd0000644000175100017510000000437115105376105014245 0ustar runnerrunner############################################################################## ## #W maps.gd GAP4 package `Utils' Stefan Kohl ## Chris Wensley #Y Copyright (C) 2015-2019, The GAP Group ############################################################################# ## these three functions were in RCWA and were initially transferred but, ## to simplify the situation, just EpimorphismByGenerators has been retained ## #O EpimorphismByGenerators( , ) . epi: gen's of ->gen's of #O EpimorphismByGeneratorsNC( , ) . . NC version as underlying oper #M EpimorphismByGeneratorsNC( , ) . . . . . . . . . . . . for groups ## DeclareOperation( "EpimorphismByGenerators", [ IsDomain, IsDomain ] ); ############################################################################# ## #O Pullback( , ) #A PullbackInfo( ) ## DeclareOperation( "Pullback", [ IsGroupHomomorphism, IsGroupHomomorphism ] ); DeclareAttribute( "PullbackInfo", IsGroup, "mutable" ); ############################################################################# ## #O CentralProduct( , , , ) #A CentralProductInfo( ) ## DeclareOperation( "CentralProduct", [ IsGroup, IsGroup, IsGroup, IsGroupHomomorphism ] ); DeclareAttribute( "CentralProductInfo", IsGroup, "mutable" ); ############################################################################# ## these functions compute idempotent endomorphisms on G with image R ## #O IdempotentEndomorphisms( ) #A IdempotentEndomorphismsWithImage( , ) #A IdempotentEndomorphismsData( ) ## DeclareOperation( "IdempotentEndomorphisms", [ IsGroup ] ); DeclareOperation( "IdempotentEndomorphismsWithImage", [ IsList, IsGroup ] ); DeclareAttribute( "IdempotentEndomorphismsData", IsGroup ); ############################################################################# ## #O DirectProductOfFunctions( , , , ) #O DirectProductOfAutomorphismGroups( , ) ## DeclareOperation( "DirectProductOfFunctions", [ IsGroup, IsGroup, IsGroupHomomorphism, IsGroupHomomorphism ] ); DeclareOperation( "DirectProductOfAutomorphismGroups", [ IsGroup, IsGroup ] ); utils-0.93/lib/string.gd0000644000175100017510000000136515105376105014613 0ustar runnerrunner############################################################################## ## #W string.gd GAP4 package `Utils' Sebastian Gutsche ## Stefan Kohl ## #Y Copyright (C) 2015-2025, The GAP Group ############################################################################# ## this function has been transferred from ResClasses ## #F BlankFreeString( ) . . . . . . . . . . . . . string without blanks ## DeclareGlobalName( "BlankFreeString" ); ############################################################################# ## #E string.gd . . . . . . . . . . . . . . . . . . . . . . . . . . . ends here utils-0.93/lib/download.gi0000644000175100017510000002114115105376105015113 0ustar runnerrunner############################################################################## ## #W download.gi GAP4 package `Utils' Thomas Breuer ## #Y Copyright (C) 2022, The GAP Group ############################################################################# ## #V Download_Methods ## ## Use the following tools (in this order). ## ## - If the curlInterface package is available then call its ## 'DownloadURL' function. ## - If the URL starts with 'http://' and if the IO package is available ## then call the 'SingleHTTPRequest' function from this package. ## - If a 'wget' executable is available then call it. ## - If a 'curl' executable is available then call it. ## ## Note that currently the methods are *NOT* consistent in the case of ## failures: ## ## - The function 'SingleHTTPRequest' does not follow redirects as indicated ## by HTTP status codes 301 and 302. ## This happens for example if one asks for the file at ## 'http://www.gap-system.org/Packages/utils.html'. ## BindGlobal( "Download_Methods", [] ); Add( Download_Methods, rec( name:= "via DownloadURL (from the curlInterface package)", isAvailable:= {} -> IsPackageLoaded( "curlInterface" ) and CompareVersionNumbers( InstalledPackageVersion( "curlInterface" ), "2.3.0" ), download:= function( url, opt ) local res; opt:= ShallowCopy( opt ); if not IsBound( opt.failOnError ) then opt.failOnError:= true; fi; # 'DownloadURL' handles the options 'verifyCert' and 'maxTime'. res:= ValueGlobal( "DownloadURL" )( url, opt ); if res.success = true and IsBound( opt.target ) and IsString( opt.target ) then FileString( opt.target, res.result ); Unbind( res.result ); fi; return res; end ) ); Add( Download_Methods, rec( name:= "via SingleHTTPRequest (from the IO package)", isAvailable:= {} -> IsBoundGlobal( "SingleHTTPRequest" ), download:= function( url, opt ) local rurl, pos, domain, uri, res; if not StartsWith( url, "http://" ) then return rec( success:= false, error:= "protocol is not http" ); elif IsBound( opt.maxTime ) and opt.maxTime <> 0 then return rec( success:= false, error:= "no support for given timeout" ); fi; rurl:= ReplacedString( url, "http://", "" ); pos:= Position( rurl, '/' ); domain:= rurl{ [ 1 .. pos-1 ] }; uri:= rurl{ [ pos .. Length( rurl ) ] }; if IsBound( opt.target ) and IsString( opt.target ) then res:= ValueGlobal( "SingleHTTPRequest" )( domain, 80, "GET", uri, rec(), false, opt.target ); else res:= ValueGlobal( "SingleHTTPRequest" )( domain, 80, "GET", uri, rec(), false, false ); fi; if res.statuscode = 0 then return rec( success:= false, error:= res.status ); elif res.statuscode >= 400 then return rec( success:= false, error:= Concatenation( "HTTP error code ", String( res.statuscode ) ) ); elif not ( IsBound( opt.target ) and IsString( opt.target ) ) then return rec( success:= true, result:= res.body ); else return rec( success:= true ); fi; end ) ); Add( Download_Methods, rec( name:= "via wget", isAvailable:= function() local exec; exec:= Filename( DirectoriesSystemPrograms(), "wget" ); return exec <> fail and IsExecutableFile( exec ); end, download:= function( url, opt ) local res, outstream, exec, args, code; if IsBound( opt.maxTime ) and opt.maxTime <> 0 then # wget 1.20.3 ignores a given timeout. # (wget 1.21.3 would support timeout.) return rec( success:= false, error:= "no support for given timeout" ); fi; res:= ""; outstream:= OutputTextString( res, true ); exec:= Filename( DirectoriesSystemPrograms(), "wget" ); if IsBound( opt.target ) and IsString( opt.target ) then args:= [ "--quiet", "-O", opt.target, url ]; else args:= [ "--quiet", "-O", "-", url ]; fi; if IsBound( opt.verifyCert ) and opt.verifyCert = false then Add( args, "--no-check-certificate" ); fi; if IsBound( opt.maxTime ) and IsPosInt( opt.maxTime ) then Add( args, Concatenation( "--timeout=", String( opt.maxTime ) ) ); fi; code:= Process( DirectoryCurrent(), exec, InputTextNone(), outstream, args ); CloseStream( outstream ); if code <> 0 then # wget may have created the target file; try to remove it if IsBound( opt.target ) and IsString( opt.target ) and IsExistingFile( opt.target ) and RemoveFile( opt.target ) <> true then Error( "Download cannot remove unwanted file ", opt.target ); fi; return rec( success:= false, error:= Concatenation( "Process returned ", String( code ) ) ); elif not ( IsBound( opt.target ) and IsString( opt.target ) ) then return rec( success:= true, result:= res ); else return rec( success:= true ); fi; end ) ); Add( Download_Methods, rec( name:= "via curl", isAvailable:= function() local exec; exec:= Filename( DirectoriesSystemPrograms(), "curl" ); return exec <> fail and IsExecutableFile( exec ); end, download:= function( url, opt ) local res, outstream, exec, args, code; res:= ""; outstream:= OutputTextString( res, true ); exec:= Filename( DirectoriesSystemPrograms(), "curl" ); args:= [ "--silent", "-L", "--fail" ]; if IsBound( opt.verifyCert ) and opt.verifyCert = false then Add( args, "-k" ); fi; Add( args, "--output" ); if IsBound( opt.target ) and IsString( opt.target ) then Add( args, opt.target ); else Add( args, "-" ); fi; if IsBound( opt.maxTime ) and IsPosInt( opt.maxTime ) then Add( args, "--max-time" ); Add( args, opt.maxTime ); fi; Add( args, url ); code:= Process( DirectoryCurrent(), exec, InputTextNone(), outstream, args ); CloseStream( outstream ); if code <> 0 then return rec( success:= false, error:= Concatenation( "Process returned ", String( code ) ) ); elif not ( IsBound( opt.target ) and IsString( opt.target ) ) then return rec( success:= true, result:= res ); else return rec( success:= true ); fi; end ) ); ############################################################################# ## #M Download( [, ] ) ## ## Try to download the file described by the string , ## and return a record with the components 'success' ('true' or 'false'), ## and 'result' (a string, only if 'success' is 'true'), ## and 'error' (a string, only if 'success' is 'false'). ## InstallMethod( Download, [ "IsString" ], url -> Download( url, rec() ) ); InstallMethod( Download, [ "IsString", "IsRecord" ], function( url, opt ) local timeout, errors, r, res; # Set the default for 'verifyCert' if necessary. if not IsBound( opt.verifyCert ) and UserPreference( "utils", "DownloadVerifyCertificate" ) = false then opt.verifyCert:= false; fi; # Set the default for 'maxTime' if necessary. if not IsBound( opt.maxTime ) then timeout:= UserPreference( "utils", "DownloadMaxTime" ); if IsPosInt( timeout ) then opt.maxTime:= timeout; fi; fi; # Run over the methods. errors:= []; for r in Download_Methods do if r.isAvailable() then Info( InfoUtils, 2, "try Download method ", r.name ); res:= r.download( url, opt ); if res.success = true then return res; fi; Info( InfoUtils, 2, "Download method ", r.name, " failed with\n", "#I ", res.error ); Add( errors, Concatenation( r.name, ": ", res.error ) ); else Info( InfoUtils, 2, "Download method ", r.name, " is not available" ); fi; od; # No method was successful. if Length( errors ) = 0 then # No method was available, inform the user # that it is recommended to load or install some download tool. Info( InfoWarning, 1, "No 'Download' method is available.\n", "#I Please consider to install one of the tools, ", "see '?Download'" ); return rec( success:= false, error:= "no method was available" ); else # At least one method was tried but without success. if IsBound( opt.maxTime ) then Add( errors, Concatenation( "(maxTime option was set to ", String( opt.maxTime ), ")" ) ); fi; return rec( success:= false, error:= JoinStringsWithSeparator( errors, "; " ) ); fi; end ); utils-0.93/lib/record.gi0000644000175100017510000000433715105376105014572 0ustar runnerrunner############################################################################## ## #W record.gi GAP4 package `Utils' Sebastian Gutsche ## Max Horn ## Stefan Kohl #Y Copyright (C) 2015-2025, The GAP Group ############################################################################# ## this function has been transferred from RCWA ## #F AssignGlobals( ) ## ## This auxiliary function assigns the record components of ## to global variables with the same names. ## BindGlobal( "AssignGlobals", function ( record ) local names, name; names := RecNames(record); for name in names do if IsBoundGlobal(name) then if IsReadOnlyGlobal(name) then MakeReadWriteGlobal(name); Info(InfoWarning,1,"The read-only global variable ",name, " has been overwritten."); else Info(InfoUtils,1,"The global variable ",name, " has been overwritten."); fi; UnbindGlobal(name); fi; BindGlobal(name,record.(name)); MakeReadWriteGlobal(name); od; Print("The following global variables have been assigned:\n", Set(names),"\n"); end ); BindGlobal( "OptionRecordWithDefaults", function(default, useroptions) local name, ret; ret := rec(); if IsList(useroptions) then if IsEmpty(useroptions) then return default; elif Length(useroptions) = 1 then useroptions := useroptions[1]; else ErrorNoReturn("Too many arguments for function"); fi; fi; if not IsRecord(useroptions) then ErrorNoReturn("Options should be a record"); fi; ret := ShallowCopy(default); for name in RecNames(useroptions) do if not IsBound(default.(name)) then ErrorNoReturn(Concatenation("Unknown option: " , name)); else ret.(name) := useroptions.(name); fi; od; return ret; end); ############################################################################# ## #E record.gi . . . . . . . . . . . . . . . . . . . . . . . . . . . ends here utils-0.93/lib/string.gi0000644000175100017510000000154715105376105014622 0ustar runnerrunner############################################################################# ## #W string.gi GAP4 package `Utils' Sebastian Gutsche ## Stefan Kohl ## #Y Copyright (C) 2015-2025, The GAP Group ############################################################################# ## this function has been transferred from ResClasses ## #F BlankFreeString( ) . . . . . . . . . . . . . string without blanks ## BindGlobal( "BlankFreeString", function ( obj ) local str; str := String(obj); RemoveCharacters(str," "); return str; end ); ############################################################################# ## #E string.gi . . . . . . . . . . . . . . . . . . . . . . . . . . . ends here utils-0.93/lib/download.gd0000644000175100017510000000321515105376105015110 0ustar runnerrunner############################################################################## ## #W download.gd GAP4 package `Utils' Thomas Breuer ## #Y Copyright (C) 2022, The GAP Group ############################################################################# ## This function is intended to be used instead of similar ones from ## various packages (AtlasRep, FactInt, GAPDoc, PackageManager, ## StandardFF, ...) ## #O Download( [, ] ) ## DeclareOperation( "Download", [ IsString ] ); DeclareOperation( "Download", [ IsString, IsRecord ] ); ############################################################################# ## #U DownloadVerifyCertificate ## DeclareUserPreference( rec( name:= "DownloadVerifyCertificate", description:= [ "The value 'true' (the default) means that the server's certificate \ is checked in calls of 'Download' such that nothing gets downloaded \ if the certificate is invalid. \ If the value is 'false' then those download methods that are based on \ curl or wget will omit the check of the server's certificate." ], default:= true, values:= [ true, false ], multi:= false, package:= "utils", ) ); ############################################################################# ## #U DownloadMaxTime ## DeclareUserPreference( rec( name:= "DownloadMaxTime", description:= [ "The value '0' (the default) means that no timeout is set \ in calls of 'Download'. \ If the value is a positive integer 'n' then those download methods that \ support a timeout will give up after 'n' seconds." ], default:= 0, check:= val -> val = 0 or IsPosInt( val ), package:= "utils", ) ); utils-0.93/lib/latex.gi0000644000175100017510000000320215105376105014417 0ustar runnerrunner############################################################################# ## #W latex.gi GAP4 package `Utils' Stefan Kohl ## #Y Copyright (C) 2015-2025, The GAP Group ############################################################################# ## this function has been transferred from ResClasses ## #F IntOrInfinityToLaTeX( n ) . LaTeX string for a given integer or infinity ## BindGlobal( "IntOrInfinityToLaTeX", function( n ) if IsInt(n) then return String(n); elif IsInfinity(n) then return "\\infty"; else return fail; fi; end ); ############################################################################# ## this function has been transferred from RCWA ## #F LaTeXStringFactorsInt( ) . . . . prime factorization in LaTeX format ## BindGlobal( "LaTeXStringFactorsInt", function ( n ) local facts, str, i; if not IsInt(n) then Error("usage: LaTeXStringFactorsInt( ) for an integer "); fi; if n < 0 then str := "-"; n := -n; else str := ""; fi; facts := Collected(Factors(n)); for i in [1..Length(facts)] do Append(str,String(facts[i][1])); if facts[i][2] > 1 then Append(str,"^"); if facts[i][2] >= 10 then Append(str,"{"); fi; Append(str,String(facts[i][2])); if facts[i][2] >= 10 then Append(str,"}"); fi; fi; if i < Length(facts) then Append(str," \\cdot "); fi; od; return str; end ); ############################################################################# ## #E latex.gi . . . . . . . . . . . . . . . . . . . . . . . . . . . ends here utils-0.93/lib/record.gd0000644000175100017510000000226615105376105014564 0ustar runnerrunner############################################################################## ## #W record.gd GAP4 package `Utils' Sebastian Gutsche ## Max Horn ## Stefan Kohl #Y Copyright (C) 2015-2025, The GAP Group ############################################################################# ## this function has been transferred from RCWA ## #F AssignGlobals( ) ## ## This auxiliary function assigns the record components of to ## global variables with the same names. ## DeclareGlobalName( "AssignGlobals" ); ############################################################################# ## this function has been contributed by Christopher Jefferson ## #F OptionRecordWithDefaults( arg1, arg2, ..., ) ## ## This auxiliary function assigns the record components of to ## global variables with the same names. ## DeclareGlobalName( "OptionRecordWithDefaults" ); ############################################################################# ## #E record.gd . . . . . . . . . . . . . . . . . . . . . . . . . . . ends here utils-0.93/lib/iterator.gd0000644000175100017510000000326015105376105015132 0ustar runnerrunner############################################################################## ## #W iterator.gd GAP4 package `Utils' Chris Wensley ## #Y Copyright (C) 2015-2025, The GAP Group ############################################################################# ## These functions complement AllHomomorphisms, AllEndomorphisms, and ## AllAutomorphisms in the main library. ## The code gives an example of an iterator preferrred to a list. ## #O AllIsomorphismsIterator( , ) #F DoAllIsomorphismsIterator #O AllIsomorphismsNumber( , ) #O AllIsomorphisms( , ) ## DeclareOperation( "AllIsomorphismsIterator", [ IsGroup, IsGroup ] ); DeclareGlobalName( "DoAllIsomorphismsIterator" ); DeclareOperation( "AllIsomorphismsNumber", [ IsGroup, IsGroup ] ); DeclareOperation( "AllIsomorphisms", [ IsGroup, IsGroup ] ); ############################################################################# ## These functions provide an iterator for all subgroups of a group. ## #O AllSubgroupsIterator( ) #F DoAllSubgroupsIterator ## DeclareOperation( "AllSubgroupsIterator", [ IsGroup ] ); DeclareGlobalName( "DoAllSubgroupsIterator" ); ############################################################################# ## These functions provide ways of combining two iterators into one ## #O CartesianIterator( ) #F DoCartesianIterator #O UnorderedPairsIterator( ) #F DoUnorderedPairsIterator ## DeclareOperation( "CartesianIterator", [ IsIterator, IsIterator ] ); DeclareGlobalName( "DoCartesianIterator" ); DeclareOperation( "UnorderedPairsIterator", [ IsIterator ] ); DeclareGlobalName( "DoUnorderedPairsIterator" ); utils-0.93/lib/lcset.gi0000644000175100017510000001125215105376105014420 0ustar runnerrunner############################################################################## ## #W lcset.gi GAP4 package `Utils' Chris Wensley ## #Y Copyright (C) 2015-2025, The GAP Group ############################################################################# ## #O LeftCoset( , ) . . . . . . . . forms a left coset of U by g \in G ## InstallMethod( LeftCoset, "generic method for left cosets", true, [ IsObject, IsGroup ], 0, function( g, U ) local lc, fam; fam := FamilyObj( U ); if not IsBound( fam!.leftCosetsDefaultType ) then fam!.leftCosetsDefaultType := NewType( fam, IsLeftCosetDefaultRep and HasActingDomain and HasFunctionAction and HasRepresentative ); fi; lc := rec(); ObjectifyWithAttributes( lc, fam!.leftCosetsDefaultType, Representative, g, ActingDomain, U, FunctionAction, OnRight, IsLeftCoset, true ); if HasSize( U ) then SetSize( lc, Size( U ) ); fi; return lc; end); ############################################################################# ## #A Inverse( ) . . . . . forms the right coset Ug^-1 corresponding to gU #A Inverse( ) . . . . . forms the left coset g^-1U corresponding to Ug ## InstallOtherMethod( Inverse, "generic method for left cosets", true, [ IsLeftCoset ], 0, function( lc ) local g, U, rc; g := Representative( lc ); U := ActingDomain( lc ); rc := RightCoset( U, g^-1 ); SetInverse( rc, lc ); return rc; end); InstallOtherMethod( Inverse, "generic method for right cosets", true, [ IsRightCoset ], 0, function( rc ) local g, U, lc; g := Representative( rc ); U := ActingDomain( rc ); lc := LeftCoset( g^-1, U ); SetInverse( lc, rc ); return lc; end); InstallMethod( PrintString, "for a left coset", true, [ IsLeftCoset ], 0, function( d ) return STRINGIFY( "LeftCoset(\<", PrintString( Representative(d) ), ",\>", PrintString( ActingDomain(d) ), ")" ); end); InstallMethod( PrintObj, "for a left coset", true, [ IsLeftCoset ], 0, function( d ) Print( PrintString( d ) ); end); InstallMethod( ViewString, "for a left coset", true, [ IsLeftCoset ], 0, function( d ) return STRINGIFY( "LeftCoset(\<", ViewString( Representative(d) ), ",\>", ViewString( ActingDomain(d) ), ")" ); end); InstallMethod( ViewObj, "for a left coset", true, [ IsLeftCoset ], 0, function( d ) Print( ViewString( d ) ); end); InstallMethod( \=, "for two left cosets", IsIdenticalObj, [ IsLeftCoset, IsLeftCoset ], 0, function( lc1, lc2 ) return ( ActingDomain( lc1 ) = ActingDomain( lc2 ) ) and ( Representative(lc1)/Representative(lc2) in ActingDomain( lc1 ) ); end); InstallMethod( \in, "element and LeftCoset", true, [ IsMultiplicativeElementWithInverse, IsLeftCoset ], 100, function( g, lc ) return ( Representative(lc)^-1 * g ) in ActingDomain( lc ); end); InstallOtherMethod( \*, "element and LeftCoset", true, [ IsMultiplicativeElementWithInverse, IsLeftCoset ], 0, function( g, lc ) return LeftCoset( g * Representative( lc ), ActingDomain( lc ) ); end); InstallOtherMethod( \^, "LeftCoset and element", true, [ IsLeftCoset, IsMultiplicativeElementWithInverse ], 0, function( lc, g ) return g^-1 * lc; end); InstallMethod( Size, "for a left coset", true, [ IsLeftCoset ], 0, function( lc ) return Size( ActingDomain( lc ) ); end); InstallOtherMethod( IsBiCoset, "for a left coset", true, [ IsLeftCoset ], 0, function( lc ) return IsBiCoset( Inverse( lc ) ); end); InstallOtherMethod( AsSet, "for a left coset", true, [ IsLeftCoset ], 0, function( lc ) local L; L := AsSet( Inverse( lc ) ); return Set( L, g -> g^-1 ); end); InstallOtherMethod( Intersection2, "for two left cosets", true, [ IsLeftCoset, IsLeftCoset ], 0, function( lc1, lc2 ) local L; L := Intersection2( Inverse( lc1 ), Inverse( lc2 ) ); return Set( L, g -> g^-1 ); ## return Inverse( L ); to be used once 4r12 is out end); ############################################################################# ## #F LeftCosets( ) . . . . . . . . . . . . left cosets of U by g \in G #O LeftCosetsNC( ) . . . . . . . . . . . left cosets of U by g \in G ## BindGlobal( "LeftCosets", function( G, U ) if not IsSubset( G, U ) then Error("not contained"); fi; return LeftCosetsNC( G, U ); end ); InstallMethod( LeftCosetsNC, "generic", IsIdenticalObj, [ IsGroup, IsGroup ], 0, function( G, U ) local L; L := RightCosetsNC( G, U ); return List( L, Inverse ); end); utils-0.93/lib/magma.gd0000644000175100017510000000320715105376105014364 0ustar runnerrunner############################################################################## ## #W magma.gd GAP4 package `Utils' Max Horn ## Alexander Hulpke ## #Y Copyright (C) 2015-2025, The GAP Group ############################################################################# ## this function is new in Utils but calls functions which have been ## transferred from the main library or from private code ## #F ConvertToMagmaInputString( ) . . output a string readable by Magma ## DeclareGlobalName( "ConvertToMagmaInputString" ); ############################################################################# ## this function was originally authored by Alexander Hulpke; ## it has been transferred from other.gd in the main library; ## and was originally named MagmaInputString ## #O PermGroupToMagmaFormat( ) ## DeclareOperation( "PermGroupToMagmaFormat", [ IsPermGroup ] ); ############################################################################# ## this function was private code of Max Horn ## #O PcGroupToMagmaFormat( ) ## DeclareOperation( "PcGroupToMagmaFormat", [ IsPcGroup ] ); ############################################################################# ## this function was private code of Frank LĂĽbeck ## #O MatrixGroupToMagmaFormat( ) ## DeclareOperation( "MatrixGroupToMagmaFormat", [ IsMatrixGroup ] ); ############################################################################# ## #E magma.gd . . . . . . . . . . . . . . . . . . . . . . . . . . . ends here utils-0.93/lib/maps.gi0000644000175100017510000002113215105376105014244 0ustar runnerrunner############################################################################# ## #W maps.gi GAP4 package `Utils' Stefan Kohl ## Chris Wensley #Y Copyright (C) 2015-2019, The GAP Group ############################################################################# ## #F EpimorphismByGenerators( , ) . epi: gen's of ->gen's of ## InstallMethod( EpimorphismByGenerators, "for groups", ReturnTrue, [ IsGroup, IsGroup ], 0, function( G, H ) if not ( IsFreeGroup( G ) ) then Print( "Warning: calling GroupHomomorphismByImagesNC without checks\n" ); fi; return GroupHomomorphismByImagesNC( G, H, GeneratorsOfGroup(G), GeneratorsOfGroup(H) ); end ); ############################################################################## ## #M Pullback . . . . . . . . . for two group homomorphisms with a common range ## InstallMethod( Pullback, "for two group homomorphisms", true, [ IsGroupHomomorphism, IsGroupHomomorphism ], 0, function( nu, mu ) local M, N, P, NxM, projM, pmu, projN, pnu, genNxM, e, genL, L, imphi, phi, impsi, psi, info; M := Source( mu ); P := Range( mu ); N := Source( nu ); if not ( Range(nu) = P ) then Error( "homs nu,mu should have a common range" ); fi; NxM := DirectProduct( N, M ); genNxM := GeneratorsOfGroup( NxM ); projN := Projection( NxM, 1 ); pnu := projN * nu; projM := Projection( NxM, 2 ); pmu := projM * mu; if IsFinite( NxM ) then genL := [ ]; L := Subgroup( NxM, [ One(NxM) ] ); for e in NxM do if ImageElm( pnu, e ) = ImageElm( pmu, e ) then if not ( e in L ) then Add( genL, e ); L := Group( genL ); fi; fi; od; else return fail; fi; imphi := List( genL, g -> ImageElm( projN, g ) ); phi := GroupHomomorphismByImages( L, N, genL, imphi ); impsi := List( genL, g -> ImageElm( projM, g ) ); psi := GroupHomomorphismByImages( L, M, genL, impsi ); info := rec( directProduct := NxM, projections := [phi,psi] ); SetPullbackInfo( L, info ); return L; end ); ############################################################################# ## #M CentralProduct( , , , ) ## InstallMethod( CentralProduct, [ "IsGroup", "IsGroup", "IsGroup", "IsGroupHomomorphism" ], function( G1, G2, Z1, Phi ) local gens, imgs, dp, emb1, emb2, N, proj, G; if not ( IsSubset( G1, Z1 ) and IsCentral( G1, Z1 ) ) then Error( " must be a central subgroup of " ); fi; gens:= GeneratorsOfGroup( Z1 ); imgs:= List( gens, x -> (x^-1)^Phi ); if not ( IsSubset( G2, imgs ) and ForAll( imgs, x -> IsCentral( G2, x ) ) ) then Error( " must map to a central subgroup of " ); fi; dp:= DirectProduct( G1, G2 ); emb1:= Embedding( dp, 1 ); emb2:= Embedding( dp, 2 ); N:= SubgroupNC( dp, List( [ 1 .. Length( gens ) ], i -> gens[i]^emb1 * imgs[i]^emb2 ) ); proj:= NaturalHomomorphismByNormalSubgroup( dp, N ); G:= Image( proj ); SetCentralProductInfo( G, rec( projection:= proj, phi:= Phi ) ); return G; end ); ############################################################################## ## #M IdempotentEndomorphisms . . . . . . . . . . . . . . . . . . . for a group #M IdempotentEndomorphismsData . . . . . . . . . . . . . . . . . for a group #M IdempotentEndomorphismsWithImage . . . . . for a group and a chosen image ## InstallMethod( IdempotentEndomorphismsWithImage, "for a list of group generators and a chosen image", [ IsList, IsGroup ], 0, function( genG, R ) local G, numG, r, q, norm, n, reps, i, j, rc; G := Group( genG ); if not IsSubgroup( G, R ) then Error( "R should be a subgroup of G" ); fi; numG := Length( genG ); r := Size( R ); q := Size( G )/r; norm := Filtered( NormalSubgroups( G ), N -> ( Size( N ) = q ) and IsTrivial( Intersection( N, R ) ) ); n := Length( norm ); reps := [ ]; for i in [1..n] do Add( reps, [ ] ); for j in [1..numG] do rc := norm[i]*genG[j]; Add( reps[i], First( rc, g -> g in R ) ); od; od; return reps; end ); InstallMethod( IdempotentEndomorphismsData, "for a group", [ IsGroup ], 0, function( G ) local genG, R, data, images; genG := SmallGeneratingSet( G ); images := [ ]; for R in AllSubgroups( G ) do data := IdempotentEndomorphismsWithImage( genG, R ); if ( data <> [ ] ) then Add( images, data ); fi; od; return rec( gens := genG, images := images ); end ); InstallMethod( IdempotentEndomorphisms, "for a group", [ IsGroup ], 0, function( G ) local data, genG, images, len, L, i, im; data := IdempotentEndomorphismsData( G ); genG := data!.gens; G := Group( genG ); images := data!.images; len := Length( images ); L := [ ]; for i in [1..len] do for im in images[i] do Add( L, GroupHomomorphismByImages( G, G, genG, im ) ); od; od; return L; end ); ############################################################################## ## #M DirectProductOfFunctions . . . . . . for two groups and two homomorphisms ## InstallMethod( DirectProductOfFunctions, "for two groups and two homs", [ IsGroup, IsGroup, IsGroupHomomorphism, IsGroupHomomorphism ], 0, function( G, H, f1, f2 ) local infoG, gpsG, G1, G2, infoH, gpsH, H1, H2, eG1, eG2, eH1, eH2, mgi1, mgi2, genG, imH1, imH2, imH; if not HasDirectProductInfo( G ) and HasDirectProductInfo( H ) then Error( "first two parameters should be direct products" ); fi; infoG := DirectProductInfo( G ); gpsG := infoG!.groups; G1 := gpsG[1]; G2 := gpsG[2]; if not ( ( G1 = Source( f1 ) ) and ( G2 = Source( f2 ) ) ) then Error( "f1,f2 should have source G1,G2" ); fi; eG1 := Embedding( G, 1 ); eG2 := Embedding( G, 2 ); mgi1 := MappingGeneratorsImages( f1 ); mgi2 := MappingGeneratorsImages( f2 ); infoH := DirectProductInfo( H ); gpsH := infoH!.groups; H1 := gpsH[1]; H2 := gpsH[2]; if not ( ( H1 = Range( f1 ) ) and ( H2 = Range( f2 ) ) ) then Error( "f1,f2 should have range H1,H2" ); fi; eH1 := Embedding( H, 1 ); eH2 := Embedding( H, 2 ); genG := Concatenation( List( mgi1[1], g -> ImageElm( eG1, g ) ), List( mgi2[1], g -> ImageElm( eG2, g ) ) ); imH1 := List( mgi1[2], h -> ImageElm( eH1, h ) ); imH2 := List( mgi2[2], h -> ImageElm( eH2, h ) ); imH := Concatenation( imH1, imH2 ); return GroupHomomorphismByImagesNC( G, H, genG, imH ); end ); ############################################################################## ## #M DirectProductOfAutomorphismGroups . . . . . . for two automorphism groups ## InstallMethod( DirectProductOfAutomorphismGroups, "for two groups", [ IsGroup, IsGroup ], 0, function( A1, A2 ) local gen1, gen2, G1, G2, id1, id2, dp, dp1, dp2, gen12, A12, em1, em2, pr1, pr2, info; if not ( IsGroupOfAutomorphisms(A1) and IsGroupOfAutomorphisms(A2) ) then Error( "A1,A2 should be automorphism groups" ); fi; gen1 := GeneratorsOfGroup( A1 ); gen2 := GeneratorsOfGroup( A2 ); G1 := Source( gen1[1] ); G2 := Source( gen2[1] ); if not ( IsGroup( G1 ) and IsGroup( G2 ) ) then Error( "A1,A2 should be automorphism groups of groups G1,G2" ); fi; id1 := IdentityMapping( G1 ); id2 := IdentityMapping( G2 ); dp := DirectProduct( G1, G2 ); dp1 := List( gen1, g -> DirectProductOfFunctions( dp, dp, g, id2 ) ); dp2 := List( gen2, g -> DirectProductOfFunctions( dp, dp, id1, g ) ); gen12 := Concatenation( dp1, dp2 ); A12 := Group( gen12 ); em1 := GroupHomomorphismByImages( A1, A12, gen1, dp1 ); em2 := GroupHomomorphismByImages( A2, A12, gen2, dp2 ); pr1 := GroupHomomorphismByImages( A12, A1, gen12, Concatenation( gen1, List( gen2, g -> id1 ) ) ); pr2 := GroupHomomorphismByImages( A12, A2, gen12, Concatenation( List( gen1, g -> id2 ), gen2 ) ); info := rec( embeddings := [ em1, em2 ], groups := [ A1, A2 ], projections := [ pr1, pr2 ] ); SetDirectProductInfo( A12, info ); return A12; end ); utils-0.93/lib/iterator.gi0000644000175100017510000002064115105376105015141 0ustar runnerrunner############################################################################# ## #W iterator.gi GAP4 package `Utils' Chris Wensley ## #Y Copyright (C) 2015-2025, The GAP Group ############################################################################## ## #M AllIsomorphismsIterator . . . . . . . . . . . . . . . for a pair of groups #M DoAllIsomorphismsIterator . . . . . . . . . . . . . . for a pair of groups #M AllIsomorphismsNumber . . . . . . . . . . . . . . . . for a pair of groups #M AllIsomorphisms . . . . . . . . . . . . . . . . . . . for a pair of groups ## BindGlobal( "NextIterator_AllIsomorphisms", function ( iter ) local a; if not IsDoneIterator( iter ) then a := NextIterator( iter!.autoIterator ); return CompositionMapping( iter!.firstiso, a ); fi; Error( "iterator is exhausted" ); end ); BindGlobal( "IsDoneIterator_AllIsomorphisms", iter -> IsDoneIterator( iter!.autoIterator ) ); BindGlobal( "ShallowCopy_AllIsomorphisms", iter -> rec( firstiso := iter!.firstiso, autoIterator := ShallowCopy( iter!.autoIterator ) ) ); BindGlobal( "DoAllIsomorphismsIterator", function( G, H ) local iso, autoiter, iter; if not IsGroup( G ) and IsGroup( H ) then Error( "G,H should be groups" ); fi; iso := IsomorphismGroups( G, H ); if ( iso = fail ) then ## there are no isomorphisms so return an empty iterator return IteratorList( [ ] ); fi; autoiter := Iterator( AutomorphismGroup( G ) ); iter := IteratorByFunctions( rec( firstiso := iso, autoIterator := ShallowCopy( autoiter ), NextIterator := NextIterator_AllIsomorphisms, IsDoneIterator := IsDoneIterator_AllIsomorphisms, ShallowCopy := ShallowCopy_AllIsomorphisms ) ); return iter; end ); InstallMethod( AllIsomorphismsIterator, "for a pair of groups", [ IsGroup, IsGroup ], 0, function( G, H ) return DoAllIsomorphismsIterator( G, H ); end ); InstallMethod( AllIsomorphisms, "for a pair of groups", [ IsGroup, IsGroup ], 0, function( G, H ) local iter, L, iso; iter := AllIsomorphismsIterator( G, H ); if IsDoneIterator( iter ) then return [ ]; fi; L := [ ]; for iso in iter do Add( L, iso ); od; return L; end ); InstallMethod( AllIsomorphismsNumber, "for a pair of groups", [ IsGroup, IsGroup ], 0, function( G, H ) local iter, n, iso; iter := AllIsomorphismsIterator( G, H ); if IsDoneIterator( iter ) then return 0; fi; n := 0; for iso in iter do n := n+1; od; return n; end ); ############################################################################## ## #M AllSubgroupsIterator . . . . . . . . . . . . . . . . . . . . . for a group #M DoAllSubgroupsIterator . . . . . . . . . . . . . . . . . . . . for a group ## BindGlobal( "NextIterator_AllSubgroups", function ( iter ) local class, i; if IsDoneIterator( iter!.subgpIterator ) then class := NextIterator( iter!.classIterator ); iter!.class := class; iter!.subgpIterator := IteratorList( [1..Size(class)] ); fi; i := NextIterator( iter!.subgpIterator ); return iter!.class[i]; end ); BindGlobal( "IsDoneIterator_AllSubgroups", iter -> IsDoneIterator( iter!.classIterator ) and IsDoneIterator( iter!.subgpIterator ) ); BindGlobal( "ShallowCopy_AllSubgroups", iter -> rec( class := iter!.class, classIterator := ShallowCopy( iter!.classIterator ), subgpIterator := ShallowCopy( iter!.subgpIterator ) ) ); BindGlobal( "DoAllSubgroupsIterator", function( G ) local lat, ccs, classIterator, subgpIterator, iter; lat := LatticeSubgroups( G ); ccs := ConjugacyClassesSubgroups( lat ); classIterator := IteratorList( ccs ); subgpIterator := 0; iter := IteratorByFunctions( rec( class := 0, classIterator := ShallowCopy( classIterator ), subgpIterator := IteratorList( [ ] ), NextIterator := NextIterator_AllSubgroups, IsDoneIterator := IsDoneIterator_AllSubgroups, ShallowCopy := ShallowCopy_AllSubgroups ) ); return iter; end ); InstallMethod( AllSubgroupsIterator, "for a group", [ IsGroup ], 0, function( G ) return DoAllSubgroupsIterator( G ); end ); ############################################################################## ## #M CartesianIterator . . . . . . . . . . . . . . . . . . . for two iterators #M DoCartesianIterator . . . . . . . . . . . . . . . . . . for two iterators ## BindGlobal( "NextIterator_CartesianIterator", function ( iter ) local first, second; if IsDoneIterator( iter!.Iterator2Copy ) then iter!.Iterator2Copy := ShallowCopy( iter!.Iterator2 ); first := NextIterator( iter!.Iterator1 ); iter!.first := first; else first := iter!.first; fi; second := NextIterator( iter!.Iterator2Copy ); return [ first, second ]; end ); BindGlobal( "IsDoneIterator_CartesianIterator", iter -> IsDoneIterator( iter!.Iterator1 ) and IsDoneIterator( iter!.Iterator2Copy ) ); BindGlobal( "ShallowCopy_CartesianIterator", iter -> rec( first := iter!.first, Iterator1 := ShallowCopy( iter!.Iterator1 ), Iterator2 := ShallowCopy( iter!.Iterator2 ), Iterator2Copy := ShallowCopy( iter!.Iterator2Copy ) ) ); BindGlobal( "DoCartesianIterator", function( iter1, iter2 ) local iter; if IsDoneIterator( iter1 ) or IsDoneIterator( iter2 ) then return IteratorList( [ ] ); fi; iter := IteratorByFunctions( rec( first := 0, Iterator1 := ShallowCopy( iter1 ), Iterator2 := ShallowCopy( iter2 ), Iterator2Copy := IteratorList( [ ] ), NextIterator := NextIterator_CartesianIterator, IsDoneIterator := IsDoneIterator_CartesianIterator, ShallowCopy := ShallowCopy_CartesianIterator ) ); return iter; end ); InstallMethod( CartesianIterator, "for two iterators", [ IsIterator, IsIterator ], 0, function( iter1, iter2 ) return DoCartesianIterator( iter1, iter2 ); end ); ############################################################################## ## #M UnorderedPairsIterator . . . . . . . . . . . . . . . . . . for an iterator #M DoUnorderedPairsIterator . . . . . . . . . . . . . . . . . for an iterator ## BindGlobal( "NextIterator_UnorderedPairs", function ( iter ) local first, second; if ( iter!.pos1 = iter!.pos2 ) then iter!.Iterator1Copy := ShallowCopy( iter!.Iterator1 ); iter!.pos1 := 0; second := NextIterator( iter!.Iterator2 ); iter!.pos2 := iter!.pos2 + 1; iter!.second := second; else second := iter!.second; fi; first := NextIterator( iter!.Iterator1Copy ); iter!.pos1 := iter!.pos1 + 1; return [ first, second ]; end ); BindGlobal( "IsDoneIterator_UnorderedPairs", iter -> IsDoneIterator( iter!.Iterator2 ) and IsDoneIterator( iter!.Iterator1Copy ) ); BindGlobal( "ShallowCopy_UnorderedPairs", iter -> rec( pos1 := iter!.pos1, pos2 := iter!.pos2, second := iter!.second, Iterator1 := ShallowCopy( iter!.Iterator1 ), Iterator2 := ShallowCopy( iter!.Iterator2 ), Iterator1Copy := ShallowCopy( iter!.Iterator1Copy ) ) ); BindGlobal( "DoUnorderedPairsIterator", function( iter0 ) local iter; if IsDoneIterator( iter0 ) then return IteratorList( [ ] ); fi; iter := IteratorByFunctions( rec( pos1 := 0, pos2 := 0, second := 0, Iterator1 := ShallowCopy( iter0 ), Iterator2 := ShallowCopy( iter0 ), Iterator1Copy := ShallowCopy( iter0 ), NextIterator := NextIterator_UnorderedPairs, IsDoneIterator := IsDoneIterator_UnorderedPairs, ShallowCopy := ShallowCopy_UnorderedPairs ) ); return iter; end ); InstallMethod( UnorderedPairsIterator, "for an iterator", [ IsIterator ], 0, function( iter0 ) return DoUnorderedPairsIterator( iter0 ); end ); utils-0.93/lib/print.gi0000644000175100017510000001117115105376105014442 0ustar runnerrunner############################################################################# ## #W print.gi GAP4 package `Utils' Chris Wensley ## #Y Copyright (C) 2015-2025, The GAP Group ############################################################################# ## these operations have not been transferred from any other package ## #M PrintSelection( ) #M PrintSelectionFromList( , , , ) #M PrintSelectionFromIterator( , , , ) ## BindGlobal( "PrintSelection", function( arg ) local nargs, obj, first, step, last, L, ok; nargs := Length( arg ); obj := arg[1]; if ( ( nargs = 1 ) or ( nargs > 4 ) ) then Error( "expecting 2, 3 or 4 arguments" ); elif ( nargs = 2 ) then L := arg[2]; if IsList( L ) then ok := ForAll( L, IsPosInt ); if not ok then Error( "L must only contain positive integers" ); fi; if IsList( obj ) then PrintSelectionFromListByList( obj, L ); elif IsIterator( obj ) then PrintSelectionFromIteratorByList( obj, L ); else PrintSelectionFromIteratorByList( Iterator( obj ), L ); fi; else Error( "second argument not a list" ); fi; else first := arg[2]; step := arg[3]; if ( nargs = 3 ) then if IsList( obj ) then last := Length( obj ); else last := infinity; fi; else last := arg[4]; fi; if IsList( obj ) then PrintSelectionFromList( obj, first, step, last ); elif IsIterator( obj ) then PrintSelectionFromIterator( obj, first, step, last ); else PrintSelectionFromIterator( Iterator( obj ), first, step, last ); fi; fi; end ); InstallMethod( PrintSelectionFromList, "generic method for lists", true, [ IsList, IsPosInt, IsPosInt, IsPosInt ], 0, function( L, first, step, last ) local len, i; len := Minimum( Length( L ), last ); if ( first <= len ) then Print( first, " : ", L[first], "\n" ); len := len-first; i := first; while ( len >= step ) do i := i+step; Print( i, " : ", L[i], "\n" ); len := len-step; od; fi; end ); InstallOtherMethod( PrintSelectionFromIterator, "generic method for iterators", true, [ IsIterator, IsPosInt, IsPosInt, IsAdditiveElement ], 0, function( iter0, first, step, last ) local iter, pos, i, x; if ( last < first ) then Error( "expecting first <= last" ); fi; iter := ShallowCopy( iter0 ); i := 0; while( ( i < first ) and not IsDoneIterator( iter ) ) do i := i+1; x := NextIterator( iter ); od; if ( i = first ) then pos := first; Print( pos, " : ", x, "\n" ); fi; while ( not IsDoneIterator( iter ) and ( pos < last ) ) do while ( not IsDoneIterator( iter ) and ( pos < last ) ) do i := 0; while( ( i ). The extension of the input file must ## be *.log. The name of the output file is the same as the one of the ## input file except that the extension *.log is replaced by *.html. ## ## - Adapt the style file rcwa/doc/gaplog.css to your taste. ## DeclareGlobalName( "Log2HTML" ); ############################################################################# ## #E files.gd . . . . . . . . . . . . . . . . . . . . . . . . . . . ends here utils-0.93/lib/lcset.gd0000644000175100017510000000264215105376105014416 0ustar runnerrunner############################################################################## ## #W lcset.gd GAP4 package `Utils' Chris Wensley ## #Y Copyright (C) 2015-2025, The GAP Group ############################################################################# ## #C IsLeftCoset( ) . . . . . . . . . . . . . . coset of the form gU #R IsLeftCosetDefaultRep #V IsLeftCosetFamily #T IsLeftCosetType ## DeclareCategory( "IsLeftCoset", IsDomain and IsExternalOrbit ); DeclareRepresentation( "IsLeftCosetDefaultRep", IsComponentObjectRep and IsAttributeStoringRep and IsLeftCoset, [ "Representative", "ActingDomain" ] ); BindGlobal( "IsLeftCosetFamily", NewFamily( "IsLeftCosetFamily", IsMultiplicativeElementWithInverse ) ); BindGlobal( "IsLeftCosetType", NewType( IsLeftCosetFamily, IsLeftCosetDefaultRep ) ); ############################################################################# ## #O LeftCoset( , ) . . . . . . . element g acts on the left of group U ## DeclareOperation( "LeftCoset", [ IsObject, IsGroup ] ); ############################################################################# ## #O LeftCosets( , ) . . . . . . . . . . . . . . . cosets gU for g in G #O LeftCosetsNC( , ) . . . . . . . . . . . . . . cosets gU for g in G ## DeclareGlobalName( "LeftCosets" ); DeclareOperation( "LeftCosetsNC", [ IsGroup, IsGroup ] ); utils-0.93/lib/magma.gi0000644000175100017510000002034115105376105014367 0ustar runnerrunner############################################################################# ## #W magma.gi GAP4 package `Utils' Max Horn ## Alexander Hulpke ## Frank LĂĽbeck #Y Copyright (C) 2015-2025, The GAP Group ############################################################################# ## #F ConvertToMagmaInputString( ) . . output a string readable by Magma ## BindGlobal( "ConvertToMagmaInputString", function ( arg ) local len, obj, s, str; len := Length( arg ); obj := arg[1]; if not IsGroup( obj ) then Error( "input obj should be a group" ); elif IsPcGroup( obj ) then str := PcGroupToMagmaFormat( obj ); elif IsPermGroup( obj ) then str := PermGroupToMagmaFormat( obj ); elif IsMatrixGroup( obj ) then str := MatrixGroupToMagmaFormat( obj ); elif IsFpGroup( obj ) then Print( "no conversion function yet available for fp-groups\n" ); return fail; ## str := FpGroupToMagmaFormat( obj ); else Print( "no conversion function yet available for this group\n" ); return fail; fi; if ( len > 1 ) then s := arg[2]; if IsMatrixGroup( obj ) then str := ReplacedString( str, "sub", Concatenation(s," := sub") ); else str := Concatenation( s, " := ", str ); fi; fi; return str; end ); ############################################################################# ## this function was originally authored by Alexander Hulpke; ## has been transferred from other.gi in the main library; ## and was originally named MagmaInputString ## InstallMethod( PermGroupToMagmaFormat, "perm group", true, [IsPermGroup], 0, function( g ) local s, i, nf; ## s := ShallowCopy(s); ## Append(s,":=PermutationGroup<"); s := "PermutationGroup<"; Append( s, String( LargestMovedPoint(g) ) ); Add( s, '|' ); nf := false; for i in GeneratorsOfGroup(g) do if nf then Append( s, ",\n" ); fi; nf:=true; Append( s, String(i) ); od; Append( s, ">;\n" ); return s; end ); ############################################################################# ## this function was private code of Max Horn ## InstallMethod( PcGroupToMagmaFormat, "pc-group", true, [IsPcGroup], 0, function(G) local str, g, n, r, gens, rels, i, j; g := Pcgs(G); n := Length(g); r := RelativeOrders(g); gens := List(g,String); str := "PolycyclicGroup< "; Append(str, JoinStringsWithSeparator(gens)); Append(str, " |\n"); rels := []; for i in [1..n] do if r[i] = 0 then continue; fi; if IsOne(g[i]^r[i]) then Add(rels, Concatenation(String(g[i]), "^", String(r[i]))); else Add(rels, Concatenation(String(g[i]), "^", String(r[i]), " = ", String(g[i]^r[i]))); fi; od; for i in [2..n] do for j in [1..i-1] do if g[i]*g[j] <> g[j]*g[i] then Add(rels, Concatenation(String(g[i]), "^", String(g[j]), " = ", String(g[i]^g[j]))); if r[j] = 0 then Add(rels, Concatenation(String(g[i]), "^", String(g[j]), "^-1 = ", String(g[i]^(g[j]^-1)))); fi; fi; od; od; Append(str, JoinStringsWithSeparator(rels, ",\n")); Append(str, "\n>;\n"); return str; end ); ############################################################################### ## This function has been converted from private code of Frank LĂĽbeck. ## His GapToMagma(file,mats) wrote Magma code to a file 'file' for the group ## generated by a list 'mats' of matrices over same finite field. ## In this revised form the function inputs a matrix group over a finite ## field and outputs a string which can be read by Magma. ## InstallMethod( MatrixGroupToMagmaFormat, "matrix group over a finite field", true, [ IsMatrixGroup ], 0, function(G) local mats, nr, nc, F, tab, p, q, e, w, wp, pow, zero, one, val, cpn, npl, NmrIter, FinalIter, i, j, cno, isint, matrix, str; mats := GeneratorsOfGroup( G ); F := Field( Flat( mats ) ); if not IsFinite( F ) then TryNextMethod(); fi; p := Characteristic( F ); e := DegreeOverPrimeField( F ); q := Size( F ); w := PrimitiveRoot( F ); zero := Zero( F ); one := One( F ); matrix := mats[1]; nr := Length( matrix ); nc := Length( matrix[1] ); str := Concatenation( "F := ", String(F), ";\n" ); Append( str, Concatenation( "P := GL(", String(nr), ",F);\n" ) ); matrix := mats; if ( e > 1 ) then Append( str, "w := PrimitiveElement(F);\n" ); fi; pow := (q-1)/(p-1); wp := w^pow; tab := [ ]; for i in [1..p-1] do tab[ LogFFE( i*one, wp ) + 1 ] := i; od; if ( p < 10 ) then cpn := 3; elif ( p < 100 ) then cpn := 4; elif ( p < 1000 ) then cpn := 5; elif ( p < 10000 ) then cpn := 6; else cpn := 7; fi; if ( e > 1 ) then cpn := cpn + 2; fi; npl := Int(76/(cpn)); ## should be 78, but it overflowed. Append( str, "gens := [\n"); FinalIter := Length( mats ); NmrIter := 0; for matrix in mats do NmrIter := NmrIter + 1; nr := Length( matrix ); nc := Length( matrix[1] ); Append( str, "P![" ); for i in [1..nr] do cno := 0; for j in [1..nc] do if ( matrix[i][j] = zero ) then val := 0; isint := true; else val := LogFFE( matrix[i][j], w ); if ( val mod pow = 0 ) then val := tab[ LogFFE( matrix[i][j], wp ) + 1]; isint := true; else isint := false; fi; fi; if ( q<10 ) or ( q<100 and val>=10 ) or ( q<1000 and val>=100 ) or ( q<10000 and val>=1000 ) or ( val>=10000 ) then if not (i = 1 and j = 1) then Append( str, "," ); fi; elif ( q<100 ) or ( q<1000 and val>=10 ) or ( q<10000 and val>=100 ) or ( val>=1000 ) then if not (i = 1 and j = 1) then Append( str, " , " ); fi; elif ( q<1000 ) or ( q<10000 and val>=10 ) or ( val>=100 ) then if not (i = 1 and j = 1) then Append( str, " , " ); fi; elif ( q<10000 ) or ( val>=10 ) then if not (i = 1 and j = 1) then Append( str, " , " ); fi; else if not (i = 1 and j = 1) then Append( str, " , " ); fi; fi; if ( e > 1 ) then if isint then Append( str, " " ); else Append( str, "w^" ); fi; fi; Append( str, String(val) ); cno := cno+1; if ( cno>=npl and j FinalIter ) then Append( str, "],\n" ); else Append( str, "]\n" ); fi; od; Append( str, "];\n" ); Append( str, "sub

;\n" ); return str; end ); ############################################################################# ## #E magma.gi . . . . . . . . . . . . . . . . . . . . . . . . . . . ends here utils-0.93/lib/files.gi0000644000175100017510000000701515105376105014412 0ustar runnerrunner############################################################################# ## #W files.gi GAP4 package `Utils' Sebastian Gutsche ## Max Horn ## Stefan Kohl #Y Copyright (C) 2015-2025, The GAP Group, ############################################################################# ## this function has been transferred from RCWA ## #F Log2HTML ( logfilename ) . . . . convert GAP logfile to XHTML 1.0 Strict ## BindGlobal( "Log2HTML", function ( logfilename ) local outputname, s1, s2, header, footer, pos, lastlf, nextlf, crlf, prompt; if ARCH_IS_UNIX() then crlf := 1; else crlf := 2; fi; header := Concatenation( "\n\n", "\n\n\n\n ", logfilename, " \n \n", "\n\n\n\n

\n");
    footer := "
"; s1 := StringFile( logfilename ); pos := PositionSublist( s1, "gap>" ); prompt := "gap> "; s2 := ReplacedString( s1{[1..pos-1]}, "<", "<" ); while pos <> fail do s2 := Concatenation(s2,"",prompt,""); s2 := Concatenation(s2,""); nextlf := Position(s1,'\n',pos); prompt := "gap>"; if nextlf = fail then nextlf := Length(s1); fi; s2 := Concatenation(s2,ReplacedString(s1{[pos+5..nextlf-crlf]}, "<","<"),""); while nextlf < Length(s1) and s1[nextlf+1] = '>' do s2 := Concatenation(s2,"\n>", ""); lastlf := nextlf; nextlf := Position(s1,'\n',lastlf); if nextlf = fail then nextlf := Length(s1); fi; s2 := Concatenation(s2,ReplacedString(s1{[lastlf+2..nextlf-crlf]}, "<","<"),""); od; s2 := Concatenation( s2, "\n" ); pos := PositionSublist( s1, "\ngap>", nextlf-1 ); if pos = fail then pos := Length(s1); fi; if pos > nextlf then s2 := Concatenation(s2,"", ReplacedString( s1{[nextlf+1..pos-crlf]}, "<", "<"), "\n" ); fi; if pos > Length(s1) - 3 then break; fi; od; s2 := Concatenation( header, s2, footer ); logfilename := LowercaseString( logfilename ); if ( PositionSublist(logfilename,".log") <> fail ) then outputname := ReplacedString( logfilename, ".log", ".html" ); elif ( PositionSublist( logfilename, ".txt" ) <> fail ) then outputname := ReplacedString( logfilename, ".txt", ".html" ); else outputname := Concatenation( logfilename, ".html" ); fi; FileString( outputname, s2 ); end ); ############################################################################# ## #E files.gi . . . . . . . . . . . . . . . . . . . . . . . . . . . ends here utils-0.93/lib/groups.gd0000644000175100017510000000415015105376105014617 0ustar runnerrunner############################################################################## ## #W groups.gd GAP4 package `Utils' Stefan Kohl ## #Y Copyright (C) 2015-2025, The GAP Group ############################################################################# ## this function has been transferred from ResClasses ## #O IsCommuting(
, ) . checks whether two group elements etc. commute ## DeclareOperation( "IsCommuting", [ IsMultiplicativeElement, IsMultiplicativeElement ] ); ############################################################################# ## these functions have been transferred from ResClasses ## #A UpperFittingSeries( ) . . . . . . . . . . upper fitting series of #A LowerFittingSeries( ) . . . . . . . . . . lower fitting series of #A FittingLength( ) . . . . . . . . . . . . . . . fitting length of ## ## The upper and lower Fitting series and the Fitting length of a solvable ## group, as described here: https://en.wikipedia.org/wiki/Fitting_length ## if not IsBound( UpperFittingSeries ) then DeclareAttribute( "UpperFittingSeries", IsGroup ); fi; if not IsBound( LowerFittingSeries ) then DeclareAttribute( "LowerFittingSeries", IsGroup ); fi; if not IsBound( FittingLength ) then DeclareAttribute( "FittingLength", IsGroup ); fi; ############################################################################# ## this function has been transferred from RCWA ## #F ListOfPowers( , ) . . . . . . list of powers ^1 .. ^ ## DeclareGlobalName( "ListOfPowers" ); ############################################################################# ## this function has been transferred from RCWA ## #O GeneratorsAndInverses( ) list of generators of and their inverses #M GeneratorsAndInverses( ) . . . . . . . . . . . . . . . . . for groups ## DeclareOperation( "GeneratorsAndInverses", [ IsMagmaWithInverses ] ); ############################################################################# ## #E groups.gd . . . . . . . . . . . . . . . . . . . . . . . . . . . ends here utils-0.93/lib/number.gd0000644000175100017510000000471715105376105014601 0ustar runnerrunner############################################################################## ## #W number.gd GAP4 package `Utils' Stefan Kohl ## #Y Copyright (C) 2015-2025, The GAP Group ############################################################################# ## this function has been transferred from RCWA ## #F NextProbablyPrimeInt( ) . . next integer passing `IsProbablyPrimeInt' ## ## Returns the smallest integer larger than which passes GAP's ## probabilistic primality test. ## ## The function `NextProbablyPrimeInt' does the same as `NextPrimeInt', ## except that for reasons of performance it tests numbers only for ## `IsProbablyPrimeInt' instead of `IsPrimeInt'. ## For large , this function is much faster than `NextPrimeInt'. ## DeclareGlobalName( "NextProbablyPrimeInt" ); ############################################################################# ## this function has been transferred from RCWA ## #F AllSmoothIntegers( , ) ## ## Returns the set of all integers in the range [1..] which have only ## prime divisors in the range [2..]. ## DeclareGlobalName( "AllSmoothIntegers" ); ############################################################################# ## this function has been transferred from RCWA ## #F PrimeNumbersIterator( ) #F PrimeNumbersIterator( chunksize ) ## ## Iterator running through the prime numbers in ascending order. ## DeclareGlobalName( "PrimeNumbersIterator" ); ############################################################################# ## this function has been transferred from RCWA ## #F RestrictedPartitionsWithoutRepetitions( , ) ## ## Given a positive integer n and a set of positive integers S, this func- ## tion returns a list of all partitions of n into distinct elements of S. ## The only difference to `RestrictedPartitions' is that no repetitions are ## allowed. ## DeclareGlobalName( "RestrictedPartitionsWithoutRepetitions" ); ############################################################################# ## this function has been transferred from RCWA ## #O AllProducts( , ) . . all products of -tuples of elements of #M AllProducts( , ) . . . . . . . . . . . . . . . . . . . . for lists ## DeclareOperation( "AllProducts", [ IsListOrCollection, IsPosInt ] ); ############################################################################# ## #E number.gd . . . . . . . . . . . . . . . . . . . . . . . . . . . ends here utils-0.93/lib/print.gd0000644000175100017510000000164015105376105014435 0ustar runnerrunner############################################################################## ## #W print.gd GAP4 package `Utils' Chris Wensley ## #Y Copyright (C) 2015-2025, The GAP Group ############################################################################## ## added global function and methods to print subsets of lists/iterators ## DeclareGlobalName( "PrintSelection" ); DeclareOperation( "PrintSelectionFromList", [ IsList, IsPosInt, IsPosInt, IsPosInt ] ); DeclareOperation( "PrintSelectionFromIterator", [ IsIterator, IsPosInt, IsPosInt, IsAdditiveElement ] ); DeclareOperation( "PrintSelectionFromListByList", [ IsList, IsList ] ); DeclareOperation( "PrintSelectionFromIteratorByList", [ IsIterator, IsList ] ); ############################################################################# ## #E print.gd . . . . . . . . . . . . . . . . . . . . . . . . . . . ends here utils-0.93/lib/start.gd0000644000175100017510000000455215105376105014443 0ustar runnerrunner############################################################################## ## #W start.gd GAP4 package `Utils' Chris Wensley ## #Y Copyright (C) 2015-2022, The GAP Group DeclareInfoClass( "InfoUtils" ); ## these version numbers refer to the latest package releases ## containing the code which is to be transferred UtilsPackageVersions := [ "autodoc", "2016.01.31", ## latest is 2017.09.08 "resclasses", "4.2.5", ## latest is 4.7.1, 18/12/17 "rcwa", "4.1.5" ## latest is 4.6.2, 26/06/18 ]; ## (04/09/18) removed QPA from this list - no functions transferred ## (02/06/18) removed xmod from this list ## functions being transferred cannot be used until the Home packages have ## been loaded: when this has been done the following variable is set true UtilsLoadingComplete := false; ############################################################################# ## #F OKtoReadFromUtils( ) . . . tests whether name still contains the ## code to be transferred to Utils #F OKtoReadFromUtilsSpec( , ) . . . special case of above ## BindGlobal( "OKtoReadFromUtils", function( Name ) local name, ver, ver0, pos, ok; name := LowercaseString( Name ); pos := Position( UtilsPackageVersions, name ); if ( pos = fail ) then Error( "package 'name' not in the list UtilsPackageVersions" ); fi; ver0 := UtilsPackageVersions[ pos+1 ]; ver := InstalledPackageVersion( name ); ok := ( ( ver = fail ) ## name is not installed on the system or ( ver > ver0 ) ); ## name still contains the code return ok; end ); BindGlobal( "OKtoReadFromUtilsSpec", function( Name, oldver ) local name, ver, pos, ok; name := LowercaseString( Name ); pos := Position( UtilsPackageVersions, name ); if ( pos = fail ) then Error( "package 'name' not in the list UtilsPackageVersions" ); fi; ver := InstalledPackageVersion( name ); ok := ( ( ver = fail ) ## name is not installed on the system or ( ver > oldver ) ); ## name still contains the code return ok; end ); ############################################################################# ## #E start.gd . . . . . . . . . . . . . . . . . . . . . . . . . . . ends here utils-0.93/README.md0000644000175100017510000000345615105376105013505 0ustar runnerrunner[![CI](https://github.com/gap-packages/utils/actions/workflows/CI.yml/badge.svg)](https://github.com/gap-packages/utils/actions/workflows/CI.yml) [![Code Coverage](https://codecov.io/github/gap-packages/utils/coverage.svg?branch=master&token=)](https://codecov.io/gh/gap-packages/utils) # The GAP 4 package `Utils` ## Introduction This package collects together utility functions from a selection of GAP packages in order to make them more widely visible to other package authors. Other generally useful functions, which are not deemed suitable for the main library, and also welcome. For example, recent additions are functions to convert certain types of group to Magma format. ## Distribution * The GitHub package repository is at * and the latest release is available at ## Copyright The `Utils` package is Copyright © The GAP Group, 2015-2025. `Utils` is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. For details, see ## Installation * unpack `utils-.tar.gz` in the `pkg` subdirectory of the GAP root directory. * From within GAP load the package with: ``` gap> LoadPackage("utils"); true ``` * The file `manual.pdf` is in the `doc` subdirectory. ## Contact If you have a question relating to `Utils`, encounter any problems, or wish to suggest other functions to be transferred to the package, please * email: * or report an issue on the GitHub issue tracker at: utils-0.93/LICENSE.txt0000644000175100017510000004310315105376105014042 0ustar runnerrunner GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. utils-0.93/tst/0000755000175100017510000000000015105376105013030 5ustar runnerrunnerutils-0.93/tst/groups.tst0000644000175100017510000002126615105376105015112 0ustar runnerrunner#@local A, a, ac9, aq8, b, c, c1, c2, c2c6, c3, c4, c4c3, c6, c9 #@local cp1, cp2, cp3, d, D12, d8, data, dp, epi, f, f1, f2, G, g #@local g1, g2, g3, genA, gens, i, idcopy, idem, idemc2, idemim, idemim2 #@local im2, image2, images, imi, info, info2, info3, lc1, lc2, lc3, lc4 #@local len, lfs, ok, Pfi, phi, q8, rc1, rc4, s3, S4, s4, UFS, ufs ############################################################################## ## #W groups.tst Utils Package ## #Y Copyright (C) 2015-2022, The GAP Group ## gap> ReadPackage( "utils", "tst/loadall.g" );; gap> UtilsLoadingComplete; true ## SubSection 5.1.1 gap> Comm( [ (1,2), (2,3) ] ); (1,2,3) gap> Comm( [(1,2),(2,3),(3,4),(4,5),(5,6)] ); (1,5,6) gap> Comm(Comm(Comm(Comm((1,2),(2,3)),(3,4)),(4,5)),(5,6)); ## the same (1,5,6) ## SubSection 5.1.2 gap> D12 := DihedralGroup( 12 ); gap> SetName( D12, "D12" ); gap> a := D12.1;; b := D12.2;; gap> IsCommuting( a, b ); false ## SubSection 5.1.3 gap> ListOfPowers( 2, 20 ); [ 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 1048576 ] gap> ListOfPowers( (1,2,3)(4,5), 12 ); [ (1,2,3)(4,5), (1,3,2), (4,5), (1,2,3), (1,3,2)(4,5), (), (1,2,3)(4,5), (1,3,2), (4,5), (1,2,3), (1,3,2)(4,5), () ] gap> ListOfPowers( D12.2, 6 ); [ f2, f3, f2*f3, f3^2, f2*f3^2, of ... ] ## SubSection 5.1.4 gap> GeneratorsAndInverses( D12 ); [ f1, f2, f3, f1, f2*f3^2, f3^2 ] gap> GeneratorsAndInverses( SymmetricGroup(5) ); [ (1,2,3,4,5), (1,2), (1,5,4,3,2), (1,2) ] ## SubSection 5.1.5 gap> UFS := UpperFittingSeries( D12 );; gap> Set( GeneratorsOfGroup( UFS[2] ) ); [ f3, f2*f3 ] gap> Set( GeneratorsOfGroup( UFS[3] ) ); [ f1, f3, f2*f3 ] gap> LowerFittingSeries( D12 ); [ D12, Group([ f3 ]), Group([ ]) ] gap> FittingLength( D12 ); 2 gap> S4 := SymmetricGroup( 4 );; gap> ufs := UpperFittingSeries( S4 );; gap> List( ufs, StructureDescription ); [ "1", "C2 x C2", "A4", "S4" ] gap> lfs := LowerFittingSeries( S4 );; gap> List( lfs, StructureDescription ); [ "S4", "A4", "C2 x C2", "1" ] gap> FittingLength( S4); 3 ## SubSection 5.2.1 gap> lc1 := LeftCoset( (1,2,3), Group( [ (1,2), (3,4) ] ) ); LeftCoset((1,2,3),Group([ (1,2), (3,4) ])) gap> Representative( lc1 ); (1,2,3) gap> ActingDomain( lc1 ); Group([ (1,2), (3,4) ]) gap> AsSet( lc1 ); [ (2,3), (2,4,3), (1,2,3), (1,2,4,3) ] gap> (1,2,3) in lc1; true gap> lc2 := (2,4,3) * lc1; LeftCoset((1,2,4),Group([ (1,2), (3,4) ])) gap> lc3 := lc1^(2,3,4);; gap> lc2 = lc3; true ## SubSection 5.2.2 gap> rc1 := Inverse( lc1 ); RightCoset(Group([ (1,2), (3,4) ]),(1,3,2)) gap> rc4 := RightCoset( Group( (1,2), (2,3) ), (3,4) ); RightCoset(Group([ (1,2), (2,3) ]),(3,4)) gap> lc4 := Inverse( rc4 ); LeftCoset((3,4),Group([ (1,2), (2,3) ])) gap> Intersection( lc2, lc4 ); [ (2,3,4), (1,2,3,4) ] ## SubSection 5.3.1 gap> G := Group( (1,2,3), (3,4,5), (5,6,7), (7,8,9) );; gap> phi := EpimorphismByGenerators( FreeGroup("a","b","c","d"), G ); [ a, b, c, d ] -> [ (1,2,3), (3,4,5), (5,6,7), (7,8,9) ] gap> PreImagesRepresentativeNC( phi, (1,2,3,4,5,6,7,8,9) ); d*c*b*a gap> a := G.1;; b := G.2;; c := G.3;; d := G.4;; gap> d*c*b*a; (1,2,3,4,5,6,7,8,9) gap> ## note that it is easy to produce nonsense: gap> epi := EpimorphismByGenerators( Group((1,2,3)), Group((8,9)) ); Warning: calling GroupHomomorphismByImagesNC without checks [ (1,2,3) ] -> [ (8,9) ] gap> IsGroupHomomorphism( epi ); true gap> Image(epi,(1,2,3)); () gap> Image(epi,(1,3,2)); (8,9) ## SubSection 5.3.2 gap> s4 := Group( (1,2),(2,3),(3,4) );; gap> s3 := Group( (5,6),(6,7) );; gap> c3 := Subgroup( s3, [ (5,6,7) ] );; gap> f := GroupHomomorphismByImages( s4, s3, > [(1,2),(2,3),(3,4)], [(5,6),(6,7),(5,6)] );; gap> i := GroupHomomorphismByImages( c3, s3, [(5,6,7)], [(5,6,7)] );; gap> Pfi := Pullback( f, i ); Group([ (2,3,4)(5,7,6), (1,2)(3,4) ]) gap> StructureDescription( Pfi ); "A4" gap> info := PullbackInfo( Pfi ); rec( directProduct := Group([ (1,2), (2,3), (3,4), (5,6,7) ]), projections := [ [ (2,3,4)(5,7,6), (1,2)(3,4) ] -> [ (2,3,4), (1,2)(3,4) ], [ (2,3,4)(5,7,6), (1,2)(3,4) ] -> [ (5,7,6), () ] ] ) gap> g := (1,2,3)(5,6,7);; gap> ImageElm( info!.projections[1], g ); (1,2,3) gap> ImageElm( info!.projections[2], g ); (5,6,7) gap> dp := info!.directProduct;; gap> a := ImageElm( Embedding( dp, 1 ), (1,4,3) );; gap> b := ImageElm( Embedding( dp, 2 ), (5,7,6) );; gap> a*b in Pfi; true ## SubSection 5.3.3 gap> g1 := DihedralGroup( 8 ); gap> c1 := Centre( g1 ); Group([ f3 ]) gap> cp1 := CentralProduct( g1, g1, c1, IdentityMapping( c1 ) ); Group([ f1, f2, f5, f3, f4, f5 ]) gap> IdGroup( cp1 ) = IdGroup( ExtraspecialGroup( 2^5, "+" ) ); true gap> g2 := QuaternionGroup( 8 ); gap> c2 := Centre( g2 ); Group([ y2 ]) gap> cp2 := CentralProduct( g2, g2, c2, IdentityMapping( c2 ) ); Group([ f1, f2, f5, f3, f4, f5 ]) gap> IdGroup( cp2 ) = IdGroup( ExtraspecialGroup( 2^5, "+" ) ); true gap> info2 := CentralProductInfo( cp2 ); rec( phi := IdentityMapping( Group([ y2 ]) ), projection := [ f1, f2, f3, f4, f5, f6 ] -> [ f1, f2, f5, f3, f4, f5 ] ) gap> Source( Embedding( Source( info2.projection ), 1 ) ) = g2; true gap> g3 := SymmetricGroup( 3 ); Sym( [ 1 .. 3 ] ) gap> c3 := TrivialSubgroup( g3 ); Group(()) gap> cp3 := CentralProduct( g3, g3, c3, IdentityMapping( c3 ) ); Group([ (1,2,3), (1,2), (4,5,6), (4,5) ]) gap> info3 := CentralProductInfo( cp3 ); rec( phi := IdentityMapping( Group(()) ), projection := IdentityMapping( Group([ (1,2,3), (1,2), (4,5,6), (4,5) ]) ) ) gap> Source( Embedding( Source( info3.projection ), 1 ) ) = g3; true ## SubSection 5.3.4 gap> gens := [ (1,2,3,4), (1,2)(3,4) ];; gap> d8 := Group( gens );; gap> SetName( d8, "d8" ); gap> c2 := Subgroup( d8, [ (2,4) ] );; gap> idemc2 := IdempotentEndomorphismsWithImage( gens, c2 );; gap> idcopy := [ [ (), (2,4) ], [ (2,4), () ] ];; gap> Sort( idemc2 ); gap> Sort( idcopy ); gap> idemc2 = idcopy; true gap> ## depending on packages loaded, the order of images can vary gap> ## so we introduce a convoluted way of checking the images gap> data := IdempotentEndomorphismsData( d8 );; gap> data!.gens; [ (1,2,3,4), (1,2)(3,4) ] gap> images := data!.images;; gap> len := Length( images ); 6 gap> image2 := [ [ [ (), () ] ], [ [ (), (2,4) ], [ (2,4), () ] ], > [ [ (), (1,3) ], [ (1,3), () ] ], > [ [ (), (1,2)(3,4) ], [ (1,2)(3,4), (1,2)(3,4) ] ], > [ [ (), (1,4)(2,3) ], [ (1,4)(2,3), (1,4)(2,3) ] ], > [ [ (1,2,3,4), (1,2)(3,4) ] ] ];; gap> ok := true;; gap> ## new in gapdev - the test 'im in im2' is parsed before the for loop gap> ## so that im2 is an 'unbound global variable' if not declared first gap> im2 := [ ];; gap> for i in [1..len] do > imi := images[i]; > im2 := image2[i]; > if not ForAll( imi, im -> ( im in im2 ) ) then > ok := false; > fi; > od; gap> ok; true gap> List( images, L -> Length(L) ); [ 1, 2, 2, 2, 2, 1 ] gap> idem := IdempotentEndomorphisms( d8 );; gap> idemim := List( idem, m -> MappingGeneratorsImages(m)[2] );; gap> idemim2 := > [ [ (), () ], [ (), (2,4) ], [ (2,4), () ], [ (), (1,3) ], [ (1,3), () ], > [ (), (1,2)(3,4) ], [ (1,2)(3,4), (1,2)(3,4) ], [ (), (1,4)(2,3) ], > [ (1,4)(2,3), (1,4)(2,3) ], [ (1,2,3,4), (1,2)(3,4) ] ];; gap> ForAll( idemim, m -> ( m in idemim2 ) ); true ## SubSection 5.3.5 gap> c4 := Group( (1,2,3,4) );; gap> c2 := Group( (5,6) );; gap> f1 := GroupHomomorphismByImages( c4, c2, [(1,2,3,4)], [(5,6)] );; gap> c3 := Group( (1,2,3) );; gap> c6 := Group( (1,2,3,4,5,6) );; gap> f2 := GroupHomomorphismByImages( c3, c6, [(1,2,3)], [(1,3,5)(2,4,6)] );; gap> c4c3 := DirectProduct( c4, c3 ); Group([ (1,2,3,4), (5,6,7) ]) gap> c2c6 := DirectProduct( c2, c6 ); Group([ (1,2), (3,4,5,6,7,8) ]) gap> f := DirectProductOfFunctions( c4c3, c2c6, f1, f2 ); [ (1,2,3,4), (5,6,7) ] -> [ (1,2), (3,5,7)(4,6,8) ] gap> ImageElm( f, (1,4,3,2)(5,7,6) ); (1,2)(3,7,5)(4,8,6) ## SubSection 5.3.6 gap> c9 := Group( (1,2,3,4,5,6,7,8,9) );; gap> ac9 := AutomorphismGroup( c9 );; gap> q8 := QuaternionGroup( IsPermGroup, 8 );; gap> aq8 := AutomorphismGroup( q8 );; gap> A := DirectProductOfAutomorphismGroups( ac9, aq8 ); gap> genA := GeneratorsOfGroup( A );; gap> G := Source( genA[1] ); Group([ (1,2,3,4,5,6,7,8,9), (10,14,12,16)(11,17,13,15), (10,11,12,13) (14,15,16,17) ]) gap> a := genA[1]*genA[5]; [ (1,2,3,4,5,6,7,8,9), (10,14,12,16)(11,17,13,15), (10,11,12,13)(14,15,16,17) ] -> [ (1,3,5,7,9,2,4,6,8), (10,16,12,14)(11,15,13,17), (10,11,12,13)(14,15,16,17) ] gap> ImageElm( a, (1,9,8,7,6,5,4,3,2)(10,14,12,16)(11,17,13,15) ); (1,8,6,4,2,9,7,5,3)(10,16,12,14)(11,15,13,17) utils-0.93/tst/number.tst0000644000175100017510000000542315105376105015060 0ustar runnerrunner#@local i, iter, n, p, sum ############################################################################## ## #W number.tst Utils Package Stefan Kohl ## #Y Copyright (C) 2015-2022, The GAP Group ## gap> ReadPackage( "utils", "tst/loadall.g" );; gap> UtilsLoadingComplete; true ## SubSection 4.1.1 gap> AllSmoothIntegers( 3, 1000 ); [ 1, 2, 3, 4, 6, 8, 9, 12, 16, 18, 24, 27, 32, 36, 48, 54, 64, 72, 81, 96, 108, 128, 144, 162, 192, 216, 243, 256, 288, 324, 384, 432, 486, 512, 576, 648, 729, 768, 864, 972 ] gap> AllSmoothIntegers( [5,11,17], 1000 ); [ 1, 5, 11, 17, 25, 55, 85, 121, 125, 187, 275, 289, 425, 605, 625, 935 ] gap> Length( last ); 16 gap> List( [3..20], n -> Length( AllSmoothIntegers( [5,11,17], 10^n ) ) ); [ 16, 29, 50, 78, 114, 155, 212, 282, 359, 452, 565, 691, 831, 992, 1173, 1374, 1595, 1843 ] ## SubSection 4.1.2 gap> AllProducts([1..4],3); [ 1, 2, 3, 4, 2, 4, 6, 8, 3, 6, 9, 12, 4, 8, 12, 16, 2, 4, 6, 8, 4, 8, 12, 16, 6, 12, 18, 24, 8, 16, 24, 32, 3, 6, 9, 12, 6, 12, 18, 24, 9, 18, 27, 36, 12, 24, 36, 48, 4, 8, 12, 16, 8, 16, 24, 32, 12, 24, 36, 48, 16, 32, 48, 64 ] gap> Set(last); [ 1, 2, 3, 4, 6, 8, 9, 12, 16, 18, 24, 27, 32, 36, 48, 64 ] gap> AllProducts( [(1,2,3),(2,3,4)], 2 ); [ (2,4,3), (1,2)(3,4), (1,3)(2,4), (1,3,2) ] ## SubSection 4.1.3 gap> RestrictedPartitions( 20, [4..10] ); [ [ 4, 4, 4, 4, 4 ], [ 5, 5, 5, 5 ], [ 6, 5, 5, 4 ], [ 6, 6, 4, 4 ], [ 7, 5, 4, 4 ], [ 7, 7, 6 ], [ 8, 4, 4, 4 ], [ 8, 6, 6 ], [ 8, 7, 5 ], [ 8, 8, 4 ], [ 9, 6, 5 ], [ 9, 7, 4 ], [ 10, 5, 5 ], [ 10, 6, 4 ], [ 10, 10 ] ] gap> RestrictedPartitionsWithoutRepetitions( 20, [4..10] ); [ [ 10, 6, 4 ], [ 9, 7, 4 ], [ 9, 6, 5 ], [ 8, 7, 5 ] ] gap> RestrictedPartitionsWithoutRepetitions( 10^2, List([1..10], n->n^2 ) ); [ [ 100 ], [ 64, 36 ], [ 49, 25, 16, 9, 1 ] ] ## SubSection 4.1.4 gap> n := 2^251;; gap> NextProbablyPrimeInt( n ); 3618502788666131106986593281521497120414687020801267626233049500247285301313 ## SubSection 4.1.6 gap> iter := PrimeNumbersIterator();; gap> for i in [1..100] do p := NextIterator(iter); od; gap> p; 541 gap> sum := 0;; gap> ## "prime number race" 1 vs. 3 mod 4 gap> for p in PrimeNumbersIterator() do > if p <> 2 then sum := sum + E(4)^(p-1); fi; > if sum > 0 then break; fi; > od; gap> p; 26861 ## this final example takes quite a while: use examples/number.g ## gap> sum := 0;; ## gap> ## "prime number race" 1 vs. 5 mod 8 ## gap> for p in PrimeNumbersIterator() do ## > if p mod 8 in [1,5] then sum := sum + E(4)^((p-1)/2); fi; ## > if sum > 0 then break; fi; ## > od; ## gap> p; ## 588067889 ############################################################################# ## #E number.tst . . . . . . . . . . . . . . . . . . . . . . . . . . ends here utils-0.93/tst/record.tst0000644000175100017510000000454115105376105015046 0ustar runnerrunner#@local r, defaults, PrintDimensions, mydim ############################################################################## ## #W record.tst Utils Package ## #Y Copyright (C) 2015-2022, The GAP Group ## gap> ReadPackage( "utils", "tst/loadall.g" );; gap> UtilsLoadingComplete; true ## SubSection 8.1.1 gap> r := rec( a := 1, b := 2, c := 3 );; gap> AssignGlobals( r ); The following global variables have been assigned: [ "a", "b", "c" ] gap> [ a, b, c ]; [ 1, 2, 3 ] ## SubSection 8.2.1 gap> defaults := rec( a := 1, b := 2, c := 3 );; gap> OptionRecordWithDefaults( defaults, rec( a := 6) ); rec( a := 6, b := 2, c := 3 ) gap> OptionRecordWithDefaults( defaults, rec( b := 7, c := 8 ) ); rec( a := 1, b := 7, c := 8 ) gap> OptionRecordWithDefaults( defaults, [ ] ); rec( a := 1, b := 2, c := 3 ) gap> OptionRecordWithDefaults( defaults, [ rec( c := 8 ) ] ); rec( a := 1, b := 2, c := 8 ) gap> OptionRecordWithDefaults( defaults, rec( d := 9 ) ); Error, Unknown option: d gap> OptionRecordWithDefaults( defaults, [ rec( b := 7 ), rec( c := 8 ) ] ); Error, Too many arguments for function gap> OptionRecordWithDefaults( defaults, 5 ); Error, Options should be a record gap> OptionRecordWithDefaults( defaults, [6,7,8] ); Error, Too many arguments for function gap> PrintDimensions := function( arg ) > local nargs, dim, order, V, L, len, K, i; > nargs := Length( arg ); > dim := [ arg[1]!.height, arg[1]!.width, arg[1]!.depth ]; > order := rec( h := 1, w := 2, d := 3 ); > V := [ "height", "width", "depth" ]; > if ( nargs > 1 ) and IsRecord( arg[2] ) then > order := OptionRecordWithDefaults( order, arg[2] ); > fi; > L := [ order!.h, order!.w, order!.d ]; > len := Length( L ); > K := [ 1..len ]; > SortParallel( L, K ); > Print( "dimensions: " ); > Print( V[K[1]], " = ", dim[K[1]], ", " ); > Print( V[K[2]], " = ", dim[K[2]], ", " ); > Print( V[K[3]], " = ", dim[K[3]], "\n" ); > end;; gap> mydim := rec( height := 45, width := 31, depth := 17 ); rec( depth := 17, height := 45, width := 31 ) gap> PrintDimensions( mydim ); dimensions: height = 45, width = 31, depth = 17 gap> PrintDimensions( mydim, rec( h:=3, w:=1, d:=2 ) ); dimensions: width = 31, depth = 17, height = 45 utils-0.93/tst/loadall.g0000755000175100017510000000123615105376105014615 0ustar runnerrunner############################################################################## ## #W loadall.g Utils Package Chris Wensley ## #Y Copyright (C) 2015-2016, The GAP Group ## ## first make sure that, if the transferred code has not been read, ## then the appropriate packages are loaded. if not UtilsLoadingComplete then len := Length( UtilsPackageVersions ); j := 0; while ( j < len ) do j := j+1; name := UtilsPackageVersions[j]; if not OKtoReadFromUtils( name ) then LoadPackage( name ); fi; j := j+1; od; UtilsLoadingComplete := true; fi; utils-0.93/tst/download.tst0000644000175100017510000001063015105376105015373 0ustar runnerrunner#@local meths, i, urls, pair, url, expected, res1, good1, n, file, res2, good2, contents, r, res3, good3, bad ############################################################################ ## #W download.tst Utils Package Thomas Breuer ## #Y Copyright (C) 2022, The GAP Group ## gap> ReadPackage( "utils", "tst/loadall.g" );; gap> UtilsLoadingComplete; true ## Test the available Download methods gap> meths:= List( Filtered( Download_Methods, r -> r.isAvailable() ), > ShallowCopy );; gap> for i in [ 1 .. Length( meths ) ] do > meths[i].position:= String( i ); > od; gap> urls:= [ # a http url that gets redirected to https > [ "http://www.gap-system.org/index.html", true ], > # a http url that works as such > [ "http://www.math.rwth-aachen.de/index.html", true ], > # a https url that exists > [ "https://www.gap-system.org/index.html", true ], > # a https url that does not exist > [ "https://www.gap-system.org/indexxxxx.html", false ], > ];; ## The problem is that the methods do not behave consistently ## in the case of failure. ## (Well, they even do not agree what failure means.) ## The test results depend on which methods are available at runtime, ## which makes them useless as automatic tests. ## Thus we test only working http and https urls. gap> urls:= urls{ [ 2, 3 ] };; gap> for pair in urls do > url:= pair[1]; > expected:= pair[2]; > res1:= List( meths, r -> [ r.download( url, rec() ), r.position ] );; > good1:= Filtered( res1, r -> r[1].success = true );; > if expected = false and Length( good1 ) > 0 then > Print( "success for url ", url, "?\n" ); > fi; > n:= Length( Set( good1, r -> r[1].result ) ); > if n > 1 then > Print( "different results (", n, ") for url ", url, "\n" ); > fi; > file:= Filename( DirectoryTemporary(), "test" ); > res2:= List( meths, > r -> [ r.download( url, > rec( target:= Concatenation( file, r.position ) ) ), > r.position ] );; > good2:= Filtered( res2, r -> r[1].success = true );; > if expected = false and Length( good2 ) > 0 then > Print( "success for url ", url, "?\n" ); > fi; > if List( good1, x -> x[2] ) <> List( good2, x -> x[2] ) then > Print( "different success cases for url ", url, ":\n", > List( good1, x -> x[2] ), " vs. ", List( good2, x -> x[2] ), > "\n" ); > fi; > if Length( good1 ) > 0 then > contents:= good1[1][1].result; > for r in good2 do > if contents <> StringFile( Concatenation( file, r[2] ) ) then > Print( "different files and contents for url ", url, "\n" ); > fi; > od; > fi; > res3:= List( meths, > r -> [ r.download( url, > rec( maxTime:= 10 ) ), > r.position ] );; > good3:= Filtered( res3, r -> r[1].success = true );; > if expected = false and Length( good3 ) > 0 then > Print( "success for url ", url, "?\n" ); > fi; > # The IO and wget based methods are available. > # They cannot handle the 'maxTime' parameter. > bad:= Filtered( meths, > x -> StartsWith( x.name, "via SingleHTTPRequest" ) or > StartsWith( x.name, "via wget" ) ); > bad:= List( bad, x -> x.position ); > good1:= Filtered( good1, x -> not x[2] in bad ); > if List( good1, x -> x[2] ) <> List( good3, x -> x[2] ) then > Print( "different success cases for url ", url, ":\n", > List( good1, x -> x[2] ), " vs. ", List( good3, x -> x[2] ), > "\n" ); > fi; > od; ## test timeout gap> res1:= Download( "https://httpbun.com/delay/3", rec( maxTime:= 1 ) );; gap> res1.success = false; true gap> res1:= Download( "https://httpbun.com/delay/3", rec( maxTime:= 5 ) );; gap> res1.success = true; true ## the example 9.1.1 from the manual gap> url:= "https://www.gap-system.org/index.html";; gap> res1:= Download( url );; gap> res1.success; true gap> IsBound( res1.result ) and IsString( res1.result ); true gap> res2:= Download( Concatenation( url, "xxx" ) );; gap> res2.success; false gap> IsBound( res2.error ) and IsString( res2.error ); true ############################################################################# ## #E utils-0.93/tst/lcset.tst0000644000175100017510000001377515105376105014713 0ustar runnerrunner#@local a4, k4, rc, lc, a, b, d, f, g, h, H1, H2, H3, K1, K2, K3, lc1, lc4, M, matcyc, rc5, s ############################################################################# ## adapted from gapdev/tst/tstinstall/cset.tst for left cosets ## ## test of group intersection and LeftCoset ## gap> START_TEST("lcset.tst"); # section 5.2.1: basic coset tests gap> a4 := Group( (1,2,3), (2,3,4) );; SetName( a4, "a4" ); gap> k4 := Group( (1,2)(3,4), (1,3)(2,4) );; SetName( k4, "k4" ); gap> rc := RightCosets( a4, k4 ); [ RightCoset(k4,()), RightCoset(k4,(2,3,4)), RightCoset(k4,(2,4,3)) ] gap> lc := LeftCosets( a4, k4 ); [ LeftCoset((),k4), LeftCoset((2,4,3),k4), LeftCoset((2,3,4),k4) ] gap> AsSet( lc[2] ); [ (2,4,3), (1,2,3), (1,3,4), (1,4,2) ] gap> LeftCoset( (1,4,2), k4 ) = lc[2]; true gap> Representative( lc[2] ); (2,4,3) gap> ActingDomain( lc[2] ); k4 gap> (1,4,3) in lc[3]; true gap> (1,2,3)*lc[2] = lc[3]; true gap> lc[2]^(1,3,2) = lc[3]; true # section 5.2.2 gap> Inverse( rc[3] ) = lc[3]; true gap> Inverse( lc[2] ) = rc[2]; true # many further tests gap> LeftCoset( (1,2), a4 ) = LeftCoset( (2,3), a4 ); true gap> () in LeftCoset( (1,2), Group([(1,2,3,4)]) ); false gap> (1,2) in LeftCoset( (5,6), SymmetricGroup(12) ); true gap> Length( LeftCosets( SymmetricGroup(5), AlternatingGroup(4) ) ); 10 gap> (1,2,3) * LeftCoset( (), AlternatingGroup(4) ) > = LeftCoset( (), AlternatingGroup(4) ); true gap> IsBiCoset( LeftCoset( (1,2), AlternatingGroup(6) ) ); true gap> IsBiCoset( LeftCoset( (1,7), AlternatingGroup(6) ) ); false gap> IsLeftCoset( LeftCoset( (1,2,3), MathieuGroup(12) ) ); true gap> g:=SymmetricGroup(3);; gap> h:=Group((1,2));; gap> List(LeftCosets(g,h), SSortedList); [ [ (), (1,2) ], [ (1,3,2), (1,3) ], [ (2,3), (1,2,3) ] ] # test intersecting permutation cosets gap> H1 := Group( [ (), (2,7,6)(3,4,5), (1,2,7,5,6,4,3) ] );; gap> H2 := Group( [ (1,2,3,4,5,6,7), (5,6,7) ] );; gap> H3 := Group( [ (1,2,3,4,5,6,8), (1,3,2,6,4,5), (1,6)(2,3)(4,5)(7,8) ] );; gap> AsSet( LeftCoset( (1,5,7,3)(4,6), H1 ) ) = > Intersection( LeftCoset( (3,6)(4,7), H2 ), > LeftCoset( (1,5,3,8,6,7), H3 ) ); true gap> AsSet( LeftCoset( (1,2,5,6,7,4,3,8), Group(()) ) ) = > Intersection( LeftCoset( (1,5,6,7)(3,8,4), > Group( [ (1,4)(2,5), (1,3,5)(2,4,6), (1,5)(2,4)(3,6) ] ) ), > LeftCoset( (1,2,6,8)(3,7), > Group( [ (3,4), (5,6,7,8), (5,6) ] ) ) ); true gap> [] = Intersection( LeftCoset( (), SymmetricGroup(4) ), > LeftCoset( (4,7), SymmetricGroup([3..6]) ) ); true gap> [] = Intersection( LeftCoset( (4,5), Group( [ (1,2,3,4,5) ] ) ), > LeftCoset( (), AlternatingGroup(4) ) ); true gap> AsSet( LeftCoset( (7,9), SymmetricGroup([3..5]) ) ) = > Intersection( LeftCoset( (1,2)(7,9), SymmetricGroup(5) ), > LeftCoset( (7,9), SymmetricGroup([3..7]) ) ); true gap> [] = Intersection( LeftCoset( (1,4)(3,5), Group([(1,2,3,4,5)]) ), > LeftCoset( (), SymmetricGroup(3) ) ); true gap> AsSet( LeftCoset( (4,5), Group( [(5,6)] ) ) ) = > Intersection( LeftCoset( (), SymmetricGroup(6) ), > LeftCoset( (4,5), SymmetricGroup([5..8]) ) ); true gap> AsSet( LeftCoset( (1,4,5), SymmetricGroup(5) ) ) = > Intersection( LeftCoset( (), SymmetricGroup(5) ), > LeftCoset( (1,2), SymmetricGroup(5) ) ); true gap> [] = > Intersection( LeftCoset( (1,2), Group( (1,2,3,4,5) ) ), > LeftCoset( (), Group( (1,2,3,5,4) ) ) ); true gap> [] = > Intersection( LeftCoset( (1,2,3), Group( (1,2,3,4,5) ) ), > LeftCoset( (), Group( (1,2,3,5,4) ) ) ); true gap> AsSet( LeftCoset( (1,2), Group( [ (1,2,3,5,4) ] ) ) ) = > Intersection( LeftCoset( (), SymmetricGroup(7) ), > LeftCoset( (1,2), Group( (1,2,3,5,4) ) ) ); true gap> [] = > Intersection( LeftCoset( (), SymmetricGroup([3..7]) ), > LeftCoset( (1,2), Group( (1,2,3,5,4) ) ) ); true # test trivial cases gap> Intersection( LeftCoset( (), Group([],()) ), > LeftCoset( (1,2), Group([],()) ) ) = []; true gap> Intersection( LeftCoset( (), Group( (1,2,3) ) ), > LeftCoset( (1,2), Group( (1,2,3) ) ) ) = []; true gap> Intersection( LeftCoset( (), AlternatingGroup(6) ), > LeftCoset( (1,2), AlternatingGroup(6) ) ) = []; true gap> Intersection( LeftCoset( (1,2), AlternatingGroup([1..5]) ), > LeftCoset( (1,2), AlternatingGroup([6..10]) ) ) > = AsSet( LeftCoset( (1,2), Group(()) ) ); true #coset of pc-group gap> d := DihedralGroup( 24 ); gap> List( GeneratorsOfGroup(d), x -> Order(x) ); [ 2, 12, 6, 3 ] gap> s := Subgroup( d, [ d.1, d.4 ] );; gap> SetName( s, "s" ); gap> lc4 := LeftCoset( d.2, s ); LeftCoset(,s) gap> AsSet( lc4 ); [ f2, f2*f4, f1*f2*f3, f2*f4^2, f1*f2*f3*f4, f1*f2*f3*f4^2 ] gap> d.2 * d.4 in lc4; true # coset of fp-group gap> f := FreeGroup(2);; a := f.1;; b := f.2;; gap> g := f / [ a^5, b^4, a*b*a^2*b^3 ]; gap> Size(g); 20 gap> h := Subgroup( g, [g.1] );; gap> SetName( h, "C5" ); gap> rc5 := LeftCoset( g.2, h ); LeftCoset(,C5) gap> AsSet( rc5 ); [ f2, f2*f1, f2*f1^2, f2*f1^3, f2*f1^4 ] # test intersection non-permutation cosets gap> K1 := Group( [ [[-1,0],[0,-1]] ] );; gap> K2 := Group( [ [[-1,0],[0,1]], [[0,1],[1,0]] ] );; gap> K3 := Group( [ - IdentityMat(2) ] );; gap> AsSet( LeftCoset( [ [0,1],[1,0] ], K1 ) ) = > Intersection( LeftCoset( IdentityMat(2), K2 ), > LeftCoset( [[0,1],[1,0]], K1 ) ); true gap> AsSet( LeftCoset( [[0,1],[1,0]], K3 ) ) = > Intersection( LeftCoset( [[0,-1],[-1,0]], K3 ), > LeftCoset( [[0,1],[1,0]], K3 ) ); true gap> matcyc := CyclicGroup( IsMatrixGroup, GF(3), 4 );; gap> M := GeneratorsOfGroup( matcyc )[1];; gap> lc1 := LeftCoset( M^2, matcyc );; gap> Representative(lc1); [ [ 0*Z(3), 0*Z(3), Z(3)^0, 0*Z(3) ], [ 0*Z(3), 0*Z(3), 0*Z(3), Z(3)^0 ], [ Z(3)^0, 0*Z(3), 0*Z(3), 0*Z(3) ], [ 0*Z(3), Z(3)^0, 0*Z(3), 0*Z(3) ] ] # gap> STOP_TEST("lcset.tst", 1); utils-0.93/tst/matrix.tst0000644000175100017510000000513015105376105015067 0ustar runnerrunner#@local M6, L6, M4, L4, M8, L8, L, A, M3, L3, M5, L5; ############################################################################## ## #W matrix.tst Utils Package ## #Y Copyright (C) 2015-2023, The GAP Group ## gap> ReadPackage( "utils", "tst/loadall.g" );; gap> UtilsLoadingComplete; true ## SubSection 9.1.1 gap> M6 := [ [1,2,0,0,0,0], [3,4,0,0,0,0], [5,6,0,0,0,0], > [0,0,9,0,0,0], [0,0,0,1,2,3], [0,0,0,4,5,6] ];; gap> Display( M6 ); [ [ 1, 2, 0, 0, 0, 0 ], [ 3, 4, 0, 0, 0, 0 ], [ 5, 6, 0, 0, 0, 0 ], [ 0, 0, 9, 0, 0, 0 ], [ 0, 0, 0, 1, 2, 3 ], [ 0, 0, 0, 4, 5, 6 ] ] gap> L6 := DirectSumDecompositionMatrices( M6 ); [ [ [ [ 1, 2 ], [ 3, 4 ], [ 5, 6 ] ], [ [ 9 ] ], [ [ 1, 2, 3 ], [ 4, 5, 6 ] ] ] ] gap> M4 := [ [0,3,0,0], [0,0,0,0], [0,0,0,0], [0,0,4,0] ];; gap> Display( M4 ); [ [ 0, 3, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 4, 0 ] ] gap> L4 := DirectSumDecompositionMatrices( M4 ); [ [ [ [ 0, 3 ] ], [ [ 0, 0 ], [ 0, 0 ], [ 4, 0 ] ] ], [ [ [ 0, 3 ], [ 0, 0 ] ], [ [ 0, 0 ], [ 4, 0 ] ] ], [ [ [ 0, 3 ], [ 0, 0 ], [ 0, 0 ] ], [ [ 4, 0 ] ] ] ] gap> for L in L4 do > A := DirectSumMat( L );; > if ( A = M4 ) then Print( "yes, A = M4\n" ); fi; > od; yes, A = M4 yes, A = M4 yes, A = M4 gap> M8 := DirectSumMat( M4, M4 );; gap> Display( M8 ); [ [ 0, 3, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 4, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 3, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 4, 0 ] ] gap> L8 := DirectSumDecompositionMatrices( M8 );; gap> Length( L8 ); 16 gap> M3 := [ [0,0,0,7,0,0,0], [0,0,0,0,8,0,0], [0,0,0,0,0,9,0] ];; gap> Display( M3 ); [ [ 0, 0, 0, 7, 0, 0, 0 ], [ 0, 0, 0, 0, 8, 0, 0 ], [ 0, 0, 0, 0, 0, 9, 0 ] ] gap> L3 := DirectSumDecompositionMatrices( M3 ); [ [ [ [ 0, 0, 0, 7 ] ], [ [ 8 ] ], [ [ 9, 0 ] ] ] ] gap> M5 := [ [1,2,0,0,0], [3,4,0,0,0], [0,0,0,0,0], > [0,0,0,6,7], [0,0,0,8,9] ];; gap> Display(M5); [ [ 1, 2, 0, 0, 0 ], [ 3, 4, 0, 0, 0 ], [ 0, 0, 0, 0, 0 ], [ 0, 0, 0, 6, 7 ], [ 0, 0, 0, 8, 9 ] ] gap> L5 := DirectSumDecompositionMatrices( M5 ); [ [ [ [ 1, 2 ], [ 3, 4 ] ], [ [ 0 ] ], [ [ 6, 7 ], [ 8, 9 ] ] ] ] ############################################################################# ## #E matrix.tst . . . . . . . . . . . . . . . . . . . . . . . . . . ends here utils-0.93/tst/testall.g0000755000175100017510000000114515105376105014654 0ustar runnerrunner############################################################################ ## #W testall.g Utils Package Chris Wensley ## #Y Copyright (C) 2015-2023, The GAP Group ## LoadPackage( "utils" ); ## first make sure that, if the transferred code has not been read, ## then the appropriate packages are loaded. if not UtilsLoadingComplete then ReadPackage( "utils", "tst/loadall.g" ); fi; dir := DirectoriesPackageLibrary( "utils", "tst" ); TestDirectory(dir, rec(exitGAP := true, testOptions:=rec(compareFunction := "uptowhitespace"))); FORCE_QUIT_GAP(1); utils-0.93/tst/lists.tst0000644000175100017510000000767615105376105014742 0ustar runnerrunner#@local C, c4, d16, gens, i, J, K, L, n, P, trans ############################################################################## ## #W lists.tst Utils Package ## #Y Copyright (C) 2015-2022, The GAP Group ## gap> ReadPackage( "utils", "tst/loadall.g" );; gap> UtilsLoadingComplete; true ## SubSection 3.1.1 gap> List( [1..12], n->n^3 ); [ 1, 8, 27, 64, 125, 216, 343, 512, 729, 1000, 1331, 1728 ] gap> DifferencesList( last ); [ 7, 19, 37, 61, 91, 127, 169, 217, 271, 331, 397 ] gap> DifferencesList( last ); [ 12, 18, 24, 30, 36, 42, 48, 54, 60, 66 ] gap> DifferencesList( last ); [ 6, 6, 6, 6, 6, 6, 6, 6, 6 ] gap> L := [ 0 ];; gap> DifferencesList( L ); [ ] gap> L := [ ];; gap> DifferencesList( L ); [ ] ## SubSection 3.1.2 gap> List( [0..10], n -> Factorial(n) ); [ 1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800 ] gap> QuotientsList( last ); [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ] gap> L := [ 1, 3, 5, -1, -3, -5 ];; gap> QuotientsList( L ); [ 3, 5/3, -1/5, 3, 5/3 ] gap> FloatQuotientsList( L ); [ 3., 1.66667, -0.2, 3., 1.66667 ] gap> QuotientsList( [ 2, 1, 0, -1, -2 ] ); [ 1/2, 0, fail, 2 ] gap> FloatQuotientsList( [1..10] ); [ 2., 1.5, 1.33333, 1.25, 1.2, 1.16667, 1.14286, 1.125, 1.11111 ] gap> Product( last ); 10. ## SubSection 3.1.3 gap> L := [1..20];; L[1]:=13;; gap> for i in [1..19] do > if IsOddInt(L[i]) then L[i+1]:=3*L[i]+1; else L[i+1]:=L[i]/2; fi; > od; gap> L; [ 13, 40, 20, 10, 5, 16, 8, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4, 2, 1, 4 ] gap> SearchCycle( L ); [ 1, 4, 2 ] gap> n := 1;; L := [n];; gap> for i in [1..100] do n:=(n^2+1) mod 1093; Add(L,n); od; gap> L; [ 1, 2, 5, 26, 677, 363, 610, 481, 739, 715, 795, 272, 754, 157, 604, 848, 1004, 271, 211, 802, 521, 378, 795, 272, 754, 157, 604, 848, 1004, 271, 211, 802, 521, 378, 795, 272, 754, 157, 604, 848, 1004, 271, 211, 802, 521, 378, 795, 272, 754, 157, 604, 848, 1004, 271, 211, 802, 521, 378, 795, 272, 754, 157, 604, 848, 1004, 271, 211, 802, 521, 378, 795, 272, 754, 157, 604, 848, 1004, 271, 211, 802, 521, 378, 795, 272, 754, 157, 604, 848, 1004, 271, 211, 802, 521, 378, 795, 272, 754, 157, 604, 848, 1004 ] gap> C := SearchCycle( L ); [ 157, 604, 848, 1004, 271, 211, 802, 521, 378, 795, 272, 754 ] gap> P := Positions( L, 157 ); [ 14, 26, 38, 50, 62, 74, 86, 98 ] gap> Length( C ); DifferencesList( P ); 12 [ 12, 12, 12, 12, 12, 12, 12 ] ## SubSection 3.1.4 ## this manual example not tested as answers vary from run to run ## gap> RandomCombination( [1..49], 6 ); ## [ 3, 5, 21, 24, 27, 31 ] ## SubSection 3.2.1 gap> J := [ [1,2,3], [3,4], [3,4], [1,2,4] ];; gap> DistinctRepresentatives( J ); [ 1, 3, 4, 2 ] gap> K := [ [3,4], [1,2], [2,3], [2,3,4] ];; gap> CommonRepresentatives( J, K ); [ [ 3, 3, 3, 1 ], [ 1, 3, 4, 2 ] ] gap> d16 := DihedralGroup( IsPermGroup, 16 ); SetName( d16, "d16" ); Group([ (1,2,3,4,5,6,7,8), (2,8)(3,7)(4,6) ]) gap> c4 := Subgroup( d16, [ d16.1^2 ] ); SetName( c4, "c4" ); Group([ (1,3,5,7)(2,4,6,8) ]) gap> RightCosets( d16, c4 ); [ RightCoset(c4,()), RightCoset(c4,(2,8)(3,7)(4,6)), RightCoset(c4,(1,8,7,6,5, 4,3,2)), RightCoset(c4,(1,8)(2,7)(3,6)(4,5)) ] gap> trans := CommonTransversal( d16, c4 ); [ (), (2,8)(3,7)(4,6), (1,2,3,4,5,6,7,8), (1,2)(3,8)(4,7)(5,6) ] gap> IsCommonTransversal( d16, c4, trans ); true ## SubSection 3.3.1 gap> gens := GeneratorsOfGroup( DihedralGroup(12) ); [ f1, f2, f3 ] gap> String( gens ); "[ f1, f2, f3 ]" gap> BlankFreeString( gens ); "[f1,f2,f3]" ############################################################################# ## #E lists.tst . . . . . . . . . . . . . . . . . . . . . . . . . . . ends here utils-0.93/tst/iterator.tst0000644000175100017510000000525015105376105015417 0ustar runnerrunner#@local c3c3, cart, G, h, it1, it2, iter, iter0, iter4, iterL #@local L, n, pairs0, pairs4, pairsL, s3, s4 ############################################################################## ## #W iterator.tst Utils Package ## #Y Copyright (C) 2015-2022, The GAP Group ## gap> ReadPackage( "utils", "tst/loadall.g" );; gap> UtilsLoadingComplete; true ## SubSection 7.1.1 gap> G := SmallGroup( 6,1);; gap> s3 := Group( (5,6), (6,7) );; gap> iter := AllIsomorphismsIterator( G, s3 );; gap> NextIterator( iter ); [ f1, f2 ] -> [ (6,7), (5,6,7) ] gap> n := AllIsomorphismsNumber( G, s3 ); 6 gap> AllIsomorphisms( G, s3 ); [ [ f1, f2 ] -> [ (6,7), (5,6,7) ], [ f1, f2 ] -> [ (5,7), (5,6,7) ], [ f1, f2 ] -> [ (5,6), (5,7,6) ], [ f1, f2 ] -> [ (6,7), (5,7,6) ], [ f1, f2 ] -> [ (5,7), (5,7,6) ], [ f1, f2 ] -> [ (5,6), (5,6,7) ] ] gap> iter := AllIsomorphismsIterator( G, s3 );; gap> for h in iter do Print( ImageElm( h, G.1 ) = (6,7), ", " ); od; true, false, false, true, false, false, gap> s4 := Group( (1,2),(2,3),(3,4) );; gap> AllIsomorphismsNumber( s3, s4 ); 0 gap> AllIsomorphisms( s3, s4 ); [ ] ## SubSection 7.1.2 gap> c3c3 := Group( (1,2,3), (4,5,6) );; gap> iter := AllSubgroupsIterator( c3c3 ); gap> while not IsDoneIterator(iter) do Print(NextIterator(iter),"\n"); od; Group( () ) Group( [ (4,5,6) ] ) Group( [ (1,2,3) ] ) Group( [ (1,2,3)(4,5,6) ] ) Group( [ (1,3,2)(4,5,6) ] ) Group( [ (4,5,6), (1,2,3) ] ) ## Subsection 7.2.1 gap> it1 := Iterator( [ 1, 2, 3 ] );; gap> it2 := Iterator( [ 4, 5, 6 ] );; gap> iter := CartesianIterator( it1, it2 );; gap> while not IsDoneIterator(iter) do Print(NextIterator(iter),"\n"); od; [ 1, 4 ] [ 1, 5 ] [ 1, 6 ] [ 2, 4 ] [ 2, 5 ] [ 2, 6 ] [ 3, 4 ] [ 3, 5 ] [ 3, 6 ] gap> ## try some trivial cases gap> iter0 := IteratorList( [ ] );; gap> iter4 := IteratorList( [ 4 ] );; gap> cart := CartesianIterator( iter0, iter0 );; gap> IsDoneIterator( cart ); true gap> cart := CartesianIterator( iter0, iter4 );; gap> IsDoneIterator( cart ); true gap> cart := CartesianIterator( iter4, iter0 );; gap> IsDoneIterator( cart ); true ## Subsection 6.2.2 gap> L := [6,7,8,9];; gap> iterL := IteratorList( L );; gap> pairsL := UnorderedPairsIterator( iterL );; gap> while not IsDoneIterator(pairsL) do Print(NextIterator(pairsL),"\n"); od; [ 6, 6 ] [ 6, 7 ] [ 7, 7 ] [ 6, 8 ] [ 7, 8 ] [ 8, 8 ] [ 6, 9 ] [ 7, 9 ] [ 8, 9 ] [ 9, 9 ] gap> iter4 := IteratorList( [ 4 ] ); gap> pairs4 := UnorderedPairsIterator(iter4); gap> NextIterator( pairs4 ); [ 4, 4 ] gap> IsDoneIterator( pairs4 ); true gap> pairs0 := UnorderedPairsIterator( iter0 );; gap> IsDoneIterator( pairs0 ); true utils-0.93/tst/print.tst0000644000175100017510000000202715105376105014721 0ustar runnerrunner#@local L, s5 ############################################################################## ## #W print.tst Utils Package ## #Y Copyright (C) 2015-2022, The GAP Group ## gap> ReadPackage( "utils", "tst/loadall.g" );; gap> UtilsLoadingComplete; true ## SubSection 2.1.1 gap> L := List( [1..20], n -> n^5 );; gap> PrintSelection( L, [18..20] ); 18 : 1889568 19 : 2476099 20 : 3200000 gap> PrintSelection( L, 2, 9 ); 2 : 32 11 : 161051 20 : 3200000 gap> PrintSelection( L, 2, 3, 11 ); 2 : 32 5 : 3125 8 : 32768 11 : 161051 gap> s5 := SymmetricGroup( 5 );; gap> PrintSelection( s5, [30,31,100,101] ); 30 : (1,5)(3,4) 31 : (1,5,2) 100 : (1,4,3) 101 : (1,4)(3,5) gap> PrintSelection( s5, 1, 30 ); 1 : () 31 : (1,5,2) 61 : (1,2,3) 91 : (1,3,5,2,4) gap> PrintSelection( s5, 9, 11, 43 ); 9 : (2,5,3) 20 : (2,4) 31 : (1,5,2) 42 : (1,5,2,3,4) ############################################################################# ## #E print.tst . . . . . . . . . . . . . . . . . . . . . . . . . . . ends here utils-0.93/tst/others.tst0000644000175100017510000000426215105376105015074 0ustar runnerrunner#@local a, F2, f, g, relq8, q8, M, s1, n1, n2, N, s2; ############################################################################ ## #W others.tst Utils Package ## #Y Copyright (C) 2015-2025, The GAP Group ## gap> ReadPackage( "utils", "tst/loadall.g" );; gap> UtilsLoadingComplete; true ## SubSection 10.1.1 ## this manual example is not tested to avoid creating files triv.* ## gap> LogTo( "triv.log" ); ## gap> a := 33^5; ## 39135393 ## gap> LogTo(); ## gap> Log2HTML( "triv.log" ); ## SubSection 10.2.1 gap> IntOrInfinityToLaTeX( 10^3 ); "1000" gap> IntOrInfinityToLaTeX( infinity ); "\\infty" ## SubSection 10.2.2 gap> LaTeXStringFactorsInt( Factorial(12) ); "2^{10} \\cdot 3^5 \\cdot 5^2 \\cdot 7 \\cdot 11" ## SubSection 10.3.1 gap> ## permutation groups gap> ConvertToMagmaInputString( Group( (1,2,3,4,5), (3,4,5) ) ); "PermutationGroup<5|(1,2,3,4,5),\n(3,4,5)>;\n" gap> ConvertToMagmaInputString( Group( (1,2,3,4,5) ), "c5" ); "c5 := PermutationGroup<5|(1,2,3,4,5)>;\n" gap> ## pc-group gap> ConvertToMagmaInputString( DihedralGroup( IsPcGroup, 10 ) ); "PolycyclicGroup< f1,f2 |\nf1^2,\nf2^5,\nf2^f1 = f2^4\n>;\n" gap> ## fp-group gap> F2 := FreeGroup( 2 );; gap> f := F2.1;; g := F2.2;; gap> relq8 := [ f^4, g^4, f*g*f*g^-1, f^2*g^2 ];; gap> q8 := F2/relq8;; gap> ConvertToMagmaInputString( q8 ); no conversion function yet available for fp-groups fail gap> ## matrix group gap> M := GL(2,5);; Size(M); 480 gap> s1 := ConvertToMagmaInputString( M ); "F := GF(5);\nP := GL(2,F);\ngens := [\nP![2,0,0,1],\nP![4,1,4,0]\n];\nsub

;\n" gap> Print( s1 ); F := GF(5); P := GL(2,F); gens := [ P![2,0,0,1], P![4,1,4,0] ]; sub

; gap> n1 := [ [ Z(9)^0, Z(9)^0 ], [ Z(9)^0, Z(9) ] ];; gap> n2 := [ [ Z(9)^0, Z(9)^3 ], [ Z(9)^4, Z(9)^2 ] ];; gap> N := Group( n1, n2 );; Size( N ); 5760 gap> s2 := ConvertToMagmaInputString( N, "gpN" );; gap> Print( s2 ); F := GF(3^2); P := GL(2,F); w := PrimitiveElement(F); gens := [ P![ 1, 1, 1,w^1], P![ 1,w^3, 2,w^2] ]; gpN := sub

; ############################################################################# ## #E others.tst . . . . . . . . . . . . . . . . . . . . . . . . . . ends here utils-0.93/CHANGES.md0000644000175100017510000001765215105376105013623 0ustar runnerrunner# CHANGES log for the 'Utils' package ## Version 0.93 for GAP 4.15.1 (13/11/25) * (13/11/25) new release to fix the problem described in GAP issue 6164 ## Version 0.92 for GAP 4.14.0 (11/09/25) * (10/09/25) support timeout in Download (Thomas Breuer) added new release mechanism: .github/workflows/release.yml ## Version 0.91 for GAP 4.14.0 (13/08/25) * (13/08/25) replaced DeclareGlobalFunction with DeclareGlobalName, etc. removed all code related to SubdirectProductWithEmbeddings ## Version 0.89 for GAP 4.14.0 (10/04/25) * (10/04/25) corrected creation of left cosets ## Version 0.87 ready for GAP 4.14.0 (20/10/24) * (08/04/25) adjustments to magma.gi and others.tst * (20/10/24) fix tests and examples to new GAP website ## Version 0.86 for GAP 4.13.1 (16/05/24) * (16/05/24) there have been just two minor adjustments since version 0.85 ## Version 0.85 for GAP 4.12.2 (23/01/24) * (08/01/24) avoid trivial function wrappers in List and ForAll ## Version 0.84 for GAP 4.12.2 (11/09/23) * (11/09/23) changed manual and test for DirectSumDecompositionMatrices ## Version 0.83 for GAP 4.12.2 (29/06/23) * (29/06/23) added DirectSumDecompositionMatrices ## Version 0.82 for GAP 4.12.2 (09/02/23) * (23/12/22) changed email address, deleted institution ## Version 0.81 for GAP 4.12.1 (04/12/22) * (17/11/22) removed (the dead) pcp option from PcGroupToMagmaFormat so that the dependency on Polycyclic could be removed * (21/10/22) added OptionRecordWithDefaults in 7.2 from Christopher Jefferson * (04/10/22) declared PreImagesRepresentativeNC in init.g ## Version 0.77 for GAP 4.12.0 (25/09/22) * (25/09/22) added Download operation by Thomas Breuer - new Chapter 8 ## Version 0.76 for GAP 4.12.0 (06/08/22) * (06/08/22) added LeftCoset operations ## Version 0.74 for GAP 4.11.1 (09/07/22) * (07/07/22) Max Horn replaced BIND_GLOBAL with BindGlobal (transfer process) * (05/07/22) CentralProduct added by Thomas Breuer ## Version 0.72 for GAP 4.10.1 (16/11/21) * (06/04/21) Switch CI to use GitHub Actions: PR#37 ## Version 0.69 for GAP 4.10.2 (29/11/19) * (22/11/19) added DirectProductOfAutomorphismGroups * (19/11/19) added DirectProductOfFunctions ## Version 0.67 for GAP 4.10.2 (04/09/19) * (04/09/19) accepted PR34 - changed example in 6.2.1 * (25/08/19) fixed typos with UnorderedPairsIterator in manual ## Version 0.65 for GAP 4.10.2 (11/07/19) * (11/07/19) groups.tst fails in gapdev - temporary(?) fix ## Version 0.64 for GAP 4.10.1 (17/06/19) * (14/06/19) added Iterators chapter: AllSubgroupsIterator CartesianIterator, UnorderedPairsIterator ## Version 0.63 for GAP 4.10.1 (29/05/19) * (28/05/19) added IdempotentEndomorphisms, IdempotentEndomorphismsData * (17/05/19) + AllIsomorphismsIterator, AllIsomorphismsNumber, AllIsomorphisms * (16/02/19) added License field in PackageInfo.g ## Version 0.61 for GAP 4.10.0 (28/11/18) * (28/11/18) made ExponentOfPrime obsolete * (27/11/18) made several AutoDoc functions obsolete (they remain in AutoDoc): FindMatchingFiles; CreateDirIfMissing; StringDotSuffix; SetIfMissing ## Version 0.59 for GAP 4.9.3 (04/10/18) * (04/10/18) made PrintApplicableMethod obsolete ## Version 0.58 for GAP 4.9.3 (12/09/18) * (08/09/18) marked PrintOneItemPerLine as obsolete: use Perform(L,Display); * (07/09/18) marked ExponentOfPrime as obsolete: use PValuation * (05/09/18) transferred code in combinat.g{d,i} to end of lists.g{d,i} * (04/09/18) removed all "if OKtoReadFomUtils( "RCWA" / "ResClasses" )" ## Version 0.57 for GAP 4.9.1 (02/06/18) * (02/06/18) new PrintSelection example due to diff with all packages loaded removed XMod from list of packages to be loaded * (27/03/18) revised file tst/testing.g ## Version 0.54 for GAP 4.9.0 (12/02/18) * (22/01/18) PrintOneItemPerLine plus alternative method for iterators; added function PrintSelection(L,first,step,last) for lists/iterators * (06/01/18) rebuilt the manual using the AutoDoc package * (22/12/17) removed examples/ folder ## Version 0.49 for GAP 4.8.8 (05/12/17) * (05/12/17) removed QPA functions PositionsNonzero and NullList * (21/11/17) changed record.tst so that 4r8 and dev give the same result ## Version 0.48 for GAP 4.8.8 (14/09/17) * (14/09/17) fixes to the gh-pages folder so that README.md is displayed * (12/09/17) corrected web addresses for Stefan and Frank * (04/07/17) README and CHANGES converted to README.md and CHANGES.md ## Version 0.46 for GAP 4.8.6 (08/02/17) * (08/02/17) added Polycyclic as a needed package * (07/02/17) added code for converting matrix groups to Magma strings * (03/02/17) added code for converting perm- and pc-groups to Magma strings * (02/02/17) copied `gaplog.css` to `utils/doc/` from RCWA archive ## Version 0.44 for GAP 4.8.6 (17/01/17) * (08/12/16) added PositionsNonzero and NullList from QPA * (05/12/16) added `tst/loadall.g` and adjusted `tst/testall.g`, `tst/*.tst` * (14/11/16) issue #2 reopened by Max: EpimorphismByGeneratorsNC removed ## Version 0.43 for GAP 4.8.5 (20/10/16) * (18/10/16) now using bibliography file `bib.xml` of type `bibxmlext.dtd` ## Version 0.41 for GAP 4.8.3 (25/05/16) * (25/05/16) fixed issue #8 : `git rm doc/appendix.xml` * (17/03/16) added function PrintApplicableMethod ## Version 0.40 for GAP 4.8.3 (17/03/16) * (17/03/16) moved transfer procedure to a new chapter in the manual * (15/03/16) added fix to QuotientList requested by Stefan added many manual examples supplied by Stefan ## Version 0.39 for GAP 4.8.2 (04/03/16) * (04/03/16) corrected repeated "//" in `PackageInfo.g` * (03/03/16) updated transfers from RCWA and ResClasses (Stefan's input) * (26/02/16) updated README to show the release URL * (25/02/16) New release to GitHub using ReleaseTools (GitHubPagesForGAP) `makedocrel.g` renamed `makedoc.g` * (17/02/16) Removed date/version information from file headers. * (16/02/16) Moved PackageWWWHome to GitHub; added OKtoReadFromUtilsSpec to deal with fns taken out early * (12/02/16) Added warning to manual about the need to load packages. * (11/02/16) BindInRecordIfMissing -> SetIfMissing (from AutoDoc) moved a number of functions to `pending.g{d,i}` * (10/02/16) adjustments due to new RCWA 4.0.0 and ResClasses 4.1.1 ## Version 0.22 for GAP 4.8.1 (04/02/16) * (04/02/16) repository moved to gap-packages ## Version 0.21 for GAP 4.8.1 (03/02/16) * (03/02/16) added several more functions from RCWA * (29/01/16) switching to a protocol based on Frank's suggestion: if TestPackageAvailability("Bla", ">=x.(y+1)") = fail then ... ## Version 0.17 for GAP 4.8.1 (12/01/16) * (12/01/16) more edits to `oper.g` and `global.g` suggested by Chris J. ## Version 0.15 for GAP 4.8.0 (18/12/15) * (17/12/15) added more documentation to `global.g` and `oper.g` ## Version 0.14 for GAP 4.8.0 (16/12/15) * (16/12/15) changed global lists in oper.g to GLOBAL_REDECLARATION_LIST, GLOBAL_REDECLARATION_COUNT and GLOBAL_REINSTALLATION_LIST; added functions (in `oper.g`) AllowGlobalRedeclaration and AllowGlobalReinstallation; added GLOBAL_REBINDING_LIST and AllowGlobalRebinding (in `global.g`) to cope with BIND_GLOBAL. ## Version 0.13 for GAP 4.8.0 (15/12/15) * (15/12/15) added some functions from AutoDoc; packed up version 0.13 * (14/12/15) library file `oper.g` edited to prevent repeat declarations etc. * (14/12/15) `names.g{d,i}` now `first.g{d,i}` with `last.gd` added, containing UTILS_FUNCTION_NAMES and UTILS_FUNCTION_OPERS ## Version 0.11 for GAP 4.8.0 (30/11/15) * (30/11/15) added tests and documentation for ResClasses functions * (25/11/15) added `names.g{d,i}`, `tests.g{d,i}` * (25/11/15) added `sebastian.gi` to `lib/` * (24/11/15) added `rwca.g{d,i}` and `resclasses.g{d,i}` to `lib/` * (24/11/15) added `combinat.g{d,i}` to `lib/` utils-0.93/init.g0000644000175100017510000000237315105376105013336 0ustar runnerrunner############################################################################# ## #W init.g GAP package `Utils' Chris Wensley ## #Y Copyright (C) 2015-2023, The GAP Group, ## if not IsBound( PreImagesRepresentativeNC ) then BindGlobal( "PreImagesRepresentativeNC", PreImagesRepresentative ); fi; if not IsBound( IsMatrixOrMatrixObj ) then BindGlobal( "IsMatrixOrMatrixObj", IsMatrix ); fi; if not IsBound( MutableCopyMatrix ) then BindGlobal( "MutableCopyMatrix", ShallowCopy ); fi; ## read the function declarations ReadPackage( "utils", "lib/start.gd" ); ReadPackage( "utils", "lib/files.gd" ); ReadPackage( "utils", "lib/groups.gd" ); ReadPackage( "utils", "lib/iterator.gd" ); ReadPackage( "utils", "lib/latex.gd" ); ReadPackage( "utils", "lib/lcset.gd" ); ReadPackage( "utils", "lib/lists.gd" ); ReadPackage( "utils", "lib/magma.gd" ); ReadPackage( "utils", "lib/maps.gd" ); ReadPackage( "utils", "lib/matrix.gd" ); ReadPackage( "utils", "lib/number.gd" ); ReadPackage( "utils", "lib/print.gd" ); ReadPackage( "utils", "lib/record.gd" ); ReadPackage( "utils", "lib/string.gd" ); if not IsBound( Download ) then ReadPackage( "utils", "lib/download.gd" ); BindGlobal("DOWNLOAD_FROM_UTILS", true); fi; utils-0.93/PackageInfo.g0000644000175100017510000001404115105376105014535 0ustar runnerrunner############################################################################# ## ## PackageInfo.g file for the package Utils ## SetPackageInfo( rec( PackageName := "utils", Subtitle := "Utility functions in GAP", Version := "0.93", Date := "13/11/2025", # dd/mm/yyyy format License := "GPL-2.0-or-later", Persons := [ rec( LastName := "Breuer", FirstNames := "Thomas", IsAuthor := true, IsMaintainer := false, Email := "sam@math.rwth-aachen.de", WWWHome := "https://www.math.rwth-aachen.de/~Thomas.Breuer", Place := "Aachen", Institution := "Lehrstuhl für Algebra und Zahlentheorie, RWTH Aachen" ), rec( LastName := "Gutsche", FirstNames := "Sebastian", IsAuthor := true, IsMaintainer := false, Email := "gutsche@mathematik.uni-siegen.de", WWWHome := "https://sebasguts.github.io/", Place := "Siegen", Institution := "University of Siegen" ), rec( LastName := "Horn", FirstNames := "Max", IsAuthor := true, IsMaintainer := false, Email := "mhorn@rptu.de", WWWHome := "https://github.com/mhorn", ), rec( LastName := "Hulpke", FirstNames := "Alexander", IsAuthor := true, IsMaintainer := false, Email := "hulpke@math.colostate.edu", WWWHome := "https://www.math.colostate.edu/~hulpke", ), rec( LastName := "García-Sánchez", FirstNames := "Pedro", IsAuthor := true, IsMaintainer := false, WWWHome := "http://www.ugr.es/local/pedro", Email := "pedro@ugr.es", ), rec( LastName := "Jefferson", FirstNames := "Christopher", IsAuthor := true, IsMaintainer := false, WWWHome := "https://caj.host.cs.st-andrews.ac.uk/", Email := "caj21@st-andrews.ac.uk", ), rec( LastName := "Kohl", FirstNames := "Stefan", IsAuthor := true, IsMaintainer := false, Email := "stefan@mcs.st-and.ac.uk", WWWHome := "https://www.gap-system.org/DevelopersPages/StefanKohl/" ), rec( LastName := "Lübeck", FirstNames := "Frank", IsAuthor := true, IsMaintainer := false, Email := "Frank.Luebeck@Math.RWTH-Aachen.De", WWWHome := "https://www.math.rwth-aachen.de/~Frank.Luebeck", ), rec( LastName := "Wensley", FirstNames := "Chris", IsAuthor := true, IsMaintainer := true, Email := "cdwensley.maths@btinternet.com", WWWHome := "https://github.com/cdwensley", Place := "Llanfairfechan", Institution := "" ) ], Status := "deposited", ## CommunicatedBy := " ", ## AcceptDate := " ", SourceRepository := rec( Type := "git", URL := "https://github.com/gap-packages/utils" ), IssueTrackerURL := "https://github.com/gap-packages/utils/issues", PackageWWWHome := "https://gap-packages.github.io/utils", README_URL := Concatenation( ~.PackageWWWHome, "/README.md" ), PackageInfoURL := Concatenation( ~.PackageWWWHome, "/PackageInfo.g" ), ArchiveURL := Concatenation( ~.SourceRepository.URL, "/releases/download/v", ~.Version, "/", ~.PackageName, "-", ~.Version ), ArchiveFormats := ".tar.gz .zip", AbstractHTML := "The Utils package provides a collection \ of utility functions gleaned from many packages.", PackageDoc := rec( BookName := "Utils", ArchiveURLSubset := ["doc"], HTMLStart := "doc/chap0_mj.html", PDFFile := "doc/manual.pdf", SixFile := "doc/manual.six", LongTitle := "Utility functions in GAP" ), Dependencies := rec( GAP := ">=4.10.1", NeededOtherPackages := [ ], SuggestedOtherPackages := [ [ "curlInterface", ">= 2.3.0" ] ], ExternalConditions := [ ] ), AvailabilityTest := ReturnTrue, Keywords := [ ], BannerString := Concatenation( "Loading Utils ", String( ~.Version ), " - a collection of utility functions.\n" ), TestFile := "tst/testall.g", AutoDoc := rec( TitlePage := rec( Copyright := Concatenation( "© 2015-2025, The GAP Group.

\n", "The &Utils; package is free software; you can redistribute it ", "and/or modify it under the terms of the GNU General ", "Public License as published by the Free Software Foundation; ", "either version 2 of the License, or (at your option) ", "any later version.\n" ), Abstract := Concatenation( "The &Utils; package provides a space for utility functions ", "in a variety of &GAP; packages to be collected together ", "into a single package. In this way it is hoped that they will ", "become more visible to package authors.\n", "

\n", "Any package author who transfers a function to &Utils; ", "will become an author of &Utils;.\n", "

\n", "If deemed appropriate, functions may also be transferred ", "from the main library.\n", "

\n", "Bug reports, suggestions and comments are, of course, welcome.\n", "Please contact the last author at ", "cdwensley.maths@btinternet.com ", "or submit an issue at the GitHub repository ", "https://github.com/gap-packages/utils/issues/.\n" ), Acknowledgements := Concatenation( "This documentation was prepared using the ", "&GAPDoc; and ", "&AutoDoc; packages.

\n", "The procedure used to produce new releases uses the package ", "GitHubPagesForGAP ", " ", "and the package ReleaseTools.

" ), ) ), ));