From f0008e71c87dd1b8700af0ff5f7f6cd644e34ff2 Mon Sep 17 00:00:00 2001 From: Abhishek Agawane Date: Wed, 3 Dec 2025 12:33:19 +0530 Subject: [PATCH 1/8] Add Lambda Durable Functions order processing pattern This pattern demonstrates a multi-step order processing workflow using AWS Lambda Durable Functions with automatic checkpointing and state persistence. Features: - Multi-step workflow (validate, payment, inventory, shipping) - Automatic checkpointing at each step - Failure recovery and resume from last checkpoint - API Gateway integration for order management - DynamoDB for state persistence - Comprehensive testing instructions Services: API Gateway, Lambda (Durable), DynamoDB Region: us-east-2 (Ohio) Framework: SAM Language: Node.js 22.x --- .../.gitignore | 16 + lambda-durable-order-processing-sam/README.md | 394 ++++++++++++++++++ .../architecture.png | Bin 0 -> 101754 bytes .../example-pattern.json | 103 +++++ .../src/index.js | 221 ++++++++++ .../src/initiator.js | 84 ++++ .../src/package.json | 24 ++ .../src/status.js | 104 +++++ .../template.yaml | 147 +++++++ 9 files changed, 1093 insertions(+) create mode 100644 lambda-durable-order-processing-sam/.gitignore create mode 100644 lambda-durable-order-processing-sam/README.md create mode 100644 lambda-durable-order-processing-sam/architecture.png create mode 100644 lambda-durable-order-processing-sam/example-pattern.json create mode 100644 lambda-durable-order-processing-sam/src/index.js create mode 100644 lambda-durable-order-processing-sam/src/initiator.js create mode 100644 lambda-durable-order-processing-sam/src/package.json create mode 100644 lambda-durable-order-processing-sam/src/status.js create mode 100644 lambda-durable-order-processing-sam/template.yaml diff --git a/lambda-durable-order-processing-sam/.gitignore b/lambda-durable-order-processing-sam/.gitignore new file mode 100644 index 000000000..38d4d358f --- /dev/null +++ b/lambda-durable-order-processing-sam/.gitignore @@ -0,0 +1,16 @@ +# SAM Build Artifacts +.aws-sam/ +samconfig.toml +*.zip + +# Node +node_modules/ +*.log + +# Temporary Files +checkpoint-policy.json +DEPLOYMENT.md + +# OS +.DS_Store +Thumbs.db diff --git a/lambda-durable-order-processing-sam/README.md b/lambda-durable-order-processing-sam/README.md new file mode 100644 index 000000000..d6619cb69 --- /dev/null +++ b/lambda-durable-order-processing-sam/README.md @@ -0,0 +1,394 @@ +# Order Processing Workflow with Lambda Durable Functions + +This pattern demonstrates a multi-step order processing workflow using AWS Lambda Durable Functions. The workflow handles order validation, payment processing, inventory checking, and shipping arrangement with automatic checkpointing and state persistence across long-running operations. + +**Important:** Lambda Durable Functions are currently available in the **us-east-2 (Ohio)** region only. + +## Architecture + +![Architecture Diagram](architecture.png) + +The Order Processor uses Lambda Durable Functions to execute a multi-step workflow with automatic checkpointing. Each step (validate, payment, inventory, shipping) is checkpointed, allowing the workflow to resume from the last successful step if interrupted. + +### Workflow Steps + +1. **Validate Order** - Validates order data and customer information +2. **Process Payment** - Simulates payment processing with 5-second wait +3. **Check Inventory** - Verifies item availability with 5-second wait +4. **Arrange Shipping** - Creates shipment with 5-second wait +5. **Complete Order** - Saves final order state to DynamoDB + +Each step is automatically checkpointed, allowing the workflow to resume from the last successful step if interrupted. + +## Key Features + +- ✅ **Automatic Checkpointing** - Each step is checkpointed automatically +- ✅ **Failure Recovery** - Resumes from last checkpoint on failure +- ✅ **Compensation Logic** - Rolls back on errors +- ✅ **Wait States** - Efficient waiting without compute charges +- ✅ **State Persistence** - Order status stored in DynamoDB +- ✅ **API Integration** - REST API for order submission and status checking + +## Prerequisites + +* [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html) installed and configured +* [AWS SAM CLI](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html) installed +* [Node.js 18+](https://nodejs.org/) installed + +## Deployment + +1. Navigate to the pattern directory: + ```bash + cd lambda-durable-order-processing-sam + ``` + +2. Install dependencies: + ```bash + cd src && npm install && cd .. + ``` + +3. Build the SAM application: + ```bash + sam build + ``` + +4. Deploy the application (must use us-east-2 region): + ```bash + sam deploy --guided --region us-east-2 + ``` + + During the guided deployment: + - Stack Name: `lambda-durable-order-processing` + - AWS Region: `us-east-2` + - Confirm changes: `N` + - Allow SAM CLI IAM role creation: `Y` + - Disable rollback: `N` + - Save arguments to config file: `Y` + +5. Note the `OrderApiEndpoint` from the outputs. + +## Testing + +### Get Your API Endpoint + +First, retrieve your API endpoint from the CloudFormation stack: + +```bash +API_ENDPOINT=$(aws cloudformation describe-stacks \ + --stack-name lambda-durable-order-processing \ + --region us-east-2 \ + --query 'Stacks[0].Outputs[?OutputKey==`OrderApiEndpoint`].OutputValue' \ + --output text) + +echo "API Endpoint: $API_ENDPOINT" +``` + +### Create Test Orders + +**Test 1: Simple order** +```bash +curl -X POST ${API_ENDPOINT}/orders \ + -H "Content-Type: application/json" \ + -d '{ + "customerId": "CUST-001", + "customerEmail": "customer1@example.com", + "items": [ + {"productId": "LAPTOP-001", "quantity": 1} + ] + }' +``` + +**Test 2: Multiple items** +```bash +curl -X POST ${API_ENDPOINT}/orders \ + -H "Content-Type: application/json" \ + -d '{ + "customerId": "CUST-002", + "customerEmail": "customer2@example.com", + "items": [ + {"productId": "PHONE-001", "quantity": 2}, + {"productId": "CASE-001", "quantity": 2}, + {"productId": "CHARGER-001", "quantity": 1} + ] + }' +``` + +**Test 3: Validation error (missing customerId)** +```bash +curl -X POST ${API_ENDPOINT}/orders \ + -H "Content-Type: application/json" \ + -d '{ + "items": [ + {"productId": "LAPTOP-001", "quantity": 1} + ] + }' +``` + +Response format: +```json +{ + "message": "Order processing initiated", + "orderId": "order-1234567890-abc123", + "statusUrl": "/orders/order-1234567890-abc123" +} +``` + +### Check Order Status + +Replace `` with the order ID from the response: + +```bash +curl ${API_ENDPOINT}/orders/ +``` + +### Monitor Durable Executions + +**View Lambda logs in real-time:** +```bash +FUNCTION_NAME=$(aws cloudformation describe-stack-resources \ + --stack-name lambda-durable-order-processing \ + --region us-east-2 \ + --query 'StackResources[?ResourceType==`AWS::Lambda::Function`].PhysicalResourceId' \ + --output text | grep -i "order-processor") + +aws logs tail /aws/lambda/${FUNCTION_NAME} \ + --follow \ + --format short \ + --region us-east-2 +``` + +**View recent logs:** +```bash +aws logs tail /aws/lambda/${FUNCTION_NAME} \ + --since 5m \ + --format short \ + --region us-east-2 +``` + +### Verify DynamoDB Storage + +Check orders saved to DynamoDB: + +```bash +TABLE_NAME=$(aws cloudformation describe-stacks \ + --stack-name lambda-durable-order-processing \ + --region us-east-2 \ + --query 'Stacks[0].Outputs[?OutputKey==`OrdersTableName`].OutputValue' \ + --output text) + +aws dynamodb scan \ + --table-name ${TABLE_NAME} \ + --region us-east-2 \ + --max-items 10 +``` + +### List Durable Executions + +View all durable executions for the function: + +```bash +aws lambda list-durable-executions \ + --function-name ${FUNCTION_NAME}:prod \ + --region us-east-2 +``` + +Get details for a specific execution: + +```bash +aws lambda get-durable-execution \ + --function-name ${FUNCTION_NAME}:prod \ + --execution-id \ + --region us-east-2 +``` + +For detailed testing instructions, see [TESTING.md](TESTING.md). + +## How It Works + +### Durable Execution + +The order processing function uses the `@aws/durable-execution-sdk-js` to create checkpoints at each step: + +```javascript +import { withDurableExecution } from '@aws/durable-execution-sdk-js'; + +export const handler = withDurableExecution(async (event, context) => { + // Each step is automatically checkpointed + await context.step('validate-order', async () => { + console.log('Validating order'); + // Validation logic + }); + + // Wait 5 seconds (simulating external API call) + await context.wait({ seconds: 5 }); + + await context.step('process-payment', async () => { + console.log('Processing payment'); + // Payment logic + }); + + // More steps... +}); +``` + +### Checkpoint Behavior + +When a durable function executes: +1. Each `context.step()` creates a checkpoint before execution +2. If the function is interrupted, Lambda saves the checkpoint state +3. On retry, the function replays from the beginning +4. Completed steps are skipped using stored checkpoint results +5. Execution continues from the last incomplete step + +You'll see the same order ID appear multiple times in logs - this is the durable execution resuming from checkpoints! + +### State Persistence + +Final order state is saved to DynamoDB after all steps complete: + +```javascript +await context.step('save-order', async () => { + await dynamodb.putItem({ + TableName: process.env.ORDERS_TABLE, + Item: { orderId, status: 'completed', ... } + }); +}); +``` + +## Configuration + +### Durable Execution Settings + +The durable function must be created with durable configuration (cannot be added to existing functions): + +```bash +aws lambda create-function \ + --function-name my-durable-function \ + --runtime nodejs22.x \ + --durable-config '{"ExecutionTimeout":86400,"RetentionPeriodInDays":7}' \ + ... +``` + +- **ExecutionTimeout**: 86400 seconds (24 hours) +- **RetentionPeriodInDays**: 7 days + +### IAM Permissions + +The function requires these permissions: + +```yaml +Policies: + - Statement: + - Effect: Allow + Action: + - lambda:CheckpointDurableExecution + - lambda:GetDurableExecutionState + Resource: !Sub 'arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:${FunctionName}:*/durable-execution/*' + - DynamoDBCrudPolicy: + TableName: !Ref OrdersTable +``` + +## Customization + +### Adjust Wait Time + +Modify the wait duration in `src/index.js`: + +```javascript +await context.wait({ seconds: 3600 }); // Wait 1 hour +``` + +### Add More Steps + +Add additional processing steps: + +```javascript +await context.step('send-notification', async () => { + console.log('Sending notification'); + // Send email/SMS notification +}); +``` + +### Integrate Real Services + +Replace simulation code with actual service calls: + +```javascript +await context.step('process-payment', async () => { + const stripe = require('stripe')(process.env.STRIPE_KEY); + return await stripe.charges.create({ + amount: order.total * 100, + currency: 'usd', + customer: order.customerId + }); +}); +``` + +### Modify Execution Timeout + +Update the durable configuration when creating the function: + +```yaml +DurableConfig: + ExecutionTimeout: 172800 # 48 hours + RetentionPeriodInDays: 14 +``` + +## Monitoring + +### CloudWatch Metrics + +Monitor durable execution metrics: +- `DurableExecutionStarted` +- `DurableExecutionCompleted` +- `DurableExecutionFailed` +- `DurableExecutionCheckpointCreated` + +### CloudWatch Logs + +Look for log entries with `[DURABLE_EXECUTION]` prefix to track: +- Checkpoint creation +- Replay events +- Step execution + +### X-Ray Tracing + +Enable X-Ray tracing in the SAM template: + +```yaml +Tracing: Active +``` + +## Cleanup + +Delete the stack: + +```bash +sam delete --region us-east-2 +``` + +Or via AWS CLI: + +```bash +aws cloudformation delete-stack --stack-name lambda-durable-order-processing --region us-east-2 +``` + +## Cost Considerations + +- **Lambda**: Pay per invocation and execution time +- **DynamoDB**: Pay-per-request pricing +- **API Gateway**: Pay per API call +- **Durable Execution**: Checkpoint storage costs (minimal) +- **Wait States**: No compute charges during waits + +## Learn More + +- [Lambda Durable Functions Documentation](https://docs.aws.amazon.com/lambda/latest/dg/durable-functions.html) +- [Durable Execution SDK (JavaScript)](https://github.com/aws/aws-durable-execution-sdk-js) +- [AWS SAM Documentation](https://docs.aws.amazon.com/serverless-application-model/) + +--- + +Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved. + +SPDX-License-Identifier: MIT-0 diff --git a/lambda-durable-order-processing-sam/architecture.png b/lambda-durable-order-processing-sam/architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..2a9647c092426003c855e2ac5a78ea121afb0901 GIT binary patch literal 101754 zcmeFZXH-*L*ESqLK|ti#072j=C{4Q5Q0z*mQl&<^5Q-2WK!AXVSSU*GL8|oLArTRf zuJj(MkrFxt5<su-q@)`7 zt8VnA`rnM^{&w@!H({{gC(TR5ScrknT^+Z(P6gGw_NG-;M<%cd=+JomHN&TOE=?AZ zUv*yi+sP7F17duAql3Q!M<(-iq}to9Y3wDcEm8uS{1#O3D)^N3raA;aUb@c*5(~+` z01O5AiQ@O1GymuE>x1h`G$)sWf2I9%>(Uuu_{Tp?uLb_OIQ{M7$weUT4CBegouG|V zCl~2=ylGD^bpHNtH~+QGi7WiqZ~hw${{@Qwg6RL7%l(h-cD@9ov+&6Yjv`2H!oDC%LAWt_>zpdd6 z2sFx5w6@wwK;Y1=k;-ZOiL(B_<2hQIaCLP~&O@GyUu_0QM$l<%#f27iQeE-l+MNrl z<=YVoFL6!%D%sABU38$~3jpDMWgEuf&<$%yK?IJflaypy-nG_XzZU_{DaHges?$BE z6^ifjaU3hZ<@0C8!>hP=8jg;o+e;LA&Jf6WLcXRt?fFA>%k{|vLsQXHdkM*@X;r3> z?0)a~(_c>+=IL*Jw~n;kq_Ad{m8m>d#edX5kE=}E(tORj2{3k`==?hYbgzuuWKz!X z@G9cxT?eP~P-PHTaY>0Banj4wu;^K0<~dbCa9^VG^bMfZjgwZ-m&$X?pU-4;Pr8M6 zPpk(H4vmB()Id(b!m$vZT5_>cnTg|+GF-FkM8_6$dL0|1mew7K2OuvNL z^(998FkF?GUI3M{h{Qt1U|5Qtkr8@@Z7QvLIIcTI1uzk9pjvxL3k}fh&k~_0mYF@< z7J}Rxcg1dsF$5C6^B~t#9R}=enmy%mD+-W}T{MAekB^-$d8WEyO&f)}LFV>&4)HwN z<_r|g)EBm0r(@MvUWRvZ6T=V+Ac>{@5pEF3DPuuIaqDYKq#dydpZ&SaZ4j>dvbSL? zejVAzVIcdw_5FfRD|19gl@YY+m%sQv$p}8YlI z_Nzlbs*7V@n!!LEYX1KIi)&5VY^r{dCStUY*$8{%=-Sxte>}b8W``*4=DWpdB43OhOs0sPoYG0S9H$&ktQ#x0n5970W=J& zQ6_d5jX==?Xp6Kl>DUS4@ALjB&{9;0R4$jtl83~lvzwF!C`(-M(NB*TKcFcdE=>zL z-D3{%jg%>S{MTTHSE)kP$I* zhh)35YOK3Y=E{UV@6lKC)_627VGg?S&2i#16fB;an(8y6fU@u>pnN+`x4!xl=WDPe zTSc&u{n4-Xd2{^X!{wEgX#QBpjd%+`%YfYqs%Cp|gu(%;t5cC?h{a9H`<0BvlV)h+DJq7$xz5)&lprZy^WW*dsXS^2+vXJXT80eLGxk zeujZp0}fZ$lHYuIKqx^aq7J^dmv@OZ*pj-h_>2`;B;$^j*$>FrgB3q=sA@q3r4B{a z_ZoH6ntln`<~JR2p;7$M$hW?JD^42siT|LJ{YV5y?ycGC97&0BkhWXwcP*-8{ZV;E zS~ee}={dkMf(J}3@r4k?u-26y%RMxg?AmxOQknE5i8FcoJB*X zGhA~+t(QED!jt38Qbw9K2fGt1-~qea=tTtfzyPzOitD}`$`d!?+9cEDudJ~A$9g~q z_Yqct5$;pj|G0b=3MPK2+nHsCcRJYHMAjkgW@MPRHnC(KmBTVr_d9W)G5VojxRH1) zr2zY*a%o_@ttKU{l~p+gN}0_)m~U5&Ly?GmPQ&C=8Wz%aeZAI^;yspg=4U_}7mjn5 z(I*S;3L;=b+xDrns)y}O3yaBHZE~q`10&PC^AE*+d|Zq@tby-9`pb-}DpBa+xEz2& z@z&bjcc&4R_$YojF)1EJ8pYXd&W1|C7Yq42f)am(Y)q}scOx(Yu8Ndy{th8m6;bpK zc|3k+1RW!Cv`=oF(ac@Q@1lO}9ZL0SN!H?$-76R1=_88O$>(ATg^uO|n0ec!wdHOj z6>44MMyq%c29-Iq`7@Yx{#Pq2zOVupKbMBR`Iq8W-S&1*2|9i{E$wzOfv!|?JXf=e zk5wfhZF>5)jBEse5v5ZXkCE%q^6IiyotYLK*2Tt6RKD!CEaHr+v&i9!q}+EDEV}BL1kWiDCSE8s~!iv zQuX|=$$&1=rS+Ar0t>Rh5Pl-362H%$matOXWS6655BSxknrNh8B4xfr%T->FaPkGGkE)kYG;1Nlx zUnoB^BYGFG*jw64nA>o#ai1p7?i3mDE(^;6sSXOMD^cxBR8qQS*tpX}wYHJjZGwM-wgiCuOVxF`7ksWd1QjNF~}5*FN5Hh*C|!i+19d8lNyf_mftbMAts zPjE>B@@OxmhWN#w#xc*7 zOjT$lT%rjqvY(?40aDM&t!CO!j|W=MZ{LJZx$3)r9+-wYz-~MN8yNla17=&qw9iEP z+=NS=g0tRu#ddFl9e_kP)Lbx2ZFljLese6=hEM?6Z$XbVc5C6D_B{UcpTjw=*DSV& z2b*5}_AIm*`c!kYqz2%*n6WE$3cr>J$&N~Py?UrJ=|(OBq~Rm4l!^iRp|U@1Tqo$( zx!~@Fv+hgr>rCE?M3Yc}#;d~@gXLx~1GSjB)>xqKBJn6KV7cRPr(N~xunJ-=EwKS_ z;o#)hS;bu39mK$$(jG6?LG?Re2I5-_ff%vtqs*4Co-d?&IDNwybC_6JSyhzhCNfgfhaoSrt5V$dl4=lu zK@phEA#tOc#}hh_RS*GtldyF^d2qhPgJV5puI3$!ZvHx#d# zi%wh*So!8hjryQx1V!sj`}v+zS$*rbz>Mzlf$obG8{%DnYs-3v)z{Y_QdIqg(fgygd4j9)w&EUgFX$jS z^2pk2!atI~gHha9jm^yG;q+0Q++q~^(CQgA(r*^M)rX?~O7U6l0G1Zws;zCYT|WX$ zE48fIvr^Nc4*-26un6$&DOYIBo3^%?u7#9?;tFY3*OO>vhFngz1!VOjAK!ycGp~hj zS7lL0zU!G~WyewYJD6x+(zK^#eatC&wq5;`!%0HUda|%p_qr7FdV>IXwRA2W>03Ae z5G-=N30zcEPv_r1{g|1KPT0))l_KSq55s6Dj`T_Lw_P z0X%qga2n*K@DD+oN&~2B0#q6$swX9Q{##T$vB3ZBg6pd{n_@u69K}2PMR_}(Bi>d& z+_E1{un9e%7phq_;|lP#)mR+=`B~T*oI8n`h~v5nJZyBlKna3rwaRs*t~@0l?X4eG zLc0hSRr@R*>nDOb!b9iSA$%bW*`6qU$4I$lGqoOx%*wO?`Kj@8=$%jWCUF-R9 z1fB|Ql$#3mmk=5gx&i`KKRi+g{IE^k)m|92U!#xla1tIt@nx?qv}on&JMy22O=1l- zKYUu@Iy}!(g?>hS?C^8*O;6R@uZ{0kg8?g~!7mP#iVSJO&Ku;X&YUyK++M!6KY3xS zkSeV!9=hi3vy~RRpERf>9*1Z3e+v;=(5!%&e;(J`C3p-~;yUA@9}m}}JI0a8VVBs> z=s1oje4>lt7xENUClf6aszr{ZvX3~4C4kLt-a3YXu&T?EH*tRc<*UU{Y2SV((8ic} zYVCk-s3o~5$Q2m{{J1O#0s}T_SB@Uxf<3=MjfWm3AaG^1BN%MKyMmP zju)JRFBYN@yV9#|+aU^z2%T2;|5?Wue(g@40bcfe`s8N#pep9&KJehz*L=rPsI2_= zq`nxr=Gq4`ZA{07^cWISYN5SEjWSTff@TJ0rgJhgHeW^Ey5()UcG?)VE9rx~O3{lC zk0&ls#(122o{cHNN*H6jUuJ@Ab?F5)5zr`-{Th$T@e`IO+0(7bgAe1(N5DJS(|3xW zP^^v4qUnI{C62oU8j z?18d3F}zuW6dOW4FatM%<9QSnZVmdkOq>!-T&00fq>01DfG=<$PC%+t7;)HWCl44w zdC`VZhjWeEappAe@;S}p#M}Bopf0Ri_a@=k&R<`j6i6ib?_6=vpaJ%TB-~C05XPwU zh!gI9`uLIWCyx{rEzV*<*?S4JmjDACo|xg*86DZ@#h#I;jvw1UsSiCnpYHV4Y=wtW z2LuY-JTZBZQxo$hZOr+$$!WTn^NzT=f0 zLjRbm31!db`#C84hj!~ZI`s_3Q|>42DSBl>`*dV7WABRB>f9%G7Ls}d`pFxw&f}tk zNa|OTUg$&ku<@{S>M#Zlv)(7`9ls?Ri011!(9WVc}xD$Z?xnXX{ODtjvO>JZ3TN>rb+g3nXY4 zDXdh$AP*zS0_IJM89qE`G_i?FOali*L7>Dh>m6Rm)5rF=Jh5z{#t)F~*DYSZzme5Yw0fc+c-?-?jXafbA%EPBGB2EHGI+hEbw!XITdlWK5iTXYSJ`7aYk5 z4P_7hOc~DXQ(F%<%Ie3N!^R0-%;FrH4y}B7lLrIypH_5D8lV3rn<-mnMaZ0kIcLg^ zbF`kR9`@!N(&^k#WX6Y&Bh0ZTrt}dWyxCSbmPyCbaeY`<^QY=zE<@@D`r695E>F!R zh54o>^j6^xVK-?!gbp-u>I7GUl4iciGYFd2_p-3))Vq+pOd?glyA?#OsM~9ljN7Ze zHom;|`Hw~=`^_c-0%>JDZ>a@PON4OVcOjG}wc!A>N6%JEHec@BV}^-RnUf58m1}cK zNCG%q3#D|>Bk?9h32e$iOg9y z7FWyuZ2Ov>2Be{1O`rt@N=nVfa<}kCtgu-m>*3!x%^0lt37gBA=_rfI+|KnpYKX2U zov)tYbSPdv)1v4sV(NX@K>M*U_V9@?TA9CY4L0=KCbfvtR4C(;op2%I_F+zdc<4^* z6I@r)01LTJcMk97Rt!k6=@o&bRLb@z<@F&%;Wzib;O`IIv5zU6I>q!OY4M@jJ!^ zmPGL!=ylep3W-g~Zp@9_DL6rNlmKMcx2<3?It$U!rcMp!kaqdoFl!w@%Z)X9z zu)5~zVQwDIQk8}&`q9GY(|Kn5Z87ymh0YvXjVJvG(m-rSgK5G6+!ewqOA8T)IIn;b z?)-zT29DzU;mE-9pz7g!&OWV~OZ79~98L2aAmfWzcAq~?-t-gGHF`vi% z6EcpaLU+b$6$Nwyb+1?!w>4m*7bh?#FnwT-Cp5&7xIxo-=33vAZKu6^&UGopE7(ML z{J>E4Vz9OrrQ0WXW%5tRxNh}35gplUKdivNDx?k_3Mj5k=-);q`Xbf7t{6Hs%?I3<{Qr6Ob;a-)Df z4GkH2@2I!^+4Tvfa;nYlvsVh;rJHC7u~VPT&*6#n=4X)Y3!Jm^oxHQi(npkXuKu0h z;*Q}!ISO>btqim=H2&%?TEtY^nzOk_FF04GV=8378w-7sUD7Z<=stf%s7i}>5E}T+ zYo^{+pO;DJrct1j#Nt=C0dw{nO$D%UdQh13NnnSZX9vTo!nFf+9a9tQ_Y_)=jFO}p zoi)i?d9c(^F^=L}F5UN>*ZD?r@o7+_$QAou&6Q8C+{35_CY{%U(b{$5l$yimI?*88 zt@Mze z6`IJ258t^mnS$n(AxB7!B>0KLhOx1j_^N=kn?eQry_xdnD)_gY#JT-+8k$No`+t zqwFa6`;F$wv`@Jd-?7wP!Y->Gm8U{mBRNOnzumn7F`hv`j+NlKl}P2SIypV%D9$O=*w17NMS9$xX(@a85Wz zh}^MEu8=LA{QdG?V7WPi;7Z%ASUJ@nKpjVE!VB0j;ox+DB`gogzsHfs{iFEk{VO-LZ#U=fvJ;{Jo}IW4H6#YJk006h$(1%(OxL!|`C zJ4>j=PlcEn@X%s?oI|1%)mbgirDA2ZaVcs?m2zjd)?u2_VRZLLQKJsnue*pVUBZF! zf7IaD{o~U)UpdAA0SqyOA_F?PBaM82UK(DunV(c zX74?!CiIJ_?X8kK=QA|iX=7LtU{id6CY9Jb$+WAhuYGt~mEeL@Md2hxi@e>YBq@~x)G zNePTxL9xPO8?G>^!$A)d4;!yp)0|%!$7k)n)zi&)9Zw&5TF~}Mn`fsT&|gQ2{*hDj zH@E&Lg(#)5Y_8@^FRWh{N!)6z$sHU`;&)I!3}4!(*!N=(e*tgqpZYX35+I`oC9%TB z)jb`+M-<~DLQS}teHj*@M#tIHg4x}^D>ePK?T4D)GRe7w*Q^Uma5VbJ7NI>3YK^1? zB_uda01#?zOIIB<##XbjjGUeJnBJLMb~B$S)KFNQGR^AkT@iaieIN8!jt|u+$8DtL zaS4z%e#1RTQ-hsM>oLy@y_$`DSaRZ<)N@z!28;3sm1K&x`z-Xj(!bH8Ym{99@u#72 z0`}??4uR!c2(%V}&%TphJ7B#LSy;u&Edcm>LvUYYW0P{SJdeN(l+IdEi1VWx$&@Cu z0SoKN<(6<(9o>=J-)uRoGY@``es zTfJz0Pf@)A;3Wf_6R3ix)>m2f9Y@aB~$mVKb~y#$s4BL zl66jtM0ZVc9IzetWu+Qz(;7+bOA7v07hFFy8tj>w;u%E}51KP9Y9mcWYh7iyc%}dxQe|hN(>&!{q-lRwV#08f+)taS_JW zSKSKACj8Ko+6_UawVAW_R>q_FfdndjFM-muv_HqLyF@S>(8*UPORhtvVz_0&cYr)1 z!b41WG6v(XWfG|K@#_(sL?UYj(dc9YNrQ|3~*UX3Z>t7Lyd2^R?@Q= zv-Kg^1%mUPUlP(Bb9*fb>y!CJd+9??^gtX&$|>EyQt~mYj-x-DTy8H*Q5o^mN`iuu6lgtc|6pVto_b?>`Y);Ot2N=McUioCXc=wz>)23;Z^J`xkA@CsdBp z0w`OzcUd*SPRDv>yH_jkv(Is!{q;5fNnYr$M7qCz%0Tbu%d27JadQr?ADb_g7;dqXVb! zZbv<40poEvvrXrmtveoxg6axSp7Fg%7c%!o=Glo`HSv9gEGC4NfI*9>pqNf{2dXqe_4F|yCb%5le2 z5yBK@7_(?L07!a{i7F?97y+HWen%~8I+QJo__?5fzye-FFWRFkJ+blkNfEHX>rYMx zGOC@ZHowzY3@971>A6%#eeVcwDQxO@-{{CBa@&g0Fj+gmCX-*lCLdt-yiEn}BN{JZOotyFw=F-JWQG5llE67xrin1rP{?;%jwyR zdm74X=4$5mdwlBG4mANeV4>_Xx%=_<`u4XTi!VhxUUs_%PynWp&P}@xrpWc^r^iy! z`;?%D#YL$*#!&39#W7kMNS`uRb3IeeaDo$|prnb!dcRDa_}^AAH7yFMWW1Vwd(HRd z_&MK)RduM=s6vyM0Z}$Xz<^K-{lFrIHp*%?Tzv*lbH__B)y_@^m1cid&`U#UL0B}C zxzjyx+sQkkb=l*CwG%TA)A)xg>)=i^+DpT^1qC8R90ElmlSfcnz8YCTn)8<}kTts_ z9xIj{bbcKY*bR43CauPBniO~rUv(X<8&)1?J2q0rKiX^*Fj9;Z;k&B#GH1T1h`6d8 zAY%B{sGS1+WxrSG?B%NMmf!JeKs;seOJ+O4JIZc|-C7?&jV6&Bld6t0g6v!oZY1}vz7fZ?SKSR_NmIFi|x-4Mn(a9 zSk*qN-vaDl$~7Rq^#iY(&v(`VQn+oP)ObQ>n(P}I$cU)w6PzB=C^C7GC%MgD8R3LE z_A<|7+EY3~Op%E@f&G;$%?{xGp`p2>%j)IJNzC-&6K)GedTS<6m2-E~jdCpaEM)LP zB>{>B#VV?KG0}xhr1{zky?obvV?ZMhdQBY-?1*xmvExL5uWKTCYMPm=Xk%u08mUKq zOIVd?U=z@mBH;QEO6`n?FD#%qMmQf0OiUz$U9lpnq@&2K-EB;q>e1$VU>kdh1RjsDAC2_^`Q`u zaM7W;2$+}#w7vW;e7D5!I=7L(bNYDOum*UO!q;2jIP-7`Nt#)9>!J}?Z*d8Y+^~|h z`dp0_=SJPfYs)389Gu4nGY&PCr3m80O9q~9&%CFnmxyfT_*vc zJve=`ZB-`{DQ;daDGvJ}96xeOsKBtKx2R?^Y2D1vLF{nxVcp&`titMGt64z%JII!Q z?yq!xQvHC>Ze8&Bcp9}i>-Ijf*8H^K#5n6|Py#>aFbXIcmL5RzvR;}lLUhf@A}kIC zd&Y>0T`Ob}re$0m$V8h8s)~)TNZIAZDGgB3{QQL!Ay2X-WH=nT$$2B1qC@2bW67Ae1!tPi2$N~!WQVlrtWIP6+#w@L@bd?0`Wlnle z$qd2AbG5oeph)+gnm}TLIo~0oXl?asB)+zm>ynDP$-&ymM*&2^ivEm9I7%xwgf*nkbS zEZ@qV+uD{|*ci!m=}h{XP1sP?Y+u0VxQ;2eED9l1q9Y1=yDHgHFM3|?vN)*D^lk0j zK*{RZhmT;d(LnH;IJF7Mb*+|jWPY`z#ng{&b&qq2K_ZVi;DvNCSwNx92rASS&pHXV zyZ)@I9>|)<#te#z%!=pRR!Vx#f!AW9wS8boNy!zzx4PU3uSBE}(*cPU17c%HtUW%h z!KF`A&LW=foKmIYbOslj-SXg4q9jZ!P8|BFD}XXE=`+#e^Q#LQ-Ly!EkBAj&ucyOrpV^z_p#i@Wqv+}yZi&P zvZLLj41&jsuFiiBhiyw`)#}TQd{Vca7+zfQ%(`ywoyXJ;LBppRDqvh8^L%A{IyDxj zYCl?gOlPovOAWCOJ0-6v7J)!J-7-{Ay=RFeP7ypIN^a6y)uKKpdD9raf^cg%NzSj*Zk7_ zX|io!McYxfP8D>1eV?tKps*`2UhUeoV02)eeAps?_7R-$~VHUOoSn=3uj@Xm6D<1D>CI`T~PyEoySQIq_M zS@dcgmrk$08k*NpvXt&K44{244yHqkT(q{)A1%B5=2|^x^%`GC64CD6Z1;z!t#!Ui z!x8r-zVp*QcW{&GwMEY;R15uBuMm#~tM5f_u}4&on1%(O`;X zMOZjx7r$csY4)bTHQVhwI5)-BLvmT}?U_@*zhabaZ0({ZD}}g*i&$P5HF$AXyG|H- z1&hw%Bhr#%&e6fPeNpvguG48I=oe4kDac+mw$!tcal;<{z_UJa0EJED zvOhYl#=CbJcVWo(3_VN`e4*^N0lJw-@m&OBzNTuZ<%)o1_c{SAY_Xssszfk%t1#A zUY7!ML``%)<`3nUBikcD6K_0W4igwU(;6qcReN435_PNmN(A>VnFJ@TA5z-G{zg^7 zMnpR#K7>$>@&YqH>X(RVCLf%RKBIRHTJhnUlVMii?5MYGZ=iU8ZgLdOlfs9(q@wx!8AcUGeo| zdOlNxt@WmYu1s>(l;{I}*9)sRf8-u5+kU}pRdQ3>+gga8i$ir)R{58nF&cWhXninr z{$gIk^8w#?gD|fq>uT1Q-c>wU+}>(L^LwK?_^vZzee~|GNfoVAYQ4w8E<$xSXW~t{ z)8=)y-sDX4584}K&fSv730wHdbhLK6zv)&p+v$g&4G9lO=7W*QN0S|wji7g%z%Gedf?~k@rkF2PR_rCIqDDTfpyX7jqy0yad`-_ce7v>wjb5Nst zPtGc=$UG}#+>E{6yFc=`88Oq)@OoyMX9t*=vBfBe=Z!y$2^$iL+aBq5NZ{jJ8gLEt zDzeOM0~MM!2&eayWeR0wXZM$TCWDZ{k2*NQAGvUOvA^?N-dbW<|CqR>`duaO?)|g$ zbRu!0j4$TA>h}BSh+92I(3tiOiNv0r<*8`!I%k`woSAx;q3GMN%1hG{@v~==X$(Z_ z0%yl7K*XR0lQI2@8*!5wG5w5!zn_s9^V_q>3e7_^AB4zvADLa&If>9OF>k%E|Lbj+ zAJ|^hIXmoaMV?N!C)O$`uV2(JF%sC@U{1fn+@7AMkiz|TP2p;=j8;t(*j9RM!X9R8 z?Z@rJ?fUsQt&Q5LOXPC#r|=Y$v0(?nwm(TEmj`!*;Phwf!%|YN-VBgSo2G~{$qQtw zRV;d}ji+LBD7{e+nSXdGDtNq9U2i-RwyQ|wa;-BT$sKcA{QQ_lfHEl5=C`8)Vq`R^ zBayg_D;!T(9Hj&)i$uqE#cdr%N0!6dy?po9OvUCZ#+)iwenx!x6UAE?pu!}W->y0Q ziuGxeLO^iFUqi4@8J$`H|gq>#xMMv)--wL(@ie znP^(0>)G-3=*n`dcdf&eX)C2A3pd)%gIaf!3PaKHN?7Cs!S1K6(J6D(;TZdi>3W$G zCE}$K3&lWW=+vXmPc4m`NA3DWY}b=PR5l9={aKq{D5}(MfeEyB%pah=Sb1sS4SR9)5Vd$2~_tpp?Ep!RdDC$V1_To1#F(n zH!US%4(l*_x&5Ox_N;8`{5>X>-(K8~v&^#nV1E=kfB1p^9#XTP1wd(HrMq-+< zC@GQH?jK*|yznLN~Mv9wIKf1XQOzp!7p(-FZ@qf5E5#W z_8%NK{_SL+K5D}9&8#8Bu5-HP)oLm;b7b^S?T-ztMJ(tu?t}$Is338{=tuVZv+TfLIp&P8r zC;&3Z=l@v-X9on8X2{s+PI zeWg*O@W-CuO8G)=m)5_`&D(PWpr6|~2IIAm=XGA+Q_wzrX=v^yd<}fSDfs=YAJf^O z3`4cqZiQOfk+r%cg$!TmTLhPL+}1&Ru@?WbW&gGR0dxIR56wZMbTl`9Sfm$KwSsQ3 zG`x^Sbh51`+p&pj?XcfzGR~tJ@qv3mPrs(%K@+hqmXRaHN-eI3XILi3PiPEYc|UlWL| zI8WM_zRmbA3dQ~6gThRbO=}(T4jIQX0zIey1lyas-7($pOe7gr^?iKLBsF3Sd&}$& z0BNJ~m&{&pziGa}{td8S0Q!3RnT78@fO*TM-3kvM6%=yxJn+OaoXyc~Uz)Dr==8$F-uZzW;1B733LhMD(&4fE3f8Rpib5YYK~Cq}{dLHj|h41*9f>>;bWn>%P80&*C#GSK1(@xtOUE;eyue{S z^h-i@uHUlsdlR8|>eA;z`S{b9ter$N$V!1l1I|A1ygMnF!i%Fu5hG$iPW5!^ak}vN zYgXdEDaFpxn<=B&v6^aA5^~E0b9yx*=l@|7L8 z=|30tm&%749avbAntrZds2pCtnYp)Wf`JP_Ct}dEh>($36 zU|V4)J>(ctH}?CU-|_@SrOWWnd9erg?B6Uk76MtHRkg0?ANkpmfYjHf?SD!C{`ApJ zaaikHGH?vymZ(^(euMLmI^98egGes&E5w$8?%QSJDc>%x|13V|4lnsQ=1QkDB zca-Ri0z_8ofo*LxxHmFw2O;=L<$t4x|z zE@N%6Pz3sA>Z}kX?Rg6YOHMZo%QFdapH4 zI$&t!27Jww|16~qb@%C8?nByM6VYIXnDs~VS53l^BTm%6nMwMWFWvC2(v$1;lf3Mu z8p6y-Z9JOQo0haB<@)wB#}X~sN9jwE+_wB)?A$x< zokG-iJFZ_%>-fQ}r(g1o5XF~ddRIlU7gOsQtPQC65TQJgoUFC^t7axyCq7$z->WIP?d-mAKD6@F?c?6~QsEeKh>G zIGI1gSI>%GC6fv-qvm#gLeTQrmc){{*F+`u(aGz9JvQLi| z(GxK>g+6>RM7m~u%Q3|<;v%_UlExr|L}kBheFjbPH>f`QPd+Bh{=fWDuNm-|w|^H? zn>cPsCe3v(sLraXn%rcrl2l%A=7^5>oE^PQM=UdMzRbMTRb~mXsAj4g6W9gg4MaW% zX4IGeFxgW0qC%nhlb&#kV{Z9UxwkM7)*2qKHRa_1Pmd0GAiH}0#e?SIC9ku;hCKa! zrK!!B*_Foen_RyrM;B$=GTIWG+@z)l8}Bdmupq7TN3#9;ZeE}{;T#@lgH_I_6+VKcjFV)OU(2oHD%rfkq(J&QJeP-1yy6iW6!{>dI&I)|2!-Qm; zrYZT?09Dmwk1@vVPRF!T>?(IfOJVw(9JAAxX1>jtUD7%G$cm%_dh@$G0-)VdMOMZo zX;=sQez`Wx&a{C`(lCz~80Pn-D)jfVMR3oT1g8hPJMG@RjDpuQjsf#t_JiJk0CVP* zeM^p}({#Da4<0Tq^$&KMYA%z{YEruvtUAgUfcqf?Fyd*EBW+KTY_>IdukyvTMomw~ z4Rzy25244px^Le_T&r{AE5I@+H2v<66|c}>A*}XX zewVm_tZa@B>W1YZ@#2e#{L9?nN^y27o=eylITOEqMUdm|3Y?uDRyeE#)cWUBAVSd< zY#Ctl$UI-Z9?iYtkXqKFE_S3_uZd1s$-%onX)W)*jQ<4!;7~%q^PB&3gFoc+!o7Z8 z=Zi~U9^R?@dFC%!&)%E)h4$$WWdFRm zq2M~93iYCgJm3dDf=s`r)&RRbZoJa|YL=M8+g#@&^;G!{`7!4eO^-gZyz*RPsU+JC zE&TYq(fY}vcaonp87%Xs(o$Mrorg{t8)%wrrGHfjx-nIm|g9%6LKX zd^R3^zoTY6Dk-iF%i|N)V_IWX_Uwtv;9EKdRw+-?*-H;C2b=h6UH6q~oYVZ)e2(^4 zTpa~&>egsEpW{~fhOV%aT5D!biuCh)Bz zOIdZ@`@$R6!Q`!jA0~S@hP_6tOAmN2m3q}OlFQ4y`}ab^%Sz>&t_aD?Y2B>HWd^>w za3#EIfO|fxkO56h`IoA`r2HrG`Pe0X5tZ)7M;%yG;9+GrcXfV19P_-ha;egFBx0qc zjx(^bQtxct3XfJ!&er$L$d_bMIctf1_Q*)Ie6w^Wbbg=@`+L44T8TIq4bn)Kj8;7& zB|qhR1E>B#$~?6lSyMh-`SsZ6aLN7v*>*c4Gh_cZp=QIk(ZmcLuz4D%wI9R?jm&h* zY!o=;$M4J==f`U0-v2r!2q*}4^76Yc#f9k@_XuYJWcw{AZWsEm z9C{aF_Bw4k^R(s0C`&-a5-2&p&_jg%Wl{=-im3n_pxUl>s;HY2H%g&2> z5Ix@pBv4EYtlad^$KJ<2D>7W;l)d#gSGJnFwM)Z+UHPh4_4+8yovg929=o9cjhh!i zY#(lXb-7Kyu8g9OpXiy*?&A1~MFlD=E2myAFf4N>pPO_+=ztqqg1Q#^IDh>3F*vIl z+%jXcj-l-P&9F}Ic`G^L>Y_8-BbF@03(-3}9>ayE?Rk2+-}d0WpO-P+_JR}AI@f0} zydx-RNFSJa_2VNtjMRj_3*1$yinHS?^M8Z4P4!kjDvVBX@<;2;SFknao|}8N9c?G~ z%z52#2DEQ91Tt14#W zE^IS=Sz-*lI6K~;53|Z23;S};CozJ?KToBc&Hs%!_`dW*&jw~|zp3keT{>>Q1FSQX zABjGnpIMc8ao-Kdn>CaF|D`jQKRPy_OK`ljBiE2Ny_GabK2j`Pw|@hmGU#kA!QuU4 zP|#0>7u%OGHt+4J946Y^E>*hw|@uC=5VV-SRAEnX|Zdjb7Ge+$<|#xY)FB<0)|fwP8D{?0$(t zZ{Eoabf*6JkAi*P9hw`}_`kxQZki~-2>O%l#7i&C%0o=l2QUwY*RvAgM`J7!BsUwpxMi!5W4}sTH^!_wO3g-n{vh z{)fNM1oh$P$h@fU`0ZcSo-mMZ1P@=AORoQftYuA$x|3)0=)jg&MZ zA>AD!NOyNiD@aKUA>A!GbT`u7-JNq^&iS6-UF+UIS!-sP*?T|niD$pF`EQ_rgAKD5 z5BThtrNT#StJ^>&B4W6zgPg)`FVgCLLo<1_x^NiNuxfH} zMcBgi;E6YuIM`B{P$5}Xm&#u3#anU69n(iK6;w8# zgKolw0we|rf>BIp+WgyoA02vQqet$QDaKz$vu)dd(90*wWoUTX7j~GQ+tkT#XpOSG zoNKM??cB{Odk=ecNdQ*-;O*#jLTxn`VQ}5havmu8-{!s(J|^AsUwZHR5V1X2-bEb; zimf3kCXLTokUIFcmuutmj2;w!d_0WUvY>0{gWShLiQn_XqJ43&4g)=~9_CkkHO@cI5o) z6>MzKPQll7t?Xp|yGF5_BeRCn3m|^a_##oIjbW23p#4cX?*lDyZn>Sbb%Ej4bHm{+mC6S?-qFR7Kp zJ3Eobj`-ueS7eyfK~0V7!&DXljVCDDRFC$(fHZu^hHzFf>4C_R3#8TAcG1(1Oy_{ATOV zhRBl-+fnqJcYtC86z<|TRc`;wOW>jGDJ_6& zT@>~0-c6TiOxeupd(v|IJ%)Y-KMhBXiF9oTBRZd*QLgyhzPI~x?53D5tV6e{-RedP zbeTYuL05VnY62T-An1xxXi=jBG_xto@LWo|b(Yx?_-m_jL%WxpmTNuG*AF)*xZizi zyvNA6xVXMfv=B0DRZRHR+bn-*ZE~HfrF9sp4tl1UDV7F~)!q5-fbjE^{?dzr)`44m)t#Pt1^u{&Y^IAAS~rFd z|JudA0QtJJ1wOkX%9z-I>|$JN`#e3T?}t!ZqhDx0$E)NKB9%4aK%a1~s^dRrb>DbX z7^AX1{*v`jEP%V-UgE@`Z8QHhpx?|}Uq6cwTD1AH-CV#cInlhiRp3Obs$@O;Cj>c$L1tL#KW_)#6=bV^$pU~M*0k+6%^P!z_^LJT<48ZyUFG_R@Ui%`^Gg`+ufUDV z4Q*aB`7~=41wOHkg|7^;8k^7a^m!v_%zgi%SNiz>A0toJx;4uSFDevhJI(mg<{KblsonhUFEDIvg&@sx)jX7da!A=? zeL{*hb19hnxZxNHN9X2fF?@M_d=MG=#Y;)}hJhJx6yxFkKKv9lruD=1!PBiMZNQmf3JoWiHtbHseH&}7gWS=%fStu*j&8lmL*j|9L;K>V;G4-{H^|1(OF zjN|6lF7NL?_ufJtcZQ$~g$P?L(R2y7|2maE&@Mhl4=Vs|%Nydq?5;L?^|qUL5!hF! zi&{0jpKdHDO10~lvQB>d!~syjWSi|`rAXR4Ta@+#UTfGRW=(_#>!m_W;H-v5CBw}b zu;ELd5{~wniC`>_HN7GJ^U#|n;IoAknKNE1%a!{9Z8uUL(Rpo6eA(M~6bKDDmvCmz zS-bN2>f5r8DrebLmcJinY@^DiX?5olG9_jfR$Y9OG6HfQgg>*91dk;$Ycc`Y^R$~l zuVnlND1eFaa%{j!wZdGs{g?@LI7sEZKf87rb~KcnAwILgUMm{%>q@c22ta$o! z!_wnxnV}h5I8Op-6o7c&t(y{%ASr{f~Q=;B36O z7y=F=JyhTn4#gRP;nlm}? zjP>oiRNF)RGQH2u0XT6&B1jW0V>#7?`@Y$IbG8V4xm&99`Sa&$w`H%k3=Zgof#1NL zSanPd%Rboh$?O&fSNos8e5rOg$0BH*Wa*I)XhHZ&5Q;Pbr_XMSmy4%CJ zqVWky_NdKHSjqsL+FWS;$Stj26kax>A#G*E0-eWT+tpoksS31;ph2cAC>2sWiX5xV zl+z_njM*37&>M53+bB^XT73CUL+$v-gSK7YauzOp-(qtR!w2k%R&p^;8Tj5JY-^Lt z$yN(W0mLM0H?@%@ZCxXS98aC>|B>#A=mMAjdO5OFfTSqm2{CB9_k#h&JjYL4UvhB) zK{f(ic_yPz@JkNIyy7>r zhD0M%0LcB(2l{IRWb54_PLOJ@*R{lR+s&lB@Xg;T;qzhV07y%M)(6osdb2j9!dp-{ zS@*Hq<&%8HnQ#S^vM6K3?TSxu66-I-d%#Fd$K4jH+eqs{2B3T4tDwVF}5zfzJg#xiy8K2Zm zfZpj}_EcG2BbE{8A4JT+2=v#I;TSdUtA1G4(=?5aW>i!XqM!|@=6U}$sPH(F4y&qo zz-Zxm__wIiLoJrfeD&q|ucE?lKULMLY5{c(;BVM;IZ^4MoslZt>jpFEkDuhtcFUKw z%kUOztwJX(S)4=(2~&^eo0G4m3S<>ZrKh&Gl&3Pj8s4n>&nyfaEJu)Lq(>M)LK{7rCse z?#szl1eX;MZF+K5>uL7Er&CMw-TL__?wgsG<3A{#U}CD=k58vqRKtVOgh$FD&2A2Z&*Q|w^M{E4S2-sf?iDJ~fjoI=ANqH8FBHX{X?l%~} z6BoHo{wQ(nn(tdU)_CT752^UjyWw~D@f-TZnU`>>VReY1!GcPzu0-}V{Ht8RK>B}$ z83nK^Tqnc>U61m<-^lcb8&VPh9%q-f{V18Kg{1U5@N+qHy_W;|DK z7V8?Dm{>CW=2-4;eRXbpNg|vuV|hSMk{~Q?@iY|6^@62F^=$>c^^^^g6=IL?u_qghwa$JrGNE8F`vd zN>q9T&`T5~ETYnv(QtY`Q|8}(gQ6$A6de&d4C!1w6-mw*z9(1P4r_4k;(qIWZk9gh z&Rqyh$i%vW-!4K{rPOaNhNbyVVjBIl^qcV!`ii(;zF$rr(psMCHsXPy?K}eST*kNU z>G{m3nv6;_Jm{dFKcDm%M@^Mml)Z$eCp@CYakrQ6srS1Z^ckL!!0g@#{6R0B8O+yZ zt*mS0`n?*T9*7lt0q`7uI2fZmQ^Qrijpd9C6}oAeDcWQkI3F7YJMY3|%yofRj}QI3 z5}K5l_2RwFzAni(v>wza)E$+y^oAh;Z1~4=B1{sCabt(JkCFWTs~rpuPzdOf^*^(s|VZ{)4GI#|Z>I5YfU2-*8} zx1@~j7n6DZe>_o;^2(mMwDJc%kLiJ^Wb*-XwRpVyI8H_mytbKDW@ z<=M{YeMAbG`&SE)_Ad;YYD0Q`L`{S`tz|c^WFN&RTz2bO(}(A%zo(}c?)oUuwBC|C4ygt8J72(VT-Q)Zr-MesaxsmINs~>;E1j z4L%sjF0DtIJeD~%+_uZjZ94iq{7kV%66VygdkxCVfmh}rd;U@#nyjopdV^;OaQKeT zr!t&dB6>v+{V5PepobSxlmM@`63Ptdo@dPTzXgc=(;o~733lFn3!w9S@|mNgFR+}m zU-8$tPt7M9&MpKdD=SDatn3hC2ISN$9#x`u0ERAdsZ;({Wegb%{Xb`fgaCHsxX#(W zt%S{b9#df?k>!l%| ztBJ&;&t5&%DFN)7yCSUI!!tW5T)TW-zAnzn-r%_lR)D2HkE7uFwYPGcaI@)4xxxO> z;!+Mt-CMyhE>$HD=--O^R=Av$E(zZNFBC<{@LJd?)aCx;yv6MBoX`+Z_2m7jAW~K+$nW{xLpZ=OTYu1{ZlhwlB+w;RHQE0jhY2{`3 zaV$Gr7rN0--~ho$%TteR~F#s(DCX$KKWdkwW;tSym?T7Pbu^v?EriZ*K$>d&y)SePsg!)}px zexqyux|taipuhc5XD63BJoKt%@SNl&`rfDmK@fhG=6nGaTbEE9g`kI<b!LKC9&-1a0gK5o0_dWU!DG zLq1i5`{{6wgpZzRZphS&wDGXID+-}*Q0<)rC{d+dO~&Px=o2rYutK;p8zTrY@Xhvn z{lkXMjW(UrCkN}@W=$0=mHT())-NY5lzJL(5J$>^^mFj6OaOXt11tT@^{-3(zg~|* z2EakQRgVjum-PwQL;c@Q!@w1{no@O*3e4VIFO<&v?&e(VG3Txk2Runiy9SG#KC>QXn;hRX1m2aGDA+@YYCIsmij+C zOQEG4b=F?0wAchE-U_hQ0NmOh)X7ZV>Bf_C|D)NwF(NG98-M=#GdZUt_C2*$cpHL; zX*Zt|BRSaL7d<-Kq~|2Q0ld;p%SDS?{rs+`8XCBOZgrRLxfrA)v=UY%Zck;!gZfmI zdApD@{uT|B(nk*AA6HHKm{j^P)c;Q8x{r*zuY!h{ipqe&ZsJ9rjdW$9B3Kzs`EKYS(+?9O_ z`B8DWcKxHvMy46)P@yK?hnpGkq1(?yNSw&td8Rs>VgTKN$)OYC+A3b@g0DXu1|8VC zAtO3(js+Z{|(hUp%LoszyGScvW zp8+ZjVAW*7BEC#4ZASSD*($+dE|#n1oe$|;wt~~ebmPqyVaza?~sx*+B*_x8EZnZ4C&Tu1_>@k^%i22|Wiq0Z~C~%OMuRmZaO934d zgZkA7V$c$fwIP-X)T`r#67y$W?nLhW%2w$)E4Ki{8i6NWiUtd3i7K!uD4}o)f zAHvi>?k6y`5ciRQpz`+)ZxoSBOW=OG9C?PWv6n}_B+u)cIk=KG<9(?t#CD4oBn_`U zjFz4)cL#Syt7wU;P(W}cqjnf3CQ|Gh3C)`8y;y-hm};j!*kP2E872~mA@G@}Ifttv z6=l1B9!J^qaVdtAN!&T1&WlTc{wBnZ_%p_P_FO@Iz&uD@mfmWOIq#h$!MU4vaQVH? zg=9uE`LRX`ClrYNe%*Ug5pOHZ6WKk_eUX;fBi5-(*CtjEC`x4<$vN+hxV$YGIdj?} zJBzt9%&jdCkJ}gsr$f6m)YjHkrPYY;%i|UID=byWW7cJH# zOvQ#^P@`WY&hWK(Z{_U*+nt#a*!d6U>NrsSyxBfS3$Er!E&xJHug>_tD>jX-tgei! zfvxPbSRV{CdVR=Q|26pjW>HEClTEw+WJzA%hR4-vnnA@|vM%f%ZxC<{^NgZOi^*Ez z*x;}cjD`W?)Jni!?5yR8Z>$Sfk`M7!gRbmOo@w>lWYNR!U4XH)NFNYnJZW(`HWI&y z70}i*f))epM!-Zt=x`_q?>sXkCAm26iZO0|p_M}6CPHpFfSzNEOr4x+iwj#hl4(Po zXS3}-3DCA%?iWgaIlvfmrS8qQ5@STSB)?nrjeAwGvm2I){;r%jR04E2(Tu&AP3a3T zk}Z6+(wzKfP8$HPD1<{13G~4Iy6huqywoCW<>Rkpmt6yKR8P>r=g!Sn#gT&mEq%0q ztvxW9N7gQS+G^Ss7)=|EHE8}86Oreb8sJ0tW?2HAHu>1CGAU#oukse zeXDGaqpS=ahj`lL%Ky%eCdb#C3gnO1^M!d%_3fy2{n1=kSeZ~nTuh#1+83Tey=LuW zYVW0>=j4gC0ZeFVI2=*da)iUs>)-WIA%5~nkQQ|uQ*Sg%DmME-LF+CBeHnK#!eM#6 zLwU|=tNca>QtcS$-5{7Md|yMr70Q+D8KPrwSy zKcfgI@r_7KJ?=-~hAgJ2s2o)m+-y0?tK$9UVAkTSJ+NukzWJW+V7g3xq-|$hf(K+%$)Qmn>Tii&@~n|xM7^!9wQIT}eZ|Y^ zoBWY0&?i9IwVbVgqa^xb^y{5%G4bq8h7jR>yChGc5lBhYhdg0Gs*kMo&+e$uT&o2} zR5DxF?j`0|zRN9t^3C4Ea^Q(bOLi+BkEC=EKIs~b3e6b&Oiw0b=4wFw&3xsHZVoG; z9lFXIroi^((I2Qq6&{d5W9&ret;d>~9#@!9Cu9PV$3kvUjrOLM%vO+hLFsy@14QHBjZEv@$l}&H8ON#ta9}(;(F|>{&Yy zbYmS}>j{wP)6R0%5bcMdjn*m6?qits|?>W ze{=+GTiITp7~V274&i#7PZ zXNedXdXbtOwrADt(oB0Azc{cDZ+7`o&)CzVPQ}uFLl$e=?<=Bq{iDi7SR`4J{w8Nk zUMsL`2Qa!@rZR-8#(V0p{L_#5O4EHdN<3qp-H%3_oSOQ&Qu+<1fuGy) zO767xW`;W;v=|9rc5gnte|9(Y-j|LgkzF6K0L{jH1=O49KM-i5cUIjgaUy8^<1cBa z^u{&wDObQXR%au#F8fQV$wuB8yoWQ}*S9x93K=57uTF40y~QS#mPqtC zm@SdKwnFClWG7Wa7h|anUeO_oQBEEB#g~x44k0fd!+(O8r{zeaZ1)Sa$ig9zH(U}I z&wNJvxs)sto^ho0f-&SgW_&c4Z7eU&Z?ED6I=I=6>>9Pfx7I8(pC07>TdI>m_vzR8 zZ=HnidI2fA7&I1oCu(zz&P;ok@C=R!a&~%LJ#&%Z&spjo2y&m%Xs(gS0vy)g zKJ7|0T4Z&*ffK(mxz--UmN`3+uKd(vT5hT3+n4;@Rj$ho*t<#6z8v()P5>p;F+t!| z5^#M3`V&BZieMNUL72DrgHI4~*kNh?7nKPa#Bt6qbLR*d5~F|q%!LBDL>9NjKY#c| z{7wyQ_#oi$D$c4Ut|RpN(}4z>JGyTGjM=1iI$+}Z`8UNF7SXjp{=bjidjHz=-ndtJ_yE!~cH0lvTJxK&@o zs2;4hS|dcffUu4#wPV+Dy#s0OG@sS))7k{*sfDAH$jYt*6uxs;-K@h%qSk|1T+I4& z!^-d59@zV*A;;GeMcGG+i`xSjgi2!`10O$d0Wyu-$pSDP&ib)fD~{>>Jd1(HHeUbe zk?9qe3InjH)AQTV@y^|OLg`{{BBB4N$?Xbk`sgqX_f&b_r$a}YZEZ2n{YYMhNC^cO zoGQ)O$c0-%%&>itWGa%G-_hELvm1NNuiz%G~Sx6)G#~s-;O;*_64E0&a*?N^(p9Jr#$(~8zpDhWQJv5&mtQ*b*hcu!l z#XB8=R3Ftf5~GJ%xVUQg)19KtnP<7aEMZ(7&HRu@yvbD>W9ycZNfy8AY>Yfr7u+}U zi(wZMYG(sxi`W6{f3-s#1n+RsK4=1|Jx&e6v?u;{6cxQ71oBP;{_GyVKbA~(eQzBH z&G`+F&EJ6hkzesY)iESL^CUsvuBSXn7|Y3*C0#{R#$# zNP8N$G1To9Ly;H+LF&7$0f1cMYQx7Y6Z<=)G`E-uxYLdkp!SjZo2j$q);tvvf^()3 z`QtZk?+glH#<6BO$B!9q-g0!dx}h&DW-qPOp@Hr(zOu-WN~x1e9Rl}R zD6vm@?k|Z%rRVB#Oy7{x*p)9M$S1t;H;geg@vG=U=iz|JcZ&li3&kaqD)a|{Qnz7h z7F=GTT^D)2>O1C39fmk3neoFZECdeXHu0)!zccVR==XATbc7-iaiTF!D`9EQ0EEYJ z;1gJZ>b$m+y6D1xD*hoA3Q5?Vm)P@kVX5LT@rs%`HYAMugAyE?ti2k{)Hy za-GBZq@?;~hC+jUM}?P~-K@>uS4qMByfhL!FVzcozr>3!({nuJ4MwfU3Aqdc6^xi} z)*Db(JmO>Go{5{1J_DE8;`9XMjVUh?zjS(kmR||Iz*6Stc1P7j_eve3(DO)44#;sK z2vTh}bI9rpm8P`7hR2l`V9#AN2rKfE97%7r5SV||M7&Y!^d!_NAyhdo|I6mhtrTCi zMZC-z8lBJyoZ@2|=ZRgKrHdb{#vE8v5Xx%zQORr1L4fPXZGrnaI9TW{b2d&LchLdd z&%dOmWXeHMYt5D%1-O%YKXWu*W2g0AcP#f9vhi2)Y0B$f14fr`vJ^SSe5p z@w@fQ`&!3W<@U?5Alu;eGS58wIH0~qinMxJ9moFu?ZCyGI20+M2%z5eB^gbA_;nIm z?xE52d-=P)%X47QaqLer53>OnqRsMSt`rYAFGX7PKOSUVIZ_pX)MCPw`cWt`cJ^?4 zd_9*$R-kvFmZ!SLfS+Wv^2OQ7NxRzgP4g}3+QATl)9QQ4Z$NBZMNqFV(H~E-2iZ_% z=?B0>F2+0-fGX?#ii}ak`A>l%^E>rKB58gOLu+i%$0NzrALr}G9&tO1Fu#T2elDTj zi+q83m~^Fuk!wU^a3MrbZp9?YaxhU9f1Nf9yNmjeL-4d{UA#h~IPwfLonb(C$#s$g zaLJxjj=dWd0CguRFf9Mr`&H_;5yRQ;M)q^pi4@%}rT1>jI6&htb=8<-WKj{wP4SrW~9VR zlmcx3a5%1~B7YN#7^aKyY$%a--&ma-Bz0J}?_QhKNli8x5bM_4h^upsLAbi_VGOR#wo@2^LwwW&0sw{kZIYL5t@XUO*7_VD zd%q_D@QXCDa|CzH-*^DA*?9HnqcP}a_>jK;x$G`B#M%h4CjbjmR-s}YaBYZRH%T_k z9+q&SFeLt*7!#2MY*)R0?=u1Kh2;(4W4WAYJ{_-6I>oww2K<{FZq1%Ad0HNsT2O#k z+3juLCO(8WQs-6CdPOxB?f0WE(@VGJ`gAcIALPsT`!sX8+3^()*!C)v69}hdzHfqk z?aQi7Hb2mP%0v?b{FLnPZ&?7uIySp%nMw9c6({`ixm_Dfa>)p|1lT9EFS)b)Mg2gW z!Tyk2M*#W_1k{-R)31l;4AMmhIgDl%GZDYD-z>ub8}}SsQ{F1`0@`fJFR@iagT|c; zdCR|9WYfi()99tlvfu)4u6h464%Fn*wOvMT*-t{as((~)LKo_+E(V?BCUdQ26yWPw zFh?=C{GL*=D_$_pMD+@9rPY*#r*Qw`1i|BsleG3ZT4<;#9WXF!hdRTw9@b3XF|SeW@}zRNOE# z+aJ#-d~-1K1xVAihYPs!l&N$kjux9K&xE6*D~NGIW933hWBO{a75n}^2#cuoQ(r6m zKfPJR-}9l_*5gGxpTOxY(EX;g9CxymY<0c?_bfe3b%k5rIulpM6t?IeAV@0Bj|t^4 z@(K%Zz`^@ue?OfsII8Es%FDPIlmE>_poJ;EyTY{&~aoFs)X3L+N zBJb_diooyFO4PS*b=)o|3Dh!vVLS&GHTiqfP9Lw`CBNHTsQGhtuQZPESw)*v@{)eLnxzKN7XTSf?l<#vj;O?k_w2K1;5*XDHsk544 z!3Gz7{d%-iM_e*3k)~M&*jbyd0SqeOvBv>G$wI?2-Kxj0i+RM3mbqw!F6_1c^$M7dSB?)xV0Yww77f!{)rPJQRY#H?Ad zDXP?}V6{;6{TiU4){5m3ord0Mse%nNzF$WM=P-2l^-Q*Xl3!@}IxwzRZq{q$oO(8; zesdxkFs5}@B%eqv6L-E>Q{e=8FWG3l_laQWF7DI%k@G`=QSB@fliYYFM|_}Dwt3c; z0*G-V!eM2ySjWuE?W;_NE-w_nt6+@{NgC@Mn}10E=rh#28`lRS_cRZP58^TT2Un zeHV+fGe9lFCns0(@$pH$(rHl4$bwx*RRw&43lS0KlOQs4T9Ma2WjhL(CUQUr0xl}K zY-74X1cfmj@QOTK?R7p=hfT0FVtxVc8uF%5kFeNdot*%p$uISR9@{T7XeyQTCvrk& zW`_*OUsC;N3~_mzI+yY&bxVO__Lq5Bp!|Ic$jQ&o{$i1<%>r+Y0vTKJ43|-HHF?Td zzA}{kcnU3n)EYb~^i5sdh5=7m99~*XNwHD}TE0^^q^PvPCN3C{L?-DcI-?|r0 zo=V=Yaq*i+IKtx`JA0wgWD%_3SG1a$aj*r7c^G}vRe~zb2+hETLp(qIM2*T2Erqgc zVT4GtZC|(hbSv~HKIa!iAEwg&9g*te1#L7+`EjW5b8N3X!IXz+^8M~i*GsB9MV;EM z{gf%g#ft%&^ufsBV$^k>k{BmNU*tt;WPqwa4Gyr#K^{#M=OGjd>D7@57#6+}N9p=1 zwY$OuHfS-b3SRNb+QBb4K zF8*MuCoPFFM6|+6J4N;f3t}l-X^2f6v?Eab$ra^$EN&+Oscwx4#t-$GE8u!9==R($Deu zewb4H@#9;Ivz|+kI`CthZvuS_E@EotbM&_|v?HpE6Bh9JG^+c)XK14rKp(tkCvaxw zzxow6?26qJI^so zy=}xHMIf2oQ{Cf`K`!2ofCi61UTi?L1_6CcF|d096UunX=dF_gY}T-kF%Psfc^zez z^1kdbxBci*lVTvShlSze*a|@$CIA%WuzqRy7TZY8Z}H_zSlj!i^<8_g*drh7p%g!3 zunEDPhv&v&BR9wWH8KY`_Ca-{C)e=(g^+%$qx|WITdC(DY@czFzKBKXwws()4E?WY zD$RR=g&FvPn|EzguxpD$7$J;KRP|0W*}!#=3HfJq&6Au5E~63jMP?gUi#_F9@MbvA z$TPRR)c+`uIO{FBMRf}&8fFK_N^tt0?RDvAhg0-AvirQfHV^7& z7n9qHqED`8)0$I?bLfZF_-y4qDs)$2(`PF)6i>f&7forOf$cfX7Z6hfEZ8*54TFzt zp1lLHUMo6h)*yBehl-rs*4=Sj%pcFg`n7Z^DshlSv+2wg{TgT$XVny4uEeb9e|AZC= znhgIbgOJJy3Qky{^Xh;xODV74U^)-K8%bG%DGY;r&P7iy3sHF2@U)V%K8`n9&pEy{ zLLPfxbsTT0*gF3f=mpk|lwQnq8@PY)D=*AoI*o(e`8IkgiZ8cq+J9aE1O^W7fbL%D z(?3_+4E<`q%i63bl|9pc1QtzMto4pqYU}BBbuN*hg45$hGX#l9HaF*;&&C3S&#aaR zL{#Yrjm}Sb82bg*8 zk2G1|10-JEBvRL$`2nW;Q)u*j>#uc>M#&^mRY9=LlcrJas^2v`nGvN;)^+x|@$ENgGlK)z?NnY^G zfZtJwb-f3b^}x2D;FBXV`)e+xxS|#*!}R}V*hAYgoIxaMYHpNpgqFW|!icjfgm|3H zbw!(RK@>y;ys_$g#sjI1i6(A!IUPyKwaz>8_n(TZL$qM&cv;`rm9tqc(2yi0B_ScB zNN6Ul57}l2xRcGy%y^i0!mYHLTYls)BzRAB4-fyXl~un?JWq9fr%bPZ7|YLp3m=C9 zoF!&#p@YYjisqDoi}O>C*7S5q+)DRXhbK1h%iq9aDIs-sD;KH1<}Mmx1-x`;Cztl1 zF$)SF{46zuRr!1lZrfy zoa2To&N8@={`j~n1Gy*F@Z;anH-oJ#|J(-(B3n&G`&f;8&IMZ zC_Y9&VR+-gHJz`)ycE+MUb8z!%_umN!u-*|3yCvUns ziW$@po zco>a6jyU4%JH-#p{D=xAGlkSEtd(Da@|BQ*c~mWj`-M*~hx(}UNN<(k(3|8r#<2`* zL-7Ccv?Nk;Ew6#FtB9LIlDTd%3sEHnZ

_}W`!+TWhIt)U{+zZX#aj1{k}P5MUM$CMSHcYcY3_CZ+YQ)U?3 z`ZN@ws2keN(?8s86!R@!ZXv>VQqKGI-?goYUJt%(x|TD~PA8Qe@wOWUkVHtM{qGJ}G$ zD=+u>`oypQ$A$1518WUfB8w*1(BR>=U6129bwV@Xp4o~fw~XkS-I{ht;3R+_F)BJ8AZY(aov-@=6#8;kDx zU1Nk$un;4bL^Q_x7Te<{Wzmt}`GxD@=15Z}6_YntT}C4(Mi&tH1KNvQ^SsYMtqyLE;?3w8R$G#9>EQc*jwV|viLFB-EaY}^ zH+-R~FrJ6#>9%cM7Y@fD!1ib?q%VKJG4+kuX2hy#f{~NlIs-#YdkbnX2{8kcjY#6y z!8+drjE4I#qVP<&4|w^#*J1pO9^~^J!`_fZn*<|LQ*vS^vl(^t3~4!B&G~CzJ!5Fs z_`&j(-@~5R*+B(hta#%?eZS*CzTMpXkscpp(0p46n>eb$%EB@ZRw6&T^L}@MiehYG z9VICP36;z1tn3Jef^xh)p=4JI%m38r__9H3DAFdf@&}Vu|3fs8vn)Nndq}*c>+S`+ zQPICsGA0+S#L%t#_V%las3jIrv?F!6Nyn{xwmK8%3WyB!h zgrjdrwz~NCMUsO~Wvc!Rdk8d_mF~l>?V4gD&DxX|+)v*1?Wg7(uq_+fX7{IH# zR~oybgg%dpJ=NI?#b)paia$S^K{_NYmy2nAe0`vx1{fKE$NdPon^>gY<%Aj)kpodY zQTflQ4*}3cdaHx9vAd&Nr*rUw`eXLDA`Ta0`==J4H`UHgo;TP9W7O2l#BD1vhYZ{~ z3wukfY54&#ABlN`j=u+1k_(WiVqnCiJ%^n48#IxS6mUhL;6$V`mm*%l(qMh`Z83pN z@XSRM1$NpBQHVO>l-`V?BQwCAtA9_(h$*sfjV&!zXb~`H3X37g(`n=8-sHsd<;6JE zEECiGg0S*z{DIU$PsrzPz-De?{%dTmyF$-KJq7#|K3_wx-*YsB^QvwM~qBa7kHd>DkO7 zc9rKLU$^MT@j39F7qoU#&&?-dOsrD8Bc%+1VAybs%LN(f51nJP_~Ef6(vN($j`s%| zJ|f;pJ1tRB+)&27;pE1DFS|-SabK(NgW~hNa3BQ{|2zBT59y=Tno#4#(%iMBeH!%U z{6YezN8c!6ycO-pV#$OI5D77PL#Lk9UIMWl#~mjkI)Dy8$senxC@pF+FO$q6{fbCf z^BJMQePs*K$=Xw7?~9V$e+$6{;;$O|Q7HVtHX4Y;ZZt%L-8=e9bA229Tzk7#>w;V= z6BF?Jimtqrlin{YkqhjsC@f2gU9dX3?^PIQS;rPsNa|)YA97Wzu8{eF85T#>wRk%` zJwl4wrWYNMW&Bj*jjtLX4+Rw}9r``_Clu6$Iaf?;bWSG~4V^I5P&MvNnJSYb`w2Q( zUO_}=MJZ^Ifq`YbmYs#EJ0rz%Yv?l!ct?d569=pKT&*AX;O3r-0T(3@!yb(Z*RF3x z!p$wo^2M}juzzTzV|oZ5(|wl@$Enfs@mDm6g2!Q--QrBtvT?5}*eqlxGLncN%9!a0 z^=&GXWh`OUJ_aP0;>*1};RDtbc><EPUYfh>4-Zj05~bIe`vpqJNnbLMj@F^<%ZilZ$Z6sgX`m;mDSThR(F} z4?a&PGL(L+pCr%AxHzmMFe86-_h=7*?Hv0G!(YxF;^N;w((wCT;8c8)l|?r6v8D1e zywMA7{I`EA7N$hP4loyx>RXbwBZFi^cX909E9@fFWP3G?9>2EgpUrpAj$Zrlq0J9} zRWzkOy)7Ai+ctgsnOXVw$%zAjC_=p?g80D(%gZ2n1!o8@u4`jRG8-Cf5t#gF1q5?g zm8;TX{Vvk&2!=l4D}IRBZUB=qQch;BDpQq3AK%>reAa1zc#a4Fl-ZShumSPCJsbA% z?4n!N!+%mrs@4*kp5DS{wHg^V9IZ?5R54hBt?w2U+*y?y-cikRbaZ?^cxWHlyWDuq zUaH%sPL0lUbJNjRvy&q$N>?emua2;Jh|(`oz< zR4qE(!w*l)3jVjGOU>TIP#mVpMlFvWXlO)y>ASFnp)sf6d#vQK3`r9eN~rdsK1Avd zaa~y^2MyuZJ@G@^+VywdM~kiU3Bge%#4C_JGnc)kY0FLeOhYM9o*F!gMi!5lPfP1W z=~wKdx$Ad9!7vkb&KBLv&2hlZj9rt1SV@{mcV`JoRgNR%4ld*1hF!$d)+nVNpD-;$ zP)GxPYvA`aivDeHA2R_y90eOXxO4~A(Gyh(B;c6imC?ue3s84wzx1sLCi-5 zOiwkt_Hf~0>x;DD&fXck5-palSk|&A8s>Szh|TduKK+oi$cysT@DuBu$9|+nX&3Uy+=P;4acw;{ZPQR ze14}Qm;|XNFd9yc$YY*u7p3TbJu<3S`%tgocCy`=0O1v6$BEqI7_mN)L$xn0k=W|i zbv|e?|M-y_5nm+~&sm4*uKTkf1v>^+u*!7L2Gcoyf zr&gfQ5uXP(6)Vyv!zGLuIh-{;xQaVJKN4_obCc-1IfjNZjCl`S)WQ7Pn~uF9WZCmR z_&M->X#4g0jU8hVsP@${3{e){Z(ly85$sC58X4%`M9{;Tz%by->4OQGD`j|)LxX*% zXV3UFNJvTFl3_(BSg-|{57}c?J6}48iu~wK@PgMW`g0})hZ6y}69`>N&Pn1Xi6BOG zF+-%M9FUVx@B{40Z1Zpv^gK7Qko)!^48>1MMQlyW4SSVbKTpXs>l?r~r^Z6pbolTgr1)zJbdB!`5F1#oat#!06)c z?k)imT!K3UT?m$7!3pl}?h-t>1qmA5-95n%R|Qwy`U+Hd!yCkOt-&J7+2RH)vc_os@EWWRqwq2xOQ9G zt{s*ngmt(os|lW+p9SaV<8-niqM}cc%#Dtc<_{=#I?~K^oapN4up5r@>2!F&Vc_7b zZ|u_(Gr#4Ad$>842GGt_QAhLQ!1xMzws#XIP3UD`Kez9fouxZz5|J|}>MO*Vr;oY- z^iZz!+n8me=zVy&Gq|{~lU4d4CT&XpJtVYeSgtK2CANY0U8e9?aK^es=$9`qK5lVw zeg#{`TH2p_Cgu=?SGqgmfxV4-t;?jHxV+lDxja*>mK(`2u(8+wj&%IhX*$$wd;0wO zv*Gxt^67Ybg56&m(z5b$Od_mY&0Q)WArO<(W?=>)*&ST#0>l8~p-}doD#F4vxoSA< z5u~>Behi|brju9wcjO!^`xLA!1!eGiI@iyToD?>coyGuCi9xFr(>)y#0d~72G)}M2 z+0sDmEdBDQA!SlIL7EJOv6(&zn{Gf^)MtlfH2-twb?_9M?HsTbE&B5=I5x zx@EQf0HRol<$KCA={G;1{B*fkTM;*c5u=XpoEt!B7v}a<8UNi4y`Gzkh=F%(Pd96( zW?ayTk4p$HZ`ak;nJkfbu&4t(C6xQT|JFM0+xK@>pR`hGCOg*E4TD1Adb+y>L9%$M>CUOCq{Oxc``2P|gl^?NM|2`CfqxH$up3X^vD-m2>!{qmhy z<Omz}Z;1k9n;oji*itx1R3B?@VX-P1l^nRXpCZ-uUZbUB&V)6@FVL8Pa> zE0a}<-sdBnSv9Szjs2a7Mo5Eu{r8w`H@SFO1M)?rh!!(hQ7WiH(wB-?z6i1V@*mOe zw>#egogP_(v!tUV*?PbmEkxWkK8_Di(OE+5Z{UEW7|w7NRvL!FjSr^9)(V2{*}Kv- zfaD7hGBfXXHp7?B)FN6AeX#I>vJk}V>|IX9G;(FVW@-;!z5wJ@5Y!i#sITY6*OH6hX{ zjYn}Gjvp*8Hn?-12m0^wXFg0|g@8ju`qZL~4SUu*I690!PkMOt#kR7g+W9HefY6N> zU)YP0kuhl44;iXEXw8W{*;43ogX<;HckQ9{Wy*dEX~LhKH`Ju&hxz4%07TNM!g92;#X3|Dr#Js z^WL=ghsa}WKc4*A zyyM(gjR1I+}oaMtb=IPbfD4-wx-0JIIETA(SFwy{pYWv%-1<1Jlqo^9? z+FkaKg!4{EI_;mD@k^r=woVoh7G}x7w52I^SchpnxtC)j5psgJfon7I)An!?YkdR1 zK_)Izht^v@*Knf&fnPY!-L5o}MFqt4tXL$SIN~z zf9rJKwc{f#h1o@x_6h)k_yc%8Er9`ZDi4m7^wv`k4i^43kQkl?B3#G>pg>CG4+H`) zi?E=<@!cUyk2B9+kpBbfsM}N4lFF9U>3kwUI!)POeuwI@) zH=jo*bsodkl*~wUvm;Y0O|_+ta?e{7E5JO>_j zcu+&Qr9}6l+%08>$$OYmSj0c#GAxs+mh?GV0O~eb#GQ9K1oeNu#V1csM_H&48icgs z4Hp>uaEA@{pW`7h8j6Ptds?F~-mjpSD~Li3h!MGBxJR}J-(6=`k+YK~w|N9iEe53l zVPNvoUbVYObdJNIQsuxsf9a(1p=1X-LKYlASsE-!-9>=X(NjN0Qtfjkr!!Yd%Ff9v zGoYk<+Qm?F`EIXp?DA9g=Fg^@sxK>~p#3K$;f(hr2O1S?cWpd-WI)Z})vzY-rD<_- zebr-j(IIB;hLay%-t4qLOBRZL*aH+kr^g7KZ07TJEAE_*j;+@_#$|fdsFhJKoX>S%8Hg?K%OdqRWX3@gX^soKKfR$OK?v99B>lb%{pDP;Uh-U)u|QFV=MVwf{K+YQ3K zB{h$Qocyllf!X-u!8Hl_SsGU%=52YjW zjCjo&HJggP=mf8Y=a$CNO3zK4KdI-Flb)AW$-30=T=G8osSy?~{rNW^vNWx!8AzJi zfBFy3EKNwyev`o$$=+cg>r*{!Fqc0{R^$q|3~JRLp_9ytZOmv*#!wOyFEnvHy53Xg zEjENE)j4mYSs;%5l2ud^Hx!2^cIOfo{lZpYs_uyqvB@W>pdf0a#3SDGT`kqs#RY%k zWH~S?iLN_cTJ&@CWp>FaP$1~&EMM;Q{bI2hkj$@6!N|zS2<`r zh6_``t5rh~`WS+2m^^lL`L{%bUb9XR>I@kh=Kg=l3wq6K(U0hXfv`n7&%PJ@CaKYF zAGf(SQkD6Z1P%NGI8935Ayr(PMd6dDi_%aL;L}-zD5BqsjR6%$$)%64t#$jO^%n9B1;RL z*Edyn;ZeFQ$)RROZf@T&6{g?K3h9S#?2CYxgvLa~@EEV^p`~hBs|CkcsP=>~iUaKa ziHN-kp?bO0h&WOuYGNf;sU*b&1SyDC*hqm9H-(f6Xz_i>LC{j%Jn?fsXzB5Xj2I|A z_Z*7P&!^>E!Wk(Ir4rSd%C>^HZ>UTwhY5qP&tU>TZb??82n%TXI4=yu#=mT0Zz*^n zSV@N{X~)M(FH2^->i<%sN8PVSFI-&Q88MzZl-H9jPcWaENvdEYS^na8C;^__6JaA9OWhQ6?U+^8#r-is}0>nc=VXmsJDh`YaBmM}1 zj>t;r#{}~UDHHDl9jhZsm;N$iaJcRCQmIt*yj`syc%T3KdK9p@ zeD?u++$4kzSPGMz8^ZsDp;X#hX>_qvkU^Iiw6=;pdxgwEj%UiXbDYYNJq4OJHQa@YH9Z3n}$<(i`saf%L+R{n}cg_Ja z%l&NXCojzmx1%~lQtwc2C60an(5-Yl-4@6GpQ$15duph2$R}BZ;^Qo-_2=xIFri#w zs#MD)@$|vSEv@V77~c4X8`wW*in5<$;0}d?k$`Uo?8y0Kf*gP)pdY=z*qSjH4>r1R z{)piy6{^tdfNKh1&6P9PIrm^yOEIbN#5Fzf;LkkWSb6 zk@&CL4hD64nV9O3)6%bN9P0Wn zw^SpvwiPF~2^&`VsTR_;_VSCDBQh%4wxL(;4?LY~H-Oz9Y4t_p<<`0OxHC0Skz+}N zsgKE(;n^>){g2k50)&l8o?$h?gCzMT5A{`6M12(s6;a0+FE;~lFSoecnYf>NkgAPV{+#>GY!lvwL^)BfyT87N@f9>FDJ`2 zB%=kt`3J+;;H80j&IL9fg;6Pi-a>e!-b!Y@I-wOASDGn!GrbaJ@eMhxD3+_Tr!m{b zSxBHpD+jX6VL)k49Iy09z4e!ueR(|8dZ#W9e;yTYD5+M25Lem%qUYb50mc^M54sFM zhvN4i23-JDWvS9{!-^)EYB->z+5DD}9=iO1j>2~ zgU`NY_9kdv!bi!jQ>?7TA>npWC6A;(vg^#Fcrx}yMLC@VPZD^B$4QbId?|pud?n8S zZM#yqDcR2$HK0C;@NX~wTOvvC;8*tumQF_I}wCemsoSq`~%Q6JTlPk&pNyWTO>5v&r-=yl7d_hvo$s~UV` zjz?)W*+v#ToXVyMfSL~oa47mMEcZ@V%%Kv>O9p<;!4Y_JYaq430_~jFX0{Q^FRg)h z=|!u;_mNw-TOL*MenzWXo<;s&w7zEW*N-_RcpEs|n9)Kc2BNEGaGsouNpi0i8o*NK zocQTVr9{hW=@*LY<^~+lqx&>j;%(WM?vC>#+PpAaxJ3&tqRLHTS*x``eEuUh6WB>t zZQ(uG#6%(~shlqC^g_kNOe`r=_gP5Agw zCElOYBCMK4w()0kwa`*g`x-f6Ugfg<|E`(;{?5Ey(bo{fR4u{H556A!?rC!noe^>!Gl9APb^!_WOgaCH zh=2b(7n|&>YSQ!jH*{qT1snyda#s@|M|!odAplmQSus=f{G2Mxmxn#xSB3JFZE>a# zsZx;;#!~>oKODoxb0sB;WrYE4UtO?{!kE$6)(jo7vOW8M+v$c~#S%Gsn9-~hNQsyy zCPvba6NI#}w;sc*=MIJ9s}s`QO})}IGM860>5Lr@45s$f*aDbFmwayHNFerPC)y z(~p14_rwPD7T^!IU3^wDj+IWkA9IAR&x`MQ;t}#WonitT^LmkZQ|1av9HG#NXaI5u zSY;KHEjqeJw`bDhUdc_pC0)LjMoLCn)G=*IDq5CS>FNfXl`x&**6oo?7I%k@tQQSV2ITo=Hj126rwjYCg&MD_(uZW znm>H8mFS2?>IVNignhHK@E_^h0yzIxu001zc5#TmkUnEDCHJ)|7j;c_wa5J0N?;fn z09*Y`W&qnB{F4^uP-yjE-xyvOA@&RojrUJC=*ehk(63~0;PpsH1xV)UeG>S8Rl(nn zJZoWe_=$r2R7)h!dnC&qjNs6pYY4`u^Cx{LS1-a{Uqt z60xm~u?jFX0NhJ#l`0fd4UtuQCoEgrHH}z5>psKh(?o{7K`!L!2T_dW>QS891Q8-y z=MDIsk}DtXgim3)U*4YH6I@LVD>**&iaz*aR^UJq+ISOu{Tk5yV>3jnqYs2oKEeTx4o%RW*A!hX6k~nS+6@O@ICopqT%-3JzPIZs zt5U%@+9Z|=zAuVS7OUS^_$@_GnZUJ28J!XxnVhG&EyvH4{MByka%7hUxtm3h=t->w zaz<!yr4N}@8GjGQ zC5r58-U;FnsJ9aL_{>DF{Djye6Fr5<09xDMiGf>vD=i9UdtPWmdGp}|$gew3d{F-H z;vGj?zn(OpWdNkLpUDF9g9cE+5x646{{AC5p*b5%7^MasF8P!l91I5?D8c4@uK?;y ziu{WflbMnp_%nr-`gq)$am%6Y$;8BTZMYC+aAc(Xny>Dm)&2n;YXF@nWhR@ z6&yYg>4-l}D6nxrlP;E5n;YG%%|c*$wLM@6RF7~yP{J~OtI#cTL9sC%?6nm3Ht2Lk z=>}fbjg_iZ6X#}%bpHwp_9mR4XUZsSX)}D~V(-wSWFT~|Bg<3fh(vTnD0#3=_wI%1 z2CIVt_XY}q_D6LiR#ETG0m|7*o>xXIlMZ_jWf)M6y_(MPu@u=({(Mb6pE4Uv*hU%8 zZgV60D3TSLM$sO4oGH+m7h)Tyh6lLGsEJP8-v2B@e>DxHaf%&OEc}-Z# zA&VuVSmBj_Wa^l}lCbdA!?;HlIQ>hcak8CBiM!>Z>?o*yQVHkWLwFeEqGxPKsG$Bu z&w&tAdCL&*U(W5%I?q)>Or`%toZn6C;nC4!X(AkD70T`b-}aLd^-T> zgj@k1fxnh*JCFzv(%9w)CYP?Fg%}tRhCaMW(o>F6U$-~qvFYzmJA6)&T+S_%M0|sT z0rDi(bN<=VblYX@bofGgxc+>^3+`Q(7-#M9XJ*>cuapDC1|!_Xy8cSQhX{|4 zC3m^-llnifq4H+$>sP>~B09Gt;anp@DAN?;4TT3KZ^gt7a_7c)dq1Ue(4uN1Gtuzz|; z>k+~P3k#!S<1(}e=$B60)g`uLlX z?>VcTwux^MU`w8oAN>FnXLvpx3k+b_Tx#_}>v*~6Y)|7QV4i*Yddl}Hxi7_0Bsklb z(nq@n%G7j+?`&1&m0rYp`#Ep5vkU%Cjn38E$oF!WeLPFpa?)A-O_Ez;{D+yxAdu1t zSuiGE5kB-b^80tX(bD(%s7?oy#ADq7u=&#f^k5FYlvvQz5&M zp8|Ts4}v{}>26m<(?hvZ7=BGohcxu`0dmEDESG2xzZRqDE}))lD;J;BZJHjw{>%~ z6KXgCN;~fCwz@w#Da{}6;5n#L-;ZCz0{L0U2{aMw1C_7mh6P&tO99w@BUnv+%f4!= zX$4*V^p&aEdHcG7#1BiA1O}IJ&+`qQ3@h$05^Yav{lBt({L0IliSs1&0_Jzk2aVlN z&(FFhMDzEWxIxYj^(c#s;CDvvb`< zR9I?hF?M&0Gq?3K6=D-8XNsq|sF-i<7!IZcyG6t?5+=E7L(<`9L;R=@VY`ROBlNH=P@$SvHozZXqmlcRK zH1-irO69KU-@IcA(0Lac`SWK#KK@GL&6-fN)B6$|A&+xFaGXxlocV_7i*d(6B;MU^ zcQkC0Rhg2)YiMNX#Xg`~Js2$8Aq9gTGsTh4Rvi@jrC{WD~qyv?=kkiMq z|F5tO5?#s^0Dk=TbM3~R5U&GQ7Bil?VZJRf*SIu!7I0Fdmj&vnSQ!Y&nw_LZX06!( zhgEb3m2k*Th3z5i8Eu>#Ex4M+%DQ|i?*rp^UL=3uRWoGBQk#BM8Vb31vi`kexhI7< zv|Jz#SSz_}Sa*L0zZkF~PyZtxkq2JkL|9B)WTq$j#&lDptdf$%2e@>4iv)mzKudQu zoOsShL_3$Mp*L`=x0I>1A%c=ek!M4tjF*K|{Hfo4gSW;!auutS-b( zfCi~1kZbIwq~3}ioowev1MJXB^LEP3%r_RofQh;b|(cx5=tuN}gG7mg?Ngcli_?!$O`o0^hfe3b&r%(WN z;IhRE9{M93;42y@_P_m8(UzqHYEl$=c@#;hpnR!6;M+Scp50)EWVq+~OG1vcQm|jCs z?c*Q2!>#vj?jBzb2dRLmZJgo~(3ak|_<4qjOn8RJy)^gNLV#D9=GOuWF@CBaY`L+(z2eE;scBsXhm4Irr{si@=Nu+H$|0jCzT(d@9W&lvdCdstFOPJ6 z0HDyf%!zsQ^4~q{*Snk zE5wGpti4}BI;I-9h36OZWp(=GIk(93cjRS{>u5yxOzqxPXw09lV?*mv3 zvVaKsKdS)_9>9L2vRfkq>S$;RgAzyoWU0cJJ?SgWclx3&F_~P~wbQu9CMFwcE8ZXw zm4N}s??96^*RkQ4xWkz_W%J}nyZY|L7nR)XGTQRiU>$l?|B{T@)18Km4;I*Bw~VY1 z34~{;kzZlq?J6a&dnjq$!-o1j7>=s+6JdA2lYxy!n~abBSs$OX*bkGbraNjVDI?24 zXt{G5`~gR&^<*SwiCvITBf43Ue75sCms-aHmg1*a~Yymb}XlW*f)ah@RG!7Vc7nzP5U|tNC z>(NLDIy!Nbw(M`tZvRYxv2jL}Wh|+!d2?6^%L~VmUxd(=N~VXkg>uJMYcK#QYmMJE zS=!0~z)`pTlDK3daD8o_9*&&Je$=fXQob0f|G0_$uq^L~&H1UG`HsJ~1+;Xzt}p(l z7^sr%EEMd#m7A5(2W!Xc;Wr|Wjop0fW7LyBbUhDOTSydXsHcADA_zA6VnALN5jii; zL-pRht0268ls#Oig9*Jpkpf;9!1CUNueVb2IZSO_jJ(P4v( zwO=9Ru@pr{XAO~G3=I6^jryTL0TSJ>0GV{D1!0Uv`_*ln@!lQ!WKoQnL>NwHH!eJv%RFPvbg_1*zFc zmI5wr=?Mzadau4Cz}XYG`knvv$HrC;D_w$F9Dg~e@aD6-C5(uWx8QaSF_r4Q=^} zVtfY&xD9*mM&|4ur{8A?I#&OFQUO5HE0xN3d4iIkaFq8)gSw*Eu_xd|(o znbRafp6TV85l7V+4vx=tn|@rU8QoRWtkz-$wu{c8i*!~CI)br|Hpk8c-_emx^%;_t zp$cWxxl4_4{nzvu0X= z4Qe#|DZGCNAYOt+o>2ksL$q~&S<~w;yx!k@j4n4ysYvB-dz_E6m!rj2@bUy^mNsA- zWs@M5s38Nq!&)4hLi$-rm$3R!CZ$5AU>b6R4T1Oxj4L)c3z*0upd9S^fhEA(yvccE zFL)jGlUXPwVt%(hDR9+Qe}$}SHMwx&BAXOiiwD9?0o@r<6i=kxJps&1^DR|XhyvH7 zooN@En658S-@biB^U%`6QY`^OPiPGw`;?Bf^L7~02BsEO6*DrQ1me2!~`L;l=We|NNxKLTmM z_5VhW7Jk6JmOwZ!RZcAVDx1zvcCO7n+1G63>Gph%Lx^&f&KEqOMCrZn#MT@@)zjIm zZPqyPLW<2G6P=bY65n7dOvF8_yYC=L>YMh@mc{C;_A?jDWzulw*>js9<0ON&4JX_Gcs<^Q539$NNXlNuO z+7d&3g}cF5{ton`0A3Ei&?1Ib@5jsInK*z#ODv$}I=>8x{Fz=HOSL(gG8BjDOX2SB zZoakW-+Ob8BfW}o7iaD zF>ta-h8OnMy=STQ{M!c-63f@)C5=H5bsH24v~>pv+-v|HM2bs|c#(%0g2ig3$VNcF zm#2VsP%vz+^?@ufwt#wamEgI3#m=dU*E~Zni`?zu3W<=Xk>Z_xn?GRXSsT96_INP; zgkChE+aDNY97Q68${OuW&cmbp>_2@0<0*V5oXu4d%YjMI(Iie$q6VE5fu~!~{IW%4 z{8im?S`Q9+pkb~NS_&3@O)lchd?f`e?1NgAGGNK$%4>NT-amp*vl$7;$ahZBnS?^a zGvP9a$gsu-IA9AF9(6gJlI09umM|N=&ar%P?jOCjSo9(uk6JoQ67x#z7qjIMG%o-R znXvM;`w>Vcr8M!fYexqNw)!0w1ArUf=NZb+SG2HweEglAjpcWYRUtu=o}L=}LLc-P zB|AH((#e51`^5zaO`eomv^S{7kpc0e$&J|ZuxF{LN_y4`a-y$N3UCPv&b;2l%5gHW zoK+Uf_*P5JKf9Sw0g7rc%no(;iKRc99G+Qz#Nr6f(8eaDDozww-@Lz^nO*k#QV{^l zq2Yr5>z4!2;1PGqMiea7hlqR{99_prcvw~p=zB+^3Lf;nSWY}N_s)BRPHCr^<; zV4tfTj!bnL%Y1#4f$;ZgFosjgZV8HANe?nr6lX50rHTqwV}kl=__NBu%NmjK{^8Ao z7U>Aw!~b~!tf2}6PBV03%IG@8;}cOE_C8Woe`JlPa&`%MNO3gSISOvQN(YuQj*qVs zh-gJebyNHZR^2IL421AHyo?nuGIX4N|0!%C^@aC?83Ghi1Ioz{2SftO@FgXFc>;P} zg3EmWKPC1GqcB2Z(dfOTO_?b4@E_)!#6ka29sG)zS|@@tr&la0NOj!D0J!j(fnLuy z#Z2=E1@SE;^igCnR4^VrBQ^0;a&1H*>rc71TRRcbHWeVhupb7}d-)urqob2QOlZ5s z1MJR*ogaUBy{%Yjq}v~{Cmqk|h{7-(ADDL4>sfnl%aV;zroonmPBt>Iv56U^2LLmE zh^Q}xEGqtJ)Z3h0$-hXN;V@O*Lp#d&h;FW3AbMs7-PA1uL z;94|4T*Q3!WBmIRyW$emGrkcvvW^gk9gN+bFIxt+9ZvS`1yNcyy z(T+3}A^Zc7TB&tn+oO5)$WdHBL*|NsstgeWNpvKPEeQTjv%Fizn8OqmO6riI_X|{^ z(=wws9;2az-!YpO9dQV6uiH4Q(CMR`I$5I^pWuvfdI%Y2m|##`qb1 zT9IsCJ5`x?IzfgATdY^!o~s*=-jfbbtNB4WY4pxyliE(t5P*9HCNtT79?|}v=-T@+ z>{y8WwPA8nm;5a8AH72j=rh_b$9=!?4&t8qBr5es22E4XcSc?>vND$JtU6k2t1@;k zSrMS1?Ak}uuCiREniBdF5fNE^R+%|CI@(>f_i=4Q=WMZGa(n)>w$awwia9YctbF9~ z&D2zI;JnTZA0W#Lqv3(waOA~|fJrf9Z{8;^MN0tfX8BWd7oEfB@mCidcF1tF*Dh6i zvr;(zV-qs#L!5=niOK~{-PFcDb%?6Gn#I2z{)E-dJD@b8W@IE3qspx+?s-U1B$)*=i#(U*N}hNJ zK->3ptw0?KIP>tibO%20`CKB>w_Zyt{-F&EfqPviM6X??ST~PX$Bo779GkP2MkE+&uqDYlTXJ>N&Is2 zOe3qL*poqYB2-=2Pt1gVT@Mf-dYgP#N}^aKelFwuFdv1-Z$&(B$S9=h8lWE27QQXh zrdxSnP)&n!dG{2*%c`rjGP$VWlDOdZdE)h1vKG$~NF4_FsTKrYVtbhTgQyA`6kTep zcb<$AmNPRKE{zioPdr6ruSe53&3ICb#|1riC@ojK*c{$BazJohvTby8WzCIjyX|%n z%i!RYyq$DpwNX&wFGeHRYzE>j)x zuLz<6NP|`Py@;m#EZ~hey>w(Xy4_`0T##xp(f5g2zz|loc00c~x5Zlhp;+FX(0B`b zINuCM#!qLkwnlYz#6(pd03kWX&2e-06A!z|I}M7H&S8Gr<12DU%sgimhpGgOI2yRN zKHG(HHCReruO;NSI>?P8Vuw9iq+fed?&!Z)gh)99vruvqakOr)5wuR1aCTSf920I5 z_!7|Nh=oP5^r~l=MeRwb8!^CqZ7VAMpl73CUX0=A6>6KY_o71+4Jn-11YL>*IkH*5 z)}#Vq8835bfiGFGz@OrQtj%NH`-{RC$NFLYrfw1*LLRTJqZ3qn@%QxVZ}wU_FMf`i zWBz8%0auzNBuNfV8jU1~Rm6h?$A(m_D;y`pATAX%v;ki@RC8xSO4csUxGjG` z+30!Xr9bN_G`%rY(y!rV;7MD28BU%WY|!cCc&(0@Ntn4GNh?f}dR6{}x~{KMCQ?Y|}9usp0>w z7;`~``61>`r{B|NA2CLMI{|0yQlsTg59ztIJqB{Z zK&2PcjU!GB4zIwK7rsY6cwV9RIK%}p;vz5cJefW|%-n^AN0`qsprO{< zGC`V1G&0BQ>$0FCTE@Ax{HT`&;TVH3#lun<-!b*B!#uE?@17E$9-GX9KRq_w8bZVy-B53VoU3|V{ z$+|w9-fy_lbF&#!!n@usVB4qvQ#1S?9G4x+K;eyfv-}=sV$>V9K{3luz2jNOdiCY@ zh(IBo4?cF;7vnhVJ=)E9GoG1JChoKfW76(QKErHfl8+S;m7WaSN)D*6PT`!JQIx8H zJ71t7h${|T_YMBrXT*-mPZ$Y9EQ=LrsGTDd!XX4%-vcKx_lWR%#rl7xa`~VNe>#V6 zc9s8D=D2RipQU|@k4_;p)!Rk`t%sXK$XY=4kVcTJ-GZKc@QLxkv*x28cmmXy36Bge zHP3>^1;VWtr9i(G5d^&AP(I_M+e`-os?crwT(n6(--2N2^MbcYuhhL;jROL$dbi;s z+#K~SV+cl3Xgq~0cj$#oPO<@GcUu?-CvXlsOt)<(&ADzTJSo;AO;+=jJD{}ghYQ8&u0+U+l|c|cCRf$ugh)T+tZ6mEOIRWzgb?Wdjx-AosBjjYYz8PTRX;cdyj}; zb#(?vaB~`yKeS6*Vt^6P^lEpIsL(pWdNH=iF9BES^*t7K5%maPVb0EL9NC}y*H6z> zJaR(c;*45*s^ zmX#>;-?(p$`NaKUL->WJCN7Pr|Hjq9HF zLrxYd)3dz4LfNDXLNWX5`3pbYN5+^wc~6=|**2Q0!6W?2#qBN*P= z4^<8>5`>0Q*zL^L(`m7-qGlM}hrC7bDTjF*T(B9ZZ!9GikJki;kBjfP2J0W^mNC;j zCrZ^TpyDPjE0i{7%JT9Rul@d7hA?`ATPcsa=WG$>g3V!;% zJ_~@K?}ysYV)rGDX2iNDE!*TtDaL94}0_JN|}b_FIARU0r}H(QREnC|HQ1=%k z{IoB?;;~IMxP6&l{(*0d$9xGSrKQ&a>MQ&jZZyp&TGHy|dN-L+Ui=Idv4wqpg#<28 zT5(>3=3T8>gndnhh+mT{^x6XA;^ID^q_{i_f^sDOzEhv&OzYdE0wDsEo|Swb&5@IR zFYuH|<^3zOMK%^|#T0Z%f4|GXnVFFd5;{9Wns0Dz*gE@Fp^pHvx^+Z*u0S=;kd#3& zTTvS?W7lM{QV!GnNlkj@M3Z>Qe#Zo*+Cdbn^Luc)XhUNW3lA}a9V@?oJC z-`-u7Km)D0tpUr0PR_g5dFG(gY9XEG4>Qrw4&WVIX;(s|l2DwY@h@i&`Z>jolC^I| zH)B(>Gb5*H;3cF{dU(TjixFAeo{?HF?_2VmmC8s%>kb-nbRj&A4>3ewCOq=}!j!L3 zpu&jFF#TB((Rlt4258(fPKV5Q=DH&!l)w*U?3@1F&2fnWSFgBiO+g%UTxO<7TrNJ)qEraTFw(ss*EE^sUL~HrRR0&W_6!5}w^^2QTsFOSz{`J+!OZ-%z zImfs2>4u&4-X6e$h4d|c2NHQJ!Rx_NQL#r_dDybl8N$>beYm^ZC>b~&Xk_ns!}nDb zaEAgb1K_mH)Q+{c8OklR^LjR18wV#oKyQyAFf)EDSI;9i1RboCUddwX2a+naH<%Ly z(Afr+S9@hns|!>_`p%nwE7d9~Zb%(N{ywO6i8Lr!X4*WvL!+`gD^q~YVwCUJlIz;R zItRb0sT*!qnM~w!J`Zb#K%}K+=-n)}v{ww=&G)S(~>M@4#ErkR+HKb|yA==tzz?-p*> z{6nAUyN0oM@gqdVUWCP7KttRxCO)-{S|jNcmV;yv6DA&g=&+37tpOn=zfKI%CRZw7 zH^sn2qR~~dYC#5vMvIc%2;%Flgqww_iV$+{;B|fFK+5N(P^*{=UW*}0uz!de0yFMr zYZ>kSZi3PC*im6|yAU!qHbtu6-X_=>a}|+J87BkU(sy#nJ#yhu!L;d>WvalzPh$ z8U4eD`T9FstCcErvTxt)wmPB89so#pA3w>1wU|SBxY&;O1iu1Im;gqWJf4jx17^Db zXsvRML1PY3XJPHdt@#inm7}M=@$t3H;AkRkSn??{e(36=N)>#{s1Zx36b|V;bY_@oVHPj%PqpDH z)FqkNP|qAgJ4_@;X$1i@$fSyI2{bIip^&NcqK*%-RS_US`F!$ou4jW|^<)39M*A&H zL5G)2+zc-2WD|BLu(W>`F z(vxM<=V+TDq0`QcCPIOAdO(j7TV4P#m19X!^;WqQz|&>6IQ3jqvh-TA3Ts=7Y$3xP zd)~6MJnW;4wtK^aC`&9kgzr3vR@}CwTHAKjVd1|XdADv>EX+5U@$M|S5`Z89XD>cC z-jeEAF2Lh0`M`X9x07<-Gd-zK3Oa&%x|clsPWvpy>GsTwOr{-tbL(ZI zY5o$x2MDlGB|_3rm|m(7H~YclCq!29R>I|Fx`JdtWjQ_jZNm6&D!kr#e;)lJ+YNEC z6NGU&`k+88f=s}w+y7F2i)UIxGq}M=?rXCYalHJ^4s!W{{Lp~8U&6~Cp|%lJ_>@(C zT^Z?fkG6oaimOw`AuMd(;F@mUQFg~Fb~6Xx^|konM(k2EJA7Y{oSQs3L#GQhF(>pS z^xEGOn0BCfg$AaDSlt4baH=E#(YTbM{6C`-31dH8A9j!ZF`XazJLU^@vC{$mSr1fR zXWOnK)B?;XEF<$~zpUn~HNhu8w?*WRMO?ZS2{~<`$A4srt2wdMiq$*I2|w%z0KplM znyMw{>AHMF`K!V#udECg$r@PO!bX9Z-vbEBf)|3v%_m|ya`J(4+kr|Sbfq4MMn&A+#j93!vkdHOe{(?vFr!t}*4&f{NOL!YG;;ZlJ1Ck^bV)a@;!uxWIAR)6ES;3IjU3qD z1jXDa;8FpKxdSiPhtux%>BhSVP@yy}ahayy#*b}ybTF`zn7_TozI#)Ux4e++w0OX= z+n-(8Of2UeaRX+RZ_V_P!y6D<+1c2r(kDLVS1!mqaM@G{=jIqv$*hs|D)v*ProAt4MLp_ica=8D^gWXTkay5U)WAX=NUMHh2 z`3<o@>)95gXE>lRQCw#?#EcBLe-q&+VIy#?~!yE^s0Y2Usl}iH& zirG4tA!xRZsHYF-bm<+Y|I)ET&DqUIITGzB1H{-A$|}kHXdugzV!dQ}NYi8l$J2G& z)@JkFg>ruuPw_8dM#^98H5io59)v5;TLGL&DT~8Gu|3Tl4Q3+|G{nLs9Y{XF+H!(% z_zd1HfM6m&M#o?8rGOmXpZ9v6@n&+6dLcq*A|F&!BJa#aJtQa4D51ADh^XTC>Y6Dm zGf_hq_gGL510Dsk2&jl<P9@>@%*JY2s}qhmKUZb; zH#%)sU=2~#BQ)N!WDhopL;#^n=TLWZ>-TFhLp@&tZ#XLld0w=_PjE@OU_zH8^f$`p zo6jSyRyLs7~@zX7eA2l4TUR;5tEIR_QvQ5{;l_FdRAi(YaKEnPs@?kdf#Jei zMHKVY7|Lx~Es;-`&R|=w$0BiqbV|Ia@n05ug{uxXSLaRJ$!CrAoQ9W|1`HhVLJ=xw>uw8CK+I)j`4ms9i9L(6pz|CzGGPFnr&LcA! zjwN~}(U*Qu&K5i#WFtI$TWR&`5V6T za@zjUna(Q%A1CI^%o0&98cd$zW%#0BKE*8pj9J33O#e)0oQ$63m~4|1k!i>FaFjjC ztQrm?qhOvHW4+H|K!LofiXmeLuOk>KA~IF_2xvn$7I;2=oc2aw`V5GOFSr~CGIg3- z;dB@jxi_V{U7qR%36czE#`PybN7Jleoa{G%bO?I0vKCHU{Em@vEP1oYqn5@K)n%K# zQkB{9b)xs<$)R4a+=qjzYjUp6J$FQA)rDH%+pk1bv;+TFlr+MxJ~rYK&RwFIb1%6J zp!fF6c$HZ7CIilMHVwvnvwNAz`e3=(%^bgQ(TTEIRp)vbj?>$u$jBh)6}9dt{sqJ4 zFN+Ec?6P7)yn_Si+Au805=8+GY*J|zTNyx!hsc1~UQ7dv z-(ZL4L8#+E52FZlN@r(2lQ&1rI@OV~di!gCxazAaH?1qDWng}$`=+2{zSkW_@$3 zk=QPeHL{_<9SwU?F&wBLkS535Z`6O-3FQnt1tXny7Q~q>jcPb<|DAcWFY%9tejJEG z;(SX905bG!|5vE0qS%2Yj-kdxb77=B;8P8rRB`bM!_ZAAK^fXI)#9xM23%60*bIb; zJdO@e?0cCIpnZD2);kZ0XD-YXj7co+`5#C`@aI{1+*L{) zja`e{@p`zp*K<8yAZc&^%dAH|gM)-NHlE{Fp})und_J{S{>aB+(n>%l^F5deiSaST z@w)cIukuhY=AKL}=L-VZd9(4z${Mz;4Ry8zQ+XTh-m~v2ZsEX-VBbJHz=pM9F>) z-MB0&**uX0p7yf>9~Sst*kFZ=tBO3_yC!e3p_n&nw?IsQ|}?bwMB-z(>1}?&wt0H^B}qJQ`iOF zA7qku6kdR%RB4aEI(ky6Y{+ZJ<3p1hQzzK$9I_bk))slFqFIAvY(;cksng?ZFYSP+`#(-iA=*GJ0!)( zlTuu9K$&drd}{xaiJAQkV2#Y>z$;dfb8e{AJ(~>xkqWlX&c6>AF z`0HTnffZbH%QQ|qQ%+6sdMr^cbZmU4fg7AaVgXTX**;)W@9Unxf+9h;F(@ttQo*N> zjU-H~7r z{C4+9&A+%Mo1!gV1vF~2cT3!EuiJV6{Aj~FDc9Ar~?fZ;St#uIff*c zlY3S>XNQad>~t8bloQ(G!w+6(c^W{*(sxSLLu4vf)?ZyonWf6rSL}#p&k_Od1!$_6 z>M$}IJOj)oj+t7TW1Q%w`2}R(D*r2zqX2VE{~LD_;W~$%D?z}dwMS$KHkEo` zes?Pe6v!UhywJq&4qPt&&f`rntR7rFpd-GQfQ2pfm(h7U4hMqeB^`8riE7yD((G_w z-e5uWiQkfcVIS|0ZKF@+6T|oOx#`h4^t8t80ZHl!^~a(2-XsKazW3B0B+ z4LCz(WtwuCAQMbVaaq$>El&s03qry&-XJWDFPi_UahB#%w!{oNRS|>5mmr7|H=r;} z{Kbv=y0~wyW|RS(2OkO`a~JuDkf3hU1CdnNGA+*@)>nea(uh}~`YO+^dOlr$B4t#$`sXge&})R?#jl8;V@{ ztRR^fJp=#_&T#?hS{x=)R2a2XylqXy2Hw1K-yM0Zm+ z$N*CvicZyf4{%P(;3A`dV2`KsuYS)cttO9n+n*O@Txe{irj<|{g+FcxEN1Od)4 zfCDaTv5d>VkTCep1{;^P9jhRo$2uoh>K+8!%K;#$eTscm7JB3 z5Lro!o;plO)?E^yRVTHAN-0MUdWlmx`-#XuLC(k&X#>V0+NC+T*$J+Z%~m}f>ybMDgS%; zZH7dW+uPf#xhAjM#-!}n`RBV7YSDK$L&E@-_-x&@u5vYzfSlwDJD3jg6;+Q&#atkljCDnZDJ$L58@txYONSz3&ucs~oLn#aBz1 zP-#b5P{1>u*~?vQN9)^velx!Ux28A@iY?;@JNb|Tk{W!@2+pB?EvP76^`a3C()m3e z0TC?biT%*OimY{PXzb?)qkY%vRZFsslxb0WU^qUK#@8hl2 z)tpkt6P38ZU6J*3;Nv}=F!Oh{`$o5WcXR;GJ^A~Cpd%yuAgH}TOT^!>@X!s{za*0H z%w+_v+NyCl1UoSXD9e@qn&S6VErBqj%x_fvg*#;0Hr=dT~y1h9~W5nG=Ji+`ul zzQ9@)1{pB(^yTV{l9_;0~Eb4SITQhPq#WS_zhTzThF`So7Bei@@C_>_;ycMU3BY_#|jvGJ=|qcbyK?$R$WuNbj9C4V)!v5oQl;0WkzT|8m;oiu*aW>v|w|h*{hfcq%x#U_d_97!-AZ>K+ z(cUyqL@C3_wTG7BV3$%YRsLzu;# zpR+XFpc~w(O9ep54$EMk%#@fZzaa1L6q3MZ#W0*fC_ z%s*l{3tX)O>IA4Pm+J|&&+U&9<*n@0KrDtu?sUSyqt(7kK=Yaj!q?soh-p3;CX|- zL6qP_OU6P=jttfB2OHFY#Kz$URLBmN(*%Vt?3x*nI{n*~hZ$C^YP`$7%`E(pjNL4KiC$* z46TvbcmC!or~x#NpX1{Lb*~dA#kp{RjPe_}P3lY44GfT82`lblKoXBH==NtC*xonf$z7X=z>9R>vMXf0F#hVZxS8FVS|mgaVrcn+ZR=@H!+L?{Ms~pR zJBy6LRQ+I>nKG!c)z#C5LyaCWa){&cPyO)5_Q zdLVYQg@DCT_!8YPU7}-X^Fm%F%&=+zDaSW5<}d1ZS4+qpgupwgp)wJ~o#xWSZXx(cf2 zfGmtvf2_Gm*KvnfFITN^lpD0-zW(+`ztPra;eUCLlhcC?bGdd|?#Svm(cwaU4Tq?* z-j{e|wvA0wN3O@n+=t!MsWl4h2R;*!Ai4jG|domNz&Sxo@=IimeW2k(6 zE@jqwosfxnaL?AL*RN|#W0E>E7-@|+1a+e#A@x=gTkF5#Y;BT2eQw7#u=qNE+x>En zRY&L^e{OAK6=g*?3OG$$l#4^T4xkusJ)zC^*&_heyGa4i8Is>7{L9#PU_jo%lH8gvBo>*5Pjd$28o)M@N~~9X3oz8I!1SM>!1)pBiZAn2H3+{c zTZ%L}ugqqE0dsMZp_`3E90QnGV9mx&;j`V>VzI@frRZ{hNpl5rH0%Z~VvE=^d@%sg z8^7mV^bwD`FsQN)eZ2k5!FIm=J!AzazqETkuUaoMj7f{pU3NK%uIN6{v_E?#TQ6R@ zNzm~(I}ruj$0)iV_1`WYfAidKtTu%=5==&`Y+FheL6z+zAm|(AG)_Xj!8(ZR%;=Zo zF~{CoUpL0*ySMG!ixum9U!n3yNSTI{4Vl@FF8Sgrw0Y*Q)v8(dAvokRV7g?rbr62| zl6BYPKnj?a&LrVZ?ug=7L@CF38zGFi0g|0|=)csI-A=Yh_~;+JWRVs7r`MLB?(vLZ z>(4gLHx0S_X3|luKbQM2@Orm|sqRx8k(hHiv*`Gy`ke(nAwj;<&KRU@#(w_~5&qiJ zEgGauOa5qqfcxF3_#+~So?f`npfw_Y!&F9A7Ld%ZX0E1e`3qL#O+0hNAX=v@xWJNO^x4#`O&l!~FI6FROYbH8 zDl|#{qQ~|0CGrQ3!GL-6mN5uKCpPQChKG-~?|ZKx_o{c^5;J2&G~53YSLN&9^&Q5Z z{qep$RgVBrXN`u1?#Yz$iO~z1vyn4PI#(3J*d<6&*{)-Wpd#^ z7c^8Uewo8dF@Z%x#E8Vdhl#Go(S!81pS<5Om|^3-!mI0d>NHwZI=zjPt=1)PaF#U_ z9po}1SXKSR-M@Vqg@tIUYm~nHwiRzwl%`ifO^wUh}q0SfAUBj=SXS4abhfR$My z^7bNG-m%?@!k^PaCwF-uYp#3mZa+~ak~C+vs5QF?n8T3XTph+h$>h2mj00}!K9x<5 z(8_g)Jt9{z-&xmm`o3PS-@T7DV3P1A_w^EjMk={aB1QDpzD>79ROI;zVVcPE6LGa( z9h)-vmH@1yjNHuOHC7L&yln=EI&YzwrmL&b1pF*a!3ZcxhGIU`HdH{x>FN;obS^CB zh2xf@zqfIw3=IwaUF#t6Ri(X2`;q$JVZu#!L>#(W?o0J+IqYv$?^+8TFgxkaNJ&We z&`ox1Ap2}c`g0roit?9aacwgu^1c|H#RWD-K3&q4hQt?}&Pfe#!BMsk6C_Oc>KDIL zXni$X{fNQ>mHXF>G+>=}w!i~7QAo4LOnoU51l^`MM+=2K0CJLgK~AqYIR5TbOG^XjJia^2&;@VUyjozhMno1f*x*&!Dt zUJqo!oVoz2M0`I^wo^{JgLJrVzodD(td{|F-zRI~-R*!4>+K1h>)sNH3zdIKpwB-| zbE7Do3H+{>h6-;0o=$Z7>Ua5XYbsX5cxc?S2gQBdZnc+Of@3Bfxo#eyYVbp12L)^p zina7C`=*^@FIC}*?*km^dqR2`F{+&}jbz%te?<3O@^Ya*Y7~NSzFBdRi5m}K3K`Vr z+9i$v;_tnbF+5eZ0fL*k7qm_!viKCkCd{-7LX1Ai0E zEXoBnQ?%rkWhQ)HA_x?S3IEfdU_4{9^}OnQ!XDRrW)3wS9FjaeF2mt;!!5r>U|McO zDaxpyC-mcBscoQ}jEUq=mxD^lzjXtyN)M=fpkP$Z3eq>cR{B*^!t~Jk@E#B%`HheN zX}j_o@JzR%guc}mq=cdrSU(o{$%Fua9eTc5{m}^JsezX4osi|AduE(g3drIHjA2?p zUaLY3qO+ec?!`#AStYFv9cVGyG9I=!$g<3BL}WsT4i@k=+No2Ut0aEErrz#z=O2m)?RH+Z3O1%nq$z}O{8!)*V_cB-)VZ4Ra6WH)bpCrUS8$p2BgbOgwmkM4% z6CzW+9eH^l{lsG}QPJ}Of}x?c!$5n73&ix;V+xTeb21`xj*w>OQh=fbITrp?lygc$ znGigatKD0hZ|~Z`jXs2`;! z4O`>qfinAG06izd0K_(V^m0fFsOW7po!~dN&`il4ck%j@LQ`zLIZ&uY;5PxpwXVfr z>J*XwDWACAnww!?V)V?47@O{depHBc{D1yYL4^+Ix0+ueKXIf#n$~%e21vjoAw&)- zxfTJFmhw*u*=?}dc{4zLx3zD{IoeN;z1fe3GK>);U7pEv25_^@YX38C0Kt|`M+1oo zJ&vmym-f*r(7L>bhhplqD7jfb6P5LJ~*?!aB4>PnvSLEs2MF5X5#Qaw&+M4+NDhZ+IdX0Pt!s4Ad(@wmz;_(?}-Ym>e z^^?EnL8UQZ&iI>&^L)!nbSta9E;xDVm*R~9khl->|3VQD%X>{i977xcW zgSh-PV;PXH+JSuCiO+C&V_A*XUM7(1|yPRFjp8p@0cAs!$)om7Mu9EAvZOh)9JmhFF5TX7U zs`)v%{n3*3POz9(FwirT>9Xy^0YFMP-TL3+PZrHd|zjyhq;08O`1a$GYw14wDq;qu+C$rEhwfZDDa;^9F zCL7qo|FLQrn?DMky2xAHcg4R*W!^+sWhZ@^97zlV!zfa~B}I0@{c8mQ9zOn0?rS*w z&>+cpZ4-wp{dAbLcW->ODC@x%%YR_Y7xg0|I1#+*?+aA10$#a6=;T?#bE?XRd>&ch z!2Q1|qxu>zs={DUdtig_Zsr$x)4a&V*DronGFzs|BQUi!e>*)}a)h@b=Xu9&z_)&h z<>JV;$T}H&BK8#&8vj+=BLwAJn0j8}DoI7i(7?cyf%Oa%I1g0h%#ZOOQZ3xJDFxAk z>5%qQJz+uz#A$&s?kAy^xxNxKs&F(JBCA>quq7)f*x zy5P7tjhQ-~;hu0A(1Okm;DMx8A6b*8lIj@O;Y;*Qan_&y4<;3R=+;Nlr&O z7pU5|R?wO$y<1K9^+#psQR!9}L)J1oI^eYDhIOuJn4u0UsNxNX4880M@p9a~-X z3r11hhoDYnzmi;}BHYm7qY~$vQU>r|{916z&KuOA#0M!BLjU*}w3L|71BCT-zHxxl zrttKo?9XT2mN+{;^iFI!lyKn6i$XwPQxYc9y;)Q>nmbb7QW@gI^J~?n$O$h zayqbXvM{I!Ox@1dQl!|4E~u@2Of_BGKYBYZ!}g%}()@pFYz*6CJ37ct%ri4K{OG!F z2YB^2Ut*ia$7m8XEkq_$8-geSL-|fs7MGL71yOv0_mC-2QK|6NY2v zEI7p2)bA?er{cO7&i2#ca~gGtt1KZc*)a3PrdZdVei{jNPTDQckMA=8>WO)s`>L`u{6mv()M^NheG`JE2QHI| z7*&qxUOXWrc_LxJSG0LciHn}rzxo8Y;87tUFd-?bb_F6$#pIp~5s)V0Qh%QG3xWMf zt9PVNigkjy2t{I6Nt}>rFV7V&UmHjPfi?9L==et&1nJZX3{Gs>4&rFs|Je^-G!3j-x;sX+aTwa*b zV%f07ci5OfydnGw1pdDa2@JhuCkF*Jjb?hp?ni9>V{LtcDcYE2k9#;V6uF>BpF2qg zmuTs0N@lljo8n*;jL&B48fw;LRdqRugT0$Q7EOYV${a$7VKQm|C+=fQ{eAUt^iDqD zNozfn8PK<~3l`6`adWNh(-5Wf$~3Hi!BQ7O)^M;BEKPX0rUhhQO=@8tR^kE;j$sH3 z%yp?rf_N7}2n3-kfYn^vREZ~d<(^yf^>KmihC_A8C4w%gHx6JDlT4=te`77HzBWby z7&NiO0+&ys2^2uIBk4G?dx=sBX%^ip()5Ckh4{tednVjYfMCFs49+=fziLlq6OGNp zuk-+-_@vF2=Lh>&3qMY4bOh48SZ}$JTCP&GHQgx7_%=ZZA)Xw~L5x5tlQCTqj{5vE zRI7@}utXiIzAef2|`6b}Ofrs0j^?37l|b<$?(TL0^vtKMw(b)(1IE@;E3($UYYk2GHBrv;Nl$ zKr@QAS}m~jkvLb7<@Jv>iDRR#J2r$y2klqQu4lng>(=kLduVH7P(RseHoCkKRJNqF z;@EY%E2sRh_omQ*pSoiLHt|#V{78?fQ~RmWJ&695e5}eLInTbvI2n+~otkF@w`9Q) z+Oax0(NfM<1MP3{;^>uXYur@7ZHCC2{jem>h4}u@k)_+dd3|#;0dC-169NdFwbpc& zFqni0u4n$7UEqWXdU+osItFsLO5ajeL;eQM@DvwnVjF zV31VQa19Ck2Mfqg65=7D@J2tmb%j8Rzx8 zT@~rHPgMy8NZ~53+bZ&W+7-(YS|0_xo5@0WmAKA#*1O?c>^OkeT>youG2;l{vtw_> zG)5YWGqNBF2{rw0`-qiqT9A-5O=7qBBUC*P`&jcc%2W7a=T6})H55A^B-@U#RluEuWj3&d3Ua~S|tg~SV^r3+&I9iuQ2)HogdfC?cM06Q(Wq`@J#Olx@p*=*6zi{h@iK8(0|IzMFOs zSBTkeJ*SP(RBmE_MkV}5cU)$3fL3U*W@Qk-k=(U!9iI@6$xVSyn2~^2xYBnhRNKuP zaj@kJy7291lEhjeboja0zaAi-FI#4exCvb$;2~lv(JKEzKfNLzHmM&Caua!uzvOyh z3(fyK1Gi4a4ntEIcIAiSe=kyBb@;sW8hrW%6k3zM*5Hmi^wlAhuO#Y!o_wwl0R1&t z{57mtz({OF^owon)DiMZD>5gs#Spt^e8B3Nt6eJ}p_OOwo^Qj<51VW|xCEI#D0nM= zkoc!LXqeOZ-TM|+7IF50Qzn5kLGRKL{|9lghukwK(c1l!Q*Ppz)?FgeaX6rrDsBbn z@P^}4v4fSUc-?u;g4X%Y?w%_MEs+p-zyD#7Ih2FHeNK=)@3zdU}1)ll9aA2EZ3DQjCz9Br_1W z;61Yg^~ZodqIDqPz!MYRe6V0|e`X^iM02Pzt2vuU)^j>jCQ-?rTy$?h;y@4jfeH`* zbFIws1%XL*fj2qY3G_-E@=JcBCVql5elO#1OcgKyPeS?IrKIk=Pms|GGZi85DPl9; zd_26YAdfSeB{ZF{@~YNb{~fo@WeY_VxlXPx|38jE$mWR%w9b+vVNyw}IejW_ktR*h zXO~mfgwOWdpaCo%%TvoAPNf{O5J8O>7g1|54DV?Wm@0(9CUCsSMrZt*k9(6my)89> z6>tZ~Fc@L8iH-%jfo=l)ks(Pg)A%#0SsbIujC;Hw46wg?gVPnDzZg_vTCCnk6@4Fl zYCQkqcp#x4G=1*vlQm>C7KEePXGA_gSJfHP3cJqXct43?fM*zeb2~J#yq91g6+7Ppbml;GZE+5IxI32{LQEInE7pLkFgf}ehrip!-2_$mTR3tbwI7lH!tu`Nyb6g3QEnkg4}5fdIttH~NJCw*DFP7Z86hEHsUn$% zyQ6t%>ob0Q1V_xR!`OjA-t-<)QntLY#o2Ps&H^P%BfL1AdtF7x?i3xU3tvHfEwK1~ z$rzk&?PSKfFY#zp1?Z5ne&q7t!_#QPVK1Nn2ZDcBD2XQ&cl zp%EYWcU~kB26^tq;W|=L_vB9S>!R3!mUDDKjPO_`jeIvHP3@v5ZL#A|vGUAZX4?Ph z5f#1w@x#elw}|wZF=w1#Q18nk0w6qzn;F+Yph9voY_##}iIGXfyL&r~0D*~( z4IC(i>9)Fp?7iz>a(4+svr_W0*qwN~3dxk#j)xE}%I(KOj_NH;^vss$TNu<YPYL1&QRh$dC_G>tp-6dM+n*7&# z)_7%)ZT;hs74f1Er;Q`%&-kaha4wN+5z6@)by)nJVLqu=jQ?IR)ct|jdLT}+YvJhU%xYJ(dUvUUg)Sy7i%Gn%=7kwW#_Kc8Iy6>kNB75 zU+TFb@eDLmH$7EW-+|5#WEx6YU|`ELNpVapM;qW-KEeVQ@ zRMHNrD_Vi$ZzaMUH)R_LbXqTE^bgu09W6^nt|xpYn@pw6W4TX(#C)vs-z9*sWvPNO z;E}_)Uh5&UezmtA5vL|uVVOng#QL{U$!W&Tw#pOU#(ek7)<=%vL4nQgBIjsw@`#k| zh?;R)7(f&qKJCuXfoR&+H}r6J?$QK$n%LJ-3&KEY9v`_1J31=HV+F>GL@J3G)QKco zhmU@_9dInqN@jKB00B4M>)*Rd$>SA}Fdf}-G#0GgbwLE|>X(2L>q|p7Z4+YQ{XFuI zw3;=0L`C^(*zplNxa2rG+n+3)(iJa~MQutAYp}h7Kk$Iza+Y$N8{5vAVpVc~g~Y~; zrVDZ>g7R_Elr4R@p$lW+z1evpQi%bsYl_)C4-X^JbNM7{!KQe_SOJN~ux`_+HVVZ0 zzV)06U2;Q*wOj#5WQ_V{Z>`&E&xaMq%(pCZ+OhMuqrvB)^0k?PQdGCphA-;q%VJ59 zW^5fGqe1{$3;d9t#()X=s*Eme9no#*dZ{O5=qrX{^8!Xx?Hc62Mx#A@NrbN*ZS(F*%I?A;vi!8M7 zIZnv#Y~TmD(ga(1IkX)gqJW8!{Q*2c-J#wcrRVokGzlrx3+qjn4FdlmYd;kkY933i z={ir1d~^dFn5sP4Y)F^wi+>JUiU8Ia5$!0?|4f4T_a5>Z@y$4@FLKDs=XaS3fr&id zY>s||>A>0^a>0TKH95IL^7gHz#VZI$+U&>al2?W(J*lJ&lZ1paV_!WVEPHt3&pZvB zUXL6x%wH&?U`ydj9k&f>N!DDiurRyVnD&+FR9!yVLJ`zDG39YSL|&};aO5!-+JCk? zzc))%;1|h&eFcB!Cl=T2ay24k#Xm0Gaz4+)I4c#E^m)<#1F2vZDQ0olV#T_vP2)2C z{pkD5J~_H65Qdgo+pGvo-K4G#aB2TV|AW;t0V53nSkAoAx zT&##wli1EJ4pq_V?c%4qk#v~0ZsOZVwP*>~+!O^Ut;`|y`acs=2sWQAY?9)IRyZs^ zu(0{{rGcP6TlI)2jEP|ZhhejwBVRv>6f#Vz8lI!#o`;itoOE8ye4Pg5W;aYmzIny! znUKDXXWvpL;~J(gH(m_)gQ2;G_k38i!bA7mANJO^ben^TRu=}2+CmMfu<>P0MiI%L zS;r>f@R)9?t0hLq!q{$I53ymvw$bwfy%W-ytwT0%f#;)O_}}N7QD$kOfr*4?>azeg zq6}Lu!E@QgU|Bj`QUo#@!;iuxQ#CcsDn;u^MqW!|KsU~u8tYH?)@KPLoD71h`nREqDeEO$T7ihVg+OZK>~Z4|+j7k?M)88$LC4r(o+T2Bej8IvXS#A*|eu_i_f1X>7ouL>uE^XufWF2!?ku z)UvJ2SJZ;Uzv(Iw*E&>aYt##F;E5hL_hsMxP{2TBvMBlrKh-2n9F=0>b*Mw0n`F<( zG2YjV(Nw;eisqS)iN=RVVL?N?q^wz(R)Wlfvu3SIH5@S zts$4eKzN7y!3IXL^%tjU3y0dARcMZOSKehttG47dWx4T#6VP5VfDMtv>i|9kCcU)x zQtw7kImDKui40e}?%p;T-je{pTY8pSWI(|^wrs@9@boUOJ&)+)D_+z>wP0|L4xPYw zUx$Qv=b4re;-MyaZk;V3WcOcU-@F%J25Y;#GbsQKoXgz;IYCYRPBM4(md-o2w-M1s{ z{#rCBxZ)L`lIcu3pYqL~70@41)p`S~W8~zO9H+G6AcdTD?e?sPmz$cOI4181YaIEO zzWOp5-~Q&u*h;q&uwhEreAydw@<^Bxa4c8ICNtGmzXFq?oKO$#{W>CHlQuBMt-gJ> zTitvuB=ixybCm~=l+tcQEJ#l3;O7dpD09B>OLAU#y`0jQ?>GsSr);dCG|77sw*t<7 z?>rdTz&5(}hLjDfK2(_DiC8PQSVY;+93XN`q+y-PjWi;|t-T$iwG@=ih)=QNhmTc; zEnij{p4o|9WGlG6hBPROG@G6o!^H;D-S$0Acj=bg?(IrSBNq=X&u1%I&-#%KDNY$KH%#}Y%5;(! zlCLwcyQ3yOOmkxL^GQ)5L+%Hn%?K5o10|+2H@DdpsjR7Fb;UPff4cl~y4x+7(`&2k z5t;r4hP-5d$1u1g;Ml8*CUthgOh!L%a}H};Xh7B~zkp=b@~m`@FI8-B?N{y(Kxioz zYTjQWDV1(eAmx(G6pLYw=QA~R4g?3+H__b*dK9@otq9e^6+CHWFz)XbYs}3v*OnVr zri1Z7QGHU!*ZQ12{sz_FIRSd_IJm*F zF&ZA0s1Sx2mdAz2+Nszqk@-e19u6^qXd^}y%e!a^FW~E!l-lST@qN2<350!RSIh9>8CV%`&UHKX25)IHjN+$q1y$qKwuxG`(#kn|iv>#RYsiLl1N3*Z}T*_2=?L+v@uQRJW5wAZm=9=xlE|M-m9jgTu9_lZ-jv zeYX|8UH7&3_{lLDOG`f+#T#uub!2b`{`@I#-?44kv$I(Lp{GRkNfnE?6A%1yZVA~8 z^HUgkKa5Z`tPEky8N#hyKOz!zP#Jn(@_k`5>I!PAy@YIy-BXzl&sIEe`;&hg)c_Hn zKMIPI2}RzzSmNN4>wj}zhqaUXp~<^S|3R3$o2E5GJD~h_ zTsCWIR@($zKC~s5TMB!q7yheWi)oLM+;$;zIH>5I?eENiz&cn}L>E+;$l-0vUsQY3 zQMK5{YPa4GCYIwOfq$;-i!V_0`6Q(Zz`}JXc{+2P>WLLHa->G422K2NC!Bbri9xdFWU>Kiam>_ zBjN>Qc3voSoc2!0-S{oIejUHTgI=#Z2@qkC${T}09nn++vT$NBVmHKbx+(&zS0+Uq{i!yHCYlcnyNN|JEAzlUi3J)unBky3RS*2 zWvp!9aAxn=`pn#hxN)%Q+>|Q(h;?_l_tsnn9(X?F&ZNBn&1Q^-#Zh3wKXmc%tKVWh z!7-%&NX$p!t-@9Myp}ewbhmR}kC%t4;?F_1Xhd8Wc{C$gTv<8oR7#KDmp9iU$Ib^g zPMy#972L<+{(jzx87Tu_Di%TGBguA)4RF=KhV&y>N?|K@DUQ8EPacZi|K1hs)UrHs zyAMc=nL<{Wm-{mXA5+G({4qkY86|mqt#1&trhFxMh@W()%HBR3d9&Q)Sqa&ZruZ!I zKIxlH>#To$Ef{A%-7t#MR?U03S+(fgf1IJ4)M9ih9#&Q3kmit~IP+w`)-<7RpYf7X z>)*UCU_`l-w>wG zTPCALK-)d)YERUSq0@Wzmj@;Ko;7)V_3fWeNSk}}^dpRdle~hy(_JF}kF&Q7h;sYh zKnIWpQ9uw75RoqFPC=!+OQfW`QzVpBx(Dg*P66re7#ivBhP&bX&iUW__4)}%eCOS3 zul=lg*4of?=Ihy;7X#MOF51B)F|GyWEK$chEP^kX^A#&C1ifSh4Fx>VmB;$N9t(@i8|T57@f4Ks)&ogSU@D!E+{c#?RO$F9&j?ThQ}1l~cNT;_ z6RvqDbR04SzEbe<1&7^UF?ujn|M;ov*;i-PkaLEEhu2L->Y1YZS*PBB#;ZTMPt&UY z9c;V+ZeTkOU)LpMhu3M4kK1qHeOM-7SOztVGITm-(HBL1?-L6u9m;xS-xJ%LBAX6dX*ntIew|-4N_@o znfT}7SWU~?5{a8EV*_xtjbz%nbI~C<2h80cZ7w@VU1HDuF-z3wXYAI9XEa82&80A$ zW?a#MPxI+4xdBkW2pi|kE3YLQNH0%!F@Fat=Y5{drN|r4Z#L%`$#kGo$=7Nt;GF&N zYqmeW!i?Z@@JT~bcW@q1veBR*{qaQZ8T%Ut2)J|E=NX-<&6-8kWrKG7lcmw;{^%8e zc$gDhR>~?@?n95J;x4&PvFDwd8jDbJ>i)cA&hK(NBJhfb)94`>$Qr4YhUJjrzrCrB z&=RZ|mHI}Q^hF_X_SeB$;&QL%k7jSrAuR_Jeg#DzR1EryFU(Wb73uooHEImx zFd&vy?TcxSkBKXRxl7XDaFj9N>FRb2k6US3+@JYHPCoK|BAGmyN&Zr zo-<_UKmY-c#J#^LCl$Pg5InMxpJFt|Za(PU9zuA~I?(hZF0Rex=4v?2Ox0r+*Nek^ z+85vf=%UtHX>L|g2#=VOH(C|%8C3$eWS5jMQwJ`wD^hZ_A2n0(^CS2r85pk(<{F|$ z7pQHFsQ^2x)?^c*st%lv*IYSoft8Z5E{+;!(6r&>C-xTLcPsU5eYbkcA12Az*l7#} zEs!&oF^#hYX80PJnYLSfoGt}V6$mm@Q+_Y*d&*AlJRS~eN3h;@=BYc|UMz%Jk~iwT z^$@=DxWXznJF^^qOk!{tnUmbTa-Hth(cj%bx;c^e-t-7prBJ6JfRuQ;B15)F$DQ?* zmrYuKXW9XGdgpjc@z89iJ6KX#nX%^lReLCr?7Mc<)U>pFz^$IOWNbKJqHXXL`IgI! zf!}ZKZCl%+J_X76xD%%4_P7~00>hi)!oBw($!1&A{E6fF*48$b9PntqjhI~2N^j4( zd4o}tJQWtgS1LK+3Ml1zeG_(qlt_@{=?k9fh&xf`vC#0d)qzsi+G9}tviYIqg;^W1$zglRJc0Sa_wT9wZ>h{^9Wf} zT#|RaDm2r?{oD&WSS?TP5du%{ST}2?sjS={49ZJ3%WoNCUpF zm0VM!9`DjjL|jx`{RO%;*9$H8wkUxC*|^&PJ!clsST1fkzFi(n#=;Wb`3+_Gu}c$` zW`%ik4Ad*rD(w1@PJozOVqT}w_8BzfMO*h+9x5hghWaPPc*@tshOkQ8tGw>3U%F5M z;G2qqU24l!##o<+CePL#-8(fF9gm|6)r0{`gvV2;xM;;-lJv&zH5#AldfBvAOuRAc z*NV@2y~S$a`(*4rJnn$LlP3~lUK7>d7F9UDGTB-|@8#bt)^&h-56pqgyP@wl&X=gG zy}Iq&E|TA@WeLA_&KqVjFuBkHIHTa*0x*q+Of8npsSY(nJWN{8o3JibHp z%@WJ!LQt8|chK zL&>L5k4u`urqxZfvu6$+#{^zW)?CgTHF|6&Gk>;ftlB+0mNF!{lamVv400L8#rxE% zJQ3c95vS>BCF&(DRlE;uI2eb4W8itE$4AqZtSil=RUa#8Jiu60lv{s~xoxWYjfQ>G z4(3y}A;wVm@Ms1FR4gq0wr*v5?Z!ml1wcou6%w)r`6%Ml?N(XVeU8*CKOu$*9$MEd zKNU$709l2cP#YCWp)OqxLbIaxa&JGup_tpTXCjg=@znRrPA(P|mGM1nSMC?sPL0@D zGkFJ>^YQZ$qk$}&)=PWKiSW~cc%0|YKNiOvh+S@?$zgc4=~-isvtf$KcMdp}IMjs{ zz$~N^T_Zo{eee8$-iPh;K^%?pm(7!qB?J>SLGSDjk{P;mUMyvaFL+GX7RY$7hS8=f zvb<-n(71lC{E6Oc->JxUKUhPn7kqNAUMEANnT3Z;eQ1UyAM+4R64~B)V0awT2;BZv z^cTEKoVbJsME2m@OCowa^cXF+4@_a9!GAl4$aQw|b;{b^+;%iTglr{nb^ex+(^M3| z6A+N~`M#bfl!LemW>Fn2Y#O*0vueonClh374vy`SVhB6BKFCOjC@bHp7Y}ZIveDBc zI}KVsI;4O*V!%*j&EsmYy z%_|sjy`qcFvfwg+Ly10~j1|GUK{mhzPQ(4#i_0{*%sKe|iyVxw^vx-|CF3qZ-O*sr zk`8(ePcJ6?b}DFN4CK>TKPyGFM8%9QH}VqwqDGr{hqhZOhCZ9cMxS8}nc>5)abbL% z{_KsH4JCD;@lPkQ=5&#UYDj7-y{~U93dp`aNqIsb?@ps67!eV*44B!{mdOcP2|+k< zGNHsy3--?#Dhr{N&x-Dx+jApbYuJ_{ZRbx0k|AyTD8AW5ulb&)`k(B<0(zJTdV#NF zvp-12*mR72k5z7GB%aqNs^bOozemCZ-j2Ic+o!}?&lut0Bbcnv!uYz5e%?a9XPJS6L&=}5AW%5j5 zi<2Sd9jtqg^_Y~qg~;kA;I}tqw|-|_k!KDxhg&u-x_VxoZ~}wceX*9*v01V8oY(S2 z0*BRNn_jC-j)#robfpJ!LY4VSW8EH0VxPUvd?Uy~FdJTyj*%oEZ;S;A zm0jDUD|$&m^Sw8p9*Hq(IWxBP2ZX@9TR@$n6$N!qp$o8nf5oX5^G%Y_MQk z1Livl>{S6J0f{g${O058Huv%N9I@mOemubHgH_%=?B~xvoE1`-JySN+f_!Bn{PP~_ z-rYH*J6z_**;Hl;06I(M5%m~fKS+LEKhrOEY$9c!WbJvAy~93<=l*T$yprc>Nc(p>i(cB4+S%Up5l~Vl5kZ-!;hbZJ7y2og{oFb z#OXcvC8y2^3<;gO`s#1vtq{G|^^im;yoYYq1u!us9poCpX=qKQkUTjAX7_p?dCyL# zsZr;I6eL)PI4lj$x2!-qVh2{avcsvfHk6e-zLlNZ9TA3U_y=~U_gf5KpC!(^Myp&( zdZl8KY2&1y)S9G8Hlcla07L)$XyD$4?T>F29k%2Z9sDg`t8YJC!G|VAqvy(Ecs#0` z?e8fHTQGbF8Dt~-f;I0E0JJ69_G)RH)g{-sA*=@pi^F}+v|_l)iqxn-xwT)r?z(Ww zuJ+pa4^g@4kk3zDkDZfbDd2Kbk-9~i71sL*tm&e7gS5f-UvDp(1_X@vqmrk{fxa$x z>~$ReDPD87JnsRmRbb1UTF*3<=deKgr4iU_9WwE--B}2@djb8+7YcMT6+^8Bb=_<( z+}hLJJee~|T3>2O)2xZLrV>V8J)jSvh9i6A>1AW;zq;ibSe zRCCtTzT{qBytEmA1Y&#bz|0FxN(B`8*=0?4e{ri*?(=xI4#%Lt`9QhDt8Srx65+Y- zH%_hKk-M>^i!5`PTu#(P4&m}6UJ(Qj^_A1k$QST)N_-l&MqapH_= z9N*>7kS9Lpe=_l1`;rS2Mpsp|^xp7NiFUHcnY49c()!$RdNlXg$RzjPLz!Xagf9v$z5xM4Ir;%;TLg%2fN8~^ zFTV8T#={|&E+U!DEASwbiE8`w%SD2vPcfV>KQEUSoSY*XNz>?c#fkMB745x%?ohe` zqvf!;vg(y~qSsu&nv7)TW8iiSG2j+n5txM`L*(9W>F>C5)|Bb|`dgJi z#fu=;Oed7%2L?T5_p!((E_^3D`xz0{rZ|9QywDc2j!!=lM!G!f)zt5#8%9Zf!xbg~ zMjen8JZbr0^U>!W1zzx3yru#|wu70U>wr!1$~ff_A`Rc!XL5cnIJH`qj(r4?0_Yb|xpQ#!QenIgYBcr^jQwrE z7?QTtJU3|qGGFGjn)&!4i$u280Ds+2A*Y;)`Z`@qzi(Hwpxs;{XJf?$=XeD#HJQ-N zy@)gS-(B8nY%ty2#-DBEo&U7@B){v~cJ;imz0t7If>!ym4plw@T-^q4SQ7Yizs|u0 z$p%KH_CM_hr&o96%rtR=nNq6@Ul1UZhqg5I)cd9#JC65v0F5l}Z?vx1m)do3fbrnw zTu7RYm~MJxkQ#387kt(b@Hb7JLfP3R&liq$19l>#?76wAkb{%u>SG^IKEY#4lKLBs zS_kuGuf7*I^_r)mM)sdZBn0Uj?BY1s=a&?yMxma(qRD+3R#jF+?Ou1YK7Wl=9+S|1 z{5x@VVLvKxx;Jn}Y&nHfc7ROZ@+ufSlq)%3N&La}nbmiKjK7nR!Pd&GHe~(6#nChWOD&G;SgcGCV{#4QPChpt* zJ}dtVvQ2taISDSTqAcqzdk+}ykZ+1il>*PV`#3Ou#g-?I=Rh?)JYmG?cN50F$w@jB z_y#I6JkcoKWB&b~ZTKc3`U7oiR+5 z87?Cg@q`IlGeK|m5ZZ%peKZRj66dLId+|xVemlfyi@v+GDXR67itDY2dHiX_|0K)x zTqH3m5WXM8xs2-*Nm>3g&2OD_WC!|pP*4lcInsnekf}|O(VyS+c_#LU8^bD4mzSM1 zZLXvb{K)%C$f7h%3_=)cmvHo+0dJN>1S)-7d7D+pO&0~Tu7KQJak>Q_=UOYCJe4n~v zymm^nf8$cgr%`UIZP}n=F%571#=we%x%Cf&CS#uq4Hl$_Q zNOHqHAaHmz4gZ;8FGUrrC+>-8Fx} zWVLJg)?|)^{?jF`p#l#x#<~>JlVuqj>3fa3soEcwi{)B*Gc<%}*~kdGdXCJM(*2Nk zEnA+&jOtHAJ7Pf|0C^Yc$+ZcZjq2I< zoygt1)7ciuZ?%&D6|H@s=&KbpLh||Y*}qOOIyRi1x;T;T`s9a0C6W!imp*9vd32b= zYwDnR)8x{O_gCp_o_pzBK^5TwwZfiMOfI$tK(ck4k2-rNB3*s_?k5E0nkZnN)U?h75#1JRv0_UwR*?@9!s{A zMYhL4CP?#1JKMR@#zdf^}d2NjhWF8Rp373s^2 zld-;KZ6z6S(Du)+F{0@Q{)$GA;E1mGjRJCS?i0dKfT3WGbo@QtW9x~?TPXo;Jlxug zu zzDlQ&fwXQ`M#(@a12$LZMg`C%Jw3D3@r1T$ZE2aP#PGh%|VW!D!X-&n4F$=LzLQtORFySz$K&nghc#vFx@w|DqU zHnvgGJ(8ctyHCGoHm?@cA8BIN0JgNh1RSR1%g^U zn&xtoXChbQWa*iY^qGmEV>^#S#+8!=XeE5&xM)4xR106Oph_?EO33DgR*1)$JA8OQ!f)K4LLUQ&Xw)tW zWa|L`LB3&$h#hW0Zb)SR_QhlqzBdx)^38Y&Z#}-XpnE54o?-jwd>rUGnr~btacLu8J0FnyyF5bl^DMRB_FY*m7u^ECWMz-@2j;X#jsxawQ z_3kE;y(y`Tb#a&3w?Oy;P5<^HF?#Gd!!!V;9y zUp($RnqR6=mO!L7iV%_eff^)6_C~JFRQY?z;}p*Z2*}_l2r_z~BYhbSD|1HVd3T6D z1E?AuRwJQhpQIUOROP)g1U`?tdoO8c<^IdJc#xJ-)zV&H1-+0>dcj*e+!QsRT=x$d zh_6rDhSTXnJtSpK6EB}@KQ=!SeD$&fE89p8*T+pzWU&@H^nwHGIB*JJdYYbvHt-UY zu++Tk)uF8&3M%FZw5OY|Ia-=%W2lZP!t?g2vNC~lSB58yC(?1SZs+p=eH2-kKo^Co zmV?5wS#+YvCk2+HyJX2GxVuj~n^7}2zu!`gML$UmW_t%o zUfZ9{HRmzwM^~?^@#^R*=~CGL9x(`RK=orOQ_p>#GI_?>QsRXeoyiaPrXv%3a#I0q z{KkB8cj^VuCfF=+A>H?(oCGHuch1{!Ys_(cO}ELsW|ZWD7vH|%>vrqf8L@oc&tQ|5 zf`7^KDqO!K)VZR}W|pvM$M=sBuy@04=nXA6!0ZnQa7W5$*V?Q#U@37mq9bYda;6Cw zUyjbh{f*WZNh~d;+F`{{fpBRP!YbEFE#8ypH_E1gM0|tWyP*QRM-1@+A5ZOi@;?Q_ ztK=C|c5STMn`}=;4Fs}t)9WPn6*eGF9?o871%@99%#qUffA(JDuayAVpa`r7ZovcQ zh)VARPe&6TH^ir)jAoJtR#&QU`O8SH5b3?X__{wg&r|Q;t7|xeEGrjq- zU`w*!KhGda;mP%>xd})uMhgyZ*ZA*90EwSe@258RCa^{bX2}}P&oyY-wne>u&5`EO z5n66C@kO1LuWF|DaGL1YBfiSCO}EUL#jV}`{>NOyo@47YHG6vuRV_PWMJic?@nDnV zT^KZEYvO1tYIEydewLNp zYn(}yU~>0CNeK0-kcjJCkjI_^Tc3vnoW$bk6j!MEAME+35Ic8d`o2rO`AcMh{#9_o zG-Q;O=dSnOU-K=xwTIpKpUr!YY}Jr7Tos#jJl1i!CGZb(4#H#5w43n2Dz!MGoO5$~ z6qq_#>Y$lSbW2#&xF4(vJLB7b<5-sj{%gcpP&XmF_(IgvyI(Fr(NToDS`C-wdz0TQ z@>H46OC#!TVxFXmc5&xBB2l-&EHQ1567$vKx&oEez1MQ~->{x+B4QKa2uYRu#ePN~ zlE+JZ#qdZ?>D8;=M~}{v(}^F40J_)XfcEcF$W$yz=}_w*$&0V~TbqaMdDW--Qx&Te zR{8b>&mR)~P>|^V2ZdM*w%co-qm@mG*{^37j zKPV}&fs2~!?@m$7U0fi4+Q;-qCsAK;yFXV}{+6do>P>Kj=T<@VJToToyD3hTK|;)GV8gzW(Cjb~>16)imNf3Sw+yNpFQ=_aRS014CX=(JJ*Y z&T$wHq&Af8eMhya5Y%}!N^|n%_YncO^JN=TPU0s-4CO6$^21_Liz+Hq6MJn_?zv1`Gu9LY7 z6#r*?P~OHvF$<1kl+tc6y4m}vO>(M>4o^AjBO-^mPHZt@hgLRgBx6Ber?o?Bbb=H~ zvQ|5(tcKPo5CbLFU0Q|YZ{`mq1{{NR2M%>2mNae7GhaU2em~?1YT0)-rj635WVs6` zG07`kWM>H0eVCj{i$f?jj0cHH68(CHveS)JHU-!Y^`=pUil+u@qa_dZZRJ!Marrif zLAE=Om*Q&aG5sgj2 z#MJo^i#{gTpQa(N(>wT6BHhQhrfgP=NCN1Nyc>xJui@zrh_A!SMsKM|Q-q`usYSj; z7%NC$n=QO-Bs?S6(_1ultA^nL{w=q~pZ9%NP@B$jHF2t2d7rJ>KE?hT#O z2d+|!b5+~iaWmuWh2|bOBoQtGB+d?~|^Y6;~SVnmv?6SqykY z?Fw4l4u!=~{`2@~)&MN?RYqJ_G;P96t=Y&LNVpi5dv!1P3%9?z+I$RZR$JnY7VKBJ znz#h&27E-!`f-v2&zEq4!o;W`;>P*!^(d3l;3WEWNmIDdPj(iP&we3Y-M*^NUAA9) zLFv_|*6;xprFr^Bph!&Te`#&xJNyv}A?9pFP<{G`u=qbORA9bspc&E@*BEep5^-$H zP8|#$N3gARaxcj+-m4!vxRaM?y(cgwzJ7%e!0H30Br8 zYhSEN0CzGB+0LN!qdxeue`)o>yDs@ zK+=XiAH5%>^Q!p5rQM?T#ozurjJ}_HG;&HJZnI&8*lyi`;=PV{I1v@^fvtgMR^@hp z%9h;^L7cypA$uqfd1e*E#7Z%!8-s+^jysXWheRk?S*|p=?T!XW z(=>uI>OVWmukc0IUkIJ6VqJN%F`kgKS7Nq@` z@fN#pWe|$C;lN}nR}H?$F|j{QlX`|tj7jnBGRm%F*g@mUv2p@XqI(Yaw{OLRh0Ts9;r0NQ-!@l|lCHK<@SeVlI+VX9>NEGd`J(@m^z*b!H?fMd;j!eUlcCkNm9zl!MB1S^S`um1!;qQ*{{ zvC+m58Fly%jB)x~AQaRYf^Z?c&rhGm4nw_5%VY!39C*8K)<(iv#K_9`$dj)GBU#(K zgGX#W6Z>i2jaEr7hM?@a2Hbh{Y-|N1Q)8#zA2&k<#n$!tqVwoj>=Y%XH7!iJ_&>7A2K6^)1XQY%+Z-FP)mHJ~O%v2|df7-Fu4~xZh;O?U6L}&tdn|am!%$xcY-< zA?~dpp9Bt*iP}K#RnhAw*ybYNYGwY5tA9`7r2xN{@=c9_(f8$ZMix)k7sl-Z4fNDC zSkdiC!B;jsoflWj3SZ?=`1epFS@e3k9#MxP(3R}zWaB5KB|IHH-8?*F$YKJR0*eGRwXv}i~d8jRAJEcJs3hJ{vL=%P5Tp)k;-H21_Erfuo?9*I;KDoltr@t zX!?D3Cw>a1vfiJ*TS;0c1f6_RJ=Hsmc1IVQ3umsj4P75lhiS_QwT}DWR3EW+X>;Yi zHfKi09^M06^_vEn+K+d2fv;Yesg!N=!^iH6XM375y8kfeDW)re7QWs&zN7^`X0k&y z#3_7^Rvv}*YCbq*694IQymjRxYHHuREqOUf%ZVRlA8~Se_C?$S_49PAb-psH9Ge?l&5;14D(~}4N|8&!@1H7FmY)9u(X?q6 zFciw0@q{n1P=VnXO?w5YHUM))}1GW z4{78B@!2%p{4IDMcJ#;7gExESWp4=2C3h_CBWgyfnmc!;(t>Q?>n(x-`q;96khA~Q z&a~M6q8stWU$3O~3C?K8oma1gXtHE1Fy!Jn9;dwB`l#ca|5VrGN3ZwXV&gKN$a?QH z)qkwHNFr^BLd>wF#X434tz5a@vDnNA3i= zjcrWGNYi!9E}he&s;^@cCi`n7h*>~hN$=I8jv)&HAXWkp22i;Vq9>EHB4bZq39y_N z3DLy=RB+6Hr%z9kl^R*kh)6`ad_D1|m$?h_==JgM;dCMpk7G_B&sC*12A-Xrxn8>6 z(3vVKV%*UK(Eg+TOF!TPkK?yLE5nnO3?0?s^Ek66TnL05@}70iPF**j4KA0QT ztMx=AvF>lBHdq_@SgA^($|kpj@Nv6 zb-r?QOcj$lc~aH{HPLg^M#K%?zHR6*c{AQU(?aL9Bg+-GH(G@deyMLVU6#mU*2Pf& zmqh2E?-U2=ocSi7#|nd_ph)-7=*Vf9fs5|LG1WQSWZ2p(iX9Z-N(goxY@k5dOil^3A^QU-`!!G^wB#l7|=h_I%%3oH!;TUwv;Y ziWWnTEhL|tG?g3exO7n9Ob;!Hb!Ohip02VY;@Cpb83BaBZ#RS%4G?f)OGDKb8?JE` zts$|?@mCz=|1KsK{=cp1V@qpmHWLT%aKthC70Vm^$Ife>Dz?P`8Ue* z9DeOjr?)JZZ`ecX+jJKhdxwI6ZUoTq%{eCuATJA!S{r5lY`R4D&_u_HwZ4YJ+pl5^dp#JWLVnv2m-OD3z)s`T*;Tl451!WqXk@4UyKWoSyM`^v;LFSYz zHmq#42s9V9UL)e~un)Ws0GNheTwFR@$H3nBjdNPQd+>YiwT<+@^?Wr|^v0gqRiJ17 z?yBD04;(dhy&1~;wIG;v&9f;o-LGYM2M?@;liN-Z;w1h7XZox;ym$o{9@qGi@lf?H z-HJ|l@zGg*lS0w=iRUz$mTK-2aDhXYtpDisw`t-3Y`>ZXiky&|9LP-sZ&ap{_;Qt9dU)FEB4LZbdKD@*lCf1SyE0rKosQU`<6TwjK&u4KS2|Hfn*zOMVl zvuPTs=IyyXKESNsWDBj{^yfR}+NnFq-iLxdC)G)nD@*?K!vyAM<8_CZL@u_Ic3FDI zBHy}Mpc`=iJ3II$gwz>DLuR-uFVQqMs)d-CPKuS{0^mQdl&c%zWBR}_UcGFL(y91( zrhry?qjQ0p@ME- zz3=J9jK*CU(*y59K5bVY1YfP1g-3)RAO8OB&B_c$Fq*t#{ol#rdfPvWfy@5Jcfaw> zd+CBFr6%z&{fn=w)PFu08mD}gL9PkvNa2<=g8JGwlCZz&wf4H2dxpD9jcVR2FJ0_d zU72{GYKs&I6Q4U|{_L0_@YpOXLGJA`#x&b*&ph+xv0-r&NTP!}l&S}(9y~G@@lu;{ zfDNpVbE6qmsG*wcoyVaUo2>Y1%=d`Nsyhh8g@ee?FL~hQ)D*X?3v&VkRJ-nM!LhDq z2ex5fY6#F|&#Agcw!5*-y`itDY?Vy=RC&po^&wbP8#V8KEt!zPE8)WesOE zKjF6gX5ro8xNOlh7jtsbVz=~rJ8rpN;pC_4`6=<3Fb7`Zzl?;^az}8&)^tBd$95{m z=o+2Z=jLJ%v-oyE3EKBYGMVi=zs}gM&EAunz+~7)BEc_Pg^hu0$)0F{&q7B&XVBiO z4rmZ9t*y?WqriVB^lI_Fz~x^>{ud_0)y!5+2Ru8lim|QpE#t9Gc6T1z*L12yLkRJC zj7`BY$zGwqy(6I9;l^bL-9+SS<<6)s90OQ9*zs(up_*1J{$@o7xo)5cB6T@w!zZ{{nZU)xb*|vt4Ip({yTPh1r9Lk_@?2cLR1$(p}Ykbw?_*F-V_TPf*0;Olm1UQ}@;$7Pql3HlZ7ED7u z+V_6EK;v~B@hQA5zK8V3vbp36StXob{JSlcme`X$Go`74ta4~heI1Qf1Yg8&AjNFv z?>{E=bn0^V%O6ME_`;&(d?PEw6ru743ve=p)}X2lI4!L>!UC>NvTIKLHk4I z4f9uC%Lc!?y=r3bbffRFQk2QhPxBk0ebEDJY41nCO#<)gFH3c958UoD?m*Sfa7k3> z`KeUR4d@X3xSt~II>qlaCkzOX!e72*?bA9Ng*`MQxQ>K?9O)nHj)E%C*+T2MHzlcM zp0877u{G{~xQI+GMoK&9zVob~$oZ*$M@X8}0EvKw>PaLHV#Q zCAW$Ax9Dz`Gd5eod&x2U>MY<9<;fTnV}mu)r=lr3zh`OWpR~`P9Bbub4sp=R=jT|b z>O7dKOvhgjQB$@@F90mSg$k>?Mvr=NqM~-P z^u8joS&n`q^}O}#?WOPEnvWsTu2XTY%kOsHEO`%ik9Bp9dz3)nl(KP~E~UN4V~q`N z_n-*Whe08s%y>_rwKC6j1|$c`{|zzOg%KiIiBcX>ICR9%NP3OixMR6&WfB}KpFrAh zb)Y{OIV1V@I;q^|)}qiT%Uk$t@q%BiW)AR~L9>loE(L^uPd1e3mxY^xyL*n_(Tu6K z#9xI{!uI*CP*4!{3|9^CTNxkHLH+DklCz;borU~vkb%n=ZG@vmd&*hP2S@AKpNnkE zrh?h2Kg`R3>wvuHDW#1RY~ILAh~x+aU&<>-F{iy}ah!3!S0fWvqm*1)Z61fe0P}w) zMk?)=L>gaoE4y>p;sQ{jWMhj2^f5pMyKhZ)-+U)3dLBtZ!J$9rgD9{fcXAIlFaGlY zX^h_p2{S)+X$A?KF2sQC3*Dt|=?SxoO7#l}Mg3kwtcawiaC}v*!MM1g4=Sv-OBBNu z&(53$0>WGrscqrrP_N*x-@B2h8S%O8?j(;b=3SHJa9fyM{jQM;Jg~Ay(HAG1;IB@n zlE3~FbY@2ap4!D0^aAv?ViOXYsu?f+orfDRNB2riO@&O>JD>xK)A|ap)806~F7g1w zZ%Fe0xZ@FocEGYFyDZrxdtNgGWa*l5IXXA(t>Qask(9c&X%VkL-EY^lT6V0v*avvXt(i%FdXx8?nfM-mviZsYkc0l)PT#xYSJoKEP$woIm&3l`hG@7tf z;{3PqiQf(;zA-0ZRgh(gPo5|bx*D4%x@}P=P+yomL3oT-8Lp08}x1z`GH(kKKz@4mCjoPA!VN^Ml~rr zwUiZ?aTgXBE0*$eQ)iNBuV%sgGyd2X38SRRaoJW+=elONsQDO+o%HZ2THHPXlj(}| zX>p|cD6$6qy^qQT`pZBH6h%?;rlRl0eE%e1GPE7LJ_7Q7A875cn|~Yj#-v*b_!fTv zul2%x^s_&PM=;XK)=@Y5KnzT#uF_(CwhXyR`ZkH6%;;xQQfuy***)19FG#Eip9rTF zG}I1&{}~JT=iJ=f_f7R-d-nzq8vYgQsbm{Q)s;QDK|Jc8fqb#+p*NB7)ZZert%pUYpy%ka*g`Qu0$T0Mm1 zlzkZNcwyPVYEijZj|I`9=w)`Bkl@+)VNvb)|4=12_i*Dq>Hf~y^11tQOum{ji`}13 zCDwpzU4PJR-BfiGNS(bM0-YldBF+X^Ipd0FNdOs%D^_(ZDtp(?8z@Zn^qkn;p zziRB>brAFvjHdGE@33ptrKF_|2Mlb4{onjfM`zcFT24I$-p0-619xXnLx|W9VI4Uy zs-C3U;z}P~)lvU*4t>AisB>R8d`2X$b)xDtEhzTf{kB^jx`&8y_%k)~?ZNcviXB7rsE}h(z9ducdj`Eq~Qz z*h3hI2v`u+eO{vZK)qj~bt}M$i5XCHJ)M#i@`r~HEPX%a7R|3Afvlasn`trqdY;sx zHG#tEZ+&*R$p3 zQ?H1yND{-t!;!*REvAoyo%b4~;&|9+YaRN2-`*tDZ>7tD2kW>kha7JXm8~X*=jP@H z6Y^6wxSeQidj=B;3XB-{c6xi>5c1s_s&f__I3`0NzXK~fw{lfhA4d+$Gz_mE1&p%g z#q;wk`fHU(3J_HyWKSI#`w-?iM~Kn-?%hkmIaJs%DqfFVboDPFes>Oqn(IJ zg~LlaXltm!Ev-W>+5tgwwHF5hQ6t#o-Al{-*p~QZ*s`NlQENPR^(YwsHp)ejDsz=x z^W?PVm{m^0;y5GHfmBIR!1!1)?qoN@A^Adn?c(K0F#B>%lkr^S0XtOl@ibiqKb}`g z34K5(r|F#s!fw~K0Fet48U#{2jeRe$?$U6CNTZ$Fj2*{-FGqV%f|w>2+7+)qwVPegw~zR4aU>3pBX9ckNbQQ3YIEJiTkb zeSK1p4#`kSa9vgRf`TEekaK#RdqJS7mJcIDa=>nN;~m!J?Mzn9&N4r3Z%M9~Ey76z zom5H(-NMEq2X34Vx^9z9D;Eq4ILXw5KR5y>I%YQkM))g1q1KX$pAW-Qz`6 z2qgdWSjDYz$>C)YJA)97$t<@;6*o1F#*=SKz1`(hg^~^{_0!tyAR|sIb2aO!wskm) z%p|4Uw%y*xDv3q8Dnl3*7nJBRY}7$YUvg9Wi27te+Z#y4jPT*%80aLaMZu7azO_?X z^_W|BXitD(ocf-C;+a|qhMdOn)GG$0Z8=50y@;W>i*9Z7TwHe39wi#tHTN{N{aSrEr%#~ocOLsw5g)( zSTDW=0XfqvdWWZ$!!ELMId$_g4W@CtBv+2Z&@Qza;kxUw0dXQqHHsp}VeW1@ zJA!m@_e$sbkJ44bBSelTcySxfa%R&c@E^8CV!4&hAzy`{%Eh0}ye>f6(>ZbhDjat( zY~gTRa}8!U=eoq*P8#OKv+6gO2M)W!tg_NACNe4kX9)t4rnrCIX9fKM=RJZzmW<*Z zV5-r3mW|}5*JH}++k=<~-^% zv(*E1OezieNVZj0^}TOjR0v3-;$u2uObHfcVadzX$=x{dQ}8T7}h zDhh0W_i>fRl9S*)>(fZsRaDeqx0A>eJPK<|$oGb1)Y|G~@_V}Et}${&HfD1bRNd(W zYC4#!x!sFo@I%Y}nMd8kkc(a>I~1eH*r=WeGwtUQ&t=`XMOWl^>VHLiuOTup;>WUG z8c_ddBf8hBtDbD7yDo*^5W~~`4wkisEK`9PM}k-tB9EGW&jiAh(X&;?`^V?IJiK{$ zeka7Rpt&wntSH1Rx0mF^)~KE%Jz0PVKP9q!Be4=Hcs#-b_V(nLWHjHv3UP{(vLR3q zMrXvSYxeS~i*?+n3Jps*36;ag;K+PDc@TJ1_8i2JpdSd_;^%3dJCj&n_o{AQE;yD& zl4IK&L4wCtBHqKEYvhVEx!Qdv1Wea-c7h}o$1aR(5W{g8mQnvY{{3suzA50iwQacJ z08Nk3dvTAy=uICi)CSiY^|>=GJr{Q>5o}onTpHMb!TQ{g(`l%Lw;sHwU`(>cEDz?l-qH5e#7oK z`vh#yNo9K5S}AQ@(Q0hf0*`<%sIQ`sn~`In@ZMWNI}%r! zlTk=qe%jJbE>I%DOG8O3ah0D#>oJb*Oz*^=Y}!f?j57%w$;x{3o!0#lJ$!D*gOSfjEhaq=o z)~wP?SD(Aq+gl#cFPlqC#Cp=6mn-EU=F>Ou zI*ZEMk(;TT8GAxGh5b}#IzPh4iAVBh52wD!D|G~HZszv7U-b79oV2{c&%>YpUgG1F z64_)Uo5^o0uW>wIvdi!iQ%CED_8ou3)SkfQ1|Pm=ukG{~@E!Tl4|;^{PUx5p08x8v z%Na$NSdCnTm%_poIbnMXDmI#eIrxLW2hM4?NcKQGa#j`S&i_np+ zIIr17*@9HDuOXum&GbA2ZFpto53q1~IL!zS!6IJ0t?6P%dwok@;ijakpX$l=K{T66 zY5If(!(n%EZM#PPK&p~z(Y2~GyJJ2@MbQzvmP21zs6b2)T|F=tV}biXYgEcN=}CO^ zJ6YvapAC5r0ID8NWsdBJzSJ*;#x5R?0H}ST>urMs}<*L~6{~wRr3ld#$2fu&=*q zsU83=|6&bGCO!&HE_!l}5HH2NT6efqpO_eIM;^k%dwvw_)6B5{?RX@Z4-l*NgLkRg zlqs0rI?qpYSfmf$q4qG#;T~NiIHz|;u;^Y1sSm1nmwuiyeV!6oA@1tc7%FowH@^qD z`QX94$lHkB+%<|*;UjAU5vd(;89jiUb)z8^M8rSrH+A15-yaN-hj$m2KN>eF**Y`B z=RwE_72b?nyOZ!9PSwt>637kpzyCeahu;$q(r!wKc7v+bSz}_!<>pN!5>t=08FuMa zWqeK&c3=a`QK5Q}t$1Ky;K-+rw~E91);s9nsMsJ$5F6$(3eiko|G;&aPwlU{UpxN8 z+C|%T>N0k0CbH6DNEJ-^*{pK8f<(M>(KBntfE5^bxdNqmv4vjU1o6*z!!nu10ZbWZjJP@IjZ!VA`+RP zou;^QbIv9(1QU=uDJZMnF%KEt@NeE25Cam|MajTNyY@&x~W)+2-;si|V&Kaql!^E~P-X*MT0 z)xE-St!&hWOIw$|f(1Yc9u^?Yw$&&cPi!j_o^E@snUl<$wHUI6f)?F|U8mWvKUU;g zlA`Zt@|#OCS79_$a=7x!HsLW?f+?yjkQ}?xut%#hKR`Ec_Gnh{$^9QRl>c8puxWzv z?BF@GgkgkQ|8fD22KbWJpdPe1RKc=a71QYhu3Lsh9;ecEr^G5JqtQV?hxl&yzY+*+ z@6-#rf{RGEBO7ln*CekzDaFJdEw5C^H-;%-=2fi{3G@6;x10@bMG4Ib=C#A^ z_xfV>5K7P)vetxv#{;vAQ|>W4TdHXgi2K=3UQoS*$TO9rHMDCaXF2u}fg< zFD=)`!)XucLw!#gCwOx@;j+CLz~Z!9&v!GKR&yARZugfAdF@11r%?GWn&>XMgT&Q3 zqyHejNhdig+1WfJ^xj#Vdw`HYKIeIU7lTd&?!U12f8!HwqXZM3Y;Ij|LTb*t%|?E` z4Y=Mt{(sv0?zbk>ZEf6chcgG2Guu%H6&Od9Q3p_}v}C&(Wg<;QKx%YoVuT0?2qDB7 zEHf&_(1ei0LT{n>09J&M1StstLKG4L1c(qqNIy^9`#XQY`Q>~+?Dx93$OQ>J?|Rm{ z*S*TS9xuzrlyG;YZ7}8#m|%v=e&?Up;%*Io=5cbP+^y*3fijgWvHcS#k(i|@QJvM79X}nMtZHw%%CgW-ogMmi_wKPAQfF|_lBAgw z5iT8k^xXzfg%qEpIiEpy>|oIeC(#_OX3RG%ENnVSPPI?_LpG5|FM4d(7{ROrgEhP( z)G&*v#hk8Z9j^8P#Ni34qiXAPu zzu8ab(~r`@oSi)Vkus*k8D3YC{_09y%I3>AhiGBLCPoqS59tvTO%*!|QE!Xv;yL`1 zN4}6M$K7#r#;|ZVB4IV8&*rKlP(ty{mq6x;)3<8$9|}p%l_DN9^g3u7Mg^{8k2g~Vrx5P54u!~$0{l- z&tjKWOVF`Xf0~q4S65Gq+2}sZNTV-tsfnT|=<4P$ce+Uooko)I%?M8ZK$0DQ$x`$= zO}DtA!2%XLWUEX0h6642A*-j7E=fJ}mvW$sD;D$TaC!V<-(4!pTyWXV;b zvW?%qeapJ>B0X*})5EPtwN+5W{3G!`PtQbg+zBP=N2+c{7v|>K-0Cti5VN;Whh{e+ zIS16;ywWAI(046u*0Wq<2RcZGcT*}j_ZL{aYlfyLDZlc~Cf0T^;*_})=Q@9%Ljm2arS3P5urs{rAOj7dU3?m|k zn3TL|p}@C_8jXzdA!sIrg|R2i{at=9Bj1?rq`VldW}33%gy#H*sFcV*C3*ntomd(M zR`q@-eEg7!a%Obu2HU!Qc@C#3rIoa`okTMQME1snL#MDg(Z4k^+jwER(RZR5LHu@i z39?6JjkZGg6sC12UD|+tergQs%fQF>zT^y6nd?&JA@7Pq%4lLBDP8E3Cr7eP_&V?@ zCvq|g7pgML8Xj)2GDid>J9Q7c{er!@FkEwf_7Du$vK%`nq`@dYrrE|d0j>QpE{23} zgx$E*tqgkgnx9l|?HfLH2FERi7x|B@taDT+w3j=5SGs4Rc5^N!Vc@Xnb~T}MO=BnB zaHsEK4U}k9=wi+hso;=a=&Q|`1qRv0U7k3dYFSpaKD%yo@_3JmZ5KHWJd4$>uDgfP zYhR$sS^{{?=F%6+b+kzyEDx2CH~QNoecWc>U>XA4o|h-2kYa9cu9oq4w0~Ty8m{-^ zCr@I8^Rrmv*}e?wlMgQ}VqR@J-k=AG%zb>#MGCNuAU`B|Z_uhdHd5+FwV4!VQCr3> z;7Zv`*Xzt@A$`Uo_{*_NN|}W8H9#yx>k163YeLfvJ(IcrF~F2Eb?H&3v_4zRer(`iL7(Q(t7fz>H`vwsvqq~o&yQQUtw~Nh4-HujF zxRR+s#3ui$_+;@ywjnt=>`mwELaVX|?Yo;HdU|^NA{}#TPjvSQT@D5gG!(8$6MZ<0 zn;YMiiiHSjeIuZFdlEjc#(yqtbyi?d)zM+^8bLK6D0Rmbrfsl~$&GFe{i^-I7Wv_a`>FCjrldp+ zUwPt1{y1IAS3m&zw=Wg;M6kP+SYvZXiJKv6^W|YG;#J#Qa4Z_0Nju-CIPPMIPB}xi z{lU{|^^!`ODOj5v!Q@g%N*6L(yu!A1hTnpWlzF=1Y@+l!Rco&1Tn0|{7zzHFKTnK* z+;C2wVSqJ;o>bjgB6Cz?24bXzt*}lvf(zoqEGZG;OHV#5use~|o%yD%6ZSo-*X*k&UgVwJ5!Q1pdvhp`1zi3^S-nb0BhSi101qJ8SwSi+5d#+8kfPz-A z1Km;j^U(JaZ?mU#q-grM=9|Ba)8>zm(U&YP=E{|i@6I!1P z+!$B0#_*C7R#+>0pB3kBGHKElKzh=~f{C6$)YrGa072^b0XB^Js7RZKqor^C#kD<) z4~lNAKQ8dKYc0Lb7R$fz|@ExcqvD=$(KR1|F`CSf78~zMO}dTX8^=towFoBa8eR2jaxL^FskssHm>i zO!y?27@~~RY$r~>eJfTUd&?kl%sQ9rHE`7<9qTvYK06@c;afR_X%cpJw&%$&hQ_g5 z(@uvN6^HbBu!IQhxwm{Gb*p4Lx4^QLuem8wYQnGgdPE5=lUK@&VZci^E^jz+Rh=t? zyD}Y%G9ilZTh(#~sAey-qWkcRQ#-tTeDY>JHX}>j2t^b#N7DJ(E!Dp??on7q)a04w zUD%~{$*`*hz}?=8w(=jN{7Jd`Bc&xGiy~w_z|P|5&wpSB#zcC^rLgAO8tByWJ=CVj@k!>$g+A$!?_kb{8J(#$2zJ3c~CZ`?QSu)e{cKpO1aKiCKK&BG62$1Kzgj_g*041QqY4*yI_UKOKPU)(rfGE!k zh{EF&*`~VFiJl4UDEjqwvCR%c-OHy7PDJ_pw_HEpDE~(5QvHKUJwnHS0E-*Py`H9& z#~6h+Mz#3ObpuPY*ie2bIG&o~-*mNL#VNTsKw>CnsOMknYTN_33*!RJXN3cj{5YD8 zDn;MlX&n~AG0HY{N-iz-YfPRz+z(W?w5{z&1ZkvX`a}dEg&z)bC{2+g4IWIhh0b90 zp%r_-(WwUy9-%RAfCd)@lTqd|)$g7-CS5p_@!jJ+riBs89okHP-)E6tWuf4qZ@)4G z^XAfM(%nq$x-PQn)x(A1iXa;U#~TZ|TW*IP*2Ia2pV*+o4O3>?uh;b-j%@wD4kRP5 zyjzb-+qj1f`?OyjE?Xyny_S|+`9W#3-T~kr~ ztBF?K-@d@^pEd?o-&>Y?Qe2Eu>MG0r(yJ~%0_KPv$vzyGy+ck~tkCM+ds-7-yN|Yr z{ry^fC6Ca^&^ao;v$AY!ulfmKV~-3^{NU7ClT9<2BrPudzxPuv5A}8*IdWv6&UV@@ z-g~T)uv1HYu(GPka)xS~T{&>Q>9-)TiiR)2oPJJjUU(-x3d^#L2<6sYsY(oip04w;|$d=pI8JZMA-uX!eBCLw4&Ck|_4uV0N1(jzV&S_mOTwGjy zw12|`@*NZs5Z!Raz6k-=`ByDO@pJH-MQ5vx0d5((1C2~?MEz8{LKDZqo%y|2n#UopK_qu8%K>6^ffR`kD%d|jwoK9X}$u@IB z6_=M^_4d@cJ$4Bcp&*6F4}`d6oQ;fxwXkDn!3-K8bsa6n)h}+GcJ$aW%O&y&eMqd^ zKw;}IOagg065s4~;X*@Y*;l>SiYptA5>piCA-6Es!>LC-dmv7Yr__*0Mm4LFuve>k z^-Iw9dk(!2-+C`|aQthd!?1}aL_Q;GqPY6Bj_x}x#yQa(l~Tltvp~FCcf;FTS5%&D ztwlr(-R_Pg`&4;5IcZ(q^3QzE?l^w<%zYyFb*4$!z`A~c6Ut+bhHtGb+tz#Z+(fls zp{=>Ayrrfwp={?uiwEBdx$@{ItxN3x39r8;Edo($u4)g>x-{3e|KDB|)@T;_nRWbE z?)&XVs_3tFewPL6Wk4gmC`xBTxA@9Nesrg)7gRE>{(E7r4JEpBsi7!5?~#G68L4M= z?pGcaXG`zhq8xdFlJIO84c7+IDbg`t%a|E$7Ei~aEXj`*OQbx~w_IBkAi3$boWTHL zS2mc^9{Tb27S`pDz1OX7oqO;wpCkOO<_{qn29a&fc5Mz1*^_FT8U72M(Zuzo43M!&g=Z(TPGrl;uFZs$>u1W&``C!KXv>WC2Ft~tXk2Rt{y}?-{U?*2|Yv} z_&kAQFc?O)A2aL;f?}>c3E4R2BOO7~&&oHJ^C`EE&7k1eR*rsNHYREDZ-S*dc7omP zs8<7R0zt~LtMRDq-so@y^Y)UizgI?bYS|j&)u$WO*-3MyY$IsQE4qPdJ85+vEmB{D&~dirFI+PF({!O&6GHM) z6ZP6?AevP|iO;7-yz~i(F0j$q$4#m5>R+^O-}_P)Iy+PqLAOt|*}uAsISX7eP%|-_tT?%ccxj;qM~4vaey=U8^_VgdGFyYXE>n(mZQZm!Kyub^fO)9-NP{)%_I(gX zU8w9*sT;l!pEz}5^18SkI4Llg+KAo=X2!A_BOrrOS?lj|m?47?Cbr0?@>nS&?)z?< zt5Rpv3oIi%HYP$O{x4zA0DmirUGo&Z@$%#s@ClSE5}Dv`GhKd4^6Uf$<;-koI)Qs0 zM#*DcqnNI##_RR%VlM*umYt`)){9V0NKdCoD4rqNlCmP@7Id?Zd z_$(#QwDC0`N_?4SGx#DC`WSeYh|Z|i$j^yew0a9Q?xZ)?w(R*2E(URd_qx~4+Q%n5gCs z>(EGc4j`=jp^UI9n3DHyg<%u7QYuC1B%>!_WyK}ksf$2^J+LY2 zPM4qRgXIa!AP8E@7pP*K38@>b!q1_wFB%cTXed6B|MpRVWwvqDWJ}c01ns1twOvF& z4R6K_gTd^Zki;@V>S48v zj)`4A?=m-ku!lL1`m90amod=6q6ZH&3J>5Q7WC%wN^wY9m|k#JynH?KA{iImekc0qC7W@cs-t5ZG2NuoJTl!2E_W%qDydDW8F9<0w#qg65hE>+tc zvayp^xL z@Pw|N>)yO;&RxFp+5$L12co#Sa1i4xd{+ zpv$FU)W;BsD@E$*qzC{g{#8mBBXp6*bgAk#h%OtINJ!;A+kdl{X`x_$W2b)p5V5Ef zBbnT3ZNvAq@Nv7$sYE0pnfq+&#xlp^`sU}9^$&fNu8dOuTM2#g*>^VWnU-`}RJW++ zbu8N(L!CygJT6{ET%AV;j%Is8@lb+1|9Z#jyQI&AP7CgegNW&bK5z6~+8toO4ZNp6C(^=o<=H@2NRFtjFhh&y% z0O8i>k0lv#N+1CmYNg+|TfuWwzISe4Cfd#|fHWQiwVZq32>p|9P+XL|T%$*Zw?02x zQoRilZGx!tqf_G89o>9*k~hFyu=O_>LiLkxck^l|Rk@Q$vK=@{fEbwYX`4Ru%CFH~ z(!4XwD#{Y8G44Z2KF_vHd6W*>_=QU6f&XxESI43LW~SOn;~q99(2^+;XL4<7Hgj%~ zVor4>brr4dI&3`VuDS+tAFnlx>e32OtcGPq0N;UQ|I_Kyr(xJVrv6;@PFXTGbp6SR zhs|~?+8jEwy8&KkizMI^#v!<yj#Y*wOBM^966C*PL&xhrJru_< z^vlB1e%qQoh#`;kn-H=90`Y56LQ2jNFN?-5M_YwxuA1E*r@FD>w=iDsj17HpDlK-A zj%f*Ge7G3YQJrmEaB?;6u%wz|e(3|^7Q>=$fN%FNdb zQx#rVDL+TC!i*>d%}4DZ%+=%_gj0R##4L^N3nr`&9XjM1gveYG!N=BL-ZwH6L##GX z$N~Sw4v8yhV>Rcs?eeIW(jWKj&o@Y5oAxQ@?+jLyzpv*&E5mEW>0ZH*W4=MCpu+rI zUXxd9aHDGlFd93-qmkj-sL8D>yB#B88}|>cttpl}1R6@HkTrQ}zJo#rFD~HvW4MBAvO@+6otF=gmj9x4 zx!r-gPn(~G++P%`LO#kQ9zQYrE|V^{oq7_gV(of30ZxxZpjR4bisM&??(G{r3g4V4 z*M+LeeUkbz3>rY+788UF$0*^r>(~e)1`;xDgaau&kY`EWV9Q+};yLxN6DCW5?td}9 zabE!gVcni-E+k8S4NDJlc3zo%{;4;o!pm}oEEz_U#lwv*5;r1*%n)lNk_l1$d?r&r zyIW8jz@Ng|64mH$_4KT-)@1A5IjLi`r02g5=@M^D?odtRI`TSJloy!Clg7COW&vfKPrb414!TpCyY6C~azLVl;z}yX_M<(j1jbaiD9jEhnEo z2t;?iQ_KL`xfj2Oe0YEUg+`G(m%8FW5P!aE1wd0$1u1>2*6n|2cynGS z@Yots(7wP35Gi!b8IDg$g3J8748P8}8oEv*th(9f^{YFzK^>!hAb%<{l3_MKxD-G_ z&R|F70V_INabbQgUSw#3O3=Yr2~-#S0K4EFq+UtiqLiEZFvhK|xDc~zpH_0e5t8$l z6WKM>Qg^&f%`}4Dk>K7KPPIsV_2#0tx2gD)q-~q-AWFR0KHhv<_*x#)H}>d!{wpE5 z0#PBDHm9z@r>rq21-9we8s|@jOcT{{jl4Ypqkb52H(IpbNDouoSp~bUqN_nHqF3b` z7+A#6QTd|;_(ZIg!mvnE2Avz^sLbe&^1$G|vRG^=F#JZjULsX(ur4mNjNj`|f-Fxo zSBcxp%YOuxSP@*Ob9L!=VY{a=IKGxt`*eqv)}p2o4OCYA2(G~i>X|fc{+-!OifpTP zDJL0id1dC!{)9J@YrjAK$BrcL5p0TL)g(SIb00|jpvp1~5IaBB9@F{->(>}QHc>E? z6L0kvAk7+BeTnpU14CDfn3*@mJ3#jCpJJYhO$e#>dcnzlhDnOmK+IU~5i_&s8)R9| zPlwJ0Y)Z0DC*qAoLV9t3HezRj7eeW zFc%g%*|PjMKB`v*@3-UQi4;=D(R}#LD`c^TH3nluR1GglU`4L_2AD#6q`K05Yh-g$ zbM;STz3OE^py|4qb{&jnfWloHG64)54009?l@_oy#Y1yb2K}M){kcMcny|H}17pLv znR;U^3-uZF&L#nxWAPNDu5R3zu-ok28u$4(?Qll5pA^hCCNP6B2Zb58%<=Z|*Uypf z-MJ$6+iYyVq38QdV+jD4t=o|xdUXtz{U@Ng)?tgI#;~ep|FPstaDclGE8PzLYfi_C zhtkzu?F>G^VW8k&gD`|1w%qIx0d#kyBBXCSO2U4daA4{trKWl37Pvl`s#!UZq!(1A zW7cj}Qc_~4nl~B^3?K*$>S2&g8oeeOa8kz%AuiN@=8a`YjNCdwr}7&auselJ1q2Q97b zMA*-#E;gLvU$UA*!GjTgeqXH%@->tdha~61vJW#mHU9q(1Xv|6!APM{reZ*h#&4TvE>p~QtU+h=DHsU|1Qu|Z|gHXZpDM#@=K()4) z;=I$GczLn&{hjT6mG-sNjch3f9|WFArHtBw2-{FoFTI+ho{EVG-f!PTL+q>WNzG8I z&M!=qxCWz?>6+Yt^i_sK=$rSC+m*D=YdaGRSEo_>PT_7;q|{uu#=m*+Z9e=lEZZak zSJN`kM@%WAkh<&vDA;Y3zrYS+&Y`A0aOedQYBNwIo!>84z8D5B&QUsODV>aGGVT9^ z9Fe&~i8s(N-WuOu-HCPwUz|y&ZGOG$g1>)ZqX)Exv4soh2~5M1ic%RYyR|=r#;_G5 z3uEvg7UJ_urn?_-O(8+4t0P42(7|pTQ8kk%Ff*VgAX_n-+gJ!BtNUGYd! zLxVzP+e7p8l!mEdMxdf89rI8D9c{K%CU%up`z0-FqOo0`;fy7glm#;hCpje`htO9C zCEZ<&h6XF-v}2!vGOb93Ym9xPo0>J7`Z;ZViFFX1)j)@vb^WN(CE0u7AsBEMYcE1F z`{|f?{|x)Nw*5(O5-)(1Jdm~vkhYa3uVM4u$>Xrs!j}LQi!nW^QsHu9v2Ug!OC_2N z4-N|>B+Ck>)F0FIPd>#^>G942Yi}^{EOtgWlR}~?+;=KziE;03cY1(ip<(KJeV1j* zt%3gx?$_4Ra@D}^)AMK24e{q+xG#z||~ zlOLw{w!c^c;`FYKcl+8u5pDU88fhLD>QAD#eB~i+gXBwTD=;s{(2%^XJl%G05yiaY z`yR*H!J^m+eQO>_-B7n-R9*?=(VbsWlK`|+YHSrwWyJUdL)1*aCPhGP)|5CG*bZeX zMTCY)*p&C&-76!T(*d5r*+|YsAD=m048+z%wZymP3988nssw46e$%I~tiw>k=7>r! zJV&u2kxEG(t`_R<6*7}x$18)@R4|87=YZFQ5|lWF!nce^=fkt0M9e97cKTPkG+`?G zjQcoqD48;I46cgxZ@F3kK*qR7K4N#o)Rg*_KzEQ++x8RZGO* zz_N`V&;c?2;~QZZuRUEO6Cq;NcH4DBz)*P0iTA>m+G37?;}l5*rv_E;Z{X#%3uN9E zKk>Zf+2yVY7xn*6oa@17CA}`(v=C<4bd0!v9ZF z``<7A*Bx~K7Tv!^_r;w4mmQe@)}Q|a{kg41(lz~{SG4Xe_x60_woW0=fM^x8tLp&JC4)uv6#N1Df4|o%Z;- J_8*sj|8F44hV}pe literal 0 HcmV?d00001 diff --git a/lambda-durable-order-processing-sam/example-pattern.json b/lambda-durable-order-processing-sam/example-pattern.json new file mode 100644 index 000000000..a78849d3e --- /dev/null +++ b/lambda-durable-order-processing-sam/example-pattern.json @@ -0,0 +1,103 @@ +{ + "title": "Order Processing Workflow with Lambda Durable Functions", + "description": "Multi-step order processing workflow using Lambda Durable Functions with automatic checkpointing and state persistence across long-running operations", + "language": "Node.js", + "level": "300", + "framework": "SAM", + "services": { + "from": "apigateway", + "to": "lambda" + }, + "introBox": { + "headline": "How it works", + "text": [ + "This pattern demonstrates a resilient order processing workflow using Lambda Durable Functions.", + "The workflow validates orders, processes payments, checks inventory, and arranges shipping with automatic checkpointing at each step.", + "Durable execution enables the workflow to survive Lambda timeouts and failures by automatically resuming from the last checkpoint.", + "The pattern includes API Gateway endpoints for order creation and status checking, with state persisted in DynamoDB." + ] + }, + "gitHub": { + "template": { + "repoURL": "https://github.com/aws-samples/serverless-patterns/tree/main/lambda-durable-order-processing-sam", + "templateURL": "serverless-patterns/lambda-durable-order-processing-sam", + "projectFolder": "lambda-durable-order-processing-sam", + "templateFile": "lambda-durable-order-processing-sam/template.yaml" + } + }, + "resources": { + "bullets": [ + { + "text": "Lambda Durable Functions Documentation", + "link": "https://docs.aws.amazon.com/lambda/latest/dg/durable-functions.html" + }, + { + "text": "Durable Execution SDK for JavaScript", + "link": "https://github.com/aws/aws-durable-execution-sdk-js" + }, + { + "text": "AWS Blog: Build multi-step applications with Lambda durable functions", + "link": "https://aws.amazon.com/blogs/aws/build-multi-step-applications-and-ai-workflows-with-aws-lambda-durable-functions/" + } + ] + }, + "deploy": { + "text": [ + "Note: Lambda Durable Functions are currently available in us-east-2 (Ohio) region only.", + "cd src && npm install && cd ..", + "sam build", + "sam deploy --guided --region us-east-2" + ] + }, + "testing": { + "text": [ + "See README.md for comprehensive testing instructions including:", + "- Creating test orders via API", + "- Checking order status", + "- Monitoring Lambda logs", + "- Verifying DynamoDB storage", + "- Listing durable executions" + ] + }, + "cleanup": { + "text": [ + "sam delete --region us-east-2" + ] + }, + "patternArch": { + "icon1": { + "x": 20, + "y": 50, + "service": "apigateway", + "label": "API Gateway" + }, + "icon2": { + "x": 50, + "y": 50, + "service": "lambda", + "label": "Lambda Durable Function" + }, + "icon3": { + "x": 80, + "y": 50, + "service": "dynamodb", + "label": "DynamoDB" + }, + "line1": { + "from": "icon1", + "to": "icon2" + }, + "line2": { + "from": "icon2", + "to": "icon3" + } + }, + "authors": [ + { + "name": "Abhishek Agawane", + "image": "https://drive.google.com/file/d/1E-5koDaKEaMUtOctX32I9TLwfh3kgpAq/view?usp=drivesdk", + "bio": "Abhishek Agawane is a Security Consultant at Amazon Web Services with more than 8 years of industry experience. He helps organizations architect resilient, secure, and efficient cloud environments, guiding them through complex challenges and large-scale infrastructure transformations. He has helped numerous organizations enhance their cloud operations through targeted optimizations, robust architectures, and best-practice implementations.", + "linkedin": "https://www.linkedin.com/in/agawabhi/" + } + ] +} diff --git a/lambda-durable-order-processing-sam/src/index.js b/lambda-durable-order-processing-sam/src/index.js new file mode 100644 index 000000000..ee8eb846d --- /dev/null +++ b/lambda-durable-order-processing-sam/src/index.js @@ -0,0 +1,221 @@ +const { withDurableExecution } = require('@aws/durable-execution-sdk-js'); +const { DynamoDBClient } = require('@aws-sdk/client-dynamodb'); +const { DynamoDBDocumentClient, PutCommand, UpdateCommand } = require('@aws-sdk/lib-dynamodb'); + +const dynamoClient = new DynamoDBClient({}); +const docClient = DynamoDBDocumentClient.from(dynamoClient); +const ORDERS_TABLE = process.env.ORDERS_TABLE; + +/** + * Order Processing Durable Function + * + * This function demonstrates a multi-step order processing workflow: + * 1. Validate order + * 2. Check inventory + * 3. Process payment + * 4. Reserve inventory + * 5. Wait for fulfillment preparation + * 6. Ship order + * 7. Send confirmation + */ +exports.handler = withDurableExecution(async (event, context) => { + console.log('Starting order processing', { event }); + + const order = typeof event === 'string' ? JSON.parse(event) : event; + const orderId = order.orderId || `order-${Date.now()}`; + + try { + // Step 1: Validate Order + const validatedOrder = await context.step('validate-order', async () => { + console.log('Validating order', { orderId }); + + // Simulate validation logic + if (!order.items || order.items.length === 0) { + throw new Error('Order must contain at least one item'); + } + + if (!order.customerId) { + throw new Error('Customer ID is required'); + } + + // Calculate total + const total = order.items.reduce((sum, item) => { + return sum + (item.price * item.quantity); + }, 0); + + const validated = { + ...order, + orderId, + total, + status: 'validated', + validatedAt: new Date().toISOString() + }; + + // Save to DynamoDB + await docClient.send(new PutCommand({ + TableName: ORDERS_TABLE, + Item: validated + })); + + return validated; + }); + + // Step 2: Check Inventory + const inventoryCheck = await context.step('check-inventory', async () => { + console.log('Checking inventory', { orderId }); + + // Simulate inventory check + const available = validatedOrder.items.every(item => { + // Simulate: 90% chance items are in stock + return Math.random() > 0.1; + }); + + if (!available) { + throw new Error('Insufficient inventory'); + } + + await updateOrderStatus(orderId, 'inventory-checked'); + + return { + available: true, + checkedAt: new Date().toISOString() + }; + }); + + // Step 3: Process Payment + const paymentResult = await context.step('process-payment', async () => { + console.log('Processing payment', { orderId, amount: validatedOrder.total }); + + // Simulate payment processing + // In real scenario, this would call a payment gateway + const paymentId = `pay-${Date.now()}`; + + // Simulate: 95% success rate + if (Math.random() < 0.05) { + throw new Error('Payment declined'); + } + + await updateOrderStatus(orderId, 'payment-processed'); + + return { + paymentId, + amount: validatedOrder.total, + status: 'success', + processedAt: new Date().toISOString() + }; + }); + + // Step 4: Reserve Inventory + const reservation = await context.step('reserve-inventory', async () => { + console.log('Reserving inventory', { orderId }); + + // Simulate inventory reservation + const reservationId = `res-${Date.now()}`; + + await updateOrderStatus(orderId, 'inventory-reserved'); + + return { + reservationId, + items: validatedOrder.items, + reservedAt: new Date().toISOString() + }; + }); + + // Step 5: Wait for fulfillment preparation (simulate warehouse processing time) + console.log('Waiting for fulfillment preparation', { orderId }); + await context.wait({ seconds: 30 }); // In production, this could be hours + + // Step 6: Ship Order + const shipment = await context.step('ship-order', async () => { + console.log('Shipping order', { orderId }); + + // Simulate shipping + const trackingNumber = `TRK-${Date.now()}`; + const carrier = 'FastShip'; + + await updateOrderStatus(orderId, 'shipped'); + + return { + trackingNumber, + carrier, + estimatedDelivery: new Date(Date.now() + 3 * 24 * 60 * 60 * 1000).toISOString(), + shippedAt: new Date().toISOString() + }; + }); + + // Step 7: Send Confirmation + const confirmation = await context.step('send-confirmation', async () => { + console.log('Sending confirmation', { orderId }); + + // Simulate sending email/SMS + const notification = { + type: 'email', + recipient: order.customerEmail || 'customer@example.com', + subject: `Order ${orderId} Confirmed`, + sentAt: new Date().toISOString() + }; + + await updateOrderStatus(orderId, 'completed'); + + return notification; + }); + + // Return final result + const result = { + orderId, + status: 'completed', + order: validatedOrder, + payment: paymentResult, + shipment, + completedAt: new Date().toISOString() + }; + + console.log('Order processing completed', { result }); + return result; + + } catch (error) { + console.error('Order processing failed', { orderId, error: error.message }); + + // Compensation logic - rollback changes + await context.step('compensate', async () => { + console.log('Running compensation logic', { orderId }); + + await updateOrderStatus(orderId, 'failed', error.message); + + // In production, you would: + // - Refund payment if processed + // - Release inventory reservation + // - Notify customer of failure + + return { + compensated: true, + reason: error.message + }; + }); + + throw error; + } +}); + +/** + * Helper function to update order status in DynamoDB + */ +async function updateOrderStatus(orderId, status, errorMessage = null) { + const updateExpression = errorMessage + ? 'SET #status = :status, errorMessage = :error, updatedAt = :updatedAt' + : 'SET #status = :status, updatedAt = :updatedAt'; + + const expressionAttributeValues = errorMessage + ? { ':status': status, ':error': errorMessage, ':updatedAt': new Date().toISOString() } + : { ':status': status, ':updatedAt': new Date().toISOString() }; + + await docClient.send(new UpdateCommand({ + TableName: ORDERS_TABLE, + Key: { orderId }, + UpdateExpression: updateExpression, + ExpressionAttributeNames: { + '#status': 'status' + }, + ExpressionAttributeValues: expressionAttributeValues + })); +} diff --git a/lambda-durable-order-processing-sam/src/initiator.js b/lambda-durable-order-processing-sam/src/initiator.js new file mode 100644 index 000000000..a15ca21cb --- /dev/null +++ b/lambda-durable-order-processing-sam/src/initiator.js @@ -0,0 +1,84 @@ +const { LambdaClient, InvokeCommand } = require('@aws-sdk/client-lambda'); + +const lambda = new LambdaClient({}); +const FUNCTION_NAME = process.env.AWS_LAMBDA_FUNCTION_NAME.replace('-initiator', '-processor') + ':prod'; + +/** + * Order Initiator Function + * + * This function receives order requests via API Gateway and invokes + * the durable order processing function asynchronously. + */ +exports.handler = async (event) => { + console.log('Received order request', { event }); + + try { + // Parse request body + const body = JSON.parse(event.body || '{}'); + + // Validate required fields + if (!body.customerId) { + return { + statusCode: 400, + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + error: 'customerId is required' + }) + }; + } + + if (!body.items || body.items.length === 0) { + return { + statusCode: 400, + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + error: 'items array is required and must not be empty' + }) + }; + } + + // Generate order ID + const orderId = `order-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`; + + const order = { + orderId, + customerId: body.customerId, + customerEmail: body.customerEmail, + items: body.items, + createdAt: new Date().toISOString() + }; + + // Invoke durable function asynchronously + const invokeCommand = new InvokeCommand({ + FunctionName: FUNCTION_NAME, + InvocationType: 'Event', // Asynchronous invocation + Payload: JSON.stringify(order) + }); + + await lambda.send(invokeCommand); + + console.log('Order processing initiated', { orderId }); + + return { + statusCode: 202, + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + message: 'Order processing initiated', + orderId, + statusUrl: `/orders/${orderId}` + }) + }; + + } catch (error) { + console.error('Error initiating order', { error: error.message }); + + return { + statusCode: 500, + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + error: 'Failed to initiate order processing', + message: error.message + }) + }; + } +}; diff --git a/lambda-durable-order-processing-sam/src/package.json b/lambda-durable-order-processing-sam/src/package.json new file mode 100644 index 000000000..ac34e40e5 --- /dev/null +++ b/lambda-durable-order-processing-sam/src/package.json @@ -0,0 +1,24 @@ +{ + "name": "lambda-durable-order-processing", + "version": "1.0.0", + "description": "Order processing workflow using Lambda Durable Functions", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "dependencies": { + "@aws/durable-execution-sdk-js": "^1.0.0", + "@aws-sdk/client-dynamodb": "^3.0.0", + "@aws-sdk/lib-dynamodb": "^3.0.0", + "@aws-sdk/client-lambda": "^3.0.0" + }, + "keywords": [ + "aws", + "lambda", + "durable-functions", + "serverless", + "order-processing" + ], + "author": "", + "license": "MIT-0" +} diff --git a/lambda-durable-order-processing-sam/src/status.js b/lambda-durable-order-processing-sam/src/status.js new file mode 100644 index 000000000..e3bbc556a --- /dev/null +++ b/lambda-durable-order-processing-sam/src/status.js @@ -0,0 +1,104 @@ +const { DynamoDBClient } = require('@aws-sdk/client-dynamodb'); +const { DynamoDBDocumentClient, GetCommand } = require('@aws-sdk/lib-dynamodb'); +const { LambdaClient, ListDurableExecutionsCommand, GetDurableExecutionCommand } = require('@aws-sdk/client-lambda'); + +const dynamoClient = new DynamoDBClient({}); +const docClient = DynamoDBDocumentClient.from(dynamoClient); +const lambda = new LambdaClient({}); + +const ORDERS_TABLE = process.env.ORDERS_TABLE; +const FUNCTION_NAME = process.env.AWS_LAMBDA_FUNCTION_NAME.replace('-status', '-processor'); + +/** + * Order Status Function + * + * This function retrieves the current status of an order by: + * 1. Fetching order data from DynamoDB + * 2. Checking durable execution status + */ +exports.handler = async (event) => { + console.log('Checking order status', { event }); + + try { + const orderId = event.pathParameters?.orderId; + + if (!orderId) { + return { + statusCode: 400, + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + error: 'orderId is required' + }) + }; + } + + // Get order from DynamoDB + const orderResult = await docClient.send(new GetCommand({ + TableName: ORDERS_TABLE, + Key: { orderId } + })); + + if (!orderResult.Item) { + return { + statusCode: 404, + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + error: 'Order not found', + orderId + }) + }; + } + + const order = orderResult.Item; + + // Try to get durable execution status + let executionStatus = null; + try { + // List executions for this function + const listCommand = new ListDurableExecutionsCommand({ + FunctionName: FUNCTION_NAME, + MaxResults: 10 + }); + + const executions = await lambda.send(listCommand); + + // Find execution for this order (this is simplified - in production you'd store execution ID) + // For now, we'll just show the order status from DynamoDB + executionStatus = { + note: 'Execution details available via GetDurableExecution API with execution ID' + }; + + } catch (error) { + console.warn('Could not fetch execution status', { error: error.message }); + } + + return { + statusCode: 200, + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + orderId: order.orderId, + status: order.status, + customerId: order.customerId, + total: order.total, + items: order.items, + createdAt: order.createdAt, + updatedAt: order.updatedAt, + validatedAt: order.validatedAt, + errorMessage: order.errorMessage, + execution: executionStatus + }) + }; + + } catch (error) { + console.error('Error checking order status', { error: error.message }); + + return { + statusCode: 500, + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + error: 'Failed to check order status', + message: error.message + }) + }; + } +}; diff --git a/lambda-durable-order-processing-sam/template.yaml b/lambda-durable-order-processing-sam/template.yaml new file mode 100644 index 000000000..54fa72eb5 --- /dev/null +++ b/lambda-durable-order-processing-sam/template.yaml @@ -0,0 +1,147 @@ +AWSTemplateFormatVersion: '2010-09-09' +Transform: AWS::Serverless-2016-10-31 +Description: Order Processing Workflow using Lambda Durable Functions + +Globals: + Function: + Timeout: 900 + Runtime: nodejs22.x + Architectures: + - arm64 + Environment: + Variables: + ORDERS_TABLE: !Ref OrdersTable + +Resources: + # DynamoDB Table for Orders + OrdersTable: + Type: AWS::DynamoDB::Table + Properties: + TableName: !Sub '${AWS::StackName}-orders' + BillingMode: PAY_PER_REQUEST + AttributeDefinitions: + - AttributeName: orderId + AttributeType: S + KeySchema: + - AttributeName: orderId + KeyType: HASH + StreamSpecification: + StreamViewType: NEW_AND_OLD_IMAGES + + # IAM Role for Order Processing Function + OrderProcessingFunctionRole: + Type: AWS::IAM::Role + Properties: + AssumeRolePolicyDocument: + Version: '2012-10-17' + Statement: + - Effect: Allow + Principal: + Service: lambda.amazonaws.com + Action: sts:AssumeRole + ManagedPolicyArns: + - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole + Policies: + - PolicyName: DynamoDBAccess + PolicyDocument: + Version: '2012-10-17' + Statement: + - Effect: Allow + Action: + - dynamodb:PutItem + - dynamodb:GetItem + - dynamodb:UpdateItem + - dynamodb:Query + - dynamodb:Scan + Resource: !GetAtt OrdersTable.Arn + - PolicyName: DurableExecutionAccess + PolicyDocument: + Version: '2012-10-17' + Statement: + - Effect: Allow + Action: + - lambda:CreateDurableExecution + - lambda:GetDurableExecution + - lambda:ListDurableExecutions + - lambda:StopDurableExecution + - lambda:SendDurableExecutionCallbackSuccess + - lambda:SendDurableExecutionCallbackFailure + Resource: !Sub 'arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:${AWS::StackName}-order-processor:*' + + # Order Processing Durable Function + OrderProcessingFunction: + Type: AWS::Serverless::Function + Properties: + FunctionName: !Sub '${AWS::StackName}-order-processor' + CodeUri: src/ + Handler: index.handler + Role: !GetAtt OrderProcessingFunctionRole.Arn + # DurableConfig will be enabled after deployment via AWS CLI + # ExecutionTimeout: 86400 (24 hours) + # RetentionPeriodInDays: 7 + + # API Gateway to trigger order processing + OrderApi: + Type: AWS::Serverless::Api + Properties: + Name: !Sub '${AWS::StackName}-order-api' + StageName: prod + Cors: + AllowMethods: "'POST, GET, OPTIONS'" + AllowHeaders: "'Content-Type,X-Amz-Date,Authorization,X-Api-Key'" + AllowOrigin: "'*'" + + # Lambda function to initiate order processing + OrderInitiatorFunction: + Type: AWS::Serverless::Function + Properties: + FunctionName: !Sub '${AWS::StackName}-order-initiator' + CodeUri: src/ + Handler: initiator.handler + Policies: + - LambdaInvokePolicy: + FunctionName: !Ref OrderProcessingFunction + Events: + CreateOrder: + Type: Api + Properties: + RestApiId: !Ref OrderApi + Path: /orders + Method: POST + + # Lambda function to check order status + OrderStatusFunction: + Type: AWS::Serverless::Function + Properties: + FunctionName: !Sub '${AWS::StackName}-order-status' + CodeUri: src/ + Handler: status.handler + Policies: + - DynamoDBReadPolicy: + TableName: !Ref OrdersTable + - Statement: + - Effect: Allow + Action: + - lambda:GetDurableExecution + - lambda:ListDurableExecutions + Resource: !Sub 'arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:${AWS::StackName}-order-processor:*' + Events: + GetOrderStatus: + Type: Api + Properties: + RestApiId: !Ref OrderApi + Path: /orders/{orderId} + Method: GET + +Outputs: + OrderApiEndpoint: + Description: API Gateway endpoint URL for order processing + Value: !Sub 'https://${OrderApi}.execute-api.${AWS::Region}.amazonaws.com/prod' + + OrderProcessingFunctionArn: + Description: Order Processing Durable Function ARN + Value: !GetAtt OrderProcessingFunction.Arn + + OrdersTableName: + Description: DynamoDB table name for orders + Value: !Ref OrdersTable From c69b273f0ecffe96606b5a8745207f5741735c2c Mon Sep 17 00:00:00 2001 From: Abhishek Agawane Date: Wed, 3 Dec 2025 12:41:25 +0530 Subject: [PATCH 2/8] Remove stale TESTING.md reference from README --- lambda-durable-order-processing-sam/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lambda-durable-order-processing-sam/README.md b/lambda-durable-order-processing-sam/README.md index d6619cb69..ec11c2050 100644 --- a/lambda-durable-order-processing-sam/README.md +++ b/lambda-durable-order-processing-sam/README.md @@ -201,7 +201,7 @@ aws lambda get-durable-execution \ --region us-east-2 ``` -For detailed testing instructions, see [TESTING.md](TESTING.md). + ## How It Works From 1f1d4d3f81b95295cf4099917a824c0f6415ae15 Mon Sep 17 00:00:00 2001 From: Abhishek Agawane Date: Thu, 4 Dec 2025 11:54:05 +0530 Subject: [PATCH 3/8] Implement production-ready 17-step order processing workflow with durable functions - Add comprehensive order processing workflow across 5 phases (Validation, Risk Assessment, Invoice, Fulfillment, Shipping) - Implement dual-function architecture: async durable function for order creation, sync function for status queries - Add long-running waits (5min warehouse + 3min pickup) with zero compute cost during waits - Include conditional credit check for high-value orders (>) - Add automatic checkpointing for workflow resilience - Implement deterministic order ID generation for API Gateway integration - Add comprehensive error handling and validation - Include test data with multiple order scenarios - Update architecture diagram and documentation - Remove deprecated initiator.js in favor of integrated approach --- lambda-durable-order-processing-sam/README.md | 189 ++++++++++---- .../architecture.png | Bin 101754 -> 116843 bytes .../example-pattern.json | 12 +- .../src/index.js | 231 ++++++++++++++++-- .../src/initiator.js | 84 ------- .../src/status.js | 76 ++---- .../template.yaml | 173 ++++++------- .../test-orders.json | 50 ++++ 8 files changed, 514 insertions(+), 301 deletions(-) delete mode 100644 lambda-durable-order-processing-sam/src/initiator.js create mode 100644 lambda-durable-order-processing-sam/test-orders.json diff --git a/lambda-durable-order-processing-sam/README.md b/lambda-durable-order-processing-sam/README.md index ec11c2050..9b4b259cd 100644 --- a/lambda-durable-order-processing-sam/README.md +++ b/lambda-durable-order-processing-sam/README.md @@ -8,15 +8,40 @@ This pattern demonstrates a multi-step order processing workflow using AWS Lambd ![Architecture Diagram](architecture.png) -The Order Processor uses Lambda Durable Functions to execute a multi-step workflow with automatic checkpointing. Each step (validate, payment, inventory, shipping) is checkpointed, allowing the workflow to resume from the last successful step if interrupted. +The solution uses a dual-function architecture: +- **Durable Function**: Handles async order processing with 17 steps and automatic checkpointing +- **Status Function**: Provides real-time order status via synchronous API calls -### Workflow Steps +### Order Processing Workflow (17 Steps) -1. **Validate Order** - Validates order data and customer information -2. **Process Payment** - Simulates payment processing with 5-second wait -3. **Check Inventory** - Verifies item availability with 5-second wait -4. **Arrange Shipping** - Creates shipment with 5-second wait -5. **Complete Order** - Saves final order state to DynamoDB +The workflow consists of 17 steps organized into 5 phases: + +**Phase 1: Validation (Steps 1-3)** +1. Validate Order - Check order data and customer information +2. Check Inventory - Verify item availability +3. Process Payment - Process payment transaction + +**Phase 2: Risk Assessment (Steps 4-6)** +4. Reserve Inventory - Lock inventory for order +5. Fraud Check - Run fraud detection +6. Credit Check - Verify credit (for orders > $1000) + +**Phase 3: Invoice (Step 7)** +7. Generate Invoice - Create customer invoice + +**Phase 4: Fulfillment (Steps 8-12)** +- *Wait 5 minutes for warehouse processing (no compute cost)* +8. Pick Items - Warehouse picks items +9. Quality Check - Inspect items +10. Package Order - Package for shipping +11. Generate Shipping Label - Create shipping label + +**Phase 5: Shipping & Completion (Steps 13-17)** +- *Wait 3 minutes for carrier pickup (no compute cost)* +12. Ship Order - Hand off to carrier +13. Send Notifications - Email/SMS to customer +14. Update Loyalty Points - Award loyalty points +15. Complete Order - Mark order as complete Each step is automatically checkpointed, allowing the workflow to resume from the last successful step if interrupted. @@ -69,9 +94,9 @@ Each step is automatically checkpointed, allowing the workflow to resume from th ## Testing -### Get Your API Endpoint +### Step 1: Get Your API Endpoint -First, retrieve your API endpoint from the CloudFormation stack: +Retrieve your API endpoint from the CloudFormation stack: ```bash API_ENDPOINT=$(aws cloudformation describe-stacks \ @@ -83,9 +108,9 @@ API_ENDPOINT=$(aws cloudformation describe-stacks \ echo "API Endpoint: $API_ENDPOINT" ``` -### Create Test Orders +### Step 2: Create Test Orders -**Test 1: Simple order** +**Test 1: Low-value order (< $1000)** ```bash curl -X POST ${API_ENDPOINT}/orders \ -H "Content-Type: application/json" \ @@ -93,12 +118,20 @@ curl -X POST ${API_ENDPOINT}/orders \ "customerId": "CUST-001", "customerEmail": "customer1@example.com", "items": [ - {"productId": "LAPTOP-001", "quantity": 1} + {"productId": "BOOK-001", "name": "Programming Book", "quantity": 2, "price": 45.99} ] }' ``` -**Test 2: Multiple items** +Expected response: +```json +{ + "message": "Order processing initiated", + "orderId": "order-1764821208592" +} +``` + +**Test 2: High-value order (> $1000, triggers credit check)** ```bash curl -X POST ${API_ENDPOINT}/orders \ -H "Content-Type: application/json" \ @@ -106,68 +139,114 @@ curl -X POST ${API_ENDPOINT}/orders \ "customerId": "CUST-002", "customerEmail": "customer2@example.com", "items": [ - {"productId": "PHONE-001", "quantity": 2}, - {"productId": "CASE-001", "quantity": 2}, - {"productId": "CHARGER-001", "quantity": 1} + {"productId": "SERVER-001", "name": "Enterprise Server", "quantity": 1, "price": 3500.00} ] }' ``` -**Test 3: Validation error (missing customerId)** +**Test 3: Multiple items order** ```bash curl -X POST ${API_ENDPOINT}/orders \ -H "Content-Type: application/json" \ -d '{ + "customerId": "CUST-003", + "customerEmail": "customer3@example.com", "items": [ - {"productId": "LAPTOP-001", "quantity": 1} + {"productId": "LAPTOP-001", "name": "Gaming Laptop", "quantity": 1, "price": 1299.99}, + {"productId": "MOUSE-001", "name": "Wireless Mouse", "quantity": 2, "price": 29.99}, + {"productId": "KEYBOARD-001", "name": "Mechanical Keyboard", "quantity": 1, "price": 149.99} ] }' ``` -Response format: +**Test 4: Edge case - Empty items (should fail validation)** +```bash +curl -X POST ${API_ENDPOINT}/orders \ + -H "Content-Type: application/json" \ + -d '{ + "customerId": "CUST-004", + "customerEmail": "customer4@example.com", + "items": [] + }' +``` + +### Step 3: Check Order Status + +Wait 10 seconds, then check the order status using the order ID from the response: + +```bash +ORDER_ID="order-1764821208592" # Replace with your order ID +curl ${API_ENDPOINT}/orders/${ORDER_ID} | jq '.' +``` + +Expected response: ```json { - "message": "Order processing initiated", - "orderId": "order-1234567890-abc123", - "statusUrl": "/orders/order-1234567890-abc123" + "orderId": "order-1764821208592", + "status": "awaiting-warehouse", + "customerId": "CUST-001", + "customerEmail": "customer1@example.com", + "total": 91.98, + "items": [ + { + "name": "Programming Book", + "quantity": 2, + "productId": "BOOK-001", + "price": 45.99 + } + ], + "createdAt": "2025-12-04T04:06:48.964Z", + "lastUpdated": "2025-12-04T04:06:50.621Z" } ``` -### Check Order Status +### Step 4: Track Status Progression -Replace `` with the order ID from the response: +Poll the order status to see it progress through the workflow: ```bash -curl ${API_ENDPOINT}/orders/ +# Check status every 30 seconds +for i in {1..10}; do + echo "=== Check $i at $(date +%H:%M:%S) ===" + curl -s ${API_ENDPOINT}/orders/${ORDER_ID} | jq '{status, lastUpdated}' + sleep 30 +done ``` -### Monitor Durable Executions +You'll see the status progress through: +- `validated` → `inventory-checked` → `payment-processed` → `inventory-reserved` → `fraud-checked` → `invoice-generated` → `awaiting-warehouse` (5 min wait) → `items-picked` → `quality-checked` → `packaged` → `awaiting-pickup` (3 min wait) → `shipped` → `completed` + +### Step 5: Monitor Lambda Logs + +View real-time Lambda execution logs: -**View Lambda logs in real-time:** ```bash +# Get function name FUNCTION_NAME=$(aws cloudformation describe-stack-resources \ --stack-name lambda-durable-order-processing \ --region us-east-2 \ - --query 'StackResources[?ResourceType==`AWS::Lambda::Function`].PhysicalResourceId' \ - --output text | grep -i "order-processor") + --query 'StackResources[?LogicalResourceId==`OrderProcessingFunction`].PhysicalResourceId' \ + --output text) +# Tail logs aws logs tail /aws/lambda/${FUNCTION_NAME} \ --follow \ --format short \ --region us-east-2 ``` -**View recent logs:** -```bash -aws logs tail /aws/lambda/${FUNCTION_NAME} \ - --since 5m \ - --format short \ - --region us-east-2 +Look for checkpoint and step execution messages: +``` +Starting order processing { orderId: 'order-1764821208592' } +Validating order { orderId: 'order-1764821208592' } +Checking inventory { orderId: 'order-1764821208592' } +Processing payment { orderId: 'order-1764821208592', amount: 91.98 } +Waiting for warehouse processing { orderId: 'order-1764821208592' } ``` -### Verify DynamoDB Storage +### Step 6: Verify DynamoDB Storage -Check orders saved to DynamoDB: +Check orders stored in DynamoDB: ```bash TABLE_NAME=$(aws cloudformation describe-stacks \ @@ -176,30 +255,40 @@ TABLE_NAME=$(aws cloudformation describe-stacks \ --query 'Stacks[0].Outputs[?OutputKey==`OrdersTableName`].OutputValue' \ --output text) +# Scan all orders aws dynamodb scan \ --table-name ${TABLE_NAME} \ --region us-east-2 \ - --max-items 10 + --max-items 5 | jq '.Items[] | {orderId: .orderId.S, status: .status.S, total: .total.N}' ``` -### List Durable Executions +### Step 7: Test Concurrent Orders -View all durable executions for the function: +Create multiple orders simultaneously to test concurrency: ```bash -aws lambda list-durable-executions \ - --function-name ${FUNCTION_NAME}:prod \ - --region us-east-2 +for i in {1..5}; do + curl -X POST ${API_ENDPOINT}/orders \ + -H "Content-Type: application/json" \ + -d "{ + \"customerId\": \"CONCURRENT-$i\", + \"customerEmail\": \"concurrent$i@example.com\", + \"items\": [{\"productId\": \"PROD-$i\", \"name\": \"Product $i\", \"quantity\": 1, \"price\": $((100 + i * 10))}] + }" & +done +wait +echo "All 5 orders submitted concurrently" ``` -Get details for a specific execution: +### Expected Test Results -```bash -aws lambda get-durable-execution \ - --function-name ${FUNCTION_NAME}:prod \ - --execution-id \ - --region us-east-2 -``` +- ✅ **Low-value orders**: Complete all 17 steps (no credit check) +- ✅ **High-value orders**: Include credit check step (Step 6) +- ✅ **Multi-item orders**: Calculate total correctly +- ✅ **Invalid orders**: Fail validation and mark as failed +- ✅ **Status API**: Returns real-time order status +- ✅ **Concurrent orders**: All process independently +- ✅ **Wait periods**: 8 minutes total (5 min + 3 min) with no compute cost diff --git a/lambda-durable-order-processing-sam/architecture.png b/lambda-durable-order-processing-sam/architecture.png index 2a9647c092426003c855e2ac5a78ea121afb0901..e8f7635c9612c4677e6ec48f5ae253986c719ec2 100644 GIT binary patch literal 116843 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

yQlk;=Y6M`x^PUb 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 XBOU7sbL%{=fiD>e1@R(L!#Dp2I+|m0 literal 101754 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 J_8*sj|8F44hV}pe diff --git a/lambda-durable-order-processing-sam/example-pattern.json b/lambda-durable-order-processing-sam/example-pattern.json index a78849d3e..79fe6b8c9 100644 --- a/lambda-durable-order-processing-sam/example-pattern.json +++ b/lambda-durable-order-processing-sam/example-pattern.json @@ -1,6 +1,6 @@ { "title": "Order Processing Workflow with Lambda Durable Functions", - "description": "Multi-step order processing workflow using Lambda Durable Functions with automatic checkpointing and state persistence across long-running operations", + "description": "Production-ready 17-step order processing workflow using Lambda Durable Functions with automatic checkpointing, long-running waits, and state persistence", "language": "Node.js", "level": "300", "framework": "SAM", @@ -11,10 +11,12 @@ "introBox": { "headline": "How it works", "text": [ - "This pattern demonstrates a resilient order processing workflow using Lambda Durable Functions.", - "The workflow validates orders, processes payments, checks inventory, and arranges shipping with automatic checkpointing at each step.", - "Durable execution enables the workflow to survive Lambda timeouts and failures by automatically resuming from the last checkpoint.", - "The pattern includes API Gateway endpoints for order creation and status checking, with state persisted in DynamoDB." + "This pattern demonstrates a production-ready order processing workflow with 17 steps using Lambda Durable Functions.", + "The workflow includes validation, payment processing, fraud checks, credit checks (for high-value orders), inventory management, and shipping coordination.", + "Durable execution enables long-running waits (5 minutes for warehouse processing, 3 minutes for carrier pickup) without consuming compute resources.", + "Each step is automatically checkpointed, allowing the workflow to survive interruptions and resume from the last successful step.", + "The pattern uses a dual-function architecture: async durable function for order processing and sync non-durable function for real-time status queries.", + "Order state is persisted in DynamoDB with real-time status updates throughout the 17-step workflow." ] }, "gitHub": { diff --git a/lambda-durable-order-processing-sam/src/index.js b/lambda-durable-order-processing-sam/src/index.js index ee8eb846d..d30fabb27 100644 --- a/lambda-durable-order-processing-sam/src/index.js +++ b/lambda-durable-order-processing-sam/src/index.js @@ -21,8 +21,10 @@ const ORDERS_TABLE = process.env.ORDERS_TABLE; exports.handler = withDurableExecution(async (event, context) => { console.log('Starting order processing', { event }); - const order = typeof event === 'string' ? JSON.parse(event) : event; - const orderId = order.orderId || `order-${Date.now()}`; + // Parse order data - orderId comes from API Gateway template + const orderId = event.orderId || `order-${Date.now()}`; + const body = typeof event.body === 'string' ? JSON.parse(event.body) : event.body; + const order = { ...body, orderId }; try { // Step 1: Validate Order @@ -121,56 +123,240 @@ exports.handler = withDurableExecution(async (event, context) => { }; }); - // Step 5: Wait for fulfillment preparation (simulate warehouse processing time) - console.log('Waiting for fulfillment preparation', { orderId }); - await context.wait({ seconds: 30 }); // In production, this could be hours + // Step 5: Fraud Check (parallel with credit check) + const fraudCheck = await context.step('fraud-check', async () => { + console.log('Running fraud detection', { orderId }); + + // Simulate fraud detection analysis + const riskScore = Math.random() * 100; + const isFraudulent = riskScore > 95; + + if (isFraudulent) { + throw new Error('Order flagged as fraudulent'); + } + + await updateOrderStatus(orderId, 'fraud-checked'); + + return { + riskScore, + status: 'passed', + checkedAt: new Date().toISOString() + }; + }); - // Step 6: Ship Order - const shipment = await context.step('ship-order', async () => { - console.log('Shipping order', { orderId }); + // Step 6: Credit Check + const creditCheck = await context.step('credit-check', async () => { + console.log('Checking customer credit', { orderId }); - // Simulate shipping - const trackingNumber = `TRK-${Date.now()}`; - const carrier = 'FastShip'; + // Simulate credit check for high-value orders + if (validatedOrder.total > 1000) { + const creditScore = Math.floor(Math.random() * 300) + 500; + + if (creditScore < 600) { + throw new Error('Insufficient credit score'); + } + + return { + creditScore, + approved: true, + checkedAt: new Date().toISOString() + }; + } - await updateOrderStatus(orderId, 'shipped'); + return { skipped: true, reason: 'Order value below threshold' }; + }); + + // Step 7: Generate Invoice + const invoice = await context.step('generate-invoice', async () => { + console.log('Generating invoice', { orderId }); + + const invoiceId = `INV-${Date.now()}`; + const invoiceData = { + invoiceId, + orderId, + customerId: validatedOrder.customerId, + items: validatedOrder.items, + subtotal: validatedOrder.total, + tax: validatedOrder.total * 0.08, + total: validatedOrder.total * 1.08, + generatedAt: new Date().toISOString() + }; + + await updateOrderStatus(orderId, 'invoice-generated'); + + return invoiceData; + }); + + // Step 8: Wait for warehouse processing (showcases long wait without compute charges) + console.log('Waiting for warehouse processing', { orderId }); + await updateOrderStatus(orderId, 'awaiting-warehouse'); + await context.wait({ seconds: 300 }); // 5 minutes - in production could be hours + + // Step 9: Pick Items from Warehouse + const pickingResult = await context.step('pick-items', async () => { + console.log('Picking items from warehouse', { orderId }); + + const pickedItems = validatedOrder.items.map(item => ({ + ...item, + binLocation: `BIN-${Math.floor(Math.random() * 1000)}`, + pickedBy: `PICKER-${Math.floor(Math.random() * 50)}`, + pickedAt: new Date().toISOString() + })); + + await updateOrderStatus(orderId, 'items-picked'); + + return { + items: pickedItems, + completedAt: new Date().toISOString() + }; + }); + + // Step 10: Quality Check + const qualityCheck = await context.step('quality-check', async () => { + console.log('Performing quality check', { orderId }); + + // Simulate quality inspection + const passedQC = Math.random() > 0.02; // 98% pass rate + + if (!passedQC) { + throw new Error('Quality check failed - items damaged'); + } + + await updateOrderStatus(orderId, 'quality-checked'); + + return { + passed: true, + inspector: `QC-${Math.floor(Math.random() * 20)}`, + checkedAt: new Date().toISOString() + }; + }); + + // Step 11: Package Order + const packaging = await context.step('package-order', async () => { + console.log('Packaging order', { orderId }); + + const packageId = `PKG-${Date.now()}`; + const weight = validatedOrder.items.reduce((sum, item) => sum + (item.quantity * 2), 0); + + await updateOrderStatus(orderId, 'packaged'); + + return { + packageId, + weight: `${weight} lbs`, + dimensions: '12x10x8 inches', + packagedBy: `PACKER-${Math.floor(Math.random() * 30)}`, + packagedAt: new Date().toISOString() + }; + }); + + // Step 12: Generate Shipping Label + const shippingLabel = await context.step('generate-shipping-label', async () => { + console.log('Generating shipping label', { orderId }); + + const trackingNumber = `TRK-${Date.now()}-${Math.random().toString(36).substring(2, 11).toUpperCase()}`; + const carrier = validatedOrder.total > 500 ? 'ExpressShip' : 'StandardShip'; return { trackingNumber, carrier, + labelUrl: `https://shipping.example.com/labels/${trackingNumber}`, + generatedAt: new Date().toISOString() + }; + }); + + // Step 13: Wait for carrier pickup (another long wait) + console.log('Waiting for carrier pickup', { orderId }); + await updateOrderStatus(orderId, 'awaiting-pickup'); + await context.wait({ seconds: 180 }); // 3 minutes - in production could be hours + + // Step 14: Ship Order + const shipment = await context.step('ship-order', async () => { + console.log('Order shipped', { orderId }); + + await updateOrderStatus(orderId, 'shipped'); + + return { + ...shippingLabel, estimatedDelivery: new Date(Date.now() + 3 * 24 * 60 * 60 * 1000).toISOString(), shippedAt: new Date().toISOString() }; }); - // Step 7: Send Confirmation - const confirmation = await context.step('send-confirmation', async () => { - console.log('Sending confirmation', { orderId }); + // Step 15: Send Customer Notifications (parallel notifications) + const notifications = await context.step('send-notifications', async () => { + console.log('Sending customer notifications', { orderId }); - // Simulate sending email/SMS - const notification = { + // Simulate sending multiple notifications + const emailNotification = { type: 'email', recipient: order.customerEmail || 'customer@example.com', - subject: `Order ${orderId} Confirmed`, + subject: `Order ${orderId} Shipped - Tracking: ${shippingLabel.trackingNumber}`, sentAt: new Date().toISOString() }; + const smsNotification = { + type: 'sms', + recipient: order.customerPhone || '+1234567890', + message: `Your order ${orderId} has shipped! Track: ${shippingLabel.trackingNumber}`, + sentAt: new Date().toISOString() + }; + + return { + email: emailNotification, + sms: smsNotification + }; + }); + + // Step 16: Update Loyalty Points + const loyaltyUpdate = await context.step('update-loyalty-points', async () => { + console.log('Updating loyalty points', { orderId }); + + const pointsEarned = Math.floor(validatedOrder.total * 0.1); // 10% back in points + + return { + customerId: validatedOrder.customerId, + pointsEarned, + newBalance: pointsEarned, // In production, would fetch and add to existing balance + updatedAt: new Date().toISOString() + }; + }); + + // Step 17: Complete Order + const completion = await context.step('complete-order', async () => { + console.log('Completing order', { orderId }); + await updateOrderStatus(orderId, 'completed'); - return notification; + return { + completedAt: new Date().toISOString(), + totalProcessingTime: Date.now() - parseInt(orderId.split('-')[1]) + }; }); - // Return final result + // Return comprehensive result const result = { orderId, status: 'completed', order: validatedOrder, payment: paymentResult, + fraudCheck, + creditCheck, + invoice, + picking: pickingResult, + qualityCheck, + packaging, shipment, - completedAt: new Date().toISOString() + notifications, + loyaltyPoints: loyaltyUpdate, + completion, + summary: { + totalSteps: 17, + totalWaitTime: '8 minutes (480 seconds)', + processingTime: `${completion.totalProcessingTime}ms` + } }; - console.log('Order processing completed', { result }); + console.log('Order processing completed successfully', { orderId, totalSteps: 17 }); return result; } catch (error) { @@ -219,3 +405,4 @@ async function updateOrderStatus(orderId, status, errorMessage = null) { ExpressionAttributeValues: expressionAttributeValues })); } + diff --git a/lambda-durable-order-processing-sam/src/initiator.js b/lambda-durable-order-processing-sam/src/initiator.js deleted file mode 100644 index a15ca21cb..000000000 --- a/lambda-durable-order-processing-sam/src/initiator.js +++ /dev/null @@ -1,84 +0,0 @@ -const { LambdaClient, InvokeCommand } = require('@aws-sdk/client-lambda'); - -const lambda = new LambdaClient({}); -const FUNCTION_NAME = process.env.AWS_LAMBDA_FUNCTION_NAME.replace('-initiator', '-processor') + ':prod'; - -/** - * Order Initiator Function - * - * This function receives order requests via API Gateway and invokes - * the durable order processing function asynchronously. - */ -exports.handler = async (event) => { - console.log('Received order request', { event }); - - try { - // Parse request body - const body = JSON.parse(event.body || '{}'); - - // Validate required fields - if (!body.customerId) { - return { - statusCode: 400, - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ - error: 'customerId is required' - }) - }; - } - - if (!body.items || body.items.length === 0) { - return { - statusCode: 400, - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ - error: 'items array is required and must not be empty' - }) - }; - } - - // Generate order ID - const orderId = `order-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`; - - const order = { - orderId, - customerId: body.customerId, - customerEmail: body.customerEmail, - items: body.items, - createdAt: new Date().toISOString() - }; - - // Invoke durable function asynchronously - const invokeCommand = new InvokeCommand({ - FunctionName: FUNCTION_NAME, - InvocationType: 'Event', // Asynchronous invocation - Payload: JSON.stringify(order) - }); - - await lambda.send(invokeCommand); - - console.log('Order processing initiated', { orderId }); - - return { - statusCode: 202, - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ - message: 'Order processing initiated', - orderId, - statusUrl: `/orders/${orderId}` - }) - }; - - } catch (error) { - console.error('Error initiating order', { error: error.message }); - - return { - statusCode: 500, - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ - error: 'Failed to initiate order processing', - message: error.message - }) - }; - } -}; diff --git a/lambda-durable-order-processing-sam/src/status.js b/lambda-durable-order-processing-sam/src/status.js index e3bbc556a..326728332 100644 --- a/lambda-durable-order-processing-sam/src/status.js +++ b/lambda-durable-order-processing-sam/src/status.js @@ -1,20 +1,15 @@ const { DynamoDBClient } = require('@aws-sdk/client-dynamodb'); const { DynamoDBDocumentClient, GetCommand } = require('@aws-sdk/lib-dynamodb'); -const { LambdaClient, ListDurableExecutionsCommand, GetDurableExecutionCommand } = require('@aws-sdk/client-lambda'); const dynamoClient = new DynamoDBClient({}); const docClient = DynamoDBDocumentClient.from(dynamoClient); -const lambda = new LambdaClient({}); - const ORDERS_TABLE = process.env.ORDERS_TABLE; -const FUNCTION_NAME = process.env.AWS_LAMBDA_FUNCTION_NAME.replace('-status', '-processor'); /** - * Order Status Function + * Order Status Function (Non-Durable) * - * This function retrieves the current status of an order by: - * 1. Fetching order data from DynamoDB - * 2. Checking durable execution status + * This is a separate, regular Lambda function for checking order status. + * It queries DynamoDB directly without invoking the durable function. */ exports.handler = async (event) => { console.log('Checking order status', { event }); @@ -26,78 +21,49 @@ exports.handler = async (event) => { return { statusCode: 400, headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ - error: 'orderId is required' - }) + body: JSON.stringify({ error: 'Order ID is required' }) }; } - // Get order from DynamoDB - const orderResult = await docClient.send(new GetCommand({ + const result = await docClient.send(new GetCommand({ TableName: ORDERS_TABLE, Key: { orderId } })); - if (!orderResult.Item) { + if (!result.Item) { return { statusCode: 404, headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ + body: JSON.stringify({ error: 'Order not found', - orderId + orderId }) }; } - const order = orderResult.Item; - - // Try to get durable execution status - let executionStatus = null; - try { - // List executions for this function - const listCommand = new ListDurableExecutionsCommand({ - FunctionName: FUNCTION_NAME, - MaxResults: 10 - }); - - const executions = await lambda.send(listCommand); - - // Find execution for this order (this is simplified - in production you'd store execution ID) - // For now, we'll just show the order status from DynamoDB - executionStatus = { - note: 'Execution details available via GetDurableExecution API with execution ID' - }; - - } catch (error) { - console.warn('Could not fetch execution status', { error: error.message }); - } - return { statusCode: 200, headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ - orderId: order.orderId, - status: order.status, - customerId: order.customerId, - total: order.total, - items: order.items, - createdAt: order.createdAt, - updatedAt: order.updatedAt, - validatedAt: order.validatedAt, - errorMessage: order.errorMessage, - execution: executionStatus + orderId: result.Item.orderId, + status: result.Item.status, + customerId: result.Item.customerId, + customerEmail: result.Item.customerEmail, + total: result.Item.total, + items: result.Item.items, + createdAt: result.Item.validatedAt || result.Item.updatedAt, + lastUpdated: result.Item.updatedAt, + errorMessage: result.Item.errorMessage }) }; - } catch (error) { - console.error('Error checking order status', { error: error.message }); - + console.error('Error getting order status', { error }); return { statusCode: 500, headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ - error: 'Failed to check order status', - message: error.message + body: JSON.stringify({ + error: 'Failed to get order status', + message: error.message }) }; } diff --git a/lambda-durable-order-processing-sam/template.yaml b/lambda-durable-order-processing-sam/template.yaml index 54fa72eb5..f4c650595 100644 --- a/lambda-durable-order-processing-sam/template.yaml +++ b/lambda-durable-order-processing-sam/template.yaml @@ -28,110 +28,113 @@ Resources: StreamSpecification: StreamViewType: NEW_AND_OLD_IMAGES - # IAM Role for Order Processing Function - OrderProcessingFunctionRole: - Type: AWS::IAM::Role - Properties: - AssumeRolePolicyDocument: - Version: '2012-10-17' - Statement: - - Effect: Allow - Principal: - Service: lambda.amazonaws.com - Action: sts:AssumeRole - ManagedPolicyArns: - - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole - Policies: - - PolicyName: DynamoDBAccess - PolicyDocument: - Version: '2012-10-17' - Statement: - - Effect: Allow - Action: - - dynamodb:PutItem - - dynamodb:GetItem - - dynamodb:UpdateItem - - dynamodb:Query - - dynamodb:Scan - Resource: !GetAtt OrdersTable.Arn - - PolicyName: DurableExecutionAccess - PolicyDocument: - Version: '2012-10-17' - Statement: - - Effect: Allow - Action: - - lambda:CreateDurableExecution - - lambda:GetDurableExecution - - lambda:ListDurableExecutions - - lambda:StopDurableExecution - - lambda:SendDurableExecutionCallbackSuccess - - lambda:SendDurableExecutionCallbackFailure - Resource: !Sub 'arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:${AWS::StackName}-order-processor:*' - # Order Processing Durable Function OrderProcessingFunction: Type: AWS::Serverless::Function Properties: - FunctionName: !Sub '${AWS::StackName}-order-processor' CodeUri: src/ Handler: index.handler - Role: !GetAtt OrderProcessingFunctionRole.Arn - # DurableConfig will be enabled after deployment via AWS CLI - # ExecutionTimeout: 86400 (24 hours) - # RetentionPeriodInDays: 7 + Runtime: nodejs22.x + Timeout: 120 + AutoPublishAlias: live + DurableConfig: + ExecutionTimeout: 86400 # 24 hours + RetentionPeriodInDays: 7 + Policies: + - DynamoDBCrudPolicy: + TableName: !Ref OrdersTable + - Statement: + - Effect: Allow + Action: + - lambda:CheckpointDurableExecution + Resource: '*' - # API Gateway to trigger order processing + # Order Status Function (Non-Durable) + OrderStatusFunction: + Type: AWS::Serverless::Function + Properties: + CodeUri: src/ + Handler: status.handler + Runtime: nodejs22.x + Timeout: 30 + Policies: + - DynamoDBReadPolicy: + TableName: !Ref OrdersTable + + # API Gateway OrderApi: Type: AWS::Serverless::Api Properties: - Name: !Sub '${AWS::StackName}-order-api' StageName: prod Cors: AllowMethods: "'POST, GET, OPTIONS'" AllowHeaders: "'Content-Type,X-Amz-Date,Authorization,X-Api-Key'" AllowOrigin: "'*'" + DefinitionBody: + openapi: 3.0.1 + paths: + /orders: + post: + responses: + '202': + description: Order accepted + x-amazon-apigateway-integration: + type: aws + httpMethod: POST + uri: !Sub 'arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${OrderProcessingFunction.Arn}:live/invocations' + requestParameters: + integration.request.header.X-Amz-Invocation-Type: "'Event'" + requestTemplates: + application/json: | + #set($orderId = "order-$context.requestTimeEpoch") + { + "orderId": "$orderId", + "body": $input.json('$') + } + responses: + default: + statusCode: '202' + responseTemplates: + application/json: | + #set($orderId = "order-$context.requestTimeEpoch") + { + "message": "Order processing initiated", + "orderId": "$orderId" + } + passthroughBehavior: never + /orders/{orderId}: + get: + parameters: + - name: orderId + in: path + required: true + schema: + type: string + responses: + '200': + description: Order status + x-amazon-apigateway-integration: + type: aws_proxy + httpMethod: POST + uri: !Sub 'arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${OrderStatusFunction.Arn}/invocations' + passthroughBehavior: when_no_match - # Lambda function to initiate order processing - OrderInitiatorFunction: - Type: AWS::Serverless::Function + # Lambda Permissions for API Gateway + OrderProcessingFunctionInvokePermission: + Type: AWS::Lambda::Permission Properties: - FunctionName: !Sub '${AWS::StackName}-order-initiator' - CodeUri: src/ - Handler: initiator.handler - Policies: - - LambdaInvokePolicy: - FunctionName: !Ref OrderProcessingFunction - Events: - CreateOrder: - Type: Api - Properties: - RestApiId: !Ref OrderApi - Path: /orders - Method: POST + FunctionName: !Ref OrderProcessingFunction.Alias + Action: lambda:InvokeFunction + Principal: apigateway.amazonaws.com + SourceArn: !Sub 'arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}:${OrderApi}/*/POST/orders' - # Lambda function to check order status - OrderStatusFunction: - Type: AWS::Serverless::Function + OrderStatusFunctionInvokePermission: + Type: AWS::Lambda::Permission Properties: - FunctionName: !Sub '${AWS::StackName}-order-status' - CodeUri: src/ - Handler: status.handler - Policies: - - DynamoDBReadPolicy: - TableName: !Ref OrdersTable - - Statement: - - Effect: Allow - Action: - - lambda:GetDurableExecution - - lambda:ListDurableExecutions - Resource: !Sub 'arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:${AWS::StackName}-order-processor:*' - Events: - GetOrderStatus: - Type: Api - Properties: - RestApiId: !Ref OrderApi - Path: /orders/{orderId} - Method: GET + FunctionName: !Ref OrderStatusFunction + Action: lambda:InvokeFunction + Principal: apigateway.amazonaws.com + SourceArn: !Sub 'arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}:${OrderApi}/*/GET/orders/*' Outputs: OrderApiEndpoint: diff --git a/lambda-durable-order-processing-sam/test-orders.json b/lambda-durable-order-processing-sam/test-orders.json new file mode 100644 index 000000000..5cb93e0c4 --- /dev/null +++ b/lambda-durable-order-processing-sam/test-orders.json @@ -0,0 +1,50 @@ +{ + "lowValueOrder": { + "customerId": "CUST-001", + "customerEmail": "customer1@example.com", + "items": [ + { + "productId": "BOOK-001", + "name": "Programming Book", + "quantity": 2, + "price": 45.99 + } + ] + }, + "highValueOrder": { + "customerId": "CUST-002", + "customerEmail": "customer2@example.com", + "items": [ + { + "productId": "SERVER-001", + "name": "Enterprise Server", + "quantity": 1, + "price": 3500.00 + } + ] + }, + "multiItemOrder": { + "customerId": "CUST-003", + "customerEmail": "customer3@example.com", + "items": [ + { + "productId": "LAPTOP-001", + "name": "Gaming Laptop", + "quantity": 1, + "price": 1299.99 + }, + { + "productId": "MOUSE-001", + "name": "Wireless Mouse", + "quantity": 2, + "price": 29.99 + }, + { + "productId": "KEYBOARD-001", + "name": "Mechanical Keyboard", + "quantity": 1, + "price": 149.99 + } + ] + } +} From c7b92173185dca96021e7c8711c80203e02892c7 Mon Sep 17 00:00:00 2001 From: Abhishek Agawane Date: Thu, 4 Dec 2025 18:51:08 +0530 Subject: [PATCH 4/8] Fix example-pattern.json to match serverless-patterns standard format --- .../example-pattern.json | 45 ++----------------- 1 file changed, 4 insertions(+), 41 deletions(-) diff --git a/lambda-durable-order-processing-sam/example-pattern.json b/lambda-durable-order-processing-sam/example-pattern.json index 79fe6b8c9..7c3748b10 100644 --- a/lambda-durable-order-processing-sam/example-pattern.json +++ b/lambda-durable-order-processing-sam/example-pattern.json @@ -3,11 +3,7 @@ "description": "Production-ready 17-step order processing workflow using Lambda Durable Functions with automatic checkpointing, long-running waits, and state persistence", "language": "Node.js", "level": "300", - "framework": "SAM", - "services": { - "from": "apigateway", - "to": "lambda" - }, + "framework": "AWS SAM", "introBox": { "headline": "How it works", "text": [ @@ -24,7 +20,7 @@ "repoURL": "https://github.com/aws-samples/serverless-patterns/tree/main/lambda-durable-order-processing-sam", "templateURL": "serverless-patterns/lambda-durable-order-processing-sam", "projectFolder": "lambda-durable-order-processing-sam", - "templateFile": "lambda-durable-order-processing-sam/template.yaml" + "templateFile": "template.yaml" } }, "resources": { @@ -53,47 +49,14 @@ }, "testing": { "text": [ - "See README.md for comprehensive testing instructions including:", - "- Creating test orders via API", - "- Checking order status", - "- Monitoring Lambda logs", - "- Verifying DynamoDB storage", - "- Listing durable executions" + "See the GitHub repo for detailed testing instructions." ] }, "cleanup": { "text": [ - "sam delete --region us-east-2" + "Delete the stack: sam delete --region us-east-2." ] }, - "patternArch": { - "icon1": { - "x": 20, - "y": 50, - "service": "apigateway", - "label": "API Gateway" - }, - "icon2": { - "x": 50, - "y": 50, - "service": "lambda", - "label": "Lambda Durable Function" - }, - "icon3": { - "x": 80, - "y": 50, - "service": "dynamodb", - "label": "DynamoDB" - }, - "line1": { - "from": "icon1", - "to": "icon2" - }, - "line2": { - "from": "icon2", - "to": "icon3" - } - }, "authors": [ { "name": "Abhishek Agawane", From 9b1f5cf247d52eca82b46ab69d7f33e28be3a34c Mon Sep 17 00:00:00 2001 From: Abhishek Agawane Date: Sat, 6 Dec 2025 00:03:07 +0530 Subject: [PATCH 5/8] Address PR review comments: scope IAM permissions and add CLI prerequisites --- lambda-durable-order-processing-sam/README.md | 13 ++++++++++++- lambda-durable-order-processing-sam/template.yaml | 6 ++---- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/lambda-durable-order-processing-sam/README.md b/lambda-durable-order-processing-sam/README.md index 9b4b259cd..7e4c2b797 100644 --- a/lambda-durable-order-processing-sam/README.md +++ b/lambda-durable-order-processing-sam/README.md @@ -60,6 +60,17 @@ Each step is automatically checkpointed, allowing the workflow to resume from th * [AWS SAM CLI](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html) installed * [Node.js 18+](https://nodejs.org/) installed +### Required IAM Permissions + +Your AWS CLI user/role needs the following permissions for deployment and testing: +- **CloudFormation**: `cloudformation:DescribeStacks`, `cloudformation:DeleteStack` +- **Lambda**: `lambda:CreateFunction`, `lambda:InvokeFunction`, `lambda:GetFunction` +- **DynamoDB**: `dynamodb:Scan`, `dynamodb:GetItem` +- **CloudWatch Logs**: `logs:DescribeLogGroups`, `logs:FilterLogEvents`, `logs:GetLogEvents`, `logs:TailLogEvents` +- **API Gateway**: `apigateway:GET` +- **IAM**: `iam:CreateRole`, `iam:AttachRolePolicy`, `iam:PassRole` + + ## Deployment 1. Navigate to the pattern directory: @@ -244,7 +255,7 @@ Processing payment { orderId: 'order-1764821208592', amount: 91.98 } Waiting for warehouse processing { orderId: 'order-1764821208592' } ``` -### Step 6: Verify DynamoDB Storage +### Step 6: Verify Amazon DynamoDB Storage Check orders stored in DynamoDB: diff --git a/lambda-durable-order-processing-sam/template.yaml b/lambda-durable-order-processing-sam/template.yaml index f4c650595..58782434d 100644 --- a/lambda-durable-order-processing-sam/template.yaml +++ b/lambda-durable-order-processing-sam/template.yaml @@ -1,6 +1,6 @@ AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 -Description: Order Processing Workflow using Lambda Durable Functions +Description: Order Processing Workflow using AWS Lambda Durable Functions Globals: Function: @@ -34,7 +34,6 @@ Resources: Properties: CodeUri: src/ Handler: index.handler - Runtime: nodejs22.x Timeout: 120 AutoPublishAlias: live DurableConfig: @@ -47,7 +46,7 @@ Resources: - Effect: Allow Action: - lambda:CheckpointDurableExecution - Resource: '*' + Resource: !Sub 'arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:${AWS::StackName}-OrderProcessingFunction-*' # Order Status Function (Non-Durable) OrderStatusFunction: @@ -55,7 +54,6 @@ Resources: Properties: CodeUri: src/ Handler: status.handler - Runtime: nodejs22.x Timeout: 30 Policies: - DynamoDBReadPolicy: From 37489972ce9d832782da190b1b94f3286deaa1d7 Mon Sep 17 00:00:00 2001 From: ellisms <114107920+ellisms@users.noreply.github.com> Date: Fri, 5 Dec 2025 17:17:52 -0500 Subject: [PATCH 6/8] minor title edit --- lambda-durable-order-processing-sam/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lambda-durable-order-processing-sam/README.md b/lambda-durable-order-processing-sam/README.md index 7e4c2b797..038ce1d22 100644 --- a/lambda-durable-order-processing-sam/README.md +++ b/lambda-durable-order-processing-sam/README.md @@ -1,4 +1,4 @@ -# Order Processing Workflow with Lambda Durable Functions +# Order Processing Workflow with AWS Lambda Durable Functions This pattern demonstrates a multi-step order processing workflow using AWS Lambda Durable Functions. The workflow handles order validation, payment processing, inventory checking, and shipping arrangement with automatic checkpointing and state persistence across long-running operations. From 9a198c2140a2c70c857497eb15571737bc056e5f Mon Sep 17 00:00:00 2001 From: ellisms <114107920+ellisms@users.noreply.github.com> Date: Fri, 5 Dec 2025 17:25:26 -0500 Subject: [PATCH 7/8] publishing file --- .../lambda-durable-order-processing-sam.json | 96 +++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 lambda-durable-order-processing-sam/lambda-durable-order-processing-sam.json diff --git a/lambda-durable-order-processing-sam/lambda-durable-order-processing-sam.json b/lambda-durable-order-processing-sam/lambda-durable-order-processing-sam.json new file mode 100644 index 000000000..c5b3aed6a --- /dev/null +++ b/lambda-durable-order-processing-sam/lambda-durable-order-processing-sam.json @@ -0,0 +1,96 @@ +{ + "title": "Order Processing with AWS Lambda Durable Functions", + "description": "Order processing workflow using Lambda Durable Functions with automatic checkpointing, long-running waits, and state persistence", + "language": "Node.js", + "level": "300", + "framework": "AWS SAM", + "introBox": { + "headline": "How it works", + "text": [ + "This pattern demonstrates an order processing workflow using Lambda Durable Functions.", + "The workflow includes validation, payment processing, fraud checks, credit checks (for high-value orders), inventory management, and shipping coordination.", + "Durable execution enables long-running waits (5 minutes for warehouse processing, 3 minutes for carrier pickup) without consuming compute resources.", + "Each step is automatically checkpointed, allowing the workflow to survive interruptions and resume from the last successful step.", + "The pattern uses a dual-function architecture: async durable function for order processing and sync non-durable function for real-time status queries.", + "Order state is persisted in Amazon DynamoDB with real-time status updates throughout the 17-step workflow." + ] + }, + "gitHub": { + "template": { + "repoURL": "https://github.com/aws-samples/serverless-patterns/tree/main/lambda-durable-order-processing-sam", + "templateURL": "serverless-patterns/lambda-durable-order-processing-sam", + "projectFolder": "lambda-durable-order-processing-sam", + "templateFile": "template.yaml" + } + }, + "resources": { + "bullets": [ + { + "text": "Lambda Durable Functions Documentation", + "link": "https://docs.aws.amazon.com/lambda/latest/dg/durable-functions.html" + }, + { + "text": "Durable Execution SDK for JavaScript", + "link": "https://github.com/aws/aws-durable-execution-sdk-js" + }, + { + "text": "AWS Blog: Build multi-step applications with Lambda durable functions", + "link": "https://aws.amazon.com/blogs/aws/build-multi-step-applications-and-ai-workflows-with-aws-lambda-durable-functions/" + } + ] + }, + "deploy": { + "text": [ + "Note: Lambda Durable Functions are currently available in us-east-2 (Ohio) region only.", + "cd src && npm install && cd ..", + "sam build", + "sam deploy --guided --region us-east-2" + ] + }, + "testing": { + "text": [ + "See the GitHub repo for detailed testing instructions." + ] + }, + "cleanup": { + "text": [ + "Delete the stack: sam delete --region us-east-2." + ] + }, + "authors": [ + { + "name": "Abhishek Agawane", + "image": "https://drive.google.com/file/d/1E-5koDaKEaMUtOctX32I9TLwfh3kgpAq/view?usp=drivesdk", + "bio": "Abhishek Agawane is a Security Consultant at Amazon Web Services with more than 8 years of industry experience. He helps organizations architect resilient, secure, and efficient cloud environments, guiding them through complex challenges and large-scale infrastructure transformations. He has helped numerous organizations enhance their cloud operations through targeted optimizations, robust architectures, and best-practice implementations.", + "linkedin": "agawabhi" + } + ], + "patternArch": { + "icon1": { + "x": 20, + "y": 50, + "service": "apigw", + "label": "API Gateway REST API" + }, + "icon2": { + "x": 50, + "y": 50, + "service": "lambda", + "label": "AWS Lambda" + }, + "line1": { + "from": "icon1", + "to": "icon2" + }, + "icon3": { + "x": 80, + "y": 50, + "service": "dynamodb", + "label": "Amazon DynamoDB" + }, + "line2": { + "from": "icon2", + "to": "icon3" + } + } +} From deaa0453cddacff54594faa9f059ca03438f7012 Mon Sep 17 00:00:00 2001 From: ellisms <114107920+ellisms@users.noreply.github.com> Date: Fri, 5 Dec 2025 17:26:28 -0500 Subject: [PATCH 8/8] tagging --- lambda-durable-order-processing-sam/template.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lambda-durable-order-processing-sam/template.yaml b/lambda-durable-order-processing-sam/template.yaml index 58782434d..29bdac282 100644 --- a/lambda-durable-order-processing-sam/template.yaml +++ b/lambda-durable-order-processing-sam/template.yaml @@ -1,6 +1,6 @@ AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 -Description: Order Processing Workflow using AWS Lambda Durable Functions +Description: Order Processing Workflow using AWS Lambda Durable Functions (uksb-1tthgi812) (tag:lambda-durable-order-processing-sam) Globals: Function: