From 1cf9249d50b26e8cbd54bfc5968186a08a025b54 Mon Sep 17 00:00:00 2001 From: Stephen Tung Date: Mon, 28 Apr 2025 20:59:12 +0800 Subject: [PATCH 1/9] Fixed next page link from the use case introduction --- .../use-cases/mix-and-match-database/introduction.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/getting-started/use-cases/mix-and-match-database/introduction.md b/docs/getting-started/use-cases/mix-and-match-database/introduction.md index 67f9ce844..fbfe70c3e 100644 --- a/docs/getting-started/use-cases/mix-and-match-database/introduction.md +++ b/docs/getting-started/use-cases/mix-and-match-database/introduction.md @@ -1,5 +1,6 @@ --- title: Introduction +next: ./tutorial-intro.md --- ![](./images/use-the-right-database-for-the-job.png) From ceccf364b13df3e09d49032bd5bbb3d0312a471b Mon Sep 17 00:00:00 2001 From: Stephen Tung Date: Mon, 28 Apr 2025 21:00:59 +0800 Subject: [PATCH 2/9] Fixed couple of wording problems with the writeup --- .../use-cases/mix-and-match-database/introduction.md | 2 +- .../use-cases/mix-and-match-database/tutorial-1.md | 2 +- .../use-cases/mix-and-match-database/tutorial-2.md | 4 ++-- .../use-cases/mix-and-match-database/tutorial-4.md | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/getting-started/use-cases/mix-and-match-database/introduction.md b/docs/getting-started/use-cases/mix-and-match-database/introduction.md index fbfe70c3e..99ffd3c4a 100644 --- a/docs/getting-started/use-cases/mix-and-match-database/introduction.md +++ b/docs/getting-started/use-cases/mix-and-match-database/introduction.md @@ -48,7 +48,7 @@ KurrentDB captures all changes (events) immutably within your system, which can ### Benefits include: - **Reliable and Simple Synchronization**: - - Events stored immutably in sequential order prevent typical synchronization issues like message loss or duplication. + - Events stored immutably in sequential order help detect and deal with typical synchronization issues like message loss or duplication. - **Real-time Updates**: - KurrentDB allows real-time event stream subscriptions, enabling instant updates across data stores like Redis and MongoDB. diff --git a/docs/getting-started/use-cases/mix-and-match-database/tutorial-1.md b/docs/getting-started/use-cases/mix-and-match-database/tutorial-1.md index 909a5f07a..99bbbb62c 100644 --- a/docs/getting-started/use-cases/mix-and-match-database/tutorial-1.md +++ b/docs/getting-started/use-cases/mix-and-match-database/tutorial-1.md @@ -12,7 +12,7 @@ In this part, you will start a GitHub Codespaces session in your browser. You will then initialize KurrentDB by appending sample events that mimic an e-commerce application. The events are appended using a data generator program. -## Step 1: Set up Your Codespaces +## Step 1: Setup Your Codespaces 1. Click the button below to initiate Codespaces and ensure following values are selected: diff --git a/docs/getting-started/use-cases/mix-and-match-database/tutorial-2.md b/docs/getting-started/use-cases/mix-and-match-database/tutorial-2.md index 755590dd5..9f351c092 100644 --- a/docs/getting-started/use-cases/mix-and-match-database/tutorial-2.md +++ b/docs/getting-started/use-cases/mix-and-match-database/tutorial-2.md @@ -89,7 +89,7 @@ In this step, you will review the records in the `carts` and `cart_items` tables You will see a few items in each cart. ::: tip - If you're stuck with the output and can't exit, press `q` to exit. You're likely paging mode because the output has overflowed. + If you're stuck with the output and can't exit, press `q` to exit. You're likely in paging mode because the output has overflowed. ::: ::: info Quick Quiz @@ -135,7 +135,7 @@ You will examine how this pattern is applied to the Postgres projection applicat : FromStream.Start; // otherwise, subscribe from the start of the stream ``` - A `SELECT` is statement used retrieve the checkpoint. If no checkpoint is found or it is the first time the application is executed, we can retrieve the default start position: + A `SELECT` is statement used retrieve the checkpoint. If no checkpoint is found or it is the first time the application is executed, we can retrieve the default start position. ::: info Understanding Checkpoint A projection often uses a checkpoint to recover the position of the last processed event. This way, when an application unexpectedly crashes mid-process, the projection does not have to process all the previously processed events. diff --git a/docs/getting-started/use-cases/mix-and-match-database/tutorial-4.md b/docs/getting-started/use-cases/mix-and-match-database/tutorial-4.md index e61f54a8b..394b234ed 100644 --- a/docs/getting-started/use-cases/mix-and-match-database/tutorial-4.md +++ b/docs/getting-started/use-cases/mix-and-match-database/tutorial-4.md @@ -87,7 +87,7 @@ Are the contents of the Top 10 Products (Redis) table and the Carts Table (Postg 1. Run the following command in the terminal to open the main program for the Postgres projection application: ```sql - code ./PostgresProjection/program.cs + code ./PostgresProjection/Program.cs ``` 2. Locate and examine the code that subscribes to stream From 242b7ad8913235418b42e26be9bd9cb091a7254b Mon Sep 17 00:00:00 2001 From: Stephen Tung Date: Mon, 28 Apr 2025 21:01:49 +0800 Subject: [PATCH 3/9] Moved $ce-cart section to part 1 --- .../use-cases/mix-and-match-database/tutorial-1.md | 9 +++++++-- .../use-cases/mix-and-match-database/tutorial-2.md | 4 ---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/docs/getting-started/use-cases/mix-and-match-database/tutorial-1.md b/docs/getting-started/use-cases/mix-and-match-database/tutorial-1.md index 99bbbb62c..692155b13 100644 --- a/docs/getting-started/use-cases/mix-and-match-database/tutorial-1.md +++ b/docs/getting-started/use-cases/mix-and-match-database/tutorial-1.md @@ -68,9 +68,14 @@ For this quickstart, you can safely ignore and close any Codespaces notification 1. Click the `Stream Browser` link from the top navigation bar. -1. Under `Recently Changed Streams`, click the `$ce-cart` link. +2. Under `Recently Changed Streams`, click the `$ce-cart` link. -2. You should see an ordered list of the appended events associated with two distinct, virtual shopping carts. + ::: info Understanding Category System Projection + The `$ce-cart` stream contains events from all the carts in KurrentDB. This uses the category system projection stream feature. For more information, [click here](https://docs.kurrent.io/server/v24.10/features/projections/system.html#by-category). + ::: + + +3. You should see an ordered list of the appended events associated with two distinct, virtual shopping carts. ::: info Introducing shopping cart events In KurrentDB, events for each shopping cart are appended to a stream like `cart-2fbe05d1dcf043d782ea24923298ae3a`, where `2fbeone05d1dcf043d782ea24923298ae3a` is the cart's unique ID. diff --git a/docs/getting-started/use-cases/mix-and-match-database/tutorial-2.md b/docs/getting-started/use-cases/mix-and-match-database/tutorial-2.md index 9f351c092..2ba1ad685 100644 --- a/docs/getting-started/use-cases/mix-and-match-database/tutorial-2.md +++ b/docs/getting-started/use-cases/mix-and-match-database/tutorial-2.md @@ -175,10 +175,6 @@ You will examine how this pattern is applied to the Postgres projection applicat For more information about connectors, [click here](https://docs.kurrent.io/server/v24.10/features/connectors/) ::: - ::: info Understanding Category System Projection - The `$ce-cart` stream contains events from all the carts in KurrentDB. This uses the category system projection stream feature. For more information, [click here](https://docs.kurrent.io/server/v24.10/features/projections/system.html#by-category). - ::: - 4. Locate and examine the code that processes each event: ```cs From a5ce1ea7634375757aab198111ae5731eb1b198d Mon Sep 17 00:00:00 2001 From: Stephen Tung Date: Mon, 28 Apr 2025 21:02:08 +0800 Subject: [PATCH 4/9] Fixed quick quiz --- .../use-cases/mix-and-match-database/tutorial-1.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/getting-started/use-cases/mix-and-match-database/tutorial-1.md b/docs/getting-started/use-cases/mix-and-match-database/tutorial-1.md index 692155b13..8725cc564 100644 --- a/docs/getting-started/use-cases/mix-and-match-database/tutorial-1.md +++ b/docs/getting-started/use-cases/mix-and-match-database/tutorial-1.md @@ -95,6 +95,6 @@ For this quickstart, you can safely ignore and close any Codespaces notification ::: info Quick Quiz - What were the quantities of each product in the shopping carts before they were abandoned? + What were the quantities of each product in the shopping carts? ::: From e3f92597acc36f63954eaf8d5a883eb6d6b020b4 Mon Sep 17 00:00:00 2001 From: Stephen Tung Date: Mon, 28 Apr 2025 21:02:22 +0800 Subject: [PATCH 5/9] Added links from the use case tutorial introduction --- .../mix-and-match-database/tutorial-intro.md | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/docs/getting-started/use-cases/mix-and-match-database/tutorial-intro.md b/docs/getting-started/use-cases/mix-and-match-database/tutorial-intro.md index df5493dc1..782643abf 100644 --- a/docs/getting-started/use-cases/mix-and-match-database/tutorial-intro.md +++ b/docs/getting-started/use-cases/mix-and-match-database/tutorial-intro.md @@ -26,19 +26,19 @@ Before starting, ensure you have the following: This tutorial consists of the following steps: -### Part 1: Setup and Initialize KurrentDB -1. **Setup your Codespaces**: Starts up an interactive coding environment in your browser where all tools and database are installed -2. **Start and Initialize KurrentDB with Sample Events**: Start up KurrentDB and initialize it with sample events -3. **Browse the Sample Events in KurrentDB's Admin UI**: Access the Admin UI to browse the appended events -### Part 2: Project KurrentDB Events to Postgres -4. **Execute Projection Applications**: Starts up the projection sample applications that transform KurrentDB events into read models in Postgres and Redis -5. **Review the Projected Read Models in Postgres**: Run the PostgreSQL command line tool to review the newly inserted records -6. **Examine the Postgres Projection Application Codebase**: Examine the PostgreSQL projection application codebase to see how events are transformed to read models in the tables -### Part 3: Project KurrentDB Events to Redis -7. **Review the Projected Read Models in Redis**: Run the Redis command line tool to review the newly added entries -8. **Examine the Redis Projection Application Codebase**: Examine the Redis projection application codebase to see how events are transformed into read models in Redis -### Part 4: Project KurrentDB Events in Real-Time -9. **Browse the Demo Web Page**: Navigate to the Demo Web Page to see a sample of how the read models in Postgres and Redis are used -10. **Start the Live Data Generator**: Start a live data generator program that continuously appends events into KurrentDB -11. **Watch the Read Models Update in Real-Time**: See how the read models are updated in real-time in the Demo Web Page -12. **Review Codebase**: Understand how the code projects events to the read models in real-time +### [Part 1: Setup and Initialize KurrentDB](./tutorial-1.md) +1. **[Setup your Codespaces](http://localhost:8080/getting-started/use-cases/mix-and-match-database/tutorial-1.html#step-1-setup-your-codespaces)**: Starts up an interactive coding environment in your browser where all tools and database are installed +2. **[Start and Initialize KurrentDB with Sample Events](http://localhost:8080/getting-started/use-cases/mix-and-match-database/tutorial-1.html#step-2-start-and-initialize-kurrentdb-with-sample-events)**: Start up KurrentDB and initialize it with sample events +3. **[Browse the Sample Events in KurrentDB's Admin UI](http://localhost:8080/getting-started/use-cases/mix-and-match-database/tutorial-1.html#step-3-browse-sample-events-in-kurrentdb-s-admin-ui)**: Access the Admin UI to browse the appended events +### [Part 2: Project KurrentDB Events to Postgres](./tutorial-2.md) +4. **[Execute Projection Applications](http://localhost:8080/getting-started/use-cases/mix-and-match-database/tutorial-2.html#step-4-execute-projection-application)**: Starts up the projection sample applications that transform KurrentDB events into read models in Postgres and Redis +5. **[Review the Projected Read Models in Postgres](http://localhost:8080/getting-started/use-cases/mix-and-match-database/tutorial-2.html#step-5-review-the-projected-read-models-in-postgres)**: Run the PostgreSQL command line tool to review the newly inserted records +6. **[Examine the Postgres Projection Application Codebase](http://localhost:8080/getting-started/use-cases/mix-and-match-database/tutorial-2.html#step-6-examine-the-postgres-projection-application-codebase)**: Examine the PostgreSQL projection application codebase to see how events are transformed to read models in the tables +### [Part 3: Project KurrentDB Events to Redis](./tutorial-3.md) +7. **[Review the Projected Read Models in Redis](http://localhost:8080/getting-started/use-cases/mix-and-match-database/tutorial-3.html#step-7-review-the-projected-read-models-in-redis)**: Run the Redis command line tool to review the newly added entries +8. **[Examine the Redis Projection Application Codebase](http://localhost:8080/getting-started/use-cases/mix-and-match-database/tutorial-3.html#step-8-examine-the-redis-projection-application-codebase)**: Examine the Redis projection application codebase to see how events are transformed into read models in Redis +### [Part 4: Project KurrentDB Events in Real-Time](./tutorial-4.md) +9. **[Browse the Demo Web Page](http://localhost:8080/getting-started/use-cases/mix-and-match-database/tutorial-4.html#step-9-browse-the-demo-web-page)**: Navigate to the Demo Web Page to see a sample of how the read models in Postgres and Redis are used +10. **[Start the Live Data Generator](http://localhost:8080/getting-started/use-cases/mix-and-match-database/tutorial-4.html#step-10-start-the-live-data-generator)**: Start a live data generator program that continuously appends events into KurrentDB +11. **[Watch the Read Models Update in Real-Time](http://localhost:8080/getting-started/use-cases/mix-and-match-database/tutorial-4.html#step-11-watch-the-read-models-update-in-real-time)**: See how the read models are updated in real-time in the Demo Web Page +12. **[Understanding catch-up subscription and real-time processing](http://localhost:8080/getting-started/use-cases/mix-and-match-database/tutorial-4.html#step-12-understanding-catch-up-subscription-and-real-time-processing)**: Understand how the code projects events to the read models in real-time From bf9d1b1deecd6db3bfe56dd5ef12113ee64d84ff Mon Sep 17 00:00:00 2001 From: Stephen Tung Date: Mon, 28 Apr 2025 21:12:02 +0800 Subject: [PATCH 6/9] Added dark image for intro --- .../use-the-right-database-for-the-job-dark.png | Bin 0 -> 66034 bytes .../mix-and-match-database/introduction.md | 4 +++- 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 docs/getting-started/use-cases/mix-and-match-database/images/use-the-right-database-for-the-job-dark.png diff --git a/docs/getting-started/use-cases/mix-and-match-database/images/use-the-right-database-for-the-job-dark.png b/docs/getting-started/use-cases/mix-and-match-database/images/use-the-right-database-for-the-job-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..501912e61b5845cb236a6f8232dec53d9e25e685 GIT binary patch literal 66034 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�_XeY}?bk-?_C^~UT-r?L$%`$vn?HeSL30#g1TzJft{y2koOhsRzb z786y`{W}%eK%xtVUX-^IjAJz-tqa7~wW&ot42;WS*uaA&bk*O?gG#f(V{LMIdW@Jt zBJk18u{&hdetJYf#vnV#5Z5^@jYZgkLv6W@XZ0mDk$IrEcvg0Hl^l-twZkYuCE1Tz z3fXa_94)w;zFvZqOQhB9#5f;41ZfIT-+c&THqexGr9JE+EHg61+=d!5K4lv}IUID`WTU>aaPmrh`4V&6~$@PCEl_GJYH^WScj66w;)sXF_l-madF` zZ3rMOmlw6AEoB;g>~S@|5)%`1MJkYIF(W@i@;$#qFrECxZ+N}7gOyla9#3f=E@+E= zW=sgp(eag|A{V52aDFal5~%B1_^uls_-Wc5a$Oe7khbPDO4t5fkKw<8w20Fas4e9uOdK?^UkY^> zYpx|%bfv`^H;o@r-{i{H)3R(3`+A<@@z41X4lxW?iY{<3@=SQ?Zw)Ts^oreQsEE1; zeM*)ZqGQv_?RSgmi=L|%lDq{Eye?Z!)On~f0}?8{W&h)2s%jQP4K~g5NV0(>|Ebc; zf<)DRir2h2Ssr|$eqL!AqOyu`Li3JyH@G&5)+S4!Je9`GCjGqRKzhboH@k#@LcNYf zvz54UTxpJNISi*mJ(~9OFCesBk}q*K+g@$4rIr4UQz3ptBGRAtzp?OqIZr56R z^;6fe_g-A3wG>UNdDSs#*4q3vxdgZVEicX7_A6|DGtClN&Yc##ro;DW($1!=6zaY_ zR3WH(b$vGVXLqS^s-33}JkDo>-^3|$>bkeph*e)HwYIG)s=ejH(^UfRjRt{aee}#Z zlO2ud8d;A#ww;ch2R^w}hm}CLMbl**7;zG|XpiAQEJH_x{{@Zbuy(_%Q}oYCo{GQ8 z02s!FeYf+RSzU#>*=6cphU2hdWpkGeuU9cH6f60krvB_0B_DKbyB|o-L9jmOas%0N z% zUhpX`ugUwicppXl=fiaPPJ1wyRzdT}(k_cw_~Y6j9c>#HiXN3*u8;%P9h6K@~>A~n&KAkNbITzrf7xL2Jt{=myTcK|r@ zQoVezR$ap5;D*XYT*RIc(yIDUq!!BJBmy1L)Wv9oZg^&NY1ux)%tdG_Lx`uBU5y83 zmLTiIcclrwZHETTd-QsW|2>Hnta*N5;mS3j_K(rLgY{A);aajs2fOVd2S4Zr9=P@jVe_uJ zHb2<0aQ!$e?tH7X#6$c)ye33>3)ySICvyiyu86E)J9`hX4o8JkVZ3GT~1Apg0Lh*a@kIk|iJl^sx0|RM|WD^CwJI>j536n6S7! zkNmC&a)b`(^Il-MRX|)D(Y$s;#_n}mE;IcqPOXZ65&!>S&JZdokk|SMXTQrx7J?~2 zDV#~Ij-dgwqrr>68BF~J0E34>o(iW8d#g=Wp2Cc1iSThlkoWvd&$JLFD<&_bn%)oh z&!_;A#p5U-{UZwhtxqCQpIY@3%HrU5L(uhEUT(H>41IPwFdqNnh6q#M@EpGtgOmTl zs)BRiLHY%d5p27C$s(c$z&ASNWj9f7jFcVV zz&z;`UzhqK;!msz-R(B_@*jl%??Q4Thhr)^QJ69X^DUFwAZSv0sd4t7oE>lWG2Q$T5!{-P5ExiY?DT;F8rz=>shMDpD$=UQa+vg?H*Sr(gJQe;-xSTsbKnAs zOrJvvn-Usgq8PDX%tVG`NI@P2%znQP*`t3S%A2r6BK52W!PLRqCxL);!3mgD`x^qu zjj}6ulzXuSZGIb!|K8L~*s&+)d1G&)-MWl2uoXc%jeuRG$qM# zV5|AC5h~z9HEs%~x@*5RpK;Y=<@%p<^7~R(#Ni^Z+=%ed1RAXa(D9V9JNw)3|L-Z@Jb`cI z^@%3pxm~31_$Wh9<6#HxFGQ&5|Nc>i?U17E!~b)_gwP;VA1a;=xR0LaDiBKdBm?@% z@;T4$lX6)kRql>DD48jY{8rZgZblxGGj?+OVudNiFy1mMb^Y93HAS4mH)K*2;bQsI zpUZsypNl-_fQu}tpB~XbXMH2^p5G}0N-lyk`$Hx94bl~|+v>^}y8b-`@&_CxILkCf zeC#BsCY;{^0*)VRm>Y69SS~g>+*`k5p{Dk4Fze*r5`5ss*fZZX+(f&9lLkkK?{KYF zzQWcV6u_9upFh&I{*{cA#Kj^8i=`W`j)#rwrdn#jW$w_cq&LtK$+jHtMS<0|#ZL5} zN(Mpo5D%V$U9z(J~} zHt?o40}4w*)q*jM%+AnB#xY+1ZwFvl4u8tHFDteXESZS?2V}cEr-Pld7FkiUvq%zm zY$$t$krXMAC=##)-TGq4naIeDNymr#2A|(a{C5=H^eKbyxj2KtV-B%^zbFwZq;k~x zpV~(mirFC=uCbLGYaN9o7z!}YiGNOH`deS9gO$;eABW|^G4BOMUA*l?##=c6i!)`g1(A^uAgHK1{+X@~Hi{SN>Xl_ZX-{ims^{g)Z)?6DWbl=!a^{^%2G~DWxTj-AZN{96j0f_*U!*r{e0M{p;ZJEY z?6=%>XgqSa`MI@#OlS31zdB$0`Q7DVh{^db`Jual=Hy4(D-~0;wy%m)qMoATJ?ncnG7f_WgI-si^+CAw9`7{N z|98%OPy$I4ZgqE!`^PKtK)-v8$H>jX4i27J(!lW9X7$&EFIb$QyohjQ^Dz(u0w3>+Lj`Tc; z7t@r4I8S4#Y^{t8K_6v$kdPPf4vJsv61V{WGlA7G>vcQfF{l`Zr8PN_=h!{5H z<~aRERO|DGmSV@t;6LFibp3SIZZK6!GIu`59S>a6$x9^cW*S(xlp#^F>|Qnp-sc(C z9z|H~=Zf%NH7osWIyS)$7;H-I?yx&yG80zt2v* zCakny%55};j`kHUN21KeL8<2#y83=xBK`qN?~Cxa!5^L`ij>Aa{jY0z8zbgr*CUCf4IBQLn4xLi<@U3)C75`0 zC2R9Y0|4OmGmw=x%u}cM$k_FR@fr<2VlAr$*Qh{Qu<}f($=$Net1We&XF1kV|42}w z+I;n9Tz?9>d$h!r;t}iU-1RkB@+&p`v?(w*Xk{c6H1-z8p+@Dr<5+bbKlb`@5cv>d z6mQ~3SFW%txrXy;`E>c#d7?&Uh5zm`2Se)G52RyTVYfL5;&LWT&9#+B5pFuLaQ%XF z_%flH`O{Hfy~@KhWBc0Y0F~x{`0Vk$wUv(~nrL?X1@1qa`0sIESK>#YRUDoeMPLoX zp`5GCB1fSxk4q=FDIu}ON{_w`epIU#+0RI}gp?72Ux`0xzdsWm;Aq&6anKOTqup?k zLF01;(nn~sTvoDIme)Bur&!{JZpxUEHyg2l4rxdm{HGQKxR~ZjP{~uqWd6P)%2RxaLmG)P&WdtV~w-r_VhOS|1> z*lugc)mXERTaladElT?}9;IY>f-HWd!1Ts>v3~###}Sq=T0WazE5uB#D*TOaJy;I* zSx%v9;h+~mvhDY5eocbXF)j&xOc1yRlV)j)l8fy_+xCOFZRO5K_BMV{u1ZD=kEfgu zmN^!|PaVbA{LzUOXV!y7+h9HE;OtFzB2(iuJyMp(FD$?aycA>EX1+_UdI;c$gpb!H;0mTP@$5X-`23Hz9>4rb8_vm`-WQ?=Ef0xj_U>$N=`>3e)U3h^ zO@?~)ZS>Nl)y%+ z+9IRyGt5LcWt*O0x8I8YMjU+^>8>rw7)@K-ED!cT?Fk-~v2r|z2nhlaWwJS#wmiA) zys(;cCSYu+j?2;gJ#PV+*^JB$=J!k7B~N^M6r*y3=RKok#M)JA-td{%->J!T_17Z~ zG6mOoCQy{d?Ht;RMCKeXhD)Xz9;Dsc-L_wrer^Eusu!y7bCs)aI1WK;(6MuVMt|`-?}V|`IDteP0H7Cq_FK0r zn(~%FA&ss)wA#H+DG(;$i@hfLn*5%Hz<)AJuGkli`@~on&nz@$^6HcaTc9E6iPi1E zaYw}VmU<(2D#+*^zpe`>{j3N4A3K9iRa(8ZlI%%+WQuxeGi>ga&bVY3Q)y1=i<-h$ z|7N%u#Bl>VyK3x(ejv+{KOTd4m@MsV67RR;8nrljilAHSnl<5zJ?S=Qt&yvKh{%o%xv&Qbefh^4w4w#l`b+_6W<{~YRoD4H zu`J^XCiPA2$w!E*+}X>SfiWay(=%OSMUY7wZ4K8sElny)A~ce~p3y#Y_CWZqx`c&X zbPdFJ5% z%h8BXllDP;G;?gt8wO=lkylWZGk4p2Pc_9}+K!`6!AY{E3uX0SRaX@ZtJ)%uI| zY}Fr0)+WY9c)oUY2#Y8hInbn9ck!-K4rw5Po49n*p1TW9u+!w&t~4cr*|6BNfIk1mzHs z#7djzX6Pmz{LQpC$I&s^sKb*VzM%$@Kwn!y@?Tz~MEi>R!thYv3?_4G(X4>)h7UbT zk23RB_1yU}LpSXeNX$}$(LQ7Etj!Beh1^a1$(cIdc6zQ<^(H0_Nt4{n9J&a%^R%qkRVq&@)z2a9r<#$3ZwnX%6&)HJs0m_wbg!Qw z;t6G@t&aZcYPH`)C(w4j`~#u^^Q3rWHvNlEAxc%Wg3Nd|%~Xllzy+1X*dPHK1sgB} zyw>B8O`@~8>OqRq`%dsE-7fC2pgm^%3-FG2iXoFs@TmANsohW-<0~`iudez zc-YL`v#5a!rgqhA^Q&la`8+gWz~(sv))ZG3=mjwPQ-_h?pb2B?1X8*rjF?kd8db;U z#hO#Djs}9UsMPq^w)N>xj@g7i)u^4BwTFIq$)S;9nNGss?0pxx|DDXm1amZFCbL}l)M@J#NQG06H;_)Wh@Jia93dgr z)1T-!kGnFI@}D2fvU*L|jU%14ij;Wag0$ODp3(`iww1>;_=jJs<7?_E`>xg0s zzl-Bi34{qg{+b^uVt%tmHK9Y1xM%6*I2v=~yiwSNSjkPAZ&@G4$jK zg)w6e?bYxa#pyeE8)`5L$FU5z)Sn>ir`pdNea7sq4l`uNrJ3wF0pE z?mF(RiI;^k{T>fL(VY->fb$X2x2$y7v)EA|&?tHi_r&Khe*I?@`Yj36AwosJ>aIXr z84Tc9!#Mq52(6f^`6nO?=Pcr)-u|~z$QJ}`;g{Aytaf zmhA&b$Al!Y7+zZRWA?-8|J9q}PM#wTz81X&NiT?+q!FZwSDW}k^WrcENWil@ zY-zGGT-po4jzOM`yc!4RvK#1b%2(Q3A#YhhTxAw>ZOg|&&rD8o zFuWS7A6^Dv44Z)n?L#@5uV$Lw)FO`0ju}hvCkK+E%`N>IN<^GBKquN$B;UWNI^6Ip z5B!$~DDPqjRgB+K%JEhknYS?NO3IbHm!A?VmGyR}DYV&w%$LJ2h$Ej&*PJUR*h(WG z-H(UZ)OtSWKz-P)_FXVT>cATsT|0|`i3Gb_qK@uYn8h8iOXVcS4|%y-adBHL8jg02 zN+*vGT$ao#XzLn>-q5VS!_j+3!{oI*oZF3s&-C1=FC({bv9~m)3q}wJ03{|IXD=KM zEc9kZ-!UB>28F>GwB?G;C8TO4yb=J|Gu&Exeg;lov^<(l? z=PC;GXnzb9p*47k!b(N4!_E@R=X-i>Wa&>6Un7IH@*f0FBjb1kFi&LXo-X@wvZ6Z9 zTy6EIv*GAbDaGzHwoPdC7GGi06*{jP07k<Kxi)Pkw3`gU09v;jL+O zlfYM^jB`6j5*f2fxvdstoW@)`SFHu_^vzZh+KhV-pwLavDYtQoHF-wNTE>vyc={!P zhF^opk2#|8vfNEWuFJ3{Xr;IKO(n#dG$s5uyF?z2AhV;OF6F=+=}mubf1OfLyECD~ z|N8td(6X$r0+WL#jcYM7B3z6Nm`ZTX;KMt2`kv^euVvpoO4x{&Hsbj7>&wIb+4)1BdzFxczvN<~okbLIqSo-ERK`ji(HfIjJPYnLN zJ|D9NADjO2zQg^^k#nS@WAKWZ0Wj;*kd}%3;}AG^-Mmp1(|yQWrF!%Bd*t&}uh2iU z%pNeXBQnWTRoQvX7r(@hL*=+Ojc4pqPfe&%;aWe}q6zwKt~qod!IYw^7`vp1R!>K7w~Y&el*leEp|CU((%lWxAt8-)NQZ>N(%lV$q;xk(BPmFCqkwdWytCimdH?hr zf!%rLnYrV-J~ue)7sr@$@hTV$mUL>&n-tsFO#394Y(;KYA z5>(;0fr|m0tg(up-XSzrzrJae?LLuDVMk7`kZM81PzP<726QgR8tP=>A8ar!Rqu8F zyLrSYzaQ2kJ$}+S!2eWc7(u9*5Hzt$e1{Q)KQ_r-kr{Rmw$1WA0=a;y8L z?}>hK!E%LR2Re!IO^~=E2IkJ%TD}UQ=MVLQH?gaVFSRn6kw3#$FHhDO$oZViG)AIV zoLkd92{HV6NK%3@m-}CQ97Z7SG;Lm%1dOC?<>mmT1E-ywPvCK ziS7XXj>CP3xj`E|M-; z&#k&qD41z%mpoO1cDSUEXb}8&LKoQmhg5$;LyCsyF!vQ>@XHFf?!)WlADEF}Z)Ky_ zSBZHhbF9&{279I#@kbCzihC;w9!rvn__p5fh&+UTJGQ9=Z>${N_ilydiNVBIOIWzl zDIBcIa8KyP@DN^l>RH`AaOzb9>cH@inp{@aTyGF2Xo2nl4|fl*S#%3?saYb+@fEeE~@H}L8;J1A9IK^n3 zu3^~8`QgfgrO=Zo@Y)>~c780MW!gHF2CA3GIzuo)l5tlJux2<@cuOy<-^ry<8=!BN`fewW%= z1PlLO4dVSFk62yu)gjnG>s9cGF7Kz=8gB>qt%Ky>2uQ)`TW@dgLApQa;O#D=Q~_kq zbc922;{>I`?+B46x7k4xJ>;MXt&1>T=#R~R6BlToe<%>LVq39!?Nk@{p_OqR4TJFG zM-g?T3~&~)AG8yza^0oBelL6)cMmFRh}eFS7uSYBCIn_0o_`i!TN*G51zLoo8gLYW zWNnE-GDHxVxl`jFc8O@=2j(tx=pCzD^LaM!gXs9))fe-z)QWTL09z(7F)RQng1U3@ zQz34Wl%!X0N0+_!m@gZcak(+rU67D{tH2qnEOG;{Yuol3sa2_yK>#Yw5GBtb#f1ATTcB1M+HD(Ud7unqU$9`k5w_ZBwY2XwhxvfGZ$dlY=; zhl}=pN}2V{%58oRTW9+f2R@#^RqymJbr!P%j3Yg7b~|i$2mlJ=7(E9oPU!5X#B{5t z^NdXLx&|Bt;hXW7d4v=$n&)5&3Sa6O6s%7`=cxX4RA8*`ZY`f^jKPNjS{yPCaH&q7`qazqNmj->Vk(uyB=8X-Jmn_y9^eTKCR%ofeH-y%3WcoBW& zQ&>%E-(fnU)!f)&arYvX*D-g&Xv5vWjg-{SqoXYntq;$NuQhfsp~Kjr^*HEO4<92P zW$vCy>eoG$_>u5KkGh+B4Pm(`0p-YZD+~|I@SO&DE1&)vy?Fld9d1yD&FPDp?&Al7 z_9o{v^3aA10h|Zv+L;5G3RBuUrF!N=d&#vVT-K6p!O6*!z-BoW=z0gF z3?N%P)TsK|2|m%d!YXhQ)`L=_$S!7GUJ!3nD}Jl0th05|A8n{?>Lb+`o5!G#{gZt7 z5KlbaeSe@ajS0~nP$n}FRI3H;yp3g7NLXH;XSyT9*x5sL3Y%%r0)?3~OA9kwr$W!O zzi#XcxtV`J2lMwyb``J#c4m2Qr-mHOTU<1wuH8T>Jyv#abM@!G6mRJ^44sT&m9Oeo zI_8&Iy;}zD;6LI9xl>oh78cGRQe<&JWeowj5``Q3QOyHz^fX&1iq-vyr)x?61*lkp zMe38S062*O$rtnB7$=3_o98*&g_*3yDuDJ%G?nonkc%mtSB7wlts-_S3yC>s1VAZW z+Cr&mJ!*36)F3HpJwFw;Li=_X1s~@2Nu>AivtIkxEC{sNA}-c^W@Ri1Q!q zBi=@n=FDn7_&V2i?iyb($ z(doX2j{{WTyS4Z)BvK^<*N7ldrLf2|R5T5P!tK8z8S8_be#pN?;LUJG^{t+`^H07N zzL+&Ful8<4;2+;+&}$GM;VL^SiD$I^+^!9J6D*JvA^fbOu0x+X@wCNtFUj~ECyvAc zl5%rPBonaOTcRW@?AL#^U0`NK&>CXJ9o&QyNH4VEK>tVVrO#Qc0(4L*9KG}Q^zDjv z{s{r|$^>)L;n=E|$6LD)xPTSl&?nUm^}{YVI>N2-`9? zQv?W`r`u*v)L6l3aOH=*7N&prR1yZI#P=U!ba3!OWi_SSjK86Vd*QarkJ6%^zV@@U zp$1}VZFNz6Iw`>ST18^Zh~e@kqe z#H_cC$vf^Yl+W#~Gm@~b*4lltjE(0I?;kc-J9vxWc5sUG8pw`rd0GOaRr*JBbOTHt z1E5PSuPl2jl^%l8r%*0Hj@CsGh0y!#rHSwO=SA4y#jci7jbV&=@(MQ6c3{cg{s9J( z>ZZSE-9Y+UxR({9PYCtDtlPnWg zf!U68NHP#GToR2US+`d@%EOn|lAZy()+aeO0Gc@W|SKT$Il z;8Uo0G;CQQ7;q#zS`#X2@ozF;_J_wsk>2N+o(TcNhkLL#cTZK{G11(M62UF9eWvqO zf=FE55yTLpZe{AN9#zG?H|13%mnI?EUWFobr%(yjG-(Bm4Q9 z?smqGrN1$%vXo!tH-pdf0zH2!@+_Gl z`ynzx@}0?Ee8#Gxd{5v45i#@}2o?lzW zO=oa_3QW<1Jf0mh%CjwTj`Pcoqb^)Snms=r9XWg2UG6z)T8MV*ge8dEx#e}Phb*_%i&{2-tBsW?H^d4bPJE$Z3kPGr$C<+AzyZe_%y_uJi~=%!7TIBO>_*;rco1Q6-S|?W7fobk zTw}ey2cVbHUsBOW`>(}Q=02V6D6RKOgivuCg?yl4B0ZQi%kh9Fkx6hrKf=8c%Jc9q z-c$%VXz<+oe=PvBKh&YI0~LRU+A!W!?L<7NdXT;V{(2)c-y_ZfKLcK>1HJ^Ft6mU zVlL~WUCjSxPk*QVEQju{It0bkBFWJ5?#pQakrJ;mb%dTND0U3IKt?w(pq(4R{&tKz zibYyXUcFEE={xKuL=qYph`?C}+IeMB z9?pl@%-^kAm8j*1Q7Ro<$2kS^Aku2rrf=}Vb;T1bgG1pTq56lyYxs_X^o~g+_Mzlh zRINS$!T(_;2*bpDvPe~CW$UPKEfJ29p)JB%!NE{LD*kls@LYbo*@FkFkmEU;0}@|p#CZt1pugW`dz((P)w*-O(1zh3Sr=YpikzhaGiPSWv4p%tQ6Q%24PiV_ zCOP7)Opb1^4J*vB_0+Ph@%FPDefCVpY3x22XMVHBx!G`Xztzljs_Um*^-zB~Zbyc! zEnWNnAbJc?(Ieb08G2Kd$mExYfs{qgPc014Nez-bV~5HK@mfn&$)^n21j??ztPSh* zQ!9QVvNX`GN)RlS)9*E;;jK+(@Q+Zu0*!5QAs>(xjV|m}&~%N_j-j&t%h`#s{>+PI zM;VZUeqOK^yRO|O7uwnlq4u~1YQRKl^b=kv>!y4`qJ*@d1p?!LI%~q`PTqC_@J~sRM3Me&k&*!VhMSG%GCf2tUS=G5YLWqk%VV@M!xOez-u0{@_?x(QB zLTVTQFWJUG7?oHWKxI_s{yzoKZPt!Z?LFRKxnmEn6=jwTVVAF=#|6|s+xYN|JGY~g zKki$I@$xJY&aNsJuM+Rj&`yME^=?F?Wx7Akk`P}U=li!ZSBmyx2SEt#`I^0J1FC+lh*@}&UV;wr$d7oo4k8f zI(wzbUYI;+W6&|H7YwuIdBR8|a!;c2sb@8f}IgC0`t!Ce5o{PA*b4nS!%nsiDpR^SCzDg3=H}*uab)pib>=a#v8`@l1O=7eR6uvDo)Sdohzp+mTl1o7n|_VYGx!^`4*eI1 zRhzrsFc6@K@8fk1exwM}?wb9Hxzu<>6fIr}tB<=$bpS&l@Ip!@imHyk>%vgU@J%}LPqdD25n$^=CG{Pw~*{yZ7Gi;^!_#m;q~dhQ&3oO$&rabjE4M032Y zGmzuSgXGoH55c3>YE^ua-CzkcL|1*3lT{>v<5%TaDP0*xY_qNMdaa%E14sv+=a(EbUF#gw<} zOK1o+vaQpx$-pS1$j8>ant&{Qfy_VeC5S0l+0n1QkSt3udYn{4HA>z!ov>Yd!#AKN zgJ_i2If;Uve1lO$gsdpjE4o2Mwvzm;h4{MEPr=G>V-)x3E}@+39B*$C5m+%#Zt=~&gQjJ9T}RyO zQ#l4nUYF57#w5+gVj-?3xrtoHqaZJR7`F&gB&t9sHC;a>_2;dvb}I7Na;K*J^+VI> z8T0%mhQ_~gxcXN5$90U0uGnkxel%!WRz6L1mNSL`?S3;T$+B>+ICyyLT!O%rT>tiG z{TqWRhdzJ2=nI3KvH|+#<+pmc*JoNb9ZMA*=((4f1VKc~LM!rWmy z;q=VE;a?yT$zQ+fu3z0OoC0h6lc)Ydj_W;SC>HIjFlEFd1&-v&( zXyo)Sb-mo(!$G@@o5yXQU*~MU#_@V%8 ze6~aOwHeTvsIf`hc>cn+N5pUJE-?L^SSd-#Fr?)SFjV4$nTbQIw2daZ#XDegq^DD--t)_9PgFL#pq-C zZ;ZD$XfgEupXn*26O2TAN<&~)J+D*PasrT0H;Rf(AN39w(dYW1I)8suM2v=K@|{c+ zBbOc>J&Yb1x8uC!bSbO<>$jF~EnOvVZ%e1Jn)d=fUShdkV%)|s^f(XIMNeGHQKKK$ zRypX^-ME(C)EbuFL~Q!x4?0tRtsj#}AFaRmxPS11g{0PE=n8k0rZ<;FQ)nK20R9OA z#?LUtsb+44N28+H3Ca2}mXJ%gTYOIjez^#tQ8-cETSDHJ{c454kA&N|X^C#WvPiLN zYBE0_h2_#vwMHaLQI6{q2IYr7)ig6;LZ^H>`K%^o0Zc%dQ9#|i%JUINmbbA}i*=MV zUZDtOVhzP=&_3pB7{)=vD~>i!)XTWw#eXgP?seCeBZjm)-c(YO=IMaROW0ZsKQ4pp zt#jZ`Owp2jrMVjz0K|fvE@vV8IzQDBmB9B}$!ej#jOt#j&V~$ml10ME|8&d!kP~yJ z!AV47;=_jz50}7Mos!P;A#gMIDqM__f#*ni_ti5blt}rSFcT8|qjkXq5z%RnXpUu2 z3M&hciix1J?u7q}zr;Mf2zr9^4E_b$+2iOKW+$29Y$OUe`V~xHmS{-p+f+ zpdE5{ZQViLX|%X4JhSwpxUl}NNGUpUBunFX`PzQvbSdI+nL#I9sd4R}$89ogI-cs= z+KbS?uqh}Seg_&+p)n1;xcIyl^g^xXE==UJs$1N=TU27}KA=>&m7J;}!Ro9e?lL zS`v^{6vZx!tGY|$Lx@$9OGl~)%T1)OPK}5`jn-3rgU8@aN6Hhc&yMDQnEN4<<2I;4 zfwMuQoOFeTw_7{;Bh@V~oh)O}Y2ZHeAxeQdq}Q=)fy;hzb_!F%L&1ibfb21E+~_{J z$Ui;`ybx1pZ~x%!ej)pctt}o#*KN1L;X+!ZO>>guRC}a5{BnH6w>op7&h>?rpmHiF zaEbrC27LPX5p*Zo{xVYxB+4TZ6zvaU5N&!f2))D?GD=42+D{~A?L}=eB8;X(o4g?= z5?)79$=d{Dn|!B^rIPUEUi{*)$=^`L?vO11;J3GVOHZ&U2vsG6LIqWVpT9B2lA*l2 z({5CK(AOf3Fv29i%{>ZLA=#jhT#TEO2>c-r|zlA4r#L{R$-jfw>F#5d&N$R`Y$ zIb1V@d2mzGXyAja7F|m8UP_7c6B`e{!nc`?&sr3BvE^%CnjYJOBr*J)tz^~cw zF&&z(nX%wq)>HamiFk12Qn$+ESiZA-ANd4;@h14ch+yiKe7-v zooCbSB8>%Kj^?e?kzUeg#S#M%BAJCmnAB$sCA&U zdDL%E>C4+_SKVIPX@@IyG0|CEY8M~-qT^*=umyTmp4nyH+qmuL&oB)EpL;;)a&6jH zvei)#%Enq2h6NyF^7JFdymnl|}%yro#c`YHw z<#nU}k=Gi%arT7n{fCG6W6uG~;8N$}CJV>%wIX_E?5w@$f=5vT4y6R&fta=}bf`HS z*XMmSn7Pnbm-tRQz*y39L-|!={+^{e2>fIl%VhV!be0v^ZPF zo?&&$hR{e*ra;Ga{%cOH?cQ_wt(1twDlrPrAkXOP1LnWigZKqxXzYJD zcz7*xi=5c+d{Q4DV#|72MZG3-_GZ0_z&+qu7HUmaYuoX7=8efuyzx^(<_N=S1;||J z2!Y}v&y@@sV_@w}+50C6V*vTB~gP-~gt77{Cw3OXp>&V(!kV~H% zs5bKFzs>FOKHl67lH-;p3~8^><3E*kU(gtf-*x+w)gicGVa-G!q$G98I=0w-t6}!^ zdcGm|w0xiuFEictS#G;WA|;mhb3CyjO?+GjcB@El)tp^YnT?^;UYOMgqzouF*`t2B zIG<1_-G*2)SnWzG;4x3$)&H1pzRJpgydhkM#J#CKIQ}b2OojEz!IyG0HzG|D?y5~6 z=kutu(;r#TfRc-sN0wtV2$k}Qjwn3HOM1W?_R74AG#`!f_b0go!p!h0@hA+V%9#ES zkXZgVOQzMgU;-iIrZf7l{dYnWGf@0)&liM&SlLya!HU%`?ioxdEA)>$9g)XrKYlvL zT#s&dO%Zw9EChcQCcli~5bmY8U&pp#t626;>vSW#biULBZ@G|^rLs(~{zKc`)d@?5 z>W0j>XNHR&)oSOk#7l40xv?=G#*J}axTrAnXiRw7ttZjRIPWWN6;+x)x;$AVt2J31 zFMg=WdT3OM7zxEU$#1w*>!>?_F{IgX_ZBi@kRHiNS#jdQXRsiSivDmOUT*o1vJ!#& zUWuC@YUy=uaiY3SjvV}M(@TP>OakyyLs+T#$YNpqiV9F+oaytmf$h|y5DtOzOPzup z0({;ue-kE#@p~7-%$GL1CC;V5YgqYpKo9@8+t!E3(8k=vJ za*y(Uv3%B|g&3tmAjrqkpS)g9bj#MkT*HbM0lYt!BbMLVL**q+CKMT8<`kY>#Aia| zsP%Q5WL-3nK51&Y9}9bJ|9kvPPC_NK7qQZ^PaauirNUbCk|uECH00USaP!5SM}c&5 zQEGuAfGrAG(8!viGMH9=f)uXe{ zG^(jJ$?f3-#mP0tQyXeS6We~EuTnF7f&crse?&6#6?FnP*Wv@hfahv$d@7_IN(RY1 zYSRs!_~@@-$M(0wzf4-T4mh+u#f*IF@pq`#!>JzSyX;PTpG75cgv>$+#6pu~(IrXA zau>&VmBy@9e3EX&%X4x|9Gkn+6mlpY9p?vSxW8I?%!?^!NSmL{Y0*yS5nOE#nAU0T zT?>vSnSVP!9yl|O)Cs3sX!=FC!`Su#5&al5owLVXty3 z_F@eAKT(qzvvdgQR2fq&`21Eu`fuWy(XKUzL$BBd-*Pa=L(nVNl;e$`>5%cH8d{k)tD>k{jn7cvJ125FBc5O1BP&H^QKM!bKo zTjhhjaDSdN77`^yALT^Jqs6` zJkH6&i#|i>=xPZ8m1s)#UWz*Crp%?5q7{?zPj9Fs9%b@kKe)xt+jIM_iEVVmMT;`o zv&|R_eHSC<3Z?P*q$34n*Y7>7tRyl08d;L(xvb|X=Xo&!Zt%}U!LQEB+!XxNfAqNV z48gz~J0MiTPDugs40gnq!dWs_ZgKvtqSt1nSaR{VLhCgAf$>$}R3DeVZMt1mQ^_qQ zZaTAsSmGHYp-rCI4@5G_f-FPk2v=94evj`Y>Lc>33gMl$|0#J1;S(=TmhvTwH0YMR zx6BcnXN0|}zM>K}^8+GE*T0r(R?NtAfudArupuU7-Zvj4S4Bl>gqX;-Iq+oZ3VqWj zT@mMjI7K!5a$x#)E@mOPv0k!{cBJZ?^Fzq_lvmT-ORWYg3A%&NKQ*``(`b9Dj>6O( z@Mj2Nb3H2kgvfK^MxadWYNv(H;Vl+-S*La#v$SCTGHyE>3P{G3@jBTMa(6-Lq(>* z{CUIj-Acl?Tus^TB2C~Yy{7&v-P3%nlJSC|X7*x(rq>g`zo9bngy+hLUwsnrNHUCH z(#!If*$dZk`pK<=fG6u>XWUW&kHm6$NwDk*=O&%w#1$e--k_s@UZhyPB|{tQYuN^B zba$xXa%O2xQB@yhufWty)Q&lvKOC%1V2~&{WDoTP7PxqD+@Q z6bAI0$+%3K5Sp|mexi2zkc+-LKlAdVNl&;aKl+zECH!3A1gSUbM5cq|=Ql69Y>Sg{ zaK)kXAG3sh}NmmRhN_qQ@bs=&18$ZhQx6=8&kJ?l>Ea@++D}50oeB!$YPk|yYL2(FgSTP8m7pZ6&%;$9AJ(gKm-2oS_d%eD$4R`sP zE>SCxJ$p6@6o(rl$$YhhJF4g<{`a$LVxRuC5XbHU+!QQPAJaY^*mC%D7_Adj4`?Fw z5J~s}OvMc3Ea;!BAzvO?gg#rDO6Vo= z>H1idwi>5V+Cq+8j8SA z;K_tS20p^wMT1TEOG{Y(v98hNd#+7r8y4dQ)ABX~rMHMf0E(RGWZc>0~DkW+Da2M%T3lfFXY4`n80RJJU{Py_cU67}p~A0#LE2 zB~TKl_=T=A1jZrBye$d$eRKg_bpH*7Jl*MUNqk>WHF*pdt%Ak4cYQn;qnj;G&UPr- z(`XP2T3cwIdAh0^W zDMU2_U#w5gNp)H!W1FdjN^M3@L{mizsxgkpi4v}j^eq*d(n@?J{;-Z7Mxwh{i2J z0bQMrCSMsm^G^_T*r%>DEY{Xl!c1U}ivZm#eOTr-KycL|rUiLj9*_@tYMH4?E?IiY zlrT$qyzLjv4IL3U_W04?fJvu`!ZCwkCoW{z#vO<@bUD~W$)nyt zliUxsMH=4UG;jG9bcet%lcQ`>pW@gu#Luw$5C&>_n!f0lhw|cxEw=gWGYCp@gl^`I zi83w>y99g-GsTJYf|k&vu+q@!Qh0qYGy9xiDt`~0OuI3e>pPqe=wMO%t_ko4nt!dWDt zwS2Cpmz^hDbJqv7@6)ujYqLU2WOYC5dtvjSqWq?OLl-st%$#NN5T{K}gdf)9ufK|brt5cI58ccXI>iyr2k2Y0CEJot2Ma{ zcnPQx$0{&i_0}Ki^v~{&SkFnbDua#O-%@U@)uOn+qg#T&60-0H{zA|g5cZ8*fGX5C zl+WMz-3CJm!$M3MYpGR(;Q=>cg}%$UR29k>&{m-F*F@L>a^{)zh(5oA8u-2VM`MDR zK>Aw^{j)5UXcO9Jq_-{hTmP>GSWcb|XKlB9_;=ZnSyKRv3Q?QlVQjGm&Ry;aQHVNI z`8!0uxGKXQBPA@VS{88s1&DH&TsOyB#0_>fhrsCoOmiLF)x$Bvo!|K+ zb_PtGHs_j}#apITOq+dfk)f)l6(H{dJk@q!0qYTSQ~6BZivzMz3?;H70!DLx)Quy( z&@UDKZ^kM9Hp%_BmY&^K5STQFTSz48cWP2gVF0uw@tLmEI(w^{5h<3VsWOOj#J1v< zU9umUdC8ugrK>@PdE!F|h-eQEux)q08DcW#^NriNPpZm1w;pZn`O_==V1U^F$I?dO z%=MLsx$1oT&F+T>giel}yYX_rgtk*m-~F`&^7M7y5zLVvGt;<8egH2b9|dgN%mRP% z;`hOXPgf|5^~V*TOMS#x7i_0i07R*+$HrSm@Q3;I5Gw8f6w`>$X*Rj$V1jVGVkZBT zY#j?wWFF2|eQk+`T4sQups!Z0!QC}9ubGYYIS(DuOAd$%px_fp%KxbIHjCV9FGyMx zjAaPVI(ve_3Oz&+c!j!)Nq9FteP!ja+F+-QK}Q@Q$;vOxn3ez7m+U!!@1J6wm|Pli zo_OOqCe8i6*WaJ6^&bq-RrKxIWR;CE!g_9|r#9iAJlW_#^v&s5wssD`1Pc#FFcm!i zHd5^hMaMHB%#7*x`*)gMzZOK=9OaDFe;87fffE2gHaO%C(GiHc@ekeuSxuiVBhKC`DEtxAkdvQ%hZbg2DLxFZ?Bm+MFa?| z4zHF2>=xpiXTRN$>MrdR>TZc_D0=wK**M>xR9sh4wl1m^L937Q>oHYhO+M=E)q(d6 z6)D$(i9W=i+;cM)F|4M~X*Z?>1oP7rtw2G?X6-e_#YTH|{|4|~R8Dx%nW!Is zW}A>eOz(1ivj5e7nQs9|rUPbitt70{PRLeR3P502K8jn0oeGg9Lb`FgbvK3WC>(k4 z1~+yziLj}CVIaU*UI2xepY=Gn%V5TEOB976nBhA33%&iL2U_d-v>wA@33fOd;@P_^ zy)+q#+A}I4v9)x~zU^atXkwrK&AMDz?9*&(Uy5GQVHCo?4-j`W41!hdF=-hPdT|sW zjl|glvk$3AnRWs31Wy4UqI`VsZbjV}_#+MIgN2|7|)m`@ZAo_r-Vo&ZmsTiiLy?%+dG~vfg78WR;FdR`w!od zzh6Zx`s0qAoU6Wkk5}eIQGK$zg1BXS9)Iq5xIc93fyy*q5{3Oe`xEu`T9*4X|2_Jj zg>Sx4zSfFLTuTS5sDa0vUzFr1d14zwfFr9441CqK3KC+ z>yiq3eZ~+b*J0jl|GfHAwh37LMB3{$AE5f5YAlbTx7A=B^_&p zE*F2*83ZiWRKkRKGGL_ro`oEA${sQx&s0m38=+?3_>~-Bw@1+e^H0j?NVKPr=+ zL-4NJ$mOM6i+La>0l65B*NcCD-;tL#vA>3isZaS`y3BL&sp~FiQm=%Lj5mkwtjt^% za=c|{8-M^!{<;^OsFSZc=Jx_K9A-}-{jFP3TrQY1AhyL*p^z|Z% zN1;vC9yHDLw=a>~pCn1q#I*1%6`>Uj!oJzI+ZmW@T4BluzGR zWb7%PK(uw+jl@*HfC+^BJ1Bn*wDG^b>hw?RJp}UvBMnY~*gPkEm0ih8PQtQjxt8k& zj7C}F4L$nGG~)JcX<9#<1$m3I)r>GkwX01*{uBWt6SB)|pz|L&?GgON)l)<-u{uYy z;eUdgp|d=2@WuJj7;`oQ2bDfN-1HXg0tZ$yW6hSoX0Ot1%}7N~>oj#=942gwT-wk3+rT-~!o3!0fz#q$Jk$KQ{K=MaeH zC38!zohk29$|akBR*ZZ(r=cu(45xx1^uG$(d0EN)hEd%*i zcvLK?=3A-bmD7_!$RL%M=Cnswb^wuGj7m5fhsMtPal|cu*&qJ0zAjU5evsDHcEh5e zC;RB2CeTOSvkJTUU_Mvv6Z|L+HV~dv%R?xP2vjh!kkDD-<{)Ep>qI4*1&vZE2L zI_=ghv8u+nuJL=t=@>(d9>|}O>fFkPp_)CPs@FHrs}X8ye?<* z;eXfYUT{nxhmXrLe2v1w*#gG2KWd|h^IY;JQZ6!jq&M)hu?W?IIj7?MI*(%c^j{JlR3|y@~#gZBqrbfTYC&aesMJ|WSK5gC5*j~roUBW2#mu(4-S*F& zN`!!ays2#-Don~ie}Lm?RcALXs0 zW)d%a;8w|K$C{F~1~WX_HI(9*41iXhRk8!;1y)!Kds*H~$FsxgAr_YINP6R+vJOEh zFyh|&WeN*Rj2MHA(kH}meJz7B=9K2ZlpcjhPcpG!*bM!|>Iu50=5a?}UGGTd&KoBJ z(h1+^`J*ux)sC!mL!CS9Qi!RHdXFKj@lsfb{Vax-ZQFL6X*HxfU4vaP+|c}TG?GyK z`HK+;nY#KZE}lw1eb0QGL<(^IPDUT$_C59l$zSt4-+y0H>{GM8^%rf?9J4o!`ecy_ z<`WMg1wTpSA4CA((lNt&d^EK8b#XAnFjpH?-(Kl5aUKuDK6&xMlbgpV{=9J^v{nE! zuQt@;9GfYudr1Zk$At5xVBP&s@m`}8+PD1WrX%FH{7KQ^sbf0GMDqS6_ET9?X&$6k z(bcYvmu%zOuokgQi~;)Mxz-iOMH60}5EnEljL?aV$t`}buYXDY3|fwQXnK$lwGa0@ z>>Mk}q?FpiYo%xrdwR)zh}-SDiD=$U=%VJj!rPX4M{BgF73LW+FXB^%C_SCc4HAn0un4i<9hhgk!ueb=hTxqE(g>eWj z*`4JDvFh+=-3WjFfbe@h%YmQV*i`!Ihg?rjB26#z;+5oYx32&xTacm3r?v_S^e89J_F#dF}J(9rI64lQ&V|?=sCi_ns(a>=h<i(8u0VgBLeZZ=v3t&h9304KtTaI z=IQ4*cm@N+c}$vE(+RY&)=3QYtZJi9e+`_}slRHGN4TgW0F?4KM&g+xbPWXGg=X*8 z@HbaK1=J1S2{FYRI7c01m! zfWO3+vTOtM^Ca|(=Ho+~-Rz?bDsSS=Cx!BeOnFDBHf+SgyYnQsM0GV$xW=)j!Rt4chn zpd)`$I|_(+XTT}2CeC-<7#PW9y0qH0mR3()nPk~j8ZG6Xh=2Fe44AKPeJ`X}C8b|d z?UJZ@YagqB^ZW0`5yw|dShOwe4IN6Kw~&Lzhe_TzDhNZ@ z(Cg!$A2yt*a;z`Ghnz+Fc(`NT%bi>KkStO*otvn29o<2ORDPo8Mq-@2Q=p^g^H@)_ zBB{)}GDpniEqA$HVsb?_*VH%d^Fu3L z19Jf z@9h0|{d$)NKsJBF)jrgp7*P6n0_yo_ao@Vk|F#Yeve^0=DEqW^*JtiC}tM;_d89)(~}AS9)aAUP_Y~g%dp4%9(1S z+cuco?Srb2wYO>&&~8_&SCn+<2$iU|HEWirK91xnsWmUt)UE1cWYz!UYdb?-?6 z4lC>K>o;+1CTc@RQrNnMcs*9FwJMC$dF)JnwP%>9FW=8@`wEXt-(4r)pY^j|jQG!8 z^tPt{i4@aIrci0H*WXE`vJ2KAH&FYpLl^uVn`d!V%}-TJInQjkr3I8oqt2?yp&B8t zp~e$E?e`aY>3q%wdYh}UJ7AYJD|zbLGMBR3=YqkIzoBr)xk8nL%GRBPvs|aWSG~bJjE7vpFLIbVtNfgkSXa0y{+3xrt~LU}co9hy2P0?!u&>e3ut4?i*9#IjLS`Ti^(!`U zncTXWe|MO$+A7R7U&t9>O#R9m1t#b5>vP>-rIy($Kav0A>bnD}Z2$iyaU?p&-s9LZ zO7_Y)MzV=yBxLWENJjR`3R%er4I+CbvNDQ9$jV+JqoMe{@19Rj&-eGo^T#93x$gVA zuJ?SsU#~%Wm&oq;P_{elL@v2D!^|GjmNnO%@;NA8fXXmF5 zHV0=V+&C+z4$skiTgOgt> z>1#dlC8HNm1G%#is4Z#}r_9J8+FT{c?e@JH>;vg&zmt(?_Acnv85f^-s;3I-GXtO`1IJUZ^vvbGUo4%^Zal&TJy8)PK)iUT|c%4NDnymNFIPJ+!Zqw zbd20BiF2*jajM_gzUb0p-mrv7J%=FBT|VgRh~#3Hl`4~WipeSRs{(hda;~$id#f2O z1ibbaaB6%5G8(H{aoxiY6kc)<*F|2^%#o24*4aMbIwqO8Y2cOsg^h<3z}U3<{;Yng zqJeaFPP=J7v~wf{jyH1`JK6}`nWpV0jGaxqs1|6JIN9}4aGqZ639;*=NcpTw8s7uY zV`h}`UKS23P&*S8n@IxKezqQe#pdNMm3=>Zul5MMlIsZuuX0)26ZEK09uVQwF0h~C z`c?z^-@tndO!u`!6-qpA4qpGCo8s{?5%&%3s0Auhkv9iT_c%N<2{pcwnw`L>#qKg! zCKtPDSBDJhjpRSS<p*v(mB+6b_&@%8L|RmBNl#&v9H%JA1B~#Vw(N zTH|h(-e8EO=wd;5`UcJ50Kh)Syt7EGI%3^9y$bJ+Zpz}~&d_O_UKfs2OXS+tPYoo% z`ECc2iiDhC3nItra;|KKpP);6kiT*o4k&~vtOUP(+o(!V^*LM{+Z_q1C{radclrW# z%TrP+UE5GbSR6wii?b72d5ar7pUFj!CYam9(R;lv1m1sT!W8MDE5M^^uC8NcqK8+5WHR zfmGUb*y0i;|3!{(%y~r(J2&-|`5VTgHf?C8jx%MCoz&wmX6VQdMV%ms_d_$Y4t}?e z!ql#oHkdN8k-lsiYI;TvZOUd;?&v0TFzW^>C$r~E(qe?9GLWbnzO5hz@0tXUBE?J1 zcAk<4Cl=up)&OO=HOF1qyW0+#6&Uo407L$6b<4Jri(D0cw;K2NeWdtv%9oqT3c5(8 zi`G(;e3aUlYw8?&ExE<^tP`^^D4a^f`_h|(X+DxY-mU5bl*|i37ow2S$fN;5AW-A` zw&=EVw1rGI-W=GzrM?(oG%Wf0N7hgUP{9ord_S;FqDs%Ht&lXf^W4t9_ z4@7cXN*EF=YC_w!0DGXSz9e{F9jT zn1t|!BeE;bQL$dJknWEO;5D&Tw94_nR%^KM9zCQOoc`&DDoenSvLMFuLARJS?Vx7g z3aIYp7Q5o>EMHT7G>breK*JufT+~Mzrz`8^Nzd8we0VoJ10B5Ue0`%LuN0X<&393^ z=o%f}8N^NfK0L?^*7Ri~OAz$y(>q0Hz~9yu?}l!o+$!x9ecB7{8gsvH-bv20l)J2j zH0Hh!PC0xfRJeAPFv_gL`ux4?Y`8SSG0HAa{taA^0sG7?U^=h$VJg^$W`tUS_>sJ6 z+~wo(glY)QvL4sxF$AbEgl-v^^_Wvzj8!rX9gH!2dN5AbKc05w*79qTCEXlS)uoc6 zoRwEvYP`2MKY4>tZ+5odbBAKRhWIh{|DAeyMvPkKCU%OnTZvd)tvT|C;%l|}uvfoU zuN+pu1oN3x=Kz@*&gh96*DKhM9A zs`jPYuyu!i_PndZuwZzPrkH>-G&kNsD zVs&m^rJ)*11+tu{WQovktc~QfrV*0k?Ss5AhUKzNDbW~&T&_sTP2VLyJ`MGx#yZiN z-Z=SCdoK7GElC?fS)**zy+z-~3R~2(8o!dty3uZmf&DJ8u zOGl1i>3)xYL@)ECCnPOz{D|@>ZJ;jdL6FiVbd4$HrnR2$9Z&t|+9x}p8%B>cM7w8| z4;gJW8C*Wu{-w{{|F;4BeOPo=|5-ckIz|I~mo!g#NVqg-2U^CH5a`P}eynwGUG2_` z6Om0x(Y0ltkj|LlcMSq6(sQp*cq9JJlMJu$PueppymZZK4jKmqJA$Nb79q(TI_Zv$OBDgpk4~lVS1Lx$Ij_PG}8(1AqhyXjjG*n~F z9ED%Y@wBlG##+TZp?8gCuoal+Dv}? z1SgUnVxFV1%5?d4P+4iBAjcX6o zHrK>1>2lYlD4Q-lr6B)L2$Andu(EVXKXMNTm0FTD56sFf!&c4IsL{v26dMlmq2h?t z&EASm|H>?uIa-9pr3XTwxU6og$JXAs|Mm`;O4%&m;lecYj7qKaNRh?q{pdq~c9YJL zgNNe&&I12lZX8{3C93R-!812D&Jpoz54G2Li?S@CL)Y%-S!kZ5Mjw+f(-u+oRnp#; zk>&vfe>yYMWco3*z5S5gcghv(an_8GGltaWIWqg}w|TvRj@HY&8yTCXFu7`8(5h>D zA$t*e3=@ixZz9Q0+bqCn#6X_Fz%gwVU)kk(AeN&j`~jGS%i9dDjkniWq;bS`G6V%h1OH2>%&-c>%YQUF39*TPv|( zT;IqGGG>_%zqI^W9K6qjYAr3(#(sL3WXaf^tY?gns2j8NpL4}W3zCEK(- zlV;DBZt2H=iJzTch3n}0Lym)s8b((Z|3YI1e=H^oFZm@@;`ApAT1w(vGxAXA4tw zDAOGcub0KYJgO60ib@?b`ZtE?;>Wkgm}4IdT{)(l;ZncMwP>teX}8Jy*1V8nkWPeN z@;UlJ)Y;IqA@RHvphMOCpqf}IA;$pl){=2~uk(-d*H2<}x=3`*WxhfO`1%W_iYNl4 z^ZWUbKNQ+u7i)6!I#16%hXUa+;Ifj|e}0fXGXK?J^=$}A>uIus+G76ac(a}_T4vAQ zp|HCBHpwRLLH`NeJ(VFkHrm9=Xju-6E-c+5(I-RXxF!M!&|)>!0z`b$4no#ck* z@bTEMLL0UfH{Hg*uQ5(eB#Z+osH9@=4c~Kldm4^1U1!5DVf*!Oai8jx7XBXl%dN|g zoY5(}bFsiw|8;`8zr@7Rzh(jeC)5BlIDuV_QzqoS7B$%NQ;}!Q`|CdQt#310>*@99 z$M(M&Tx~q;j^tQ&LN^Rn&wRrX7Vo!%lG`k`CXQL{HoKmt$i1$!4uhRc*R%9b?v9h& z=N6I|5Mdb&nFUVH?5+$aINu^4&GG-d%!oInLZn}Kp$+44@{Db7abm?e47suZ-=2IP z&jo_WHGJG?4zO%SGwJw~1gB%s9E~rpbM`B*%nndZ?;lwl0D6_i{)VWpG#mWQ?5FjT z&!2f1D70HkyP*|X7FZO~BPVfkF5{~xHRJ8;Hhzm-_t~ktF0po?tvd)47aI8Q`pu-9 zt7u;MVNI_KUSq;B)GUIMF*m#T%rK4KcrZ2~&_r*jnAp70cgwG(sDhM) zbtTLgFnCSd5Lm)CP<@sEbAdCchp^QSD8lJvUZ-V9@w^;-7f*QSHVoekhmF*u+!X*m?B4^ zf6XQ(Gjbyc@-HP=__mik$C9fMh#E5?y4i8}Ei^w@kGrhuh3j7KP-AL8`r^HzNnMKl zidV9-uk4I~GlSYJ!XN99RpuCGk=!o^Lhg(0Cx;WhOIbyV#qeqy2J{IJSYSak)JkDX zaK(SQY4zeQkmLe&iv*rsVc7~u(0bXtDeR7=i_=nK9ExTTH z%;YvfK3&-L3o5R!h60k0$WMqb@9!`o+nk(YyLo@J z3IASU%F!>ep5zg%>tP`Qp5K|TN;9TQ|ip_rFa^VN9xO(l*O_?Q<9V9WSgY z@W7n07 z9T^CfpTSONKj=mYoh7l^^)1S}F7{oxh*l8yE= z^Csh4W{AF!WNXY;)4M!nlCRBhl4fP&KCo@*HWT?yVN*DN*A9Ni8^;;o?Fi-UASln> zHYQM<%)F8QmMdCb@iS|s?{vvMKM-(R>tJy8V!k=0O_R3|kWk6ip1nyWmhiNciHd6C zVJ}XHZ3;Oq&s;gDwGZX1ILZ(4W5Rg@u`GGB>+ouXUbY+xd{Aryax*b*VJt0<^-`_7 z`QVe=-ZeQN-bJIVW{%k(0H3JoYvvAogr{BQ72{wG1zrWIed;x$BcIPPo32Y8`=BNN+Iv$KmY^;6RodDwkw`lzQoO?wZEI|PG)+^DHZ(M z<8-0azzxizrMs$0Tt%#-f^}H&S*&Tr8oT_&6h@VCrj&O#q(BW>pxVhJjNWn=x@tJ` zp4?6%6TXU8FK7(oXYCR&rk42rP4H7Ty`c8YTFUilo*gM->p6>Nj<5h@U-ZoU;ni6t zO>HmX>qzGHd*As&@Pf%j{N9eSZKt%PyrF&CdF z`3^eB>l07mf!Mv7A*FyEuXzpLw@TISzU1B=z7ex6*vnZ@zuxfcvUB_=-{A2gcpDtN z`Nd3?8(-b+HD49~j-;yl&vLFty#Bm!o>RNeZ~?{=Y)QKy-dS5OnApxUnHna_wL()O ziSP=VI!l+#{}ZDIt+C2tHk+eajqwBHPVS*H3kL_@4)diX57Z<94`5A~1g! zER8qm*55WnbG2qZZgBgx{VHd3;pFA)x^%QfuvTT7*9`|+`y%Y$%MvPohAn7P8=|6# zlmSN`&5;MRZp7r~73wgYIp}>knffT9ZhAh-m9jLX1I<97)`QbbjihAOS`q#Cy~8#} z9>;Iij~tQenyUp2mL?$qY0M}Y$p0z5rBPxCDJ59JOW2oI3>E*Hz8ZT*HApHBBHxDQ z!JW1CHs1fPMVP?u@j_4D5@Dj|RS<1Q+%&-tv|(R?a?~c4bsSW^Od5U59k=fBl16%M z<~=6)^e~+fZ<#f1)LGg0Y)nx+7lArj;&=H;{MV!9<&w#+ddWZ8HY)fuz8&o}W6?aD z$|=!TKW{GH(O_RVzYGXQmJxrMWZY>r-)*LWHBjZ;x*fa$o%y7$n6MTp)Z5Z%W~ZGiN}{HJsu9RZyo2Ykg%+0b^z{ddz4fWXgX@Na zS7doP>-}MLpx)5!UIpt+HgL;2%0{GfKl-~Uh_NglH%QiW3p7P zkeh^=fnti}JENI;bKnIWexO7o9txoC53iyq^gC1-Y{-saCVQ`zuoDLhV`#;k(yLr1 z#?1YeIU4{0`ud|e!#@ch0zPjK#w+O?+G2KVIpWfK)~44D{x8>N5UK-@{1BuKV3f0l zX9oD}5gAg~sY$U3Fa7)xC*biv5t3FKu=$cGKGa4@o&^8kP2j;hGMUYmq^oB}5Jm9= zVBYhJ$k^M9yj?z=FXsdw5WE*SzGNh0&Idmq@>uO^P2cnKx{>+1*z z1c>)-!j=e$3`_JlRVCP(H8VuqSrnd4!R&oy=l#!Ql}{Rhv)WWje1yCeZt9TN$^7-R zLGp$u*SmZdpJ-)EsWi*P{BW9^x3%~z6^iaUg^#rCcln_ZnSqGW-C&B*68tv=vL-vy z_5M6}wl#wFcCH*y`P@>#l`I!~SxB@V`b~WwiQh@+=|}>im_@8oMNc%Z4rzp9<^_5{ zD#spCcX8~z?Pe>MS9>k)WuVp$T~hNqE$LAp($5xEcsA`@Y}5>5pQbzez)D;VET3(6 ztGhk!$cGUNU&1EuEacGdD@#Pi zXeYv%_V>_*#mEC8`Z}olQ~^|-JDY&F%4r*%><3T?@RS;ju6%7j{Nx^cW2RF@x0F?Q zFET12*gje$76`b;;TM5{kc3WoNWIX=?oFOUP=LtPmzvyq9>VHPQ^+;nSovdRp)XVV zjBrR0w((v)-@LR|9r*d^cqZxk`=ImnB>DNBK?d?63 zlE?G#f|-K)%F$c}A5b<}!v^4fMTQVQXIpN#AZA_f&@G351A(bZ>4s>P6kOPN{zlFR zdISw@6|#=;&)%0^nbMM&AxL}q9R?*3WL;WPz5C{eFg4$o7~L`^pAT&FneleN0CBsP zxBF7KAL%XIS6N^idE4&YC4I-$D1(Q~SF@)Dm^siiYlVuPN>d>cFeK2~Q5p;c)u7KL zI)4owjwSdunN*juTvOtfFN`~VfL7-SolHr2g281BK;ioW!u?KL(x9MXKtHfj5+7U67MSeMolLO1mbi*^@IpU9X5}4s4=j<%F834 zX;*j)#$Wta{WXH49ye9yG98n;?6@UudTD7sjKkOg>4~;SL+q;YA`W@K+(Ed>6eRzO zq!~Y1At0}wn_&iR`KM2J=qkvH2b1N^qfF+d`ec7-8?~#Xi_Oe?`O2YoFE~H3oOW~t z1i}%&>hCG6dfDik|8yXJ@5}&>^`j@%jNwqw6ac#mj;ch_T|G614giIFElFD0lWQ4{ zrR7_*onRTbL+Gj=vR-qHJD7#lgTCKknHI#u^mZazE#xFn{(y6D<*Ttg3p{h9QDZ3*{;yfYdr@NVSIDxo&EPtVigvHJVEI z)A^j9yIqFcD0%%cQdq@z>o_KL3KToc;_y}c2x($1ohkb_)iAA#gjmx%wg}YExYMfD z$G4`HCMP2G#}Su;iYF>@^q)<4q<5DIvnX~YZf#~HW?)40svzNXMxe<1Iyc|+tVD6= zxaqA-rn6Vk#lCn_Nw##Q|9rt>+#+KGsK{prpC;3V zvQXLLpVeKJWmt=eIXVr_+Xvfl=~)>1MG^Ufue9=h;5;sK%SFdA%Z?!+CWg}%L9`4cpKQ2X1dM8M&?Ez9$O;c!?@EO1Bq!oI~5DDSh>v07iG9qorloYH#5rfzydWh~vq$nwwpPpQz8jY5(c z&g7)aCM-^t0p0XoFGG$ADxO$w{T^TLVjG}6VUHzIxs$Kr%a&>puEx`G7|?wwee=up z(`t8}2=A5!tPA&tvCeQdWkDMY`RUD+ zPhXwJDl~`8+>~oGc~zZYb-YendR^ozo`?Qg)rh&^V7HHNZHPGC9LA$l$=Gm9+FXoT zOB)-N`YBPJl8LO@lr=Nq_|Q^gP1q17{^&B3s6&ds1nV?3R<`{3>YH`$Z?VhF6^2T0@~Df8$Zd8A-9!*v(HZ=@RaiB@rj$?~v+`a=$-Az3oGVZNz013*f>ti|z83 z^0*tjk55EhdSIujE|^0q=*1-{7#gJLQ5LTf{RLvxRRX-mnpl#JD>_4*)8#)Pd>E-? zX?!JP-nsQShC`?4W4m%fIl$n?eBEV1GVt?!A6MtOz zEQ7hC7jy&tOX)prHp=e{+-p)n0MqgF;5S?U2F+AfF|2ZmOQ3O$xwnf#cUmCsm`EOF0 zvV`YXJrVB?4^2O2@&R2e`E#?)jPTksXR=jOd}*9Zo7J`0!uL-+H1PESsq68M*Li}T zD?Vy?=jDxsj7`FBf1TQBJ(U$Vd&y9RmhLYa!}PDO7`-a(;@gc6%YDbXM!@^HisI?R z7CMYcY^Arvv1|7#qS?nHgiE0c!-e)dKbwUD`K2+uy+-R37~%zM9f`RKc&wT*FPHgM62BwB7y|JnuN z$FJK#Jk%#IRxk$K|D>3GY*MnL3gUTsA=U+jK=IwxM;~tMboqO-Bpb{7;D4?8>m|Dc z@UM~^8=ht#SVEKnhI>+kt`bOoW12l1NtGd~kpJ^dOe)rp$|;fJqhK+~?M>c$VG5^C z>Ax*o9PK1A<5X87d&7p=vL*YOEh<4TH&mi0ltn@k9TVng-4>9N{Qe{P1DC;qs998V znUGaPF5z?Kws`#Ns}p3lK|jeul^&z6o~~8aaY}RUspqO|IVHHrBR-=kN`9eUz`-Tq zGP5a4_^^ojE>Q;0Dbc6`75|V+If{py$JjX2BQiacJ=XQ*SYvQE*+AX?pq><>(0-Y1 z4b|$p?>V=A*c%1LO5lmh36TwDoF{qNqckQeO4J*Zc0zgIN$Ho6uGJt-LO8c(W+ro1 zQeQ-ufc;yElM>Wb&9TJC?3n3Y&H0#uPwN@$>pqI_A$@eCARJG#_q!gBDd_~^P&>l( z^-q`~?}A2AOd>RO7=kL-*455wdXa3a@UVxi>mJ`22Oe3x<-Ykd*Ur%1QXPg5oZb-V zT5De5c&~~>T9*wFPrT&6~wJjWO5*V_t^qXxn;8#F7#v^eVN>PRD^kF=CpG#B(L^ zjEqbHv*+^%UZ$Aan;wjfs_%-luPhRBP^Fano}?0&Nm`|xC%XIahOsOR@Byr^z#Cg! zJOLGTOO37O`$R&=_0$r4BD(e<`|15I@3)n~xihKN_K^4G1(3n93?E=CcLZ(9excb5(NlbtfX7TT&C`M<(o z$~X*?nmr;|Fgb&HxqahTV~QJP0%7Z=t@=d0BLfe)%d`Vax;|97&S2%6>a@!{JzwAX z&!u9<2OguYME1D*UVS92<>sGZ1`!ZTH=2|Z2uZef2ULb*Q>qi$P<6P-yS=!0OuVJX zv)nE{Vck*O?8ET1-t)eA^FauYUF&j~aw)kpW$&g2O@6cs3uU-^ik~@*=N6^4jb-fC zxQZWm?_1H2N39xtF~wQ zVFvf^9=|UaKBn~N;6FmWJ$Kg!hvph{POTB7`l5mNu<>P@g=4O@Xhq}&g$!f%f-%R` z7Ag+3ECZ=v-wOO>lbmUsp6}d0{MkwTf@_xGNvAub zZ_?{;ytW!t&o^l!Pq&>f9^X}|q0XC#3JIple!O=mgs-gNJL^?`Lx;5)7jlE{(*V1= zrk@WV^FxWN59(6l@UGYt?9Fnpooe}-dCFhgneBh!0?f%{@n8B`PWg+ESVwEWgzW!*tO4zjvZ}UVH?QRCOd)nf^;b2Gm;tBQ@$2Wxm4@g)_4q_&{BFqo?i4dgk`D8+bbM@4a;ZrW}ZRR%5_ii=%t(}a@EUm zdiPB-K6!cB<|Y<`oT+Plq`g0z&NM3P=9li$>x|}_4zUYw?q8WcJGlAB3T{jGs-Aze}j6jH|b7J$}&>4NPVy~s9D&j_l#x>giD-0y^3-VQ{7IoyZafi zBOg&Zi%J`IDda*Rc#yZPg!nyo&)RT1dQV}e3-^`Eq zX`tq4f`JHRP{;G3s%QX#y@k-h@CVGNZy5qGf-W zMaVz%jXyp_#76x&dj7;1=)!)SqS)Ps+2E{S;ve0Vs8x%V78&5XCn3G*cX{#4=doEs zbz4{%BB;3jqZjEubde%;xT37ThG1+?vL7!EMZcc#`NiQaf0!9p|8Yoe!CqJgxOJCz zfUYuL%}zh(pNMTdU@PR^1;vjAW~32X-41a;5`r}xSP>)CC4hQ>SRu> zpjo}dKoFvr_@r;Q4jp*{AJM;sGS4_v_?GjUWbXVuUaWyAg7IYn)g#M=j3vObfRM6q ze>8|)X>$ulhV0KBY@M_sWfmFC>Nd>;WhB4}yxD`6SJEA-nZ7C6?8j$Sqc`)?krDmc zFtKGKfEiQ)NU)!$1+g^i5P4r_mSwBNXr$kfRF8Da;);{!p_ z7KH)%QFvFf5DZt-RtJO6`-?`(o(c4K|K!P7gmpZ6s+mRjF|=iYb<6A*$X6(3^l zg!=tb9_gRKcbx6KqkT=^Sw9zr3*Q_r)@{SQ12MY>k=t-ICDmYr#|n5{DxuOR(JtC$ zB?XbO-0?x#nQV~vlkz+se+YSRHGsNk?F$Obx%W@Y#*|PQCkiPaP{HDF*NT~q5X$Xb#M@MK9RzoiS+~Ctb;Q8xB`yrr+ zCNHwQ=Vgs5bHyj!RA}wl;2FT!|3H{JWLv+?_vkmv!@ou7>#q1#K$?pWwYdR%O@Z#(PE0IsH0;OXHSG8h$A16%2vreBH9c z`*Q)Ksg9tSu6fb`>xbXKB+k;XJ(^;B5>Rwc5r(0+3Pf}Qv1-3mC~3?$Ur}g(fZ4hj zx}3ape+9I;c1THQ;pzMJq1GzVM9fUL5}Z5tm3JhZ5^U)8*?W`EkK1HAXHB0JFjsry zGE_X^7f}>H4c7zIM;=s;fShw$N4Dmd>~6`GOYJc*^UpXfEU-!Ic?dB2@ph7Mn?EIM z);Floch|eApG59y<`m_>BME-O3XI7l=iB!cS1Pz`R9}uc!HZUCH0m z_k;W}bKuV{@*^dqzAJ^JMT73iCliEvaRW5tB3nOYCF*B>Qk#&jk${UMYa-Wj~@<85738I5(80>_TCt zhJ7-Gj})ta3;ujjcR7HsTI|2qy9cm+)!Gs^GWuUVAJS4Bu{Au6efQ6uo4NWSJY^M- zr5`|t>?6ry?Ad-d?<43j-1b&zO?tuXE?&pcV8o|@{O1!M$%JVonbOBLfBh^fSb{A< zwDrQB$KWHR@>F-Iw~x(q6&p8lWp{M+T4U%%@^lL{kV&cVM(Ii6ymnkUdigs{burp&bKGjbd1;fPJ`2}J-#z}HZB&bvA4a)8 zlN1Y$JFpn)As^t}{hH<3Uk>Nu4YBG3R7k4_R2U?Q-5p$twC{h`i{j-!DK-+WGYQo^ zdowLw8y27;c8sE+IoH%rwmcY)NJ2RQG&ndgf&)9t9Ydh;|k~xfvc_XxFIM0 zS*q6YB5juIpRMiN<@6A0j@9v+vY0(TE9Qi2YJ3G$qIRygUJRnjSf-#(HT{G1>(W45 z$uy##NfrUa*fRDP@^4PbNWDO#*n^50=@>rNfb1BB{GUtxzamT-vNYia+<>NDPRUcw zdUetbsPs$$6iGJj(=B2;&Kq_jHq9FZO_O}Z7`wYsLV!EIJg@rMt^wrTQ%P(N6trC9wdg6}>3;WRAkf>N?zhBI% z|7IUTRLL`sHE2WhesfnCq?PZiyzkMH-8D#aAT8eu6;EWn%c9g4PHM*V1?k&3+&o{l z@Bw%#GLhmc=H1D2Ki^j2zy`cf5AV;r?`0dwU-B9kT0)^RkSg~OWuQPPL6+z;RMMo| zb`uPH?ZXfETG=VmS7;SkFB15gyYbEVeqvVH{XcDDa6=wp@`l7^MvPn+M^BwSdnQsy zAOxLsJgE&~@mgAj_>GaSH}sgJ)9uduhv}5I{U>K+fOIH})zE%9tyn@yUD|8O0{Vef z?z0_|!s=Hhpvl)aR^z&{a)YgG@PB@pj0R6KJT-2|7JbNSUhe3n7=<7d4aDz9N%mG79N&Jtn> zX>MtU_CQN;ZLpQ@dcp}?hnrII=q@UJYwrY3g=&JTm7o9rcZ*@V=w|vBIP@gN9Nr{+ zw!lf={UuyQT9DxxQ)zQtm#Ihxlbe(60nLbSFW;A+@_e9ER?zVmf(z_(>^dT$;y=<9 z*(vecZ{vwJrJxg<c`=yThK`aO$Z z4R2vu;!oiMu`5){@}V_(D2G7!OTJKfD0Cr$W2M}pqMwT&{X@X^@9)cVq0uva1kqCA z$RDcYUf-B3ZTc;o2EFVW1R>YjIdtS7oAAHyh-QEU>QnPUMiV-c62EdfkHrTeO$&4! zdjGe8^4q@UHo_E1DvjhiH}IhiqjRr|W2T^CJq8fv6+grOe8{1pzAA-%ldn0 zz4ZPBdB_gHAz*D~_~lrDIS$Li3x?qO62J+~Dz9%&zeFZ7XE^@*;j9G13i6>w;-T;& zj>X}v^g-b!q6s{k){y%Dc~Vva8CZEe4J?eumq5yA%?=sUK!j|}+Ri}V0MvXGScF1T|Ic~Au(7t9;Al+r zsqovQTV5RO3PD(&j9|fhCT}cKojQ?G^Pk_3M&KfO4RaaK&^%g*%ee;djtYPWj6-MC zd1q;$ojBCyzt2yt`VD&@fsU&w7O3fO^;1t*+cIyV(EM!D;~cR_=~DZfqEcP3e5IK<957r<5q`ZkrvZqlbTYb zO}q!F2NMugbAH|@_MGaJ;UyRteyUffUj34g;RAHfoxXpWuLhPo1OoL7q!&3455Z@~ zpky^K{@b?QLAnfbch*ZVVB#m3Jcj^{Z4yfbwt zfUPZI5)miewR)%wSwp}@kG1GGddTVipAE~41cORh7Tp0COx_%W`1>ceZ*q_VWzpPE z2y*7UWx_l>P^)J;8LbeODS~PkI*f0$OwjF3)+b#WiU6 zK7%eM)$t+vqJK|k0v2|d7r(F%xxRt~k#b}VV!avSt}ak&s6_&q_G9wV&t;c#Z$ELJ zYOaR2D4nz%CD1?-^$VKcj02{%ZV&dImIn)wNVl$7aE?Nekhb3h3DQ*>kd^IV;9f1h{&$4`B?V0!g)h zWpBGpf^q15?->X%AKrfR%)iG|7pa4-7^%%dqQhE-+W9;&j=()KrLUJF$!>gYckk7~ zvMcA(!Zoa^uovcbAwR7_nCX7uCRpoWpQ_e@=nXOAM(iiP2Y}g(<9YEn1mw91HiYDm z-hmLd(VFfEHU)yF8enYj*@Ma34{skRJ-^vu$8rlOld2(+Z|GV^iZdoo!ags6QsXjcU z&Ic4Dq=h~}t33u%)N7Co_*j>HaGGujCL}8$%}@UckJIpDgjfF|r3fVg@3>HM@Zxa) z-0J(sX+ZG#xhk~X+whg@U zLTc*4K$v%`51h3G9$I(nTj1MDm8l456Zumb*joRVTXHwSB?>e;KExnY;ztOOdBoLs zMRy+m;-E@BXmYPX#Gr?+tO3pDGlWmBJX5%;8%kHf?@P_biH&vdYh-Lszr1ZFZltO9 zry6{Q6|CwBBV$h(@&q-zk5D`xeyGXd556zE)zvg^Se}Q2T~9e%(4iA0gIQ;myXpH< zy8!{wKe}+mV&NNrH%8&Vb!?+h<7SAN-*VxxbE=wuf))8QVERmAjm$g&|Hhh+N*KHF z!u-ce@^wyfdLyNm>BW1%Q8%l$!4|>z>GJ+t@<_EM@JUQ$VHPkwU)4q?-3$7@G$X^2 zc7l1ofeQQj4~8aWTf&QLMb{-^=MHq5)QQ7rGtJQxGxVfK%W$`HcKdX@w2sVk_} za0VAUw0?hIH7+|-#NIN~wYhHJ9>|HM1;-OZ`feaJ1gfo_aSV&78^TJJD-fx9$fjeS z|HFFx+nt0(z~X1j&cJxS@Al0c-h4+doZdKFA%S|y4-Vk21GWMbiQwOOnr-efjQstQ|u-oCR{`4 zO7q9WYk9Aq+rFs=wyRNa6rToD*gh`PM)ws+P_+LCS^9rhr7(@e7BPbLU5OP8F10V; zhdi`GaWZ+mRS-0jFw0BrzcDzPN;w7XMJeaj%znuasgeBQd?ItHfnZEbGNrs9#eDvv zL@7JoVG7Blfb@3n+2;X#OjrK(W?lGTqmA({M*JRrCcxAJj?-*{rz$t{a-r4GYbbV# z3iDQ>&Hc9Iz|-0T(EFZeN_C;lJ<270ElE!Gw!uq(d^0MT62_G^F+9${W4K}z5N2Vk zhsq}b!YSyG{wPuJf|tZ`#Y-q@APqE9R`LagR?mIF`maMMp}Ff}Fa58hXH^6ztFmNi z#{&oJ6-zJ(JJOf*qdS3W`g9?2^6*WleU8EvwnZ4j)%UF(*>SZxq7RShUaI6XS?pbO z*UjL1`W@<#{fno)T>kyo+$-fuf`jw3fS9>hjz+fpB1`FfYFmC=&nNf#WB^vbHwZ(3gYbJEIU( zEHGfAX9M+#pTf4Hemi#HJ;CSjd5$|dZ$d~h{`33xI>0~qqJb1IE#(U!$~jCDR%-uz zT&O%Xyv06jtyCrANOSoKE(1ABfut*dRFR00F2E((7{V5&@7TMvY)@{|J`GTFyajC6 zG2xpYnm`f1aB=ii`-3J39C2%f`r)c(dAa7 zd$jDGxwozl7MxdB_Pu}e%lQ$*|AgW&F$6K}^*#|x_!P@%yZ{@blgv*44Fx%~cpds+ zo+{1z^GC@=HTkY75Zm_u6vZ9Q)hZ1G(GAe-_lU33;`uj}Ghl@G7Hw6`{ySP0j&4z= zF|$T$@CXHDzr<{8Xr~J24R}(?jg!(hzF7MMQW%~wsTqPv?NhA`^&}WmcG5s3Ja8JV zh@CvtmAC};g>|Snmt)vfKEO~WCXCJg#6K@qM++QO4{?^y?~Svj2!^i0D5B*J;Y|%f zJ-pjQdKm~r)}V~(CgAB&!g^w+ko&ZKbNk!WNV&#hU4%t;wDDu2+#Vr=lf}n72$ebl zpMp8f%6{Jx*~MFt$phka z#DahUfY173_a@N^S_`PfiC(52km9BhyY`y$dZ{H_;}HK9c%@>H_M5gaM0pyN=(Sf* z-SS8BfeYELg9Y7Evp=Aeot1xWAWs=_XI~F%-%I$nW|m$4uJ#c{kK|X1tXy#DJLVJ} z=wUUlXo4YzL&%|Q0C(z>Xzrliq|gC|%ofa84>4YWasE)O+r=|GGjPRox}ne3P28+2 z(G3}_4WwRIyLA?N?^(g&ZlpM$Deju{6hJR?&q1u1Ze`}>3+1b1R7`CMw)yn$YRCBL z|Ir*!3L@vne_g}_&d+h$V5DF4Q2Tz)@QHq@ReotGxj4aqp;q^e?j%l^z`Um~4i6f3 zm)~(eoxN*owQ~KuqagJF--5b;?b~i0=8wni?<2Kn&llp@ZQBSS4*_(FJOfx?TOD`jtfoU?WAl9OfT~za2sw0bkVXG$B{WwY1ck zW!h_tMFN)IvfW9D+_9V;g#_mziTN-$#SsidpK7M~ z?*U&ni!P_ML(r_n^bUa#exl45P<_Ar`D2~)R5JuUw)g9TdNak#s+`A%y8@tjfKcPQ z9wb>nd{hmJ3T>~fp=i7gyp6jbr_|U*0-;WW#L%{C!ByzVE2XBA41m#w2{+aWf4+;4 z=0=<*8%MW2jD^CckuWCq_7>I_N(xIoQEOX=&Mz1TujSK_5VM;;d= z5Mnm}ffpg$OEZa7ueSR%YHt_>by~ayd2#P&zFU@W=I0BK-_2xK=6l18Ip(YAzq@h` z^4IP6dQEifL(KWDyFi?1)|JY4@wL(yC~P^vu=#F?jzJjop%N3Ndp$MZZ^gD28}~q^ zU_$9;WvgE0t{;>c0_0vHD9l*75ik*ZQ=EGdtP9sLw!I&-q)YH)`$j(Y^l-=SZ{Z@I zsu`VNKC8)#k7dP|RFMx6@6>U`B3u2#^;2HlQz-^37ck3<7IuGs8NE5&6@VdBUq$-?U*559#G&5}M` zdIx&BYY$!_&1BFXsh_?HGY!sAU5cn0RXm~Zp0#!MlrLsFbVuKmziOsweIP%=4906F zwbK+Gvp93?@+dEz!cd~TWm*iBI`d-^+ZYSz3YgPA+Kf@n{7Q?0iv-(s4z}ytIrgWp zUGfBjobum*rW#Y}u@j?$i7{C*~ac@sPLkkdpac5__T4$d4sx zfc7qP5);at&)@}sNe>i>g@nF;6u4ZuS(aRtJ9364!-W!VUN9{N38BivN4+*RY`z$Im_PAY0%_oQ^j@}Ud+WbWA0g?GNdCw^L$fAY!s z;U&|V)-e5BvRxaTH}81`TWE(Jr;^GOz)X?&S+Y+<*CTD>g(bZ<^2TwjnZ#;FS#CbIcU!OG(}?CWu_@^9-Il@AN*v^ZjZo(Gs$mX2N;K2s zt94XqE$Oyaj!^qkbV?|#ZNzlDNlZkV-O(=&TXTdecRhcYQut`z5_I76-H;BJLbb4b;f4GrMoiTNudYD&{#i*y(wBsok1E?2Qeg4ZSoYdUD26vqLp)r=<0IJ^qWDL zykpcZI{?yZv@HyiWx!NKO9_i@*m+(!aWaI4?K>1#na>_=eM&si`7TEH8R>?gK=U)W z{-YzI-`Yb~F;x(DoacRVcM>0a>ijGxOs>c#O35>@zdFk{koYt<{>IsQ-G5%?BLWWJ z{Ai=wfW(QEuSIbrPlG{hGHUn?D7&S$8ut5xEp0adiuD0Taqd2l;LuJJI|swj=SzBf zeNk5wTX}y{RnoVfQkQ0H4MF-)RtNJf{u&DWe%iA$?J=?F!Z1q7+Da-#JE9JH-c;p* zC#*%{n@bO?P#xT&L8sSp$3#YSpG8+us0)<)_jVRBC?or;3j4dj~EB25LPbq zYx8C+39}ZxO@1wTUYe=SBMR>1#K+OBGM59#D}7n{F7|JM6$T1_y4-P5_hQEuV0#KkQk8~nrx$FEtQmgYq1p) z(L70(>>&+9mc(TD=#ecIrENskFj{OO+4p5aMY3d9vb^UWJ^kMIy{`8kc)RAB%XKx& zJ@@zip7S}M^Eu~)hjLv~te^eXI<0O>PTd~M;%cn%2r{)h>R-SVd$fWV*kco7ZC;o1 zU;)BhMl98$WO0)#FqEONAUfIFY+#G(sNsi%hR?a-iynIvj5Faa$4ze^C6W|EN#SCv?Iz|#&1wg>Q3}-t(IdIjVl|05QnCn%=aL2<-S$3wx z0fYiGtLHx_MJA*6!7IU?yY)4(K*U%f0@RZ6bdI^L@T&Vn!MFTfX|0vapZtpzEKB==jDG?7}#G>IK64UyL z`>Vm~Zv9qb?~Y!G_Ra*{xuufXm=0QKs;a*-eMXR2JC8IVrJE+@L`l8CZFIIgFZmj;{Y7GYK?7uExCvpKtwqzVbziJ?E&C&_P zl~BMfD&;EF1~=S+DK_6@{mPsn8I=w4xFgm{cdsoxX-vEXqnRu}F6NnU9`uuQ( z?ly~-fwz^~p_-2XWEH=H+eKXkOyJd;TjB(hzY5)~Wwy;iMtY&ht!v#5+R&rB*QR=g zK)iM1Ck|9X$edV$K@%Hoyws0=XY@2?x2e`;Lb*XarCE52i$2PGc@|RILyDsU$&+@0 z1;=89uQABi+^1@v;C(^%!B4VL90##j0Zb(7$L>*C{*e|!nsyv~Fgw=Wo(QZKAVTBK zF8YD(7R=Arg5z(7Nq^6@r3tKD1I1p`Hk>X*x&o~&_mUBx98A=`4JrXfSyGuj%os%C zs%CS&hhO@wKO$tn`U#{aoD43qTDT|(>kD!_&q^(1d8*dii6t@tsd&mV{oYXE$w%s(}g{FtZQyfE`0!bl19=cty?C4nFY!G z>^9bk%!MWlb!9z}3UNaEj1aY}UmM;&riFKiZjAp{Z~SU=B}dRf86K`?+dEg{&IE}W z{D9)`0(N`F0&F)7Ia9^N6E@^QN9OR7a`(gs39)boBzAFK!I~+?V^xEM zEV}ZYMp9$AY|F)yu`6}4yQ1c8ouOFwG|jXz#3~$l_)tLTNV3L$K~u8+B;YW5Nh_+G zpXYM_4ieq|d6f5;ri&T--`MT zY8yL?Jjd)&=lc_!10|GsZ=&7VeZZ)^_Y3CY43eu~SFggGhQzPDw3^PNCOJ&A8iz30 z_5^2SI|4ovRllDLU565W`7n8*A&?BYlHL(&U&T5F%hI5Rao#A&z-aqg$o=F&F+d@i z=o068epCO=lUfr^*{o{RAt)l7Ue9N7J}3~dUi<4M)NhxnH6yG(`O;0rs}Yf`xbVlw ztezs`*Xk0aFC@?{*wnPPrm|sBgMi50G+x@e06cXHvL3%uu-27wO31oGpPm!1qzGN$ zL5hYF3SUP0SPXIwzWkaR){_=-J8{JH7xe4=L>Pq1@Iq?3x|}*`)jM+C1xxX1+9G!k zy0%mu7M(cB%X^z(cTTRvMDcN5);Kl}`&n|%Af6*2tl*#I9w-s7m)L2AT^8JU5b9=; zugcUG@X`~#Em(V7z`We~Th><{nUa=;`S0Hc+}}m+P~LR`fB!Hloc#x)g&Z)?JA_2# zM99|%%(1TY24fFKfy-UW9b5s`YY=M5DuQg}R2UBQd~7$=jMq*7jp#QDFnT3;k8ga6 z2sHX}mTBCHt)Q1K3fQ|aO)3YNg2sDK_cBev0}P}ll=#%h1yxQQ&o~4QHDEthP9KkX z4h;^)Y38%OLgY@lxRiK~a?zCDaEyz0iQDABz!joq@@1|&+ZgA|WngOM^$jV2Q8$$j zqrnZ(t43$?<)=boPkgik+tW$m;5b8{-YiQEk)sN-buoO~v2*8N!)l*Xrq)4;(}btKt@{=PNPYq@ke2FS%|h8cPj!Ow1512phlU^SxYM=EiSi;n^XqnFkd^ zDcyJzkrq!VMju~W-mEh_Aj>ba7u);LwFU0a1RI0yS}fyU_P&9H+afV0MIM*t6Sqp5 zHmnyToKe5oA9j+M$;UpZ)}cM8viX(D)p3jZ*A-ZmK^p4EdLv`^n~Le1^Sm+#ZlrUS zgnyXEQ=9I!8Uo?ao1=RwTeV@};d96*hPdW1K!nmw#fkX5s#22O=vDgp2X~w9*Z<3% z0SWd=C^aZwSh3Vz=GBi>3isqevFm+b1jI{QfQI8sBOfp_7d+HllgaV?VfH?$WUf3c ziH$VrN6!e5=M_3GBwiYaqmy+et2S&kj;!3mKdeBk=j-3j6Cu2aZ>;XX>QA{0^MyYi zYkC+K!gypG&{t6$))7gcgZN-hz$(;huk%fABE4w8w!RGM+?;Bp>`yw?QL)X^Pn^5$ z;}wL-1Q%hu%ls<4?lWB?e*kbQ;gboZ=Q)C#iuks zdtOwd@#y+ptze;}q%gjCx_PL}sXGa!X2V~&jxzXiP1J84#Y<5qMiGcag0LtXY&csT z&wi12d}(fS1NejF;MOqt(bvSTyMXG1xug5^%8i;6nI~Ht!?o5n#VZ|JKPwV32efr= ze#@oiK+5^u^WyQt^8(5%i_@p>$dEQXO58`Pukuulad-yO{4m8SYq@=F8vVV*-1z0Z zPD`q>n}gZ9RDsMrt)9^6AjRA;sr3HUP9TmSmQa>*CfUE zT=4}kR#8>0U+`@j^)?A;AE~N~D4KpP*BHw5|IVxpJ9+#4ZKWq#D#k9XRF-0U(@XS5 z+A?BKOe}L;RPdA-;EqX1d80YX9VsxwqF*9gE}vpg|1r$^OQ1Vk3?V@;ati=T;vmcgN>k(WDF@p#&JRlE6$wdSiOVB)T#P{CL9&OM7P`!hGjf?8(9( zAfB1dmyF$Iu(@|RkR#(K`eJ6Nq^hH6#74BPe1C`@|7QMdu{8B)E6 zse1n%+=x`end-Vxr!mUDA-Es^_eurH;)9yM5_9SfOW2H12g}#9@noUo8gvt3LXUY9 zCm;*=KWgb%{aScFB@BTPF$-^ken9E5^PrE3+hsub?tVh01!}5f!n<=(_F-T!YMsCnWddGnVYOK<2&?`i?jPlbQ=Ry7`L>6^`)DZO~2@Mt#%|xP3T# zi+R$~cU8g_hS5n9=yI!K3~{>wIEE}pg9P^30Z9RxiJ z{Kv4RdHtOu1r!Rdg8C7abf{nr%B2~7$8d{&EAxJHsAmU6NOBQeGE$$iq)W4Y-Zp@D zpYsu+;fhi0$ty$Z0k~tmo_%XBl64^2I}CiYN*`*v@#ip2>cKI7Re$su3U32~grjBt zQs%r0da8V+5g~}_5+n!QKx~A#VHgA)62gvJ+=YyB;6hck7N^v(5M;NkM45geluy8l z93h|L*|-1|P}|+7+)JY;TMR9?mtChjv`f$TpoTolO5=!CKn*_tgPaH1?}{Vv+@yOa z{*C*Exs>5__8&1CTMb`>*C;vRN_-GQ53x&8m|>74H5)a zE>fv;kVAIk9E0Y+=Sj@UCOHv>o`S)IB+B**qFMh!s46D-Y5Tv1h%k{rLj*G)DG9oPnT+mhtb`!%@mshqp-N zdSv{2k>RwhK2%HLYU{SuWRQ@iADyxbi= z3$cSJkyqxNlh~N96iI}2WYaPf;M{$+K_&7nyJGT{}G#v8_P?j@8Y##E25H{YyhoVFmBIs=d}4-EMO$8`Yq!?hufP=8 zv6!QT7m$|jMwS!i*F}HTYuTthvX$u}upHo78U!951TmK&%RBA9&#?yiAizOc8z*4e zkf@bX--W0H&|qA$O}-oqGmK_s1FkyCRlGX~K^`-`3YORkUhQ5l$ryude$mN?L__bb zSzX!IVW^gYAuZk%$|vIt3EUizv(_KJI-Wc=C8+HA{Pe%)VhY*4S90x<=v?&4vYdWu zJSlLd^vbX=rCCoNNTl~Pi$XWTlsQD0=Fq=8kwpe~3iYbR%R4)+EVRFN1W-%()&tq^ z`C93-xm9R-)h`g5HT9g;4!oW89NGi&LkZDq$(NwH+JcK|lVlQIK&J_T*GNoj(MD#l zuLHZ^uHj9Y$GWsb%^(s*U1=u$USzQ{Ao^=sFVh;gw_IANhFtLa=OF(`!~N^0sC)9P zwI>YwLb)ap#Q{u1qty|fUgGah7mk(!E1R=E4W>hY9VsWeLYBX3?Kmg%XGIZcMY!}}CR3#; z;(rYF$v6jnl}Yp`P$?Ab|Da-XiS0U(@`TdUKqMXe$$+-z_K--Mp6EN)4KOiehI_M~ zvt%2HhLPsP3HTgRmH6XCx@|q77>d_=pFwn7PK#1#=B_YHP;ncb!MF%|SAQ6T)NSV7 zE824%92lAYkM2Wtvs|v>K0_e$_7ycB}eGa zt-LkG(!1+#1B+a{Q+(m?Z_5u9~LGr$-ftp~a&|Y+tJellwS+ z!e6!r3W7dpL_9H6bn4pA=cM*>67?za_4+k4{7I-fXultfD$-|v(ednz4Bw5J6pn?) z4ZE*j%R`J$wDnV7d2suFy4DvfyXamy1uW`oj8sEws(8FFDA7hBWun7+bMO^(>p5HO zIR;n6>Z0c|l06NvNpg)~uP9&Iu5=TZ4}|NmW$Tmb4_ZF4-2!Gap?leQcAw{2qfri! zwd*?qCQ;{OA4DbPOZ`64d(j=dWi*lLfiCFyv*@Wk{{|EGB3x}0Y1;^0NMHqREJpjQ z)LQ%RdAmP=%+U$0ffj9oY~c4>M*5du^g#QxXGV`Afe!ncbwM9%O3x$5Os4E>gIc2g zcFka6IR>23zLeGwf_D`=Nr)^b=V$-+JqgkJQdF+-7?SBrF1+Kvcjb;z?c5^plce)8+an$@S zRJBsln`_pJi6$P%scZ?h6SGChD&<;<6uLo@Co?$#cjXI+CisucB|?RQD&~T=|F;@4 z2@q%h{X+A6$KzL})V8?*ur^eTBg^0-$gb5-hywU}S%o*Cf}RuT6O>FK6a)!b)gE7V zKL7R*6y98kl2SQ(G2J%EzyQXYW$#mAS%QZ4IS^HB%eX$#)TB%uFdLP6OcSWR`8Yjs z|N3ICo**wHDm&*42wN?-&5w3APsd$Xu6SGWHjjEaegJyd|N3s_S(j+~8yozMutB!U z+OF3CcMZAkxr{?ep`wSpl#I3gZnZjR!9zb42L zuN99N&{_`!7yLCH)Qby@Wsnv~C*tBkBRiD|ccB%Ci>_YAC&(vt{;WQ&?Ybp3IS$tZ z6Uxv2B|jDqn8PFf=(hXeFW>P;o_fR9NcWz#PqW<{933p~pgxoBJarfM;XmO|2MRoQ zP(Cod5~~L4RyCJ(QT?_NB?w0e+AHGu%LO2o{7pX?- z|KL7QTabM64be7XcA!Eju~7`Z|(XKyXyQ)ceYpqJ4X0Xw|sF^C>a7nAUIb zB(zth>TAA#0j2R^sr(g^!~S_{pXeDr&e6uwJ86X*Dl5x$XD?w6N@80ptJb1z7z0=L z0&Z0CuJ;W;{(Pbtq|lPqn-;AiLBSzbj8FwnX^rlWD|MMCoGnlz0 z%{QzKTW>!7z~g^5-!b9wZ#;m)lXOH?;{TCe&1O*#20-+MY`J249R1u>z;J8#6Qf(hDGbiVI^3|+wdoM_3o)ca@U zpdWtAzwT?IA@ke_IL82rygRB76^*CIa8@2$-(+=J0`#KY*AD@nY~-**sokjj`+j z;MvU}12Yz|k&rdq{D`vC!n>yi{hZZ@pagQ>>N@Rzw)4-9iEe^@4N}-6_1}>A|BrVC btZX!QNO@4*uD7xV{vFrS*L<#iKJdQ)C<1*l literal 0 HcmV?d00001 diff --git a/docs/getting-started/use-cases/mix-and-match-database/introduction.md b/docs/getting-started/use-cases/mix-and-match-database/introduction.md index 99ffd3c4a..414d6c685 100644 --- a/docs/getting-started/use-cases/mix-and-match-database/introduction.md +++ b/docs/getting-started/use-cases/mix-and-match-database/introduction.md @@ -3,7 +3,9 @@ title: Introduction next: ./tutorial-intro.md --- -![](./images/use-the-right-database-for-the-job.png) +![](./images/use-the-right-database-for-the-job.png#light) + +![](./images/use-the-right-database-for-the-job-dark.png#dark) ## Mix-and-Match Database From 2cf58b02dcf151b457c606cbc8feed6c16acee6d Mon Sep 17 00:00:00 2001 From: Stephen Tung Date: Mon, 28 Apr 2025 22:56:12 +0800 Subject: [PATCH 7/9] Update docs/getting-started/use-cases/mix-and-match-database/tutorial-1.md Co-authored-by: Paulo Borges --- .../use-cases/mix-and-match-database/tutorial-1.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/getting-started/use-cases/mix-and-match-database/tutorial-1.md b/docs/getting-started/use-cases/mix-and-match-database/tutorial-1.md index 8725cc564..70b2c8a08 100644 --- a/docs/getting-started/use-cases/mix-and-match-database/tutorial-1.md +++ b/docs/getting-started/use-cases/mix-and-match-database/tutorial-1.md @@ -71,7 +71,7 @@ For this quickstart, you can safely ignore and close any Codespaces notification 2. Under `Recently Changed Streams`, click the `$ce-cart` link. ::: info Understanding Category System Projection - The `$ce-cart` stream contains events from all the carts in KurrentDB. This uses the category system projection stream feature. For more information, [click here](https://docs.kurrent.io/server/v24.10/features/projections/system.html#by-category). + The `$ce-cart` stream contains events from all the carts in KurrentDB. This uses the category system projection stream feature. For more information, see [System Projections](https://docs.kurrent.io/server/v25.0/features/projections/system.html#by-category). ::: From c8ed52c6052a270b643c15d2b790efddcc8dfe61 Mon Sep 17 00:00:00 2001 From: Stephen Tung Date: Mon, 28 Apr 2025 22:59:09 +0800 Subject: [PATCH 8/9] Fixed links to mix and match tutorials --- .../mix-and-match-database/tutorial-intro.md | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/getting-started/use-cases/mix-and-match-database/tutorial-intro.md b/docs/getting-started/use-cases/mix-and-match-database/tutorial-intro.md index 782643abf..2db013e34 100644 --- a/docs/getting-started/use-cases/mix-and-match-database/tutorial-intro.md +++ b/docs/getting-started/use-cases/mix-and-match-database/tutorial-intro.md @@ -27,18 +27,18 @@ Before starting, ensure you have the following: This tutorial consists of the following steps: ### [Part 1: Setup and Initialize KurrentDB](./tutorial-1.md) -1. **[Setup your Codespaces](http://localhost:8080/getting-started/use-cases/mix-and-match-database/tutorial-1.html#step-1-setup-your-codespaces)**: Starts up an interactive coding environment in your browser where all tools and database are installed -2. **[Start and Initialize KurrentDB with Sample Events](http://localhost:8080/getting-started/use-cases/mix-and-match-database/tutorial-1.html#step-2-start-and-initialize-kurrentdb-with-sample-events)**: Start up KurrentDB and initialize it with sample events -3. **[Browse the Sample Events in KurrentDB's Admin UI](http://localhost:8080/getting-started/use-cases/mix-and-match-database/tutorial-1.html#step-3-browse-sample-events-in-kurrentdb-s-admin-ui)**: Access the Admin UI to browse the appended events +1. **[Setup your Codespaces](./tutorial-1.html#step-1-setup-your-codespaces)**: Starts up an interactive coding environment in your browser where all tools and database are installed +2. **[Start and Initialize KurrentDB with Sample Events](./tutorial-1.html#step-2-start-and-initialize-kurrentdb-with-sample-events)**: Start up KurrentDB and initialize it with sample events +3. **[Browse the Sample Events in KurrentDB's Admin UI](./tutorial-1.html#step-3-browse-sample-events-in-kurrentdb-s-admin-ui)**: Access the Admin UI to browse the appended events ### [Part 2: Project KurrentDB Events to Postgres](./tutorial-2.md) -4. **[Execute Projection Applications](http://localhost:8080/getting-started/use-cases/mix-and-match-database/tutorial-2.html#step-4-execute-projection-application)**: Starts up the projection sample applications that transform KurrentDB events into read models in Postgres and Redis -5. **[Review the Projected Read Models in Postgres](http://localhost:8080/getting-started/use-cases/mix-and-match-database/tutorial-2.html#step-5-review-the-projected-read-models-in-postgres)**: Run the PostgreSQL command line tool to review the newly inserted records -6. **[Examine the Postgres Projection Application Codebase](http://localhost:8080/getting-started/use-cases/mix-and-match-database/tutorial-2.html#step-6-examine-the-postgres-projection-application-codebase)**: Examine the PostgreSQL projection application codebase to see how events are transformed to read models in the tables +4. **[Execute Projection Applications](./tutorial-2.html#step-4-execute-projection-application)**: Starts up the projection sample applications that transform KurrentDB events into read models in Postgres and Redis +5. **[Review the Projected Read Models in Postgres](./tutorial-2.html#step-5-review-the-projected-read-models-in-postgres)**: Run the PostgreSQL command line tool to review the newly inserted records +6. **[Examine the Postgres Projection Application Codebase](./tutorial-2.html#step-6-examine-the-postgres-projection-application-codebase)**: Examine the PostgreSQL projection application codebase to see how events are transformed to read models in the tables ### [Part 3: Project KurrentDB Events to Redis](./tutorial-3.md) -7. **[Review the Projected Read Models in Redis](http://localhost:8080/getting-started/use-cases/mix-and-match-database/tutorial-3.html#step-7-review-the-projected-read-models-in-redis)**: Run the Redis command line tool to review the newly added entries -8. **[Examine the Redis Projection Application Codebase](http://localhost:8080/getting-started/use-cases/mix-and-match-database/tutorial-3.html#step-8-examine-the-redis-projection-application-codebase)**: Examine the Redis projection application codebase to see how events are transformed into read models in Redis +7. **[Review the Projected Read Models in Redis](./tutorial-3.html#step-7-review-the-projected-read-models-in-redis)**: Run the Redis command line tool to review the newly added entries +8. **[Examine the Redis Projection Application Codebase](./tutorial-3.html#step-8-examine-the-redis-projection-application-codebase)**: Examine the Redis projection application codebase to see how events are transformed into read models in Redis ### [Part 4: Project KurrentDB Events in Real-Time](./tutorial-4.md) -9. **[Browse the Demo Web Page](http://localhost:8080/getting-started/use-cases/mix-and-match-database/tutorial-4.html#step-9-browse-the-demo-web-page)**: Navigate to the Demo Web Page to see a sample of how the read models in Postgres and Redis are used -10. **[Start the Live Data Generator](http://localhost:8080/getting-started/use-cases/mix-and-match-database/tutorial-4.html#step-10-start-the-live-data-generator)**: Start a live data generator program that continuously appends events into KurrentDB -11. **[Watch the Read Models Update in Real-Time](http://localhost:8080/getting-started/use-cases/mix-and-match-database/tutorial-4.html#step-11-watch-the-read-models-update-in-real-time)**: See how the read models are updated in real-time in the Demo Web Page -12. **[Understanding catch-up subscription and real-time processing](http://localhost:8080/getting-started/use-cases/mix-and-match-database/tutorial-4.html#step-12-understanding-catch-up-subscription-and-real-time-processing)**: Understand how the code projects events to the read models in real-time +9. **[Browse the Demo Web Page](./tutorial-4.html#step-9-browse-the-demo-web-page)**: Navigate to the Demo Web Page to see a sample of how the read models in Postgres and Redis are used +10. **[Start the Live Data Generator](./tutorial-4.html#step-10-start-the-live-data-generator)**: Start a live data generator program that continuously appends events into KurrentDB +11. **[Watch the Read Models Update in Real-Time](./tutorial-4.html#step-11-watch-the-read-models-update-in-real-time)**: See how the read models are updated in real-time in the Demo Web Page +12. **[Understanding catch-up subscription and real-time processing](./tutorial-4.html#step-12-understanding-catch-up-subscription-and-real-time-processing)**: Understand how the code projects events to the read models in real-time From 2020d732e0091d24a946a5a7f20aec02da2967c8 Mon Sep 17 00:00:00 2001 From: Stephen Tung Date: Mon, 28 Apr 2025 23:05:49 +0800 Subject: [PATCH 9/9] Put space back between setup --- .../use-cases/mix-and-match-database/tutorial-1.md | 2 +- .../use-cases/mix-and-match-database/tutorial-intro.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/getting-started/use-cases/mix-and-match-database/tutorial-1.md b/docs/getting-started/use-cases/mix-and-match-database/tutorial-1.md index 70b2c8a08..d97dbf3e0 100644 --- a/docs/getting-started/use-cases/mix-and-match-database/tutorial-1.md +++ b/docs/getting-started/use-cases/mix-and-match-database/tutorial-1.md @@ -12,7 +12,7 @@ In this part, you will start a GitHub Codespaces session in your browser. You will then initialize KurrentDB by appending sample events that mimic an e-commerce application. The events are appended using a data generator program. -## Step 1: Setup Your Codespaces +## Step 1: Set up Your Codespaces 1. Click the button below to initiate Codespaces and ensure following values are selected: diff --git a/docs/getting-started/use-cases/mix-and-match-database/tutorial-intro.md b/docs/getting-started/use-cases/mix-and-match-database/tutorial-intro.md index 2db013e34..2eef8a0b2 100644 --- a/docs/getting-started/use-cases/mix-and-match-database/tutorial-intro.md +++ b/docs/getting-started/use-cases/mix-and-match-database/tutorial-intro.md @@ -27,7 +27,7 @@ Before starting, ensure you have the following: This tutorial consists of the following steps: ### [Part 1: Setup and Initialize KurrentDB](./tutorial-1.md) -1. **[Setup your Codespaces](./tutorial-1.html#step-1-setup-your-codespaces)**: Starts up an interactive coding environment in your browser where all tools and database are installed +1. **[Set up your Codespaces](./tutorial-1.html#step-1-set-up-your-codespaces)**: Starts up an interactive coding environment in your browser where all tools and database are installed 2. **[Start and Initialize KurrentDB with Sample Events](./tutorial-1.html#step-2-start-and-initialize-kurrentdb-with-sample-events)**: Start up KurrentDB and initialize it with sample events 3. **[Browse the Sample Events in KurrentDB's Admin UI](./tutorial-1.html#step-3-browse-sample-events-in-kurrentdb-s-admin-ui)**: Access the Admin UI to browse the appended events ### [Part 2: Project KurrentDB Events to Postgres](./tutorial-2.md)