From 89e0cfd8741b6763ca04e90558bccf4c3c380cfa Mon Sep 17 00:00:00 2001 From: tobi <31960611+tsmethurst@users.noreply.github.com> Date: Sat, 13 Apr 2024 13:25:10 +0200 Subject: [PATCH] [feature] Admin accounts endpoints; approve/reject sign-ups (#2826) * update settings panels, add pending overview + approve/deny functions * add admin accounts get, approve, reject * send approved/rejected emails * use signup URL * docs! * email * swagger * web linting * fix email tests * wee lil fixerinos * use new paging logic for GetAccounts() series of admin endpoints, small changes to query building * shuffle useAccountIDIn check *before* adding to query * fix parse from toot react error * use `netip.Addr` * put valid slices in globals * optimistic updates for account state --------- Co-authored-by: kim --- docs/admin/signups.md | 59 +++ docs/api/swagger.yaml | 343 +++++++++++++++++ docs/assets/signup-account.png | Bin 0 -> 77617 bytes docs/assets/signup-form.png | Bin 0 -> 112173 bytes docs/assets/signup-pending.png | Bin 0 -> 73581 bytes internal/api/client/admin/accountapprove.go | 105 ++++++ internal/api/client/admin/accountget.go | 101 +++++ internal/api/client/admin/accountreject.go | 136 +++++++ internal/api/client/admin/accountsgetv1.go | 348 ++++++++++++++++++ internal/api/client/admin/accountsgetv2.go | 212 +++++++++++ internal/api/client/admin/admin.go | 12 +- internal/api/model/admin.go | 49 +++ internal/api/util/parsequery.go | 98 ++++- internal/db/account.go | 21 ++ internal/db/bundb/account.go | 254 +++++++++++++ internal/db/bundb/account_test.go | 185 ++++++++++ internal/db/bundb/user.go | 20 + internal/db/user.go | 6 + internal/email/email_test.go | 8 +- internal/email/noopsender.go | 8 + internal/email/sender.go | 8 + internal/email/signup.go | 36 ++ .../admin/{account.go => accountaction.go} | 0 internal/processing/admin/accountapprove.go | 79 ++++ .../processing/admin/accountapprove_test.go | 75 ++++ internal/processing/admin/accountget.go | 49 +++ internal/processing/admin/accountreject.go | 113 ++++++ .../processing/admin/accountreject_test.go | 142 +++++++ internal/processing/admin/accounts.go | 272 ++++++++++++++ internal/processing/workers/fromclientapi.go | 72 ++++ internal/processing/workers/surfaceemail.go | 65 +++- internal/web/customcss.go | 2 +- internal/web/profile.go | 2 +- internal/web/rss.go | 2 +- internal/web/thread.go | 2 +- mkdocs.yml | 1 + web/source/css/base.css | 5 +- web/source/settings/admin/accounts/detail.jsx | 112 ------ .../admin/accounts/detail/actions.tsx | 89 +++++ .../admin/accounts/detail/handlesignup.tsx | 118 ++++++ .../settings/admin/accounts/detail/index.tsx | 179 +++++++++ web/source/settings/admin/accounts/index.jsx | 138 ------- web/source/settings/admin/accounts/index.tsx | 49 +++ .../settings/admin/accounts/pending/index.tsx | 40 ++ .../settings/admin/accounts/search/index.tsx | 125 +++++++ .../{expireremote.jsx => expireremote.tsx} | 22 +- .../actions/keys/{index.jsx => index.tsx} | 8 +- .../media/{cleanup.jsx => cleanup.tsx} | 24 +- .../actions/media/{index.jsx => index.tsx} | 8 +- .../admin/domain-permissions/form.tsx | 9 +- .../settings/admin/emoji/local/detail.js | 36 +- .../admin/emoji/local/{index.js => index.tsx} | 12 +- .../local/{new-emoji.js => new-emoji.tsx} | 48 +-- .../settings/admin/emoji/local/overview.js | 2 +- .../emoji/remote/{index.js => index.tsx} | 18 +- ...parse-from-toot.js => parse-from-toot.tsx} | 71 ++-- .../admin/reports/{detail.jsx => detail.tsx} | 54 +-- .../admin/reports/{index.jsx => index.tsx} | 20 +- .../reports/{username.jsx => username.tsx} | 12 +- .../admin/settings/{rules.jsx => rules.tsx} | 45 ++- .../settings/components/account-list.tsx | 82 +++++ .../components/form/mutation-button.jsx | 48 --- .../components/form/mutation-button.tsx | 72 ++++ web/source/settings/index.js | 29 +- .../lib/navigation/{util.js => util.ts} | 21 +- web/source/settings/lib/query/admin/index.ts | 65 +++- .../settings/lib/query/admin/reports/index.ts | 2 +- web/source/settings/lib/types/account.ts | 88 +++++ web/source/settings/style.css | 41 ++- web/template/email_confirm.tmpl | 2 + web/template/email_report_closed.tmpl | 4 + web/template/email_reset.tmpl | 2 + web/template/email_signup_approved.tmpl | 34 ++ web/template/email_signup_rejected.tmpl | 28 ++ 74 files changed, 4102 insertions(+), 545 deletions(-) create mode 100644 docs/admin/signups.md create mode 100644 docs/assets/signup-account.png create mode 100644 docs/assets/signup-form.png create mode 100644 docs/assets/signup-pending.png create mode 100644 internal/api/client/admin/accountapprove.go create mode 100644 internal/api/client/admin/accountget.go create mode 100644 internal/api/client/admin/accountreject.go create mode 100644 internal/api/client/admin/accountsgetv1.go create mode 100644 internal/api/client/admin/accountsgetv2.go rename internal/processing/admin/{account.go => accountaction.go} (100%) create mode 100644 internal/processing/admin/accountapprove.go create mode 100644 internal/processing/admin/accountapprove_test.go create mode 100644 internal/processing/admin/accountget.go create mode 100644 internal/processing/admin/accountreject.go create mode 100644 internal/processing/admin/accountreject_test.go create mode 100644 internal/processing/admin/accounts.go delete mode 100644 web/source/settings/admin/accounts/detail.jsx create mode 100644 web/source/settings/admin/accounts/detail/actions.tsx create mode 100644 web/source/settings/admin/accounts/detail/handlesignup.tsx create mode 100644 web/source/settings/admin/accounts/detail/index.tsx delete mode 100644 web/source/settings/admin/accounts/index.jsx create mode 100644 web/source/settings/admin/accounts/index.tsx create mode 100644 web/source/settings/admin/accounts/pending/index.tsx create mode 100644 web/source/settings/admin/accounts/search/index.tsx rename web/source/settings/admin/actions/keys/{expireremote.jsx => expireremote.tsx} (76%) rename web/source/settings/admin/actions/keys/{index.jsx => index.tsx} (87%) rename web/source/settings/admin/actions/media/{cleanup.jsx => cleanup.tsx} (69%) rename web/source/settings/admin/actions/media/{index.jsx => index.tsx} (88%) rename web/source/settings/admin/emoji/local/{index.js => index.tsx} (80%) rename web/source/settings/admin/emoji/local/{new-emoji.js => new-emoji.tsx} (67%) rename web/source/settings/admin/emoji/remote/{index.js => index.tsx} (73%) rename web/source/settings/admin/emoji/remote/{parse-from-toot.js => parse-from-toot.tsx} (77%) rename web/source/settings/admin/reports/{detail.jsx => detail.tsx} (84%) rename web/source/settings/admin/reports/{index.jsx => index.tsx} (84%) rename web/source/settings/admin/reports/{username.jsx => username.tsx} (89%) rename web/source/settings/admin/settings/{rules.jsx => rules.tsx} (72%) create mode 100644 web/source/settings/components/account-list.tsx delete mode 100644 web/source/settings/components/form/mutation-button.jsx create mode 100644 web/source/settings/components/form/mutation-button.tsx rename web/source/settings/lib/navigation/{util.js => util.ts} (80%) create mode 100644 web/source/settings/lib/types/account.ts create mode 100644 web/template/email_signup_approved.tmpl create mode 100644 web/template/email_signup_rejected.tmpl diff --git a/docs/admin/signups.md b/docs/admin/signups.md new file mode 100644 index 000000000..db2010cf7 --- /dev/null +++ b/docs/admin/signups.md @@ -0,0 +1,59 @@ +# New Account Sign-Ups + +If you want to allow more people than just you to have an account on your instance, you can open your instance to new account sign-ups / registrations. + +Be wary that as instance admin, like it or not, you are responsible for what people post on your instance. If users on your instance harass or annoy other people on the fediverse, you may find your instance gets a bad reputation and becomes blocked by others. Moderating a space properly takes work. As such, you should carefully consider whether or not you are willing and able to do moderation, and consider accepting sign-ups on your instance only from friends and people that you really trust. + +!!! warning + For the sign-up flow to work as intended, your instance [should be configured to send emails](../configuration/smtp.md). + + As mentioned below, several emails are sent during the sign-up flow, both to you (as admin/moderator) and to the applicant, including an email asking them to confirm their email address. + + If they cannot receive this email (because your instance is not configured to send emails), you will have to manually confirm the account by [using the CLI tool](../admin/cli.md#gotosocial-admin-account-confirm). + +## Opening Sign-Ups + +You can open new account sign-ups for your instance by changing the variable `accounts-registration-open` to `true` in your [configuration](../configuration/accounts.md), and restarting your GoToSocial instance. + +A sign-up form for your instance will be available at the `/signup` endpoint. For example, `https://your-instance.example.org/signup`. + +![Sign-up form, showing email, password, username, and reason fields.](../assets/signup-form.png) + +Also, your instance homepage and "about" pages will be updated to reflect that registrations are open. + +When someone submits a new sign-up, they'll receive an email at the provided email address, giving them a link to confirm that the address really belongs to them. + +In the meantime, admins and moderators on your instance will receive an email and a notification that a new sign-up has been submitted. + +## Handling Sign-Ups + +Instance admins and moderators can handle a new sign-up by either approving or rejecting it via the "accounts" -> "pending" section in the admin panel. + +![Admin settings panel open to "accounts" -> "pending", showing one account in a list.](../assets/signup-pending.png) + +If you have no sign-ups, the list pictured above will be empty. If you have a pending account sign-up, however, you can click on it to open that account in the account details screen: + +![Details of a new pending account, giving options to approve or reject the sign-up.](../assets/signup-account.png) + +At the bottom, you will find actions that let you approve or reject the sign-up. + +If you **approve** the sign-up, the account will be marked as "approved", and an email will be sent to the applicant informing them their sign-up has been approved, and reminding them to confirm their email address if they haven't already done so. If they have already confirmed their email address, they will be able to log in and start using their account. + +If you **reject** the sign-up, you may wish to inform the applicant that their sign-up has been rejected, which you can do by ticking the "send email" checkbox. This will send a short email to the applicant informing them of the rejection. If you wish, you can add a custom message, which will be added at the bottom of the email. You can also add a private note that will be visible to other admins only. + +!!! warning + You may want to hold off on approving a sign-up until they have confirmed their email address, in case the applicant made a typo when submitting, or the email address they provided does not actually belong to them. If they cannot confirm their email address, they will not be able to log in and use their account. + +## Sign-Up Limits + +To avoid sign-up backlogs overwhelming admins and moderators, GoToSocial limits the sign-up pending backlog to 20 accounts. Once there are 20 accounts pending in the backlog waiting to be handled by an admin or moderator, new sign-ups will not be accepted via the form. + +New sign-ups will also not be accepted via the form if 10 or more new account sign-ups have been approved in the last 24 hours, to avoid instances rapidly expanding beyond the capabilities of moderators. + +In both cases, applicants will be shown an error message explaining why they could not submit the form, and inviting them to try again later. + +To combat spam accounts, GoToSocial account sign-ups **always** require manual approval by an administrator, and applicants must **always** confirm their email address before they are able to log in and post. + +## Sign-Up Via Invite + +NOT IMPLEMENTED YET: in a future update, admins and moderators will be able to create and send invites that allow accounts to be created even when public sign-up is closed, and to pre-approve accounts created via invitation, and/or allow them to override the sign-up limits described above. diff --git a/docs/api/swagger.yaml b/docs/api/swagger.yaml index 2215bddc6..d636b7586 100644 --- a/docs/api/swagger.yaml +++ b/docs/api/swagger.yaml @@ -3680,6 +3680,166 @@ paths: summary: Verify a token by returning account details pertaining to it. tags: - accounts + /api/v1/admin/accounts: + get: + description: |- + The next and previous queries can be parsed from the returned Link header. + Example: + + ``` + ; rel="next", ; rel="prev" + ```` + operationId: adminAccountsGetV1 + parameters: + - default: false + description: Filter for local accounts. + in: query + name: local + type: boolean + - default: false + description: Filter for remote accounts. + in: query + name: remote + type: boolean + - default: false + description: Filter for currently active accounts. + in: query + name: active + type: boolean + - default: false + description: Filter for currently pending accounts. + in: query + name: pending + type: boolean + - default: false + description: Filter for currently disabled accounts. + in: query + name: disabled + type: boolean + - default: false + description: Filter for currently silenced accounts. + in: query + name: silenced + type: boolean + - default: false + description: Filter for currently suspended accounts. + in: query + name: suspended + type: boolean + - default: false + description: Filter for accounts force-marked as sensitive. + in: query + name: sensitized + type: boolean + - description: Search for the given username. + in: query + name: username + type: string + - description: Search for the given display name. + in: query + name: display_name + type: string + - description: Filter by the given domain. + in: query + name: by_domain + type: string + - description: Lookup a user with this email. + in: query + name: email + type: string + - description: Lookup users with this IP address. + in: query + name: ip + type: string + - default: false + description: Filter for staff accounts. + in: query + name: staff + type: boolean + - description: All results returned will be older than the item with this ID. + in: query + name: max_id + type: string + - description: All results returned will be newer than the item with this ID. + in: query + name: since_id + type: string + - description: Returns results immediately newer than the item with this ID. + in: query + name: min_id + type: string + - default: 100 + description: Maximum number of results to return. + in: query + maximum: 200 + minimum: 1 + name: limit + type: integer + produces: + - application/json + responses: + "200": + description: "" + headers: + Link: + description: Links to the next and previous queries. + type: string + schema: + items: + $ref: '#/definitions/adminAccountInfo' + type: array + "400": + description: bad request + "401": + description: unauthorized + "403": + description: forbidden + "404": + description: not found + "406": + description: not acceptable + "500": + description: internal server error + security: + - OAuth2 Bearer: + - admin + summary: View + page through known accounts according to given filters. + tags: + - admin + /api/v1/admin/accounts/{id}: + get: + operationId: adminAccountGet + parameters: + - description: ID of the account. + in: path + name: id + required: true + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/adminAccountInfo' + "400": + description: bad request + "401": + description: unauthorized + "403": + description: forbidden + "404": + description: not found + "406": + description: not acceptable + "500": + description: internal server error + security: + - OAuth2 Bearer: + - admin + summary: View one account. + tags: + - admin /api/v1/admin/accounts/{id}/action: post: consumes: @@ -3725,6 +3885,86 @@ paths: summary: Perform an admin action on an account. tags: - admin + /api/v1/admin/accounts/{id}/approve: + post: + operationId: adminAccountApprove + parameters: + - description: ID of the account. + in: path + name: id + required: true + type: string + produces: + - application/json + responses: + "200": + description: The now-approved account. + schema: + $ref: '#/definitions/adminAccountInfo' + "400": + description: bad request + "401": + description: unauthorized + "403": + description: forbidden + "404": + description: not found + "406": + description: not acceptable + "500": + description: internal server error + security: + - OAuth2 Bearer: + - admin + summary: Approve pending account. + tags: + - admin + /api/v1/admin/accounts/{id}/reject: + post: + operationId: adminAccountReject + parameters: + - description: ID of the account. + in: path + name: id + required: true + type: string + - description: Comment to leave on why the account was denied. The comment will be visible to admins only. + in: formData + name: private_comment + type: string + - description: Message to include in email to applicant. Will be included only if send_email is true. + in: formData + name: message + type: string + - description: Send an email to the applicant informing them that their sign-up has been rejected. + in: formData + name: send_email + type: boolean + produces: + - application/json + responses: + "200": + description: The now-rejected account. + schema: + $ref: '#/definitions/adminAccountInfo' + "400": + description: bad request + "401": + description: unauthorized + "403": + description: forbidden + "404": + description: not found + "406": + description: not acceptable + "500": + description: internal server error + security: + - OAuth2 Bearer: + - admin + summary: Reject pending account. + tags: + - admin /api/v1/admin/custom_emojis: get: description: |- @@ -7934,6 +8174,109 @@ paths: summary: Change the password of authenticated user. tags: - user + /api/v2/admin/accounts: + get: + description: |- + The next and previous queries can be parsed from the returned Link header. + Example: + + ``` + ; rel="next", ; rel="prev" + ```` + operationId: adminAccountsGetV2 + parameters: + - description: Filter for `local` or `remote` accounts. + in: query + name: origin + type: string + - description: Filter for `active`, `pending`, `disabled`, `silenced`, or `suspended` accounts. + in: query + name: status + type: string + - description: Filter for accounts with staff permissions (users that can manage reports). + in: query + name: permissions + type: string + - description: Filter for users with these roles. + in: query + items: + type: string + name: role_ids[] + type: array + - description: Lookup users invited by the account with this ID. + in: query + name: invited_by + type: string + - description: Search for the given username. + in: query + name: username + type: string + - description: Search for the given display name. + in: query + name: display_name + type: string + - description: Filter by the given domain. + in: query + name: by_domain + type: string + - description: Lookup a user with this email. + in: query + name: email + type: string + - description: Lookup users with this IP address. + in: query + name: ip + type: string + - description: All results returned will be older than the item with this ID. + in: query + name: max_id + type: string + - description: All results returned will be newer than the item with this ID. + in: query + name: since_id + type: string + - description: Returns results immediately newer than the item with this ID. + in: query + name: min_id + type: string + - default: 100 + description: Maximum number of results to return. + in: query + maximum: 200 + minimum: 1 + name: limit + type: integer + produces: + - application/json + responses: + "200": + description: "" + headers: + Link: + description: Links to the next and previous queries. + type: string + schema: + items: + $ref: '#/definitions/adminAccountInfo' + type: array + "400": + description: bad request + "401": + description: unauthorized + "403": + description: forbidden + "404": + description: not found + "406": + description: not acceptable + "500": + description: internal server error + security: + - OAuth2 Bearer: + - admin + summary: View + page through known accounts according to given filters. + tags: + - admin /api/v2/instance: get: operationId: instanceGetV2 diff --git a/docs/assets/signup-account.png b/docs/assets/signup-account.png new file mode 100644 index 0000000000000000000000000000000000000000..ca0e9269f46ff6776ae99e0f2071f8e4c4f080e3 GIT binary patch literal 77617 zcmeFYRa6_y`!1T6Do`la;;jfTX1)`;;#8x3KWM>JP_QaNT3iPr8q%~OOWDD ziU#Mbe82zR>&QBL?R|AF&gLdeGWyPI&oeVo8X$#d_|*6S0N|ODqO2AGfX4~|Jb3iv z5dZ+-zU^)R000lXJ}ButdGh2*@DrP_004l>Th72++s)3~&(hNtVDIYYV$1Di?P+W4 z>gC|(jln}o0ssJJTqPM#TT5?8H`iA>jxM$UU(Z+k0!<&~O75LoCv(Dy{LF z<|tG`{R^}nJGc8FIOo)|3S-nW;V8&`4*&rC&Hc{*hSo6l>8<U_9g-6w+E$=BC5h_~lnhbNzS z-(BrI2LJ&7BsrG`SSc=lq5gNGm`RP}2M8ZrgYOT2J;jY{{0fTu`2Vgr?e3S0{8jT# zY~ECafmuR1+BOtgb~Cj^nUzwx1dBBk>UYY8cdGQ$ zwz^Y-CM8UySnV@-?hd9;4?R3wLf1ey4*g~s)l@CppWJq?xm2!T7rY@C%N*U2WkCP{ zfHgDOeWOcfgcCMOW1d-{tL}3CXOnHE#<_Ree)qH{ROy+5C`aR^$?bu#{1ojF>>%0F zu#T%=(5HR4Puwsqkc#8H4|}?`iX7MHSWpP5S$5|HA~eXsyo!~tHfL4DHN-O->PHpi9*r5Sh&&b^1CtqqZaf=xF{rTvr z5ue|;)OTq2BW{3K?C5p)>bln2)8~<|QrTgRDabGY9xY9RK=*2s|9<$+~ z>=8d^qUke%87tPOpR9SQUxtRX%9ZRg>W3N}+ox8%8t3Gk$(PWrI2m+f7(IHV4bg5c zF)4Je7E!5ZA?N6%(hIsFstUfKk~my>0q-u7M3v=pdSgq##li)T&0r_ncT;p}6n$HP zYJQ9U$f+*ExRy2Fo9p`IiHntl(}k4Plc)q(K}ON6XLx3Vb+=dGc~Tm@9t~l{2$=?r zZ=NQ3mJl+^5x9lO5-?}P#hhmIN>sW;n%>#;3#~>g$T*?vK{4QV{n|l<_v#=yg}Hz8 zhNM?hsxSRl&&7OY)6mmyBfbLFi*2G)A(W&F*Z6s2LA7-P-ce=(d#4W` z?MHQEHeZYy?04}cu$!zWfeRg!YhrS+mXIeZKVr#Kcv_VikmrPI?ETv1Et88THQBpM z69npQxp9?CcmP16_nU}h_c$Z7t8icBbzO_KwUAv;9^O}yg~B=WQ2nb$;Xcjpiq=vW z+!V1&N#xoN`y;x?I|2`>cPOGR);JN;%=%#60{oE2u0)mN?e^fj%ebrwGS5DVz|`pK zi>PRoD~YZht=@5Ar(;g>HL-O>=HUfuU3~45UPTYtXA>(aL%`BvW8h+hu#5EdtD0<2 zNU10c&Kc$k)dMeh@nutnW?x>QPfrP=*WPj&9;RCuRp+ss7GjK*)^` z(Ek<=z04GgpCCr*oHf+@OgW0yeQ=pGU&bqWx{3Vexl?kw z4>m5OWvsT)&fc-2qBiAwpRyfyxoNF%)o~910GY9ZM52Vtye?{VkFg~av)KiM12vA9 z5A``XH#HbKbQ~`3obF1W9$nB-l!lmzgR@E+YQS=#Y1+ezRrf!s7O7?D4ORo4$^uQq zLtzCC#&^1o<)iJ7@6<3leyAki`)%ttJC0l5ma%6}ONr##BheU#D^A_9bQ+!BjCbynaC|50Ujw_DOSJX_ghsx-cDkm%jq}{dvU+E7UsL?MJa4$eilD#ij zH`zzn<$NWp#1Dd1v+&9?gHNk2hbPH^mzC<<1NzfDdE6Vz2=Ej67V{+AyNWCfSSD`R zqvar|X}27|sZKqs$YXeN?)wJz($2Z*;Ie;`!{-b9%x`I|%}rrxyq-xVuSed;V2mwN zeRj4?fP8YVLaI1}Dqr)(#Zqw{)^*boWy^EAOKMKXed za+^mu_fbhAbBI*~gmDBG#Y~ytVcgjC(;Vx=?S8(a~S)h(*dd=-R%~R`{;c_ll zjZD9fc!bJS_1*YX?_HTgk7(xKi>#C+&mXonsWwz0C^cF+F|W{YlZc|>(~1UWE+wE5 zyhTYrmR;kpHGl)$DnIEVW2jwR-sPxxxDdGBKMm*osD$ry*BJMB&NJ2V@|!nR-9(#R zZO-gm*^feh=eVgR7J6Z|aZfr3#bj#Q3uhGt6RosH-cY419$2nuj>!q^JA3q^fL>EKh3+hG4ZKX1cqJ*q>KEd9bgd6$aARRt2 ziF&Tbs~oL4?#&2MiHjx7G|YZ~kD?}Q)*ee)_8FKpsj<@@a1TsL-GK;AxLcJ6^b*0l zIE4m)O0f1_*CB&TNGex=nsYfqy*={{0PqiXx$6llQ4>_MhOk~mB1pK*Yg)C)7L$q2PzVf1ONQ#NsOaMn_H*5M#1KZYZ8k4J3r8+-?Zh>1u{H4Q!bKh70>x9wxg zDjA%>D{$(}nyUG1i`b#RDG9VPvo-aukYA^36ofoV{Uxrlu{}73hqZ;C0&fm0LxstQ zC$A3^DgqH@4JTnE!sy94$-cy?Bo^@Hr;-PAbC0=?-;UiV3p24756AmG?$J{(5es4p zpjAG`-a&8X+-dEc`abGeqY(8xwKJbc53RlW3SWaQ^8^T$^qMj=5w@aZ>sW^Lq@!3- zwao-7{{(c%T6S~ngeUi97pwPdYd>}J^61rmsQ)<3yEnvR;k@h^C{d$W&vO|ILj2*- zy}QwGxx%_tWVA)x0|1z^*_N4BKk8m96h$}QsQK{TYWg6-WU#cAU8O8)K4#rgM>nxg(24zKR!H@%BP^>om#+PQ z@2he|tvoXP&6rvP>he&G;(K9mq)LWinZSfcE@!){?KxAwj=sHgYNeSto%ovS21!$0 z{Y~UWS$Z@>&8Nl++07hrIaisw`&saIF&@JO{0Gbd-0-_qg_iA4r!qN9{%H#1QWvn6 z?O*Sx4(+OfcG%mDCJPhq2tzi^UzVNsQF%YN+z(l`T)3SQq}C6J=V{x~;$}N_{v{{8 z)ADTh^jKHH)B|VZT4EmYc6?gvS)Oe@cUR+?H<%?oOUwF9*hRdPAFb25BZpDFS>BJr zKgLdIx|CSWqjeDqXMY8f@kFm9R-mtM(e=Z!x?h;v7^I+m>^mZrsRQ8&kMAr$cdE73 zF_(Z%CJOL2Z>E8$k<)EOIm|F`X0&qDBh|U1^@FG_d+V9-<%+#zg*te{>oKyu^h)o6 zZGT?tfFN+zx~!_jD9%G^xK<2XKmhEqSB%gXT^*SSFL^mYvQ$u>Em3E~W;<2X;$)Nx zg+LwU#7?h?9krrgdtn|`xqVgfbQ}msb8srw_B;n3LXL$NTommp-nz|K{NQ>R)`54? zWmw)%rcLB6>Q*i39gPXu|76#l|F~)1$5}_SeI7Euy?sPis~KtH+SJOP!I9Z24g0bG z)>Lqju`}9X`gnw%O(Ov_)-z;UXTw&1L~3fVqq6AY?+H9?csjrz|C?B$Sh?4(|8@WT z4e`yv2=8`W%C7F@y4Ft6C9+#1aMoLmT`^g3syZ75n+TD*$tqug#FDSul*~A&ivj@u zEc;juLQj^H{N{Bz?!ajkKYYtRFUo))R2=Bfov(riXco()Bbf{Syjzbu?W3S(OsmzZ zEte|W=%y2BlB`ap-~PkDCNRLG7usR2i@+GVAiOHZj-mL|e(YER^|JhHi&gn{EqMwK z>`@In_^QguB(%f{6d=1=Vn=^SW&oKd+i*6^)2_>(s||!x-|sN%?eTNoA8^5k@f)|# zkHanI80UT*$lbUM8Ma)UsIHIPfiGdr!W=AVCLk5Hkr4Ge1H&2$^|nHkU9fBsJK5%3VNpbdPB@=H}8$ZiOgd9z>;QGURrvr0y#E z{LDzWa=f~aT_5n zstE~Lo4OmFYi6f}im=rASJ#8%u)Wb7{m?Q5%zyJIVHCy0K<{m3%DCIa_N<^!r#d(< zVb59Xr=l(>G-nK9HnA^^(Qv+YzwwtwV7>dG5Ke_z=F1(I?s6c3(CIg;B6;q9uLjtR z#?;>KX`6E|$5^BJDfjDUPZgaNNabIiD)gMv!czd?=X=)S!F~X!S>*-0^Tcb(&(;m{ zAt!q4m(&zHb!${XWj!Hh1V`e`y=yc;*X6RKlS<7SsT{r1^A~E8;9m$l*G-|6`Ey1J zbp~Gj5gwoYS%mo9&Z_<0)3a?Mc{8+QB7?W=?OZ=quE-E6k}pQ2WlH-n_Ul#|1pL zzZ9gXGIgM*!p73c9xlGqaIikDJL#fSH_?3gK4kL>IZ06AS5}1nrcDB$b{#{3&y(7H zmOSCKdtVK)(1Yepw?Jq8ia@9#2kpK#DwFjjnc-Sa_YlhujsG|SyW8ZiDs|Ll;}NaO z-D#RGwPmCEVwhTKV2~Y$fP2geUQS}~w3`-?CePYZA>CMHeo*@%doBA*4@^!?WEJw5~sbgdLTDam-lXu=5iY~Bz74x$mOG3 zGlABPi!P4Wn?1*;@W-30U#7UZ9S%DAxDbS@4H)$#Lg`r{Ni8sq`UYlg`-NCtT!Iuz&rQz|J1s_{C_Ea-p5}d zyZ?#j;eAv5M~DanC$8_Og+&)BIiY_D&TLTbV^dT4g2U+r1jADL1qun&2L}KE;1AR9 z-@i*=ng<%XwZWBVXPY}0=m>xLE;Bvf8l$ow94)Cvy8b}i$1R|5YqS7jJqUDu%NJ%P z(^w(;^g)Yv$HgX*pD>O;fwcU&_M&*AA!eb_NWj`*@lvH3_w`^by+m}2T~?jxzZ4Ij zz<(|B|2F;qUHl*H?f(|e{}#^wo8A9!-T42NZhUtBA^!Khl3TUbS-b8)nJNFgsi-47 zbx_xMl=k5f3z45b&gqhhvHwy6?Pm=v)SE0?th)QH7p69Y+k#C`ot|cwO+f-W7wB-5 zxee&t9kOUrG%tZ-Rw*N0w?mV3A_KUxGJ(u(E>1UlH!xA`7doRJ=lh7bFh42-qq<$pm z(7$yAm}-0al)o*E;5F`Sh4Ja~8YLg0OtGUf#CLzLC|lfbVAE-mlT*bk`3W1S zM372@2#CIqlf>Q=*4}??4LzGpjGA1t-@4AH6LP@e@ba><(fMYt6bK|=kttsy=*(fM zJp}(zm}j#|rie%Wz`(%eU^^~oGv52pa2*yJ#!ap%6Ml}^?x_s=|5$JprH#LbsweE!5Te#~adClJKz{HF3kzS|Se&vxc!66-rO4(QUg8td zwwO6V0fBF+sc+ZzzmP5I>*(~=afxPwa6L?)f^l`->nt|bBq+HknSAG?yRGoUKSayE z8R+ZN;G?AVL_}CRtPiAkA{LJP-zh68B`sm}?d*!{>gv9wrm{4lxyOZw5fAxs-Mo1N zr7h|b;2syUrHq(&ZOR`lJ=;f@;DmK|dxQTdEV|oDfN-_+Lzt~0{)77=W`b(k#f}5Z z?rfZ#Dz>(^)WWXNvGH+=gx+LKE#f5r004P^Nq)V94ASFzp{=5#;>r0(`cfOk3Xub$w9q4(n}wT_BPj0umv=j_xWAzqX{Q>crJ%cOHnTXC&*uhTG8 zR9RhJy?sQB_rC@Y+mhNPA$$b4?0mF8Tdz=Spz7L$7`f`C1I)WNogFMxG&a6f%Mg$w zV+GNs{=qr2R)&wv^Xiz{N0FU*!^5DqlQES!xU+uUlSNSANa4xJ32sx2+Ji6n&Fyen z9{l?WYnbB4Nn>s80%ny|HcCPw1CXt7RA{pa&;DYYF>l)mnlc1J+^}I}4|lG$x7S7O!ywZ}u(Z3o3%BaV z?_Tvl6K*A(+4x6x<~26HZ9D9t>7Ndq&c&&}uZ)Q1(kHN&SA8mvX(rS~WFAu574^5) zKow`1r-%OUE&?&q?xpU(?|jCElCk2nL>Ix5MTLcZyQc$uu{Kvxp+r5)?xnT0nks2L z5-V`rk)gYF6HnPl6sAJ2N{j0S%}GnwV6)&-O3ipSNZOg~9W`}p|GwFNa% zQ&W>ac|aZ|3whnK?LDx0%q}i&+}+*H!Og8}W|k8yx%AJv38+NdtVVx!b{6MgUT_)Y z&dnLQ%>U2?0)hQh&_yVyq|t4u8Ui7;wYRTtz`2n|p_R@k?^lXK!otosm#26il-@|o zz9G@o(Qz2fmm3%wQfpt5A|%wCPRhxt?oVcQ9xGJ(kHO=NQ@)_z0+O1_lF*wBeXqnt zwY%W@0kdxC+GI>YLBYYvIWCTAEqH0>|2|2PDPUOXg9zqchryDDT@MT>XNR24hBT5(PTY%ZLt>-~R=ma5u~#V>85zOcwLTsz zmmPCdl{bqc!h|x(ENWWs-+#&pK2ib#fzL$hi}Lc`i~Ai+e0fS{F!vAu0HCQxA09^C z3k(WEP*YPwPG3EZ0@S%Lf8aK1aQOY)v+!Q%N@kb7Rlfmd-6(3B4D+mL;dVrwy#MMZ z)HHCrD2!+6$p0N~i$!Q9%d?TVoMF|nE0Qb?Rb-0rWpPN?QtQv=m< z-Wl4%LK>}V4Pdq=QHGISo|T;;ZA+5v(=|{iZMNTH0A6ZYMsb-b!nc3hTObIhRK`@b z%d&xfSqsvy_$;m#8XAPMeWnaU>{JW=Wa7rRzoGX*Jl&omw4Ti-xCpVM75^4+vUDJP z_%03Q)3{-O#4}P{UX}& zkTCSW-31UNt$zXp0`V4cD+fBK3J3@=opMVj^sYL&x#=4lXU(C}6!_uf3BBvyVz>wx z8%wypzTS_)qSif60~R$tOW)zqsEzBqdaj|O5;KQJPcAHE2j@)h>e|^AdwP0)OG!Sgv^BDKTxaV|hh|%I;K^HXHfam#1XpG2Ib5UtBYbp`enTot*~D z&WP8T#gx+Qva&KwN5?W2^&GB}arTn&ve|n3-HS~ark<$^4%bamWD-UHI^qEU0EA5> zRG>n4PS z@hQv8d%x^%5Q;R%2|tjmldr)A{dRq0gF`~%Ch;CK3E!KfuTwSVHU95%2wy`c=I1M? zru5_rG}kvbIfaFVMacvW?tU$QZ~Qo$KQ*N{lp&}fDk@rDQ=@K{EK(-P$QXu4bq@fr zAYc@Oo}8Qz&U_GIWR$^0d^I&S&lhX%c-ZP{p2?{xWyrATCaqf5TQ%b**L|`Fs^b&4 zH&?*W>+{Y=d&-E+%uI5k$SbJk*!+Cu%@vlDn_Df-)HlP^%M0!}&H{(SpUvrE3{%^J zupHEJ0~oCHQhP{_+R(rC>xQyX#eSin6Pc+RzxfPt9(I!HbP5Vd;QSg zhB87+Tl;DvM^V{Tl*>_CQL)v|Ftr7NNUj$pij>LIP^>jjtu;{H-rn{U%N8J%+1}n( zn1A%cZ%7&A5=VyVUiGlU(MT3Fi~>-_u$K)gJKCEbg;&9P@#n?x{U|`Pzq}B2iesiHVxhdOOw-S=i3_C_64KVv(h^U}bNOSJVf#zhm<~G-d~Nrh`{D#Jb4rrcrvP>YiL+@x;xEDj?XSG9`swVMNN}3};Sso7)wG7ailpUxgziZ<#36>6{;$ti+x)ha6}fz<@yCVM5B=AC5y^0x z)6>(yl_=KBk91H6VUG>PmDw;Q=+5F*=C^O;qS?c1q}49yM#tlgp(Foy)Ig_+L_FP< z-+hZP^R#;pPr1X@7DIx zkCUmt%hRpUW2cTAsN-7S*dQuZV`pPie8fI3w0;^0bebrA{j!18N&oWYWl-DVs<@Yx zjnk;#ZRKW8tLaNSIs~(A^;6gsFDz7xctONx4fO0j008|*es5-|j_V@0{T?bme{?Gm zt@z;U*qGMCu=g3oW#7JiyC+CWpP(QoC)fYstUKl<_UU_FUEOH;f=qG0>Z9XhT;S&N z6(*EnXJ@CD3T^$6m&nA<&AnfmYQr3j4FdaaON)r+#6p|J?CqlCU5a9ilSd45-;_*v ztHSUAfPaYRz7nyvrD-rT{pwG05)H(hrOeDV-CaHP+8ESyaw=CH*RiuJz79oF)6gU% z0s`91C|#!E1%^~WVe8RLhrd3WeZE|kNlW(_|cB&=dGnLEf82SF!G6lSM zNjdE%S|1}rv2IN}hhoQk5)W|6D$VG!&39>%C|UA2`D9dSJWDRqoZ9>*_6q2+B5P}F z%j|48Ha_mN;4@v;(qfdIoqZJ8#=*<0Z)Rpz$DPnyFfgF(ve2TtzrWu?v!pBZq{9saXv+5lsmG9c?$LSIawEo0#c@<$Rv@L2aRqsX3Z=swwpH;m|;0 z{yu!JmOH=oFuCDxOO3Pq#fT4z*jz76vk>Kal`1Jb$tgG2(9~#n(0V^*=sK}dO?`W0 zdleX@eAWSvPPL-D(nZfPcJEG-6#ZoY0Dd0G+lVL;_T7Xc=Ux3^zfS$%RZG9hg+if{ zK1^+=ynO0k0NX#c%I4=yaJwZetk09iNu^3UT~u7`)Due;xo7@HWGF|%*u}-AyrxE9 zTRS;0Fz|9uU<%w>($1b}tWC6zaMw)ohJKChyh< zS%Pe0y)RR~5pr#moodNuhOKNrW*~O5{tfZ_b=tC7U7>3h0O!d#&!i75F<2dVCty>) z4TtTfUg>c<_)cGw8( zxX{%{mH8{au7Wa(eiUkaYqWqOPJVK9H1F)p_u;>(1KW!jcKQTXSju_(T}KQZ9Ub0> zzI1-;M-tCH4SsM4d9|2FaCPez*1P>svR8sIn!9R4IL&Q~wgt+4otAeJ0jkjf`&%U(=f1QV1)!7>ug8VfJ)3n*Oe%4h61qBX6z-AvQ?QCuR{uNFDbe$K;C>C{CQ22lmOO}~*W3uC;5B~f9 zB3Lrz+c!2=R)r1=4LBU`a7Z>V+1^scU+Ug`h} z1$SGLY`eYO#X%lHJtoJAQcY!bb$t<9NgkD!_`V&zS8VsOwGd5_M7f+iq1HvIfo&a#gNn?7520w}%>6mP#tm$M*=?Bh;>8paJfdK0{&#p_%X6w=I+WUl8ef7ZH*26T8Uq-AeBjG zJ3M^ATQP#wbQ>?B0e3t#6g!iVyx6_G+M6(advleHF-$EwIB?}QZ#U65@d$sDr07|^ z-bS?btTVB9b(A^HB)__v$H&{7jWmj>=?MsWej6&Oo)0c|9N0YGKAkq#4+;u83hCtg zmYQ0uSs>3GbCSTIVmc|_!0TJCY|7kn#0vf`rx^(~4lNo9#bN??6TrWX1=~vnJwfAf zSjj?8ERZ8tXFYZ}4S5_8a@@1;#6RG(EsU%t7QOE@qhE7o5D|?MwC&SDUBUxdd6az0 z%MVh4Vy2EIU?t+4bpip?Y@?(7tP_;lA)^l|4hcDQMI?VQ;3^(1P~c=_l*!J{hAckg z$r5(c3kYZ~R?9kTZ$hihW86i)Wn`4??d{p*D(>M=UA17}kf_oUMV6PBH+ZfONTM3^ zM@t7#sP*HE%i!Tv=Jw;K3&$0~A%{DHLXsnl1tpr|h9x!D3KWK$j-^hevX}f;p3txS#8EI)9N&`)zkU z(I8U^z!uTHtAPj2n~;t|KT~B}TU*bmE}k14 zKTIkgETTj>rZzq?-|V%Hy?Xrd-u&cbQ6zn!A{-9ycP7IUO}|27>&cK)Q&T&6k@PrL zrm)=yxW2y5!NH-N(`HqYfy>FI-#|~O3QLNL9H%M``@NJ&F|59rz{~9t9N!l3E~F_` zEa$cDcl%}&o+?v>p1Q>8x0aTcHE*%2iTc9g;++X?b+u6X&;OEL4qY$1R4|XoQFTJT zdj>cV;yhhV_cxS@bQHp@qNA-{aB+--D^2R+y)7?_z-+Z#DnmmEzWR-C)128LNny9AWdx%@j5=nSc0wtF-0+T^=8lh+o6#pSwU z>)*6>3=G)PP(=n@zJ1(*2`uD8L@r>qeX>qZ9o`#}p6GHu5 zk^JWfObYz7{}_i9=tw|BJEm){nZ?Db8E?{1MeC?E97Ly@r-{gO7pZ(k^VVUZ#fMtl zx6*DTr|Rg)v#7Y3gFbR>_33ErA2IVa)z0=d4npAQgNcd4h=@l( zAdsDskcHS=b$%KlfvVFnGAcK$w`1q#jbUMCRJHA*u^oP{HE_URgPvE4E zD=#Tg$kR|}LT9UWnOA8=0ven$P{F7Wj> zET9QpHCu0AQCKLO_10w!=QWoLn-=TIquyH8ri+P-PmYd`+7qnENC=X62aeP++37yw zbPy(#;Ym}WprFW<3~9LzMXntF;3kg236?0*-Sa`z`%tbI+ODqEIOgx{%oj)EBK$CV zubw9s-h(r=b;_<(U@Lo*PKX)X(D675mlj9a2Lv?t#M4#8#u6$i=U9*3(c|#f!4p=6 z*R|GqAW*z~9CeXlyn%D`Qqsr3)YR1S!a~_R4MjRSIwxmmZ3TtMmX;QB{BRtn zX-r7mNM0!w*_l+Sd-&fE4fOO<>+0)Ml9KYieIuue;Q!O$_W@^eAe%4A1;4?wsV4^l z<+8Ow@87>a%9PE+@ek_i>UDi>eg;ZkNSe^xO=#|#X-?P(Yt1xg6MDg(W_1x+NAT}4 z!P_s%ScmVqV^`Ryz$Dq3zJUSi?-Lc+VT-7sOE7aZniw05qm^u=MJ@n@%ZS5OAFdw-aLE~0OtfA; zZL7Bm`?c}O*`zy02Z~UE?=ERxE2`12h+>eqPH5e5P5IY2Zob%s+-fT?-F=x_!aBBH zhK)F_3!-cX+tuoMYrgd++MK6=r;w#qcHy)bABy?Mqc~p?FK!2N5B|YYb{$R3c{U&n z7YwdtS@Mn%7<<+&F6=OU4A$KNPFL7;>%oW4+ga2=DV^t#;meLYZFIf)@5~g?dbVG3 z&qz)+xq89}gxOep$z9ESmgaqH+umvBqE zb~hYh^Z3`(c!Kd*CD)o*i%6^XH$|5r_zAE)p-AKS6Z|53;j;Q_)3Eg?GLZb;hE;u} zj>^eTXFaY`#doFEQXz(><5HEi$Gn;sy&D{?Hx))VQy$kAxK!`w_ez3Zxk^_=i1c6yu-p>b*z6|C$ZUVf zp}_a%QhuNM@Avau7o6)^e8MUcI`|ge7J!^vYz6=Lm+7X-|F0WN(7($z{hxe<_^r-|Ny`VrO3sG$#x+9zPgro5rC30jnj0;?X;W~-$r4&S^4}{|fWY4`*kA)%ii&S^om zh#pOl;j=R{hr3&8S1%v@w5Y51TKDy1f4()g*oKHii2wI{Ur9+ye6{?>5oFsx3Gu-m zxJ)6b(-+l(n|!S5|I|yn|Hreu3xH_JV(#PHqjdV4DbWGG2!t?WtbMub53Jv1=ZIvP zqpQ+^a>!|t!s&FR+Y~L<-H!+W0LWO5ldZIIyt}b7^%>2`6s^`U%t^oRqBe(E1>P*b zjM1f_Ke%mUU>Cblxhp^q4}7zlyj%qbE2tj;BN5s%RyLr~i_H`V42sv$3jzFlzt0*pyW@-3GX z5|^=4K(s*DjYN>L!^;N~iImhKQ>-V=&co9um5kT$TCs+Gn99j7PPg4`gFFsiq>|tK zVZadeiZ{e-KA>e;TYndNSSEupYn6||TsF1`U`Z#tB136#sZ^)0Agg>wbIY=I^0yc0 zikFzn_R#ub)2M)loqRTQ*Y@6wMLPE8er?qvUJ&^bxk;m&#+=&)#y}5yjZ}n|`OQ9e zX7i5UrP{HoX{`mMr|{GPiw2MLf=`L}@l^z_GrdPyPs?I9OW#ZvxR3jC2VG+?SL?*W z<5aWn_V32ynqz!6-CBG)kioJgJGLQMsoV0cS=eL=FSNSu7j2Pvi!RbOgFfi*NT3(^ zBO44v<@I7~qTxq5!%fAR$$0>`(RXPI^}VV1FgzzlxXEVdikPX1sHR*7=u~LhVHP_D-{)d>!i z!#v<_wp%PU550OGtHehYUsW@`(bj%)F=Eg!x+yW1vsShI7BG&1rx zEMkd0E3XL5xb?s53~XD}xae-$nsR3C+ZXa4S^$p$4<#;9F6PtLVa)gH4J&TX{(ho* zZD0N3_KNs)U2tS_^HwSdOJ^!~_}$|gfh}g0CUug2^*ow15F;TkT|Oo!Hdb-}t*oXj zNyq&+Z(b=XJbzvou^3d7_vOX?*H76C7Z4Z*i;@eD{-KdgFQVQsgt(x1kf?o5c1BQ^ z%f{cq@j|QaCLJ=d#wvyF;6;&c^L53(;C9pRurK-Cly6JC>{@CW*dFq_aJqecApDf+&6_uG z97j6rK!kPQ*kmm26~)dOy@;=0r~(Gfla*d@oKk`?kL36hxa@XfpUIw2=3VWYmVVoA zYC1NX6gyO&C69Mo=;;@6!=K!foz8_)Qm&OQB?ya6v$*YnHdM2Fw>*=*Sb0cX)YpB>IWt@tY;W>Kx#sC);>Y5)rrX}OCkV1zoNLtDJ)PgT z+(W}t79LxDUn~C*SCS2Gt0|W-FR^#`sGFZhWx|9#m{wkpOk43UsQf-03KgnKOrGi7 zHEccrq*=XrlF(p%>NfBC;n*J z+e}{fGALDFOy_mIC4@W_QlI4eeaUKxcuBx^hj=e8ICkBkQPH<@v6~waPRp#4h`z6P z$3jRmmsvhrT_3t3^nxC)QQj?W=A6U8cq_olGvCwIlj7o)Az(|5O6ayc8o697_&{Uk zsBs^*OOpZgB5@{GfKbwOuT~3@k&uuivHrUUtpfJHtkPvo6JB*RXqDcu#=7QQ9gMM} z12)>v9!bfjyzx;Frq(UG!_Lua7O9+a|NP)QC8)|{qi4r2An44IG?c2# z_40FG)pg90$%{o+hUJ0y=5^oCIy{J&iT?e25t5 zA?-z~B-g#y!J-G%6Bh2uXtVCvVKwnxeQAmvwN-t)X;~jrb%yC?diw3EN;4Vbf79(6 z-Uv^DX05Hi0z0M`@ccTJrQ?jqz2Rgn4r0gC=DqEVDftwE+SOX3!7uOns(+^n@g_%= zk{KJ+vm8xJuxb)-Ul}JjgmJSc>HHK7GV`3n)~+DdO%Me(I15-&q~(I9Gj(-aTm4zz zjU({28vba%kZH2UYo1b4KQDpmTZv0Z{QBIGqBdf%R4qSQDM^Ji`@?m zHhITlQA=rI(=m+(#4yAu4CNkTcGL&t9or~1jK z!mK~70%FNm4j#>>yMz}ZsBXspZHF^Khvam~{AVIs~fmD?R+~^;vq2TnU=3voF zS4zdNtcwo_3GPl}dMhPo|JMFPMb_yu{=v-Ljj)p3RVrR|A1pp{kn)rlj}&9vC$$}< zI42dU-tL#@Rj>SRdf(?W`b(|HoPYaba9popA}dZ}6I6*=|Lrb-dQN9}a=JEavlS<( zeeC_jP+I~8;-!GC`dexV-HT~=tHpSh9y_bW#eQK}^`F-Lrd_h?-kY<1P~*fE@w*|) zd@I$yz;K|ss-4W2i`~;R^t9p)+<0#WOoycL*A2<|RK;QO%(P<@Q?nVY>}YmT%E(N= zIaR5y*%o*YN{Hu~#=?fh#M^SH4Aq(KNxV?0T8X%wQLnu&TP z&58uNZFK$Q+ml_2?g0^bt_{S8bIw$W{zbVy6pZL|Agi0L#f!+Iaec%@GuxLk{xnPq zjF9FiBc?6O!k%4GQi55lL^kt6SEFq@SX`OP0A zO|ZAF*O_9smP>f){ItfGR5eut?+-8c{flI5cUtGutI#FxirccXva(&TMGQplp}XN+ zGe$8TK)h|CKtfw$=t>}jH9Y5XU%YB?=B9FqLT-D<*5UVG>fLx*D=(Dt;y>h#V2@N( z0`)s|=PbSFw~cUREx3n-tBaTnVa{3~Mqy&dO(bSIgtuM<@#jHdaiLW|G)rr}Li3zI z=(kZW_2jWpZRA}S8qeNCfa2#XmFzs#9n%N_ASyYa*V30ky-=sWyj9>=?o2J^yK6lD z>9(Q5f}j}&?YJFg^zl^1g$U)cY>t)L9)oy}PnIz0T<){*tYgLdOk0$j?va=WZ??J+p;YGkFDczIz+7U>}gi zOhaL|r+PLqxJJM=G(Kyp)bbtbC}r9ep|rIT2PJS->zGq3&G;Tha0s$FLnUClnN_9S zSXnq8WnGZpJ2fvZz;KfeUk~npe`75Yi;V0qQ`I)QW}UmliXcv(GyEfEtM*7qNJu;= zi5g$i^A*gBIx;Z~E_NL{s7LFS$!P44*&w|>$)No_#CjeazZGW%|J+0+Kuko^&rA`2 zj|hNIzB4_)GYC^l{^|qccN#Dn7E86O3K^97o0X z*S4Ig#(K1RruUqV$Ub_iG#WNJe7b-TIo{0*Oh#Y%x-*fOs7&NSFltkwqVdh>kt8UB z^jS`g0u_wL_WFN!^o>O8!kiC)aJz|$I45;B-B$20^^=u>y5f~2xs@Ma3Scm z2;xv&GW~n}6SBeG*Q$4}G@GQJT19dMpYcts4?l-=Ni32zZxUUBp}p}cet)@jVShLt z_8;Y{CnSaEPllD60~0?!EtwSozw4AAT;6JnOb)bUX9yL^8q#koJF-$}@pDw`6fjhZ zQu)=z#ZvOD|ZW<$u^)45KQI3l1Epk^g+ndOycNtg-45g`WzfKyzoU z=Vji!A$q@zvlCfa+RwkD{%tDqApAeIJ)YqI>x$m2JSPYJTc_)_NRc1j?VhF7@PAsX z>jmBd5S`&<0Cn}66W7nU4*I~L;9!%MsTy0;e=Gf;TC+j_9pS5t#{beZsFql!edV=)HE2G0R=%(~cgJAwsf+3T2D2N# zqS~!F^?%{om+LW}E)n#WU_*WN=Itl{o9#}=L!S4jW!Uk;9wtK^%%i>NpYyreFQNI7 zko8)VSB7v9(Nf&*dpUEIb*ghm&8Wh4gDbhu0s1jc66z5$w;!%yqAx?E5~Q}}myN~K z?+@f*(nY2wUYU1Pptm~#?b6%liJ0%M5z zbyC)CtbIA^ZR}=uckpi9joV9oRiuJJP3k&2=d_7`&tBb#Ff{24d(CfO{rjOq zy?kdW11IP1SBxm1Gq?Ufmyb3J_Ho-+SVZ_7G++9=j(OyViN(~{rgYDpgRh5=0fYj; z^RKpeq#5V^K2BKI=#k8O-cXD@y5lCGwoWQTyV}cpzbQ8RN9y;9y@?$xk;D%9FW#7x zbCn=Np-@6W;?2UFa}uF}o!Fvj+QyS7wt>?;suHm5orTEX6`E8>{!E^>cb+V9*#nJF z`g9Rej90>ir9lr6!sb0X(*3zmw#6WUA;uRF10;d&9%sPn5RG?+4pgp6$_@*=AIX8<@E-$8FM|BbZweBntZG}NBs%Dv#VO|9h;Jo zHQMO^p#BQk0dYnWUTZhEZj+grx@zsNmY?5LS9jHC8D62xt$4gH8foYcz)&%M>jcue z<+OZP&ut@tg99FeR+QH3T{F9VMBGyoV`MyPzg&ATKs<R=Pv|tJdv#=b2?dL5_UXS%jL6j#l1#3u6Zi;><-L$n~g}l`L29T zE#lBs44S8Q^L>U?dZxkqF-dXUam-?VP=eq2Aw=oG z&h0M<-3m zI|L`VJ5&4$nlq8%?(r0((yHs0k9p#I zBGa)tSaVr+qu@f$-C^hyVPj?x$f?pm_*ByD@+ZrD{e!AT^Ko)qzrK=q#C$#u0{;pM zO38xTEri*+@yNHNO}UH#vbk()@#SRwAR_%+rMUId-?_VhIZ~R98hG68t54eet_l;c zCe#iSL+1#N55M4ZBHa=|Ku#qXoA{=^k8vE=_<4G29-8x+UJ$*{2u3=ec;5LE7UoiC zAw1}~hXIc?mh$>#(t6i-{Bm|Z7y?;!Q~>;fx&>MRY8Wdx4R-rW-RX^+PO~D`6wjWj zbz#>spZ4|y5*lVD3_XzV0{(mz6BFCYbAmV;cZ`L}dayzA@-@j&9$A*@etwr0TaA5m zTQ?&}^ftzWUDFYrUcs)S5lecyN4i3}u^4ZxaMjI~Ng3baWV;Pv;5lg@R9FTT=7JZJ zTq}Qn(=>K=gONLOzqHRO;jz`8O@&@|7>~m4WtWzc^4*%THzQVIwZLO?7%yr@!o$b# zO(s$@-myZ5){I>n%LArteG2a?HfelM&9^ z70YQ^dpH`KeK__$_9q?`-I|b%w74<}YTi@sP1bGg8s+lOaJdYc!GpDr!5iU~m2|kk zgg&1;9j2zTr`O_ivBmGtM-iVRJLgzu&Z+P3@lHYZ#&PN+@w3-Yt?O-$?iXM011I;R zD2m3u+E&eN96+vgSA&$3F2>kKXbLv`$DXz7#PU0rX%^eCyO#77QX%aDwPy4>)*SG| zIVs7qTc}{F?9?xDt?t=yqd`Kc{4MzrfMd3*6P`8ikz7{Hq4e(uCTMlOv{^kWtNsD8 z83{GSyv2}Jm+q6XO@4srxE1+C6$A&J6b{rztu}0Gyi}p73uCRyeE6}w<2y3VOMsdH zU?#C)4Q+FT&f)Co{O-}A)r0j*mNMvL)4rYrQ%fi7d2j6MaQqp5i3Sfgf(KnP;*A8*S%)4ygLDMdYs= zkhYn6s&9^=GYoNaBUGxycEAxH^AN4)v>AMC&G3Q}CdOD#F=r{1$TeB%iThri^2>D|a&V)9k`1W5d3FKrdE!HXVx1kY$8A($(RJ)t^#y^4N_E6Ou=m zto7B$iuN7DSUJ(p^!A4L3uiH32!%uSGvRQ7*JLm7U^`!tU#7(#7p~EL^#HE^0ZP5J z(9q&jKbfII!*jc*rWi*LuBjKX4nK!Sfn3x!~=+wynH&Kx| zk4M$k%6jvDej}^D-_8GpSpP#v`ZreN_{3L@HE~WnTbZTMKsg(ro7vmICBO8Q&Ov** zsW*XvIZKry;{3LPvu46^#F~eR>!aBFDT@BMDamG-9FK26~{c;T_&>_Jw~#LL13dey%J_dX}* z?8O<4nJS&VaMU6j*;1zCxx7Sq9^XF4XgGWP&i9`1q!A!GydmmUVyuun9_|R`)9ily zLPiJUqfi)99jE#7S16T{E*I10?y4<=B$k_9D6hD;Q(q{34L5SPryEJG0s8@4uqYaQjB-p-6oQUvAwJ5BG~J?Vt};j@F~l;8P>^QjGF+|C4npW}(#23jnbeNOH!H*LnT zxxJuPeA>UfIG9-R{2;t%3fvICmKd)(Y#aM?Qfc@K#upx@dl}fETKbvbJfPP-#8XGU zEEgUx216^>Q-NGa{!6dQAL73m*TZ=10Xj@kQR$6j7QtRwj6g*vfo=by#ipiX1iVm^ z?pCZ%px@;mFI+{OcUdI$f%N{lyeTt}Dht--Vjx~drJ};YtH)_G#aOB%2})Xfv9O$- ztER7I<6J;rbd(bjWK)$J_>3r8s1OujO(_V42bndYO|f3<#qXaMWT`@phAeQ^KWbK=Xu-d z^fcx@{g;^@?xE)qb9h7JB@ZWCw_~{W*`qUiMSe~R3X+wY#`Fe5e-C%M?Fc;I6+Z5O ztoSPF9X>A_!*-5sZ=aq&U>M!v*=JDqQ7h9RvK`MKd5lZfS*;Crj8pUPd*pXPiXxab z2jU)W;YvU+5}>CI>xuMn#|1>nHg5rk*m}CS#_u}tlDYSw>~UH zvLf4*M=SIEdjQJP85@;0cj+2~dC)52fKCBY9f}#9%~9%| zX+DL#*3i*5%JOFJALdF3+TT3D4*vb=kbs5m`GA3pOnHW+85qO$ox>O)bp3>zZIwom z+VJnf@G@{V+7T~?(}&+AafiD*C!2y6zBT4UpI*MdwaKb|8T{3zK<@_L67)~V2qHdF z8gnD&Rx{9CL;_(dz_}V%QTiZUXeLiQ)Xh|X;emr>nXB!Uk=&Z#m>W}jCY{cp&2lR? zOZx4(1hbdt80u%E=x&L-1;7vhGnTn-@t_e z+A5*t9}vGo4x=TkG#(}?FuuOY-b_*Kyg)|f8U#mnt^SYyp=vYMcpVt!-myN;C8m$F ze1L6{_e8Se3!vI|i6&Y@I>P^1QD$>}TAAr+EGD|r&&r&Nw9d+8g zbpLxQwWU_CzIMbffT0b(ef)|i(Rwjz6+#07lFFYFzdroIiCE*HBC;lL`VT)Wwg12c zPE4qJ`aBkE`E^(fPDQg?xc1w8HV_DKK|VIado3+5$$NV`ind4OMBWEM{TGcZPnitm zVoey#z*kzql=k`e0ydVL!e!V|6S(>r-FDhM7~5e61rg#f67;}=2Y1PyBvxjZS~R~S)H zyxV)W28OP@+gRgd9yZdPW2#ox&QDqx&xz~5VZ=CWx9BxlEjJRJ%z3ccO(QS~WdvG{ zieI0I?#=u{^%BBrstMpv=~FOUDhKXgKBa#JaKw-<9AfJVA?PmjO)D2@IrAXlzeu2x zPNoRlqp{d6e0Ci=P3{XBiVf7Qd*rMM5RGn@tn#@ulY{$4HxRYyS3EH}|HU?_W@|JR zW&9Ap>AvNPzRbhk3S-4zNFE2PTb=bWv^=M$aRDJ}mh4WnbFw|q3& z^&M_u)!6h{a}K4YAYiHb=F&Aa1) z@}3#bnb#-8V{vD@rw7`V_>S8Gvc&!~fV74HO8o+kx5r_et51HVD+k7HeP?#5rX{{)3v*g>)Breb<=F1=2^;3c3R!CtCowuv}kjk z-Ska;4D9?_QAnoOQwUcYRkd1Z3Azx%F!WS8fHvFtPg>YqSBvNVg~loy!E_ZUV?<#e zSjAI0g4wcf%uW%<1qv<*ANXUhi9uF+CG-keH;KvZaj&cQetZCGX3cVs zwJ04Xc#k<%LXWj%x)URn@$;j`bkmVkw0-ZYj9MC+N7$fXs}`!W04Ts6XyE{5nrJbM45YWk;>D$;o*|tW0N!V;w~bjefT0}6F6ozRfP7gtni2|Ss(3h8rGi_Gb|eht5V z$_^l*(qKaN2|O=UHjLHZI({cQl!=-$?2`O`zSQ@ULlsoZCAygs%tKi9JgBl`pO9%B zj8|_W{*2=dovTUMsUvnT9__uRR`W}P zVkD7GQAh<;=^5UN;6KbUcW2kqHG&~HbvD}@dkGd&@~8E$bPb8%^XIEx+miXJu-HD4 zL!0}a*gcW|G{It&Ib}L$jg!Cd!wPYG7hS4Ct=FM?cNXru&P`IO%V$5r#NMc_0T*S!=Gdn%S(4h8k>DLQ-sv(k~ zfA&;F{cA24l`=+;d*NTnb5@VvzbZ=-;J+pPd|Tn378dFMG^`^F*+>6p#`M3JEHOT( zQSzQ2NVQt+-rNAz+}=VDZRKUq2bc0Wtv|-JZL<79s_fol+Wm{H+R1`#Cqn~YK}i^$R3EM#1;c6|GGhsPcJp9rPC`n`OdLGhuN_6?pV>Lm*)6p%%vZxKUSbX@KV&%{HM>jYuVZNiGO%YM* zi#V?cz!~3BHte2z4IrfzQ8eirfn;K`s!=2yQdO|GmT<09VI&&#a-*d3@l6%@&8kLiJ_+n;RbI0?tNhL0r6D`e>{>JmF_b z{+q7S*z~l$wPCDKy<^TwXCN$?75%5=^-*YLPWN1C%E0j{Wb0AvIZudQ`3k*ul}N5q z!S6ffT;xriFS}!rT*JmYy~p5HJ@1LS+kO((7b3sk7Tr>(w6EJPkO;o#5u_5`J0rdo zRvw^g`s_P5Lh)W?)jfbI1uvOv)U_2u+Hh=d8%d62I(%89X3jZFA~B-}RFxk3#v>d> zHkZ9>g*;ktTkZP3?l@xI;_!KQ2&$1Im!`_1j+Fr(`txpToI0>7IR zAQgXXqWqj!wJ~OP{Sg(7A2IW57nYX<-Hr4KdG3~Fy}++@{_4O~0s%ppbIsV_b7KEi z-vgMN2`VKoqZ)e0R!t|C^o0WIsCsgl2O1PU>VHZJ>STkuOtA4n{m&bZ+o7ry>#26^ zezWB4tCnBqz+K3r6&C33@NEmrtA->%E8T_WLC!NBn$+NjvZLN_yph->g3q2;qBrh^ zxu&=61liHkK=C49)A0kzB!a%U>FD7n|{FiC~2Uu;Rofv*N-=a(7({?>uDhIjiR?#0UtH)Lsxzfijt#^8nw zMqh{E)LB0`*}f2}Otsj(uCN!1cz}y>!j`owx^~0f&?VV>kNx*907$S~!$=G4;3Ip% z0^75lZ;H?PmpSEWmj+B1D-2F_kxjKm!me@bzT^NYi(mn?qGsmg6cmxpT+hV+Hmlz^ z2!75jGmRg?Y04Ge80N-10sCV11Zc0$DtEbIA zwM-UnfkUxTnhrb)0wT1xYDMnNV+x!$Gt%{oZWh>GZRc_o$a9NlZAj^NvR98^c|FO1 z?_Z)zh&@!#4LApluzJ1J&V&++ds;ydiOk%JH7ogT7p_QGkhPq=iqXgwbOxg9i02!v zDGb{12u(~LAx=cRYKxnHG{T# z0nuU~KDsg!gBeuH1CxKhPDO#E%qhH3@-fL_8fl?dM{#Tp_CWak+Sw@NSXZIFueeCi zl8m4yhkVuOY8*eZ(UfYTCOr>d9~?2v>r}CvrA!L{*K3!yk3?_iAZ7e--I;zn0fZUB zL60IM5Ml06H#|-FKy~lHca@+THvP+eql*Z-Y|>b(AjHcS5MOv3tvPfLC>R)mt6Isypf``H!D&?N6D@)a#(t;i0=jvH$uOTvHGU6;Oqa8 zy>)-*K`y#2V=(E{smr1pOWn)W^z6!|&vTDc@Spe+cA;&knoy>9{QkPig|uJ5|OP7#7Gq*DkUv z(QF!nG78~@H>G3@>Q2OY9GPBgueZnY!KOHEgAbMFBe#0%J%`01SAp6g{@$H}{LrJj zNvu&IVedo21Kag{8}ErZ7CWzf(pmat%Y;W44cD_9R6TL1q<6~7Tp$59lh)t{aqp;( zx4`Sdjqg6c&F0g{e@Q22Ym{Xq;{Byq7s!-I@Y(Yl>7@b;QgN7W(VGA!G?-%4o+@ID;Xb0bJ`$x${zs8cA>h0DQzPjZ-%9^#i1KbzNboUSDvLVIGxVX4cF)_mqFCfR= zlA$iHGL7^Hw;?coKx8j=U+vjfrurpbsS(w9h8Y{>7GDKQo)Od0I>@(@mBe~^#?9sc z&h$%!%|8LqrHZ}SgvVml(P|~il>$K|8^H1iq_&MNPF$OF-GW6N`IX_^y)QU2t7FTF z?|xsAh^?X9dF3mJU?o6$dMX1buQoAn^j!;-X5d@r58#N@SY!KBbIKMRfERva0DPbx zU3}NpY{^t3FWFF4MY&gg8l6smK;L+J^4}Jt*XMvvMMHBR757x|lakz%sdj1wzfYpN zQzd~!7~vhx)2;S3VtzjG?CMIU_TdflwkrMu0e@R!!w+TjAlHy0u4 z<>P;4lKgk#9slNu3_xx4$b9N|(CnZHjq8ADU1G+y#zp9Y<+hDv7pflof`z)0fw(EN z6=v$UKQ*VyRyHkBD>wf<8Zy*cj2X^;yR{_U8w81nzfMqcJ;??B=IJn5S8>T&)qXS5 zjg&%P*8U3Rpi;JH^U5dd9AeoyUPU9kgH9l5$)#`?CmvYr@ec*y=ouLlHYdS%cc7-G z4o!@UXv~DsbWy5XvNUJXA6!(6$zU%QoOvS4X<%9{vbr6cW74k9oEbJ}_wTH|YcVU> zZ&V8%ITl5tb7T=r6sMpldn|^9V_H|fWcJtY_`Z><*Oi%KEi3}jYg_r13_@1u-Q%~x zU30BejKQ4Jtl#v@y&jXDSReo1;>&HL@ied;74j=f^z?8ln+9WBmadk03pMJ~-==HZ zcvi(!m`vH%;EWRvAzij%*8&Kem6cUUShvbBv1Q*;;t!*AcR1_4AwcEu}kR8Iqdc& zC}T_S06JmysSKOXU1Tgo$MmWXR#>vzl&;t5*)|u*MY6bbidGKE2}hgjq^t}Yh&?OD zN-Zyv)193M)?NIAdAeziot>@CvC5SSJC+OtTDBz7mI@(1R#DHidz0@`8jWRJ>{AQ~ zAYLI+QBft?^smuUHVy^8Y6Fv*MyIl7>wdY`F&aUfyUPQ5SkG8!pi_sMT5;6zCfQAR zhZyK@oD{udN`Zj`SZ-3^wSq`4KAR_=b#dJ8QeQag@%!?wi#zQ~ix5q`PQ5SG{7m+f+Bc~r9?*YSfZJPV_`)I!WbZ8@ zx?_tUmS9<1M$^V6&QcfB(^d?Cxn41wY`$&0cA?NSuKQ?li_ zv8iB3MBCg+yIDu`mFVi=bo$Bot(hD)zKTN*o$1BSkB!uKDOX#2Ip7Ex)oG|XP6rV8P0sgw4sefs^)sQ-5$$__ z1eXR}!MRS8Ax_OG{q0dyD@Kyyv95{qB^#hTGljcBt8~@j*is%0}UL+Xed? ztIlwr+i-?(JwErF^op46u~`$z&e?u2-4<#mfRMl~*G~CR|g=1Ox-s9i6VqexaMzl>Kp!lMfC>>sumwIGnbU&>qMdyZEzU+(#63U5OZ4LFuK zs3y;7HRJ}!zvRj%-Ox<|E)emaTf2JR$qA$X1A(3N!Aq4Fm;L0`o6)3LAf#H+AOIQ< z8f@p5a*J{-;54}1Bj>oA#ogdg3j8-tn%*;oDuu`8VPC|xd^Iqe-;N}&BVmcw^SMYY zWqxmI9?F)-wu2R~^UsQ1O2!wN1Mpf6B*vB(G2x1~r4pK*RA%q4lGaX)tYsomDy2weeppt|%3)iQP{i}t2W;_zf2 zmzwH*xg5slBWzZnTRB?^o5q;UuLRdzc8tLCoZ+M3we{gR>2Ig^JPz*k-EnzmIM5MxRTjoQoQz&Xz*C9FBD zt6~wqc|J}Lrb9>syWI_mc|6nLsv^*Z?PJ^0TU+1377dr?z2$KM|L;1fs94EW$|~P9 z0}jcPQ1N<1B#NI8?CX79E}K%DU~umIJb>$J8a83uNfw^tZ*B_eV3aZIRldrmKYD~X zSh zDV@+qj;neWX8KnezRlZzZI#W$vy=zZpFBlM+V?p+Uo!ZkFN`*Q1u*a&4?doH6djo; z&}qRQOqGCQrax|--;LJl8TQUMc!E>ZbRB=OF}yw4Thx=O1))(56zzyX<@8iY4RmPak7S+j~moQo8zTL6HNL!_I8R;Q0;M3ihbebTW z{sy*}rKTf9MZfIKLEUzNB4NAioQBA%^@{0o{hVNc?$$^f^mWK#d>6k5u6DRyKv_X70%w5y6u?(k&p5)Z|_v!w`y~R*paUX=K_AY zC_TqR=<4PCpImRE|9IQ++2y&zQK6{$v@49SZ<;nWrE>!uHl=!)DJy!7lZTGKYH+NG z3_XauXf_IllN1q8R{Gfal3S>Bp5+^lVl^&-<{NAnTQGVI2i3xe6xWt;&a0aLFF)7! z1a80mH4&~s^sRIELBf1gw`UQQMBOKG-pDxmDkRh<14^89;TnVoU$4UFnSBM#Ia*E$ zJPodlRVr1cOUVa<88b@ML^yj+4G$2o7cgJ?CvB#SSqYl=(`&HkwVUvZo-PunVAvCW z3;NJl?y%;DStbcpc*?BY(d#r? zQh*F#SZWuetJT;UPKq`taCC7>o*iEt5;TDad0V-gYRvlAl1B#HviKLvxIbr@Ag(lL zZU>m0e4`SGw#4S}EChk7ur%ug?w3hI$8tMIW;7ga<%&!~eAy636Se$5VWWlXV(;b(+O;d8`=u&u>6;=If2l zsijd+w38YY?@fq2AMcY^`%w%^gQy^s>EP47R&7q@dU2iH%CCte{`-#Ai;fM@c*CNo zX$qY(AE^HtBB)AZJ-aV|_f4VA)S!R3Dt*Fdn zg-5T@YYK<$^p6`hav#_fh0kljVAL$fTaQn|xP;#wmt2*BH+FEIdOe1B(`BL#2!Jpd zN{Bmw{vkv`9lZ|sKwq0c>-x7Pj$Qy*pYrK{@h|1G1uZfTQmtGCeN z^`{2dH}-(!23{#R=?{fG4c$&0B4vs^Q@hr{5i$^r+FE1YHN_T{5V>xSDkdn$4K0&yr_rcfy_`B*K_i(} za0e`cVPgx}{?pG5#aSjERIF1(j*Kmzn`!xxwefpiqGcL{x~#9A2!a;3&R**V;I8brN`VPB zj~(H#zu8-xqlgBSS3s@&$+f?j%J8wx;BntgPOB|qMhEm!RXEZZ+5Z9+*Ncg#O~qehR)+Socv@?>yKYB>XtSN)<6?%bj7S?E$GZ-_SFjyWNqdQ@ zM}W;6((^2rqm)$8rCdytt3fjNCGkLye-rn`oj)j>XbG)CI+bK-2Wt-{I<$i7oSCFx z5wqz{*d9}ipGHs4rl@P6)}%a6em=4hn=+Co+^L3aYIYxSBCZN?s}7s&_H41MSuMF0 z_p}~g`MpO8Nd}q<FA^-M_P$I_yKnS&n5h_+7Qr^Xq2aD0p{n8p0SsTvsmwGmiE24W~j(C z)Yk%qN@wvCW`)TxYb(*MW4Q#Z$d9a9kMiA&8|Ar+%@>~#4J6@>ojT*hcDm(lw9Iy%vl`Sn!Mz%=tqCuXBAS5r4*MHsY)Oq z&^(jwdE-b*#gd5$liTGq(9>)(9FX)MX|bdiJeq$t>p0*3xyP@nWE$oq{HJtcqmd*W9P)?1^UM8{W_$PTS;d#K{6GEvzT5{~R@hmwzSr&PR6rAy>;* z^G_%?9c$8hauk!ejdH%0kIdF}x76|3>j=cQ45W#v=*)5Qv0E;V5e#ac4ArguYQIBQ zrqcMX5EQ={Ao#C%CQbY8WxU-NM91m_KYLS?9RcSK9JT|DIZXA2Mr3qz6f7I|c+G9g z?Sl6{#T2#=o2*ajc6qTGA&)=crl0TuU?_29y0pw4x>6*tle!QaP|dJ5DsnWY z41ef}Z!sYUrn^bP4I(9~OQd%gg?*G2dZ{J4tI;Naw=tFg8xyzc_;s z#jWZdwE{}p?!uTcYKSOXpD^?A<@CX7GUK<%`AvTO!5DlC;juxRJ4xmy6zTmqQ-!u2 zZRV70WeXpE-runTV|`&;ppG+QFF*R@bt0(aoS(Vr1}U-usgX#AcS#NY03wZ%SmrI8 zb^*s|Ho?H0ft3D6E4=>0_O=_bF?((CMp?MbdUuoi@7za%%jtp1_JPvN=NU{7RvcaV z8dC1#(i>w1mKt=}bF=ZL8(b# z&S2vUmH)FD`Cyb!#=J9T{Sb)YL0wN*<)??3t;yjLQV-4C4+tmb5%D85BM&@wYBqXa zYhB69j-ibCgF(9$Rzoo>c|!b;FH4`sShV|aIaz500wiLzq34g%`GmHy)5;gcHM0?( zX|yMPXs{wbF7ZFelhWpuDwYfN&o^BovRA;-&s?i!Y7B>A`XtJ)wT@@5q&p&&DYmao zQK$42plEXLLKVf-(R7Scq+Ol#ZG6%DNYEbJCdn!~doX=`OEC`LnB;3O;?n*Q9LcIRKcS7~rOgedw0i2x$`@P&_2?o!%0z7>;MbK^AV(SdeqQ92O z1Rin+^PW&5eeh?L1(1*BRzWe`K8NDjWvR9*xsN2~eHXCC!}rUY__L;TFykO*sDQE| z8^LBbMz;JLy>PU2^c?v`f>gcKeaA`3OLCjK#$32|PFG?oP=Wpnd*m`AyiA?D6Q@YND3Y>$vMElP_$_T`(Qr zf8?*7##!k(JeqYQw*Oi_o#5Oo^M{{Xj9fMbxO26PngTwsQ9HQq36H^TyS^VEHlc!R zNH*?D0_tA=O#dqj;H~_sFk4m|5GuNQ$QGib*?8AGIZ$+#0sJy*XD>dhqDF-zjj?er zufgZP0K*DZl{4pH5GuzUQ{aXpm4gVQWIZcbtYHX;uQq4Gap3BUgY^tkc5)p*VpdBC zn-Ba@oqrB;k*dfPuS1o^+UI25Ql;%)yl-bxJx>F^eU+=92I_9^gsW8W{%Y(=l@p~_ zZwd6Jabq_U5=JqL>O=nObZ*837-Bj%E(1f4%m#J=IeIo7rd^}O@3>DRUslXj3CV<} zs)&n1bO*8PzqNreTuxkZW`z-?T>1F;D)76$&tsF!kB4Dx{Bk?wv%wr{u#t~qI_Kk2 z+`7wkv|ltq1o$II=(zp%uoIO|&@6kzXJfwecjEbBUi+}c<%gKjlDVRc*+WMP9*Oc~ zg43Q{zwf(SSF|5`U>;F%qgQp-1;yXFgU4*vXLf$+C^;bZX#U^IVFH1e!zCP`i> zfFweeMdtb;P-cOQO_bSQ@X;gGWXpOGMbBncI}58VsAvr`RE?G;eWVwxo2$xK^&qHj zX7{ByROu&2-B0HrV^88PlI(Ld{+}^jy_}8eClc)!W{yjBaq_A=MqWEGOZAe5qbt$A zgmyiTcZSpm*sb;$?W;Bm#L1}k9z8B|?Tw7~WIR%QW0Pn$(l_I>`N`1Bc2K=ePNYj1 znWn6>(ThmH47Ou>%(;~NVH$31zVjuIBdM{zLEH$ZMh$9@K-T-Av>vxxGI!>MsDNvs z?;04+gGIDzjAqRqk>Paw7rVVRKAgnBkqC>iYBvLtowXbiOU6$pzV=7L0$FN|HA)}s zF}voD-b1Z_aK2>QVe(Kqsr&qGB)i_6?Dcr*03e;m+drK3z6COJDC&)6n7woK%p6K0 zqM$p5Zz=4HZ1;QD(@=c#mSuMj4Q1hX15j>Z2!}~EBUnvPNnk<(vT8=+HvPk>qXI`R z;5*tHn)%pB+;V4l`5xn+k}+g5sOB!yRxjGp-; zet1=d^>^EHURLiVhcUoUyobwfg;KAtX>M%w)1pwCv#4moii-~Vt=I>7xx?guenLs| zWd0UUY6|=9!K|tD(3M(5c~=^X{4dQEZ@w2OyMmPf8#5f37hoMhk&qfhL-DPRbGMdO z02;)}3oQ>Q)&l7&Tx=)5j`2mF9n+}9+aH)Ut5z+IATw+G&@=WACTut|s7*ZXkoRLU z1C0D(0qVT(FgbT+$rH$3H2Mb#0d+;(vPolrKx@=lxr|zLzX=6G4xuh9_2R+voWts- z#?AdKOpOFr#gpYXLVICn$21~YXpXK^l{6AKf%vye(ot?c2sd~w9R*@5{KKwH0xD)^ z|0{eYFZ0iHe;?`pdB6eqW9xNt#Kf|LlivUl(+OGO7VR7=y!T6(#4#chX`w?5{%gtf ziv4#01eLNMGOQ$N|;ysqwsI?yO{*AMZQj`~hm%IIokD zuPjLOwpBu@s5u)5^VM>iMa{&qd5gNrRmnQyEnRw%_ifS72`H=Zr|)e<)NY0D2Fv^Z z9M-*qb2HreZCdBGaP54RB@&&2K4ljTwpR4)&o8w%-v$oDk`_1K2z#I-nI{>WGkQY0 z?aoY}4XJ|L>S;<5M?^T0W^kiGQ0cYWtx3VQeN4$(3THRbXFI1gq670;xe+D zay6iEzIT}3lPZrr??jD!sf_DI9$$-12>5~FLi^OyY*mZ20tm|ht(k5-$SQ6@J}Nuf zjm4nauLf_^WgnxzCFOUs0sQQhRRNO>Kjk~66nBhQv-5c4>q;@Ovi=ftncP;Hd9h(k zt=0X%X_j2C;}O&Gef7DIe^y<%P08f$A5$8GW1g?S)nl&`%yO4aei=Z}d7ik!Nh7Fo zrJNI84?d(PFMqtdpnmWbO#VI7GIgJlXQ?K*gq@>pX-W3#kPC%n2WV?JBkn5FtR8q0 z`EQl4CG_EPnxNcgR-$K9j-VUTU2L)2XZD^qI{=xJYO~ZaPgH`6%U3i-%+VgvZ)tuM z5*uQ9_|nGsXUaM5;U=%Rs5D;EFU}11)YVaG-5olQ=|=UYRikpl#}#|8vc=0ig%*{% zI|+}4#P;R^^~YCnMmN_d&JN@j^uy4nB2<@YGKI zU%chy^V=XoQV(!eKORL{Ax;`}4hNyoRt@$?)XZFhof6btb(=Lvo0EBkd-A^bI)G{4 z`%;ojRlXO`!YGsmQBpfRovmKGWE&rM&N6kVq{o9r@*^c-C`>ZXE@c4L3E2{X1bH77hfu9?Z`3lMa#X3&r-YACir$L5RtAI> zwY6YlU5RX0Kt_J+HCb|0Fs82^y%IUSqaBh@fc zT_fcVyW_bo_ZkH(!ACI#&w1O>wtU4PK4^jUva*)?DkIp=&q*mu{A0ByJyP*>FCZ}X zt&`!QSs5IoYN4?jjBX`ns}sI7)VYqrR>eH8k2BH&$M!FWU;+@!Kzs& zcyd~|t#{~%#_5kB3wR6`-Vpb!7>}4{#v6ThdeUs9dU(FB-OB$usxtqx!Ew)!iJEll ztm04;hFFDRiY3iYBoRp5Dp>L1EabTEzpq z-NX?NL?81GF5SQ`UhT=7Y`?KcLCp1` z+z_Pi;kdjVsEveyF|7Kz6}kyBJw4G5?ZFt?(cf@dv)9=|Mz~Q7`IZN=#)p!QhxsPU zIpD@@>9|NZ+9tBJxlw?ocIe$ZCm%*~gPh9^fM2ZUbl@_0=W9DP*BXgJ8WH@o3<<;&!+chCl~vHNrHTlfN~ zkgKq(9X<-;v+OR{Y07ctnvyKXw%+ps#aG(UZ)$b;G0`&&_7v(4!q|`vcGtsM`Rl>& zXQOFOQ~@aMYMIFa7fSJVE8@Bj$0Tj`REn1ZcR6{|Qr|;D2L|Oxh2V~&s29*GbX}=L z$6__nVCQ1T6Tum+0b}(k7}(Bd@M*!qRug3u{vU56z<04eeS7q~Zj6~nXulT9MEK>& zzwA_)dwhL|WdCeBl89clxs#VJ_gpbw38^!SEi1RWRSvkAhk6Xs+1~!8cujjffQi=^ zFOJZtawBd%=ZjAD1V4MCDQ@cu6JM)yqCbw}Bo+?m0=feFX3hOl`YY2lUw1_6@#LV# z{t62gyZ^sColCNu%WoQ|QobXC9_`$xNA-13=p^W!v9vckIeAXRo}Q1Z(R0>*dv(ag zRxpJ0=Zl^Pcn@nuE;M=)C_pGCk;2PAQ0h#0Y=3<=?4j_MPVG!+?aZz{QuubJa!&v^ zbc%ZxzBjAE5wYue(;Modgc#LQ-Df4A7m%s=nk{IumT$55wbO_`FRT*#X|5F%PcCrEVBdnZMSo*+7-i#qx!gG7xs zdT&7x(R=TVZuD+2dhc~G?~&}i?|0wNevbQio)6FW^SVBq*LAFOt@Zz{|5>hQ?**>? zb7H!sON(~AysyHrUfL(o*v#4-U4JEWy||mmlqn7AVj|D;@_CbIN0^*VR+n)v-pT7+ zvmR6`2rN+vg}09beK%%);n- zJu3)G19lJt;D)dMU>=&!c2+Lo^38sMp?uRpwlzWs;REK04Zty~!v-AH?Bgq7)wOBv zaTz$BmA~zDf;i|XRr(n{O~Cu0>tg!qec?+!HJZVS4P4fBZJMLNiS&l_l+(z8#kSdn zl>XT`6+Dodol}8GwXe7^YDe+3DSarm;B^q6n&n_))@*VS7nk>@8j&sRJH2C=*PZ{OiMdwL)&MZP~V z>dD@Rt>~9iHSqsj#I1d_-hVU#e?OtiHuqQlqH4m*+N9GciztizlSwI5jYCt3yOQnrn) zz;a$Q>eICE8G+JO!>6BXNfLDH;U`~j(d$X<75h2Hy1PBpj~i@$@}pga3A{MvBCX6c z?Mhm@G1>kogem{k$+l5*%I2HMC91EOx6P4nxAswFalD@!>swhoRb{`d6lvwvAr*G0 zkD0RURbfGi2S`tVJK&;EW>ZZsQvSxqqX5$un!fg~&x9-Fe%S5(p8`e|%Bo(yjv*~f zh{tiwXo~)$w=abdu8?W8iGS$>|C$nFJMOeEPtrQW(DkPvSg)X1C>u6o6Ban1m8{!v zY`X|75a20MdZ2zGlQrAj|6WO_fgK%{U(#3B{dc`|&rWPy@^>DI`#TMBJWs^Ff!@ih zw$iHTl6hmjTFzClaKYb-g^QV<<1_5Y^}cPiMW0o-%GxI6m0CLPW3LiKoKYc7$X}Z| z?QJ;cpTh3{RoMmyygab4!ce`g{_D;_}QPU3-E zk+%JPM#8A@=BH7Ck}BGG!IkpCv%gi^R9dqyN6}i{HN-n zyI=1>*~-f)#p%L=NxcQ~+Rj~7!;nBJ zI^JWB#ptA6viAF!9(Ot}CXbCKUht`(q(`Bd_Aa?kVkwnpQ^D4qIk_S6k!4B!SmJw4&8gNSsI(n^y>3M~L%2T?}_YcIp=*^wLjvlL>d zZ=)i_VA@X=2y;Ae!2H;&UKyc-rUydE)epPDBpkh(NPBYNl6NqW34UEpNfg&+I(nt8 z@TfhABf;x*M4sm6p+w<@ibvpQ550Pl9K)kqia~6iE7wzL?%w14Qzf76U9qqr_9$Xh zatIg4LlA3v&%5gZ*v`YfY9~Wn|1;-c${6{E8xOU67C+62jtfEQ6WcwU=Ea()Mbh(c zs)K=l#0Vwv{!mI-URTqcXD0y!)ATuBGZna_^MPw9gZ6z&K55^9SB4?KpNV(kmNg(3 zP0FeF`d|=5*|H&)udQqJ@Pjb&=|($@^V=Xc8UJn--7I)&fWO8F(KC-NA_&4D*J#Q- z)zQI7<1K$rdD>vHx`5cyMGl7yN$sdKsABAVlEf8Krgv9e38xbx-qeqA0D=mfGqK#B`99^M6SHM}sWdv)~XYyrp?}ceMMCWeLw|(Z~@_0J!EVN`Y z4YWYs)0IfTt;9MZ{SYr(kgao6;aX|O%nYP_mJVb4W(KQm|E<$lzU zX`CGK4XR-$dvhSO`;@;^wSE!t%Hu&B@7{!chQ?vNa3LJs&{l&ZoPDgImiMYD zMj4**W=Fft|GC9b8OkOW*d5jRsgingWMmBdu5`zDA|!uTIDx+yYQ>{gk0&BL6tcVdvij? zdL14raCiEa)`{ww;3UNb&Qx8C+C4~E-TnBH)QChz)K%h2g8Sn+@oLUJ+mX$Q=AsnW zMl_Y*k7K38l7on~O$#T!VfFBtNH?X99pRhZc!~!Dtc~`UL&!6S!$ISu1SNMVtIH+p zcCmCDjV-lY8}!uod@urK3;M)KY4pXCGPbS*4Ti(;Bu5vx9$<5dfy=H1sRW-YPs8q zKr6U_+eb=I_T5hHxvjPYzJ=8(aP~d*J~|nm4iXEZFmj4p;%kz=<++!x?TBA%#bQ;S7{?Uo|yZ@*h!DgXW{NC znmc0&t}fUUz!l_B+q#NZc*dDGWW|v6SsK&VX`mnzqRGg0XF9=X&0#dh5BHRj))G@pjniLl$lGtko+c8a;LBhL%rBL-=aTs*jP+4U-tbl2YhH%dbsOq$d9w?FH&A zkXxxXA8$7!C@-LKv`~p0p1kv};MKvCYBZfbtupinTsh69E!)hVIY0pIS#Sg?T zj8|Oa=z9zf>z|YHk-iS}8|U>`yW_Pn^@v})`N6sgxlOz&Xl7e##8$!J(7|o)mIn&6 ztc-(${Y1hp`bl>#PZk6QVr8}~W%nZm6~siowJv$_*{NL9h2oGo*HCmK50v7XZ?L6q z%mu2*fGh%INvZeJ`SKRj;=Xs^VFekC-c@hG(J(pQC-=* z$LS@?C(PBg`|K8QcGGx978|o=+XHt3NC0M`f!vr!inFgWszz=hqfn^kDG? zrKRnB_>cnhm5ew@!E*I!5XWK#AkVg3ESfgV`#4i*4l~APL=}f&EjNllO13MQJdy)%zs!bipC@MhU!$rsQJ;jq<=jAG#t zr*He3{h-i$Y@k0Af9B5f@8Q^sG|69?%-9C7H(#!O1s0+i*PFO3$TG91Q8EiNoc2X8ucRSoOI%;cY(pv{ap z!aqGdiYJ^JP79fBJesCI2pp}k!$St_2R8h=EahP4UK8ZzF%14kW)un|tG4Ou7j-#IQtv#hVa9G*e!Vrc$_e4f; z@yAHIKr6o3bIjdQkL5TD-GS}QIX^-cr=O6iW%P|3D%h1vDy?0;R&R)BZ!2kd6TcLg zmV_hfp8jj0K!7rngk78Bs@q&G#` zp%{H6Bb~)6>`cd{A74L`K+|KI5OBtfMpIoFpHLopX_RNFeNk7p5a}8 z;2Vd^CNgN&-kp#W2QFw~F17Tv8@%rrDM~|RB7+Feih>Wz$S@xKBn)ySqoNEB;{ z2!fupSQ)It*ps>4jiLO?dTpm`+YU&&w$h;=Oh?Ew}0OZD2ozYPx zB9#Vqo5kO-PAAXE44=*wj#H>bJ>ceB-^Ix2;zcYYe`6&!o$DVNqNEo~nrw|t^IsT4 zd!Bpis~ab;TrVHxXP6@agCCR?A88940GExS#FTCe%e+`vi&`P#kGxjqpJIfYEV}hJ zC0RdI6i~`)R%19WPPY>F6RGNS)09}lSLCWO>ZfQS$rKJ^XifKO2M!d`U~@hoxZeM} zKDKF8WOvC)iJ$n3&61gYQ1OJ5TUUb2bCk1R==bkGC9SRWl42muq&DhJ?)Ek_97Cm@;#PS{*sV10=lOHzho<_;}ZKBVxyzK7nG?f%4H5!WMKE{)lv3nWENW}Bz?o9 z#i~8etS9c8J8-#ipVYI<3ymb}WT&q^T@%B=33%zn;_Z*6$88aC9iC&3g*f!Q+T%m^WygvW{c2p- zj^op=txesLz=aNk(wy_-hcS&cyr}1x374H{i;uE$ouOtgBwV};F5wrwl7tD=+OMLh zyXh83#_j|QGv^*rT*nv6rfmD{H$BX_LW$hJcZKHt(&LcCT8YhlwBfu=*^)76H4?X< zkS0NSl*_W>&$S4Hl;z$B2B1gXdiv?f}SGs%a{vzTre`1=G@vvd0 z*wk+gwzey}&}hoxu@#NkrPrg`YV5nyHZmdFsp{Xm?B;1hYrbeS3KuD4)Morj8(i5f z%}B3ZW{LOP`L@ACXSp}RS{$@{`Yunx{1m3z@xv?rQVlUMmK(SRbK!Q&hr2{>FP_6D zJ{h`fFo~0kc&{E=s?*cckFXrLj&Y_GPM`VwMrS;*kV*3?_LwyrW))J-cz3X9?{QF& zCEDUERCJY)yR#Oql@1B8O(UTw^vEmJvyAfHM;a`uU9$l|z4j^s~g+0aRcdS$pXcn;;B&g(pFdgYxdWZo z1_0ti!dDI!e$D{@*XHIUo#n{sE?Tijkn|}6)hM_&e67SpQWd8*@^JVvnwl;2Yrtqq7B9WNpP1IsaFg3wLp9Q>Ry=2x$C)R0xV746!*Exm z)Wvn@i5z4}32f6!lNwWevun@Ce3|bS1^cyT!g9Lr4m}c7SQL-p&VPJtIY@xlSCOVW zSoe&KBH8(ec;4#-=)wNGS^!v6jfaGYNI_CACWndcI@`$DxPyfV7cD!x_d^!^EHp!H zJ&XT%2#{7=VyiK<>K8t7clMvJ^S3?c7AxtAb(g{Za@oR+B*Xao>-X5yRI&g&K!wKs>#T#n=Ca` zp3UAqWM}stHgJX@O9j%!IVk9 z1>{i#5r&xKIzT@QMO??*pMd5B9|ZKtGJMC;r7Vw0?Uyze?w76I?{}IJ%O!!Fel*R6N*3EejnpDZbwfMC zwW<)gdThM^(2WB`HiWyE6V|BGpiyQ%=5k?^zTe!B67qgn0kJq6KNxH?lMRV?#GGCF zfe6mV0-qX7byohPp@BQD>TC*i_S(|ZqOGfPzHp+DPTvw2D44B068&5)MYBL|vhmGx zKWsoQLkcB7Lltxk3T5DMm0Xj$POWju+qpC1rXm@FWZBXu5pr1!9Xr`Iq^h^Bs@!BQ zk5@UMFP7R_javbDwsgj6-qyzysH)w%{gz!F5;9diG9KA3OYwdAG)V%V;#d{*dn@=X zt&TY1=YDs?EbHw6sM*|(Sq#YLY&rbywuqhLWR-hAT!>d9eDpNZNMK+qtShFwK~Vbi z;v7R}m+!CLIIp#_-i%>4-D>-ZOhg1a<~4=iygB>q_mRjj#4Jy`FA(2qAk{Fv-oX?a zSn1QR-0FLT+P>Pcd9GBGqqdjhXKqz%)n^YF_%)`~klgT85-G?6qbV^PUWQy@2{A6! zuAX~d&{zf~t#5#u)Tbr+@o$?|mzu}yXr+T2$oZeIqzR>6?j%AGkJpkVeoB|Q9}agX z%enr_M8^wFvF>uJ58eJfrf3BFprQ53 zEa~=#qG9Wg1>`=GNxZ<#GK2B}{migQ>)GJfH}_6%6dpSGFMM15T&3aybotyU_sW3n zg1@8!21)7L#AQ%Mm2ao{Hu}t}OoYJUL>C?94Q3VVucG{3K0a-Vc_9%+XIZwM$`tYF zVsP|WK`=yuQQXSiZVmjr9bYvQuWMq4xGVMBcn@Osb_WN6_8eAec~5He>m%9%bZJr4 z_b-VMC7-ISidUu{&yDb3bAG~-gOWIcM$C66EqRqUd{WY@vFm6rV~@!_LK|tm#u`=( z1Q^MU|^i(ixG^&Pn&vlDdHg3+z)8Ol08x$w3Gd^xZ$}gwD)#! zoQp9_tn=i00p#dteWg0Wi2Ri8bW`I?Cdy3`@2=zLd(pq|AGfM94H z&E^wnS@SpIw^JufJDpg*6rx%D1byxcQkT(%%~uuJWuQV>TGxW9O8r2EETF2dd0>3Z zjP+q;aMJ4n|Fk4?7|O6=eabj5OZ!cRK=m#@&j+x!P*G|u*wE;N39zp}VWnI7`%MXr zN!avGzulL$xBIKnlcBwPAGNxdwi=r8kAZE6&3g_#0~$(F(H7gu=bKW@`+706Rph3d9O*%iU6Kxm+`Th}Z)*zlzC}FqO}~h1GhO#z>&|0;mj=R`C^RK|4k@$b zhDAA6y(_>f(8DMh0d=!XSht{?U;X0vqG#+s5A$k!%8iR z8WQX1H>z}wS;rFz<$VUROP;P;4!?clApMlAKU~mPTtgmaapO;y(!jskFPymu9oae1 z7fHfQ{uG#5FXsi|#YAk1G+P_JS z`MLDHxW4CIZXJ(}59T_$qoYGdQ?uxv-9R^ITzwzr>lqAXY=YhrpM7_gJw-!i92^C| zJNK>ll7&P3F0>FboIfC##HW$0^q=f%2Lr9i1>~pw+ZTapU)3y(Xcp5IYuFJr8+>Sq z&2BrBn-U8?R2n_hrLxvb?E2hwc@`~@YRQ)1YpXQ%Zm$4*aY*ct zN-ekUdz}(Jfuc=?>)SlLNL~ekrI8VK`!8B8qJo#IR)A{qZx(#d#5{R>A?ZCv74-Jr zLY)$+afus}?GG~gYP7-k0^;sX;{}%J`57Yb(v?&*i!uY=pS}N}dNBJZ8a=#Eml8cG z{ur(ZCs4f;3%6KMU7|`UH+TscWIq4>G5qC`HQKCNNbJW379fd&+BM_^EOhfsfusRe z+oUP!OD9c08*GbGbp;pjP5;ucyLNiQFfD8H2nU%|iRe6Qj^E?sPdt1@`_flRMIJ@2R1edhAE&T<<`+34hIB(h?wEugqzDih5ns*h?TOD={ac{A5?mvnCYqle^ zuI2!b@ceJVm;o0-2XV?`VP68K{Z+6;0t)__lEzeX9H{-1Xq12V&!8>yU&A%;{&Tn{ z{Zxs<(7-@L9P@7|^z0P)znaAP-$-BMGR}y^0)qS2%mLtFQkCnWd8=QWV9z+^|DWp0 zU%7DxYx_t6DpGp_0vr`QhxLA8$7z=s?}vLn$OY))>|JLEX&t(CkUm-nMS=(_079yb3^FyZG#Ij zs|(TG`OPC4z|Yg|BN2d_*evl4q>GQ8tj9)DLh*~KuzkOR9Im-vix#ZXs>lRgeoG$P z`KaavR^e%6_oawVrSL`^+eC_}nb=uUsp(uZ1 zPiLsXKt}QMsc%h{nj1V&adWkVE$u1@`2{#)CwoKBHbZrCh9?R5f_kzBU`bouze*!! z6QbwGL?|(qt@J0Pkmj}fZJF~O63_b!)J!!?R5}XHL}S5wf>*I_taRS~N`6}44lSUYPNR>T^rMTsfsncg~jbKDpo(Q@snLSn)Lhg zJe^@vAcH-D+zSMEOt?Qg1w8!_{FsGZMqbVgyIj_BL+_4$%akTX)0Ui5O7Fd9SWY$N zY^05~8BUA4f5uE@46<9k8Fgm=NKEBNUPaJxaZulO5?RzrLd31B5Ry2bssK$)<*2*l zt)#9;KS83a0Ht6cN!$YehPha3)Q(bPi*}!mgg9HAenT^YJs36z%Nm{!p&xGgc$Gln z;dY(Q{d9P>E5+)`m$`6)gmIIaG?~o1l#?~T&2>X|PjN`W!v)><-{YyVmmA<&TLKo; z_GqI<`BX?X=V5478aY?TAcg3)IHcG7=gqd%&pF~iK(^h_GbPpQ>3%Su6Rz;{no!2t zs4%*q-T7RcAaF)`Doe_g_md)rydOG)nXbQ5NkQQq2ZCMOqI-;m19b(ULDOq0=F0_a z9TCf?Mch!t=QaLTu5T7b>HTr` z-IpSTqs^fH-PGVuH(V8~McH?bn=snuRmwNHnTEgOmL4}rCWhM<@K`>)eHY0hx!LP7 zs1@fR34d8u5K0NkuwRZaf!3}djgY10Weed~@V?NC5&Kfww%{b9ljBG4>#EplCCWBY zsb)yiujV8rwC!V&*!}wSZ=1f%rMYiRtOP1-AI^b!?WsF(b{!N96PWWbQs9@^kYMNx zl$La;hLxxJ`Qd1&tAYV>RCDCcOrF?I#(~Zgs|oFZ>s#X&z8eb@$YJ_xoep<llbrmx6c|r`aXk8&+$ceW))ha{ZZ_jHZq>Dh82a7420HD1TJzIjIEnfSu5_4@&bt*>Zb2HpjQl=oA*md~kpglUu; zx`~%90EQ?ZIv3`ljSriMbrq79V)Nfd#BGwxJnqv3IhCJt-iNE#qk3#~`L%N5EBtZR z{Fqoj>xx}^WpEHmrjez`dB%xpGbvitJtuelrX&<_UUp&jF)rdo)?$*XPd;&S9$P@8 zR`{Wu_LJ_`MD9FBM+{bUd|zss1jA+H$t_RbU6^%h+68>FlkhrJcoW?B%iKU|9nM zx#(8T*Fhk7zKI%GN8ObY%lYe~{k(#)wyw1^4I|C$zLdK}zXmZZ)TK-PNGbuo(eh57 z65dM6xojgF1&lH|D;o69m?(Gth&^8mR9iku_q2UOTq#|9qx(UZm4A!nvcNk8w0%*; z!kL=belrA9HuTL@VsHBiI_e1Z$EjDZUqWiO@nv$^i;dO}K7o*VN0n|gBg)2zY4}&- zLqM&my`7IwCSu7(km*p}qZ%?>f>iu3VLlGP`C3~wWYlzAg)MM5UuE$rM+(&_l9Qb5 z!dfY$)F;`sBScwY_-WOm<=$=;Nud!YsQrUcqIT7x#Z-2(xBXyyl^si?r7ldKMtm%L zt=F!9EK(@%d7HOx)#gi=(YFLkzUPi#nfh%J$}uz4W?Z`pNCFz`1&e365IHji!?;XN z!|PIjyqN3uK%a)iHq!FV-Ck$I%L_$p-bNo6xTnAIY4p6rxmZ)MgJsXEgeK=kB)Se? zVnOo^nHHV$Gt5QjX!b6)OWOK0nYk!y!o=#IEe+A=OO2!XYhOmR_mzt7qEZPij~g2$ zFL=Yh_vMN_^x-(A>)%Noz}iL@>{HcShK&_TvJ|hRmR%$}^i)&MVtWVIJJkUEpdL1n z49IT_xUyy}=NC?wR{cSzH6huwgo0o-X9*52ibF0PJf5|j?_h)t&1zl4;M}uVyd=IF zN*xK|vign&q%=!O$`>&&UKQR@ocZ>8qHqx_FZC)9qeV`vghoGAPrTw%vh>_4gjGds z@fT7X;or)%(jYtor=BpiF!NbLn)Nrwdy~K6LA05Jx|PS`Tyv6zS^{V@$uu0PC)9gK zVlFHIPPs`|m5ORyT>@ihIj~>Zcgc~wO|#}#Rxe@JI@wB_fUD_qCr6={h2p#q33>t) zA}N*&^5ekWOzE-)LE^`!GUfK$3Wv#Wx=m{Ln`Aeo2g;p%x7__r(H&eihwvqQBzT{A zI(BogT^e5=NGOrCXLJ=WTNjvRR_hR8GC2truXDsEv8ORRv5~ECvCP=Bc)j7R)QNf| z#8rw4weKL@A=6Wjt%K_eu&#$wnz6_V3Dd_edG{}rRaqemug#()26xyq%}-j(R2VB- zm_GYH^*FS+97(&9%SM#1%0N0j>#KbqZRM=NKn5@Bu}PSbp*41mv~={Hm&Im&utXA7 z$*6=V(a*KS3$wmJoweJYszuJ7NMvs84?+H*GucY}?Vanju!i<|{27m28P)V!1Mf;R ztncE`Vp<>F=isB?dX*DirhXh>nJj#tdL3>p_|&b{J%#t(YGf3q!!oi!54wT+BhBVw zt%;nkn2p!wFKIA^`lDrfR60S$n>s}{@#pjXF;71$)Y!l7H7i=eWzljbV^>aON_KM@Ehg8be5JA?`;_@6uj-m>`%jfIbLd_3!dTVEqdo^ARKvbHm`rTN)_5l zQGP4D72Z)6)6tVKx{Nh?Lya_>f6s$-&tjl@dCI7NIln^^O*S}JP+Wxm3Bt#uDYFh( zVS2)XR$;JkPm^_|I}+R)N2!-9M#_h3M+6ovBI7I5PUv1(8gMvW`54c3y>GC86pWuH z>B~@rN&^cPlFpSpYXWi%OFv-PdIp4Kjx;E>3H28*J$UiMH=X`e}J~mr=w5f*?(mEdS z7%kJ+esls?Z~4&)y0r9C6|GR|d$^k%LA zg{W)g-HeY8EjC&S1USgQ0zPXC`8pA#ZDoa*Xo=LVn|Xo#nEJ~|?8sq`q8exolD;du z3=TiMCIxYpBojd5x1WBT+E!EW#{7;$^32&V9ro2V3x6REWzN^-^QTl;U*1n)am&cP zEHT#KnvTB`hk$f(spT{2$J&i2MMn(0)4-kvx-~3R`YT|smWHqADo~!GnXnUNisElc zwcKrI8WN^Mebjz<$CC#R>z&CjwaGFTf8PfotB+B1XVr&%n@0*>6@nD$&%%;2O9Pm z3FhdMrqcU4UdN|D4#h7DjoN4;pNbQKHYr$Wr{x85>)lPMU0RceRA&ax54Dpb5}yzp zO1%52k8UH#Dia)E*cV?Xk$}-$PN^y)N|_u3`tAgKcVi=a+;DYc)vuE{!)`^7XorE% z_IPtL)Yp<;hutp_IM3v<0;@|@dbIV&nw6aqBS#jf3ry@g0Ll_}Om8n%COuwnyX$%l z4JJw~FEGJH^eF(tl1BV-zotp|JpJj_cU~sX(}ffMLBXr-dgoQ5=3};GN2w?#L0QF{ zH7p9+n_oIZ>(^tpQ50R3PNp;H<66HyU|FGooVB!Ezmw$?!=Mmp5+Qc;U}16A%mLfr z8m}1sy|#P>Ljbivd8z%AQ#LmM&Z zH1eV6>5fR{6$xzD*Af|dzu)lryQ1u&im;+#reedRIgr3fxb*HMufKCrc3>2`&M~JR z9!lPqlw>&jvv}XNmfvo7vBkkgAZI7EUozyl=z;3yP*Qy)b|{JD3ZG%FtaPh4;O5Ih z3)Y;Zuiu1YR~P5W0(g7|b5T-~C#Tfecuqi$6F>J&$9eaQrLO+;nqOOfz(;XYxPUB~ zP-GSnC?X+Ef_2o&hW%eGz)U#-)0$BE<)Tm7^95_)`_&hD;-GBBO>;uuWXV!V9d(VL zGMCrZx`(1{+TAPN41jQY`cny!hrUqBz`<pY^sJbt4BRBP@WE zB~kG^_~%H`uEzybt~=>8ds8aPRQC+zv?qm@ZH?(;#7g{mek@q6p6Ny|At%yh4%KA~ zk*j45&p>A!wk*KFWJ!+Hnjiz9u+`%E!2Y!p@d8jV429;Vs4|v+G|Jn8Ew}Eb%9Yh# zC!SMJbtOuNy!@fj;sE~0ow(AabOSyIt1h&&@4UXR(-~LK?!^|k1Tk=l5iDfz7vGq2 zi06EGCPhCdYR2&x8{BuU7_&$q32TVfmzb(r*-z3D1>(}V(+>A3CE-LpU7enrm9EM@ zc%9S&H{RB!JW)9u+SmZ_+>Pd1?xqC-GyA>|wNQwheCE)pFw}vLj$wcIHMir#F+$O# zVbxf4N8ifG09L!RtA2VSFg&|2omi6jU3r(hBTTedc*6d9dXun6gmu1{C=~K9@)2N%7T$LbioiVXwY7ajEunt*8q_EMPuuQ zHo@e6M|{7wj-|5P9%o;SF zQ}tI18S8Y;ihGi@83+=$%IC9W|}IMW%J$m z-km^*a;Ffu$7;uW)U8vv9@_Kv+?ouJcI31#5b!3j++qFYqPQz!t!yD?h&F`tl9{^q z!U9o&>4vMio2tV$>cQIbnvsEdJebHWeGZVxcsYP02T^=qhOSX)AK7IIH(4HvqNux= zOCSF^CsJi2IijIQB%UjoMEixBSvv{eBzg`4$r}0@-W0j5Lw&iO_QHT7?4I|aBSLKG zZ7L7=9aeL5`V*rIi#yw~GZQx=qL{6oCw=v{XJ#2ORdX z(2-+H3+|b3zx}Gt@_Qc!p8DtF_pP~Yyi773GBWFJh-G5c^3`?i;KU26wKWIFt6e8w zYW~aymUH|X2{w$G7iDMGTe0=M(A9OzwYyW^A(4E5F|lVRM`6+UR$L;1M~PtZ7ne>a(1pzf*&&6spjjX$Wj9|dD9%WT$<7fOkB$+s#jry}Ux zPNusHu2PH9L1t93^QNXz;q(IAF9!>JJK`g?zk4&+B=tHC>IJ~FE*Z~&2iuh^>UT8) z&1}b((q7XeVR4+ndkdC)rn{D_fP*8?SYC8VRM2JX6u zl5qyAuh$Dc6IqWUHv@(0jdrm>!P16($qiIXTebzz72 zaO_=vFx{CETo63E!#^VX&>BOG4!p=4-&w6b^us$#sH41kt3*(p)*XXMxlo-FxKANJ z15+b5QIWqliQCq+$G!J!A*CZ*Je$~Dx(m!wd1fyeHsR(-oCCeeyEsgfxE?5XaevF5 z%5i;<(lWB<4|=%dG^iGj*}~cV*EU%j1`D^crSo(>nyWk|CxbnN!Jwrpzn9uM{b=A0 zW3e_5TJ8RTJh-xMWtiLG=80!-tFl2IBs6lu#A!fj=J8&#^e_CS-l4UbsiK>UG&K*& zkUhY!XnqT<2WYS-hV{f6dt$NC;AzAAFR|j3ayb_{^<)$>f!5AjUeithkV44%s-HS9jNgly+)5+<%}7zp%9s;sr`ARCU((^9xE*AXZlO z>-W$Qi>I(tS8y3R`lgX(RNCav`9?Q2&DU977%9ZuW) zf%pmzv&H1B`sm*hhPSP66ImqEv_L?03(mKZ>Xa4TM$Fs0ampldZG#cbs*cz9Tl0(( z+fPS4!=tD0%YXhbzIpfa^t5vVZE$rUQ{cNwW{tZ(Tat$?;M^bxBf`8?x2V_ zKzh>MNwA8%*zy38HAiZLK&%CXOa+-|W_oyeA$B&w%iF!Vzuf`>mMCZ=AiwGhkVAFu zEcz@o7Q%lcHe}qN&h5djM&fOyVsYaZ6i3eHb>$ii9F~Js5K|&Og`dh}6HyU$&=7xL z9GG?I^vs1*<1OlbC6u=R5X=IeqM*(6xUuY58^yf6+E;|(B>fU7$LKNOSX>@eZdd+I zS-+Lv(`)aPaW5)uRBNUH2!US&q=-3T*Ad&Bt?cZmY`Vs9+*Au6xg)=mvMo%My=@F> z8_mG@qO%;35PtQHt|YV4=+D^$OI}-cdGv-u8^me6eP~g9B%J}Xo%&&#cyuGR`dSWL zHsBC-q>$oN(Y+*m5A_v~=OJznJ}?Ry>~CX=D`*L5BQ?DOE3BcL$jr5idOF8aKC|@K zcuLod7pFglb0`D#pQ3703-3WYQ#hgwWpM0&1}(us+y=ejT8tPQhH|HRhPN#H4#9!w z96y0Vkf-0ig&wkZkU>u@_C!!xCY8G6E;~44`8W4jBp8 zQz72lEPLY*#l{M>*3~JQ~IIe%C%?mB1B_>ih_D4(4EgRNuH#B>@R$j zPcDBfQ_P!jA7Ul1lH)}3&DIM0hxIIP20;2}U5Ddx@QYSxyu(Vw%S=%Bl=7;co+Sr+ zGB03qYxJt!k7-wBa#AE6ehz1%t97;aMdM4?X<%X)KX+Q?@xEGK)+Lc&Nvshv-0iM# zZO2j0;#hZVRb09FqMUxht{rS=b>%XRrRv-Bi_$UeVow#iOnmyxa@L{Nz@e{*2`o}C zNRnj7#A+-Fn~ug^oZIO3{tPhbI44e?`~9ikicVu>zMT`-qR4{&%arAazVo=DlO6+(fwpPn+2Ftc^nO0H&upZ2!>%KpX~$l)LiivE33WNujTwW^|(ggr6z$NRUl z&l9Qfb@)DAMW*kki$+9CJA^d$L4N)t;J^5L>E_CKNwolQGIK`aB{bowHpfzL}{YaC#eTAQ88+?6~ zMR0?yQ#p2BMffXYN)~qKGwFWLHHRO&RV2T# zxh2xD%E%J8+q6)2Jn=onbyqkHDAu@QXJp#bXR;qv({UG5OgoyD;<8jeUsi52S+F04 zr4(!`;GhqQ^sXh=t{~3{vp_hEIB__T1I!ou%Xa3Eu(?=b>~b$*#`S){TeW*EHFEY< zWUI+F_smO`T<;BsjXP3thoI#jnG?=f`;m&}HIW($lYg!;TKD96bV>%^FQ)fH8NhP6 z&@izw+q=5XfJtix)!gB7Gpl#o&~qKYC=lr4eyog`!Upp?a$`K>{>^gs7i}j#J z7ZwEF9ugZX^MkW4R^7EIJw)31^e2aI;Zn9(Y3~&=h3Ts!YKxN^0HV&U?jhS-ECSns z_RrKfQB2$6-;6lE^hF7^07Fny#}d2z&Bh?_kW}f->EGOzJHYSYUo*X8++KP!O2^{= zaD+Mq{BZocg#O>s)A#UaNBjGy{|~ZTBY#KJp0*2t>EcY;ru1n)2Vqro*IReNBB(I) zy^^EWKWJL}N<dPedUr=Q-@hSM{+Cde~mIrHb(Ck-)5l{_*~`l%^|YcNXb^+8x!V z)S$j?YnJ_U_2BbNXiRbB%`XtfsfBV-2xs8ho+Yp8-D|GYD^hzErMX&3Ye3aY%2-(^ zYZOqKQZU@Uqn6zH=jjzCZG-h}6~ACr{Ueab`r}N zt+DvyZPQV2Rrs92&H%BC z6jkHIe7s#fBH&uki{E$lBkQ(H;j!}a<9Y8{#Lkg8Fp$`%CE*8uy($vMsgam-&pJsU z3Mf9OFZ}XIiS{oGVzef+V88G9=3OmYTC z@->6);X`XAX#o#dsToO450P-jW)|Za8@QpdA6|YL$**qzymDw#dx+bMX*!aznd8m$_|u<_+S+F# zU@=}?_Po1CF;fH+p`rrQ!^eNCX($Fiyg4F^6S-9+Bm;j654n7c|I&sqt_fo1ecobf z#!z2qd>UJ6ELd9QWe&=xRRa^@bMu&)eXnTy@%s;6_2if@h?s#=H(WbMQI5FWX|LOz z;BbCqP6(*cs>@E`ZN#M3MPDyNV{)~+m;S+zKtI$};Ar}Z*$j>PmZRy>V%mT21$yf6 z@iK_ipFN3T!u?qE_7zttK_?;!8P!BTNCe{AUVPz)8b$~5{CS>krHZ&I`06Z4x1uw8ztSTyAAIXi0C*F=i#NPfA}Rd zW6X6<50uMq+LfcMJfSOa&Zg}a4IzOfKnTHuCRlKHnTOyu1PSi$?lO?z zIza~~1WRytcNrkqz+i*B`v3#GlIMB9@6`U@dQY8Q`_Gx5cXf45-`)4s>sr_9ULE+? z*Vkh8s6RKA$+rCZmHwcG0B{^j#t(Bf^gd!o{!5RFkoXTy75~9Q(`kUp7#pV*`QHJg zJ0xKX83g_lX;uYzO8<6$`*#Ky|DoIe=~N`XvW|-ZD#x){`R?rpr{&gQF|*^zI3gM` z^$I!{Qc>=uR;s;+rU<8A6&Lh*jZgmxmyj>r7mYZGT|be4w+LlBDTh6(fZoCzOcpJk zY&plRzMCJ9$)o8c&_mg^I##8yQjiXu3x;kXS&4CJ@7xUwRbO7wc89n&sn+-fJeh3E z?Ed0d$YtE~NN9RAq7aSKSo3+4S443R=Y#swlQN;er%{{S`SyQ(;ad^UzuKy}zGZY{ z+CIlU(ETH_d%oLBXH-9*?Hr-OmBcFHVf!S}$Mnp>Fs)DY|ukY6TvgCf+tJz%N zVPtL~bTSTC`|WSRyaI})QctWR2DLIMo6d@PZ@?*;Mqj6oIBwS;YhU{Po=;DGyt^al zSj}~6H*4R)<+A6nwg&bx=GqcT5hZJWJX+{W7G3?H8hISw$)NUBc>^r`>@?w5XV~S;>%X$7OkPA~3*w(6<{?$*Rge)NM0>6Tu# z%Eid$6kA-v`CzH!qCkIWdHeF7zOg_)v)rTx&d(HfbOT8z0sScW{?6ilc}x=R=*DWX4iYeS$?b z(q-R}_0NW$#Tk|kyAbYXrn;D~FEkCibld+Go4hf}kTq)Fu9TR-&soS1f% zAC+68HvU>L*Np8~_&T+#p4;)}aoysG_<_UG_`C8wiF&8ePsvpvqIWM3EY2=PpUf=` z80I`_ySiLSY<+ulWvd8>@&QW>MH?<_gzJh z*lY3cey{vPO+Sw>e@ebQs?U=jB@i&)S_x9tsDd3yhYj6(g;JWHjZ&-5I7(WBZ})D) z_bxoORZncvXJnmyn90CWUqw9Kn>>o8Fv9$w{*GaHR|5M35i40CucxaPu4aNo5we%S zhrrgW`z=2@8uKM~<(uf8iq~$AO6X^OLiDjIy>VLnqj@QcM_kqeUq_#>NsC2pc!V6Y zDw2t09eA>uHE;%xJ1(`4`Lci#%QA44&zJyXS;LW&&H{)b*%P!RM(v4g$5`^-WGi&d z$3u{JwRnSdBJk#!6!HD+(s7YwugQ{= zCD~+{qS1UN!1S~0cx2*L^{eIpvF`p-x+%AL8>PBHC{CQO1##8WELybInk zT8=Nnac0E=On*m$g4^bKe-{!o)*I<8zKDvSdz@04v3QIgmUaH|sIk_V$Z%9dvSeN* zgW){a<+6+59F?lTPacq#`R8hx&)uQ;zQ^T$*N1ko^VIjD*W!wYDOcbP>C;EMbzYf~ z-rR8$-A@@TH5WdUD6BfJ*=v4jAjf7dxNxSDBl!aRjIXU1ktbn*ZV1tG@(DRLpFG>c z?W9$XBS#mWVKY>!DP1`T0#A2<&bTylUwdTWEcp95@l%TkTra5?T74;B>Txi8*I3Sv zp@IurwDI4TcoHwfuRKIlm5t24F!3I(YPq!F-X*Xf@}-d2<}^9;-x|eoWJlkhX>?&_ z1I_QvG&pRvIh}?Jd0(sD*WRo$v61Z`Z6Q+5Xeb~j~oGzEP5+Z4Mw zB3cOL^PXo}PcB>k^Nh$x2~~1ukm|SM>Vc_3jy%<840sPcR5cMy;EgtKig50F7`=J>l7@`Kl_kv6$S z(kgnMHuXK`nm4HD7u?A?Ef2UX3ytZ^X}p6=73}D0hb!MxBlSRADSUR^!eD8YioZyO zKxVI;Xrs-v&rHhhzdrY!sl0a)+$FRcyzFdlkZ0>4ng;=Mt(v*Ab#x|mu7$eo`ij!!&#}mRut76?DL#H}r z7TA>WQRu|q6m?#7TFyEh0@s@W_l$HQjaXn=DGh-g@RcW&Y&+bFgBIA&u1YA!4VXZ5q2p{7cJ)%1qD%CTOM8%wNC=IAJU&$&2UgmCN2LF&2qClL?j zZ;M;$4QJp3#ud|;TaM#?W@XMVw0}|od86eBT8Oz*RQAL91aL1N5)tAyEqvxNs+%D| ztY}q(iN-s$+O2Jl1{~ z`Cw7*KVTa9=coff?q4XK>WX%<$zXzP_4jkhb%gZ)8EF4^==x7OE=m4nGODbjyHT~_ zObg@FMJLEdOcaxCqY5Q8vx9URnn{*>@Fg@<+;{eDBy@|uz-qTxIoz9#Ul{5rcGHx0 zAM8wC@kidsE=(TH#wVM&zrb&{e~Rgl60r8{?{xo7Ke?duungQ}DOkTff>qag$jk|9 zbMI=WH+PMLZ^62ySoMKte?0VsSRW0HKSHEFfpA!(`bd5PZ&RfNUi9m9M0$3R=U-ZY zIRYTkPzApE zc3Pxe)?-}+*2!@tAfjir3DAd6b2X(hgLY!CJYp#TP@}#gS1s31n=vzn#*>vBpks_#`FW`Hm`bCv$8FYFdu2?v5ZQZop#G}oS@@i{5;!W2;z;d zRUoduHzF6#e4$qBD;|l_P)!l2_0sQ_lm-@ha@;JOF)(dH%dHbg>YX*6U{S@^({m#) z{-U62c~cD{mJLIT;w~c^NL&&ehryt7rCUm6clQlF`)mE>kZQqGaP{a$`glqMp2rUM z=dGka#%JqD*9s?-W&IlLr;9jxFX}AzYhYLR4ux*;3@E_+X32(#CHeXSr~47NIPrtZ z@P5t$Hp(@l%WKx2oIb^ZLl;JoqaF5Iy(m56%i&u)9nY__G=N8SlYrBmS*2ig~`c`I9JDdlafqHF6Z+B(t6*!zUR1o z8A;GN@?hy@5|NYo6Y{bE{b?|B+CnY3Uqf%E$quCZ+HQbDj7%sfW`_FHAlLf6e_+SW zi|KUOw+}I!Q-fQQ3n6Mxqye2(!FGl4R(5QKQ5&9Ol{A+NgTfC!L0=^>pI4shk`+M5=&^iy-@@o!SRccrh~`Cm*P)61NwCce)M~gHCH#Bb4|g*5&SkF%AsYRgN&aaYPQ~zD~WE=V*opN*4;fE<4VTw z48usNhYQ)$8alR09B%p}&nH1O0ldP83sf&bCQ}Uv0Z5Thrcav$>5SFWIMf ztP)~BB2SMMdl*gl;^2}A3%l})Fov0GqgG#I$Mk|>cS5soMLnNvO9+cQ5~Zh#bzPG69Pd6=wHQK7h*(#`X?M z>_7E~G7Qk~$rSeEu%gb!AstHPwj9h7B@^|%T&{jAVdysf+Iy!f!gY5wafGxhF5mcT z5mRP*V};pA_Dd;&xLWu}3?4Db8SVOqg^u`Cj3XGe+t6Q4*|A-%fB8y#mUZ8Q+P@Zk zVlN7f&K-luGzJkeM8!0qN5KtinVRqUGh$TO4+Z`XGfCW*qg;;nk3(_EhME_BIqbGy z6)0tQrgB^U`4e(o5%^MbU}Jd&em{SQ3cJ}?ZCEucs%5W`s+KfJ1{$m9%c~I=it>6$ z?hF#fQL{ZA_JEZ6c=xBuKHaLS`mZh+na zC7mP@wOF8f@T6sz6NoT9s>#A$%*fCL+yzhkES-I1S)9~hia6<9c3+TdXre=9Kh)_| zE-ZFO-><g5as!FuT3d1vw`(cQjU0nA=f~VB(~|+c`EtTV z1zh1mpukDNB30&e-8+|J2FCbi+9ld`4$Kc&s@3sSqmKmE*7hQLJtA@$L>N`Xgbz>1 z)>iETNfq2m7zSITw|uPrOxsvcE(X4rwKVYFti2`U=kV}Z`z0Zq-|wj@L*94WqjB~6 zK4bnPm*sh5MR=+a`n)y~_%69lAA_?JuV?OHVM!?FVMGv`<=FSNRzXHu$pwu&8NFJ} z?6hpHMBBKqf0ZEuD8+A&pUqwUtBbMJ0{6dT!hZzi|DWQtNLLLkQaJ}d=2Gk40rd@nd2UoShlmg{2 zO)FlI7#5&dVUGAD`C?%2VgQF??c!Q;Ym8b7ZlIVg`1K9w^Awneix;G@{2hFptqyG?=u-# zsTnd^ZGrD$B?!$<6UGr>kDaeO#ZZ5SU>?R69w{JX*79Aaziij)L*H5hbW| zoG0364HiY|$Lf%&l3DYEk>t1W3`Hy5V__Y<*(1v9yWrS^yuTc<}#X++&;?N_Zy;Q}O> zw~^ByZYInJ@me8tzTKS8g-)eRW))8=&7fAB7=36My5-(nZI0G98iRe2jl}P#+__M$ z2NvV^HR`2l==FQI*PuJez2$0U*xOykrXJd%>CGsf4_|WdH{KVzbF4w)n~1=iC=@4K9uK#Ea5$s{OhUc ztBYUV9+p@8I42B5AFU&wegF0?Ft8>tFxWr>t2Ol1MD;BS759j-S?=T8JtRo1g$9l~ z^xG2VMhyD3aU+fl2Hh2RdP){McCrqvHE$Iz?UcuS7CY*@*Ayw%#>QO1D!DSYU!oHv zM|`runpr)?-D`@C3`wck8HF3ivhpP;c6?Bo($#0waix@N%Z7l#b}BUE`Gdt0CuVOt zpa&DoyY`D=&0DbObv-~R9{6_S`LW{KepZs=gA<>wh|nf07*lM`Xu51cxCoc^3p(}v zv-Z)4L}dsCz2GgCxvh2@ZYv~*Vpnx=rgNiP!RrVK-#;yrco?VIhQEJic>DCS92NSL zThocN6p<&6;7aG5qjWFM7K3YuSCWcf2|*t0jQpzxZUt`skO|m z#xbo!{|9ym~TNPNBz2lS{CemD#g>I_!0sv(qz0+PiMqth%~Aqv&-)&*zujzb*GiS9b6mU6T3JSH}VR$C%j*+e1gJT9Mc^U#5D}mE zPas9j`PeiHToF+yw(%8IPq#vFv-So~lqpx+hfCc84n?J>l}s1s*StJUNgV>#+#QtD zN4m#Ka_3~Xwh|o|??pI@FmceMOxyiJ{i6VzF^*S;0SumMk=DOU+;Oc|d)ZZx4WfrCC zrIVgl(7O0t6e=!Ij;?vnO<>ru&6!7fzHg=S3lv{5mlbY_%>>FcH{Oal7J0UVInmQU zP9vyy7TzWY-0)Q^Tk_U_lciU*6Zi5Cs-7p}K%zqSm4a8_>Ni|1wegfw20HI>w6kT5 z*3c1KpD7y8ZPJuD3P$vQ`JO_in>0YwnJ61&ei1FFsO=kSD`98Lfu8066-Xyqv2elW z8rFAufv?Q9r6ot~Z#~-CsM4jKT^Y)}@-W~V3lzyll9qqG0f(M-Bo_uxrxvI zJ#(drrLV(1Va3UjrB)^-CUcgUfBbe#st^X+vh8PNvke#>lfe6l(h8 z9y3w5CqL4Wge`A>v4-mT##O~&ayHmMlDiGCm=+hdaN(J}M-e=v)@GjD$yk*xWe3FU z$!}B-UwchpgKGKB2HN|63ECplhdrEo6lDA!7#Lo=AN z(n>cOY=&1c?8P^%D335j+@0?fvWOlkw2DdWy!J}tZQrL^EPp$)=MyADGD3!F1ZaqL z@27yD&ZTz7@jBUEhi@4m!yRGvYqEM}XywXkp^Jzlj(*^#@@=yJXPlpLYpTIX9pRUW z^I{N2*Y9#a7b2T6c-lO~7N1#e8C;%G(^xRiMib|H~tK+Q-&JAAFw0PO|l4d=xMQldJYvh z_CT@{A-1_wXs~sw;7%e0dWIw73L4T`?Da69v+_jHVB2qwEHzS{E=`57ApE{^-)7X% zK@KJom|Blaz0OoKv@f1=2gv36nOmy;XuJ^v3!T523$=kHpKYEwo(|&f!QDkTZ7Xc@ zO-fJ6Z#`aQm&fG#CCrmf)X|1&iXQsxQ@)d@+?*dwNNsHvus=%e5LM!uHTY4NO1caG zApF`m%4D+;3vP;&b9QVnHMB$_FnYQ-Va1l>5z7h+W61Uan=?>6z07|^Qg#!ambc{^ zt5Y1J;?l3_Cm@_w!&FKtR>8TXZH@EOJ?qE-$*&yHLh(@cV5A6fNv#%4o^T@-4Ysj_ zopev=uM0@&T_RwQ_lA$ll((dbwRr5=+UY)h+gav3KaV!qJSWUJFP0kI^TrC17EiG%VvOTAA0U z=n%!Vb6%wha{4_#u3r`)9wWpryC^A$O1;=;x7fGry))FJ(!>TAWO_BIyzh)XnhoG2 z#CKd(CSP4v5!O<$m^XB`;eXc6&6*}vt@$cxU)-cLR%9}V6K9ykj4m*BbhOu1t4%D` zC0}Slw1kE34kvnb+8XvYo)YKrN&V;AhR?=0--6K~E?bk%sS1!B;By8AYAAsR3o?0{ zY+_co3FkmsgP|lc3FlE>wf$y*x2co}z0pr6l@Jgx9$BRPK8i)1n4W;61 z*3KU8_Zi_pe``v;*SM1%^Cm_Z*QT^bYi4Dq6`}6A#-vzFXsyVZsMe0v&yc4~nx}yh zm$n<~)u3lt*5iKs2MjQJOY<%wV7E`(?A6#>aW>3#$t85?fNZkeS>Tfe1$1azT*L2- zTZQ<`^TX*Z>M9fP9eEWKx$uH zS@#dMX8MgiWI`K%TBhbOo2Jj=hhfz&s?qX?5c}@Fi3TYOKm5JPyu?g@tQl9Pc_Fd> zpQ8I>h|Jgn8ICzi!YJbV4r^h8;bbyfBb+Wjii{Kh1ldj=O0!`-QxgzdUudNB)W*8KeWdIhg&A7UK!gsBR*&a?pOWBO-b75^?o;y9H)1LCL)e`APyK%Bk#l{h zwnnJ$+)U19+^ZroOC;mX6N{5qTU!Kj&HUacl{J4+I1-*WaR=o_}EbHVXv#+ z)cs+OAHV8x#reo$M@_xkXh`_jS(5+yB2SVrs&a*s;i$$8mQ)~HWe8~Ykbvxg!5cWeH8&hJl#iTuY_ zvFH=SMC?W0RmaR1@q7cxCEz1K-CevgPWxEj+|%)R9CR|3K`eUn*yt5ht6PE!;X->M zwVwcQLLeQ8$1?>$sN`rygJjclMq;q@@h>^@P+SVV%Y3YG(ezJVuvZX&=@4zKv#eYV z2K!pWGiaR+R=$eAAxrNr_xhkvAfa*;rY4hSM-$zd>vI(~?-kStZ9>9IQK@#MTHCi9 zu1Pp@O+-UFA8)1tP%4yRy1}myA@nIOQncyS{$3au4U(C`1RN9etvPEN9hcU>Qf9ss zw#L^+8N{~pZxYs(%nsxem0IIbc6^Rk`U#cWEEf%?;9%>=0|U?mnRF%BVXo!N!Ppa% zoyX@r7=J>749y(AB)G24J8Uid|A@67pS&wWOvb=mg_%v0=Wj&3e zOe-ew>S{7S*V(9x^OnH z&9#;Fev5dn=ltj;=1WD@*9jHqL^5^uXTy$z(5o_9TC=vp3d39c+h&N0q3|oq18U2n zOH*CAkHe$PJ&$*dLsFNc3q3hsSFo*NSyko~`wzwp&*`t%6S7F#Q&6PaM|4jMns04?fn0C3@ttokMwN9_=9N?Wc}^MLb9Mf{#@}v25*q7#T)*KJ|*af`VlBDtrK!r(3i$^>hbNw ze)-m*SzEowx>a%G%UQ}Z3ih`8(CZQi#UNzh_~#3O1{coQ8j+u*Pp=S2m?o2EnOVVZ z#e8R+qN>a2sf#u-a8yul>Y^Hu!F0XUWlPGemo5u$jC9|cn`|_vJwO$AjW?EvrZv{C ztVA&ENNo0znJ9f|6%lMA z1VuD!x2($6x&JbDBVC9IcaYfmG$t**kM^?QgS_gCf)!<}>SP|rPw6gj@T{WA)ut$| zFRXCp7qG@AfDDy>li=)!+03>+BTlAOqJcdj2dw;9W$}cyxH0Pm{~eRc&)^_#hS7DD zsj1h*w;7`*$#XNOtz9j(mz57z#?nvdo!iSy6kJ|WG)?v1PU&bIDq&)m@L|oW$$DI? zv`R4Bm<{V3p1$|DBby(U$WPX{`c%q8H>{Cw9EPFpW+n{cjtja4uN~X{_2BC>QKp1> zgBwK~Ou{GAZ~7B&@T)_q)x6~+yd-S4{n=4x-^&al)wg^#RIG}iOn?%hAF0UcSn z5k33Dz#VCvpLUdQeRTESzT}M9PHJ}l*^wcR5h zS;JHlnKRFXg4TM_UeaklizNALjA$f$e}-@CG!5E4+AVT{Mb&cscuef-F}ot7$GqQs z6<@LBQnD=YE z%-eDWlJ@?9S2AC;0AJNE`|@S-G8)ujgOJi0FGn2^eU;IVx|-d-NyFn4Ulu8(TYNfp zB5-N0$=wIbb?f8`)7(h?D)46yy(){UPpC60m2zsV?xW>#e-Q{mOC4?4XYD&*#?jk%vLT_%=#LTQG@P z#|nF*Dd0#VZG7d&Iv|!#ot1n{{9wqQ!U6Jv6q%7b+8T}J^)D>|S0bLo`Q?+6>G_Fj zXX<=~x+zBOUth(t>n!LA%i2Kfmi;Op^@-~Om=tBwL4k&_jE-CjO(9KBCnF^S zhN{TnTvh4~f$j+I_A6)RckcpTUcCSgEO#Uy&}!I8dcnRg)}Rc}PWN1AQ$B{2bxU*Z zUM62t84gZ8v<=5k!iC1qwScp8+%9IAL)i~Wq}ePh!QHf=GcZep99`ZO2_?xwaFt-} z?E3!cU<sdCwM)7WSW=y-ZIM5J;51`N*Tm(eI6gjT0^ z^c}UC`udU37z89$*2cc7z1_WwPdJrD3_@oLEB4)}{rdsK3J;_b?Q{2y_rC-MZn|X@ zk#t0eWY3dh37Q?%5&Y)Vj`Hlbk!T$2DXL3qTpaAp)uJ)4v*AU8^NJh&`#AqH|d2r9TRMeKtbkyI~h60y+iK({Q%BC4Lj4Zzz z>N4B;qf%d#?Ewk{9#^=!O}}~Rja;!r^ru}|R?81Z3B~ML)IEL5@J_WSTF9M@Xtp^d zc&dfad(fUa zIpcg4g)(fisV}7JCaF>}mJPZJLh5q(S@Ex+QHp(|LlRIWq2Ux!xh0ntY24yrl!l_lUzGm<#u;W zMz!qaQr-ZK2kLk6Go3-VdTqqpnHNUMx=E=Ys;SI7g&kcg+hQJ((Qf$Df^8kH{X7&R zRx|X4B4)nVHIvw_x4DYnw_!gn3R5dL5I(fp9~_h#p1t(N98IPcT7qMYrHJ225N<5cC}9%Ln;PSx;wspgBvj zB6)53raS5--;s%V2N~uPq=d_kyS6Vs84zerNE(h3A`W=j-`iSpPbEmy2rp5OX~}lR zqnDWhZge+dW{9xWSM1LY@tJ>wEF~WE$%+wopDK%4-gmZNsd=$%=s3+tpnjwf3>Rqw zDkeuB2R`JtDKA9lliN$j=7Jv>>!4`^HLP;lpTp%oKz)*X37qdGC94`1tIB%5IjN@M zw3*-jDe%TAE~RfSyNcWtwtVgM+db|y^X>& z)AaL~FGo(=-|*VR#b+pf=-RNIC+n5i=CpVW7IkCy#MzgY^djVXDed}x>7<|A^m=>; zkbSZ_z_qV?M`n2+OpDdJ=MpD^x}Q9+k*;=8ejU@Vw1Secb-C$(A6sCFn2_Fp`CA>j z#&>T`I_P6$R)%t#OkmzMD>2z>P|{y#MYNp#EGEb?u#ITt2J!4!xQqa`{(QSe-NRP}>5 zDc3_wo`Y5W31^9R)su34;z54;(;}IpX2-(aRi%>I^pEOr_jf^R_?d^9+`MFd_)Dt|v?|vYTP*i) zNa4UTrx~{eb1UQZvcWo z`Y-bgtjUZ%w(V)%!wcVGTD0`6u|qdyKT=V)HPeBlHyP}6C?YDPIL{_S_A5hwd3&+j zXqT$*_)~SKLsp?h>?ufvHyg~p0&qw19o^^A;nYTFsk zMS~KJmF(?qPtobw1*DN>re1!stRk*{4T1h-OFUK-&>ZjV(`gN1UY~{jih|xUihzhs z*7vPQg#tgSAkU!B(XFKxZE()ow!!_~^<1!K$eJB!Xw#&~}YuRr*O z!+&5b5e30=@0GByOALtYti=;+?VxwxP_F=E+8?I0*-J`q#^1L*xrePL;$rp0-;iNh zuo&xC@sr{R9a|mf3G+s(&70p?awh;tdp)Ca1=NKC2PlozV-0#1KBaReq;XVOW8K|} za8FuK#~o7Gs&)21!lkOXQRx~B>{`e*rgz!wp_@>WZS;x`3IncIgiKasv0tLju6GMB zGU_vOTyFc$9m#=7+P)EuLZSTf1Qm{$#QdxlD@}_|O-z~TmpMLGQYG!?pao|;3an&% zYFOHb)&ZXy+@C#|1tpe;sIt><1tWLMJd zfvmY{A_RmJpK#ze`1L*^pLI2K#xDFIE-@e4#1y<+{g)Rcd3bEklfa*7NRx^R*+DrNTpZ!NyGjX*fqwzT^6>VL1TKsQk;A-ue9|ZS1l1d1E!r zX6K7@tL2!u+p3n-0SC<;M~|cid_HErZdzVO!ZDYN2rE4_ECz=k&!GR6?PLk{AyZIx zv9X2z!?K}nQI^G?w(poo^|Y!o*Wj2}PY>s*zj+&C^d`Q`_10z5DXX~YVBCL#X7t>y z-@bLMV!E7038gsN-{UmC!6_`@Ngax1@r)I7aqumI1R9wnyI6r;Jo5OGAf5uGe)KEy z4Xh>GBiSx%P3)NLR^Rfk-$>y8@xoyiJ}xdp?xdYvo!v=dY9F%NTHRqW4A1m%E4FFJ zE=x3my^hw^Vi2#D^81nVB0^z~!qTlGMD^-5N(}hj5E; zA>JQBq=L#?DXvq?HTzfRy&pRQCb9S&TUPoBg@Mv1-E*c|d$_Bew>KYW*y9WV{^_J- z6F&g^;*@VlpuL~6Pc|XVgCKxk=WU(q;edIULo-Ai$LQ$0^0kZW=>;k)oUU}|mGs36 zdh0zA`Z2&?(qc$OgeXL=n$M}sk3kwBl5A|xWF*%P{ofNL;f*Vb`u2HV^WW0BMsexP zCLAns<*+|U7>&9@_0`4h41*}^(fdV<>MGlrOFQuEBf?U!1{7wbyp4RK~Pf$Zvc>(Dg5v+SoLBknEl*;H}r$Z}{az#xdrPRBuq+*7y(l z>S1kItoqxN8;MX$G1pJ~$B4WB+wz|Vk_%tH{6TSe&R8%05e>4w|K|p(|KmmuBpF^R zuCruNzb&AR51JMuzSvh81Mlpe>h|?L_5zL_jo8!Hj1p};zl)6Vux;>O5ri(bm+APTFCH`VOq>k=`Ei2@DT=hI>_fr z(FDe@X0>wWE6-?|ikK}+KR%8wPeFO;tG%W+D+5aOmq-zIuj zQ_+0)I%ExS6kU7*Lj05FLlH8T`<%Dk zULrWRN0!ykxj=eV5xI=@-&9>V9o-=H4LF3!q*UE$bP8IPd+%cJ`0f@j+^SP)so(?g zQ~~riiKsEukV`{oA#{ATcbH%*-;jUw+TqjpS)nec-UXK%;M|;az{}L-YYrN!B>Ye<=4!2 zRrJZ+$y_`XB9YBP)A=7N2}bvCLf8vNjn}j>+bAe4hpfl|{+=OCaWOyk69zu#XP+LH zSgpR78uq0$u^KK)Jgbj$bHR)Ppu&;OW$Qu(ZYD5?Ww)`*nqm~4Z(X5ftAn0Gz<*W) z^cw$rPzV{qcRm7;%+Uv{))BB#qLQ?a6zPWSpvRb@lRrHKTPE0@P3HZUe2*-Fm{*(Q zx6LZWs&bKVcD!nbmk9vF?m;&!bKRv8nkx_L*|W#<$%kF_$}%auS(ZeZg<7(jhZNIc zM4f1_0)h><0)`5QUncln;5P84ppA*i7RFO*9r{2TB}|bw5e!J7GJ2E@_?u-ewci2p zZ2Kiy!KmIy<#rnaK}of(NsSEAETpV(h1S)AJz%VF&fqy)Uo|MabMP-&djjLNEsY3mG* zVVL}aryUjw#5?bh5g{VzU6?JBtb0}F&sa0 z9|w^eN2gprJ^-^AHF}cyOkFS-kG&Ji5CBui-c;|+>bbkif@`b*nY!gz|7#$>S70TD zyor_qo}k0yX-fd`ysdcNN3HeNKbmwlxab~3ZtG>`-DEw|#P-c+JWuBb3j1fw_B1Eg z8btnLNk<-qzh*yC&SZ6}up}8|#Tjf)v)`TtY{x4c1!q;nmy9-M(3y5o`vMtyk|7_-Q{5TDQ^~4VN3f!i&@G z8?gXJs)({YJKIKkS%8*YrT+3fbUkQ4ru7EWMZ41>W^$l0r189kZ^Pl|Y$SajQ-Ob7 zhFX3)=iU9GdQ(d#ol3v609%F6>7>ZX>0=X@XesO=PqO}8bejZn-WWMGjn~8zVKS5l z5=kZToGp8k`8(#xirJ$RrfpL@qQL`0L>z13@P;pqRIQz^>`JE1nx+`wXxd+L5p&=J z2KwIYU%ytey~CxYGW>#YHT}2YwyJjxG6Y+ASk; zH6-I#?La28ip^9x`5bq&&Z^5f*$^V_+F9djcOoo;obqK6 z-jGNi2XmGDjIlQab*w+_e~)m-2IKw=u|#9-{M4u`fyrTPr&-inzFI9ub+R$RyD#L7 zu4x~`<@UxM_aNvs{CrxGD4R`=@S%8STpvXb^GJtRL7^T<);@b z6EzfKiFIfp8R*EMi}fm$8HMTp%x++WU+E+S3lWUyv!vFKd9lx?)n1YssPBx1(22MXCn$e`tPk62Q2UBjh36~7zuC;%(g^+bVM4CvX34%iC>IYHAWL0Bd+Y_-Lua7nyCgwnW%%-p>cvp&d9 zTY7Yq1O`Ooy8rcd$=&K-<>1;|VM`gnp)b<{k*ZkE%GXM;&F|?E*1#(Ic6Hlzw4|VE zwmMw<_9px5RQgNOXPB*r+kdIVlLnv6wj0c~SCGEwe5VFK+-w-kN4_WwOJ3!%k&+IA z_6>Y}h-SqW>b!R^Ik(}{D&*I$RALGVxY(~`1XXBJHw%%LDqUm(ne|!(r^Z6=1=!Fw zjX(-5&*);X`aS4yd6${p_Bv+?(AepB|BW{?x10Sl1a|NpB+&+_Y6GJ9IOrVdVWS^RyvjtVJ+xQ_Iu4#7)$tp%mnz=2th<+O}+m= z!T35C*2%-3)*yD%iyGKrs@N;1#q`VAt|C!;=d#D6D)1FPh`{R8EiDA=NVJb>rGsIe z{#XB`fsWVVtR1kaV|;hap00a`Z(>5+(WXbOY{R|vDxh+|a2xjTa~WH5E!&ogx-F&L zefkqa)XWc+R=eyWb+i@ZqEH0}T%J^Z3=v6dT3Wc9 zXV%0cZ_;pv(IVlYP&KqUtG6N5AOOD|+*aKvLO-2()HQySPxTuj`g7G?E7jn2SDQ=AQF(sfA5^f5yt3dT2h8+83bWF+?ILp*m5kG=$C zONE`{EST?JeOr252lP!-#1NK1$tEn5fMpIGo|8Un5&i|%8uhYiK z&0U}3M*^}+fYC%0g2XxJUE`)K5icZDW^^1Kq7X)tt1okbI;CF2J?x;>EhTD7AmzJY zbLMbU5vYKH2o*rga4uQ(>C?4**`|3|h8%D}DQ;yK8|-kl!gqP(PMSEPiC#D;^Fl`z zg7ONb4M7P59|bZtrFXnsc#=~b2x)e(#rh9Lt1}w2Sn!uILi)O_Loqz)`*%fsIvE^d zcAjLzWW7;6ys!LEAGA&#l4!~`X2r?+j!Pdn!5p>1b$K1~j?!Dh`h?fQUB#w#0~k4E zXSs@Rh~gK`rK-j>)(xDf0c3@#8Y>e$pfc($ZM1tS&b8CU3p1)ykx^`Pkm~n(9_VG> z*pnn_cC_E|Q($(RG@VAthQHu;(|j{F0_k>tgS#oCeN{kmTd44StSklRZb7Ka_O2_K zC^@B@XXjndQp4-Dx&)Ish?0Brq=wb`%1}!4#Um4r$1pGdTnZgc_9OVb^%=sV((FN1 zoCM?(u4Vn9rpDIHe(uD7AZGMKo_JzFq9c{)QgSxC>F|Ys#s_cw#aL6$B{*0~|4l!z zP0G;dR7{p4SsnF2xg;FHHuGxN7d6xf({+^_KD81J=5-I=O~+>bOdSjx8b14CKU$io zgTK$v&(GjjC+Zqdl7^(}_H;J;>~YsQE=vXURR{7(cn-OBs5_gI?5pxs!!zybFKAA6 zx3&Zsv%XR!pvOLAd@4%M;|=vTRDr6P+*Gi6QCIg^x*M3nxc>>g=)k#nSW z?`*^bMILYRYrzB{-BClMTZbze@IFb9Sdl8n_JfTA*51$2F7skTye{j#s!-GSZw7X% zsimr2G}K==`t_gLsL~_!?im)62pK-ie-;($5Es{{eJ6=)-e9zD1aK9fnX1fMZnOWs zftm|uzMoD|!{z}po~`+e%$beqZ%G|)R`(Bys#OL5+6o_QfGBNwTit&1OpuHw-@JG_ z_Or3!_X1~U1ET=Fr*f-C>ApzFy_e}Vlw!at{Yn?JgR3I0 zTdrH6^I)G#D+uIWx3p+@13Wh|DchQfp0FYCqd?Hee}lYHqy`njs;v&$Abgaq)Tf82 zzae8=$8ugn|HR}kp|h>AmMjEekj=-jRd@Mrze*Dy`i4p@eXic(Ie1xFyPpL_7w;A6lS(fS zQlqvlhrpHD=>kAPX__T$TxrxsAQ{o8kIlXr;p6fxBMjyK9W?PaF@aw}Ix=ifPaR=9 z+;2*5ZZ|c!{$6HBu+XeZ$yDTi3CK177yeV4X?9m{7{AAD@n~*C8zKOJhF3-5$t$h; z`fmJ*YQg2PaVm5eTL_j-WvIi(uuTUatOr^5g4DoEB2kOychoGj$v0&q$VeqVJH*`) zmu&JEbsn0J(k*UckuRXMwoKdakfsDf_fXRvMLLH#yS7jp+U8+o7qY@~o({SwZ-@FR z0%eUOa+vm6g~-M9t_&v8dLM58VjkLElNXllTfQ?xzhQ1M^B+KLejr|?F*XpYyWkyX z&c&pM@A+9G-4@ER=74?`9@zYQGPkB>U%(JujZJ8X5-uoPiPUA-Ws?qjX2f~<*5)Nd z^zevJQ2Ms=B4*@ZEU5Q;d0h}JF>Kk2QNBbrqV|%Ly}6v$^MW3CG+v)k$rXFr#lG@6 zxWmZkh{ZV&o*A-k1XcTIPz=$ZmH1ECyc+ukX4|tarU#LFS9eEgw7iobFc#hzaW~uT zG7HzTJEAfhh_Y=px&6U;oxJ%%U3jWFQA~mvbGhrQ3YiZq%MajAttt4Mc|ssPukE*pjkwO{h=R%}_B6^@MTFSYtnG+WW$X3NF($XU@uRKM75 z7AZWo+TSE|ig}$xF_=a6yf>ixrQ@;a=7NNNmeF@?eR?fLs0mIui?(&Bt-wK`8`D5$ zcrogK;-I9V9+1G4+6^CPkn6dv-^Kg@qv+c+g8pm^be$Aj@l!--2M6K3)k;Yv z3TB=Uk&*ozp8F`dv^^4E+p>AjYCjFYnHI45ke6wD_D02%u~?&Kx32fada8`;J7X%% zz}op1A_ld;ZtppS+77Z?EDMGmIXr#0{7}I1zJN&LEwdGO*0p03Iv1!-N1IYb&ey{$ z4D@G%sSBYMbRIFVO5%L1i)v^{n+S@sth5xEO?hJM`?7PE6K6z)l*d7FWS+8D%EAgx z)W?SZO2EXsUnU_N=|ekJ?8F=X1*#s@FSppy$o1uZaKJk;LGvEoiW%9#C}vS##X=L? zvbsMre0T_UtyUtxLINZE7eD?#ggpQ6f~Wthmg>F?KXzKkTuT6ZSk&nbawCzZ*;+qX zuEp8g{@Q!)9_?{uixal^-gR#eE!*qVQ3a<5LVsjv>FQBlVjv%5(@E>M;kv;wYy$9_ zl0O-~QgdMNgPSquG?K`{L5kOmc~>@zJacbCb-z+LC>#(R9u$2~4 zN2Pj8zMRT8Dk#dhN`t3!HFctcT4f7i$|i5%;~~EjktWX zv|V1be+@xz+{9615-zq{ND&gcHaPz4^Kj`PuZTNT7W9+t?#NS_r2lp(cvSo2W|ABslX(2^otO5MdW)+Mw3BuEXpfWXb*(I1mkfR19x}$Osw)Q$$cJ;xY`Xt@?Nni zhgXaR$+Uz(BBK(2oh?28?TEP^;C&~|U{oF9W%-1TXrzXF#a$5VFp!r4}pEWsox+k zkAr9Tm1hT*>Yurz2g|#AY+f{`k|n4fICHpoPsev>tF+(KO4g>s^E6mm%ES;4YixF2 z8k?jv1+hHZ@&Q)JqQKARMv}pGa?t{5+7&17|N6e_^R(FUuFa{f5u*QH52V7W^5))f z_Gn&EXr_3Yt0%1cVaNBdYXV3^hM|;u55gQ^ryq*+j3f zDSmNdUv6-EueVx$D=&G3sV0Dx`~w~V;|N3_+~kPXEsGOcC8mkjPVgp?kp)oJ4P@P0 z{KjEjoZ3jzx6=sqT)ggwF`pYM$=8@zvAp5o)pkbBvQC=_HM1y|jG>rtFza=9{bix8 z9yIVfFz#Dz^piUrN%%eY`;Pi*2HWhC45Gs8Z2{GfHI#Z#A|d3g$0QTqd_raEq~-KV z?-Y%hu`pRM?0=Jw_|9&w=yCjhSNeKYAEQW-jp|JDiwcN7WiXYQ895F_efc2F0@&^v zl2=`1#_M|dfdD#!rCS~#89S5-sDJlsd0bh;>zy+LA-|t(tNBrfuUNd0=`;}?$(6J8|QG7imw6i81h+k$>57WVmOzb&8tbFN>}x zh=Pk{?O}_n1L3&7S8t+KuBZPw{JD!;F_RAqEVgJ)I>~)J)y-nTVL(PE37z^lI_)r| znn_vg?|b^f_uSc>d6N=%q9&9PAC(DaXG8W6L^#bUT`N_HiJ8dGNVL%{nEN_ZT}hJf z(aOk=yU+8k6~GndKF$(@>S4i3xvsBhjFF$yH6#l zju0o&I(Cd<1hy0zM?NY<5!N|tzIOd-Dn@J8*l0BFi$}z9s@=hrVo0w8L z_!LwvTSrAauNg{E$|&>4p^pjSBfRS^iqyjcLot;mOJnGINeH6*^&#C>Tx+)I6By5) zN%!=|P#&%>$Lgl7>DU{_iWb_tWX(!?O+d!O$UB&RIqjA%zMDp@L=_WF@o!_h_FbUp zfy!#;9!iX2!j=8G@wwM@wuUeKJb7!`Rbu0VK8Jp59?;_U z$mhT1QaGwpDx}yIvvO~_?Uc>}h`L0oTGv-j+jLn@39p?boScSzZvCL;@!rGs*i=vJ zKxAao0H^sTaojFgp>vd~A{_Oybpr-JQo8s1`ZN&8s(43KrVG0+lsR;7RB@;UQGcYgPM#0W^dlW)%Rui7=hgC2 zm>U(M(Qu24E~iZ@R|2KI4lDz#YNpabqSXZCM_!+2$gfaqGuHm;jt_kcUA{<_jZ1zq zup|VPstKQ43?;Og4ANlVv|c+|4>H*GzQ6AGY;xPDt#4(fZTRIi7Rl#UF9Uu+)qiOm z^E0sRl8BU-mo&oM;?qxji#T@JV$Hih4JX0+))qh3-CQnBs~p3|(JyQNCI4CzLHkFv z*&5F=()O+Kh83KaHx9 z0xQ~QfWuR&=#ZpyFr{{tjd~2UnoqL+dPBQ%DAGfjBZBSLpt1-mRksTVtNWPFhYgJf z0-7%lBpMf2_?cbz;srjk6bNb9rSwpykxshs%Rymf zKJe|Ux`~EG%6pQCre;dF;ZIhVF!-;D#cD@qo1niii<%4GT|SZx6zVn5KWqt=#Kph% zq#naht2eE1KaV&bHG2&osUs$ib*@F_(I(L{;NUqV{GfT;W3n4p7o>@k=boCb`$JIa zzGzT%Nka5Ds>ro{?V33DRW^T9_h%(!+#&&Gl+orG59Rg8epkPCwdXnw#x8DIiQ9h9 zYf_3uoUEd*G#DZyrCpa%EBr#M*F(igS1@{#UN@rf_`hj>&oZ(NHZ{%#u z;nPE$c<8^HwZD^nTBywR<9L#M5c_w3Bm)3ocB2Tqd2xQk1^~2Y4`3DeHLw?+_RIhP z3SK3f7@b^NGCJdG&j|pad<>*51njpQ_%+HR_15^_&dXp30RXwJix`7?y*0kFm8{

r_R^T=v01&~c0RX(?`qLGf7yw`n0TcYYxS60wkbWk#Ry`L0002}J LH5AI8nuYuqo3kR= literal 0 HcmV?d00001 diff --git a/docs/assets/signup-form.png b/docs/assets/signup-form.png new file mode 100644 index 0000000000000000000000000000000000000000..405798bc2c21dc622852f8fd021dc55960e59b75 GIT binary patch literal 112173 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 z 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≻XolBuU#icovqs{{uG0A^j0R=ubQ=~-$afWgl;Ez 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 YtOx_4#+|pJprD}0NhwQ~h#Lp}2O6s04*&oF literal 0 HcmV?d00001 diff --git a/docs/assets/signup-pending.png b/docs/assets/signup-pending.png new file mode 100644 index 0000000000000000000000000000000000000000..a48a0b7263a02464ad6e7d9f9f3530824cdec2e8 GIT binary patch literal 73581 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 literal 0 HcmV?d00001 diff --git a/internal/api/client/admin/accountapprove.go b/internal/api/client/admin/accountapprove.go new file mode 100644 index 000000000..ff6474adb --- /dev/null +++ b/internal/api/client/admin/accountapprove.go @@ -0,0 +1,105 @@ +// GoToSocial +// Copyright (C) GoToSocial Authors admin@gotosocial.org +// SPDX-License-Identifier: AGPL-3.0-or-later +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package admin + +import ( + "fmt" + "net/http" + + "github.com/gin-gonic/gin" + apiutil "github.com/superseriousbusiness/gotosocial/internal/api/util" + "github.com/superseriousbusiness/gotosocial/internal/gtserror" + "github.com/superseriousbusiness/gotosocial/internal/oauth" +) + +// AccountApprovePOSTHandler swagger:operation POST /api/v1/admin/accounts/{id}/approve adminAccountApprove +// +// Approve pending account. +// +// --- +// tags: +// - admin +// +// produces: +// - application/json +// +// parameters: +// - +// name: id +// required: true +// in: path +// description: ID of the account. +// type: string +// +// security: +// - OAuth2 Bearer: +// - admin +// +// responses: +// '200': +// description: The now-approved account. +// schema: +// "$ref": "#/definitions/adminAccountInfo" +// '400': +// description: bad request +// '401': +// description: unauthorized +// '403': +// description: forbidden +// '404': +// description: not found +// '406': +// description: not acceptable +// '500': +// description: internal server error +func (m *Module) AccountApprovePOSTHandler(c *gin.Context) { + authed, err := oauth.Authed(c, true, true, true, true) + if err != nil { + apiutil.ErrorHandler(c, gtserror.NewErrorUnauthorized(err, err.Error()), m.processor.InstanceGetV1) + return + } + + if !*authed.User.Admin { + err := fmt.Errorf("user %s not an admin", authed.User.ID) + apiutil.ErrorHandler(c, gtserror.NewErrorForbidden(err, err.Error()), m.processor.InstanceGetV1) + return + } + + if authed.Account.IsMoving() { + apiutil.ForbiddenAfterMove(c) + return + } + + targetAcctID, errWithCode := apiutil.ParseID(c.Param(apiutil.IDKey)) + if errWithCode != nil { + apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1) + return + } + + account, errWithCode := m.processor.Admin().AccountApprove( + c.Request.Context(), + authed.Account, + targetAcctID, + ) + if errWithCode != nil { + apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1) + return + } + + apiutil.JSON(c, http.StatusOK, account) +} diff --git a/internal/api/client/admin/accountget.go b/internal/api/client/admin/accountget.go new file mode 100644 index 000000000..3a656fecc --- /dev/null +++ b/internal/api/client/admin/accountget.go @@ -0,0 +1,101 @@ +// GoToSocial +// Copyright (C) GoToSocial Authors admin@gotosocial.org +// SPDX-License-Identifier: AGPL-3.0-or-later +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package admin + +import ( + "fmt" + "net/http" + + "github.com/gin-gonic/gin" + apiutil "github.com/superseriousbusiness/gotosocial/internal/api/util" + "github.com/superseriousbusiness/gotosocial/internal/gtserror" + "github.com/superseriousbusiness/gotosocial/internal/oauth" +) + +// AccountGETHandler swagger:operation GET /api/v1/admin/accounts/{id} adminAccountGet +// +// View one account. +// +// --- +// tags: +// - admin +// +// produces: +// - application/json +// +// parameters: +// - +// name: id +// required: true +// in: path +// description: ID of the account. +// type: string +// +// security: +// - OAuth2 Bearer: +// - admin +// +// responses: +// '200': +// description: OK +// schema: +// "$ref": "#/definitions/adminAccountInfo" +// '400': +// description: bad request +// '401': +// description: unauthorized +// '403': +// description: forbidden +// '404': +// description: not found +// '406': +// description: not acceptable +// '500': +// description: internal server error +func (m *Module) AccountGETHandler(c *gin.Context) { + authed, err := oauth.Authed(c, true, true, true, true) + if err != nil { + apiutil.ErrorHandler(c, gtserror.NewErrorUnauthorized(err, err.Error()), m.processor.InstanceGetV1) + return + } + + if !*authed.User.Admin { + err := fmt.Errorf("user %s not an admin", authed.User.ID) + apiutil.ErrorHandler(c, gtserror.NewErrorForbidden(err, err.Error()), m.processor.InstanceGetV1) + return + } + + if authed.Account.IsMoving() { + apiutil.ForbiddenAfterMove(c) + return + } + + targetAcctID, errWithCode := apiutil.ParseID(c.Param(apiutil.IDKey)) + if errWithCode != nil { + apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1) + return + } + + account, errWithCode := m.processor.Admin().AccountGet(c.Request.Context(), targetAcctID) + if errWithCode != nil { + apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1) + return + } + + apiutil.JSON(c, http.StatusOK, account) +} diff --git a/internal/api/client/admin/accountreject.go b/internal/api/client/admin/accountreject.go new file mode 100644 index 000000000..1e909b508 --- /dev/null +++ b/internal/api/client/admin/accountreject.go @@ -0,0 +1,136 @@ +// GoToSocial +// Copyright (C) GoToSocial Authors admin@gotosocial.org +// SPDX-License-Identifier: AGPL-3.0-or-later +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package admin + +import ( + "fmt" + "net/http" + + "github.com/gin-gonic/gin" + apimodel "github.com/superseriousbusiness/gotosocial/internal/api/model" + apiutil "github.com/superseriousbusiness/gotosocial/internal/api/util" + "github.com/superseriousbusiness/gotosocial/internal/gtserror" + "github.com/superseriousbusiness/gotosocial/internal/oauth" +) + +// AccountRejectPOSTHandler swagger:operation POST /api/v1/admin/accounts/{id}/reject adminAccountReject +// +// Reject pending account. +// +// --- +// tags: +// - admin +// +// produces: +// - application/json +// +// parameters: +// - +// name: id +// required: true +// in: path +// description: ID of the account. +// type: string +// - +// name: private_comment +// in: formData +// description: >- +// Comment to leave on why the account was denied. +// The comment will be visible to admins only. +// type: string +// - +// name: message +// in: formData +// description: >- +// Message to include in email to applicant. +// Will be included only if send_email is true. +// type: string +// - +// name: send_email +// in: formData +// description: >- +// Send an email to the applicant informing +// them that their sign-up has been rejected. +// type: boolean +// +// security: +// - OAuth2 Bearer: +// - admin +// +// responses: +// '200': +// description: The now-rejected account. +// schema: +// "$ref": "#/definitions/adminAccountInfo" +// '400': +// description: bad request +// '401': +// description: unauthorized +// '403': +// description: forbidden +// '404': +// description: not found +// '406': +// description: not acceptable +// '500': +// description: internal server error +func (m *Module) AccountRejectPOSTHandler(c *gin.Context) { + authed, err := oauth.Authed(c, true, true, true, true) + if err != nil { + apiutil.ErrorHandler(c, gtserror.NewErrorUnauthorized(err, err.Error()), m.processor.InstanceGetV1) + return + } + + if !*authed.User.Admin { + err := fmt.Errorf("user %s not an admin", authed.User.ID) + apiutil.ErrorHandler(c, gtserror.NewErrorForbidden(err, err.Error()), m.processor.InstanceGetV1) + return + } + + if authed.Account.IsMoving() { + apiutil.ForbiddenAfterMove(c) + return + } + + targetAcctID, errWithCode := apiutil.ParseID(c.Param(apiutil.IDKey)) + if errWithCode != nil { + apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1) + return + } + + form := new(apimodel.AdminAccountRejectRequest) + if err := c.ShouldBind(form); err != nil { + apiutil.ErrorHandler(c, gtserror.NewErrorBadRequest(err, err.Error()), m.processor.InstanceGetV1) + return + } + + account, errWithCode := m.processor.Admin().AccountReject( + c.Request.Context(), + authed.Account, + targetAcctID, + form.PrivateComment, + form.SendEmail, + form.Message, + ) + if errWithCode != nil { + apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1) + return + } + + apiutil.JSON(c, http.StatusOK, account) +} diff --git a/internal/api/client/admin/accountsgetv1.go b/internal/api/client/admin/accountsgetv1.go new file mode 100644 index 000000000..604d74992 --- /dev/null +++ b/internal/api/client/admin/accountsgetv1.go @@ -0,0 +1,348 @@ +// GoToSocial +// Copyright (C) GoToSocial Authors admin@gotosocial.org +// SPDX-License-Identifier: AGPL-3.0-or-later +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +// AccountsGETHandlerV1 swagger:operation GET /api/v1/admin/accounts adminAccountsGetV1 +// +// View + page through known accounts according to given filters. +// +// The next and previous queries can be parsed from the returned Link header. +// Example: +// +// ``` +// ; rel="next", ; rel="prev" +// ```` +// +// --- +// tags: +// - admin +// +// produces: +// - application/json +// +// parameters: +// - +// name: local +// in: query +// type: boolean +// description: Filter for local accounts. +// default: false +// - +// name: remote +// in: query +// type: boolean +// description: Filter for remote accounts. +// default: false +// - +// name: active +// in: query +// type: boolean +// description: Filter for currently active accounts. +// default: false +// - +// name: pending +// in: query +// type: boolean +// description: Filter for currently pending accounts. +// default: false +// - +// name: disabled +// in: query +// type: boolean +// description: Filter for currently disabled accounts. +// default: false +// - +// name: silenced +// in: query +// type: boolean +// description: Filter for currently silenced accounts. +// default: false +// - +// name: suspended +// in: query +// type: boolean +// description: Filter for currently suspended accounts. +// default: false +// - +// name: sensitized +// in: query +// type: boolean +// description: Filter for accounts force-marked as sensitive. +// default: false +// - +// name: username +// in: query +// type: string +// description: Search for the given username. +// - +// name: display_name +// in: query +// type: string +// description: Search for the given display name. +// - +// name: by_domain +// in: query +// type: string +// description: Filter by the given domain. +// - +// name: email +// in: query +// type: string +// description: Lookup a user with this email. +// - +// name: ip +// in: query +// type: string +// description: Lookup users with this IP address. +// - +// name: staff +// in: query +// type: boolean +// description: Filter for staff accounts. +// default: false +// - +// name: max_id +// in: query +// type: string +// description: All results returned will be older than the item with this ID. +// - +// name: since_id +// in: query +// type: string +// description: All results returned will be newer than the item with this ID. +// - +// name: min_id +// in: query +// type: string +// description: Returns results immediately newer than the item with this ID. +// - +// name: limit +// in: query +// type: integer +// description: Maximum number of results to return. +// default: 100 +// maximum: 200 +// minimum: 1 +// +// security: +// - OAuth2 Bearer: +// - admin +// +// responses: +// '200': +// headers: +// Link: +// type: string +// description: Links to the next and previous queries. +// schema: +// type: array +// items: +// "$ref": "#/definitions/adminAccountInfo" +// '400': +// description: bad request +// '401': +// description: unauthorized +// '403': +// description: forbidden +// '404': +// description: not found +// '406': +// description: not acceptable +// '500': +// description: internal server error +package admin + +import ( + "fmt" + "net/http" + + "github.com/gin-gonic/gin" + apimodel "github.com/superseriousbusiness/gotosocial/internal/api/model" + apiutil "github.com/superseriousbusiness/gotosocial/internal/api/util" + "github.com/superseriousbusiness/gotosocial/internal/gtserror" + "github.com/superseriousbusiness/gotosocial/internal/oauth" + "github.com/superseriousbusiness/gotosocial/internal/paging" +) + +func (m *Module) AccountsGETV1Handler(c *gin.Context) { + authed, err := oauth.Authed(c, true, true, true, true) + if err != nil { + apiutil.ErrorHandler(c, gtserror.NewErrorUnauthorized(err, err.Error()), m.processor.InstanceGetV1) + return + } + + if !*authed.User.Admin { + err := fmt.Errorf("user %s not an admin", authed.User.ID) + apiutil.ErrorHandler(c, gtserror.NewErrorForbidden(err, err.Error()), m.processor.InstanceGetV1) + return + } + + if authed.Account.IsMoving() { + apiutil.ForbiddenAfterMove(c) + return + } + + if _, err := apiutil.NegotiateAccept(c, apiutil.JSONAcceptHeaders...); err != nil { + apiutil.ErrorHandler(c, gtserror.NewErrorNotAcceptable(err, err.Error()), m.processor.InstanceGetV1) + return + } + + page, errWithCode := paging.ParseIDPage(c, 1, 200, 100) + if errWithCode != nil { + apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1) + return + } + + /* Translate to v2 `origin` query param */ + + local, errWithCode := apiutil.ParseLocal(c.Query(apiutil.LocalKey), false) + if errWithCode != nil { + apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1) + return + } + + remote, errWithCode := apiutil.ParseAdminRemote(c.Query(apiutil.AdminRemoteKey), false) + if errWithCode != nil { + apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1) + return + } + + if local && remote { + keys := []string{apiutil.LocalKey, apiutil.AdminRemoteKey} + err := fmt.Errorf("only one of %+v can be true", keys) + apiutil.ErrorHandler(c, gtserror.NewErrorBadRequest(err, err.Error()), m.processor.InstanceGetV1) + return + } + + var origin string + if local { + origin = "local" + } else if remote { + origin = "remote" + } + + /* Translate to v2 `status` query param */ + + active, errWithCode := apiutil.ParseAdminActive(c.Query(apiutil.AdminActiveKey), false) + if errWithCode != nil { + apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1) + return + } + + pending, errWithCode := apiutil.ParseAdminPending(c.Query(apiutil.AdminPendingKey), false) + if errWithCode != nil { + apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1) + return + } + + disabled, errWithCode := apiutil.ParseAdminDisabled(c.Query(apiutil.AdminDisabledKey), false) + if errWithCode != nil { + apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1) + return + } + + silenced, errWithCode := apiutil.ParseAdminSilenced(c.Query(apiutil.AdminSilencedKey), false) + if errWithCode != nil { + apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1) + return + } + + suspended, errWithCode := apiutil.ParseAdminSuspended(c.Query(apiutil.AdminSuspendedKey), false) + if errWithCode != nil { + apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1) + return + } + + // Ensure only one `status` query param set. + var status string + states := map[string]bool{ + apiutil.AdminActiveKey: active, + apiutil.AdminPendingKey: pending, + apiutil.AdminDisabledKey: disabled, + apiutil.AdminSilencedKey: silenced, + apiutil.AdminSuspendedKey: suspended, + } + for k, v := range states { + if !v { + // False status, + // so irrelevant. + continue + } + + if status != "" { + // Status was already set by another + // query param, this is an error. + keys := []string{ + apiutil.AdminActiveKey, + apiutil.AdminPendingKey, + apiutil.AdminDisabledKey, + apiutil.AdminSilencedKey, + apiutil.AdminSuspendedKey, + } + err := fmt.Errorf("only one of %+v can be true", keys) + apiutil.ErrorHandler(c, gtserror.NewErrorBadRequest(err, err.Error()), m.processor.InstanceGetV1) + return + } + + // Use this + // account status. + status = k + } + + /* Translate to v2 `permissions` query param */ + + staff, errWithCode := apiutil.ParseAdminStaff(c.Query(apiutil.AdminStaffKey), false) + if errWithCode != nil { + apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1) + return + } + + var permissions string + if staff { + permissions = "staff" + } + + // Parse out all optional params from the query. + params := &apimodel.AdminGetAccountsRequest{ + Origin: origin, + Status: status, + Permissions: permissions, + RoleIDs: nil, // Can't do in V1. + InvitedBy: "", // Can't do in V1. + Username: c.Query(apiutil.UsernameKey), + DisplayName: c.Query(apiutil.AdminDisplayNameKey), + ByDomain: c.Query(apiutil.AdminByDomainKey), + Email: c.Query(apiutil.AdminEmailKey), + IP: c.Query(apiutil.AdminIPKey), + APIVersion: 1, + } + + resp, errWithCode := m.processor.Admin().AccountsGet( + c.Request.Context(), + params, + page, + ) + if errWithCode != nil { + apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1) + return + } + + if resp.LinkHeader != "" { + c.Header("Link", resp.LinkHeader) + } + + apiutil.JSON(c, http.StatusOK, resp.Items) +} diff --git a/internal/api/client/admin/accountsgetv2.go b/internal/api/client/admin/accountsgetv2.go new file mode 100644 index 000000000..ca32b9e7f --- /dev/null +++ b/internal/api/client/admin/accountsgetv2.go @@ -0,0 +1,212 @@ +// GoToSocial +// Copyright (C) GoToSocial Authors admin@gotosocial.org +// SPDX-License-Identifier: AGPL-3.0-or-later +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +// AccountsGETHandlerV2 swagger:operation GET /api/v2/admin/accounts adminAccountsGetV2 +// +// View + page through known accounts according to given filters. +// +// The next and previous queries can be parsed from the returned Link header. +// Example: +// +// ``` +// ; rel="next", ; rel="prev" +// ```` +// +// --- +// tags: +// - admin +// +// produces: +// - application/json +// +// parameters: +// - +// name: origin +// in: query +// type: string +// description: Filter for `local` or `remote` accounts. +// - +// name: status +// in: query +// type: string +// description: Filter for `active`, `pending`, `disabled`, `silenced`, or `suspended` accounts. +// - +// name: permissions +// in: query +// type: string +// description: Filter for accounts with staff permissions (users that can manage reports). +// - +// name: role_ids[] +// in: query +// type: array +// items: +// type: string +// description: Filter for users with these roles. +// - +// name: invited_by +// in: query +// type: string +// description: Lookup users invited by the account with this ID. +// - +// name: username +// in: query +// type: string +// description: Search for the given username. +// - +// name: display_name +// in: query +// type: string +// description: Search for the given display name. +// - +// name: by_domain +// in: query +// type: string +// description: Filter by the given domain. +// - +// name: email +// in: query +// type: string +// description: Lookup a user with this email. +// - +// name: ip +// in: query +// type: string +// description: Lookup users with this IP address. +// - +// name: max_id +// in: query +// type: string +// description: All results returned will be older than the item with this ID. +// - +// name: since_id +// in: query +// type: string +// description: All results returned will be newer than the item with this ID. +// - +// name: min_id +// in: query +// type: string +// description: Returns results immediately newer than the item with this ID. +// - +// name: limit +// in: query +// type: integer +// description: Maximum number of results to return. +// default: 100 +// maximum: 200 +// minimum: 1 +// +// security: +// - OAuth2 Bearer: +// - admin +// +// responses: +// '200': +// headers: +// Link: +// type: string +// description: Links to the next and previous queries. +// schema: +// type: array +// items: +// "$ref": "#/definitions/adminAccountInfo" +// '400': +// description: bad request +// '401': +// description: unauthorized +// '403': +// description: forbidden +// '404': +// description: not found +// '406': +// description: not acceptable +// '500': +// description: internal server error +package admin + +import ( + "fmt" + "net/http" + + "github.com/gin-gonic/gin" + apimodel "github.com/superseriousbusiness/gotosocial/internal/api/model" + apiutil "github.com/superseriousbusiness/gotosocial/internal/api/util" + "github.com/superseriousbusiness/gotosocial/internal/gtserror" + "github.com/superseriousbusiness/gotosocial/internal/oauth" + "github.com/superseriousbusiness/gotosocial/internal/paging" +) + +func (m *Module) AccountsGETV2Handler(c *gin.Context) { + authed, err := oauth.Authed(c, true, true, true, true) + if err != nil { + apiutil.ErrorHandler(c, gtserror.NewErrorUnauthorized(err, err.Error()), m.processor.InstanceGetV1) + return + } + + if !*authed.User.Admin { + err := fmt.Errorf("user %s not an admin", authed.User.ID) + apiutil.ErrorHandler(c, gtserror.NewErrorForbidden(err, err.Error()), m.processor.InstanceGetV1) + return + } + + if authed.Account.IsMoving() { + apiutil.ForbiddenAfterMove(c) + return + } + + if _, err := apiutil.NegotiateAccept(c, apiutil.JSONAcceptHeaders...); err != nil { + apiutil.ErrorHandler(c, gtserror.NewErrorNotAcceptable(err, err.Error()), m.processor.InstanceGetV1) + return + } + + page, errWithCode := paging.ParseIDPage(c, 1, 200, 100) + if errWithCode != nil { + apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1) + return + } + + // Parse out all optional params from the query. + params := &apimodel.AdminGetAccountsRequest{ + Origin: c.Query(apiutil.AdminOriginKey), + Status: c.Query(apiutil.AdminStatusKey), + Permissions: c.Query(apiutil.AdminPermissionsKey), + RoleIDs: c.QueryArray(apiutil.AdminRoleIDsKey), + InvitedBy: c.Query(apiutil.AdminInvitedByKey), + Username: c.Query(apiutil.UsernameKey), + DisplayName: c.Query(apiutil.AdminDisplayNameKey), + ByDomain: c.Query(apiutil.AdminByDomainKey), + Email: c.Query(apiutil.AdminEmailKey), + IP: c.Query(apiutil.AdminIPKey), + APIVersion: 2, + } + + resp, errWithCode := m.processor.Admin().AccountsGet( + c.Request.Context(), + params, + page, + ) + if errWithCode != nil { + apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1) + return + } + + if resp.LinkHeader != "" { + c.Header("Link", resp.LinkHeader) + } + + apiutil.JSON(c, http.StatusOK, resp.Items) +} diff --git a/internal/api/client/admin/admin.go b/internal/api/client/admin/admin.go index f247d7ce9..e898bca46 100644 --- a/internal/api/client/admin/admin.go +++ b/internal/api/client/admin/admin.go @@ -39,9 +39,12 @@ const ( HeaderAllowsPathWithID = HeaderAllowsPath + "/:" + IDKey HeaderBlocksPath = BasePath + "/header_blocks" HeaderBlocksPathWithID = HeaderBlocksPath + "/:" + IDKey - AccountsPath = BasePath + "/accounts" - AccountsPathWithID = AccountsPath + "/:" + IDKey + AccountsV1Path = BasePath + "/accounts" + AccountsV2Path = "/v2/admin/accounts" + AccountsPathWithID = AccountsV1Path + "/:" + IDKey AccountsActionPath = AccountsPathWithID + "/action" + AccountsApprovePath = AccountsPathWithID + "/approve" + AccountsRejectPath = AccountsPathWithID + "/reject" MediaCleanupPath = BasePath + "/media_cleanup" MediaRefetchPath = BasePath + "/media_refetch" ReportsPath = BasePath + "/reports" @@ -113,7 +116,12 @@ func (m *Module) Route(attachHandler func(method string, path string, f ...gin.H attachHandler(http.MethodPost, DomainKeysExpirePath, m.DomainKeysExpirePOSTHandler) // accounts stuff + attachHandler(http.MethodGet, AccountsV1Path, m.AccountsGETV1Handler) + attachHandler(http.MethodGet, AccountsV2Path, m.AccountsGETV2Handler) + attachHandler(http.MethodGet, AccountsPathWithID, m.AccountGETHandler) attachHandler(http.MethodPost, AccountsActionPath, m.AccountActionPOSTHandler) + attachHandler(http.MethodPost, AccountsApprovePath, m.AccountApprovePOSTHandler) + attachHandler(http.MethodPost, AccountsRejectPath, m.AccountRejectPOSTHandler) // media stuff attachHandler(http.MethodPost, MediaCleanupPath, m.MediaCleanupPOSTHandler) diff --git a/internal/api/model/admin.go b/internal/api/model/admin.go index ca84ffd88..637ab0ed7 100644 --- a/internal/api/model/admin.go +++ b/internal/api/model/admin.go @@ -229,3 +229,52 @@ type DebugAPUrlResponse struct { // may be an error, may be both! ResponseBody string `json:"response_body"` } + +// AdminGetAccountsRequest models a request +// to get an admin view of one or more +// accounts using given parameters. +// +// swagger:ignore +type AdminGetAccountsRequest struct { + // Filter for `local` or `remote` accounts. + Origin string + // Filter for `active`, `pending`, `disabled`, + // `silenced`, or `suspended` accounts. + Status string + // Filter for accounts with staff perms + // (users that can manage reports). + Permissions string + // Filter for users with these roles. + RoleIDs []string + // Lookup users invited by the account with this ID. + InvitedBy string + // Search for the given username. + Username string + // Search for the given display name. + DisplayName string + // Filter by the given domain. + ByDomain string + // Lookup a user with this email. + Email string + // Lookup users with this IP address. + IP string + // API version to use for this request (1 or 2). + // Set internally, not by callers. + APIVersion int +} + +// AdminAccountRejectRequest models a +// request to deny a new account sign-up. +// +// swagger:ignore +type AdminAccountRejectRequest struct { + // Comment to leave on why the account was denied. + // The comment will be visible to admins only. + PrivateComment string `form:"private_comment" json:"private_comment"` + // Message to include in email to applicant. + // Will be included only if send_email is true. + Message string `form:"message" json:"message"` + // Send an email to the applicant informing + // them that their sign-up has been rejected. + SendEmail bool `form:"send_email" json:"send_email"` +} diff --git a/internal/api/util/parsequery.go b/internal/api/util/parsequery.go index da6320b67..54cb4c466 100644 --- a/internal/api/util/parsequery.go +++ b/internal/api/util/parsequery.go @@ -34,12 +34,13 @@ const ( /* Common keys */ - IDKey = "id" - LimitKey = "limit" - LocalKey = "local" - MaxIDKey = "max_id" - SinceIDKey = "since_id" - MinIDKey = "min_id" + IDKey = "id" + LimitKey = "limit" + LocalKey = "local" + MaxIDKey = "max_id" + SinceIDKey = "since_id" + MinIDKey = "min_id" + UsernameKey = "username" /* AP endpoint keys */ @@ -61,19 +62,62 @@ const ( /* Web endpoint keys */ - WebUsernameKey = "username" WebStatusIDKey = "status" /* Domain permission keys */ DomainPermissionExportKey = "export" DomainPermissionImportKey = "import" + + /* Admin query keys */ + + AdminRemoteKey = "remote" + AdminActiveKey = "active" + AdminPendingKey = "pending" + AdminDisabledKey = "disabled" + AdminSilencedKey = "silenced" + AdminSuspendedKey = "suspended" + AdminSensitizedKey = "sensitized" + AdminDisplayNameKey = "display_name" + AdminByDomainKey = "by_domain" + AdminEmailKey = "email" + AdminIPKey = "ip" + AdminStaffKey = "staff" + AdminOriginKey = "origin" + AdminStatusKey = "status" + AdminPermissionsKey = "permissions" + AdminRoleIDsKey = "role_ids[]" + AdminInvitedByKey = "invited_by" ) /* Parse functions for *OPTIONAL* parameters with default values. */ +func ParseMaxID(value string, defaultValue string) string { + if value == "" { + return defaultValue + } + + return value +} + +func ParseSinceID(value string, defaultValue string) string { + if value == "" { + return defaultValue + } + + return value +} + +func ParseMinID(value string, defaultValue string) string { + if value == "" { + return defaultValue + } + + return value +} + func ParseLimit(value string, defaultValue int, max, min int) (int, gtserror.WithCode) { i, err := parseInt(value, defaultValue, max, min, LimitKey) if err != nil { @@ -87,14 +131,6 @@ func ParseLocal(value string, defaultValue bool) (bool, gtserror.WithCode) { return parseBool(value, defaultValue, LocalKey) } -func ParseMaxID(value string, defaultValue string) string { - if value == "" { - return defaultValue - } - - return value -} - func ParseSearchExcludeUnreviewed(value string, defaultValue bool) (bool, gtserror.WithCode) { return parseBool(value, defaultValue, SearchExcludeUnreviewedKey) } @@ -123,6 +159,34 @@ func ParseOnlyOtherAccounts(value string, defaultValue bool) (bool, gtserror.Wit return parseBool(value, defaultValue, OnlyOtherAccountsKey) } +func ParseAdminRemote(value string, defaultValue bool) (bool, gtserror.WithCode) { + return parseBool(value, defaultValue, AdminRemoteKey) +} + +func ParseAdminActive(value string, defaultValue bool) (bool, gtserror.WithCode) { + return parseBool(value, defaultValue, AdminActiveKey) +} + +func ParseAdminPending(value string, defaultValue bool) (bool, gtserror.WithCode) { + return parseBool(value, defaultValue, AdminPendingKey) +} + +func ParseAdminDisabled(value string, defaultValue bool) (bool, gtserror.WithCode) { + return parseBool(value, defaultValue, AdminDisabledKey) +} + +func ParseAdminSilenced(value string, defaultValue bool) (bool, gtserror.WithCode) { + return parseBool(value, defaultValue, AdminSilencedKey) +} + +func ParseAdminSuspended(value string, defaultValue bool) (bool, gtserror.WithCode) { + return parseBool(value, defaultValue, AdminSuspendedKey) +} + +func ParseAdminStaff(value string, defaultValue bool) (bool, gtserror.WithCode) { + return parseBool(value, defaultValue, AdminStaffKey) +} + /* Parse functions for *REQUIRED* parameters. */ @@ -187,8 +251,8 @@ func ParseTagName(value string) (string, gtserror.WithCode) { return value, nil } -func ParseWebUsername(value string) (string, gtserror.WithCode) { - key := WebUsernameKey +func ParseUsername(value string) (string, gtserror.WithCode) { + key := UsernameKey if value == "" { return "", requiredError(key) diff --git a/internal/db/account.go b/internal/db/account.go index 45276f41f..7cdf7b57f 100644 --- a/internal/db/account.go +++ b/internal/db/account.go @@ -19,9 +19,11 @@ package db import ( "context" + "net/netip" "time" "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" + "github.com/superseriousbusiness/gotosocial/internal/paging" ) // Account contains functions related to account getting/setting/creation. @@ -56,6 +58,25 @@ type Account interface { // GetAccountByFollowersURI returns one account with the given followers_uri, or an error if something goes wrong. GetAccountByFollowersURI(ctx context.Context, uri string) (*gtsmodel.Account, error) + // GetAccounts returns accounts + // with the given parameters. + GetAccounts( + ctx context.Context, + origin string, + status string, + mods bool, + invitedBy string, + username string, + displayName string, + domain string, + email string, + ip netip.Addr, + page *paging.Page, + ) ( + []*gtsmodel.Account, + error, + ) + // PopulateAccount ensures that all sub-models of an account are populated (e.g. avatar, header etc). PopulateAccount(ctx context.Context, account *gtsmodel.Account) error diff --git a/internal/db/bundb/account.go b/internal/db/bundb/account.go index 1ecf28e42..45e67c10b 100644 --- a/internal/db/bundb/account.go +++ b/internal/db/bundb/account.go @@ -20,6 +20,8 @@ package bundb import ( "context" "errors" + "fmt" + "net/netip" "slices" "strings" "time" @@ -31,6 +33,7 @@ import ( "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" "github.com/superseriousbusiness/gotosocial/internal/id" "github.com/superseriousbusiness/gotosocial/internal/log" + "github.com/superseriousbusiness/gotosocial/internal/paging" "github.com/superseriousbusiness/gotosocial/internal/state" "github.com/superseriousbusiness/gotosocial/internal/util" "github.com/uptrace/bun" @@ -249,6 +252,257 @@ func (a *accountDB) GetInstanceAccount(ctx context.Context, domain string) (*gts return a.GetAccountByUsernameDomain(ctx, username, domain) } +func (a *accountDB) GetAccounts( + ctx context.Context, + origin string, + status string, + mods bool, + invitedBy string, + username string, + displayName string, + domain string, + email string, + ip netip.Addr, + page *paging.Page, +) ( + []*gtsmodel.Account, + error, +) { + var ( + // local users lists, + // required for some + // limiting parameters. + users []*gtsmodel.User + + // lazyLoadUsers only loads the users + // slice if it's required by params. + lazyLoadUsers = func() (err error) { + if users == nil { + users, err = a.state.DB.GetAllUsers(gtscontext.SetBarebones(ctx)) + if err != nil { + return fmt.Errorf("error getting users: %w", err) + } + } + return nil + } + + // Get paging params. + // + // Note this may be min_id OR since_id + // from the API, this gets handled below + // when checking order to reverse slice. + minID = page.GetMin() + maxID = page.GetMax() + limit = page.GetLimit() + order = page.GetOrder() + + // Make educated guess for slice size + accountIDs = make([]string, 0, limit) + accountIDIn []string + + useAccountIDIn bool + ) + + q := a.db. + NewSelect(). + TableExpr("? AS ?", bun.Ident("accounts"), bun.Ident("account")). + // Select only IDs from table + Column("account.id") + + // Return only accounts OLDER + // than account with maxID. + if maxID != "" { + maxIDAcct, err := a.GetAccountByID( + gtscontext.SetBarebones(ctx), + maxID, + ) + if err != nil { + return nil, fmt.Errorf("error getting maxID account %s: %w", maxID, err) + } + + q = q.Where("? < ?", bun.Ident("account.created_at"), maxIDAcct.CreatedAt) + } + + // Return only accounts NEWER + // than account with minID. + if minID != "" { + minIDAcct, err := a.GetAccountByID( + gtscontext.SetBarebones(ctx), + minID, + ) + if err != nil { + return nil, fmt.Errorf("error getting minID account %s: %w", minID, err) + } + + q = q.Where("? > ?", bun.Ident("account.created_at"), minIDAcct.CreatedAt) + } + + switch status { + + case "active": + // Get only enabled accounts. + if err := lazyLoadUsers(); err != nil { + return nil, err + } + for _, user := range users { + if !*user.Disabled { + accountIDIn = append(accountIDIn, user.AccountID) + } + } + useAccountIDIn = true + + case "pending": + // Get only unapproved accounts. + if err := lazyLoadUsers(); err != nil { + return nil, err + } + for _, user := range users { + if !*user.Approved { + accountIDIn = append(accountIDIn, user.AccountID) + } + } + useAccountIDIn = true + + case "disabled": + // Get only disabled accounts. + if err := lazyLoadUsers(); err != nil { + return nil, err + } + for _, user := range users { + if *user.Disabled { + accountIDIn = append(accountIDIn, user.AccountID) + } + } + useAccountIDIn = true + + case "silenced": + // Get only silenced accounts. + q = q.Where("? IS NOT NULL", bun.Ident("account.silenced_at")) + + case "suspended": + // Get only suspended accounts. + q = q.Where("? IS NOT NULL", bun.Ident("account.suspended_at")) + } + + if mods { + // Get only mod accounts. + if err := lazyLoadUsers(); err != nil { + return nil, err + } + for _, user := range users { + if *user.Moderator || *user.Admin { + accountIDIn = append(accountIDIn, user.AccountID) + } + } + useAccountIDIn = true + } + + // TODO: invitedBy + + if username != "" { + q = q.Where("? = ?", bun.Ident("account.username"), username) + } + + if displayName != "" { + q = q.Where("? = ?", bun.Ident("account.display_name"), displayName) + } + + if domain != "" { + q = q.Where("? = ?", bun.Ident("account.domain"), domain) + } + + if email != "" { + if err := lazyLoadUsers(); err != nil { + return nil, err + } + for _, user := range users { + if user.Email == email || user.UnconfirmedEmail == email { + accountIDIn = append(accountIDIn, user.AccountID) + } + } + useAccountIDIn = true + } + + // Use ip if not zero value. + if ip.IsValid() { + if err := lazyLoadUsers(); err != nil { + return nil, err + } + for _, user := range users { + if user.SignUpIP.String() == ip.String() { + accountIDIn = append(accountIDIn, user.AccountID) + } + } + useAccountIDIn = true + } + + if origin == "local" && !useAccountIDIn { + // In the case we're not already limiting + // by specific subset of account IDs, just + // use existing list of user.AccountIDs + // instead of adding WHERE to the query. + if err := lazyLoadUsers(); err != nil { + return nil, err + } + for _, user := range users { + accountIDIn = append(accountIDIn, user.AccountID) + } + useAccountIDIn = true + + } else if origin == "remote" { + if useAccountIDIn { + // useAccountIDIn specifically indicates + // a parameter that limits querying to + // local accounts, there will be none. + return nil, nil + } + + // Get only remote accounts. + q = q.Where("? IS NOT NULL", bun.Ident("account.domain")) + } + + if useAccountIDIn { + if len(accountIDIn) == 0 { + // There will be no + // possible answer. + return nil, nil + } + + q = q.Where("? IN (?)", bun.Ident("account.id"), bun.In(accountIDIn)) + } + + if limit > 0 { + // Limit amount of + // accounts returned. + q = q.Limit(limit) + } + + if order == paging.OrderAscending { + // Page up. + q = q.Order("account.created_at ASC") + } else { + // Page down. + q = q.Order("account.created_at DESC") + } + + if err := q.Scan(ctx, &accountIDs); err != nil { + return nil, err + } + + if len(accountIDs) == 0 { + return nil, nil + } + + // If we're paging up, we still want accounts + // to be sorted by createdAt desc, so reverse ids slice. + if order == paging.OrderAscending { + slices.Reverse(accountIDs) + } + + // Return account IDs loaded from cache + db. + return a.state.DB.GetAccountsByIDs(ctx, accountIDs) +} + func (a *accountDB) getAccount(ctx context.Context, lookup string, dbQuery func(*gtsmodel.Account) error, keyParts ...any) (*gtsmodel.Account, error) { // Fetch account from database cache with loader callback account, err := a.state.Caches.GTS.Account.LoadOne(lookup, func() (*gtsmodel.Account, error) { diff --git a/internal/db/bundb/account_test.go b/internal/db/bundb/account_test.go index 21e04dedc..dd96543b6 100644 --- a/internal/db/bundb/account_test.go +++ b/internal/db/bundb/account_test.go @@ -23,6 +23,7 @@ import ( "crypto/rsa" "errors" "fmt" + "net/netip" "reflect" "strings" "testing" @@ -33,6 +34,7 @@ import ( "github.com/superseriousbusiness/gotosocial/internal/db" "github.com/superseriousbusiness/gotosocial/internal/db/bundb" "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" + "github.com/superseriousbusiness/gotosocial/internal/paging" "github.com/superseriousbusiness/gotosocial/internal/util" "github.com/uptrace/bun" ) @@ -491,6 +493,189 @@ func (suite *AccountTestSuite) TestPopulateAccountWithUnknownMovedToURI() { suite.NoError(err) } +func (suite *AccountTestSuite) TestGetAccountsAll() { + var ( + ctx = context.Background() + origin = "" + status = "" + mods = false + invitedBy = "" + username = "" + displayName = "" + domain = "" + email = "" + ip netip.Addr + page *paging.Page = nil + ) + + accounts, err := suite.db.GetAccounts( + ctx, + origin, + status, + mods, + invitedBy, + username, + displayName, + domain, + email, + ip, + page, + ) + if err != nil { + suite.FailNow(err.Error()) + } + + suite.Len(accounts, 9) +} + +func (suite *AccountTestSuite) TestGetAccountsModsOnly() { + var ( + ctx = context.Background() + origin = "" + status = "" + mods = true + invitedBy = "" + username = "" + displayName = "" + domain = "" + email = "" + ip netip.Addr + page = &paging.Page{ + Limit: 100, + } + ) + + accounts, err := suite.db.GetAccounts( + ctx, + origin, + status, + mods, + invitedBy, + username, + displayName, + domain, + email, + ip, + page, + ) + if err != nil { + suite.FailNow(err.Error()) + } + + suite.Len(accounts, 1) +} + +func (suite *AccountTestSuite) TestGetAccountsLocalWithEmail() { + var ( + ctx = context.Background() + origin = "local" + status = "" + mods = false + invitedBy = "" + username = "" + displayName = "" + domain = "" + email = "tortle.dude@example.org" + ip netip.Addr + page = &paging.Page{ + Limit: 100, + } + ) + + accounts, err := suite.db.GetAccounts( + ctx, + origin, + status, + mods, + invitedBy, + username, + displayName, + domain, + email, + ip, + page, + ) + if err != nil { + suite.FailNow(err.Error()) + } + + suite.Len(accounts, 1) +} + +func (suite *AccountTestSuite) TestGetAccountsWithIP() { + var ( + ctx = context.Background() + origin = "" + status = "" + mods = false + invitedBy = "" + username = "" + displayName = "" + domain = "" + email = "" + ip = netip.MustParseAddr("199.222.111.89") + page = &paging.Page{ + Limit: 100, + } + ) + + accounts, err := suite.db.GetAccounts( + ctx, + origin, + status, + mods, + invitedBy, + username, + displayName, + domain, + email, + ip, + page, + ) + if err != nil { + suite.FailNow(err.Error()) + } + + suite.Len(accounts, 1) +} + +func (suite *AccountTestSuite) TestGetPendingAccounts() { + var ( + ctx = context.Background() + origin = "" + status = "pending" + mods = false + invitedBy = "" + username = "" + displayName = "" + domain = "" + email = "" + ip netip.Addr + page = &paging.Page{ + Limit: 100, + } + ) + + accounts, err := suite.db.GetAccounts( + ctx, + origin, + status, + mods, + invitedBy, + username, + displayName, + domain, + email, + ip, + page, + ) + if err != nil { + suite.FailNow(err.Error()) + } + + suite.Len(accounts, 1) +} + func TestAccountTestSuite(t *testing.T) { suite.Run(t, new(AccountTestSuite)) } diff --git a/internal/db/bundb/user.go b/internal/db/bundb/user.go index 2854c0caa..f0221eeb1 100644 --- a/internal/db/bundb/user.go +++ b/internal/db/bundb/user.go @@ -230,3 +230,23 @@ func (u *userDB) DeleteUserByID(ctx context.Context, userID string) error { Exec(ctx) return err } + +func (u *userDB) PutDeniedUser(ctx context.Context, deniedUser *gtsmodel.DeniedUser) error { + _, err := u.db.NewInsert(). + Model(deniedUser). + Exec(ctx) + return err +} + +func (u *userDB) GetDeniedUserByID(ctx context.Context, id string) (*gtsmodel.DeniedUser, error) { + deniedUser := new(gtsmodel.DeniedUser) + if err := u.db. + NewSelect(). + Model(deniedUser). + Where("? = ?", bun.Ident("denied_user.id"), id). + Scan(ctx); err != nil { + return nil, err + } + + return deniedUser, nil +} diff --git a/internal/db/user.go b/internal/db/user.go index c762ef2b3..28fa59130 100644 --- a/internal/db/user.go +++ b/internal/db/user.go @@ -54,4 +54,10 @@ type User interface { // DeleteUserByID deletes one user by its ID. DeleteUserByID(ctx context.Context, userID string) error + + // PutDeniedUser inserts the given deniedUser into the db. + PutDeniedUser(ctx context.Context, deniedUser *gtsmodel.DeniedUser) error + + // GetDeniedUserByID returns one denied user with the given ID. + GetDeniedUserByID(ctx context.Context, id string) (*gtsmodel.DeniedUser, error) } diff --git a/internal/email/email_test.go b/internal/email/email_test.go index 34d0d1c2f..b57562cb5 100644 --- a/internal/email/email_test.go +++ b/internal/email/email_test.go @@ -50,7 +50,7 @@ func (suite *EmailTestSuite) TestTemplateConfirm() { suite.sender.SendConfirmEmail("user@example.org", confirmData) suite.Len(suite.sentEmails, 1) - suite.Equal("To: user@example.org\r\nFrom: test@example.org\r\nSubject: GoToSocial Email Confirmation\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 8bit\r\nContent-Type: text/plain; charset=\"UTF-8\"\r\n\r\nHello test!\r\n\r\nYou are receiving this mail because you've requested an account on https://example.org.\r\n\r\nTo use your account, you must confirm that this is your email address.\r\n\r\nTo confirm your email, paste the following in your browser's address bar:\r\n\r\nhttps://example.org/confirm_email?token=ee24f71d-e615-43f9-afae-385c0799b7fa\r\n\r\nIf you believe you've been sent this email in error, feel free to ignore it, or contact the administrator of https://example.org.\r\n\r\n", suite.sentEmails["user@example.org"]) + suite.Equal("To: user@example.org\r\nFrom: test@example.org\r\nSubject: GoToSocial Email Confirmation\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 8bit\r\nContent-Type: text/plain; charset=\"UTF-8\"\r\n\r\nHello test!\r\n\r\nYou are receiving this mail because you've requested an account on https://example.org.\r\n\r\nTo use your account, you must confirm that this is your email address.\r\n\r\nTo confirm your email, paste the following in your browser's address bar:\r\n\r\nhttps://example.org/confirm_email?token=ee24f71d-e615-43f9-afae-385c0799b7fa\r\n\r\n---\r\n\r\nIf you believe you've been sent this email in error, feel free to ignore it, or contact the administrator of https://example.org.\r\n\r\n", suite.sentEmails["user@example.org"]) } func (suite *EmailTestSuite) TestTemplateReset() { @@ -63,7 +63,7 @@ func (suite *EmailTestSuite) TestTemplateReset() { suite.sender.SendResetEmail("user@example.org", resetData) suite.Len(suite.sentEmails, 1) - suite.Equal("To: user@example.org\r\nFrom: test@example.org\r\nSubject: GoToSocial Password Reset\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 8bit\r\nContent-Type: text/plain; charset=\"UTF-8\"\r\n\r\nHello test!\r\n\r\nYou are receiving this mail because a password reset has been requested for your account on https://example.org.\r\n\r\nTo reset your password, paste the following in your browser's address bar:\r\n\r\nhttps://example.org/reset_email?token=ee24f71d-e615-43f9-afae-385c0799b7fa\r\n\r\nIf you believe you've been sent this email in error, feel free to ignore it, or contact the administrator of https://example.org.\r\n\r\n", suite.sentEmails["user@example.org"]) + suite.Equal("To: user@example.org\r\nFrom: test@example.org\r\nSubject: GoToSocial Password Reset\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 8bit\r\nContent-Type: text/plain; charset=\"UTF-8\"\r\n\r\nHello test!\r\n\r\nYou are receiving this mail because a password reset has been requested for your account on https://example.org.\r\n\r\nTo reset your password, paste the following in your browser's address bar:\r\n\r\nhttps://example.org/reset_email?token=ee24f71d-e615-43f9-afae-385c0799b7fa\r\n\r\n---\r\n\r\nIf you believe you've been sent this email in error, feel free to ignore it, or contact the administrator of https://example.org.\r\n\r\n", suite.sentEmails["user@example.org"]) } func (suite *EmailTestSuite) TestTemplateReportRemoteToLocal() { @@ -166,7 +166,7 @@ func (suite *EmailTestSuite) TestTemplateReportClosedOK() { suite.FailNow(err.Error()) } suite.Len(suite.sentEmails, 1) - suite.Equal("To: user@example.org\r\nFrom: test@example.org\r\nSubject: GoToSocial Report Closed\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 8bit\r\nContent-Type: text/plain; charset=\"UTF-8\"\r\n\r\nHello !\r\n\r\nYou recently reported the account @foss_satan@fossbros-anonymous.io to the moderator(s) of Test Instance (https://example.org).\r\n\r\nThe report you submitted has now been closed.\r\n\r\nThe moderator who closed the report left the following comment: User was yeeted. Thank you for reporting!\r\n\r\n", suite.sentEmails["user@example.org"]) + suite.Equal("To: user@example.org\r\nFrom: test@example.org\r\nSubject: GoToSocial Report Closed\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 8bit\r\nContent-Type: text/plain; charset=\"UTF-8\"\r\n\r\nHello !\r\n\r\nYou recently reported the account @foss_satan@fossbros-anonymous.io to the moderator(s) of Test Instance (https://example.org).\r\n\r\nThe report you submitted has now been closed.\r\n\r\nThe moderator who closed the report left the following comment: User was yeeted. Thank you for reporting!\r\n\r\n---\r\n\r\nIf you believe you've been sent this email in error, feel free to ignore it, or contact the administrator of https://example.org.\r\n\r\n", suite.sentEmails["user@example.org"]) } func (suite *EmailTestSuite) TestTemplateReportClosedLocalAccountNoComment() { @@ -182,7 +182,7 @@ func (suite *EmailTestSuite) TestTemplateReportClosedLocalAccountNoComment() { suite.FailNow(err.Error()) } suite.Len(suite.sentEmails, 1) - suite.Equal("To: user@example.org\r\nFrom: test@example.org\r\nSubject: GoToSocial Report Closed\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 8bit\r\nContent-Type: text/plain; charset=\"UTF-8\"\r\n\r\nHello !\r\n\r\nYou recently reported the account @1happyturtle to the moderator(s) of Test Instance (https://example.org).\r\n\r\nThe report you submitted has now been closed.\r\n\r\nThe moderator who closed the report did not leave a comment.\r\n\r\n", suite.sentEmails["user@example.org"]) + suite.Equal("To: user@example.org\r\nFrom: test@example.org\r\nSubject: GoToSocial Report Closed\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 8bit\r\nContent-Type: text/plain; charset=\"UTF-8\"\r\n\r\nHello !\r\n\r\nYou recently reported the account @1happyturtle to the moderator(s) of Test Instance (https://example.org).\r\n\r\nThe report you submitted has now been closed.\r\n\r\nThe moderator who closed the report did not leave a comment.\r\n\r\n---\r\n\r\nIf you believe you've been sent this email in error, feel free to ignore it, or contact the administrator of https://example.org.\r\n\r\n", suite.sentEmails["user@example.org"]) } func TestEmailTestSuite(t *testing.T) { diff --git a/internal/email/noopsender.go b/internal/email/noopsender.go index 44aa86dba..20d7df2eb 100644 --- a/internal/email/noopsender.go +++ b/internal/email/noopsender.go @@ -72,6 +72,14 @@ func (s *noopSender) SendNewSignupEmail(toAddresses []string, data NewSignupData return s.sendTemplate(newSignupTemplate, newSignupSubject, data, toAddresses...) } +func (s *noopSender) SendSignupApprovedEmail(toAddress string, data SignupApprovedData) error { + return s.sendTemplate(signupApprovedTemplate, signupApprovedSubject, data, toAddress) +} + +func (s *noopSender) SendSignupRejectedEmail(toAddress string, data SignupRejectedData) error { + return s.sendTemplate(signupRejectedTemplate, signupRejectedSubject, data, toAddress) +} + func (s *noopSender) sendTemplate(template string, subject string, data any, toAddresses ...string) error { buf := &bytes.Buffer{} if err := s.template.ExecuteTemplate(buf, template, data); err != nil { diff --git a/internal/email/sender.go b/internal/email/sender.go index 78338a0dd..a3efa6124 100644 --- a/internal/email/sender.go +++ b/internal/email/sender.go @@ -53,6 +53,14 @@ type Sender interface { // It is expected that the toAddresses have already been filtered to ensure // that they all belong to active admins + moderators. SendNewSignupEmail(toAddress []string, data NewSignupData) error + + // SendSignupApprovedEmail sends an email to the given address + // that their sign-up request has been approved by a moderator. + SendSignupApprovedEmail(toAddress string, data SignupApprovedData) error + + // SendSignupRejectedEmail sends an email to the given address + // that their sign-up request has been rejected by a moderator. + SendSignupRejectedEmail(toAddress string, data SignupRejectedData) error } // NewSender returns a new email Sender interface with the given configuration, or an error if something goes wrong. diff --git a/internal/email/signup.go b/internal/email/signup.go index 84162c21e..2eaffc8a9 100644 --- a/internal/email/signup.go +++ b/internal/email/signup.go @@ -40,3 +40,39 @@ type NewSignupData struct { func (s *sender) SendNewSignupEmail(toAddresses []string, data NewSignupData) error { return s.sendTemplate(newSignupTemplate, newSignupSubject, data, toAddresses...) } + +var ( + signupApprovedTemplate = "email_signup_approved.tmpl" + signupApprovedSubject = "GoToSocial Sign-Up Approved" +) + +type SignupApprovedData struct { + // Username to be addressed. + Username string + // URL of the instance to present to the receiver. + InstanceURL string + // Name of the instance to present to the receiver. + InstanceName string +} + +func (s *sender) SendSignupApprovedEmail(toAddress string, data SignupApprovedData) error { + return s.sendTemplate(signupApprovedTemplate, signupApprovedSubject, data, toAddress) +} + +var ( + signupRejectedTemplate = "email_signup_rejected.tmpl" + signupRejectedSubject = "GoToSocial Sign-Up Rejected" +) + +type SignupRejectedData struct { + // Message to the rejected applicant. + Message string + // URL of the instance to present to the receiver. + InstanceURL string + // Name of the instance to present to the receiver. + InstanceName string +} + +func (s *sender) SendSignupRejectedEmail(toAddress string, data SignupRejectedData) error { + return s.sendTemplate(signupRejectedTemplate, signupRejectedSubject, data, toAddress) +} diff --git a/internal/processing/admin/account.go b/internal/processing/admin/accountaction.go similarity index 100% rename from internal/processing/admin/account.go rename to internal/processing/admin/accountaction.go diff --git a/internal/processing/admin/accountapprove.go b/internal/processing/admin/accountapprove.go new file mode 100644 index 000000000..e34cb18e3 --- /dev/null +++ b/internal/processing/admin/accountapprove.go @@ -0,0 +1,79 @@ +// GoToSocial +// Copyright (C) GoToSocial Authors admin@gotosocial.org +// SPDX-License-Identifier: AGPL-3.0-or-later +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package admin + +import ( + "context" + "errors" + "fmt" + + "github.com/superseriousbusiness/gotosocial/internal/ap" + apimodel "github.com/superseriousbusiness/gotosocial/internal/api/model" + "github.com/superseriousbusiness/gotosocial/internal/db" + "github.com/superseriousbusiness/gotosocial/internal/gtserror" + "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" + "github.com/superseriousbusiness/gotosocial/internal/messages" +) + +func (p *Processor) AccountApprove( + ctx context.Context, + adminAcct *gtsmodel.Account, + accountID string, +) (*apimodel.AdminAccountInfo, gtserror.WithCode) { + user, err := p.state.DB.GetUserByAccountID(ctx, accountID) + if err != nil && !errors.Is(err, db.ErrNoEntries) { + err := gtserror.Newf("db error getting user for account id %s: %w", accountID, err) + return nil, gtserror.NewErrorInternalError(err) + } + + if user == nil { + err := fmt.Errorf("user for account %s not found", accountID) + return nil, gtserror.NewErrorNotFound(err, err.Error()) + } + + // Get a lock on the account URI, + // to ensure it's not also being + // rejected at the same time! + unlock := p.state.ClientLocks.Lock(user.Account.URI) + defer unlock() + + if !*user.Approved { + // Process approval side effects asynschronously. + p.state.Workers.EnqueueClientAPI(ctx, messages.FromClientAPI{ + APObjectType: ap.ActorPerson, + APActivityType: ap.ActivityAccept, + GTSModel: user, + OriginAccount: adminAcct, + TargetAccount: user.Account, + }) + } + + apiAccount, err := p.converter.AccountToAdminAPIAccount(ctx, user.Account) + if err != nil { + err := gtserror.Newf("error converting account %s to admin api model: %w", accountID, err) + return nil, gtserror.NewErrorInternalError(err) + } + + // Optimistically set approved to true and + // clear sign-up IP to reflect state that + // will be produced by side effects. + apiAccount.Approved = true + apiAccount.IP = nil + + return apiAccount, nil +} diff --git a/internal/processing/admin/accountapprove_test.go b/internal/processing/admin/accountapprove_test.go new file mode 100644 index 000000000..b6ca1ed32 --- /dev/null +++ b/internal/processing/admin/accountapprove_test.go @@ -0,0 +1,75 @@ +// GoToSocial +// Copyright (C) GoToSocial Authors admin@gotosocial.org +// SPDX-License-Identifier: AGPL-3.0-or-later +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package admin_test + +import ( + "context" + "testing" + + "github.com/stretchr/testify/suite" + "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" + "github.com/superseriousbusiness/gotosocial/testrig" +) + +type AdminApproveTestSuite struct { + AdminStandardTestSuite +} + +func (suite *AdminApproveTestSuite) TestApprove() { + var ( + ctx = context.Background() + adminAcct = suite.testAccounts["admin_account"] + targetAcct = suite.testAccounts["unconfirmed_account"] + targetUser = new(gtsmodel.User) + ) + + // Copy user since we're modifying it. + *targetUser = *suite.testUsers["unconfirmed_account"] + + // Approve the sign-up. + acct, errWithCode := suite.adminProcessor.AccountApprove( + ctx, + adminAcct, + targetAcct.ID, + ) + if errWithCode != nil { + suite.FailNow(errWithCode.Error()) + } + + // Account should be approved. + suite.NotNil(acct) + suite.True(acct.Approved) + suite.Nil(acct.IP) + + // Wait for processor to + // handle side effects. + var ( + dbUser *gtsmodel.User + err error + ) + if !testrig.WaitFor(func() bool { + dbUser, err = suite.state.DB.GetUserByID(ctx, targetUser.ID) + return err == nil && dbUser != nil && *dbUser.Approved + }) { + suite.FailNow("waiting for approved user") + } +} + +func TestAdminApproveTestSuite(t *testing.T) { + suite.Run(t, new(AdminApproveTestSuite)) +} diff --git a/internal/processing/admin/accountget.go b/internal/processing/admin/accountget.go new file mode 100644 index 000000000..5a3c34c62 --- /dev/null +++ b/internal/processing/admin/accountget.go @@ -0,0 +1,49 @@ +// GoToSocial +// Copyright (C) GoToSocial Authors admin@gotosocial.org +// SPDX-License-Identifier: AGPL-3.0-or-later +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package admin + +import ( + "context" + "errors" + "fmt" + + apimodel "github.com/superseriousbusiness/gotosocial/internal/api/model" + "github.com/superseriousbusiness/gotosocial/internal/db" + "github.com/superseriousbusiness/gotosocial/internal/gtserror" +) + +func (p *Processor) AccountGet(ctx context.Context, accountID string) (*apimodel.AdminAccountInfo, gtserror.WithCode) { + account, err := p.state.DB.GetAccountByID(ctx, accountID) + if err != nil && !errors.Is(err, db.ErrNoEntries) { + err := gtserror.Newf("db error getting account %s: %w", accountID, err) + return nil, gtserror.NewErrorInternalError(err) + } + + if account == nil { + err := fmt.Errorf("account %s not found", accountID) + return nil, gtserror.NewErrorNotFound(err, err.Error()) + } + + apiAccount, err := p.converter.AccountToAdminAPIAccount(ctx, account) + if err != nil { + err := gtserror.Newf("error converting account %s to admin api model: %w", accountID, err) + return nil, gtserror.NewErrorInternalError(err) + } + + return apiAccount, nil +} diff --git a/internal/processing/admin/accountreject.go b/internal/processing/admin/accountreject.go new file mode 100644 index 000000000..bc7a1c20a --- /dev/null +++ b/internal/processing/admin/accountreject.go @@ -0,0 +1,113 @@ +// GoToSocial +// Copyright (C) GoToSocial Authors admin@gotosocial.org +// SPDX-License-Identifier: AGPL-3.0-or-later +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package admin + +import ( + "context" + "errors" + "fmt" + + "github.com/superseriousbusiness/gotosocial/internal/ap" + apimodel "github.com/superseriousbusiness/gotosocial/internal/api/model" + "github.com/superseriousbusiness/gotosocial/internal/db" + "github.com/superseriousbusiness/gotosocial/internal/gtserror" + "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" + "github.com/superseriousbusiness/gotosocial/internal/messages" +) + +func (p *Processor) AccountReject( + ctx context.Context, + adminAcct *gtsmodel.Account, + accountID string, + privateComment string, + sendEmail bool, + message string, +) (*apimodel.AdminAccountInfo, gtserror.WithCode) { + user, err := p.state.DB.GetUserByAccountID(ctx, accountID) + if err != nil && !errors.Is(err, db.ErrNoEntries) { + err := gtserror.Newf("db error getting user for account id %s: %w", accountID, err) + return nil, gtserror.NewErrorInternalError(err) + } + + if user == nil { + err := fmt.Errorf("user for account %s not found", accountID) + return nil, gtserror.NewErrorNotFound(err, err.Error()) + } + + // Get a lock on the account URI, + // since we're going to be deleting + // it and its associated user. + unlock := p.state.ClientLocks.Lock(user.Account.URI) + defer unlock() + + // Can't reject an account with a + // user that's already been approved. + if *user.Approved { + err := fmt.Errorf("account %s has already been approved", accountID) + return nil, gtserror.NewErrorUnprocessableEntity(err, err.Error()) + } + + // Convert to API account *before* doing the + // rejection, since the rejection will cause + // the user and account to be removed. + apiAccount, err := p.converter.AccountToAdminAPIAccount(ctx, user.Account) + if err != nil { + err := gtserror.Newf("error converting account %s to admin api model: %w", accountID, err) + return nil, gtserror.NewErrorInternalError(err) + } + + // Set approved to false on the API model, to + // reflect the changes that will occur + // asynchronously in the processor. + apiAccount.Approved = false + + // Ensure we an email address. + var email string + if user.Email != "" { + email = user.Email + } else { + email = user.UnconfirmedEmail + } + + // Create a denied user entry for + // the worker to process + store. + deniedUser := >smodel.DeniedUser{ + ID: user.ID, + Email: email, + Username: user.Account.Username, + SignUpIP: user.SignUpIP, + InviteID: user.InviteID, + Locale: user.Locale, + CreatedByApplicationID: user.CreatedByApplicationID, + SignUpReason: user.Reason, + PrivateComment: privateComment, + SendEmail: &sendEmail, + Message: message, + } + + // Process rejection side effects asynschronously. + p.state.Workers.EnqueueClientAPI(ctx, messages.FromClientAPI{ + APObjectType: ap.ActorPerson, + APActivityType: ap.ActivityReject, + GTSModel: deniedUser, + OriginAccount: adminAcct, + TargetAccount: user.Account, + }) + + return apiAccount, nil +} diff --git a/internal/processing/admin/accountreject_test.go b/internal/processing/admin/accountreject_test.go new file mode 100644 index 000000000..071401afc --- /dev/null +++ b/internal/processing/admin/accountreject_test.go @@ -0,0 +1,142 @@ +// GoToSocial +// Copyright (C) GoToSocial Authors admin@gotosocial.org +// SPDX-License-Identifier: AGPL-3.0-or-later +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package admin_test + +import ( + "context" + "testing" + + "github.com/stretchr/testify/suite" + "github.com/superseriousbusiness/gotosocial/internal/db" + "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" + "github.com/superseriousbusiness/gotosocial/testrig" +) + +type AdminRejectTestSuite struct { + AdminStandardTestSuite +} + +func (suite *AdminRejectTestSuite) TestReject() { + var ( + ctx = context.Background() + adminAcct = suite.testAccounts["admin_account"] + targetAcct = suite.testAccounts["unconfirmed_account"] + targetUser = suite.testUsers["unconfirmed_account"] + privateComment = "It's a no from me chief." + sendEmail = true + message = "Too stinky." + ) + + acct, errWithCode := suite.adminProcessor.AccountReject( + ctx, + adminAcct, + targetAcct.ID, + privateComment, + sendEmail, + message, + ) + if errWithCode != nil { + suite.FailNow(errWithCode.Error()) + } + suite.NotNil(acct) + suite.False(acct.Approved) + + // Wait for processor to + // handle side effects. + var ( + deniedUser *gtsmodel.DeniedUser + err error + ) + if !testrig.WaitFor(func() bool { + deniedUser, err = suite.state.DB.GetDeniedUserByID(ctx, targetUser.ID) + return deniedUser != nil && err == nil + }) { + suite.FailNow("waiting for denied user") + } + + // Ensure fields as expected. + suite.Equal(targetUser.ID, deniedUser.ID) + suite.Equal(targetUser.UnconfirmedEmail, deniedUser.Email) + suite.Equal(targetAcct.Username, deniedUser.Username) + suite.Equal(targetUser.SignUpIP, deniedUser.SignUpIP) + suite.Equal(targetUser.InviteID, deniedUser.InviteID) + suite.Equal(targetUser.Locale, deniedUser.Locale) + suite.Equal(targetUser.CreatedByApplicationID, deniedUser.CreatedByApplicationID) + suite.Equal(targetUser.Reason, deniedUser.SignUpReason) + suite.Equal(privateComment, deniedUser.PrivateComment) + suite.Equal(sendEmail, *deniedUser.SendEmail) + suite.Equal(message, deniedUser.Message) + + // Should be no user entry for + // this denied request now. + _, err = suite.state.DB.GetUserByID(ctx, targetUser.ID) + suite.ErrorIs(db.ErrNoEntries, err) + + // Should be no account entry for + // this denied request now. + _, err = suite.state.DB.GetAccountByID(ctx, targetAcct.ID) + suite.ErrorIs(db.ErrNoEntries, err) +} + +func (suite *AdminRejectTestSuite) TestRejectRemote() { + var ( + ctx = context.Background() + adminAcct = suite.testAccounts["admin_account"] + targetAcct = suite.testAccounts["remote_account_1"] + privateComment = "It's a no from me chief." + sendEmail = true + message = "Too stinky." + ) + + // Try to reject a remote account. + _, err := suite.adminProcessor.AccountReject( + ctx, + adminAcct, + targetAcct.ID, + privateComment, + sendEmail, + message, + ) + suite.EqualError(err, "user for account 01F8MH5ZK5VRH73AKHQM6Y9VNX not found") +} + +func (suite *AdminRejectTestSuite) TestRejectApproved() { + var ( + ctx = context.Background() + adminAcct = suite.testAccounts["admin_account"] + targetAcct = suite.testAccounts["local_account_1"] + privateComment = "It's a no from me chief." + sendEmail = true + message = "Too stinky." + ) + + // Try to reject an already-approved account. + _, err := suite.adminProcessor.AccountReject( + ctx, + adminAcct, + targetAcct.ID, + privateComment, + sendEmail, + message, + ) + suite.EqualError(err, "account 01F8MH1H7YV1Z7D2C8K2730QBF has already been approved") +} + +func TestAdminRejectTestSuite(t *testing.T) { + suite.Run(t, new(AdminRejectTestSuite)) +} diff --git a/internal/processing/admin/accounts.go b/internal/processing/admin/accounts.go new file mode 100644 index 000000000..ca35b0a30 --- /dev/null +++ b/internal/processing/admin/accounts.go @@ -0,0 +1,272 @@ +// GoToSocial +// Copyright (C) GoToSocial Authors admin@gotosocial.org +// SPDX-License-Identifier: AGPL-3.0-or-later +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package admin + +import ( + "context" + "errors" + "fmt" + "net/netip" + "net/url" + "slices" + + apimodel "github.com/superseriousbusiness/gotosocial/internal/api/model" + apiutil "github.com/superseriousbusiness/gotosocial/internal/api/util" + "github.com/superseriousbusiness/gotosocial/internal/db" + "github.com/superseriousbusiness/gotosocial/internal/gtserror" + "github.com/superseriousbusiness/gotosocial/internal/log" + "github.com/superseriousbusiness/gotosocial/internal/paging" +) + +var ( + accountsValidOrigins = []string{"local", "remote"} + accountsValidStatuses = []string{"active", "pending", "disabled", "silenced", "suspended"} + accountsValidPermissions = []string{"staff"} +) + +func (p *Processor) AccountsGet( + ctx context.Context, + request *apimodel.AdminGetAccountsRequest, + page *paging.Page, +) ( + *apimodel.PageableResponse, + gtserror.WithCode, +) { + // Validate "origin". + if v := request.Origin; v != "" { + if !slices.Contains(accountsValidOrigins, v) { + err := fmt.Errorf( + "origin %s not recognized; valid choices are %+v", + v, accountsValidOrigins, + ) + return nil, gtserror.NewErrorBadRequest(err, err.Error()) + } + } + + // Validate "status". + if v := request.Status; v != "" { + if !slices.Contains(accountsValidStatuses, v) { + err := fmt.Errorf( + "status %s not recognized; valid choices are %+v", + v, accountsValidStatuses, + ) + return nil, gtserror.NewErrorBadRequest(err, err.Error()) + } + } + + // Validate "permissions". + if v := request.Permissions; v != "" { + if !slices.Contains(accountsValidPermissions, v) { + err := fmt.Errorf( + "permissions %s not recognized; valid choices are %+v", + v, accountsValidPermissions, + ) + return nil, gtserror.NewErrorBadRequest(err, err.Error()) + } + } + + // Validate/parse IP. + var ip netip.Addr + if v := request.IP; v != "" { + var err error + ip, err = netip.ParseAddr(request.IP) + if err != nil { + err := fmt.Errorf("invalid ip provided: %w", err) + return nil, gtserror.NewErrorBadRequest(err, err.Error()) + } + } + + // Get accounts with the given params. + accounts, err := p.state.DB.GetAccounts( + ctx, + request.Origin, + request.Status, + func() bool { return request.Permissions == "staff" }(), + request.InvitedBy, + request.Username, + request.DisplayName, + request.ByDomain, + request.Email, + ip, + page, + ) + if err != nil && !errors.Is(err, db.ErrNoEntries) { + err = gtserror.Newf("db error getting accounts: %w", err) + return nil, gtserror.NewErrorInternalError(err) + } + + count := len(accounts) + if count == 0 { + return paging.EmptyResponse(), nil + } + + hi := accounts[count-1].ID + lo := accounts[0].ID + + items := make([]interface{}, 0, count) + for _, account := range accounts { + apiAccount, err := p.converter.AccountToAdminAPIAccount(ctx, account) + if err != nil { + log.Errorf(ctx, "error converting to api account: %v", err) + continue + } + items = append(items, apiAccount) + } + + // Return packaging + paging appropriate for + // the API version used to call this function. + switch request.APIVersion { + case 1: + return packageAccountsV1(items, lo, hi, request, page) + + case 2: + return packageAccountsV2(items, lo, hi, request, page) + + default: + log.Panic(ctx, "api version was neither 1 nor 2") + return nil, nil + } +} + +func packageAccountsV1( + items []interface{}, + loID, hiID string, + request *apimodel.AdminGetAccountsRequest, + page *paging.Page, +) (*apimodel.PageableResponse, gtserror.WithCode) { + queryParams := make(url.Values, 8) + + // Translate origin to v1. + if v := request.Origin; v != "" { + var k string + + if v == "local" { + k = apiutil.LocalKey + } else { + k = apiutil.AdminRemoteKey + } + + queryParams.Add(k, "true") + } + + // Translate status to v1. + if v := request.Status; v != "" { + var k string + + switch v { + case "active": + k = apiutil.AdminActiveKey + case "pending": + k = apiutil.AdminPendingKey + case "disabled": + k = apiutil.AdminDisabledKey + case "silenced": + k = apiutil.AdminSilencedKey + case "suspended": + k = apiutil.AdminSuspendedKey + } + + queryParams.Add(k, "true") + } + + if v := request.Username; v != "" { + queryParams.Add(apiutil.UsernameKey, v) + } + + if v := request.DisplayName; v != "" { + queryParams.Add(apiutil.AdminDisplayNameKey, v) + } + + if v := request.ByDomain; v != "" { + queryParams.Add(apiutil.AdminByDomainKey, v) + } + + if v := request.Email; v != "" { + queryParams.Add(apiutil.AdminEmailKey, v) + } + + if v := request.IP; v != "" { + queryParams.Add(apiutil.AdminIPKey, v) + } + + // Translate permissions to v1. + if v := request.Permissions; v != "" { + queryParams.Add(apiutil.AdminStaffKey, v) + } + + return paging.PackageResponse(paging.ResponseParams{ + Items: items, + Path: "/api/v1/admin/accounts", + Next: page.Next(loID, hiID), + Prev: page.Prev(loID, hiID), + Query: queryParams, + }), nil +} + +func packageAccountsV2( + items []interface{}, + loID, hiID string, + request *apimodel.AdminGetAccountsRequest, + page *paging.Page, +) (*apimodel.PageableResponse, gtserror.WithCode) { + queryParams := make(url.Values, 9) + + if v := request.Origin; v != "" { + queryParams.Add(apiutil.AdminOriginKey, v) + } + + if v := request.Status; v != "" { + queryParams.Add(apiutil.AdminStatusKey, v) + } + + if v := request.Permissions; v != "" { + queryParams.Add(apiutil.AdminPermissionsKey, v) + } + + if v := request.InvitedBy; v != "" { + queryParams.Add(apiutil.AdminInvitedByKey, v) + } + + if v := request.Username; v != "" { + queryParams.Add(apiutil.UsernameKey, v) + } + + if v := request.DisplayName; v != "" { + queryParams.Add(apiutil.AdminDisplayNameKey, v) + } + + if v := request.ByDomain; v != "" { + queryParams.Add(apiutil.AdminByDomainKey, v) + } + + if v := request.Email; v != "" { + queryParams.Add(apiutil.AdminEmailKey, v) + } + + if v := request.IP; v != "" { + queryParams.Add(apiutil.AdminIPKey, v) + } + + return paging.PackageResponse(paging.ResponseParams{ + Items: items, + Path: "/api/v2/admin/accounts", + Next: page.Next(loID, hiID), + Prev: page.Prev(loID, hiID), + Query: queryParams, + }), nil +} diff --git a/internal/processing/workers/fromclientapi.go b/internal/processing/workers/fromclientapi.go index ed513c331..37c330cf0 100644 --- a/internal/processing/workers/fromclientapi.go +++ b/internal/processing/workers/fromclientapi.go @@ -33,6 +33,7 @@ import ( "github.com/superseriousbusiness/gotosocial/internal/processing/account" "github.com/superseriousbusiness/gotosocial/internal/state" "github.com/superseriousbusiness/gotosocial/internal/typeutils" + "github.com/superseriousbusiness/gotosocial/internal/util" ) // clientAPI wraps processing functions @@ -141,6 +142,10 @@ func (p *Processor) ProcessFromClientAPI(ctx context.Context, cMsg messages.From // ACCEPT FOLLOW (request) case ap.ActivityFollow: return p.clientAPI.AcceptFollow(ctx, cMsg) + + // ACCEPT PROFILE/ACCOUNT (sign-up) + case ap.ObjectProfile, ap.ActorPerson: + return p.clientAPI.AcceptAccount(ctx, cMsg) } // REJECT SOMETHING @@ -150,6 +155,10 @@ func (p *Processor) ProcessFromClientAPI(ctx context.Context, cMsg messages.From // REJECT FOLLOW (request) case ap.ActivityFollow: return p.clientAPI.RejectFollowRequest(ctx, cMsg) + + // REJECT PROFILE/ACCOUNT (sign-up) + case ap.ObjectProfile, ap.ActorPerson: + return p.clientAPI.RejectAccount(ctx, cMsg) } // UNDO SOMETHING @@ -685,3 +694,66 @@ func (p *clientAPI) MoveAccount(ctx context.Context, cMsg messages.FromClientAPI return nil } + +func (p *clientAPI) AcceptAccount(ctx context.Context, cMsg messages.FromClientAPI) error { + newUser, ok := cMsg.GTSModel.(*gtsmodel.User) + if !ok { + return gtserror.Newf("%T not parseable as *gtsmodel.User", cMsg.GTSModel) + } + + // Mark user as approved + clear sign-up IP. + newUser.Approved = util.Ptr(true) + newUser.SignUpIP = nil + if err := p.state.DB.UpdateUser(ctx, newUser, "approved", "sign_up_ip"); err != nil { + // Error now means we should return without + // sending email + let admin try to approve again. + return gtserror.Newf("db error updating user %s: %w", newUser.ID, err) + } + + // Send "your sign-up has been approved" email to the new user. + if err := p.surface.emailUserSignupApproved(ctx, newUser); err != nil { + log.Errorf(ctx, "error emailing: %v", err) + } + + return nil +} + +func (p *clientAPI) RejectAccount(ctx context.Context, cMsg messages.FromClientAPI) error { + deniedUser, ok := cMsg.GTSModel.(*gtsmodel.DeniedUser) + if !ok { + return gtserror.Newf("%T not parseable as *gtsmodel.DeniedUser", cMsg.GTSModel) + } + + // Remove the account. + if err := p.state.DB.DeleteAccount(ctx, cMsg.TargetAccount.ID); err != nil { + log.Errorf(ctx, + "db error deleting account %s: %v", + cMsg.TargetAccount.ID, err, + ) + } + + // Remove the user. + if err := p.state.DB.DeleteUserByID(ctx, deniedUser.ID); err != nil { + log.Errorf(ctx, + "db error deleting user %s: %v", + deniedUser.ID, err, + ) + } + + // Store the deniedUser entry. + if err := p.state.DB.PutDeniedUser(ctx, deniedUser); err != nil { + log.Errorf(ctx, + "db error putting denied user %s: %v", + deniedUser.ID, err, + ) + } + + if *deniedUser.SendEmail { + // Send "your sign-up has been rejected" email to the denied user. + if err := p.surface.emailUserSignupRejected(ctx, deniedUser); err != nil { + log.Errorf(ctx, "error emailing: %v", err) + } + } + + return nil +} diff --git a/internal/processing/workers/surfaceemail.go b/internal/processing/workers/surfaceemail.go index c00b22c86..3a5b5e7f4 100644 --- a/internal/processing/workers/surfaceemail.go +++ b/internal/processing/workers/surfaceemail.go @@ -129,6 +129,69 @@ func (s *surface) emailUserPleaseConfirm(ctx context.Context, user *gtsmodel.Use return nil } +// emailUserSignupApproved emails the given user +// to inform them their sign-up has been approved. +func (s *surface) emailUserSignupApproved(ctx context.Context, user *gtsmodel.User) error { + // User may have been approved without + // their email address being confirmed + // yet. Just send to whatever we have. + emailAddr := user.Email + if emailAddr == "" { + emailAddr = user.UnconfirmedEmail + } + + instance, err := s.state.DB.GetInstance(ctx, config.GetHost()) + if err != nil { + return gtserror.Newf("db error getting instance: %w", err) + } + + // Assemble email contents and send the email. + if err := s.emailSender.SendSignupApprovedEmail( + emailAddr, + email.SignupApprovedData{ + Username: user.Account.Username, + InstanceURL: instance.URI, + InstanceName: instance.Title, + }, + ); err != nil { + return err + } + + // Email sent, update the user + // entry with the emailed time. + now := time.Now() + user.LastEmailedAt = now + + if err := s.state.DB.UpdateUser( + ctx, + user, + "last_emailed_at", + ); err != nil { + return gtserror.Newf("error updating user entry after email sent: %w", err) + } + + return nil +} + +// emailUserSignupApproved emails the given user +// to inform them their sign-up has been approved. +func (s *surface) emailUserSignupRejected(ctx context.Context, deniedUser *gtsmodel.DeniedUser) error { + instance, err := s.state.DB.GetInstance(ctx, config.GetHost()) + if err != nil { + return gtserror.Newf("db error getting instance: %w", err) + } + + // Assemble email contents and send the email. + return s.emailSender.SendSignupRejectedEmail( + deniedUser.Email, + email.SignupRejectedData{ + Message: deniedUser.Message, + InstanceURL: instance.URI, + InstanceName: instance.Title, + }, + ) +} + // emailAdminReportOpened emails all active moderators/admins // of this instance that a new report has been created. func (s *surface) emailAdminReportOpened(ctx context.Context, report *gtsmodel.Report) error { @@ -193,7 +256,7 @@ func (s *surface) emailAdminNewSignup(ctx context.Context, newUser *gtsmodel.Use SignupEmail: newUser.UnconfirmedEmail, SignupUsername: newUser.Account.Username, SignupReason: newUser.Reason, - SignupURL: "TODO", + SignupURL: instance.URI + "/settings/admin/accounts/" + newUser.AccountID, } if err := s.emailSender.SendNewSignupEmail(toAddresses, newSignupData); err != nil { diff --git a/internal/web/customcss.go b/internal/web/customcss.go index b23ebce8e..b4072f2a7 100644 --- a/internal/web/customcss.go +++ b/internal/web/customcss.go @@ -34,7 +34,7 @@ func (m *Module) customCSSGETHandler(c *gin.Context) { return } - targetUsername, errWithCode := apiutil.ParseWebUsername(c.Param(apiutil.WebUsernameKey)) + targetUsername, errWithCode := apiutil.ParseUsername(c.Param(apiutil.UsernameKey)) if errWithCode != nil { apiutil.WebErrorHandler(c, errWithCode, m.processor.InstanceGetV1) return diff --git a/internal/web/profile.go b/internal/web/profile.go index a4809a72d..1dbf5c73d 100644 --- a/internal/web/profile.go +++ b/internal/web/profile.go @@ -49,7 +49,7 @@ func (m *Module) profileGETHandler(c *gin.Context) { } // Parse account targetUsername from the URL. - targetUsername, errWithCode := apiutil.ParseWebUsername(c.Param(apiutil.WebUsernameKey)) + targetUsername, errWithCode := apiutil.ParseUsername(c.Param(apiutil.UsernameKey)) if errWithCode != nil { apiutil.WebErrorHandler(c, errWithCode, instanceGet) return diff --git a/internal/web/rss.go b/internal/web/rss.go index 2d98efcb3..ced74ed6b 100644 --- a/internal/web/rss.go +++ b/internal/web/rss.go @@ -38,7 +38,7 @@ func (m *Module) rssFeedGETHandler(c *gin.Context) { } // Fetch + normalize username from URL. - username, errWithCode := apiutil.ParseWebUsername(c.Param(apiutil.WebUsernameKey)) + username, errWithCode := apiutil.ParseUsername(c.Param(apiutil.UsernameKey)) if errWithCode != nil { apiutil.WebErrorHandler(c, errWithCode, m.processor.InstanceGetV1) return diff --git a/internal/web/thread.go b/internal/web/thread.go index ffec565e6..05bd63ebe 100644 --- a/internal/web/thread.go +++ b/internal/web/thread.go @@ -50,7 +50,7 @@ func (m *Module) threadGETHandler(c *gin.Context) { } // Parse account targetUsername and status ID from the URL. - targetUsername, errWithCode := apiutil.ParseWebUsername(c.Param(apiutil.WebUsernameKey)) + targetUsername, errWithCode := apiutil.ParseUsername(c.Param(apiutil.UsernameKey)) if errWithCode != nil { apiutil.WebErrorHandler(c, errWithCode, instanceGet) return diff --git a/mkdocs.yml b/mkdocs.yml index b2eb019ab..737e23a75 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -115,6 +115,7 @@ nav: - "Admin": - "admin/settings.md" + - "admin/signups.md" - "admin/federation_modes.md" - "admin/domain_blocks.md" - "admin/cli.md" diff --git a/web/source/css/base.css b/web/source/css/base.css index ae9724661..522820f15 100644 --- a/web/source/css/base.css +++ b/web/source/css/base.css @@ -130,10 +130,11 @@ main { } } - &:disabled { + &:disabled, + &.disabled { color: $white2; background: $gray2; - cursor: auto; + cursor: not-allowed; &:hover { background: $gray3; diff --git a/web/source/settings/admin/accounts/detail.jsx b/web/source/settings/admin/accounts/detail.jsx deleted file mode 100644 index 63049c149..000000000 --- a/web/source/settings/admin/accounts/detail.jsx +++ /dev/null @@ -1,112 +0,0 @@ -/* - GoToSocial - Copyright (C) GoToSocial Authors admin@gotosocial.org - SPDX-License-Identifier: AGPL-3.0-or-later - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . -*/ - -const React = require("react"); -const { useRoute, Redirect } = require("wouter"); - -const query = require("../../lib/query"); - -const FormWithData = require("../../lib/form/form-with-data").default; - -const { useBaseUrl } = require("../../lib/navigation/util"); -const FakeProfile = require("../../components/fake-profile"); -const MutationButton = require("../../components/form/mutation-button"); - -const useFormSubmit = require("../../lib/form/submit").default; -const { useValue, useTextInput } = require("../../lib/form"); -const { TextInput } = require("../../components/form/inputs"); - -module.exports = function AccountDetail({ }) { - const baseUrl = useBaseUrl(); - - let [_match, params] = useRoute(`${baseUrl}/:accountId`); - - if (params?.accountId == undefined) { - return ; - } else { - return ( -

-

- Account Details -

- -
- ); - } -}; - -function AccountDetailForm({ data: account }) { - let content; - if (account.suspended) { - content = ( -

Account is suspended.

- ); - } else { - content = ; - } - - return ( - <> - - - {content} - - ); -} - -function ModifyAccount({ account }) { - const form = { - id: useValue("id", account.id), - reason: useTextInput("text") - }; - - const [modifyAccount, result] = useFormSubmit(form, query.useActionAccountMutation()); - - return ( -
-

Actions

- - -
- {/* - */} - -
- - ); -} \ No newline at end of file diff --git a/web/source/settings/admin/accounts/detail/actions.tsx b/web/source/settings/admin/accounts/detail/actions.tsx new file mode 100644 index 000000000..75ab8db6e --- /dev/null +++ b/web/source/settings/admin/accounts/detail/actions.tsx @@ -0,0 +1,89 @@ +/* + GoToSocial + Copyright (C) GoToSocial Authors admin@gotosocial.org + SPDX-License-Identifier: AGPL-3.0-or-later + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ + +import React from "react"; + +import { useActionAccountMutation } from "../../../lib/query"; + +import MutationButton from "../../../components/form/mutation-button"; + +import useFormSubmit from "../../../lib/form/submit"; +import { + useValue, + useTextInput, + useBoolInput, +} from "../../../lib/form"; + +import { Checkbox, TextInput } from "../../../components/form/inputs"; +import { AdminAccount } from "../../../lib/types/account"; + +export interface AccountActionsProps { + account: AdminAccount, +} + +export function AccountActions({ account }: AccountActionsProps) { + const form = { + id: useValue("id", account.id), + reason: useTextInput("text") + }; + + const reallySuspend = useBoolInput("reallySuspend"); + const [accountAction, result] = useFormSubmit(form, useActionAccountMutation()); + + return ( +
+

Account Moderation Actions

+
+ Currently only the "suspend" action is implemented.
+ Suspending an account will delete it from your server, and remove all of its media, posts, relationships, etc.
+ If the suspended account is local, suspending will also send out a "delete" message to other servers, requesting them to remove its data from their instance as well.
+ Account suspension cannot be reversed. +
+ +
+ {/* + */} + + +
+ + ); +} diff --git a/web/source/settings/admin/accounts/detail/handlesignup.tsx b/web/source/settings/admin/accounts/detail/handlesignup.tsx new file mode 100644 index 000000000..a61145a22 --- /dev/null +++ b/web/source/settings/admin/accounts/detail/handlesignup.tsx @@ -0,0 +1,118 @@ +/* + GoToSocial + Copyright (C) GoToSocial Authors admin@gotosocial.org + SPDX-License-Identifier: AGPL-3.0-or-later + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ + +import React from "react"; +import { useLocation } from "wouter"; + +import { useHandleSignupMutation } from "../../../lib/query"; + +import MutationButton from "../../../components/form/mutation-button"; + +import useFormSubmit from "../../../lib/form/submit"; +import { + useValue, + useTextInput, + useBoolInput, +} from "../../../lib/form"; + +import { Checkbox, Select, TextInput } from "../../../components/form/inputs"; +import { AdminAccount } from "../../../lib/types/account"; + +export interface HandleSignupProps { + account: AdminAccount, + accountsBaseUrl: string, +} + +export function HandleSignup({account, accountsBaseUrl}: HandleSignupProps) { + const form = { + id: useValue("id", account.id), + approveOrReject: useTextInput("approve_or_reject", { defaultValue: "approve" }), + privateComment: useTextInput("private_comment"), + message: useTextInput("message"), + sendEmail: useBoolInput("send_email"), + }; + + const [_location, setLocation] = useLocation(); + + const [handleSignup, result] = useFormSubmit(form, useHandleSignupMutation(), { + changedOnly: false, + // After submitting the form, redirect back to + // /settings/admin/accounts if rejecting, since + // account will no longer be available at + // /settings/admin/accounts/:accountID endpoint. + onFinish: (res) => { + if (form.approveOrReject.value === "approve") { + // An approve request: + // stay on this page and + // serve updated details. + return; + } + + if (res.data) { + // "reject" successful, + // redirect to accounts page. + setLocation(accountsBaseUrl); + } + } + }); + + return ( +
+

Handle Account Sign-Up

+ + { form.approveOrReject.value === "reject" && + // Only show form fields relevant + // to "reject" if rejecting. + // On "approve" these fields will + // be ignored anyway. + <> + + + + } + + + ); +} diff --git a/web/source/settings/admin/accounts/detail/index.tsx b/web/source/settings/admin/accounts/detail/index.tsx new file mode 100644 index 000000000..79eb493de --- /dev/null +++ b/web/source/settings/admin/accounts/detail/index.tsx @@ -0,0 +1,179 @@ +/* + GoToSocial + Copyright (C) GoToSocial Authors admin@gotosocial.org + SPDX-License-Identifier: AGPL-3.0-or-later + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ + +import React from "react"; +import { useRoute, Redirect } from "wouter"; + +import { useGetAccountQuery } from "../../../lib/query"; + +import FormWithData from "../../../lib/form/form-with-data"; + +import { useBaseUrl } from "../../../lib/navigation/util"; +import FakeProfile from "../../../components/fake-profile"; + +import { AdminAccount } from "../../../lib/types/account"; +import { HandleSignup } from "./handlesignup"; +import { AccountActions } from "./actions"; +import BackButton from "../../../components/back-button"; + +export default function AccountDetail() { + // /settings/admin/accounts + const accountsBaseUrl = useBaseUrl(); + + let [_match, params] = useRoute(`${accountsBaseUrl}/:accountId`); + + if (params?.accountId == undefined) { + return ; + } else { + return ( +
+

+ Account Details +

+ +
+ ); + } +} + +interface AccountDetailFormProps { + accountsBaseUrl: string, + data: AdminAccount, +} + +function AccountDetailForm({ data: adminAcct, accountsBaseUrl }: AccountDetailFormProps) { + let yesOrNo = (b: boolean) => { + return b ? "yes" : "no"; + }; + + let created = new Date(adminAcct.created_at).toDateString(); + let lastPosted = "never"; + if (adminAcct.account.last_status_at) { + lastPosted = new Date(adminAcct.account.last_status_at).toDateString(); + } + const local = !adminAcct.domain; + + return ( + <> + +

General Account Details

+ { adminAcct.suspended && +
+ + Account is suspended. +
+ } +
+ { !local && +
+
Domain
+
{adminAcct.domain}
+
} +
+
Created
+
+
+
+
Last posted
+
{lastPosted}
+
+
+
Suspended
+
{yesOrNo(adminAcct.suspended)}
+
+
+
Silenced
+
{yesOrNo(adminAcct.silenced)}
+
+
+
Statuses
+
{adminAcct.account.statuses_count}
+
+
+
Followers
+
{adminAcct.account.followers_count}
+
+
+
Following
+
{adminAcct.account.following_count}
+
+
+ { local && + // Only show local account details + // if this is a local account! + <> +

Local Account Details

+ { !adminAcct.approved && +
+ + Account is pending. +
+ } + { !adminAcct.confirmed && +
+ + Account email not yet confirmed. +
+ } +
+
+
Email
+
{adminAcct.email} {{adminAcct.confirmed ? "(confirmed)" : "(not confirmed)"} }
+
+
+
Disabled
+
{yesOrNo(adminAcct.disabled)}
+
+
+
Approved
+
{yesOrNo(adminAcct.approved)}
+
+
+
Sign-Up Reason
+
{adminAcct.invite_request ?? none provided}
+
+ { (adminAcct.ip && adminAcct.ip !== "0.0.0.0") && +
+
Sign-Up IP
+
{adminAcct.ip}
+
} + { adminAcct.locale && +
+
Locale
+
{adminAcct.locale}
+
} +
+ } + { local && !adminAcct.approved + ? + + : + + } + + ); +} diff --git a/web/source/settings/admin/accounts/index.jsx b/web/source/settings/admin/accounts/index.jsx deleted file mode 100644 index c642d903e..000000000 --- a/web/source/settings/admin/accounts/index.jsx +++ /dev/null @@ -1,138 +0,0 @@ -/* - GoToSocial - Copyright (C) GoToSocial Authors admin@gotosocial.org - SPDX-License-Identifier: AGPL-3.0-or-later - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . -*/ - -const React = require("react"); -const { Switch, Route, Link } = require("wouter"); - -const query = require("../../lib/query"); -const { useTextInput } = require("../../lib/form"); - -const AccountDetail = require("./detail"); -const { useBaseUrl } = require("../../lib/navigation/util"); -const { Error } = require("../../components/error"); - -module.exports = function Accounts({ baseUrl }) { - return ( -
- - - - - - -
- ); -}; - -function AccountOverview({ }) { - return ( - <> -

Accounts

-
- Pending #581, - there is currently no way to list accounts.
- You can perform actions on reported accounts by clicking their name in the report, or searching for a username below. -
- - - - ); -} - -function AccountSearchForm() { - const [searchAccount, result] = query.useSearchAccountMutation(); - - const [onAccountChange, _resetAccount, { account }] = useTextInput("account"); - - function submitSearch(e) { - e.preventDefault(); - if (account.trim().length != 0) { - searchAccount(account); - } - } - - return ( -
-
-
- -
- -