From 69a7133cf4e1c6769f271e8a7e0cfacc0b98134d Mon Sep 17 00:00:00 2001 From: Mike McGann Date: Thu, 25 Jan 2024 13:22:38 -0500 Subject: [PATCH 01/14] update haversine example --- doc/ops/geo.md | 12 +++++++----- pkg/ops/geo.go | 11 ++++++++--- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/doc/ops/geo.md b/doc/ops/geo.md index ca09a4d7..fdfee881 100644 --- a/doc/ops/geo.md +++ b/doc/ops/geo.md @@ -85,11 +85,13 @@ Example: -| Input | Stack -|-------------------------|--------------- -| `51.510357 -0.116773 ` | `51.510357 \| -0.116773` -| `38.889931 -77.009003 ` | `51.510357 \| -0.116773 \| 38.889931 \| -77.009003` -| `haversine dec 3 round` | `5897658.289` +| Input | Stack +|-----------------------------------|--------------- +| `38°54′17″N 77°00′59″W ` | `38°54′17″N \| 77°00′59″W` +| `40°42′46″N 74°00′22″W ` | `38°54′17″N \| 77°00′59″W \| 40°42′46″N \| 74°00′22″W` +| `haversine 2 round ` | `326364.76 # m` +| `m-km 2 round ` | `326.36 # km` +| `km-mi 2 round ` | `202.79 # mi` ## proj diff --git a/pkg/ops/geo.go b/pkg/ops/geo.go index 077f4c87..bb5a7784 100644 --- a/pkg/ops/geo.go +++ b/pkg/ops/geo.go @@ -79,10 +79,15 @@ Source: https://community.esri.com/t5/coordinate-reference-systems-blog/distance-on-a-sphere-the-haversine-formula/ba-p/902128 end +The following shows the great circle distance between Washington, DC +and New York, NY: + example -51.510357 -0.116773 -- 51.510357 | -0.116773 -38.889931 -77.009003 -- 51.510357 | -0.116773 | 38.889931 | -77.009003 -haversine dec 3 round -- 5897658.289 +38°54′17″N 77°00′59″W -- 38°54′17″N | 77°00′59″W +40°42′46″N 74°00′22″W -- 38°54′17″N | 77°00′59″W | 40°42′46″N | 74°00′22″W +haversine 2 round -- 326364.76 # m +m-km 2 round -- 326.36 # km +km-mi 2 round -- 202.79 # mi end */ func Haversine(c zc.Calc) { From 3920251757ce8be802082f0845f3f3baa4fc2d36 Mon Sep 17 00:00:00 2001 From: Mike McGann Date: Fri, 2 Feb 2024 12:45:03 -0500 Subject: [PATCH 02/14] add unescape operation --- doc/index.md | 2 ++ doc/ops/text.md | 27 +++++++++++++++++++++ go.mod | 3 ++- go.sum | 4 ++++ pkg/calc/ops_gen.go | 2 ++ pkg/ops/text.go | 58 +++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 95 insertions(+), 1 deletion(-) diff --git a/doc/index.md b/doc/index.md index 946005f1..eb7decf6 100644 --- a/doc/index.md +++ b/doc/index.md @@ -376,6 +376,8 @@ - [u8de](ops/text.md#utf8-decode): Decode UTF-8 bytes - [u8en](ops/text.md#utf8-encode): Encode UTF-8 bytes +- [unesc](ops/text.md#unescape): Unescape +- [unescape](ops/text.md#unescape): Unescape - [up](ops/stack.md#up): Rotate items upward - [upper](ops/text.md#upper): Uppercase - [utf8-decode](ops/text.md#utf8-decode): Decode UTF-8 bytes diff --git a/doc/ops/text.md b/doc/ops/text.md index 5371cc7b..7aece879 100644 --- a/doc/ops/text.md +++ b/doc/ops/text.md @@ -14,6 +14,7 @@ Text operations | [`right`](#right) | Right substring | [`split`](#split) | Split string | [`tone`](#tone) | Apply a skin tone to an emoji +| [`unescape, unesc`](#unescape) | Unescape | [`upper`](#upper) | Uppercase | [`utf8-decode, u8de`](#utf8-decode) | Decode UTF-8 bytes | [`utf8-encode, u8en`](#utf8-encode) | Encode UTF-8 bytes @@ -194,6 +195,32 @@ Example: | `:waving-hand:` | `👋` | `2 tone ` | `👋🏽` +## unescape + +Unescapes characters in a string value that are prefixed by a backslash. The +escape sequences as defined for Go strings are used. A value such as +`\n` is converted to a new line. Values such as `\x7f`, `\u007f`, '\U0000007f`, +and `\077` are converted to the characters of that code point. + +Alias: `unesc` + +``` +( p0:Str -- Str ) +``` + +Example: + + + +| Input | Stack +|--------------------------------------------|--------------- +| `"\u65e5\u672c\u8a9e" ` | `\u65e5\u672c\u8a9e` +| `unescape ` | `日本語` +| `c "\U000065e5\U0000672c\U00008a9e" ` | `\U000065e5\U0000672c\U00008a9e` +| `unescape ` | `日本語` +| `c "\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e"` | `\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e` +| `unescape ` | `日本語` + ## upper Convert string *p0* to uppercase. diff --git a/go.mod b/go.mod index 13e0eeb4..f364ac11 100644 --- a/go.mod +++ b/go.mod @@ -1,8 +1,9 @@ module github.com/blackchip-org/zc/v5 -go 1.21 +go 1.21.1 require ( + github.com/blackchip-org/scan v0.0.1 github.com/peterh/liner v1.2.2 github.com/shopspring/decimal v1.3.1 github.com/twpayne/go-proj/v10 v10.1.1 diff --git a/go.sum b/go.sum index e8545a09..865be93f 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,7 @@ +github.com/blackchip-org/scan v0.0.0 h1:oHUBMbMF45e7MYOr5xx09qG6wD8zaLNaG8KovweHehA= +github.com/blackchip-org/scan v0.0.0/go.mod h1:fnJGAutu4OH6z0z8jmmdDl89lt+bvOz89cZWq4swkYU= +github.com/blackchip-org/scan v0.0.1 h1:C+Yjgc2BnciwuRHP+nrWqV2gh3X3iqo76ZZ3Q2+1LdM= +github.com/blackchip-org/scan v0.0.1/go.mod h1:fnJGAutu4OH6z0z8jmmdDl89lt+bvOz89cZWq4swkYU= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/mattn/go-runewidth v0.0.3 h1:a+kO+98RDGEfo6asOGMmpodZq4FNtnGP54yps8BzLR4= diff --git a/pkg/calc/ops_gen.go b/pkg/calc/ops_gen.go index 826c69aa..90052342 100644 --- a/pkg/calc/ops_gen.go +++ b/pkg/calc/ops_gen.go @@ -482,6 +482,8 @@ var opsList = []zc.OpDecl{ zc.Macro("tz", "timezone"), zc.Macro("u8de", "utf8-decode"), zc.Macro("u8en", "utf8-encode"), + zc.Macro("unesc", "unescape"), + zc.Op("unescape", ops.Unescape, zc.Str), zc.Op("up", ops.Up), zc.Op("upper", ops.Upper, zc.Str), zc.Op("utf8-decode", ops.UTF8Decode, zc.BigInt), diff --git a/pkg/ops/text.go b/pkg/ops/text.go index f2128be9..306db41d 100644 --- a/pkg/ops/text.go +++ b/pkg/ops/text.go @@ -6,6 +6,7 @@ import ( "strings" "unicode/utf8" + "github.com/blackchip-org/scan" "github.com/blackchip-org/zc/v5/pkg/zc" ) @@ -258,6 +259,63 @@ func Tone(c zc.Calc) { zc.PushString(c, r0) } +/* +oper unescape +func Unescape p0:Str -- Str +alias unesc +title Unescape + +desc +Unescapes characters in a string value that are prefixed by a backslash. The +escape sequences as defined for Go strings are used. A value such as +`\n` is converted to a new line. Values such as `\x7f`, `\u007f`, '\U0000007f`, +and `\077` are converted to the characters of that code point. +end + +example +"\u65e5\u672c\u8a9e" -- \u65e5\u672c\u8a9e +unescape -- 日本語 +c "\U000065e5\U0000672c\U00008a9e" -- \U000065e5\U0000672c\U00008a9e +unescape -- 日本語 +c "\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e" -- \xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e +unescape -- 日本語 +end +*/ +func Unescape(c zc.Calc) { + a0 := zc.PopString(c) + s := scan.NewScannerFromString("", a0) + rule := scan.NewRuleSet( + scan.NewCharEncRule( + scan.AlertEnc, + scan.BackspaceEnc, + scan.FormFeedEnc, + scan.LineFeedEnc, + scan.CarriageReturnEnc, + scan.HorizontalTabEnc, + scan.VerticalTabEnc, + ), + scan.Hex2Enc.AsByte(true), + scan.Hex4Enc, + scan.Hex8Enc, + scan.OctEnc) + for s.HasMore() { + if s.This == '\\' { + s.Skip() + if !rule.Eval(s) { + s.Keep() + } + } else { + s.Keep() + } + } + tok := s.Emit() + if tok.Type == scan.IllegalType { + c.SetError(tok.Errs[0]) + } else { + zc.PushString(c, tok.Val) + } +} + /* oper upper func Upper p0:Str -- Str From 18df84c5e9a56ff2743832d655d809064a893640 Mon Sep 17 00:00:00 2001 From: Mike McGann Date: Fri, 2 Feb 2024 15:48:46 -0500 Subject: [PATCH 03/14] dms work --- pkg/dms/parser.go | 42 ++++++++++++++++++++++++++++ pkg/dms/scanner.go | 67 +++++++++++++++++++++++++++++++++++++++++++++ pkg/dms/state.gv | 47 +++++++++++++++++++++++++++++++ pkg/dms/state.png | Bin 0 -> 117012 bytes 4 files changed, 156 insertions(+) create mode 100644 pkg/dms/parser.go create mode 100644 pkg/dms/scanner.go create mode 100644 pkg/dms/state.gv create mode 100644 pkg/dms/state.png diff --git a/pkg/dms/parser.go b/pkg/dms/parser.go new file mode 100644 index 00000000..b9133c4a --- /dev/null +++ b/pkg/dms/parser.go @@ -0,0 +1,42 @@ +package dms + +import "github.com/blackchip-org/scan" + +type Angle struct { + Sign int + Deg float64 + Min float64 + Sec float64 + Hemi string +} + +type Parser struct { + ctx *Context + scanner scan.Scanner +} + +func NewParser(ctx *Context) *Parser { + return &Parser{ctx: ctx} +} + +func (p *Parser) Parse(v string) (Angle, error) { + var a Angle + p.scanner.InitFromString("", v) + r := scan.NewRunner(&p.scanner, p.ctx.RuleSet) + + var deg, min, sec scan.Token + + tok := r.Next() + switch tok.Type { + case "+": + a.Sign = 1 + tok = r.Next() + case "-": + a.Sign = -1 + tok = r.Next() + } +} + +func (p *Parser) parseDeg() (scan.Token, error) { + +} diff --git a/pkg/dms/scanner.go b/pkg/dms/scanner.go new file mode 100644 index 00000000..7082658a --- /dev/null +++ b/pkg/dms/scanner.go @@ -0,0 +1,67 @@ +package dms + +import "github.com/blackchip-org/scan" + +const ( + IntType = scan.IntType + RealType = scan.RealType + DegType = "deg" + MinType = "min" + SecType = "sec" + EastType = "e" + NorthType = "n" + SouthType = "s" + WestType = "w" +) + +var ( + Sign = NewClassRule(scan.Sign) + Deg = NewClassRule(scan.Rune('d', '°')).WithType(DegType) + Min = NewClassRule(scan.Rune('m', '\'', '′')).WithType(MinType) + Sec = NewClassRule(scan.Rune('s', '"', '″')).WithType(SecType) + East = NewClassRule(scan.Rune('e', 'E')).WithType(EastType) + North = NewClassRule(scan.Rune('n', 'N')).WithType(NorthType) + South = NewClassRule(scan.Rune('s', 'S')).WithType(SouthType) + West = NewClassRule(scan.Rune('w', 'W')).WithType(WestType) +) + +type ClassRule struct { + class scan.Class + type_ string +} + +func NewClassRule(c scan.Class) ClassRule { + return ClassRule{class: c} +} + +func (r ClassRule) WithType(t string) ClassRule { + r.type_ = t + return r +} + +func (r ClassRule) Eval(s *scan.Scanner) bool { + if !s.Is(r.class) { + return false + } + s.Keep() + if r.type_ != "" { + s.Type = r.type_ + } + return true +} + +type Context struct { + RuleSet scan.RuleSet +} + +func NewContext() *Context { + c := &Context{} + c.RuleSet = scan.NewRuleSet( + scan.NewSpaceRule(scan.Whitespace), + scan.Real, + Sign, + Deg, Min, Sec, + East, North, South, West, + ) + return c +} diff --git a/pkg/dms/state.gv b/pkg/dms/state.gv new file mode 100644 index 00000000..165a031b --- /dev/null +++ b/pkg/dms/state.gv @@ -0,0 +1,47 @@ +digraph dms { + + PLUS [label="+"]; + MINUS [label="-"]; + DEG_INT [label="int"]; + DEG_INT_SYM [label="deg"]; + DEG_REAL_SYM [label="deg"]; + DEG_REAL [label="real"]; + MIN_INT [label="int"]; + MIN_INT_SYM [label="min"]; + MIN_REAL_SYM [label="min"]; + MIN_REAL [label="real"]; + SEC_INT [label="int"]; + SEC_SYM [label="sec"]; + SEC_REAL [label="real"]; + + S0 -> { PLUS MINUS S1 }; + PLUS -> S1; + MINUS -> S1; + + S1 -> { DEG_INT DEG_REAL } + DEG_INT -> S2 + DEG_REAL -> S3 + + S2 -> { DEG_INT_SYM END } + DEG_INT_SYM -> S4 + + S3 -> { DEG_REAL_SYM END } + DEG_REAL_SYM -> S6 + + S4 -> { MIN_INT MIN_REAL S6 } + MIN_INT -> MIN_INT_SYM + MIN_INT_SYM -> S5 + MIN_REAL -> MIN_REAL_SYM + MIN_REAL_SYM -> S6 + + S5 -> { SEC_INT SEC_REAL END } + SEC_INT -> SEC_SYM + SEC_REAL -> SEC_SYM + SEC_SYM -> S6 + + S6 -> { N S E W END } + N -> END + S -> END + E -> END + W -> END +} diff --git a/pkg/dms/state.png b/pkg/dms/state.png new file mode 100644 index 0000000000000000000000000000000000000000..d1e31d690d545767e187be4cf815abb86d1b81fa GIT binary patch literal 117012 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 z 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

+efET!xiH2jpoMBzTtAU44WD zsq@Qn>gv3?gj7JRvd1jB^DMcPlulGvm^**@fEp2DhhPBKZE2_;^sZ2?RJ3T}uTB#=0c8hk_^wKo|-ER_aLb;YjEk zefFXBAdF!$|7SM(v)g$ccZ1lm52Qqs5Uh9a$Q+k<(X^z4$;02=?;GpJwzvw>;smmm zd?~eQ*y?{OKdJcpXCe_z5&U28nJ6V3=n05LZ-os zY2_LDZPeFWl6U-`^>6Mb+(~>ovb&Q6m`o(UnVBv{$Z=GspgID2i=WI=eM}x(j;qy_ zGT9LDG(@PCOCYmKassGNk5e2-Qvmf&FaoLUaX$JDlV-aJ=W(&`!)^i=d(C5?!ejq4 z5a=YCH%=KpjQFmRU8+N1Vlc7jE_-5ZyM(FonIxU#(Fv%fkcNgPFBMpJ)^KU(b5ac4 z6WO02i6@4OtE&a;Ax@vZg91Y-li1Bj9F(7t`f0ywW-!EYK{CIvU8w;M<-S3zp!UC< z?M2ar)-<1o<3q26Hr#RAElUZc!(at#@G=>2%xjP6{n8E-%L69Y&n#EURJ3NFij*@{ z8^>sI5;KnDe>WLCTzp^_u&-}CrJZOv;_6dwBe6SyR#1Z@TDFwODo4)}I$d(Zp~hG3 zqt`%w#H_F4P=qiPnTH7nJQKZHqDNHs!{wBY|Nra1Zo{bm&XRVrj?~vPsHdP31HlV@ z!PjK&lJBb9Np8eRDTO+2QJhk|t`nf4ln~<6&@m@`htX%1i#JE?eEME@H%7OJqP&JF zr(mkK4;-RpM4WedI^1BGZGAb3-d`{zSMjTx9&>ptf(BA3k#0&B&&q*H zf0HqU6joI1pguvu)=U5rK$^oQPHgN@;z`Y5NB8&J4Ec;l*?u*=$Wt-S~y7 zPpJZS-FBnV66;2>{>H!b_7(pRU>rm@GVx>_;D%RaxDix|B=9!G%idI$F`O4(&6)o} zt&&U~*^Fp%Mbt?K1dYacAVx=i&$MxeaKT)%#|;gR?s)Xyqb z?5y_S?z8_!T11iXm)OAf`NjN>jDL~W`S56+++scP2gMfTgx1OY= z`*?o#&UodFy|$|~ilR*SZ6%l(Clf6hWa)wcowrrv&9oolbo~Ejbe;*It}zR-aUR2^ zD9VEbk{|Rb`QN3e+X|M_&C^p!=2)K4yC9l=w^L^<-#XrH0<&X*L0gc^|-7$JfVw5!WJXQo&Eh&xGZ~~(7VD}x!u>sldVBS&pwqD|CU#? z;pm__u9sN*a&e&}K)T@K%b$ODCbeYA=q0$*Rtg8krsle+6_O_oG*S0{sp5X+Ny8%} z&Ed_c5lyzUomP$40GVWRl*#f*ykVen#QFscoHcEPdvc~xbl14G0cH)AL@~Fn@$J>h z3+uCYR8P4^k--N;(j+nx9t@iZMce3bLKf5Wp!_>={(P@VBN8)s6q)p*lx%^W3SC** z*gKp#bDQ8X(KNBNj>?Idv?wUC0oO@BLQe+XVN8sLLD#^sBMGl2CUKkm~oM=q-Vkv zvX0|7%Id?B@e$g+rt;w|`ehU!s@nnst>zA{SibzWrdCm7f8loC=N!M9yZ_d$TXq;~ zcedw)$6k55=6v$Ko5uK({av~%ed-<6rh?2MNFBhi%pSl@VhrdIoXt~9v z52<-#E>Yy{%f5!{E2Ah4Q3hHR^swmgBSbq;mOclz{wO($o2uyEF&`cTCjnY|&w5j& zRH=Y+Rs2?RV8ziIe;D3#=ykW7gongbj&rd+4V$)Z4S{zmuD}95u_qV<37r#Z2#H3G znRGl-tXXw4_&}bo!QdMGn%p1dnD-?6*jxa{uEObo|GopSLXx(2rbr$k+S5b6cn8i17#kVIvNbC*!P~jy?WmW z*zL8W0tYd^Iv;Omcj(mV$oSg9+3Q;rAV-gZHm@`XJ3Gw}RF|a1#H?zZ%&YNGhyDVe zDyibl$8lw!cAWj$pb3f@v%T?9kjWLyscP^Z;WR7)fs(5NAAtsHW7&Il34vK}8o64^ zjD)hg{nU*SX}{Aileead_eI*42k$kA;v+XeJQYNwG7YF>p`~0Uy^SjBAs1>e9nE3EKfS{dRKt z3ow(N2u>AxT0$O0fG60=F?x87KjpNFzGOZ;zPmW)o+69kfO6ynkcwf>l$_0?Mb9djhp(mivt04n- z*2%y9#Yxp(nOGOYg=G_q;=GT{8N-pUe+ApK%J28QIB@7qT2;9z;fh&IY9gjcDsN?R zc6GKZed5gz?`jaei$SvkNvtmZC`h@oOW{11w?*ZQX`BS5Ku!nr<|%736TRxo*NfkX zjf)z_MfBo+?g3-S-G`u1NNG9(c>kxi8f+s{WWE|F)49fGa7(Ncx8(FU7E5pE{)sAJ zn?wT3T4!~J7(u}!&dB;%;Y-=ap8MZU?#TE zBzTa306qMTG2>_rp>thQNCZv57#{`Nb(oifz^sh=MGEa}h>KMd%!gzh)lygDf$ zYVtQ8bLZf`oc{3ztG%lB>fNk1PL5+^@Ls1zlPDGz(2nRDe@3YNMkS-_iKIUtwzRF4 z9gtTxy&&m}n`}|C^ z6tg`2J-qqY>@lT4c4>i+fCa>$;pI7P;*AHJWIfKu)XX?1rFQY%$ZuQl+e^r0q=ur> zhcZ>(dTS4KT~%6)>HR+5+Z~*>39t)&tRnDTDy|J4x_(Rehl(2QL_364Uw_&WKBu}q zM=ff4WV~4`>xWIFjkwi$+Vx%jl~O1Yx+#+gy84$7?7G$=t7UO+GAuagvZmORMw)+4 zxtL3*=3fZ1ymkJ73f>IF2vXF3@!PY9ET5EmX*n61!@XUf}Q4QvlDmx z{jL^|rd!}~u>JTct;!ur0UX^<&fxafL>drA!$tYDa<;gU8sv|0Hbf)&xeTH738?l( za@Pc?g>D8!T(!M^+sNFQDZhSrcC8lz)75w!)_HN~_kPWqHjRSb824`DV+)Q@gzhfB zU#?j#G%Fnqm|%2B^YHADb?DHc1Tro+TFlGYN43Z}>UHQa1mt-+^)!>u+?{SF`-J#Y zLq9>y9R2IBzm6m>un~8T_hy$aH@NV|6HqGFO4z!!JCw@xJdZj(*E{^Z-G`k#c*;*d z_5FO_=(@IDR?BI#o-_kP%NT-#B2b0>t+{|xBpb?tMVbfLAiX?B*-oFXBxU4qLLUj^ z%kD$!HzV#cP^LQgt&`5G-=|NcH@M>4ZqFM)(@XI$P8|7Hd|+brS2bq6ES5!??b!3J(}BYKmM`}>aBDrz8!K17KmKJRE)723*Al%-8itPb zK7Rt9Be0A8jn?@~2SmXA<$EFHy?VXcKIppjKb$PS_a5Bk0tQXrxIH>UM=9(ibP1kw zUYB4)*bR1w^lXIrCO7YK<9ovf4XS?`Nb&>-Mrt^FJn6~z?(1v(nvyc>`8bxKq4$jg z??I^W-RxECOYJKje+M+4_!kz@oneQ~+nW9??;vTw*sD9k7(1oduJLtH<`$xQNzYof zapUgW7h>*mw*)o&eo*{rsxJ=T+!EsPzMp)1SvJqY0YDiCopf@fF46H*@<3$_2GJSN zC{kD=1^w z>5EXjA@GIfOT$B#F9XzkSnmX`0`U3EaE;)ghW3Mp_r235>xp990b0-+4Ik?>W*Hjt zgvM8TKD8U0dLG3AFF2h(G0uMrxmSoznzA9U1GOHwd{vry?>O+ti$Mxs8r~?+%kOci zoZc>GM(+NqS?{}Nkag4|IJ?-#J5k>oe4ofL0k9pRsA4ep7yxKI1UfY zz`XvC=;AT)tY><_?wsZh&6|6yZ9iiV zWYi9>jaFfU|5G1!WCFj}@%`a<@BIDP2z`&8kFF@x7(@5ZC6%P`pJDZV zNN=;A)nBc3IPAZsM|Aa011ja`NuBp?a5COm85LDPl+pjN>@g`|;p*`MeYM~HU2QJI zk7Jv8{l^8UK4+AlC4qM9nd~7R>8l!L*Q?s6Eqg+9#x-vQzVa*ZEX;I|q|I(~>1}qv z+&LVAN7x+=vjU$ZoB(b>Ld zjdzZ{`CcP@dSC^XW;;p-FtVb+PV&s-@MuT^G6X;sse#-O$mBK#cCPuPO!#zurDFr5 zF$n7g5d>-K;jCDO=9rbW>x7@M-{()6hFF~A&Iw8;bY-jTfX4w_N0W~YXIscVR_bvX zXwoxZj5sed*>ekC!Ochgp;;G#R!N9XT)o=Yzd@gJ`o_d+v`c))k6+3OID*)yq!6n- zNr5wyS8#4ll|)>+Bsc(N?&aIzSz0f-yfl0Lwh>(HI+(DxCLUQvR!2}PD_M(5nKf(b zIozzz@pu$4{Q?;z#0u#ZCLa2`LgSnr$4Tlk07|OFk!s3UM1mS6u_6=jxG05cIovFH z7N(7`Y>q35mBb^Eqb7&u;_z-&7G$r_nM^|L4(cyE5|D!7*fh#*48feWl9_xK)hkh+ zgJ@r8E2oy4ng3RVD0-a0uxV@hkssf+37;ODH|b<#H+`whbVR z`3!)Q%>V^N<0fYk=iw_R9TC2*K}M~kT2xDK2Nlb&4Yq#zdd{g6T=3nycjpl?PGn_O zr+PodffBs)*=r(>4@4y~nxK%&GfVh52(;)3aLiAZ9Thm7q$}o((KY(}bSF9{P_Eyc z9A&$Vx$D+sg2O1DWj#xK2Y50OWDM|q}s*8;) zZ+PuPo~LGcfJkdRuD*vJ3E$)UIJ?H|CY?TS+P`NHobSq9s7xnmuf)RFVaRA#9@E(@ zXJba(8+FO|gj|A!5t6-LJcuVj@MSeqhC@l7VeE;!_wL!C#>*HmXi%qX0gv-Ox?WP} zrrors<@b-jv4Exjy04S1ZNpQ&CSDArvmb=(8y*vO4kaus4jIXN`qDqD1U4a_d81xE zP4TBVUk6SgVv&)Xi1*-;wz2(=R))(#BV9TS*{cI;hUQp-AEjJ{9ij%3|I^E^fT6a5 zT~Qw;@hBTf6e@BF&RkKJ;AANmAyQvpHWtrIt$f=)1-XE$oP8xV^Mx`?G-umBmb$Dc zV{w&mq?~GP0DOlMB)KwQo{xB67S*da(oNK}813RRPJtROkc3DS7_}Yn#rx+kC`Cj< zSMf-(1zxCHDFE#yEN8Mb{22_;22xp4Dl8xdRcKe{I$9jA(c!r`X*J;8Jhp&%RWx(aIq43^hv~)0>e&Vicozap=lelH6QdS29L0+!IIVeOv94 z?`1Q7{MSD|RIXZ8_;Bg4&<#L?mutgZA>&0gaEicvfr?)){B)C!ZR)bnlx}yiGTjRD zhneGR=ep9*l;I9({^iw6byCH*qDi6Vm(dj#$hF4IROQ7V8(8eRQOw(IlFg8sKz zfC%FIT;1FPpBLH#FA72}tkh5svYNX*9#0*!FrFGBSuyPRkJ4aXQ*(yg{ey<%?n>*0;**=j^W9>L^wOR44VD{`OG zjAqzPR>1A+*DC?jHZaC+`!%je@ml4mbSBQO5s~hMS`tLg?^eL#Xj}TWY|q0}{JP;s z#tOUpCZIv>xNWU77X(FzL7$m)VB+`RCby}EFSG@zPQq-Lx{C|ohU7S8$dK$?`0G@n zGrlCOZlYgG&CMfi?d-CbotsvzOi|favTlBE(6{d5&jCPOLIJA&_2aGm4Z;2f^f0;i zjGJ4e?iv*PAuh(ihsn?i?vfRasAti2dpM$5jCA-<;JjM3ejU@r@r(&p;mHwA+f*yV ze}H4UFR@r09mNu7LS%KB5i=pCU74;e!-l48{qBJu3jsq@O&PEohiyEw1(?o>yIGNl z^o4*~0@esgEe{NMsnYIsZnJZ+yEMOQz}(8^6Pih*1AL4HG3IrS4JyPzmN94wF!n)? z%u_(PgEVy^y_2(H^%hq!Ue2=#x(iOKMxffPJgR&5PK40V=!#R=UWPRUjJc9%B|Ak5 zDliCvP`LLL;&qTY%nt76-bbeUSUb@R)_`MDf4Lcu7G!;D*KXwL$kx>{^U_3S70^5?p)}F~nMzS~$C6#LQsf5&@Q!b1SrT43_W-_dA`-~W z@Z#K@kPytg5e>qy3@Z$}r4f+uRwJ1JEE8yMjFIf-`C?V(Pmr>7p~noYee~X>{@=^= zUU6S`lK6CL%rX@oX=zd0sA6n#eKGlRN2)GyfMGGt~|mcW91Z8dH}@`vl<|*^ooav#oZ$W$ zIi40!dvSDYRuyignl2(TGjCSa3ifkp#GWRawY8W5nMl0>36#gmmK!{pTpg9)mLlx zGTTzuR{|>Rw@1+025d}6J|O367Vq)Xr$b)^Ok@?E;FBgXc2ONE-3pdI61L0y?nS_g z1#GkE8Q9=zxEDPG%~*tR-wocYnAQ8^4k4qpkb4mfLQFk|Q{d8EI>sBh5#G&xDU{2O zluU&wV)X`T(w4LnKQBId>#y%hUk571ePu{CvuNF_VXZ1VZLcLo9Y9 zysLYShLF|hRGc8`mpY3F=&`+3@WJ1I&*m`r2%%eU=8`AVGaucqLV{sTm)N_+bxD=P zRwrbo(W`inyY_9!m^QOsk+-NH$SROS^?o1s%SC@D#0GwNxs2cP#r$^`=>g$lIym0E@@e$wq+OqawvdJzH=lg)rvhgR^uTd!KY&}Xj5WB z{A64lI1xsCFcMfbz7Qq}9UkvI;&z>lvlh@05|ls`fI98l&azfISHG#4jdD=fiD(B( zQnT&1Ynnli545-|UA884x*4&w^o2|LE92FM47IS6_J{(cv$yxg7cR|wh7FsydUYka zH^XdB2YLq|XFU4D>II@OAB zeK}*#y$ssf11~v_V&Mre>zISK$2u(9DW#@+XI%mCODI*S4-) zx7Wj+++TTu>VbH}Ggn8~?SOaufq?eaNly#mey3Iwx7JQ-*sA(Cd zkkT!!;*wLeT0;o)#MPSS#bod^apFYjxuC^NoW)3$*&H})zqUpL*KLX!L~qII!2{gA zz0aSnR{rm%Fx?mMEU|m12_N~Q&6E=igC@+AB$p@Uxe@Mk#)1bM$;Q;jc3;_G_;`=O zXvt)q!g(!68|;o%;zQsPy%XNk@~9b|PU@k-pl#lFo%`jG#9h16cvheq_Wfq24owZ1 zPxFc~Vj)+mu{h+ngBYv(hXwA-ct)McM2iV=*wB7W)SKma{m?a5Iz@`q8Hj+SYd$E% zeGu@Ycq{$&=|E6q>+eb4M>a(5l-u8}w6_z-w03dZz+K%V4Hwt*MtE)s$6`jyu)$vs ziy(me!wE{{>*0=PigSOV9Oe>xApB$c)v%G_ZN9{~gzJ z|NnpEFC&tbWP}baG|bFHq&AaF9(#ju6s$ zy*oai@9*+E&-0)2b9rArm-qWPsMqWHe2n}3w(j6D*_vxoyRg`G_4U`^xfQf6l|)u* zK9Hcb)%qNcGAtWJt^9v~EG8Ug$SA|hM_m=(QDHW1+O&lC? zn)=iRJ{h=9V`_7GhE$P% zIPU~K;p`7%!y0eZP;kh6B>R_%b^}d2S=VpothZ#}$89DZ}P51)oECGaIQ~XY+>C-o|GbI`dj#^NShhMkzoIU8r z<;gfn_rg`34o8S76&b;IP8tsTpSICf!U(Y~F*dNK>7HI6;gSK6H#>fS8N5?lw zML{DTHvjwK{ylrXlvXkzM{)lCL12gqnW3ud_1~*uj=50yQP<*PV{iPqXUuqX&}|i0 zuig9*Sz1{5w5s5YWkGUhN_OuhzeUcC=8!F`AN}5Z)BbabE2xMX0HSM6Qzn+OW}Nu!{hnDq|)0@_jCIkDSrz5|%wB|J-J z${tIiS%3^d>rCj21jX-8OAF(gdyMi@)<5M6F~hZ&uftx*mXuZv6A2e;cYdMReK`zq zt2Mh^Gejh|7#Qmu`bK(g;9dtb`Q*?xHiliT+-6-EVHHgjOnZ@xdITd2hjo*YWuDoc z>0zN#+DmpEe+)Z#8lETqA;;$Yw?k{*FZz|W{jpI-C95&(s$lM(f#9o?M<1!@(8SIXUdgGd6zpnKn(vGiwN>p-OXb4i$=w+hb2eB-I(b zUJ4P=eDf9SB}@M8x<8^jO6Izl>OR!1`1j4dn43ZRm(1Mk)Wgr58OeQh zgrg@ftvHDrkP^u8S;Vf?^b1^oQdUq(Tn<#vKaL|3Rn3ht2h|l^6p8TD@=&8{n>bm~ zv=m{(e)+SV!y(D>K&zMAJA>&;zA` z>XFN=>Ar+If+w}qQ_I%0eaC$-vOhqW_e&$TxGbOs(dyEriwJ}%P!F#cl)Jn%C)WfdgGW}>1>o#mztg6^AE9#>q$tJxPr5`h1<0?T^LXJfLLkgYxfMu% zlF95K1WBeMvjm&8#e^vJkpEz~ECz*gO)5A1_|&#?(WK1;<#5*!N+@0czoL|<^rPyr zbmtO;fj~$wSgNZm(#ORg#_eX!FpkPa`mc8YU`SvNc$B!==z?aMsLdl9K~l-Z1uEj} zg~R-8Q-A$TSL$z7xI(tR_;I7Yw2WL)rsRrdMn-ez z>6T0bG?8-z)c~vd-Nq)34OG}@7N7o;+la`X{saVNXSH2aL}cVe1RIavyxBmfa?8yv z(Sk_JLV7?C#CmW7ki6NN_OmE;nj>+eotOOde^p1nJ}5=JoWjDCb03Oko<{M0wB7`e z83`$(LzQAmY7!>5R!>r|eTYd3jG`?C9#7T_?Yu+1PAXUqy0Zle)~3xK9HKYwOoE9=S6-S$1hNW&y}oU9w{gwF)Him9rL_a(sgx_7b%BS9PtbX)%f-c$2hf!6rhF82qj{mPG(e~P2Ui@H+cY_L^bq;FhJ-`JuSa#*srBu$-D zK(rU)Io&xT=we`Q&k1gBAX1v(H8N@!B5^fHwj?;e>y(n%W%HFw{8Oo31Ok`%2QoxA z5baNJ%*N_J8(#5&1Q`)8E|Qvmf*ZbfN9_l>*fZoxMzH(dFP6cciHS`8U`shop4@^3 z^!7o%G}ph96Ly*Q>9p;Y0B3?TgH5rL*5Ks*ZN#4;XjvF-64t_rC~?lljN#qw{`TLS$3Y}3`%``9JAV(u4(A;hL6;zJh7 zR354Xxfrq9$vE_3WTaBmYbT869$;)8_jxF_4KzbLP0fug3gOwWnf%JDhTSMIc4uNtfMx||mVFMFNYzwG|Kh7{v2u`UWh4Dp z8%RU~wGqZZJTcriGEkS4c`#e#9fAz}6Eo^wOh(=RY5{&qM|u8P0B@kJD7I;QSF*dPFaZ zwi`>U0j$_U#%PH>4=Rd4*cKGtBGBQLNrD*8g8G+1Ewn}Lja=yi7vd9W4!L`wjL0i! zi}Fw~9DXGDO2S1q2j_rUT&@`)n{>~>LG=ht!;A|9L$dcPgbI|r1u!ou?@JV;>OqIllkp6H31;T5~luN zI<5b-0mqIUA-!VY|M;M2bXNVlLESnva?}hz3OTiW>{n6>Q_HeLK7|cQy2IFw!Gk-H z)P?8F+-o%_Uo>As)xv4Uj2MDJWP0-djPE&gXhBuNZo!EEcqj5hP7)g752IcjB=?(w zNTNN!k8X@N%WAM{n0eY2RWAEn@Mg+4Fd2cvn9|ac87i0Sd$nF;XX%m3+tbw4l$pn@ zYT(E=|kEnBRvDJ6}}PoHKmZ01fLi z-A`ssXfcAhTao}tCN*Ul7)ZLQEf8T<*Rk*rqDNhrKkX|6xN~yiZ`SEMXvl-3p{E=1 zvrXCiMS8g}Uq5#RkxlUQqpl{!#c3a%8o*_=9%Z0Vt+3!*M?X*3_t92Y z@t8T&%s*w1dK=0Frod~+q>SuIQIrQZLw6@_-kip4*35AW0jMrhE;0-x0(7m|&ppy* z3CK3ZcKVAVCzW;7Uwat{!UbkY)E!c+nRDlszFg6|&jFuBCC?wx!-|tsMk{j)(^CWTe}YGO79of1r^{F$y zFc9KPfvqCHX>rFZpcjRzl9+i)nky?-O&(-DuT90Ujj0beE|`;{uF=Qt=`>c8IPWOL zs4J|We?py^(07ARD=VE_jq~pT`Z3 z7~hq(56sA^8~W>KC-U_ptStJKJE?5ws2AV>7>ibnX)fl##mvK-RKi8lh;o8b;;3;$ z<&Dd}>a~U->Bu7~v5tb!m@4zw$F9UcK_Z}JY~Lg<OB@ygm9Im|8d_*1>88`DK{ZZuf!dFxHWE6wr2B?9}jB2_sw0@CF3<^l(M$0rY?Le zD<&?Ial z#Bf-b1a2RSuu;Eo?cL)k8*k}P&_YzrlzH4wIr92d`q)hhKszR;2Tsnl%mS!fv^9}k z2S%IcwF0stQ>$06b*#|Dj(@W>TP`bEt0awz1Y?2?UBJ9iJ#0+8ogP(+%gYY&&1h%$ z@S8F?8+^?z43v1NTdZ_02+u*2p6|QrZX$e*4Eyr<68obo-@{-(o)WssTcP1DD!E#5 z+2F+*B7ERIq-17Z4%~ix?uln^8WZh8HgCKoE(tswEat>AD(lAU3RZIyR66UwPU9F_ zE7{-|Ltyf^L8lkDe{`}w z_dkDTvRXA!UU1LH2u?H`jT0^+DgZF#ev5`A0A!*V_M%%C`Sqr zF8l0s?r?+Q-^&7#&fh)}bg#-={mvi@Wy)yFp}7tbr28QTyYTF6 z{W!w0$fy~}taqO+qmSJP4cDfREhN}QGMDqu?ayR)@$mdtj)F)B!UBEhQ{b9YJ7eQ5 zQOBUsWX4NKM!0%y1NwI+422(xwR5(!D>j+2a8bSpnM(V|y-rbT(FAVn2+|?xZxG>l znp_J;8MpjJqhQbMNrx&QI9{pjvWF%s1p|}#JxL9^Vqoz4*|RRp7W&ehso4dVA*Ku=x-yQe;!Z zDP{t+}?(2}B1e4im}& zKgN9vKf@?0{y!kQ7#4lv?eqBBX-PTNl4kmDR z43=#fXLtKV%JD|pO=&p2254ry)>CUCud$_CGYGBJ63cN)jT-?nPqIs&!p^mpm=mu5 zj|FW<9npMtro6K9+@ca2J+-W9oo;c6ikp)D*1skx-b%+@`j+_kNp`l*lGx|u?mm_u zJ7?ZJnF?@tM5mg%6gn5=&Fv z7LXys0?Dl<;$uNg&4eba%|afn`aWiDiT>+`_9|%-{bt)3^GF5GyCg~<8$xbyQgbtr~;sC zJlfW|UyokB(m?XZxKG(_x^wg9dq(@UX-S2b-w@&2ypLV_Ze~Mbvn;?b;y&5OX;AB~ zQ|nfk3jL3@EgX`N$y8i=eI*%~ju*_qzuHkN&h7}>LXBSO`X^J8eE(|{L(Q~69b_~N z8@fC?Lyf1dB>n*uz=Cn+rL9O@yYZk}gw?ap(Lc6YgcbEFYvK7Wq0JcqLg zfIo%zOrxtBVI|?D#BR+27l@%vJP$QQ50l%_(sGV@O`K#G(%WIO2&vZJ$m}_>h%ytj zCFF-C>klspnI9i6A3QUL)aOBz0YcY-Ul){?s?cX+U9l!-Q3~OV5w|i8_-K<5!&96} z!WETX6Fx5>7~&&5V7I2WjAuSFog{%6A{UZ~U8)P#)!qAZ4(7|0VgLm05{Y4=s$3(< zz?z!qb9!v-m*gTv>D^~*AtXT2*y?Uex0m7b^6qCI8xM(I*sPsLDvX zmPV7)45%`s^z^cpDk_aX)co!^L2&Qj`r1zPm%!y~fT|)u)3=Wb{td1AWlkXoXi1Tf z`R&)PwE_2_I#80i?ih(78Tkg%rP9oR`!&;U${Hll(2Bex30v5)!+8)$2x;)4OJ|wd0vUg16A3{o4 zO`W<8I6Mx_A!k#BJvvgo{{3UCI~$LmI@OWWw1iT(JX&Wn*4knkq6j$ScFIi)D=W7V zfENqzmOL91pB9NB^3Paip5ES8m@{oD2z_>1$K42h+GPHN6LE8x;rX_$6SdN0x{?8d z2g@&)U&TW!@qYIl{Hh0AREH-XUhp^;-YbrH=XMcRK)G4max&?uu)I83p~VT&Lr5y* z&3fDrenrbKap;zCJVgMWHZlWxDP|?F2g)$ndVB8_a~*Y+7K#Au;6f9@^cy3ozWCx( z1Z!A4JRl7oCKJ=xyfw6Kaj+Eaa69pSN?7^#qkC-T$ZP};YsVujK`+;Nmt*ga2{03? zxZ29_1mbVLX&y0dU*$6JV6@#5o!b_*9Cu{f7wKW0o1)v7e;TQ`qs)_?_FMZbi8x^zsTvGN*5Gs^M7o6b2h()5H%HIjVk3&7! zX@a30Q7h((*xcMfd1*&8J@bh}yYXR;B~QHQS`kyqA-Q zynoDY|7B^zftVGu1L6r>h>J?#U}OaG-@5r#EgUBNhv<(u_@AImSpIB_f8LIf%R5qT zO13V)c{Q6LTQg$Ot`#*cxVmqGw{ssdoqJQYoojoVIm#KC>cHlF0L#`6nV8TN!-r2X zh;jZE#@BsRH2Mb#MZM2#oyxfTAD6AMaI<^307acQrKwBzq5b;B2(m%O+EneKt5(T8 zTUClLW2DXbCwec%IL3@nbMijyDCQ~`d4sk_9 z6;A`FlFfzC&(Ah4`S96qkyLR3>|;J=w~<#elf{#V?w6Ctap?of8_DFSogu|_Eoi=L z(PlS9QNtK(C^8pb$Hb}cA94Eg@5J^G?zL^i-)`kCnl`2i6$X%QrU0=2WupZFR{H7} zi;C891}~*55kCQkymQvAB4TW9B|sX90C(QR(mOTBQ#Si;_2uql0FngDYu&+ywPOSN zl|1=QeR}m0>(3PdD;-tPse+TJ`-@$MJdL@j@XkKh!O`5PSWFbPteEU~gU~ zZPskwe^e*VE<+_A&XKA{g|*#u^ZsSQnW*wa|IDq*;M|1jVa9388g6x;39Ux@!C>y{ z^dYmRPuFC=@kaO|LOf>h>r-(#YErIAbi(KtGPN6e2Z~vVPmz4BPao1T8m%kfKjt)b z8OE7FupGCN-vqPh=rj6t0inH}H8isR+OP>pB>Yu#_(A}>xNl$i%=~wR9BU9~p+clG z5s ztZ>+{Z{MEO*50fQ7tKEyVqryd95=8N#GM`L-eOp!4AUXw@tm1aM0b9_s*>jv$@AXC zjb7qynzndTA}Z+Z=s?_I6@8H zt{hFvo`_noC$S#ft|aB`;f6s zb|;?6a<}bQemcxf?;>Im$rH8&EuCA%3jK{(o-O#FZ(sf~lp+_fQi7DDqOLck#TI!3 zHKGm2N!2Itdr?WyCq!M(*vs3OLyS>ud1-qOuu2Ky%lhkQoKU*x#u?cW6}5}-TLn(r zxi$5$ZT=%>F*6eR`_ON@L`{T{mX#{k%&PkhESv5UOb^8})2~gCdCT}ehOv6Z=|P~T z-O>lZ8s|Y*5H-7Ky4~E!2SXAsd4_49Xt=bfNU}qnk_FkNk)rqVF^P0=AcoCK$2lU@ zs&_|$;&4Nc@LDV>F$&dAo$fvTPDitW^*?K4EzJX8K#cBa5?!v`PsFAoIgMOLH-qlm z@Np#3mQya8LyfbLLh=c9RMP7$tpQ=~o+ybccsyw0yThY)BBK(e;+r=Gw4+d3#l^*Q zy6y2e>P-L&sViMZ#gv#h3&l<=_!ycd>S`ke8|MF~czpAy5-3=QN6li~7&CZ833HS^ zft7{YrKo3KO%$d06ISpFpV2h+6marc*1!#-b`ql{l<+d5tp?&zty3pk zKA=6=?!(Tu6PMd{VFM3%7-u|e*cOB$jw>Imeb2C_l_l^X_B<{7(WCW7{1!t3Sp4bJ zBgz;rT81z+;M>2xF3!&8RP44m4jefXih(t{77YhgZe)fwAJ>?J9o11eZ|reE{+OL# zOACLCZw5adwd2vh16)1Y+Jm9c8Tgp29Ss?@27%3hRp0)_XDs++BQph=1?`OihjI`M zxlEp1ckTN0vnztCUhsQjen9+3&6@d}uyYsf>7~_F}i5I!6^jVZ30AE|rOe;yGggL#aa!0PutXYgLUz`0A1^0T&R)mEu z>8?~G+LT?b_+Kr66)M1s_htld1V<4C%)^HdL2t$RL(HN_fdQOQQ zlmau(LcYu;l3^NH(0xVTclXl|qwllt6}XRzY_{95z!3(_S`v+}#^%%$P{&gxMKPKt z&H8TsZqsrhR|ch_3_TdPb3`Kr{O_Rr&6(UM;8mMnl^sOWhy=lBNcUP7Tw!P^CU`a| zf5@4ab6{tuJ9q9#bRM{U3U(mT#*3XD8IM5jm`Z})ypWz2frE_3p=+Rw) zd2j=MJ}4f-S0Grt8}K~jV&d&0s;OoQib{u-Z@+x}*0VR~qhjXDTZsr?4ULR6c7T*P z?E7QPnL}CGs8i4fomJaXh2x6j+z8A7)y#QUVc8YWhF2^oMDAGGQLQmd}#noYiW z_wHrx5APw5zH7A_oDts~c}loyl7Ssq$D|Z0CG=MQCr|M0@>$cR(OA3H)+%1X^)!ky1s5w z?^!0zyr^us#tQ6?y99YdqJ9132|iY}W5^iaul4g5wBaIB#Fpfb$&u z&dw1*p~w>l7_Ta5o0!^r^*mo+AcaF8=X24Cf-35&+oVawU;FK#J|U31^NutFYN~Mf z3(}~%zW)v|DSqkoRyv3f0UaccUu@sm*^9gw*?h65r_d_|N6Suy)b5uK( zHHJ&e_VY8Vu5Sn@XINcpz<}(MFD=(tC{Qz4R(YXR6w&v#A74R+6#njwXNUIQ*|nVG z|DG^(>@G_RPYsQ8X#Q^8xbf$U!45%Xh;sxN63Y_`*AE=a)Qvl`>qt^-%{#t)xp@f9 z!C=#m#bx3&;JWZcW{LUQ9Ib#*6F4M9?IpF@E}<1eGWc;1e9LPmwx!?3VMie)tbvy4W>P9dDrz`;Ak!yhqK;SSFTz|%w7qAp&b~>dVVdru-?Q~ z>h&($_e=u%o*svJ|qg6T&2 zRVL@J@thl4d0zb`i&mkPot-V+4z;_gLeJE6XZG(99{GXQU6KjlSQHST12#oD)t+id z22e6os&wdr`aVWRy1+luiKT>C)tjqpVPN7= zvG04+|IzLj(hXCf#$9=DBKp^2inQ`*?LRQLj3p`Xe)NT5%SxU%s9K1;gxUols{inN z5SRogeZTwp(!RO8LP=k$x)KkNCUBn^5^Y{MH=CO0XKrQ|GR^(e#OEXRICKz`$I7pv zkrZ_*ONn++v~kRRjJdh#TTN(3y@p=U73e#nX0&V?0v!zCnf5Wdh032bPg}@LiiG#0 z6#oyQaSNn>J|+$ci9v1c0|IhNAH4hSkKqLTzX+%Ya(F1sS_HT?P3sZOHH&h!>PAt1 zuEkpj7iySLCqpB^{)k*C^)?OqLP?xTmH~WmLdgnLWoyU`EvV5rfQCPW0Xc}-~_>M z4o)8p&Uqe%715pDY+?>gYziWI|LE+ttC-bw`TI8?nQ_Lbi8P}LVH5izN5X`|yA@rC_}bz=MnTdSJJ^(-7W?8*o+KvraZKCu4i%YBiE~jncmOv~DU@ zkfaRI+C4@=ZoFgaZ=xn_%1McgVS)do#jR1Yr*M;u zV@91GF>a7MyP^JlFt50PTW?ay`As4cB1828r^mzcYsvQD@q8pn8Icj%yt1S5mcJ3O z=|vKpbjoPaCmX0f;#?hHI#O@n$>66;*~enGa z=&Wztz8y|r)I1G&M(FBi62>}a=ZAfMm;yN{B+CQu$gZ2$4qr_nT$N=h6c$3bA~gAv zuNJIDd?%qzG&~~6nvy%`LSTAB`hm@UfGQLAS-z>HN2p?n?mcjz5Rs1h^Aj6moC%@l z9qh)|j<|6`{siNses**m>p;ED933|tYX$9(sz}O6Qg9@8=x$E`gEZR|I+wVAL}QE} zd3&{;!hPp}B|t*Nik>eopPaF*P}~oAa>N;nOiE+a1E(p8*;*x~r4~H%>DqOpusX|R zOAcWm{mk2&Cooj^F-lO{1YNc}ou8j={O?J9?d1Ljs%J3x`f7bRdLk_U&fioR}w8VR|da_~CGQN-cdR&M)*00Pu|$T3AKF8OrBe*gV3zmHFI5kZJ%D)tdO*gx$_U^%bw}-C+ zV*%G#_i^IK_wzXagasI8Vv<0r7l_~`WK$8i{Iic8>j5R`#d@{ZQ_I0xlA4ue4+mHB zr_u5uQtqcC@Ui0Q3s1pD$kRP@oZr=+@-)xO?hfYo2uvE41D?776t!sCQny>1bwILH zd(JNIe-NmGIHL_zfW|0~qz&TpIb^um$t-LX@|UMxI(HZ?wHDizniV~I5e-#`yrh6x zvw8yI%Ip?wnG)cGXV|Z3S+D=k`tEa|qD z*{1ioUuMppy^j8UCdCsm-Qjt8Ln^cH*DhO=YG|Yf$J&dtNzc$QvRdCCNx3Z<3s_i| z{K9BBzSWMtaL$vye3c(#HV2(Cyu&2r0VA0tmlVd0USPB}frrOZu zens(-sIDe$yr!HnlAUf*oaB2{xIho}+B|gum15Y7m(Ze49@2 zdm*dD;EOv=UIJH7EZ9(c$QkUHC6t?XsJtt0c42&DJWn`*SYTEDrJzr!h4v3xV;2Ul ztp-TUYQ9SSNaf`ed8S=XAf5J;w{J%)RMGk5Fbv8?s*>LPe=7mw&76NV)Ac*} z{oUk}vujiBN#=VeEmDMPrFL$rVSnw@#Zepb5F z)qW57aUGx`0Xk^`V}X8Eks2LuRT^ojtli)~UIw=k>GR{o6~kwo2GaNatb5UY&Ds4` z^HJfjsw6pAJQ9#K+*>x>S2C4VG6(3RWN7h*Z?K9ISwdUPIFu;7ZI99ahN8Vex+!Do zq!DKS*N*yx5??YbaFAHz_yQ-L^0m_N5Fq~({KTTfqM-ZhOgHadX=oxV_^i(zmd5 zh-sz5InkXxH+K85)dFbooBt$-0eqo9z!Q$Rwk%RXDQ3=@bN|UI;(TNAX@OBsBhU{m z!aBehlx4q$c44>YpmF(j)pgsHj(RfwRE|7g)e7fy!+`_a3j+>vC^-kvUy2ZF2T5vO2MsL?SUu@N%DI1 z=hNj}1V~?DT3WNO(|GnZ-^M$^HMc~SgfsHLQI7dP8=3>uh)4riMlxjJxIE^}nKWY< zZk5J=PX0&HZ^LlJz8tI4VFGxH2?H{w5#!AE$%J%rmc;FVS&DV$^7Y^=DK$`ve?SXQ znR_exmJazGJ$v??bY|ILMnKw|L_1{d+b7}=nNdB?54t}sQF zC)Thw>zV+CDa`0pm9+sbEWuf@gR>c$;C;}+m>f>_LT8aX@a@Bq9I?9v5E2D5r&`Sn zv!J~`=EfLpxwAbu2XfPjT{(}0GQ)|59z{KYIhxyd0r|dO=UPQ)4_S_RH0xI>`oBsPx>@-~&NkaM)f~IV!GQ}MN z^aGOkgvy8Su|K%mhX$Fv*j_$8AP@~PyQVdGtQg<`va)|JdX3UpLk6Z%!gJX97Wu{@ zDd3Y$>>IB7;M5;7x*h$k1zHf`3YjECUw!A?mpdc-ajoo5Noj;W28!bL zxxN*ML%^}wrC7`699im)@&%d+*_3#UvVQDzcy(^^uzhFO!jGx_7Go=EPPWcnQOpz~ z^~KDbK#hMRI_(J5z5UFYTGgE$bVrWdq0pjVNY~7`L~h6!7Ok)r)%tUd@LDUh=+j($ z-y;GN%>jjKR_>lQx8Kdo<@M8)Lyz2yP94HuT0}X?|00&qtxsQ7Z|}qJRI}*DO6{lg z1sIrqa>;6afv<^Y;xuW@N{W*OtDE+qS~_b|ild zW`6)SEaCa6Y%???oCB72^4w=(esS!ajQ3EYlIiU_&XIuP!RV4cQg%5W95W#^P|2P= zBDfgeA}2=#S2(LW4_(lWt9}h7@6G5!{p^#W>4-=I;x{3nAXjO&QVSmdzPN80fpqd; zA2s~^09iW|o#sXu>a$11i&QvyLBjxV=w{?r1Hi z`|XZ>23#$AyimmUk|HP5fWS!|P1MrD$g6*A1PdW z9-!Jy7SZcawq-L`pJWa2XsUV53az8<)D-=3pJM$LSF@zQ&Z^fRcuYf=L&uuEM(J&D zqH=4!*j4DBWGpUX!;fS}+~9RL^69QEVgiV}a^)62&{s4xo9kW`k%%F&WCQ5ZIn;Ql z2QN2$=rCU;oUxYJAfwB7ga26{?>EQ*!ZI^^64&qn?ntD?^0P*l z@9~2gCD-kOsloW3`}>^R_zKy$khDS!<4AX_o0`APV*XAgjtsvgRuslo|A-+J9Ujn) zy-Az2^R6D@;bZRI=yjb3B_USa_)JF9K5m+{n#az`k?Ym}{TxilA~dH8zZ9wV{8(a8 zr9aL%?#26|6HAL5{{CrnJ+u&96p>UBeZ)fi*!i{lU*67?j?a^rBRUnyCtC&GE*i;Eq>DhUqwOaI57QHmA}k9W~5mI8tSq8LtKX&LD$OJH1p6Aq8NV zB%)P!z8X&u(=}@s#nP5jd^@b=^;^>x^MUO$f~`}BC`pg^U61S&%$2mMkD;Xx=zAy> zT&`RwX_{#zTt&zLuXfBe6iH+8%KGAS$8h3uUrS3TzU{fctFLAuy|oy5M?9$#2PSqa z9wCpMEo~VGIO!4{3k74|yW>%%gDPVF_%?he_%DW_R&*LETf>GNGq9sBno~40y^yj4 zAk&I`F%$u$%vtk8fTvn;geEP}1iBSNBmu>9Y@L_an1-bffX)ypwH!3;5~r&c2~*Vd zC?$N9A|f@YGX;C0LXqMSsA{)nM2c7g6^RQH_3#59?Cz|f3kr48Pap0xz8BNY<$k2O z!}e3T@{neQ(sea zilJR>mXxhFls0_JZgi|+MO6lOlsc)(WY1EH*qVLxsGw|4Q>ShK!k5$(?t`_7Sz1A$x)2XVcVqPBhqGpl9wd(0fq=a! zg_C?4U)#8@KvjI^R(NGA26X;?9&wN`oK5>~Zi#nKtQ!0<8=?V{X35bIqIyw9P08tx zSNn9LV-+F55;Fab8lREu34z`6o$5lxYDNrCnr2u^2woa!GD)7H)e+@7m#T(S=6CsK zVpyf6H;JscQc}_gR|z|{TK{kd=s!NdOp=~?XKQ$8;2QfMbt&H49rRRKBPxAJ;o4o1 zo$sWK9zO(9VaJVqT4F9i9Wlq(_hxj>6a;uuJA>9lL;Bo|)?K_cw@L97Qmg8HqobA? z4<398x1{W58T$=8WXUnPcUCEWTZBSgR#fvP6z=aXejUm$6_L<_^2Ci0mjvzDn_M;l zpuiNdN7J%ehODsr2^Lye9}Ge;KGMh$ren)>EWs+NbYUKBfAAT_!x ziTV;e4N>T^5u)n``A>WF{r$I40C5jOxog&EBqsW_W`jv?X8E^vD&ndJiC;~MO~GT7 z*VKH|mb0?S18m9?lzv1u1)||+g{>(}Rj4j3VeQDI@GXkdIJPB+kI?Ev%|;_r)8D9u zW#Tsynq$3x{`?6i9rUIOSm>Yk@B6K@Ds`Nk>F46&BGT$J%m1L_8TU5@QP%b0b3UBl&0qiDt??1=6!V07k+L?7q zAt7PA%U~iJR)lfji0Y7a66MfIZ)wrHoOWu@A5mY)yc>D3mTOx{SDVxgj{qXxmDOJ^ zd48O?XX%!P>twN_x>O0)n2h{-+o6=byej|GM{TGuz_tQL-yTHwB1MdNDaIMtG~H&I z(K0?VQbo~kREL3oo%5YHPZCMi;rxPz<}g`v&-63Yt8s}$SHec0`TV_EvmZOBCjGA# zpc(M*-qGJC_CT4TP;a(K*x_ z&3Hkb%RG%WR#zp}52djOAL#IQpY*qr%rEx;b8@1@K%k^DhI&_^dV!f%wJ=kbdB`$= zw|3RwL4!U}B@NxO6%Fb|DxgOv6ft!T==?YoJDk+=cw?(>Nu*xa5r_F_q|AN4t2r!^ zru}yj@lY-E1`Ro50THKKUOe5tb?esT&S{*#(%}o{uM1y%20NfHDx10B6h$`?X)f<= zlO|7^q`$-*7;$27$7Yr>r%o*o3k7v*PffCC%ibUyw%OpdGEWRdHn+-dBc~+xB?!b< zGZNzBX*FkJr$_#KSRFxjQ(zBx>$qj-kiWH#K9YCzsF%O{nDk<$66q9NTrR#l;;d+J zzmKvag3w?6YU_1KhzEeIGTdd<4cwoG^<$?`m{2=*kB9MSY}_n(=ken|ISi=rXFDgA zL~mo^b91gPs`6k6j*I_{JM1b$KXY`(5`=;4g)_vR-uq3byw@*ZiV!>?_4zI0+koM- zeQ)*Tmc9|K+kqnk(DcasgukW&&3d4!g=Sgdl`Y-~l-S8p@icrwvmj-m;*4MRec#wP zTRUzOB6th0S-L3LTeYWrDIn7S-Sg*lCK7OX7!GtuE!+I&&fU9)PtP=s@&IFd>_=&{wz6i93&7=lqpzA$U?|dV4p;(~YiX z?ZL2R+?g$z^imdmQ$KI_gjLGgVj-546-g;3<``ip)tG|24fO(5iO2&G=efTcmCI9* zD~_n6^MuPK&U#bxX73Vnk^iZvJ>P*HW+uW);W}6SteY*$A)d$Ks4ce-_K4WHapj&h z;(TN}iVbOc0?L4z=n(V?%(t@o`k=t!`%#r~!OCpm6Z!cUfG&_lTi_Df`t!;@Exy5; zZra-6A{-zBH#co>B7gy1AGdgW?#L5_xynR22$VA)hp!D@92iKN*2%+2-^ETVNh5FH zwn83HXv&mL=R$8wu$WMl1jTOv^1lgyC9jePzO?pA@h*tTv)^9-8j2<|g0oDx{&wbP zgZtDRGGm%5DV@ogd6F)KEBGR5GjX_UKqVcE z)NF5Lp^Tmd?$Non7RnTR5+H#0!4o;)T$4T|6J*6UPb08? z_kjaZ8)I{wsDIgoa^MKa$75lEQN)D7VY9NrNwr>$PZSFn7i%cbmYe_*(3&7N0Ez*> z*Tq64Ed^-=DAt8b1~nEb2lzkGv66OE>RnrkpvNR^aI_h|%~;O~%{hNrx_yxbP0~8N zq&OJTH`eCtfkd+CEr=)dEt;7)i4Rwfxcn6f8I8SF+;`BNnmdA#i27Aa8d)9~Y<|{pDCnOBco2n%p{nP7}hB*i? zR25I@SaQ<_scLGD;V{cOa3EdN`V}iVfjs9hA#ec18i$~Zi$yvc3rUxNGbQ<7BXyM$ z3MNiy$6}Jw*F!;};G@e)VC8NC1hwl~pNICMH8u%75cb@(-1XctFrs1|qAxZy!?nU| zPT;euDVi!MX+^eC_~5~I&_rX;Lgk#5-vbT%O`?m@!6wp6{3(bG0q0^lu}HM&mOnd1 z8^N<8wtSoG;;Xwx?K;zJ@J$|ii4c8aM+wLmHozM-&{IrOt~J2I!Yf!CF`T`;lrJjbg>XT5E5fdHjU=m*`Ux8CtJ0CYhuP?MIRp6Dq|sNvxr@UePe}} z0Cw!{pndq0C@=YVpu!?>Mic7I@oA-}b~D-r?n4AG6oVO>8Rf3aD*f?W4H`UQS#m2~ zTLeuu40-2k5swf;N%k8q)k2hOdz|)HVquluipM32+lUoG=%IOyc+8~&7rv1gNJt#)gMIR`)!O8y0)cYD-#Imqpy z9es{X~RR zOog3P^XM7=dwT*?8=0Y~v|Q?HtEbiu08gIwT#YFf8Mb!H+HddwnQ1Nk4;x5??l_j@ z^yBd*y?)ezuYdtq{Fjo9Nyg}9FtG`9b3tU8<}x}ZumV35zy+4OBtAw$ax%)&ws>?@ z*!KlUtPo+o{5IY-$sTM`$R9wvW-DZ%~R0y2nRB}VD^wYkIR!iNA z2991V{y`XDNnn)xCQoExAaLoL`^$-lJQ7$vW!i~_jfiOwGYjej-=g>~;>R(}5x@m2 zOW?ofgCV~)Fi?cUhvJ<5P(FKCR^g*!v>vh&kqQZfh>Roq=jEWFt-}`Sa7!iD^qh%W zfXoyvkFC$hTqp9{oW=JMiE0WSt6W|CF`Q(-{wLSJgiRw7@U@Lsu{JT?x#LDfEWs6| zSA8H#Scln*Xkc954IJ1-B1Nbx+QCrSuw)=h!x50?&%z@rsuYQV=hn^t{I`qYj9C3! zH-@Km7Apk|uop#zgkm%On_t81uYuiu4`?dw23C2;`RgZdB{5!|2DNubLDf6xHSnrE zkn2f6x=1e>*?R2dYbEO!MCk#Oh#y*Veeel9t7wp+B3$GdU3)mc`eWV@pMpVmSU>Fu zm7wD$l-NFF#vrDMiL{1u+7sqRLg=gQ`gr>KP7dDJcRrU58MZT(TDYHWGj7N5W2D}3mSu4yhX8LXUgAgRikbyh!puo?qD*l^MKm8$n zSP;&K`fV+{jc_~v`n_{wX_4qfGC#l2(j=*z2+;H33fM@-n6yFV-ciH|>>)`uDLFWU zY(p`;Nx%!odC%jkrdnh?I#{0A`qLpvV~0lcq*0zbxiEl&pJNE^8Z>>1=AOwwE#FMOfRV5FoncbAWhtIWb=Y{JL76^h-a^HG9?A$~eGDrG6{8%!0D!LiX5 zj|dLpg5^In#NK7=2GvnG053=%!N)V)Y)Zd6fS40O!02uRULEZL8sl6v?$qd8G8|9@ z35Uu^XmE4CvMRV^}y|%DsPq(*7gq!@Yk1V zF(8+A-I*)N`36qV>$vHt?{5c+nwq?c*r~g&rj%Xp%vL)cf#8pg9NpIRYX~Rkz@Qp$ zN+A6oz4kRc`BbOk9J}{Z=v~?r8B_sKk(;Kk2jnkB^r7+ks9p*=pCm;ozqY)aVf})u ztm~ojgi(|J^X84wu_62S@0Vmk5xM`*h!8?eNy8zw?!iCVP%PpSBuEfPzY?dXAgIi` z3C{Q%S3h0xZVq4}mEl*piY48Fipyed-5abARqQkP!}w*DIac3$i8yqNy^6p4RL z>7A)=H&5B-f0Ry7;6;$2fHy}=elD-~2h{O>dd0y21BN8WMqkk1OVQnq+KkIHcAywDT?7*Gd7)zw$szW2H=hK+QonBCMdIF6xdm{yAl(v6tPrj z_f$HL3U$HkfBw71~lN95%Nh7}EcR(EGoC8w#V zgeddRmgNnCxyP)6f6K-H`xvn;*VcU;LT^FW5C>6zQ@*^EUvyn|$Hp{o-n@*#4{m24 zqBCr!R6-DwvLXjlezTb6$bZo4FNmGTWztl^x(&+s+oND@NxGJHcr5ixJhktY^!bzP zNN?|2|NY99aii+3xN$HJr)*lCNlVu_1V6a_vA-$m&;bJqv_9+ZZ{sxH*E!C0ROu0!u3yeD=59CX#>hpC`3r20Bri;_Dx2r0X-Pq zd6W_jbHEG$pR&9IH%t!><`4hcocDH|Tt1##GQDB}tb;=Ef!1dqa^BngF>vs+y4sU@ z@SLK<%c^hF-~%51W%(>F*OoldHD{KL%V?>lnEUeTJ+|2E1TNiQh^WFEyl@LZj02%h^Y3JLpAK z)MWT>nyoAFUD)hAn@L+Of|2B39lB!q8c8qD|5ltH zF|vb#Uaqdx>(tUWYk{-uYya3g-o+&~k#M#b3u#LSfnXhbSTps@d+Unp`%k_qJ^3nW zxVRjMgK-a9F@EQa!}Crd-XMr8#q94S3(M@#m?% zR!JR?0nEm;=xKbEI?$7d8!RX&|8~V7P8lvcJ!&q#d>n9W%^kNH?G)lVuZ=OnAqu9b z3#R!L+$^0|8%QOdqP#u+nr1C0y$LJ_K-emJGMcgYUAx9H+Q1%=!fwHWL$_=0p&|{x z^6YHRjd3@rGSn2j|JB6IeT`m1nYxTAG!)V8=JMaD_3=bh3rMr0pfI*R}D)61@|80 z8lx44xNw>G3H^aLoUNogz_7QY^ep2p%mE2;3v`#SgLd%A%a?Y%VR1MBIE%giaPD`c zJjM*>d-BgeX8b$x(zj^SW>fjxI>@!gA!u4k(^pPL?8P@6a#Gj+E*(b+ciFRthf|Z8 z)u=IOPVDW?e-nyj=bVX@rr+M+R7IUjGDz$ z(;+)#^YU|8*<8A7IN5N?gH6Y=G|QsPJo%@E3`2cg-KNW+_21&u(UA9QWOm5?jKkof zbJ>IWx!X{caMtfpcUyeL5o#MHOwwn&m0k86Qz5SP?8>PJ@5S71p{yK2SO?|3wMnT7 zmkUDha-%l};59Ljurq1YU8>)63JTA_1a zhhZEb&sAt_PBPFJojYfl*VCHwFUx)M&1pO;bM9SqLUU{z0o&VLJ%+cAn@r{mK3&x_ zL}wXPso1YTMvkm1ip{CH*{1HjRUPi&D52`kURFD|;#bt%J^x$Xhb^30 ze<|esnJ>RVx%~6;rT($Av}!{2Vnwmg?z^gWixv{A3s~u3qN3o7x030v$h*DRXSr!k z$2~8p2-70$BHtXp?(|@lJ*WTU9xV^8G&JVK!lLqPpb4F{Z&8pDgu57JY3sx;2=^;i zcLrmQox73)M95B2e_-57zq`N@%gjuitoKhYH9|~0r^rL8MFFZp4^r_kQ*@Wvw-t-_ z+Vif&Dn%(9S6ZiBX5kf1ipJjB)pMBew_Xxpv;fw~TEr(*JQ?K=c)5;M= z+vRI3Kb%>q$pgix46b~o{?;)a$qRxQMpe6xqDusFurs{+0F!bdU1TEB)KN9vX|E*q zlPgJLtHV?+OwugKuZpzO$&L$JKu=TET%3sD#6sD~uFK6s(@j9XbcYY`BAC49x=404(6koL zL&3MI1{w0-WOJb7%z931Sn#7eG>e4r0CWQFCVcyNFOo-W+nLKBQB1o|og|H^B5ulG z=-L!dhm`eT-p=gVUrKxU|K$kWWrpZO2Dk!und!vcKr9WwX92o_=zvZBO9E|5W5JdFE|3HK%S6J|)Fa4;skH7qQaMmc&nh5^n9JFsuIr}{K3wp4VSlg7tpuofy}>!FDA@5KB?L>~0--%1LyPFH z<&%lSisl(qQwe}VPy|mHIf;ko;sG1lPdG^m4jfLV+s5d;Ji5r_n;+Cxote;vUPQHB zyA-uuueq;R3*o~IEg_Wn>8=6$i1D)ND`xXww5oE6Nf*=;>^nhoCA|K@3FnN=g&b%S zq%H1qaEI92Z6_r305q5HE=jk?S^-XraCK#PWWL8hQ8VLQ!7%~x* zNhgYa3cuz!K)~X8Z~Pq`RA?}b(6^xFe4|BGC= zm?4F%FV#&JPp zh4CT8xZ$welTv!6q@;+a!l6N)!XGn<2cSU{PmHKRnc*vu90(XHZo0ogy(o@k00?J- zt=TJVnJK`a>tLdl!qK$5+%)TlR4f<6xef82a{v3;=+tZZEz$j7YK;z#y7aR=xA>amshcYzV zVyczvLt@fVT7ZW)5fu)E7G>X@qJ*wMkjw&NP)12^_q>A4I!^okco1dS3{{DwaN?N@ z2c!~inXCjE{3Nw&g>$3R(}I_x!)(=ch;X=)1taV#YFk;mh6C&CXcr(dwT29t_-^G< z7VTCKpuBGp9I$JCg{Oe5tHYr!o^<~}s~gPP(ns%Dv@BzXltcO*1GE^2RF zG1)-r|CEV?3Ct}av%-eMNvs(E1z*vP6?3O!A~dG7b9vQ^j9)SG!-ppS3KGK)5i**% zWFbMA9P+K`{e%1jfzdfo@=o~sNKRJc5N6Dk9EgzsF8mPm`QCTe8CIaF!&Fgt{rdZZ z!Kb+01D+PQGiJ(zCmBQvRrc-^0?n}gHJ2a)O3i*r(||s3+eHZeEE33ceqvLF@BsXm z9sou?36gVp<#_W_QBiw^9)p?=)f@hNK4-0SV>(~*$ZY^?FnKc&B3wjCq^O`XHbDoC zYyyD1Eou}p<}eEi#QB_dr@DjNbJ)wxx!NQ;!1X98Z96_ zO>;`BKF3$dvE`D|#ze0~Q+VC$q=NuK#*`t* zph1`6@c0n83_Qu@gj6x-a%K%2{^h>41c$rvCliXcdbh&o_mA{GXXT^I;sgMk9ie{o;)etoYG&+oaf zYv$xUk7M6gY-`)L#p2kLCr{4kbP|@0kF7SWMlqG*YeI}pEchetKBf=-`dR6Cv~1Ft zlZkhnqt3fNXF+=8dWkPg-M0(%b5R1q1iURPSTOt58aq~lW-4@zH_1fB;2%m^CaPix zLthVpMG67j+?JK+Y3|R!HdgGHLx-<33>Re$KTfvBGElgRD%91~Ioy@0rYLJXJu_zP zvH)Pzb1Mf)p8(fUthb4Q1$(sHA<6Rs4uWkN|76JYya%TsCPCBtjTQ@Hz+n~JZ3QnNc&3S}G}7f+VFK|Lqkf5-_SpaK9;)lRsqq-yj{BCBW_MO-oE`@R_;{lU%TS z!YuTGy{r0~wBV)5wk{Co{oit0@CfaR%2H0?$-IltEaPG`TXB4>9+T1O#Owct)4!rf zQo_ZQ!P`+JH)4dp_@S}t{mQ2o#xk!tirvZoK5-tOC<0-^?!b+|yrd?QX$>qfSt!iG zPd?EHN=DhIJW$-^6RE!V672ywX;55nys5WbOr7I=Ik9li?jgm4Rb=_oS)Rafa42c9 zII3dX57cZnGRT4Gj1a>~r>XcGHUL9Mj_=&F$An^nGW$1#GgN`_{jXogAkv>mvH!vl zso7LGAyf>10DMY;KoZ1bkTczPgpnP!jlg`3 zxw;F+c)*nKnF}Pccr_uTHLo)uqRwM2H5pprGpPl=p zZf(V024=XOyS=I`myu!*{+_gfuV0(MBK=DQCLHZ!G-vy(FUb#{C9-80>9L$y@#@4J z-__KuBZmrCd8!ljTN5isHu;pLr~mEG!L;rcC<*|EVe8BQA~s2Puu z6!@I+*YdL)585swO)_n~#AWLr{8iG#E%p8T_KC?dd|L6S1-*V}_Td(p2x!@^w;BBv z1q&2r@z{J`R<@Pnrb!7%btcUI`G`ZXcVKTt$l8bUeqW~nf-ZgkXgFb5wp+qw%+NkJ z*fnwjT%~9N+3_WLoQ8|kDh-_n0~isP@Pk~gIk&f@-)g2g=yd%qdBIuj=&Qwvmb|1g zXnr$bS69=uJ+b1j+waEzVMNkko520gHZ63ZEK4=cCS9>@6DNG+#zcii{Je{~xf68? zhctY>$V_~$K#<5{oBaLTP{J9aImMNGVthB-;-+cD0Y;Vqkp2@iBq~%Pd+xEw19=2cA9G@pRP8R@pXh zUcdHX=>LM5hb&s=H*(d)ubQ*h&*@&uzb&0|oCnfJ$e*H5ehy|Rg%iJ3*&SgZ)mz+J zw>}N`>lkg`Gwz|RYNv1{_sC~mx^(Eic6VfAvIpWp(=@KG%9!=T!~~m0dLAqSw-ue* zXisO2kF1wQz2xvf@{yih!}{xC%Nh%J8Ds=b$UC!Yr{mS%sJx)MI^I+Y0?3O6F%+LD zV!L4d{6<3&RIoM-;zDu;yi1?Cae%&K{*(I?#Yk!o0u>pH1icZ99x&YC<+}H2(=_<( zKP1vLY3$|Yg{&t@1+|!zARZ3@61__^93N&ZU+*3317%#uqvZz2WyXpyEKUCsUkUp`r42pBC|6G zpW@wWmZ@ZcV^a@*)b0+4DTg4P4^s<_!DsIL{(5@Yf^^t7X2S?30>W&(o-r0NECm3Qv_I%1a$q;X zg4>DgTxf``-)ACR`~BnRl80CW(uZPJs*X*nBwq1wDLj0;8u6%<&Cq^_d423Aj2cc; zf*6A!)sRYqJnp_~q(m{3{<3C*Ko54kDfbm55W9sN*q_{$1wWQn^rmd4XFht09cpMT8A1%otserwEg&s;sDLzNEW6yx zddL|BHvniUjoGrz>OKcxs1(7F7LH z21wGNrenq}9XqPMNt4>l-uR=(sTuFxHL|I<(q~_&srPVq|9SP=?i^>hjU38OBq_Vw zKl@8lfo}X()L0G5MPuw_VEDc|xOJ{t8BU$(8IfT`-}h)Jn@-c1b`_Y}e@sm?3gdOJ zellni|5~{t|BhLBJDjy=yGy&em^5=ey3PdF@cJ?JneS*dI4#f6voBhe@cIl2bLss5 zx4?kb-Y$IW1C?qKZF6o#v~hcJLlI*mULRs;Bufr~A1W^Nr}yLr3;URD?2A_YgatMg z8iV`OQxmlE`#fAT(zE>I)geO{-BW05$1eQKZ4U%-ks8ByWEMes4|K0@^`$>UKG43W z9jzWV{4h5Wk_Ze2rY{&S0aCWsilf&>UZahzZT`Ps|GKqrGmEYCokApi=j6m+DvgMU zpq`zzrY{a$_ye@<-1*VJef@rX7*gh~z3mxAr|i8V<}piahKwiq>s`HqmpoQ192Q31 zx+MWHsRjzgr+iZl*+$J-(2Iis=hdn3X8 zImHj2`OM+6kSr4}?FmZ=XJCjqRP>=w^|Rk|f8{An>G}}J8E&-x_i*%!fbm;7>_bOp zdo!N4j2zLSjmDTOz{$1*mHKl8I7yYvGbFo;#y7b-SMPWcB0T7dz`p0FjcrJmNh!G4 z0CIk!-9}P!?sF}aU$&N>xc`pTCRi0^UDEqpxo2zrx02b_ZP#9 zerE=H(Hc{EBx&?mGjlwXwC^`FZVAU=ZRd3WA$UxPAK$ZAE;pDJ2!93eZ=O)FaJ)eg z(=T(3s>v*v8Bc1~Z|owG-$*tMg5B4YbQ-YJcngmL(B0td0DvsIfivfma4_E<99-DP zf3Th&!qDEE!t4zMw9t38`{$>}EjU+dmJ^GIQ$q-6nY({Je|u)D*j6|gZxTx#W|ud{ z<~IBw@R&=CdlU>)6kcTqj`C*c@DFsX?$o)nFGH~36a>$j2S#}~xi!k_yNwBsZt?cR z6s)|L%kHIDfKh+=ja;H)l7AW)1F0a@&En5@8xn?F#hreq;A5z_Y)9w@jb-O=@`PHb ztr{0|&$jK%1DgP(1Sxs^f0X%uu;VDi|HCLOa04GpV;Oe|2Uu%}np`EO~ z;_aAOS}v-&8&q$3iwQlJrAZUMWbP7sJ4Ieh(`Bu)uTMfWbH1*|oks_!-@t3$>rY-N zKbt^D_;q!N0P8>xn9g?lA732N9R!S`a)%q0gpXJndLXDRv@(D+q9F2wb1^Memd;CN z|7x8h8SE&rO6S`pyR!xxgy9O4Stbv%(T($mzTr2fKLYe3Hsb;QotE})x_3J0kfyF~g`Y+h1|k(L zBZBCx zg!uv$tsW*tqAJ0^cuo8{ejBNcHF+OGmDKQp00{$A5p0V{Y;0qbr~aX6uF8ZdJTOL1 z(s)uqZ+sKgP*}DYFnqWw-J^JlK;FV(V-qPShTkoyFvvWusZOaSeS};=!NUQgV`w!f zQOOa1r>8HeEfY#BSo6?(<_=S~VSe6-2@fKh<-udj2l>WOv}wR?$3A55>N-^cX?!oU zj7iq43OYTC;lsAJaDeK^etkc(|E|=Z8sGm?Keu&LmGhzLZJVAQcx<=YZ#!KMEAiN>$@mfa5jzae!A!F~r*t;-Zuu+-gbE(tw$oZ{Z_H3i2%ZpEl-R4ttWujR0svr`IAsC` zv51?fUM|DvmDN^)ZJ-j`I-~#J6uD!5eKZoJEX)6;o^M;RYT*GHxb$n^a3MlHAu)j4 zmIY55bBT@%{NGok_Ov3p#lF9$Gr>Ft5G0nAwD|1jQDL_&3ijLKN(nd03*uXD3M)*j z&QT)}JG4-m%Tz)RHQoRXtKayy_#nf?l5UK&jTuof?ek@37sFM?bR{OwbzrLjVja%t z1W;k|7LSjlijek2b6cQdvQ&23kosj&4+r-W{Dkt55NjB~6sdy6(jFnOKZ;kkS^U2q`|>UM z2BsiRkU5>w&#k=IjLu_=#iU85y!^TJ&eR-!i%jZV={$w$OVIN@dQ{Kv-j|(o-Cp2K z7-;73!BxFP+KheNO|gsP6g3c(EiJcM@9YHQEn5bIfOUOmoU$qRRPkxY<0Z{qaV$uKcn&jK)iq_?1veNkxsCzGlGPF z5n;gJa63xAp8=;mJma)7e-h&8HY7W28}kQNTYCJ-JVX;r&~nfwglzQiQ3@BGGv+Kb zm*>9DkiVD>9jQbUvKf<**L|x=xKktN1FNPcx`GUI|8g420LZp@@$fOB1k&wJC{Yym?DsJO(=Q^G^?n6s8t9Sbr z@|B5RKHQ(40|7q7)SnSjBU$4EcqL<9Rzs|3Rj0%szw`q*fC;QG2pY&l9>oCiYii0S zxV&30Z#v8RG0a0}l0`($92HFw8!=%6DN7$6CP)5b1ym+_c-hH4e7EiJAXa}?s`*0` znex+#0iks6a0{>_stBEj4F)R*+V)nYO zav+`;bFd*jTzvc6XI=GO#OfliEDlKV>kLkKo6|G)aHf{;oibBc5InC4j&H#CR@oh> zylCs*WWG7p@Kk8+n1y`#Gf{5U@60p>_G3aT`(dMPdR45qdKD=;xqZV|==_iP3O+)2 zq>XDqVFWBtG3%qDJXkoaRrX16wKBd~`e^@#-~Sq7g^Vph!V;HZ_9m2AhIeHYpEA7; zAG%}@YAIP$*h^P8o8n&SIJ>naK}=7t7hDFGu140T!fYA}ptn5$aP(`)q< z_cKAsd3Pi3&TGxh%o0zw9Z4mbU2Ya3B$SlNgjDc0#!ts^;pLEnqckFXc)$9^+7N{} zp2!=;5{RB>4)CNbuoeNKc)J!xOwV+4tbBL9RqPSn#J^?_^~jc>=w*L;F?-G2t(4gxDY;`w<-Mycrj~D+{?`R!#ZXcXrTAFh8ET=)N)yVf6zOCsmZ^pBTPKSfB`%iHkI@>?>(O zkl_(~7M~Wv4u0=E+)tPO(7@PPiC88EDN;e;7Dc>>C|tkf(WypcW6phweFSu; zyUCfFbM1$;%I87KT@L<(P z@r4G=X7Kgw&6_`fas`zYbcL)veCAI><5TN@40?0Yc(89<>UYhsTo6~M%Hajx-kSws z$c~4P->@o=sQuT4C`xUR3|SGX_Ui#h8wf09>*0!y?b?Z5p~SkZYYSD5utr-UgcB5$ zGs=dmjW&$2=_QX&cOlDbuxC$OIsIEg1p~}2@YMghn>$xU6U++NEOi)CN2)vf%`S4f zKWAX8ShfGv)e77%s+O9(;Dk%t5WPGv&DpF@j0ccIyc} zWN9?83Am zyC@U#K)Z_8W|jCD_YYeU)?pH(?-Y+lxAlD8L|cmpNi2I>MDCg+4FgqE8Ir}TG=STz z|DHRn_?eROeoK7S2Ml=Azt2I6=;M<*w~CG7dx$0fe+#q8jMj&2<}lXl)vMP7YUToi{O>;7{P+@X?RMu(&2;O4^i&-F zpa;z?4;f|;16hLO?eL?6OsD?G1u)?9%pT@F21rD(}_3<%vqf6~u~0P_uh?l0Tg?8QOgjF*GRw zFS@?djyC~tntIH+fmQ{aC+6s)<&heIAVhy@UhWX;Oi$#33kU=Z*#Ibk&M@(cURJP0 zJcYrc@Yc=IvFoM8A6G)nc|~j(z>LM{j4EkVe+qB)Ej(L7(wUv1;ffKkv@=C{xP{nraAID|Q+9ARL`5K2!ku)aK7H{Gob~AxD z$Pc5L56Q$w+_A*fnYs5xikLMwBIj;%C=F?y^gFdh6~+NYo@O5SwX{``r`wI_;FIqK zq6!E$f&YEJi;Ec*K}c|LY>0cOjveiAP`FW46hehFxq9X48P=Fuv{zCZ50|RRCX5zb zv4ze6$sIvG9-okKe%UX|Rmz)=?_dbAL<7Hujom{n%=>n zoZqnSTzWlz9l?~YZ!0QrLv8Qq;E=WKPOI1y@howpcJ{mGw*GU3^x2LDZ!&5uJE*?RQo(Sn>Xi~zVN)Q!V{LL_yt1&FfGNHy41 zZFSJy4zCMM>1L`hsb7mvtk;0_DC!a1hy~_&^5jW+ZPyL!*9(J=dZ#gTl570ypKzj+ zB`3WN=BqejC*)KaV&&JGm5GNQOuB!R!tqr0O6|r)k9~`-Fct;#5Z!{J8$)l3U!h@h z#6RI*AlhIii1PgyaWXq-iTs^%M=@xBE2ec23AeD_M6~)eBjP=P*AhwJ0*ddolvj-3Pzdd(by_D3`Xj*ov_*9*UhNegGjK;y9My*N&-{)*R@ z)_;4PT7}%P@i?@|lIYa7<|gm=PVopgxleu{pPAMAd?3*P*>#uJDten^LLzH)Z%Dwb*Ae%#m>dy`kwQRJCJn+9ui6? z@4g_qbXSfugq0WMAm*5+)V~smzpgVH*y`i*^nV_7ZE4FE#NPHpsA&Q$+#^DrRT8>> zUu3Mf?P8+4vZAOt@ll|Gx)1er>6g-1qr9d?5*hE|=_mi>fkUHv-p$_Uxxb~35x>n( z{kM__B;;nz)w|5yclG&MrAGRxs>$4n&1f-vI}cX|$@BPF$xsbuiSUOBQv&-ERov<~ z2fCh_KS*^)Gmca7p5l7}w0$5#{$H+~azH#m#p~KlQ%z~y-~&p}78o6a=L=LVm)!43 z&m0IzP*=05`ac1nXET$7&SbazM62v`HzzzWuzFZ@F958!8ztbw!^5tcn5iVxZFA$7 zdYI@k&z7y(Qh-4qep2oP)ZG6*O47nOqx2rpE0Ab%++m?8C1i- z{rhitOzwRKmvgxceK5!c8;;j zqjT#zNu>jjgGYxifN_ucH}xJRch*e)7Gi~i-Z*2o+U(l|Qp=Soc{>zV>8g$DP9BUq zdK8|qlEvu+Fl6R>qV5)*9`Fb3&y#jXZtKl(DGF(=$UJyrF6sQWw?n*Aqws};?J)9d zK`$?SFbr;!Gb%wj+A?;QmWGmfpx4J|DQRC+O+p=pbgw?2n}DiT5na-9x}YT~#e9LY zs>%BJOG%|CVh4)JkX185@?fM3V_EnPxDwHcre{|U|$`(V);sD9+>e8ipCUi>DO5gp&iSZ zQGRlQ<^C`)w5 zO>RT9Mi|~);Ao1oVSdH%=tQkABR^5rilZ}TrqA_tvVToSOoxz|%~L5|QZqGWQ|M16 zWl&ESwUsW$iV|OaWBT8Lusq4}-A0d&ESyRxCC8ki3j-;TI0}(5y5!oW!M?|ft52T3 zqZGs`&D>D21g{Z}mfxZNe$6h12VR|;5m0upTm(>bVm`Q=j*er%J zRe0-5KJ8D4U*6i>%FV-!kUW<;G@|@F%4I=@hc-=}QF-#3p00Tpb*1RFg9{EB{c*_N zZX#QD#v?*!MtI462Hh_ur%a%T1_Eu0tQ@V+=kPybe{lD4u(m5ZHlp5n-P*OJ;Df<& zr>?3gn?xqLYd1c+(0IQ%@nD4ToO9vdZT0XGBS)42PzWsD?x<6hB(&)FHSSLV*_*Fw9q` z?O=8G57j%X6c?2HpxsjEvb&w${3nOhVgH$iLwbtk9oq$e=J{pyTbgDL#39rL*;meH z%|DoMNsV#o^IZLGb-w^u>SatCBD!Dgu-&kc0*ugMkB+{a_ETR8vU9)^rC2Nex!(q9 zF55%e@cM<(2BVVBKuN!+$p+kS^p9wMVyNw)n*;CQwz>0+ zXGqCynAn&WSq!>WGJ~t_+UGo+>#vd_BEz>)?jN zwSGCZDrMtGZg6Z;l3BT@LP69ODi6i(C#a2DYz`&o8Ybo>?S!Zxf+l#H23@`1Mfmvp z`#OvWbxD(Q)na z8O}KOY3QGpZy3{pDk*v|Nj$^X7-P%uSDq~7W>h?dIJG5aE(Np2c^{I(Cq73oMg~o{+>av5m9`ZIV z%pL||o&vYyCKq5tKWhTUe_aO!;dX0NS2|uZQ`5f{Szn)03~aYP8IE;{4HbY3(j3D? zyCve80sXtIO&iq2pI0K+ROz?nVV3t8K41!kRXl>pn^ zMkhXLvrZNItgKQ7#fcU;p_-Bt4GP;6s9p876=EEMPM~z{44vTT=e|AJ%2V>6 zRvd+#l5=?!Oegc_*7pPrW;D-5#6nj1gRlhbZ^iXINUJD4aX+Vwr0R&ZL%XwfsXs5S z=(VdqhTw#_inQMPTIg_6mX)O>6!!j~;XEhgfdV-)_=G zfe2G}N5NyS4o!&bZJ-^B0>G`yOw!>cV9nbrOj?%#AyJI8;KQWcLG3nPWfaPn>7)h1 z!U7_>SZzYWb7f^^K!s^hSOQRX4X~{smSuEi!%3}NY2VkT3)7|;Og$CtyQ0a`jwt>O6_VEM=-b- zX6G*$IDk%Ro9;KC2i3jUWG(gM9)?COLu|7*phiWoaNy=>&-7#em(N5n_B?X+lks?6 z;Ey`{=ZF*S4p-1)sO>1vj6DhzqIgD|Ko>L8p>DA{oe^a!B9+Nn7!qvgZt~X0&g~KO~ zE`aecVy2um7hNd>*UOw7OmceIBv@{cTMb=)eeF)a{cXTBVuUjEIzFr7{y#k#IyR5| zJv%nxlu6tWf*IKV*9RU2G?T+ejw}RA-e$dj3P;S*z$HJ1`K10$aO38R$LH2fDR&sQ zf@TNI9@o1*9QG;2rJbPT;^n0XnA$giM!osI9`-!*u(hLa#$VFzu8Msw8D}ehVd(QDWlC|T~!~taKdDs0)nYo%@!chr-X%>~T4hA$S%O<^g znwD0K&+pOo7i!&c!gHvZ^&K!xguKItPXj~WGNZpKGdwPSz<~oT8Mtv7H ztPtfJ6RtnunT%i28d-LH{DR1_^D3&UW{#O5>--nQR`Zn}k!srEmY2RXk96b0- z=G{-|H?xg(r+TKazOdey4r~UwAm(6JF?+aasJfD4Qa!XD zUjAf{V^PLhn^851!32~s;~o|9i&AX7$FMk}gRBUnJrKVh&k+&3QLA;Dz23IWa5BjW zHj}8}dmrPa2%<%n5H$dlI1{?its0AAleVDnhL3!a%9`$594cA07!s7I3wt#E+ri;} zi_I7pA;{D=(8&e3;~hhKX(V41^%`_QADjda zK{*F9T>onE_MsDunMe;3AAdss_4$LKL_7KgB{^%yxK)SczT(<7rS4*2E1lz*W7{#O zgZGBGsbiAU&2I_S{(gR<`g3^k=E5*>6LoXrDerc|v4EL$6b4&q)GwWujyl#6 zX27`)5Yu$Ro`68@?#JNKs>2JDx-3;aY$5Ddew&>U}+FTEU6|AG3+Dp#bLk6EsjS~&tBu51@l^H zvf+X)5VeTusz=oOsRi*s#KGC)(Wy^X{j-zVdtdSN!i7B7URD&%X;@{lTd%nShmbsY zFmC}Gv)HINsYYzj89bd)9{{oK5Nqduqt(h}<& zDyx;-wR7d6&R@LPdeDAfXpiG4xuYQ*biI%o#z5JXZy#a?p(@K<&A(`$6)= zTEOmR3g)VLWc#AJH|K-S6kRwrwth(pJLIUZ-?Bd9WsiexA#5A5ZG_zni7EMGJv`ox zcsiK*rv1AS@c-MRk+(|@A$0W~G$@FR_r2c7E%4w$Yg!Y6KGp!R&J>hjC~OmRIqoT@YP_u|>1$c4k_E0Za=#9-j$) zx%~9Sr{?b%NVz~xE@DLk2UZ{NKg`GX=eZgH8MY+ur$2dfVVS%&_Kdla_AT}V5!-@r z`Ir1`m{>4}AJCJUoma0<3mWRJU3ZdMR>K|Y+p!R@Ot%QPX{VPj*y=M^W9-IT)9b7b z)us3rUzl6>^J#q$NGU^?rD~=f-~;4C=yieoTLh~pWnmKqc`YB!kU0hDe0TSWOm0#w zhHBMMW@)@|X71m+7jXLYaF2UO$M-WC!?clePv|qnIE3dafIR7QrJAmqJ_=ph&kj_)~q|G{a=E-fd zSL(NTv1@Le?p-w7@mS4JYlJh6qUpv~bTpbt>lGpoUJenSRJ=ufx^3%@NuMPeFkCa! z4J|+j; z_h6vYDw6urRU1|=XQRb&)?zZg9>EYXJvMa)#MaK-i~xoqj5p28J>5uw1JnjO8*iNz zo8cq78s;xrWJwU7Qqm(-2g@w(8w4%0a)*i#%o53`2*=V(zSL#f_G+JjI#+pjj=>P5 zH#$Ys_EJ>RKGtyW-@*~`WcoU5@m6=;>M)KMR(_%C5B{q5Uct?7ucDGvRha_)>T3XT zmUX*RKfY^piZ5mb#|#Il(G(O>d2bzp`ER(0Czd>Y5?$ImO;b~g}vOr+n^D09g1b{oS zmHB|hky3$FIgUv$+b#u@gt=`)pHaN{`P_Lq7#E;*^TVF-V|~xVb%*QLm!;H+5uZYL zrFx$z2|<*}VhwS~{`qY(3P;91&tc|&Tz~>lz3tZVH`!aPmRTQWr>-1R?~%6xGlK=Q zYy1SjRpgP)wpqXGKrSz$G{h<(783HI!so?!-kIqHHy?5PTE*Rp0qy%&L>)LVk?;UR zASuH=WjDt-n7eFsa1_O^S0^GKuz>Es;{7;pfmyWg(&h29Qr&Yray3Q~IQFL&{TbL| z`<95vNTwvjvb6kXecLFdOAa;4`Ij;IdiZ#3aCaz#P z=-phH!5JoMC4GCc&L2{km&OrJ)Xw7BQ*R#e=HuKR9dZcv>pD7|iDPeVZ6m%_Fj0H& z-n|mU#(yagjGc9Nnvqsm zZZd_%%jeGz+5Plp0GOKp_`smF8K;AgV>g|)ehBW_T-pqDJZoXvcIecpkWubi<}y74 z&5Vh*S#P8xFUZe-?omD~siq!;wn_AzsPRmcW~nP{-A=2gS81+baON;lqA_>BN%Ymo zh=2b1=LU|BVM>k*O1zo46SY&f9WF9r0G|YInU%BK&o9kQAMnR*w5+k)k`=b9vcwPP zn>*`f#DrZa1z`1i;_u7oXh%7c8%O_LQ#z3LyC0iMl)JI~bOb=X3mH1=+Igl1jiPC$ zO1##i58CoeS=ORL+#C>9u>J6blp)>2o$5nE+Be2LV{!4GnWvU+22O0IV0P~~l0nw0 zCu6dD{Zj`%pml7jCCSI)x@G3fEU!St$1~%nQed*pBbe;cC>n4!?dq3pZf0b9Q$>?$ z&nj@aCE&YMRpvYkz{5%)ad_Em#qi0ssm75>PY801NjvowcQGOAz}$Q}dKH;N5lt0p z(6!B3mkq#h=+voU46}#Ss6`B+J!j_*foC3n5$eIS5s%zCV1lCw zJ4gcP4cP(N4AVA5{vVE|9X_m3;2oOu$%_hKR*a6ZPZ>mp69OSqhKQ?5$Lm(U#g!Va zOZTbkt@`DOMQ>RrGg)KhfGX180W?g7(XM%icjT3t*@d6h0RjJn~_#Fh!rK?uG?l);c@zejU0(b zjoD!wGo_AOGCnUtar>}0Z&8Rv05^gnUCdRw45$wno0_8e<4v;`QH2KealSP;k%)s) z&z`2{(~=W}X%9Vvu3^h7x?v&W!h4-ZZ-7l)>YUTRf+2rljj{~Lf7S~RtcDfHx2_L8 z^XGup%@wk^Rs@Av{N)liF1lVpk%+71iu|pChQP zeg}@dM#bwD`7<@5)L`h)H~kjM=1+0=5`%p}1d(Eo`Tp!TT=VDQCi9(0-SkE-)a1gb z){aztq?r13?O#5vG~zh_K@cF`L<0W>#$vW%FW}fP|ZO?o8hQbRN() zV!qCl43O_$Y?_7msH zby9%M@GxI1Ut95xL=6T5RHeOGn5XWg$g;6an~I?J`WeT~m- z3poV<32D~kF7)b4<4vny{4OBj z#qo_zc$la?cbGL-P43SSDfH*)Cv;h|jSJ$}eKZpL??R5&D_J!%ITl~z))&;m{+}tF*Cfw;S=jm;%(VT0h)U4FDFNS z+%R6@nY!wH2H=-UKDjKfB?7n9x=eacO=~kyPfyk?2$>J6V)K#!0w*sQEs?#UNlGs7 z;?+if_G^74FBxG&TpIW-d};03Rtmm>3&3>oANPm$xaSsq^LZM4)aGZBeJSdMxFDwl z!=H$2?)Q)PfVI$MdaNxz(<+Ge)G60&FmYqD>I}~Gy&^Ro#BMkDq-9Vkj{;W5?fcb^ z@pUN{!IiV`ZzEr+JssEQKwEAUV%v}5(|ar^irT>q?t49?T@<@v1NZIgb#J3x<|kZ5 zFzksQF3VfE>u{kWa%2g1gU<-sEw9+|Y|THc4+uW% z1qE9kK+>9>)k`QHWOutD6L81_k&=_oWcr6(Esx8Wbo8iAz@zppWSeI`AVaQe=R*}w z1OBdL0Ot4Ym;SjrSm@9R-8Z~9e|4hHaCAS%Y1Q7JUNmhK&9Uv>dvI|TR>O_Q)qnG@ zzcw+;XN>+5l*3yVb(v%=2u9;^^s*5-BA8s`Nn_xn;7N5(TsF1V{c6R4z6*-S;#Kyor%B6rYKrz< zyY}}~)BOusCHorh+^@!4(wycK_$zen%u7^l0?F9R=n?_$mh(GbV_n}4T5veeb=Q+&cDUyF?biEyhA+1skp zP|bJ4+9a(1s|Jw|M!kzI>erV8GbL5wmc#~Oyjl!=qb3m1KWB#BTun;)v3)a`ye#6Cd0)B@P zGwLyg(ZO(`Dql&fgPS}}Eh_jsZ;nCVCjvR^vWU^^_A2rSI>Y>8`^$O=ENini z6wIym?jS#IT0MwAo%s4MaYa{X^}!uY@_KtaQdx`xhk{*qX__w;BNlNQ0Ne4ir^l=D zG>IwLnIEDIX|6oGf0#Xton(#zhCf$b4^z7a1E5k_uTV2BChhD5^%K~o^wiszXzKNBTaTu;2geeEmlCPKON5z}#2u zF@cnJuw6TCvp-Rj=m0u`YCYG#17d@d?y^A|i4`xG4?o8mr}-Gc-Sc=Vovz{Ym^xTN zaX4L$t*r{SJCbPa(?-J@4o4MU$h5nU38+b+=k-jQ{w99$@2k79B3>= z4v+m@Aq}pVKi@2gA(tHQA2WwCB8f{&yM148UrIQr`CEYM63@xb)qhoYYTT*%LPL9i z0I1Kq@Cw-#F1Q$#Nr+6tM`S^`W9RwM&rB~LJ(^+d%>QZ&zh=0`ZHN2x9!VJ)A!ywu zkrG3oVXymjQ}Y$A#&R{&{$Yjmgg5f?0!~_O+!klk%SFKEKrmcOMdv& zsb(-odNN8ogN*var#793Veq;`ia+ZzK!<#YC*v4DZTYw0Mi^GEEt)q+QPb~9C)<+k zw84k#ZVG!waHr6XGgnGT+61jYzD!CX4V&0IE+{-{A#`t32gX<+`pGlYsFFi2Gbo! z4qIke?wK;Tx>Lv0`UAcD^^?C_!`DG3=s0EaWD~%_IIMaCz-vkAQD8jsm}T;GsL=il zeW-L@^0a7b|60bOTKTqMJBK~4sNW0s*p7r1T!rp38Qe|6y?x(jKqgC16F7%6*jc}Jxixd03j6s zLY|O>8$j^XF~d5tgO2)*6Q0j4T(joGYbQAKw7qb>VhAY9&wsl~`ej&<&*8n{8e!p9 z7|>QJJ~7cAK1woSS+c^cc|CP>1nKnaJUl4O3zk6)U65d28vuIU&Ki6M$C9YrWD{s! z(d)tkIwfQE^&LE(giNbdUkv#JcM3_Q=AaTD*sKz^ZHspxdn@sJ58vJplJ(1qijl;ISW`TSKczYSDNM9PRU+Rvhp zhzjU9f6kn7a4rN8O}f1*kBr!!h1LK=01D$}@*t;y2f%pgwKI|q86h+t zhqLjsSE>_0nHX*vkxsG}&q!L;x_N%?>{S{X8q1e1eYU}DHQIS*JZs)%04iI~yXvb+ zNTLl$5E=1;)h8{@%?|;_1aoNR+hEEzds<6zrFO%FiNVOnua828#+z49F+E(DeiAP= z@}Jt-9sk6|Z3AGvQBtxOn~h!!25o=(;V2NqZQvBxGX9A~1-W%mD0pXrn`asgQr45r zUtyNWOb9sbOUGa{E6KJfyejS;)5f~05Y@Do-{_6Myx2kcYV=~vHEB}i4^Zg&0unno zkCr9eXz4cn-lnT1a3C$HD-{)yU~1V9YG8Q*%o~8QFaE5WKF`&nwzxy8_dD5@!H2)@ z*L606s_}4Fv}nl+N=gzK4#j89W*@{37_-e4kjL{GI1alIpE(AWtck>MWHOD%Vcq8m zb$-?gGfT_v+|+Qyu<6To7M&7gOlc1s&uP=Af2q0ZFk^-#jddJj&lM+>tY#vVw!kAs zi{)7j2ul@?LN=f#ON<_Hccr1kWv&%RCy;}}@S>3LkjyWhRcdoB9|S4+!Wp1yM=l?A znBSS1XO1hmQmntNthD#?8rJjYA{wy*_TU*)=u>vRMJJX(wm--iCZucX5ZcoiZdX2- zxYLfI6%Z~xv8hV9!hKFh&3Q=5rq1yjj6Umg(4 zpuY8D`y_(C<_gI*PzYQRF|ZzHVEnD2kPQksS1zP?ef(8nmJlW_co(Sg4cULywuBWw#EFRu_fsfPt0D%<&1IS{P-)1TY1x##sGU zE12F}n0=tMgL>N>m=EQN7#5LaM0tWX3tV3)mB2Fa3VstG84T757_i5mLj(jJh=#o= zE4~{h?LQfz=yBq~f1FtY2xZ*y=E@&eOlu>Nza5@7nD5*xvo5?FaEYKl=$AjCSrsPR zrnSF*4K1NXdJdCH>gZxk2`KoNN=ETzXLJm zFwC%>I<*;XJH!ikju-FT`I9Qn1q}e(OBtL)1#Ya61&m4zV>?k|i5niKdRzD&&w1kA zv{Y17qM??^Z=q0aMAL@b{l~g)8DdKNmAaG_-%Q7NeFs#tuMF z0L`#dWVtJ{#*r?_nbtY$%Hj0?^PLd}0NU+qL`=k^yAbopssVg$Y1Tx~!=ZrUBL=eU z73G|=9VeTgKp4aT1V#2AAOpj5Ptx4W5)3V#u)*5PL{1>M8X;g&Hj7bbv0o+_LZP7Wc~`4&#RITR_HQ8m!)qFT+Yk8d46y4kJS(zJY;zZM7)0E= zzV>8Za#9FF;Q$t8L6dG4*Rk$$^-EHMiM<#Ugml1A(%tgGu8#Um&#-)VA438kY zm{8v6F3UZ2)u4MQP@XAuli>anv+#Ik*guy1w7l-tfrM>-dmXNsn5VeA#cDI*(B5x( zHTSo>A@FU2`NT;;<1$<4Vsv`>=Y-eZGP#8pCmaKmafXRT#%hnKJ<`~PLJ@5hF)T2w zLpf35B`((lq^u8GsW{K()fU$?c4_qar!)# zPxlUgP=1|$shI*6k43qITQ#*4@)au7Y1%P{bnGth;ow9iE+1>8_LPsUg_rk|ttb>6 zFBgpH0Sp53Bne18V$tiukYo8l^>bsp4={+&4}@B?9BB2OW>o7?W|7Rh<@bO6`ZWXM zUgnzUdG-w3Xz*8JDlmA&y03>B9~O3(7v5%y+tc%-;nVwu{Wy*Tfz$yUh)|&5Zc--sVx|QOAS;(Lv+0r_F{y(=xK-mjMJEnL$(d z=mSuNdf#yjb~n?NSIqrN2KR_~s`Q1nUP2Fw> zx;a)K7(2*eV*3TjF&*E(i5M|FG3m^QZ!vaHYiM2L$u>^z2Ix^~{oAq;kWv!|_Ff&0 zJsq$imczh~GYrbdJU)HuWX;NMnl&qD-9Qk&qih&Oday}pA5ab{M7gW&)zwpvl~t{- zJvP1I>6z}e@gv2mUJYd?rS*;wiv>{{^@N&~Zn7$fH#_3OS99;lKn^gur4HV;V@KZE zv8fw1%pOqx$%K`8q?>2s6tJVrQ9s>Wf7YdpT{*GFJ}mBnr)h{q58(z#ca3xChPD5a z9BkxAc#R4t&b8DU@g7K`N|qyy>lRI6EFE>mOgsOh<35WI1?N-?2Dc19P5e7_?P}fm zT0S{>rE^gDp^8b5gX#);ydCg35Kp)WcC^ID#Z}!O$nI-K)ymhFz5MrI%Yg$2I=#K6 zH#62jS7en^m@;tXI#ku%-Q6_ksmtQU3H(WAMNRDo?@86w)oLS4=sR7JrDOoeuKoCI z^VL1sRsM_3y~~5D!rq(7G}c(F=4J4tnwO#yPU$uXW<^Kis&Po*S^T4nT{CQ{lp{w< zR+*o>+Sr`w)3EWvwgSF%^_*~)IoRH%XQPqa(^RR;YM9|p=hqMC;mIhSLf#`RZb;vNQD`uS(^R&Lx|;|! z#{J)}?@9C0+%x*m1Aa7E-s<(!R;Q;sU!NINm)FIW-^^l?z^z-inw&)wn9R#&Bs=uv z_OE|Y0wf|7A2ei00^c{#QfKg~+}geYo|ozog9c6Qt3zD~QeSd?;E?-YKL5uBz*V?B zvvig=TllDo{++(dM|JthD>i4l`#k9)WDFD~;KT*@9+**}_1#gvA0O@(ZQAt23?3Fp zJiX%aNvqOJfA45^rkvONvaHOg@#aks91M6Ut=_c2G$h{$;cpK63RD-5t;`lWJ9b*A^EQ<uz#eu#teySqfaa=+tqer8OP}K(xbe-Dm?PlI+IJyX47??m8 z7H}rls*v>MWGOdmLgl@9X=#g702OV$fu6 zGXm^({&eLCql&#M7GYNc&T3Qhbf;pb%sA(Cb+^BNPlim6ZExJV<&b;I_qE_oT+`-F z8moZ@PB1aCn>R1^L~cO~{!TL6qIfksua)JaYo#xr=r-1b!Gh2ssj-E4=%x|1CP>qB zVyi#5fg z3gl?2VQ>8I{y(PgPJY1lIZ6m}{3p8OmHY)YkNV}m>A&;PDpSt23py)`<lv0p)W`GiUC-Gk3G`Z#XsgCJl1BiKBMtxSXzC zV5>8;<=sRy_?LkM(@kSmPprzE=)B``pcIy%+_W(T5Q5KEKl$2i5bQWk4ehAG@}2u^ z{gDXZA~5pY_ZPdHY{K5wLiVlx+)&%9Z-9#pFA6eGu-B-r)L_X5N_|2tsC=~0l1aN4 zIckla$GpLjh1VAE9J9*2)v=L5;o%nebja^Z)BB7YGyil90{)~e*AcB5OzmB04#FjbMpBc=Isi zn`zCxe)%VPpes#5l+DGK0dv~bKL%N?YpY62gE{Jp7|)&jc;UUa>nAPCIl%!Yoa2d`YYvI?0<>iN^|ZexkPRmsz12Fz48 zs@TI46fzSO&YDNf->0ReNnu9S344fscE^TOZ&h%VAV`8dTk_biy!mni(3{IqQ`_%s z#l^-u_hx)}G>kk9F|G-KU{LNWH`S3ndTggf7S1sRAx2hRZaF{@L&%x{y4D(wH%Ix;=${Bh(Fs?aX;Y`RC5ciq z)qfdVZ$#XB(Eo1q(Qz>g&N+$tNymkBa0A zc%GZ+-0X2+LV}JHieF$1IMRy})7=*>5`CK*8^stg*wSYK;ht>MXTiaEwx7VmalwzR z$tGAey|7hUnWn#^sd5)F-V%nLG!4YnMeKB z%nCDpT={xb>Yk^Aw!JrFb(~DNaOz`TG^X0%-T3+Z37|T;eKdHb*FpzP;=q_uyG!}m zcpTNcU?Ypu-)r{`DBlM(WykmAB&s2Ik&wtyPruf$cW&}0`Q1KSp@TgTIU z^>etHVXqrXm2D1}Ac5bctdKBVi+ohev$XkkD_3T!r7Rc`yZdp_wX@v?<>h^oewu88CRW(f0J%|P87O6N1at=sD6M=i zT@u#^TEw?@Us_aDR`v#m;`TU553K$tD;PMluswFn@m4 zw6K6R$}PK(I6|9AE8)uJkg%MYvHIbI2Qt!?V*-;hj<%}&-ATI*(R?#X+;CzbPgl9c z_9mMYd88JDjsG$lOx^RxCjJ*8jc;o7Th;rmP7Jl6HZ1FGibS}};!2M;TJ#bLn}7Sm zj{o}S>VzJ+h$1^Sh0CdrUq^9702Pgex%pg8V^f}6Pgx8|8Gt}w0(e>7_iJOnu6Sm*bR|pRS>}Fqj4Q`@Y?^rsGC+_2;30(HZs& z>ur#hlCn$2CtO0I%@%(l-KPv-@mEK;%Ef~o+fSQjPB|@IFIBkQ>+I~U#EYc3IOB(} z22Q%vc;`V^ZUv?6jLhltk-oCb>6`BJq5ArxK3Q2u?mjWFJ|S%}P)OR#0Ayo`IDRDs z?V#!NAD8Esw>#L|8?p15D`riglb6BG>zns2P}VNOh!rG~ad@L>q-6O-I*WbOjvN` zp)6wKxAeROCt8$y>)VdL+IVN97`XmM>+UL$VR#DCA!!}C1qv3jC{udHbmDjH$sA=m44^ZWX9G!~ymznsc0{KQbX61RaYz@3o#JjW9)SAa3&P*bj)S}P4N&PuE7=?=>~v!bU88h+qZ9te6GQi#}`({PsgOngx;8SF}Ka@{Y}%2;67P zi#aze_zf(|N_}5+SQSMFyTLb>SGRsllz>3o#FTeki!x2x7Gg)-4xnQfK^$6tTmNhL z9~PDxk>ajb0 zIvn!;IVtG~G&%apL-eWB_i9PXqM&@WE>*H6l3#=)@NG$I_a@pMj`pyAPqg0JqNp(q zqM~^ar-4*_aPQu%o)Oo}%a!xizBt38Nwf+zt%K&;LzG?fq)3xP$C;pA+jV$o8_hY4{{LYY-UUTfqAck;3bw#T`-6?v{rPvA5rm3H) zK4FPF?Zt1OHzFDLOWG>^!K-$kagelz+7)#i)L9z>q0CU&U@!k}PDx40VRj#oX(%nskCHHr;t1frW8pY z{UJEGRwEV6ybR#p028Cv9^yGjEZ_2_y!Hj z!ez^}(fLP)H51(j(AP}Vt{nMt>NkI)jH;e?z4jDgni5jVLrP;t`mFly=Mzb8Iu}KQ zNVl_|`GPur4*Zc|>y1?rpny4Ie^P*r+r$;z~Y|btdTN0^}&xv1YXMMe{)RU&qaP(U5}<$_OxbhywqN$9A=r>`K%wRib`9 z0(Dp}KsplYy>_Q44Yt<$oPRyuW?N!6?Uy#xuNlBjJ^J@QKmZhrNpXxsTZCsYNViki zB-Nr=OQ=WxY9;X;Ma`NXE|b5IQoOTnfk>=DkDL)}YyQ#$w+NDuB^q|%TosXtadB~O zFju&789{&%#Uv#BE2bXv)#*xfJ_xPORG;ea{75mfqlsaV3UsNPB9M=9b_{oZj3dq}w{JzuAa_`&aQ=1UkbS0^X zgtKsB#ad4+^f>i&LWPlA|Dy90CNk^D8fdXN6Cw8|KD;pH-d2uk%wpKp0O^h-tec(? zV#yG$sO~A7bTs1!4;^|@)O`tDQ1F^cULt$tnWTjbHv`CWV{pu{8_t?%`y4lh(6-8g zh0%<%olv!iiI2AeVgvbNx8(p+o<9&m1O}1u6GumUrfEwXYfYIKs7(qUB$y(;1K0+Y z^VQ@3>f8b413`yu?+#BZf;kl`5(Glf(~h!FT3vm^IAg3!PJ8XbA#le;VrLV(EF!rH zSDNXD$QPc6W5yh5^0ojf9J%`eA6hzMiy^K}sjo`E^{h`Sxj#DPL&@E{K5QWZLCGC5 zxoEGzh=>W9hv$FrM-{|MY?o`EMJXN>o|7URGz@Wdf5R+6^Y* zGZ~NZ;DD|k!M(#gP}L!`4AZ<}NecZUYhtOIIA#PNGIk8KD)P$Jw6&tYR88 z11UpVt&VJ))7WI9guE!W*T&Qat(7|(X1a!3gbY72m-)*Oel5JLp7K}m#UP1cSmgvF zyI`jSyX1H=_>$^N89ryc5dED#-WhTn{GknPf4Pbqt3oT>DvM$Eucf_U;5uZ-?0jcI7Q)GB2ghTu6d5J{)rp~>izuzUAFh4onl(egDC89p?8MO) zI#F$IVciy4pI|pfR%B2c_!yYsS>Ne@ULwv_J%1jIj^`$W=qEv&3`9~R_VEl+^&}z| zr*vP-Pe67hN5(vxJrXtqg*Qd4$@Uk2cB^v6BBj!Fe%b0TY?!5F*6!n&Ld<#uk5mpW z0Hnb;5oe%H{6L02Maqy6Ny|fLI|fyw(BuerNzs&VMVBOG;b3W!cZY-+qR3uc7(x`xKBv@LbD(vKmV(mvOj>o z?0@-2n;7p$5h0R0TLURI8LQm~4jdS{Bj($r<*NK)gbOd$McV^i^Gvfiw8EF+NM@i6!-c{l z)S{?n&!jZM!@=Hue@lxeCuK0N0gGoJHqcx?G9eqWWVOt-e_SgJL~&Au;Z&~Kcv(Eo zShnJXkW@O-Xe1S_xoQ0MWd-#ojsy}YmCIwE^9kNh-Tnna^<_>~SEyZ$&plQz94;h% zAct-tN*FtecV3@g+`D&%-yPYtc`(#l=j8|cflfLWymHC<$BxA=Z>-~As(kr+le_!A z6DL;qy}E?#gGEF-gbIm=1WP1CdUJ~XAZt>MAgUI5yw`)mjW;=(QqQz4ub@4WPzjkhtXcX0FS&gD#&HsxX#^qjOEXf;;GCJBk)f@A-@h(2PiVHFo78@y`+m_c@UN#~(UDnrW8u z%GmDqM{UwQ)|=l(@_Iy}aW?SbN9ZuLh6h?M& zOES>^qS8?-3a)0$<3a>!;=bizK)nF+hH&tCW8$O!UI`O1#W*# z4@aI99k#^;`MlTd{SMM!~_JIyQzqgSmjSZ=6b)jE&?Wdy}9O@O*48VyY%+puTPTI!!FsCQ$& ztMM*PGz;3xWsBSq;X&l{_59Bai+*Lpa@=kz!mZCM0=dn0Elp$Zi~R_Zb9>yTag(SGjYPTtg2`f1a33WG-+nVY=1x^q3lp7)xm@7vhWrKQIex(eokL*aOe zXhD5N+6g)&B8jdoXumkdqX)k$R>btKdHK9h?!dp#L!pWAkT8v5}r$LEZOXj2+8Z;TP+ipK_~h zVGsi4L=mWU70c=5K&_f8Z-=?!U@8I_FyMx@Q70!GB@|8#&lv#nXzSpR@anj}s&2mr zvaTce^-|A&jVBW%3o%?{OHX=%AdLwt$g&hi&njw8gk4ssY(HPO5;1*)9N1KoUz%ca zDn2aYm_k7#ipO*z;x-EABr27$O{s)RF@eYJTEuA};z18729ATh7Dm78w$PV1}6 z|8n=mE{^)jZ>R@&F%-WsVSo#l8J%I)D*;@DCy72%kdTiQ={Va1&|Jqgf=J>|k-F9h z*8J&+h;{?;%#hCs=!EPfeG+9!QLWk5sQCD2v3W38ong_#4iioLPxa=6)D*ab1hyHO zQGwyP`5~4YW3r;frC>znMCW@M#cxRBra^dUA=b2OjpwM5Bl$9;OP^rvJBP2!rY~rg z6kgEiAl20W{j1mt!3e&LnFDs8`$+Dr(VxzBW=03Q-igI!G<8(r;SS*skBFuvGnmP4 zvue}x?`EEhl$QhcOG7V7T1ZI z{weDOSBDjr5eugc?`1)$3G=LVnYIiKN<^t06fWC*B_lbQvsA9RLB=Y`gY0 zbompP=bdj=Zw79WUfkuAOXbr3AHFrQ>-Y7S_Th3;1*Ku}l)R|YF#(V39;%FVPIsgO zk1yT+%58_aL({o%Ds_QxbDr~UF?W2*Bh@%hCj2S1N3JVtUlSH6xZdCm-~#2F(k zS!2a};ZhYoFr#DRQoDhCuzHyK4P@&|`EFx&jGY?d<{N6W_-eUEh;^wtA-A-u@=blh0;ER!iYKLxGTH+(@y z0mD_+n<*Sz3{xhZcnW^qo&U)z|MK~zitROqco}FNo zO!-Etm94pcQ@UlDlmjbd)gFbXNu4%i(4gsMk^2ATi^$~oIP7dX;!@(Ea&qsO@=cb> z#5HVQQ=&5{R$a6nGaTVQAFATgK5owXR%!Nr`<&cGDu-SIB==l??-g$)v56IF3!Eh8 z-de69Sthp^%R8A^O9gurYhCfxeAf`Xt7xm4*F4?^;vUp+)0Qmx$?Dz&l6~|2rK45( z0`6ub5{Ox0p?eJsqNkEw6ZXU!*a8RBCc=;Z(B3io3%RZ|+ z%Wpf2K=}Vg^=t2&5=xEzosJr>;%6Ft5F3ChX<=c3-q&1NB4u1&YHS@%bwfcWiftmu z%koE(Qja&+b_d#6r$TbCL~YUvu>>k5U1)Umzg&ni6=W1WJdW=rt zJc&|a%fJ()940ZOV#onBccX0vvLu{rCAJo5jqRs7(y*E}iB92fM)K=YzEnAR`AF2A zf$(Ark~L^?slW!L`Gbozl2Cm?c|4mjo@7x9uuRfgqGLvTSeBx2yTNXSD&P4phtXNJ zV;F$IzR+L}l1Zsm_2`l4Ym4c1XJ3o5>R7vZ^SXkSVha;|sluxZ#VF(S>%7Rf*MqL> zWYrG1*iAc2ztiAMpbW8RmaSLdzZ|wU{?6{d(Gl1BQsabK5MRXC6AA^N1+n-MA=Xfu zz>5nFvh?*y9@z?b6J2G>LB%ilGE6dAIwtjDa@x~0sBo))s2Ai`X`?FB+ZmYe(C5S) z9q-x?T;%}At0%M&CX)m%dHXs?Eh47z@p`|h8}={4K``{C@Dl_Lkd>-z{kT)?b};1| zzCFx)*LZHo3&zTKcO1I`4PEu@Qw5b z4?YpEc(gGcsdn#aE+r*JK#!MQYAKN^>?x7qXin$rpo;_4$pDF}(rEVL7a!Av`&sRH z9z#^Pi>vDm=~qHR{Mhm1*a;ZPNKT=E0w7L6jCuZ*?<1T#!A(luuxia3E%WeTPA2Nx z9W3{87Vw;lP^&xtA3BW31QUwJ;Z0wP6cy{+ zT)A!Uk#LVFx&q~2r3_Lmba3eIYtas_m3WDQYBLW6Vc|2xC*$0cYxSXhfuMlP?Q_@u zW)cwZ#9Po;Iq9Esek#6tnE82d=KtRx+AB7sEaWe#oGv{1pzy3Q^1c$KJ5#}bb7s!B JjJI&y^FNr?MRWiF literal 0 HcmV?d00001 From 478cfbc774321f879adff0761ad6bf8617d0fd74 Mon Sep 17 00:00:00 2001 From: Mike McGann Date: Sun, 4 Feb 2024 15:23:50 -0500 Subject: [PATCH 04/14] wip --- go.sum | 2 -- pkg/dms/parser.go | 42 ---------------------------- pkg/dms/scanner.go | 67 --------------------------------------------- pkg/dms/state.gv | 47 ------------------------------- pkg/dms/state.png | Bin 117012 -> 0 bytes 5 files changed, 158 deletions(-) delete mode 100644 pkg/dms/parser.go delete mode 100644 pkg/dms/scanner.go delete mode 100644 pkg/dms/state.gv delete mode 100644 pkg/dms/state.png diff --git a/go.sum b/go.sum index 865be93f..14fe6b7d 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,3 @@ -github.com/blackchip-org/scan v0.0.0 h1:oHUBMbMF45e7MYOr5xx09qG6wD8zaLNaG8KovweHehA= -github.com/blackchip-org/scan v0.0.0/go.mod h1:fnJGAutu4OH6z0z8jmmdDl89lt+bvOz89cZWq4swkYU= github.com/blackchip-org/scan v0.0.1 h1:C+Yjgc2BnciwuRHP+nrWqV2gh3X3iqo76ZZ3Q2+1LdM= github.com/blackchip-org/scan v0.0.1/go.mod h1:fnJGAutu4OH6z0z8jmmdDl89lt+bvOz89cZWq4swkYU= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= diff --git a/pkg/dms/parser.go b/pkg/dms/parser.go deleted file mode 100644 index b9133c4a..00000000 --- a/pkg/dms/parser.go +++ /dev/null @@ -1,42 +0,0 @@ -package dms - -import "github.com/blackchip-org/scan" - -type Angle struct { - Sign int - Deg float64 - Min float64 - Sec float64 - Hemi string -} - -type Parser struct { - ctx *Context - scanner scan.Scanner -} - -func NewParser(ctx *Context) *Parser { - return &Parser{ctx: ctx} -} - -func (p *Parser) Parse(v string) (Angle, error) { - var a Angle - p.scanner.InitFromString("", v) - r := scan.NewRunner(&p.scanner, p.ctx.RuleSet) - - var deg, min, sec scan.Token - - tok := r.Next() - switch tok.Type { - case "+": - a.Sign = 1 - tok = r.Next() - case "-": - a.Sign = -1 - tok = r.Next() - } -} - -func (p *Parser) parseDeg() (scan.Token, error) { - -} diff --git a/pkg/dms/scanner.go b/pkg/dms/scanner.go deleted file mode 100644 index 7082658a..00000000 --- a/pkg/dms/scanner.go +++ /dev/null @@ -1,67 +0,0 @@ -package dms - -import "github.com/blackchip-org/scan" - -const ( - IntType = scan.IntType - RealType = scan.RealType - DegType = "deg" - MinType = "min" - SecType = "sec" - EastType = "e" - NorthType = "n" - SouthType = "s" - WestType = "w" -) - -var ( - Sign = NewClassRule(scan.Sign) - Deg = NewClassRule(scan.Rune('d', '°')).WithType(DegType) - Min = NewClassRule(scan.Rune('m', '\'', '′')).WithType(MinType) - Sec = NewClassRule(scan.Rune('s', '"', '″')).WithType(SecType) - East = NewClassRule(scan.Rune('e', 'E')).WithType(EastType) - North = NewClassRule(scan.Rune('n', 'N')).WithType(NorthType) - South = NewClassRule(scan.Rune('s', 'S')).WithType(SouthType) - West = NewClassRule(scan.Rune('w', 'W')).WithType(WestType) -) - -type ClassRule struct { - class scan.Class - type_ string -} - -func NewClassRule(c scan.Class) ClassRule { - return ClassRule{class: c} -} - -func (r ClassRule) WithType(t string) ClassRule { - r.type_ = t - return r -} - -func (r ClassRule) Eval(s *scan.Scanner) bool { - if !s.Is(r.class) { - return false - } - s.Keep() - if r.type_ != "" { - s.Type = r.type_ - } - return true -} - -type Context struct { - RuleSet scan.RuleSet -} - -func NewContext() *Context { - c := &Context{} - c.RuleSet = scan.NewRuleSet( - scan.NewSpaceRule(scan.Whitespace), - scan.Real, - Sign, - Deg, Min, Sec, - East, North, South, West, - ) - return c -} diff --git a/pkg/dms/state.gv b/pkg/dms/state.gv deleted file mode 100644 index 165a031b..00000000 --- a/pkg/dms/state.gv +++ /dev/null @@ -1,47 +0,0 @@ -digraph dms { - - PLUS [label="+"]; - MINUS [label="-"]; - DEG_INT [label="int"]; - DEG_INT_SYM [label="deg"]; - DEG_REAL_SYM [label="deg"]; - DEG_REAL [label="real"]; - MIN_INT [label="int"]; - MIN_INT_SYM [label="min"]; - MIN_REAL_SYM [label="min"]; - MIN_REAL [label="real"]; - SEC_INT [label="int"]; - SEC_SYM [label="sec"]; - SEC_REAL [label="real"]; - - S0 -> { PLUS MINUS S1 }; - PLUS -> S1; - MINUS -> S1; - - S1 -> { DEG_INT DEG_REAL } - DEG_INT -> S2 - DEG_REAL -> S3 - - S2 -> { DEG_INT_SYM END } - DEG_INT_SYM -> S4 - - S3 -> { DEG_REAL_SYM END } - DEG_REAL_SYM -> S6 - - S4 -> { MIN_INT MIN_REAL S6 } - MIN_INT -> MIN_INT_SYM - MIN_INT_SYM -> S5 - MIN_REAL -> MIN_REAL_SYM - MIN_REAL_SYM -> S6 - - S5 -> { SEC_INT SEC_REAL END } - SEC_INT -> SEC_SYM - SEC_REAL -> SEC_SYM - SEC_SYM -> S6 - - S6 -> { N S E W END } - N -> END - S -> END - E -> END - W -> END -} diff --git a/pkg/dms/state.png b/pkg/dms/state.png deleted file mode 100644 index d1e31d690d545767e187be4cf815abb86d1b81fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 117012 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 z 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

+efET!xiH2jpoMBzTtAU44WD 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 JjJI&y^FNr?MRWiF From 6434d0ffe1c0b1ece36522b25fd5263fab9b4c10 Mon Sep 17 00:00:00 2001 From: Mike McGann Date: Mon, 5 Feb 2024 20:04:30 -0500 Subject: [PATCH 05/14] update dep --- go.mod | 4 ++-- go.sum | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index f364ac11..662d1901 100644 --- a/go.mod +++ b/go.mod @@ -1,9 +1,9 @@ module github.com/blackchip-org/zc/v5 -go 1.21.1 +go 1.21 require ( - github.com/blackchip-org/scan v0.0.1 + github.com/blackchip-org/scan v0.1.0 github.com/peterh/liner v1.2.2 github.com/shopspring/decimal v1.3.1 github.com/twpayne/go-proj/v10 v10.1.1 diff --git a/go.sum b/go.sum index 14fe6b7d..8b6e7549 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -github.com/blackchip-org/scan v0.0.1 h1:C+Yjgc2BnciwuRHP+nrWqV2gh3X3iqo76ZZ3Q2+1LdM= -github.com/blackchip-org/scan v0.0.1/go.mod h1:fnJGAutu4OH6z0z8jmmdDl89lt+bvOz89cZWq4swkYU= +github.com/blackchip-org/scan v0.1.0 h1:hAFDKoENP7yNha7gchwqiACjJftVRSP59gVXgDwEeBY= +github.com/blackchip-org/scan v0.1.0/go.mod h1:eS9QMEdU0CgTZ3uyvO50h1NBet3JwXEGTCWr4e6sJ3w= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/mattn/go-runewidth v0.0.3 h1:a+kO+98RDGEfo6asOGMmpodZq4FNtnGP54yps8BzLR4= From f56d2ef69aac32a38549f2a79df76e0f732ade51 Mon Sep 17 00:00:00 2001 From: Mike McGann Date: Tue, 6 Feb 2024 07:56:29 -0500 Subject: [PATCH 06/14] update to use dms package --- doc/examples/angle.md | 2 +- doc/ops/angle.md | 14 ++-- pkg/calc/ops_gen.go | 4 +- pkg/ops/angle.go | 34 +++++---- pkg/types/dms.go | 168 ------------------------------------------ pkg/zc/dms.go | 25 +++++-- 6 files changed, 46 insertions(+), 201 deletions(-) delete mode 100644 pkg/types/dms.go diff --git a/doc/examples/angle.md b/doc/examples/angle.md index 708f1b6c..82792487 100644 --- a/doc/examples/angle.md +++ b/doc/examples/angle.md @@ -7,6 +7,6 @@ Degrees, minutes, seconds: | Input | Stack |-----------------------|------------- | `-77.016389` | `-77.016389` -| `dm` | `-77° 0.98334′` +| `dm` | `-77° 0.9833400000002257′` | `0 dmsr` | `-77° 0′ 59″` diff --git a/doc/ops/angle.md b/doc/ops/angle.md index 857d386d..c53cf079 100644 --- a/doc/ops/angle.md +++ b/doc/ops/angle.md @@ -24,7 +24,7 @@ Angular calculations Convert the DMS angle *p0* to decimal degrees. ``` -( p0:DMS -- Decimal ) +( p0:DMS -- Float ) ``` Example: @@ -51,7 +51,7 @@ Example: | Input | Stack |--------------|--------------- -| `10.1234 dm` | `10° 7.404′` +| `10.1234 dm` | `10° 7.404000000000011′` ## deg-min-round @@ -61,7 +61,7 @@ Reformat the angle *p0* to degrees and minutes and round the minutes to Alias: `dmr` ``` -( p0:DMS n:Int32 -- DMS ) +( p0:DMS n:Int -- DMS ) ``` Example: @@ -88,7 +88,7 @@ Example: | Input | Stack |------------------|--------------- -| `-76.856944 dms` | `-76° 51′ 24.9984″` +| `-76.856944 dms` | `-76° 51′ 24.998399999994945″` ## deg-min-sec-round @@ -98,7 +98,7 @@ seconds to *n* places. Alias: `dmsr` ``` -( p0:DMS n:Int32 -- DMS ) +( p0:DMS n:Int -- DMS ) ``` Example: @@ -150,7 +150,7 @@ Example: Converts the angle *p0* to minutes. ``` -( p0:DMS -- Decimal ) +( p0:DMS -- Float ) ``` Example: @@ -182,7 +182,7 @@ Example: Converts the angle *p0* to seconds. ``` -( p0:DMS -- Decimal ) +( p0:DMS -- Float ) ``` Example: diff --git a/pkg/calc/ops_gen.go b/pkg/calc/ops_gen.go index 90052342..cab37dcc 100644 --- a/pkg/calc/ops_gen.go +++ b/pkg/calc/ops_gen.go @@ -117,9 +117,9 @@ var opsList = []zc.OpDecl{ zc.Macro("deca", "1e01"), zc.Macro("deci", "1e-01"), zc.Op("deg-min", ops.DM, zc.DMS), - zc.Op("deg-min-round", ops.DMRound, zc.DMS, zc.Int32), + zc.Op("deg-min-round", ops.DMRound, zc.DMS, zc.Int), zc.Op("deg-min-sec", ops.DMS, zc.DMS), - zc.Op("deg-min-sec-round", ops.DMSRound, zc.DMS, zc.Int32), + zc.Op("deg-min-sec-round", ops.DMSRound, zc.DMS, zc.Int), zc.Macro("deg-rad", "pi 180 div mul"), zc.Op("denom", ops.Denom, zc.Rational), zc.GenOp("div", diff --git a/pkg/ops/angle.go b/pkg/ops/angle.go index 27603811..a7d2148c 100644 --- a/pkg/ops/angle.go +++ b/pkg/ops/angle.go @@ -1,12 +1,13 @@ package ops import ( + "github.com/blackchip-org/dms" "github.com/blackchip-org/zc/v5/pkg/zc" ) /* oper dec -func DecDMS p0:DMS -- Decimal +func DecDMS p0:DMS -- Float title DMS angle to decimal degrees desc @@ -20,7 +21,7 @@ end func DecDMS(c zc.Calc) { p0 := zc.PopDMS(c) r0 := p0.Degrees() - zc.PushDecimal(c, r0) + zc.PushFloat(c, r0) } /* @@ -34,18 +35,19 @@ Reformat the angle *p0* to degrees and minutes end example -10.1234 dm -- 10° 7.404′ +10.1234 dm -- 10° 7.404000000000011′ end */ func DM(c zc.Calc) { + f := dms.NewFormatter(dms.MinType, -1) p0 := zc.PopDMS(c) - r0 := p0.FormatDM(-1) + r0 := f.Format(p0) zc.PushString(c, r0) } /* oper deg-min-round -func DMRound p0:DMS n:Int32 -- DMS +func DMRound p0:DMS n:Int -- DMS alias dmr title Rounded angle in degrees and minutes @@ -59,9 +61,10 @@ example end */ func DMRound(c zc.Calc) { - places := zc.PopInt32(c) + places := zc.PopInt(c) + f := dms.NewFormatter(dms.MinType, places) p0 := zc.PopDMS(c) - r0 := p0.FormatDM(places) + r0 := f.Format(p0) zc.PushString(c, r0) } @@ -76,7 +79,7 @@ Reformat the angle *p0* to degrees, minutes, and seconds. end example --76.856944 dms -- -76° 51′ 24.9984″ +-76.856944 dms -- -76° 51′ 24.998399999994945″ end */ func DMS(c zc.Calc) { @@ -86,7 +89,7 @@ func DMS(c zc.Calc) { /* oper deg-min-sec-round -func DMSRound p0:DMS n:Int32 -- DMS +func DMSRound p0:DMS n:Int -- DMS alias dmsr title Rounded angle in degrees, minutes, seconds @@ -100,9 +103,10 @@ example end */ func DMSRound(c zc.Calc) { - places := zc.PopInt32(c) + places := zc.PopInt(c) + f := dms.NewFormatter(dms.SecType, places) p0 := zc.PopDMS(c) - r0 := p0.FormatDMS(places) + r0 := f.Format(p0) zc.PushString(c, r0) } @@ -145,7 +149,7 @@ func IsDMS(c zc.Calc) { /* oper minutes -func MinutesDMS p0:DMS -- Decimal +func MinutesDMS p0:DMS -- Float title Angle in minutes desc @@ -159,7 +163,7 @@ end func MinutesDMS(c zc.Calc) { p0 := zc.PopDMS(c) r0 := p0.Minutes() - zc.PushDecimal(c, r0) + zc.PushFloat(c, r0) } /* @@ -179,7 +183,7 @@ end /* oper seconds -func SecondsDMS p0:DMS -- Decimal +func SecondsDMS p0:DMS -- Float title Angle in seconds desc @@ -193,5 +197,5 @@ end func SecondsDMS(c zc.Calc) { p0 := zc.PopDMS(c) r0 := p0.Seconds() - zc.PushDecimal(c, r0) + zc.PushFloat(c, r0) } diff --git a/pkg/types/dms.go b/pkg/types/dms.go deleted file mode 100644 index 2964cfa3..00000000 --- a/pkg/types/dms.go +++ /dev/null @@ -1,168 +0,0 @@ -package types - -import ( - "fmt" - "math" - "unicode" - - "github.com/blackchip-org/zc/v5/pkg/scanner" -) - -var ( - d60 = NewDecimalFromInt(60) - d3600 = NewDecimalFromInt(3600) -) - -type DMS struct { - v Decimal -} - -func NewDMS(v Decimal) DMS { - return DMS{v: v} -} - -func (d DMS) Degrees() Decimal { - return d.v -} - -func (d DMS) Minutes() Decimal { - return d.v.Mul(d60) -} - -func (d DMS) Seconds() Decimal { - return d.v.Mul(d3600) -} - -func (d DMS) Radians() float64 { - return math.Pi / 180.0 * d.v.Float() -} - -func (d DMS) Sub(d2 DMS) DMS { - return DMS{v: d.v.Sub(d2.v)} -} - -func (d DMS) FormatDMS(places int32) string { - deg := d.v.Truncate(0) - aDeg := deg.Abs() - - min := d.Minutes().Abs().Sub(aDeg.Mul(d60)).Truncate(0) - //min := math.Trunc(math.Abs(a.Minutes()) - (aDeg * 60)) - - sec := d.Seconds().Abs().Sub(aDeg.Mul(d3600)).Sub(min.Mul(d60)) - // fSec := math.Abs(a.Seconds()) - (aDeg * 3600) - (min * 60) - // dSec := decimal.NewFromFloat(fSec) - if places >= 0 { - sec = sec.Round(places) - } - return fmt.Sprintf("%v° %v′ %v″", deg, min, sec) -} - -func (d DMS) FormatDM(places int32) string { - deg := d.v.Truncate(0) - aDeg := deg.Abs() - - min := d.Minutes().Abs().Sub(aDeg.Mul(d60)) - if places >= 0 { - min = min.Round(places) - } - return fmt.Sprintf("%v° %v′", deg, min) -} - -func (d DMS) String() string { - return d.FormatDMS(-1) -} - -func ParseDMS(str string) (DMS, bool) { - var s scanner.Scanner - s.SetString(str) - s.TrimText = true - - sign := 1 - if s.Ch == '-' { - sign = -1 - s.Next() - } else if s.Ch == '+' { - s.Next() - } - - sDeg := s.ScanUntil(scanner.Runes('°', 'd')) - s.Next() - sMin := s.ScanUntil(scanner.Runes('m', '\'', '′')) - s.Next() - sSec := s.ScanUntil(scanner.Runes('s', '"', '″')) - s.Next() - - v := DecimalZero - var deg, min, sec Decimal - var err error - - if sDeg != "" { - deg, err = NewDecimalFromString(sDeg) - if err != nil || deg.IsNegative() { - return DMS{}, false - } - v = v.Add(deg) - } - if sMin != "" { - min, err = NewDecimalFromString(sMin) - if err != nil || deg.IsNegative() { - return DMS{}, false - } - v = v.Add(min.Div(d60)) - } - if sSec != "" { - sec, err = NewDecimalFromString(sSec) - if err != nil || deg.IsNegative() { - return DMS{}, false - } - v = v.Add(sec.Div(d3600)) - } - - if sDeg != "" && (sMin != "" || sSec != "") { - if !deg.IsInteger() { - return DMS{}, false - } - } - if sMin != "" && sSec != "" { - if !min.IsInteger() { - return DMS{}, false - } - } - if sMin != "" && sDeg != "" { - if min.IsNegative() { - return DMS{}, false - } - } - if sSec != "" && (sDeg != "" || sMin != "") { - if min.IsNegative() { - return DMS{}, false - } - } - - if sign < 0 { - v = v.Neg() - } - - s.ScanWhile(unicode.IsSpace) - suffix := s.Scan(scanner.Remaining) - - switch suffix { - case "N", "n", "E", "e": - case "S", "s", "W", "w": - // If the number is already negative, don't allow a hemisphere - // flag - if v.IsNegative() { - return DMS{}, false - } - v = v.Neg() - case "": - // No more data is okay at this point - default: - // But more data that doesn't match the above is not - return DMS{}, false - } - if !s.End() { - return DMS{}, false - } - return DMS{v: v}, true -} diff --git a/pkg/zc/dms.go b/pkg/zc/dms.go index 86c521a4..013587a9 100644 --- a/pkg/zc/dms.go +++ b/pkg/zc/dms.go @@ -1,20 +1,29 @@ package zc import ( - "github.com/blackchip-org/zc/v5/pkg/types" + "github.com/blackchip-org/dms" ) // -- +var ( + dmsParser = dms.NewDefaultParser() + dmsFormatter = dms.NewFormatter(dms.SecType, -1) +) + type DMSType struct{} func (t DMSType) String() string { return "DMS" } -func (t DMSType) Parse(str string) (types.DMS, bool) { - return types.ParseDMS(str) +func (t DMSType) Parse(str string) (dms.Angle, bool) { + a, err := dmsParser.Parse(str) + if err != nil { + return dms.Angle{}, false + } + return a, true } -func (t DMSType) MustParse(s string) types.DMS { +func (t DMSType) MustParse(s string) dms.Angle { r, ok := t.Parse(s) if !ok { PanicExpectedType(t, s) @@ -27,11 +36,11 @@ func (t DMSType) Is(s string) bool { return ok } -func (t DMSType) Format(v types.DMS) string { - return v.String() +func (t DMSType) Format(v dms.Angle) string { + return dmsFormatter.Format(v) } -func PopDMS(c Calc) types.DMS { return DMS.MustParse(c.MustPop()) } -func PushDMS(c Calc, r types.DMS) { c.Push(DMS.Format(r)) } +func PopDMS(c Calc) dms.Angle { return DMS.MustParse(c.MustPop()) } +func PushDMS(c Calc, r dms.Angle) { c.Push(DMS.Format(r)) } // -- From aa47abf2f5d7e460bb0e30fddb9a31a6bcce8b2b Mon Sep 17 00:00:00 2001 From: Mike McGann Date: Tue, 6 Feb 2024 08:16:53 -0500 Subject: [PATCH 07/14] update roller --- pkg/ops/rand.go | 43 +++++++++++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/pkg/ops/rand.go b/pkg/ops/rand.go index 6c26353f..5d2208ba 100644 --- a/pkg/ops/rand.go +++ b/pkg/ops/rand.go @@ -2,10 +2,11 @@ package ops import ( "math/rand" + "strconv" "time" "unicode" - "github.com/blackchip-org/zc/v5/pkg/scanner" + "github.com/blackchip-org/scan" "github.com/blackchip-org/zc/v5/pkg/zc" ) @@ -154,29 +155,43 @@ end */ func Roll(c zc.Calc) { state := getRandState(c) - var s scanner.Scanner + var s scan.Scanner a0 := zc.PopString(c) - s.SetString(a0) + s.InitFromString("", a0) + + var num, sides int64 + var err error + + if !scan.Int.Eval(&s) { + num = 1 + } else { + tok := s.Emit() + num, err = strconv.ParseInt(tok.Val, 10, 64) + if err != nil { + zc.ErrInvalidArgs(c, "dice count") + return + } + } - nTok := s.Scan(scanner.UInt) - if unicode.ToLower(s.Ch) != 'd' { + if unicode.ToLower(s.This) != 'd' { zc.ErrInvalidArgs(c, "missing 'd'") return } - s.Next() - sidesTok := s.Scan(scanner.UInt) - if sidesTok == "" || !s.End() { + s.Discard() + + if !scan.Int.Eval(&s) { zc.ErrInvalidArgs(c, "sides") return } - if nTok == "" { - nTok = "1" + tok := s.Emit() + sides, err = strconv.ParseInt(tok.Val, 10, 64) + if err != nil { + zc.ErrInvalidArgs(c, "sides") + return } - n := zc.Int.MustParse(nTok) - sides := zc.Int.MustParse(sidesTok) - for i := 0; i < n; i++ { - r := state.rand.Intn(sides) + 1 + for i := int64(0); i < num; i++ { + r := state.rand.Intn(int(sides)) + 1 zc.PushInt(c, r) } } From 349a84cf1c7afa074e30c445a8be56f0139e5859 Mon Sep 17 00:00:00 2001 From: Mike McGann Date: Tue, 6 Feb 2024 09:04:50 -0500 Subject: [PATCH 08/14] update repl --- Makefile | 2 +- go.mod | 1 + go.sum | 2 ++ pkg/repl/commands.go | 41 ++++++++++++++++++++--------------------- pkg/repl/repl.go | 23 +++++++++++++---------- 5 files changed, 37 insertions(+), 32 deletions(-) diff --git a/Makefile b/Makefile index 2e141a3a..5e91b804 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,7 @@ install: gen go install $(GOFLAGS) ./... test: ops doc - TZ=UTC go test $(GOFLAGS) ./... + TZ=UTC go test -test.timeout=5s $(GOFLAGS) ./... wasm: GOOS=js GOARCH=wasm go build -o web/zc.wasm cmd/wasm/main.go diff --git a/go.mod b/go.mod index 662d1901..812d5e57 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module github.com/blackchip-org/zc/v5 go 1.21 require ( + github.com/blackchip-org/dms v0.0.0-20240206010456-abead6bdc48f github.com/blackchip-org/scan v0.1.0 github.com/peterh/liner v1.2.2 github.com/shopspring/decimal v1.3.1 diff --git a/go.sum b/go.sum index 8b6e7549..90475f96 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,5 @@ +github.com/blackchip-org/dms v0.0.0-20240206010456-abead6bdc48f h1:RaBc0/hHgaGrPWiCf9vk8Q7M8FfJcj2Pk9JHH8zTus8= +github.com/blackchip-org/dms v0.0.0-20240206010456-abead6bdc48f/go.mod h1:82Ee0ylgD+HbGDD23AqbuOCIdTlbBcYPNXNCqO5ha1s= github.com/blackchip-org/scan v0.1.0 h1:hAFDKoENP7yNha7gchwqiACjJftVRSP59gVXgDwEeBY= github.com/blackchip-org/scan v0.1.0/go.mod h1:eS9QMEdU0CgTZ3uyvO50h1NBet3JwXEGTCWr4e6sJ3w= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= diff --git a/pkg/repl/commands.go b/pkg/repl/commands.go index a591350e..a8af7a32 100644 --- a/pkg/repl/commands.go +++ b/pkg/repl/commands.go @@ -3,13 +3,12 @@ package repl import ( "fmt" "strings" - "unicode" - "github.com/blackchip-org/zc/v5/pkg/scanner" + "github.com/blackchip-org/scan" "github.com/blackchip-org/zc/v5/pkg/zc" ) -type Cmd func(*REPL, *scanner.Scanner) error +type Cmd func(*REPL, *scan.Scanner) error var cmds map[string]Cmd @@ -25,22 +24,24 @@ func init() { } } -func def(r *REPL, s *scanner.Scanner) error { - s.ScanWhile(unicode.IsSpace) - if s.End() { +func def(r *REPL, s *scan.Scanner) error { + scan.While(s, scan.Whitespace, s.Discard) + if !s.HasMore() { return fmt.Errorf("expected macro name") } - if zc.IsValuePrefix(s.Ch, s.Lookahead) { + if zc.IsValuePrefix(s.This, s.Next) { return fmt.Errorf("invalid name") } - name := s.Scan(scanner.Word) + scan.Word.Eval(s) + name := s.Emit().Val if _, exists := cmds[name]; exists { return fmt.Errorf("invalid name") } - s.ScanWhile(unicode.IsSpace) - expr := s.Scan(scanner.Remaining) + scan.While(s, scan.Whitespace, s.Discard) + scan.While(s, scan.Any, s.Keep) + expr := s.Emit().Val if expr == "" { if _, exists := r.macros[name]; !exists { @@ -62,12 +63,12 @@ func def(r *REPL, s *scanner.Scanner) error { return nil } -func pop(r *REPL, _ *scanner.Scanner) error { +func pop(r *REPL, _ *scan.Scanner) error { r.Calc.Pop() return nil } -func redo(r *REPL, _ *scanner.Scanner) error { +func redo(r *REPL, _ *scan.Scanner) error { if len(r.redoStack) == 0 { return fmt.Errorf("redo stack is empty") } @@ -77,23 +78,21 @@ func redo(r *REPL, _ *scanner.Scanner) error { return nil } -func quit(_ *REPL, _ *scanner.Scanner) error { +func quit(_ *REPL, _ *scan.Scanner) error { return errQuit } -func quote(r *REPL, s *scanner.Scanner) error { - s.ScanWhile(unicode.IsSpace) - if s.End() { +func quote(r *REPL, s *scan.Scanner) error { + scan.While(s, scan.Whitespace, s.Discard) + if !s.HasMore() { return fmt.Errorf("expected text to be used as a delimiter") } - for !s.End() { - s.Keep() - } - r.quoteEnd = strings.TrimSpace(s.Token()) + scan.While(s, scan.Any, s.Keep) + r.quoteEnd = strings.TrimSpace(s.Emit().Val) return nil } -func undo(r *REPL, _ *scanner.Scanner) error { +func undo(r *REPL, _ *scan.Scanner) error { if len(r.undoStack) == 0 { return fmt.Errorf("undo stack is empty") } diff --git a/pkg/repl/repl.go b/pkg/repl/repl.go index 157a68e5..9cdaca6f 100644 --- a/pkg/repl/repl.go +++ b/pkg/repl/repl.go @@ -9,10 +9,9 @@ import ( "path" "sort" "strings" - "unicode" + "github.com/blackchip-org/scan" "github.com/blackchip-org/zc/v5/pkg/ansi" - "github.com/blackchip-org/zc/v5/pkg/scanner" "github.com/blackchip-org/zc/v5/pkg/zc" "github.com/peterh/liner" ) @@ -92,32 +91,36 @@ func (r *REPL) evalLine(line string) error { return nil } - var s scanner.Scanner + var s scan.Scanner var out []string - s.SetString(line) + s.InitFromString("", line) - for s.Ok() { - word := s.Scan(scanner.Word) + for s.HasMore() { + scan.Word.Eval(&s) + word := s.Emit().Val if mac, ok := r.macros[word]; ok { out = append(out, mac) } else { out = append(out, word) } + scan.While(&s, scan.Whitespace, s.Discard) } outLine := strings.Join(out, " ") return r.Calc.Eval(outLine) } func (r *REPL) Eval(line string) error { - var s scanner.Scanner + var s scan.Scanner r.info = "" r.err = nil prev := r.Calc.Stack() - s.SetString(line) - s.ScanWhile(unicode.IsSpace) - cmdName := s.Scan(scanner.Word) + s.InitFromString("", line) + scan.While(&s, scan.Whitespace, s.Discard) + scan.Word.Eval(&s) + + cmdName := s.Emit().Val cmd, ok := cmds[cmdName] var err error From 41f2054ed554311d33cbc57a7e12ef6bf1f61257 Mon Sep 17 00:00:00 2001 From: Mike McGann Date: Tue, 6 Feb 2024 09:15:26 -0500 Subject: [PATCH 09/14] update quote --- pkg/zc/util.go | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/pkg/zc/util.go b/pkg/zc/util.go index d7987ee5..ba7f7eb0 100644 --- a/pkg/zc/util.go +++ b/pkg/zc/util.go @@ -6,7 +6,7 @@ import ( "strings" "unicode" - "github.com/blackchip-org/zc/v5/pkg/scanner" + "github.com/blackchip-org/scan" "golang.org/x/exp/constraints" ) @@ -66,15 +66,15 @@ func StackString(c Calc) string { } func Quote(v string) string { - var s scanner.Scanner - s.SetString(v) + var s scan.Scanner + s.InitFromString("", v) needsQuotes := false - if !IsValuePrefix(s.Ch, s.Lookahead) { + if !IsValuePrefix(s.This, s.Next) { needsQuotes = true } else { - s.ScanUntil(unicode.IsSpace) - if !s.End() { + scan.Until(&s, scan.Whitespace, s.Discard) + if s.HasMore() { needsQuotes = true } } @@ -83,16 +83,16 @@ func Quote(v string) string { return v } - s.SetString(v) - s.Text.WriteRune('\'') - for s.Ok() { - if s.Ch == '\'' { - s.Text.WriteString("\\'") - s.Next() + s.InitFromString("", v) + s.Val.WriteRune('\'') + for s.HasMore() { + if s.This == '\'' { + s.Val.WriteString("\\'") + s.Skip() } else { s.Keep() } } - s.Text.WriteRune('\'') - return s.Token() + s.Val.WriteRune('\'') + return s.Emit().Val } From e2159dd26b49264374950cebb4aa67aa564c91e3 Mon Sep 17 00:00:00 2001 From: Mike McGann Date: Tue, 6 Feb 2024 09:24:57 -0500 Subject: [PATCH 10/14] update test ops --- test/ops_test.go | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/test/ops_test.go b/test/ops_test.go index cf46b077..95c46cc9 100644 --- a/test/ops_test.go +++ b/test/ops_test.go @@ -6,10 +6,10 @@ import ( "strings" "testing" + "github.com/blackchip-org/scan" "github.com/blackchip-org/zc/v5/pkg/ansi" "github.com/blackchip-org/zc/v5/pkg/calc" "github.com/blackchip-org/zc/v5/pkg/repl" - "github.com/blackchip-org/zc/v5/pkg/scanner" "github.com/blackchip-org/zc/v5/pkg/zc" ) @@ -47,39 +47,47 @@ func testFile(t *testing.T, file string) { } defer f.Close() - s := scanner.New(f) + s := scan.NewScanner(file, f) var blockName string - for s.Ok() { - if s.Ch == '#' && s.Lookahead == '#' { - s.Next() - s.Next() - blockName = s.Scan(scanner.LineTrimSpace) + for s.HasMore() { + if s.This == '#' && s.Next == '#' { + s.Discard() + s.Discard() + scan.Until(s, scan.Rune('\n'), s.Keep) + blockName = strings.TrimSpace(s.Emit().Val) + s.Discard() } else { - space := s.ScanWhile(scanner.Rune(' ')) + scan.While(s, scan.Rune(' '), s.Keep) + space := s.Emit().Val if space == space4 { t.Run(blockName, func(t *testing.T) { testBlock(t, s) }) } else { - s.Scan(scanner.Line) + scan.Until(s, scan.Rune('\n'), s.Discard) + s.Discard() } } } } -func testBlock(t *testing.T, s *scanner.Scanner) { +func testBlock(t *testing.T, s *scan.Scanner) { c := calc.New() r := repl.New(c) out := &strings.Builder{} r.Out = out - for s.Ok() { - test := s.Scan(scanner.LineTrimSpace) + for s.HasMore() { + scan.Until(s, scan.Rune('\n'), s.Keep) + test := strings.TrimSpace(s.Emit().Val) + s.Discard() + if !repl.Test(r, test) { t.Errorf("\n output: %v (error %v) \n input: %v\n", zc.StackString(c), c.Error(), test) } - space := s.ScanWhile(scanner.Rune(' ')) + scan.While(s, scan.Rune(' '), s.Keep) + space := s.Emit().Val if space != space4 { break } From f44398b552c2e6cebabe981810a97126ef4d6ef0 Mon Sep 17 00:00:00 2001 From: Mike McGann Date: Tue, 6 Feb 2024 09:29:06 -0500 Subject: [PATCH 11/14] update repl test --- pkg/repl/test.go | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/pkg/repl/test.go b/pkg/repl/test.go index 1a90196d..3fb1dd8e 100644 --- a/pkg/repl/test.go +++ b/pkg/repl/test.go @@ -2,30 +2,32 @@ package repl import ( "reflect" + "strings" - "github.com/blackchip-org/zc/v5/pkg/scanner" + "github.com/blackchip-org/scan" "github.com/blackchip-org/zc/v5/pkg/zc" ) func Test(r *REPL, test string) bool { - var s scanner.Scanner - s.SetString(test) + var s scan.Scanner + s.InitFromString("", test) var input string errorTest := false - for s.Ok() { - if (s.Ch == '-' || s.Ch == '!') && s.Lookahead == '-' { - if s.Ch == '!' { + for s.HasMore() { + if (s.This == '-' || s.This == '!') && s.Next == '-' { + if s.This == '!' { errorTest = true } - input = s.Token() - s.Next() - s.Next() + input = s.Emit().Val + s.Discard() + s.Discard() break } s.Keep() } - output := s.Scan(scanner.LineTrimSpace) + scan.Until(&s, scan.Rune('\n'), s.Keep) + output := strings.TrimSpace(s.Emit().Val) r.Eval(input) err := r.Error() if errorTest { From cd236aeea67369dadd5c870975046b80bcd0dbb7 Mon Sep 17 00:00:00 2001 From: Mike McGann Date: Tue, 6 Feb 2024 10:49:05 -0500 Subject: [PATCH 12/14] removal of old scanner --- internal/gen-index/main.go | 3 +- pkg/doc/doc.go | 117 +++++++++++++------------ pkg/ops/crypto.go | 5 +- pkg/repl/commands.go | 3 +- pkg/repl/repl.go | 7 +- pkg/scanner/classes.go | 69 --------------- pkg/scanner/defs.go | 74 ---------------- pkg/scanner/funcs.go | 133 ---------------------------- pkg/scanner/parse.go | 22 ----- pkg/scanner/pos.go | 24 ----- pkg/scanner/reader.go | 72 --------------- pkg/scanner/reader_test.go | 60 ------------- pkg/scanner/scanner.go | 169 ------------------------------------ pkg/scanner/scanner_test.go | 147 ------------------------------- pkg/types/duration.go | 33 +++---- pkg/zc/real.go | 21 +++-- 16 files changed, 98 insertions(+), 861 deletions(-) delete mode 100644 pkg/scanner/classes.go delete mode 100644 pkg/scanner/defs.go delete mode 100644 pkg/scanner/funcs.go delete mode 100644 pkg/scanner/parse.go delete mode 100644 pkg/scanner/pos.go delete mode 100644 pkg/scanner/reader.go delete mode 100644 pkg/scanner/reader_test.go delete mode 100644 pkg/scanner/scanner.go delete mode 100644 pkg/scanner/scanner_test.go diff --git a/internal/gen-index/main.go b/internal/gen-index/main.go index a2bffa53..4b6b2281 100644 --- a/internal/gen-index/main.go +++ b/internal/gen-index/main.go @@ -11,7 +11,6 @@ import ( "unicode/utf8" "github.com/blackchip-org/zc/v5/pkg/doc" - "github.com/blackchip-org/zc/v5/pkg/scanner" ) const ( @@ -79,7 +78,7 @@ func main() { for _, q := range names { name := q.String() heading, _ := utf8.DecodeRuneInString(q.name) - if scanner.IsCharAZ(heading) && heading != thisHeading { + if ((heading >= 'a' && heading <= 'z') || (heading >= 'A' && heading <= 'Z')) && heading != thisHeading { fmt.Fprintf(out, "\n## %v\n\n", string(heading)) thisHeading = heading } diff --git a/pkg/doc/doc.go b/pkg/doc/doc.go index 60c00482..4e1341ff 100644 --- a/pkg/doc/doc.go +++ b/pkg/doc/doc.go @@ -8,7 +8,7 @@ import ( "strings" "unicode" - "github.com/blackchip-org/zc/v5/pkg/scanner" + "github.com/blackchip-org/scan" ) type Param struct { @@ -71,21 +71,20 @@ func ParseSourceFile(name string) ([]*Op, error) { defer f.Close() group := strings.TrimSuffix(path.Base(name), ".go") - s := scanner.New(f) - s.SetName(name) + s := scan.NewScanner(name, f) //s.Debug = true - for s.Ok() { - if s.Ch == '/' && s.Lookahead == '*' { - s.Scan(scanner.Line) + for s.HasMore() { + if s.This == '/' && s.Next == '*' { + scan.Line(s) op, err := parseOp(s, group) if err != nil { return nil, err } ops = append(ops, op) - } else if s.Ch == '/' && s.Lookahead == '/' { - s.Next() - s.Next() - word := s.Scan(scanner.Word) + } else if s.This == '/' && s.Next == '/' { + s.Discard() + s.Discard() + word := scan.Word(s) if word == "tab" { op, err := parseTableOp(s, group) if err != nil { @@ -93,13 +92,18 @@ func ParseSourceFile(name string) ([]*Op, error) { } ops = append(ops, op) } else { - s.Scan(scanner.Line) + scan.Until(s, scan.Rune('\n'), s.Discard) + s.Discard() } } else { - s.Scan(scanner.Line) + scan.Until(s, scan.Rune('\n'), s.Discard) + s.Discard() } } - return ops, s.Error + if len(s.Errs) > 0 { + return ops, s.Errs + } + return ops, nil } func ParseSourceFiles(dir string) ([]*Op, error) { @@ -122,25 +126,25 @@ func ParseSourceFiles(dir string) ([]*Op, error) { return ops, nil } -func parseOp(s *scanner.Scanner, group string) (*Op, error) { +func parseOp(s *scan.Scanner, group string) (*Op, error) { op := &Op{Group: group} loop: - for s.Ok() { + for s.HasMore() { var err error - word := s.Scan(scanner.Word) + word := scan.Word(s) switch word { case "oper": - op.Name = s.Scan(scanner.LineTrimSpace) + op.Name = scan.Line(s) case "func": var fn FuncDecl fn, err = parseFn(s) op.Funcs = append(op.Funcs, fn) case "macro": - op.Macro = s.Scan(scanner.LineTrimSpace) + op.Macro = scan.Line(s) case "alias": - op.Aliases = append(op.Aliases, s.Scan(scanner.LineTrimSpace)) + op.Aliases = append(op.Aliases, scan.Line(s)) case "title": - op.Title = s.Scan(scanner.LineTrimSpace) + op.Title = scan.Line(s) case "desc": op.Desc = parseDesc(s) case "example": @@ -161,10 +165,9 @@ loop: return op, nil } -func parseFn(s *scanner.Scanner) (FuncDecl, error) { - s.ScanWhile(unicode.IsSpace) +func parseFn(s *scan.Scanner) (FuncDecl, error) { fn := FuncDecl{ - Name: s.Scan(scanner.Word), + Name: scan.Word(s), } var err error fn.Params, err = parseParams(s) @@ -178,44 +181,48 @@ func parseFn(s *scanner.Scanner) (FuncDecl, error) { return fn, nil } -func parseParams(s *scanner.Scanner) ([]Param, error) { +func parseParams(s *scan.Scanner) ([]Param, error) { var params []Param - for s.Ok() { - s.ScanWhile(scanner.Rune2(' ', '\t')) - if s.Ch == '\n' { - s.Next() + for s.HasMore() { + scan.While(s, scan.Rune(' ', '\t'), s.Discard) + if s.This == '\n' { + s.Discard() return params, nil } - if s.Ch == '-' && s.Lookahead == '-' { - s.Next() - s.Next() + if s.This == '-' && s.Next == '-' { + s.Discard() + s.Discard() return params, nil } var all bool var name, pType string - t := s.ScanWhile(scanner.Or( - unicode.IsLetter, - unicode.IsDigit, - scanner.Rune('.'), - )) + scan.While(s, + scan.Or( + unicode.IsLetter, + unicode.IsDigit, + scan.Rune('.'), + ), + s.Keep) + t := s.Emit().Val if t == "" { return nil, scanErr(s, "did not find a parameter name or type") } if t == "..." { continue } - if s.Ch == ':' { + if s.This == ':' { name = t - s.Next() - t = s.ScanWhile(scanner.Or( + s.Discard() + scan.While(s, scan.Or( unicode.IsLetter, unicode.IsDigit, - scanner.Rune('.'), - )) + scan.Rune('.'), + ), s.Keep) + t = s.Emit().Val } pType = t - if s.Ch == '*' { - s.Next() + if s.This == '*' { + s.Discard() all = true } params = append(params, Param{ @@ -227,11 +234,11 @@ func parseParams(s *scanner.Scanner) ([]Param, error) { return params, nil } -func parseDesc(s *scanner.Scanner) string { +func parseDesc(s *scan.Scanner) string { var desc []string - s.Scan(scanner.Line) - for s.Ok() { - line := s.Scan(scanner.LineTrimSpace) + scan.Line(s) + for s.HasMore() { + line := scan.Line(s) if line == "end" { break } @@ -240,11 +247,11 @@ func parseDesc(s *scanner.Scanner) string { return strings.Join(desc, "\n") } -func parseExample(s *scanner.Scanner) ([]Expect, error) { +func parseExample(s *scan.Scanner) ([]Expect, error) { var example []Expect - s.Scan(scanner.Line) - for s.Ok() { - line := s.Scan(scanner.LineTrimSpace) + scan.Line(s) + for s.HasMore() { + line := scan.Line(s) if line == "end" { break } @@ -262,8 +269,8 @@ func parseExample(s *scanner.Scanner) ([]Expect, error) { return example, nil } -func parseTableOp(s *scanner.Scanner, group string) (*Op, error) { - line := s.Scan(scanner.LineTrimSpace) +func parseTableOp(s *scan.Scanner, group string) (*Op, error) { + line := scan.Line(s) parts := strings.Split(line, "--") if len(parts) != 3 { return nil, scanErr(s, "invalid table line: %v", line) @@ -332,7 +339,7 @@ func Group(ops []*Op) map[string][]*Op { return table } -func scanErr(s *scanner.Scanner, format string, a ...any) error { +func scanErr(s *scan.Scanner, format string, a ...any) error { msg := fmt.Sprintf(format, a...) - return fmt.Errorf("[%v] %v", s.TokenPos, msg) + return fmt.Errorf("[%v] %v", s.Pos, msg) } diff --git a/pkg/ops/crypto.go b/pkg/ops/crypto.go index 01cc5589..e9121352 100644 --- a/pkg/ops/crypto.go +++ b/pkg/ops/crypto.go @@ -10,7 +10,6 @@ import ( "hash" "strings" - "github.com/blackchip-org/zc/v5/pkg/scanner" "github.com/blackchip-org/zc/v5/pkg/zc" ) @@ -251,10 +250,10 @@ func Rot13(c zc.Calc) { var r0 strings.Builder for _, ch := range a0 { var lower, upper rune - if scanner.IsLowerCharAZ(ch) { + if ch >= 'a' && ch <= 'z' { lower, upper = 'a', 'z' } - if scanner.IsUpperCharAZ(ch) { + if ch >= 'A' && ch <= 'Z' { lower, upper = 'A', 'Z' } if lower != 0 { diff --git a/pkg/repl/commands.go b/pkg/repl/commands.go index a8af7a32..a04cde50 100644 --- a/pkg/repl/commands.go +++ b/pkg/repl/commands.go @@ -33,8 +33,7 @@ func def(r *REPL, s *scan.Scanner) error { return fmt.Errorf("invalid name") } - scan.Word.Eval(s) - name := s.Emit().Val + name := scan.Word(s) if _, exists := cmds[name]; exists { return fmt.Errorf("invalid name") } diff --git a/pkg/repl/repl.go b/pkg/repl/repl.go index 9cdaca6f..1ff7dd70 100644 --- a/pkg/repl/repl.go +++ b/pkg/repl/repl.go @@ -96,8 +96,7 @@ func (r *REPL) evalLine(line string) error { s.InitFromString("", line) for s.HasMore() { - scan.Word.Eval(&s) - word := s.Emit().Val + word := scan.Word(&s) if mac, ok := r.macros[word]; ok { out = append(out, mac) } else { @@ -117,10 +116,8 @@ func (r *REPL) Eval(line string) error { prev := r.Calc.Stack() s.InitFromString("", line) - scan.While(&s, scan.Whitespace, s.Discard) - scan.Word.Eval(&s) - cmdName := s.Emit().Val + cmdName := scan.Word(&s) cmd, ok := cmds[cmdName] var err error diff --git a/pkg/scanner/classes.go b/pkg/scanner/classes.go deleted file mode 100644 index 7cc79a22..00000000 --- a/pkg/scanner/classes.go +++ /dev/null @@ -1,69 +0,0 @@ -package scanner - -import "unicode" - -type RuneClass func(rune) bool - -func Rune(r1 rune) RuneClass { - return func(r0 rune) bool { - return r0 == r1 - } -} - -func Rune2(r1 rune, r2 rune) RuneClass { - return func(r0 rune) bool { - return r0 == r1 || r0 == r2 - } -} - -func Runes(rs ...rune) RuneClass { - return func(r0 rune) bool { - for _, r := range rs { - if r == r0 { - return true - } - } - return false - } -} - -func RuneRange(from rune, to rune) RuneClass { - return func(r0 rune) bool { - return r0 >= from && r0 <= to - } -} - -func Not(class RuneClass) RuneClass { - return func(r0 rune) bool { - return !class(r0) - } -} - -func Or(classes ...RuneClass) RuneClass { - return func(r0 rune) bool { - for _, class := range classes { - if class(r0) { - return true - } - } - return false - } -} - -var ( - Always = func(r rune) bool { return r != EndCh } - IsCharAF = Or(IsUpperCharAF, IsLowerCharAF) - IsCharAZ = Or(IsUpperCharAZ, IsLowerCharAZ) - IsCurrency = func(r rune) bool { return unicode.Is(unicode.Sc, r) } - IsDigit01 = Rune2('0', '1') - IsDigit07 = RuneRange('0', '7') - IsDigit09 = RuneRange('0', '9') - IsDigit0F = Or(IsDigit09, IsLowerCharAF, IsUpperCharAF) - IsEnd = Rune(EndCh) - IsLowerCharAF = RuneRange('a', 'f') - IsLowerCharAZ = RuneRange('a', 'z') - IsNewline = Rune('\n') - Never = func(r rune) bool { return false } - IsUpperCharAF = RuneRange('A', 'F') - IsUpperCharAZ = RuneRange('A', 'Z') -) diff --git a/pkg/scanner/defs.go b/pkg/scanner/defs.go deleted file mode 100644 index 4c27126c..00000000 --- a/pkg/scanner/defs.go +++ /dev/null @@ -1,74 +0,0 @@ -package scanner - -import "unicode" - -func OptionalClass(r RuneClass) RuneClass { - if r == nil { - return Never - } - return r -} - -type NumberDef struct { - Digit RuneClass - DecSep RuneClass - Sign RuneClass - Exponent RuneClass -} - -type QuotedDef struct { - Escape RuneClass - EscapeMap map[rune]rune - AltEnd RuneClass -} - -var ( - BinDef = NumberDef{ - Digit: IsDigit01, - } - DecDef = NumberDef{ - Digit: IsDigit09, - DecSep: Rune('.'), - Sign: Rune2('+', '-'), - } - FloatDef = NumberDef{ - Digit: IsDigit09, - DecSep: Rune('.'), - Sign: Rune2('+', '-'), - Exponent: Rune2('e', 'E'), - } - HexDef = NumberDef{ - Digit: IsDigit0F, - } - IntDef = NumberDef{ - Digit: IsDigit09, - Sign: Rune2('+', '-'), - } - OctDef = NumberDef{ - Digit: IsDigit07, - } - StringDef = QuotedDef{ - Escape: Rune('\\'), - } - UIntDef = NumberDef{ - Digit: IsDigit09, - } - UDecRef = NumberDef{ - Digit: IsDigit09, - DecSep: Rune('.'), - } -) - -var ( - Bin = NumberFunc(BinDef) - Dec = NumberFunc(DecDef) - Float = NumberFunc(FloatDef) - Hex = NumberFunc(HexDef) - Int = NumberFunc(IntDef) - Oct = NumberFunc(OctDef) - Remaining = WhileFunc(Always) - String = QuotedFunc(StringDef) - Whitespace = WhileFunc(unicode.IsSpace) - UInt = NumberFunc(UIntDef) - UDec = NumberFunc(UDecRef) -) diff --git a/pkg/scanner/funcs.go b/pkg/scanner/funcs.go deleted file mode 100644 index b31537a8..00000000 --- a/pkg/scanner/funcs.go +++ /dev/null @@ -1,133 +0,0 @@ -package scanner - -import ( - "errors" - "strings" - "unicode" -) - -type Func func(*Scanner) - -func WhileFunc(while RuneClass) Func { - return func(s *Scanner) { - for while(s.Ch) && s.Ch != EndCh { - s.Keep() - } - } -} - -func UntilFunc(until RuneClass) Func { - return func(s *Scanner) { - for !until(s.Ch) && s.Ch != EndCh { - s.Keep() - } - } -} - -func NumberFunc(def NumberDef) Func { - def.DecSep = OptionalClass(def.DecSep) - def.Sign = OptionalClass(def.Sign) - def.Exponent = OptionalClass(def.Exponent) - - return func(s *Scanner) { - if def.Sign(s.Ch) { - s.Keep() - } - seenDecSep := false - exponent := false - for { - if def.DecSep(s.Ch) { - if seenDecSep { - break - } - seenDecSep = true - s.Keep() - } else if def.Exponent(s.Ch) { - exponent = true - s.Keep() - break - } else if def.Digit(s.Ch) { - s.Keep() - } else { - break - } - } - if !exponent { - return - } - if def.Sign(s.Ch) { - s.Keep() - } - for def.Digit(s.Ch) { - s.Keep() - } - } -} - -var ErrNotTerminated = errors.New("not terminated") - -func QuotedFunc(def QuotedDef) Func { - def.AltEnd = OptionalClass(def.AltEnd) - return func(s *Scanner) { - endQuote := s.Ch - s.Next() - for s.Ch != endQuote && !def.AltEnd(s.Ch) && !s.End() { - if !def.Escape(s.Ch) { - s.Keep() - continue - } - s.Next() - if def.EscapeMap == nil { - s.Keep() - continue - } - mapped, ok := def.EscapeMap[s.Ch] - if ok { - s.Text.WriteRune(mapped) - s.Next() - } else { - s.Keep() - } - } - if s.Ch != endQuote && !def.AltEnd(s.Ch) { - s.Error = ErrNotTerminated - } - s.Next() - } -} - -func UntilRepeatsFunc(is RuneClass, n int) Func { - return func(s *Scanner) { - count := 0 - for s.Ok() && count < n { - if is(s.Ch) { - count++ - } else { - count = 0 - } - s.Keep() - } - if count == n { - text := s.Text.String() - s.Text.Reset() - s.Text.WriteString(text[0 : len(text)-count]) - } - } -} - -func Word(s *Scanner) { - s.ScanWhile(unicode.IsSpace) - s.ScanUntil(unicode.IsSpace) -} - -func Line(s *Scanner) { - s.ScanUntil(IsNewline) - s.Next() -} - -func LineTrimSpace(s *Scanner) { - Line(s) - l := s.Token() - s.Text.Reset() - s.Text.WriteString(strings.TrimSpace(l)) -} diff --git a/pkg/scanner/parse.go b/pkg/scanner/parse.go deleted file mode 100644 index a945a74f..00000000 --- a/pkg/scanner/parse.go +++ /dev/null @@ -1,22 +0,0 @@ -package scanner - -import ( - "fmt" - "strconv" -) - -func ParseFloat64(s string) float64 { - f, err := strconv.ParseFloat(s, 64) - if err != nil { - panic(fmt.Sprintf("not a float64: %v", s)) - } - return f -} - -func ParseInt(s string) int { - i, err := strconv.ParseInt(s, 0, 64) - if err != nil { - panic(fmt.Sprintf("not an int: %v", s)) - } - return int(i) -} diff --git a/pkg/scanner/pos.go b/pkg/scanner/pos.go deleted file mode 100644 index b7552a9f..00000000 --- a/pkg/scanner/pos.go +++ /dev/null @@ -1,24 +0,0 @@ -package scanner - -import "fmt" - -type Pos struct { - Name string - Line int - Column int -} - -func NewPos(file string, line int, column int) Pos { - return Pos{file, line, column} -} - -func (p Pos) IsValid() bool { - return p.Line > 0 -} - -func (p Pos) String() string { - if p.Name != "" { - return fmt.Sprintf("%v:%v:%v", p.Name, p.Line, p.Column) - } - return fmt.Sprintf("%v:%v", p.Line, p.Column) -} diff --git a/pkg/scanner/reader.go b/pkg/scanner/reader.go deleted file mode 100644 index b92d6699..00000000 --- a/pkg/scanner/reader.go +++ /dev/null @@ -1,72 +0,0 @@ -package scanner - -import ( - "bufio" - "fmt" - "io" - "strings" -) - -type Reader struct { - src *bufio.Reader - ch []rune - pos int - err error -} - -func NewReader(src io.Reader, n int) *Reader { - r := &Reader{ - src: bufio.NewReader(src), - ch: make([]rune, n+1), - } - for i := 0; i < n+1; i++ { - r.Read() - } - return r -} - -func NewStringReader(src string, n int) *Reader { - return NewReader(strings.NewReader(src), n) -} - -func (r *Reader) Read() rune { - if r.ch[r.pos] == EndCh { - return EndCh - } - - ch := r.ch[r.pos] - la, _, err := r.src.ReadRune() - if err != nil { - r.err = err - la = EndCh - } - r.ch[r.pos] = la - r.pos++ - if r.pos >= len(r.ch) { - r.pos = 0 - } - return ch -} - -func (r *Reader) Peek(i int) rune { - if i > len(r.ch) { - panic(fmt.Sprintf("peek of %v exceeds lookahead of %v", i, len(r.ch)-1)) - } - offset := r.pos + i - if offset >= len(r.ch) { - offset = offset - len(r.ch) - } - return r.ch[offset] -} - -func (r *Reader) PeekN(n int) string { - var s []rune - for i := 1; i <= n; i++ { - ch := r.Peek(i) - if ch == EndCh { - break - } - s = append(s, ch) - } - return string(s) -} diff --git a/pkg/scanner/reader_test.go b/pkg/scanner/reader_test.go deleted file mode 100644 index d989cc87..00000000 --- a/pkg/scanner/reader_test.go +++ /dev/null @@ -1,60 +0,0 @@ -package scanner - -import ( - "strconv" - "testing" -) - -func TestReaderN(t *testing.T) { - for i := 0; i <= 3; i++ { - t.Run(strconv.Itoa(i), func(t *testing.T) { - testReaderN(t, i) - }) - } -} - -func testReaderN(t *testing.T, n int) { - out := make([]rune, 3) - want := "abc" - r := NewStringReader(want, n) - out[0] = r.Read() - out[1] = r.Read() - out[2] = r.Read() - have := string(out) - if have != want { - t.Errorf("\n have: %v \n want: %v", have, want) - } - if r.Read() != EndCh { - t.Errorf("expected end") - } -} - -func TestLA(t *testing.T) { - r := NewStringReader("1234", 3) - want := "23" - have := r.PeekN(2) - if have != want { - t.Errorf("\n have: %v \n want: %v", have, want) - } - - r.Read() - want = "34" - have = r.PeekN(2) - if have != want { - t.Errorf("\n have: %v \n want: %v", have, want) - } - - r.Read() - want = "4" - have = r.PeekN(2) - if have != want { - t.Errorf("\n have: %v \n want: %v", have, want) - } - - r.Read() - want = "" - have = r.PeekN(2) - if have != want { - t.Errorf("\n have: %v \n want: %v", have, want) - } -} diff --git a/pkg/scanner/scanner.go b/pkg/scanner/scanner.go deleted file mode 100644 index bf533119..00000000 --- a/pkg/scanner/scanner.go +++ /dev/null @@ -1,169 +0,0 @@ -package scanner - -import ( - "bufio" - "bytes" - "fmt" - "io" - "strings" -) - -const EndCh = rune(-1) - -type Scanner struct { - Error error - Ch rune - Lookahead rune - Text strings.Builder - TokenPos Pos - ChPos Pos - Debug bool - TrimText bool - src *bufio.Reader -} - -func New(src io.Reader) *Scanner { - s := &Scanner{} - s.SetReader(src) - return s -} - -func NewString(src string) *Scanner { - s := &Scanner{} - s.SetString(src) - return s -} - -func NewBytes(src []byte) *Scanner { - s := &Scanner{} - s.SetBytes(src) - return s -} - -func (s *Scanner) SetReader(src io.Reader) { - s.src = bufio.NewReader(src) - s.init() -} - -func (s *Scanner) SetString(src string) { - s.SetReader(strings.NewReader(src)) -} - -func (s *Scanner) SetBytes(src []byte) { - s.SetReader(bytes.NewReader(src)) -} - -func (s *Scanner) SetName(name string) { - s.ChPos.Name = name -} - -func (s *Scanner) init() { - s.Error = nil - s.Ch, s.Lookahead = 0, 0 - s.Text.Reset() - s.Next() - s.Next() - s.ChPos.Line = 1 - s.ChPos.Column = 1 -} - -func (s *Scanner) Scan(fn Func) string { - s.Start() - fn(s) - text := s.Text.String() - if s.TrimText { - text = strings.TrimSpace(text) - } - return text -} - -func (s *Scanner) ScanUntil(c RuneClass) string { - return s.Scan(UntilFunc(c)) -} - -func (s *Scanner) ScanWhile(c RuneClass) string { - return s.Scan(WhileFunc(c)) -} - -func (s *Scanner) Next() { - if s.Ch == EndCh || s.src == nil { - if s.Debug { - fmt.Println("scan: end") - } - return - } - - s.Ch = s.Lookahead - if s.Debug { - fmt.Printf("scan: %v(%c)\n", s.Ch, s.Ch) - } - - r, _, err := s.src.ReadRune() - if err != nil { - s.Lookahead = EndCh - if err != io.EOF { - s.Error = err - } - } else { - s.Lookahead = r - } - - if s.Ch == '\n' { - s.ChPos.Line++ - s.ChPos.Column = 0 - } else { - s.ChPos.Column++ - } -} - -func (s *Scanner) Start() { - s.Error = nil - s.TokenPos = s.ChPos - s.Text.Reset() -} - -func (s *Scanner) Token() string { - tok := s.Text.String() - s.Text.Reset() - return tok -} - -func (s *Scanner) TrimToken() string { - return strings.TrimSpace(s.Token()) -} - -func (s *Scanner) Keep() { - s.Text.WriteRune(s.Ch) - s.Next() -} - -func (s *Scanner) SkipIf(c RuneClass) { - if c(s.Ch) { - s.Next() - } else { - s.Keep() - } -} - -func (s *Scanner) KeepIf(c RuneClass) { - if c(s.Ch) { - s.Keep() - } else { - s.Next() - } -} - -func (s *Scanner) End() bool { - return s.src == nil || s.Ch == EndCh -} - -func (s *Scanner) Ok() bool { - return !s.End() && s.Error == nil -} - -func (s *Scanner) setErr(err error) { - s.Ch = EndCh - if err != io.EOF { - s.Error = err - } -} diff --git a/pkg/scanner/scanner_test.go b/pkg/scanner/scanner_test.go deleted file mode 100644 index 8322e013..00000000 --- a/pkg/scanner/scanner_test.go +++ /dev/null @@ -1,147 +0,0 @@ -package scanner - -import ( - "fmt" - "testing" - "unicode" -) - -func TestScanners(t *testing.T) { - tests := []struct { - fn Func - data string - tok string - rest string - }{ - {Bin, "010123", "0101", "23"}, - {Dec, "12.345 678", "12.345", " 678"}, - {Dec, "-12.345 678", "-12.345", " 678"}, - {Dec, "-12.34-5 678", "-12.34", "-5 678"}, - {Dec, "-12.34.5 678", "-12.34", ".5 678"}, - {Dec, "-123.45e10 abc", "-123.45", "e10 abc"}, - {Float, "-123.45e10 abc", "-123.45e10", " abc"}, - {Float, "-123.45E-10 abc", "-123.45E-10", " abc"}, - {Hex, "cdefghi", "cdef", "ghi"}, - {Int, "1234 567", "1234", " 567"}, - {Int, "-1234 567", "-1234", " 567"}, - {Int, "0x1234 567", "0", "x1234 567"}, - {Line, "123\n456", "123", "456"}, - {Oct, "56789", "567", "89"}, - {Remaining, "123 456", "123 456", ""}, - {String, "'abcd'ef", "abcd", "ef"}, - {String, "'ab\\'cd'ef", "ab'cd", "ef"}, - {UDec, "12.345 678", "12.345", " 678"}, - {UDec, "-12.345 678", "", "-12.345 678"}, - {UInt, "1234 567", "1234", " 567"}, - {UInt, "-1234 567", "", "-1234 567"}, - {Whitespace, " 1234", " ", "1234"}, - {Word, "foo bar", "foo", " bar"}, - - {QuotedFunc(QuotedDef{ - Escape: Rune('\\'), - AltEnd: Rune('!'), - }), "'foo! bar", "foo", " bar"}, - - {UntilRepeatsFunc(Rune('-'), 3), - "a-b--cd---ef", "a-b--cd", "ef"}, - } - - var s Scanner - for i, test := range tests { - t.Run(fmt.Sprintf("[%v] %v", i, test.data), func(t *testing.T) { - s.SetString(test.data) - tok := s.Scan(test.fn) - - if tok != test.tok { - t.Errorf("\n have: %v \n want: %v", tok, test.tok) - } - rest := s.Scan(Remaining) - if rest != test.rest { - t.Errorf("\n have: %v \n want: %v", rest, test.rest) - } - }) - } -} - -func TestThisPos(t *testing.T) { - data := "123 567 9\n12 456" - wants := []Pos{ - NewPos("", 1, 5), - NewPos("", 1, 9), - NewPos("", 2, 1), - NewPos("", 2, 4), - NewPos("", 2, 7), - } - s := NewString(data) - for _, want := range wants { - s.Scan(Word) - s.ScanWhile(unicode.IsSpace) - if s.ChPos != want { - t.Errorf("\n have: %v \n want: %v", s.ChPos, want) - } - } -} - -func TestTokenPos(t *testing.T) { - data := "123 567 9\n12 456" - wants := []Pos{ - NewPos("", 1, 1), - NewPos("", 1, 5), - NewPos("", 1, 9), - NewPos("", 2, 1), - NewPos("", 2, 4), - } - s := NewString(data) - for _, want := range wants { - s.Scan(Word) - if s.TokenPos != want { - t.Errorf("\n have: %v \n want: %v", s.TokenPos, want) - } - s.ScanWhile(unicode.IsSpace) - } -} - -func TestManual(t *testing.T) { - s := NewString("1234") - s.Start() - s.Keep() - s.Keep() - want := "12" - have := s.Token() - if have != want { - t.Errorf("\n have: %v \n want: %v", have, want) - } - - s.Start() - s.Keep() - s.Keep() - want = "34" - have = s.Token() - if have != want { - t.Errorf("\n have: %v \n want: %v", have, want) - } -} - -func TestEscapeMap(t *testing.T) { - escapeMap := map[rune]rune{ - 'a': '!', - } - quoteDef := QuotedDef{ - Escape: Rune('\\'), - EscapeMap: escapeMap, - } - s := NewString("'ab\\a'") - have := s.Scan(QuotedFunc(quoteDef)) - want := "ab!" - if have != want { - t.Errorf("\n have: %v \n want: %v", have, want) - } -} - -func TestNotTerminated(t *testing.T) { - s := NewString("'abcd") - s.Scan(String) - if s.Error != ErrNotTerminated { - t.Errorf("\n have: %v \n want: %v", s.Error, ErrNotTerminated) - } -} diff --git a/pkg/types/duration.go b/pkg/types/duration.go index 5ac116c6..feeeae31 100644 --- a/pkg/types/duration.go +++ b/pkg/types/duration.go @@ -3,17 +3,20 @@ package types import ( "strings" "time" - "unicode" - "github.com/blackchip-org/zc/v5/pkg/scanner" + "github.com/blackchip-org/scan" ) func ParseDuration(str string) (time.Duration, bool) { - s := scanner.NewString(str) - for s.Ok() { - s.SkipIf(unicode.IsSpace) + s := scan.NewScannerFromString("", str) + for s.HasMore() { + if s.Is(scan.Whitespace) { + s.Skip() + } else { + s.Keep() + } } - d, err := time.ParseDuration(s.Token()) + d, err := time.ParseDuration(s.Emit().Val) if err != nil { return time.Duration(0), false } @@ -21,19 +24,19 @@ func ParseDuration(str string) (time.Duration, bool) { } func FormatDuration(d time.Duration) string { - s := scanner.NewString(d.String()) + s := scan.NewScannerFromString("", d.String()) var hrs, min, sec string - for s.Ok() { - switch s.Ch { + for s.HasMore() { + switch s.This { case 'h': - hrs = s.TrimToken() - s.Next() + hrs = strings.TrimSpace(s.Emit().Val) + s.Discard() case 'm': - min = s.TrimToken() - s.Next() + min = strings.TrimSpace(s.Emit().Val) + s.Discard() case 's': - sec = s.TrimToken() - s.Next() + sec = strings.TrimSpace(s.Emit().Val) + s.Discard() default: s.Keep() } diff --git a/pkg/zc/real.go b/pkg/zc/real.go index cfbaa68c..350cdacb 100644 --- a/pkg/zc/real.go +++ b/pkg/zc/real.go @@ -8,7 +8,7 @@ import ( "strconv" "strings" - "github.com/blackchip-org/zc/v5/pkg/scanner" + "github.com/blackchip-org/scan" "github.com/blackchip-org/zc/v5/pkg/types" ) @@ -142,16 +142,17 @@ func (t RationalType) Parse(s string) (*big.Rat, bool) { return new(big.Rat).SetFloat64(f), true } - sc := scanner.NewString(s) + sc := scan.NewScannerFromString("", s) var w, n, d int64 - s1 := sc.Scan(scanner.Int) + scan.SignedInt.Eval(sc) + s1 := sc.Emit().Val i1, err := strconv.ParseInt(s1, 10, 64) if err != nil { return nil, false } - switch sc.Ch { + switch sc.This { case '_', '-', ' ': w = i1 case '/': @@ -159,20 +160,22 @@ func (t RationalType) Parse(s string) (*big.Rat, bool) { default: return nil, false } - sc.Next() + sc.Skip() - s2 := sc.Scan(scanner.UInt) + scan.Int.Eval(sc) + s2 := sc.Emit().Val i2, err := strconv.ParseInt(s2, 10, 64) if err != nil { return nil, false } if w != 0 { n = i2 - if sc.Ch != '/' { + if sc.This != '/' { return nil, false } - sc.Next() - s3 := sc.Scan(scanner.UInt) + sc.Skip() + scan.Int.Eval(sc) + s3 := sc.Emit().Val i3, err := strconv.ParseInt(s3, 10, 64) if err != nil { return nil, false From def98438c00f64c73b9d428b364d99c00d007d31 Mon Sep 17 00:00:00 2001 From: Mike McGann Date: Tue, 6 Feb 2024 13:35:46 -0500 Subject: [PATCH 13/14] scan refactoring --- pkg/doc/doc.go | 6 ++---- pkg/ops/rand.go | 8 ++++---- pkg/ops/text.go | 6 +++--- pkg/repl/commands.go | 12 +++++------- pkg/repl/repl.go | 2 +- pkg/repl/test.go | 4 ++-- pkg/types/duration.go | 2 +- pkg/zc/real.go | 6 +++--- pkg/zc/util.go | 2 +- test/ops_test.go | 3 +-- 10 files changed, 23 insertions(+), 28 deletions(-) diff --git a/pkg/doc/doc.go b/pkg/doc/doc.go index 4e1341ff..0d5113db 100644 --- a/pkg/doc/doc.go +++ b/pkg/doc/doc.go @@ -92,12 +92,10 @@ func ParseSourceFile(name string) ([]*Op, error) { } ops = append(ops, op) } else { - scan.Until(s, scan.Rune('\n'), s.Discard) - s.Discard() + scan.Line(s) } } else { - scan.Until(s, scan.Rune('\n'), s.Discard) - s.Discard() + scan.Line(s) } } if len(s.Errs) > 0 { diff --git a/pkg/ops/rand.go b/pkg/ops/rand.go index 5d2208ba..4889c22a 100644 --- a/pkg/ops/rand.go +++ b/pkg/ops/rand.go @@ -162,10 +162,10 @@ func Roll(c zc.Calc) { var num, sides int64 var err error - if !scan.Int.Eval(&s) { + tok, ok := s.Eval(scan.IntRule) + if !ok { num = 1 } else { - tok := s.Emit() num, err = strconv.ParseInt(tok.Val, 10, 64) if err != nil { zc.ErrInvalidArgs(c, "dice count") @@ -179,11 +179,11 @@ func Roll(c zc.Calc) { } s.Discard() - if !scan.Int.Eval(&s) { + tok, ok = s.Eval(scan.IntRule) + if !ok { zc.ErrInvalidArgs(c, "sides") return } - tok := s.Emit() sides, err = strconv.ParseInt(tok.Val, 10, 64) if err != nil { zc.ErrInvalidArgs(c, "sides") diff --git a/pkg/ops/text.go b/pkg/ops/text.go index 306db41d..7dd00360 100644 --- a/pkg/ops/text.go +++ b/pkg/ops/text.go @@ -294,9 +294,9 @@ func Unescape(c zc.Calc) { scan.HorizontalTabEnc, scan.VerticalTabEnc, ), - scan.Hex2Enc.AsByte(true), - scan.Hex4Enc, - scan.Hex8Enc, + scan.Hex2EncRule.AsByte(true), + scan.Hex4EncRule, + scan.Hex8EncRule, scan.OctEnc) for s.HasMore() { if s.This == '\\' { diff --git a/pkg/repl/commands.go b/pkg/repl/commands.go index a04cde50..87cf571a 100644 --- a/pkg/repl/commands.go +++ b/pkg/repl/commands.go @@ -25,7 +25,7 @@ func init() { } func def(r *REPL, s *scan.Scanner) error { - scan.While(s, scan.Whitespace, s.Discard) + scan.Space(s) if !s.HasMore() { return fmt.Errorf("expected macro name") } @@ -38,9 +38,8 @@ func def(r *REPL, s *scan.Scanner) error { return fmt.Errorf("invalid name") } - scan.While(s, scan.Whitespace, s.Discard) - scan.While(s, scan.Any, s.Keep) - expr := s.Emit().Val + scan.Space(s) + expr := scan.All(s) if expr == "" { if _, exists := r.macros[name]; !exists { @@ -82,12 +81,11 @@ func quit(_ *REPL, _ *scan.Scanner) error { } func quote(r *REPL, s *scan.Scanner) error { - scan.While(s, scan.Whitespace, s.Discard) + scan.Space(s) if !s.HasMore() { return fmt.Errorf("expected text to be used as a delimiter") } - scan.While(s, scan.Any, s.Keep) - r.quoteEnd = strings.TrimSpace(s.Emit().Val) + r.quoteEnd = strings.TrimSpace(scan.All(s)) return nil } diff --git a/pkg/repl/repl.go b/pkg/repl/repl.go index 1ff7dd70..dba2b33b 100644 --- a/pkg/repl/repl.go +++ b/pkg/repl/repl.go @@ -102,7 +102,7 @@ func (r *REPL) evalLine(line string) error { } else { out = append(out, word) } - scan.While(&s, scan.Whitespace, s.Discard) + scan.Space(&s) } outLine := strings.Join(out, " ") return r.Calc.Eval(outLine) diff --git a/pkg/repl/test.go b/pkg/repl/test.go index 3fb1dd8e..7e55dd99 100644 --- a/pkg/repl/test.go +++ b/pkg/repl/test.go @@ -26,8 +26,8 @@ func Test(r *REPL, test string) bool { } s.Keep() } - scan.Until(&s, scan.Rune('\n'), s.Keep) - output := strings.TrimSpace(s.Emit().Val) + + output := strings.TrimSpace(scan.Line(&s)) r.Eval(input) err := r.Error() if errorTest { diff --git a/pkg/types/duration.go b/pkg/types/duration.go index feeeae31..1942b358 100644 --- a/pkg/types/duration.go +++ b/pkg/types/duration.go @@ -10,7 +10,7 @@ import ( func ParseDuration(str string) (time.Duration, bool) { s := scan.NewScannerFromString("", str) for s.HasMore() { - if s.Is(scan.Whitespace) { + if scan.IsSpace(s.This) { s.Skip() } else { s.Keep() diff --git a/pkg/zc/real.go b/pkg/zc/real.go index 350cdacb..7e3c1ee3 100644 --- a/pkg/zc/real.go +++ b/pkg/zc/real.go @@ -146,7 +146,7 @@ func (t RationalType) Parse(s string) (*big.Rat, bool) { var w, n, d int64 - scan.SignedInt.Eval(sc) + scan.SignedIntRule.Eval(sc) s1 := sc.Emit().Val i1, err := strconv.ParseInt(s1, 10, 64) if err != nil { @@ -162,7 +162,7 @@ func (t RationalType) Parse(s string) (*big.Rat, bool) { } sc.Skip() - scan.Int.Eval(sc) + scan.IntRule.Eval(sc) s2 := sc.Emit().Val i2, err := strconv.ParseInt(s2, 10, 64) if err != nil { @@ -174,7 +174,7 @@ func (t RationalType) Parse(s string) (*big.Rat, bool) { return nil, false } sc.Skip() - scan.Int.Eval(sc) + scan.IntRule.Eval(sc) s3 := sc.Emit().Val i3, err := strconv.ParseInt(s3, 10, 64) if err != nil { diff --git a/pkg/zc/util.go b/pkg/zc/util.go index ba7f7eb0..2d75eab1 100644 --- a/pkg/zc/util.go +++ b/pkg/zc/util.go @@ -73,7 +73,7 @@ func Quote(v string) string { if !IsValuePrefix(s.This, s.Next) { needsQuotes = true } else { - scan.Until(&s, scan.Whitespace, s.Discard) + scan.Until(&s, scan.IsSpace, s.Discard) if s.HasMore() { needsQuotes = true } diff --git a/test/ops_test.go b/test/ops_test.go index 95c46cc9..e541994b 100644 --- a/test/ops_test.go +++ b/test/ops_test.go @@ -54,8 +54,7 @@ func testFile(t *testing.T, file string) { if s.This == '#' && s.Next == '#' { s.Discard() s.Discard() - scan.Until(s, scan.Rune('\n'), s.Keep) - blockName = strings.TrimSpace(s.Emit().Val) + blockName = strings.TrimSpace(scan.Line(s)) s.Discard() } else { scan.While(s, scan.Rune(' '), s.Keep) From 68e27ef18ee5ea490a2131b75e6d691f3bc9ce1e Mon Sep 17 00:00:00 2001 From: Mike McGann Date: Wed, 7 Feb 2024 07:48:02 -0500 Subject: [PATCH 14/14] fix command history --- web/zc.js | 1 + 1 file changed, 1 insertion(+) diff --git a/web/zc.js b/web/zc.js index 19eac890..0cd71a00 100644 --- a/web/zc.js +++ b/web/zc.js @@ -6,6 +6,7 @@ var showCandidates = false function submit() { let line = document.querySelector("#input").value let result = '' + histPos = -1 if (line.trim() === "") { if (zcStackLen() === 0) { stackHist = []