From ad5b24269e4c08072c42ccbb57da01b86898a570 Mon Sep 17 00:00:00 2001 From: Peter Harrison Date: Sun, 29 Sep 2024 10:32:44 -0700 Subject: [PATCH] 20240929103244 Merge develop into main --- .coderabbit.yaml | 1 + .dockerignore | 1 + .env.sample | 18 + .eslintrc.json | 9 +- .github/ISSUE_TEMPLATE/bug-report.md | 4 +- .github/ISSUE_TEMPLATE/feature-request.md | 4 +- .github/workflows/check-tsdoc.js | 80 + .github/workflows/eslint_disable_check.py | 123 + .github/workflows/md_mdx_format_adjuster.py | 1 - .github/workflows/pull-request.yml | 11 +- .github/workflows/push.yml | 98 +- .gitignore | 3 + .node-version | 2 +- CODEOWNERS | 3 + CODE_OF_CONDUCT.md | 150 + CONTRIBUTING.md | 327 + Caddyfile | 5 + DOCUMENTATION.md | 36 + Dockerfile.dev | 14 + Dockerfile.prod | 25 + INSTALLATION.md | 1219 + ISSUE_GUIDELINES.md | 63 + LICENSE | 674 + PR_GUIDELINES.md | 51 + README.md | 56 + codegen.ts | 117 + config/vitestSetup.ts | 8 + docker-compose.dev.yaml | 74 + docker-compose.prod.yaml | 57 + docs/README.md | 7 + images/.gitignore | 4 + locales/en.json | 38 + locales/fr.json | 37 + locales/hi.json | 38 + locales/sp.json | 37 + locales/zh.json | 37 + logs/.gitignore | 4 + package-lock.json | 17294 + package.json | 158 + public/markdown/images/GraphQL_Voyager.png | Bin 0 -> 308541 bytes public/markdown/images/colorize-logs.jpg | Bin 0 -> 103558 bytes .../connect_extension_to_mongodb_step_1.webp | Bin 0 -> 3650 bytes .../connect_extension_to_mongodb_step_2.webp | Bin 0 -> 20292 bytes public/markdown/images/install1.png | Bin 0 -> 35659 bytes public/markdown/images/install2.png | Bin 0 -> 51910 bytes public/markdown/images/install3.png | Bin 0 -> 95315 bytes .../install_mongodb_vscode_extension.webp | Bin 0 -> 17564 bytes public/markdown/images/ip-address.png | Bin 0 -> 10216 bytes .../markdown/images/minio-create-bucket.png | Bin 0 -> 154201 bytes public/markdown/images/mino-webui-login.png | Bin 0 -> 650095 bytes .../images/mongodb_compass_user_elevation.png | Bin 0 -> 213294 bytes public/markdown/images/recaptcha_set_up.webp | Bin 0 -> 34838 bytes .../images/recaptcha_site_and_secret_key.webp | Bin 0 -> 25646 bytes .../images/talawa-logo-lite-200x200.png | Bin 0 -> 5133 bytes requirements.txt | 6 + sample_data/actionItemCategories.json | 42 + sample_data/agendaCategories.json | 46 + sample_data/appUserProfiles.json | 212 + sample_data/defaultAppUserProfile.json | 17 + sample_data/defaultOrganization.json | 31 + sample_data/defaultUser.json | 19 + sample_data/events.json | 449082 +++++++++++++++ sample_data/organizations.json | 161 + sample_data/posts.json | 291 + sample_data/recurrenceRules.json | 1602 + sample_data/userFamilies.json | 20 + sample_data/users.json | 447 + schema.graphql | 2069 + scripts/cloud-api-demo/README.md | 240 + scripts/cloud-api-demo/correct_permissions.py | 50 + scripts/cloud-api-demo/create_env.py | 81 + scripts/cloud-api-demo/deploy.py | 61 + scripts/cloud-api-demo/renew_certificates.py | 57 + scripts/cloud-api-demo/reset_database.py | 64 + scripts/githooks/update-toc.js | 14 + setup.ts | 1185 + src/app.ts | 123 + src/checks.ts | 71 + src/config/appConfig.ts | 20 + src/config/index.ts | 5 + src/config/plugins/loadPlugins.ts | 64 + src/config/plugins/pluginData.json | 26 + src/constants.ts | 793 + src/db.ts | 73 + .../authDirectiveTransformer.ts | 58 + .../roleDirectiveTransformer.ts | 83 + src/env.ts | 51 + .../createRecurringEvent.ts | 112 + ...reateRecurringEventInstancesDuringQuery.ts | 149 + .../createEventHelpers/createSingleEvent.ts | 91 + src/helpers/event/createEventHelpers/index.ts | 18 + .../deleteRecurringEvent.ts | 91 + .../deleteRecurringEventInstances.ts | 219 + .../deleteEventHelpers/deleteSingleEvent.ts | 59 + src/helpers/event/deleteEventHelpers/index.ts | 17 + .../createRecurrenceRule.ts | 81 + .../generateRecurrenceRuleString.ts | 83 + .../generateRecurringEventInstances.ts | 159 + .../getRecurringInstanceDates.ts | 74 + .../event/recurringEventHelpers/index.ts | 14 + .../removeDanglingDocuments.ts | 66 + .../event/updateEventHelpers/getEventData.ts | 43 + src/helpers/event/updateEventHelpers/index.ts | 4 + .../shouldUpdateBaseRecurringEvent.ts | 19 + .../updateRecurringEvent.ts | 87 + .../updateRecurringEventInstances.ts | 293 + .../updateEventHelpers/updateSingleEvent.ts | 165 + .../updateEventHelpers/updateThisInstance.ts | 44 + src/index.ts | 151 + src/libraries/dbLogger.ts | 150 + .../errors/ImageSizeLimitExceeded.ts | 36 + src/libraries/errors/applicationError.ts | 37 + src/libraries/errors/conflictError.ts | 32 + src/libraries/errors/index.ts | 20 + src/libraries/errors/inputValidationError.ts | 32 + src/libraries/errors/internalServerError.ts | 36 + src/libraries/errors/invalidFileTypeError.ts | 36 + src/libraries/errors/notFoundError.ts | 32 + src/libraries/errors/unauthenticatedError.ts | 36 + src/libraries/errors/unauthorizedError.ts | 32 + src/libraries/errors/validationError.ts | 19 + src/libraries/index.ts | 11 + src/libraries/logger.ts | 71 + src/libraries/requestContext.ts | 119 + src/libraries/requestTracing.ts | 89 + src/libraries/validators/compareDates.ts | 23 + src/libraries/validators/compareTime.ts | 23 + src/libraries/validators/validateString.ts | 16 + src/middleware/index.ts | 2 + src/middleware/isAuth.ts | 78 + src/minioInstallationCheck.ts | 79 + src/models/ActionItem.ts | 124 + src/models/ActionItemCategory.ts | 70 + src/models/Advertisement.ts | 120 + src/models/AgendaCategory.ts | 72 + src/models/AgendaItem.ts | 136 + src/models/AgendaSection.ts | 74 + src/models/AppUserProfile.ts | 121 + src/models/CheckIn.ts | 74 + src/models/CheckOut.ts | 68 + src/models/Comment.ts | 83 + src/models/Community.ts | 88 + src/models/DirectChat.ts | 75 + src/models/DirectChatMessage.ts | 78 + src/models/Donation.ts | 74 + src/models/EncodedImage.ts | 45 + src/models/EncodedVideo.ts | 48 + src/models/Event.ts | 204 + src/models/EventAttendee.ts | 95 + src/models/EventVolunteer.ts | 92 + src/models/EventVolunteerGroup.ts | 94 + src/models/Feedback.ts | 75 + src/models/File.ts | 82 + src/models/Fund.ts | 96 + src/models/FundraisingCampaign.ts | 272 + src/models/FundraisingCampaignPledge.ts | 91 + src/models/Group.ts | 81 + src/models/GroupChat.ts | 97 + src/models/GroupChatMessage.ts | 75 + src/models/IdentifierCount.ts | 46 + src/models/ImageHash.ts | 64 + src/models/Language.ts | 97 + src/models/MembershipRequest.ts | 55 + src/models/Message.ts | 88 + src/models/MessageChat.ts | 71 + src/models/Note.ts | 66 + src/models/Organization.ts | 223 + src/models/OrganizationCustomField.ts | 54 + src/models/OrganizationTagUser.ts | 74 + src/models/Plugin.ts | 57 + src/models/PluginField.ts | 62 + src/models/Post.ts | 115 + src/models/RecurrenceRule.ts | 125 + src/models/SampleData.ts | 52 + src/models/TagUser.ts | 53 + src/models/User.ts | 259 + src/models/UserCustomData.ts | 58 + src/models/Venue.ts | 52 + src/models/index.ts | 42 + src/models/userFamily.ts | 55 + src/resolvers/ActionItemCategory/creator.ts | 21 + src/resolvers/ActionItemCategory/index.ts | 6 + src/resolvers/Advertisement/index.ts | 7 + src/resolvers/Advertisement/organization.ts | 21 + src/resolvers/AgendaCategory/createdBy.ts | 21 + src/resolvers/AgendaCategory/index.ts | 10 + src/resolvers/AgendaCategory/organization.ts | 20 + src/resolvers/AgendaCategory/updatedBy.ts | 23 + src/resolvers/AgendaItem/Users.ts | 20 + src/resolvers/AgendaItem/categories.ts | 25 + src/resolvers/AgendaItem/createdBy.ts | 18 + src/resolvers/AgendaItem/index.ts | 16 + src/resolvers/AgendaItem/organization.ts | 22 + src/resolvers/AgendaItem/relatedEvent.ts | 20 + src/resolvers/AgendaItem/updatedBy.ts | 20 + src/resolvers/AgendaSection/createdBy.ts | 20 + src/resolvers/AgendaSection/index.ts | 21 + src/resolvers/AgendaSection/items.ts | 25 + src/resolvers/AgendaSection/relatedEvent.ts | 21 + src/resolvers/CheckIn/event.ts | 24 + src/resolvers/CheckIn/index.ts | 8 + src/resolvers/CheckIn/user.ts | 24 + src/resolvers/Comment/creator.ts | 20 + src/resolvers/Comment/index.ts | 6 + src/resolvers/DirectChat/creator.ts | 12 + src/resolvers/DirectChat/index.ts | 24 + src/resolvers/DirectChat/messages.ts | 14 + src/resolvers/DirectChat/organization.ts | 28 + src/resolvers/DirectChat/users.ts | 14 + .../directChatMessageBelongsTo.ts | 33 + src/resolvers/DirectChatMessage/index.ts | 10 + src/resolvers/DirectChatMessage/receiver.ts | 34 + src/resolvers/DirectChatMessage/sender.ts | 32 + src/resolvers/Event/actionItems.ts | 20 + src/resolvers/Event/attendees.ts | 26 + src/resolvers/Event/attendeesCheckInStatus.ts | 30 + src/resolvers/Event/averageFeedbackScore.ts | 32 + src/resolvers/Event/baseRecurringEvent.ts | 22 + src/resolvers/Event/creator.ts | 20 + src/resolvers/Event/feedback.ts | 20 + src/resolvers/Event/index.ts | 22 + src/resolvers/Event/organization.ts | 20 + src/resolvers/Event/recurrenceRule.ts | 23 + src/resolvers/EventVolunteer/creator.ts | 20 + src/resolvers/EventVolunteer/event.ts | 20 + src/resolvers/EventVolunteer/group.ts | 20 + src/resolvers/EventVolunteer/index.ts | 12 + src/resolvers/EventVolunteer/user.ts | 22 + src/resolvers/EventVolunteerGroup/creator.ts | 22 + src/resolvers/EventVolunteerGroup/event.ts | 20 + src/resolvers/EventVolunteerGroup/index.ts | 10 + src/resolvers/EventVolunteerGroup/leader.ts | 24 + src/resolvers/Feedback/event.ts | 23 + src/resolvers/Feedback/index.ts | 6 + src/resolvers/Fund/creator.ts | 21 + src/resolvers/Fund/index.ts | 14 + .../FundraisingCampaignPledge/index.ts | 6 + .../FundraisingCampaignPledge/users.ts | 22 + src/resolvers/GroupChat/creator.ts | 20 + src/resolvers/GroupChat/index.ts | 12 + src/resolvers/GroupChat/messages.ts | 22 + src/resolvers/GroupChat/organization.ts | 36 + src/resolvers/GroupChat/users.ts | 22 + .../groupChatMessageBelongsTo.ts | 33 + src/resolvers/GroupChatMessage/index.ts | 8 + src/resolvers/GroupChatMessage/sender.ts | 32 + src/resolvers/MembershipRequest/index.ts | 8 + .../MembershipRequest/organization.ts | 34 + src/resolvers/MembershipRequest/user.ts | 32 + .../Mutation/acceptMembershipRequest.ts | 123 + src/resolvers/Mutation/addEventAttendee.ts | 176 + src/resolvers/Mutation/addFeedback.ts | 92 + .../Mutation/addLanguageTranslation.ts | 83 + .../Mutation/addOrganizationCustomField.ts | 147 + .../Mutation/addOrganizationImage.ts | 97 + .../addPledgeToFundraisingCampaign.ts | 140 + src/resolvers/Mutation/addUserCustomData.ts | 92 + src/resolvers/Mutation/addUserImage.ts | 83 + src/resolvers/Mutation/addUserToGroupChat.ts | 127 + src/resolvers/Mutation/addUserToUserFamily.ts | 103 + src/resolvers/Mutation/adminRemoveGroup.ts | 132 + src/resolvers/Mutation/assignUserTag.ts | 183 + .../blockPluginCreationBySuperadmin.ts | 109 + src/resolvers/Mutation/blockUser.ts | 175 + .../Mutation/cancelMembershipRequest.ts | 158 + src/resolvers/Mutation/checkIn.ts | 189 + src/resolvers/Mutation/checkOut.ts | 191 + src/resolvers/Mutation/createActionItem.ts | 232 + .../Mutation/createActionItemCategory.ts | 121 + src/resolvers/Mutation/createAdmin.ts | 208 + src/resolvers/Mutation/createAdvertisement.ts | 102 + .../Mutation/createAgendaCategory.ts | 138 + src/resolvers/Mutation/createAgendaItem.ts | 204 + src/resolvers/Mutation/createAgendaSection.ts | 124 + src/resolvers/Mutation/createComment.ts | 75 + src/resolvers/Mutation/createDirectChat.ts | 62 + src/resolvers/Mutation/createDonation.ts | 37 + src/resolvers/Mutation/createEvent.ts | 229 + .../Mutation/createEventVolunteer.ts | 114 + .../Mutation/createEventVolunteerGroup.ts | 97 + src/resolvers/Mutation/createFund.ts | 144 + .../Mutation/createFundraisingCampaign.ts | 163 + .../createFundraisingCampaignPledge.ts | 120 + src/resolvers/Mutation/createGroupChat.ts | 93 + src/resolvers/Mutation/createMember.ts | 226 + src/resolvers/Mutation/createMessageChat.ts | 127 + src/resolvers/Mutation/createNote.ts | 119 + src/resolvers/Mutation/createOrganization.ts | 253 + src/resolvers/Mutation/createPlugin.ts | 39 + src/resolvers/Mutation/createPost.ts | 261 + .../Mutation/createSampleOrganization.ts | 85 + src/resolvers/Mutation/createUserFamily.ts | 132 + src/resolvers/Mutation/createUserTag.ts | 170 + src/resolvers/Mutation/createVenue.ts | 157 + src/resolvers/Mutation/deleteAdvertisement.ts | 132 + .../Mutation/deleteAgendaCategory.ts | 116 + src/resolvers/Mutation/deleteDonationById.ts | 17 + src/resolvers/Mutation/deleteNote.ts | 106 + src/resolvers/Mutation/deleteVenue.ts | 121 + src/resolvers/Mutation/editVenue.ts | 168 + src/resolvers/Mutation/forgotPassword.ts | 69 + src/resolvers/Mutation/index.ts | 248 + src/resolvers/Mutation/inviteEventAttendee.ts | 151 + .../Mutation/joinPublicOrganization.ts | 147 + src/resolvers/Mutation/leaveOrganization.ts | 186 + src/resolvers/Mutation/likeComment.ts | 84 + src/resolvers/Mutation/likePost.ts | 84 + src/resolvers/Mutation/login.ts | 154 + src/resolvers/Mutation/logout.ts | 32 + src/resolvers/Mutation/otp.ts | 52 + src/resolvers/Mutation/recaptcha.ts | 19 + src/resolvers/Mutation/refreshToken.ts | 120 + .../Mutation/registerEventAttendee.ts | 181 + src/resolvers/Mutation/registerForEvent.ts | 116 + .../Mutation/rejectMembershipRequest.ts | 100 + src/resolvers/Mutation/removeActionItem.ts | 159 + src/resolvers/Mutation/removeAdmin.ts | 185 + src/resolvers/Mutation/removeAgendaItem.ts | 113 + src/resolvers/Mutation/removeAgendaSection.ts | 120 + src/resolvers/Mutation/removeComment.ts | 155 + src/resolvers/Mutation/removeDirectChat.ts | 81 + src/resolvers/Mutation/removeEvent.ts | 168 + src/resolvers/Mutation/removeEventAttendee.ts | 167 + .../Mutation/removeEventVolunteer.ts | 88 + .../Mutation/removeEventVolunteerGroup.ts | 82 + .../removeFundraisingCampaingPledge.ts | 105 + src/resolvers/Mutation/removeGroupChat.ts | 80 + src/resolvers/Mutation/removeMember.ts | 168 + src/resolvers/Mutation/removeOrganization.ts | 233 + .../Mutation/removeOrganizationCustomField.ts | 125 + .../Mutation/removeOrganizationImage.ts | 83 + src/resolvers/Mutation/removePost.ts | 163 + .../Mutation/removeSampleOrganization.ts | 124 + .../Mutation/removeUserCustomData.ts | 136 + src/resolvers/Mutation/removeUserFamily.ts | 94 + .../Mutation/removeUserFromGroupChat.ts | 96 + .../Mutation/removeUserFromUserFamily.ts | 140 + src/resolvers/Mutation/removeUserImage.ts | 74 + src/resolvers/Mutation/removeUserTag.ts | 157 + src/resolvers/Mutation/resetCommunity.ts | 73 + .../Mutation/revokeRefreshTokenForUser.ts | 21 + src/resolvers/Mutation/saveFcmToken.ts | 29 + .../Mutation/sendMembershipRequest.ts | 145 + .../Mutation/sendMessageToDirectChat.ts | 71 + .../Mutation/sendMessageToGroupChat.ts | 87 + src/resolvers/Mutation/signUp.ts | 185 + src/resolvers/Mutation/togglePostPin.ts | 247 + src/resolvers/Mutation/unassignUserTag.ts | 181 + src/resolvers/Mutation/unblockUser.ts | 193 + src/resolvers/Mutation/unlikeComment.ts | 76 + src/resolvers/Mutation/unlikePost.ts | 76 + .../Mutation/unregisterForEventByUser.ts | 69 + src/resolvers/Mutation/updateActionItem.ts | 232 + .../Mutation/updateActionItemCategory.ts | 100 + src/resolvers/Mutation/updateAdvertisement.ts | 211 + .../Mutation/updateAgendaCategory.ts | 130 + src/resolvers/Mutation/updateAgendaItem.ts | 115 + src/resolvers/Mutation/updateAgendaSection.ts | 118 + src/resolvers/Mutation/updateCommunity.ts | 105 + src/resolvers/Mutation/updateEvent.ts | 213 + .../Mutation/updateEventVolunteer.ts | 97 + .../Mutation/updateEventVolunteerGroup.ts | 88 + src/resolvers/Mutation/updateFund.ts | 133 + .../Mutation/updateFundCampaignPledge.ts | 147 + .../Mutation/updateFundraisingCampaign.ts | 170 + src/resolvers/Mutation/updateLanguage.ts | 31 + src/resolvers/Mutation/updateNote.ts | 124 + src/resolvers/Mutation/updateOrganization.ts | 77 + src/resolvers/Mutation/updatePluginStatus.ts | 61 + src/resolvers/Mutation/updatePost.ts | 196 + src/resolvers/Mutation/updateUserPassword.ts | 161 + src/resolvers/Mutation/updateUserProfile.ts | 170 + .../Mutation/updateUserRoleInOrganization.ts | 162 + src/resolvers/Mutation/updateUserTag.ts | 142 + .../Organization/actionItemCategories.ts | 21 + src/resolvers/Organization/admins.ts | 22 + src/resolvers/Organization/advertisements.ts | 160 + .../Organization/agendaCategories.ts | 21 + src/resolvers/Organization/blockedUsers.ts | 24 + src/resolvers/Organization/creator.ts | 32 + src/resolvers/Organization/funds.ts | 20 + src/resolvers/Organization/image.ts | 24 + src/resolvers/Organization/index.ts | 34 + src/resolvers/Organization/members.ts | 22 + .../Organization/membershipRequests.ts | 44 + src/resolvers/Organization/pinnedPosts.ts | 38 + src/resolvers/Organization/posts.ts | 165 + src/resolvers/Organization/userTags.ts | 153 + src/resolvers/Organization/venues.ts | 18 + src/resolvers/Post/comments.ts | 35 + src/resolvers/Post/creator.ts | 20 + src/resolvers/Post/index.ts | 8 + .../actionItemCategoriesByOrganization.ts | 23 + src/resolvers/Query/actionItemsByEvent.ts | 18 + .../Query/actionItemsByOrganization.ts | 57 + .../Query/advertisementsConnection.ts | 133 + src/resolvers/Query/agendaCategory.ts | 38 + src/resolvers/Query/agendaItemByEvent.ts | 19 + src/resolvers/Query/agendaItemById.ts | 32 + .../Query/agendaItemByOrganization.ts | 15 + .../agendaItemCategoriesByOrganization.ts | 14 + src/resolvers/Query/checkAuth.ts | 47 + .../Query/customDataByOrganization.ts | 22 + .../Query/customFieldsByOrganization.ts | 34 + src/resolvers/Query/directChatById.ts | 31 + src/resolvers/Query/directChatsByUserID.ts | 28 + .../Query/directChatsMessagesByChatID.ts | 31 + src/resolvers/Query/event.ts | 30 + src/resolvers/Query/eventVolunteersByEvent.ts | 20 + src/resolvers/Query/eventsByOrganization.ts | 23 + .../Query/eventsByOrganizationConnection.ts | 45 + src/resolvers/Query/fundsByOrganization.ts | 31 + src/resolvers/Query/getAgendaSection.ts | 33 + src/resolvers/Query/getAllAgendaItems.ts | 27 + .../Query/getAllNotesForAgendaItem.ts | 29 + src/resolvers/Query/getCommunityData.ts | 16 + src/resolvers/Query/getDonationById.ts | 20 + src/resolvers/Query/getDonationByOrgId.ts | 17 + .../Query/getDonationByOrgIdConnection.ts | 35 + src/resolvers/Query/getEventAttendee.ts | 29 + .../Query/getEventAttendeesByEventId.ts | 23 + .../Query/getEventInvitesByUserId.ts | 18 + .../Query/getEventVolunteerGroups.ts | 22 + src/resolvers/Query/getFundById.ts | 34 + .../Query/getFundraisingCampaignPledgeById.ts | 19 + .../Query/getFundraisingCampaigns.ts | 32 + src/resolvers/Query/getNoteById.ts | 37 + src/resolvers/Query/getPledgesByUserId.ts | 67 + src/resolvers/Query/getPlugins.ts | 10 + src/resolvers/Query/getUserTag.ts | 33 + src/resolvers/Query/getUserTagAncestors.ts | 45 + src/resolvers/Query/getVenueByOrgId.ts | 42 + src/resolvers/Query/getlanguage.ts | 36 + src/resolvers/Query/groupChatById.ts | 31 + src/resolvers/Query/groupChatsByUserId.ts | 30 + src/resolvers/Query/hasSubmittedFeedback.ts | 71 + .../Query/helperFunctions/getSort.ts | 343 + .../Query/helperFunctions/getWhere.ts | 786 + src/resolvers/Query/index.ts | 111 + src/resolvers/Query/me.ts | 59 + src/resolvers/Query/myLanguage.ts | 43 + src/resolvers/Query/organizationIsSample.ts | 40 + src/resolvers/Query/organizations.ts | 53 + .../Query/organizationsConnection.ts | 30 + .../Query/organizationsMemberConnection.ts | 195 + src/resolvers/Query/post.ts | 32 + src/resolvers/Query/registeredEventsByUser.ts | 28 + src/resolvers/Query/user.ts | 51 + src/resolvers/Query/userLanguage.ts | 43 + src/resolvers/Query/users.ts | 94 + src/resolvers/Query/usersConnection.ts | 49 + src/resolvers/Query/venue.ts | 45 + .../RecurrenceRule/baseRecurringEvent.ts | 21 + src/resolvers/RecurrenceRule/index.ts | 8 + src/resolvers/RecurrenceRule/organization.ts | 23 + .../Subscription/directMessageChat.ts | 19 + src/resolvers/Subscription/index.ts | 11 + .../Subscription/messageSentToDirectChat.ts | 36 + .../Subscription/messageSentToGroupChat.ts | 52 + src/resolvers/Subscription/onPluginUpdate.ts | 55 + src/resolvers/User/index.ts | 8 + src/resolvers/User/posts.ts | 132 + src/resolvers/UserFamily/admins.ts | 22 + src/resolvers/UserFamily/creator.ts | 32 + src/resolvers/UserFamily/index.ts | 10 + src/resolvers/UserFamily/users.ts | 22 + src/resolvers/UserTag/childTags.ts | 139 + src/resolvers/UserTag/index.ts | 12 + src/resolvers/UserTag/organization.ts | 22 + src/resolvers/UserTag/parentTag.ts | 24 + src/resolvers/UserTag/usersAssignedTo.ts | 157 + src/resolvers/index.ts | 116 + src/resolvers/middleware/currentUserExists.ts | 37 + src/server.ts | 251 + .../cacheAppUserProfile.ts | 35 + .../deleteAppUserFromCache.ts | 17 + .../findAppUserProfileCache.ts | 58 + src/services/CommentCache/cacheComments.ts | 43 + .../CommentCache/deleteCommentFromCache.ts | 18 + .../findCommentsByPostIdInCache.ts | 66 + .../CommentCache/findCommentsInCache.ts | 59 + src/services/EventCache/cacheEvents.ts | 34 + .../EventCache/deleteEventFromCache.ts | 18 + src/services/EventCache/findEventInCache.ts | 69 + .../OrganizationCache/cacheOrganizations.ts | 36 + .../deleteOrganizationFromCache.ts | 18 + .../findOrganizationsInCache.ts | 98 + src/services/PostCache/cachePosts.ts | 36 + src/services/PostCache/deletePostFromCache.ts | 14 + src/services/PostCache/findPostsInCache.ts | 63 + src/services/UserCache/cacheUser.ts | 36 + src/services/UserCache/deleteUserFromCache.ts | 9 + src/services/UserCache/findUserInCache.ts | 73 + src/services/redisCache.ts | 20 + src/setup/MongoDB.ts | 84 + src/setup/askToKeepValues.ts | 16 + src/setup/getMinioBinaryUrl.ts | 27 + src/setup/getNodeEnvironment.ts | 21 + src/setup/installMinio.ts | 70 + src/setup/isMinioInstalled.ts | 35 + src/setup/isValidEmail.ts | 11 + src/setup/reCaptcha.ts | 10 + src/setup/redisConfiguration.ts | 86 + src/setup/setImageUploadSize.ts | 39 + src/setup/setPathEnvVar.ts | 44 + src/setup/superAdmin.ts | 26 + src/setup/updateEnvVariable.ts | 31 + src/setup/updateIgnoreFile.ts | 64 + src/setup/verifySmtpConnection.ts | 41 + src/typeDefs/README.md | 81 + src/typeDefs/directives.ts | 13 + src/typeDefs/enums.ts | 392 + src/typeDefs/errors/common.ts | 45 + src/typeDefs/errors/connectionError.ts | 13 + src/typeDefs/errors/createAdminErrors.ts | 28 + src/typeDefs/errors/createCommentErrors.ts | 13 + src/typeDefs/errors/createDirectChatError.ts | 16 + src/typeDefs/errors/createMemberErrors.ts | 32 + src/typeDefs/errors/index.ts | 18 + src/typeDefs/index.ts | 31 + src/typeDefs/inputs.ts | 633 + src/typeDefs/interfaces.ts | 32 + src/typeDefs/mutations.ts | 352 + src/typeDefs/queries.ts | 204 + src/typeDefs/scalars.ts | 19 + src/typeDefs/subscriptions.ts | 11 + src/typeDefs/types.ts | 774 + src/typeDefs/unions.ts | 4 + src/types/generatedGraphQLTypes.ts | 4964 + src/utilities/PII/decryption.ts | 29 + src/utilities/PII/encryption.ts | 24 + src/utilities/PII/isAuthorised.ts | 19 + src/utilities/TalawaGraphQLError.ts | 197 + src/utilities/adminCheck.ts | 64 + src/utilities/auth.ts | 86 + src/utilities/checkReplicaSet.ts | 27 + src/utilities/copyToClipboard.ts | 15 + src/utilities/createSampleOrganizationUtil.ts | 347 + src/utilities/dateValidator.ts | 39 + src/utilities/deleteDuplicatedImage.ts | 21 + src/utilities/deleteImage.ts | 65 + .../deletePreviousImage.ts | 38 + .../encodedImageExtensionCheck.ts | 25 + .../encodedImageStorage/uploadEncodedImage.ts | 142 + .../deletePreviousVideo.ts | 41 + .../encodedVideoExtensionCheck.ts | 22 + .../encodedVideoStorage/uploadEncodedVideo.ts | 97 + .../generateDefaultGraphQLConnection.ts | 43 + .../getCommonGraphQLConnectionFilter.ts | 68 + .../getCommonGraphQLConnectionSort.ts | 48 + src/utilities/graphQLConnection/index.ts | 52 + .../parseGraphQLConnectionArguments.ts | 194 + ...eGraphQLConnectionArgumentsWithSortedBy.ts | 118 + ...ConnectionArgumentsWithSortedByAndWhere.ts | 153 + ...arseGraphQLConnectionArgumentsWithWhere.ts | 118 + .../transformToDefaultGraphQLConnection.ts | 152 + src/utilities/imageAlreadyInDbCheck.ts | 94 + src/utilities/imageExtensionCheck.ts | 34 + src/utilities/index.ts | 7 + src/utilities/loadDefaultOrg.ts | 51 + src/utilities/loadSampleData.ts | 230 + src/utilities/mailer.ts | 79 + src/utilities/recurrenceDatesUtil.ts | 51 + src/utilities/removeSampleOrganizationUtil.ts | 44 + src/utilities/reuploadDuplicateCheck.ts | 79 + src/utilities/superAdminCheck.ts | 23 + src/utilities/uploadImage.ts | 75 + src/utilities/userFamilyAdminCheck.ts | 44 + talawa-api-docs/.nojekyll | 1 + talawa-api-docs/README.md | 57 + ...izeLimitExceeded.ImageSizeLimitExceeded.md | 212 + ...rrors_applicationError.ApplicationError.md | 221 + ...ries_errors_conflictError.ConflictError.md | 212 + ...putValidationError.InputValidationError.md | 212 + ...internalServerError.InternalServerError.md | 212 + ...validFileTypeError.InvalidFileTypeError.md | 212 + ...ries_errors_notFoundError.NotFoundError.md | 212 + ...authenticatedError.UnauthenticatedError.md | 212 + ...ors_unauthorizedError.UnauthorizedError.md | 212 + ..._errors_validationError.ValidationError.md | 210 + .../enums/constants.TransactionLogTypes.md | 43 + ...ries_dbLogger.InterfaceLoggableDocument.md | 1917 + ...braries_dbLogger.InterfaceLoggableQuery.md | 3439 + ..._errors_applicationError.InterfaceError.md | 54 + .../middleware_isAuth.InterfaceAuthData.md | 43 + .../models_ActionItem.InterfaceActionItem.md | 166 + ...temCategory.InterfaceActionItemCategory.md | 89 + ...ls_Advertisement.InterfaceAdvertisement.md | 122 + .../models_CheckIn.InterfaceCheckIn.md | 76 + .../models_Comment.InterfaceComment.md | 111 + .../models_DirectChat.InterfaceDirectChat.md | 100 + ...tChatMessage.InterfaceDirectChatMessage.md | 100 + .../models_Donation.InterfaceDonation.md | 100 + ...dels_EncodedImage.InterfaceEncodedImage.md | 56 + ...dels_EncodedVideo.InterfaceEncodedVideo.md | 56 + .../interfaces/models_Event.InterfaceEvent.md | 254 + ...ls_EventAttendee.InterfaceEventAttendee.md | 54 + .../models_Feedback.InterfaceFeedback.md | 76 + .../interfaces/models_File.InterfaceFile.md | 111 + .../interfaces/models_Group.InterfaceGroup.md | 100 + .../models_GroupChat.InterfaceGroupChat.md | 111 + ...upChatMessage.InterfaceGroupChatMessage.md | 89 + .../models_ImageHash.InterfaceImageHash.md | 67 + .../models_Language.InterfaceLanguage.md | 56 + .../models_Language.InterfaceLanguageModel.md | 56 + ...rshipRequest.InterfaceMembershipRequest.md | 56 + .../models_Message.InterfaceMessage.md | 111 + ...models_MessageChat.InterfaceMessageChat.md | 89 + ...dels_Organization.InterfaceOrganization.md | 245 + ...mField.InterfaceOrganizationCustomField.md | 54 + ...ionTagUser.InterfaceOrganizationTagUser.md | 54 + .../models_Plugin.InterfacePlugin.md | 67 + ...models_PluginField.InterfacePluginField.md | 67 + .../interfaces/models_Post.InterfacePost.md | 166 + .../models_SampleData.InterfaceSampleData.md | 32 + .../models_TagUser.InterfaceTagUser.md | 43 + .../interfaces/models_User.InterfaceUser.md | 363 + ..._UserCustomData.InterfaceUserCustomData.md | 56 + ...s_generatedGraphQLTypes.AnyScalarConfig.md | 157 + ...tedGraphQLTypes.CountryCodeScalarConfig.md | 157 + ..._generatedGraphQLTypes.DateScalarConfig.md | 157 + ...eratedGraphQLTypes.DateTimeScalarConfig.md | 157 + ...edGraphQLTypes.EmailAddressScalarConfig.md | 157 + ..._generatedGraphQLTypes.JsonScalarConfig.md | 157 + ...eratedGraphQLTypes.LatitudeScalarConfig.md | 157 + ...ratedGraphQLTypes.LongitudeScalarConfig.md | 157 + ...tedGraphQLTypes.PhoneNumberScalarConfig.md | 157 + ...tedGraphQLTypes.PositiveIntScalarConfig.md | 157 + ...GraphQLTypes.SubscriptionResolverObject.md | 41 + ...aphQLTypes.SubscriptionSubscriberObject.md | 42 + ..._generatedGraphQLTypes.TimeScalarConfig.md | 157 + ...eneratedGraphQLTypes.UploadScalarConfig.md | 157 + ...s_generatedGraphQLTypes.UrlScalarConfig.md | 157 + ...utilities_auth.InterfaceJwtTokenPayload.md | 65 + .../utilities_mailer.InterfaceMailFields.md | 43 + talawa-api-docs/modules.md | 330 + talawa-api-docs/modules/app.md | 51 + talawa-api-docs/modules/checks.md | 23 + talawa-api-docs/modules/config.md | 15 + talawa-api-docs/modules/config_appConfig.md | 29 + .../modules/config_plugins_loadPlugins.md | 23 + talawa-api-docs/modules/constants.md | 1716 + talawa-api-docs/modules/db.md | 52 + ...iveTransformer_authDirectiveTransformer.md | 30 + ...iveTransformer_roleDirectiveTransformer.md | 30 + talawa-api-docs/modules/env.md | 37 + .../modules/helpers_eventInstances.md | 22 + .../modules/helpers_eventInstances_once.md | 32 + .../modules/helpers_eventInstances_weekly.md | 32 + talawa-api-docs/modules/index.md | 19 + talawa-api-docs/modules/libraries.md | 43 + talawa-api-docs/modules/libraries_dbLogger.md | 79 + talawa-api-docs/modules/libraries_errors.md | 85 + ...libraries_errors_ImageSizeLimitExceeded.md | 9 + .../libraries_errors_applicationError.md | 13 + .../modules/libraries_errors_conflictError.md | 9 + .../libraries_errors_inputValidationError.md | 9 + .../libraries_errors_internalServerError.md | 9 + .../libraries_errors_invalidFileTypeError.md | 9 + .../modules/libraries_errors_notFoundError.md | 9 + .../libraries_errors_unauthenticatedError.md | 9 + .../libraries_errors_unauthorizedError.md | 9 + .../libraries_errors_validationError.md | 9 + talawa-api-docs/modules/libraries_logger.md | 36 + .../modules/libraries_requestContext.md | 196 + .../modules/libraries_requestTracing.md | 126 + .../libraries_validators_compareDates.md | 30 + ...aries_validators_validatePaginationArgs.md | 29 + .../libraries_validators_validatePassword.md | 3 + .../libraries_validators_validateString.md | 34 + talawa-api-docs/modules/middleware.md | 22 + talawa-api-docs/modules/middleware_isAuth.md | 37 + talawa-api-docs/modules/models.md | 421 + talawa-api-docs/modules/models_ActionItem.md | 23 + .../modules/models_ActionItemCategory.md | 23 + .../modules/models_Advertisement.md | 23 + talawa-api-docs/modules/models_CheckIn.md | 23 + talawa-api-docs/modules/models_Comment.md | 23 + talawa-api-docs/modules/models_DirectChat.md | 23 + .../modules/models_DirectChatMessage.md | 23 + talawa-api-docs/modules/models_Donation.md | 23 + .../modules/models_EncodedImage.md | 23 + .../modules/models_EncodedVideo.md | 23 + talawa-api-docs/modules/models_Event.md | 23 + .../modules/models_EventAttendee.md | 23 + talawa-api-docs/modules/models_Feedback.md | 23 + talawa-api-docs/modules/models_File.md | 23 + talawa-api-docs/modules/models_Group.md | 23 + talawa-api-docs/modules/models_GroupChat.md | 23 + .../modules/models_GroupChatMessage.md | 23 + talawa-api-docs/modules/models_ImageHash.md | 23 + talawa-api-docs/modules/models_Language.md | 24 + .../modules/models_MembershipRequest.md | 23 + talawa-api-docs/modules/models_Message.md | 23 + talawa-api-docs/modules/models_MessageChat.md | 23 + .../modules/models_Organization.md | 23 + .../modules/models_OrganizationCustomField.md | 23 + .../modules/models_OrganizationTagUser.md | 23 + talawa-api-docs/modules/models_Plugin.md | 23 + talawa-api-docs/modules/models_PluginField.md | 23 + talawa-api-docs/modules/models_Post.md | 23 + talawa-api-docs/modules/models_SampleData.md | 23 + talawa-api-docs/modules/models_TagUser.md | 23 + talawa-api-docs/modules/models_User.md | 23 + .../modules/models_UserCustomData.md | 23 + talawa-api-docs/modules/resolvers.md | 19 + .../modules/resolvers_ActionItem.md | 19 + .../modules/resolvers_ActionItemCategory.md | 19 + .../resolvers_ActionItemCategory_creator.md | 19 + ...solvers_ActionItemCategory_organization.md | 19 + ...resolvers_ActionItem_actionItemCategory.md | 19 + .../modules/resolvers_ActionItem_assignee.md | 19 + .../modules/resolvers_ActionItem_assigner.md | 19 + .../modules/resolvers_ActionItem_creator.md | 19 + .../modules/resolvers_ActionItem_event.md | 19 + talawa-api-docs/modules/resolvers_CheckIn.md | 19 + .../modules/resolvers_CheckIn_event.md | 19 + .../modules/resolvers_CheckIn_user.md | 19 + talawa-api-docs/modules/resolvers_Comment.md | 19 + .../modules/resolvers_Comment_creator.md | 19 + .../modules/resolvers_DirectChat.md | 19 + .../modules/resolvers_DirectChatMessage.md | 19 + ...tChatMessage_directChatMessageBelongsTo.md | 25 + .../resolvers_DirectChatMessage_receiver.md | 25 + .../resolvers_DirectChatMessage_sender.md | 25 + .../modules/resolvers_DirectChat_creator.md | 25 + .../modules/resolvers_DirectChat_messages.md | 25 + .../resolvers_DirectChat_organization.md | 25 + .../modules/resolvers_DirectChat_users.md | 25 + talawa-api-docs/modules/resolvers_Event.md | 19 + .../modules/resolvers_Event_actionItems.md | 25 + .../modules/resolvers_Event_attendees.md | 19 + .../resolvers_Event_attendeesCheckInStatus.md | 19 + .../resolvers_Event_averageFeedbackScore.md | 19 + .../modules/resolvers_Event_creator.md | 19 + .../modules/resolvers_Event_feedback.md | 19 + .../modules/resolvers_Event_organization.md | 19 + talawa-api-docs/modules/resolvers_Feedback.md | 19 + .../modules/resolvers_Feedback_event.md | 19 + .../modules/resolvers_GroupChat.md | 19 + .../modules/resolvers_GroupChatMessage.md | 19 + ...upChatMessage_groupChatMessageBelongsTo.md | 25 + .../resolvers_GroupChatMessage_sender.md | 25 + .../modules/resolvers_GroupChat_creator.md | 25 + .../modules/resolvers_GroupChat_messages.md | 25 + .../resolvers_GroupChat_organization.md | 25 + .../modules/resolvers_GroupChat_users.md | 25 + .../modules/resolvers_MembershipRequest.md | 19 + ...esolvers_MembershipRequest_organization.md | 25 + .../resolvers_MembershipRequest_user.md | 25 + talawa-api-docs/modules/resolvers_Mutation.md | 19 + .../modules/resolvers_Mutation_acceptAdmin.md | 40 + ...olvers_Mutation_acceptMembershipRequest.md | 43 + .../resolvers_Mutation_addEventAttendee.md | 19 + .../modules/resolvers_Mutation_addFeedback.md | 19 + ...solvers_Mutation_addLanguageTranslation.md | 36 + ...ers_Mutation_addOrganizationCustomField.md | 42 + ...resolvers_Mutation_addOrganizationImage.md | 41 + .../resolvers_Mutation_addUserCustomData.md | 40 + .../resolvers_Mutation_addUserImage.md | 39 + .../resolvers_Mutation_addUserToGroupChat.md | 43 + .../resolvers_Mutation_adminRemoveEvent.md | 42 + .../resolvers_Mutation_adminRemoveGroup.md | 42 + .../resolvers_Mutation_assignUserTag.md | 19 + ...utation_blockPluginCreationBySuperadmin.md | 40 + .../modules/resolvers_Mutation_blockUser.md | 42 + ...olvers_Mutation_cancelMembershipRequest.md | 42 + .../modules/resolvers_Mutation_checkIn.md | 19 + .../resolvers_Mutation_createActionItem.md | 45 + ...lvers_Mutation_createActionItemCategory.md | 42 + .../modules/resolvers_Mutation_createAdmin.md | 43 + .../resolvers_Mutation_createAdvertisement.md | 19 + .../resolvers_Mutation_createComment.md | 39 + .../resolvers_Mutation_createDirectChat.md | 40 + .../resolvers_Mutation_createDonation.md | 33 + .../modules/resolvers_Mutation_createEvent.md | 41 + .../resolvers_Mutation_createGroupChat.md | 40 + .../resolvers_Mutation_createMember.md | 42 + .../resolvers_Mutation_createMessageChat.md | 40 + .../resolvers_Mutation_createOrganization.md | 39 + .../resolvers_Mutation_createPlugin.md | 33 + .../modules/resolvers_Mutation_createPost.md | 40 + ...lvers_Mutation_createSampleOrganization.md | 21 + .../resolvers_Mutation_createUserTag.md | 19 + ...olvers_Mutation_deleteAdvertisementById.md | 29 + .../resolvers_Mutation_deleteDonationById.md | 29 + .../resolvers_Mutation_forgotPassword.md | 38 + ...solvers_Mutation_joinPublicOrganization.md | 42 + .../resolvers_Mutation_leaveOrganization.md | 42 + .../modules/resolvers_Mutation_likeComment.md | 41 + .../modules/resolvers_Mutation_likePost.md | 41 + .../modules/resolvers_Mutation_login.md | 36 + .../modules/resolvers_Mutation_logout.md | 39 + .../modules/resolvers_Mutation_otp.md | 35 + .../modules/resolvers_Mutation_recaptcha.md | 29 + .../resolvers_Mutation_refreshToken.md | 29 + .../resolvers_Mutation_registerForEvent.md | 41 + .../modules/resolvers_Mutation_rejectAdmin.md | 41 + ...olvers_Mutation_rejectMembershipRequest.md | 42 + .../resolvers_Mutation_removeActionItem.md | 41 + .../modules/resolvers_Mutation_removeAdmin.md | 42 + .../resolvers_Mutation_removeAdvertisement.md | 19 + .../resolvers_Mutation_removeComment.md | 41 + .../resolvers_Mutation_removeDirectChat.md | 41 + .../modules/resolvers_Mutation_removeEvent.md | 42 + .../resolvers_Mutation_removeEventAttendee.md | 19 + .../resolvers_Mutation_removeGroupChat.md | 41 + .../resolvers_Mutation_removeMember.md | 42 + .../resolvers_Mutation_removeOrganization.md | 41 + ..._Mutation_removeOrganizationCustomField.md | 42 + ...olvers_Mutation_removeOrganizationImage.md | 41 + .../modules/resolvers_Mutation_removePost.md | 42 + ...lvers_Mutation_removeSampleOrganization.md | 19 + ...resolvers_Mutation_removeUserCustomData.md | 19 + ...olvers_Mutation_removeUserFromGroupChat.md | 42 + .../resolvers_Mutation_removeUserImage.md | 40 + .../resolvers_Mutation_removeUserTag.md | 19 + ...vers_Mutation_revokeRefreshTokenForUser.md | 29 + .../resolvers_Mutation_saveFcmToken.md | 39 + ...esolvers_Mutation_sendMembershipRequest.md | 41 + ...olvers_Mutation_sendMessageToDirectChat.md | 40 + ...solvers_Mutation_sendMessageToGroupChat.md | 41 + .../modules/resolvers_Mutation_signUp.md | 29 + .../resolvers_Mutation_togglePostPin.md | 19 + .../resolvers_Mutation_unassignUserTag.md | 19 + .../modules/resolvers_Mutation_unblockUser.md | 41 + .../resolvers_Mutation_unlikeComment.md | 40 + .../modules/resolvers_Mutation_unlikePost.md | 40 + ...lvers_Mutation_unregisterForEventByUser.md | 41 + .../resolvers_Mutation_updateActionItem.md | 19 + ...lvers_Mutation_updateActionItemCategory.md | 19 + .../resolvers_Mutation_updateAdvertisement.md | 19 + .../modules/resolvers_Mutation_updateEvent.md | 41 + .../resolvers_Mutation_updateLanguage.md | 39 + .../resolvers_Mutation_updateOrganization.md | 40 + .../resolvers_Mutation_updatePluginStatus.md | 33 + .../modules/resolvers_Mutation_updatePost.md | 19 + .../resolvers_Mutation_updateUserPassword.md | 19 + .../resolvers_Mutation_updateUserProfile.md | 39 + ...s_Mutation_updateUserRoleInOrganization.md | 33 + .../resolvers_Mutation_updateUserTag.md | 19 + .../resolvers_Mutation_updateUserType.md | 39 + .../modules/resolvers_Organization.md | 19 + ...lvers_Organization_actionItemCategories.md | 25 + .../modules/resolvers_Organization_admins.md | 25 + .../resolvers_Organization_blockedUsers.md | 25 + .../modules/resolvers_Organization_creator.md | 25 + .../modules/resolvers_Organization_image.md | 19 + .../modules/resolvers_Organization_members.md | 25 + ...solvers_Organization_membershipRequests.md | 25 + .../resolvers_Organization_pinnedPosts.md | 19 + talawa-api-docs/modules/resolvers_Post.md | 19 + .../modules/resolvers_Post_comments.md | 19 + .../modules/resolvers_Post_creator.md | 19 + talawa-api-docs/modules/resolvers_Query.md | 19 + .../modules/resolvers_Query_actionItem.md | 32 + ...uery_actionItemCategoriesByOrganization.md | 27 + .../resolvers_Query_actionItemCategory.md | 32 + .../resolvers_Query_actionItemsByEvent.md | 27 + ...solvers_Query_actionItemsByOrganization.md | 27 + .../modules/resolvers_Query_checkAuth.md | 37 + ...esolvers_Query_customDataByOrganization.md | 27 + ...olvers_Query_customFieldsByOrganization.md | 27 + .../resolvers_Query_directChatsByUserID.md | 32 + ...lvers_Query_directChatsMessagesByChatID.md | 32 + .../modules/resolvers_Query_event.md | 32 + .../resolvers_Query_eventsByOrganization.md | 27 + ...rs_Query_eventsByOrganizationConnection.md | 19 + .../resolvers_Query_getAdvertisements.md | 21 + .../resolvers_Query_getDonationById.md | 27 + .../resolvers_Query_getDonationByOrgId.md | 27 + ...vers_Query_getDonationByOrgIdConnection.md | 19 + .../modules/resolvers_Query_getPlugins.md | 21 + .../modules/resolvers_Query_getlanguage.md | 27 + .../resolvers_Query_hasSubmittedFeedback.md | 19 + ...resolvers_Query_helperFunctions_getSort.md | 29 + ...esolvers_Query_helperFunctions_getWhere.md | 51 + talawa-api-docs/modules/resolvers_Query_me.md | 29 + .../modules/resolvers_Query_myLanguage.md | 29 + .../resolvers_Query_organizationIsSample.md | 19 + .../modules/resolvers_Query_organizations.md | 32 + ...resolvers_Query_organizationsConnection.md | 35 + ...ers_Query_organizationsMemberConnection.md | 35 + .../modules/resolvers_Query_post.md | 27 + .../resolvers_Query_postsByOrganization.md | 31 + ...ers_Query_postsByOrganizationConnection.md | 35 + .../resolvers_Query_registeredEventsByUser.md | 31 + .../modules/resolvers_Query_user.md | 29 + .../modules/resolvers_Query_userLanguage.md | 27 + .../modules/resolvers_Query_users.md | 33 + .../resolvers_Query_usersConnection.md | 32 + .../modules/resolvers_Subscription.md | 19 + ...esolvers_Subscription_directMessageChat.md | 28 + ...rs_Subscription_messageSentToDirectChat.md | 53 + ...ers_Subscription_messageSentToGroupChat.md | 53 + .../resolvers_Subscription_onPluginUpdate.md | 53 + talawa-api-docs/modules/resolvers_User.md | 19 + talawa-api-docs/modules/resolvers_UserTag.md | 19 + .../modules/resolvers_UserTag_childTags.md | 19 + .../modules/resolvers_UserTag_organization.md | 19 + .../modules/resolvers_UserTag_parentTag.md | 19 + .../resolvers_UserTag_usersAssignedTo.md | 19 + .../resolvers_middleware_currentUserExists.md | 51 + talawa-api-docs/modules/server.md | 3 + .../services_CommentCache_cacheComments.md | 29 + ...ces_CommentCache_deleteCommentFromCache.md | 29 + ...ommentCache_findCommentsByPostIdInCache.md | 29 + ...rvices_CommentCache_findCommentsInCache.md | 29 + .../services_EventCache_cacheEvents.md | 29 + ...ervices_EventCache_deleteEventFromCache.md | 29 + .../services_EventCache_findEventInCache.md | 29 + ...es_OrganizationCache_cacheOrganizations.md | 29 + ...zationCache_deleteOrganizationFromCache.md | 29 + ...anizationCache_findOrganizationsInCache.md | 29 + .../modules/services_PostCache_cachePosts.md | 29 + .../services_PostCache_deletePostFromCache.md | 29 + .../services_PostCache_findPostsInCache.md | 29 + .../modules/services_redisCache.md | 19 + talawa-api-docs/modules/typeDefs.md | 19 + .../modules/typeDefs_directives.md | 19 + talawa-api-docs/modules/typeDefs_enums.md | 19 + talawa-api-docs/modules/typeDefs_errors.md | 19 + .../modules/typeDefs_errors_common.md | 19 + .../typeDefs_errors_connectionError.md | 19 + talawa-api-docs/modules/typeDefs_inputs.md | 19 + .../modules/typeDefs_interfaces.md | 19 + talawa-api-docs/modules/typeDefs_mutations.md | 21 + talawa-api-docs/modules/typeDefs_queries.md | 21 + talawa-api-docs/modules/typeDefs_scalars.md | 19 + .../modules/typeDefs_subscriptions.md | 19 + talawa-api-docs/modules/typeDefs_types.md | 19 + talawa-api-docs/modules/typeDefs_unions.md | 19 + .../modules/types_generatedGraphQLTypes.md | 7741 + talawa-api-docs/modules/utilities.md | 85 + .../modules/utilities_PII_decryption.md | 31 + .../modules/utilities_PII_encryption.md | 31 + .../modules/utilities_PII_isAuthorised.md | 30 + .../modules/utilities_adminCheck.md | 38 + talawa-api-docs/modules/utilities_auth.md | 80 + .../modules/utilities_copyToClipboard.md | 35 + .../utilities_createSampleOrganizationUtil.md | 111 + .../utilities_deleteDuplicatedImage.md | 31 + .../modules/utilities_deleteImage.md | 34 + ...encodedImageStorage_deletePreviousImage.md | 29 + ...ImageStorage_encodedImageExtensionCheck.md | 29 + ..._encodedImageStorage_uploadEncodedImage.md | 30 + ...encodedVideoStorage_deletePreviousVideo.md | 29 + ...VideoStorage_encodedVideoExtensionCheck.md | 29 + ..._encodedVideoStorage_uploadEncodedVideo.md | 30 + .../utilities_graphqlConnectionFactory.md | 123 + .../utilities_imageAlreadyInDbCheck.md | 36 + .../modules/utilities_imageExtensionCheck.md | 33 + .../modules/utilities_loadSampleData.md | 3 + talawa-api-docs/modules/utilities_mailer.md | 41 + .../utilities_removeSampleOrganizationUtil.md | 23 + .../utilities_reuploadDuplicateCheck.md | 53 + .../modules/utilities_superAdminCheck.md | 29 + .../modules/utilities_uploadImage.md | 38 + .../authDirectiveTransformer.spec.ts | 205 + .../roleDirectiveTransformer.spec.ts | 110 + tests/helpers/Fund.ts | 32 + tests/helpers/FundraisingCampaign.ts | 46 + tests/helpers/FundraisingCampaignPledge.ts | 86 + tests/helpers/actionItem.ts | 142 + tests/helpers/actionItemCategory.ts | 43 + tests/helpers/advertisement.ts | 58 + tests/helpers/agendaCategory.ts | 71 + tests/helpers/agendaItem.ts | 95 + tests/helpers/agendaSection.ts | 131 + tests/helpers/checkIn.ts | 39 + tests/helpers/community.ts | 25 + tests/helpers/db.ts | 34 + tests/helpers/directChat.ts | 108 + tests/helpers/donation.ts | 66 + tests/helpers/events.ts | 173 + tests/helpers/eventsWithRegistrants.ts | 56 + tests/helpers/feedback.ts | 45 + tests/helpers/globalSetup.ts | 15 + tests/helpers/group.ts | 24 + tests/helpers/groupChat.ts | 61 + tests/helpers/membershipRequests.ts | 122 + tests/helpers/note.ts | 3 + tests/helpers/plugins.ts | 27 + tests/helpers/posts.ts | 137 + tests/helpers/tags.ts | 115 + tests/helpers/user.ts | 35 + tests/helpers/userAndOrg.ts | 145 + tests/helpers/userAndUserFamily.ts | 77 + tests/helpers/venue.ts | 51 + tests/libraries/dbLogger.spec.ts | 120 + .../errors/ImageSizeLimitExceeded.ts.spec.ts | 26 + .../errors/inputValidationError.spec.ts | 26 + .../errors/internalServerError.spec.ts | 24 + .../errors/invalidFileTypeError.spec.ts | 26 + .../errors/unauthenticatedError.spec.ts | 24 + tests/libraries/logger.spec.ts | 83 + tests/libraries/requestContext.spec.ts | 152 + tests/libraries/requestTracing.spec.ts | 91 + tests/middleware/isAuth.spec.ts | 199 + .../ActionItemCategory/creator.spec.ts | 36 + .../Advertisement/organization.spec.ts | 36 + .../AgendaCategory/createdBy.spec.ts | 36 + .../AgendaCategory/organization.spec.ts | 52 + .../AgendaCategory/updatedBy.spec.ts | 61 + tests/resolvers/AgendaItem/Users.spec.ts | 76 + tests/resolvers/AgendaItem/categories.spec.ts | 107 + tests/resolvers/AgendaItem/createdby.spec.ts | 88 + .../resolvers/AgendaItem/organization.spec.ts | 80 + .../resolvers/AgendaItem/relatedEvent.spec.ts | 79 + tests/resolvers/AgendaItem/updatedBy.spec.ts | 87 + .../resolvers/AgendaSection/createdBy.spec.ts | 115 + tests/resolvers/AgendaSection/items.spec.ts | 106 + .../AgendaSection/relatedEvent.spec.ts | 96 + tests/resolvers/CheckIn/event.spec.ts | 38 + tests/resolvers/CheckIn/user.spec.ts | 38 + tests/resolvers/Comment/creator.spec.ts | 46 + tests/resolvers/DirectChat/creator.spec.ts | 38 + tests/resolvers/DirectChat/messages.spec.ts | 40 + .../resolvers/DirectChat/organization.spec.ts | 53 + tests/resolvers/DirectChat/users.spec.ts | 40 + .../directChatMessageBelongsTo.spec.ts | 75 + .../DirectChatMessage/receiver.spec.ts | 64 + .../DirectChatMessage/sender.spec.ts | 63 + tests/resolvers/Event/actionItems.spec.ts | 35 + tests/resolvers/Event/attendees.spec.ts | 38 + .../Event/attendeesCheckInStatus.spec.ts | 46 + .../Event/averageFeedbackScore.spec.ts | 58 + .../Event/baseRecurringEvent.spec.ts | 87 + tests/resolvers/Event/creator.spec.ts | 38 + tests/resolvers/Event/feedback.spec.ts | 34 + tests/resolvers/Event/organization.spec.ts | 39 + tests/resolvers/Event/recurrenceRule.spec.ts | 88 + .../resolvers/EventVolunteer/creator.spec.ts | 46 + tests/resolvers/EventVolunteer/event.spec.ts | 38 + tests/resolvers/EventVolunteer/group.spec.ts | 72 + tests/resolvers/EventVolunteer/user.spec.ts | 52 + .../EventVolunteerGroup/creator.spec.ts | 45 + .../EventVolunteerGroup/event.spec.ts | 45 + .../EventVolunteerGroup/leader.spec.ts | 45 + tests/resolvers/Feedback/event.spec.ts | 33 + tests/resolvers/Fund/creator.spec.ts | 37 + .../FundCampaignPledges/users.spec.ts | 39 + tests/resolvers/GroupChat/creator.spec.ts | 40 + tests/resolvers/GroupChat/messages.spec.ts | 39 + .../resolvers/GroupChat/organization.spec.ts | 46 + tests/resolvers/GroupChat/users.spec.ts | 39 + .../groupChatMessageBelongsTo.spec.ts | 65 + .../resolvers/GroupChatMessage/sender.spec.ts | 64 + .../MembershipRequest/organization.spec.ts | 65 + .../resolvers/MembershipRequest/user.spec.ts | 64 + .../Mutation/acceptMembershipRequest.spec.ts | 305 + .../Mutation/addEventAttendee.spec.ts | 294 + tests/resolvers/Mutation/addFeedback.spec.ts | 205 + .../Mutation/addLanguageTranslation.spec.ts | 101 + .../addOrganizationCustomField.spec.ts | 213 + .../Mutation/addOrganizationImage.spec.ts | 110 + .../addPledgeToFundraisingCampaign.spec.ts | 150 + .../Mutation/addUserCustomData.spec.ts | 101 + tests/resolvers/Mutation/addUserImage.spec.ts | 99 + .../Mutation/addUserToGroupChat.spec.ts | 274 + .../Mutation/addUserToUserFamily.spec.ts | 154 + .../Mutation/adminRemoveGroup.spec.ts | 227 + .../resolvers/Mutation/assignUserTag.spec.ts | 342 + .../blockPluginCreationBySuperadmin.spec.ts | 191 + tests/resolvers/Mutation/blockUser.spec.ts | 311 + .../Mutation/cancelMembershipRequest.spec.ts | 194 + tests/resolvers/Mutation/checkIn.spec.ts | 271 + tests/resolvers/Mutation/checkOut.spec.ts | 323 + .../Mutation/createActionItem.spec.ts | 341 + .../Mutation/createActionItemCategory.spec.ts | 166 + tests/resolvers/Mutation/createAdmin.spec.ts | 341 + .../Mutation/createAdvertisement.spec.ts | 233 + .../Mutation/createAgendaCategory.spec.ts | 234 + .../Mutation/createAgendaItem.spec.ts | 389 + .../Mutation/createAgendaSection.spec.ts | 210 + .../resolvers/Mutation/createComment.spec.ts | 88 + .../Mutation/createDirectChat.spec.ts | 129 + .../resolvers/Mutation/createDonation.spec.ts | 53 + tests/resolvers/Mutation/createEvent.spec.ts | 1669 + .../Mutation/createEventVolunteer.spec.ts | 252 + .../createEventVolunteerGroup.spec.ts | 172 + tests/resolvers/Mutation/createFund.spec.ts | 166 + .../Mutation/createFundCampaignPledge.spec.ts | 168 + .../createFundraisingCampaign.spec.ts | 248 + .../Mutation/createGroupChat.spec.ts | 110 + tests/resolvers/Mutation/createMember.spec.ts | 252 + .../Mutation/createMessageChat.spec.ts | 239 + tests/resolvers/Mutation/createNote.spec.ts | 232 + .../Mutation/createOrganization.spec.ts | 527 + tests/resolvers/Mutation/createPlugin.spec.ts | 42 + tests/resolvers/Mutation/createPost.spec.ts | 612 + .../Mutation/createSampleOrganization.spec.ts | 157 + .../Mutation/createUserFamily.spec.ts | 215 + .../resolvers/Mutation/createUserTag.spec.ts | 346 + tests/resolvers/Mutation/createVenue.spec.ts | 326 + .../Mutation/deleteAdvertisement.spec.ts | 266 + .../Mutation/deleteAgendaCategory.spec.ts | 237 + .../Mutation/deleteDonationById.spec.ts | 71 + tests/resolvers/Mutation/deleteNote.spec.ts | 179 + tests/resolvers/Mutation/deleteVenue.spec.ts | 238 + tests/resolvers/Mutation/editVenue.spec.ts | 379 + .../resolvers/Mutation/forgotPassword.spec.ts | 198 + .../Mutation/inviteEventAttendee.spec.ts | 248 + .../Mutation/joinPublicOrganization.spec.ts | 263 + .../Mutation/leaveOrganization.spec.ts | 224 + tests/resolvers/Mutation/likeComment.spec.ts | 123 + tests/resolvers/Mutation/likePost.spec.ts | 99 + tests/resolvers/Mutation/login.spec.ts | 270 + tests/resolvers/Mutation/logout.spec.ts | 54 + tests/resolvers/Mutation/otp.spec.ts | 67 + tests/resolvers/Mutation/recaptcha.spec.ts | 17 + tests/resolvers/Mutation/refreshToken.spec.ts | 352 + .../Mutation/registerEventAttendee.spec.ts | 337 + .../Mutation/registerForEvent.spec.ts | 204 + .../Mutation/rejectMembershipRequest.spec.ts | 262 + .../Mutation/removeActionItem.spec.ts | 285 + tests/resolvers/Mutation/removeAdmin.spec.ts | 400 + .../Mutation/removeAgendaItem.spec.ts | 228 + .../Mutation/removeAgendaSection.spec.ts | 222 + .../resolvers/Mutation/removeComment.spec.ts | 269 + .../Mutation/removeDirectChat.spec.ts | 228 + tests/resolvers/Mutation/removeEvent.spec.ts | 1187 + .../Mutation/removeEventAttendee.spec.ts | 243 + .../Mutation/removeEventVolunteer.spec.ts | 179 + .../removeEventVolunteerGroup.spec.ts | 174 + .../Mutation/removeFundCampaignPledge.spec.ts | 86 + .../Mutation/removeGroupChat.spec.ts | 243 + tests/resolvers/Mutation/removeMember.spec.ts | 357 + .../Mutation/removeOrganization.spec.ts | 498 + .../removeOrganizationCustomField.spec.ts | 245 + .../Mutation/removeOrganizationImage.spec.ts | 226 + tests/resolvers/Mutation/removePost.spec.ts | 267 + .../Mutation/removeSampleOrganization.spec.ts | 287 + .../Mutation/removeUserCustomData.spec.ts | 258 + .../Mutation/removeUserFamily.spec.ts | 172 + .../Mutation/removeUserFromGroupChat.spec.ts | 228 + .../Mutation/removeUserFromUserFamily.spec.ts | 289 + .../Mutation/removeUserImage.spec.ts | 137 + .../resolvers/Mutation/removeUserTag.spec.ts | 230 + .../resolvers/Mutation/resetCommunity.spec.ts | 143 + .../revokeRefreshTokenForUser.spec.ts | 43 + tests/resolvers/Mutation/saveFcmToken.spec.ts | 46 + .../Mutation/sendMembershipRequest.spec.ts | 276 + .../Mutation/sendMessageToDirectChat.spec.ts | 178 + .../Mutation/sendMessageToGroupChat.spec.ts | 170 + tests/resolvers/Mutation/signUp.spec.ts | 360 + .../resolvers/Mutation/togglePostPin.spec.ts | 314 + .../Mutation/unassignUserTag.spec.ts | 330 + tests/resolvers/Mutation/unblockUser.spec.ts | 350 + .../resolvers/Mutation/unlikeComment.spec.ts | 125 + tests/resolvers/Mutation/unlikePost.spec.ts | 101 + .../Mutation/unregisterForEventByUser.spec.ts | 140 + .../Mutation/updateActionItem.spec.ts | 336 + .../Mutation/updateActionItemCategory.spec.ts | 208 + .../Mutation/updateAdvertisement.spec.ts | 591 + .../Mutation/updateAgendaCategory.spec.ts | 247 + .../Mutation/updateAgendaItem.spec.ts | 216 + .../Mutation/updateAgendaSection.spec.ts | 160 + .../Mutation/updateCommunity.spec.ts | 212 + tests/resolvers/Mutation/updateEvent.spec.ts | 1852 + .../Mutation/updateEventVolunteer.spec.ts | 200 + .../updateEventVolunteerGroup.spec.ts | 217 + tests/resolvers/Mutation/updateFund.spec.ts | 205 + .../Mutation/updateFundCampaignPledge.spec.ts | 166 + .../updateFundraisingCampaign.spec.ts | 275 + .../resolvers/Mutation/updateLanguage.spec.ts | 63 + tests/resolvers/Mutation/updateNote.spec.ts | 218 + .../Mutation/updateOrganization.spec.ts | 227 + .../Mutation/updatePluginStatus.spec.ts | 135 + tests/resolvers/Mutation/updatePost.spec.ts | 342 + .../Mutation/updateUserPassword.spec.ts | 236 + .../Mutation/updateUserProfile.spec.ts | 718 + .../updateUserRoleInOrganization.spec.ts | 564 + .../resolvers/Mutation/updateUserTag.spec.ts | 251 + .../Organization/actionItemCategories.spec.ts | 39 + tests/resolvers/Organization/admins.spec.ts | 38 + .../Organization/advertisements.spec.ts | 148 + .../Organization/agendaCategories.spec.ts | 74 + .../Organization/blockedUsers.spec.ts | 37 + tests/resolvers/Organization/creator.spec.ts | 110 + tests/resolvers/Organization/funds.spec.ts | 32 + tests/resolvers/Organization/image.spec.ts | 98 + tests/resolvers/Organization/members.spec.ts | 37 + .../Organization/membershipRequests.spec.ts | 123 + .../Organization/pinnedPosts.spec.ts | 73 + tests/resolvers/Organization/posts.spec.ts | 168 + tests/resolvers/Organization/userTags.spec.ts | 118 + tests/resolvers/Organization/venues.spec.ts | 46 + tests/resolvers/Post/comments.spec.ts | 72 + tests/resolvers/Post/creator.spec.ts | 42 + tests/resolvers/Post/likedBy.spec.ts | 82 + ...actionItemCategoriesByOrganization.spec.ts | 40 + .../Query/actionItemsByEvent.spec.ts | 41 + .../Query/actionItemsByOrganization.spec.ts | 270 + .../Query/advertisementsConnection.spec.ts | 147 + tests/resolvers/Query/agendaCategory.spec.ts | 79 + .../resolvers/Query/agendaItemByEvent.spec.ts | 35 + tests/resolvers/Query/agendaItemById.spec.ts | 104 + .../Query/agendaItemByOrganization.spec.ts | 39 + ...agendaItemCategoriesByOrganization.spec.ts | 40 + tests/resolvers/Query/checkAuth.spec.ts | 91 + .../Query/customDataByOrganization.spec.ts | 52 + .../Query/customFieldsByOrganization.spec.ts | 89 + tests/resolvers/Query/directChatById.spec.ts | 58 + .../Query/directChatsByUserID.spec.ts | 58 + .../Query/directChatsMessagesByChatID.spec.ts | 96 + tests/resolvers/Query/event.spec.ts | 58 + .../Query/eventVolunteersByEvent.spec.ts | 40 + .../Query/eventsByOrganization.spec.ts | 67 + .../eventsByOrganizationConnection.spec.ts | 642 + .../Query/fundsByOrganization.spec.ts | 39 + .../resolvers/Query/getAgendaSection.spec.ts | 132 + .../resolvers/Query/getAllAgendaItems.spec.ts | 101 + .../Query/getAllNotesForAgendaItem.spec.ts | 113 + .../Query/getCampaignPledgesById.spec.ts | 42 + .../resolvers/Query/getCommunityData.spec.ts | 31 + tests/resolvers/Query/getDonationById.spec.ts | 50 + .../Query/getDonationByOrgId.spec.ts | 42 + .../getDonationByOrgIdConnection.spec.ts | 276 + .../resolvers/Query/getEventAttendee.spec.ts | 59 + .../Query/getEventAttendeesByEventId.spec.ts | 64 + .../Query/getEventInvitesByUserId.spec.ts | 65 + .../Query/getEventVolunteerGroups.spec.ts | 55 + tests/resolvers/Query/getFundById.spec.ts | 34 + .../Query/getFundRaisingCampaigns.spec.ts | 76 + tests/resolvers/Query/getNoteById.spec.ts | 110 + .../Query/getPledgesByUserId.spec.ts | 129 + tests/resolvers/Query/getPlugins.spec.ts | 28 + tests/resolvers/Query/getUserTag.spec.ts | 56 + .../Query/getUserTagAncestors.spec.ts | 64 + tests/resolvers/Query/getVenueByOrgId.spec.ts | 138 + tests/resolvers/Query/getlanguage.spec.ts | 87 + tests/resolvers/Query/groupChatById.spec.ts | 61 + .../Query/groupChatsByUserId.spec.ts | 58 + .../Query/hasSubmittedFeedback.spec.ts | 174 + .../Query/helperFunctions/getSort.spec.ts | 93 + .../Query/helperFunctions/getWhere.spec.ts | 363 + tests/resolvers/Query/me.spec.ts | 81 + tests/resolvers/Query/myLanguage.spec.ts | 79 + .../Query/organizationIsSample.spec.ts | 128 + tests/resolvers/Query/organizations.spec.ts | 227 + .../Query/organizationsConnection.spec.ts | 417 + .../organizationsMemberConnection.spec.ts | 1254 + tests/resolvers/Query/post.spec.ts | 87 + .../Query/registeredEventsByUser.spec.ts | 551 + tests/resolvers/Query/user.spec.ts | 100 + tests/resolvers/Query/userLanguage.spec.ts | 75 + tests/resolvers/Query/users.spec.ts | 791 + tests/resolvers/Query/usersConnection.spec.ts | 496 + tests/resolvers/Query/venue.spec.ts | 94 + .../RecurrenceRule/baseRecurringEvent.spec.ts | 93 + .../RecurrenceRule/organization.spec.ts | 84 + .../Subscription/directMessageChat.spec.ts | 22 + .../messageSentToDirectChat.spec.ts | 103 + .../messageSentToGroupChat.spec.ts | 83 + .../Subscription/onPluginUpdate.spec.ts | 23 + tests/resolvers/User/post.spec.ts | 278 + tests/resolvers/User/user.spec.ts | 56 + tests/resolvers/UserFamily/admins.spec.ts | 39 + tests/resolvers/UserFamily/creator.spec.ts | 111 + tests/resolvers/UserFamily/users.spec.ts | 39 + tests/resolvers/UserTag/childTags.spec.ts | 120 + tests/resolvers/UserTag/organization.spec.ts | 38 + tests/resolvers/UserTag/parentTag.spec.ts | 47 + .../resolvers/UserTag/usersAssignedTo.spec.ts | 123 + .../middleware/currentUserExists.spec.ts | 63 + tests/setup/accessAndRefreshTokens.spec.ts | 88 + tests/setup/askToKeepValues.spec.ts | 25 + tests/setup/checkExistingMongoDB.spec.ts | 67 + tests/setup/configureSmtp.spec.ts | 107 + tests/setup/getNodeEnvironment.spec.ts | 55 + .../getMinioBinaryUrl.default.spec.ts | 14 + .../getMinioBinaryUrl.linux.spec.ts | 15 + .../getMinioBinaryUrl.macos.spec.ts | 15 + .../getMinioBinaryUrl.windows.spec.ts | 15 + .../minio/installMinio/installMinio.spec.ts | 270 + .../installMinio/installMinio.windows.spec.ts | 117 + .../installMinioSkipCreateDir.spec.ts | 90 + .../isMinioInstalledBinaryFileExists.spec.ts | 45 + ...oInstalledBinaryFileExists.windows.spec.ts | 46 + .../isMinioInstalledCommandAvailable.spec.ts | 18 + .../minioNotInstalled.spec.ts | 28 + .../setPathEnvVar/setPathEnvVar.error.spec.ts | 32 + .../setPathEnvVar/setPathEnvVar.linux.spec.ts | 33 + .../setPathEnvVar/setPathEnvVar.macos.spec.ts | 33 + .../setPathEnvVar.windows.spec.ts | 34 + .../updateIgnoreFile.alreadyPresent.spec.ts | 36 + .../updateIgnoreFile/updateIgnoreFile.spec.ts | 73 + tests/setup/mongoDB.spec.ts | 124 + tests/setup/reCaptcha.spec.ts | 75 + tests/setup/reCaptchaSiteKey.spec.ts | 59 + tests/setup/redisConfiguration.spec.ts | 100 + tests/setup/setImageUploadSize.spec.ts | 120 + tests/setup/setNodeEnvironment.spec.ts | 36 + tests/setup/superAdmin.spec.ts | 47 + tests/setup/twoFactorAuth.spec.ts | 52 + tests/setup/verifySmtpConnection.spec.ts | 62 + tests/utilities/adminCheck.spec.ts | 131 + tests/utilities/auth.spec.ts | 109 + tests/utilities/checkReplicaSet.spec.ts | 58 + .../createSampleOrganizationUtil.spec.ts | 153 + tests/utilities/deleteDuplicatedImage.spec.ts | 43 + tests/utilities/deleteImage.spec.ts | 180 + .../deletePreviousImage.spec.ts | 45 + .../encodedImageExtensionCheck.spec.ts | 37 + .../uploadEncodedImage.spec.ts | 189 + .../deletePreviousVideo.spec.ts | 45 + .../encodedVideoExtensionCheck.spec.ts | 56 + .../uploadEncodedVideo.spec.ts | 146 + tests/utilities/graphqlConnection.spec.ts | 1024 + tests/utilities/imageAlreadyInDbCheck.spec.ts | 201 + tests/utilities/imageExtensionCheck.spec.ts | 50 + tests/utilities/loadDefaultOrg.spec.ts | 31 + tests/utilities/mailer.spec.ts | 81 + .../removeSampleOrganizationUtil.spec.ts | 31 + .../utilities/reuploadDuplicateCheck.spec.ts | 136 + tests/utilities/superAdminCheck.spec.ts | 63 + tests/utilities/uploadImage.spec.ts | 198 + tests/utilities/userFamilyAdminCheck.spec.ts | 142 + tsconfig.build.json | 16 + tsconfig.json | 11 + videos/.gitignore | 4 + vite.config.mts | 60 + 1323 files changed, 609538 insertions(+), 110 deletions(-) create mode 100644 .github/workflows/check-tsdoc.js create mode 100644 .github/workflows/eslint_disable_check.py create mode 100644 CODEOWNERS create mode 100644 CODE_OF_CONDUCT.md create mode 100644 CONTRIBUTING.md create mode 100644 Caddyfile create mode 100644 DOCUMENTATION.md create mode 100644 Dockerfile.dev create mode 100644 Dockerfile.prod create mode 100644 INSTALLATION.md create mode 100644 ISSUE_GUIDELINES.md create mode 100644 LICENSE create mode 100644 PR_GUIDELINES.md create mode 100644 README.md create mode 100644 codegen.ts create mode 100644 config/vitestSetup.ts create mode 100644 docker-compose.dev.yaml create mode 100644 docker-compose.prod.yaml create mode 100644 docs/README.md create mode 100644 images/.gitignore create mode 100644 locales/en.json create mode 100644 locales/fr.json create mode 100644 locales/hi.json create mode 100644 locales/sp.json create mode 100644 locales/zh.json create mode 100644 logs/.gitignore create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 public/markdown/images/GraphQL_Voyager.png create mode 100644 public/markdown/images/colorize-logs.jpg create mode 100644 public/markdown/images/connect_extension_to_mongodb_step_1.webp create mode 100644 public/markdown/images/connect_extension_to_mongodb_step_2.webp create mode 100644 public/markdown/images/install1.png create mode 100644 public/markdown/images/install2.png create mode 100644 public/markdown/images/install3.png create mode 100644 public/markdown/images/install_mongodb_vscode_extension.webp create mode 100644 public/markdown/images/ip-address.png create mode 100644 public/markdown/images/minio-create-bucket.png create mode 100644 public/markdown/images/mino-webui-login.png create mode 100644 public/markdown/images/mongodb_compass_user_elevation.png create mode 100644 public/markdown/images/recaptcha_set_up.webp create mode 100644 public/markdown/images/recaptcha_site_and_secret_key.webp create mode 100644 public/markdown/images/talawa-logo-lite-200x200.png create mode 100644 requirements.txt create mode 100644 sample_data/actionItemCategories.json create mode 100644 sample_data/agendaCategories.json create mode 100644 sample_data/appUserProfiles.json create mode 100644 sample_data/defaultAppUserProfile.json create mode 100644 sample_data/defaultOrganization.json create mode 100644 sample_data/defaultUser.json create mode 100644 sample_data/events.json create mode 100644 sample_data/organizations.json create mode 100644 sample_data/posts.json create mode 100644 sample_data/recurrenceRules.json create mode 100644 sample_data/userFamilies.json create mode 100644 sample_data/users.json create mode 100644 schema.graphql create mode 100644 scripts/cloud-api-demo/README.md create mode 100644 scripts/cloud-api-demo/correct_permissions.py create mode 100644 scripts/cloud-api-demo/create_env.py create mode 100644 scripts/cloud-api-demo/deploy.py create mode 100644 scripts/cloud-api-demo/renew_certificates.py create mode 100644 scripts/cloud-api-demo/reset_database.py create mode 100644 scripts/githooks/update-toc.js create mode 100644 setup.ts create mode 100644 src/app.ts create mode 100644 src/checks.ts create mode 100644 src/config/appConfig.ts create mode 100644 src/config/index.ts create mode 100644 src/config/plugins/loadPlugins.ts create mode 100644 src/config/plugins/pluginData.json create mode 100644 src/constants.ts create mode 100644 src/db.ts create mode 100644 src/directives/directiveTransformer/authDirectiveTransformer.ts create mode 100644 src/directives/directiveTransformer/roleDirectiveTransformer.ts create mode 100644 src/env.ts create mode 100644 src/helpers/event/createEventHelpers/createRecurringEvent.ts create mode 100644 src/helpers/event/createEventHelpers/createRecurringEventInstancesDuringQuery.ts create mode 100644 src/helpers/event/createEventHelpers/createSingleEvent.ts create mode 100644 src/helpers/event/createEventHelpers/index.ts create mode 100644 src/helpers/event/deleteEventHelpers/deleteRecurringEvent.ts create mode 100644 src/helpers/event/deleteEventHelpers/deleteRecurringEventInstances.ts create mode 100644 src/helpers/event/deleteEventHelpers/deleteSingleEvent.ts create mode 100644 src/helpers/event/deleteEventHelpers/index.ts create mode 100644 src/helpers/event/recurringEventHelpers/createRecurrenceRule.ts create mode 100644 src/helpers/event/recurringEventHelpers/generateRecurrenceRuleString.ts create mode 100644 src/helpers/event/recurringEventHelpers/generateRecurringEventInstances.ts create mode 100644 src/helpers/event/recurringEventHelpers/getRecurringInstanceDates.ts create mode 100644 src/helpers/event/recurringEventHelpers/index.ts create mode 100644 src/helpers/event/recurringEventHelpers/removeDanglingDocuments.ts create mode 100644 src/helpers/event/updateEventHelpers/getEventData.ts create mode 100644 src/helpers/event/updateEventHelpers/index.ts create mode 100644 src/helpers/event/updateEventHelpers/shouldUpdateBaseRecurringEvent.ts create mode 100644 src/helpers/event/updateEventHelpers/updateRecurringEvent.ts create mode 100644 src/helpers/event/updateEventHelpers/updateRecurringEventInstances.ts create mode 100644 src/helpers/event/updateEventHelpers/updateSingleEvent.ts create mode 100644 src/helpers/event/updateEventHelpers/updateThisInstance.ts create mode 100644 src/index.ts create mode 100644 src/libraries/dbLogger.ts create mode 100644 src/libraries/errors/ImageSizeLimitExceeded.ts create mode 100644 src/libraries/errors/applicationError.ts create mode 100644 src/libraries/errors/conflictError.ts create mode 100644 src/libraries/errors/index.ts create mode 100644 src/libraries/errors/inputValidationError.ts create mode 100644 src/libraries/errors/internalServerError.ts create mode 100644 src/libraries/errors/invalidFileTypeError.ts create mode 100644 src/libraries/errors/notFoundError.ts create mode 100644 src/libraries/errors/unauthenticatedError.ts create mode 100644 src/libraries/errors/unauthorizedError.ts create mode 100644 src/libraries/errors/validationError.ts create mode 100644 src/libraries/index.ts create mode 100644 src/libraries/logger.ts create mode 100644 src/libraries/requestContext.ts create mode 100644 src/libraries/requestTracing.ts create mode 100644 src/libraries/validators/compareDates.ts create mode 100644 src/libraries/validators/compareTime.ts create mode 100644 src/libraries/validators/validateString.ts create mode 100644 src/middleware/index.ts create mode 100644 src/middleware/isAuth.ts create mode 100644 src/minioInstallationCheck.ts create mode 100644 src/models/ActionItem.ts create mode 100644 src/models/ActionItemCategory.ts create mode 100644 src/models/Advertisement.ts create mode 100644 src/models/AgendaCategory.ts create mode 100644 src/models/AgendaItem.ts create mode 100644 src/models/AgendaSection.ts create mode 100644 src/models/AppUserProfile.ts create mode 100644 src/models/CheckIn.ts create mode 100644 src/models/CheckOut.ts create mode 100644 src/models/Comment.ts create mode 100644 src/models/Community.ts create mode 100644 src/models/DirectChat.ts create mode 100644 src/models/DirectChatMessage.ts create mode 100644 src/models/Donation.ts create mode 100644 src/models/EncodedImage.ts create mode 100644 src/models/EncodedVideo.ts create mode 100644 src/models/Event.ts create mode 100644 src/models/EventAttendee.ts create mode 100644 src/models/EventVolunteer.ts create mode 100644 src/models/EventVolunteerGroup.ts create mode 100644 src/models/Feedback.ts create mode 100644 src/models/File.ts create mode 100644 src/models/Fund.ts create mode 100644 src/models/FundraisingCampaign.ts create mode 100644 src/models/FundraisingCampaignPledge.ts create mode 100644 src/models/Group.ts create mode 100644 src/models/GroupChat.ts create mode 100644 src/models/GroupChatMessage.ts create mode 100644 src/models/IdentifierCount.ts create mode 100644 src/models/ImageHash.ts create mode 100644 src/models/Language.ts create mode 100644 src/models/MembershipRequest.ts create mode 100644 src/models/Message.ts create mode 100644 src/models/MessageChat.ts create mode 100644 src/models/Note.ts create mode 100644 src/models/Organization.ts create mode 100644 src/models/OrganizationCustomField.ts create mode 100644 src/models/OrganizationTagUser.ts create mode 100644 src/models/Plugin.ts create mode 100644 src/models/PluginField.ts create mode 100644 src/models/Post.ts create mode 100644 src/models/RecurrenceRule.ts create mode 100644 src/models/SampleData.ts create mode 100644 src/models/TagUser.ts create mode 100644 src/models/User.ts create mode 100644 src/models/UserCustomData.ts create mode 100644 src/models/Venue.ts create mode 100644 src/models/index.ts create mode 100644 src/models/userFamily.ts create mode 100644 src/resolvers/ActionItemCategory/creator.ts create mode 100644 src/resolvers/ActionItemCategory/index.ts create mode 100644 src/resolvers/Advertisement/index.ts create mode 100644 src/resolvers/Advertisement/organization.ts create mode 100644 src/resolvers/AgendaCategory/createdBy.ts create mode 100644 src/resolvers/AgendaCategory/index.ts create mode 100644 src/resolvers/AgendaCategory/organization.ts create mode 100644 src/resolvers/AgendaCategory/updatedBy.ts create mode 100644 src/resolvers/AgendaItem/Users.ts create mode 100644 src/resolvers/AgendaItem/categories.ts create mode 100644 src/resolvers/AgendaItem/createdBy.ts create mode 100644 src/resolvers/AgendaItem/index.ts create mode 100644 src/resolvers/AgendaItem/organization.ts create mode 100644 src/resolvers/AgendaItem/relatedEvent.ts create mode 100644 src/resolvers/AgendaItem/updatedBy.ts create mode 100644 src/resolvers/AgendaSection/createdBy.ts create mode 100644 src/resolvers/AgendaSection/index.ts create mode 100644 src/resolvers/AgendaSection/items.ts create mode 100644 src/resolvers/AgendaSection/relatedEvent.ts create mode 100644 src/resolvers/CheckIn/event.ts create mode 100644 src/resolvers/CheckIn/index.ts create mode 100644 src/resolvers/CheckIn/user.ts create mode 100644 src/resolvers/Comment/creator.ts create mode 100644 src/resolvers/Comment/index.ts create mode 100644 src/resolvers/DirectChat/creator.ts create mode 100644 src/resolvers/DirectChat/index.ts create mode 100644 src/resolvers/DirectChat/messages.ts create mode 100644 src/resolvers/DirectChat/organization.ts create mode 100644 src/resolvers/DirectChat/users.ts create mode 100644 src/resolvers/DirectChatMessage/directChatMessageBelongsTo.ts create mode 100644 src/resolvers/DirectChatMessage/index.ts create mode 100644 src/resolvers/DirectChatMessage/receiver.ts create mode 100644 src/resolvers/DirectChatMessage/sender.ts create mode 100644 src/resolvers/Event/actionItems.ts create mode 100644 src/resolvers/Event/attendees.ts create mode 100644 src/resolvers/Event/attendeesCheckInStatus.ts create mode 100644 src/resolvers/Event/averageFeedbackScore.ts create mode 100644 src/resolvers/Event/baseRecurringEvent.ts create mode 100644 src/resolvers/Event/creator.ts create mode 100644 src/resolvers/Event/feedback.ts create mode 100644 src/resolvers/Event/index.ts create mode 100644 src/resolvers/Event/organization.ts create mode 100644 src/resolvers/Event/recurrenceRule.ts create mode 100644 src/resolvers/EventVolunteer/creator.ts create mode 100644 src/resolvers/EventVolunteer/event.ts create mode 100644 src/resolvers/EventVolunteer/group.ts create mode 100644 src/resolvers/EventVolunteer/index.ts create mode 100644 src/resolvers/EventVolunteer/user.ts create mode 100644 src/resolvers/EventVolunteerGroup/creator.ts create mode 100644 src/resolvers/EventVolunteerGroup/event.ts create mode 100644 src/resolvers/EventVolunteerGroup/index.ts create mode 100644 src/resolvers/EventVolunteerGroup/leader.ts create mode 100644 src/resolvers/Feedback/event.ts create mode 100644 src/resolvers/Feedback/index.ts create mode 100644 src/resolvers/Fund/creator.ts create mode 100644 src/resolvers/Fund/index.ts create mode 100644 src/resolvers/FundraisingCampaignPledge/index.ts create mode 100644 src/resolvers/FundraisingCampaignPledge/users.ts create mode 100644 src/resolvers/GroupChat/creator.ts create mode 100644 src/resolvers/GroupChat/index.ts create mode 100644 src/resolvers/GroupChat/messages.ts create mode 100644 src/resolvers/GroupChat/organization.ts create mode 100644 src/resolvers/GroupChat/users.ts create mode 100644 src/resolvers/GroupChatMessage/groupChatMessageBelongsTo.ts create mode 100644 src/resolvers/GroupChatMessage/index.ts create mode 100644 src/resolvers/GroupChatMessage/sender.ts create mode 100644 src/resolvers/MembershipRequest/index.ts create mode 100644 src/resolvers/MembershipRequest/organization.ts create mode 100644 src/resolvers/MembershipRequest/user.ts create mode 100644 src/resolvers/Mutation/acceptMembershipRequest.ts create mode 100644 src/resolvers/Mutation/addEventAttendee.ts create mode 100644 src/resolvers/Mutation/addFeedback.ts create mode 100644 src/resolvers/Mutation/addLanguageTranslation.ts create mode 100644 src/resolvers/Mutation/addOrganizationCustomField.ts create mode 100644 src/resolvers/Mutation/addOrganizationImage.ts create mode 100644 src/resolvers/Mutation/addPledgeToFundraisingCampaign.ts create mode 100644 src/resolvers/Mutation/addUserCustomData.ts create mode 100644 src/resolvers/Mutation/addUserImage.ts create mode 100644 src/resolvers/Mutation/addUserToGroupChat.ts create mode 100644 src/resolvers/Mutation/addUserToUserFamily.ts create mode 100644 src/resolvers/Mutation/adminRemoveGroup.ts create mode 100644 src/resolvers/Mutation/assignUserTag.ts create mode 100644 src/resolvers/Mutation/blockPluginCreationBySuperadmin.ts create mode 100644 src/resolvers/Mutation/blockUser.ts create mode 100644 src/resolvers/Mutation/cancelMembershipRequest.ts create mode 100644 src/resolvers/Mutation/checkIn.ts create mode 100644 src/resolvers/Mutation/checkOut.ts create mode 100644 src/resolvers/Mutation/createActionItem.ts create mode 100644 src/resolvers/Mutation/createActionItemCategory.ts create mode 100644 src/resolvers/Mutation/createAdmin.ts create mode 100644 src/resolvers/Mutation/createAdvertisement.ts create mode 100644 src/resolvers/Mutation/createAgendaCategory.ts create mode 100644 src/resolvers/Mutation/createAgendaItem.ts create mode 100644 src/resolvers/Mutation/createAgendaSection.ts create mode 100644 src/resolvers/Mutation/createComment.ts create mode 100644 src/resolvers/Mutation/createDirectChat.ts create mode 100644 src/resolvers/Mutation/createDonation.ts create mode 100644 src/resolvers/Mutation/createEvent.ts create mode 100644 src/resolvers/Mutation/createEventVolunteer.ts create mode 100644 src/resolvers/Mutation/createEventVolunteerGroup.ts create mode 100644 src/resolvers/Mutation/createFund.ts create mode 100644 src/resolvers/Mutation/createFundraisingCampaign.ts create mode 100644 src/resolvers/Mutation/createFundraisingCampaignPledge.ts create mode 100644 src/resolvers/Mutation/createGroupChat.ts create mode 100644 src/resolvers/Mutation/createMember.ts create mode 100644 src/resolvers/Mutation/createMessageChat.ts create mode 100644 src/resolvers/Mutation/createNote.ts create mode 100644 src/resolvers/Mutation/createOrganization.ts create mode 100644 src/resolvers/Mutation/createPlugin.ts create mode 100644 src/resolvers/Mutation/createPost.ts create mode 100644 src/resolvers/Mutation/createSampleOrganization.ts create mode 100644 src/resolvers/Mutation/createUserFamily.ts create mode 100644 src/resolvers/Mutation/createUserTag.ts create mode 100644 src/resolvers/Mutation/createVenue.ts create mode 100644 src/resolvers/Mutation/deleteAdvertisement.ts create mode 100644 src/resolvers/Mutation/deleteAgendaCategory.ts create mode 100644 src/resolvers/Mutation/deleteDonationById.ts create mode 100644 src/resolvers/Mutation/deleteNote.ts create mode 100644 src/resolvers/Mutation/deleteVenue.ts create mode 100644 src/resolvers/Mutation/editVenue.ts create mode 100644 src/resolvers/Mutation/forgotPassword.ts create mode 100644 src/resolvers/Mutation/index.ts create mode 100644 src/resolvers/Mutation/inviteEventAttendee.ts create mode 100644 src/resolvers/Mutation/joinPublicOrganization.ts create mode 100644 src/resolvers/Mutation/leaveOrganization.ts create mode 100644 src/resolvers/Mutation/likeComment.ts create mode 100644 src/resolvers/Mutation/likePost.ts create mode 100644 src/resolvers/Mutation/login.ts create mode 100644 src/resolvers/Mutation/logout.ts create mode 100644 src/resolvers/Mutation/otp.ts create mode 100644 src/resolvers/Mutation/recaptcha.ts create mode 100644 src/resolvers/Mutation/refreshToken.ts create mode 100644 src/resolvers/Mutation/registerEventAttendee.ts create mode 100644 src/resolvers/Mutation/registerForEvent.ts create mode 100644 src/resolvers/Mutation/rejectMembershipRequest.ts create mode 100644 src/resolvers/Mutation/removeActionItem.ts create mode 100644 src/resolvers/Mutation/removeAdmin.ts create mode 100644 src/resolvers/Mutation/removeAgendaItem.ts create mode 100644 src/resolvers/Mutation/removeAgendaSection.ts create mode 100644 src/resolvers/Mutation/removeComment.ts create mode 100644 src/resolvers/Mutation/removeDirectChat.ts create mode 100644 src/resolvers/Mutation/removeEvent.ts create mode 100644 src/resolvers/Mutation/removeEventAttendee.ts create mode 100644 src/resolvers/Mutation/removeEventVolunteer.ts create mode 100644 src/resolvers/Mutation/removeEventVolunteerGroup.ts create mode 100644 src/resolvers/Mutation/removeFundraisingCampaingPledge.ts create mode 100644 src/resolvers/Mutation/removeGroupChat.ts create mode 100644 src/resolvers/Mutation/removeMember.ts create mode 100644 src/resolvers/Mutation/removeOrganization.ts create mode 100644 src/resolvers/Mutation/removeOrganizationCustomField.ts create mode 100644 src/resolvers/Mutation/removeOrganizationImage.ts create mode 100644 src/resolvers/Mutation/removePost.ts create mode 100644 src/resolvers/Mutation/removeSampleOrganization.ts create mode 100644 src/resolvers/Mutation/removeUserCustomData.ts create mode 100644 src/resolvers/Mutation/removeUserFamily.ts create mode 100644 src/resolvers/Mutation/removeUserFromGroupChat.ts create mode 100644 src/resolvers/Mutation/removeUserFromUserFamily.ts create mode 100644 src/resolvers/Mutation/removeUserImage.ts create mode 100644 src/resolvers/Mutation/removeUserTag.ts create mode 100644 src/resolvers/Mutation/resetCommunity.ts create mode 100644 src/resolvers/Mutation/revokeRefreshTokenForUser.ts create mode 100644 src/resolvers/Mutation/saveFcmToken.ts create mode 100644 src/resolvers/Mutation/sendMembershipRequest.ts create mode 100644 src/resolvers/Mutation/sendMessageToDirectChat.ts create mode 100644 src/resolvers/Mutation/sendMessageToGroupChat.ts create mode 100644 src/resolvers/Mutation/signUp.ts create mode 100644 src/resolvers/Mutation/togglePostPin.ts create mode 100644 src/resolvers/Mutation/unassignUserTag.ts create mode 100644 src/resolvers/Mutation/unblockUser.ts create mode 100644 src/resolvers/Mutation/unlikeComment.ts create mode 100644 src/resolvers/Mutation/unlikePost.ts create mode 100644 src/resolvers/Mutation/unregisterForEventByUser.ts create mode 100644 src/resolvers/Mutation/updateActionItem.ts create mode 100644 src/resolvers/Mutation/updateActionItemCategory.ts create mode 100644 src/resolvers/Mutation/updateAdvertisement.ts create mode 100644 src/resolvers/Mutation/updateAgendaCategory.ts create mode 100644 src/resolvers/Mutation/updateAgendaItem.ts create mode 100644 src/resolvers/Mutation/updateAgendaSection.ts create mode 100644 src/resolvers/Mutation/updateCommunity.ts create mode 100644 src/resolvers/Mutation/updateEvent.ts create mode 100644 src/resolvers/Mutation/updateEventVolunteer.ts create mode 100644 src/resolvers/Mutation/updateEventVolunteerGroup.ts create mode 100644 src/resolvers/Mutation/updateFund.ts create mode 100644 src/resolvers/Mutation/updateFundCampaignPledge.ts create mode 100644 src/resolvers/Mutation/updateFundraisingCampaign.ts create mode 100644 src/resolvers/Mutation/updateLanguage.ts create mode 100644 src/resolvers/Mutation/updateNote.ts create mode 100644 src/resolvers/Mutation/updateOrganization.ts create mode 100644 src/resolvers/Mutation/updatePluginStatus.ts create mode 100644 src/resolvers/Mutation/updatePost.ts create mode 100644 src/resolvers/Mutation/updateUserPassword.ts create mode 100644 src/resolvers/Mutation/updateUserProfile.ts create mode 100644 src/resolvers/Mutation/updateUserRoleInOrganization.ts create mode 100644 src/resolvers/Mutation/updateUserTag.ts create mode 100644 src/resolvers/Organization/actionItemCategories.ts create mode 100644 src/resolvers/Organization/admins.ts create mode 100644 src/resolvers/Organization/advertisements.ts create mode 100644 src/resolvers/Organization/agendaCategories.ts create mode 100644 src/resolvers/Organization/blockedUsers.ts create mode 100644 src/resolvers/Organization/creator.ts create mode 100644 src/resolvers/Organization/funds.ts create mode 100644 src/resolvers/Organization/image.ts create mode 100644 src/resolvers/Organization/index.ts create mode 100644 src/resolvers/Organization/members.ts create mode 100644 src/resolvers/Organization/membershipRequests.ts create mode 100644 src/resolvers/Organization/pinnedPosts.ts create mode 100644 src/resolvers/Organization/posts.ts create mode 100644 src/resolvers/Organization/userTags.ts create mode 100644 src/resolvers/Organization/venues.ts create mode 100644 src/resolvers/Post/comments.ts create mode 100644 src/resolvers/Post/creator.ts create mode 100644 src/resolvers/Post/index.ts create mode 100644 src/resolvers/Query/actionItemCategoriesByOrganization.ts create mode 100644 src/resolvers/Query/actionItemsByEvent.ts create mode 100644 src/resolvers/Query/actionItemsByOrganization.ts create mode 100644 src/resolvers/Query/advertisementsConnection.ts create mode 100644 src/resolvers/Query/agendaCategory.ts create mode 100644 src/resolvers/Query/agendaItemByEvent.ts create mode 100644 src/resolvers/Query/agendaItemById.ts create mode 100644 src/resolvers/Query/agendaItemByOrganization.ts create mode 100644 src/resolvers/Query/agendaItemCategoriesByOrganization.ts create mode 100644 src/resolvers/Query/checkAuth.ts create mode 100644 src/resolvers/Query/customDataByOrganization.ts create mode 100644 src/resolvers/Query/customFieldsByOrganization.ts create mode 100644 src/resolvers/Query/directChatById.ts create mode 100644 src/resolvers/Query/directChatsByUserID.ts create mode 100644 src/resolvers/Query/directChatsMessagesByChatID.ts create mode 100644 src/resolvers/Query/event.ts create mode 100644 src/resolvers/Query/eventVolunteersByEvent.ts create mode 100644 src/resolvers/Query/eventsByOrganization.ts create mode 100644 src/resolvers/Query/eventsByOrganizationConnection.ts create mode 100644 src/resolvers/Query/fundsByOrganization.ts create mode 100644 src/resolvers/Query/getAgendaSection.ts create mode 100644 src/resolvers/Query/getAllAgendaItems.ts create mode 100644 src/resolvers/Query/getAllNotesForAgendaItem.ts create mode 100644 src/resolvers/Query/getCommunityData.ts create mode 100644 src/resolvers/Query/getDonationById.ts create mode 100644 src/resolvers/Query/getDonationByOrgId.ts create mode 100644 src/resolvers/Query/getDonationByOrgIdConnection.ts create mode 100644 src/resolvers/Query/getEventAttendee.ts create mode 100644 src/resolvers/Query/getEventAttendeesByEventId.ts create mode 100644 src/resolvers/Query/getEventInvitesByUserId.ts create mode 100644 src/resolvers/Query/getEventVolunteerGroups.ts create mode 100644 src/resolvers/Query/getFundById.ts create mode 100644 src/resolvers/Query/getFundraisingCampaignPledgeById.ts create mode 100644 src/resolvers/Query/getFundraisingCampaigns.ts create mode 100644 src/resolvers/Query/getNoteById.ts create mode 100644 src/resolvers/Query/getPledgesByUserId.ts create mode 100644 src/resolvers/Query/getPlugins.ts create mode 100644 src/resolvers/Query/getUserTag.ts create mode 100644 src/resolvers/Query/getUserTagAncestors.ts create mode 100644 src/resolvers/Query/getVenueByOrgId.ts create mode 100644 src/resolvers/Query/getlanguage.ts create mode 100644 src/resolvers/Query/groupChatById.ts create mode 100644 src/resolvers/Query/groupChatsByUserId.ts create mode 100644 src/resolvers/Query/hasSubmittedFeedback.ts create mode 100644 src/resolvers/Query/helperFunctions/getSort.ts create mode 100644 src/resolvers/Query/helperFunctions/getWhere.ts create mode 100644 src/resolvers/Query/index.ts create mode 100644 src/resolvers/Query/me.ts create mode 100644 src/resolvers/Query/myLanguage.ts create mode 100644 src/resolvers/Query/organizationIsSample.ts create mode 100644 src/resolvers/Query/organizations.ts create mode 100644 src/resolvers/Query/organizationsConnection.ts create mode 100644 src/resolvers/Query/organizationsMemberConnection.ts create mode 100644 src/resolvers/Query/post.ts create mode 100644 src/resolvers/Query/registeredEventsByUser.ts create mode 100644 src/resolvers/Query/user.ts create mode 100644 src/resolvers/Query/userLanguage.ts create mode 100644 src/resolvers/Query/users.ts create mode 100644 src/resolvers/Query/usersConnection.ts create mode 100644 src/resolvers/Query/venue.ts create mode 100644 src/resolvers/RecurrenceRule/baseRecurringEvent.ts create mode 100644 src/resolvers/RecurrenceRule/index.ts create mode 100644 src/resolvers/RecurrenceRule/organization.ts create mode 100644 src/resolvers/Subscription/directMessageChat.ts create mode 100644 src/resolvers/Subscription/index.ts create mode 100644 src/resolvers/Subscription/messageSentToDirectChat.ts create mode 100644 src/resolvers/Subscription/messageSentToGroupChat.ts create mode 100644 src/resolvers/Subscription/onPluginUpdate.ts create mode 100644 src/resolvers/User/index.ts create mode 100644 src/resolvers/User/posts.ts create mode 100644 src/resolvers/UserFamily/admins.ts create mode 100644 src/resolvers/UserFamily/creator.ts create mode 100644 src/resolvers/UserFamily/index.ts create mode 100644 src/resolvers/UserFamily/users.ts create mode 100644 src/resolvers/UserTag/childTags.ts create mode 100644 src/resolvers/UserTag/index.ts create mode 100644 src/resolvers/UserTag/organization.ts create mode 100644 src/resolvers/UserTag/parentTag.ts create mode 100644 src/resolvers/UserTag/usersAssignedTo.ts create mode 100644 src/resolvers/index.ts create mode 100644 src/resolvers/middleware/currentUserExists.ts create mode 100644 src/server.ts create mode 100644 src/services/AppUserProfileCache/cacheAppUserProfile.ts create mode 100644 src/services/AppUserProfileCache/deleteAppUserFromCache.ts create mode 100644 src/services/AppUserProfileCache/findAppUserProfileCache.ts create mode 100644 src/services/CommentCache/cacheComments.ts create mode 100644 src/services/CommentCache/deleteCommentFromCache.ts create mode 100644 src/services/CommentCache/findCommentsByPostIdInCache.ts create mode 100644 src/services/CommentCache/findCommentsInCache.ts create mode 100644 src/services/EventCache/cacheEvents.ts create mode 100644 src/services/EventCache/deleteEventFromCache.ts create mode 100644 src/services/EventCache/findEventInCache.ts create mode 100644 src/services/OrganizationCache/cacheOrganizations.ts create mode 100644 src/services/OrganizationCache/deleteOrganizationFromCache.ts create mode 100644 src/services/OrganizationCache/findOrganizationsInCache.ts create mode 100644 src/services/PostCache/cachePosts.ts create mode 100644 src/services/PostCache/deletePostFromCache.ts create mode 100644 src/services/PostCache/findPostsInCache.ts create mode 100644 src/services/UserCache/cacheUser.ts create mode 100644 src/services/UserCache/deleteUserFromCache.ts create mode 100644 src/services/UserCache/findUserInCache.ts create mode 100644 src/services/redisCache.ts create mode 100644 src/setup/MongoDB.ts create mode 100644 src/setup/askToKeepValues.ts create mode 100644 src/setup/getMinioBinaryUrl.ts create mode 100644 src/setup/getNodeEnvironment.ts create mode 100644 src/setup/installMinio.ts create mode 100644 src/setup/isMinioInstalled.ts create mode 100644 src/setup/isValidEmail.ts create mode 100644 src/setup/reCaptcha.ts create mode 100644 src/setup/redisConfiguration.ts create mode 100644 src/setup/setImageUploadSize.ts create mode 100644 src/setup/setPathEnvVar.ts create mode 100644 src/setup/superAdmin.ts create mode 100644 src/setup/updateEnvVariable.ts create mode 100644 src/setup/updateIgnoreFile.ts create mode 100644 src/setup/verifySmtpConnection.ts create mode 100644 src/typeDefs/README.md create mode 100644 src/typeDefs/directives.ts create mode 100644 src/typeDefs/enums.ts create mode 100644 src/typeDefs/errors/common.ts create mode 100644 src/typeDefs/errors/connectionError.ts create mode 100644 src/typeDefs/errors/createAdminErrors.ts create mode 100644 src/typeDefs/errors/createCommentErrors.ts create mode 100644 src/typeDefs/errors/createDirectChatError.ts create mode 100644 src/typeDefs/errors/createMemberErrors.ts create mode 100644 src/typeDefs/errors/index.ts create mode 100644 src/typeDefs/index.ts create mode 100644 src/typeDefs/inputs.ts create mode 100644 src/typeDefs/interfaces.ts create mode 100644 src/typeDefs/mutations.ts create mode 100644 src/typeDefs/queries.ts create mode 100644 src/typeDefs/scalars.ts create mode 100644 src/typeDefs/subscriptions.ts create mode 100644 src/typeDefs/types.ts create mode 100644 src/typeDefs/unions.ts create mode 100644 src/types/generatedGraphQLTypes.ts create mode 100644 src/utilities/PII/decryption.ts create mode 100644 src/utilities/PII/encryption.ts create mode 100644 src/utilities/PII/isAuthorised.ts create mode 100644 src/utilities/TalawaGraphQLError.ts create mode 100644 src/utilities/adminCheck.ts create mode 100644 src/utilities/auth.ts create mode 100644 src/utilities/checkReplicaSet.ts create mode 100644 src/utilities/copyToClipboard.ts create mode 100644 src/utilities/createSampleOrganizationUtil.ts create mode 100644 src/utilities/dateValidator.ts create mode 100644 src/utilities/deleteDuplicatedImage.ts create mode 100644 src/utilities/deleteImage.ts create mode 100644 src/utilities/encodedImageStorage/deletePreviousImage.ts create mode 100644 src/utilities/encodedImageStorage/encodedImageExtensionCheck.ts create mode 100644 src/utilities/encodedImageStorage/uploadEncodedImage.ts create mode 100644 src/utilities/encodedVideoStorage/deletePreviousVideo.ts create mode 100644 src/utilities/encodedVideoStorage/encodedVideoExtensionCheck.ts create mode 100644 src/utilities/encodedVideoStorage/uploadEncodedVideo.ts create mode 100644 src/utilities/graphQLConnection/generateDefaultGraphQLConnection.ts create mode 100644 src/utilities/graphQLConnection/getCommonGraphQLConnectionFilter.ts create mode 100644 src/utilities/graphQLConnection/getCommonGraphQLConnectionSort.ts create mode 100644 src/utilities/graphQLConnection/index.ts create mode 100644 src/utilities/graphQLConnection/parseGraphQLConnectionArguments.ts create mode 100644 src/utilities/graphQLConnection/parseGraphQLConnectionArgumentsWithSortedBy.ts create mode 100644 src/utilities/graphQLConnection/parseGraphQLConnectionArgumentsWithSortedByAndWhere.ts create mode 100644 src/utilities/graphQLConnection/parseGraphQLConnectionArgumentsWithWhere.ts create mode 100644 src/utilities/graphQLConnection/transformToDefaultGraphQLConnection.ts create mode 100644 src/utilities/imageAlreadyInDbCheck.ts create mode 100644 src/utilities/imageExtensionCheck.ts create mode 100644 src/utilities/index.ts create mode 100644 src/utilities/loadDefaultOrg.ts create mode 100644 src/utilities/loadSampleData.ts create mode 100644 src/utilities/mailer.ts create mode 100644 src/utilities/recurrenceDatesUtil.ts create mode 100644 src/utilities/removeSampleOrganizationUtil.ts create mode 100644 src/utilities/reuploadDuplicateCheck.ts create mode 100644 src/utilities/superAdminCheck.ts create mode 100644 src/utilities/uploadImage.ts create mode 100644 src/utilities/userFamilyAdminCheck.ts create mode 100644 talawa-api-docs/.nojekyll create mode 100644 talawa-api-docs/README.md create mode 100644 talawa-api-docs/classes/libraries_errors_ImageSizeLimitExceeded.ImageSizeLimitExceeded.md create mode 100644 talawa-api-docs/classes/libraries_errors_applicationError.ApplicationError.md create mode 100644 talawa-api-docs/classes/libraries_errors_conflictError.ConflictError.md create mode 100644 talawa-api-docs/classes/libraries_errors_inputValidationError.InputValidationError.md create mode 100644 talawa-api-docs/classes/libraries_errors_internalServerError.InternalServerError.md create mode 100644 talawa-api-docs/classes/libraries_errors_invalidFileTypeError.InvalidFileTypeError.md create mode 100644 talawa-api-docs/classes/libraries_errors_notFoundError.NotFoundError.md create mode 100644 talawa-api-docs/classes/libraries_errors_unauthenticatedError.UnauthenticatedError.md create mode 100644 talawa-api-docs/classes/libraries_errors_unauthorizedError.UnauthorizedError.md create mode 100644 talawa-api-docs/classes/libraries_errors_validationError.ValidationError.md create mode 100644 talawa-api-docs/enums/constants.TransactionLogTypes.md create mode 100644 talawa-api-docs/interfaces/libraries_dbLogger.InterfaceLoggableDocument.md create mode 100644 talawa-api-docs/interfaces/libraries_dbLogger.InterfaceLoggableQuery.md create mode 100644 talawa-api-docs/interfaces/libraries_errors_applicationError.InterfaceError.md create mode 100644 talawa-api-docs/interfaces/middleware_isAuth.InterfaceAuthData.md create mode 100644 talawa-api-docs/interfaces/models_ActionItem.InterfaceActionItem.md create mode 100644 talawa-api-docs/interfaces/models_ActionItemCategory.InterfaceActionItemCategory.md create mode 100644 talawa-api-docs/interfaces/models_Advertisement.InterfaceAdvertisement.md create mode 100644 talawa-api-docs/interfaces/models_CheckIn.InterfaceCheckIn.md create mode 100644 talawa-api-docs/interfaces/models_Comment.InterfaceComment.md create mode 100644 talawa-api-docs/interfaces/models_DirectChat.InterfaceDirectChat.md create mode 100644 talawa-api-docs/interfaces/models_DirectChatMessage.InterfaceDirectChatMessage.md create mode 100644 talawa-api-docs/interfaces/models_Donation.InterfaceDonation.md create mode 100644 talawa-api-docs/interfaces/models_EncodedImage.InterfaceEncodedImage.md create mode 100644 talawa-api-docs/interfaces/models_EncodedVideo.InterfaceEncodedVideo.md create mode 100644 talawa-api-docs/interfaces/models_Event.InterfaceEvent.md create mode 100644 talawa-api-docs/interfaces/models_EventAttendee.InterfaceEventAttendee.md create mode 100644 talawa-api-docs/interfaces/models_Feedback.InterfaceFeedback.md create mode 100644 talawa-api-docs/interfaces/models_File.InterfaceFile.md create mode 100644 talawa-api-docs/interfaces/models_Group.InterfaceGroup.md create mode 100644 talawa-api-docs/interfaces/models_GroupChat.InterfaceGroupChat.md create mode 100644 talawa-api-docs/interfaces/models_GroupChatMessage.InterfaceGroupChatMessage.md create mode 100644 talawa-api-docs/interfaces/models_ImageHash.InterfaceImageHash.md create mode 100644 talawa-api-docs/interfaces/models_Language.InterfaceLanguage.md create mode 100644 talawa-api-docs/interfaces/models_Language.InterfaceLanguageModel.md create mode 100644 talawa-api-docs/interfaces/models_MembershipRequest.InterfaceMembershipRequest.md create mode 100644 talawa-api-docs/interfaces/models_Message.InterfaceMessage.md create mode 100644 talawa-api-docs/interfaces/models_MessageChat.InterfaceMessageChat.md create mode 100644 talawa-api-docs/interfaces/models_Organization.InterfaceOrganization.md create mode 100644 talawa-api-docs/interfaces/models_OrganizationCustomField.InterfaceOrganizationCustomField.md create mode 100644 talawa-api-docs/interfaces/models_OrganizationTagUser.InterfaceOrganizationTagUser.md create mode 100644 talawa-api-docs/interfaces/models_Plugin.InterfacePlugin.md create mode 100644 talawa-api-docs/interfaces/models_PluginField.InterfacePluginField.md create mode 100644 talawa-api-docs/interfaces/models_Post.InterfacePost.md create mode 100644 talawa-api-docs/interfaces/models_SampleData.InterfaceSampleData.md create mode 100644 talawa-api-docs/interfaces/models_TagUser.InterfaceTagUser.md create mode 100644 talawa-api-docs/interfaces/models_User.InterfaceUser.md create mode 100644 talawa-api-docs/interfaces/models_UserCustomData.InterfaceUserCustomData.md create mode 100644 talawa-api-docs/interfaces/types_generatedGraphQLTypes.AnyScalarConfig.md create mode 100644 talawa-api-docs/interfaces/types_generatedGraphQLTypes.CountryCodeScalarConfig.md create mode 100644 talawa-api-docs/interfaces/types_generatedGraphQLTypes.DateScalarConfig.md create mode 100644 talawa-api-docs/interfaces/types_generatedGraphQLTypes.DateTimeScalarConfig.md create mode 100644 talawa-api-docs/interfaces/types_generatedGraphQLTypes.EmailAddressScalarConfig.md create mode 100644 talawa-api-docs/interfaces/types_generatedGraphQLTypes.JsonScalarConfig.md create mode 100644 talawa-api-docs/interfaces/types_generatedGraphQLTypes.LatitudeScalarConfig.md create mode 100644 talawa-api-docs/interfaces/types_generatedGraphQLTypes.LongitudeScalarConfig.md create mode 100644 talawa-api-docs/interfaces/types_generatedGraphQLTypes.PhoneNumberScalarConfig.md create mode 100644 talawa-api-docs/interfaces/types_generatedGraphQLTypes.PositiveIntScalarConfig.md create mode 100644 talawa-api-docs/interfaces/types_generatedGraphQLTypes.SubscriptionResolverObject.md create mode 100644 talawa-api-docs/interfaces/types_generatedGraphQLTypes.SubscriptionSubscriberObject.md create mode 100644 talawa-api-docs/interfaces/types_generatedGraphQLTypes.TimeScalarConfig.md create mode 100644 talawa-api-docs/interfaces/types_generatedGraphQLTypes.UploadScalarConfig.md create mode 100644 talawa-api-docs/interfaces/types_generatedGraphQLTypes.UrlScalarConfig.md create mode 100644 talawa-api-docs/interfaces/utilities_auth.InterfaceJwtTokenPayload.md create mode 100644 talawa-api-docs/interfaces/utilities_mailer.InterfaceMailFields.md create mode 100644 talawa-api-docs/modules.md create mode 100644 talawa-api-docs/modules/app.md create mode 100644 talawa-api-docs/modules/checks.md create mode 100644 talawa-api-docs/modules/config.md create mode 100644 talawa-api-docs/modules/config_appConfig.md create mode 100644 talawa-api-docs/modules/config_plugins_loadPlugins.md create mode 100644 talawa-api-docs/modules/constants.md create mode 100644 talawa-api-docs/modules/db.md create mode 100644 talawa-api-docs/modules/directives_directiveTransformer_authDirectiveTransformer.md create mode 100644 talawa-api-docs/modules/directives_directiveTransformer_roleDirectiveTransformer.md create mode 100644 talawa-api-docs/modules/env.md create mode 100644 talawa-api-docs/modules/helpers_eventInstances.md create mode 100644 talawa-api-docs/modules/helpers_eventInstances_once.md create mode 100644 talawa-api-docs/modules/helpers_eventInstances_weekly.md create mode 100644 talawa-api-docs/modules/index.md create mode 100644 talawa-api-docs/modules/libraries.md create mode 100644 talawa-api-docs/modules/libraries_dbLogger.md create mode 100644 talawa-api-docs/modules/libraries_errors.md create mode 100644 talawa-api-docs/modules/libraries_errors_ImageSizeLimitExceeded.md create mode 100644 talawa-api-docs/modules/libraries_errors_applicationError.md create mode 100644 talawa-api-docs/modules/libraries_errors_conflictError.md create mode 100644 talawa-api-docs/modules/libraries_errors_inputValidationError.md create mode 100644 talawa-api-docs/modules/libraries_errors_internalServerError.md create mode 100644 talawa-api-docs/modules/libraries_errors_invalidFileTypeError.md create mode 100644 talawa-api-docs/modules/libraries_errors_notFoundError.md create mode 100644 talawa-api-docs/modules/libraries_errors_unauthenticatedError.md create mode 100644 talawa-api-docs/modules/libraries_errors_unauthorizedError.md create mode 100644 talawa-api-docs/modules/libraries_errors_validationError.md create mode 100644 talawa-api-docs/modules/libraries_logger.md create mode 100644 talawa-api-docs/modules/libraries_requestContext.md create mode 100644 talawa-api-docs/modules/libraries_requestTracing.md create mode 100644 talawa-api-docs/modules/libraries_validators_compareDates.md create mode 100644 talawa-api-docs/modules/libraries_validators_validatePaginationArgs.md create mode 100644 talawa-api-docs/modules/libraries_validators_validatePassword.md create mode 100644 talawa-api-docs/modules/libraries_validators_validateString.md create mode 100644 talawa-api-docs/modules/middleware.md create mode 100644 talawa-api-docs/modules/middleware_isAuth.md create mode 100644 talawa-api-docs/modules/models.md create mode 100644 talawa-api-docs/modules/models_ActionItem.md create mode 100644 talawa-api-docs/modules/models_ActionItemCategory.md create mode 100644 talawa-api-docs/modules/models_Advertisement.md create mode 100644 talawa-api-docs/modules/models_CheckIn.md create mode 100644 talawa-api-docs/modules/models_Comment.md create mode 100644 talawa-api-docs/modules/models_DirectChat.md create mode 100644 talawa-api-docs/modules/models_DirectChatMessage.md create mode 100644 talawa-api-docs/modules/models_Donation.md create mode 100644 talawa-api-docs/modules/models_EncodedImage.md create mode 100644 talawa-api-docs/modules/models_EncodedVideo.md create mode 100644 talawa-api-docs/modules/models_Event.md create mode 100644 talawa-api-docs/modules/models_EventAttendee.md create mode 100644 talawa-api-docs/modules/models_Feedback.md create mode 100644 talawa-api-docs/modules/models_File.md create mode 100644 talawa-api-docs/modules/models_Group.md create mode 100644 talawa-api-docs/modules/models_GroupChat.md create mode 100644 talawa-api-docs/modules/models_GroupChatMessage.md create mode 100644 talawa-api-docs/modules/models_ImageHash.md create mode 100644 talawa-api-docs/modules/models_Language.md create mode 100644 talawa-api-docs/modules/models_MembershipRequest.md create mode 100644 talawa-api-docs/modules/models_Message.md create mode 100644 talawa-api-docs/modules/models_MessageChat.md create mode 100644 talawa-api-docs/modules/models_Organization.md create mode 100644 talawa-api-docs/modules/models_OrganizationCustomField.md create mode 100644 talawa-api-docs/modules/models_OrganizationTagUser.md create mode 100644 talawa-api-docs/modules/models_Plugin.md create mode 100644 talawa-api-docs/modules/models_PluginField.md create mode 100644 talawa-api-docs/modules/models_Post.md create mode 100644 talawa-api-docs/modules/models_SampleData.md create mode 100644 talawa-api-docs/modules/models_TagUser.md create mode 100644 talawa-api-docs/modules/models_User.md create mode 100644 talawa-api-docs/modules/models_UserCustomData.md create mode 100644 talawa-api-docs/modules/resolvers.md create mode 100644 talawa-api-docs/modules/resolvers_ActionItem.md create mode 100644 talawa-api-docs/modules/resolvers_ActionItemCategory.md create mode 100644 talawa-api-docs/modules/resolvers_ActionItemCategory_creator.md create mode 100644 talawa-api-docs/modules/resolvers_ActionItemCategory_organization.md create mode 100644 talawa-api-docs/modules/resolvers_ActionItem_actionItemCategory.md create mode 100644 talawa-api-docs/modules/resolvers_ActionItem_assignee.md create mode 100644 talawa-api-docs/modules/resolvers_ActionItem_assigner.md create mode 100644 talawa-api-docs/modules/resolvers_ActionItem_creator.md create mode 100644 talawa-api-docs/modules/resolvers_ActionItem_event.md create mode 100644 talawa-api-docs/modules/resolvers_CheckIn.md create mode 100644 talawa-api-docs/modules/resolvers_CheckIn_event.md create mode 100644 talawa-api-docs/modules/resolvers_CheckIn_user.md create mode 100644 talawa-api-docs/modules/resolvers_Comment.md create mode 100644 talawa-api-docs/modules/resolvers_Comment_creator.md create mode 100644 talawa-api-docs/modules/resolvers_DirectChat.md create mode 100644 talawa-api-docs/modules/resolvers_DirectChatMessage.md create mode 100644 talawa-api-docs/modules/resolvers_DirectChatMessage_directChatMessageBelongsTo.md create mode 100644 talawa-api-docs/modules/resolvers_DirectChatMessage_receiver.md create mode 100644 talawa-api-docs/modules/resolvers_DirectChatMessage_sender.md create mode 100644 talawa-api-docs/modules/resolvers_DirectChat_creator.md create mode 100644 talawa-api-docs/modules/resolvers_DirectChat_messages.md create mode 100644 talawa-api-docs/modules/resolvers_DirectChat_organization.md create mode 100644 talawa-api-docs/modules/resolvers_DirectChat_users.md create mode 100644 talawa-api-docs/modules/resolvers_Event.md create mode 100644 talawa-api-docs/modules/resolvers_Event_actionItems.md create mode 100644 talawa-api-docs/modules/resolvers_Event_attendees.md create mode 100644 talawa-api-docs/modules/resolvers_Event_attendeesCheckInStatus.md create mode 100644 talawa-api-docs/modules/resolvers_Event_averageFeedbackScore.md create mode 100644 talawa-api-docs/modules/resolvers_Event_creator.md create mode 100644 talawa-api-docs/modules/resolvers_Event_feedback.md create mode 100644 talawa-api-docs/modules/resolvers_Event_organization.md create mode 100644 talawa-api-docs/modules/resolvers_Feedback.md create mode 100644 talawa-api-docs/modules/resolvers_Feedback_event.md create mode 100644 talawa-api-docs/modules/resolvers_GroupChat.md create mode 100644 talawa-api-docs/modules/resolvers_GroupChatMessage.md create mode 100644 talawa-api-docs/modules/resolvers_GroupChatMessage_groupChatMessageBelongsTo.md create mode 100644 talawa-api-docs/modules/resolvers_GroupChatMessage_sender.md create mode 100644 talawa-api-docs/modules/resolvers_GroupChat_creator.md create mode 100644 talawa-api-docs/modules/resolvers_GroupChat_messages.md create mode 100644 talawa-api-docs/modules/resolvers_GroupChat_organization.md create mode 100644 talawa-api-docs/modules/resolvers_GroupChat_users.md create mode 100644 talawa-api-docs/modules/resolvers_MembershipRequest.md create mode 100644 talawa-api-docs/modules/resolvers_MembershipRequest_organization.md create mode 100644 talawa-api-docs/modules/resolvers_MembershipRequest_user.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_acceptAdmin.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_acceptMembershipRequest.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_addEventAttendee.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_addFeedback.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_addLanguageTranslation.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_addOrganizationCustomField.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_addOrganizationImage.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_addUserCustomData.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_addUserImage.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_addUserToGroupChat.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_adminRemoveEvent.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_adminRemoveGroup.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_assignUserTag.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_blockPluginCreationBySuperadmin.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_blockUser.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_cancelMembershipRequest.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_checkIn.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_createActionItem.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_createActionItemCategory.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_createAdmin.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_createAdvertisement.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_createComment.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_createDirectChat.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_createDonation.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_createEvent.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_createGroupChat.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_createMember.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_createMessageChat.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_createOrganization.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_createPlugin.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_createPost.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_createSampleOrganization.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_createUserTag.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_deleteAdvertisementById.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_deleteDonationById.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_forgotPassword.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_joinPublicOrganization.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_leaveOrganization.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_likeComment.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_likePost.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_login.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_logout.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_otp.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_recaptcha.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_refreshToken.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_registerForEvent.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_rejectAdmin.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_rejectMembershipRequest.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_removeActionItem.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_removeAdmin.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_removeAdvertisement.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_removeComment.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_removeDirectChat.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_removeEvent.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_removeEventAttendee.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_removeGroupChat.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_removeMember.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_removeOrganization.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_removeOrganizationCustomField.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_removeOrganizationImage.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_removePost.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_removeSampleOrganization.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_removeUserCustomData.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_removeUserFromGroupChat.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_removeUserImage.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_removeUserTag.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_revokeRefreshTokenForUser.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_saveFcmToken.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_sendMembershipRequest.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_sendMessageToDirectChat.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_sendMessageToGroupChat.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_signUp.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_togglePostPin.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_unassignUserTag.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_unblockUser.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_unlikeComment.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_unlikePost.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_unregisterForEventByUser.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_updateActionItem.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_updateActionItemCategory.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_updateAdvertisement.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_updateEvent.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_updateLanguage.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_updateOrganization.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_updatePluginStatus.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_updatePost.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_updateUserPassword.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_updateUserProfile.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_updateUserRoleInOrganization.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_updateUserTag.md create mode 100644 talawa-api-docs/modules/resolvers_Mutation_updateUserType.md create mode 100644 talawa-api-docs/modules/resolvers_Organization.md create mode 100644 talawa-api-docs/modules/resolvers_Organization_actionItemCategories.md create mode 100644 talawa-api-docs/modules/resolvers_Organization_admins.md create mode 100644 talawa-api-docs/modules/resolvers_Organization_blockedUsers.md create mode 100644 talawa-api-docs/modules/resolvers_Organization_creator.md create mode 100644 talawa-api-docs/modules/resolvers_Organization_image.md create mode 100644 talawa-api-docs/modules/resolvers_Organization_members.md create mode 100644 talawa-api-docs/modules/resolvers_Organization_membershipRequests.md create mode 100644 talawa-api-docs/modules/resolvers_Organization_pinnedPosts.md create mode 100644 talawa-api-docs/modules/resolvers_Post.md create mode 100644 talawa-api-docs/modules/resolvers_Post_comments.md create mode 100644 talawa-api-docs/modules/resolvers_Post_creator.md create mode 100644 talawa-api-docs/modules/resolvers_Query.md create mode 100644 talawa-api-docs/modules/resolvers_Query_actionItem.md create mode 100644 talawa-api-docs/modules/resolvers_Query_actionItemCategoriesByOrganization.md create mode 100644 talawa-api-docs/modules/resolvers_Query_actionItemCategory.md create mode 100644 talawa-api-docs/modules/resolvers_Query_actionItemsByEvent.md create mode 100644 talawa-api-docs/modules/resolvers_Query_actionItemsByOrganization.md create mode 100644 talawa-api-docs/modules/resolvers_Query_checkAuth.md create mode 100644 talawa-api-docs/modules/resolvers_Query_customDataByOrganization.md create mode 100644 talawa-api-docs/modules/resolvers_Query_customFieldsByOrganization.md create mode 100644 talawa-api-docs/modules/resolvers_Query_directChatsByUserID.md create mode 100644 talawa-api-docs/modules/resolvers_Query_directChatsMessagesByChatID.md create mode 100644 talawa-api-docs/modules/resolvers_Query_event.md create mode 100644 talawa-api-docs/modules/resolvers_Query_eventsByOrganization.md create mode 100644 talawa-api-docs/modules/resolvers_Query_eventsByOrganizationConnection.md create mode 100644 talawa-api-docs/modules/resolvers_Query_getAdvertisements.md create mode 100644 talawa-api-docs/modules/resolvers_Query_getDonationById.md create mode 100644 talawa-api-docs/modules/resolvers_Query_getDonationByOrgId.md create mode 100644 talawa-api-docs/modules/resolvers_Query_getDonationByOrgIdConnection.md create mode 100644 talawa-api-docs/modules/resolvers_Query_getPlugins.md create mode 100644 talawa-api-docs/modules/resolvers_Query_getlanguage.md create mode 100644 talawa-api-docs/modules/resolvers_Query_hasSubmittedFeedback.md create mode 100644 talawa-api-docs/modules/resolvers_Query_helperFunctions_getSort.md create mode 100644 talawa-api-docs/modules/resolvers_Query_helperFunctions_getWhere.md create mode 100644 talawa-api-docs/modules/resolvers_Query_me.md create mode 100644 talawa-api-docs/modules/resolvers_Query_myLanguage.md create mode 100644 talawa-api-docs/modules/resolvers_Query_organizationIsSample.md create mode 100644 talawa-api-docs/modules/resolvers_Query_organizations.md create mode 100644 talawa-api-docs/modules/resolvers_Query_organizationsConnection.md create mode 100644 talawa-api-docs/modules/resolvers_Query_organizationsMemberConnection.md create mode 100644 talawa-api-docs/modules/resolvers_Query_post.md create mode 100644 talawa-api-docs/modules/resolvers_Query_postsByOrganization.md create mode 100644 talawa-api-docs/modules/resolvers_Query_postsByOrganizationConnection.md create mode 100644 talawa-api-docs/modules/resolvers_Query_registeredEventsByUser.md create mode 100644 talawa-api-docs/modules/resolvers_Query_user.md create mode 100644 talawa-api-docs/modules/resolvers_Query_userLanguage.md create mode 100644 talawa-api-docs/modules/resolvers_Query_users.md create mode 100644 talawa-api-docs/modules/resolvers_Query_usersConnection.md create mode 100644 talawa-api-docs/modules/resolvers_Subscription.md create mode 100644 talawa-api-docs/modules/resolvers_Subscription_directMessageChat.md create mode 100644 talawa-api-docs/modules/resolvers_Subscription_messageSentToDirectChat.md create mode 100644 talawa-api-docs/modules/resolvers_Subscription_messageSentToGroupChat.md create mode 100644 talawa-api-docs/modules/resolvers_Subscription_onPluginUpdate.md create mode 100644 talawa-api-docs/modules/resolvers_User.md create mode 100644 talawa-api-docs/modules/resolvers_UserTag.md create mode 100644 talawa-api-docs/modules/resolvers_UserTag_childTags.md create mode 100644 talawa-api-docs/modules/resolvers_UserTag_organization.md create mode 100644 talawa-api-docs/modules/resolvers_UserTag_parentTag.md create mode 100644 talawa-api-docs/modules/resolvers_UserTag_usersAssignedTo.md create mode 100644 talawa-api-docs/modules/resolvers_middleware_currentUserExists.md create mode 100644 talawa-api-docs/modules/server.md create mode 100644 talawa-api-docs/modules/services_CommentCache_cacheComments.md create mode 100644 talawa-api-docs/modules/services_CommentCache_deleteCommentFromCache.md create mode 100644 talawa-api-docs/modules/services_CommentCache_findCommentsByPostIdInCache.md create mode 100644 talawa-api-docs/modules/services_CommentCache_findCommentsInCache.md create mode 100644 talawa-api-docs/modules/services_EventCache_cacheEvents.md create mode 100644 talawa-api-docs/modules/services_EventCache_deleteEventFromCache.md create mode 100644 talawa-api-docs/modules/services_EventCache_findEventInCache.md create mode 100644 talawa-api-docs/modules/services_OrganizationCache_cacheOrganizations.md create mode 100644 talawa-api-docs/modules/services_OrganizationCache_deleteOrganizationFromCache.md create mode 100644 talawa-api-docs/modules/services_OrganizationCache_findOrganizationsInCache.md create mode 100644 talawa-api-docs/modules/services_PostCache_cachePosts.md create mode 100644 talawa-api-docs/modules/services_PostCache_deletePostFromCache.md create mode 100644 talawa-api-docs/modules/services_PostCache_findPostsInCache.md create mode 100644 talawa-api-docs/modules/services_redisCache.md create mode 100644 talawa-api-docs/modules/typeDefs.md create mode 100644 talawa-api-docs/modules/typeDefs_directives.md create mode 100644 talawa-api-docs/modules/typeDefs_enums.md create mode 100644 talawa-api-docs/modules/typeDefs_errors.md create mode 100644 talawa-api-docs/modules/typeDefs_errors_common.md create mode 100644 talawa-api-docs/modules/typeDefs_errors_connectionError.md create mode 100644 talawa-api-docs/modules/typeDefs_inputs.md create mode 100644 talawa-api-docs/modules/typeDefs_interfaces.md create mode 100644 talawa-api-docs/modules/typeDefs_mutations.md create mode 100644 talawa-api-docs/modules/typeDefs_queries.md create mode 100644 talawa-api-docs/modules/typeDefs_scalars.md create mode 100644 talawa-api-docs/modules/typeDefs_subscriptions.md create mode 100644 talawa-api-docs/modules/typeDefs_types.md create mode 100644 talawa-api-docs/modules/typeDefs_unions.md create mode 100644 talawa-api-docs/modules/types_generatedGraphQLTypes.md create mode 100644 talawa-api-docs/modules/utilities.md create mode 100644 talawa-api-docs/modules/utilities_PII_decryption.md create mode 100644 talawa-api-docs/modules/utilities_PII_encryption.md create mode 100644 talawa-api-docs/modules/utilities_PII_isAuthorised.md create mode 100644 talawa-api-docs/modules/utilities_adminCheck.md create mode 100644 talawa-api-docs/modules/utilities_auth.md create mode 100644 talawa-api-docs/modules/utilities_copyToClipboard.md create mode 100644 talawa-api-docs/modules/utilities_createSampleOrganizationUtil.md create mode 100644 talawa-api-docs/modules/utilities_deleteDuplicatedImage.md create mode 100644 talawa-api-docs/modules/utilities_deleteImage.md create mode 100644 talawa-api-docs/modules/utilities_encodedImageStorage_deletePreviousImage.md create mode 100644 talawa-api-docs/modules/utilities_encodedImageStorage_encodedImageExtensionCheck.md create mode 100644 talawa-api-docs/modules/utilities_encodedImageStorage_uploadEncodedImage.md create mode 100644 talawa-api-docs/modules/utilities_encodedVideoStorage_deletePreviousVideo.md create mode 100644 talawa-api-docs/modules/utilities_encodedVideoStorage_encodedVideoExtensionCheck.md create mode 100644 talawa-api-docs/modules/utilities_encodedVideoStorage_uploadEncodedVideo.md create mode 100644 talawa-api-docs/modules/utilities_graphqlConnectionFactory.md create mode 100644 talawa-api-docs/modules/utilities_imageAlreadyInDbCheck.md create mode 100644 talawa-api-docs/modules/utilities_imageExtensionCheck.md create mode 100644 talawa-api-docs/modules/utilities_loadSampleData.md create mode 100644 talawa-api-docs/modules/utilities_mailer.md create mode 100644 talawa-api-docs/modules/utilities_removeSampleOrganizationUtil.md create mode 100644 talawa-api-docs/modules/utilities_reuploadDuplicateCheck.md create mode 100644 talawa-api-docs/modules/utilities_superAdminCheck.md create mode 100644 talawa-api-docs/modules/utilities_uploadImage.md create mode 100644 tests/directives/directiveTransformer/authDirectiveTransformer.spec.ts create mode 100644 tests/directives/directiveTransformer/roleDirectiveTransformer.spec.ts create mode 100644 tests/helpers/Fund.ts create mode 100644 tests/helpers/FundraisingCampaign.ts create mode 100644 tests/helpers/FundraisingCampaignPledge.ts create mode 100644 tests/helpers/actionItem.ts create mode 100644 tests/helpers/actionItemCategory.ts create mode 100644 tests/helpers/advertisement.ts create mode 100644 tests/helpers/agendaCategory.ts create mode 100644 tests/helpers/agendaItem.ts create mode 100644 tests/helpers/agendaSection.ts create mode 100644 tests/helpers/checkIn.ts create mode 100644 tests/helpers/community.ts create mode 100644 tests/helpers/db.ts create mode 100644 tests/helpers/directChat.ts create mode 100644 tests/helpers/donation.ts create mode 100644 tests/helpers/events.ts create mode 100644 tests/helpers/eventsWithRegistrants.ts create mode 100644 tests/helpers/feedback.ts create mode 100644 tests/helpers/globalSetup.ts create mode 100644 tests/helpers/group.ts create mode 100644 tests/helpers/groupChat.ts create mode 100644 tests/helpers/membershipRequests.ts create mode 100644 tests/helpers/note.ts create mode 100644 tests/helpers/plugins.ts create mode 100644 tests/helpers/posts.ts create mode 100644 tests/helpers/tags.ts create mode 100644 tests/helpers/user.ts create mode 100644 tests/helpers/userAndOrg.ts create mode 100644 tests/helpers/userAndUserFamily.ts create mode 100644 tests/helpers/venue.ts create mode 100644 tests/libraries/dbLogger.spec.ts create mode 100644 tests/libraries/errors/ImageSizeLimitExceeded.ts.spec.ts create mode 100644 tests/libraries/errors/inputValidationError.spec.ts create mode 100644 tests/libraries/errors/internalServerError.spec.ts create mode 100644 tests/libraries/errors/invalidFileTypeError.spec.ts create mode 100644 tests/libraries/errors/unauthenticatedError.spec.ts create mode 100644 tests/libraries/logger.spec.ts create mode 100644 tests/libraries/requestContext.spec.ts create mode 100644 tests/libraries/requestTracing.spec.ts create mode 100644 tests/middleware/isAuth.spec.ts create mode 100644 tests/resolvers/ActionItemCategory/creator.spec.ts create mode 100644 tests/resolvers/Advertisement/organization.spec.ts create mode 100644 tests/resolvers/AgendaCategory/createdBy.spec.ts create mode 100644 tests/resolvers/AgendaCategory/organization.spec.ts create mode 100644 tests/resolvers/AgendaCategory/updatedBy.spec.ts create mode 100644 tests/resolvers/AgendaItem/Users.spec.ts create mode 100644 tests/resolvers/AgendaItem/categories.spec.ts create mode 100644 tests/resolvers/AgendaItem/createdby.spec.ts create mode 100644 tests/resolvers/AgendaItem/organization.spec.ts create mode 100644 tests/resolvers/AgendaItem/relatedEvent.spec.ts create mode 100644 tests/resolvers/AgendaItem/updatedBy.spec.ts create mode 100644 tests/resolvers/AgendaSection/createdBy.spec.ts create mode 100644 tests/resolvers/AgendaSection/items.spec.ts create mode 100644 tests/resolvers/AgendaSection/relatedEvent.spec.ts create mode 100644 tests/resolvers/CheckIn/event.spec.ts create mode 100644 tests/resolvers/CheckIn/user.spec.ts create mode 100644 tests/resolvers/Comment/creator.spec.ts create mode 100644 tests/resolvers/DirectChat/creator.spec.ts create mode 100644 tests/resolvers/DirectChat/messages.spec.ts create mode 100644 tests/resolvers/DirectChat/organization.spec.ts create mode 100644 tests/resolvers/DirectChat/users.spec.ts create mode 100644 tests/resolvers/DirectChatMessage/directChatMessageBelongsTo.spec.ts create mode 100644 tests/resolvers/DirectChatMessage/receiver.spec.ts create mode 100644 tests/resolvers/DirectChatMessage/sender.spec.ts create mode 100644 tests/resolvers/Event/actionItems.spec.ts create mode 100644 tests/resolvers/Event/attendees.spec.ts create mode 100644 tests/resolvers/Event/attendeesCheckInStatus.spec.ts create mode 100644 tests/resolvers/Event/averageFeedbackScore.spec.ts create mode 100644 tests/resolvers/Event/baseRecurringEvent.spec.ts create mode 100644 tests/resolvers/Event/creator.spec.ts create mode 100644 tests/resolvers/Event/feedback.spec.ts create mode 100644 tests/resolvers/Event/organization.spec.ts create mode 100644 tests/resolvers/Event/recurrenceRule.spec.ts create mode 100644 tests/resolvers/EventVolunteer/creator.spec.ts create mode 100644 tests/resolvers/EventVolunteer/event.spec.ts create mode 100644 tests/resolvers/EventVolunteer/group.spec.ts create mode 100644 tests/resolvers/EventVolunteer/user.spec.ts create mode 100644 tests/resolvers/EventVolunteerGroup/creator.spec.ts create mode 100644 tests/resolvers/EventVolunteerGroup/event.spec.ts create mode 100644 tests/resolvers/EventVolunteerGroup/leader.spec.ts create mode 100644 tests/resolvers/Feedback/event.spec.ts create mode 100644 tests/resolvers/Fund/creator.spec.ts create mode 100644 tests/resolvers/FundCampaignPledges/users.spec.ts create mode 100644 tests/resolvers/GroupChat/creator.spec.ts create mode 100644 tests/resolvers/GroupChat/messages.spec.ts create mode 100644 tests/resolvers/GroupChat/organization.spec.ts create mode 100644 tests/resolvers/GroupChat/users.spec.ts create mode 100644 tests/resolvers/GroupChatMessage/groupChatMessageBelongsTo.spec.ts create mode 100644 tests/resolvers/GroupChatMessage/sender.spec.ts create mode 100644 tests/resolvers/MembershipRequest/organization.spec.ts create mode 100644 tests/resolvers/MembershipRequest/user.spec.ts create mode 100644 tests/resolvers/Mutation/acceptMembershipRequest.spec.ts create mode 100644 tests/resolvers/Mutation/addEventAttendee.spec.ts create mode 100644 tests/resolvers/Mutation/addFeedback.spec.ts create mode 100644 tests/resolvers/Mutation/addLanguageTranslation.spec.ts create mode 100644 tests/resolvers/Mutation/addOrganizationCustomField.spec.ts create mode 100644 tests/resolvers/Mutation/addOrganizationImage.spec.ts create mode 100644 tests/resolvers/Mutation/addPledgeToFundraisingCampaign.spec.ts create mode 100644 tests/resolvers/Mutation/addUserCustomData.spec.ts create mode 100644 tests/resolvers/Mutation/addUserImage.spec.ts create mode 100644 tests/resolvers/Mutation/addUserToGroupChat.spec.ts create mode 100644 tests/resolvers/Mutation/addUserToUserFamily.spec.ts create mode 100644 tests/resolvers/Mutation/adminRemoveGroup.spec.ts create mode 100644 tests/resolvers/Mutation/assignUserTag.spec.ts create mode 100644 tests/resolvers/Mutation/blockPluginCreationBySuperadmin.spec.ts create mode 100644 tests/resolvers/Mutation/blockUser.spec.ts create mode 100644 tests/resolvers/Mutation/cancelMembershipRequest.spec.ts create mode 100644 tests/resolvers/Mutation/checkIn.spec.ts create mode 100644 tests/resolvers/Mutation/checkOut.spec.ts create mode 100644 tests/resolvers/Mutation/createActionItem.spec.ts create mode 100644 tests/resolvers/Mutation/createActionItemCategory.spec.ts create mode 100644 tests/resolvers/Mutation/createAdmin.spec.ts create mode 100644 tests/resolvers/Mutation/createAdvertisement.spec.ts create mode 100644 tests/resolvers/Mutation/createAgendaCategory.spec.ts create mode 100644 tests/resolvers/Mutation/createAgendaItem.spec.ts create mode 100644 tests/resolvers/Mutation/createAgendaSection.spec.ts create mode 100644 tests/resolvers/Mutation/createComment.spec.ts create mode 100644 tests/resolvers/Mutation/createDirectChat.spec.ts create mode 100644 tests/resolvers/Mutation/createDonation.spec.ts create mode 100644 tests/resolvers/Mutation/createEvent.spec.ts create mode 100644 tests/resolvers/Mutation/createEventVolunteer.spec.ts create mode 100644 tests/resolvers/Mutation/createEventVolunteerGroup.spec.ts create mode 100644 tests/resolvers/Mutation/createFund.spec.ts create mode 100644 tests/resolvers/Mutation/createFundCampaignPledge.spec.ts create mode 100644 tests/resolvers/Mutation/createFundraisingCampaign.spec.ts create mode 100644 tests/resolvers/Mutation/createGroupChat.spec.ts create mode 100644 tests/resolvers/Mutation/createMember.spec.ts create mode 100644 tests/resolvers/Mutation/createMessageChat.spec.ts create mode 100644 tests/resolvers/Mutation/createNote.spec.ts create mode 100644 tests/resolvers/Mutation/createOrganization.spec.ts create mode 100644 tests/resolvers/Mutation/createPlugin.spec.ts create mode 100644 tests/resolvers/Mutation/createPost.spec.ts create mode 100644 tests/resolvers/Mutation/createSampleOrganization.spec.ts create mode 100644 tests/resolvers/Mutation/createUserFamily.spec.ts create mode 100644 tests/resolvers/Mutation/createUserTag.spec.ts create mode 100644 tests/resolvers/Mutation/createVenue.spec.ts create mode 100644 tests/resolvers/Mutation/deleteAdvertisement.spec.ts create mode 100644 tests/resolvers/Mutation/deleteAgendaCategory.spec.ts create mode 100644 tests/resolvers/Mutation/deleteDonationById.spec.ts create mode 100644 tests/resolvers/Mutation/deleteNote.spec.ts create mode 100644 tests/resolvers/Mutation/deleteVenue.spec.ts create mode 100644 tests/resolvers/Mutation/editVenue.spec.ts create mode 100644 tests/resolvers/Mutation/forgotPassword.spec.ts create mode 100644 tests/resolvers/Mutation/inviteEventAttendee.spec.ts create mode 100644 tests/resolvers/Mutation/joinPublicOrganization.spec.ts create mode 100644 tests/resolvers/Mutation/leaveOrganization.spec.ts create mode 100644 tests/resolvers/Mutation/likeComment.spec.ts create mode 100644 tests/resolvers/Mutation/likePost.spec.ts create mode 100644 tests/resolvers/Mutation/login.spec.ts create mode 100644 tests/resolvers/Mutation/logout.spec.ts create mode 100644 tests/resolvers/Mutation/otp.spec.ts create mode 100644 tests/resolvers/Mutation/recaptcha.spec.ts create mode 100644 tests/resolvers/Mutation/refreshToken.spec.ts create mode 100644 tests/resolvers/Mutation/registerEventAttendee.spec.ts create mode 100644 tests/resolvers/Mutation/registerForEvent.spec.ts create mode 100644 tests/resolvers/Mutation/rejectMembershipRequest.spec.ts create mode 100644 tests/resolvers/Mutation/removeActionItem.spec.ts create mode 100644 tests/resolvers/Mutation/removeAdmin.spec.ts create mode 100644 tests/resolvers/Mutation/removeAgendaItem.spec.ts create mode 100644 tests/resolvers/Mutation/removeAgendaSection.spec.ts create mode 100644 tests/resolvers/Mutation/removeComment.spec.ts create mode 100644 tests/resolvers/Mutation/removeDirectChat.spec.ts create mode 100644 tests/resolvers/Mutation/removeEvent.spec.ts create mode 100644 tests/resolvers/Mutation/removeEventAttendee.spec.ts create mode 100644 tests/resolvers/Mutation/removeEventVolunteer.spec.ts create mode 100644 tests/resolvers/Mutation/removeEventVolunteerGroup.spec.ts create mode 100644 tests/resolvers/Mutation/removeFundCampaignPledge.spec.ts create mode 100644 tests/resolvers/Mutation/removeGroupChat.spec.ts create mode 100644 tests/resolvers/Mutation/removeMember.spec.ts create mode 100644 tests/resolvers/Mutation/removeOrganization.spec.ts create mode 100644 tests/resolvers/Mutation/removeOrganizationCustomField.spec.ts create mode 100644 tests/resolvers/Mutation/removeOrganizationImage.spec.ts create mode 100644 tests/resolvers/Mutation/removePost.spec.ts create mode 100644 tests/resolvers/Mutation/removeSampleOrganization.spec.ts create mode 100644 tests/resolvers/Mutation/removeUserCustomData.spec.ts create mode 100644 tests/resolvers/Mutation/removeUserFamily.spec.ts create mode 100644 tests/resolvers/Mutation/removeUserFromGroupChat.spec.ts create mode 100644 tests/resolvers/Mutation/removeUserFromUserFamily.spec.ts create mode 100644 tests/resolvers/Mutation/removeUserImage.spec.ts create mode 100644 tests/resolvers/Mutation/removeUserTag.spec.ts create mode 100644 tests/resolvers/Mutation/resetCommunity.spec.ts create mode 100644 tests/resolvers/Mutation/revokeRefreshTokenForUser.spec.ts create mode 100644 tests/resolvers/Mutation/saveFcmToken.spec.ts create mode 100644 tests/resolvers/Mutation/sendMembershipRequest.spec.ts create mode 100644 tests/resolvers/Mutation/sendMessageToDirectChat.spec.ts create mode 100644 tests/resolvers/Mutation/sendMessageToGroupChat.spec.ts create mode 100644 tests/resolvers/Mutation/signUp.spec.ts create mode 100644 tests/resolvers/Mutation/togglePostPin.spec.ts create mode 100644 tests/resolvers/Mutation/unassignUserTag.spec.ts create mode 100644 tests/resolvers/Mutation/unblockUser.spec.ts create mode 100644 tests/resolvers/Mutation/unlikeComment.spec.ts create mode 100644 tests/resolvers/Mutation/unlikePost.spec.ts create mode 100644 tests/resolvers/Mutation/unregisterForEventByUser.spec.ts create mode 100644 tests/resolvers/Mutation/updateActionItem.spec.ts create mode 100644 tests/resolvers/Mutation/updateActionItemCategory.spec.ts create mode 100644 tests/resolvers/Mutation/updateAdvertisement.spec.ts create mode 100644 tests/resolvers/Mutation/updateAgendaCategory.spec.ts create mode 100644 tests/resolvers/Mutation/updateAgendaItem.spec.ts create mode 100644 tests/resolvers/Mutation/updateAgendaSection.spec.ts create mode 100644 tests/resolvers/Mutation/updateCommunity.spec.ts create mode 100644 tests/resolvers/Mutation/updateEvent.spec.ts create mode 100644 tests/resolvers/Mutation/updateEventVolunteer.spec.ts create mode 100644 tests/resolvers/Mutation/updateEventVolunteerGroup.spec.ts create mode 100644 tests/resolvers/Mutation/updateFund.spec.ts create mode 100644 tests/resolvers/Mutation/updateFundCampaignPledge.spec.ts create mode 100644 tests/resolvers/Mutation/updateFundraisingCampaign.spec.ts create mode 100644 tests/resolvers/Mutation/updateLanguage.spec.ts create mode 100644 tests/resolvers/Mutation/updateNote.spec.ts create mode 100644 tests/resolvers/Mutation/updateOrganization.spec.ts create mode 100644 tests/resolvers/Mutation/updatePluginStatus.spec.ts create mode 100644 tests/resolvers/Mutation/updatePost.spec.ts create mode 100644 tests/resolvers/Mutation/updateUserPassword.spec.ts create mode 100644 tests/resolvers/Mutation/updateUserProfile.spec.ts create mode 100644 tests/resolvers/Mutation/updateUserRoleInOrganization.spec.ts create mode 100644 tests/resolvers/Mutation/updateUserTag.spec.ts create mode 100644 tests/resolvers/Organization/actionItemCategories.spec.ts create mode 100644 tests/resolvers/Organization/admins.spec.ts create mode 100644 tests/resolvers/Organization/advertisements.spec.ts create mode 100644 tests/resolvers/Organization/agendaCategories.spec.ts create mode 100644 tests/resolvers/Organization/blockedUsers.spec.ts create mode 100644 tests/resolvers/Organization/creator.spec.ts create mode 100644 tests/resolvers/Organization/funds.spec.ts create mode 100644 tests/resolvers/Organization/image.spec.ts create mode 100644 tests/resolvers/Organization/members.spec.ts create mode 100644 tests/resolvers/Organization/membershipRequests.spec.ts create mode 100644 tests/resolvers/Organization/pinnedPosts.spec.ts create mode 100644 tests/resolvers/Organization/posts.spec.ts create mode 100644 tests/resolvers/Organization/userTags.spec.ts create mode 100644 tests/resolvers/Organization/venues.spec.ts create mode 100644 tests/resolvers/Post/comments.spec.ts create mode 100644 tests/resolvers/Post/creator.spec.ts create mode 100644 tests/resolvers/Post/likedBy.spec.ts create mode 100644 tests/resolvers/Query/actionItemCategoriesByOrganization.spec.ts create mode 100644 tests/resolvers/Query/actionItemsByEvent.spec.ts create mode 100644 tests/resolvers/Query/actionItemsByOrganization.spec.ts create mode 100644 tests/resolvers/Query/advertisementsConnection.spec.ts create mode 100644 tests/resolvers/Query/agendaCategory.spec.ts create mode 100644 tests/resolvers/Query/agendaItemByEvent.spec.ts create mode 100644 tests/resolvers/Query/agendaItemById.spec.ts create mode 100644 tests/resolvers/Query/agendaItemByOrganization.spec.ts create mode 100644 tests/resolvers/Query/agendaItemCategoriesByOrganization.spec.ts create mode 100644 tests/resolvers/Query/checkAuth.spec.ts create mode 100644 tests/resolvers/Query/customDataByOrganization.spec.ts create mode 100644 tests/resolvers/Query/customFieldsByOrganization.spec.ts create mode 100644 tests/resolvers/Query/directChatById.spec.ts create mode 100644 tests/resolvers/Query/directChatsByUserID.spec.ts create mode 100644 tests/resolvers/Query/directChatsMessagesByChatID.spec.ts create mode 100644 tests/resolvers/Query/event.spec.ts create mode 100644 tests/resolvers/Query/eventVolunteersByEvent.spec.ts create mode 100644 tests/resolvers/Query/eventsByOrganization.spec.ts create mode 100644 tests/resolvers/Query/eventsByOrganizationConnection.spec.ts create mode 100644 tests/resolvers/Query/fundsByOrganization.spec.ts create mode 100644 tests/resolvers/Query/getAgendaSection.spec.ts create mode 100644 tests/resolvers/Query/getAllAgendaItems.spec.ts create mode 100644 tests/resolvers/Query/getAllNotesForAgendaItem.spec.ts create mode 100644 tests/resolvers/Query/getCampaignPledgesById.spec.ts create mode 100644 tests/resolvers/Query/getCommunityData.spec.ts create mode 100644 tests/resolvers/Query/getDonationById.spec.ts create mode 100644 tests/resolvers/Query/getDonationByOrgId.spec.ts create mode 100644 tests/resolvers/Query/getDonationByOrgIdConnection.spec.ts create mode 100644 tests/resolvers/Query/getEventAttendee.spec.ts create mode 100644 tests/resolvers/Query/getEventAttendeesByEventId.spec.ts create mode 100644 tests/resolvers/Query/getEventInvitesByUserId.spec.ts create mode 100644 tests/resolvers/Query/getEventVolunteerGroups.spec.ts create mode 100644 tests/resolvers/Query/getFundById.spec.ts create mode 100644 tests/resolvers/Query/getFundRaisingCampaigns.spec.ts create mode 100644 tests/resolvers/Query/getNoteById.spec.ts create mode 100644 tests/resolvers/Query/getPledgesByUserId.spec.ts create mode 100644 tests/resolvers/Query/getPlugins.spec.ts create mode 100644 tests/resolvers/Query/getUserTag.spec.ts create mode 100644 tests/resolvers/Query/getUserTagAncestors.spec.ts create mode 100644 tests/resolvers/Query/getVenueByOrgId.spec.ts create mode 100644 tests/resolvers/Query/getlanguage.spec.ts create mode 100644 tests/resolvers/Query/groupChatById.spec.ts create mode 100644 tests/resolvers/Query/groupChatsByUserId.spec.ts create mode 100644 tests/resolvers/Query/hasSubmittedFeedback.spec.ts create mode 100644 tests/resolvers/Query/helperFunctions/getSort.spec.ts create mode 100644 tests/resolvers/Query/helperFunctions/getWhere.spec.ts create mode 100644 tests/resolvers/Query/me.spec.ts create mode 100644 tests/resolvers/Query/myLanguage.spec.ts create mode 100644 tests/resolvers/Query/organizationIsSample.spec.ts create mode 100644 tests/resolvers/Query/organizations.spec.ts create mode 100644 tests/resolvers/Query/organizationsConnection.spec.ts create mode 100644 tests/resolvers/Query/organizationsMemberConnection.spec.ts create mode 100644 tests/resolvers/Query/post.spec.ts create mode 100644 tests/resolvers/Query/registeredEventsByUser.spec.ts create mode 100644 tests/resolvers/Query/user.spec.ts create mode 100644 tests/resolvers/Query/userLanguage.spec.ts create mode 100644 tests/resolvers/Query/users.spec.ts create mode 100644 tests/resolvers/Query/usersConnection.spec.ts create mode 100644 tests/resolvers/Query/venue.spec.ts create mode 100644 tests/resolvers/RecurrenceRule/baseRecurringEvent.spec.ts create mode 100644 tests/resolvers/RecurrenceRule/organization.spec.ts create mode 100644 tests/resolvers/Subscription/directMessageChat.spec.ts create mode 100644 tests/resolvers/Subscription/messageSentToDirectChat.spec.ts create mode 100644 tests/resolvers/Subscription/messageSentToGroupChat.spec.ts create mode 100644 tests/resolvers/Subscription/onPluginUpdate.spec.ts create mode 100644 tests/resolvers/User/post.spec.ts create mode 100644 tests/resolvers/User/user.spec.ts create mode 100644 tests/resolvers/UserFamily/admins.spec.ts create mode 100644 tests/resolvers/UserFamily/creator.spec.ts create mode 100644 tests/resolvers/UserFamily/users.spec.ts create mode 100644 tests/resolvers/UserTag/childTags.spec.ts create mode 100644 tests/resolvers/UserTag/organization.spec.ts create mode 100644 tests/resolvers/UserTag/parentTag.spec.ts create mode 100644 tests/resolvers/UserTag/usersAssignedTo.spec.ts create mode 100644 tests/resolvers/middleware/currentUserExists.spec.ts create mode 100644 tests/setup/accessAndRefreshTokens.spec.ts create mode 100644 tests/setup/askToKeepValues.spec.ts create mode 100644 tests/setup/checkExistingMongoDB.spec.ts create mode 100644 tests/setup/configureSmtp.spec.ts create mode 100644 tests/setup/getNodeEnvironment.spec.ts create mode 100644 tests/setup/minio/getMinioBinaryUrl/getMinioBinaryUrl.default.spec.ts create mode 100644 tests/setup/minio/getMinioBinaryUrl/getMinioBinaryUrl.linux.spec.ts create mode 100644 tests/setup/minio/getMinioBinaryUrl/getMinioBinaryUrl.macos.spec.ts create mode 100644 tests/setup/minio/getMinioBinaryUrl/getMinioBinaryUrl.windows.spec.ts create mode 100644 tests/setup/minio/installMinio/installMinio.spec.ts create mode 100644 tests/setup/minio/installMinio/installMinio.windows.spec.ts create mode 100644 tests/setup/minio/installMinio/installMinioSkipCreateDir.spec.ts create mode 100644 tests/setup/minio/isMinioInstalled/isMinioInstalledBinaryFileExists.spec.ts create mode 100644 tests/setup/minio/isMinioInstalled/isMinioInstalledBinaryFileExists.windows.spec.ts create mode 100644 tests/setup/minio/isMinioInstalled/isMinioInstalledCommandAvailable.spec.ts create mode 100644 tests/setup/minio/isMinioInstalled/minioNotInstalled.spec.ts create mode 100644 tests/setup/minio/setPathEnvVar/setPathEnvVar.error.spec.ts create mode 100644 tests/setup/minio/setPathEnvVar/setPathEnvVar.linux.spec.ts create mode 100644 tests/setup/minio/setPathEnvVar/setPathEnvVar.macos.spec.ts create mode 100644 tests/setup/minio/setPathEnvVar/setPathEnvVar.windows.spec.ts create mode 100644 tests/setup/minio/updateIgnoreFile/updateIgnoreFile.alreadyPresent.spec.ts create mode 100644 tests/setup/minio/updateIgnoreFile/updateIgnoreFile.spec.ts create mode 100644 tests/setup/mongoDB.spec.ts create mode 100644 tests/setup/reCaptcha.spec.ts create mode 100644 tests/setup/reCaptchaSiteKey.spec.ts create mode 100644 tests/setup/redisConfiguration.spec.ts create mode 100644 tests/setup/setImageUploadSize.spec.ts create mode 100644 tests/setup/setNodeEnvironment.spec.ts create mode 100644 tests/setup/superAdmin.spec.ts create mode 100644 tests/setup/twoFactorAuth.spec.ts create mode 100644 tests/setup/verifySmtpConnection.spec.ts create mode 100644 tests/utilities/adminCheck.spec.ts create mode 100644 tests/utilities/auth.spec.ts create mode 100644 tests/utilities/checkReplicaSet.spec.ts create mode 100644 tests/utilities/createSampleOrganizationUtil.spec.ts create mode 100644 tests/utilities/deleteDuplicatedImage.spec.ts create mode 100644 tests/utilities/deleteImage.spec.ts create mode 100644 tests/utilities/encodedImageStorage/deletePreviousImage.spec.ts create mode 100644 tests/utilities/encodedImageStorage/encodedImageExtensionCheck.spec.ts create mode 100644 tests/utilities/encodedImageStorage/uploadEncodedImage.spec.ts create mode 100644 tests/utilities/encodedVideoStorage/deletePreviousVideo.spec.ts create mode 100644 tests/utilities/encodedVideoStorage/encodedVideoExtensionCheck.spec.ts create mode 100644 tests/utilities/encodedVideoStorage/uploadEncodedVideo.spec.ts create mode 100644 tests/utilities/graphqlConnection.spec.ts create mode 100644 tests/utilities/imageAlreadyInDbCheck.spec.ts create mode 100644 tests/utilities/imageExtensionCheck.spec.ts create mode 100644 tests/utilities/loadDefaultOrg.spec.ts create mode 100644 tests/utilities/mailer.spec.ts create mode 100644 tests/utilities/removeSampleOrganizationUtil.spec.ts create mode 100644 tests/utilities/reuploadDuplicateCheck.spec.ts create mode 100644 tests/utilities/superAdminCheck.spec.ts create mode 100644 tests/utilities/uploadImage.spec.ts create mode 100644 tests/utilities/userFamilyAdminCheck.spec.ts create mode 100644 tsconfig.build.json create mode 100644 tsconfig.json create mode 100644 videos/.gitignore create mode 100644 vite.config.mts diff --git a/.coderabbit.yaml b/.coderabbit.yaml index 46e2d25b8c..22fd305608 100644 --- a/.coderabbit.yaml +++ b/.coderabbit.yaml @@ -13,5 +13,6 @@ reviews: drafts: false base_branches: - develop + - main chat: auto_reply: true \ No newline at end of file diff --git a/.dockerignore b/.dockerignore index 06d9a3ecb2..d0adaf2671 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,6 +1,7 @@ node_modules videos images +data .env .git .gitignore diff --git a/.env.sample b/.env.sample index 448f36a01a..fa6a0fabaa 100644 --- a/.env.sample +++ b/.env.sample @@ -84,6 +84,24 @@ REDIS_HOST= REDIS_PORT= REDIS_PASSWORD= +# These environment variables are used to provide MinIo credentials + +# The endpoint URL for MinIO server, specifying where the MinIO service is hosted +MINIO_ENDPOINT= + +# The username with root-level access for MinIO administration +MINIO_ROOT_USER= + +# The password corresponding to the MINIO_ROOT_USER for authentication +MINIO_ROOT_PASSWORD= + +# The default bucket name to use with MinIO for storing data +MINIO_BUCKET= + +# The local directory where MinIO stores its data files +MINIO_DATA_DIR= + + # this environment variable is for setting the environment variable for Image Upload size IMAGE_SIZE_LIMIT_KB=3000 \ No newline at end of file diff --git a/.eslintrc.json b/.eslintrc.json index e0098cc7b9..6f13ff601d 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -24,7 +24,6 @@ "@typescript-eslint/consistent-type-assertions": "error", "@typescript-eslint/consistent-type-imports": "error", "@typescript-eslint/explicit-function-return-type": "error", - // Interfaces must begin with Interface or TestInterface followed by a PascalCase name "@typescript-eslint/naming-convention": [ "error", @@ -80,7 +79,7 @@ "plugins": ["@graphql-eslint"] }, { - "files": ["tests/**/*"], + "files": ["tests/**/*", "setup.ts"], "rules": { "no-restricted-imports": "off" } @@ -107,13 +106,13 @@ ], // restrict the use of same package in multiple import statements "import/no-duplicates": "error", - // warn/1, error/2, off/0 "tsdoc/syntax": "error", - // Typescript Rules "@typescript-eslint/ban-ts-comment": "error", - "@typescript-eslint/ban-types": "error", + "@typescript-eslint/no-unsafe-function-type": "error", + "@typescript-eslint/no-wrapper-object-types": "error", + "@typescript-eslint/no-empty-object-type": "error", "@typescript-eslint/no-duplicate-enum-values": "error", "@typescript-eslint/no-explicit-any": "warn", "@typescript-eslint/no-non-null-asserted-optional-chain": "error", diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md index 493322305f..d9f95c0d65 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.md +++ b/.github/ISSUE_TEMPLATE/bug-report.md @@ -31,4 +31,6 @@ If applicable, add screenshots to help explain your problem. Add any other context or screenshots about the feature request here. **Potential internship candidates** -Please read this if you are planning to apply for a Palisadoes Foundation internship https://github.com/PalisadoesFoundation/talawa/issues/359 + +Please read this if you are planning to apply for a Palisadoes Foundation internship +- https://github.com/PalisadoesFoundation/talawa/issues/359 diff --git a/.github/ISSUE_TEMPLATE/feature-request.md b/.github/ISSUE_TEMPLATE/feature-request.md index 60d6401dcf..51aea0e9d9 100644 --- a/.github/ISSUE_TEMPLATE/feature-request.md +++ b/.github/ISSUE_TEMPLATE/feature-request.md @@ -23,4 +23,6 @@ A clear and concise description of approach to be followed. Add any other context or screenshots about the feature request here. **Potential internship candidates** -Please read this if you are planning to apply for a Palisadoes Foundation internship https://github.com/PalisadoesFoundation/talawa/issues/359 + +Please read this if you are planning to apply for a Palisadoes Foundation internship +- https://github.com/PalisadoesFoundation/talawa/issues/359 diff --git a/.github/workflows/check-tsdoc.js b/.github/workflows/check-tsdoc.js new file mode 100644 index 0000000000..c878389bdb --- /dev/null +++ b/.github/workflows/check-tsdoc.js @@ -0,0 +1,80 @@ +const fs = require('fs'); +const path = require('path'); + +// List of files to skip +const filesToSkip = [ + "app.ts", + "index.ts", + "constants.ts", + "db.ts", + "env.ts", + "logger.ts", + "getSort.ts", + // Add more files to skip as needed +]; + +// List of directories to skip +const dirsToSkip = [ + "typeDefs", + "services", + + // Add more directories to skip as needed +]; + +// Recursively find all .tsx files, excluding files listed in filesToSkip and directories in dirsToSkip +function findTsxFiles(dir) { + let results = []; + try { + const list = fs.readdirSync(dir); + list.forEach((file) => { + const filePath = path.join(dir, file); + const stat = fs.statSync(filePath); + if (stat && stat.isDirectory()) { + // Skip directories in dirsToSkip + if (!dirsToSkip.includes(path.basename(filePath))) { + results = results.concat(findTsxFiles(filePath)); + } + } else if ( + filePath.endsWith('.ts') && + !filePath.endsWith('.spec.ts') && + !filesToSkip.includes(path.relative(dir, filePath)) + ) { + results.push(filePath); + } + }); + } catch (err) { + console.error(`Error reading directory ${dir}: ${err.message}`); + } + return results; +} + +// Check if a file contains at least one TSDoc comment +function containsTsDocComment(filePath) { + try { + const content = fs.readFileSync(filePath, 'utf8'); + return /\/\*\*[\s\S]*?\*\//.test(content); + } catch (err) { + console.error(`Error reading file ${filePath}: ${err.message}`); + return false; + } +} + +// Main function to run the validation +function run() { + const dir = process.argv[2] || './src'; // Allow directory path as a command-line argument + const files = findTsxFiles(dir); + let allValid = true; + + files.forEach((file) => { + if (!containsTsDocComment(file)) { + console.error(`No TSDoc comment found in file: ${file}`); + allValid = false; + } + }); + + if (!allValid) { + process.exit(1); + } +} + +run(); \ No newline at end of file diff --git a/.github/workflows/eslint_disable_check.py b/.github/workflows/eslint_disable_check.py new file mode 100644 index 0000000000..95702064ee --- /dev/null +++ b/.github/workflows/eslint_disable_check.py @@ -0,0 +1,123 @@ +#!/usr/bin/env python3 +# -*- coding: UTF-8 -*- +"""ESLint Checker Script. + +Methodology: + + Recursively analyzes TypeScript files in the 'src' directory and its subdirectories + as well as 'setup.ts' files to ensure they do not contain eslint-disable statements. + + This script enforces code quality practices in the project. + +NOTE: + + This script complies with our python3 coding and documentation standards. + It complies with: + + 1) Pylint + 2) Pydocstyle + 3) Pycodestyle + 4) Flake8 + +""" + +import os +import re +import argparse +import sys + +def has_eslint_disable(file_path): + """ + Check if a TypeScript file contains eslint-disable statements. + + Args: + file_path (str): Path to the TypeScript file. + + Returns: + bool: True if eslint-disable statement is found, False otherwise. + """ + eslint_disable_pattern = re.compile(r'//\s*eslint-disable(?:-next-line|-line)?', re.IGNORECASE) + + try: + with open(file_path, 'r', encoding='utf-8') as file: + content = file.read() + return bool(eslint_disable_pattern.search(content)) + except Exception as e: + print(f"Error reading file {file_path}: {e}") + return False + +def check_eslint(directory): + """ + Recursively check TypeScript files for eslint-disable statements in the 'src' directory. + + Args: + directory (str): Path to the directory. + + Returns: + list: List of files containing eslint-disable statements. + """ + eslint_issues = [] + + src_dir = os.path.join(directory, 'src') + + if not os.path.exists(src_dir): + print(f"Source directory '{src_dir}' does not exist.") + return eslint_issues + + for root, dirs, files in os.walk(src_dir): + for file_name in files: + if file_name.endswith('.tsx') and not file_name.endswith('.test.tsx'): + file_path = os.path.join(root, file_name) + if has_eslint_disable(file_path): + eslint_issues.append(f'File {file_path} contains eslint-disable statement.') + + setup_path = os.path.join(directory, 'setup.ts') + if os.path.exists(setup_path) and has_eslint_disable(setup_path): + eslint_issues.append(f'Setup file {setup_path} contains eslint-disable statement.') + + return eslint_issues + +def arg_parser_resolver(): + """Resolve the CLI arguments provided by the user.""" + parser = argparse.ArgumentParser() + parser.add_argument( + "--directory", + type=str, + default=os.getcwd(), + help="Path to the directory to check (default: current directory)" + ) + return parser.parse_args() + +def main(): + """ + Execute the script's main functionality. + + This function serves as the entry point for the script. It performs + the following tasks: + 1. Validates and retrieves the directory to check from + command line arguments. + 2. Recursively checks TypeScript files for eslint-disable statements. + 3. Provides informative messages based on the analysis. + 4. Exits with an error if eslint-disable statements are found. + + Raises: + SystemExit: If an error occurs during execution. + """ + args = arg_parser_resolver() + if not os.path.exists(args.directory): + print(f"Error: The specified directory '{args.directory}' does not exist.") + sys.exit(1) + + eslint_issues = check_eslint(args.directory) + + if eslint_issues: + for issue in eslint_issues: + print(issue) + print("ESLint-disable check failed. Exiting with error.") + sys.exit(1) + + print("ESLint-disable check completed successfully.") + sys.exit(0) + +if __name__ == "__main__": + main() diff --git a/.github/workflows/md_mdx_format_adjuster.py b/.github/workflows/md_mdx_format_adjuster.py index c33ad1fa66..cd76a30cf6 100644 --- a/.github/workflows/md_mdx_format_adjuster.py +++ b/.github/workflows/md_mdx_format_adjuster.py @@ -12,7 +12,6 @@ 3) Pycodestyle 4) Flake8 """ - import os import argparse import re diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index 0ad59c70a6..10fd9fd62f 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -32,13 +32,16 @@ jobs: - name: Set up Node.js uses: actions/setup-node@v4 with: - node-version: '20.x' + node-version: '22.x' - name: Count number of lines run: | chmod +x ./.github/workflows/countline.py ./.github/workflows/countline.py --lines 600 --exclude_files src/types/generatedGraphQLTypes.ts tests src/typeDefs/types.ts src/constants.ts + - name: Check for TSDoc comments + run: npm run check-tsdoc # Run the TSDoc check script + - name: Restore node_modules from cache id: cache-npm uses: actions/cache@v4 @@ -71,7 +74,7 @@ jobs: if: steps.changed_files.outputs.any_changed == 'true' env: CHANGED_FILES: ${{ steps.changed_files.outputs.all_changed_files }} - run: npx eslint ${CHANGED_FILES} + run: npx eslint ${CHANGED_FILES} --max-warnings=1500 && python .github/workflows/eslint_disable_check.py - name: Check for formatting errors run: npm run format:check @@ -171,7 +174,7 @@ jobs: needs: [Code-Quality-Checks] strategy: matrix: - node-version: [20.x] + node-version: [22.x] services: mongo: image: mongo:4.4 @@ -216,7 +219,7 @@ jobs: - name: Set up Node.js uses: actions/setup-node@v4 with: - node-version: '20.x' + node-version: '22.x' - name: Generate Access Token Secret run: echo "ACCESS_TOKEN_SECRET=$(openssl rand -hex 32)" >> $GITHUB_ENV diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 8eb1f501c1..90c6dfbcf7 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -30,7 +30,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - node-version: [20.x] + node-version: [22.x] services: redis: image: redis:6.0 @@ -58,7 +58,6 @@ jobs: # REFRESH_TOKEN_SECRET: ${{ secrets.REFRESH_TOKEN_SECRET }} # We checkout the content of the Talawa-API repository in a directory called `api` - # This is done as we will use the Talawa-Docs repository later too steps: - name: Checkout repository uses: actions/checkout@v4 @@ -94,101 +93,6 @@ jobs: name: '${{env.CODECOV_UNIQUE_NAME}}' - Generate-Documentation: - name: Generate Documentation - runs-on: ubuntu-latest - if: github.ref == 'refs/heads/develop' - needs: Push-Workflow - steps: - - name: Checkout repository - uses: actions/checkout@v4 - # with: - # persist-credentials: false - - name: Generate Documentation of HTML pages - run: | - npm install --global typedoc - npm install typedoc-plugin-markdown - npm i --save-dev @types/node - npx typedoc --entryPoints src --out talawa-api-docs --plugin typedoc-plugin-markdown --theme markdown --entryPointStrategy expand - - - name: Make Markdown Files MDX Compatible - run: python3 .github/workflows/md_mdx_format_adjuster.py --directory talawa-api-docs - - - name: Checking doc updated - id: DocUpdated - run: | - if [ -n "$(git status --porcelain)" ]; then - echo "updateDoc=true" >> $GITHUB_OUTPUT - echo -e "Documentation has been updated!!" - else - Green='0;32' - NoColor='\033[0m' - echo -e "${Green}No documentation updated${NoColor}" - fi - - - name: Set env variables - if: steps.DocUpdated.outputs.updateDoc - run: | - echo "commit_id=$(echo $(git rev-parse HEAD))" >> $GITHUB_ENV - echo "email=$(echo $(git log --pretty=format:"%ae" $commit_id))" >> $GITHUB_ENV - - - name: Update Doc - if: steps.DocUpdated.outputs.updateDoc - run: | - Green='0;32' - NoColor='\033[0m' - git config --global user.name "${{github.actor}}" - git config --global user.email "${{env.email}}" - git add . - git commit -m "Update documentation" - git push -f https://$GH_TOKEN@github.com/PalisadoesFoundation/talawa-api.git HEAD:automated-docs - echo -e "🚀${Green} Hurrah! doc updated${NoColor}" - env: - ACCESS_TOKEN: ${{secrets.GH_TOKEN}} - - - name: Create Documentation Artifact - uses: actions/upload-artifact@v2 - with: - name: documentation-api - path: talawa-api-docs - - Empty-Commit: - name: Create Empty Commit - runs-on: ubuntu-latest - needs: Generate-Documentation - if: github.ref == 'refs/heads/develop' - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - persist-credentials: false - token: ${{ secrets.TALAWA_DOCS_SYNC }} - - name: Empty Commit - run: | - git config --global user.name "${{github.actor}}" - git config --global user.email "${{env.email}}" - git config --global url.https://${{ secrets.TALAWA_DOCS_SYNC }}@github.com/.insteadOf https://github.com/ - git commit --allow-empty -m "Trigger Documentation Workflow" - git push origin develop:automated-docs --force - - # Copy-docs-to-talawa-docs: - # runs-on: ubuntu-latest - # if: github.ref == 'refs/heads/automated-docs' - # # needs: Generate-Documentation - # steps: - # - uses: actions/checkout@v3 - # - uses: dmnemec/copy_file_to_another_repo_action@v1.1.1 - # env: - # API_TOKEN_GITHUB: ${{secrets.TALAWA_DOCS_SYNC}} - # with: - # source_file: 'talawa-api-docs/' - # destination_repo: 'PalisadoesFoundation/talawa-docs' - # destination_branch: 'develop' - # destination_folder: 'docs/' - # user_email: '${{env.email}}' - # user_name: '${{github.actor}}' - # commit_message: 'Talawa API docs updated' - # You can find the deployment instructions in the scripts/cloud-api-demo/README.md file Deploy-Workflow: name: Deploying Application to Cloud VPS diff --git a/.gitignore b/.gitignore index e25629d39e..8ce4e0b129 100644 --- a/.gitignore +++ b/.gitignore @@ -36,6 +36,9 @@ pnpm-lock.yaml coverage build +# Ignore the folder for file uploads meta data in minio +data/** + serviceAccountKey.json cert.pem key.pem diff --git a/.node-version b/.node-version index 790e1105f2..751f4c9f38 100644 --- a/.node-version +++ b/.node-version @@ -1 +1 @@ -v20.10.0 +v22.7.0 diff --git a/CODEOWNERS b/CODEOWNERS new file mode 100644 index 0000000000..05126b9455 --- /dev/null +++ b/CODEOWNERS @@ -0,0 +1,3 @@ +/.github/ @palisadoes +CODEOWNERS @palisadoes + diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000000..4482f29964 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,150 @@ +# Contributor Covenant Code of Conduct + +## Table of Contents + + + +- [Our Pledge](#our-pledge) +- [Our Standards](#our-standards) +- [Enforcement Responsibilities](#enforcement-responsibilities) +- [Scope](#scope) +- [Enforcement](#enforcement) +- [Enforcement Guidelines](#enforcement-guidelines) + - [1. Correction](#1-correction) + - [2. Warning](#2-warning) + - [3. Temporary Ban](#3-temporary-ban) + - [4. Permanent Ban](#4-permanent-ban) +- [Attribution](#attribution) + + + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, caste, color, religion, or sexual identity +and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +- Demonstrating empathy and kindness toward other people +- Being respectful of differing opinions, viewpoints, and experiences +- Giving and gracefully accepting constructive feedback +- Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +- Focusing on what is best not just for us as individuals, but for the + overall community + +Examples of unacceptable behavior include: + +- The use of sexualized language or imagery, and sexual attention or + advances of any kind +- Trolling, insulting or derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or email + address, without their explicit permission +- Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at [The Palisadoes Foundation](http://www.palisadoes.org/) + +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series +of actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or +permanent ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within +the community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.0, available at +[https://www.contributor-covenant.org/version/2/0/code_of_conduct.html][v2.0]. + +Community Impact Guidelines were inspired by +[Mozilla's code of conduct enforcement ladder][Mozilla CoC]. + +For answers to common questions about this code of conduct, see the FAQ at +[https://www.contributor-covenant.org/faq][FAQ]. Translations are available +at [https://www.contributor-covenant.org/translations][translations]. + +[homepage]: https://www.contributor-covenant.org +[v2.0]: https://www.contributor-covenant.org/version/2/0/code_of_conduct.html +[Mozilla CoC]: https://github.com/mozilla/diversity +[FAQ]: https://www.contributor-covenant.org/faq +[translations]: https://www.contributor-covenant.org/translations diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000000..6e073e1886 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,327 @@ +# Contributing to Talawa API + +Thank you for your interest in contributing to Talawa API. Regardless of the size of the contribution you make, all contributions are welcome and are appreciated. + +If you are new to contributing to open source, please read the Open Source Guides on [How to Contribute to Open Source](https://opensource.guide/how-to-contribute/). + +## Table of Contents + + + +- [Code of Conduct](#code-of-conduct) +- [Videos](#videos) +- [Ways to Contribute](#ways-to-contribute) + - [Our Development Process](#our-development-process) + - [Issues](#issues) + - [Pull Requests](#pull-requests) + - [Branching Strategy](#branching-strategy) + - [Conflict Resolution](#conflict-resolution) + - [Contributing Code](#contributing-code) +- [Upgrading Code](#upgrading-code) + - [Setting up Upstream and Origin](#setting-up-upstream-and-origin) + - [Creating a Pull Request - Process Overview](#creating-a-pull-request---process-overview) +- [Type checking and code quality](#type-checking-and-code-quality) + - [Type checking code files](#type-checking-code-files) + - [Linting code files](#linting-code-files) + - [Formatting code files](#formatting-code-files) + - [Generating Table of Contents](#generating-table-of-contents) + - [Automation using husky](#automation-using-husky) + - [Pre-Commit hook](#pre-commit-hook) + - [Post-Merge hook](#post-merge-hook) + - [GraphQL Voyager](#graphql-voyager) + - [GraphQL Markdown](#graphql-markdown) + - [Running Queries with talawa-api](#running-queries-with-talawa-api) +- [Internships](#internships) +- [Community](#community) + + + +## Code of Conduct + +A safe environment is required for everyone to contribute. Read our [Code of Conduct Guide](CODE_OF_CONDUCT.md) to understand what this means. Let us know immediately if you have unacceptable experiences in this area. + +No one should fear voicing their opinion. Respones must be respectful. + +## Videos + +1. Visit our [YouTube Channel playlists](https://www.youtube.com/@PalisadoesOrganization/playlists) for more insights + 1. The "[Getting Started - Developers](https://www.youtube.com/watch?v=YpBUoHxEeyg&list=PLv50qHwThlJUIzscg9a80a9-HmAlmUdCF&index=1)" videos are extremely helpful for new open source contributors. + +## Ways to Contribute + +If you are ready to start contributing code right away, get ready! + +1. Join our Slack and introduce yourself. See details on how to join below in the Community section. + 1. This repository has its own dedicated channel. + 1. There are many persons on the various channels who are willing to assist you in getting started. +1. Take a look at our issues (**_after reading our guidelines below_**): + 1. We have a list of [good first issues](https://github.com/PalisadoesFoundation/talawa-api/labels/good%20first%20issue) that contain challenges with a limited scope for beginners. + 1. There are issues for creating tests for our code base. We need to increase reliablility. Try those issues, or create your own for files that don't already have tests. This is another good strategy for beginners. + 1. There are [dormant issues on which nobody has worked for some time](https://github.com/PalisadoesFoundation/talawa-api/issues?q=is%3Aopen+is%3Aissue+label%3Ano-issue-activity). These are another place to start + 1. There may also be [dormant PRs on which nobody has worked for some time](https://github.com/PalisadoesFoundation/talawa-api/issues?q=is%3Aopen+is%3Aissue+label%3Ano-issue-activity+label%3Ano-pr-activity)! +1. Create an issue based on a bug you have found or a feature you would like to add. We value meaningful sugestions and will prioritize them. + +Welcome aboard! + +### Our Development Process + +We utilize GitHub issues and pull requests to keep track of issues and contributions from the community. + +#### Issues + +Make sure you are following [issue report guidelines](issue-guidelines.md) available here before creating any new issues on Talawa API project. + +#### Pull Requests + +[Pull Request guidelines](PR_GUIDELINES.md) is best resource to follow to start working on open issues. + +#### Branching Strategy + +For Talawa API, we had employed the following branching strategy to simplify the development process and to ensure that only stable code is pushed to the `main` branch: + +- `develop`: For unstable code and bug fixing +- `main`: Where the stable production ready code lies. This is our default branch. + +#### Conflict Resolution + +When multiple developers are working on issues there is bound to be a conflict of interest (not to be confused with git conflicts) among issues, PRs or even ideas. Usually these conflicts are resolved in a **First Come First Serve** basis however there are certain exceptions to it. + +- In the cases where you feel your potential issues could be an extension or in conflict with other PRs it is important to ask the author of the PR in the slack channel or in their PRs or issues themselves why he/she did not write code for something that would require minimal effort on their part. +- Based on basic courtesy, it is good practice to let the person who created a function apply and test that function when needed. +- Last but not the least, communication is important make sure to talk to other contributors, in these cases, in slack channel or in a issue/PR thread. +- As a last resort the Admins would be responsible for deciding how to resolve this conflict. + +### Contributing Code + +Code contributions to Talawa come in the form of pull requests. These are done by forking the repo and making changes locally. + +Make sure you have read the [Documentation for Setting up the Project](INSTALLATION.md) + +The process of proposing a change to Talawa API can be summarized as: + +1. Fork the Talawa API repository and branch off `develop`. +1. Your newly forked repository can be cloned locally using `git clone `. +1. Make the Palisadoes Foundation's repo your `git upstream` for your local repo. +1. Make the desired changes to the Talawa API source. +1. Run the app and test your changes. +1. If you've added code, then test suites must be added. + 1. **_General_:** + 1. We need to get to 100% test coverage for the app. We periodically increase the desired test coverage for our pull requests to meet this goal. + 2. Pull requests that don't meet the minimum test coverage levels will not be accepted. This may mean that you will have to create tests for code you did not write. You can decide which part of the code base needs additional tests if this happens to you. + 2. **_Testing_:** + 1. Test using these commands (All tests): + ``` + npm run test + genhtml coverage/lcov.info -o coverage + ``` + 2. Test using these commands (Single test): + ``` + npm run test -- -t + ``` + 3. Here are some useful testing resources: + 1. Documentation: + 1. [Jest testing documentation](https://jestjs.io/docs/expect) + 2. The [organizations.spec.ts](tests/resolvers/Query/organizations.spec.ts) test file is a well documented example of what to do for resolver tests. + 2. Videos: + 1. [Introduction To Testing In JavaScript With Jest](https://www.youtube.com/watch?v=FgnxcUQ5vho) + 2. [Jest Crash Course](https://www.youtube.com/watch?v=7r4xVDI2vho) + 3. [Testing NodeJS applications with JEST](https://www.youtube.com/watch?v=8gHEv5iNRKk) +1. **_Test Code Coverage_:** + 1. _General Information_ + 1. The current code coverage of the repo is: [![codecov](https://codecov.io/gh/PalisadoesFoundation/talawa-api/branch/develop/graph/badge.svg?token=CECBQTAOKM)](https://codecov.io/gh/PalisadoesFoundation/talawa-api) + 2. You can determine the percentage test coverage of your code by running these two commands in sequence: + ``` + npm install + npm run test + genhtml coverage/lcov.info -o coverage + ``` + 3. The coverage rate will be visible on the penultimate line of the `genhtml` command's output. + 4. The `genhtml` command is part of the linux `lcov` package. Similar packages can be found for Windows and MacOS. + 5. The currently acceptable coverage rate can be found in the [GitHub Pull Request file](.github/workflows/pull-request.yml). Search for the value below the line containing `min_coverage`. + 2. _Creating your code coverage account_ + 1. You can also see your code coverage online for your fork of the repo. This is provided by `codecov.io` + 1. Go to this link: `https://app.codecov.io/gh/XXXX/YYYY` where XXXX is your GitHub account username and YYYY is the name of the repository + 2. Login to `codecov.io` using your GitHub account, and add your **repo** and **branches** to the `codecov.io` dashboard. + 3. Remember to add the `Repository Upload Token` for your forked repo. This can be found under `Settings` of your `codecov.io` account. + 4. Use the value of this token to create a secret named CODE_COV for your forked repo. + 5. You will see your code coverage reports with every push to your repo after following these steps +1. After making changes you can add them to git locally using `git add `(to add changes only in a particular file) or `git add .` (to add all changes). +1. After adding the changes you need to commit them using `git commit -m ''`(look at the commit guidelines below for commit messages). +1. Once you have successfully commited your changes, you need to push the changes to the forked repo on github using: `git push origin `.(Here branch name must be name of the branch you want to push the changes to.) +1. Now create a pull request to the Talawa repository from your forked repo. Open an issue regarding the same and link your PR to it. +1. Ensure the test suite passes, either locally or on CI once a PR has been created. +1. Review and address comments on your pull request if requested. + +## Upgrading Code + +Before you start contributing to the repository, you `ALWAYS` need to make sure that your code is up to date with the source repository at `PalisadoesFoundation/talawa-api`. + +To do we will help you setup an upstream and origin for your repository, which will help you contribute code with great ease:- + +#### Setting up Upstream and Origin + +After cloning your forked repository, your origin remote is pointing to your fork (`{{GITHUB USERNAME}}/talawa-api`). To stay up to date with the main `PalisadoesFoundation/talawa-api` repository, add it as a remote called upstream. You'll first need to move into the `talawa-api` directory that was created by the clone operation. + +``` +$ cd talawa-api +$ git remote add upstream https://github.com/PalisadoesFoundation/talawa-api.git +$ git remote -v +origin https://github.com/{{GITHUB USERNAME}}/talawa-api.git (fetch) +origin https://github.com/{{GITHUB USERNAME}}/talawa-api (push) +upstream https://github.com/PalisadoesFoundation/talawa-api.git (fetch) +upstream https://github.com/PalisadoesFoundation/talawa-api.git (push) +``` + +The git remote -v command at the end shows all your current remotes. + +Now you can pull in changes from `PalisadoesFoundation/talawa-api` by running `git pull upstream {{branch}}` and push your changes to your fork by running `git push origin {{branch}}`. + +We have established a clean setup now. We can make any changes we like and push it to this forked repository, and then make a pull request for getting the changes merged into the original repository. Here's a nice picture explaining the process ([image source](https://github.com/Rafase282/My-FreeCodeCamp-Code/wiki/Lesson-Save-your-Code-Revisions-Forever-with-Git)). + +![Diagram of the fork-and-clone workflow](public/markdown/images/install3.png) + +#### Creating a Pull Request - Process Overview + +For making any changes to original repository, we first sync our cloned repository with original repository. We merge `develop` with `upstream/develop` to do this. +This may sometimes require a hard reset, and can be done with the following commands: + +``` +git fetch upstream +git reset upstream/develop --hard +``` + +Now we make a new branch (with `git checkout -b {{ BRANCH_NAME }}` ), do the changes on the branch, add and commit them (with `git add . && git commit -m {{ COMMIT_MESSAGE }}` ), push the branch to forked repository (with `git push origin {{ BRANCH_NAME }} --force` ), and make a PR from Github interface (from our new branch to the `develop` branch of `PalisadoesFoundation/talawa-api` s). + +We use a different branch to make changes so that we can work on multiple issues while still having a clean version in develop branch. + +## Type checking and code quality + +On making a PR, we use GitHub actions to check that your code is properly formatted, doesn't have typescript type errors and is properly linted. Here are the checks:- + +
+ +### Type checking code files + +
+ +We make use of official typescript compiler(tsc) to check the codebase for type errors. + +To check for type errors use this command:- + + npm run typecheck + +
+ +### Linting code files + +
+ +We make use of `eslint` to enforce a strict linting convention in code. + +To check code for linting issues use this command:- + + npm run lint:check + +To check and fix lint errors in code use this command:- + + npm run lint:fix + +Eslint might throw lint errors even after running the `lint:fix` command as those lint errors require manual intervention to be fixed. You have to fix those lint errors manually. + +
+ +### Formatting code files + +
+ +We make use of `prettier` to enforce a strict formatting convention in code. + +To check code for formatting issues use this command:- + + npm run format:check + +To fix formatting issues in code use this command:- + + npm run format:fix + +
+ +### Generating Table of Contents + +To generate table of contents for markdown files use this command:- + +```bash +npm run update:toc +``` + +And if you want to generate table of content for specific file you can use the `markdown-toc` package directly as shown:- + +```bash +npx markdown-toc -i README.md +``` + +Remember to replace `README.md` with the name of the file you want to generate table of contents for. +
+For more information on how to use `markdown-toc` package, visit [this link](https://www.npmjs.com/package/markdown-toc). + +### Automation using husky + +
+ +We are using the package `Husky` to run git hooks that run according to different git workflows. + +
+ +#### Pre-Commit hook + +We run a pre-commit hook which automatically runs code quality checks each time you make a commit and also fixes some of the issues. This way you don't have to run them manually each time. + +If you don't want these pre-commit checks running on each commit, you can manually opt out of it using the `--no-verify` flag with your commit message as shown:- + + git commit -m "commit message" --no-verify + +
+ +#### Post-Merge hook + +We are also running a post-merge(post-pull) hook which will automatically run "npm install" only if there is any change made to pakage.json file so that the developer has all the required dependencies when pulling files from remote. + +If you don't want this hook to run, you can manually opt out of this using the `no verify` flag while using the merge command(git pull): + + git pull --no-verify + +
+ +### GraphQL Voyager + +We use the open source project [GraphQL Voyager](https://github.com/IvanGoncharov/graphql-voyager) to help you interact and explore the complete schema in an interactive manner! + +Go to `http://localhost:4000/voyager` after running the development server to explore the same! + +![Voyager Demo for User Model](public/markdown/images/GraphQL_Voyager.png) + +### GraphQL Markdown + +We use the [GraphQL Markdown](https://github.com/exogen/graphql-markdown) project to generate the documentation to describe the schema. To generate the same manually, you first need to start the development server locally with `npm run dev`, and then run the script `npm run generate:graphql-markdown`. + +You can then view the [generated documentation here](./talawa-api-docs/modules.md). + +While we use a GitHub workflow to update ths schema documentation every time a PR is merged into the repository, it is highly advisable that if you making changes to the schema, then you should also update the schema documentation by the process described above. + +### Running Queries with talawa-api + +- Talawa API currently implement `GraphQL Playground` as mediator interface to run and test queries directly from the api. [Learn more](https://www.apollographql.com/docs/apollo-server/v2/testing/graphql-playground/) +- In development, Apollo Server enables GraphQL Playground on the same URL as the GraphQL server itself (e.g. http://localhost:4000/graphql) and automatically serves the GUI to web browsers. When NODE_ENV is set to production, GraphQL Playground (as well as introspection) is disabled as a production best-practice. + ![image](https://user-images.githubusercontent.com/65951872/221374309-5a6eee74-c0df-4280-a29a-0b8d2c7260b3.png) +- Note: To access the playground in talawa API append the URL with "/graphql" + +## Internships + +If you are participating in any of the various internship programs we ar members of then please read the [introduction guides on our documentation website](https://docs.talawa.io/docs/). + +## Community + +There are many ways to communicate with the community. + +1. The Palisadoes Foundation has a Slack channel where members can assist with support and clarification. Visit the [Talawa GitHub repository home page](https://github.com/PalisadoesFoundation/talawa) for the link to join our slack channel. +1. We also have a technical email list run by [freelists.org](https://www.freelists.org/). Search for "palisadoes" and join. Members on this list are also periodically added to our marketing email list that focuses on less technical aspects of our work. diff --git a/Caddyfile b/Caddyfile new file mode 100644 index 0000000000..d83cfb3acd --- /dev/null +++ b/Caddyfile @@ -0,0 +1,5 @@ +api-demo.talawa.io { + reverse_proxy talawa-api-dev:4000 { + header_down Strict-Transport-Security max-age=31536000; + } +} diff --git a/DOCUMENTATION.md b/DOCUMENTATION.md new file mode 100644 index 0000000000..1ed2dc0391 --- /dev/null +++ b/DOCUMENTATION.md @@ -0,0 +1,36 @@ +# Documentation + +Welcome to our documentation guide. Here are some useful tips you need to know! + +## Table of Contents + + + +- [Where to find our documentation](#where-to-find-our-documentation) +- [How to use Docusaurus](#how-to-use-docusaurus) +- [Other information](#other-information) + + + +## Where to find our documentation + +Our documentation can be found in ONLY TWO PLACES: + +1. **_Inline within the repository's code files_**: We have automated processes to extract this information and place it in our Talawa documentation site [docs.talawa.io](https://docs.talawa.io/). +1. **_In our `talawa-docs` repository_**: Our [Talawa-Docs](https://github.com/PalisadoesFoundation/talawa-docs) repository contains user edited markdown files that are automatically integrated into our Talawa documentation site [docs.talawa.io](https://docs.talawa.io/) using the [Docusaurus](https://docusaurus.io/) package. + +## How to use Docusaurus + +The process in easy: + +1. Install `talawa-docs` on your system +1. Launch docusaurus on your system according to the `talawa-docs`documentation. + - A local version of `docs.talawa.io` should automatically launched in your browser at http://localhost:3000/ +1. Add/modify the markdown documents to the `docs/` directory of the `talawa-docs` repository +1. If adding a file, then you will also need to edit the `sidebars.js` which is used to generate the [docs.talawa.io](https://docs.talawa.io/) menus. +1. Always monitor the local website in your brower to make sure the changes are acceptable. + - You'll be able to see errors that you can use for troubleshooting in the CLI window you used to launch the local website. + +## Other information + +**_PLEASE_** do not add markdown files in this repository. Add them to `talawa-docs`! diff --git a/Dockerfile.dev b/Dockerfile.dev new file mode 100644 index 0000000000..93e0564184 --- /dev/null +++ b/Dockerfile.dev @@ -0,0 +1,14 @@ +# Stage 1: Install Dependencies +FROM node:20.10.0 AS builder + +WORKDIR /usr/src/app + +COPY package.json ./ + +RUN npm install + +COPY . . + +EXPOSE 4000 + +CMD ["npm", "run", "dev"] diff --git a/Dockerfile.prod b/Dockerfile.prod new file mode 100644 index 0000000000..81c57702e3 --- /dev/null +++ b/Dockerfile.prod @@ -0,0 +1,25 @@ +# Stage 1: Install Dependencies and Build +FROM node:lts AS builder + +WORKDIR /usr/src/app + +COPY package*.json ./ + +RUN npm install -g npm@latest && npm install && rm -rf ./package-lock.json + +COPY . . + +RUN npm run build + +# Stage 2: Final image +FROM node:alpine + +WORKDIR /usr/src/app + +COPY --from=builder /usr/src/app/package.json ./ +COPY --from=builder /usr/src/app/node_modules ./node_modules +COPY --from=builder /usr/src/app/build ./build + +EXPOSE 4000 + +CMD ["npm", "start"] diff --git a/INSTALLATION.md b/INSTALLATION.md new file mode 100644 index 0000000000..583dd18ace --- /dev/null +++ b/INSTALLATION.md @@ -0,0 +1,1219 @@ +# Talawa-API Installation + +This document provides instructions on how to set up and start a running instance of talawa-api on your local system. The instructions are written to be followed in sequence so make sure to go through each of them step by step without skipping any sections. + +# Table of Contents + + + +- [Talawa-API Installation](#talawa-api-installation) +- [Table of Contents](#table-of-contents) +- [Installation Steps Summary](#installation-steps-summary) +- [Prerequisites](#prerequisites) + - [Install git](#install-git) + - [Setting up this repository](#setting-up-this-repository) + - [Install node.js](#install-nodejs) + - [Install TypeScript](#install-typescript) + - [Install Required Packages](#install-required-packages) +- [Installation Using Docker](#installation-using-docker) + - [Run the Talawa-API Setup](#run-the-talawa-api-setup) + - [Install the Docker Application](#install-the-docker-application) + - [Docker Compose Setup](#docker-compose-setup) + - [For Development](#for-development) + - [For Production](#for-production) + - [Import The Sample Data](#import-the-sample-data) +- [Installation without Docker](#installation-without-docker) + - [Install the Required Packages](#install-the-required-packages) + - [Install MongoDB](#install-mongodb) + - [Setting up the mongoDB database](#setting-up-the-mongodb-database) + - [Install Redis](#install-redis) + - [Performance Benefits](#performance-benefits) + - [Setting Up Redis](#setting-up-redis) + - [Set Up MinIO](#set-up-minio) + - [Install MinIO](#install-minio) + - [1. Using the Setup Script](#1-using-the-setup-script) + - [2. Manual MinIO Installation](#2-manual-minio-installation) + - [Running MinIO with Talawa-API](#running-minio-with-talawa-api) + - [1. Using Docker](#1-using-docker) + - [2. Running Locally](#2-running-locally) + - [Access MinIO](#access-minio) + - [Create a Bucket](#create-a-bucket) +- [Configuration](#configuration) + - [Automated Configuration of `.env`](#automated-configuration-of-env) + - [Manual Configuration of `.env`](#manual-configuration-of-env) + - [The Environment Variables in `.env`](#the-environment-variables-in-env) + - [Changing the Development Environment in the .env file](#changing-the-development-environment-in-the-env-file) + - [Generating Token Secrets](#generating-token-secrets) + - [Setting up ACCESS_TOKEN_SECRET in the .env file](#setting-up-access_token_secret-in-the-env-file) + - [Linux](#linux) + - [Windows](#windows) + - [Setting up REFRESH_TOKEN_SECRET in the .env file](#setting-up-refresh_token_secret-in-the-env-file) + - [Configuring MongoDB in the .env file](#configuring-mongodb-in-the-env-file) + - [Using the CLI to get the MONGODB_URL Connection String](#using-the-cli-to-get-the-mongodb_url-connection-string) + - [Using Microsoft Windows to get the MONGODB_URL Connection String](#using-microsoft-windows-to-get-the-mongodb_url-connection-string) + - [Configuring Redis in .env file](#configuring-redis-in-env-file) + - [For Local Setup (Linux and WSL)](#for-local-setup-linux-and-wsl) + - [For Remote Setup (Redis Cloud)](#for-remote-setup-redis-cloud) + - [Setting up .env LAST_RESORT_SUPERADMIN_EMAIL parameter in the .env file](#setting-up-env-last_resort_superadmin_email-parameter-in-the-env-file) + - [Configuring Google ReCAPTCHA in the .env file](#configuring-google-recaptcha-in-the-env-file) + - [Setting up the RECAPTCHA_SECRET_KEY](#setting-up-the-recaptcha_secret_key) + - [Setting up .env MAIL_USERNAME and MAIL_PASSWORD ReCAPTCHA Parameters](#setting-up-env-mail_username-and-mail_password-recaptcha-parameters) + - [Setting up SMTP Email Variables in the .env File](#setting-up-smtp-email-variables-in-the-env-file) + - [Setting up MinIO configurations](#setting-up-minio-configurations) + - [Setting up Logger configurations](#setting-up-logger-configurations) + - [Setting up COLORIZE_LOGS in .env file](#setting-up-colorize_logs-in-env-file) + - [Setting up LOG_LEVEL in .env file](#setting-up-log_level-in-env-file) +- [Importing Sample Database](#importing-sample-database) + - [Syntax:](#syntax) + - [Examples:](#examples) + - [Sample Data Overview:](#sample-data-overview) + - [User Accounts and Organizations:](#user-accounts-and-organizations) + - [Posts](#posts) + - [Events](#events) +- [Running Talawa-API](#running-talawa-api) +- [How to Access the Talawa-API URL](#how-to-access-the-talawa-api-url) + - [For Talawa-API Developers](#for-talawa-api-developers) + - [For Mobile App Developers](#for-mobile-app-developers) + - [On Android Virtual Device](#on-android-virtual-device) + - [On a Real Mobile Device](#on-a-real-mobile-device) + - [For Talawa-Admin Developers](#for-talawa-admin-developers) +- [Accessing MongoDB](#accessing-mongodb) + - [Managing MongoDB using the MongoDB Compass GUI](#managing-mongodb-using-the-mongodb-compass-gui) + - [Managing MongoDB using the VSCode extension](#managing-mongodb-using-the-vscode-extension) +- [Manually Adding The First Super Admin User](#manually-adding-the-first-super-admin-user) + - [Using MongoDB Compass](#using-mongodb-compass) + - [Using Mongo Shell](#using-mongo-shell) +- [Other](#other) + - [Changing default talawa-api port](#changing-default-talawa-api-port) +- [Testing](#testing) + + + +- [Installation Steps Summary](#installation-steps-summary) +- [Prerequisites](#prerequisites) + - [Install git](#install-git) + - [Setting up this repository](#setting-up-this-repository) + - [Install node.js](#install-nodejs) + - [Install TypeScript](#install-typescript) + - [Install Required Packages](#install-required-packages) +- [Installation Using Docker](#installation-using-docker) + - [Run the Talawa-API Setup](#run-the-talawa-api-setup) + - [Install the Docker Application](#install-the-docker-application) + - [Docker Compose Setup](#docker-compose-setup) + - [Prerequisites](#prerequisites-1) + - [For Development](#for-development) + - [For Production](#for-production) + - [Congratulations! 🎉 Your Talawa API is now successfully set up and running using Docker!](#congratulations-%F0%9F%8E%89-your-talawa-api-is-now-successfully-set-up-and-running-using-docker) + - [Import The Sample Data](#import-the-sample-data) +- [Installation without Docker](#installation-without-docker) + - [Install the Required Packages](#install-the-required-packages) + - [Install MongoDB](#install-mongodb) + - [Setting up the mongoDB database](#setting-up-the-mongodb-database) + - [Install Redis](#install-redis) + - [Performance Benefits](#performance-benefits) + - [Setting Up Redis](#setting-up-redis) + - [Set Up MinIO](#set-up-minio) + - [Install MinIO](#install-minio) + - [1. Using the Setup Script](#1-using-the-setup-script) + - [2. Manual MinIO Installation](#2-manual-minio-installation) + - [Running MinIO with Talawa-API](#running-minio-with-talawa-api) + - [1. Using Docker](#1-using-docker) + - [2. Running Locally](#2-running-locally) + - [Customize MinIO Data Directory](#customize-minio-data-directory) + - [Access MinIO](#access-minio) + - [Create a Bucket](#create-a-bucket) +- [Configuration](#configuration) + - [Automated Configuration of `.env`](#automated-configuration-of-env) + - [Manual Configuration of `.env`](#manual-configuration-of-env) + - [The Environment Variables in `.env`](#the-environment-variables-in-env) + - [Changing the Development Environment in the .env file](#changing-the-development-environment-in-the-env-file) + - [Generating Token Secrets](#generating-token-secrets) + - [Setting up ACCESS_TOKEN_SECRET in the .env file](#setting-up-access_token_secret-in-the-env-file) + - [Linux](#linux) + - [Windows](#windows) + - [Setting up REFRESH_TOKEN_SECRET in the .env file](#setting-up-refresh_token_secret-in-the-env-file) + - [Configuring MongoDB in the .env file](#configuring-mongodb-in-the-env-file) + - [Using the CLI to get the MONGODB_URL Connection String](#using-the-cli-to-get-the-mongodb_url-connection-string) + - [Using Microsoft Windows to get the MONGODB_URL Connection String](#using-microsoft-windows-to-get-the-mongodb_url-connection-string) + - [Configuring Redis in .env file](#configuring-redis-in-env-file) + - [For Local Setup (Linux and WSL)](#for-local-setup-linux-and-wsl) + - [For Remote Setup (Redis Cloud)](#for-remote-setup-redis-cloud) + - [Setting up .env LAST_RESORT_SUPERADMIN_EMAIL parameter in the .env file](#setting-up-env-last_resort_superadmin_email-parameter-in-the-env-file) + - [Configuring Google ReCAPTCHA in the .env file](#configuring-google-recaptcha-in-the-env-file) + - [Setting up the RECAPTCHA_SECRET_KEY](#setting-up-the-recaptcha_secret_key) + - [Setting up .env MAIL_USERNAME and MAIL_PASSWORD ReCAPTCHA Parameters](#setting-up-env-mail_username-and-mail_password-recaptcha-parameters) + - [Setting up SMTP Email Variables in the .env File](#setting-up-smtp-email-variables-in-the-env-file) + - [Setting up MinIO configurations](#setting-up-minio-configurations) + - [Setting up Logger configurations](#setting-up-logger-configurations) + - [Setting up COLORIZE_LOGS in .env file](#setting-up-colorize_logs-in-env-file) + - [Setting up LOG_LEVEL in .env file](#setting-up-log_level-in-env-file) +- [Importing Sample Database](#importing-sample-database) + - [Syntax:](#syntax) + - [Examples:](#examples) + - [Sample Data Overview:](#sample-data-overview) + - [User Accounts and Organizations:](#user-accounts-and-organizations) + - [Posts](#posts) + - [Events](#events) +- [Running Talawa-API](#running-talawa-api) +- [How to Access the Talawa-API URL](#how-to-access-the-talawa-api-url) + - [For Talawa-API Developers](#for-talawa-api-developers) + - [For Mobile App Developers](#for-mobile-app-developers) + - [On Android Virtual Device](#on-android-virtual-device) + - [On a Real Mobile Device](#on-a-real-mobile-device) + - [For Talawa-Admin Developers](#for-talawa-admin-developers) +- [Accessing MongoDB](#accessing-mongodb) + - [Managing MongoDB using the MongoDB Compass GUI](#managing-mongodb-using-the-mongodb-compass-gui) + - [Managing MongoDB using the VSCode extension](#managing-mongodb-using-the-vscode-extension) +- [Manually Adding The First Super Admin User](#manually-adding-the-first-super-admin-user) + - [Using MongoDB Compass](#using-mongodb-compass) + - [Using Mongo Shell](#using-mongo-shell) +- [Other](#other) + - [Changing default talawa-api port](#changing-default-talawa-api-port) +- [Testing](#testing) + + + +# Installation Steps Summary + +Installation is not difficult, but there are many steps. This is a brief explanation of what needs to be done: + +1. Install `git` +2. Download the code from GitHub using `git` +3. Install `node.js` (Node), the runtime environment the application will need to work. +4. Configure the Node Package Manager (`npm`) to automatically use the correct version of Node for our application. +5. Use `npm` to install TypeScript, the language the application is written in. +6. Install other supporting software such as the database using either: + 1. Docker + 2. A manual setup +7. Configure the application +8. Start the application + +These steps are explained in more detail in the sections that follow. + +# Prerequisites + +In this section we'll explain how to set up all the prerequisite software packages to get you up and running. + +## Install git + +The easiest way to get the latest copies of our code is to install the `git` package on your computer. + +Follow the setup guide for `git` on official [git docs](https://git-scm.com/downloads). Basic `git` knowledge is required for open source contribution so make sure you're comfortable with it. [Here's](https://youtu.be/apGV9Kg7ics) a good tutorial to get started with `git` and `github`. + +## Setting up this repository + +First you need a local copy of `talawa-api`. Run the following command in the directory of choice on your local system. + +1. On your computer, navigate to the folder where you want to setup the repository. +2. Open a `cmd` (Windows) or `terminal` (Linux or MacOS) session in this folder. + 1. An easy way to do this is to right-click and choose appropriate option based on your OS. +3. **For Our Open Source Contributor Software Developers:** + + 1. Next, we'll fork and clone the `talawa-api` repository. + 1. In your web browser, navigate to [https://github.com/PalisadoesFoundation/talawa-api/](https://github.com/PalisadoesFoundation/talawa-api/) and click on the `fork` button. It is placed on the right corner opposite the repository name `PalisadoesFoundation/talawa-api`. + + ![Image with fork](public/markdown/images/install1.png) + + 1. You should now see `talawa-api` under your repositories. It will be marked as forked from `PalisadoesFoundation/talawa-api` + + ![Image of user's clone](public/markdown/images/install2.png) + + 1. Clone the repository to your local computer (replacing the values in `{{}}`): + ```bash + $ git clone https://github.com/{{YOUR GITHUB USERNAME}}/talawa-api.git + cd talawa-api + git checkout develop + ``` + - **Note:** Make sure to check out the `develop` branch + 1. You now have a local copy of the code files. For more detailed instructions on contributing code, and managing the versions of this repository with `git`, checkout our [CONTRIBUTING.md](./CONTRIBUTING.md) file. + +4. **Talawa Administrators:** + + 1. Clone the repository to your local computer using this command: + + ```bash + $ git clone https://github.com/PalisadoesFoundation/talawa-api.git + ``` + +## Install node.js + +Best way to install and manage `node.js` is making use of node version managers. We recommend using `fnm`, which will be described in more detail later. + +Follow these steps to install the `node.js` packages in Windows, Linux and MacOS. + +1. For Windows: + 1. first install `node.js` from their website at https://nodejs.org + 1. When installing, don't click the option to install the `necessary tools`. These are not needed in our case. + 2. then install [fnm](https://github.com/Schniz/fnm). Please read all the steps in this section first. + 1. All the commands listed on this page will need to be run in a Windows terminal session in the `talawa-api` directory. + 2. Install `fnm` using the `winget` option listed on the page. + 3. Setup `fnm` to automatically set the version of `node.js` to the version required for the repository using these steps: + 1. First, refer to the `fnm` web page's section on `Shell Setup` recommendations. + 2. Open a `Windows PowerShell` terminal window + 3. Run the recommended `Windows PowerShell` command to open `notepad`. + 4. Paste the recommended string into `notepad` + 5. Save the document. + 6. Exit `notepad` + 7. Exit PowerShell + 8. This will ensure that you are always using the correct version of `node.js` +2. For Linux and MacOS, use the terminal window. + 1. install `node.js` + 2. then install `fnm` + 1. Refer to the installation page's section on the `Shell Setup` recommendations. + 2. Run the respective recommended commands to setup your node environment + 3. This will ensure that you are always using the correct version of `node.js` + +## Install TypeScript + +TypeScript is a typed superset of JavaScript that compiles to plain JavaScript. It adds optional types, classes, and modules to JavaScript, and supports tools for large-scale JavaScript applications. + +To install TypeScript, you can use the `npm` command which comes with `node.js`: + +```bash +npm install -g typescript +``` + +This command installs TypeScript globally on your system so that it can be accessed from any project. + +## Install Required Packages + +Run the following command to install the packages and dependencies required by the app: + +``` +npm install +``` + +The prerequisites are now installed. The next step will be to get the app up and running. + +# Installation Using Docker + +This guide provides step-by-step instructions on deploying a talawa-api using Docker. Docker allows you to package your application and its dependencies into a container, providing a consistent environment across different systems. + +Here is a list of steps to follow: + +1. Run the application setup procedure +2. Install the Docker application +3. Install the Docker helper +4. Install other supporting software such as the database using the `docker-compose` command. +5. Start Docker using the `docker-compose` command +6. Import the sample data into the database + +## Run the Talawa-API Setup + +We have created a setup script to make configuring Talawa-API easier. + +1. You can do this by running the command below. +2. Default answers will be given with capital letters +3. Details of what each prompt means can be found in the [Configuration](#configuration) section of this document. + +``` +npm run setup +``` + +## Install the Docker Application + +There are many ways to install Docker. We reccommend using Docker Desktop. It can be downloaded here: + +- Download [Docker Desktop](https://www.docker.com/products/docker-desktop) using this link. + +## Docker Compose Setup + +## Prerequisites + +- [Docker Desktop](https://www.docker.com/products/docker-desktop) installed on your machine. + +After installing Docker, you'll need to tell Docker to install the additional software it will need to run the application. + +The setup steps differ depending on whether you are working in a development or production environment. + +### For Development + +Follow these steps for setting up a software development environment. + +1. Building and Starting Development Containers: + + 1. Using Windows: + + ```bash + docker-compose -f docker-compose.dev.yaml up --build + ``` + + 2. Using Ubuntu: 1. Running synchronously. Using CTRL-C will stop it. + `bash + sudo /usr/libexec/docker/cli-plugins/docker-compose -f docker-compose.dev.yaml up --build + ` 2. Running asynchronously in a subshell. You will have to use the `docker-compose down` command below to stop it. + `bash +sudo /usr/libexec/docker/cli-plugins/docker-compose -f docker-compose.dev.yaml up --build & +` + This command starts the development environment, where you can make changes to the code, and the server will automatically restart. + +2. Accessing the Development Application: Open your web browser and navigate to: + + ``` + http://localhost:4000 + ``` + +3. Stopping Development Containers: + + 1. Using Windows: + + ``` + docker-compose -f docker-compose.dev.yaml down + ``` + + 2. Using Ubuntu: + + ``` + sudo /usr/libexec/docker/cli-plugins/docker-compose -f docker-compose.dev.yaml down + ``` + +### For Production + +Follow these steps for setting up a production environment. + +1. Building and Starting Production Containers: + + ``` + docker-compose -f docker-compose.prod.yaml up --build -d + ``` + + This command starts the production environment in detached mode, suitable for production deployment. + +2. Accessing the Production Application:Open your web browser and navigate to: + + ``` + http://localhost:4001 + ``` + +3. Stopping Production Containers: + ``` + docker-compose -f docker-compose.prod.yaml down + ``` + +### Congratulations! 🎉 Your Talawa API is now successfully set up and running using Docker! + +**Note: If you're using Docker, you'll need to manually import the sample data after the Docker Compose has started the MongoDB container. For instructions on how to do this, refer to [Importing Sample Database](#importing-sample-database)** + +## Import The Sample Data + +You'll need to manually import the sample data after the Docker Compose has started the MongoDB container. For instructions on how to do this, refer to the [Importing Sample Database](#importing-sample-database) section of this document. + +# Installation without Docker + +There are more steps, but the outcome is the same. A working Talawa-API instance. + +## Install the Required Packages + +Install the packages required by `talawa-api` using this command: + +``` +npm install +``` + +## Install MongoDB + +Talawa-api makes use of `MongoDB` for its database needs. We make use of `mongoose ODM` to interact with the MongoDB database from within the code. + +### Setting up the mongoDB database + +We're listing some common approaches to set up a running instance of MongoDB database: + +1. `System native database approach:` (Highly Recommended) You can install MongoDB natively on your system and create/connect to the database. Follow the setup guide on official [MongoDB Docs](https://www.mongodb.com/docs/manual/administration/install-community/) for your respective operating system. +2. `Hosted database approach:` MongoDB Atlas is the easiest way to get a running instance of mongodb database. It is a hosted(remote) mongodb database provided by mongodb itself. If you're a beginner and don't want too much of a hassle setting up the database you should use this approach but you should eventually switch to local instance. Follow the setup guide on official [MongoDB Atlas Docs](https://www.mongodb.com/docs/atlas/getting-started/). Mongodb Atlas is just one of the many hosted database solutions. Some issues that you might face while using this are slower tests, slower API requests, dependence on Internet connection etc. +3. `Docker container approach:` If you are fluent in working with docker you should use this approach. Docker is a great way to manage and run applications without natively installing anything on your system. With this you can set up the mongodb database inside a docker container and manage it as per your will. Follow this [video tutorial](https://www.youtube.com/watch?v=uklyCSKQ1Po) to set up a mongodb docker container. You can learn about docker from [Docker docs](https://docs.docker.com/). + +## Install Redis + +Talawa-api makes use of `Redis` for caching frequently accessed data items in the primary database. We make use of `ioredis` to interact with the `redis-server` from within the code. The main Idea is the in production this will act as an in-memory cache. So it is recommended that you set it up locally. However for simplicity purposes, a section to accommodate for setting Redis up using a remote instance like Redis Cloud has been added. Please note that this is not recommended since the remote connection takes a considerable amount of time to be considered as a cache to improve application performance. + +### Performance Benefits + +![Screenshot from 2023-08-26 18-37-34](https://github.com/kb-0311/talawa-api/assets/96020697/e8b99d5c-6abf-4e71-999c-f8ae1e84de45) +![Screenshot from 2023-08-26 18-37-48](https://github.com/kb-0311/talawa-api/assets/96020697/55d1388d-cc15-4d5e-931d-6befa0fa7a10) + +### Setting Up Redis + +1. `For Linux Users`: If you are using a Linux distribution, follow these steps to set up Redis: + + 1. Open a terminal. + + 2. Update the package list: + + ```bash + sudo apt update + ``` + + 3. Install Redis Server: + + ```bash + sudo apt install redis-server + ``` + + 4. Start the Redis service: + + ```bash + sudo service redis-server start + ``` + + 5. Test if Redis is running by running the Redis CLI: + ```bash + redis-cli + ``` + 6. Use these parameters when running the setup script if you have configured the server on your local machine: + 1. Redis Host: `localhost` + 1. Redis Port: `6379` (default Redis port) + +2. `For Windows Users using WSL`: If you'd rather not deal with the hassle of setting up WSL on your computer, there's another option: you can use a hosted database like Redis Cloud. More details about this are provided below, mainly for when you're working on development tasks. But it's a good idea to set up Redis on your own computer if you can. Right now, Redis isn't supported directly on Windows – you can only install and use it through WSL. If you're a Windows user and want to get Redis working using the Windows Subsystem for Linux (WSL), just follow these steps: + + 1. Install WSL (Windows Subsystem for Linux) following the official [WSL Installation Guide](https://docs.microsoft.com/en-us/windows/wsl/install). + + 2. Open a WSL terminal. + + 3. Update the package list: + + ```bash + sudo apt update + ``` + + 4. Install Redis Server: + + ```bash + sudo apt install redis-server + ``` + + 5. Start the Redis service: + + ```bash + sudo service redis-server start + ``` + + 6. Test if Redis is running by running the Redis CLI: + + ```bash + redis-cli + ``` + + 7. Use these parameters when running the setup script if you have configured the server on your local machine: + 1. Redis Host: `localhost` + 2. Redis Port: `6379` (default Redis port) + +3. **Connecting to Redis Cloud**: + + To connect to a Redis cloud service, you will need the host and port information provided by your cloud service provider. Use these values in your application to establish a connection. Typically, the host and port strings are provided in the following format: + + 1. Host: `your-redis-host.redisprovider.com` + 1. Port: `6379` (default Redis port) + + Replace `your-redis-host.redisprovider.com` with the actual host provided by your Redis cloud service. You can then use these values in your application's configuration to connect to your Redis cloud instance. You may also have to enter Redis Password and Username for using cloud instance. + +Remember to adjust any paths or details as needed for your specific environment. After following these steps, you will have successfully set up Redis. + +## Set Up MinIO + +Talawa-API uses MinIO, an open-source object storage system, for storing uploaded files. MinIO will be hosted alongside Talawa-API itself, providing a self-contained solution for file storage. + +### Install MinIO + +You can either use the setup script for automatic configuration or install MinIO manually. + +#### 1. Using the Setup Script + +1. Run the setup script. +2. The script will automatically set up environment variables, including MinIO credentials. + + Details of what each prompt means can be found in the [Configuration](#configuration) section of this document. + + ```bash + npm run setup + ``` + +#### 2. Manual MinIO Installation + +If you choose to set up MinIO manually, follow the instructions for your operating system below. Note that the MinIO server should not be started manually as it will be handled by the Talawa-API. + +1. For Linux Users + + - Download and Install MinIO + ```bash + wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio_20240817012454.0.0_amd64.deb -O minio.deb + sudo dpkg -i minio.deb + ``` + - Follow the official installation guide: [MinIO Installation Guide for Linux](https://min.io/docs/minio/linux/index.html) + +2. For Windows Users + + - Download and Install MinIO + ``` + https://dl.min.io/server/minio/release/windows-amd64/minio.exe + ``` + - Follow the official installation guide: [MinIO Installation Guide for Windows](https://min.io/docs/minio/windows/index.html) + +3. For macOS Users + - Download and Install MinIO + ```bash + brew install minio/stable/minio + ``` + - Follow the official installation guide: [MinIO Installation Guide for macOS](https://min.io/docs/minio/macos/index.html) + +### Running MinIO with Talawa-API + +You can run MinIO alongside Talawa-API using Docker or locally. Both methods ensure that MinIO is set up and running with Talawa-API. + +#### 1. Using Docker + +To run MinIO along with Talawa-API using Docker, use the following command: + +```bash +docker compose -f up +``` + +Replace `` with the name of the Docker Compose file. This command will start both the Talawa-API and MinIO services as defined in the Docker Compose file. + +#### 2. Running Locally + +If you prefer to run MinIO and Talawa-API locally, use the provided npm scripts. These scripts will ensure that MinIO is installed (if not already) and start the Talawa-API server along with MinIO. + +- To run the development server with MinIO: + + ```bash + npm run dev:with-minio + ``` + +- To start the production server with MinIO: + + ```bash + npm run start:with-minio + ``` + +These npm scripts will check if MinIO is installed on your system. If MinIO is not installed, the scripts will install it automatically before starting the Talawa-API server. + +### Customize MinIO Data Directory + +You can customize the local storage path for MinIO in one of the following ways: + +1. **Using the Setup Script**: During the configuration process, the setup script allows you to specify a custom path for MinIO's local data directory. Follow the prompts to set `MINIO_DATA_DIR` to your desired path. + +2. **Manually Editing the .env File**: Directly modify the `MINIO_DATA_DIR` environment variable in the `.env` file to point to a different directory for storing MinIO's data. + +### Access MinIO + +- **MinIO Server:** + + - If using Docker, the server will be accessible at `http://minio:9000`. + - If not using Docker, the server will be accessible at `http://localhost:9000`. + +- **MinIO Console (Web UI):** Access the console at `http://localhost:9001`. + + ![MinIO webUI login](public/markdown/images/mino-webui-login.png) + +### Create a Bucket + +After logging into the MinIO web UI, create a bucket with the name specified in your `.env` file under the `MINIO_BUCKET` variable. + +![MinIO create bucket](public/markdown/images/minio-create-bucket.png) + +# Configuration + +It's important to configure Talawa-API to complete it's setup. + +A configuration file named `.env` is required in the root directory of `Talawa-API` for storing environment variables used at runtime. It is not a part of the repo and you will have to create it. + +## Automated Configuration of `.env` + +You can use our interactive setup script to populate the `.env` file using the command below. + +This will create a new `.env` file for you, and if one already exists, it will make the updates you require. + +``` +npm run setup +``` + +It can be done manually as well and here's how to do it. + +## Manual Configuration of `.env` + +**NOTE:** Use the steps below if you decided not to use the automated configuration approach. + +With a fresh installation, you will not see a `.env` file present. To manually create one, you will need to copy the contents of the `.env.sample` file provided to `.env`. + +Use this command to do this + +``` +cp .env.sample .env +``` + +### The Environment Variables in `.env` + +This `.env` file must be populated with the following environment variables for talawa-api to work: + +| Variable | Description | +| ---------------------------- | ------------------------------------------------------------------------- | +| NODE_ENV | Used for providing the environment in which the the talawa-api is running | +| SERVER_PORT | Used for specifying the port on which the talawa-api is running | +| ACCESS_TOKEN_SECRET | Used for signing/verifying JWT tokens | +| REFRESH_TOKEN_SECRET | Used for signing/verifying JWT tokens | +| MONGO_DB_URL | Used for connecting talawa-api to the mongoDB database | +| RECAPTCHA_SECRET_KEY | Used for authentication using reCAPTCHA | +| RECAPTCHA_SITE_KEY | Used for authentication using reCAPTCHA | +| MAIL_USERNAME | Used for mailing service | +| MAIL_PASSWORD | Used for mailing service | +| LAST_RESORT_SUPERADMIN_EMAIL | Used for promoting the default super admin | +| COLORIZE_LOGS | Used for colorized log formats in console | +| LOG_LEVEL | Used for setting the logging level | +| REDIS HOST | Used for connecting talawa-api to the redis instance | +| REDIS_PORT | Specifies the port of the active redis-server | +| REDIS_PASSWORD(optional) | Used for authenticating the connection request to | +| | a hosted redis-server | +| MINIO_ENDPOINT | Used for connecting talawa-api to the MinIO storage. | +| MINIO_ROOT_USER | Used to authenticate with the MinIO server. | +| MINIO_ROOT_PASSWORD | Used to authenticate with the MinIO server. | +| MINIO_BUCKET | Used for the bucket name in the MinIO storage. | +| MINIO_DATA_DIR | Defines the local directory path for MinIO storage. | + +The following sections will show you how to configure each of these parameters. + +### Changing the Development Environment in the .env file + +Change the `NODE_ENV` environment variable in the `.env` file from `production` to `development`: + +``` +NODE_ENV=development +``` + +### Generating Token Secrets + +Access and refresh token secrets are used for authentication purposes. + +#### Setting up ACCESS_TOKEN_SECRET in the .env file + +Run the following command and copy/paste the result to the variable named `ACCESS_TOKEN_SECRET` in `.env` file. + +##### Linux + +The command to use is: + +``` +openssl rand -hex 32 +``` + +##### Windows + +This command is available if you have [Git for Windows](https://gitforwindows.org/) installed. Follow these steps: + +1. Install `Git for Windows` +1. Run the Git Bash app +1. Issue the this command: + + ``` + openssl rand -hex 32 + ``` + +### Setting up REFRESH_TOKEN_SECRET in the .env file + +Run the following command and copy/paste the result to the variable named `REFRESH_TOKEN_SECRET` in `.env` file. + +``` +openssl rand -hex 32 +``` + +### Configuring MongoDB in the .env file + +Here's how you will configure MongoDB. + +**NOTE**: Talawa-API uses **2** databases, a primary and test version. + +1. You only have to setup one database and provide it's URL in the `.env` file. This is the`primary database` and is used to store all your data. +1. We automatically create a new database with the name `TALAWA_API_TEST_DATABASE`. This is exclusively used for storing all the test data generated during the testing process so that it does not bloat the main database with unnecessary data. + +A `Connection String` is the URL that applications use to access a MongoDB database. Talawa-API will need to know the correct connection string to use to perform correctly. + +1. The `Connection String` is the `.env` variable named `MONGO_DB_URL` in the `.env` file. +2. The `Connection String` can differ depending on the approach you used to set up your database instance. Please read the official [mongodb docs](https://www.mongodb.com/docs/manual/reference/connection-string/) on `connection string`. + +#### Using the CLI to get the MONGODB_URL Connection String + +Your MongoDB installation may include either the `mongo` or `mongosh` command line utility. An easy way of determining the `connection string` is to: + +1. Run the command line utility +1. Note the `connection string` in the first lines of the output. +1. Add the first section of the `connection string` to the `MONGO_DB_URL` section of the `.env` file. In this case it is `mongodb://127.0.0.1:27017/` + + ``` + $ mongosh + + Current Mongosh Log ID: e6ab4232a963d456920b3736 + Connecting to: mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+1.6.2 + Using MongoDB: 6.0.4 + Using Mongosh: 1.6.2 + + For mongosh info see: https://docs.mongodb.com/mongodb-shell/ + + ... + ... + ... + ... + + ``` + +#### Using Microsoft Windows to get the MONGODB_URL Connection String + +There are a few more steps that need to be done in a Windows environment. + +1. Download the MongoDB Shell from the tools section at the following link:[Mongo Shell](https://www.mongodb.com/try/download/shell) +1. Extract the downloaded shell folder, locate the `mongosh` application, and paste it to the following location: `Program Files` -> `MongoDB` -> `bin`. + 1. You will find the mongosh application inside the `bin` folder] +1. Add the path of the location where you pasted the `mongosh` application to your system's environment variables. +1. In a separate terminal, run the `mongod` command to start the local instance of the database. +1. Create a folder named "data" in the C drive and within it create a new folder named "db". +1. Open a terminal and run the `mongosh` command in the terminal you will get the connection string. In this case the Connection String is: `mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+1.6.2` + + 1. In the `.env` file of Talawa-API, add the connection string to the `MONGO_DB_URL` section. + + ``` + $ mongosh + + Current Mongosh Log ID: e6ab4232a963d456920b3736 + Connecting to: mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+1.6.2 + Using MongoDB: 6.0.4 + Using Mongosh: 1.6.2 + + For mongosh info see: https://docs.mongodb.com/mongodb-shell/ + + ... + ... + ... + ... + + ``` + +### Configuring Redis in .env file + +Here's the procedure to set up Redis. + +In the `.env` file, you should find three variables: `REDIS_HOST`, `REDIS_PORT`, and `REDIS_PASSWORD`. These environment variables will contain the necessary information for your codebase to connect to a running `redis-server`. + +#### For Local Setup (Linux and WSL) + +In both scenarios (Linux or WSL post-installation), the variable values should be configured as follows: + +1. `REDIS_HOST` = localhost +2. `REDIS_PORT` = 6379 **Note**: This default port is used by the `redis-server`. However, if your `redis-server` operates on a different port, you must provide that port number. +3. `REDIS_PASSWORD` should be left empty, as passwords are unnecessary for local connections. + +#### For Remote Setup (Redis Cloud) + +To begin, you must register for a free account on Redis Cloud. Following this step, you can proceed by selecting a database from the free tier, which comes with a 30MB data storage limit. Once completed, you can then access your Database by navigating to the `Databases` section. Here, you will find the option to view the overall settings of your free instance. + +![Screenshot from 2023-08-18 12-08-35](https://github.com/kb-0311/talawa-api/assets/96020697/86ef137d-5a52-47fc-9075-3ded42b16aaf) + +Here are the configuration details: + +1. `REDIS_HOST` = The `Public endpoint` assigned to your Database, excluding the `.com`. It will resemble something like `redis-13354.c169.us-east-1-1.ec2.cloud.redislabs.com`. The numerical value following this address is the port number. +2. `REDIS_PORT` = The number provided in the `Public Endpoint` after the colon (`:`), for instance: `13354`. +3. `REDIS_PASSWORD` = The `Default user password` located in the Security Section. + +### Setting up .env LAST_RESORT_SUPERADMIN_EMAIL parameter in the .env file + +The user with the email address set with this parameter will automatically be elevated to Super Admin status on registration. + +1. When installing, set this to the email address of the person you want to be the very first Super Admin. + - This will usually be the email address of the person installing the software. +1. If this is not set you will not be able to administer the application. + +If you don't set this parameter, then you'll need to follow the `Manually Adding The First Super Admin User` process discussed later in this document. + +Set this value in the event that you need to elevate any of your users to be a Super Admin. + +**NOTE** It is STRONGLY advised that you remove the email address once the initial installation and setup has been done. + +### Configuring Google ReCAPTCHA in the .env file + +You need to have a `google` account to follow the following steps. + +#### Setting up the RECAPTCHA_SECRET_KEY + +We use `reCAPTCHA` for two factor authentication (2FA). Follow these steps: + +1. Visit the [reCAPTCHA Key Generation](https://www.google.com/recaptcha/admin/create) URL. +1. Fill in the input blocks as shown in the screenshot: + ![Set up recaptcha page](public/markdown/images/recaptcha_set_up.webp) +1. Click on `Submit` button. +1. Copy the generated `Secret Key` to variable named `RECAPTCHA_SECRET_KEY` in `.env` file. + + ![Set up recaptcha page](public/markdown/images/recaptcha_site_and_secret_key.webp) + +1. **NOTE**: Save the generated `Site key` as it will be used in `talawa-admin`. + +#### Setting up .env MAIL_USERNAME and MAIL_PASSWORD ReCAPTCHA Parameters + +**NOTE:** ReCAPTCHA is a type of 2FA, so your Google account needs to have two factor authentication set up for the following steps to work. Make sure this is done before proceeding + +The MAIL_USERNAME and MAIL_PASSWORD parameters are required to enable an app to access 2FA features. This is how to know what they should be. + +1. Go to your [google account page](https://myaccount.google.com/). +1. Search for `App Passwords` in the `Search Google Account` search bar and select it. +1. Click on `create a new app-specific password` and enter `talawa` as the custom name and press the `Create` button. +1. Copy the 16 character generated app password to the variable named `MAIL_PASSWORD` in `.env` file. +1. Copy your usual gmail address to the variable named `MAIL_USERNAME` in `.env` file. + +For more info refer to this [Google Answer](https://support.google.com/accounts/answer/185833). + +### Setting up SMTP Email Variables in the .env File + +For using SMTP server instead of Gmail, following steps need to be followed: + +1. Set the `IS_SMTP` variable to `true` for example `IS_SMTP=true` +1. Go to your your SMTP server, and note the following variables: + +``` +SMTP_HOST=your-smtp-server-hostname +SMTP_PORT=your-smtp-server-port +SMTP_USERNAME=your-smtp-username +SMTP_PASSWORD=your-smtp-password +SMTP_SSL_TLS=true-or-false +``` + +For example: + +``` +SMTP_HOST=smtp.hostgator.com +SMTP_PORT=465 +SMTP_USERNAME=example@website.com +SMTP_PASSWORD= +SMTP_SSL_TLS=true +``` + +For more information on setting up a smtp server, here's a [useful article](https://sendgrid.com/blog/what-is-an-smtp-server/) + +### Setting up MinIO configurations + +To use MinIO with Talawa-API, you need to set up the following environment variables in your .env file: + +``` +MINIO_ENDPOINT= +MINIO_ROOT_USER= +MINIO_ROOT_PASSWORD= +MINIO_BUCKET= +MINIO_DATA_DIR= +``` + +For example: + +``` +MINIO_ENDPOINT=http://localhost:9000 +MINIO_ROOT_USER=minioadmin +MINIO_ROOT_PASSWORD=minioadminpassword +MINIO_BUCKET=talawa-bucket +MINIO_DATA_DIR=./data +``` + +Here are the configuration details: + +`MINIO_ENDPOINT`: URL where MinIO is hosted. Use http://minio:9000 for Docker setups, or http://localhost:9000 otherwise. + +`MINIO_ROOT_USER`: Root username for authenticating and managing MinIO resources. + +`MINIO_ROOT_PASSWORD`: Root password for authenticating with MinIO. Must be kept secure. + +`MINIO_BUCKET`: Name of the default bucket for storing files in MinIO. + +`MINIO_DATA_DIR`: Specifies the directory path where MinIO stores data locally. It is used to define the storage location for the MinIO server on the host machine. + +### Setting up Logger configurations + +1. This is an optional setting +1. You can set up and customize logs by configuring the following parameters + +#### Setting up COLORIZE_LOGS in .env file + +The parameter `COLORIZE_LOGS` is a boolean field and can be set to true or false. It customizes the log colorization formats displayed in console. You can set the value in `.env` file as + +``` +COLORIZE_LOGS = false +``` + +If the parameter value is set to `true`, you should be able to see colorized logs in console, or else logs will display in the console's default simple format. + +![Colorized logs in console](public/markdown/images/colorize-logs.jpg) + +#### Setting up LOG_LEVEL in .env file + +There are different logging levels that can be configured by setting this parameter. The severity order of levels are displayed numerically ascending from most important to least important. + +``` + levels = { + error: 0, + warn: 1, + info: 2, + http: 3, + verbose: 4, + debug: 5, + silly: 6 + } +``` + +On setting this parameter value, log messages are displayed in the console only if the `message.level` is less than or equal to the `LOG_LEVEL` set. + +For our application, the most appropriate setting is `LOG_LEVEL = info` since most of information logged on the console are error messages, warnings or info texts. + +# Importing Sample Database + +Talawa API contains a sample database importing function which can be used to import sample database. + +## Syntax: + +``` +npm run import:sample-data -- [args] +``` + +You can pass the following arguments while running this script. + +1. `--format`: Cleans the database before import. + 1. **NOTE!** Add this flag with caution. It will delete all of the existing data inside the talawa database. +2. `--items=`: Specifies the items to add. The following `items` can be specified, separated with a comma `,` + 1. `users`: For users collection + 2. `organizations`: For organizations collection + 3. `events`: For events collection + 4. `posts`: For posts collection + +## Examples: + +1. `npm run import:sample-data`: This command will import the complete sample database without removing the existing data. +1. `npm run import:sample-data -- --format`: This command will import the complete sample database after removing the existing data. +1. `npm run import:sample-data -- --format --items=users,organizations,appUserProfiles`: This command will import the sample `users` , `organizations` and `appUserProfiles` collections after cleaning the existing data. +1. `npm run import:sample-data -- --items=users,organizations,appUserProfiles`: This command will import the sample `users` , `organizations` + ans `appUserProfiles` collections without cleaning the existing data. + +## Sample Data Overview: + +The sample data contains organizations, users, events and posts. Here are the details for each of organizations and user account. + +### User Accounts and Organizations: + +| Email | Password | User Type | Joined Organization | Admin For | +| -------------------------- | -------- | ---------- | -------------------- | ------------------ | +| testuser1@example.com | Pass@123 | USER | Angel Foundation | None | +| testuser2@example.com | Pass@123 | USER | Angel Foundation | None | +| testuser3@example.com | Pass@123 | USER | Angel Foundation | None | +| testadmin1@example.com | Pass@123 | ADMIN | Angel Foundation | Angel Foundation | +| testadmin2@example.com | Pass@123 | ADMIN | Hope Foundation | Hope Foundation | +| testadmin3@example.com | Pass@123 | ADMIN | Dignity Foundation | Dignity Foundation | +| testsuperadmin@example.com | Pass@123 | SUPERADMIN | The Unity Foundation | ALL | + +### Posts + +There is one post inside the `The Unity Foundation` + +### Events + +There is one event inside the `The Unity Foundation` + +# Running Talawa-API + +Talawa-api development server runs two processes simultaneously in the background. They are: + +1. `GraphQL code generator:` This watches for changes in the graphQL type definition files and generates corresponding typescript types in the background. This results in good code editor experience with typescript. + +2. `Talawa-api server:` This runs talawa-api directly transpiling the typescript files and running them without emitting as javascript files. It also watches for changes in the code files and restarts the server if it detects any changes. + +Run the following command to start talawa-api development server: + +``` +npm run dev +``` + +# How to Access the Talawa-API URL + +There are many important URLs for accessing the API + +## For Talawa-API Developers + +These are some important URLs for coding and troubleshooting : + +1. By default talawa-api runs on `port 4000` on your system's localhost. It is available on the following endpoint: + + ``` + http://localhost:4000/ + ``` + + - If you navigate to the endpoint you and see a `JSON` response like this it means talawa-api is running successfully: + + ``` + {"talawa-version":"v1","status":"healthy"} + ``` + +2. The graphQL endpoint for handling `queries` and `mutations` is this: + + ``` + http://localhost:4000/graphql/ + ``` + +3. GraphQL endpoint for handling `subscriptions` is this: + + ``` + ws://localhost:4000/graphql/ + ``` + +## For Mobile App Developers + +The Organization URL for Talawa mobile app developers will depend upon the device on which Mobile app is installed. + +### On Android Virtual Device + +If the Talawa Mobile App is installed on Android Virtual Device (AVD), use the following URL: + +``` +http://10.0.2.2:4000/graphql +``` + +### On a Real Mobile Device + +If Talawa Mobile App is installed on a Real Mobile Device, follow the below steps to get URL: + +1. Open Command Prompt in Windows, or Terminal in Linux/OSX +1. Enter `ipconfig` (For Windows Users) or `ifconfig` (For Linux/OSX Users) +1. Your Mobile and Computer (On which API server is running) must be on same Wifi Network. Use Mobile Hotspot to connect your computer to internet in case you don't have access to a Wifi Router. +1. Search for the `Wireless LAN adapter Wi-Fi:` and then copy the `IPv4 Address` +1. Now, use this IP address (`192.168.0.105` in our case) to access the API instance using the following URL pattern: + + ``` + http://{IP_Address}:4000/graphql + ``` + + For example: + + ``` + http://192.168.0.105:4000/graphql + ``` + +## For Talawa-Admin Developers + +The Organization URL for Talawa mobile app developers to use is: + +``` +http://localhost:4000/graphql/ +``` + +# Accessing MongoDB + +There are many ways to access MongoDB. + +## Managing MongoDB using the MongoDB Compass GUI + +Open MongoDB Compass and click on "Connect." You will now be able to access the graphical user interface of the local database. + +**NOTE**: You can do the same in macOS and linux with minor tweaks. This has been provided to give a brief overview for beginners to setup their own local instance. + +## Managing MongoDB using the VSCode extension + +This guide is for `VSCode` users to easily manage their `MongoDB` databases: + +1. Install the offical `MongoDB` extension for `VSCode` named `MongoDB for VS Code`. + + ![Install official mongoDB vscode extension](public/markdown/images/install_mongodb_vscode_extension.webp) + +2. Connect your `MongoDB` database to the extension. + + ![Connect your mongoDB database to the extension](public/markdown/images/connect_extension_to_mongodb_step_1.webp) + + ![Connect your mongoDB database to the extension](public/markdown/images/connect_extension_to_mongodb_step_2.webp) + +3. Now you can manage the database you are using for `talawa-api` through this extension within `VSCode`. + +# Manually Adding The First Super Admin User + +You can skip these instructions for now if you don't have running instance of Talawa-Admin. + +1. This step is for mandatory Linux specific users others can skip to next step: + + 1. You need to start `mongod` [Mongo daemon process] for `mongosh` to work use the following commands: + 1. Using the System V init + ``` + sudo service mongod start + ``` + 2. Using systemd + ``` + sudo systemctl start mongod + ``` + 2. To verify whether `mongod`[Mongo daemon process] is running you can use either: + 1. Using the System V init + ``` + sudo service mongod status + ``` + 2. Using systemd + ``` + sudo systemctl status mongod + ``` + +## Using MongoDB Compass + +1. Open MongoDB Compass and click on `Connect`. +2. Select your database. +3. Elevate the user status: + + 1. Find the `AppUserProfile` document of the user that you want to elevate to superadmin. + 2. In that `AppUserProfile` document, update the value of `isSuperAdmin` field to be `true`. + + ![Illustration for user edit ](public/markdown/images/mongodb_compass_user_elevation.png) + +## Using Mongo Shell + +1. Open a terminal and run `mongosh` command to open interactive command line interface to work with MongoDB database. + +2. In the `mongosh` terminal use the following commands to edit the `appuserprofiles` collections data: + 1. Find the user: + ``` + const currentUser = db.users.findOne({ firstName: ''}) + ``` + 2. Elevate permission of this user in its `AppUserProfile`, i.e. set `isSuperAdmin` to `true`: + ``` + db.appuserprofiles.updateOne({ _id_: currentUser.appUserProfileId },{ $set: { isSuperAdmin: true }}) + ``` + 3. To verify the details were updated correctly use: + ``` + db.appuserprofiles.findOne({ _id_: currentUser.appUserProfileId }) + ``` + +**Note**: You can make the edit via any of these two methods. + +# Other + +These are some other factors to consider + +## Changing default talawa-api port + +If port `4000` is not free on your system you can pass a custom environment variable named `PORT` to the script to make it use a different port on your system's localhost. Here's the syntax for it: + +``` +PORT= npm run dev +``` + +where `` is whatever value you want the `PORT` to be. + +Whatever you pass will be substituted as the value for port and talawa-api development server on that port. + +``` +http://localhost:/ +``` + +For example using this command: + +``` +PORT=5000 npm run dev +``` + +will make talawa-api accessible on the following endpoint: + +``` +http://localhost:5000/ +``` + +# Testing + +Talawa-api makes use of `vitest` to run tests because it is much faster than `jest` and more comfortable to work with. + +You can run the tests for talawa-api using this command: + +``` +npm run test +``` diff --git a/ISSUE_GUIDELINES.md b/ISSUE_GUIDELINES.md new file mode 100644 index 0000000000..57dac0284d --- /dev/null +++ b/ISSUE_GUIDELINES.md @@ -0,0 +1,63 @@ +# Issue Report Guidelines + +:+1::tada: First off, thanks for taking the time to contribute! :tada::+1: + +In order to give everyone a chance to submit a issues reports and contribute to the Talawa project, we have put restrictions in place. This section outlines the guidelines that should be imposed upon issue reports in the Talawa project. + +--- + +## Table of Contents + + + +- [Issue Management](#issue-management) + - [New Issues](#new-issues) + - [Existing Issues](#existing-issues) + - [Feature Request Issues](#feature-request-issues) + - [Monitoring the Creation of New Issues](#monitoring-the-creation-of-new-issues) +- [General Guidelines](#general-guidelines) + + + +--- + +## Issue Management + +In all cases please use the [GitHub open issue search](https://github.com/PalisadoesFoundation/talawa-api/issues) to check whether the issue has already been reported. + +### New Issues + +To create new issues follow these steps: + +1. Your issue may have already been created. Search for duplicate open issues before submitting yours.for similar deficiencies in the code.duplicate issues are created. +1. Verify whether the issue has been fixed by trying to reproduce it using the latest master or development branch in the repository. +1. Click on the [`New Issue`](https://github.com/PalisadoesFoundation/talawa-api/issues/new/choose) button +1. Use the templates to create a standardized report of what needs to be done and why. +1. If you want to be assigned the issue that you have created, then add a comment immediately after submitting it. + +We welcome contributors who find new ways to make the code better. + +### Existing Issues + +You can also be a valuable contributor by searching for dormant issues. Here's how you can do that: + +1. **Previously Assigned Issues**: We regularly review issues and add a [`no-issue-activity`](https://github.com/PalisadoesFoundation/talawa-api/issues?q=is%3Aissue+is%3Aopen+label%3Ano-issue-activity) label to them. Use the issue comments to ask whether the assignee is still working on the issue, and if not, ask for the issue to be assigned to you. +1. **Unassigned Issues**: If the issue is already reported and [not assigned to anyone](https://github.com/PalisadoesFoundation/talawa-api/issues?q=is%3Aissue+is%3Aopen+no%3Aassignee) and you are interested in working on the issue then: + 1. Ask for the issue to be assigned to you in the issue comments + 2. Ask our contributors to assign it to you in `#talawa` slack channel. + +Working on these types of existing issues is a good way of getting started with the community. + +### Feature Request Issues + +Feature requests are welcome. But take a moment to find out whether your idea fits with the scope and aims of the project. It's up to you to make a strong case to convince the mentors of the merits of this feature. Please provide as much detail and context as possible. + +### Monitoring the Creation of New Issues + +1. Join our `#talawa-github` slack channel for automatic issue and pull request updates + +## General Guidelines + +1. Discuss issues in our various slack channels when necessary +2. Please do not derail or troll issues. +3. Keep the discussion on topic and respect the opinions of others. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000000..f288702d2f --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/PR_GUIDELINES.md b/PR_GUIDELINES.md new file mode 100644 index 0000000000..a115dd022c --- /dev/null +++ b/PR_GUIDELINES.md @@ -0,0 +1,51 @@ +## Table of Contents + + + +- [Pull Request Guidelines](#pull-request-guidelines) + - [Pull Requests and Issues](#pull-requests-and-issues) + - [Testing](#testing) + - [Pull Request Processing](#pull-request-processing) + - [Only submit PRs against our `develop` branch, not the default `main` branch](#only-submit-prs-against-our-develop-branch-not-the-default-main-branch) + + + +# Pull Request Guidelines + +:+1::tada: First off, thanks for taking the time to contribute! :tada::+1: + +In order to give everyone a chance to submit a pull request and contribute to the Talawa project, we have put restrictions in place. This section outlines the guidelines that should be imposed upon pull requests in the Talawa project. + +## Pull Requests and Issues + +1. Do not start working on any open issue and raise a PR unless the issue is assigned to you. PRs that don't meet these guidelines will be closed. +1. Pull requests must be based on [open issues](https://github.com/PalisadoesFoundation/talawa-api/issues) available. +1. [Use this method to automatically close the issue when the PR is completed.](https://docs.github.com/en/github/managing-your-work-on-github/linking-a-pull-request-to-an-issue) + +## Testing + +1. All pull requests must have test units. If, for some reason, it is not possible to add tests, please let us know and explain why. In that case, you'll need to tell us what steps you followed to manually test your changes. +1. Please read our [CONTRIBUTING.md](CONTRIBUTING.md) document for details on our testing policy. + +## Pull Request Processing + +These are key guidelines for the procedure: + +### Only submit PRs against our `develop` branch, not the default `main` branch + +1. Only submit PRs against our `develop` branch. The default is `main`, so you will have to modify this before submitting your PR for review. PRs made against `main` will be closed. +1. We do not accept draft Pull Requests. They will be closed if submitted. We focus on work that is ready for immediate review. +1. Removing assigned reviewers from your Pull Request will cause it to be closed. The quality of our code is very important to us. Therefore we make experienced maintainers of our code base review your code. Removing these assigned persons is not in the best interest of this goal. +1. If you have not done so already, please read the `Pull Requests and Issues` and `Testing` sections above. +1. Each contributor may only create one pull request at a time. We have this rule in place due to our limited resources - if everyone was allowed to post multiple pull requests, we would not be able to review them properly. It is also better for contributors because you can focus on creating one quality PR - so spend time making sure it is as good as it can be. +1. Upon successful push to the fork, check if all tests are passing; if not, fix the issues and then create a pull request. +1. If the pull request's code quality is not up to par, or it would break the app, it will more likely be closed. So please be careful when creating a PR. +1. Please follow the PR template provided. Ensure the PR title clearly describes the problem it is solving. In the description, include the relevant issue number, snapshots, and videos after changes are added. +1. If you are borrowing a code, please disclose it. It is fine and sometimes even recommended to borrow code, but we need to know about it to assess your work. If we find out that your pull request contains a lot of code copied from elsewhere, we will close the pull request. +1. No Work In Progress. ONLY completed and working pull requests and with respective test units will be accepted. A WIP would fall under rule 4 and be closed immediately. +1. Please do not @mention contributors and mentors. Sometimes it takes time before we can review your pull request or answer your questions, but we'll get to it sooner or later. @mentioning someone just adds to the pile of notifications we get and it won't make us look at your issue faster. +1. Do not force push. If you make changes to your pull request, please simply add a new commit, as that makes it easy for us to review your new changes. If you force push, we'll have to review everything from the beginning. +1. PR should be small, easy to review and should follow standard coding styles. +1. If PR has conflicts because of recently added changes to the same file, resolve issues, test new changes, and submit PR again for review. +1. PRs should be atomic. That is, they should address one item (issue or feature) +1. After submitting PR, if you are not replying within 48 hours, then in that case, we may need to assign the issue to other contributors based on the priority of the issue. diff --git a/README.md b/README.md new file mode 100644 index 0000000000..bdf939c79f --- /dev/null +++ b/README.md @@ -0,0 +1,56 @@ +# Talawa API + +[💬 Join the community on Slack](https://github.com/PalisadoesFoundation/) + +[![N|Solid](public/markdown/images/talawa-logo-lite-200x200.png)](https://github.com/PalisadoesFoundation/talawa-api) + +[![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0) +[![GitHub stars](https://img.shields.io/github/stars/PalisadoesFoundation/talawa-api.svg?style=social&label=Star&maxAge=2592000)](https://github.com/PalisadoesFoundation/talawa-api) +[![GitHub forks](https://img.shields.io/github/forks/PalisadoesFoundation/talawa-api.svg?style=social&label=Fork&maxAge=2592000)](https://github.com/PalisadoesFoundation/talawa-api) +[![codecov](https://codecov.io/gh/PalisadoesFoundation/talawa-api/branch/develop/graph/badge.svg?token=CECBQTAOKM)](https://codecov.io/gh/PalisadoesFoundation/talawa-api) + +Talawa is a modular open source project to manage group activities of both non-profit organizations and businesses. + +Core features include: + +1. Membership management +2. Groups management +3. Event registrations +4. Recurring meetings +5. Facilities registrations + +`talawa` is based on the original `quito` code created by the [Palisadoes Foundation](http://www.palisadoes.org) as part of its annual Calico Challenge program. Calico provides paid summer internships for Jamaican university students to work on selected open source projects. They are mentored by software professionals and receive stipends based on the completion of predefined milestones. Calico was started in 2015. Visit [The Palisadoes Foundation's website](http://www.palisadoes.org/) for more details on its origin and activities. + +## Table of Contents + + + + - [Talawa Components](#talawa-components) +- [Documentation](#documentation) + - [Videos](#videos) + + + +## Talawa Components + +`talawa` has these major software components: + +1. **talawa**: [A mobile application with social media features](https://github.com/PalisadoesFoundation/talawa) +1. **talawa-api**: [An API providing access to user data and features](https://github.com/PalisadoesFoundation/talawa-api) +1. **talawa-admin**: [A web based administrative portal](https://github.com/PalisadoesFoundation/talawa-admin) +1. **talawa-docs**: [The online documentation website](https://github.com/PalisadoesFoundation/talawa-docs) + +# Documentation + +1. You can install the software for this repository using the steps in our [INSTALLATION.md](INSTALLATION.md) file. +1. Do you want to contribute to our code base? Look at our [CONTRIBUTING.md](CONTRIBUTING.md) file to get started. There you'll also find links to: + 1. Our code of conduct documentation in the [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md) file. + 1. How we handle the processing of new and existing issues in our [ISSUE_GUIDELINES.md](ISSUE_GUIDELINES.md) file. + 1. The methodologies we use to manage our pull requests in our [PR_GUIDELINES.md](PR_GUIDELINES.md) file. +1. The `talawa` documentation can be found at our [docs.talawa.io](https://docs.talawa.io) site. + 1. It is automatically generated from the markdown files stored in our [Talawa-Docs GitHub repository](https://github.com/PalisadoesFoundation/talawa-docs). This makes it easy for you to update our documenation. + +## Videos + +1. Visit our [YouTube Channel playlists](https://www.youtube.com/@PalisadoesOrganization/playlists) for more insights + 1. The "[Getting Started - Developers](https://www.youtube.com/watch?v=YpBUoHxEeyg&list=PLv50qHwThlJUIzscg9a80a9-HmAlmUdCF&index=1)" videos are extremely helpful for new open source contributors. diff --git a/codegen.ts b/codegen.ts new file mode 100644 index 0000000000..75bbf9f1c6 --- /dev/null +++ b/codegen.ts @@ -0,0 +1,117 @@ +import type { CodegenConfig } from "@graphql-codegen/cli"; + +const config: CodegenConfig = { + // Points to our schema and the additional scalar Upload which is added by Apollo-Server at runtime + schema: ["./src/typeDefs/**/*.ts"], + + generates: { + "./src/types/generatedGraphQLTypes.ts": { + plugins: ["typescript", "typescript-resolvers"], + + config: { + // Generates graphQL enums as typescript union types. + enumsAsTypes: true, + + // Makes the info argument passed to the resolver functions optional. + optionalInfoArgument: true, + + // Makes the resolver function callable. + makeResolverTypeCallable: true, + + // Adds suffix "Model" to the end of generated database model types. + mapperTypeSuffix: "Model", + + // Mappers lets us provide database model types to be used in generated typescript types instead of graphql types. This + // functionality is useful because what we retrieve from the database and what we choose to return from a graphql server + // could be completely different fields. Address to models here is relative to the location of generated types. + mappers: { + ActionItem: "../models/ActionItem#InterfaceActionItem", + + ActionItemCategory: + "../models/ActionItemCategory#InterfaceActionItemCategory", + AppUserProfile: "../models/AppUserProfile#InterfaceAppUserProfile", + AgendaCategory: "../models/AgendaCategory#InterfaceAgendaCategory", + + Advertisement: "../models/Advertisement#InterfaceAdvertisement", + + AgendaItem: "../models/AgendaItem#InterfaceAgendaItem", + + AgendaSection: "../models/AgendaSection#InterfaceAgendaSection", + + CheckIn: "../models/CheckIn#InterfaceCheckIn", + + MessageChat: "../models/MessageChat#InterfaceMessageChat", + + Comment: "../models/Comment#InterfaceComment", + + Community: "../models/Community#InterfaceCommunity", + + DirectChat: "../models/DirectChat#InterfaceDirectChat", + + DirectChatMessage: + "../models/DirectChatMessage#InterfaceDirectChatMessage", + + Donation: "../models/Donation#InterfaceDonation", + + Event: "../models/Event#InterfaceEvent", + + EventAttendee: "../models/EventAttendee#InterfaceEventAttendee", + + UserFamily: "../models/userFamily#InterfaceUserFamily", + + EventVolunteer: "../models/EventVolunteer#InterfaceEventVolunteer", + + EventVolunteerGroup: + "../models/EventVolunteerGroup#InterfaceEventVolunteerGroup", + + Feedback: "../models/Feedback#InterfaceFeedback", + Fund: "../models/Fund#InterfaceFund", + FundraisingCampaign: + "../models/FundraisingCampaign#InterfaceFundraisingCampaign", + FundraisingCampaignPledge: + "../models/FundraisingCampaignPledge#InterfaceFundraisingCampaignPledges", + + // File: '../models/File#InterfaceFile', + + Group: "../models/Group#InterfaceGroup", + + GroupChat: "../models/GroupChat#InterfaceGroupChat", + + GroupChatMessage: + "../models/GroupChatMessage#InterfaceGroupChatMessage", + + // ImageHash: '../models/ImageHash#InterfaceImageHash', + + Language: "../models/Language#InterfaceLanguage", + + MembershipRequest: + "../models/MembershipRequest#InterfaceMembershipRequest", + + Message: "../models/Message#InterfaceMessage", + + Note: "../models/Note#InterfaceNote", + + Organization: "../models/Organization#InterfaceOrganization", + + Plugin: "../models/Plugin#InterfacePlugin", + + PluginField: "../models/PluginField#InterfacePluginField", + + Post: "../models/Post#InterfacePost", + + RecurrenceRule: "../models/RecurrenceRule#InterfaceRecurrenceRule", + + UserTag: "../models/OrganizationTagUser#InterfaceOrganizationTagUser", + + User: "../models/User#InterfaceUser", + + Venue: "../models/Venue#InterfaceVenue", + }, + + useTypeImports: true, + }, + }, + }, +}; + +export default config; diff --git a/config/vitestSetup.ts b/config/vitestSetup.ts new file mode 100644 index 0000000000..44152f1a19 --- /dev/null +++ b/config/vitestSetup.ts @@ -0,0 +1,8 @@ +// FAIL LOUDLY on unhandled promise rejections / errors +process.on("unhandledRejection", (reason) => { + // eslint-disable-next-line no-console + console.log("FAILED TO HANDLE PROMISE REJECTION"); + throw reason; +}); + +export default {}; diff --git a/docker-compose.dev.yaml b/docker-compose.dev.yaml new file mode 100644 index 0000000000..a40aee1718 --- /dev/null +++ b/docker-compose.dev.yaml @@ -0,0 +1,74 @@ +version: "3.8" + +services: + mongodb: + image: mongo:latest + ports: + - 27017:27017 + volumes: + - mongodb-data:/data/db + networks: + - talawa-network + + redis-stack-server: + image: redis/redis-stack-server:latest + ports: + - 6379:6379 + volumes: + - redis-data:/data/redis + networks: + - talawa-network + + minio: + image: minio/minio + ports: + - "9000:9000" + - "9001:9001" + environment: + - MINIO_ROOT_USER=${MINIO_ROOT_USER} + - MINIO_ROOT_PASSWORD=${MINIO_ROOT_PASSWORD} + command: server /data --console-address ":9001" + volumes: + - minio-data:/data + networks: + - talawa-network + + talawa-api-dev: + build: + context: . + dockerfile: Dockerfile.dev + volumes: + - .:/usr/src/app + - /usr/src/app/node_modules + depends_on: + - mongodb + - redis-stack-server + - minio + environment: + - MONGO_DB_URL=mongodb://mongodb:27017 + - REDIS_HOST=redis-stack-server + - REDIS_PORT=6379 + + caddy: + image: caddy/caddy:2.2.1-alpine + container_name: caddy-service + restart: unless-stopped + ports: + - "80:80" + - "443:443" + volumes: + - $PWD/Caddyfile:/etc/caddy/Caddyfile + - $PWD/site:/srv + - caddy_data:/data + - caddy_config:/config + +volumes: + mongodb-data: + redis-data: + caddy_data: + caddy_config: + minio-data: + +networks: + talawa-network: + driver: bridge diff --git a/docker-compose.prod.yaml b/docker-compose.prod.yaml new file mode 100644 index 0000000000..08c49cdb82 --- /dev/null +++ b/docker-compose.prod.yaml @@ -0,0 +1,57 @@ +version: "3.8" +services: + mongodb: + image: mongo:latest + ports: + - 27017:27017 + volumes: + - mongodb-data:/data/db + networks: + - talawa-network + redis-stack-server: + image: redis/redis-stack-server:latest + ports: + - 6379:6379 + volumes: + - redis-data:/data/redis + networks: + - talawa-network + minio: + image: minio/minio + ports: + - "9000:9000" + - "9001:9001" + environment: + - MINIO_ROOT_USER=${MINIO_ROOT_USER} + - MINIO_ROOT_PASSWORD=${MINIO_ROOT_PASSWORD} + command: server /data --console-address ":9001" + volumes: + - minio-data:/data + networks: + - talawa-network + talawa-api-prod-container: + build: + context: . + dockerfile: Dockerfile.prod + ports: + - 4000:4000 + depends_on: + - mongodb + - redis-stack-server + - minio + environment: + - MONGO_DB_URL=mongodb://mongodb:27017 + - REDIS_HOST=redis-stack-server + - REDIS_PORT=6379 + - MINIO_ENDPOINT=${MINIO_ENDPOINT} + networks: + - talawa-network + +volumes: + mongodb-data: + redis-data: + minio-data: + +networks: + talawa-network: + driver: bridge diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000000..f100b3aa5a --- /dev/null +++ b/docs/README.md @@ -0,0 +1,7 @@ +# Documentation + +This directory contain the all the relevant documentation about the API for the developers. + +Currently it has only one: + +- [Schema.md](./Schema.md): Contains the documentation about the GraphQL schema in Markdown format. Auto-generated on push to `develop` branch with the help of `graphql-markdown` plugin. diff --git a/images/.gitignore b/images/.gitignore new file mode 100644 index 0000000000..5e7d2734cf --- /dev/null +++ b/images/.gitignore @@ -0,0 +1,4 @@ +# Ignore everything in this directory +* +# Except this file +!.gitignore diff --git a/locales/en.json b/locales/en.json new file mode 100644 index 0000000000..1769c40537 --- /dev/null +++ b/locales/en.json @@ -0,0 +1,38 @@ +{ + "user.notAuthenticated": "User is not authenticated", + "user.notAuthorized": "User is not authorized for performing this operation", + "user.notFound": "User not found", + "user.alreadyMember": "User is already a member", + "user.profileImage.notFound": "User profile image not found", + "actionItemCategory.notFound": "Action Item Category not found", + "actionItemCategory.alreadyExists": "Action Item Category already exists", + "actionItemCategory.isDisabled": "Action Item Category is disabled", + "actionItem.notFound": "Action Item not found", + "advertisement.notFound": "Advertisement not found", + "event.notFound": "Event not found", + "baseRecurringEvent.notFound": "Base Recurring Event not found", + "recurrenceRule.notFound": "Recurrence Rule not found", + "organization.notFound": "Organization not found", + "organization.profileImage.notFound": "Organization profile image not found", + "organization.member.notFound": "Organization's user is not a member", + "organization.notAuthorized": "Organization is not authorized", + "sampleOrganization.duplicate": "Sample Organization already generated", + "membershipRequest.notFound": "Membership Request not found", + "membershipRequest.alreadyExists": "Membership Request already exists", + "chat.notFound": "Chat not found", + "email.alreadyExists": "Email address already exists", + "comment.notFound": "Comment not found", + "community.notFound": "Community not found", + "community.logoMissing": "Community logo was not provided", + "post.notFound": "Post not found", + "group.notFound": "Group not found", + "invalid.fileType": "Invalid file type", + "invalid.refreshToken": "Invalid refresh token", + "invalid.credentials": "Invalid credentials", + "registrant.alreadyExist": "Already registered for the event", + "member.notFound": "Member not found", + "registrant.alreadyUnregistered": "Already unregistered for the event", + "translation.alreadyPresent": "Translation Already Present", + "translation.notFound": "Translation not found", + "parameter.missing": "Missing Skip parameter. Set it to either 0 or some other value not found" +} diff --git a/locales/fr.json b/locales/fr.json new file mode 100644 index 0000000000..39fea9082c --- /dev/null +++ b/locales/fr.json @@ -0,0 +1,37 @@ +{ + "user.notAuthenticated": "L'utilisateur n'est pas authentifié", + "user.notAuthorized": "L'utilisateur n'est pas autorisé à effectuer cette opération", + "user.notFound": "Utilisateur introuvable", + "user.alreadyMember": "L'utilisateur est déjà membre", + "user.profileImage.notFound": "Image du profil utilisateur introuvable", + "actionItemCategory.notFound": "Catégorie d’élément d’action introuvable", + "actionItemCategory.alreadyExists": "La catégorie d’élément d’action existe déjà", + "actionItemCategory.isDisabled": "La catégorie d'élément d'action est désactivée", + "actionItem.notFound": "Élément d\\’action non trouvé", + "event.notFound": "Événement non trouvé", + "baseRecurringEvent.notFound": "Événement récurrent de base introuvable", + "recurrenceRule.notFound": "Règle de récurrence introuvable", + "organization.notFound": "Organisation introuvable", + "organization.profileImage.notFound": "Image du profil de l'organisation introuvable", + "organization.member.notFound": "L'utilisateur de l'organisation n'est pas membre", + "organization.notAuthorized": "L'organisation n'est pas autorisée", + "sampleOrganization.duplicate": "Exemple d'organisation déjà généré", + "membershipRequest.notFound": "Demande d'adhésion introuvable", + "membershipRequest.alreadyExists": "La demande d'adhésion existe déjà", + "chat.notFound": "Chat non trouvé", + "email.alreadyExists": "L'adresse e-mail existe déjà", + "comment.notFound": "Commentaire introuvable", + "community.logoMissing": "Le logo de la communauté n'a pas été fourni", + "community.notFound": "Communauté introuvable", + "post.notFound": "Message non trouvé", + "group.notFound": "Groupe introuvable", + "invalid.fileType": "Type de fichier non valide", + "invalid.refreshToken": "Jeton d'actualisation non valide", + "invalid.credentials": "Informations d'identification non valides", + "registrant.alreadyExist": "Déjà inscrit à l'événement", + "member.notFound": "Membre introuvable", + "registrant.alreadyUnregistered": "Déjà non inscrit à l'événement", + "translation.alreadyPresent": "Traduction déjà présente", + "translation.notFound": "Traduction introuvable", + "parameter.missing": "Paramètre de saut manquant. Réglez-le sur 0 ou sur une autre valeur" +} diff --git a/locales/hi.json b/locales/hi.json new file mode 100644 index 0000000000..74d3372fb0 --- /dev/null +++ b/locales/hi.json @@ -0,0 +1,38 @@ +{ + "user.notAuthenticated": "उपयोगकर्ता प्रमाणित नहीं है", + "user.notAuthorized": "उपयोगकर्ता इस ऑपरेशन को करने के लिए अधिकृत नहीं है", + "user.notFound": "उपयोगकर्ता नहीं मिला", + "user.alreadyMember": "उपयोगकर्ता पहले से ही एक सदस्य है", + "user.profileImage.notFound": "उपयोगकर्ता प्रोफ़ाइल छवि नहीं मिली", + "actionItemCategory.notFound": "श्रेणी नहीं मिली", + "actionItemCategory.alreadyExists": "यह श्रेणी पहले से मौजूद है", + "actionItemCategory.isDisabled": "क्रिया आइटम श्रेणी अक्षम है", + "actionItem.notFound": "कार्रवाई का मद नहीं मिला", + "advertisement.notFound": "विज्ञापन नहीं मिला", + "event.notFound": "घटना नहीं मिली", + "baseRecurringEvent.notFound": "आधार पुनरावृत्ति कार्यक्रम नहीं मिला", + "recurrenceRule.notFound": "पुनरावृत्ति नियम नहीं मिला", + "organization.notFound": "संगठन नहीं मिला", + "organization.profileImage.notFound": "संगठन की प्रोफ़ाइल छवि नहीं मिली", + "organization.member.notFound": "संगठन का उपयोगकर्ता सदस्य नहीं है", + "organization.notAuthorized": "संगठन अधिकृत नहीं है", + "sampleOrganization.dulicate": "नमूना संगठन पहले ही तैयार हो चुका है", + "membershipRequest.notFound": "सदस्यता अनुरोध नहीं मिला", + "membershipRequest.alreadyExists": "सदस्यता अनुरोध पहले से मौजूद है", + "chat.notFound": "चैट नहीं मिली", + "email.alreadyExists": "ईमेल पहले से मौजूद है", + "comment.notFound": "टिप्पणी नहीं मिली", + "community.logoMissing": "समुदाय लोगो उपलब्ध नहीं है", + "community.notFound": "समुदाय नहीं मिला", + "post.notFound": "पोस्ट नहीं मिली", + "group.notFound": "समूह नहीं मिला", + "invalid.fileType": "अमान्य फ़ाइल प्रकार", + "invalid.refreshToken": "अमान्य रीफ़्रेश टोकन", + "invalid.credentials": "अवैध प्रत्यय पत्र", + "registrant.alreadyExist": "घटना के लिए पहले से पंजीकृत", + "member.notFound": "सदस्य अनुपस्थित", + "registrant.alreadyUnregistered": "घटना के लिए पहले से ही अपंजीकृत", + "translation.alreadyPresent": "अनुवाद पहले से मौजूद है", + "translation.notFound": "अनुवाद नहीं मिला", + "parameter.missing": "छोड़ें पैरामीटर मौजूद नहीं है. इसे 0 या किसी अन्य मान पर सेट करें" +} diff --git a/locales/sp.json b/locales/sp.json new file mode 100644 index 0000000000..cec263813a --- /dev/null +++ b/locales/sp.json @@ -0,0 +1,37 @@ +{ + "user.notAuthenticated": "El usuario no está autenticado", + "user.notAuthorized": "El usuario no está autorizado para realizar esta operación", + "user.notFound": "Usuario no encontrado", + "user.alreadyMember": "El usuario ya es miembro", + "user.profileImage.notFound": "No se encontró la imagen de perfil de usuario", + "actionItemCategory.notFound": "No se encontró la categoría de elemento de acción", + "actionItemCategory.alreadyExists": "Ya existe una categoría de elemento de acción", + "actionItemCategory.isDisabled": "La categoría de elemento de acción está deshabilitada", + "actionItem.notFound": "Elemento de acción no encontrado", + "event.notFound": "Evento no encontrado", + "baseRecurringEvent.notFound": "Evento recurrente base no encontrado", + "recurrenceRule.notFound": "Regla de recurrencia no encontrada", + "organization.notFound": "Organización no encontrada", + "organization.profileImage.notFound": "No se encontró la imagen del perfil de la organización", + "organization.member.notFound": "El usuario de la organización no es miembro", + "organization.notAuthorized": "La organización no está autorizada", + "sampleOrganization.duplicate": "Organización de muestra ya generada", + "membershipRequest.notFound": "Solicitud de membresía no encontrada", + "membershipRequest.alreadyExists": "La solicitud de membresía ya existe", + "chat.notFound": "Chat no encontrado", + "email.alreadyExists": "La dirección de correo electrónico ya existe", + "comment.notFound": "Comentario no encontrado", + "community.logoMissing": "El logo de la comunidad no ha sido proporcionado", + "community.notFound": "Comunidad no encontrada", + "post.notFound": "Publicación no encontrada", + "group.notFound": "Grupo no encontrado", + "invalid.fileType": "Tipo de archivo no válido", + "invalid.refreshToken": "Token de actualización no válido", + "invalid.credentials": "Credenciales no válidas", + "registrant.alreadyExist": "Ya inscrito para el evento", + "member.notFound": "Miembro no encontrado", + "registrant.alreadyUnregistered": "Ya no está registrado para el evento", + "translation.alreadyPresent": "Traducción ya presente", + "translation.notFound": "Traducción no encontrada", + "parameter.missing": "Falta el parámetro Omitir. Establézcalo en 0 o en algún otro valor" +} diff --git a/locales/zh.json b/locales/zh.json new file mode 100644 index 0000000000..16453c5236 --- /dev/null +++ b/locales/zh.json @@ -0,0 +1,37 @@ +{ + "user.notAuthenticated": "用戶未通過身份驗證", + "user.notAuthorized": "用戶無權執行此操作", + "user.notFound": "找不到用戶", + "user.alreadyMember": "用戶已經是會員", + "user.profileImage.notFound": "未找到用戶個人資料圖像", + "actionItemCategory.notFound": "未找到措施项类别", + "actionItemCategory.alreadyExists": "措施项类别已存在", + "actionItemCategory.isDisabled": "操作项类别已禁用", + "actionItem.notFound": "找不到操作项", + "event.notFound": "未找到事件", + "baseRecurringEvent.notFound": "未找到基本重复事件", + "recurrenceRule.notFound": "未找到重复规则", + "organization.notFound": "未找到組織", + "organization.profileImage.notFound": "未找到組織檔案圖像", + "organization.member.notFound": "組織的用戶不是成員", + "organization.notAuthorized": "組織未授權", + "sampleOrganization.duplicate": "已生成样本组织", + "membershipRequest.notFound": "未找到會員請求", + "membershipRequest.alreadyExists": "成員資格請求已存在", + "chat.notFound": "未找到聊天", + "email.alreadyExists": "電子郵件地址已經存在", + "comment.notFound": "未找到評論", + "community.logoMissing": "社区标志未提供", + "community.notFound": "未找到社群", + "post.notFound": "找不到帖子", + "group.notFound": "未找到組", + "invalid.fileType": "無效的文件類型", + "invalid.refreshToken": "無效的刷新令牌", + "invalid.credentials": "無效的憑據", + "registrant.alreadyExist": "已经报名参加活动", + "member.notFound": "未找到成员", + "registrant.alreadyUnregistered": "已取消注册该活动", + "translation.alreadyPresent": "翻译已经存在", + "translation.notFound": "找不到翻译", + "parameter.missing": "缺少跳过参数。将其设置为 0 或其他值" +} diff --git a/logs/.gitignore b/logs/.gitignore new file mode 100644 index 0000000000..5e7d2734cf --- /dev/null +++ b/logs/.gitignore @@ -0,0 +1,4 @@ +# Ignore everything in this directory +* +# Except this file +!.gitignore diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000000..350f57f1c0 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,17294 @@ +{ + "name": "talawa-api", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "talawa-api", + "version": "1.0.0", + "license": "GNU General Public License v3.0", + "dependencies": { + "@apollo/server": "^4.11.0", + "@faker-js/faker": "^9.0.1", + "@graphql-inspector/cli": "^5.0.6", + "@graphql-tools/resolvers-composition": "^7.0.1", + "@graphql-tools/schema": "^10.0.6", + "@graphql-tools/utils": "^10.3.2", + "@parcel/watcher": "^2.4.1", + "@types/graphql-upload": "^16.0.5", + "@types/yargs": "^17.0.33", + "@typescript-eslint/eslint-plugin": "^8.2.0", + "@typescript-eslint/parser": "^8.0.1", + "axios": "^1.7.4", + "bcryptjs": "^2.4.3", + "bluebird": "3.7.2", + "cls-hooked": "^4.2.2", + "copy-paste": "^1.5.3", + "cors": "^2.8.5", + "cross-env": "^7.0.3", + "date-fns": "^3.3.1", + "dotenv": "^16.4.1", + "express": "^4.19.2", + "express-mongo-sanitize": "^2.2.0", + "express-rate-limit": "^7.4.0", + "graphql": "^16.9.0", + "graphql-depth-limit": "^1.1.0", + "graphql-scalars": "^1.20.1", + "graphql-subscriptions": "^2.0.0", + "graphql-tag": "^2.12.6", + "graphql-upload": "^16.0.2", + "graphql-voyager": "^2.0.0", + "graphql-ws": "^5.16.0", + "helmet": "^7.1.0", + "i18n": "^0.15.1", + "image-hash": "^5.3.1", + "ioredis": "^5.4.1", + "jsonwebtoken": "^9.0.0", + "jwt-decode": "^4.0.0", + "lodash": "^4.17.21", + "markdown-toc": "^1.2.0", + "mongodb": "^6.8.0", + "mongoose": "^8.3.2", + "mongoose-paginate-v2": "^1.8.3", + "morgan": "^1.10.0", + "nanoid": "^5.0.7", + "nodemailer": "^6.9.15", + "pm2": "^5.4.0", + "redis": "^4.7.0", + "rrule": "^2.8.1", + "typedoc-plugin-markdown": "^4.2.7", + "uuid": "^10.0.0", + "validator": "^13.12.0", + "winston": "^3.14.2", + "ws": "^8.18.0", + "yargs": "^17.7.2", + "zod": "^3.23.8", + "zod-error": "^1.5.0" + }, + "devDependencies": { + "@graphql-codegen/cli": "^5.0.2", + "@graphql-codegen/typescript": "^4.0.9", + "@graphql-codegen/typescript-resolvers": "^4.2.1", + "@graphql-eslint/eslint-plugin": "^3.20.1", + "@parcel/watcher": "^2.4.1", + "@types/bcryptjs": "^2.4.6", + "@types/cls-hooked": "^4.3.8", + "@types/copy-paste": "^1.1.30", + "@types/cors": "^2.8.17", + "@types/express": "^4.17.17", + "@types/express-rate-limit": "^6.0.0", + "@types/graphql-depth-limit": "^1.1.6", + "@types/i18n": "^0.13.12", + "@types/inquirer": "^9.0.7", + "@types/jsonwebtoken": "^9.0.7", + "@types/lodash": "^4.17.7", + "@types/mongoose-paginate-v2": "^1.6.5", + "@types/morgan": "^1.9.9", + "@types/node": "^22.5.4", + "@types/nodemailer": "^6.4.15", + "@types/uuid": "^10.0.0", + "@types/validator": "^13.12.0", + "@vitest/coverage-v8": "^2.1.1", + "cls-bluebird": "^2.1.0", + "concurrently": "^9.0.0", + "eslint": "^8.56.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-tsdoc": "^0.3.0", + "get-graphql-schema": "^2.1.2", + "graphql-markdown": "^7.1.0", + "husky": "^9.1.5", + "lint-staged": "^15.2.10", + "prettier": "^3.3.3", + "rimraf": "^6.0.1", + "tsx": "^4.19.1", + "typescript": "^5.5.4", + "vitest": "^2.0.5" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@apollo/cache-control-types": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@apollo/cache-control-types/-/cache-control-types-1.0.3.tgz", + "integrity": "sha512-F17/vCp7QVwom9eG7ToauIKdAxpSoadsJnqIfyryLFSkLSOEqu+eC5Z3N8OXcUVStuOMcNHlyraRsA6rRICu4g==", + "peerDependencies": { + "graphql": "14.x || 15.x || 16.x" + } + }, + "node_modules/@apollo/protobufjs": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@apollo/protobufjs/-/protobufjs-1.2.7.tgz", + "integrity": "sha512-Lahx5zntHPZia35myYDBRuF58tlwPskwHc5CWBZC/4bMKB6siTBWwtMrkqXcsNwQiFSzSx5hKdRPUmemrEp3Gg==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.0", + "long": "^4.0.0" + }, + "bin": { + "apollo-pbjs": "bin/pbjs", + "apollo-pbts": "bin/pbts" + } + }, + "node_modules/@apollo/server": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@apollo/server/-/server-4.11.0.tgz", + "integrity": "sha512-SWDvbbs0wl2zYhKG6aGLxwTJ72xpqp0awb2lotNpfezd9VcAvzaUizzKQqocephin2uMoaA8MguoyBmgtPzNWw==", + "dependencies": { + "@apollo/cache-control-types": "^1.0.3", + "@apollo/server-gateway-interface": "^1.1.1", + "@apollo/usage-reporting-protobuf": "^4.1.1", + "@apollo/utils.createhash": "^2.0.0", + "@apollo/utils.fetcher": "^2.0.0", + "@apollo/utils.isnodelike": "^2.0.0", + "@apollo/utils.keyvaluecache": "^2.1.0", + "@apollo/utils.logger": "^2.0.0", + "@apollo/utils.usagereporting": "^2.1.0", + "@apollo/utils.withrequired": "^2.0.0", + "@graphql-tools/schema": "^9.0.0", + "@types/express": "^4.17.13", + "@types/express-serve-static-core": "^4.17.30", + "@types/node-fetch": "^2.6.1", + "async-retry": "^1.2.1", + "cors": "^2.8.5", + "express": "^4.17.1", + "loglevel": "^1.6.8", + "lru-cache": "^7.10.1", + "negotiator": "^0.6.3", + "node-abort-controller": "^3.1.1", + "node-fetch": "^2.6.7", + "uuid": "^9.0.0", + "whatwg-mimetype": "^3.0.0" + }, + "engines": { + "node": ">=14.16.0" + }, + "peerDependencies": { + "graphql": "^16.6.0" + } + }, + "node_modules/@apollo/server-gateway-interface": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@apollo/server-gateway-interface/-/server-gateway-interface-1.1.1.tgz", + "integrity": "sha512-pGwCl/po6+rxRmDMFgozKQo2pbsSwE91TpsDBAOgf74CRDPXHHtM88wbwjab0wMMZh95QfR45GGyDIdhY24bkQ==", + "dependencies": { + "@apollo/usage-reporting-protobuf": "^4.1.1", + "@apollo/utils.fetcher": "^2.0.0", + "@apollo/utils.keyvaluecache": "^2.1.0", + "@apollo/utils.logger": "^2.0.0" + }, + "peerDependencies": { + "graphql": "14.x || 15.x || 16.x" + } + }, + "node_modules/@apollo/server/node_modules/@graphql-tools/merge": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-8.4.2.tgz", + "integrity": "sha512-XbrHAaj8yDuINph+sAfuq3QCZ/tKblrTLOpirK0+CAgNlZUCHs0Fa+xtMUURgwCVThLle1AF7svJCxFizygLsw==", + "dependencies": { + "@graphql-tools/utils": "^9.2.1", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@apollo/server/node_modules/@graphql-tools/schema": { + "version": "9.0.19", + "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-9.0.19.tgz", + "integrity": "sha512-oBRPoNBtCkk0zbUsyP4GaIzCt8C0aCI4ycIRUL67KK5pOHljKLBBtGT+Jr6hkzA74C8Gco8bpZPe7aWFjiaK2w==", + "dependencies": { + "@graphql-tools/merge": "^8.4.1", + "@graphql-tools/utils": "^9.2.1", + "tslib": "^2.4.0", + "value-or-promise": "^1.0.12" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@apollo/server/node_modules/@graphql-tools/utils": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-9.2.1.tgz", + "integrity": "sha512-WUw506Ql6xzmOORlriNrD6Ugx+HjVgYxt9KCXD9mHAak+eaXSwuGGPyE60hy9xaDEoXKBsG7SkG69ybitaVl6A==", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@apollo/server/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@apollo/usage-reporting-protobuf": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@apollo/usage-reporting-protobuf/-/usage-reporting-protobuf-4.1.1.tgz", + "integrity": "sha512-u40dIUePHaSKVshcedO7Wp+mPiZsaU6xjv9J+VyxpoU/zL6Jle+9zWeG98tr/+SZ0nZ4OXhrbb8SNr0rAPpIDA==", + "dependencies": { + "@apollo/protobufjs": "1.2.7" + } + }, + "node_modules/@apollo/utils.createhash": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@apollo/utils.createhash/-/utils.createhash-2.0.1.tgz", + "integrity": "sha512-fQO4/ZOP8LcXWvMNhKiee+2KuKyqIcfHrICA+M4lj/h/Lh1H10ICcUtk6N/chnEo5HXu0yejg64wshdaiFitJg==", + "dependencies": { + "@apollo/utils.isnodelike": "^2.0.1", + "sha.js": "^2.4.11" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@apollo/utils.dropunuseddefinitions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@apollo/utils.dropunuseddefinitions/-/utils.dropunuseddefinitions-2.0.1.tgz", + "integrity": "sha512-EsPIBqsSt2BwDsv8Wu76LK5R1KtsVkNoO4b0M5aK0hx+dGg9xJXuqlr7Fo34Dl+y83jmzn+UvEW+t1/GP2melA==", + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "graphql": "14.x || 15.x || 16.x" + } + }, + "node_modules/@apollo/utils.fetcher": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@apollo/utils.fetcher/-/utils.fetcher-2.0.1.tgz", + "integrity": "sha512-jvvon885hEyWXd4H6zpWeN3tl88QcWnHp5gWF5OPF34uhvoR+DFqcNxs9vrRaBBSY3qda3Qe0bdud7tz2zGx1A==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@apollo/utils.isnodelike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@apollo/utils.isnodelike/-/utils.isnodelike-2.0.1.tgz", + "integrity": "sha512-w41XyepR+jBEuVpoRM715N2ZD0xMD413UiJx8w5xnAZD2ZkSJnMJBoIzauK83kJpSgNuR6ywbV29jG9NmxjK0Q==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@apollo/utils.keyvaluecache": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@apollo/utils.keyvaluecache/-/utils.keyvaluecache-2.1.1.tgz", + "integrity": "sha512-qVo5PvUUMD8oB9oYvq4ViCjYAMWnZ5zZwEjNF37L2m1u528x5mueMlU+Cr1UinupCgdB78g+egA1G98rbJ03Vw==", + "dependencies": { + "@apollo/utils.logger": "^2.0.1", + "lru-cache": "^7.14.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@apollo/utils.logger": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@apollo/utils.logger/-/utils.logger-2.0.1.tgz", + "integrity": "sha512-YuplwLHaHf1oviidB7MxnCXAdHp3IqYV8n0momZ3JfLniae92eYqMIx+j5qJFX6WKJPs6q7bczmV4lXIsTu5Pg==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@apollo/utils.printwithreducedwhitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@apollo/utils.printwithreducedwhitespace/-/utils.printwithreducedwhitespace-2.0.1.tgz", + "integrity": "sha512-9M4LUXV/fQBh8vZWlLvb/HyyhjJ77/I5ZKu+NBWV/BmYGyRmoEP9EVAy7LCVoY3t8BDcyCAGfxJaLFCSuQkPUg==", + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "graphql": "14.x || 15.x || 16.x" + } + }, + "node_modules/@apollo/utils.removealiases": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@apollo/utils.removealiases/-/utils.removealiases-2.0.1.tgz", + "integrity": "sha512-0joRc2HBO4u594Op1nev+mUF6yRnxoUH64xw8x3bX7n8QBDYdeYgY4tF0vJReTy+zdn2xv6fMsquATSgC722FA==", + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "graphql": "14.x || 15.x || 16.x" + } + }, + "node_modules/@apollo/utils.sortast": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@apollo/utils.sortast/-/utils.sortast-2.0.1.tgz", + "integrity": "sha512-eciIavsWpJ09za1pn37wpsCGrQNXUhM0TktnZmHwO+Zy9O4fu/WdB4+5BvVhFiZYOXvfjzJUcc+hsIV8RUOtMw==", + "dependencies": { + "lodash.sortby": "^4.7.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "graphql": "14.x || 15.x || 16.x" + } + }, + "node_modules/@apollo/utils.stripsensitiveliterals": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@apollo/utils.stripsensitiveliterals/-/utils.stripsensitiveliterals-2.0.1.tgz", + "integrity": "sha512-QJs7HtzXS/JIPMKWimFnUMK7VjkGQTzqD9bKD1h3iuPAqLsxd0mUNVbkYOPTsDhUKgcvUOfOqOJWYohAKMvcSA==", + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "graphql": "14.x || 15.x || 16.x" + } + }, + "node_modules/@apollo/utils.usagereporting": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@apollo/utils.usagereporting/-/utils.usagereporting-2.1.0.tgz", + "integrity": "sha512-LPSlBrn+S17oBy5eWkrRSGb98sWmnEzo3DPTZgp8IQc8sJe0prDgDuppGq4NeQlpoqEHz0hQeYHAOA0Z3aQsxQ==", + "dependencies": { + "@apollo/usage-reporting-protobuf": "^4.1.0", + "@apollo/utils.dropunuseddefinitions": "^2.0.1", + "@apollo/utils.printwithreducedwhitespace": "^2.0.1", + "@apollo/utils.removealiases": "2.0.1", + "@apollo/utils.sortast": "^2.0.1", + "@apollo/utils.stripsensitiveliterals": "^2.0.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "graphql": "14.x || 15.x || 16.x" + } + }, + "node_modules/@apollo/utils.withrequired": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@apollo/utils.withrequired/-/utils.withrequired-2.0.1.tgz", + "integrity": "sha512-YBDiuAX9i1lLc6GeTy1m7DGLFn/gMnvXqlalOIMjM7DeOgIacEjjfwPqb0M1CQ2v11HhR15d1NmxJoRCfrNqcA==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@ardatan/relay-compiler": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@ardatan/relay-compiler/-/relay-compiler-12.0.0.tgz", + "integrity": "sha512-9anThAaj1dQr6IGmzBMcfzOQKTa5artjuPmw8NYK/fiGEMjADbSguBY2FMDykt+QhilR3wc9VA/3yVju7JHg7Q==", + "dev": true, + "dependencies": { + "@babel/core": "^7.14.0", + "@babel/generator": "^7.14.0", + "@babel/parser": "^7.14.0", + "@babel/runtime": "^7.0.0", + "@babel/traverse": "^7.14.0", + "@babel/types": "^7.0.0", + "babel-preset-fbjs": "^3.4.0", + "chalk": "^4.0.0", + "fb-watchman": "^2.0.0", + "fbjs": "^3.0.0", + "glob": "^7.1.1", + "immutable": "~3.7.6", + "invariant": "^2.2.4", + "nullthrows": "^1.1.1", + "relay-runtime": "12.0.0", + "signedsource": "^1.0.0", + "yargs": "^15.3.1" + }, + "bin": { + "relay-compiler": "bin/relay-compiler" + }, + "peerDependencies": { + "graphql": "*" + } + }, + "node_modules/@ardatan/relay-compiler/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/@ardatan/relay-compiler/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@ardatan/relay-compiler/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@ardatan/relay-compiler/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ardatan/relay-compiler/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@ardatan/relay-compiler/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/@ardatan/relay-compiler/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@ardatan/relay-compiler/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@ardatan/sync-fetch": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@ardatan/sync-fetch/-/sync-fetch-0.0.1.tgz", + "integrity": "sha512-xhlTqH0m31mnsG0tIP4ETgfSB6gXDaYYsUWTrlUV93fFQPI9dd8hE0Ot6MHLCtqgB32hwJAC3YZMWlXZw7AleA==", + "dependencies": { + "node-fetch": "^2.6.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.6.tgz", + "integrity": "sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA==", + "dependencies": { + "@babel/highlight": "^7.24.6", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.6.tgz", + "integrity": "sha512-aC2DGhBq5eEdyXWqrDInSqQjO0k8xtPRf5YylULqx8MCd6jBtzqfta/3ETMRpuKIc5hyswfO80ObyA1MvkCcUQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.6.tgz", + "integrity": "sha512-qAHSfAdVyFmIvl0VHELib8xar7ONuSHrE2hLnsaWkYNTI68dmi1x8GYDhJjMI/e7XWal9QBlZkwbOnkcw7Z8gQ==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.6", + "@babel/generator": "^7.24.6", + "@babel/helper-compilation-targets": "^7.24.6", + "@babel/helper-module-transforms": "^7.24.6", + "@babel/helpers": "^7.24.6", + "@babel/parser": "^7.24.6", + "@babel/template": "^7.24.6", + "@babel/traverse": "^7.24.6", + "@babel/types": "^7.24.6", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, + "node_modules/@babel/generator": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.6.tgz", + "integrity": "sha512-S7m4eNa6YAPJRHmKsLHIDJhNAGNKoWNiWefz1MBbpnt8g9lvMDl1hir4P9bo/57bQEmuwEhnRU/AMWsD0G/Fbg==", + "dependencies": { + "@babel/types": "^7.24.6", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.6.tgz", + "integrity": "sha512-VZQ57UsDGlX/5fFA7GkVPplZhHsVc+vuErWgdOiysI9Ksnw0Pbbd6pnPiR/mmJyKHgyIW0c7KT32gmhiF+cirg==", + "dependencies": { + "@babel/compat-data": "^7.24.6", + "@babel/helper-validator-option": "^7.24.6", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.1.tgz", + "integrity": "sha512-1yJa9dX9g//V6fDebXoEfEsxkZHk3Hcbm+zLhyu6qVgYFLvmTALTeV+jNU9e5RnYtioBrGEOdoI2joMSNQ/+aA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.24.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.6.tgz", + "integrity": "sha512-Y50Cg3k0LKLMjxdPjIl40SdJgMB85iXn27Vk/qbHZCFx/o5XO3PSnpi675h1KEmmDb6OFArfd5SCQEQ5Q4H88g==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.6.tgz", + "integrity": "sha512-xpeLqeeRkbxhnYimfr2PC+iA0Q7ljX/d1eZ9/inYbmfG2jpl8Lu3DyXvpOAnrS5kxkfOWJjioIMQsaMBXFI05w==", + "dependencies": { + "@babel/template": "^7.24.6", + "@babel/types": "^7.24.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.6.tgz", + "integrity": "sha512-SF/EMrC3OD7dSta1bLJIlrsVxwtd0UpjRJqLno6125epQMJ/kyFmpTT4pbvPbdQHzCHg+biQ7Syo8lnDtbR+uA==", + "dependencies": { + "@babel/types": "^7.24.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.6.tgz", + "integrity": "sha512-a26dmxFJBF62rRO9mmpgrfTLsAuyHk4e1hKTUkD/fcMfynt8gvEKwQPQDVxWhca8dHoDck+55DFt42zV0QMw5g==", + "dependencies": { + "@babel/types": "^7.24.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.6.tgz", + "integrity": "sha512-Y/YMPm83mV2HJTbX1Qh2sjgjqcacvOlhbzdCCsSlblOKjSYmQqEbO6rUniWQyRo9ncyfjT8hnUjlG06RXDEmcA==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-module-imports": "^7.24.6", + "@babel/helper-simple-access": "^7.24.6", + "@babel/helper-split-export-declaration": "^7.24.6", + "@babel/helper-validator-identifier": "^7.24.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", + "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz", + "integrity": "sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.6.tgz", + "integrity": "sha512-nZzcMMD4ZhmB35MOOzQuiGO5RzL6tJbsT37Zx8M5L/i9KSrukGXWTjLe1knIbb/RmxoJE9GON9soq0c0VEMM5g==", + "dependencies": { + "@babel/types": "^7.24.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.6.tgz", + "integrity": "sha512-CvLSkwXGWnYlF9+J3iZUvwgAxKiYzK3BWuo+mLzD/MDGOZDj7Gq8+hqaOkMxmJwmlv0iu86uH5fdADd9Hxkymw==", + "dependencies": { + "@babel/types": "^7.24.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.6.tgz", + "integrity": "sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.6.tgz", + "integrity": "sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.6.tgz", + "integrity": "sha512-Jktc8KkF3zIkePb48QO+IapbXlSapOW9S+ogZZkcO6bABgYAxtZcjZ/O005111YLf+j4M84uEgwYoidDkXbCkQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.6.tgz", + "integrity": "sha512-V2PI+NqnyFu1i0GyTd/O/cTpxzQCYioSkUIRmgo7gFEHKKCg5w46+r/A6WeUR1+P3TeQ49dspGPNd/E3n9AnnA==", + "dependencies": { + "@babel/template": "^7.24.6", + "@babel/types": "^7.24.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.6.tgz", + "integrity": "sha512-2YnuOp4HAk2BsBrJJvYCbItHx0zWscI1C3zgWkz+wDyD9I7GIVrfnLyrR4Y1VR+7p+chAEcrgRQYZAGIKMV7vQ==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.6", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.6.tgz", + "integrity": "sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", + "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead.", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-flow": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.24.1.tgz", + "integrity": "sha512-sxi2kLTI5DeW5vDtMUsk4mTPwvlUDbjOnoWayhynCwrw4QXRld4QEYwqzY8JmQXaJUtgUuCIurtSRH5sn4c7mA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz", + "integrity": "sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz", + "integrity": "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz", + "integrity": "sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz", + "integrity": "sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.1.tgz", + "integrity": "sha512-h71T2QQvDgM2SmT29UYU6ozjMlAt7s7CSs5Hvy8f8cf/GM/Z4a2zMfN+fjVGaieeCrXR3EdQl6C4gQG+OgmbKw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz", + "integrity": "sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-replace-supers": "^7.24.1", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz", + "integrity": "sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/template": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz", + "integrity": "sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-flow-strip-types": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.24.1.tgz", + "integrity": "sha512-iIYPIWt3dUmUKKE10s3W+jsQ3icFkw0JyRVyY1B7G4yK/nngAOHLVx8xlhA6b/Jzl/Y0nis8gjqhqKtRDQqHWQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-flow": "^7.24.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz", + "integrity": "sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz", + "integrity": "sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz", + "integrity": "sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz", + "integrity": "sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz", + "integrity": "sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-simple-access": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz", + "integrity": "sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-replace-supers": "^7.24.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz", + "integrity": "sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz", + "integrity": "sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.1.tgz", + "integrity": "sha512-mvoQg2f9p2qlpDQRBC7M3c3XTr0k7cp/0+kFKKO/7Gtu0LSw16eKB+Fabe2bDT/UpsyasTBBkAnbdsLrkD5XMw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", + "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.23.3", + "@babel/types": "^7.23.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz", + "integrity": "sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz", + "integrity": "sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz", + "integrity": "sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.1.tgz", + "integrity": "sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.6.tgz", + "integrity": "sha512-3vgazJlLwNXi9jhrR1ef8qiB65L1RK90+lEQwv4OxveHnqC3BfmnHdgySwRLzf6akhlOYenT+b7AfWq+a//AHw==", + "dependencies": { + "@babel/code-frame": "^7.24.6", + "@babel/parser": "^7.24.6", + "@babel/types": "^7.24.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.6.tgz", + "integrity": "sha512-OsNjaJwT9Zn8ozxcfoBc+RaHdj3gFmCmYoQLUII1o6ZrUwku0BMg80FoOTPx+Gi6XhcQxAYE4xyjPTo4SxEQqw==", + "dependencies": { + "@babel/code-frame": "^7.24.6", + "@babel/generator": "^7.24.6", + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-function-name": "^7.24.6", + "@babel/helper-hoist-variables": "^7.24.6", + "@babel/helper-split-export-declaration": "^7.24.6", + "@babel/parser": "^7.24.6", + "@babel/types": "^7.24.6", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.6.tgz", + "integrity": "sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ==", + "dependencies": { + "@babel/helper-string-parser": "^7.24.6", + "@babel/helper-validator-identifier": "^7.24.6", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@canvas/image-data": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@canvas/image-data/-/image-data-1.0.0.tgz", + "integrity": "sha512-BxOqI5LgsIQP1odU5KMwV9yoijleOPzHL18/YvNqF9KFSGF2K/DLlYAbDQsWqd/1nbaFuSkYD/191dpMtNh4vw==" + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@cwasm/webp": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@cwasm/webp/-/webp-0.1.5.tgz", + "integrity": "sha512-ceIZQkyxK+s7mmItNcWqqHdOBiJAxYxTnrnPNgUNjldB1M9j+Bp/3eVIVwC8rUFyN/zoFwuT0331pyY3ackaNA==", + "dependencies": { + "@canvas/image-data": "^1.0.0" + } + }, + "node_modules/@dabh/diagnostics": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", + "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", + "dependencies": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", + "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/serialize": "^1.1.2", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", + "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", + "dependencies": { + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", + "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", + "dependencies": { + "@emotion/memoize": "^0.8.1" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "node_modules/@emotion/react": { + "version": "11.10.5", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.10.5.tgz", + "integrity": "sha512-TZs6235tCJ/7iF6/rvTaOH4oxQg2gMAcdHemjwLKIjKz4rRuYe1HJ2TQJKnAcRAfOUDdU8XoDadCe1rl72iv8A==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.10.5", + "@emotion/cache": "^11.10.5", + "@emotion/serialize": "^1.1.1", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", + "@emotion/utils": "^1.2.0", + "@emotion/weak-memoize": "^0.3.0", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.3.tgz", + "integrity": "sha512-iD4D6QVZFDhcbH0RAG1uVu1CwVLMWUkCvAqqlewO/rxf8+87yIBAlt4+AxMiiKPLs5hFc0owNk/sLLAOROw3cA==", + "dependencies": { + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", + "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" + }, + "node_modules/@emotion/styled": { + "version": "11.10.5", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.10.5.tgz", + "integrity": "sha512-8EP6dD7dMkdku2foLoruPCNkRevzdcBaY6q0l0OsbyJK+x8D9HWjX27ARiSIKNF634hY9Zdoedh8bJCiva8yZw==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.10.5", + "@emotion/is-prop-valid": "^1.2.0", + "@emotion/serialize": "^1.1.1", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", + "@emotion/utils": "^1.2.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", + "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" + }, + "node_modules/@envelop/core": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@envelop/core/-/core-5.0.1.tgz", + "integrity": "sha512-wxA8EyE1fPnlbP0nC/SFI7uU8wSNf4YjxZhAPu0P63QbgIvqHtHsH4L3/u+rsTruzhk3OvNRgQyLsMfaR9uzAQ==", + "dependencies": { + "@envelop/types": "5.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@envelop/types": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@envelop/types/-/types-5.0.0.tgz", + "integrity": "sha512-IPjmgSc4KpQRlO4qbEDnBEixvtb06WDmjKfi/7fkZaryh5HuOmTtixe1EupQI5XfXO8joc3d27uUZ0QdC++euA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", + "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", + "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", + "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", + "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", + "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", + "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", + "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", + "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", + "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", + "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", + "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", + "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", + "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", + "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", + "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", + "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", + "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", + "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", + "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", + "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", + "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", + "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", + "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", + "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@faker-js/faker": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-9.0.1.tgz", + "integrity": "sha512-4mDeYIgM3By7X6t5E6eYwLAa+2h4DeZDF7thhzIg6XB76jeEvMwadYAMCFJL/R4AnEBcAUO9+gL0vhy3s+qvZA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/fakerjs" + } + ], + "engines": { + "node": ">=18.0.0", + "npm": ">=9.0.0" + } + }, + "node_modules/@graphql-codegen/add": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@graphql-codegen/add/-/add-5.0.2.tgz", + "integrity": "sha512-ouBkSvMFUhda5VoKumo/ZvsZM9P5ZTyDsI8LW18VxSNWOjrTeLXBWHG8Gfaai0HwhflPtCYVABbriEcOmrRShQ==", + "dev": true, + "dependencies": { + "@graphql-codegen/plugin-helpers": "^5.0.3", + "tslib": "~2.6.0" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/cli": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@graphql-codegen/cli/-/cli-5.0.2.tgz", + "integrity": "sha512-MBIaFqDiLKuO4ojN6xxG9/xL9wmfD3ZjZ7RsPjwQnSHBCUXnEkdKvX+JVpx87Pq29Ycn8wTJUguXnTZ7Di0Mlw==", + "dev": true, + "dependencies": { + "@babel/generator": "^7.18.13", + "@babel/template": "^7.18.10", + "@babel/types": "^7.18.13", + "@graphql-codegen/client-preset": "^4.2.2", + "@graphql-codegen/core": "^4.0.2", + "@graphql-codegen/plugin-helpers": "^5.0.3", + "@graphql-tools/apollo-engine-loader": "^8.0.0", + "@graphql-tools/code-file-loader": "^8.0.0", + "@graphql-tools/git-loader": "^8.0.0", + "@graphql-tools/github-loader": "^8.0.0", + "@graphql-tools/graphql-file-loader": "^8.0.0", + "@graphql-tools/json-file-loader": "^8.0.0", + "@graphql-tools/load": "^8.0.0", + "@graphql-tools/prisma-loader": "^8.0.0", + "@graphql-tools/url-loader": "^8.0.0", + "@graphql-tools/utils": "^10.0.0", + "@whatwg-node/fetch": "^0.8.0", + "chalk": "^4.1.0", + "cosmiconfig": "^8.1.3", + "debounce": "^1.2.0", + "detect-indent": "^6.0.0", + "graphql-config": "^5.0.2", + "inquirer": "^8.0.0", + "is-glob": "^4.0.1", + "jiti": "^1.17.1", + "json-to-pretty-yaml": "^1.2.2", + "listr2": "^4.0.5", + "log-symbols": "^4.0.0", + "micromatch": "^4.0.5", + "shell-quote": "^1.7.3", + "string-env-interpolation": "^1.0.1", + "ts-log": "^2.2.3", + "tslib": "^2.4.0", + "yaml": "^2.3.1", + "yargs": "^17.0.0" + }, + "bin": { + "gql-gen": "cjs/bin.js", + "graphql-code-generator": "cjs/bin.js", + "graphql-codegen": "cjs/bin.js", + "graphql-codegen-esm": "esm/bin.js" + }, + "peerDependencies": { + "@parcel/watcher": "^2.1.0", + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + }, + "peerDependenciesMeta": { + "@parcel/watcher": { + "optional": true + } + } + }, + "node_modules/@graphql-codegen/client-preset": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@graphql-codegen/client-preset/-/client-preset-4.2.4.tgz", + "integrity": "sha512-k1c8v2YxJhhITGQGxViG9asLAoop9m7X9duU7Zztqjc98ooxsUzXICfvAWsH3mLAUibXAx4Ax6BPzKsTtQmBPg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/template": "^7.20.7", + "@graphql-codegen/add": "^5.0.2", + "@graphql-codegen/gql-tag-operations": "4.0.6", + "@graphql-codegen/plugin-helpers": "^5.0.3", + "@graphql-codegen/typed-document-node": "^5.0.6", + "@graphql-codegen/typescript": "^4.0.6", + "@graphql-codegen/typescript-operations": "^4.2.0", + "@graphql-codegen/visitor-plugin-common": "^5.1.0", + "@graphql-tools/documents": "^1.0.0", + "@graphql-tools/utils": "^10.0.0", + "@graphql-typed-document-node/core": "3.2.0", + "tslib": "~2.6.0" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/core": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@graphql-codegen/core/-/core-4.0.2.tgz", + "integrity": "sha512-IZbpkhwVqgizcjNiaVzNAzm/xbWT6YnGgeOLwVjm4KbJn3V2jchVtuzHH09G5/WkkLSk2wgbXNdwjM41JxO6Eg==", + "dev": true, + "dependencies": { + "@graphql-codegen/plugin-helpers": "^5.0.3", + "@graphql-tools/schema": "^10.0.0", + "@graphql-tools/utils": "^10.0.0", + "tslib": "~2.6.0" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/gql-tag-operations": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@graphql-codegen/gql-tag-operations/-/gql-tag-operations-4.0.6.tgz", + "integrity": "sha512-y6iXEDpDNjwNxJw3WZqX1/Znj0QHW7+y8O+t2V8qvbTT+3kb2lr9ntc8By7vCr6ctw9tXI4XKaJgpTstJDOwFA==", + "dev": true, + "dependencies": { + "@graphql-codegen/plugin-helpers": "^5.0.3", + "@graphql-codegen/visitor-plugin-common": "5.1.0", + "@graphql-tools/utils": "^10.0.0", + "auto-bind": "~4.0.0", + "tslib": "~2.6.0" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/plugin-helpers": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-5.0.4.tgz", + "integrity": "sha512-MOIuHFNWUnFnqVmiXtrI+4UziMTYrcquljaI5f/T/Bc7oO7sXcfkAvgkNWEEi9xWreYwvuer3VHCuPI/lAFWbw==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^10.0.0", + "change-case-all": "1.0.15", + "common-tags": "1.8.2", + "import-from": "4.0.0", + "lodash": "~4.17.0", + "tslib": "~2.6.0" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/schema-ast": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@graphql-codegen/schema-ast/-/schema-ast-4.0.2.tgz", + "integrity": "sha512-5mVAOQQK3Oz7EtMl/l3vOQdc2aYClUzVDHHkMvZlunc+KlGgl81j8TLa+X7ANIllqU4fUEsQU3lJmk4hXP6K7Q==", + "dev": true, + "dependencies": { + "@graphql-codegen/plugin-helpers": "^5.0.3", + "@graphql-tools/utils": "^10.0.0", + "tslib": "~2.6.0" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/typed-document-node": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@graphql-codegen/typed-document-node/-/typed-document-node-5.0.6.tgz", + "integrity": "sha512-US0J95hOE2/W/h42w4oiY+DFKG7IetEN1mQMgXXeat1w6FAR5PlIz4JrRrEkiVfVetZ1g7K78SOwBD8/IJnDiA==", + "dev": true, + "dependencies": { + "@graphql-codegen/plugin-helpers": "^5.0.3", + "@graphql-codegen/visitor-plugin-common": "5.1.0", + "auto-bind": "~4.0.0", + "change-case-all": "1.0.15", + "tslib": "~2.6.0" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/typescript": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript/-/typescript-4.0.9.tgz", + "integrity": "sha512-0O35DMR4d/ctuHL1Zo6mRUUzp0BoszKfeWsa6sCm/g70+S98+hEfTwZNDkQHylLxapiyjssF9uw/F+sXqejqLw==", + "dev": true, + "dependencies": { + "@graphql-codegen/plugin-helpers": "^5.0.4", + "@graphql-codegen/schema-ast": "^4.0.2", + "@graphql-codegen/visitor-plugin-common": "5.3.1", + "auto-bind": "~4.0.0", + "tslib": "~2.6.0" + }, + "peerDependencies": { + "graphql": "^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/typescript-operations": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript-operations/-/typescript-operations-4.2.0.tgz", + "integrity": "sha512-lmuwYb03XC7LNRS8oo9M4/vlOrq/wOKmTLBHlltK2YJ1BO/4K/Q9Jdv/jDmJpNydHVR1fmeF4wAfsIp1f9JibA==", + "dev": true, + "dependencies": { + "@graphql-codegen/plugin-helpers": "^5.0.3", + "@graphql-codegen/typescript": "^4.0.6", + "@graphql-codegen/visitor-plugin-common": "5.1.0", + "auto-bind": "~4.0.0", + "tslib": "~2.6.0" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/typescript-resolvers": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript-resolvers/-/typescript-resolvers-4.2.1.tgz", + "integrity": "sha512-q/ggqNSKNGG9bn49DdZrw2KokagDZmzl1EpxIfzmpHrPa3XaCLfxQuNNEUhqEXtJzQZtLfuYvGy1y+MrTU8WnA==", + "dev": true, + "dependencies": { + "@graphql-codegen/plugin-helpers": "^5.0.4", + "@graphql-codegen/typescript": "^4.0.9", + "@graphql-codegen/visitor-plugin-common": "5.3.1", + "@graphql-tools/utils": "^10.0.0", + "auto-bind": "~4.0.0", + "tslib": "~2.6.0" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/typescript-resolvers/node_modules/@graphql-codegen/visitor-plugin-common": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-5.3.1.tgz", + "integrity": "sha512-MktoBdNZhSmugiDjmFl1z6rEUUaqyxtFJYWnDilE7onkPgyw//O0M+TuPBJPBWdyV6J2ond0Hdqtq+rkghgSIQ==", + "dev": true, + "dependencies": { + "@graphql-codegen/plugin-helpers": "^5.0.4", + "@graphql-tools/optimize": "^2.0.0", + "@graphql-tools/relay-operation-optimizer": "^7.0.0", + "@graphql-tools/utils": "^10.0.0", + "auto-bind": "~4.0.0", + "change-case-all": "1.0.15", + "dependency-graph": "^0.11.0", + "graphql-tag": "^2.11.0", + "parse-filepath": "^1.0.2", + "tslib": "~2.6.0" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/typescript/node_modules/@graphql-codegen/visitor-plugin-common": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-5.3.1.tgz", + "integrity": "sha512-MktoBdNZhSmugiDjmFl1z6rEUUaqyxtFJYWnDilE7onkPgyw//O0M+TuPBJPBWdyV6J2ond0Hdqtq+rkghgSIQ==", + "dev": true, + "dependencies": { + "@graphql-codegen/plugin-helpers": "^5.0.4", + "@graphql-tools/optimize": "^2.0.0", + "@graphql-tools/relay-operation-optimizer": "^7.0.0", + "@graphql-tools/utils": "^10.0.0", + "auto-bind": "~4.0.0", + "change-case-all": "1.0.15", + "dependency-graph": "^0.11.0", + "graphql-tag": "^2.11.0", + "parse-filepath": "^1.0.2", + "tslib": "~2.6.0" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/visitor-plugin-common": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-5.1.0.tgz", + "integrity": "sha512-eamQxtA9bjJqI2lU5eYoA1GbdMIRT2X8m8vhWYsVQVWD3qM7sx/IqJU0kx0J3Vd4/CSd36BzL6RKwksibytDIg==", + "dev": true, + "dependencies": { + "@graphql-codegen/plugin-helpers": "^5.0.3", + "@graphql-tools/optimize": "^2.0.0", + "@graphql-tools/relay-operation-optimizer": "^7.0.0", + "@graphql-tools/utils": "^10.0.0", + "auto-bind": "~4.0.0", + "change-case-all": "1.0.15", + "dependency-graph": "^0.11.0", + "graphql-tag": "^2.11.0", + "parse-filepath": "^1.0.2", + "tslib": "~2.6.0" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-eslint/eslint-plugin": { + "version": "3.20.1", + "resolved": "https://registry.npmjs.org/@graphql-eslint/eslint-plugin/-/eslint-plugin-3.20.1.tgz", + "integrity": "sha512-RbwVlz1gcYG62sECR1u0XqMh8w5e5XMCCZoMvPQ3nJzEBCTfXLGX727GBoRmSvY1x4gJmqNZ1lsOX7lZY14RIw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@graphql-tools/code-file-loader": "^7.3.6", + "@graphql-tools/graphql-tag-pluck": "^7.3.6", + "@graphql-tools/utils": "^9.0.0", + "chalk": "^4.1.2", + "debug": "^4.3.4", + "fast-glob": "^3.2.12", + "graphql-config": "^4.4.0", + "graphql-depth-limit": "^1.1.0", + "lodash.lowercase": "^4.3.0", + "tslib": "^2.4.1" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-eslint/eslint-plugin/node_modules/@graphql-tools/batch-execute": { + "version": "8.5.22", + "resolved": "https://registry.npmjs.org/@graphql-tools/batch-execute/-/batch-execute-8.5.22.tgz", + "integrity": "sha512-hcV1JaY6NJQFQEwCKrYhpfLK8frSXDbtNMoTur98u10Cmecy1zrqNKSqhEyGetpgHxaJRqszGzKeI3RuroDN6A==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^9.2.1", + "dataloader": "^2.2.2", + "tslib": "^2.4.0", + "value-or-promise": "^1.0.12" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-eslint/eslint-plugin/node_modules/@graphql-tools/code-file-loader": { + "version": "7.3.23", + "resolved": "https://registry.npmjs.org/@graphql-tools/code-file-loader/-/code-file-loader-7.3.23.tgz", + "integrity": "sha512-8Wt1rTtyTEs0p47uzsPJ1vAtfAx0jmxPifiNdmo9EOCuUPyQGEbMaik/YkqZ7QUFIEYEQu+Vgfo8tElwOPtx5Q==", + "dev": true, + "dependencies": { + "@graphql-tools/graphql-tag-pluck": "7.5.2", + "@graphql-tools/utils": "^9.2.1", + "globby": "^11.0.3", + "tslib": "^2.4.0", + "unixify": "^1.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-eslint/eslint-plugin/node_modules/@graphql-tools/delegate": { + "version": "9.0.35", + "resolved": "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-9.0.35.tgz", + "integrity": "sha512-jwPu8NJbzRRMqi4Vp/5QX1vIUeUPpWmlQpOkXQD2r1X45YsVceyUUBnktCrlJlDB4jPRVy7JQGwmYo3KFiOBMA==", + "dev": true, + "dependencies": { + "@graphql-tools/batch-execute": "^8.5.22", + "@graphql-tools/executor": "^0.0.20", + "@graphql-tools/schema": "^9.0.19", + "@graphql-tools/utils": "^9.2.1", + "dataloader": "^2.2.2", + "tslib": "^2.5.0", + "value-or-promise": "^1.0.12" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-eslint/eslint-plugin/node_modules/@graphql-tools/executor": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor/-/executor-0.0.20.tgz", + "integrity": "sha512-GdvNc4vszmfeGvUqlcaH1FjBoguvMYzxAfT6tDd4/LgwymepHhinqLNA5otqwVLW+JETcDaK7xGENzFomuE6TA==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^9.2.1", + "@graphql-typed-document-node/core": "3.2.0", + "@repeaterjs/repeater": "^3.0.4", + "tslib": "^2.4.0", + "value-or-promise": "^1.0.12" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-eslint/eslint-plugin/node_modules/@graphql-tools/executor-graphql-ws": { + "version": "0.0.14", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-graphql-ws/-/executor-graphql-ws-0.0.14.tgz", + "integrity": "sha512-P2nlkAsPZKLIXImFhj0YTtny5NQVGSsKnhi7PzXiaHSXc6KkzqbWZHKvikD4PObanqg+7IO58rKFpGXP7eeO+w==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^9.2.1", + "@repeaterjs/repeater": "3.0.4", + "@types/ws": "^8.0.0", + "graphql-ws": "5.12.1", + "isomorphic-ws": "5.0.0", + "tslib": "^2.4.0", + "ws": "8.13.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-eslint/eslint-plugin/node_modules/@graphql-tools/executor-http": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-http/-/executor-http-0.1.10.tgz", + "integrity": "sha512-hnAfbKv0/lb9s31LhWzawQ5hghBfHS+gYWtqxME6Rl0Aufq9GltiiLBcl7OVVOnkLF0KhwgbYP1mB5VKmgTGpg==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^9.2.1", + "@repeaterjs/repeater": "^3.0.4", + "@whatwg-node/fetch": "^0.8.1", + "dset": "^3.1.2", + "extract-files": "^11.0.0", + "meros": "^1.2.1", + "tslib": "^2.4.0", + "value-or-promise": "^1.0.12" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-eslint/eslint-plugin/node_modules/@graphql-tools/executor-legacy-ws": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-legacy-ws/-/executor-legacy-ws-0.0.11.tgz", + "integrity": "sha512-4ai+NnxlNfvIQ4c70hWFvOZlSUN8lt7yc+ZsrwtNFbFPH/EroIzFMapAxM9zwyv9bH38AdO3TQxZ5zNxgBdvUw==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^9.2.1", + "@types/ws": "^8.0.0", + "isomorphic-ws": "5.0.0", + "tslib": "^2.4.0", + "ws": "8.13.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-eslint/eslint-plugin/node_modules/@graphql-tools/graphql-file-loader": { + "version": "7.5.17", + "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-file-loader/-/graphql-file-loader-7.5.17.tgz", + "integrity": "sha512-hVwwxPf41zOYgm4gdaZILCYnKB9Zap7Ys9OhY1hbwuAuC4MMNY9GpUjoTU3CQc3zUiPoYStyRtUGkHSJZ3HxBw==", + "dev": true, + "dependencies": { + "@graphql-tools/import": "6.7.18", + "@graphql-tools/utils": "^9.2.1", + "globby": "^11.0.3", + "tslib": "^2.4.0", + "unixify": "^1.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-eslint/eslint-plugin/node_modules/@graphql-tools/import": { + "version": "6.7.18", + "resolved": "https://registry.npmjs.org/@graphql-tools/import/-/import-6.7.18.tgz", + "integrity": "sha512-XQDdyZTp+FYmT7as3xRWH/x8dx0QZA2WZqfMF5EWb36a0PiH7WwlRQYIdyYXj8YCLpiWkeBXgBRHmMnwEYR8iQ==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^9.2.1", + "resolve-from": "5.0.0", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-eslint/eslint-plugin/node_modules/@graphql-tools/json-file-loader": { + "version": "7.4.18", + "resolved": "https://registry.npmjs.org/@graphql-tools/json-file-loader/-/json-file-loader-7.4.18.tgz", + "integrity": "sha512-AJ1b6Y1wiVgkwsxT5dELXhIVUPs/u3VZ8/0/oOtpcoyO/vAeM5rOvvWegzicOOnQw8G45fgBRMkkRfeuwVt6+w==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^9.2.1", + "globby": "^11.0.3", + "tslib": "^2.4.0", + "unixify": "^1.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-eslint/eslint-plugin/node_modules/@graphql-tools/load": { + "version": "7.8.14", + "resolved": "https://registry.npmjs.org/@graphql-tools/load/-/load-7.8.14.tgz", + "integrity": "sha512-ASQvP+snHMYm+FhIaLxxFgVdRaM0vrN9wW2BKInQpktwWTXVyk+yP5nQUCEGmn0RTdlPKrffBaigxepkEAJPrg==", + "dev": true, + "dependencies": { + "@graphql-tools/schema": "^9.0.18", + "@graphql-tools/utils": "^9.2.1", + "p-limit": "3.1.0", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-eslint/eslint-plugin/node_modules/@graphql-tools/merge": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-8.4.2.tgz", + "integrity": "sha512-XbrHAaj8yDuINph+sAfuq3QCZ/tKblrTLOpirK0+CAgNlZUCHs0Fa+xtMUURgwCVThLle1AF7svJCxFizygLsw==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^9.2.1", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-eslint/eslint-plugin/node_modules/@graphql-tools/schema": { + "version": "9.0.19", + "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-9.0.19.tgz", + "integrity": "sha512-oBRPoNBtCkk0zbUsyP4GaIzCt8C0aCI4ycIRUL67KK5pOHljKLBBtGT+Jr6hkzA74C8Gco8bpZPe7aWFjiaK2w==", + "dev": true, + "dependencies": { + "@graphql-tools/merge": "^8.4.1", + "@graphql-tools/utils": "^9.2.1", + "tslib": "^2.4.0", + "value-or-promise": "^1.0.12" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-eslint/eslint-plugin/node_modules/@graphql-tools/url-loader": { + "version": "7.17.18", + "resolved": "https://registry.npmjs.org/@graphql-tools/url-loader/-/url-loader-7.17.18.tgz", + "integrity": "sha512-ear0CiyTj04jCVAxi7TvgbnGDIN2HgqzXzwsfcqiVg9cvjT40NcMlZ2P1lZDgqMkZ9oyLTV8Bw6j+SyG6A+xPw==", + "dev": true, + "dependencies": { + "@ardatan/sync-fetch": "^0.0.1", + "@graphql-tools/delegate": "^9.0.31", + "@graphql-tools/executor-graphql-ws": "^0.0.14", + "@graphql-tools/executor-http": "^0.1.7", + "@graphql-tools/executor-legacy-ws": "^0.0.11", + "@graphql-tools/utils": "^9.2.1", + "@graphql-tools/wrap": "^9.4.2", + "@types/ws": "^8.0.0", + "@whatwg-node/fetch": "^0.8.0", + "isomorphic-ws": "^5.0.0", + "tslib": "^2.4.0", + "value-or-promise": "^1.0.11", + "ws": "^8.12.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-eslint/eslint-plugin/node_modules/@graphql-tools/utils": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-9.2.1.tgz", + "integrity": "sha512-WUw506Ql6xzmOORlriNrD6Ugx+HjVgYxt9KCXD9mHAak+eaXSwuGGPyE60hy9xaDEoXKBsG7SkG69ybitaVl6A==", + "dev": true, + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-eslint/eslint-plugin/node_modules/@graphql-tools/wrap": { + "version": "9.4.2", + "resolved": "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-9.4.2.tgz", + "integrity": "sha512-DFcd9r51lmcEKn0JW43CWkkI2D6T9XI1juW/Yo86i04v43O9w2/k4/nx2XTJv4Yv+iXwUw7Ok81PGltwGJSDSA==", + "dev": true, + "dependencies": { + "@graphql-tools/delegate": "^9.0.31", + "@graphql-tools/schema": "^9.0.18", + "@graphql-tools/utils": "^9.2.1", + "tslib": "^2.4.0", + "value-or-promise": "^1.0.12" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-eslint/eslint-plugin/node_modules/@repeaterjs/repeater": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@repeaterjs/repeater/-/repeater-3.0.4.tgz", + "integrity": "sha512-AW8PKd6iX3vAZ0vA43nOUOnbq/X5ihgU+mSXXqunMkeQADGiqw/PY0JNeYtD5sr0PAy51YPgAPbDoeapv9r8WA==", + "dev": true + }, + "node_modules/@graphql-eslint/eslint-plugin/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@graphql-eslint/eslint-plugin/node_modules/cosmiconfig": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.0.0.tgz", + "integrity": "sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==", + "dev": true, + "dependencies": { + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@graphql-eslint/eslint-plugin/node_modules/graphql-config": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/graphql-config/-/graphql-config-4.5.0.tgz", + "integrity": "sha512-x6D0/cftpLUJ0Ch1e5sj1TZn6Wcxx4oMfmhaG9shM0DKajA9iR+j1z86GSTQ19fShbGvrSSvbIQsHku6aQ6BBw==", + "dev": true, + "dependencies": { + "@graphql-tools/graphql-file-loader": "^7.3.7", + "@graphql-tools/json-file-loader": "^7.3.7", + "@graphql-tools/load": "^7.5.5", + "@graphql-tools/merge": "^8.2.6", + "@graphql-tools/url-loader": "^7.9.7", + "@graphql-tools/utils": "^9.0.0", + "cosmiconfig": "8.0.0", + "jiti": "1.17.1", + "minimatch": "4.2.3", + "string-env-interpolation": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "cosmiconfig-toml-loader": "^1.0.0", + "graphql": "^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + }, + "peerDependenciesMeta": { + "cosmiconfig-toml-loader": { + "optional": true + } + } + }, + "node_modules/@graphql-eslint/eslint-plugin/node_modules/graphql-ws": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/graphql-ws/-/graphql-ws-5.12.1.tgz", + "integrity": "sha512-umt4f5NnMK46ChM2coO36PTFhHouBrK9stWWBczERguwYrGnPNxJ9dimU6IyOBfOkC6Izhkg4H8+F51W/8CYDg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "graphql": ">=0.11 <=16" + } + }, + "node_modules/@graphql-eslint/eslint-plugin/node_modules/jiti": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.17.1.tgz", + "integrity": "sha512-NZIITw8uZQFuzQimqjUxIrIcEdxYDFIe/0xYfIlVXTkiBjjyBEvgasj5bb0/cHtPRD/NziPbT312sFrkI5ALpw==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/@graphql-eslint/eslint-plugin/node_modules/minimatch": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.3.tgz", + "integrity": "sha512-lIUdtK5hdofgCTu3aT0sOaHsYR37viUuIc0rwnnDXImbwFRcumyLMeZaM0t0I/fgxS6s6JMfu0rLD1Wz9pv1ng==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@graphql-eslint/eslint-plugin/node_modules/ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/@graphql-inspector/audit-command": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@graphql-inspector/audit-command/-/audit-command-5.0.6.tgz", + "integrity": "sha512-XfQIKoQj9TTNjEQOKUzTXVhjdJ97zJAqQi4M17OiYKsS8HpiSTmbPEzs+3GcJ/B3OZz+BtW4Oh0OGHTgImDzuw==", + "dependencies": { + "@graphql-inspector/commands": "5.0.4", + "@graphql-inspector/core": "6.1.0", + "@graphql-inspector/logger": "5.0.1", + "@graphql-tools/utils": "10.2.1", + "cli-table3": "0.6.3", + "tslib": "2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-inspector/audit-command/node_modules/@graphql-tools/utils": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.2.1.tgz", + "integrity": "sha512-U8OMdkkEt3Vp3uYHU2pMc6mwId7axVAcSSmcqJcUmWNPqY2pfee5O655ybTI2kNPWAe58Zu6gLu4Oi4QT4BgWA==", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "cross-inspect": "1.0.0", + "dset": "^3.1.2", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-inspector/cli": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@graphql-inspector/cli/-/cli-5.0.6.tgz", + "integrity": "sha512-yawOs8fY9AC6eBeeH1CNw1DyAQmBe9dNvAMjS+bG1k9haSn7erzfeWWkoPbqYcFty6FWLlHwVwA00nfpOdJhzQ==", + "dependencies": { + "@babel/core": "7.24.6", + "@graphql-inspector/audit-command": "5.0.6", + "@graphql-inspector/code-loader": "5.0.1", + "@graphql-inspector/commands": "5.0.4", + "@graphql-inspector/config": "4.0.2", + "@graphql-inspector/coverage-command": "6.1.0", + "@graphql-inspector/diff-command": "5.0.6", + "@graphql-inspector/docs-command": "5.0.4", + "@graphql-inspector/git-loader": "5.0.1", + "@graphql-inspector/github-loader": "5.0.1", + "@graphql-inspector/graphql-loader": "5.0.1", + "@graphql-inspector/introspect-command": "5.0.6", + "@graphql-inspector/json-loader": "5.0.1", + "@graphql-inspector/loaders": "4.0.5", + "@graphql-inspector/serve-command": "5.0.5", + "@graphql-inspector/similar-command": "5.0.6", + "@graphql-inspector/url-loader": "5.0.1", + "@graphql-inspector/validate-command": "5.0.6", + "tslib": "2.6.2", + "yargs": "17.7.2" + }, + "bin": { + "graphql-inspector": "cjs/index.js" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-inspector/code-loader": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@graphql-inspector/code-loader/-/code-loader-5.0.1.tgz", + "integrity": "sha512-kdyP76g0QrtOFRda67+aNshSf0PXYyGJLiGxoVBogpAbkzDRhZQZAsdQVKP0tdEQAn4w0zN6VBdmpF/PAeBO5A==", + "dependencies": { + "@graphql-tools/code-file-loader": "8.1.2", + "tslib": "2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-inspector/commands": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@graphql-inspector/commands/-/commands-5.0.4.tgz", + "integrity": "sha512-m6SzYxjkKhor7pV33r1FSL2Wq/epzeWDE1cfPT/eFJ4qKavTBcglr+Vpien6PK1a2vy69GhviFhMoJEakrlZMA==", + "dependencies": { + "tslib": "2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@graphql-inspector/config": "^4.0.0", + "@graphql-inspector/loaders": "^4.0.0", + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0", + "yargs": "17.7.2" + } + }, + "node_modules/@graphql-inspector/config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@graphql-inspector/config/-/config-4.0.2.tgz", + "integrity": "sha512-fnIwVpGM5AtTr4XyV8NJkDnwpXxZSBzi3BopjuXwBPXXD1F3tcVkCKNT6/5WgUQGfNPskBVbitcOPtM4hIYAOQ==", + "dependencies": { + "tslib": "2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-inspector/core": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@graphql-inspector/core/-/core-6.1.0.tgz", + "integrity": "sha512-5/kqD5330duUsfMBfhMc0iVld76JwSKTkKi7aOr1x9MvSnP8p1anQo7BCNZ5VY9+EvWn4njHbkNfdS/lrqsi+A==", + "dependencies": { + "dependency-graph": "1.0.0", + "object-inspect": "1.13.1", + "tslib": "2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-inspector/core/node_modules/dependency-graph": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-1.0.0.tgz", + "integrity": "sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@graphql-inspector/coverage-command": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@graphql-inspector/coverage-command/-/coverage-command-6.1.0.tgz", + "integrity": "sha512-c5/nERSACMkVkjlKF6ggUwI4nuKTyO991fqQiM9Dm36Heahu1BsH5BjtHWY6zlOg5b7e0v7X0+wqsLjNUsYGEA==", + "dependencies": { + "@graphql-inspector/commands": "5.0.4", + "@graphql-inspector/core": "6.1.0", + "@graphql-inspector/logger": "5.0.1", + "@graphql-tools/utils": "10.2.1", + "tslib": "2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-inspector/coverage-command/node_modules/@graphql-tools/utils": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.2.1.tgz", + "integrity": "sha512-U8OMdkkEt3Vp3uYHU2pMc6mwId7axVAcSSmcqJcUmWNPqY2pfee5O655ybTI2kNPWAe58Zu6gLu4Oi4QT4BgWA==", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "cross-inspect": "1.0.0", + "dset": "^3.1.2", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-inspector/diff-command": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@graphql-inspector/diff-command/-/diff-command-5.0.6.tgz", + "integrity": "sha512-DmFfOM5QHQphBvPyyRNmei1IY9DvoqySd/D3iV7/1iOBnFxNkljM8jqbUGe+jZfcrDdM9DRYJseb5d0atSXBRQ==", + "dependencies": { + "@graphql-inspector/commands": "5.0.4", + "@graphql-inspector/core": "6.1.0", + "@graphql-inspector/logger": "5.0.1", + "tslib": "2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-inspector/docs-command": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@graphql-inspector/docs-command/-/docs-command-5.0.4.tgz", + "integrity": "sha512-NTQRWYzGNJy4Bnd+0NHNjOdgaETEUG112W+Nei/tPCRTs0Vi/UiW+UkGsQ3KxJozEkwgN8od39bVWohGTOPcpA==", + "dependencies": { + "@graphql-inspector/commands": "5.0.4", + "open": "8.4.2", + "tslib": "2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-inspector/git-loader": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@graphql-inspector/git-loader/-/git-loader-5.0.1.tgz", + "integrity": "sha512-eZFNU/y1z4sZ9Axu8mB/J7mW+e78JnWgXG2vcT1TT2E1uzFm0x2oNONM2lgLCZGEJuwQDEnreok5CoHumIdE4Q==", + "dependencies": { + "@graphql-tools/git-loader": "8.0.6", + "tslib": "2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-inspector/github-loader": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@graphql-inspector/github-loader/-/github-loader-5.0.1.tgz", + "integrity": "sha512-CDsY4V1pEDzr5z5FlYTxcPa/7pKsuT/6xQmo1JghHQuYQPZ5TjtGsyNZwgQOjISMCw7pknXfifPBrFQKt6IOEA==", + "dependencies": { + "@graphql-tools/github-loader": "8.0.1", + "tslib": "2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-inspector/graphql-loader": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@graphql-inspector/graphql-loader/-/graphql-loader-5.0.1.tgz", + "integrity": "sha512-VZIcbkMhgak3sW4GehVIX/Qnwu1TmQidvaWs8YUiT+czPxKK1rqY/c/G3arwQDtqAdPMx8IwY1bT83ykfIyxfg==", + "dependencies": { + "@graphql-tools/graphql-file-loader": "8.0.1", + "tslib": "2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-inspector/introspect-command": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@graphql-inspector/introspect-command/-/introspect-command-5.0.6.tgz", + "integrity": "sha512-qtYZLObzezNR5aS1qFeECwcK+MQGWDDywI3UzSKKtTLfoQJTAv3ECoo9PZxGFC2aEmZAKTEfkFICkbE9OCHu/w==", + "dependencies": { + "@graphql-inspector/commands": "5.0.4", + "@graphql-inspector/core": "6.1.0", + "@graphql-inspector/logger": "5.0.1", + "tslib": "2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-inspector/json-loader": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@graphql-inspector/json-loader/-/json-loader-5.0.1.tgz", + "integrity": "sha512-ql5zI2E/RNgLKDJ2HilTds2lUTv8ZXQfY5HG29iia85q/CIFslVTDbhzhbXRqmz4jsLd3KCi1LxpAeYQQMhCSQ==", + "dependencies": { + "@graphql-tools/json-file-loader": "8.0.1", + "tslib": "2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-inspector/loaders": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@graphql-inspector/loaders/-/loaders-4.0.5.tgz", + "integrity": "sha512-MQj82Pbo4YVgS1E3IjVvP3ByLQKQ6HHrjK+S21szXx46cKPxlc+MeKHpjfERSCmbdKAinP0MMHxVrmk7hyktow==", + "dependencies": { + "@graphql-tools/code-file-loader": "8.1.2", + "@graphql-tools/load": "8.0.2", + "@graphql-tools/utils": "10.2.1", + "tslib": "2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@graphql-inspector/config": "^4.0.0", + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-inspector/loaders/node_modules/@graphql-tools/utils": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.2.1.tgz", + "integrity": "sha512-U8OMdkkEt3Vp3uYHU2pMc6mwId7axVAcSSmcqJcUmWNPqY2pfee5O655ybTI2kNPWAe58Zu6gLu4Oi4QT4BgWA==", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "cross-inspect": "1.0.0", + "dset": "^3.1.2", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-inspector/logger": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@graphql-inspector/logger/-/logger-5.0.1.tgz", + "integrity": "sha512-rEo+HoQt+qjdayy7p5vcR9GeGTdKXmN0LbIm3W+jKKoXeAMlV4zHxnOW6jEhO6E0eVQxf8Sc1TlcH78i2P2a9w==", + "dependencies": { + "chalk": "4.1.2", + "figures": "3.2.0", + "log-symbols": "4.1.0", + "std-env": "3.7.0", + "tslib": "2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@graphql-inspector/serve-command": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@graphql-inspector/serve-command/-/serve-command-5.0.5.tgz", + "integrity": "sha512-dWAg51LHrXoZb5NqE/G/nTaeJ2FrQJZc+mCz6l3fTBL6pU6szyMx4+Cxq+JmGCJVD71N4Fh+h9B4psDpnOFtBQ==", + "dependencies": { + "@graphql-inspector/commands": "5.0.4", + "@graphql-inspector/logger": "5.0.1", + "graphql-yoga": "5.3.1", + "open": "8.4.2", + "tslib": "2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-inspector/similar-command": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@graphql-inspector/similar-command/-/similar-command-5.0.6.tgz", + "integrity": "sha512-40SaZtxIXEZ0V/EkiG6N2in+PSeVoVcwmtl1ETbysGXZ6xC9Fu+Qi0lE7lbKWKjzw5nv9hYpznDJ1oIsBuN+hQ==", + "dependencies": { + "@graphql-inspector/commands": "5.0.4", + "@graphql-inspector/core": "6.1.0", + "@graphql-inspector/logger": "5.0.1", + "tslib": "2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-inspector/url-loader": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@graphql-inspector/url-loader/-/url-loader-5.0.1.tgz", + "integrity": "sha512-7OPJfTJgqptJyfsrpntsn3GEMpSZWxkJO+KaMIZfqDsiWN/zyvNqB0Amogi3d7xxtU1fnB3NCN5VWCFuiRSPXg==", + "dependencies": { + "@graphql-tools/url-loader": "8.0.2", + "tslib": "2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-inspector/validate-command": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@graphql-inspector/validate-command/-/validate-command-5.0.6.tgz", + "integrity": "sha512-SO4esOmsdUEueGA2kMjsoXSrvQrtZnJF7wKhcUwJrxIBm8aHf1V5wtorAk4ajIzhlD6a5Yd35GHI9hbjXnIZuQ==", + "dependencies": { + "@graphql-inspector/commands": "5.0.4", + "@graphql-inspector/core": "6.1.0", + "@graphql-inspector/logger": "5.0.1", + "@graphql-tools/utils": "10.2.1", + "tslib": "2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-inspector/validate-command/node_modules/@graphql-tools/utils": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.2.1.tgz", + "integrity": "sha512-U8OMdkkEt3Vp3uYHU2pMc6mwId7axVAcSSmcqJcUmWNPqY2pfee5O655ybTI2kNPWAe58Zu6gLu4Oi4QT4BgWA==", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "cross-inspect": "1.0.0", + "dset": "^3.1.2", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/apollo-engine-loader": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/apollo-engine-loader/-/apollo-engine-loader-8.0.1.tgz", + "integrity": "sha512-NaPeVjtrfbPXcl+MLQCJLWtqe2/E4bbAqcauEOQ+3sizw1Fc2CNmhHRF8a6W4D0ekvTRRXAMptXYgA2uConbrA==", + "dev": true, + "dependencies": { + "@ardatan/sync-fetch": "^0.0.1", + "@graphql-tools/utils": "^10.0.13", + "@whatwg-node/fetch": "^0.9.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/apollo-engine-loader/node_modules/@whatwg-node/events": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@whatwg-node/events/-/events-0.1.1.tgz", + "integrity": "sha512-AyQEn5hIPV7Ze+xFoXVU3QTHXVbWPrzaOkxtENMPMuNL6VVHrp4hHfDt9nrQpjO7BgvuM95dMtkycX5M/DZR3w==", + "dev": true, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@graphql-tools/apollo-engine-loader/node_modules/@whatwg-node/fetch": { + "version": "0.9.17", + "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.9.17.tgz", + "integrity": "sha512-TDYP3CpCrxwxpiNY0UMNf096H5Ihf67BK1iKGegQl5u9SlpEDYrvnV71gWBGJm+Xm31qOy8ATgma9rm8Pe7/5Q==", + "dev": true, + "dependencies": { + "@whatwg-node/node-fetch": "^0.5.7", + "urlpattern-polyfill": "^10.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@graphql-tools/apollo-engine-loader/node_modules/@whatwg-node/node-fetch": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.5.10.tgz", + "integrity": "sha512-KIAHepie/T1PRkUfze4t+bPlyvpxlWiXTPtcGlbIZ0vWkBJMdRmCg4ZrJ2y4XaO1eTPo1HlWYUuj1WvoIpumqg==", + "dev": true, + "dependencies": { + "@kamilkisiela/fast-url-parser": "^1.1.4", + "@whatwg-node/events": "^0.1.0", + "busboy": "^1.6.0", + "fast-querystring": "^1.1.1", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@graphql-tools/apollo-engine-loader/node_modules/urlpattern-polyfill": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", + "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==", + "dev": true + }, + "node_modules/@graphql-tools/batch-execute": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@graphql-tools/batch-execute/-/batch-execute-9.0.4.tgz", + "integrity": "sha512-kkebDLXgDrep5Y0gK1RN3DMUlLqNhg60OAz0lTCqrYeja6DshxLtLkj+zV4mVbBA4mQOEoBmw6g1LZs3dA84/w==", + "dependencies": { + "@graphql-tools/utils": "^10.0.13", + "dataloader": "^2.2.2", + "tslib": "^2.4.0", + "value-or-promise": "^1.0.12" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/code-file-loader": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/@graphql-tools/code-file-loader/-/code-file-loader-8.1.2.tgz", + "integrity": "sha512-GrLzwl1QV2PT4X4TEEfuTmZYzIZHLqoTGBjczdUzSqgCCcqwWzLB3qrJxFQfI8e5s1qZ1bhpsO9NoMn7tvpmyA==", + "dependencies": { + "@graphql-tools/graphql-tag-pluck": "8.3.1", + "@graphql-tools/utils": "^10.0.13", + "globby": "^11.0.3", + "tslib": "^2.4.0", + "unixify": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/code-file-loader/node_modules/@graphql-tools/graphql-tag-pluck": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-8.3.1.tgz", + "integrity": "sha512-ujits9tMqtWQQq4FI4+qnVPpJvSEn7ogKtyN/gfNT+ErIn6z1e4gyVGQpTK5sgAUXq1lW4gU/5fkFFC5/sL2rQ==", + "dependencies": { + "@babel/core": "^7.22.9", + "@babel/parser": "^7.16.8", + "@babel/plugin-syntax-import-assertions": "^7.20.0", + "@babel/traverse": "^7.16.8", + "@babel/types": "^7.16.8", + "@graphql-tools/utils": "^10.0.13", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/delegate": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-10.0.4.tgz", + "integrity": "sha512-WswZRbQZMh/ebhc8zSomK9DIh6Pd5KbuiMsyiKkKz37TWTrlCOe+4C/fyrBFez30ksq6oFyCeSKMwfrCbeGo0Q==", + "dependencies": { + "@graphql-tools/batch-execute": "^9.0.4", + "@graphql-tools/executor": "^1.2.1", + "@graphql-tools/schema": "^10.0.3", + "@graphql-tools/utils": "^10.0.13", + "dataloader": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/documents": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/documents/-/documents-1.0.0.tgz", + "integrity": "sha512-rHGjX1vg/nZ2DKqRGfDPNC55CWZBMldEVcH+91BThRa6JeT80NqXknffLLEZLRUxyikCfkwMsk6xR3UNMqG0Rg==", + "dev": true, + "dependencies": { + "lodash.sortby": "^4.7.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/executor": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor/-/executor-1.2.6.tgz", + "integrity": "sha512-+1kjfqzM5T2R+dCw7F4vdJ3CqG+fY/LYJyhNiWEFtq0ToLwYzR/KKyD8YuzTirEjSxWTVlcBh7endkx5n5F6ew==", + "dependencies": { + "@graphql-tools/utils": "^10.1.1", + "@graphql-typed-document-node/core": "3.2.0", + "@repeaterjs/repeater": "^3.0.4", + "tslib": "^2.4.0", + "value-or-promise": "^1.0.12" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/executor-graphql-ws": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-graphql-ws/-/executor-graphql-ws-1.1.2.tgz", + "integrity": "sha512-+9ZK0rychTH1LUv4iZqJ4ESbmULJMTsv3XlFooPUngpxZkk00q6LqHKJRrsLErmQrVaC7cwQCaRBJa0teK17Lg==", + "dependencies": { + "@graphql-tools/utils": "^10.0.13", + "@types/ws": "^8.0.0", + "graphql-ws": "^5.14.0", + "isomorphic-ws": "^5.0.0", + "tslib": "^2.4.0", + "ws": "^8.13.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/executor-http": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-http/-/executor-http-1.0.9.tgz", + "integrity": "sha512-+NXaZd2MWbbrWHqU4EhXcrDbogeiCDmEbrAN+rMn4Nu2okDjn2MTFDbTIab87oEubQCH4Te1wDkWPKrzXup7+Q==", + "dependencies": { + "@graphql-tools/utils": "^10.0.13", + "@repeaterjs/repeater": "^3.0.4", + "@whatwg-node/fetch": "^0.9.0", + "extract-files": "^11.0.0", + "meros": "^1.2.1", + "tslib": "^2.4.0", + "value-or-promise": "^1.0.12" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/executor-http/node_modules/@whatwg-node/events": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@whatwg-node/events/-/events-0.1.1.tgz", + "integrity": "sha512-AyQEn5hIPV7Ze+xFoXVU3QTHXVbWPrzaOkxtENMPMuNL6VVHrp4hHfDt9nrQpjO7BgvuM95dMtkycX5M/DZR3w==", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@graphql-tools/executor-http/node_modules/@whatwg-node/fetch": { + "version": "0.9.17", + "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.9.17.tgz", + "integrity": "sha512-TDYP3CpCrxwxpiNY0UMNf096H5Ihf67BK1iKGegQl5u9SlpEDYrvnV71gWBGJm+Xm31qOy8ATgma9rm8Pe7/5Q==", + "dependencies": { + "@whatwg-node/node-fetch": "^0.5.7", + "urlpattern-polyfill": "^10.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@graphql-tools/executor-http/node_modules/@whatwg-node/node-fetch": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.5.10.tgz", + "integrity": "sha512-KIAHepie/T1PRkUfze4t+bPlyvpxlWiXTPtcGlbIZ0vWkBJMdRmCg4ZrJ2y4XaO1eTPo1HlWYUuj1WvoIpumqg==", + "dependencies": { + "@kamilkisiela/fast-url-parser": "^1.1.4", + "@whatwg-node/events": "^0.1.0", + "busboy": "^1.6.0", + "fast-querystring": "^1.1.1", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@graphql-tools/executor-http/node_modules/urlpattern-polyfill": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", + "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==" + }, + "node_modules/@graphql-tools/executor-legacy-ws": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-legacy-ws/-/executor-legacy-ws-1.0.6.tgz", + "integrity": "sha512-lDSxz9VyyquOrvSuCCnld3256Hmd+QI2lkmkEv7d4mdzkxkK4ddAWW1geQiWrQvWmdsmcnGGlZ7gDGbhEExwqg==", + "dependencies": { + "@graphql-tools/utils": "^10.0.13", + "@types/ws": "^8.0.0", + "isomorphic-ws": "^5.0.0", + "tslib": "^2.4.0", + "ws": "^8.15.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/git-loader": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/git-loader/-/git-loader-8.0.6.tgz", + "integrity": "sha512-FQFO4H5wHAmHVyuUQrjvPE8re3qJXt50TWHuzrK3dEaief7JosmlnkLMDMbMBwtwITz9u1Wpl6doPhT2GwKtlw==", + "dependencies": { + "@graphql-tools/graphql-tag-pluck": "8.3.1", + "@graphql-tools/utils": "^10.0.13", + "is-glob": "4.0.3", + "micromatch": "^4.0.4", + "tslib": "^2.4.0", + "unixify": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/git-loader/node_modules/@graphql-tools/graphql-tag-pluck": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-8.3.1.tgz", + "integrity": "sha512-ujits9tMqtWQQq4FI4+qnVPpJvSEn7ogKtyN/gfNT+ErIn6z1e4gyVGQpTK5sgAUXq1lW4gU/5fkFFC5/sL2rQ==", + "dependencies": { + "@babel/core": "^7.22.9", + "@babel/parser": "^7.16.8", + "@babel/plugin-syntax-import-assertions": "^7.20.0", + "@babel/traverse": "^7.16.8", + "@babel/types": "^7.16.8", + "@graphql-tools/utils": "^10.0.13", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/github-loader": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/github-loader/-/github-loader-8.0.1.tgz", + "integrity": "sha512-W4dFLQJ5GtKGltvh/u1apWRFKBQOsDzFxO9cJkOYZj1VzHCpRF43uLST4VbCfWve+AwBqOuKr7YgkHoxpRMkcg==", + "dependencies": { + "@ardatan/sync-fetch": "^0.0.1", + "@graphql-tools/executor-http": "^1.0.9", + "@graphql-tools/graphql-tag-pluck": "^8.0.0", + "@graphql-tools/utils": "^10.0.13", + "@whatwg-node/fetch": "^0.9.0", + "tslib": "^2.4.0", + "value-or-promise": "^1.0.12" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/github-loader/node_modules/@graphql-tools/graphql-tag-pluck": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-8.3.0.tgz", + "integrity": "sha512-gNqukC+s7iHC7vQZmx1SEJQmLnOguBq+aqE2zV2+o1hxkExvKqyFli1SY/9gmukFIKpKutCIj+8yLOM+jARutw==", + "dependencies": { + "@babel/core": "^7.22.9", + "@babel/parser": "^7.16.8", + "@babel/plugin-syntax-import-assertions": "^7.20.0", + "@babel/traverse": "^7.16.8", + "@babel/types": "^7.16.8", + "@graphql-tools/utils": "^10.0.13", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/github-loader/node_modules/@whatwg-node/events": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@whatwg-node/events/-/events-0.1.1.tgz", + "integrity": "sha512-AyQEn5hIPV7Ze+xFoXVU3QTHXVbWPrzaOkxtENMPMuNL6VVHrp4hHfDt9nrQpjO7BgvuM95dMtkycX5M/DZR3w==", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@graphql-tools/github-loader/node_modules/@whatwg-node/fetch": { + "version": "0.9.17", + "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.9.17.tgz", + "integrity": "sha512-TDYP3CpCrxwxpiNY0UMNf096H5Ihf67BK1iKGegQl5u9SlpEDYrvnV71gWBGJm+Xm31qOy8ATgma9rm8Pe7/5Q==", + "dependencies": { + "@whatwg-node/node-fetch": "^0.5.7", + "urlpattern-polyfill": "^10.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@graphql-tools/github-loader/node_modules/@whatwg-node/node-fetch": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.5.10.tgz", + "integrity": "sha512-KIAHepie/T1PRkUfze4t+bPlyvpxlWiXTPtcGlbIZ0vWkBJMdRmCg4ZrJ2y4XaO1eTPo1HlWYUuj1WvoIpumqg==", + "dependencies": { + "@kamilkisiela/fast-url-parser": "^1.1.4", + "@whatwg-node/events": "^0.1.0", + "busboy": "^1.6.0", + "fast-querystring": "^1.1.1", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@graphql-tools/github-loader/node_modules/urlpattern-polyfill": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", + "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==" + }, + "node_modules/@graphql-tools/graphql-file-loader": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-file-loader/-/graphql-file-loader-8.0.1.tgz", + "integrity": "sha512-7gswMqWBabTSmqbaNyWSmRRpStWlcCkBc73E6NZNlh4YNuiyKOwbvSkOUYFOqFMfEL+cFsXgAvr87Vz4XrYSbA==", + "dependencies": { + "@graphql-tools/import": "7.0.1", + "@graphql-tools/utils": "^10.0.13", + "globby": "^11.0.3", + "tslib": "^2.4.0", + "unixify": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/graphql-tag-pluck": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-7.5.2.tgz", + "integrity": "sha512-RW+H8FqOOLQw0BPXaahYepVSRjuOHw+7IL8Opaa5G5uYGOBxoXR7DceyQ7BcpMgktAOOmpDNQ2WtcboChOJSRA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.16.8", + "@babel/plugin-syntax-import-assertions": "^7.20.0", + "@babel/traverse": "^7.16.8", + "@babel/types": "^7.16.8", + "@graphql-tools/utils": "^9.2.1", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/graphql-tag-pluck/node_modules/@graphql-tools/utils": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-9.2.1.tgz", + "integrity": "sha512-WUw506Ql6xzmOORlriNrD6Ugx+HjVgYxt9KCXD9mHAak+eaXSwuGGPyE60hy9xaDEoXKBsG7SkG69ybitaVl6A==", + "dev": true, + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/import": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/import/-/import-7.0.1.tgz", + "integrity": "sha512-935uAjAS8UAeXThqHfYVr4HEAp6nHJ2sximZKO1RzUTq5WoALMAhhGARl0+ecm6X+cqNUwIChJbjtaa6P/ML0w==", + "dependencies": { + "@graphql-tools/utils": "^10.0.13", + "resolve-from": "5.0.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/json-file-loader": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/json-file-loader/-/json-file-loader-8.0.1.tgz", + "integrity": "sha512-lAy2VqxDAHjVyqeJonCP6TUemrpYdDuKt25a10X6zY2Yn3iFYGnuIDQ64cv3ytyGY6KPyPB+Kp+ZfOkNDG3FQA==", + "dependencies": { + "@graphql-tools/utils": "^10.0.13", + "globby": "^11.0.3", + "tslib": "^2.4.0", + "unixify": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/load": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@graphql-tools/load/-/load-8.0.2.tgz", + "integrity": "sha512-S+E/cmyVmJ3CuCNfDuNF2EyovTwdWfQScXv/2gmvJOti2rGD8jTt9GYVzXaxhblLivQR9sBUCNZu/w7j7aXUCA==", + "dependencies": { + "@graphql-tools/schema": "^10.0.3", + "@graphql-tools/utils": "^10.0.13", + "p-limit": "3.1.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/merge": { + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-9.0.6.tgz", + "integrity": "sha512-TmkzFTFVieHnqu9mPTF6RxAQltaprpDQnM5HMTPSyMLXnJGMTvdWejV0yORKj7DW1YSi791/sUnKf8HytepBFQ==", + "dependencies": { + "@graphql-tools/utils": "^10.5.4", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/optimize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/optimize/-/optimize-2.0.0.tgz", + "integrity": "sha512-nhdT+CRGDZ+bk68ic+Jw1OZ99YCDIKYA5AlVAnBHJvMawSx9YQqQAIj4refNc1/LRieGiuWvhbG3jvPVYho0Dg==", + "dev": true, + "dependencies": { + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/prisma-loader": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@graphql-tools/prisma-loader/-/prisma-loader-8.0.3.tgz", + "integrity": "sha512-oZhxnMr3Jw2WAW1h9FIhF27xWzIB7bXWM8olz4W12oII4NiZl7VRkFw9IT50zME2Bqi9LGh9pkmMWkjvbOpl+Q==", + "dev": true, + "dependencies": { + "@graphql-tools/url-loader": "^8.0.2", + "@graphql-tools/utils": "^10.0.13", + "@types/js-yaml": "^4.0.0", + "@types/json-stable-stringify": "^1.0.32", + "@whatwg-node/fetch": "^0.9.0", + "chalk": "^4.1.0", + "debug": "^4.3.1", + "dotenv": "^16.0.0", + "graphql-request": "^6.0.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "jose": "^5.0.0", + "js-yaml": "^4.0.0", + "json-stable-stringify": "^1.0.1", + "lodash": "^4.17.20", + "scuid": "^1.1.0", + "tslib": "^2.4.0", + "yaml-ast-parser": "^0.0.43" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/prisma-loader/node_modules/@whatwg-node/events": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@whatwg-node/events/-/events-0.1.1.tgz", + "integrity": "sha512-AyQEn5hIPV7Ze+xFoXVU3QTHXVbWPrzaOkxtENMPMuNL6VVHrp4hHfDt9nrQpjO7BgvuM95dMtkycX5M/DZR3w==", + "dev": true, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@graphql-tools/prisma-loader/node_modules/@whatwg-node/fetch": { + "version": "0.9.17", + "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.9.17.tgz", + "integrity": "sha512-TDYP3CpCrxwxpiNY0UMNf096H5Ihf67BK1iKGegQl5u9SlpEDYrvnV71gWBGJm+Xm31qOy8ATgma9rm8Pe7/5Q==", + "dev": true, + "dependencies": { + "@whatwg-node/node-fetch": "^0.5.7", + "urlpattern-polyfill": "^10.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@graphql-tools/prisma-loader/node_modules/@whatwg-node/node-fetch": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.5.10.tgz", + "integrity": "sha512-KIAHepie/T1PRkUfze4t+bPlyvpxlWiXTPtcGlbIZ0vWkBJMdRmCg4ZrJ2y4XaO1eTPo1HlWYUuj1WvoIpumqg==", + "dev": true, + "dependencies": { + "@kamilkisiela/fast-url-parser": "^1.1.4", + "@whatwg-node/events": "^0.1.0", + "busboy": "^1.6.0", + "fast-querystring": "^1.1.1", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@graphql-tools/prisma-loader/node_modules/urlpattern-polyfill": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", + "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==", + "dev": true + }, + "node_modules/@graphql-tools/relay-operation-optimizer": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-7.0.1.tgz", + "integrity": "sha512-y0ZrQ/iyqWZlsS/xrJfSir3TbVYJTYmMOu4TaSz6F4FRDTQ3ie43BlKkhf04rC28pnUOS4BO9pDcAo1D30l5+A==", + "dev": true, + "dependencies": { + "@ardatan/relay-compiler": "12.0.0", + "@graphql-tools/utils": "^10.0.13", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/resolvers-composition": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/resolvers-composition/-/resolvers-composition-7.0.1.tgz", + "integrity": "sha512-EXcTi4OuGsj8UvQEleKVL4uJeOWc4MgOPK12qBCygkDMZArvBEzCa2IQ5Q9jWyCLcsNQxMXWyOm1rcQTrkJ+/w==", + "dependencies": { + "@graphql-tools/utils": "^10.0.13", + "lodash": "4.17.21", + "micromatch": "^4.0.4", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/schema": { + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-10.0.6.tgz", + "integrity": "sha512-EIJgPRGzpvDFEjVp+RF1zNNYIC36BYuIeZ514jFoJnI6IdxyVyIRDLx/ykgMdaa1pKQerpfdqDnsF4JnZoDHSQ==", + "dependencies": { + "@graphql-tools/merge": "^9.0.6", + "@graphql-tools/utils": "^10.5.4", + "tslib": "^2.4.0", + "value-or-promise": "^1.0.12" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/url-loader": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@graphql-tools/url-loader/-/url-loader-8.0.2.tgz", + "integrity": "sha512-1dKp2K8UuFn7DFo1qX5c1cyazQv2h2ICwA9esHblEqCYrgf69Nk8N7SODmsfWg94OEaI74IqMoM12t7eIGwFzQ==", + "dependencies": { + "@ardatan/sync-fetch": "^0.0.1", + "@graphql-tools/delegate": "^10.0.4", + "@graphql-tools/executor-graphql-ws": "^1.1.2", + "@graphql-tools/executor-http": "^1.0.9", + "@graphql-tools/executor-legacy-ws": "^1.0.6", + "@graphql-tools/utils": "^10.0.13", + "@graphql-tools/wrap": "^10.0.2", + "@types/ws": "^8.0.0", + "@whatwg-node/fetch": "^0.9.0", + "isomorphic-ws": "^5.0.0", + "tslib": "^2.4.0", + "value-or-promise": "^1.0.11", + "ws": "^8.12.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/url-loader/node_modules/@whatwg-node/events": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@whatwg-node/events/-/events-0.1.1.tgz", + "integrity": "sha512-AyQEn5hIPV7Ze+xFoXVU3QTHXVbWPrzaOkxtENMPMuNL6VVHrp4hHfDt9nrQpjO7BgvuM95dMtkycX5M/DZR3w==", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@graphql-tools/url-loader/node_modules/@whatwg-node/fetch": { + "version": "0.9.17", + "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.9.17.tgz", + "integrity": "sha512-TDYP3CpCrxwxpiNY0UMNf096H5Ihf67BK1iKGegQl5u9SlpEDYrvnV71gWBGJm+Xm31qOy8ATgma9rm8Pe7/5Q==", + "dependencies": { + "@whatwg-node/node-fetch": "^0.5.7", + "urlpattern-polyfill": "^10.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@graphql-tools/url-loader/node_modules/@whatwg-node/node-fetch": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.5.10.tgz", + "integrity": "sha512-KIAHepie/T1PRkUfze4t+bPlyvpxlWiXTPtcGlbIZ0vWkBJMdRmCg4ZrJ2y4XaO1eTPo1HlWYUuj1WvoIpumqg==", + "dependencies": { + "@kamilkisiela/fast-url-parser": "^1.1.4", + "@whatwg-node/events": "^0.1.0", + "busboy": "^1.6.0", + "fast-querystring": "^1.1.1", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@graphql-tools/url-loader/node_modules/urlpattern-polyfill": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", + "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==" + }, + "node_modules/@graphql-tools/utils": { + "version": "10.5.4", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.5.4.tgz", + "integrity": "sha512-XHnyCWSlg1ccsD8s0y6ugo5GZ5TpkTiFVNPSYms5G0s6Z/xTuSmiLBfeqgkfaCwLmLaQnRCmNDL2JRnqc2R5bQ==", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "cross-inspect": "1.0.1", + "dset": "^3.1.2", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/utils/node_modules/cross-inspect": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cross-inspect/-/cross-inspect-1.0.1.tgz", + "integrity": "sha512-Pcw1JTvZLSJH83iiGWt6fRcT+BjZlCDRVwYLbUcHzv/CRpB7r0MlSrGbIyQvVSNyGnbt7G4AXuyCiDR3POvZ1A==", + "dependencies": { + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@graphql-tools/wrap": { + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-10.0.5.tgz", + "integrity": "sha512-Cbr5aYjr3HkwdPvetZp1cpDWTGdD1Owgsb3z/ClzhmrboiK86EnQDxDvOJiQkDCPWE9lNBwj8Y4HfxroY0D9DQ==", + "dependencies": { + "@graphql-tools/delegate": "^10.0.4", + "@graphql-tools/schema": "^10.0.3", + "@graphql-tools/utils": "^10.1.1", + "tslib": "^2.4.0", + "value-or-promise": "^1.0.12" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-typed-document-node/core": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", + "integrity": "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==", + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-yoga/logger": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@graphql-yoga/logger/-/logger-2.0.0.tgz", + "integrity": "sha512-Mg8psdkAp+YTG1OGmvU+xa6xpsAmSir0hhr3yFYPyLNwzUj95DdIwsMpKadDj9xDpYgJcH3Hp/4JMal9DhQimA==", + "dependencies": { + "tslib": "^2.5.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@graphql-yoga/subscription": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@graphql-yoga/subscription/-/subscription-5.0.0.tgz", + "integrity": "sha512-Ri7sK8hmxd/kwaEa0YT8uqQUb2wOLsmBMxI90QDyf96lzOMJRgBuNYoEkU1pSgsgmW2glceZ96sRYfaXqwVxUw==", + "dependencies": { + "@graphql-yoga/typed-event-target": "^3.0.0", + "@repeaterjs/repeater": "^3.0.4", + "@whatwg-node/events": "^0.1.0", + "tslib": "^2.5.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@graphql-yoga/subscription/node_modules/@whatwg-node/events": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@whatwg-node/events/-/events-0.1.1.tgz", + "integrity": "sha512-AyQEn5hIPV7Ze+xFoXVU3QTHXVbWPrzaOkxtENMPMuNL6VVHrp4hHfDt9nrQpjO7BgvuM95dMtkycX5M/DZR3w==", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@graphql-yoga/typed-event-target": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@graphql-yoga/typed-event-target/-/typed-event-target-3.0.0.tgz", + "integrity": "sha512-w+liuBySifrstuHbFrHoHAEyVnDFVib+073q8AeAJ/qqJfvFvAwUPLLtNohR/WDVRgSasfXtl3dcNuVJWN+rjg==", + "dependencies": { + "@repeaterjs/repeater": "^3.0.4", + "tslib": "^2.5.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==" + }, + "node_modules/@ioredis/commands": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz", + "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==" + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@kamilkisiela/fast-url-parser": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@kamilkisiela/fast-url-parser/-/fast-url-parser-1.1.4.tgz", + "integrity": "sha512-gbkePEBupNydxCelHCESvFSFM8XPh1Zs/OAVRW/rKpEqPAl5PbOM90Si8mv9bvnR53uPD2s/FiRxdvSejpRJew==" + }, + "node_modules/@messageformat/core": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@messageformat/core/-/core-3.3.0.tgz", + "integrity": "sha512-YcXd3remTDdeMxAlbvW6oV9d/01/DZ8DHUFwSttO3LMzIZj3iO0NRw+u1xlsNNORFI+u0EQzD52ZX3+Udi0T3g==", + "dependencies": { + "@messageformat/date-skeleton": "^1.0.0", + "@messageformat/number-skeleton": "^1.0.0", + "@messageformat/parser": "^5.1.0", + "@messageformat/runtime": "^3.0.1", + "make-plural": "^7.0.0", + "safe-identifier": "^0.4.1" + } + }, + "node_modules/@messageformat/date-skeleton": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@messageformat/date-skeleton/-/date-skeleton-1.0.1.tgz", + "integrity": "sha512-jPXy8fg+WMPIgmGjxSlnGJn68h/2InfT0TNSkVx0IGXgp4ynnvYkbZ51dGWmGySEK+pBiYUttbQdu5XEqX5CRg==" + }, + "node_modules/@messageformat/number-skeleton": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@messageformat/number-skeleton/-/number-skeleton-1.2.0.tgz", + "integrity": "sha512-xsgwcL7J7WhlHJ3RNbaVgssaIwcEyFkBqxHdcdaiJzwTZAWEOD8BuUFxnxV9k5S0qHN3v/KzUpq0IUpjH1seRg==" + }, + "node_modules/@messageformat/parser": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@messageformat/parser/-/parser-5.1.0.tgz", + "integrity": "sha512-jKlkls3Gewgw6qMjKZ9SFfHUpdzEVdovKFtW1qRhJ3WI4FW5R/NnGDqr8SDGz+krWDO3ki94boMmQvGke1HwUQ==", + "dependencies": { + "moo": "^0.5.1" + } + }, + "node_modules/@messageformat/runtime": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@messageformat/runtime/-/runtime-3.0.1.tgz", + "integrity": "sha512-6RU5ol2lDtO8bD9Yxe6CZkl0DArdv0qkuoZC+ZwowU+cdRlVE1157wjCmlA5Rsf1Xc/brACnsZa5PZpEDfTFFg==", + "dependencies": { + "make-plural": "^7.0.0" + } + }, + "node_modules/@microsoft/tsdoc": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.15.0.tgz", + "integrity": "sha512-HZpPoABogPvjeJOdzCOSJsXeL/SMCBgBZMVC3X3d7YYp2gf31MfxhUoYUNwf1ERPJOnQc0wkFn9trqI6ZEdZuA==", + "dev": true + }, + "node_modules/@microsoft/tsdoc-config": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.17.0.tgz", + "integrity": "sha512-v/EYRXnCAIHxOHW+Plb6OWuUoMotxTN0GLatnpOb1xq0KuTNw/WI3pamJx/UbsoJP5k9MCw1QxvvhPcF9pH3Zg==", + "dev": true, + "dependencies": { + "@microsoft/tsdoc": "0.15.0", + "ajv": "~8.12.0", + "jju": "~1.4.0", + "resolve": "~1.22.2" + } + }, + "node_modules/@microsoft/tsdoc-config/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@microsoft/tsdoc-config/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/@mongodb-js/saslprep": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.5.tgz", + "integrity": "sha512-XLNOMH66KhJzUJNwT/qlMnS4WsNDWD5ASdyaSH3EtK+F4r/CFGa3jT4GNi4mfOitGvWXtdLgQJkQjxSVrio+jA==", + "dependencies": { + "sparse-bitfield": "^3.0.3" + } + }, + "node_modules/@mui/base": { + "version": "5.0.0-alpha.112", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.112.tgz", + "integrity": "sha512-KPwb1iYPXsV/P8uu0SNQrj7v7YU6wdN4Eccc2lZQyRDW+f6PJYjHBuFUTYKc408B98Jvs1XbC/z5MN45a2DWrQ==", + "dependencies": { + "@babel/runtime": "^7.20.7", + "@emotion/is-prop-valid": "^1.2.0", + "@mui/types": "^7.2.3", + "@mui/utils": "^5.11.2", + "@popperjs/core": "^2.11.6", + "clsx": "^1.2.1", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/core-downloads-tracker": { + "version": "5.15.14", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.14.tgz", + "integrity": "sha512-on75VMd0XqZfaQW+9pGjSNiqW+ghc5E2ZSLRBXwcXl/C4YzjfyjrLPhrEpKnR9Uym9KXBvxrhoHfPcczYHweyA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + } + }, + "node_modules/@mui/icons-material": { + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.11.0.tgz", + "integrity": "sha512-I2LaOKqO8a0xcLGtIozC9xoXjZAto5G5gh0FYUMAlbsIHNHIjn4Xrw9rvjY20vZonyiGrZNMAlAXYkY6JvhF6A==", + "dependencies": { + "@babel/runtime": "^7.20.6" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@mui/material": "^5.0.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/lab": { + "version": "5.0.0-alpha.114", + "resolved": "https://registry.npmjs.org/@mui/lab/-/lab-5.0.0-alpha.114.tgz", + "integrity": "sha512-tChDoLaJ3qcYk37GIwBL1KrCiW0gpmEY//D5z5nHWnO/mzx3axjRJZpBOBeGEvhuoO/Y3QzMz4rhTvqbGNkW0w==", + "dependencies": { + "@babel/runtime": "^7.20.7", + "@mui/base": "5.0.0-alpha.112", + "@mui/system": "^5.11.2", + "@mui/types": "^7.2.3", + "@mui/utils": "^5.11.2", + "clsx": "^1.2.1", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@mui/material": "^5.0.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material": { + "version": "5.11.2", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.11.2.tgz", + "integrity": "sha512-PeraRDsghnDLzejorfe9ps1syxlB8UrGs+UKwg9GGlndv5Tghm+9nwuibrP2TCDC14mlryF+u2WlAOYaPPMwGA==", + "dependencies": { + "@babel/runtime": "^7.20.7", + "@mui/base": "5.0.0-alpha.112", + "@mui/core-downloads-tracker": "^5.11.2", + "@mui/system": "^5.11.2", + "@mui/types": "^7.2.3", + "@mui/utils": "^5.11.2", + "@types/react-transition-group": "^4.4.5", + "clsx": "^1.2.1", + "csstype": "^3.1.1", + "prop-types": "^15.8.1", + "react-is": "^18.2.0", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/private-theming": { + "version": "5.15.14", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.14.tgz", + "integrity": "sha512-UH0EiZckOWcxiXLX3Jbb0K7rC8mxTr9L9l6QhOZxYc4r8FHUkefltV9VDGLrzCaWh30SQiJvAEd7djX3XXY6Xw==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/utils": "^5.15.14", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styled-engine": { + "version": "5.15.14", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.15.14.tgz", + "integrity": "sha512-RILkuVD8gY6PvjZjqnWhz8fu68dVkqhM5+jYWfB5yhlSQKg+2rHkmEwm75XIeAqI3qwOndK6zELK5H6Zxn4NHw==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@emotion/cache": "^11.11.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/system": { + "version": "5.15.14", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.14.tgz", + "integrity": "sha512-auXLXzUaCSSOLqJXmsAaq7P96VPRXg2Rrz6OHNV7lr+kB8lobUF+/N84Vd9C4G/wvCXYPs5TYuuGBRhcGbiBGg==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/private-theming": "^5.15.14", + "@mui/styled-engine": "^5.15.14", + "@mui/types": "^7.2.14", + "@mui/utils": "^5.15.14", + "clsx": "^2.1.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/system/node_modules/clsx": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", + "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@mui/types": { + "version": "7.2.14", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.14.tgz", + "integrity": "sha512-MZsBZ4q4HfzBsywtXgM1Ksj6HDThtiwmOKUXH1pKYISI9gAVXCNHNpo7TlGoGrBaYWZTdNoirIN7JsQcQUjmQQ==", + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "5.15.14", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.15.14.tgz", + "integrity": "sha512-0lF/7Hh/ezDv5X7Pry6enMsbYyGKjADzvHyo3Qrc/SSlTsQ1VkbDMbH0m2t3OR5iIVLwMoxwM7yGd+6FCMtTFA==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@types/prop-types": "^15.7.11", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.4.1.tgz", + "integrity": "sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==", + "dev": true, + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.4.1", + "@parcel/watcher-darwin-arm64": "2.4.1", + "@parcel/watcher-darwin-x64": "2.4.1", + "@parcel/watcher-freebsd-x64": "2.4.1", + "@parcel/watcher-linux-arm-glibc": "2.4.1", + "@parcel/watcher-linux-arm64-glibc": "2.4.1", + "@parcel/watcher-linux-arm64-musl": "2.4.1", + "@parcel/watcher-linux-x64-glibc": "2.4.1", + "@parcel/watcher-linux-x64-musl": "2.4.1", + "@parcel/watcher-win32-arm64": "2.4.1", + "@parcel/watcher-win32-ia32": "2.4.1", + "@parcel/watcher-win32-x64": "2.4.1" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.4.1.tgz", + "integrity": "sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.4.1.tgz", + "integrity": "sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.4.1.tgz", + "integrity": "sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.4.1.tgz", + "integrity": "sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.4.1.tgz", + "integrity": "sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.4.1.tgz", + "integrity": "sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.4.1.tgz", + "integrity": "sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.4.1.tgz", + "integrity": "sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.4.1.tgz", + "integrity": "sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.4.1.tgz", + "integrity": "sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.4.1.tgz", + "integrity": "sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.4.1.tgz", + "integrity": "sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@peculiar/asn1-schema": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.3.8.tgz", + "integrity": "sha512-ULB1XqHKx1WBU/tTFIA+uARuRoBVZ4pNdOA878RDrRbBfBGcSzi5HBkdScC6ZbHn8z7L8gmKCgPC1LHRrP46tA==", + "dev": true, + "dependencies": { + "asn1js": "^3.0.5", + "pvtsutils": "^1.3.5", + "tslib": "^2.6.2" + } + }, + "node_modules/@peculiar/json-schema": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.12.tgz", + "integrity": "sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==", + "dev": true, + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@peculiar/webcrypto": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.4.5.tgz", + "integrity": "sha512-oDk93QCDGdxFRM8382Zdminzs44dg3M2+E5Np+JWkpqLDyJC9DviMh8F8mEJkYuUcUOGA5jHO5AJJ10MFWdbZw==", + "dev": true, + "dependencies": { + "@peculiar/asn1-schema": "^2.3.8", + "@peculiar/json-schema": "^1.1.12", + "pvtsutils": "^1.3.5", + "tslib": "^2.6.2", + "webcrypto-core": "^1.7.8" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pm2/agent": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@pm2/agent/-/agent-2.0.3.tgz", + "integrity": "sha512-xkqqCoTf5VsciMqN0vb9jthW7olVAi4KRFNddCc7ZkeJZ3i8QwZANr4NSH2H5DvseRFHq7MiPspRY/EWAFWWTg==", + "dependencies": { + "async": "~3.2.0", + "chalk": "~3.0.0", + "dayjs": "~1.8.24", + "debug": "~4.3.1", + "eventemitter2": "~5.0.1", + "fast-json-patch": "^3.0.0-1", + "fclone": "~1.0.11", + "nssocket": "0.6.0", + "pm2-axon": "~4.0.1", + "pm2-axon-rpc": "~0.7.0", + "proxy-agent": "~6.3.0", + "semver": "~7.5.0", + "ws": "~7.4.0" + } + }, + "node_modules/@pm2/agent/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@pm2/agent/node_modules/dayjs": { + "version": "1.8.36", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.8.36.tgz", + "integrity": "sha512-3VmRXEtw7RZKAf+4Tv1Ym9AGeo8r8+CjDi26x+7SYQil1UqtqdaokhzoEJohqlzt0m5kacJSDhJQkG/LWhpRBw==" + }, + "node_modules/@pm2/agent/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@pm2/agent/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@pm2/agent/node_modules/ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/@pm2/io": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@pm2/io/-/io-6.0.0.tgz", + "integrity": "sha512-sKUEgZoQ5/jRwTyMB1I7u2wXL6dG0j/F/M4ANJ7dJCApfW8nWC0RElMW2siEKvZ79iplIPAaWV27oyBoerEflw==", + "dependencies": { + "async": "~2.6.1", + "debug": "~4.3.1", + "eventemitter2": "^6.3.1", + "require-in-the-middle": "^5.0.0", + "semver": "~7.5.4", + "shimmer": "^1.2.0", + "signal-exit": "^3.0.3", + "tslib": "1.9.3" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/@pm2/io/node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/@pm2/io/node_modules/eventemitter2": { + "version": "6.4.9", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.9.tgz", + "integrity": "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==" + }, + "node_modules/@pm2/io/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@pm2/io/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@pm2/io/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/@pm2/io/node_modules/tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" + }, + "node_modules/@pm2/js-api": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@pm2/js-api/-/js-api-0.8.0.tgz", + "integrity": "sha512-nmWzrA/BQZik3VBz+npRcNIu01kdBhWL0mxKmP1ciF/gTcujPTQqt027N9fc1pK9ERM8RipFhymw7RcmCyOEYA==", + "dependencies": { + "async": "^2.6.3", + "debug": "~4.3.1", + "eventemitter2": "^6.3.1", + "extrareqp2": "^1.0.0", + "ws": "^7.0.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@pm2/js-api/node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/@pm2/js-api/node_modules/eventemitter2": { + "version": "6.4.9", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.9.tgz", + "integrity": "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==" + }, + "node_modules/@pm2/js-api/node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/@pm2/pm2-version-check": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@pm2/pm2-version-check/-/pm2-version-check-1.0.4.tgz", + "integrity": "sha512-SXsM27SGH3yTWKc2fKR4SYNxsmnvuBQ9dd6QHtEWmiZ/VqaOYPAIlS8+vMcn27YLtAEBGvNRSh3TPNvtjZgfqA==", + "dependencies": { + "debug": "^4.3.1" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "node_modules/@redis/bloom": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.2.0.tgz", + "integrity": "sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/client": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.6.0.tgz", + "integrity": "sha512-aR0uffYI700OEEH4gYnitAnv3vzVGXCFvYfdpu/CJKvk4pHfLPEy/JSZyrpQ+15WhXe1yJRXLtfQ84s4mEXnPg==", + "dependencies": { + "cluster-key-slot": "1.1.2", + "generic-pool": "3.9.0", + "yallist": "4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@redis/graph": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.1.tgz", + "integrity": "sha512-FEMTcTHZozZciLRl6GiiIB4zGm5z5F3F6a6FZCyrfxdKOhFlGkiAqlexWMBzCi4DcRoyiOsuLfW+cjlGWyExOw==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/json": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.7.tgz", + "integrity": "sha512-6UyXfjVaTBTJtKNG4/9Z8PSpKE6XgSyEb8iwaqDcy+uKrd/DGYHTWkUdnQDyzm727V7p21WUMhsqz5oy65kPcQ==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/search": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.2.0.tgz", + "integrity": "sha512-tYoDBbtqOVigEDMAcTGsRlMycIIjwMCgD8eR2t0NANeQmgK/lvxNAvYyb6bZDD4frHRhIHkJu2TBRvB0ERkOmw==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/time-series": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.1.0.tgz", + "integrity": "sha512-c1Q99M5ljsIuc4YdaCwfUEXsofakb9c8+Zse2qxTadu8TalLXuAESzLvFAvNVbkmSlvlzIQOLpBCmWI9wTOt+g==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@repeaterjs/repeater": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@repeaterjs/repeater/-/repeater-3.0.5.tgz", + "integrity": "sha512-l3YHBLAol6d/IKnB9LhpD0cEZWAoe3eFKUyTYWmFmCO2Q/WOckxLQAUyMZWwZV2M/m3+4vgRoaolFqaII82/TA==" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz", + "integrity": "sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz", + "integrity": "sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz", + "integrity": "sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz", + "integrity": "sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz", + "integrity": "sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz", + "integrity": "sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz", + "integrity": "sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz", + "integrity": "sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz", + "integrity": "sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz", + "integrity": "sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz", + "integrity": "sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz", + "integrity": "sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.4.tgz", + "integrity": "sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz", + "integrity": "sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz", + "integrity": "sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz", + "integrity": "sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@shikijs/core": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.10.3.tgz", + "integrity": "sha512-D45PMaBaeDHxww+EkcDQtDAtzv00Gcsp72ukBtaLSmqRvh0WgGMq3Al0rl1QQBZfuneO75NXMIzEZGFitThWbg==", + "peer": true, + "dependencies": { + "@types/hast": "^3.0.4" + } + }, + "node_modules/@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" + }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==" + }, + "node_modules/@types/accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/bcryptjs": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.6.tgz", + "integrity": "sha512-9xlo6R2qDs5uixm0bcIqCeMCE6HiQsIyel9KQySStiyqNl2tnj2mP3DX1Nf56MD6KMenNNlBBsy3LJ7gUEQPXQ==", + "dev": true + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/busboy": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@types/busboy/-/busboy-1.5.3.tgz", + "integrity": "sha512-YMBLFN/xBD8bnqywIlGyYqsNFXu6bsiY7h3Ae0kO17qEuTjsqeyYMRPSUDacIKIquws2Y6KjmxAyNx8xB3xQbw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cls-hooked": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/@types/cls-hooked/-/cls-hooked-4.3.8.tgz", + "integrity": "sha512-tf/7H883gFA6MPlWI15EQtfNZ+oPL0gLKkOlx9UHFrun1fC/FkuyNBpTKq1B5E3T4fbvjId6WifHUdSGsMMuPg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/content-disposition": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.8.tgz", + "integrity": "sha512-QVSSvno3dE0MgO76pJhmv4Qyi/j0Yk9pBp0Y7TJ2Tlj+KCgJWY6qX7nnxCOLkZ3VYRSIk1WTxCvwUSdx6CCLdg==" + }, + "node_modules/@types/cookies": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.9.0.tgz", + "integrity": "sha512-40Zk8qR147RABiQ7NQnBzWzDcjKzNrntB5BAmeGCb2p/MIyOE+4BVvc17wumsUqUw00bJYqoXFHYygQnEFh4/Q==", + "dependencies": { + "@types/connect": "*", + "@types/express": "*", + "@types/keygrip": "*", + "@types/node": "*" + } + }, + "node_modules/@types/copy-paste": { + "version": "1.1.33", + "resolved": "https://registry.npmjs.org/@types/copy-paste/-/copy-paste-1.1.33.tgz", + "integrity": "sha512-vhDsD3A+WPfme1SW56fZCPvgEQ6ELYC0Jzgomldg+ExpMyQ1xDcIcuzao6O5l43cttbhepo16zz54Y16+GtpKw==", + "dev": true + }, + "node_modules/@types/cors": { + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", + "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true + }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-rate-limit": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@types/express-rate-limit/-/express-rate-limit-6.0.0.tgz", + "integrity": "sha512-nZxo3nwU20EkTl/f2eGdndQkDIJYwkXIX4S3Vrp2jMdSdFJ6AWtIda8gOz0wiMuOFoeH/UUlCAiacz3x3eWNFA==", + "deprecated": "This is a stub types definition. express-rate-limit provides its own type definitions, so you do not need this installed.", + "dev": true, + "dependencies": { + "express-rate-limit": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.43", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.43.tgz", + "integrity": "sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/graphql-depth-limit": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@types/graphql-depth-limit/-/graphql-depth-limit-1.1.6.tgz", + "integrity": "sha512-WU4bjoKOzJ8CQE32Pbyq+YshTMcLJf2aJuvVtSLv1BQPwDUGa38m2Vr8GGxf0GZ0luCQcfxlhZeHKu6nmTBvrw==", + "dev": true, + "dependencies": { + "graphql": "^14.5.3" + } + }, + "node_modules/@types/graphql-depth-limit/node_modules/graphql": { + "version": "14.7.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-14.7.0.tgz", + "integrity": "sha512-l0xWZpoPKpppFzMfvVyFmp9vLN7w/ZZJPefUicMCepfJeQ8sMcztloGYY9DfjVPo6tIUDzU5Hw3MUbIjj9AVVA==", + "dev": true, + "dependencies": { + "iterall": "^1.2.2" + }, + "engines": { + "node": ">= 6.x" + } + }, + "node_modules/@types/graphql-upload": { + "version": "16.0.7", + "resolved": "https://registry.npmjs.org/@types/graphql-upload/-/graphql-upload-16.0.7.tgz", + "integrity": "sha512-7vCoxIv2pVTvV8n+miYyfkINdguWsYomAkPlOfHoM6z/qzsiBAdfRb6lNc8PvEUhe7TXaxX4+LHubejw1og1DQ==", + "dependencies": { + "@types/express": "*", + "@types/koa": "*", + "@types/node": "*", + "fs-capacitor": "^8.0.0", + "graphql": "^16.3.0" + } + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "peer": true, + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/http-assert": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.5.tgz", + "integrity": "sha512-4+tE/lwdAahgZT1g30Jkdm9PzFRde0xwxBNUyRsCitRvCQB90iuA2uJYdUnhnANRcqGXaWOGY4FEoxeElNAK2g==" + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" + }, + "node_modules/@types/i18n": { + "version": "0.13.12", + "resolved": "https://registry.npmjs.org/@types/i18n/-/i18n-0.13.12.tgz", + "integrity": "sha512-iAd2QjKh+0ToBXocmCS3m38GskiaGzmSV1MTQz2GaOraqSqBiLf46J7u3EGINl+st+Uk4lO3OL7QyIjTJlrWIg==", + "dev": true + }, + "node_modules/@types/inquirer": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-9.0.7.tgz", + "integrity": "sha512-Q0zyBupO6NxGRZut/JdmqYKOnN95Eg5V8Csg3PGKkP+FnvsUZx1jAyK7fztIszxxMuoBA6E3KXWvdZVXIpx60g==", + "dev": true, + "dependencies": { + "@types/through": "*", + "rxjs": "^7.2.0" + } + }, + "node_modules/@types/js-yaml": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", + "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", + "dev": true + }, + "node_modules/@types/json-stable-stringify": { + "version": "1.0.36", + "resolved": "https://registry.npmjs.org/@types/json-stable-stringify/-/json-stable-stringify-1.0.36.tgz", + "integrity": "sha512-b7bq23s4fgBB76n34m2b3RBf6M369B0Z9uRR8aHTMd8kZISRkmDEpPD8hhpYvDFzr3bJCPES96cm3Q6qRNDbQw==", + "dev": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "node_modules/@types/jsonwebtoken": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.7.tgz", + "integrity": "sha512-ugo316mmTYBl2g81zDFnZ7cfxlut3o+/EQdaP7J8QN2kY6lJ22hmQYCK5EHcJHbrW+dkCGSCPgbG8JtYj6qSrg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/keygrip": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.6.tgz", + "integrity": "sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==" + }, + "node_modules/@types/koa": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.15.0.tgz", + "integrity": "sha512-7QFsywoE5URbuVnG3loe03QXuGajrnotr3gQkXcEBShORai23MePfFYdhz90FEtBBpkyIYQbVD+evKtloCgX3g==", + "dependencies": { + "@types/accepts": "*", + "@types/content-disposition": "*", + "@types/cookies": "*", + "@types/http-assert": "*", + "@types/http-errors": "*", + "@types/keygrip": "*", + "@types/koa-compose": "*", + "@types/node": "*" + } + }, + "node_modules/@types/koa-compose": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.8.tgz", + "integrity": "sha512-4Olc63RY+MKvxMwVknCUDhRQX1pFQoBZ/lXcRLP69PQkEpze/0cr8LNqJQe5NFb/b19DWi2a5bTi2VAlQzhJuA==", + "dependencies": { + "@types/koa": "*" + } + }, + "node_modules/@types/lodash": { + "version": "4.17.7", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.7.tgz", + "integrity": "sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" + }, + "node_modules/@types/mongoose-paginate-v2": { + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/@types/mongoose-paginate-v2/-/mongoose-paginate-v2-1.6.5.tgz", + "integrity": "sha512-OdnsqewLwCtZvExUHuL+KDVlZ6OdnzGcUdPpEqMRVKZ6mWy7fgnt1IkLSs8Zugv5cUTLVT46hjmL2OPWtml1Rw==", + "deprecated": "This is a stub types definition. mongoose-paginate-v2 provides its own type definitions, so you do not need this installed.", + "dev": true, + "dependencies": { + "mongoose-paginate-v2": "*" + } + }, + "node_modules/@types/morgan": { + "version": "1.9.9", + "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.9.tgz", + "integrity": "sha512-iRYSDKVaC6FkGSpEVVIvrRGw0DfJMiQzIn3qr2G5B3C//AWkulhXgaBd7tS9/J79GWSYMTHGs7PfI5b3Y8m+RQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "22.5.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.4.tgz", + "integrity": "sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg==", + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/@types/node-fetch": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==", + "dependencies": { + "@types/node": "*", + "form-data": "^4.0.0" + } + }, + "node_modules/@types/nodemailer": { + "version": "6.4.15", + "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.15.tgz", + "integrity": "sha512-0EBJxawVNjPkng1zm2vopRctuWVCxk34JcIlRuXSf54habUWdz1FB7wHDqOqvDa8Mtpt0Q3LTXQkAs2LNyK5jQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/object-path": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/@types/object-path/-/object-path-0.11.4.tgz", + "integrity": "sha512-4tgJ1Z3elF/tOMpA8JLVuR9spt9Ynsf7+JjqsQ2IqtiPJtcLoHoXcT6qU4E10cPFqyXX5HDm9QwIzZhBSkLxsw==" + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" + }, + "node_modules/@types/prop-types": { + "version": "15.7.12", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" + }, + "node_modules/@types/qs": { + "version": "6.9.14", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.14.tgz", + "integrity": "sha512-5khscbd3SwWMhFqylJBLQ0zIu7c1K6Vz0uBIt915BI3zV0q1nfjRQD3RqSBcPaO6PHEF4ov/t9y89fSiyThlPA==" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" + }, + "node_modules/@types/react": { + "version": "18.2.69", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.69.tgz", + "integrity": "sha512-W1HOMUWY/1Yyw0ba5TkCV+oqynRjG7BnteBB+B7JmAK7iw3l2SW+VGOxL+akPweix6jk2NNJtyJKpn4TkpfK3Q==", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.10", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz", + "integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", + "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==" + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", + "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/through": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.33.tgz", + "integrity": "sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/triple-beam": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", + "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==" + }, + "node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==", + "peer": true + }, + "node_modules/@types/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", + "dev": true + }, + "node_modules/@types/validator": { + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.12.0.tgz", + "integrity": "sha512-nH45Lk7oPIJ1RVOF6JgFI6Dy0QpHEzq4QecZhvguxYPDwT8c93prCMqAtiIttm39voZ+DDR+qkNnMpJmMBRqag==", + "dev": true + }, + "node_modules/@types/webidl-conversions": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", + "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==" + }, + "node_modules/@types/whatwg-url": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.4.tgz", + "integrity": "sha512-lXCmTWSHJvf0TRSO58nm978b8HJ/EdsSsEKLd3ODHFjo+3VGAyyTp4v50nWvwtzBxSMQrVOK7tcuN0zGPLICMw==", + "dependencies": { + "@types/webidl-conversions": "*" + } + }, + "node_modules/@types/ws": { + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.2.0.tgz", + "integrity": "sha512-02tJIs655em7fvt9gps/+4k4OsKULYGtLBPJfOsmOq1+3cdClYiF0+d6mHu6qDnTcg88wJBkcPLpQhq7FyDz0A==", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.2.0", + "@typescript-eslint/type-utils": "8.2.0", + "@typescript-eslint/utils": "8.2.0", + "@typescript-eslint/visitor-keys": "8.2.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.2.0.tgz", + "integrity": "sha512-OFn80B38yD6WwpoHU2Tz/fTz7CgFqInllBoC3WP+/jLbTb4gGPTy9HBSTsbDWkMdN55XlVU0mMDYAtgvlUspGw==", + "dependencies": { + "@typescript-eslint/types": "8.2.0", + "@typescript-eslint/visitor-keys": "8.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.2.0.tgz", + "integrity": "sha512-6a9QSK396YqmiBKPkJtxsgZZZVjYQ6wQ/TlI0C65z7vInaETuC6HAHD98AGLC8DyIPqHytvNuS8bBVvNLKyqvQ==", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.2.0.tgz", + "integrity": "sha512-sbgsPMW9yLvS7IhCi8IpuK1oBmtbWUNP+hBdwl/I9nzqVsszGnNGti5r9dUtF5RLivHUFFIdRvLiTsPhzSyJ3Q==", + "dependencies": { + "@typescript-eslint/types": "8.2.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.0.1.tgz", + "integrity": "sha512-5IgYJ9EO/12pOUwiBKFkpU7rS3IU21mtXzB81TNwq2xEybcmAZrE9qwDtsb5uQd9aVO9o0fdabFyAmKveXyujg==", + "dependencies": { + "@typescript-eslint/scope-manager": "8.0.1", + "@typescript-eslint/types": "8.0.1", + "@typescript-eslint/typescript-estree": "8.0.1", + "@typescript-eslint/visitor-keys": "8.0.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.0.1.tgz", + "integrity": "sha512-NpixInP5dm7uukMiRyiHjRKkom5RIFA4dfiHvalanD2cF0CLUuQqxfg8PtEUo9yqJI2bBhF+pcSafqnG3UBnRQ==", + "dependencies": { + "@typescript-eslint/types": "8.0.1", + "@typescript-eslint/visitor-keys": "8.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.2.0.tgz", + "integrity": "sha512-g1CfXGFMQdT5S+0PSO0fvGXUaiSkl73U1n9LTK5aRAFnPlJ8dLKkXr4AaLFvPedW8lVDoMgLLE3JN98ZZfsj0w==", + "dependencies": { + "@typescript-eslint/typescript-estree": "8.2.0", + "@typescript-eslint/utils": "8.2.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.2.0.tgz", + "integrity": "sha512-6a9QSK396YqmiBKPkJtxsgZZZVjYQ6wQ/TlI0C65z7vInaETuC6HAHD98AGLC8DyIPqHytvNuS8bBVvNLKyqvQ==", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.2.0.tgz", + "integrity": "sha512-kiG4EDUT4dImplOsbh47B1QnNmXSoUqOjWDvCJw/o8LgfD0yr7k2uy54D5Wm0j4t71Ge1NkynGhpWdS0dEIAUA==", + "dependencies": { + "@typescript-eslint/types": "8.2.0", + "@typescript-eslint/visitor-keys": "8.2.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.2.0.tgz", + "integrity": "sha512-sbgsPMW9yLvS7IhCi8IpuK1oBmtbWUNP+hBdwl/I9nzqVsszGnNGti5r9dUtF5RLivHUFFIdRvLiTsPhzSyJ3Q==", + "dependencies": { + "@typescript-eslint/types": "8.2.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.0.1.tgz", + "integrity": "sha512-PpqTVT3yCA/bIgJ12czBuE3iBlM3g4inRSC5J0QOdQFAn07TYrYEQBBKgXH1lQpglup+Zy6c1fxuwTk4MTNKIw==", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.0.1.tgz", + "integrity": "sha512-8V9hriRvZQXPWU3bbiUV4Epo7EvgM6RTs+sUmxp5G//dBGy402S7Fx0W0QkB2fb4obCF8SInoUzvTYtc3bkb5w==", + "dependencies": { + "@typescript-eslint/types": "8.0.1", + "@typescript-eslint/visitor-keys": "8.0.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.2.0.tgz", + "integrity": "sha512-O46eaYKDlV3TvAVDNcoDzd5N550ckSe8G4phko++OCSC1dYIb9LTc3HDGYdWqWIAT5qDUKphO6sd9RrpIJJPfg==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.2.0", + "@typescript-eslint/types": "8.2.0", + "@typescript-eslint/typescript-estree": "8.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.2.0.tgz", + "integrity": "sha512-OFn80B38yD6WwpoHU2Tz/fTz7CgFqInllBoC3WP+/jLbTb4gGPTy9HBSTsbDWkMdN55XlVU0mMDYAtgvlUspGw==", + "dependencies": { + "@typescript-eslint/types": "8.2.0", + "@typescript-eslint/visitor-keys": "8.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.2.0.tgz", + "integrity": "sha512-6a9QSK396YqmiBKPkJtxsgZZZVjYQ6wQ/TlI0C65z7vInaETuC6HAHD98AGLC8DyIPqHytvNuS8bBVvNLKyqvQ==", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.2.0.tgz", + "integrity": "sha512-kiG4EDUT4dImplOsbh47B1QnNmXSoUqOjWDvCJw/o8LgfD0yr7k2uy54D5Wm0j4t71Ge1NkynGhpWdS0dEIAUA==", + "dependencies": { + "@typescript-eslint/types": "8.2.0", + "@typescript-eslint/visitor-keys": "8.2.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.2.0.tgz", + "integrity": "sha512-sbgsPMW9yLvS7IhCi8IpuK1oBmtbWUNP+hBdwl/I9nzqVsszGnNGti5r9dUtF5RLivHUFFIdRvLiTsPhzSyJ3Q==", + "dependencies": { + "@typescript-eslint/types": "8.2.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.0.1.tgz", + "integrity": "sha512-W5E+o0UfUcK5EgchLZsyVWqARmsM7v54/qEq6PY3YI5arkgmCzHiuk0zKSJJbm71V0xdRna4BGomkCTXz2/LkQ==", + "dependencies": { + "@typescript-eslint/types": "8.0.1", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" + }, + "node_modules/@vitest/coverage-v8": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-2.1.1.tgz", + "integrity": "sha512-md/A7A3c42oTT8JUHSqjP5uKTWJejzUW4jalpvs+rZ27gsURsMU8DEb+8Jf8C6Kj2gwfSHJqobDNBuoqlm0cFw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.3.0", + "@bcoe/v8-coverage": "^0.2.3", + "debug": "^4.3.6", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-report": "^3.0.1", + "istanbul-lib-source-maps": "^5.0.6", + "istanbul-reports": "^3.1.7", + "magic-string": "^0.30.11", + "magicast": "^0.3.4", + "std-env": "^3.7.0", + "test-exclude": "^7.0.1", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@vitest/browser": "2.1.1", + "vitest": "2.1.1" + }, + "peerDependenciesMeta": { + "@vitest/browser": { + "optional": true + } + } + }, + "node_modules/@vitest/expect": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.1.tgz", + "integrity": "sha512-YeueunS0HiHiQxk+KEOnq/QMzlUuOzbU1Go+PgAsHvvv3tUkJPm9xWt+6ITNTlzsMXUjmgm5T+U7KBPK2qQV6w==", + "dev": true, + "dependencies": { + "@vitest/spy": "2.1.1", + "@vitest/utils": "2.1.1", + "chai": "^5.1.1", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.1.tgz", + "integrity": "sha512-LNN5VwOEdJqCmJ/2XJBywB11DLlkbY0ooDJW3uRX5cZyYCrc4PI/ePX0iQhE3BiEGiQmK4GE7Q/PqCkkaiPnrA==", + "dev": true, + "dependencies": { + "@vitest/spy": "^2.1.0-beta.1", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.11" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@vitest/spy": "2.1.1", + "msw": "^2.3.5", + "vite": "^5.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.1.tgz", + "integrity": "sha512-SjxPFOtuINDUW8/UkElJYQSFtnWX7tMksSGW0vfjxMneFqxVr8YJ979QpMbDW7g+BIiq88RAGDjf7en6rvLPPQ==", + "dev": true, + "dependencies": { + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.1.tgz", + "integrity": "sha512-uTPuY6PWOYitIkLPidaY5L3t0JJITdGTSwBtwMjKzo5O6RCOEncz9PUN+0pDidX8kTHYjO0EwUIvhlGpnGpxmA==", + "dev": true, + "dependencies": { + "@vitest/utils": "2.1.1", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.1.tgz", + "integrity": "sha512-BnSku1WFy7r4mm96ha2FzN99AZJgpZOWrAhtQfoxjUU5YMRpq1zmHRq7a5K9/NjqonebO7iVDla+VvZS8BOWMw==", + "dev": true, + "dependencies": { + "@vitest/pretty-format": "2.1.1", + "magic-string": "^0.30.11", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.1.tgz", + "integrity": "sha512-ZM39BnZ9t/xZ/nF4UwRH5il0Sw93QnZXd9NAZGRpIgj0yvVwPpLd702s/Cx955rGaMlyBQkZJ2Ir7qyY48VZ+g==", + "dev": true, + "dependencies": { + "tinyspy": "^3.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.1.tgz", + "integrity": "sha512-Y6Q9TsI+qJ2CC0ZKj6VBb+T8UPz593N113nnUykqwANqhgf3QkZeHFlusgKLTqrnVHbj/XDKZcDHol+dxVT+rQ==", + "dev": true, + "dependencies": { + "@vitest/pretty-format": "2.1.1", + "loupe": "^3.1.1", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@whatwg-node/events": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@whatwg-node/events/-/events-0.0.3.tgz", + "integrity": "sha512-IqnKIDWfXBJkvy/k6tzskWTc2NK3LcqHlb+KHGCrjOCH4jfQckRX0NAiIcC/vIqQkzLYw2r2CTSwAxcrtcD6lA==", + "dev": true + }, + "node_modules/@whatwg-node/fetch": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.8.8.tgz", + "integrity": "sha512-CdcjGC2vdKhc13KKxgsc6/616BQ7ooDIgPeTuAiE8qfCnS0mGzcfCOoZXypQSz73nxI+GWc7ZReIAVhxoE1KCg==", + "dev": true, + "dependencies": { + "@peculiar/webcrypto": "^1.4.0", + "@whatwg-node/node-fetch": "^0.3.6", + "busboy": "^1.6.0", + "urlpattern-polyfill": "^8.0.0", + "web-streams-polyfill": "^3.2.1" + } + }, + "node_modules/@whatwg-node/node-fetch": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.3.6.tgz", + "integrity": "sha512-w9wKgDO4C95qnXZRwZTfCmLWqyRnooGjcIwG0wADWjw9/HN0p7dtvtgSvItZtUyNteEvgTrd8QojNEqV6DAGTA==", + "dev": true, + "dependencies": { + "@whatwg-node/events": "^0.0.3", + "busboy": "^1.6.0", + "fast-querystring": "^1.1.1", + "fast-url-parser": "^1.1.3", + "tslib": "^2.3.1" + } + }, + "node_modules/@whatwg-node/server": { + "version": "0.9.34", + "resolved": "https://registry.npmjs.org/@whatwg-node/server/-/server-0.9.34.tgz", + "integrity": "sha512-1sHRjqUtZIyTR2m2dS/dJpzS5OcNDpPuUSVDa2PoEgzYVKr4GsqJaYtRaEXXFohvvyh6PkouYCc1rE7jMDWVCA==", + "dependencies": { + "@whatwg-node/fetch": "^0.9.17", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@whatwg-node/server/node_modules/@whatwg-node/events": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@whatwg-node/events/-/events-0.1.1.tgz", + "integrity": "sha512-AyQEn5hIPV7Ze+xFoXVU3QTHXVbWPrzaOkxtENMPMuNL6VVHrp4hHfDt9nrQpjO7BgvuM95dMtkycX5M/DZR3w==", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@whatwg-node/server/node_modules/@whatwg-node/fetch": { + "version": "0.9.18", + "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.9.18.tgz", + "integrity": "sha512-hqoz6StCW+AjV/3N+vg0s1ah82ptdVUb9nH2ttj3UbySOXUvytWw2yqy8c1cKzyRk6mDD00G47qS3fZI9/gMjg==", + "dependencies": { + "@whatwg-node/node-fetch": "^0.5.7", + "urlpattern-polyfill": "^10.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@whatwg-node/server/node_modules/@whatwg-node/node-fetch": { + "version": "0.5.11", + "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.5.11.tgz", + "integrity": "sha512-LS8tSomZa3YHnntpWt3PP43iFEEl6YeIsvDakczHBKlay5LdkXFr8w7v8H6akpG5nRrzydyB0k1iE2eoL6aKIQ==", + "dependencies": { + "@kamilkisiela/fast-url-parser": "^1.1.4", + "@whatwg-node/events": "^0.1.0", + "busboy": "^1.6.0", + "fast-querystring": "^1.1.1", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@whatwg-node/server/node_modules/urlpattern-polyfill": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", + "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/amp": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/amp/-/amp-0.3.1.tgz", + "integrity": "sha512-OwIuC4yZaRogHKiuU5WlMR5Xk/jAcpPtawWL05Gj8Lvm2F6mwoJt4O/bHI+DHwG79vWd+8OFYM4/BzYqyRd3qw==" + }, + "node_modules/amp-message": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/amp-message/-/amp-message-0.1.2.tgz", + "integrity": "sha512-JqutcFwoU1+jhv7ArgW38bqrE+LQdcRv4NxNw0mp0JHQyB6tXesWRjtYKlDgHRY2o3JE5UTaBGUK8kSWUdxWUg==", + "dependencies": { + "amp": "0.3.1" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-red": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", + "integrity": "sha512-ewaIr5y+9CUTGFwZfpECUbFlGcC0GCw1oqR9RI6h1gQCd9Aj2GxSckCnPsVJnmfMZbwFYE+leZGASgkWl06Jow==", + "dependencies": { + "ansi-wrap": "0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/asn1js": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.5.tgz", + "integrity": "sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ==", + "dev": true, + "dependencies": { + "pvtsutils": "^1.3.2", + "pvutils": "^1.1.3", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" + }, + "node_modules/async-hook-jl": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/async-hook-jl/-/async-hook-jl-1.7.6.tgz", + "integrity": "sha512-gFaHkFfSxTjvoxDMYqDuGHlcRyUuamF8s+ZTtJdDzqjws4mCt7v0vuV79/E2Wr2/riMQgtG4/yUtXWs1gZ7JMg==", + "dependencies": { + "stack-chain": "^1.3.7" + }, + "engines": { + "node": "^4.7 || >=6.9 || >=7.3" + } + }, + "node_modules/async-retry": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", + "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", + "dependencies": { + "retry": "0.13.1" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/auto-bind": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-4.0.0.tgz", + "integrity": "sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/autolinker": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-0.28.1.tgz", + "integrity": "sha512-zQAFO1Dlsn69eXaO6+7YZc+v84aquQKbwpzCE3L0stj56ERn9hutFxPopViLjo9G+rWwjozRhgS5KJ25Xy19cQ==", + "dependencies": { + "gulp-header": "^1.7.1" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" + }, + "node_modules/axios": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", + "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/babel-plugin-macros/node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/babel-plugin-macros/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/babel-plugin-syntax-trailing-function-commas": { + "version": "7.0.0-beta.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz", + "integrity": "sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==", + "dev": true + }, + "node_modules/babel-preset-fbjs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz", + "integrity": "sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==", + "dev": true, + "dependencies": { + "@babel/plugin-proposal-class-properties": "^7.0.0", + "@babel/plugin-proposal-object-rest-spread": "^7.0.0", + "@babel/plugin-syntax-class-properties": "^7.0.0", + "@babel/plugin-syntax-flow": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.0.0", + "@babel/plugin-transform-arrow-functions": "^7.0.0", + "@babel/plugin-transform-block-scoped-functions": "^7.0.0", + "@babel/plugin-transform-block-scoping": "^7.0.0", + "@babel/plugin-transform-classes": "^7.0.0", + "@babel/plugin-transform-computed-properties": "^7.0.0", + "@babel/plugin-transform-destructuring": "^7.0.0", + "@babel/plugin-transform-flow-strip-types": "^7.0.0", + "@babel/plugin-transform-for-of": "^7.0.0", + "@babel/plugin-transform-function-name": "^7.0.0", + "@babel/plugin-transform-literals": "^7.0.0", + "@babel/plugin-transform-member-expression-literals": "^7.0.0", + "@babel/plugin-transform-modules-commonjs": "^7.0.0", + "@babel/plugin-transform-object-super": "^7.0.0", + "@babel/plugin-transform-parameters": "^7.0.0", + "@babel/plugin-transform-property-literals": "^7.0.0", + "@babel/plugin-transform-react-display-name": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/plugin-transform-shorthand-properties": "^7.0.0", + "@babel/plugin-transform-spread": "^7.0.0", + "@babel/plugin-transform-template-literals": "^7.0.0", + "babel-plugin-syntax-trailing-function-commas": "^7.0.0-beta.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/basic-auth/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/basic-ftp": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", + "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/bcryptjs": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", + "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==" + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/blessed": { + "version": "0.1.81", + "resolved": "https://registry.npmjs.org/blessed/-/blessed-0.1.81.tgz", + "integrity": "sha512-LoF5gae+hlmfORcG1M5+5XZi4LBmvlXTzwJWzUlPryN/SJdSflZvROM2TwkT0GMpq7oqT48NRd4GS7BiVBc5OQ==", + "bin": { + "blessed": "bin/tput.js" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "node_modules/bodec": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/bodec/-/bodec-0.1.0.tgz", + "integrity": "sha512-Ylo+MAo5BDUq1KA3f3R/MFhh+g8cnHmo8bz3YPGhI1znrMaf77ol1sfvYJzsw3nTE+Y2GryfDxBaR+AqpAkEHQ==" + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/boolean": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==" + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/braces/node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/bson": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-6.7.0.tgz", + "integrity": "sha512-w2IquM5mYzYZv6rs3uN2DZTOBe2a0zXLj53TGDqwF4l6Sz/XsISrisXOJihArF9+BZ6Cq/GjVht7Sjfmri7ytQ==", + "engines": { + "node": ">=16.20.1" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001600", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001600.tgz", + "integrity": "sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/capital-case": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", + "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "node_modules/chai": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", + "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==", + "dev": true, + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/change-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", + "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", + "dev": true, + "dependencies": { + "camel-case": "^4.1.2", + "capital-case": "^1.0.4", + "constant-case": "^3.0.4", + "dot-case": "^3.0.4", + "header-case": "^2.0.4", + "no-case": "^3.0.4", + "param-case": "^3.0.4", + "pascal-case": "^3.1.2", + "path-case": "^3.0.4", + "sentence-case": "^3.0.4", + "snake-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/change-case-all": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/change-case-all/-/change-case-all-1.0.15.tgz", + "integrity": "sha512-3+GIFhk3sNuvFAJKU46o26OdzudQlPNBCu1ZQi3cMeMHhty1bhDxu2WrEilVNYaGvqUtR1VSigFcJOiS13dRhQ==", + "dev": true, + "dependencies": { + "change-case": "^4.1.2", + "is-lower-case": "^2.0.2", + "is-upper-case": "^2.0.2", + "lower-case": "^2.0.2", + "lower-case-first": "^2.0.2", + "sponge-case": "^1.0.1", + "swap-case": "^2.0.2", + "title-case": "^3.0.3", + "upper-case": "^2.0.2", + "upper-case-first": "^2.0.2" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "node_modules/charm": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/charm/-/charm-0.1.2.tgz", + "integrity": "sha512-syedaZ9cPe7r3hoQA9twWYKu5AIyCswN5+szkmPBe9ccdLrj4bYaCnLVPTLd2kgVRc7+zoX4tyPgRnFKCj5YjQ==" + }, + "node_modules/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "dev": true, + "engines": { + "node": ">= 16" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-table3": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cli-tableau": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/cli-tableau/-/cli-tableau-2.0.1.tgz", + "integrity": "sha512-he+WTicka9cl0Fg/y+YyxcN6/bfQ/1O3QmgxRXDhABKqLzvoOSM4fMzp39uMyLBulAFuywD2N7UaoQE7WaADxQ==", + "dependencies": { + "chalk": "3.0.0" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/cli-tableau/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/cls-bluebird": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cls-bluebird/-/cls-bluebird-2.1.0.tgz", + "integrity": "sha512-XVb0RPmHQyy35Tz9z34gvtUcBKUK8A/1xkGCyeFc9B0C7Zr5SysgFaswRVdwI5NEMcO+3JKlIDGIOgERSn9NdA==", + "dev": true, + "dependencies": { + "is-bluebird": "^1.0.2", + "shimmer": "^1.1.0" + } + }, + "node_modules/cls-hooked": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/cls-hooked/-/cls-hooked-4.2.2.tgz", + "integrity": "sha512-J4Xj5f5wq/4jAvcdgoGsL3G103BtWpZrMo8NEinRltN+xpTZdI+M38pyQqhuFU/P792xkMFvnKSf+Lm81U1bxw==", + "dependencies": { + "async-hook-jl": "^1.7.6", + "emitter-listener": "^1.0.1", + "semver": "^5.4.1" + }, + "engines": { + "node": "^4.7 || >=6.9 || >=7.3 || >=8.2.1" + } + }, + "node_modules/cls-hooked/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cluster-key-slot": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", + "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/coffee-script": { + "version": "1.12.7", + "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.7.tgz", + "integrity": "sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw==", + "deprecated": "CoffeeScript on NPM has moved to \"coffeescript\" (no hyphen)", + "bin": { + "cake": "bin/cake", + "coffee": "bin/coffee" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/color/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/colorspace": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", + "dependencies": { + "color": "^3.1.3", + "text-hex": "1.0.x" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/commonmark": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/commonmark/-/commonmark-0.30.0.tgz", + "integrity": "sha512-j1yoUo4gxPND1JWV9xj5ELih0yMv1iCWDG6eEQIPLSWLxzCXiFoyS7kvB+WwU+tZMf4snwJMMtaubV0laFpiBA==", + "dependencies": { + "entities": "~2.0", + "mdurl": "~1.0.1", + "minimist": ">=1.2.2", + "string.prototype.repeat": "^0.2.0" + }, + "bin": { + "commonmark": "bin/commonmark" + }, + "engines": { + "node": "*" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concat-with-sourcemaps": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", + "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==", + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/concat-with-sourcemaps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/concurrently": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.0.0.tgz", + "integrity": "sha512-iAxbsDeUkn8E/4+QalT7T3WvlyTfmsoez+19lbbcsxZdOEMfBukd8LA30KYez2UR5xkKFzbcqXIZy5RisCbaxw==", + "dev": true, + "dependencies": { + "chalk": "^4.1.2", + "lodash": "^4.17.21", + "rxjs": "^7.8.1", + "shell-quote": "^1.8.1", + "supports-color": "^8.1.1", + "tree-kill": "^1.2.2", + "yargs": "^17.7.2" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + } + }, + "node_modules/concurrently/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/constant-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", + "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case": "^2.0.2" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/copy-paste": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/copy-paste/-/copy-paste-1.5.3.tgz", + "integrity": "sha512-qOnFo+8l8vemGmdcoCiD7gPTefkXEg2rivYE+EBtuKOj754eFivkGhGAM9e/xqShrpuVE11evSxGnHwVAUK1Iw==", + "dependencies": { + "iconv-lite": "^0.4.8" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/croner": { + "version": "4.1.97", + "resolved": "https://registry.npmjs.org/croner/-/croner-4.1.97.tgz", + "integrity": "sha512-/f6gpQuxDaqXu+1kwQYSckUglPaOrHdbIlBAu0YuW8/Cdb45XwXYNUBXg3r/9Mo6n540Kn/smKcZWko5x99KrQ==" + }, + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/cross-fetch": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", + "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", + "dev": true, + "dependencies": { + "node-fetch": "^2.6.12" + } + }, + "node_modules/cross-inspect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cross-inspect/-/cross-inspect-1.0.0.tgz", + "integrity": "sha512-4PFfn4b5ZN6FMNGSZlyb7wUhuN8wvj8t/VQHZdM4JsDcruGJ8L2kf9zao98QIrBPFCpdk27qst/AGTl7pL3ypQ==", + "dependencies": { + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "node_modules/culvert": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/culvert/-/culvert-0.1.2.tgz", + "integrity": "sha512-yi1x3EAWKjQTreYWeSd98431AV+IEE0qoDyOoaHJ7KJ21gv6HtBXHVLX74opVSGqcR8/AbjJBHAHpcOy2bj5Gg==" + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/dataloader": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-2.2.2.tgz", + "integrity": "sha512-8YnDaaf7N3k/q5HnTJVuzSyLETjoZjVmHc4AeKAzOvKHEFQKcn64OKBfzHYtE9zGjctNM7V9I0MfnUVLpi7M5g==" + }, + "node_modules/date-fns": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", + "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "node_modules/dayjs": { + "version": "1.11.10", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" + }, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/deep-diff": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/deep-diff/-/deep-diff-1.0.2.tgz", + "integrity": "sha512-aWS3UIVH+NPGCD1kki+DCU9Dua032iSsO43LqQpcs4R3+dVv7tX0qBGjiVHJHjplsoUM2XRO/KB92glqc68awg==", + "dev": true + }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dependency-graph": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", + "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/diacritics-map": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/diacritics-map/-/diacritics-map-0.1.0.tgz", + "integrity": "sha512-3omnDTYrGigU0i4cJjvaKwD52B8aoqyX/NEIkukFFkogBemsIbhSa1O414fpTp5nuszJG6lvQ5vBvDVNCbSsaQ==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dset": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.3.tgz", + "integrity": "sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/ecc-jsbn/node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.715", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.715.tgz", + "integrity": "sha512-XzWNH4ZSa9BwVUQSDorPWAUQ5WGuYz7zJUNpNif40zFCiCl20t8zgylmreNmn26h5kiyw2lg7RfTmeMBsDklqg==" + }, + "node_modules/emitter-listener": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/emitter-listener/-/emitter-listener-1.1.2.tgz", + "integrity": "sha512-Bt1sBAGFHY9DKY+4/2cV6izcKJUf5T7/gkdmkxzX/qv9CcGH8xSwVRW5mtX03SWJtRTWSOpzCuWN9rBFYZepZQ==", + "dependencies": { + "shimmer": "^1.2.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/entities": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", + "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==" + }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.23.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.2.tgz", + "integrity": "sha512-60s3Xv2T2p1ICykc7c+DNDPLDMm9t4QxCOUU0K9JxiLjM3C1zB9YVdN7tjxrFd4+AkZ8CdX1ovUga4P2+1e+/w==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.5", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", + "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.23.1", + "@esbuild/android-arm": "0.23.1", + "@esbuild/android-arm64": "0.23.1", + "@esbuild/android-x64": "0.23.1", + "@esbuild/darwin-arm64": "0.23.1", + "@esbuild/darwin-x64": "0.23.1", + "@esbuild/freebsd-arm64": "0.23.1", + "@esbuild/freebsd-x64": "0.23.1", + "@esbuild/linux-arm": "0.23.1", + "@esbuild/linux-arm64": "0.23.1", + "@esbuild/linux-ia32": "0.23.1", + "@esbuild/linux-loong64": "0.23.1", + "@esbuild/linux-mips64el": "0.23.1", + "@esbuild/linux-ppc64": "0.23.1", + "@esbuild/linux-riscv64": "0.23.1", + "@esbuild/linux-s390x": "0.23.1", + "@esbuild/linux-x64": "0.23.1", + "@esbuild/netbsd-x64": "0.23.1", + "@esbuild/openbsd-arm64": "0.23.1", + "@esbuild/openbsd-x64": "0.23.1", + "@esbuild/sunos-x64": "0.23.1", + "@esbuild/win32-arm64": "0.23.1", + "@esbuild/win32-ia32": "0.23.1", + "@esbuild/win32-x64": "0.23.1" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", + "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-tsdoc": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-tsdoc/-/eslint-plugin-tsdoc-0.3.0.tgz", + "integrity": "sha512-0MuFdBrrJVBjT/gyhkP2BqpD0np1NxNLfQ38xXDlSs/KVVpKI2A6vN7jx2Rve/CyUsvOsMGwp9KKrinv7q9g3A==", + "dev": true, + "dependencies": { + "@microsoft/tsdoc": "0.15.0", + "@microsoft/tsdoc-config": "0.17.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter2": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-5.0.1.tgz", + "integrity": "sha512-5EM1GHXycJBS6mauYAbVKT1cVs7POKWb2NXD4Vyt8dDqeZa7LaDK1/sjtL+Zb0lzTpSNil4596Dyu97hz37QLg==" + }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true + }, + "node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha512-AFASGfIlnIbkKPQwX1yHaDjFvh/1gyKJODme52V6IORh69uEYgZp0o9C+qsIGNVEiuuhQU0CSSl++Rlegg1qvA==", + "dependencies": { + "fill-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/express": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express-mongo-sanitize": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/express-mongo-sanitize/-/express-mongo-sanitize-2.2.0.tgz", + "integrity": "sha512-PZBs5nwhD6ek9ZuP+W2xmpvcrHwXZxD5GdieX2dsjPbAbH4azOkrHbycBud2QRU+YQF1CT+pki/lZGedHgo/dQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/express-rate-limit": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.4.0.tgz", + "integrity": "sha512-v1204w3cXu5gCDmAvgvzI6qjzZzoMWKnyVDk3ACgfswTQLYiGen+r8w0VnXnGMmzEN/g8fwIQ4JrFFd4ZP6ssg==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": "4 || 5 || ^5.0.0-beta.1" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/extract-files": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/extract-files/-/extract-files-11.0.0.tgz", + "integrity": "sha512-FuoE1qtbJ4bBVvv94CC7s0oTnKUGvQs+Rjf1L2SJFfS+HTVVjhPFtehPdQ0JiGPqVNfSSZvL5yzHHQq2Z4WNhQ==", + "engines": { + "node": "^12.20 || >= 14.13" + }, + "funding": { + "url": "https://github.com/sponsors/jaydenseric" + } + }, + "node_modules/extrareqp2": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/extrareqp2/-/extrareqp2-1.0.0.tgz", + "integrity": "sha512-Gum0g1QYb6wpPJCVypWP3bbIuaibcFiJcpuPM10YSXp/tzqi84x9PJageob+eN4xVRIOto4wjSGNLyMD54D2xA==", + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-decode-uri-component": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", + "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-patch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz", + "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "node_modules/fast-printf": { + "version": "1.6.9", + "resolved": "https://registry.npmjs.org/fast-printf/-/fast-printf-1.6.9.tgz", + "integrity": "sha512-FChq8hbz65WMj4rstcQsFB0O7Cy++nmbNfLYnD9cYv2cRn8EG6k/MGn9kO/tjO66t09DLDugj3yL+V2o6Qftrg==", + "dependencies": { + "boolean": "^3.1.4" + }, + "engines": { + "node": ">=10.0" + } + }, + "node_modules/fast-querystring": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.2.tgz", + "integrity": "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==", + "dependencies": { + "fast-decode-uri-component": "^1.0.1" + } + }, + "node_modules/fast-url-parser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", + "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", + "dev": true, + "dependencies": { + "punycode": "^1.3.2" + } + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fbjs": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.5.tgz", + "integrity": "sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==", + "dev": true, + "dependencies": { + "cross-fetch": "^3.1.5", + "fbjs-css-vars": "^1.0.0", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^1.0.35" + } + }, + "node_modules/fbjs-css-vars": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", + "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==", + "dev": true + }, + "node_modules/fclone": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/fclone/-/fclone-1.0.11.tgz", + "integrity": "sha512-GDqVQezKzRABdeqflsgMr7ktzgF9CyS+p2oe0jJqUY6izSSbhPIQJDpoU4PtGcD7VPM9xh/dVrTu6z1nwgmEGw==" + }, + "node_modules/fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-type": { + "version": "16.5.4", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz", + "integrity": "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==", + "dependencies": { + "readable-web-to-node-stream": "^3.0.0", + "strtok3": "^6.2.4", + "token-types": "^4.1.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/file-type?sponsor=1" + } + }, + "node_modules/fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dependencies": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flat-cache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==" + }, + "node_modules/fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" + }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/foreground-child": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", + "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-capacitor": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/fs-capacitor/-/fs-capacitor-8.0.0.tgz", + "integrity": "sha512-+Lk6iSKajdGw+7XYxUkwIzreJ2G1JFlYOdnKJv5PzwFLVsoJYBpCuS7WPIUSNT1IbQaEWT1nhYU63Ud03DyzLA==", + "engines": { + "node": "^14.17.0 || >=16.0.0" + } + }, + "node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generic-pool": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz", + "integrity": "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", + "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/get-graphql-schema": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/get-graphql-schema/-/get-graphql-schema-2.1.2.tgz", + "integrity": "sha512-1z5Hw91VrE3GrpCZE6lE8Dy+jz4kXWesLS7rCSjwOxf5BOcIedAZeTUJRIeIzmmR+PA9CKOkPTYFRJbdgUtrxA==", + "dev": true, + "dependencies": { + "chalk": "^2.4.1", + "graphql": "^14.0.2", + "minimist": "^1.2.0", + "node-fetch": "^2.2.0" + }, + "bin": { + "get-graphql-schema": "dist/index.js" + } + }, + "node_modules/get-graphql-schema/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/get-graphql-schema/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/get-graphql-schema/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/get-graphql-schema/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/get-graphql-schema/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/get-graphql-schema/node_modules/graphql": { + "version": "14.7.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-14.7.0.tgz", + "integrity": "sha512-l0xWZpoPKpppFzMfvVyFmp9vLN7w/ZZJPefUicMCepfJeQ8sMcztloGYY9DfjVPo6tIUDzU5Hw3MUbIjj9AVVA==", + "dev": true, + "dependencies": { + "iterall": "^1.2.2" + }, + "engines": { + "node": ">= 6.x" + } + }, + "node_modules/get-graphql-schema/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/get-graphql-schema/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.7.5", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.5.tgz", + "integrity": "sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==", + "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/get-uri": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.3.tgz", + "integrity": "sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==", + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4", + "fs-extra": "^11.2.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/git-node-fs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/git-node-fs/-/git-node-fs-1.0.0.tgz", + "integrity": "sha512-bLQypt14llVXBg0S0u8q8HmU7g9p3ysH+NvVlae5vILuUvs759665HvmR5+wb04KjHyjFcDRxdYb4kyNnluMUQ==" + }, + "node_modules/git-sha1": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/git-sha1/-/git-sha1-0.1.2.tgz", + "integrity": "sha512-2e/nZezdVlyCopOCYHeW0onkbZg7xP1Ad6pndPy1rCygeRykefUS6r7oA5cJRGEFvseiaz5a/qUHFVX1dd6Isg==" + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" + }, + "node_modules/graphql": { + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.9.0.tgz", + "integrity": "sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==", + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" + } + }, + "node_modules/graphql-config": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/graphql-config/-/graphql-config-5.0.3.tgz", + "integrity": "sha512-BNGZaoxIBkv9yy6Y7omvsaBUHOzfFcII3UN++tpH8MGOKFPFkCPZuwx09ggANMt8FgyWP1Od8SWPmrUEZca4NQ==", + "dev": true, + "dependencies": { + "@graphql-tools/graphql-file-loader": "^8.0.0", + "@graphql-tools/json-file-loader": "^8.0.0", + "@graphql-tools/load": "^8.0.0", + "@graphql-tools/merge": "^9.0.0", + "@graphql-tools/url-loader": "^8.0.0", + "@graphql-tools/utils": "^10.0.0", + "cosmiconfig": "^8.1.0", + "jiti": "^1.18.2", + "minimatch": "^4.2.3", + "string-env-interpolation": "^1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">= 16.0.0" + }, + "peerDependencies": { + "cosmiconfig-toml-loader": "^1.0.0", + "graphql": "^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + }, + "peerDependenciesMeta": { + "cosmiconfig-toml-loader": { + "optional": true + } + } + }, + "node_modules/graphql-config/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/graphql-config/node_modules/minimatch": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.3.tgz", + "integrity": "sha512-lIUdtK5hdofgCTu3aT0sOaHsYR37viUuIc0rwnnDXImbwFRcumyLMeZaM0t0I/fgxS6s6JMfu0rLD1Wz9pv1ng==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/graphql-depth-limit": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/graphql-depth-limit/-/graphql-depth-limit-1.1.0.tgz", + "integrity": "sha512-+3B2BaG8qQ8E18kzk9yiSdAa75i/hnnOwgSeAxVJctGQPvmeiLtqKOYF6HETCyRjiF7Xfsyal0HbLlxCQkgkrw==", + "dependencies": { + "arrify": "^1.0.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "peerDependencies": { + "graphql": "*" + } + }, + "node_modules/graphql-markdown": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/graphql-markdown/-/graphql-markdown-7.1.0.tgz", + "integrity": "sha512-S7wff3Fy5deUSfGB7J+IYO3mygulQQSpHoSnhq3GlD6q/oYGuCfRyuQqCivtHI0yHnPVM33c/VGF7pbCzvsNJg==", + "dev": true, + "dependencies": { + "deep-diff": "^1.0.2", + "lodash.isplainobject": "^4.0.6", + "minimist": "^1.2.6", + "node-fetch": "^2.0.0", + "resolve-from": "^5.0.0" + }, + "bin": { + "graphql-markdown": "src/index.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.2 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/graphql-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/graphql-request/-/graphql-request-6.1.0.tgz", + "integrity": "sha512-p+XPfS4q7aIpKVcgmnZKhMNqhltk20hfXtkaIkTfjjmiKMJ5xrt5c743cL03y/K7y1rg3WrIC49xGiEQ4mxdNw==", + "dev": true, + "dependencies": { + "@graphql-typed-document-node/core": "^3.2.0", + "cross-fetch": "^3.1.5" + }, + "peerDependencies": { + "graphql": "14 - 16" + } + }, + "node_modules/graphql-scalars": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/graphql-scalars/-/graphql-scalars-1.23.0.tgz", + "integrity": "sha512-YTRNcwitkn8CqYcleKOx9IvedA8JIERn8BRq21nlKgOr4NEcTaWEG0sT+H92eF3ALTFbPgsqfft4cw+MGgv0Gg==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/graphql-subscriptions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/graphql-subscriptions/-/graphql-subscriptions-2.0.0.tgz", + "integrity": "sha512-s6k2b8mmt9gF9pEfkxsaO1lTxaySfKoEJzEfmwguBbQ//Oq23hIXCfR1hm4kdh5hnR20RdwB+s3BCb+0duHSZA==", + "dependencies": { + "iterall": "^1.3.0" + }, + "peerDependencies": { + "graphql": "^15.7.2 || ^16.0.0" + } + }, + "node_modules/graphql-tag": { + "version": "2.12.6", + "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz", + "integrity": "sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "graphql": "^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/graphql-upload": { + "version": "16.0.2", + "resolved": "https://registry.npmjs.org/graphql-upload/-/graphql-upload-16.0.2.tgz", + "integrity": "sha512-enwIkZqUELdNH9lrjHlTNfj7gLitSa0EAX4TNXZtg2frnmQzPhpjH0l+6K7ft274fhoRCIcz8SKiNRJDf/cG4Q==", + "dependencies": { + "@types/busboy": "^1.5.0", + "@types/node": "*", + "@types/object-path": "^0.11.1", + "busboy": "^1.6.0", + "fs-capacitor": "^8.0.0", + "http-errors": "^2.0.0", + "object-path": "^0.11.8" + }, + "engines": { + "node": "^14.17.0 || ^16.0.0 || >= 18.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/jaydenseric" + }, + "peerDependencies": { + "@types/express": "^4.0.29", + "@types/koa": "^2.11.4", + "graphql": "^16.3.0" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + }, + "@types/koa": { + "optional": true + } + } + }, + "node_modules/graphql-voyager": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/graphql-voyager/-/graphql-voyager-2.0.0.tgz", + "integrity": "sha512-mlLUChRP1k6chHCfOMBBfnvuDnMrEQho0EYzuBhBV7oIZJPh97FqTAaly4jpUAMOFxSR5SBDpNLy0cLesHG9sg==", + "dependencies": { + "@emotion/react": "11.10.5", + "@emotion/styled": "11.10.5", + "@mui/icons-material": "5.11.0", + "@mui/lab": "5.0.0-alpha.114", + "@mui/material": "5.11.2", + "commonmark": "0.30.0", + "svg-pan-zoom": "3.6.1" + }, + "funding": { + "url": "https://github.com/graphql-kit/graphql-voyager?sponsor=1" + }, + "peerDependencies": { + "graphql": ">=16.5.0", + "react": ">=18.0.0" + } + }, + "node_modules/graphql-ws": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/graphql-ws/-/graphql-ws-5.16.0.tgz", + "integrity": "sha512-Ju2RCU2dQMgSKtArPbEtsK5gNLnsQyTNIo/T7cZNp96niC1x0KdJNZV0TIoilceBPQwfb5itrGl8pkFeOUMl4A==", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "graphql": ">=0.11 <=16" + } + }, + "node_modules/graphql-yoga": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/graphql-yoga/-/graphql-yoga-5.3.1.tgz", + "integrity": "sha512-n918QV6TF7xTjb9ASnozgsr4ydMc08c+x4eRAWKxxWVwSnzdP2xeN2zw1ljIzRD0ccSCNoBajGDKwcZkJDitPA==", + "dependencies": { + "@envelop/core": "^5.0.0", + "@graphql-tools/executor": "^1.2.5", + "@graphql-tools/schema": "^10.0.0", + "@graphql-tools/utils": "^10.1.0", + "@graphql-yoga/logger": "^2.0.0", + "@graphql-yoga/subscription": "^5.0.0", + "@whatwg-node/fetch": "^0.9.17", + "@whatwg-node/server": "^0.9.33", + "dset": "^3.1.1", + "lru-cache": "^10.0.0", + "tslib": "^2.5.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "graphql": "^15.2.0 || ^16.0.0" + } + }, + "node_modules/graphql-yoga/node_modules/@whatwg-node/events": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@whatwg-node/events/-/events-0.1.1.tgz", + "integrity": "sha512-AyQEn5hIPV7Ze+xFoXVU3QTHXVbWPrzaOkxtENMPMuNL6VVHrp4hHfDt9nrQpjO7BgvuM95dMtkycX5M/DZR3w==", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/graphql-yoga/node_modules/@whatwg-node/fetch": { + "version": "0.9.18", + "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.9.18.tgz", + "integrity": "sha512-hqoz6StCW+AjV/3N+vg0s1ah82ptdVUb9nH2ttj3UbySOXUvytWw2yqy8c1cKzyRk6mDD00G47qS3fZI9/gMjg==", + "dependencies": { + "@whatwg-node/node-fetch": "^0.5.7", + "urlpattern-polyfill": "^10.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/graphql-yoga/node_modules/@whatwg-node/node-fetch": { + "version": "0.5.11", + "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.5.11.tgz", + "integrity": "sha512-LS8tSomZa3YHnntpWt3PP43iFEEl6YeIsvDakczHBKlay5LdkXFr8w7v8H6akpG5nRrzydyB0k1iE2eoL6aKIQ==", + "dependencies": { + "@kamilkisiela/fast-url-parser": "^1.1.4", + "@whatwg-node/events": "^0.1.0", + "busboy": "^1.6.0", + "fast-querystring": "^1.1.1", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/graphql-yoga/node_modules/lru-cache": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", + "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/graphql-yoga/node_modules/urlpattern-polyfill": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", + "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==" + }, + "node_modules/gray-matter": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-2.1.1.tgz", + "integrity": "sha512-vbmvP1Fe/fxuT2QuLVcqb2BfK7upGhhbLIt9/owWEvPYrZZEkelLcq2HqzxosV+PQ67dUFLaAeNpH7C4hhICAA==", + "dependencies": { + "ansi-red": "^0.1.1", + "coffee-script": "^1.12.4", + "extend-shallow": "^2.0.1", + "js-yaml": "^3.8.1", + "toml": "^2.3.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gray-matter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/gray-matter/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/gray-matter/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/gulp-header": { + "version": "1.8.12", + "resolved": "https://registry.npmjs.org/gulp-header/-/gulp-header-1.8.12.tgz", + "integrity": "sha512-lh9HLdb53sC7XIZOYzTXM4lFuXElv3EVkSDhsd7DoJBj7hm+Ni7D3qYbb+Rr8DuM8nRanBvkVO9d7askreXGnQ==", + "deprecated": "Removed event-stream from gulp-header", + "dependencies": { + "concat-with-sourcemaps": "*", + "lodash.template": "^4.4.0", + "through2": "^2.0.0" + } + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/header-case": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", + "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", + "dev": true, + "dependencies": { + "capital-case": "^1.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/helmet": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/helmet/-/helmet-7.1.0.tgz", + "integrity": "sha512-g+HZqgfbpXdCkme/Cd/mZkV0aV3BZZZSugecH03kl38m/Kmdx8jKjBikpDj2cr+Iynv4KpYEviojNdTJActJAg==", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", + "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/husky": { + "version": "9.1.5", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.5.tgz", + "integrity": "sha512-rowAVRUBfI0b4+niA4SJMhfQwc107VLkBUgEYYAOQAbqDCnra1nYh83hF/MDmhYs9t9n1E3DuKOrs2LYNC+0Ag==", + "dev": true, + "bin": { + "husky": "bin.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, + "node_modules/i18n": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/i18n/-/i18n-0.15.1.tgz", + "integrity": "sha512-yue187t8MqUPMHdKjiZGrX+L+xcUsDClGO0Cz4loaKUOK9WrGw5pgan4bv130utOwX7fHE9w2iUeHFalVQWkXA==", + "dependencies": { + "@messageformat/core": "^3.0.0", + "debug": "^4.3.3", + "fast-printf": "^1.6.9", + "make-plural": "^7.0.0", + "math-interval-parser": "^2.0.1", + "mustache": "^4.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/mashpie" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-hash": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/image-hash/-/image-hash-5.3.2.tgz", + "integrity": "sha512-of8SekDXKFoaK4R93dP/Lzw6+NRGag8Jr9YlIIZ9jJVn9KYLfYVo/ARbKtbRn+tdTz/wDzBObx6yflKpLSYbxA==", + "dependencies": { + "@cwasm/webp": "^0.1.5", + "file-type": "^16.5.3", + "jpeg-js": "^0.4.0", + "pngjs": "^6.0.0", + "request": "^2.81.0" + } + }, + "node_modules/immutable": { + "version": "3.7.6", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.7.6.tgz", + "integrity": "sha512-AizQPcaofEtO11RZhPPHBOJRdo/20MKQF9mBLnVkBoyHi1/zXK8fzVdnEpSV9gxqtnh6Qomfp3F0xT5qP/vThw==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-4.0.0.tgz", + "integrity": "sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==", + "dev": true, + "engines": { + "node": ">=12.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/inquirer": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz", + "integrity": "sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^6.0.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/ioredis": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.4.1.tgz", + "integrity": "sha512-2YZsvl7jopIa1gaePkeMtd9rAcSjOOjPtpcLlOeusyO+XH2SK5ZcT+UCrElPP+WVIInh2TzeI4XW9ENaSLVVHA==", + "dependencies": { + "@ioredis/commands": "^1.1.1", + "cluster-key-slot": "^1.1.0", + "debug": "^4.3.4", + "denque": "^2.1.0", + "lodash.defaults": "^4.2.0", + "lodash.isarguments": "^3.1.0", + "redis-errors": "^1.2.0", + "redis-parser": "^3.0.0", + "standard-as-callback": "^2.1.0" + }, + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ioredis" + } + }, + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/ip-address/node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "dependencies": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-bluebird": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-bluebird/-/is-bluebird-1.0.2.tgz", + "integrity": "sha512-PDRu1vVip5dGQg5tfn2qVCCyxbBYu5MhYUJwSfL/RoGBI97n1fxvilVazxzptZW0gcmsMH17H4EVZZI5E/RSeA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-2.0.2.tgz", + "integrity": "sha512-bVcMJy4X5Og6VZfdOZstSexlEy20Sr0k/p/b2IlQJlfdKAQuMpiv5w2Ccxb8sKdRUNAG1PnHVHjFSdRDVS6NlQ==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "dependencies": { + "is-unc-path": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "node_modules/is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "dependencies": { + "unc-path-regex": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-upper-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-2.0.2.tgz", + "integrity": "sha512-44pxmxAvnnAOwBg4tHPnkfvgjPwbc5QIsSstNU+YcJ1ovxVzCWpSGosPJOZh/a1tdl81fbgnLc9LLv+x2ywbPQ==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isobject/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/isomorphic-ws": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", + "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.23", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/iterall": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.3.0.tgz", + "integrity": "sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==" + }, + "node_modules/jackspeak": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.1.tgz", + "integrity": "sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/jju": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", + "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", + "dev": true + }, + "node_modules/jose": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/jose/-/jose-5.2.3.tgz", + "integrity": "sha512-KUXdbctm1uHVL8BYhnyHkgp3zDX5KW8ZhAKVFEfUbU2P8Alpzjb+48hHvjOdQIyPshoblhzsuqOwEEAbtHVirA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/jpeg-js": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.4.tgz", + "integrity": "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==" + }, + "node_modules/js-git": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/js-git/-/js-git-0.7.8.tgz", + "integrity": "sha512-+E5ZH/HeRnoc/LW0AmAyhU+mNcWBzAKE+30+IDMLSLbbK+Tdt02AdkOKq9u15rlJsDEGFqtgckc8ZM59LhhiUA==", + "dependencies": { + "bodec": "^0.1.0", + "culvert": "^0.1.2", + "git-sha1": "^0.1.2", + "pako": "^0.2.5" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==" + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stable-stringify": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.1.1.tgz", + "integrity": "sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "isarray": "^2.0.5", + "jsonify": "^0.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + }, + "node_modules/json-to-pretty-yaml": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/json-to-pretty-yaml/-/json-to-pretty-yaml-1.2.2.tgz", + "integrity": "sha512-rvm6hunfCcqegwYaG5T4yKJWxc9FXFgBVrcTZ4XfSVRwa5HA/Xs+vB/Eo9treYYHCeNM0nrSUr82V/M31Urc7A==", + "dev": true, + "dependencies": { + "remedial": "^1.0.7", + "remove-trailing-spaces": "^1.0.6" + }, + "engines": { + "node": ">= 0.2.0" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", + "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jsonwebtoken/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jsonwebtoken/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jwt-decode": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-4.0.0.tgz", + "integrity": "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==", + "engines": { + "node": ">=18" + } + }, + "node_modules/kareem": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.6.3.tgz", + "integrity": "sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q==", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" + }, + "node_modules/lazy": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/lazy/-/lazy-1.0.11.tgz", + "integrity": "sha512-Y+CjUfLmIpoUCCRl0ub4smrYtGGr5AOa2AKOaWelGHOGz33X/Y/KizefGqbkwfz44+cnq/+9habclf8vOmu2LA==", + "engines": { + "node": ">=0.2.0" + } + }, + "node_modules/lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha512-7vp2Acd2+Kz4XkzxGxaB1FWOi8KjWIWsgdfD5MCb86DWvlLqhRPM+d6Pro3iNEL5VT9mstz5hKAlcd+QR6H3aA==", + "dependencies": { + "set-getter": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "peer": true, + "dependencies": { + "uc.micro": "^2.0.0" + } + }, + "node_modules/lint-staged": { + "version": "15.2.10", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.10.tgz", + "integrity": "sha512-5dY5t743e1byO19P9I4b3x8HJwalIznL5E1FWYnU6OWw33KxNBSLAc6Cy7F2PsFEO8FKnLwjwm5hx7aMF0jzZg==", + "dev": true, + "dependencies": { + "chalk": "~5.3.0", + "commander": "~12.1.0", + "debug": "~4.3.6", + "execa": "~8.0.1", + "lilconfig": "~3.1.2", + "listr2": "~8.2.4", + "micromatch": "~4.0.8", + "pidtree": "~0.6.0", + "string-argv": "~0.3.2", + "yaml": "~2.5.0" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "engines": { + "node": ">=18.12.0" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/lint-staged/node_modules/ansi-escapes": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", + "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", + "dev": true, + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/lint-staged/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/lint-staged/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/lint-staged/node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/cli-truncate": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "dev": true, + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/emoji-regex": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", + "dev": true + }, + "node_modules/lint-staged/node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/listr2": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.4.tgz", + "integrity": "sha512-opevsywziHd3zHCVQGAj8zu+Z3yHNkkoYhWIGnq54RrCVwLz0MozotJEDnKsIBLvkfLGN6BLOyAeRrYI0pKA4g==", + "dev": true, + "dependencies": { + "cli-truncate": "^4.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/lint-staged/node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", + "dev": true, + "dependencies": { + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", + "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", + "dev": true, + "dependencies": { + "get-east-asian-width": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", + "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/lint-staged/node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/lint-staged/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/lint-staged/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/list-item": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/list-item/-/list-item-1.1.1.tgz", + "integrity": "sha512-S3D0WZ4J6hyM8o5SNKWaMYB1ALSacPZ2nHGEuCjmHZ+dc03gFeNZoNDcqfcnO4vDhTZmNrqrpYZCdXsRh22bzw==", + "dependencies": { + "expand-range": "^1.8.1", + "extend-shallow": "^2.0.1", + "is-number": "^2.1.0", + "repeat-string": "^1.5.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/listr2": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-4.0.5.tgz", + "integrity": "sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA==", + "dev": true, + "dependencies": { + "cli-truncate": "^2.1.0", + "colorette": "^2.0.16", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.5.5", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + }, + "peerDependenciesMeta": { + "enquirer": { + "optional": true + } + } + }, + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==" + }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + }, + "node_modules/lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, + "node_modules/lodash.lowercase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.lowercase/-/lodash.lowercase-4.3.0.tgz", + "integrity": "sha512-UcvP1IZYyDKyEL64mmrwoA1AbFu5ahojhTtkOUr1K9dbuxzS9ev8i4TxMMGCqRC9TE8uDaSoufNAXxRPNTseVA==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==" + }, + "node_modules/lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "dependencies": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "node_modules/lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "dependencies": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/logform": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.0.tgz", + "integrity": "sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==", + "dependencies": { + "@colors/colors": "1.6.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/logform/node_modules/@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/loglevel": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.1.tgz", + "integrity": "sha512-hP3I3kCrDIMuRwAwHltphhDM1r8i55H33GgqjXbrisuJhF4kRhW1dNuxsRklp4bXl8DSdLaNLuiL4A/LWRfxvg==", + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/loupe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz", + "integrity": "sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lower-case-first": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-2.0.2.tgz", + "integrity": "sha512-EVm/rR94FJTZi3zefZ82fLWab+GX14LJN4HrWBcuo6Evmsl9hEfnqxgcHCKb9q+mNf6EVdsjx/qucYFIIB84pg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "peer": true + }, + "node_modules/magic-string": { + "version": "0.30.11", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", + "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/magicast": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.4.tgz", + "integrity": "sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.24.4", + "@babel/types": "^7.24.0", + "source-map-js": "^1.2.0" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-plural": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/make-plural/-/make-plural-7.3.0.tgz", + "integrity": "sha512-/K3BC0KIsO+WK2i94LkMPv3wslMrazrQhfi5We9fMbLlLjzoOSJWr7TAdupLlDWaJcWxwoNosBkhFDejiu5VDw==" + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/markdown-it": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", + "peer": true, + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/markdown-it/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "peer": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/markdown-it/node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "peer": true + }, + "node_modules/markdown-link": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/markdown-link/-/markdown-link-0.1.1.tgz", + "integrity": "sha512-TurLymbyLyo+kAUUAV9ggR9EPcDjP/ctlv9QAFiqUH7c+t6FlsbivPo9OKTU8xdOx9oNd2drW/Fi5RRElQbUqA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/markdown-toc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/markdown-toc/-/markdown-toc-1.2.0.tgz", + "integrity": "sha512-eOsq7EGd3asV0oBfmyqngeEIhrbkc7XVP63OwcJBIhH2EpG2PzFcbZdhy1jutXSlRBBVMNXHvMtSr5LAxSUvUg==", + "dependencies": { + "concat-stream": "^1.5.2", + "diacritics-map": "^0.1.0", + "gray-matter": "^2.1.0", + "lazy-cache": "^2.0.2", + "list-item": "^1.1.1", + "markdown-link": "^0.1.1", + "minimist": "^1.2.0", + "mixin-deep": "^1.1.3", + "object.pick": "^1.2.0", + "remarkable": "^1.7.1", + "repeat-string": "^1.6.1", + "strip-color": "^0.1.0" + }, + "bin": { + "markdown-toc": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/math-interval-parser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/math-interval-parser/-/math-interval-parser-2.0.1.tgz", + "integrity": "sha512-VmlAmb0UJwlvMyx8iPhXUDnVW1F9IrGEd9CIOmv+XL8AErCUUuozoDMrgImvnYt2A+53qVX/tPW6YJurMKYsvA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/math-random": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", + "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==" + }, + "node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==" + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/meros": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/meros/-/meros-1.3.0.tgz", + "integrity": "sha512-2BNGOimxEz5hmjUG2FwoxCt5HN7BXdaWyFqEwxPTrJzVdABtrL4TiHTcsWSFAxPQ/tOnEaQEJh3qWq71QRMY+w==", + "engines": { + "node": ">=13" + }, + "peerDependencies": { + "@types/node": ">=13" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/module-details-from-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", + "integrity": "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==" + }, + "node_modules/mongodb": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.8.0.tgz", + "integrity": "sha512-HGQ9NWDle5WvwMnrvUxsFYPd3JEbqD3RgABHBQRuoCEND0qzhsd0iH5ypHsf1eJ+sXmvmyKpP+FLOKY8Il7jMw==", + "dependencies": { + "@mongodb-js/saslprep": "^1.1.5", + "bson": "^6.7.0", + "mongodb-connection-string-url": "^3.0.0" + }, + "engines": { + "node": ">=16.20.1" + }, + "peerDependencies": { + "@aws-sdk/credential-providers": "^3.188.0", + "@mongodb-js/zstd": "^1.1.0", + "gcp-metadata": "^5.2.0", + "kerberos": "^2.0.1", + "mongodb-client-encryption": ">=6.0.0 <7", + "snappy": "^7.2.2", + "socks": "^2.7.1" + }, + "peerDependenciesMeta": { + "@aws-sdk/credential-providers": { + "optional": true + }, + "@mongodb-js/zstd": { + "optional": true + }, + "gcp-metadata": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "snappy": { + "optional": true + }, + "socks": { + "optional": true + } + } + }, + "node_modules/mongodb-connection-string-url": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.0.tgz", + "integrity": "sha512-t1Vf+m1I5hC2M5RJx/7AtxgABy1cZmIPQRMXw+gEIPn/cZNF3Oiy+l0UIypUwVB5trcWHq3crg2g3uAR9aAwsQ==", + "dependencies": { + "@types/whatwg-url": "^11.0.2", + "whatwg-url": "^13.0.0" + } + }, + "node_modules/mongoose": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.3.2.tgz", + "integrity": "sha512-3JcpDjFI25cF/3xpu+4+9nM0lURQTNLcP86X83+LvuICdn453QQLmhSrUr2IPM/ffLiDE9KPl9slNb2s0hZPpg==", + "dependencies": { + "bson": "^6.5.0", + "kareem": "2.6.3", + "mongodb": "6.5.0", + "mpath": "0.9.0", + "mquery": "5.0.0", + "ms": "2.1.3", + "sift": "16.0.1" + }, + "engines": { + "node": ">=16.20.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mongoose" + } + }, + "node_modules/mongoose-paginate-v2": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/mongoose-paginate-v2/-/mongoose-paginate-v2-1.8.3.tgz", + "integrity": "sha512-Fkg9amsmtRkqUQ19kwOvw6XodkqXoySr82MkV5XPeD+1u/m68tWnDcz3xRwDPzlIsAr1ctx/4Rz/bnfD3PIJqQ==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mongoose/node_modules/mongodb": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.5.0.tgz", + "integrity": "sha512-Fozq68InT+JKABGLqctgtb8P56pRrJFkbhW0ux+x1mdHeyinor8oNzJqwLjV/t5X5nJGfTlluxfyMnOXNggIUA==", + "dependencies": { + "@mongodb-js/saslprep": "^1.1.5", + "bson": "^6.4.0", + "mongodb-connection-string-url": "^3.0.0" + }, + "engines": { + "node": ">=16.20.1" + }, + "peerDependencies": { + "@aws-sdk/credential-providers": "^3.188.0", + "@mongodb-js/zstd": "^1.1.0", + "gcp-metadata": "^5.2.0", + "kerberos": "^2.0.1", + "mongodb-client-encryption": ">=6.0.0 <7", + "snappy": "^7.2.2", + "socks": "^2.7.1" + }, + "peerDependenciesMeta": { + "@aws-sdk/credential-providers": { + "optional": true + }, + "@mongodb-js/zstd": { + "optional": true + }, + "gcp-metadata": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "snappy": { + "optional": true + }, + "socks": { + "optional": true + } + } + }, + "node_modules/mongoose/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/moo": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz", + "integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==" + }, + "node_modules/morgan": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", + "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", + "dependencies": { + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/morgan/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/morgan/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/morgan/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/mpath": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", + "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mquery": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz", + "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==", + "dependencies": { + "debug": "4.x" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "bin": { + "mustache": "bin/mustache" + } + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" + }, + "node_modules/nanoid": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.7.tgz", + "integrity": "sha512-oLxFY2gd2IqnjcYyOXD8XGCftpGtZP2AbHbOkthDkvRywH5ayNtPVy9YlOPcHckXzbLTCHpkb7FB+yuxKV13pQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^18 || >=20" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + }, + "node_modules/needle": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz", + "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==", + "dependencies": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/needle/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-abort-controller": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", + "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==" + }, + "node_modules/node-addon-api": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.0.tgz", + "integrity": "sha512-mNcltoe1R8o7STTegSOHdnJNN7s5EUvhoS7ShnTHDyOSd+8H+UdWODq6qSv67PjC8Zc5JRT8+oLAMCr0SIXw7g==", + "dev": true, + "engines": { + "node": "^16 || ^18 || >= 20" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" + }, + "node_modules/nodemailer": { + "version": "6.9.15", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.15.tgz", + "integrity": "sha512-AHf04ySLC6CIfuRtRiEYtGEXgRfa6INgWGluDhnxTZhHSKvrBu7lc1VVchQ0d8nPc4cFaZoPq8vkyNoZr0TpGQ==", + "license": "MIT-0", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nssocket": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/nssocket/-/nssocket-0.6.0.tgz", + "integrity": "sha512-a9GSOIql5IqgWJR3F/JXG4KpJTA3Z53Cj0MeMvGpglytB1nxE4PdFNC0jINe27CS7cGivoynwc054EzCcT3M3w==", + "dependencies": { + "eventemitter2": "~0.4.14", + "lazy": "~1.0.11" + }, + "engines": { + "node": ">= 0.10.x" + } + }, + "node_modules/nssocket/node_modules/eventemitter2": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", + "integrity": "sha512-K7J4xq5xAD5jHsGM5ReWXRTFa3JRGofHiMcVgQ8PRwgWxzjHpMWCIzsmyf60+mh8KLsqYPcjUMa0AC4hd6lPyQ==" + }, + "node_modules/nullthrows": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", + "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", + "dev": true + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-path": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.8.tgz", + "integrity": "sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA==", + "engines": { + "node": ">= 10.12.0" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.values": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "dependencies": { + "fn.name": "1.x.x" + } + }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pac-proxy-agent": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz", + "integrity": "sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==", + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.2", + "pac-resolver": "^7.0.0", + "socks-proxy-agent": "^8.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "dev": true + }, + "node_modules/pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==" + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", + "dev": true, + "dependencies": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", + "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", + "dev": true, + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", + "dev": true, + "dependencies": { + "path-root-regex": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-scurry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "dev": true, + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.0.tgz", + "integrity": "sha512-Qv32eSV1RSCfhY3fpPE2GNZ8jgM9X7rdAfemLWqTUxwiyIC4jJ6Sy0fZ8H+oLWevO6i4/bizg7c8d8i6bxrzbA==", + "dev": true, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true + }, + "node_modules/pathval": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", + "dev": true, + "engines": { + "node": ">= 14.16" + } + }, + "node_modules/peek-readable": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz", + "integrity": "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==", + "engines": { + "node": ">=8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, + "node_modules/picocolors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "dev": true, + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pidusage": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pidusage/-/pidusage-3.0.2.tgz", + "integrity": "sha512-g0VU+y08pKw5M8EZ2rIGiEBaB8wrQMjYGFfW2QVIfyT8V+fq8YFLkvlz4bz5ljvFDJYNFCWT3PWqcRr2FKO81w==", + "dependencies": { + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pm2": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/pm2/-/pm2-5.4.0.tgz", + "integrity": "sha512-9TrDuckcSEnINoURygr3yfruK20qXuOUPOPQyIh4FIskQduyDNst9ys1XAt9YPY3RyGxVr2+x8Irsdma3klVQw==", + "dependencies": { + "@pm2/agent": "~2.0.0", + "@pm2/io": "~6.0.0", + "@pm2/js-api": "~0.8.0", + "@pm2/pm2-version-check": "latest", + "async": "~3.2.0", + "blessed": "0.1.81", + "chalk": "3.0.0", + "chokidar": "^3.5.3", + "cli-tableau": "^2.0.0", + "commander": "2.15.1", + "croner": "~4.1.92", + "dayjs": "~1.11.5", + "debug": "^4.3.1", + "enquirer": "2.3.6", + "eventemitter2": "5.0.1", + "fclone": "1.0.11", + "js-yaml": "~4.1.0", + "mkdirp": "1.0.4", + "needle": "2.4.0", + "pidusage": "~3.0", + "pm2-axon": "~4.0.1", + "pm2-axon-rpc": "~0.7.1", + "pm2-deploy": "~1.0.2", + "pm2-multimeter": "^0.1.2", + "promptly": "^2", + "semver": "^7.2", + "source-map-support": "0.5.21", + "sprintf-js": "1.1.2", + "vizion": "~2.2.1" + }, + "bin": { + "pm2": "bin/pm2", + "pm2-dev": "bin/pm2-dev", + "pm2-docker": "bin/pm2-docker", + "pm2-runtime": "bin/pm2-runtime" + }, + "engines": { + "node": ">=12.0.0" + }, + "optionalDependencies": { + "pm2-sysmonit": "^1.2.8" + } + }, + "node_modules/pm2-axon": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pm2-axon/-/pm2-axon-4.0.1.tgz", + "integrity": "sha512-kES/PeSLS8orT8dR5jMlNl+Yu4Ty3nbvZRmaAtROuVm9nYYGiaoXqqKQqQYzWQzMYWUKHMQTvBlirjE5GIIxqg==", + "dependencies": { + "amp": "~0.3.1", + "amp-message": "~0.1.1", + "debug": "^4.3.1", + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=5" + } + }, + "node_modules/pm2-axon-rpc": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/pm2-axon-rpc/-/pm2-axon-rpc-0.7.1.tgz", + "integrity": "sha512-FbLvW60w+vEyvMjP/xom2UPhUN/2bVpdtLfKJeYM3gwzYhoTEEChCOICfFzxkxuoEleOlnpjie+n1nue91bDQw==", + "dependencies": { + "debug": "^4.3.1" + }, + "engines": { + "node": ">=5" + } + }, + "node_modules/pm2-deploy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pm2-deploy/-/pm2-deploy-1.0.2.tgz", + "integrity": "sha512-YJx6RXKrVrWaphEYf++EdOOx9EH18vM8RSZN/P1Y+NokTKqYAca/ejXwVLyiEpNju4HPZEk3Y2uZouwMqUlcgg==", + "dependencies": { + "run-series": "^1.1.8", + "tv4": "^1.3.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pm2-multimeter": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/pm2-multimeter/-/pm2-multimeter-0.1.2.tgz", + "integrity": "sha512-S+wT6XfyKfd7SJIBqRgOctGxaBzUOmVQzTAS+cg04TsEUObJVreha7lvCfX8zzGVr871XwCSnHUU7DQQ5xEsfA==", + "dependencies": { + "charm": "~0.1.1" + } + }, + "node_modules/pm2-sysmonit": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/pm2-sysmonit/-/pm2-sysmonit-1.2.8.tgz", + "integrity": "sha512-ACOhlONEXdCTVwKieBIQLSi2tQZ8eKinhcr9JpZSUAL8Qy0ajIgRtsLxG/lwPOW3JEKqPyw/UaHmTWhUzpP4kA==", + "optional": true, + "dependencies": { + "async": "^3.2.0", + "debug": "^4.3.1", + "pidusage": "^2.0.21", + "systeminformation": "^5.7", + "tx2": "~1.0.4" + } + }, + "node_modules/pm2-sysmonit/node_modules/pidusage": { + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/pidusage/-/pidusage-2.0.21.tgz", + "integrity": "sha512-cv3xAQos+pugVX+BfXpHsbyz/dLzX+lr44zNMsYiGxUw+kV5sgQCIcLd1z+0vq+KyC7dJ+/ts2PsfgWfSC3WXA==", + "optional": true, + "dependencies": { + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pm2/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pm2/node_modules/commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==" + }, + "node_modules/pm2/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pm2/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pngjs": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-6.0.0.tgz", + "integrity": "sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg==", + "engines": { + "node": ">=12.13.0" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.4.47", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", + "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss/node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "dependencies": { + "asap": "~2.0.3" + } + }, + "node_modules/promptly": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/promptly/-/promptly-2.2.0.tgz", + "integrity": "sha512-aC9j+BZsRSSzEsXBNBwDnAxujdx19HycZoKgRgzWnS8eOHg1asuf9heuLprfbe739zY3IdUQx+Egv6Jn135WHA==", + "dependencies": { + "read": "^1.0.4" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-agent": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.3.1.tgz", + "integrity": "sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.2", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.0.1", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + }, + "node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true + }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pvtsutils": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.5.tgz", + "integrity": "sha512-ARvb14YB9Nm2Xi6nBq1ZX6dAM0FsJnuk+31aUp4TrcZEdKUlSqOqsxJHUPJDNE3qiIp+iUPEIeR6Je/tgV7zsA==", + "dev": true, + "dependencies": { + "tslib": "^2.6.1" + } + }, + "node_modules/pvutils": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.3.tgz", + "integrity": "sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/randomatic": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "dependencies": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/randomatic/node_modules/is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/randomatic/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/read": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", + "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", + "dependencies": { + "mute-stream": "~0.0.4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/readable-web-to-node-stream": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", + "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", + "dependencies": { + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/readable-web-to-node-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/redis": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/redis/-/redis-4.7.0.tgz", + "integrity": "sha512-zvmkHEAdGMn+hMRXuMBtu4Vo5P6rHQjLoHftu+lBqq8ZTA3RCVC/WzD790bkKKiNFp7d5/9PcSD19fJyyRvOdQ==", + "dependencies": { + "@redis/bloom": "1.2.0", + "@redis/client": "1.6.0", + "@redis/graph": "1.1.1", + "@redis/json": "1.0.7", + "@redis/search": "1.2.0", + "@redis/time-series": "1.1.0" + } + }, + "node_modules/redis-errors": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", + "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/redis-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", + "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", + "dependencies": { + "redis-errors": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/relay-runtime": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/relay-runtime/-/relay-runtime-12.0.0.tgz", + "integrity": "sha512-QU6JKr1tMsry22DXNy9Whsq5rmvwr3LSZiiWV/9+DFpuTWvp+WFhobWMc8TC4OjKFfNhEZy7mOiqUAn5atQtug==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.0.0", + "fbjs": "^3.0.0", + "invariant": "^2.2.4" + } + }, + "node_modules/remarkable": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/remarkable/-/remarkable-1.7.4.tgz", + "integrity": "sha512-e6NKUXgX95whv7IgddywbeN/ItCkWbISmc2DiqHJb0wTrqZIexqdco5b8Z3XZoo/48IdNVKM9ZCvTPJ4F5uvhg==", + "dependencies": { + "argparse": "^1.0.10", + "autolinker": "~0.28.0" + }, + "bin": { + "remarkable": "bin/remarkable.js" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/remarkable/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/remarkable/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/remedial": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/remedial/-/remedial-1.0.8.tgz", + "integrity": "sha512-/62tYiOe6DzS5BqVsNpH/nkGlX45C/Sp6V+NtiN6JQNS1Viay7cWkazmRkrQrdFj2eshDe96SIQNIoMxqhzBOg==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==" + }, + "node_modules/remove-trailing-spaces": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/remove-trailing-spaces/-/remove-trailing-spaces-1.0.8.tgz", + "integrity": "sha512-O3vsMYfWighyFbTd8hk8VaSj9UAGENxAtX+//ugIst2RMk5e03h6RoIS+0ylsFxY1gvmPuAY/PO4It+gPEeySA==", + "dev": true + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request/node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/request/node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/request/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-in-the-middle": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-5.2.0.tgz", + "integrity": "sha512-efCx3b+0Z69/LGJmm9Yvi4cqEdxnoGnxYxGxBghkkTTFeXRtTCmmhO0AnAfHz59k957uTSuy8WaHqOs8wbYUWg==", + "dependencies": { + "debug": "^4.1.1", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/restore-cursor/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true + }, + "node_modules/rimraf": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.0.1.tgz", + "integrity": "sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==", + "dev": true, + "dependencies": { + "glob": "^11.0.0", + "package-json-from-dist": "^1.0.0" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.0.tgz", + "integrity": "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^4.0.1", + "minimatch": "^10.0.0", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.4.tgz", + "integrity": "sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.22.4", + "@rollup/rollup-android-arm64": "4.22.4", + "@rollup/rollup-darwin-arm64": "4.22.4", + "@rollup/rollup-darwin-x64": "4.22.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.22.4", + "@rollup/rollup-linux-arm-musleabihf": "4.22.4", + "@rollup/rollup-linux-arm64-gnu": "4.22.4", + "@rollup/rollup-linux-arm64-musl": "4.22.4", + "@rollup/rollup-linux-powerpc64le-gnu": "4.22.4", + "@rollup/rollup-linux-riscv64-gnu": "4.22.4", + "@rollup/rollup-linux-s390x-gnu": "4.22.4", + "@rollup/rollup-linux-x64-gnu": "4.22.4", + "@rollup/rollup-linux-x64-musl": "4.22.4", + "@rollup/rollup-win32-arm64-msvc": "4.22.4", + "@rollup/rollup-win32-ia32-msvc": "4.22.4", + "@rollup/rollup-win32-x64-msvc": "4.22.4", + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup/node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/rrule": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/rrule/-/rrule-2.8.1.tgz", + "integrity": "sha512-hM3dHSBMeaJ0Ktp7W38BJZ7O1zOgaFEsn41PDk+yHoEtfLV+PoJt9E9xAlZiWgf/iqEqionN0ebHFZIDAp+iGw==", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/run-series": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-series/-/run-series-1.1.9.tgz", + "integrity": "sha512-Arc4hUN896vjkqCYrUXquBFtRZdv1PfLbTYP71efP6butxyQ0kWpiNJyAgsxscmQg1cqvHY32/UCBzXedTpU2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-identifier": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/safe-identifier/-/safe-identifier-0.4.2.tgz", + "integrity": "sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w==" + }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-stable-stringify": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", + "engines": { + "node": ">=10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sax": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", + "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==" + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/scuid": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/scuid/-/scuid-1.1.0.tgz", + "integrity": "sha512-MuCAyrGZcTLfQoH2XoBlQ8C6bzwN88XT/0slOGz0pn8+gIP85BOAfYa44ZXQUTOwRwPU0QvgU+V+OSajl/59Xg==", + "dev": true + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/sentence-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", + "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-getter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.1.tgz", + "integrity": "sha512-9sVWOy+gthr+0G9DzqqLaYNA7+5OKkSmcqjL9cBpDEaZrr3ShQlyX2cZ/O/ozE41oxn/Tt0LGEM/w4Rub3A3gw==", + "dependencies": { + "to-object-path": "^0.3.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/shiki": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.10.3.tgz", + "integrity": "sha512-eneCLncGuvPdTutJuLyUGS8QNPAVFO5Trvld2wgEq1e002mwctAhJKeMGWtWVXOIEzmlcLRqcgPSorR6AVzOmQ==", + "peer": true, + "dependencies": { + "@shikijs/core": "1.10.3", + "@types/hast": "^3.0.4" + } + }, + "node_modules/shimmer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", + "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sift": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz", + "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==" + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/signedsource": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/signedsource/-/signedsource-1.0.0.tgz", + "integrity": "sha512-6+eerH9fEnNmi/hyM1DXcRK3pWdoMQtlkQ+ns0ntzunjKqp5i3sKCc80ym8Fib3iaYhdJUOPdhlJWj1tvge2Ww==", + "dev": true + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "dev": true, + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/socks": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.1.tgz", + "integrity": "sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ==", + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz", + "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "socks": "^2.7.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "dependencies": { + "memory-pager": "^1.0.2" + } + }, + "node_modules/sponge-case": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sponge-case/-/sponge-case-1.0.1.tgz", + "integrity": "sha512-dblb9Et4DAtiZ5YSUZHLl4XhH4uK80GhAZrVXdN4O2P4gQ40Wa5UIOPUHlA/nFd2PLblBZWUioLMMAVrgpoYcA==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==" + }, + "node_modules/sshpk": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sshpk/node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + }, + "node_modules/stack-chain": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/stack-chain/-/stack-chain-1.3.7.tgz", + "integrity": "sha512-D8cWtWVdIe/jBA7v5p5Hwl5yOSOrmZPWDPe2KxQ5UAGD+nxbxU0lKXA4h85Ta6+qgdKVL3vUxsbIZjc1kBG7ug==" + }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "engines": { + "node": "*" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true + }, + "node_modules/standard-as-callback": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", + "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==" + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", + "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==" + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true, + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-env-interpolation": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string-env-interpolation/-/string-env-interpolation-1.0.1.tgz", + "integrity": "sha512-78lwMoCcn0nNu8LszbP1UA7g55OeE4v7rCeWnM5B453rnNr4aq+5it3FEYtZrSEiMvHZOZ9Jlqb0OD0M2VInqg==", + "dev": true + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.repeat": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-0.2.0.tgz", + "integrity": "sha512-1BH+X+1hSthZFW+X+JaUkjkkUPwIlLEMJBLANN3hOob3RhEk5snLWNECDnYbgn/m5c5JV7Ersu1Yubaf+05cIA==" + }, + "node_modules/string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-color": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/strip-color/-/strip-color-0.1.0.tgz", + "integrity": "sha512-p9LsUieSjWNNAxVCXLeilaDlmuUOrDS5/dF9znM1nZc7EGX5+zEFC0bEevsNIaldjlks+2jns5Siz6F9iK6jwA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strtok3": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.3.0.tgz", + "integrity": "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "peek-readable": "^4.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-pan-zoom": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/svg-pan-zoom/-/svg-pan-zoom-3.6.1.tgz", + "integrity": "sha512-JaKkGHHfGvRrcMPdJWkssLBeWqM+Isg/a09H7kgNNajT1cX5AztDTNs+C8UzpCxjCTRrG34WbquwaovZbmSk9g==" + }, + "node_modules/swap-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-2.0.2.tgz", + "integrity": "sha512-kc6S2YS/2yXbtkSMunBtKdah4VFETZ8Oh6ONSmSd9bRxhqTrtARUCBUiWXH3xVPpvR7tz2CSnkuXVE42EcGnMw==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/systeminformation": { + "version": "5.22.6", + "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.22.6.tgz", + "integrity": "sha512-hUTQX+bRgIFbv1T/z251NtwGwNIeSyWURnT2BGnsYu6dQNbkiBl4oAwk50acVfITFq1Zvb8KDNgibQK9uGlUGg==", + "optional": true, + "os": [ + "darwin", + "linux", + "win32", + "freebsd", + "openbsd", + "netbsd", + "sunos", + "android" + ], + "bin": { + "systeminformation": "lib/cli.js" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "Buy me a coffee", + "url": "https://www.buymeacoffee.com/systeminfo" + } + }, + "node_modules/test-exclude": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", + "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^10.4.1", + "minimatch": "^9.0.4" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/test-exclude/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/test-exclude/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, + "node_modules/test-exclude/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true + }, + "node_modules/tinyexec": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.0.tgz", + "integrity": "sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==", + "dev": true + }, + "node_modules/tinypool": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.1.tgz", + "integrity": "sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==", + "dev": true, + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", + "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/title-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/title-case/-/title-case-3.0.3.tgz", + "integrity": "sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/to-regex-range/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/token-types": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-4.2.1.tgz", + "integrity": "sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/toml": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/toml/-/toml-2.3.6.tgz", + "integrity": "sha512-gVweAectJU3ebq//Ferr2JUY4WKSDe5N+z0FvjDncLGyHmIDoxgY/2Ie4qfEIDm4IS7OA6Rmdm7pdEEdMcV/xQ==" + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tough-cookie/node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", + "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", + "dependencies": { + "punycode": "^2.3.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/tr46/node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/triple-beam": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-log": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/ts-log/-/ts-log-2.2.5.tgz", + "integrity": "sha512-PGcnJoTBnVGy6yYNFxWVNkdcAuAMstvutN9MgDJIV6L0oG8fB+ZNNy1T+wJzah8RPGor1mZuPQkVfXNDpy9eHA==", + "dev": true + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/tsx": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.1.tgz", + "integrity": "sha512-0flMz1lh74BR4wOvBjuh9olbnwqCPc35OOlfyzHba0Dc+QNUeWX/Gq2YTbnwcWPO3BMd8fkzRVrHcsR+a7z7rA==", + "dev": true, + "dependencies": { + "esbuild": "~0.23.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tv4": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tv4/-/tv4-1.3.0.tgz", + "integrity": "sha512-afizzfpJgvPr+eDkREK4MxJ/+r8nEEHcmitwgnPUqpaP+FpwQyadnxNoSACbgc/b1LsZYtODGoPiFxQrgJgjvw==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + }, + "node_modules/tx2": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tx2/-/tx2-1.0.5.tgz", + "integrity": "sha512-sJ24w0y03Md/bxzK4FU8J8JveYYUbSs2FViLJ2D/8bytSiyPRbuE3DyL/9UKYXTZlV3yXq0L8GLlhobTnekCVg==", + "optional": true, + "dependencies": { + "json-stringify-safe": "^5.0.1" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "node_modules/typedoc": { + "version": "0.26.3", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.26.3.tgz", + "integrity": "sha512-6d2Sw9disvvpdk4K7VNjKr5/3hzijtfQVHRthhDqJgnhMHy1wQz4yPMJVKXElvnZhFr0nkzo+GzjXDTRV5yLpg==", + "peer": true, + "dependencies": { + "lunr": "^2.3.9", + "markdown-it": "^14.1.0", + "minimatch": "^9.0.5", + "shiki": "^1.9.1", + "yaml": "^2.4.5" + }, + "bin": { + "typedoc": "bin/typedoc" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x" + } + }, + "node_modules/typedoc-plugin-markdown": { + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-4.2.7.tgz", + "integrity": "sha512-bLsQdweSm48P9j6kGqQ3/4GCH5zu2EnURSkkxqirNc+uVFE9YK825ogDw+WbNkRHIV6eZK/1U43gT7YfglyYOg==", + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "typedoc": "0.26.x" + } + }, + "node_modules/typescript": { + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ua-parser-js": { + "version": "1.0.37", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.37.tgz", + "integrity": "sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "engines": { + "node": "*" + } + }, + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "peer": true + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unixify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unixify/-/unixify-1.0.0.tgz", + "integrity": "sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg==", + "dependencies": { + "normalize-path": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unixify/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/upper-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", + "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/upper-case-first": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", + "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uri-js/node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/urlpattern-polyfill": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-8.0.2.tgz", + "integrity": "sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ==", + "dev": true + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/validator": { + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.12.0.tgz", + "integrity": "sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/value-or-promise": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/value-or-promise/-/value-or-promise-1.0.12.tgz", + "integrity": "sha512-Z6Uz+TYwEqE7ZN50gwn+1LCVo9ZVrpxRPOhOLnncYkY1ZzOYtrX8Fwf/rFktZ8R5mJms6EZf5TqNOMeZmnPq9Q==", + "engines": { + "node": ">=12" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/verror/node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + }, + "node_modules/vite": { + "version": "5.4.7", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.7.tgz", + "integrity": "sha512-5l2zxqMEPVENgvzTuBpHer2awaetimj2BGkhBPdnwKbPNOlHsODU+oiazEZzLK7KhAnOrO+XGYJYn4ZlUhDtDQ==", + "dev": true, + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.1.tgz", + "integrity": "sha512-N/mGckI1suG/5wQI35XeR9rsMsPqKXzq1CdUndzVstBj/HvyxxGctwnK6WX43NGt5L3Z5tcRf83g4TITKJhPrA==", + "dev": true, + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.6", + "pathe": "^1.1.2", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/vitest": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.1.tgz", + "integrity": "sha512-97We7/VC0e9X5zBVkvt7SGQMGrRtn3KtySFQG5fpaMlS+l62eeXRQO633AYhSTC3z7IMebnPPNjGXVGNRFlxBA==", + "dev": true, + "dependencies": { + "@vitest/expect": "2.1.1", + "@vitest/mocker": "2.1.1", + "@vitest/pretty-format": "^2.1.1", + "@vitest/runner": "2.1.1", + "@vitest/snapshot": "2.1.1", + "@vitest/spy": "2.1.1", + "@vitest/utils": "2.1.1", + "chai": "^5.1.1", + "debug": "^4.3.6", + "magic-string": "^0.30.11", + "pathe": "^1.1.2", + "std-env": "^3.7.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.0", + "tinypool": "^1.0.0", + "tinyrainbow": "^1.2.0", + "vite": "^5.0.0", + "vite-node": "2.1.1", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "2.1.1", + "@vitest/ui": "2.1.1", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/vizion": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vizion/-/vizion-2.2.1.tgz", + "integrity": "sha512-sfAcO2yeSU0CSPFI/DmZp3FsFE9T+8913nv1xWBOyzODv13fwkn6Vl7HqxGpkr9F608M+8SuFId3s+BlZqfXww==", + "dependencies": { + "async": "^2.6.3", + "git-node-fs": "^1.0.0", + "ini": "^1.3.5", + "js-git": "^0.7.8" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/vizion/node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/webcrypto-core": { + "version": "1.7.8", + "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.7.8.tgz", + "integrity": "sha512-eBR98r9nQXTqXt/yDRtInszPMjTaSAMJAFDg2AHsgrnczawT1asx9YNBX6k5p+MekbPF4+s/UJJrr88zsTqkSg==", + "dev": true, + "dependencies": { + "@peculiar/asn1-schema": "^2.3.8", + "@peculiar/json-schema": "^1.1.12", + "asn1js": "^3.0.1", + "pvtsutils": "^1.3.5", + "tslib": "^2.6.2" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-13.0.0.tgz", + "integrity": "sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==", + "dependencies": { + "tr46": "^4.1.1", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true + }, + "node_modules/which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/winston": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.14.2.tgz", + "integrity": "sha512-CO8cdpBB2yqzEf8v895L+GNKYJiEq8eKlHU38af3snQBQ+sdAIUepjMSguOIJC7ICbzm0ZI+Af2If4vIJrtmOg==", + "dependencies": { + "@colors/colors": "^1.6.0", + "@dabh/diagnostics": "^2.0.2", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.6.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.7.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-transport": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.7.0.tgz", + "integrity": "sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg==", + "dependencies": { + "logform": "^2.3.2", + "readable-stream": "^3.6.0", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-transport/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/winston/node_modules/@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/winston/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/winston/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yaml": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", + "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yaml-ast-parser": { + "version": "0.0.43", + "resolved": "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz", + "integrity": "sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==", + "dev": true + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-error": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/zod-error/-/zod-error-1.5.0.tgz", + "integrity": "sha512-zzopKZ/skI9iXpqCEPj+iLCKl9b88E43ehcU+sbRoHuwGd9F1IDVGQ70TyO6kmfiRL1g4IXkjsXK+g1gLYl4WQ==", + "dependencies": { + "zod": "^3.20.2" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000000..cd9c53ef9c --- /dev/null +++ b/package.json @@ -0,0 +1,158 @@ +{ + "name": "talawa-api", + "version": "1.0.0", + "description": "talawa-api is a backend repository written using Node.js and graphql for generating APIs for the talawa flutter app.", + "main": "./build/server.js", + "scripts": { + "build": "tsc --pretty --project tsconfig.build.json", + "dev": "concurrently \"tsx --watch ./src/index.ts\" \"graphql-codegen --watch\"", + "minio:check": "tsc ./src/minioInstallationCheck.ts --outDir ./build && node ./build/minioInstallationCheck.js", + "dev:with-minio": "concurrently \"npm run minio:check\" \"tsx --watch ./src/index.ts\" \"graphql-codegen --watch\"", + "start:with-minio": "concurrently \"npm run minio:check\" \"cross-env pm2-runtime start ./build/server.js\"", + "prebuild": "graphql-codegen && rimraf ./build", + "prod": "cross-env NODE_ENV=production pm2-runtime start ./build/server.js", + "start": "cross-env pm2-runtime start ./build/server.js --watch", + "setup": "tsx setup.ts", + "test": "vitest run --pool=threads --no-file-parallelism --coverage", + "typecheck": "graphql-codegen && tsc --noEmit --pretty", + "lint:check": "eslint . --max-warnings=1500 && python .github/workflows/eslint_disable_check.py", + "lint:fix": "eslint . --fix", + "lint-staged": "lint-staged", + "format:fix": "prettier --write \"**/*.{ts,tsx,json,scss,css}\"", + "format:check": "prettier --check \"**/*.{ts,tsx,json,scss,css}\"", + "check-tsdoc": "node .github/workflows/check-tsdoc.js", + "prepare": "husky", + "generate:graphql-markdown": "graphql-markdown http://localhost:4000/graphql > docs/Schema.md", + "generate:graphql-schema": "get-graphql-schema http://localhost:4000/graphql --json > docs/schema.json", + "generate:ssl-private-key": "openssl genrsa -out ./key.pem", + "import:sample-data": "tsx ./src/utilities/loadSampleData.ts", + "import:sample-data:prod": "node ./build/utilities/loadSampleData.js", + "gen:schema": "graphql-inspector introspect ./src/typeDefs/**/**/*.ts --write ./schema.graphql ", + "update:toc": "node scripts/githooks/update-toc.js" + }, + "repository": { + "type": "git", + "url": "https://github.com/PalisadoesFoundation/talawa-api" + }, + "keywords": [ + "chats", + "events", + "organization", + "community" + ], + "author": "Palisadoes Foundation", + "license": "GNU General Public License v3.0", + "bugs": { + "url": "https://github.com/PalisadoesFoundation/talawa-api/issues" + }, + "homepage": "https://github.com/PalisadoesFoundation/talawa-api#readme", + "dependencies": { + "@apollo/server": "^4.11.0", + "@faker-js/faker": "^9.0.1", + "@graphql-inspector/cli": "^5.0.6", + "@graphql-tools/resolvers-composition": "^7.0.1", + "@graphql-tools/schema": "^10.0.6", + "@graphql-tools/utils": "^10.3.2", + "@parcel/watcher": "^2.4.1", + "@types/graphql-upload": "^16.0.5", + "@types/yargs": "^17.0.33", + "@typescript-eslint/eslint-plugin": "^8.2.0", + "@typescript-eslint/parser": "^8.0.1", + "axios": "^1.7.4", + "bcryptjs": "^2.4.3", + "bluebird": "3.7.2", + "cls-hooked": "^4.2.2", + "copy-paste": "^1.5.3", + "cors": "^2.8.5", + "cross-env": "^7.0.3", + "date-fns": "^3.3.1", + "dotenv": "^16.4.1", + "express": "^4.19.2", + "express-mongo-sanitize": "^2.2.0", + "express-rate-limit": "^7.4.0", + "graphql": "^16.9.0", + "graphql-depth-limit": "^1.1.0", + "graphql-scalars": "^1.20.1", + "graphql-subscriptions": "^2.0.0", + "graphql-tag": "^2.12.6", + "graphql-upload": "^16.0.2", + "graphql-voyager": "^2.0.0", + "graphql-ws": "^5.16.0", + "helmet": "^7.1.0", + "i18n": "^0.15.1", + "image-hash": "^5.3.1", + "ioredis": "^5.4.1", + "jsonwebtoken": "^9.0.0", + "jwt-decode": "^4.0.0", + "lodash": "^4.17.21", + "markdown-toc": "^1.2.0", + "mongodb": "^6.8.0", + "mongoose": "^8.3.2", + "mongoose-paginate-v2": "^1.8.3", + "morgan": "^1.10.0", + "nanoid": "^5.0.7", + "nodemailer": "^6.9.15", + "pm2": "^5.4.0", + "redis": "^4.7.0", + "rrule": "^2.8.1", + "typedoc-plugin-markdown": "^4.2.7", + "uuid": "^10.0.0", + "validator": "^13.12.0", + "winston": "^3.14.2", + "ws": "^8.18.0", + "yargs": "^17.7.2", + "zod": "^3.23.8", + "zod-error": "^1.5.0" + }, + "devDependencies": { + "@graphql-codegen/cli": "^5.0.2", + "@graphql-codegen/typescript": "^4.0.9", + "@graphql-codegen/typescript-resolvers": "^4.2.1", + "@graphql-eslint/eslint-plugin": "^3.20.1", + "@parcel/watcher": "^2.4.1", + "@types/bcryptjs": "^2.4.6", + "@types/cls-hooked": "^4.3.8", + "@types/copy-paste": "^1.1.30", + "@types/cors": "^2.8.17", + "@types/express": "^4.17.17", + "@types/express-rate-limit": "^6.0.0", + "@types/graphql-depth-limit": "^1.1.6", + "@types/i18n": "^0.13.12", + "@types/inquirer": "^9.0.7", + "@types/jsonwebtoken": "^9.0.7", + "@types/lodash": "^4.17.7", + "@types/mongoose-paginate-v2": "^1.6.5", + "@types/morgan": "^1.9.9", + "@types/node": "^22.5.4", + "@types/nodemailer": "^6.4.15", + "@types/uuid": "^10.0.0", + "@types/validator": "^13.12.0", + "@vitest/coverage-v8": "^2.1.1", + "cls-bluebird": "^2.1.0", + "concurrently": "^9.0.0", + "eslint": "^8.56.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-tsdoc": "^0.3.0", + "get-graphql-schema": "^2.1.2", + "graphql-markdown": "^7.1.0", + "husky": "^9.1.5", + "lint-staged": "^15.2.10", + "prettier": "^3.3.3", + "rimraf": "^6.0.1", + "tsx": "^4.19.1", + "typescript": "^5.5.4", + "vitest": "^2.0.5" + }, + "overrides": { + "graphql-voyager": { + "graphql": "^16.6.0" + } + }, + "lint-staged": { + "**/*.{ts,json}": [ + "prettier --write" + ], + "**/*.ts": "eslint --fix" + } +} diff --git a/public/markdown/images/GraphQL_Voyager.png b/public/markdown/images/GraphQL_Voyager.png new file mode 100644 index 0000000000000000000000000000000000000000..72ab4cb6ff8fcb6fc3cd7d0e9fa7ce6ba4dc175c GIT binary patch literal 308541 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%0Ao9%aC^Ggqm=tyZ_+f2LmKq!2{Z-vxV+8~Q7 z8Q2MY$^mk5MxP;?L=qJmr8}E(cTFc^eJmbs2LZ%k`o9zW_&l#wxoji8b_n+BhJH`d z7Rw5LrY~2bj{Ym;mT$LLZ0K*#fRK9bRvW9OHPxHz|8Srt<7BAD^Pr2fbwn zS5E>i0JSR4F&FtvCSk>--^)~4Soq9Bg=mO?ftHlC;8#wHt?A-lP`1m`guu7ib{+;Q zR^@L0qa^SB0jS1u+wzeLQFhi%H(NS>Rf!jCxnXE{ohvmeX%@A#9NSPF5Y&u*)V=qp zfy?|EHo(q`cNL>_@DycZ#SFSkAe|`m?v!i3AjW`0K{w(r#v0UM$a!k;($@;m1Cg{m#hQ9(G0xsZb zrPr+2GEm&*Jj+A&{*EFlv`mInSV9T^h7sdbTfH|ep#yYN-}xpLRd2!c(z9_;u5<6> z7piOjR^uR_yFoz_frr=F9{P{+3AvtcoRt%bytUCbVBnNQ0M*nWp#h3 z%`SIiF!Y`z5-Iz=e~ytK7TqW5V^!hZ&hx|0(+3Wd|J6`Sdu7#PboCHPItl#gmn+@(%U|Zy4A%8Xy#673R<8eQ%D(}VUxxGBU zxhws>6ak+1jHurB8S@ohN;Fv|e>$UPh+iL`>Qak`xA1-r4Vf^#o{n*w8?vt219_RA zxc2p7@Aiw#&&6q3eL-prXrSRVhVYqJLF0swL_JC{!t;po6=t!Wby~1l6NE^6L#1XmdMzv{97w0FFh}HcO-!GvM@O~dX5;#<9~bM z-YA<~O?;eTTkijzkuzBNn-l1zwbV@f`Jw#TqeveEig(9`^ld?A+B)S@>dGc^-uxdP9; z0UQU(KCrXoUB^9zKnef{gqW}&%DI|M7zs5T&vo3`3bZg%nU z4$9C_&&Yo+_|__P8s=^Cto?}E^7>g$l5!kkBcgZCZIMQ)?-0V_+5L1Nbd+cq-2C4r3069V|=Xquy2kVi*4nAU$jB#C9_o<1~} z<+|tEdgPpO2g0Bk>2Gp5EC*e|EXKY8 zeLsWr^-Y6>>$mEYRoY)5Fm39g_z>w((-=}vh2mOE+Up}6*;qXGKc&HeGllPEGdzOfac#Nq$kFsSOkvzE!B&C_d{exX}3 zLYOvTNQiZ%ORKATz)^?`c*S=Z*6v^Jetsawzz=Tke$Oc--iM6!^Vj~l;}u1@-S1^z zZn@Ow+^hI-2M^q>I!2E&_|!Y$su7KO2drqK?=CF7ow$BJ(d_B%mw9d}+?CV!PI-SY z^AxVnFOU&w3!Y6R`@R|I^2=6jhp1P=JtX^FmW;4feSHLZUB9}R)9AfB4~OT{`x$KA z;HYYC}FFn9rU`KwbC55#|lwsqh0CU4%t>xdpRi&g}f* zOEhhB%!(~`ZNx}JQSb)il|#S-&+hDwI-%j)o(n9Ba;;y0TWXmte7M47w>lF!jFA*H z)U3^@u=dn@EEs5jnU#`~@%WLXYa|c%LZ^tGm-Ve#{8K52@9=$BF$p@?VjQASL2fH0 zqbG_zg;3!7WP}5kmKlW_sb@nwai^^oH3EhhgFF6RraV+N;>>shvJj*RM7;$YD*CP6 z;IOfJuCKX?VliTF@q$mws1y{2>esA7E_Sv5qSHuyEr zTxZT=bP^6o+i93Bo^lCi>__mwfBkQHeSre;JWce-N5K5L=(BM(efbAe>+W(k$_0ff zN1~kr`+sD-B1Z{>hFG~;r?DuNcIC!v4ENPD7HvW_n7$6;5A_K%hAfH5+kevi|Dt7Q z-PEbT0pxpzzD3;5iZ`oar=fX1LSO)R`LxbM5HUc($Itt`j*OIRqldLt!XH2emR+AZl%njnn})F5dDNoEzJ z!BO_UYQ*2N7k%!GlJyVGs1&Qy^bKX6rN>OS{I(%{YSYF|2m=T7Ha}-vtk+)I(B8oM z6tg+$pCc4|xKE@&^VWn*f>$_S9>%|oqjOv~f?Kw6@`3Lk5rl$RT*-@1JEY_F$X3N< zW#VC5O-v>u(5$|Sc~scb4!Q2xZsr#4RB}kDcpMT2Jz8HH`N;rnJ*7o$8UUDA@@NUq zK&hev-q_cUzK*g{lBZ$kvx&+<%Zhu;#eV5wX5tJgQ$HuEO+BH&ljquT@u~WSq&b<9 z^e-PM^KQY3o;e0O5;=VMPWLVMwzM^`--TB{)_xwTn(}#0|NMiKSpiZlQ1}ks{BLpU z#CI69lES98WkY;)a3LCwDEJlejA-f_W+pI&pzUKo!YX9$_gTCOm^CU7&P>kgW~E0-**2Nu`c$$3PvQ zCUeyMmwCz=0wQ&ZDiG{qXFBYzgSlmaQweuJXdj1(b*vl&@)wS%(zR6k>1ahl@XPU^ z8=}7%*j`nzE+!mlID~vX0H{D2eqMa^rgJUnUToX-9EXM)ynnB%%pzf-YNAwu5F|79 zfdrZN18>)LY2TIAzjQA+pHC8WAI-(MtJS%=rh*A=dU|%}V_mK89mh~*iBkxGgKZra zWJ$vT)9*U|g&l{?VG#~xIIQmD@X4Otj~*}V_b(}|F7r+%um7-@KT?{GhAix*R9rUx zM|f)6S`rVw*~4)~Oqnw4{Q`Cffjd*OQg;5bf6;pcp~^UD`Pxm~McPt^a0iqj?+imrjsV^DMpf?ET)Anm}&IV3HvDn9V;M?fdQK?b;;6+O#Q^cgbrG8%U|L~U`SAVy; zAz3oxQpU2|maHaOxM;?~0%YRBCvZ28`@7t=ECUlC zww*M(*3H1eR-=$KluESGOMgBM*Lhpjk=EX=5)}7HYC<{WRRJod2&n0Cf+;Kei!CLH zNEk-xyX2SWUY9WO%NfBSHobGz%}}bB*5Ce*_W8M0|Kjr5c0fsVjsxReUo|`Pj}&R( zuMDrg2prH|NG7rd%*PSxKMFppmXdiWT6B$?>UIPKaE-3n<$4KiJ#Sf44F zQ@}s&af9qzzlbjeYFcU-x4DD_S4MIK?F}qr#=RU4#Y&Zc^yT-Pb%6&X->zuk^;=|! zpKf+``=QGm3)Bij>OBz0HR%f=mO9|hZd-s8vT&Pl**3Pg@N3}~P}3xL@$|YFudA_W z5s#&r)3m${u~y#kp2R}@3$il&_5Uf8UH3?3)K9&U`U5A2%jP(I=oxGv{akYEFVW8O zO1_!Il`i)u4Gt2JrlBscSVi(xE$%F^*aK5w5W_ieLN1!G{-HszFaFL;)s6Oy54rOOUq63 zJ%o&wi$1GGbMBS$x$Yh=a)L!f`chw^YbD(TTfmE=Ai$EYrMDhElnMYwgvhs7s~w*@ z&*vHU6vBWg8tEFgz@HBnwLk%ccwhKp|G@PgfBV64cP3f>2RJ zlHj7?XcS~R8C%p>^*SPIIpH4GGQL@V6;nm6e*F0&hfva zzo&m+UL~w<+9`lj?7#34^WCwr<+pn@cIMC6{=Hh^)vO|@QNHV~6u#E#hSFRBiB3oW zX)$3n9W0WTCV#Avr9#RZz3Q);Rk78H15N{@gts@t1~q>M2_J3_;^c`Kgq>yMxI7H$ zz=?lZKvUPTs_(wc_y=m5`1fuwwK@Zn_M3OMRh;19lHiaUAoqE6z{?|LyKuE^tG?f-IM2y;u)m3z8E~R4JepUIzZ;0xO^q*CyQlvPc+oZPjx6& z3?!mEyR(@rExxpQJ!tI=?i1uor>CAq--MT^r|MC^H&$Zi7*x+=byfMS3M%=3sU<`k zj&fQC8V~?Bw{b78Q&kyy1~e+pMu~-^O5?&*B1IFPaC9W9fr0~jtm>U~;ikL(@s|qR zRX&qQ30AEscGbuxb+0p#`yv%xyE(zKK(^dYPG?k<+zJG+BKX1GKO`KyQu>zc#)#39 zT^q{8fs3QWH%^lNUA3^1u9)FFqg=cXzZPzd`zFDl#lhp?X3|i-z{J!wVu6;3%`-S%;^V!m@#+}G zN?>g>zn&Y|P0ydYFpiV67XmMkKOZkLJgF(ZE=8m>>Ax;q%&ef36ewQ4m-*+{@OyoB z72-m+Df;stUChHm%}md>?z_qNGUO64VK}HM)qN4yRce4O;-KMFM|z=CUP0#3V0ELx z2zb7%XOsNv6E;71Fq_Hdey^d;Dad6nJw^Wc;pIUE1i9XJFk;yoIG`&IYq?rjnD!&s znfN1zmH8OV8GkpM(#~Y$pTO)t{jGg(7&CdL_QT0{TZCKNaehn={L{G6^yRCHNktC>5CPlo};VA7dBw_wgr2HAn&n!CHxpu zM}CV3{R{3V*j#-E*%j7-p}~uPJB605QQso&%tKVpOPHWQc8||OG)M`P+RMs*2NQS2-8h9%-r%Io`A5aDi@Lgn<|1J2N-*}qK!(uu7t|RSTh2ARF2&mgx)4e6^)BU zOO;$x$T*-#vu8@7@qZAW{IbA-l4t6&eEY53+9J*qJHm1#kJGRp)lMGnI58<5-pJcR zq#8YmJ&g#;tk8p3SQZDgG2u=rb(%Dm+)Osj?Iy`Zk6Y0SM_F=yn*vxR++HasBN zy}_ip4ISZ_K1nQV)B-<00XGWzz*O%VH+ob`Cp));5LJqbPyGY%plXi4f_I$F_l$bP zUn*C>+dR};4I|1b#YUkaoBEF+J%u;d7y(1VKFuDy|yzx0Of8~PEtam(H@m17twNtT}4yEqf*rD$y#L;8h8&GF!Rjb@# z`vN9T@(sg)mcr70sEEQ&9v@+)I6okk*4njd1 z#emdRiVb5C!~2KFiUHSZqXP+qm`X&m&xb~(-G@caq9kMPOH>Ux^t3$pnl`>3-gkbb z|EGZgGA1i7KZWDXiQbPsp`J^i*~>|9;wmB+%Y6)+V}A`kl05RGUB|peBC$&S&<4|NVTLi#>BUjdOQ7ZHq%XFD@qzMU z0Abb8Wo!^M2x+xIv}TzTA?ZL<7iPty>?gi)k?hthfT|cGZ=QHfLc8Rm8rlf!bf3il z1zLU`IucuigA3MT3@w@n-nV-woLv$&cF}<}E`dRp$E7918a67bpvaPbnGJU-*|=&cpMcTJj$Lw8e}VG^p`~ zLpfncomQ#mPP7rGb9s)@`%c!{JBIo5h)=UWCVzN18)1RQ#6&EuNMo1h;An3t0=ZE& z@r5J=RHQc}%(CP-e|X~A?B&UT_dn4@?YVFInLV_<`RaW@QKogGFFjIGZe*tfLBc>5 zL5L#wKVH2T-sD6&fO0 zozO3c+#pNzqNxJs^Bc3xz3~o+%RZkNTlZAic(9f)!&`Y3FAZzAE;B=&=(g{knB0FA zhsV;=K!wB2>;mqG80xsG#>5WRWYzDN}x{WPOf%|8-2cu>nv%hh_I} zbBMLGey(EY2fRvtFi2puLx?l=c01%0Fwz8A-}+g{4CjTC#>z{n@dud@@BZW{v|DyZ z{(g+K4e;1-N=}I^vU|$LJ?eH|=|;5vK~LmuSHb~BX+rMmz>ZqOAt}2=7IH@k#~Qjt zl4{~x!2v-KiU#*M_;_r4#{xs*LIp=yFk=2xRF%|Jm0-VLH@??a@f)gxY>Azuf~@QZ23p?p zlE2-%zMuLN#;gap5i2NlXKebMMDC6+G559#`aVRLL$|K6qQV5B1j+u;E80&RU{X%{ z90!dkqWXz22#fYHba~!MzeE}PM9(IN<_+AJY>?bJlOnJV3nzp^f!^?#D3^8j{o_Ed5C)4h{Ix=QK7P30)BjT)nbGU?`tE$1bX(K7-#{Z=BhcOKFQfL(E zIMGeRZ62HV4z%ai*(6Z71fXSy@}*KkbyhVrZ)gw8nP1v!w(q6`1z!_xr>=8qp8}K` zbn;{19-lD6uFrsB0~-#aFWSWym)h@#zHW8#pTPt7*KdiM&>^O^d5vq3 z?WYD$9=SFO9l|a33@*=mzG=<_qp8yg^tpgjaWrm~X53trgiR`~++&tGOd*SVyUHpk z7$eqTsk;a78-dCgwJ}{sy(2yAezMRoJ5$-05YhrCJPZbShRUaf+-q^OV4aHs;~yg3 z_j>Sf`+DSBIb{XZu>4V65pzrg?Z_zC=HPcBrVt zRIP&Ew_{kKFMTPmK~w}yUISVj;66V{1f1RF_*EW4*#4Cr*KkuE}t z=imEhdLS;9Pyi{i@^XuZsR;ydfW+!Cz^hN!Dm@q!2~PfMlaD)g3PwVp*H~(y*x=Ez z)!ikB$Ie$u0uf~PT?|f)S_u4FnlvBdUleKk4ssZ|EuOAjWe7$O5pp35z!+sKEh3BN zA}YG=BC4rr!ZKTuN8v^R$1C>Vsr1T1@%`P$DM2zJHPG@AtdEpg(iq1GFy`JUn1Cpv z{LSM{tC4Xlf!XM(b>%}ig12ajc)In-`CKylh?LJDLGa5K-??v)@Y=}<3?Nag?a(hL zC{>MHq+8TyR~Lo}!=wSJfwoJ9)TraNtLuMkwfz!iw4}(Ie310ZKvO5p0@$!NfV_fZz!wu8x+zk@QyhrN$ zOsiFSl~}F!yMQ|qJ{`}Mj@#^q?H1caLl_j@$c!4gIr z(Gb9dy@U8GaN>BHl*HHe#No3T6kl#sg3~D2AvFRKwJqgEun7tN3mPesH7Ogv5dBKb z?dP041p$bt{Sw@f6iCsO>*qOx#zbn*o%k{8`pUkbExzqZO}UYq0vNTx&O4L`MhrgY zZu&OWK>XCJh3qS%aN-d*Ezw|ADKF_%I)EW102dl8$0FBWe*4I+E;iVBiMeZQPP=#P zzCGD)4{Q8d`-$m2F@4T>wKQLgAd)yY`kS5D@PMAl%iEq*$^GrqX^&yYwejOlWc0V`OpoNutlXqS|Il=;5 z->7})XBj6x#+geS&G~Aj3(@SSo7IyL*e@m`pR$X%FAr769wY6#M{!&6AjA*DL+hZe zpm^==f@5kIi}~>Fx=<*G=7iOI3)xV;C%!4-!6IZk%;s<3u`Tz4Z#S zlOS<>6+S&Zwlak- zI=9nB{*&3%JdC|do~e<$PbBILOI0_hUlkLg@Gb|T&W)g)JPM`-JUamBdAd!z9x1u1 z(Co8z$cyK7kXIe~b}HtuP?tyAWX9Z6XIgQ&*ffTUAfV}Eb7M9mj z{~&Lw4UW@N91C0Gqy-ZZrlbWU+C=&pvgSe4LDeG)leLM5HGqN;cIpNb7Uq-R-JP2viwy zIuuN{8ao2lV+rkzg+gE-V{jucnEfqCCLbe)Qt(;dq}y=yff0r9U- zn@qg~1kQ=*CjNH8O>>8Ttz035nA7kql@i!~g6_Rk9jXe7q45IX7j{w{VYXbK2e0#J zt$oK+rk6QQ+xY5jw4*(`|!V1UY{-Z+r%kZSx3Ek zlhdH0=KsakTL#4yHQmAo3GVJraCf&rkl;>mx8Uv&oCJ3b!QFye@Zj!l!QK5kd7k(E z>fWk5wdc$fRLzeqy;pay)g9w2_3Ab_BS;XyV9;rORr<1P1~HN9E$?@o`;HO=0{E@h zhq5-A9AF zo(-pVL8~zeYXGbXABqCHPK4HY>G}~lQ;us1Qp(^zv;sj z+u6L?sk=gR0F@IvR~;+^$De9NVB_I?*dg4lIW`J<81D}mM&X4pbx{uH#3!FFZIPtV z?oB1UZoJ@bvPKCs6et{oFz_RU90?85vVkzTdz00W9FAwY;>qWX{`|2tkYE5)y3KJm zAeJx=g&wSP3PLit4;dH6<5ZB1m^n4O8A-@44lp3#H-mhK(r5y4dO3)vUjGx?2 zGQZ3OX&Pi^Le6nKA*?+-9nsl$2z0lbPa33jFJSxoxdkuj-4A|rUehXjS;xoZ{H^}^ zmgFhA^CcTQVHy?XuZy1FyCeUqVJu}->P9cuLgVPMom4=v%3sE zcj1SFvKRTlDX!r+ehc)MzNrge(O=0a_AiO)te*X?zS9EJup6?XkRQsvmPo^08j*@- z{URe*qYjAdryR$@|67@n)@la>DylAm+(%^w#NiFNGBuO|db2K}rEfS{aw&X1#`?(} zX(R%~9cArt3_neL590BvdB?W!qD&a08Q_|~*YWmaXgwE75qy}=_=%i2{oiE_GpnWB z45>@HQmEgU1_WyvM|X%Z?2L@ z{@w)><{92~qsRc|FIm3##-A)`%_x55ENiCp?z(&}J(E8mKt@dO+SYtwiZP<&)w~{8 zO~>~q5TSqvFs{s3I3Av2=FU(*H6=iz*`{Z{i$VTAk{ha^!=`4ZtbHf+vg;f1qKXAX zzTWLb-_I}Q$OhxTcl@YKhm>`3EQ$;@VKK5}wNAoVEF{A9x8p+M6HvH``RLc4N^;$O zVva1j29}L$Ov!QW3HQSBQTh9eChXP%;#%U2wAS;AItuxb06f<^Ugq}1pXKCpx(-%O zf428dsK?xn|A1H+F%V9EI(UXM$RvCdR|Mc#zn*G4SVUb4@YDUn%B+V{P#rZ>ojpY@ zJg3W3Du*JBn?3PX0H7~;fMAhIiya`_vxA&(<-SYdJppN(91We}(2a^esn+yEvpUuk zW_dqRlV@|Z9&_nASqBzoz!J&C;ak^56StHJoz zKS5b{3p-mTI9ufH32$e9(@%Lr-TUI3c&*iLovAN0_T#V`TSyr}>S)ShL=Us$^V0&$ z_=;eY{n|t(JmsS~aK4*dYiKxLWHYow)1tCbPUSJg1lB+sN;R^(hOd-TOnTWndJ`~f z^n5|PCPM5EM+;C>wL|~Z9BP>uSg2SUTJzzK9O=L*8Ab_7-YOo0k^oZP3PQBhAL0FA zEcVMpHRC&#FQtWjp88&K0>sCpZyxu5b zyF4$97M=r=15ytJ_$K=Xh4c9<#0K6*fFyUHd)b$-E5F&o>+=R8%JUBg5nMyQa{CN| zKIgy2d_QU7bU$t>uq96+ck(;ZW#xh{*YZUv|NA5{N72c}g{`p+4p@En9%UiPPh3`o z>6}1y&*rk--52-!NZnVhu)5a`ZGQ)|5DAH`f5wp?G>(t`D9JwpRah(WAU(v&>!cus z;gG~2fz;5B)}Ln=U&Gv=J$#1KlcF>&aM~V@Ine?qRydo^Mkh<2QgbEJkR(h4t<`wT zw6C7-aGsoS1ij{!>ViVIqx_$877o&#!z0#b;yr%6M@hQ7E<={5z3Zm~+h^U-o4L4h zFoPfzLg(hl3R9>%k;MF9c~f~09>av z^9i;7*&_?d&7?pzQi^L*M1c5xoRHEna=@mvDrr}(z9GIjL#oh+!?SnY)ZU&z+`q4G za$PC{fH8BYPrYtoF;V6`O??wmW!`zS$Uxq&A<&%!r`t_0toR3cutdsPaJU%NtxQ4r z-q4p=t8W$Me04>kLx*X2CwT|{NBggh(SF=oudl;rS~F-X-7)a+=V-1C;z0=*3_FG=w~oa;{TL5%;t{-_@a80#(dS2l-}bDeZ=8wWL6E zQx$i*wIw8DCL9N2qYA7gvWK*bqP&MV{sW~u2q#1>i-|ziCY-m~C5_fpD z%Tew8d~&laYRdag-CyoTZW-CfEpg%rG(Lictdl=pNB+VDAZAt<|9V{Kaors`WRR@c z_9$-$A>fM){D}wK4PLQ1Z0TY%engU(ax!^?fX}X@B&S>JbF1Df&-k*P5__!`xa(!t z{dRT0j-A*)QytFE3;gfB)@VZeR39yhq3@b|$G9 ztf;CCHkkGp7P|LVP5$K7`M(T~8AOF#J<8KrxA&0JmpMG}S&;ouul9UdGSbTG{vbSs z0O{Xqe<^2C3K&-OaV@6C+IRfKD`Ac*J^xVtvW7gUn7_YtVVq7L^4=nU-#mXmDEAz^ zB|f*hx2|d)?-~;;JUvYNz4jo4MN{phhQq_CpB?F|5EK~d(v57C*!amYz0Rk%xk8Wu zqLXiPlMH@bR&acl2R!7}t^hfTDYplII z<%Do)Zl~vu{gNa(ClOV^DEoFq)n4grT>EB>D7DUbh?0fq?dh2h5yy&_+iZW^WP}Wf-;V#IY3=4a@DwjqJSKeW~XG$^w0<6LZ|A3%4dtCQqYjCd&eW1qt0x zD|V!;{ND=$t$UwVG)OJE2;^7SZP!j3V7l_>S(%VLH~%Lmqk$+$!>U}QzINjFwY%6V zi+3^=YK+;D3i6W%CF&^S>#N7)O5{n`42}5j==AeOn>L`uB(Ot zxdoaO`TfPCn)>9zJIH|U6xh4;>$Q%Gcc@4c`0)v<@$nx8+Z)uN(HchvhkQ+V+?^hJ z6SFZ>h@(hmn|HUzOPxrDa`=2@MTVDRI^FsWvTVk^V|J)MMqkZ@_0xcKKV_Lu^=b}mNNl>|xW7); zzDip7dly=3X6BfcnS^KakddQ?mjx?ZeJhljf%Q}kE$Mg!fNxR>aWlr?k7<2p1N&wI zn3{VblfSl~bEc@M-FR*w{O@%Bed>erv^NA0o_Vx?_`qQF_fa)T9oMamyXo4%d41s+n*HqN zjWO*<=&^xM)Am!0#cdSP?B&DZXvfO)!6GY}|6d2YD-rHlg`T$0ID&kgte&_2vYD@? zTX#-T$zn|XJnm-h`Q@*YY@45+1{J6Q&(y7{iMQt%&)_nCzVbwUe86c(w(N47#c|cKoX7h6Wro2pJ&R6uQd-6j)ALuT2#dd z{YHpkFhl{7XYq}TiPS48_b^Q+^lR1Y?dpN50}|zV|3Csl!PdBX_F2{!-WQulEPjkO zwZSOBp_6U%Vn_OK-!iU^->r**Ud{R%hnX@>$a+5E+TnCF;_HpZM5pX*6=A9}d+nJ8 z6vy9uLiX*y$zX!F0N2J&z~Qw4YA;2tI=Dd)4ylxo)btw);X~d-Uhj;ry8PUQT_RL(8GRg68YvPC=1^uGh2H!!JrR zR3hdKm;J5#9Jwn$dScIw=js<~z9(5FOS*rUIQ@6)Zck_Sh>zFNR#+_r;Ptn?)@Lm_ zSMK#uQfw{H^C6*5Us3|5#z*-)=Q_x-{$_hq=d+nJN$YEmMfeeK7Nl@ghLozZcZPqFM!&g; zud8})8|`JYJ3ay!K)@aX)8;oqwMD$dBo9=uYJD?2A0vRK?dwveN7qw#lBo1v6h|Tz9|@Q)lewxl8yY9}A4nvJ^1r!g5!#b|@p)O)TS$Bi zyJ`^0Y=rpzo!-1nOla)~L7ryGk}wp-UkD@I0yF@Hwd&(mkp>Sb!c)OS4zr6Y&k*^O zoWe&5ee;6Dw?;c1`64Mf4AgW^a0GS?5;9hf+n$bcE7~40r}(D~cUJdK9hTt3MAE{8 z3?6BJQ5V5(z)dXvt(kg|CFCVHRuSQ$AXWtHHiF!rcE+$^2MoD?q1#E(S=Yz@m-GTt zSwY)jk$SO6NuL|-BFfSEvWB#M_OS%{eeSR6UNn4udD8G0VIXeh%4aBA(_nv^fH=0d zV*vts$@#P=Rjc{45P0n|3#x9b^xd@tE*e#LU{n4+St$6p{vF66@_HTZ0+hTC1r^Qr zOb5g{MkPYc#X+j+8fTNij;2Dkuu0Zfme=eyx(9;36wr(qaNcED%%wFd+2G6e~jRUIX&D)xCp)P;SQ+VLFG!ZY?= z__q)5lane7*#NkPTTVKT!Shl3oW<*_xQ}o4^1MiyXr3*V#+EtF8Z82w+lu%1yJlQK zY`@Yra_L3Hpdv!T0MB3^@PBils%)0mbB#3SE zeQ|V=yyGmP6-VweqV0V+T{DYOR<)#%lckpGEZ^;hg5#U06V$Qa-8OMf*H4|+l2KV* zasp_#@PJ_Fg;Lf8R2>2=TfEulfuu`Ple<{~op&tdl`fT)E|8*-fia3|F+9a* z6Lj`!^-Hh{=yyH>Xb6LBxGdM79%l}j;h`ZmR%_Gks71d$l(;C)AQ(BRba%Fh0e{H2 zIHbRL)ioY)WO#q=dr2E5E=%-eMtk<(D}SqPdZk%q6^p!9+Ch_0 zP9oPgjy(?Aw?9j-LW-ty)Ri%$4^rAnjqKGXDq{WN_zm(~KO4aSE#n+O&_js~{_TI3 zgU*FtXy55o?Rs)YN>0jDF(>I&}Cjy0VLk_f`6$p`9v~yvB z-)dL^vf2(Y+3Dxvc#y`LQu0WGq)sU_(6-`^ zV$dE}_YuL@&eh-UyO!>XmC|~N=4!6yt~K^|qRzgV?*VX7?*PO6a9l4cVee85;Id=)`tkldr4%mV7l~rH< zJc{?AfV)HbIGsK9fAGcoeIDMAM~rKlNC{ydHTe`twmD!^&1A@&FDaYtnb%r;qi&B% z{bF`Mvg0y0Y9i9m8zuc{LLOaYF|s zDUhnNv1aA413*9H@@-Pk96QWJ1V~dvd`QoCpxuSG|9ZY*f3jwu7lLg+OMA*$Y&Tyf zWs{_7P1x1{J*K(I=w$?JRRFha92Oe5UpYKQf&9?+7+a+Ig?OdTx2mXpzbqfulmHx^ z<+tUujrJuG&uK3k*KZrwiZxAdG^?ShL`J<|UT1Y;J{jQKG>opyG%8O{t; zDGr&o7ko|`%Whub^R}5hl7Iky>_JUSVYgir^&!ZORTWt@x>UV4!pEUkB&M$zoZ%=S z^;dz*TgzCivcqNfel%&eXL`20DM_nZ;iG18oIVs`N{bhAZ8_*V*V>vH01k$$E#eC%a0^m~~$qcLkFJ?e{$f6FeI zmbV$_4n*4IOYCoLts#M4XRi41fRfbV7+L?cLY95AYiaUEyvuO%Mq1DO*pKmqoA-SP z`iy;ScKd${QPi1aXB{aoZK<oQp%9Q+5JJyL8&QKWXD_{a_v7L+bT{HB#bjoZa zz61w_%XNik;M2qVq{}?bg;;~@^Y>LEnXbdfWIiwZv3mROh+BImN|&z;{2euQd0mrm zvBUAV4&DsgQ+e*YaFLhF*LmiwRsXB!lB!)&-olJ(_D-X~rjfAAGY{w6 zmYBQtTH3dEu%FZ(BmQ(9AkFQp($zZd9Mc8^QiwiS^ltj^g@tNkF8ooZL*!rufI92^ zsm@9H6@lQ23f)`{79wJOx8GM=?{N)*0JHq}ZH`A~GhpxBqO#B|2fzBdLxwNiuQQvdS=l(zjbJ6~a)bAuCKX=oD1B{lQQ~D{w6m6w7OJ#p|*~n7z z8JSZuqB?}0llfM?wgMU2e9V-Y2`tM&U4zqZ?;O8zEGCm+v3h>TZcK7FIV`Fd4lIC% zxObDG!dYf{*3B>T$yv^pfk6*A|I}h6X_IK17!vVfXIIp7*FJ5)#K~vTs#+y$QgQ{c z>22YQI_#ka?N>xjA=SGq6%2%*4D8%SXK-9yyQ(l1Vi~OHo#`kO(sI;3;)W* z-n|8fNyn1cr!>YJFP80*nc*l^5NAB+nE?*13iZyG=F56iTand>Q`GuxSXlI)Y^7Xq zY<-)TZrqwdf$?S``~Ft!4XGbCYqutJ%nVv#b~xO*@hQXhXMBD+`+FNeLIyTfV)@j( z`#SvAEyQ-2Jd)4A`C{(+mvMEswZ329b}LC+5*SPebN<(ia365Lnh$tYbGB}_h^L!^lP9W=b-W#6-+lAxF`X?P8NaWzhj1^A_GJZ#+ix8RO zQ4@sAd|_-WZ?pSxUxp%$eALkqL5517fo&o`jw0N~+4MLx7HTSC`H2AS3uLqrNSDrG z1s!9B;YyCZh8*5JV@sqSfQ&X02rvSS0Hp1AaRq-+N&N34XJNslIm~%q87?E^)c5p< zp?uKBpbgIzkYZ`1;5097uKb5`CY)dn1dy%>K+fk?y-xv6 zRt6EzKOs~|b-u;__FtxSG>^0c=VUdC3q=_+U^Zz?Jgn+LDLfT6xc*i2Uc?lS$u)vPLY;W&!U(KT_UZhz_amHEg@dM{?5c6x-zjjH zfE|cH5Toh^4>*TmC+VJFe8*enz*=M&Jb$QDL>`lFeZ>tGB|H2%?CbM-wMzsH$Iq+T z)~Xw7C7W^32=j<|s(A}1wn*kRN#?~;QgUmpUUq7|zb(?Z0|&tMR4sD_4wrNiK=!%o zEbH|wtAmMatrTWFN5TkzlfWw^p*yPh@z28iik#$E_s5nnWF5`-ylO-KsgXE;qp=)M z(yEXmX(AK*=ukkV(p%R4P4!#)dQPLCwW|atmT`~qIZfF@#`Mn#*;~6rDe_k=aP_Dy0 zVc1zfKVt}C1fLq)b@*CZjxdL6k?mUv3S=NKf$VSndOqylDx7-tcVyh=EUI`wEy280 z#(C%;y0WisLGh#*zuFB54|1Nj6DB%Zax1kp`x4etq5_78De}m-i zX3=xfBn5y~sn@ciwkjUxH_%Pv^DOLc*i^{iBXsDV?I6XFL2&sArCdIC7zZ46=d=OFQ)_`B-|-#SpP#460^wLN>K`lIvU+ zGE`_y5%1+Wjeg2tO3pP4Cmk*60}#DLnx7HAx*6x5pflq5`uTFHFTuj1jL49~42%=BaOC;839i+qWO!n#Yl zw^gnK*;Gg?vx=s#-3ipdZ0cZ(dQD1(norG-#)BLE{(Cz%R5+j-rtkE<=zW0_K8yZN zkXfcj9HPd%f+0gSM>yFnt}s@rSPugEf;u$Lc1kOvFQ{MRH&L)Ybv?@@}+}^emdsE{QTii!e;WbnE#5%iN<&1 zF72p~2oPY-|H#kX&@tI6mVb*7gA~GOQ&OpMyr6;0tj&RqEb*dSQh|0mI4V=AAJME$ zYn5OwLn{4~$sd7dUpFGakNgAEFWnZ-*&hl~K?l`l;i&n`cNLxucZ znjf7U;IqyBSvf>@gfj1BT0R#Z_$jvpEA*35v1w#1Asvzo<@Pr_7z{F~KTA^s1J`{4a@ZsMf;_C~PEj{@DzA=Ns2>k2izEs-F27SQqHF78(B1V$c zqWP9ZMY8FC=Dkm8W5MR1Re`rRD1Nm_LIl7Z%-Q&IN42N^;3u!%^6xjM1Pk*Vyxe0y zK+@A-)Z4Enb0Q}D!wgh4%s5O&_Xm}%nK-4F0 zI*+)jsLZKM>f$7JB!qgduYemUMu?0dE#p1h#l2&L5=D@3MS$pL2r<2Sr)^oh6H@v^ z3qNr_d|pK=vAbF=^i#zwF2(oMGZTijcRvv)=w8Xh&2W8|nJ@MP$?frGWa$MY9W`0z ze6l2*d|r3gTW@+)5NdTK*x?WjPRbUOO|^Ko2nu2UFYa(RH8@Yv19vFvJSgjP1ol0D zjG!bxaafVa%&qFXa|*sBlfT5v|G5V51{Wikl0`14sUkcsaDvwMPyo@I6z^-x2MG6# zabL=M!PH?P4d0dWEbmek=BZ}h;mq#X*34Hu=1$#g4w4kS$Cjll*BL%zHMI!53f03U zmJiPrh_hGYI>u3TDmVVEZ1wHTh5xKLCu3liccCmZX6ugljWX$*f`KzT@dIJ;&a!qu zwbTo7USW)*I24Ol)#x=_NUjP#d(wMVe0HuS1(OoBPT4$nuj1mG<3_nhxB?5ilZH zHFHglhaiCmZ2U54>h)%xCkAH?w_Hr-)v5Z|-AJi23A>dk^41CBtQ&ZDgOT4MKBLv& zNIyh$ zcjI3QX(c~CU)`pgogS2$nQ_(hy-Vwt)GJQ44BHh;_zOcVbob4ybrlf+31HD4&1;i) zFZ>@w)eu$wf3$?Ezttz#=0Qi#scWJRPb~9?8L0#*tzV_YrD7s>D3(_?QS=uEv2Flb z=aPxR9@Qyv7NnYjsb`O1_1|?jiQM&EcG)0Jyc&ag6 zOT>woK8Cb7wg6LT#^-G2$%U@3vt5|tv@Bk{N$F~{%M3)97ouz)m?>Dd7e!pU; zh5~jv6d*!nXLjoT&s2}6%<40%`IE&JY3^ol#ZVn_R(yG~#id@1I4QVlm=j_L4f?eq z02D#qBy{q_LBm{eBoyLd>Wf(D*}Fph_9|=L+IY~D@P=n{*chLs2LWeH8TSxl1O+Il zQT;{$p!JYNp*uNz=;;mwrCZ7@cjN$&&!NW1PEo}4h0@P;YigaD&p1l%>HYXo+=5$? zM6Yu~`ir7MOtVF)Fm2=4%+el7MhqRvfOFYg1pU~gkS3{f3>JNa$gYX{xg=?`Kb-G% z)Pi!S_KVLbB}$c);d@TK0Z?m0upOnN+RV;9V10L!pvPrXfF4{f*W+@aX~=9 zruG5+II^Zi902semf|$4*=;GfoZknM z){K8n3NRdh4?x$6A2r6gn zC9qR&=^s`_^8mraq$53)L?N3gzg!WUyilqnStTj4P5`gwpaAP(m;U!}%{M|=jn5+| zB^$oJiS$SwV*HL%7SfZPXr!86r5{ zvpFQyz=ENxG5z_U5;LVnNI(FzaO2t6>Er9=5yT{i+h4wuZ1d@eks)ck!M_=Ti_rj4 zDbk*wzrq1J58vV2rxVbK&#iQE*h%}y6f^UF9mgvpEupf6gXvRJN}ep(NIxScq;|W_ zS`vghExYwq+VR@xrUW`TPI>XTEEnQtO1}{2>Dhn)?OWq;bD3U5~(T9;s;bt-Cab8K2y%ec3H6Z3EZQkKmY<1%toeovt_s}$b{-E$P6(wXwy!UgbFa8 zbGYdBU&R3k0P)^xLRX$cEXsObz%-xclk7E9)#h-(AOH}Ng?}e1B`kRd{ApHBa-LG& zLL;wJP$8|zr>JM8GTK%QWS7!r)h)4q-9R!jX9Yf0y&vTi)qPg09=b~+B;-?Z*Q7uJ zeks2^e_#3bwc`sHd>zPa4iX)2l1!2Z0N*p@krw*XOb#S^B_~`8>j^P zuWub!)={6IOm!-!vX@bx5KqwPVTl-TRSRk$H`W&iw{M95Y=Ae=FP8raSU7lpq<@(} zVyIKaCwh`gBL*$0Yj`a={#SsTk~BTTXvK{lMYzp@f~b)Zv&1KhzA@X3QB9 zkOmq_1;^1mdJw8K0|P0n_3%vB2Y8{RA^F(J_?d{kF9{HMuC~Q60b^dgtU(JreBXS! zq-JWR!9yqjD8_EIT%pl7yYU<>C*7Ng)*>Y&|LSM zI1TFZJZ}W-=>&?&XSehI>V>buWObM}q=KbLiTL-(&iO@cgaimW19=Kq^4Y1P z@=`y1n9rv~L`%)47EL@B6qWGgVbtaYu#Lh|W@goF|B&EN0T?k+KYOmR0*FqjB9?D8 z{I$@h2=^JO6);mJ%AeRd@g8`R#&#Lp+kJHog(i51v0j3jj=KmcX@enHUE3fPwmC(= zSd&Aza`)?Dlm(dU((+|jIW{{Y^*9m@up$jOAVocs4mdE@hUYG#Ku#vBA;y;r_-LP4 zSsHTd6lEIE>|}6RS<*&;cA=t+K`6nCVc+WG&`w|40E6}EAG=a#7ztvq`bT1;N&za; z26xsacNPX2Jb>cO$0u)+GVNaz*sqL@#iO-KSZ)UxIx-UA=MogC)Bfah1f_6Ain{#A zyE}cLniAY$WRn{wOW-Bz5kX$cG9!zm>8!-a+>Z|hOkjA>OB76)B1jZYn9|FE-)w8B zxvAkk%;$k~H!<*Oa_>PXX-co1z(@E**Ab}o>ibEu)kO;_isT9L^K%ah1ON-1>$&)9 zp-?)HvX~DIAYq?g<33eBZ~1gI`d@n|xJEtBkKtFIZg7S`1h;oJxl`gHKo+yS{oQ8| zQydw#KIRHHcIM4kr2i_Z2LJ6hWjAynCY6j5l?(>2WUSLu?Eol8xd`8MP;)=m;0!-* zml<72Nd?2CqcWlpzrfV&siJW;YnJT6pWK*deEdeh`YtC zZ__{_r0!1eKOk7-pE7MggpCCz-$0g_eQOV_AyhyvJQz4Bz(T1iacRyExA~1p*E0Ju zy|l&OipQ*63oThjrtL9_VY`!4MQx_@IUtZi#qu&=gf^rHEz~9S8?CmHv{`YVcA-K3 zzRvCkxDP40665sh2c@lvE1Dlyy;ZI$x5M`1t1n`!z8Pm9t?olf2x^D)P}h74MtXSl zSux@XKmnzlzbHLoXxWHk*=MKo&Xt%j=c6b{Pu!Ru)GVEyFspC8-$j6BRhat)2*wRKF@%}TEP zB5O|BII#-K*uwB?5r68%nsVjlPW;w$Zk7dpu#S94kVt$_PcC#cz;B!OPem_nwzrNExY@k=HS5G$D+8GUg4yWdv>=uM; zrOIO3j||FuK`XQ=XmIaiZMid6v)cbIEIz!jwGO|}h;;zf;CqxYg72Mu{w9o??_GKN zg7th_`3oTz>ScA2&MMHHT7D1_>-h6-%+ZpO@p|mfsSuJ~Twk>OwDQw zl<$t;+F$d^pk>)2ld8odk(Z#0e?XIDqlh&A@a+`0FB}g&Selmz1u?FgEcl(+6yyCr z`4a?zLNONHPc?eSPcmD)f!kEkgPR!aCkY7BqB7+CiiFTL+G-qr;zHI|ml6J`%^xk^5jk-p#n15!6Uqtq`|CnzIt`Q}SKbCpbo zYWG^MshCD*VtZ@%!q6GF;jUZiggL2&_%1_Ni<+}J2d)hLRK1cv?i11be+zp}TBJa{ zV-8xdU1~<%pUOCsxvAN5&B!%;sAD>842Bc~#EkiEqt*a%DhwQGVQ^i=c^To@jKr5P z(Iunz__FU{^Z11#e^N!4z=_9GvGVoE|E>JXPWW0rcPGQtUf+OjGx%|2=>q3ahQXE6 zb$$sU+Jw63$9$|`gUukl(NHIo>;4n!DIILd(8{OO+LwYP(6Rf{9~+48u2QJltK6fG z=^^qms*R59k>*@po1(rrWtJGqy1Nc)=s`jqzQm(zM}mGSAtj0G`5V%qy`UIyzZfxu z63jlYWlw?^6Y!%4ou4Q-vC*R7(NES@q#zyH9Jtp^av$^jSZfsgftbZ->)Lng8X^D^ zLM9@%-gbb==n1_D|l*bOK77K-FEdT+iM7qT$h%#z41Pw{g3pSJn7E&UDX z-^u_Qcg{N^)eVqKhUt8~9c1(oy2eV02m9$6J*rSQ`@dg_(&*Ez~dV4SPFIlRDG{SZ}I)bcV@a^Z6^7p$2U zQq(Zk6pH`penG^K&3w0-Nqu-g_oa9GE%U}Mg62R*p)_%B|UWOY$5u9yT_hY)}Cn zhxx758uk0i5`SIOF_P{5_eNc@*DkkrZw*pTGnVtUO`xJRbO{;<83Fcz9cF* zHEWQCiwBO35DU95K+VtB5t3)dIzDV{`U9bVH+t<4+XGc?UP3%}QimX7T=>y~L zm)D8cb-7b*i?Xk516wjU^y8%h_=fJSUk5i`(a}5HV8H=cL;Q$I4nIQA8l2N1Frz@X z=iP!wB+)-dh`V=J)CxblgNxHp!J$Huoe9drL8{->(p8mK!?&x6HSNngD^AzC9uk$U zukbILALIKeX$0|C&%tjOzGJa3-lVNgoIKNePN;d`^e$pN5zDk-8Y!7&Ml|v=^dYIOuQg1G7V37w>4D+K*tqJJk21htwPd@+tgi;O13V{#lG6DMM7m zIm!DQZJ3RbaEmu|mp2<1+#?9@#B1*1LV|uf#{cG`Dp6h)VqjuF2_trWRm|*AwDBDr zR&D3(HKA*{pldM-ZKYvsa8P=S8%h-4&*j7}UrbbI1*;V9ZHuQ4`G&;Gq ztn}LW2OS;r%g692L=B<@ZpPFpS=s_*#AqEyYPT?Kh?-t#IE!x55GC4IFGXv6H3yslS_^gH-X8Q@=bLai)LAdU^`14v@KS=j*(>>6^qErK$}T z*2yKrBL@Xur{|9-rG{7+XIpnM{8~v&7AjrcAE)7dh-lZAHaT}4%2++kF{k^7cg919 z+@#i>M-UM$3`s<3o-O#bR7xoo-2F-Cez_RTs&Vcs%YJIg+&%0c=jS_d_cT@hg$}%~ zRBpY?h$eLl7PT2BVY41nd@9@q_S_V_S$H4#oClv;8}#xc5=m6`Q`zfc5P;hXJMkIl0JLemwj8}vIE}2jgsy-WOH-*U#Oxv%k3L4daYyAjAq052|Q;JB*?}e zGoQFe*02cP4ig7UeEK@Zamz)1ojJkLe!lH7*%OL01AEw2Ez~=XwU~riF$y_vltF!d z#dS$4XLwzn-!e7SI>6F3kn1tj8J!HxZ1vy59q?7~FFhX27S_Cxy`#-F%`Z~EvmTLJ56?4VX zYRvA8&KAxADA)oAiZ(9;3FX78@VoyxPcuzeU-IS~JiEWm4+r%Bus1~;_RvGh<%yN| z?R^x|XWidsLE64x&tF5c51(-#v+TvA9Pw!X!86~P^L{T$o#CUwOI_xL2b5_K;V*#mI3Yhf#k|1V^uXO4dEHc}p7jg@tu*F@j?4?^H&urB zuHW3VdJutNNEsSdhCpRnaat^w`^er6s*PHK`owyrW2#W9>Xo&F~bZ~rw~B# zs*txbyr8h}04Y1%T}j{7ykIN$Nm-f@9NerfBMbB6-{z9>V-E<1C*#p+8=e&&)44>f zwIhc_Wh0=;-L@;|BX~ca(dy{_`c4oZ3MIPx6g7ukv{Rui+(dXtt6yJwKHjqCPn^Pa zd4a2#&4jee>}_S(68A-dYiqtNBX+jiF4caX<1cm zRPqgH!q;A#8jo>wq;Kz$$NV|GC({>O<~3qE*uNKbGWgxD)&YT2q7THg3?C5u(rZ0LA~-e%eR8kh$KO zoPxk*afi#Sb7g+`S+2GwfwVmRmehJ|g^$#wi@sxx)p^i~wL_Q&F;!=v1Jj_EvY&Ze zt`&DEg^5u(@#WK`jox);*^Yr^6^n)ilV8)5Ye$;SkRCtH$C?P#MHux^l$IVpC8Wbr z(&SK^rM05PRiISKQk}knp1^YG!Y6zeFB!3xao90Vx)&Gj5ya?93E&Y`NuUaBlo7#B zYsJQ8u`SQ#;X62~48=jESG!2n7FZLPuioc$FYBt`+xPDDGuteDK@kavAHn0k8Qqn; zYLyvCowhL-yn139&_%*yzw&E$kbW+ev!OxJORc#lP0Pq;VH7?=PQdp>6!Br%yI$Ed zc$@cwl~^K4t-0I|$@>Cq=J~(Mtck$9Z0~Gk?yH|w9yR**xA_yhvWmKqTxF=+_+J@D zg<7t)%UQH{{l^Kn?}rndh!s0692%jeiT^{tbU8duSG@6#LgK!ebF^TV9! zDRVIKdKgiY^=T|LsGUJ`*?%dFa2>lT@+oS?XAfjp`nzN^zXyBZ&Jf)3RTZ(77E)nd z02Zt!0r%toBkC)F;%b^`FYXp3NN{%oEbi`Z!3hw8ySqz*ySux)ySsY`?gZDj-~Z~> z+q$(?3&mb$rl;?j?sK|-{`h)XcecV z*>nuCouB%N0xLSsLWNnp3e&!)ZtV&n-``yXkR(B}Q7ym5xFvA`^!(U~?&+%%@maZK z8z4}-@n16YtJfV|Iw~<*&D}wdc3jIs=R-^W=i#EGp~53pZAS7O& zN7?;_16)ej<3)7UBElfUe0T|u)cuk zmG3s6bL6l{S|sSk?v`WIUy7LDWeZqC+Vy2@i)99Vb0iep{JQhK3~Z%tCdYM!KbcO+*hbN6jnZZ%N$D_ za`9t#@$wLz0=928+J)=F)8RSc0t;}O_Wpj5#ksZNbH7-@1a!ooa2_7}9|Jvv)w#WC zNl6N&z}(QZmvw{RW&mzYyP6-kEn`8k`5XcB6NBS=&sXGOmQHYKTqEJDP!WF;Ov4l@ z1_np~{>yTi6iB*E8qz$Fu4O{6zx(txJ)=-r+0H%iTXx>VNsV`ww#8h7%r|ORi(0A;V0H9@jQfP8CZA7?NZ~S40Cfta+=^oIaHI5)}raN zH#D4*emWOaJ1=_WDseSA+lZ8L&oTMKG1=G1{d@)MT&v#23(?t<=qwxq z{TlmDb8fPI11u#}-FN3%yo%SN^U)RV5@?51z)B4p5gUjhks_$AmXZn^Xf{3+`{Zjv z_NNqh@%9UUSk4hsglowV{ald0yM(BSPHJ&MRH+^TnWs6l08LpojHSkJFPy8H=Rqk$ z8~ezeppu&~46e^%7|9(@frk5M;>2X?tHmc#QkSJC*QF=oW)Z%6JV#AmH#y6Jy<_2p_tDMRoSWrr3bLcwlU&! zhCVz$?Ga|{J%wiYK8ze^C&q7b7N1t)E^Q4$22Er}eG*5}t`shZ@gwPn6(RKvGvZcw zc5pYRjIdBENTUGJsf2HZ4^6SUQhvtu$?tEk4Ph!I;33*lEWKe^Fs5DW(wr>r{AI{< zh|NU2+`ZF_{0X>VbbC6+KHZ|Db)Fn!?|;8LRj{P;dK?NuX7p?FeK+`FOV323(89&; zHkAI9O5t~2tm^2~ZJKE_k@OjE9WcE8jo__0#p}3+^cEk_Eb{iFB1Iqt8u%Ajk_VF9hy%*k(EZbOCyKul^hGs8xg`yWA#q<0U~s5lC+ z5Rh@@Ucz4&x-s(;JTF;{f>GpwQUL*rt_j^MSqcUKU!&DaV-W)u`?ce)jpuL&-ihA9 z18M*Ka{nM5K0hYH-Zl6~_-rDO13Lrxone!UxqD3Z3HT7u0NFjVsE;HTKqCK8Ls~O8 z&g)lE?6>=qv;NlUSBAi!t#KM^fs*Jl3VBdg)Y<|(s$Y2mMs$_MmL zi;8cYOyaKDRnCIq1Y$x`@lU-Ti(K_C<>P2T@S$Z)m4-A%She=$9rR)Ha!8O=o{*A( zvEIhw2A$RN(t;g*mh0LY{1>%<3F zK;WOq!7tLJH?hwh93UrgQ@#xfE;@0Q$wePj*dCL0UjJ^CNMLys3A(K(L43(&W9C^8SWkZ63d-xs)p&S_iIPIYv_srmP@>=$fUysmW)Jj)= zT$-T8Hw0u)XURE z8@dK&h=5HYQM1x@!1+0>=)qBd-12c;<>?q9Q4+*7DKivZ5(F?^%C>0IJVC$6*7z2B zON9vyU#EGgKYLg{SHc-{pOsqc9wl52Wr(kBE>?}tP9pF=M}TaSf=~<0Azf-esExJ3 z9-_UE&+0J~M17$T&4Lk~(7b;jUikHTv`{M>lMe&1I$nV#u0Ok_K4v1Qh=}10V_0H2 z|8#y2B!`=H3}c*B0dnimU#u`jmU*Zt79;t zqGJ*0{DT7E)jYP}g^$*TStrYWD(^-9F{SU5YEFPo6%Tdo&mEYQ9QItED}>ek{*>wL zBMdE!1p^3U<*$>$qpvp=b@H62x_&$flVJ6+n7&_;3e@k0F}u;(?Nb$QDV1{GYP7Ni z_RL9FV20CT6d3W2x|*Lv$!DjcLy+FDcyc^(J`Z8Oj_%&T^18M{se}zw=J-D=8OTTE zi=m$!z)-!8TzPi%Zf5NeDPC#CWykU|c!49i3y+&Or<^zlKc%h7z~1AW$2U+00I11X6~}Qp6odCr1`=?qNv@)H9o;7VT@AIw zf|(cwPiEb`8hy7~k8}O`AaGc6p4~ffT4*67DPU1;u{MUPai_w*HibJAvc%ko`Y{3@ zUkFkCO1-T&PAjD0_@0q)0^HY~)(-{-u*>3WP#nSChJ)&1$S-=`Mk_PqS94@$g%0o(7JpHlCqz6z38 z3T7a)duhB66l9vr^4sK|iM_lwm_&8zTrCh#=4Nq=UNjO&!!HiORS+>l<;XZWv7>AI z1wmN%FUzgwRv>{N5;ng`DQbkpfCkcZe~`adR0#Qc6O zWKWPIP(^DdPC@xMqd~v9^uJcnyINFT5AF1zg*9zWi03Lp28p8r-9=24*WvRI;q%L{ z?!eUuW{ok@u>IvVg_Mpzk|1p zQDlu?IYqd*gWiS({IV>*rwH@QRpb9qYA(K+W2Dpvv&=I(V%RNhgQzPOFf~s4EiOHi zHw{{$fSzA};)wOc7q?OgBjYO;DkB=%6@6^ft~V+LU&uLaPZT9wH6TQZS3CC<%h7}{ z5;R{ZWJwRs1e*E?3yI}VzH(zvS%19l(fvL`1ag)Q8P3a0NHYJ@cWr4o;RwM$X=6?H z6F(VF{uv`e`k>}ih9;HzjebIB;XY${_O$u$Lr>B#0u{jhDg@ENj$&u3fLgYJ!H-k% zUUc*wEJ-y+r}6dmg7c#}%>OPa3U%=X4dAE}vg^-`cZGPbA z5Bt+IG&v+HlR`_k=hy2&-*x*rp4aA8I=`8FaU>j}t>Jn&Z6!ac6l|7EeHgdl(SG&$ z2-mZ5AF^~vyKLR7&`9j)&N{y4cjDXEso^cIuSHi+shjFRPe>m_(OmQUmvV2^Qqwg6 zF<7Kr!+enrfUnJ9#w~b*h(c@cXc(70U9gZTUn<>~31wZ5Rt%H6h|8vmEaQz$!Md5* zDmT~Hrs)o{X|UGqSk89zS~IG(c% zsYdMri`xyC5R}_FSTVvL5izpRTWe7yN6`k#m_!&ZbL$!HDw3$0r@;VXWzm@+y{zJ> z98OVTrYxOoqYK)kCH1n*7nd(cNv_f#JkaPCg9AaDDx_7__Fo!Eo=*qCEqIK8{mBZ@ z79SUCK9x`nLZgTk34EBQOT?(84k4|&KPu9@9W=VsVB(uo0R<*I6EO{XqYA0DRB`F- zN;FNLg)o10WAf%dCa!T~n`AtS`yZdj7f=})*?lo*X=lIwI8V_s*?up<#Q<*xN&>tL zggUc;v$Sy=K&p4fsCFkT_xzO>Pc)FuNhUa9S7q>q(HBR+bXm}J`Lntw*rT7{!9wID zAx*dMWVrS|X+_w?iF1z1C~HO*x7deWp!wD)HM^ZpEt{QtDT4us3hNDGQT2$WmaIzN z%bwySx2D?TpA8uNvh|wU`MPNw9ssBtiX!Z`-E1(6(oxSjWpf!VKUnSFzV2hN8vSrG zFM<S#b0e^jms{UB2hMhHeG3S>3(WbB4X(tr>30I0ZuGz{#JHP?L@Qn9z zzgO|SwuI%h5vCPp+;VC1>5V`f3x*v<4{q8M^b68Y!1%L3oyC2CpjEyabn5-aQCE`h zbsP%Z>_>Q>!FQy0^@Mr>Xd0lTjtIBw_46KV43LAb$I@gn8v>V2*M$Fdh;RW7xBW_) z05DPXcA451@Vaj0_8>oS{%5}GE*qkZLQc|#n*FkZ<_Inf*_AXWIzzv5qo2mwb{EY2 z%`e6rO3ImE^%jc|ey-P$W#BPD*noxR>D$Qy-IwY89f3ZCg@h49YOO65XYIEX?d6l6*l#Csn;uXT7 ze7EQWu))#6C#Xe809-2$K@+;i4Q-W?160y7!7V0L7Uu3uRvf*I?LHHZb^=Ek^`t%L z<}l)yC8Y^Fe!>+N%JR~}irR*6J4OCU9Dsoq2gG9rtP3H-t)U`FXn-_7|xk8$DzLWOxi50Blb zr}yz1dU+uO1<+GWd{E(av zB4J8r^IOk<2Ky|Ka7O}#fBUI_21oQke2)Z_xK+)PX?q)v z#U4ek9Bp^#;k*^XGHtV<1BNQ7dISOV$*QXF3%W0Ug@-s^X)j!Qvh{TJ;_+UjN^jXK zU8K)sKMoa{-2+_P%$1aJSpI4|`+?;`g%9V%eND*5s2HVJ66aG5bcGo0 z7JD=Sq6KS{a4HG7spu?1G0{c2!H1pVr3bX7G%RNa{r;>OUW|KG$oKkEY>bzw9((5$ zH=Wsf277NgYmTH?ivg)&Zd5&42sOzKyY{qg;W(QlCp_6_aQXFI7-A!!vc@~mKDE{J z(`QSFoE2%`OS9S);jTs*g$-eUG{#*bkbQKT8`UBJG&}CT_7EnWsob)#zyp z@3?jfy=@>vi6riVWpr*Ws@po=M)mW%hfc4-P(c-$u=%vR{qgoP%Re91yG&)g{c%O# z$N9c}$8m$#@t}%9VC{ECa`O9gZfSKATO{t6&4{Y0#}~LPyy~g8X@NirJXltTqG~;X zhx-BJk&SSYG39>7CRL|d?vK}BvuEJ@qMn#%xKyt#EtD~q`s_p4%np3i;@f7QpbHTo1v$n%T)C)!eWUOQrE8AVRvjw z_@Nlb1#CkPF5UfgP z+;@4%TfBx7-4g2g99CsckA>K&VLW4jpgT4G^D+amMx|_UmZJI+jwX?U-^r3(v`2%| z`T;FjiwKCgJin^>YF_upHGx-TC<^bnBy5UBuHn)2wPY;GsGV&Crz6Ut*}(M7YJQx@ z1~6l8UgS$kl;FcWd^N6SPJZ@aX%_V1~9^Q zpe=rtbom8GE@V&CtU~atYm7gsZm#2xwmjzQ!-4;07eUvgs_876wm=T$PDutd zk+ZZNnTlVX>HIn!-3YLZ6>JLRIMyFFLvxVXl;msI^Bl#I@8 z;OHo2p#ZtDaO5{v2UTkLnasY4hjtG8GR;cII<9ww3^Puu229|~;e z_t2a?$7p4IQz_D7Fyqx7fA!r*Gb=UaYn0*{)arNNuC-ucAR|xY+;KK-r?>+|{-$J) zlH|wJydS^_ojJh0YkX^_-Tk`I1WBwdLd-ZTDccbP3n-1=s5nn=W*OEUO-l}Za?PR8 zaHwkz!Tk}#3Sw_=_-kSrCnNSjS=|qnM+*;g)1dd!pyxX=Yz3Y`uH*Sy2R%X7*Y2`T za5557h?tRkBgbc?1kZZO!ZtGyTcRP4K6qmDw~FLgp_9o4Ec}=H9oTwd#TO`>?Ckv( z9_I5qxZgaL!o})&uDMH0@e@8g6v2EMXdw1UkC6iJ4H@~mBdeAQ>Cuq}G`<&&uIuNf zhOhPdzX?k9$+^Bx1X%HZdl3O`fmuw>8|Dz%OPb!v6$X;_Rt6n;1x+2dQTDQUHcDum zB_9imZKKC8Eko&A?~d7=4buc3rvd+FvCj82-YAfQIY=LajA?Pl3SN=IogfLa^K=fc zAbWzf=HBJ6{kTqy|C_kyI^M2BCM2()3G9&cHOEL+9soQ%1}($)XwH^(!oP9)iT4|oOZ z^T75TLa>l8w+22by;(mECbYK4!u?@&#YTkwdeo4hv3LE%FCaMluaT%43&kkUNeVL` zJ+&z+{xipt8|UIZUlb zXr7DF1=C8k*wGO=!OX64*E)7|@$)~;i2oFjDEcZI0r1=21Wc3Q9$ z;#X+uRLzQuOBCG+4QTv(NsMjngcljuduaFWveN=9yZYr4rgGZj0|rfPQV5y4|1y0` z*P22BfE$Jc3jPx8x~m1`NjIU9k&y;Xn?g9TdMoEA&czvG4Nnni)?S+U1N(BHxI~%o z$vQA7jugBn2b5$MUJQTqH-V3tG-9j|ndMR`pQ72#T~J3_qPk{{gyV?HF#9fvzgn6V zrc0*o`wwH&;re8Af=A6zn5tsiAEAcwQzsQ)5V|$%WlCoKbI5&*Y1};6Y6P9%tNDAY zH~s(CDrHpB@zF^ro%DJn^0CCVMvh>BgVu~RWh|$(GWpk!UN&pP*Itd~Q+xjiXfyTc z%_%o1JbZ-KDhdItD1QcD zkN*Ss;PnKJRYVpW>YA=9oCds8k-ig^KB3TuemI`6C`GfaxK$_2i(u+ek?q7 zJHdU#W1)Kp3}m9&6KhDSRubi?1>T+XCRq4Ib;uJXv7UbhpB-DrdlO0qf6iEfoExV1 z{;_@0R6o6eg_Nk&D2~Ao z)tn8rL+zu-^wFvBT&-80$s3n?4%>>QZRL56W##PwsJ|AwV_5X^?eBO(AF8pPJux+I zR9T!f+T2~J>z|k0A)3_D{c=6-lsfUjdTv2hFWui#`g$$@*g)XGghJ_6Fgbdoe+vrT zsG$rfMP+gl2;2XDb`R_78L(y7KN4npJk#uSR1E+*z)>Zor)BsS{xR=tA-^f|=!VCC z_)X8xIAzm{^{7F`|F>ZnLI|$4kZGQig^E74Efkp0`@f{k)_iZsMO>gU45)oH#2c07g2}Q|7+E_4wpTgTMv>FJ)T;SV{%`1ifgB#% z%)j?@lCt-+am)p&z>Z`{^e>EUN^H4Ac=*^ir=PweUt|!A&MGM{l=t`-#S~HOqY*D> zb!m0+Qj7iziMxcRQ7lp%FNd7`G+-Iv+RPFPtHr&e6H)MQ4}2WMOb{W8ix-g`LbT8} z<=2-0zhD8tqcnWmx%Rc{*Zx0k1N%zb%zoKW@;OpT22g%?QikEIe2vQ6C%J%&;ss@h zJZ`iwFz=X{r{kL8d1b$BHFH97wW@xuTuyd`q!w9)xpTxw*&!+{Y0+*W8YDHffGbj3 zhjK!iaDww2&&uugO?7zt8>ARnrqo%n%bVi)Y(ObBWX0`WXEZm4Vf=W4)WXf~C)XB= zUN>=nAw_4kxG*G4hf0*xBofWu81v-?kB&wnW`G1f?)%JmE_!n&V$$|e4(HNLd;CN# z+jkgHJ=lqG66|Rf^BF+^S#gByCMG7IO8)k3yNLo-!Sg;-y*(K(Z}Sd78O}-~7|M zV|OGRcf*s2_ z5j0@&6p}sR%H?)uKdT=6k(X~Ti;{_}_#Qm|5j-wfjGSqh3;VNrK#+rG{gsh0PK4-- zv||l;A?xQRGe>wkIsWP?YGQAx2Mb!m0Xt;hJ1Qh-3Cl`9H0hD-O-U~TEtr8FL<$_d zTq2Ruvw_J}^ucxe(DjuM*)N?cq^;!x4=rxHo`Q~K;L~rNsqh6~e{wJvQz=$e5HCZ5 zhbT$`4^Xo^rY4daVeIlno-&~nIw^u)HT)==F8FL^t?NG{zK=?y;EgT7Ld1aoO4>A3 zQT$gaOeZ7|bBVVDJOQ23q-dRBPxCSY12P3KuSr#~8=gWVq6#Tbngj?UuL|<|*Ecmu%uvcz7_u=L<;i`m)*e(7jd@&`p zspf1M#@skX0kQDzko{TC+F8yz>dF6wNGu{ANPf``aTwO3YD~CYb0W4r_&Ybex=akF zUp8RsNy#anVWc(Q!g|2o&Is!gXNzkoFXmiuMqjsT^R9inZH{p(ku$OxT zCON>OMU7Sp9`s4=_At=XseSX(yJ_QUP~~5UU9~Ex1|{Un=uVM)C@03?^4!FA{72h> zhIWT3vgcwR!z}Q%lw^Hp=4X6UPZe{`u{1YMHHt`RaOc)cRtXV?NxD`K96%W$#s;EM zZxYV*V4T7*Xz?vQZF=^&Lnd;6OTw_Kz&^EpZ^~hfaX};;YI|e zU!8SVCMlUBT!zC-el6(NXWb4v))^(7-}$2093tj}2~^0S?F0biZX5 z!g960m9;>DEg3J>gQ87jVWCwN*^)!afo4E{Hzqo^AQTo{Fs`a2|<(YL5=o>>R~wfF0&@Zr#)MW-vIJ#=Qv* ze8%&Mrmk5gSldG&lBbh(kKJWv-Eu}{255jf%rOfm3Va^F0e%v`U8#OfHQu3sTpT%P z17muRNDE9<4&DAxz2&%}KbT})B(7kF;Pe1im~?pB*M*?mAIKnDWwt7ITI?Tk=0nQy zpFqYkm_;ncGOMl?cmEq$2t|mYp3t8H1u`R}rlZcr-E`uexSz@I-5`6PPyb=~fkVYais(L05JJ?S2=X*hau-y> zpefvh03kx=l>M}XNqcN-5%k=U=m-o@#?HsUE6C1AqlAzUOgeI@k_Ev-der2%mGNZ94} zRBh@;$Kq&OPqPeCIwaU}?2F3v6atQnOF#>~GJQ;_{935|ET}l&N8+YtV-G>Mg17?# z4Ch{>kw0R|+giw0C5{qHD9lG82T%gYVj}3PFM4+okTe?*1kMcmv+M>4arlgSCy{LQ zui!B_nW5u0^tB-){|3!k*=s~x-@ngXRTy6m1?dMF10Obf1*a^hX@r*E*nMR9IyH^8{M@wgi29VL zS&O0U(O_C)CmrIZ#1Ya`eq2rYVmX=$=Hn$IcPFDtUt_=>OKeHKbo6>(d+5X8YzwLh zS}Y-hN-pO|p|Y0xa>P(%Zi$@P!sm3wZiB#D*sCCNBK@3xNJcR)kswsbBfB6RXs|%C zU!>0^2o;G_YlMOrd9)o#Ka_RxT2V)aBjEEnEPVbB6QL!fsquyrhbaqREK@WV-lCH zP`iN}&N+2G;9=sOTz@?Vj#az*OG&fU2S&1W4;0?>U*q35oBi`1-%$jqlX-Hdg$1al6s2;_WcaAXbJ5E{hfm$jjnx%VLx*wwGu% zuuK-Y)8V=C$ADs0AdW^!i6=l-?btxNaGJk^CjpuAEN0L{~#nv$KI36 zr^QlD_FXhFf}Fq@_g8!rudd9mt^anR5SWKkoGgCt0^|xgM5gKHOFUom3X-o%oaF}| z2B3JOr-nTi@?M!%tc-PPv!<({ES87hFYqtc**G7Ped8;D0@y#yK8bxL5rY(=APMW0 z^5Xr3PUbIFuoVsdET#yL7#l+a8!V-S9we#^-kPZXL?WE~~+!c72H^s{`0p?XFxY-578QMbhCw<3N= zlhwb{2K@g9bNhNL@2j|PwtVH+cy@moBN4O?7NVK$W3MGAgG1%zAFj!tyKC)aO*a@a z)oA@$R@mSaQ(~68Yw@ho4_8hOhnZZ>?k8u=1pYm!tIj%J+@UI4&QBg~&BQRuUhh(9 z4gv9Wvs|LD@0oF_F=Mi6a&nA~rT&y`EJo4#Wul~2aTR2f?{j|L&_VRrf*OR8&Va$X&Mtm-W za;z}5l|QiwLvoR(CKo0=ih8a;Ay?Aoar(3Jb(X6h4*v?KV5G;fE>bsD=ycUw`7aA@ zsHHd-hsRerE23;_*!{HLLYW93iBhb5R8g@W2yB#-7KhfAa`|lB?a|L@v~2Dht~%iU zCpev2XyXTZ2g&k%N#3ea;ZcdH3|*{`dCONEy58UxLP6N2Y-BltSk_suVtK~Cbk`*w zkM$n~WPyh^>!9Rs9}RCXivN-~T~@-}R))XiiH5%Af>%ciGeR`u!s5GSw}R&Ar)m>- zzmjJlQe22VCmr#_v^c@QMP_vm0p~yWK4T_2D}G6rJwE;*vJ5fh)7Ut9b20qh1jR*@J!l)=Kf{O*ulv9{Kcg-OyuE9`rtA20KBqgKM}GZ6Vc&gNWGISNu_<8hrY0>Y zJ`q-@Sz-Wc=n|qZSD4)7GN7=$i0Z)Jt$BLP+v_-EALixYhyFPef@DY43UeQeTndE_ z13C*4S~^=?tvCxrV!evpgo_YeDA{b9g3kbHT)#(LOf5Tv`qe|7xGc4_iv=|H20 zpf&i2XoBzfX)AEPhVKfBv$H}|qH6<35e4lOU%tZ-iGySSW#p?FH9-Q>F9`5Cr1%7_ zR1Zm}(e7f_^hJ!@?2sa25%yeSaNrG!DP7-ULZw9m*#DY`1I&YN=uQITKjRPZN#2Fw zuuS9-{ZJZKWdrByZ6}a+cm@AuW#v?%q88EJD$|_v` zga&N2XzoH}j=_{mtrHaYxD0aCnOrERqfA7=Pl198M$$x;ZnatG0Nj)Tj7}mU8${%j zYG|mAu$1@7D8z7;t<;vovfY=d*vCd1h&bxMf(DU+FVoqrTD^8C|K2WSqMlQ^O{2C7 z53~54Tm7G}3KG|5sNaruY#dotOzw88{>-g~XR?{uZhUObzp0+zFJOskypI`Y&7T^0 z)%@DbvS@b2yMA_&JTqB-cg^w!|0rf{)~3$vK*7MB;hux`$@zn6FDVJDJ8OM43;dgt z$DNEy)Jshy>Mcu_)pIJ(1J&_p{ci(mtosCJ`!2tT@Lx`?qwHjDYrPkPn9T3ryO|)a zzUY9+n~R05SyGTqPCAYCbsgF5GaH@-|Mw-%4aG$(^~Kfn$u{=(`vX&%+21Z9fXnAn zJ)X}Mo9*|5M)#<+E~*i4U9Z6})olV5zDK3AnW=2l-#HO^o2HpZE^s?#ms*yWv%_8e zxjTPYxJY_hNVbn|eUuJTT4p!9;&wND0j3xT*IWPn8r0r>Qog0y66_IHn*-gcrK8 zz(bJ9_5i%AGM8J!eXx8owRP3h$Ky>x=EWylr@CRiit+8UHDye#+oyf$^zwh4YMm|# z2+#rat{U=dYMI@;H%Ok4;Rq-`)xNWbv!e4|w?xL;cE4`gUMH)j={l>etH!o>88LhH z#HT+xEaryQpVFBG+j5_q;R3J`Q~@S*-PU}IxuTO-`Q(4DEe|r?=_Ahq{nuela{^Bmk7%L5+zhrX_ocLgZm|EHX2 z^KZ%rA!akZ<*R1ZwcN{sqf%JHS>@QrgyR`U&=H3;%=qO!^oRPno|gX0ZTOge;b8-1 zvBZ})mebI(JPTXZ6H#KuYjFPlCaV;V=!iGGiK_zgetFwSK9WB&8U41o_rUH3@mvTM>i0ZY8y}St9A*btHmVK z8*N=`y=J@XUwS80S2sVh7O$V8ihSB6w#vb$3~+3DpH2ON`0?W`(_I(S_5EX8nrifK z)|VJNX{>0sh8^YHHl5n0#j?thZN?I3)Ah}W3)gb~u1e=_o!Pf4@#gKS=QnTc_3FhX zqM1$Y<0UB9%9To-3OKFk92F6Wc%i7&jChl{*LQdX2ySd>rz|ugK9L^>j>w}E9R}GC z*W?eU^la0oJ_hqnBPPvTX;*O}Km3Gnkx75y^$W)--O~shLXbX?e!avf-9bpbG7mmV z)w+)0vN8>@l8<}6GZ_ro{R%^#xGqtS2(oVgghd^BrGf$y1|F5L2{z@ScI{j|M`rfx zsn-7xpHOQoU>(UdDtDFUKW2P%~kr&^6ROsDm`pY zaohdW+nPU(QdsfG8v+*qSM)YrC-~4o0EEn4KOB08%4!K@P8m=;?#CO;;!o>*bQZpU zQKhgq-yVW0L)kvMU6fodP_y=R?~NmLyD(dPZoA2>&oxmMmR@P1M#;8$Lf3mSZR}F^ zd<0D{X12O#<9f~nC(dAFCzLFC+u2=?v2*Fw{B2}iOq-*RZ0S;XIhLt7+uw*R?$_Ia zL)xNr6f9rjv_R`l&3!RBA5wb23de*#21o87rBk}spNS=ht(dAo3z;8WnhvajhmHAS zpNq$pEqjE?lyd>VWbgn+*5!!JHR05L&Y|@uj8~h*Y+GH-cZVv&<8e4r&uwfd^U^KO zm!XhKQ;Hg8BCs|ukz`{Qt%^bc-DKpJLS}i=`(1VVkGCdr!Jv{p*SL1e_ue5#3c!iO zbkZ?6yJ{)t=RrvSKJ|M_xQqJ_58)VYZ`@%sr_6`~Uj&b+#i#f#kkJ zOe~$(UypyD=BQKtu2WyvgWJ3+upIq+jPSksNu+{fHrU1UJGXLZIokzcXz0wK#KV(s zUCWlf3$N*S;JdM4j5HeEJ+s<*+7zbtm-Ok@j7?_<^jmlDkCqccZs9aR@sgX?doQ!< z*szaRHQj5n#VV();;rZV#48XZE=~JcTvYUGw^HM&86@`Znlr7_QlLKF4vKsP0#WwI z0@{FjqSJC8xR0AL+S6umF@m)wj&RQrB4j9rgRdRO&J%V4wRD@A@~eMvZFSjes6zUE zC0>nx{W1-oXVnvc`vnJp_EyW0w}AAWIYoLF$#>x4%%!0_!tzYYI zO`IdAOpc#wUB-M@kGa3QoY^$IcNHD4j-y0pl&fdA4e|N7uQV_F_*A*9?uT$%{LaRO zx2BHh|0!UWDsz*pTxMI0Ol=m`o+98dz4E9YUPnu~>Yz6x)a14Lz3(`};{swfii^q9 zG~m`w`)2Sq;X@`o61D3JHozD3X`GqUqN}~DP1|>2V=Fl3AS-tfs&6?`C1=;saj!;1 zUUz>1Yk9&R+{EJ};nPck2$tixOd}^QLp=}YY1*OY8wGDEAy_lGtZCb|{*&AGG6$aq zWpXDJwKpfXRelAY)k5og=GM`@+bvanbRL!#ocUcS)3WZClF={OsQc6We^_}|g}_*g=%?41A5;C_iYqE;zrLiU_>RKOu|YFHvj#b>NFzfo`={A61|Shwz!&QLA>5{o z3Y<)QMnaorxl-vI$)N907i5(c@H!5)svlTxGLW!Xhk|J3@4F6fE3POTdw!x zjp<)wUmS6QkiSGUq>&S05S3rF|CxLmoN8EhWCQ1kC6Qb$7nu{f8nvK+n2e|AsN^UG zrj<8Sp97VOycQ|?k>}e<1`sS@-kNT}^DRzw?hR%2ad65zMEWUoJ0l+!m||b`- zLm#f%&=yqYFe3Os1c1G%4Qy~d#PFhlIao4b%90R_@4HxjJf;OF{vF-+S@KtBNgOsXHt32w+vqI)MG zAp^-Q-UE)H#hK)%m>Ee)bYZMazL~_3sm4^yw67xUpVWpU) z$n2v+-|3f4oxg?OzKK2i+&ub_c_&?1)$2%0tfGaxs}6L84s_6xWwk_G;7R-qfoA%2 zlWN;#y4%(qr1I%qpU|=I5iIjv zBogE6IIwKpz3C7EyTZB%0Q*Q*HoECdC^iMCE~^MBG_KMhP-^@kXCkJhJp|oQ5Qxzb z+-7&cK>LKJmP}NMnhmK2Bc@)6dhoL?%OS;PO0Ih6hDfpIt!wF9H3qftPF|GLP#9bA zmA468pUxf>ZNG05=_^18P0Fifd@YQK1o-vJgeNSCrF?-UM?f03BSl8V^m_k4biHG6 zrQP!ddScrX+qP}nn%J6nV%xTzOzdQ0+s4GUanJj^^{@NsKGolHs&e+(`{~`i*6QvX z_VB(Rv~kt2EGos&i^`7*00(z{zK(i3CX?b#tB;t_8Re*pR9zp&1`F|JZFyC8eR&34p2h3^Tu9Z`-B?$LluNA4uR?z zf0g?S#m7iyJHVv!asw`^^}xI z)~M9UP8(K)y+&qFugwMx-Yl=NEd}JWTLJo~vZ$raKmi{3v8{@o5Jkmxv2ay1U-<)2 z3Q;yQAsj9W`$3%00*1)`)X{Hj&hfb~6yQK{e%x`?IEQtF%3p9;z@_;(|8e$|&sC}} zu<|Q8FJJ^N#&tIi*y|Dm8XOp8-qkKaVL(YAIfWKn80(p0j}wG8Bq>ibCDZrnK4*qQ ziT&=yz~5!U=~a^PElA#c2u_Cf{sld}qHzqgbIx?d5ooNz@H~z1Hzp8)sV(4XnR0pq zQ$zN8AiqKl?t8%*{>B-GiU$+w9??{2qlJFv?tIVQvMXCR#khqGEQ49GDkNu%o%t#8 z5YC1obB@9m1g_(sUvLU`fXW=yXW5`t!@&zKOilRn$KZ;FMSZ|a_1H24C2J^?Xb8Qz zjDy2e^pUS{pp!D0$v}Njdn-@%GwQssgf=&sw3kr$o!1TokHGn(d!qr=yhrWDZf@(H zp`O2Np3YR4&W zSwl;gOHT&@P$l7@VucorGBI?DI|;1~wAmuM`2TzP(f>U?_@rX9gEk|sK|T&Npm#_# ze@~}n&$NVFxn$c%fP>>Pr-y7V3uX|r@ZTJw0|6p2O6WEu=s9Dm9IkA0Kt2TYkIWun z3QT4|G-lP3J(7qLc^bk)c*ls$t0+7BMD=Bor2@vi$h@e?w_wuTCRn*DWo0?zbT+xm zaR@!FUKu%)yz}*x&V5KFK~O#XsK(uq{e4-hkl4x)3KD!j9YTWmmOHlKxArJB37 zo3uDPox=5y6qWv=8D2jMtR|zCv~Va-dl7#^6T6?bx8rh4b5ATogoMqb_7!Wj0ECE+%mx1Ltv+PY8<6JX zXII{{(HlM(R&g@8Mk10p)2(tItcSkhZl$%Ghqp&?%h;+F-XEFEBqk(^8((< z;_F&yD_=-gaxan&CQAnX&tB(e!F;qIHo<-K5>DjwY`ZRS*6)04V_!pKUn0dme+@E2 zIEvz#nT~vBfH>x1mndXVq3@MFTOO+>R_@XNX#p~4vZ-9QDYBQ}f+gEk$g zVvy@nt8hCbaD7M!vc|4fh}h5~F}wXN9_ob3G)51IPBa~%l2 z!>ww1vwRE~Fr|wd_{!y}-Y-C5L`qsX1Cv+G$Zh>eqx^8RzCXbQ92OjTNqa1pm1VfR zp?8fAP|ax6h93FB2~`fMCGYHHAGczwJQqbw0<@vfCGqJM|!Dj#75+lp6!{S zld)=PYl%VpxmxYK>lL^eDI3vr0Xbb)HCT&Fyvw%SqQC|^#|QKaC)<9PF`_)E0KATQ zd2UtaXH0FgR-L~>t_AKgiusAlS9+j<2;Q$0J_2B)q20Io~3q? z`cYSW5zlwplI}z_86d<)&@hXg^j`D&yd#$d=@6u%iqC><(iC_MsgkX~wB~)PGq~*r z>7&l@w)xm6$_L=isTl!Ei)(O4n%~AWR~`0;HNfkl)}S#31q9&8u_0*l0JlG@R_v}1 zoS=!Tklt!|uk#5+1ghSf$f=M?yC2tYf#U>lKMVkl3GY?>1_GHl3uCo-+xHcG0c$;< z)}!NQQ+Q)Z`_uhV#Y;%Y@Qdfw=ih4|W#{Ms=zR|)=MPHXKbq}w zGINitt&wnm&}?PvWhESRKd!0-tcrH-=MHa^DKa42{CI;h)8KR4?$T?V4iX9!vT8;e z(o03=?G$@%M>PyXFuuuMum2ktt<|-d#m{5XW-QWAF`1u`@v~XS^L0uybWCSSh$C

pXrX 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 literal 0 HcmV?d00001 diff --git a/public/markdown/images/colorize-logs.jpg b/public/markdown/images/colorize-logs.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d2773b383e3d96be9bd4d7acc7e5cc2e2a01e0fc GIT binary patch literal 103558 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 KMP2gxzVZjfco4Aw literal 0 HcmV?d00001 diff --git a/public/markdown/images/connect_extension_to_mongodb_step_1.webp b/public/markdown/images/connect_extension_to_mongodb_step_1.webp new file mode 100644 index 0000000000000000000000000000000000000000..4e74142a8a2a352ae832b64eb2f38e062ad481d3 GIT binary patch literal 3650 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 UB3SpZ0000000000000000EO72ApigX literal 0 HcmV?d00001 diff --git a/public/markdown/images/install1.png b/public/markdown/images/install1.png new file mode 100644 index 0000000000000000000000000000000000000000..23c367ddac3751e4d609de309299c3045c3b369f GIT binary patch literal 35659 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 PkOw?n{an^LB{Ts5afot< literal 0 HcmV?d00001 diff --git a/public/markdown/images/install2.png b/public/markdown/images/install2.png new file mode 100644 index 0000000000000000000000000000000000000000..ecced0b064bd1933f62feb29139cb065caf08a31 GIT binary patch literal 51910 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

~cvl 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 literal 0 HcmV?d00001 diff --git a/public/markdown/images/install_mongodb_vscode_extension.webp b/public/markdown/images/install_mongodb_vscode_extension.webp new file mode 100644 index 0000000000000000000000000000000000000000..c73d18892618b954e152551c31f35e986e6d6cd6 GIT binary patch literal 17564 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

UyTp=0Z+tKzN)9wsF% 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

  • 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

    oefKB>rQXvx5${muNT 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

    -n&y?Z-9wXZt_Viu~7j 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%0D!3R$&p3R1~>$a^+wzVK>$Z%1HHfgYA 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

    sLsNW?g_}Bb{j7L zvK(Wsc@}q{*#+?xOYzyN0D2GVhUAL*c;c4-;gc>G;>F3wV+c9N9-j+E1!btNEyV1p zALE0CYp{cEKlHrIaO0)tpi}wVc;Ccg~zM3 zI4etw!7dNpqBJS#0If*2h(?kvYuWy*z-W78|cvb1~a z@T^mXXoD7aW~%VX;#xdQM){5HV{nv3rCzFBQ zsj3oZ6zp&2TBv@!Gr)|31=YBk4u@O%2fD{$bXgUCqIwdqr?l3&@j2b&Cvrdrr`mA4 z*@JcDQF+O6iKhE6EArrTa&UX4*>Hu~j}0{*6p?emZ{4FU8uV0q@W@7TXk!hyv7G_t zsye(|8Gug%^d;x*yCNU9TJ?CUs~HK!lt1Kb^Fj)Dl5O|HcU8ECJd%I+O2Ej%GR!m> z(T+?$zk_5&GURy-IRHDgivbzs9=usijt<$IC#rn-w#o-}v>7+r{HXBwQLNS?LF2=^ zQc7<*{iVD+E5l5AMR`Z^-bD^*X@wJC?sDV9kV#}EhpWFui&4>9bcoZzUgE%&yS>;$ z`v=9D@nW7DOSd{Pm42T@@)$wR&>i$_`zGaA;g-%;jH+_tVUp7#`rYsp8*a0Bu$5%! zq&$eBw5}*78Iv;^S#xu&23(n_fw9hoM=9U)xfs&#N5|`Nd0YVN3;oc<7?D<9r3Cbn zsEppy6Ke!N1fsc-Ga-sXTa+9O=(^=5z%$E^lwfc_hQP>jQdf9G_ysO(`1W7rQXsLG?UV zi*eDwdsO~8pm%e&6=!Pd@X~G{R+5wbk7P5_E2=PPrw>MQrf2uoqjFOno*;R6$O*hy z<;H!beoX8fk8^4(asD0;){@+gPqO0a%m6;y?8J-Y@ODi!9o(~D!lR$9gnj5` zxb}h*(brahr5nqjNytD4dnsnW{tjN;V8hUf|G+(iW1(_XqS8@^;(`L~Si2l=J@WzP z((Pl@vT)TSFW{>7wOIbyIT-hE+Nq*SH~1=ia_>0wi*aJ>s(g4-v(Y}mgyQ*=n+@po zIP(hJbJfKdQac?_PMLydz7HK}78TMg27EW%fO+3m;)<{mvY4@Hmqtc7%-CZtx=}^JSLqDmk4<}#lBr2Pq?5@Ex%F7lth9#2Dp|V*@I{r;J z>1wMM7smk~tZ?9cjRyahW5>DrIz>0nq4F`(s)Bc~8_$tmNw?_`M|$=J(#;#Tx$!|r zH?JdIQ4-e8O$78ZEqYv*ZoqK{FFxPn#b!OVEpd7zR9Dvr^teaWl~f-uc9fy}uEqtE zQR6?o&9HB-!y}~A!V!UsvhBD)S0Vse5OoqTT0_iK?w z?NxD&8#4;L*lN_`{=6u3EicDYUK7qV(KD9m@ogVJZk$txxBP0{*&_;LJ#~1W>fUm1 z03*n)+)?Jmmo7EV?P$TdS|4VT?p#4~JUdf|jA{>F*yKWKq6t?~n`o$YVxvKaL~2QP zP@Vjs#D}$HW97vdFs;27d$u|8yho+XEq5vDmaB^WIE`d*AL*p&q?6Jp9}T3F=Ir%g zhBJT?lEJ@v*l>+PK@OjoTcdpI4QT zey;S_=L3^L`8<*QFvcav`0O&8VE^9~@La(B8KYj?O&onXW0s(k@HZpTIxmE$|T z0V$L}0cu-6q5S!oY=NQFe%@yCU_I+Wx^Hx-UHF3Xb`$BU6Kr&Cvl?qiU)!i{KaIW@ zQMx%W8bpO$DzmTjG^23YzJQ)qt;5tocJwW-#Vuui80lJf^weYPueG?H$`%Lo?vD3i zO|b_blm6}!XT%BAX8$kWiD?cE{+VIGMWz7e7JBeKwGZvdY_^k~^pi@DTiThSFRH*f zMFAx^erbl4uI0j|i=6nDbjU<1uQw<7@gubt8!RSjJDj+FCzV-xhF}w`CixqYSLntI zRH-5d7%EVEa0%W245JUPuBZAQ+T9#~m_@&8&JPC`%wyIr{2jqOW)o)3Y$ce-{2_Db zwS@oRf_V%TvX%m5{#6GM%wuY*QT%_);2F{nIiDYgoQK*$Llvk2q____n8)lqz+heo zwKCy4$*8$t9@9da{HvM?<}u9$^O%;NljSbKJV6kSVB8*$G8~tOqR#m77iAv5CtiCO z_dY*W8Q%NsTOZU9>x~@J%k%jyUAqyhLc@7^1z(=Sk9)fD{C!6wJhY5^6CN~V=xK~b zSjpH-$m)vjGICIw_M0Vd|H2BU94gxG0IUL>XEkVazIZF2Pzb z*2yOEUsc<}n0E#`g&653!-ieucHWk7=T*B{aoS-XYW6~+$xDTrGSLcZdGpf;o0uuy zE$;}EJf*~o!sc+Xy~>3(ESNhJjlR_%5k?)6ktVttCEOY(6#G{;`>zMDHlbnw^dK~ zU?b^Lr=e1AZ6alp8Y1z!oGd$TXSvkfdQlQvzQSI4;VNt{-l}r4Sn6k{)J?~DBahYC(THnogxF8MDCs3Waj)tA7mw1^n|F??)2&q4dqAJ zd$^R^#!UM4>Or^EP>dqQB7%bnwO9#?N~UvE+==DKYDQJ{k-g0Q?+hNF@dh(KUc;_{ zU+d`TI2N4Jz53A`S!7+a zY;Gx+S|d%;)<@pMLn52skZ?bf_wW;yuoft}(kaNx@e{`K)A90JzK#Djc_<0EDAcU9 zgh(SD3|>klO;rXHQxYsp2$%Ok3MyLURIMXpvE(_bEBHO!E4&WOR|pgKCS&=3se;r976GIanfn!fugg z%~?`2m18B&4#7G+a?c@$j)8GO{4hr6o7p*50r6Y=YIxfV#WkyQZKKY zgA!+x(ZWrsCPt|(D5MPb9JlfDktW_0`Mg@>LT9=6nplyG{-}L&IN7YHuf(4va!d8$ zDqMA##+XPmo*Em|B~PkPnJ4kj6wgyiT;%=4P!GFA7d|TWuBtXd%A{F7S4-O}6Zt$& z%J`BG-j7I`4v?@XNk1@L`iJ~_argDDGB%QW znkRivUX%LK%td;dlF#A%qgxP@j2@hlB>#+csekpagq<92;rbL4Arh&Y&3`g#FLRDM zm{I3xefFK)Ym>a|L`JIvLe9onN<-s&Nm(Pc4{Rj&vL)o+d4T#QUqK1_s%$>Qfd#&w z`ZY8(G&If;%Gjq)-Bo+}wKVuO@8|c(KVRTaGhXpszxv^)K7*fHva0syYepH!@`{St zms`O8ydx(*dk*EvC;uD&sC1N7RiD^HuNjqQbznzH`B@I&YNM-bsI6u3oR9cy=P?>X zI?}IO2AxvU7%*}Ok-9Vz!_6|V^58KDb`#_Wrwam9s9;%UYQp>bGqL}B2GN5Kqi8uR2u_zNi zgUXM?#Xg&VuwSq0q-9$Tq-k!IlMh5GnOOr}M9~SBI#eePT5WE&E9Fx?Ecwcj`co^O zRZH@S;<}^3#cX-*b;<8hDUhCFdXmNOP`!&ci*3AGBFcBMD4U}2b%^$#x~EXaxt&ce z-Vi1C)#FaW60BTh@+%HXac>Z%daFdDqHU0J+3xf!h0XMhu#h6@UL#6P^O9$On!Ie1 zxcz15rb60Kuh15TB~iYU<+TV>vt0rQti?(Jj*GD{HpWbrD9l%71Tj3$M31B(Zi(<$ zvO0aXR?6ai$?N-~e7#Z&!{gQV15$nxzgNoQGfA`Zf4S5{M2skq@tZr&#KDF3sk+QxrMovat7ai5fxn$=Mw0UVU~vdSuT6bd=j4qlLZUXi-l zEs5k>R*4JZ`c6Z{{chqq(XD@Fq-NdS`d)aoVh_;R=RPCi> zVubJH%%-vftlzzp{K^L3iJNUvd1N1pKAFp#3-_>BZHCqkl)+cY=Fpb=ekpk%ZK_lX z#`iv{A62AXDf?H6w1G-xbdgV+TWd+Xw#Y{rt3v~_IZH3{Mr4SZbnP>MTSYck%R3f$ zq(H*nCw^zK*|mYnhu)X2VVs&W)QbtEbUd@sB;w|ZemWu%E9&4bpltGm|r}DM3 z(#GG8%R3=*S10LG(~dln<|v(u+y?*hd?lmQsi$f}p-uH~68dqGE0q#}UGk&ybix2D zX;SeXZgh!Uaq_m@w9ciYca+{|fb1mCH;Vk-5a`y`b_biKqfjNH_L5&uEs)5=VplBO=i+Zv(ib z4hqFxwY7YC2h?)dIBA^SC4Oa0RO5`pz6ZQi$bE;T9BZ6z7MI(2QQDc3&&tTVU9}IX z+ihyx5o+eL5GOMW?7S##`Sl_@)ln9vN{4asFe@*+MZT|>IL|b4Rn?+yZz&$mgl5pw z_;%S)N$q=WsXQ7Q8X6j32Wm!MZs9TC>9NY-r%vTHnfyZsb>K#6Wfgy%{xVO#IE%l% z^yZ0=I@sg?o`3Bd{irx!nezz;@{ZtWamubT=BdL+K3lbcit09Y1eX!Gr_qVW6huO5 z7e@5%O}bjEq>ZhMq!Fk46)HiC(xhH_!^PxWWR>!GMYPmCyaYU!*|hKRjI`A?RC>^>Px zD#c5owhmMuWiU$+Wu!?Io-<8;_aTanTf%6NdmChsy;w%di)4WM>9I!M_6_t!QBcc? zB1A!vQK@enEBAJj;+ACik%6*X2Ec01w)PH4nW%699dS3~6>biSUzns%&5ltg-m2M{O3}`fa%q%;&XM;|mD8>UH-2D{~YujHLjQB>vr=100qSUv-r$HVfXCjOP%$lr2pqRi{4Y4o?tI*XCa zAf?#4n6He^g*G<0{D;7F_O+pQpwcSsELdu@D&X|3pxRu$L)x>6@c53588C>h(Jfn% zNF-++rN{Evws|`n_SImD%V5N~;q;ER(bQN+lSAGuPXpz}N7$c}&;A3u*yDAF;zQRCC$T^WQjIX{-|~lFKLaD zc2_Q+HhMc>+w{-Cl=r$>HcOcEi<|gJ0`={q=`fHig4rLhAnjD0{CcAFC4P^z6A>+e zcl_+wh zi(7&C)u_KRJSY%%C9m~TXKuN7W4#lLyzKdvHvU`gAzoycuExbS30D~j>vYmjiNBIV ziV%4&Q<4`d;i$dsl)O>0LcKRicB*$-q4pLmR>nSM0F>{?ME>MTy3{^_O;W~(#4RY; z$gsfu>Q66u$5l{DCfOuz^<#jNNxP+<>cvA9i$UTG6Sq?NDC2XLgj+3Ts|>MfhORoL zHCZqHQ-l8pq)+SIB9BcB6hY#U`^u$V#e^E@p&}Iw@=VW`uaz)1(u7Ca#X;3h0&a)x zk{5|fm9gqG4k*L2gr_DepOnvfLL~k=k>i^K@>%7pTJk-o)WuFIpD^)PWu)>E8p!)0 zm0zjDLlSnSgsHaHkZ!W|zE$-Lk}g#r9fOQq7Hy)N*~_vTr*9_uzLvk5w1vdgDCt$F z%leWbX$zIK$)A%*0#uo+_bXEptxj|#O%9g`EB6cv!mynUX^puXI#YJFs9pm7x#eCMv3_MF%BopuZGyneKNKz_ZXO@~`c2<v;5Cay$qi(j5iSC(fMW_j*B(X!{uUL zjfZWbgbt1|(nHEnDUlhzauTJj*3H~{k8kN!pCG*`A$qc-q`Zw@wp2P<)Z`^X!s-)Y zB3;~SMA_>cVq~bKKdI3}zT{zaf|(AYKvc+mJtUkd2?p|V?R+9>s*^NbnrOf*imE~C z?t(Z`ZX7P&t@5zT1*78443_kGcCT+Hk(#%9b%#*W8*R*~6~#NCf0atz4v;eJ9Vo+eNz+KR zUzL>M%0|DDA}rX%BuR_i=44ilzdqFrz+JUYJ`?3teYV$mNRV>2mDcl6r9VEelcB7D@lbQZDHY4yH@}7f8HUq?k#SGO>$-*Du!0Xq}tSD%{vZEQ}5EvR>+`Qqnaz z)Wnz|4{Ib%yBgJ=jnWQ9`5i57Axji8(L;SROueFjhD$s{!i^#qM0b?-Hc-l`pX6uH zF(t#q{99!D+;YM@k>mjg0sZLZn=44!*%_D>J$3zFWDni-lTs z%6n}PscE55lgqj#OE~C_BC$gUl7gBjD=wzEL66Q^#Lfe|*w7SDuk8MeP4;qd?;bwg z&|*ucm;}-;zMfxC9!$r?SYm@r7)*(D>XJcZ`3gQL?#zY#(nKC7lbY0t&Z&vShnZXl6nTRCuILr42lgWTLdViD#sZ z*9KeoNt7~5=?FF(87XpmfZN4Fk=yI!U2C2W(Idj*n;m_)&LQsNAZ;K{>bQG|o(7wj zjdHEzt6Mzw$a_{V@*v4-WlSWLi>y<7pY{+rJJIQ3Q=ok-*?dugiCBqSJ)0!5S(-8p zdXc}%coZ$^mUgI&c8&7RsU@E^UOgEi+j@u$vPtf`N}In(+GeQ3!E1qcSs75&!Ce#J+Dm7&t-RY;$umaz{Mx!7O&sUj(ev}hB3 zM8+xOW~jt5D%ME6y!)Fg-RzKXlcn#;R);mn`NxrCsdw_0yyNvElhlCs?Pe`@U#o-kR4H5W076%mAGzlC$~jWXS(Q;++qWn*gPw+lhK7d5|2Rsy?$^Bw!}|5| zU8`U4mv7vLT3-8YqSBQTAIBx*MlgCnU*D;|iZ5i$Q#8mR-x)$;r$iY9dvP|Db8z2L zsvH#@+O?7Od0pw(JD#MNSUPs=MAsx4+!pL-=?Aay`oTtW@~SY$#S<45PsdJazCF>r zjkW9&CGl8r3Vl;TFxDL5vo*UYDsS<7YUf^z=+m8^plS z6$K+9j<|?mtX@0i$BH>#afCg)Hn8?!AdD6m%~rZ*k7KZm)bsYe&j;-?=&AkcT!e*L zn3!l4#l}pc%g%epWN=w8>5{=`4`mdHGBG^H!f;W>N~`U>T^u+-BS1=!kj(!B<8HP|8&U)N?9@;$l)>#VwVzF#0b8|`WiqJs zZEq(^V6?@;U{M^0D5H|->WvL<4jWATFfEAN;!T9hfH+AMw82IhlsCCqCW<|0Z;NuhTNGh~)N3zMa+QIyn<$5etL%JSCQ6}% zt7dT2ib69k#mW>>z6M8{>1^?mBZ|XTDMMv&9hPnpMa4+}ATN1x|3OhYR>`x+MOzLD z36i`R7#?P(m!xSyuALRC3>}gtmna!Yl4eoJ)soaq3Ad_FEr)Vb?l#a_+?4x>a6L{@ zG~ZK8G)3|56K!E?s+Gy2jEoZHF~;TO{XA(GqBKQ|(sp5LFjGY-9207i^cvWAw1K~i zCL;PDg_5SAU@K$Nq)kcrk596Q((YtOt;aXp#3Ksh5Q)>=XlG%)+SJ`wyizG1>|Rma z;>`Xs6eXud+QZvrE_Md)NfX6tfK}R{GEkjipRFKK{5r~gE}OJrQM}Y_s!F@GrEn`# z6Q!+%n(1P3^3DM}t5vv8H%(X=+rcb~v565;I(8P=cv-?%TPgQSkaCcBdYsf>qQ@&` z>SBrH<*-ffJ3-QS!lEc{I%$g?B8>Eq9G2I**y~iw$|WDk7RE{Y?;x@zx52|6X%h!U zna`BC(#3s9oYbwnUoYcD0R?K z-o!J34dlNSMBz18n@Gw^6*-{CN@^X;NpPDEVszH(IT6B zNnKBjw9r4;!=^$z?}~!oJhNKSv)Q0m>tLPF8Yi;B=|yieF}{PpZ4Z(5*Td?ewA{^B ziFdomhyke~Toh|$Xh1gCi9A{&az)t${j%B0V3B8o1G3pBvN=~|^YtBqxKrGfK`Bo4 z9n$V=MRqQhcipDfGeX{{DI%M@$va~c*?des^8!D%xaCiowBsu}Sx6LFv_kUf^7*t) zjmQJ9QRJh@m2uG~vQ#3Hgtz2nN@?dFqwJF}%6bmAWt6vX8z zl2?(TVbVrkl=pC_q(v=&-6e9ZS8@;+M~RG;`W_ak$0mK|X6bLrMZRXnT6_lm(ZPCx z3|eqBbx?_wSezUd zftV{YsljVuWU8cB%6CMhPR0W^UX%W6s$${y6C?Mn&mqsR({!i`G*G**p`l2RY5_zU(CznVE7#S+^ImOIGse>_zW-Lt(wuW7qO`5frudc+0#IFZkFBA?$C`MfP~PqNhcK*>v;$ggFpGiU|1cWg$mi4eP; z4+GP)OQp{U4h>?m$mfw#2fd{qTb}RmEsd@V#M`SyysBSN@h+0K5+;4nBq{$%BJZ-) zv^8l9`|K{3*5Ess>o?s)q@2`YZ#pb;?=X2jvfLrhx^cVA49bvpA@0LN)XaMs4@tXQ zC+#9a(%3=DCrjRq32|1s7~QNcw)3gTU^UB8s*-r=Q^rZ3KT*oLZ-fE8^AQ`WypHIzlDR-BP!w?8zhH_LMlS66Ya#_LQoV^mdeRJIYtJ#OU-_B2vm> zuo2%<)mH4w610vfW+=3KealEs%hH*V=lV&S)Us_=hV5BW)LzscQWr=$ebibxO1u*! zKSw05YG1pSij^uqrTD9pZrfbW*b1pqPVo|_+EcJKd?yA=ds=pex*c!P<8pXdcUqc; znngjCv~HI)eNHk+UiwO2V&$3ra!)(AZS&3Exja$L{BrZmE<5kH(w4qiOauid(zkyc zj>B8o+VUiX7IYpkgiK2{8+PVXQ-7KiiRwU)PH}{m7IOGV=^6K=`oeVT%c!t&w(dJl zgZ*q~r*Jx^M9bfL@{3yOT-rb_2TT(g*$a`85>0E(XrKsVwFj7Lx9ay4wUX7pic-fl zX(8Nfl{R14z`sv3&_+w!>n-n^dbW9qWHTz>bcr`xWb+(pc&B;$NDRnkHLJS4vRTOu zwPaNpEO)o^j5?&^&ddnzHPmrcj*A@aXm<*z=7Y%5KQ)BV*m&Ed9|rnC8f4v}BOW6k`jgMlTx8~CfEeY2y!ew0j;oU|#I z{U;Wy!I66!mCZZKSz?>-Uq zDXC^;vBy7SyPcd~7A-kjdcTScRc>cWW^TJBWpEtJvZ%Xk*^*_kWHGbF%w#cG%*@QpU@_@m zXyAvLUiKZwJ@NarFqdl#h*2*MrMn^!N{z~1Afgrz^sc)E;ezrI1 z411%fRhmM{4X&&A!9C7J`e`H~6z4xB%W<}9@poqCNsnl(YXECai#@N+;74~4d+dtXWy@brh2G+L!3OHma(qHoNKl^7{pm&IE_kEKz zN_n~4!~b)u?j3IKm51E558BAPN`W^V=^+U2uVQW z*`eCpzGmtId=>60eBC#iVROUxUc&NJf)DMccrQ{%+77x<}PCNbT4 z{-WrkuJ}xiIR5DiONxGX{`D6z7L;An6W)wayHqQ{2f>*|b9OCfWv1CsD=6$QK#iTj zhgl!qMe%vU?7UTiUtm4L=Sd>L59^wLYsH$Ul`>4TWMQEU)(!z8(bFjC1Vf^QA(lfO zw?Uq+_h^AfGy~#)g|P5xAe?hQy}{VivFT^e!r+h8EA%EuO{_% zIoE(pM^)G;9ai}EOV_)@KnL%XfS28la)Yk)@B%OS$J5 zOQY2fT(K11Len?$2VNJ~ocCwjqG=@-NDhpZt6v|a{-JW(yjOT`(4#H}(?`ayX>!bj z*TloagMo{(LW_Lw$?8Jc8yDYm;J?b2@4!FHMVEX|pu=YLU)RQe=BEbdFm$IdE!dgq z_sv`PThgWG#JNXgdiSK;=wb2u8L*xD4Y4}T6~syrgbwhG4+5C;0R}IYwqF0hj+#oT zy#}`DdS?T9XgGb{nKB0%%+|icI>laLnNmMI_2)K+k<%gi@#LgJZG_y^k#8gGyJSOY zbq(zNHX?thqhI%2*7>9t7F%U@%T(tq-IqdX!7ei2*u4sMjbeL&A~jjV_4=%L3p9~4 z>_fWT8|rb&rA#R+W2}-aH~y-<8rWWh;}yLnX2n38=g@s+^$%1VCryaIs#N8Q7V}oY2)3NKR zIqjpuo`>#OnnEX$Jq2d;*R$ngBL+OA=2BYb9DMjdt zgT4spjEK*Gn|Dxy6OLHq#wAPI`msq?dXeaw7Sh2EQc26|407zK~#D2C|sP- z%q4v*Pc89<({217&B-UV1I+MoztL(__1$*8AHcEEw}`|)C4)4j-^fYFrF^bMk0Nl$ zpVR6@ViB#C-rcd{_HwHBL2PjN66;hu{uugkERa^ed2~Tq(DY|AS~6F z+luO4N}pC)mNV)jPj%GlDc0$zOAMfV8@J7lwJEf0g^V~_JepVhQ;+$x4!RIHv9eqf z_gYhnY7k54x-&c6uZBSZML+y@+ExBI@_V_)ZtleqP*qk(J1wY$@~;=`FeX6{y@qO} z^0^1)nWO-D`igMt0xK@U(V>EBy0o#ALGt349Du=ie4U(z(wf9#b^F_V#aXP=xmhV8 z*?$(${7-8S2X%(?uI!ha!|TPB2LP%6-#BMON!@zvns0mkA(h*h8kCzd7;XA&2`>qc z=kV1Je1v8*5yq2^x4Et=>FqdfQV*2=m?nLF-K|l-Rb|}MI|JbpS+OT>-`WX0+W zcBr_t9?>0!VI`mzgro93y|QGOn?HeN|4zcjcJ@sCHe6}Eb|LU`L~Ku*rD6`D_qEF> z$jm@lBF;<~$Qh{?Xpd|UdG^WhxQ(vHgM~ZT*QgUdE>O*2SFN+SCngzsv@9jIL;UTy zpv=mGF>K54e&C|3snJuD%;LV}Crsnr%6GRa>Vr*wdn)ndKryMKW&fdkntD~_n}a6T zNuZ?e6%xjd1D7pwC*T2DK&m~I`0edDW2&8~dmTQ765xkP^U7`n^fdl=EV+cRA9!=@ zEK=IXx&$7JvLKLgx_DnwpX-_Fl0Vi0(penYsLN@e% z$1&03MTVVnTe-=`Iz`hKyA#^HHFQ-XL(Ednhl;W53BMB~z&~EF{5~X5Dr26{(-cj9 z%-Twu8%M+f{RTGiVa}Kc`T`Ta&Xh9)HSJX-#}+K+xZ~ru)9vOmX!+bWiNYN|N9L1u zSN$pVA%PtXP2jO@YKukYS-ZpA#B2E~cZ<(>Y%nu=ew$FndZ zxBqSWdZMAbsU;^8Th9C15@E-R2CcI>l(5Fo9IERDdUc`{MRmOC^zGN#JN(>NoAvA2 zssEVQ>l<;+gUQ7E9AX8t_>A3yIr9M;`jTPWW*^i(9c%pisxh-3uFMi3yMB6A+D5lW zPxxQid->BF#>A2tNfEQ%x1+Pl=S3uxRH0w^DH13Z6f~QYP6RBZVA?C@05Tr!n-%}e z@q6FN>%l*Q=?slN7+lsn*wfRSKK`=?jv;Sl5x#N{({rvhd3){uv|O7=pzX3(`?MUL z>L}P#%*U#-Smy&`$AQ@xWf3?dw1;>mp75wN;0d|1BE{~>D42h4udu5E;=_pGFzyS3 z5+*-A0zl*4T_X`lvdNQh@1883EURV`uO(^T{WcRGR?yRW0x4aens4!i<*~B;9%$!> z*VMsN{OdI=c+c)r-$?mE(7K){wXf{kbGnXdcE-7+k(G9BL6U(Pk0Hx5oZU0=OSe2u zGcK!nv+&9=DzvMs&o@hmK!qrG3j4L|us zMyY+XQIo#CGVexPF`9y!q^>UUFwTV;-#?a5!Kt8ahO6S-M*q_Y?gePuDBd_$Q!$*(xfGys^J?!lN0=Dr9498mi`^&z#(|$K~~KI52GU z?$d{l7dEceVk{eL7hjhWG~d6*FvJ{ons%Gab6ZT3d^KD}ss~>1^4z*$)M~^|mc&eR zqtzR`5>B}+Bjkx&Ba891Tr~c$)*G~{t=_hmAWKK9-P;6ZhoQ&`+oSqCQ=lHQ93R|1 zDM5voRTGnNe|8h4Lf@%(%*}?%eM^0lOl9JxNqi#WGp+pU1Ll8!KjmFIrwhu*yxx-x z#L9EpWmgXigB?8oX?9g$;(dKWQII5f^`1Mkvu%0Uag72;UaXs%T``90Xc<)m-}Wb0 z=0wgjtfd`)0poHvF#W2oY$(cOy;{1PHZepd^5+zua4i-bv<{aQVR~<+ii@}JWACSR z@8KU5#tU`!OWOQvI=@tUN@cjC_g6D(_qy^aT$9~rYTr5BCf3hxBc!DdcF*ig%e*kx z`o$a+Qol`1IkHdtCJE58=Xal|b!7X-Va7P`i1%|Nn=C4II6xzHcVXHMaoT2aXBd?4 ze93favAor|yY%vInH-6$ERDneo8l4K)F63sZs60ppFn(P!T~3sH9iD5ot zK%%tWi_sGpem`_lnGg&@Y>C>^VF|L$7o$?9RCy8DoAsm1pK;;(cnqai@83QCaY@{q zm(nueE`;*{n!9_{Sam^ldyJtVr_VVaF)t`L+iGj}u$g7=d(j?bORP2Z?l#^nR=!2T zFCI`B>@xYS-d38jAW8a-uPwySw@em;B{6F@(y9hK&~~|<_r)UqXRE1UJN*8~`^`V) za0JFMIKEzOagL2OtiIo}AG?=%kZc9Sm)Y&y1@mns9ii#`0ti?X}a&y!~ zbauSGEQ6JIeY}^vZO@l_hC<&*Cn9i?zBzEDIBlDAxxl`)`ktx}xrK{fSnk_$PAv_> zJ(=IzA`U(t1;9}_cnFa$CbP}t!{7_+D4zp|%;wEl#P@UzuerbTdB#@Y4Swz_#L{EpO(l*%tHCk$d&xw z8D>o)C_a<;uPj`#YLRV@M5VBA-dkwEpCKwQ5#nXUKmf!}ZJDjeIhFep~#1{5grcW%}pT7&u;K1-=w$87r!zUuzr!fF0EB3iIz4o1NR(1`zj6}>%TNN- zJrCHlc?xjxjrt@b;CsuLvkjVrVV)mwNi49(;-1VEv{uE%q*{JX5+Gi#_Jk-xm8W-} zpkD)^Luaj4+-th_QA=Fw>OE!^4{bLm1&ftV?~XkoUBJqhZvf$-g>&8BVL0~s^1RRO z{ers}Som$EX zsm@|YkzczZM1?DOpF@4-tDDLC@q3g~dvDM{{E8V~q8GWrB%JiUJx>|U^xj(`L3nNM zmW=QoPYCmVFfe3+;!GtP4e!ENQZ*MFGlzQh&mbg(&-7%R& z7p%L^mgl)qZC+0zC~lF&pN?!3c}VBzsS?eXZ)uDLm~YRIX4m%d^-vAivvx##p(V5A zIu~*{LL$bz_}s3^tS+TmruxlyM6lvH*_@7?N<${|bo42gZ=sB~>+U5{Ae(ON9wF(E zF8JHgL;9kH6-IWK?EqLz$2ZYJtX1;#g?(pFB&<<3HEDg3TIYa1L&?$8@t|Ap4h*dQ|Mn}VXSF%B9;!dMaf_Et+Ywehue+V3kG-3fBFNluX_0CdbWGvg5 z7--XfW-;wAf{n0obO)aY$J4tnh*~YbWmALZ#YJ;~joqxYW<2PeSRXqj*{4jvt> z6h#T<)J9h!izJy&vLlBvqx54!h9fx4DGKS>T|S0J?QSOfVL4r(7|(loavUsY0rHC(Q}jL878FrFtBw_e|UC{NI9}*rDfZt2_d7Q> zcnKXC=;Cum>twdaDAGYVLPgQ~b66*#r=3`*pPkNeV*nL-SvO(E1qqEN%{WJd8G>^E zv9TeVAZag;yuob}_oG(U+R_Tp4oz+42#j}1+U4ez*%ysUDO>)mr<}52M9JAqH(1skqFa_dIF0u?F$pJXn*WF5F?TY;8-#L{*)tyIL=NB$^XKvuWw0u zxTwjLFf}&w40bP@C>K&YBO+rdN-u@ZQB}Cmh1t$ zBU=e=4BxsGBOWh|!7onk9#fwWuXrbV_rT{szkjr>)hG}p$bV9VM0I5|rCyo#zGwW} zjeFQPwR6BP8Cm!f88YOSNK~0jkA31SA$x}no{Gwb)*{e)JaG71A-Vr�Ef$j$66 z0{x6AjJ-t@Zf*t(xAhWt#E!1Gy3a4lp2^3yuez*sTBo46@k^r`=69Wc#vTmVc*;xq z!yP^H=1emkRFc@T&RO{wHjyztq=@;P=gwV;Fe^vKl@wKuXMBoT1kALJ($_@0qzsiF>kO_J?7wj#6J6(k5!_>!(_Jp!8WgJ(ojU6XRJS zy^lI+P4O7w>%|#E)ST8__b}McDe~q{7%y7r2Q+nmM@Ua8CR?bWl34i#U*;=P^u!j z93FQ)a-Z`gvzi;H$=cxK!P^qIa;1?}Zft|XhAxfM!bmJI)F?PK?f%kQ_sJgn7D;R5 zoG)s#agp}rPH7YTH%?0H>r1k=?}xDNyE#HTAHmI%-^6Jf89nxVc9}ffXduiyP;sK| zEf}wotJPv?_B*z4OCXc_T02}}$Ph;;B(djzg6LEENo}N}gA;lU0T*76dp`ybqtu0& zL@AI_tSMM|MW6*_sZX=9;01$*+=f?}!m$96B@Mj%Z_Ws}x0d_@nFZwu{bN|>mHYB0 zXs*qA)wEnKnI<%9Ojp|u5jHu~*q_m-Rt?#0w5I1aLaD573|UVYv(w~{`&2!n0xOs6 z&F{rjuSSo`76X`=a=sM?w(a)QrZs0wV;tJAS0`;4Lx0J+OBT|hXPA7BYZlO&dV%9` z9699dcdX{~X8xdie}8SC7^j1@jbEjx#~yG#mC-aNvw-cyO2-qk*QV}-`D)tsO;-(V z__pchCO{`CB4EF|{FY9RNAS%+*V_qwZA`nR!(}0?kFGhM$U|ECqBpPC2Wz1}X!Kaj z4l$Lxex}Zh=Ik~jZ1Pk@?19L$WZ2;6#DRqD%L9*UD2nC*q1-ry0h7UTwqQbexR??J z8bj8IiZH5uN|K_LL}G%n@UEDp>%wlmmp$vELC_eQWVnC=$?m(W$+jUM8kS6LM?(Z|$%tF$`{(#dRM{wSogo-Qw%#Szq$ z=cJqf#b`cUZBC3|O&x6nS88ZAxy&;_>;zda(EvN#a5E8?(Kgu%AqTebePkY)He=`*y#51HmT-G^`Ky?|Vx`-I3)aI$BL0W$@^2d(Hkeq}UD#;em+~PtE3m%HR|P1sS(?8znDA1A-qti)Ry1Yb)^~;R z*LT>6f|2cKW;p%+H~5XSMU`Rg>Ui_r{j5;V{cvy@_}7TTwm3X1{MflIrY(&y=29x4 zIV-#Up&qavA`5*49f)4L;lEZnjD;s@DhAUgqP5m}eo|>vYJKFn`SzCh`uaG1y;Aj+ z)~WS6?8f94i!oFzEMyK{_FQI62Ky~yUcjx8fL{fRP4ogg+7T8pmwikd9kvcf2O`Gt$zWo5A$ z6giH1{ljj*Q==B3FZW3$=8${BY#m$|@F*1U6KLf64eQUK5TXYOo~jA&wTG<^-`T$_ zY-V@=F*EHNI+f9K8254$6EX}VbmbCgEo0CLuml2pV9p{{UX~45L-PP@2Ob`k6Zy^( zSHGHDSZtZ-J5+^?n2KyAHaB=F^v|HeN2PlW)XURj-ezHKP210|g z+`Y2dV^o&`Z&ffqkC~1Wjx&FVdxy%3L`GT2y`zSd#wBbQ%%1e1mlRH!7E*CW$6#;B zT9((~Lyz_{d^6JkHAcQ_)B$>g4Q znIm_WLn$?S%}vxxFMD(HBe;yu`( zd!FEiA~+yKEc%6`&F}={z4m+#yF^1-*yf;3hvB^&-3)| zezi2>O_x9bWjs!0Uyy+ckq}Av`O3m@6xs=Yl{jcF4BP(wVOF=?#I04suP9`u zNV1FXNw&@%ZY`pB#XYW=1`{;(`n99k6dg|OvY_Mje0a?Bo&uG`5NocU1p2HbY-PF?2uHJ+6?dSXGD+fDk0Zt?!W@`ILty|Q%8M)(9fVf;qMB`M3%P#GB* zK1=3RQMcS=W!nz1Mk4;NH6mNjaa3pbAZ`Jsa$1~{o^_yJx-jXMNy^*oZ}F6-P<7F) zo{ZVh5H;DL>}b*_G|ACt4uv;1cjgiyw)?#=Z(!Riq(Lf)5qmB?z>HmS*+TrZdc{O;@HSGbE*BX9f85S7fYJ24hBM|!0x=x z+S`3E{{uQfQO&#w@AYG<`s)p#gY`mj=;d|WUXpJ7#*%3`eFWGU$M?xCSQb+d64REx zl%HNgkNjMNgR@14h&OdRdSEoX2Ch+ERP6SKTdRx?GC?$3Re1~hNmn2}$?jCvd2<^?T3G(wyBoMP2L2gK6Z&LbAGzA zN>L(d<|XN0l(uVhD@NVza?>4kPSwj`*NY4jkZHTz9*kXhPcy;dzBhaAp?6+D2RL4u z(dspaa>t+0CqsKI0dq9ENwS@TP%(=7@h~J|P*g9{@pCYAh4*#>lMZ0urFkN_x~ehk zG|60Z=;)vqWUdyW(Q? z{^*IKPuZ#58>IPU&EmOTEOEdmwA$V3M>FOlkQR3B+9c0aH#%e8(yYE-UqY5W#XHD_ z-^Ulaa`Tx*fCbxPb9;O8Aaus0NFfCfRP9nsXUcZUh!x8ClN?{^gg)YS?FEqVuNfcn zH>Y&0+^Nr{qx+m*Ol%48Tpro_9R26^gQ(l*oz(X9_(Qkzo-0Ivcgv6X??LH*U=5Ir z0W*%r!}4Q7d;*z~&;O0ybi*9qVacErm6RkVTjW!?F?fx2>{dP8)PoT%7&ZFCzmFTw z{9^H_e3UQp?R?}cuL!*Uh6W9`y^Z*s_ZWtn-*31OIk)i3C-G;Lln1K@Y<&jf**a?( zP+uyZS?gOT4n>5_4<%B7Mp^wG}!MAd2W&`(M?K^7m2L6`{1%N32xVE zlF^*$3Z20MWHy6GiB;NO5p{$vR@G&WY*yMF6c%DW&)F?SF#}sBaVuF45?=y9(T3&R z9x}ORgao4mmsCy__m(4FBiRbhkEl_j(vte*&W3>gFs8QhDyvuR=cpxQp?NQs3MXWA zFT}7pU4}70VhDwbtFKMR)nxbnY-EDQ{nQ!cpeoLjf(|qDbvFM9>(Xyu)$`IPUF-b` zyKAw{ax|H`S)RrxB$}etfg#t1E2LB52fujS0szHLhwm~^o|c=^C7L@xSmeOkvcO^0 z$eWcbq4~W%tnk6I!$h1jNlzsGXR558<07*lRVHHk-EoqTwhBtSE8$_I_8eWC~hYafUV?-r?*> zo)jf;hVHbJ`7{_3+d=lAV@TEASC>aN5R3ni<#Cabts>6v^5NKs(X`AIaSjeK zU~+d@V4K;us8`GEBXV4`q$qddXcO_E;`dBi@3XW2_HhWG+ zGLAqjf`~nk)+R%{sw7t^;>xaoiH8?7dv^1tzORQsQgsR?iOzS{)!?c7Vjs;9(!qB?7i%ZsK(|k%l_DQN#N@wY4+gF3#mNO4m5kR z#+-u*5qaEIW69Ys8B1;1zH}Q+yitigTkI7TG;M%JB;Jr8TIv+%($$qo6vnS1^Ql`% zJ{4Xh_=}iqQ7#Uc3g+`d6-aYMK)YQ6t?=+1Cs`lOr1<;@TUUkF)cfm6Du@yv^oTQ( zv_jEDzab$zE=JUH5`uJWd~HO%uvRj6_{6%x8zIm_hC#Ced};i;an93+#n^qD_GeH&!d z`iA;-YAQQ4#%!(!MVeqfI#1XMygW|G@{vcky++`i zMhkm~>q(BZku7ub>gV`qMLC_OOlhYnYQW)@QD$LoCbI>mJk-M)g7fnW|ElHGb1-n} zoLzBD6J=V3fhN|R0XphIPZX;qE^PIf_~+SJM854t)E9Ks$Xa{+JwnD{J=SmV>RI*r zD)fD@J$TUTfT+aT!n>~kld<_RLLgT1NVRZTscxl75YiQejK`n;=6l5Vc*>8BG zZ}-=)3rS62PD42C$4AJjSa;Ti6N&)-TDBl5<$UuclCeTjL0HI-CMLOh8<6*A7GLhJ>QKH7_5wXmo$5-=n(l{~sE{EyAJ6di zh{jN6uC@N&ECaVZD*2l3R8ICScE%gaV5kJBr_lQe{MdY#Uf zRdtyma?Eov$`N|SU6|Ov9ZoB?=d$((uIQ=cN!4VC4COKm@dg9RRe*R`iIep$w`#YS zlve7=kD`$0mD{{H7=O@23&LO@-#+)%7{6&|WW59ucR^5s#N9euA*F$(Kuz zf5*RUmUvcVM0-ReNkiWqON`VXyqX;GuI`2%WBj(Y^UZ*IbSoAcQntVsqT-7SEY`v#!Q+}}d3H_FzWL(UYWh(!h8`r4k_z*}kgr63*RVkNn@5|Qm{{=Tl)J-pht1Pawag22Uq z#{BSyti%*xh?~m{fxMuoXrcXl)qev)PPKD!TYjw z^)C^)MKGGqC&DgXP{}v;{)!r5)m3D@bV9_MR@VldyZ$0I6c&c1n6MXaU8OH4Xwg%j zZG5*E5XG3aIK0yN_zj)?s9cOEeo~O0gTC~v<2heWxRCtFJ!Dh&a9V4^8f?Hpu6M`jzjKs;7f~Qj;H&ovZweG035sp8lR5v zA;t$brGeM>$0y}j-k#}27A|%UD9vsTKfzcS)$B2(f^DsW)e8#x>L`j6(CxW+n6coe z4ZR=u30jT+5k%7^uALuT_siT`#vys1Y`6Sgs%Q1Tpkr)7zn6NGBi*OG)69)qdb4 z-C1uO?$GUw0EtQQiH#hI89``fMTHvak60p~Y2kcys!FDieIe_HkuR z2TNL>xh4Kzw5dHt(9cm~+tmv0_rFou|H_nER|(%;7pH*VJNCPy54(j*dpe&JVrH`7 zjQ#`mS&q9CU$F?wPW^#(M;F|K(V54sbfwY-`aT}@w!Xr48`}*>-QE7?$bZ;UoR8a} zFB(u=J*IY`z|8-^Z~rCWJRmPWlR1(%ArID??p>te%3(^PH}EAKtWGsSyBgV~R>FjJMvMAkeY>_`z$5)ak-nojdjRDb>lJ z%{c7icP`H{%F#!~f9+G9UQ2eEuK&xlnrB^QQ9^ePcKmJohi5kG6-dg<3-R5-xx;dS z2UjL_T0r^jPj7{>j8;pIQtTaL^NxgeuhDwlslqa8Pvd}j!sky);-*e#*s1Hj=@2OJ zaC-b9-nmyg0ZGHddp*;;f5saCNj@M0@wBXpe&3`UE4& zJ}=;zL8CERo2zw_8J+41+Ti77eIB4{_D#UzDyK{-7^DT_+H<4fhcfcN;xV)*GuEDK zkDm{|d`7I!yBuwbq zBW6Tmgzt5R6>c$Q~yPqGIxM?mfI!WQZwc%ePudswY+1rsk{XXd_zS@ai- z@M-pePD}m_KPHClJJYv;WqqB7qt`ty2DNz{kURTufQ_Zcx0Ee8@%8I2TVE(15K9fg zs;+7aIhl#((_&%Rw+NlbyuA|l4bW8rgpx<^_sUh4eKg$rsg!APk=$rp?BB9SBV8n* z72c{_A}#GzzuL}1RN-(0t7kvcZg18K8r7`K@GKv2Y`z7R(9qC&DBcX(j;-B$s4R6n z7$GRaIbHE9`=Pa+17Pv@y2|ZoA;?dn1NP-qJllz}!#&e@&YUD5pReIEYR_fg;*-fgAT#|0h(9 zJ4^)ic*c;?BZDdTpwqr?`+n1hTea4;=JvKh8IW|xFP)VnDpvFpp8J{;_a|3Nwj4iD zT*jGwd2=E4haA32h=d`nZbu9?V$EBcMy6HkQ>cK!FJrXDCZdAAsDgb?s@c249{>u6rgv)^Y_E{tXA#o>itz6H@*bbwX zw@m^vhb$EaA0fdz^2+#=e`bZTfgH)|dKsTt3Cu<_ zqN^C#SlqAm#Z1Le$Tlxaq!4Y^NPI=rU*z`9y1`7TgUSsyV9Ji>MuI@{ApK$6!)XB# z8AH9A4DPU+cxr8IUG|iEhu(H?NAuYT*-Cjs)l8ZPKZ-#R{9=Zzn{PVXd=q8?SygYO_O$pX{xuMHCsAAYK z3h;KsuFVYD)tSg?jKF(#*u(EXHmoQWBNPi7Bx)$kDdb7L1q~HC<9QPIw~^`Joie3Q zsLK$X##|Ty+b*oX6ZFu{+a7T6S*6`RSnHm^rR_w6pOkWC4@0XPPi@G|1#b*^BS)&M%d{i?u0PFL*9M62L;rR-&Aa& z;;~^{+-%GicS&#nA@(OpSa@7s>g^;j(=+u^Cn+LHqI`QOV9lv_m)z?IjK(^)=t$eN zk?nn=_%%9Tld{Q!!B(rXu;VFFVb26~%qYoSmnDn_lLN7(3&8xz+*!+GOeEGm-^ADf zjfVG(Xq-xDp*Lov8h&WZTZ_98A#=Yd`)_QX%E*;EV|ut7@;uqXmfJqvqAw@2tvt-G zmUbsvh@iRHkBO)(lBm)V(^xt7TJ^@{>Q&S4LpIBv=_bpRAO>u)Kxg6bq9 zrlI0!I0gMmDl+#&sOJd+!j`P@v5y1SJCh5YeQy12= z0`X$M%=h!7fFqldXK{Q^7TI@6h9SgDv6AAX#&JX^aDVJ=pu)yUMuvoCXbn8!T zM-%9_*NchwtICd!hkv|~4&#-`q*A&3>(#dUe3qll+{IWOEcmea%4o_<6kV%pi^kd9 zZYptySlX1}K~y^fqCqJ8)y8YXmB1evqe*8qMytVZCwM4=ilwyB57NDw+2cEf^;g4~mkIacfD*{GFE~m@fd0yPE z^g*tTUCe)ovj!$+*TI1xc&Xn+AO5sj|NQfDCn+MROh=dKANVrQus8v_uv(e7!}-W! z&&khDJkH9IYSx8<@GQ{-C45zU$3?d-l`VT24)9R`)Xb$|!JG4*3C@7i^?@QYrpp8r z=UO^aHy4CM!PMLFT!ef;X-L-Ouzp|itFfaTb7I2DLL((9j0^FG@>CmotMWs8!0=UP zM)?Nq3cN)W4oh16hEh1kBH)_w4%dyiS&u*AJc!Xyi3NM6z4A&tt6#jz_yK>AoV2if z^KU@2Ugo41E>Z&nWvnncI`T$3Tup0w?g$`|*--K{ZSeXXU$Q8vGxKbu?WFYe`MDnc z3QJHs!ka{>-jim9+YLRlzn$^Gv)lR-m8yXYka=f-|E+pF)jd|>ohwq8mG4<+r1Mc{ zFs+W_=CInts^_RmV%=agdZEgyCmkE(G z2N(}Sc4c3Lq#fIV+ZijcI;|~KAG8E1Wfe@n5N07ymg6#9N62iDZd`CO$()of4{?e1 zaBwC5pRJ!)gsycXSL>H=ydR~S$;{bWBMZJ#g7@;4&uN*}$R6bSK8SOe=B)lCAbk3K zDh!3`UF(j!gB!CrcfxFGm`nMXJz^WF>?=64Cvx_IjK=6dmYtuq?X1sT&M2z6tL zdMyGqB6i;?ZyQTIlBTS}%`i-&SZ*5ePV#Zfkm;IJ~5Z z`!Z)#0jJHgJAGvg(0~b?a zCVLmwf_I{Hys4hOG@>NrJNwnjIHJ}MV1EcB1s|5%y~FqK5matp5;sXB&p+WaVHd)( zaamN9<=Jb%CAk(0YhE3PHXY#?qJ6yHmMpqomT3**QA{wsIE?Wp9xp4?U7VLf|g%M!ZaL) zTF#*#UDwmaT(P+>2ipDKVIZh3QobztPfdrVb^DpaBDeja>U>MBt`y|tyEm~?2Xq25 zIC9n2r5PQ#EbzE|p?ugafJ0+somPZnS7>&G1st6dl}gD8O%ub%h7D1+BAD``w`%~r znXDd?x5Ll+;%rauV($2W+z%Ai;)wONzjpbk-vop2V07V_vSIAO`g&^Hq$EPqr{t0D zUVc<6HOO-!uFw!3RiF?Gd)79Boz`UV&02PgTO)XA={rU3>P~8DuFTAqM)Kg+LKACapv7KAzl* zlJ$(fIJjCovnb^avH?uN_F;^S-nFp6p*T;sYm0h8(&*+$z|GhUMyWoQGdWh$$0c_r>9UMO+9?P|G1mxa{P6Ae1+@*zw z$C9uPge@EO;n-40{9qw$vUIi88s58AWoiEVDX=$U5XZlNqsKu(-WxzJ104`eVBJ`J zzR?n761uiYN8VMEmO$+xdz10Qbf74uTT@7a6$`e!qEw;J<#h6RvbW3Awt^4RN`MEb zyCq?+7_={)lwbCR+vQZE0T`%-NftZ22WqnqFEL}ph5Zg1hEzryok?_7D9C2>sLFaL zVCd$K^+|y4Q#=;P6TpUrhOaTI^0T0?othx7)$IGuyCFaqGN2FFGD+q#l?TD5F`5yL z(lTsNT26k%09w*vxC1Wx@|(Ku_? z9ZW%4>KoNt;H#T@19_-pd-64+Dhc-!uh#H+ABLu=f+!kseLbq(|3}taN43=j@4szn zp+$>3v{2mLp+#GuxH|;*;GW{{PLSg6?!`5@yE_Ee05|XVC+psI=g+;8tdnG)vu4jc z^Laj!HA>~6P)Q5Tli2kA$aFsjymSy`{u0c@vJ_wm(YZu& z)7#0_3VC@xj zn2X4mwGEWH;>RmfUh+~Tp7=ihj80?}K-PSQS?i^yj!b&sCS_SufyH1oe9iIt+;AE` zvFNu7wWki`Tj*27>r-dv#S_ok{`McM)bpb=NKf=@DSA1d{X zZ9G2C{hHJec-*a+H@F=!Z6%e@z8;avgQb0Y-gP0FD!k_g6}cFAGDH`=Bivm87lHCs zo~k9bJp=!*6ykGV_sAour@bf4^dr~LvlN(6YBv6AsxY?g4t}ypyhWM8@m?h3aJd)_ zvR`$+gq+zw5==>PW;0gB&L&_T8y9CQ|zHE&EFbg z#kA*H&GMyxliK1|$|W?KhqCnh9R^%lZCpS2^x0o zzct1c99W-q0CAE{e!N6E@9geBnpU~bNQqwj>_7SKtfG<-m#i)h9AdK`!=ksQ?#9|a zU}H^78T@DjFbcspnJ#Ih^GwCbPTeRn=!CR`F?A{Zs^>(4zlanwn#n z&E?RVA;okY{%^l@iE^NN~V5Fa&EqZwPO+nXf}aDR-$OuV;CqpHjMf z-wkd@C{sPlJD!*OUrj<&6zeD9gBV#e@Y|x|Z}?*(?Cw@IJQzJ*6;ffD^w}fAFgqYz zr<#88*hPT>S^`Q+gm+#;CSvSG{YD9#m`Q#gZC~No3E_oveMy$^3D)=&^*j3to-l9Z zKOdU&k0m)XXaYyiu;1<(tY>la4wt}0qh_=YJo=)W9J;@6S)o@sKrnCj7B4(bgefz+ zEUCWn2UID8X}G2N|p-ymSIlCDCAO|*wn3(uujmMJ=qcqaQG8Ci(OQ`WA|A-$nO_m1Bb1z$zRbCG5 zAv{d+)U_aGkkt-E4%y~buqCL0q93|{TB;DW#eqD(bIa^F3q&h>7U{)9;N@hm--zwU zZlFa6=?2L5GZ;bc)OaViQmM*@?*sHXEcR`qW8a|m8Q>8PZ{HkwhrUne3Q3_cX-r4p zs6c7*TJ?H(oVwpKUg68ApSJs`lM#IV%48+t6G!YVf^TVV4y*i|v`SW4#J^j&T$ksz zeg_p~>w51TMLn!4UrhT$qTbNBFiW`odo&$mU|gt3bD)Kg06W*$w2IiTZW5bI+D1KA zVPA#XylFP6gS494l;3j&&tF0bS*}1J&!F|^eNyf)qT>tZO^x!R))p1Smt8Z#i|8Lt zDD3ZX27VY*Nri4%724m)MFkgpW(Z5;-{^*}g5_3ofg~FJPj`$7C>K4l>UW{Fi5zJwbOS zY`|P~qYBPe3YqNlHrk5wczeXp%bZf-!5sHxUZ>H><@ElAV4q(9&SR-@4HO7BB>yQo zR)0BQY-evUvwl>sDxzMSht(5EC*bgoCqq<_lBFs9Zrvw!QKU5v2p@u$M7WU>$K>Lf zxbFfU>C@kWgp2xAvmyI%x$AyF8rw|-&D!zb2F~cy0a1c!RZ;$@Hk9`2cVg5 zX<6g^gR%59CxW8CBq$@NyjAv2H>Ty2tKE*(lDum|{lWOaA}1Oo>1(IKj(}zI$J&F| z&h6Pl`HLg}+(Gok;cRJa%+%+m>uPYb%@QZ#K(l?)saaPW=?-b~%lcC6ug=!rj~#1H z;hd9R=+jf)OvYDwu@IExYDwd(6{>;7siR-wY}drM2y1S~TzJB_l+5T&K3vud!+EHA zW4go)a>IL#4ArMVb3~!YS9iFKK#vnsxY@j)=-APm=OWgSB27XNDfq+tjpp3DkY76P z7vcrC7`#qReuvP9NHZ!he$7?>Q_AP_NA6Gz)Z6l}lO3J<84M|0psycl&ro!-#*!;5 z?K0L!b1b3ngqyhSy*nIFo#xiEhSwJDK9F?iouxMaDUU{CUK(jozrV|7e7Tw;PsOsI zg4e#+zZ2d>;XJvvD$;tSy)XAsup4f$%JMd>aH@DqY(xhxJ zbwSN4Hx-0>Z-}}i{JSSTozr>kOm=nFUfeiZt$GMqAGFRouS{**%z2Y&N}T9K`3&{{_5Ac^$_$<6;r8cfwaxhAfBgt7mD#B#Yk^j< zXvi^}?~@O2dT*M8774@70NN-2AP)EMNL#XrWe@gvrD0JydzZz0rgH&|h-imm(JI*a z+R5y8^N8F}F!6%m-ncb@{deYQ1FzRJan-q6uTvlC2uvp;4_pl0MTFs{1=ty9)I9fu z`7e{H1eu3jZ`Z5F!k0dp%GY?%v%$9+)!H+2s=1VJEzZ(7iz?E-c8lgz`SoDUx=Ji% zC+b{V9Kv}d=`?}QCW-WnTN=5sa@e+86&9|S15z)eVT+aQ(CY9(OO5Uka%QvNU-K|J zLt4*TQkPi>2YP|PJQv^R5%r6H;ww$X6Y3H%{2=rbi925Gh9l_)Tj75wEX<~rOcAzX zh4#-y;@A0}?sv_FDW^*iN@&?$$m&ngbv9W-9KV75tKVw3)mvg~k8a`e+-CAELHcVz z4jy^JE~@98!?}_%^Dg7CZ=C#bA%o^xtENzyjWke7+REo{J7Vzx5PDwE_18S%sn{yv zB_lC3G*Szpaq|VAg9;0Fd(t5)k&fU;#QKK|{A`qV&z-7L-GQhKX)TOcSx-k^tR`V~ zore?ag6L3cvoj4zp`>2ux=&(jOKLHn+V^6rP-eDE?`PDO)f>5uP`l_gxM4{i>KK}9 zwfU9vwJ?8HFT)F-y+8(wzWzEj=oOB#DyAyF=8LmUCAAmQCxjqbWqz}`okaze^jT=@ zQ?f9xK+Z|q4=zgoh_w=Shs$J9c`nWxzaD~rmBP6WjnQ3y_X~>Sn|y}F*Xu`i_tfQo z?|)xwK8x)%yvFO!QOe6YmR3s(U7`%;)!37?3n;Key6H!GfD)@uk0cFrBbn9aSElBI zU25+J4dIz#Xrst>KQr0w_zOOHVxU6x^A}GPjM~mROiyzP-8gY~wo;QONK=u3Lxd>U z_q>-G^(0<2Avccl!$7ep6JcpyUc;wCD&IPVNh^lop;91LYJ#X)Y48y}e#^lp*uzk9 zUUK<8>R@oHmC?wTY8k`h9sX0s-rArSBxK-q^BHT4-R8Z7)w zfC=5&=z2GNB$$HAe1sCl8r2@Czs?>v1MpmQs)|u^q!tUl&e3;!`+5&OhPh4}Zf$QL z#x44y4yh|ID&CR_OCMffNgttV`1Smf{*?<5C0cDEC>~iI7=s}rN2yHV;D{BDis$gV znrSrUSsi~Jjw0I&Nyz45Plby#Pzho}tk!+ddFaF}u=9h%X)PQ8k-xw2F(+mUO@(sd z#Dnqz+F)2wszs5P2z?&!7!(gRQ4g@C%!iogZ0YgpA4vYH7tRM6M)7=4A+9{QUkgJd z$!BiM{_#H06PUzj&lS>8%550Uu~F{475DhxgW0dhB-1d|*!fh_rP4fI>b9zVBJ}GZ z>dnAntUy$)VrUv%6Rd9X&*?N{ye49$wcGxz2#E>P)U1)hN@yjXRGf7Mg;C20`>l9KT$ zF>?FYI8$4s3H!TMG?jj$&M^`ijEAX1-;9kXMkschpFigZe!!WNsmy=u$BBg?U{{^4 z^cc4COXq}c2P4x}yMN^W3Z4#OBik<;+|!`~k60ByrCW19J+^fq@W&}N#;YGn^W+fiw!+Z<3xqojWWLD4YBVCn=2c1@|b{tS7FS@ zT1XzYV`xee*qWI&07ZfugvWuV?ys-YcUK7FdyaB{MVxGQ7CJ#tA7L|gZs79?6xq%K z6wHp@Z|G5FDMPa&pkT^x!1-GFt8+M@tE_V>%wr26`i$5DV4H6IJp)HKOn!_9;vtp)wh-~jim06Mu2uLg}hjam!D)w7QT_~f36aU<`fwz#l= zK2@}4ZLrLv=F2#Gkn}O8zR1{m)Td}?WkB@%(_gM!9NXcC1It=Dew~4`S2>h~)Qt)n zvpxaX*2}y+%*cga%@teMV|I2yGbT==fSZ2xV;8EN;F)Ns=w&-viL)>Ojt&5OID zqk3OY7mQ7jc~eX}G=ue4p2=->f!?b|>(yDY%;k~$fr>m(of}yuS|8461771CR zy1rndUYPX73opJD$67IYLWGL z;#csAO^oQQ+Onm&SL6X3fqzI`byHzQ-0)sI)Jq4#aAj)-?;&UDUVeP7QgzI0h(dI3 zio9RD)rPkgqHT6L1h2Y0lAyKIMRJ@sB3^i?9b&OLxi<^qbB!&eI;FC^(emrPst6nA za$g5Z+ItJlVhH!QHl8Xk$9eFo>J(28&AN7K6jkSyc##n)3##mmu3gqY?LZFtp1Val zhax^1CfKYGXA=QMz$ns`Q4QtC z8vmidJKKF^z;|u|3GT+q9JplpuFfjcGMYJK;c@6G?^~t~=E?t&2CB9G%<5J#eTWc4 zcbH=|eQA&;tVG}4>|B*dyFb&a9lTpP;rdYCnPsR;fTR2mCc!r|XyWxcDOk1w*K8in zyME2F#b6QPi|4`M{YmUd3Q~O9(RCqrr2}N-VSnJ$cX{!KK}< zuP5%uL&Y3V(;Ty|;OM%S_9{EA(W6`nG{|8@8~gHphkJ47i7E6F0ufHMVR-iGV11V3 zdgA%3QZ_4rC3m9+T9kR1O^HwWAC)7_p`kp+?3>+@Z zOVM$@U|iOakVvzbAl}tr344(Ki&THi zZ;DT1>*Ont?5K+pqz)``GL1{Q`~0IeeDDb6_3(lvN$U|_Fy6KKTCI(|{Nhocck|A6 z$=Gm7Nd9s9ZjcLW?u{w#zm8^lots#8Hwjo~+W6AJBup)Ea~r(?&EL5)i@WC{Yk4qy zWF~3V(j11d8S4vM>v>opeVJ_0D+HLYXRb$^G&TVjj_E4REk>1j&8>O=T}sHLw0d!9 z3pyt>u7r0cjo`hxnUu%{PO=G`kaGeU4 zA1TS={U?sB*O&*XT|ASn((=DmWw?OMoDQw-BB8#NLfW;OSgO(n;NKxxCnbuZA80!^ z+Wn>EjHai;uPKs-c9wZvp~@pWa|%bY;xApOTh>)o?T#OUg*6h=z>e!!P$G z4ThS=oQD6d`-B80}k~oHwzt~ zvAeD=5wN?j^f!GmHcDtRO@;t>rDqu>dk07YI1g9eS84)s*=)fTzZ{nI80c?v)Y;*^}P{=+c8vk-E*wKBr z9K+3~i~ANAL`szMA5Ad%Yw!n0akch~PvJ+z@~c-W3-yLvwQHG>*3xK)-p=ebo_~gF zOiuyH>*+nmjv~9O4_W7ro^k!I_~(Z&qDxaQOWnseF|}Kihh}SLd+8sr&P3NuPxC#wCdqiYSd1acrGYMYoc}Rzvb^}Hh-MsPFm1cOr zr<{!Aai5$NA|)M{#Cf=Yk%CIr|~RMP^V7T zZ>?Ed)A95kQxhG5`Q674N5_N8jgA-bjv6)Pe~84e5Ttav^j{vtmxBsmXpF0b_iM~# z23|Bn<^$vxgYsv_UT&nZLNx458^^f~upO+GaYdPGtuzlJLf5gp`%{5K{bt`nA5S_V zwfdC@LvH!%m#w)Px&-$-!`OL7QY&cuoUkWE&Uj4!6<|2Fgm|&rHw^C`H zXN8v}kz@%Jvx7K^zD`}gL#|ZAlO-A)KJ8jk#>l+&??sG+ zcW&6at}?zvkh@a1``E61Grv-rsdb)dfAwx{cfE3aGg5x8in%ZX zQOb(r;=f%0tFxF`hJzRIVH(9Bfq<@E(bIjj}rD*|Gnn1mz>XW(W~d7A6ciJ zY5Hh#sIiiGvV?&RbqhEIrS(V38pp8c-;n6E$88hBJq7ROs0<>GV<4mC@;h@`t9`m+ z&%$Oq3^Vfq19}E~RBR_&_x#a9d;>hS@(=>SX7%;MBBATK$vU{M9Z6>_Ov_fgEpC}w zUmD|v@RfSmPhQ*QiK@v#2ct}2-RMYveJehLZiN7o?EIqkdJSV?-U92Y@ zz$f#SgtnI`{xA#I)lXf+<4v3>`qiDjVDImaaS`_&2_VMGBsC(+ix`-yTx5`f5=3tI zSn;eff?|M1h}C2{bR}4W+Q0sw-CuaN@4w#2se{;5BS3h|zSNupAFAH=^c&bVIbQQG zWNba1-BlUN|DTC~|1}nHI#uw)4o)j%)H_|)JRxDt0>5wu>pEv&cU&UDyu{<|`1Y|o z(=KM^YQ4AZV2|x2mfbD(+wjBdqnL=n(V(@hs#+AjDLX)!O5A00n1N=hPjAs^=vnQ| zM>>DtWckU)GFss^8{_n+yqpi4OKtDngf8r5QYwYZijRs|Z}*Um)pLyBK^!TJoImo= z6(dp5XK`r0@bYS;_L*ZFbrQABoCQfW;(bS{Nn>j9(0lFKYN7vb-Txi?2sW7xPl1O*3B0D{+kYU1=o8mD*! zSWmZF-QCRVUK5rFW`y8I3tT}{567KT!aVvPhqe=exTAWp*!Jdu|8MXuAyC_E@lk0U zO(i&(amm9a*Jj{r1jcL5h;1ixO^SmFNnfpc1HXXH@b!n$u-89DrOTZlJr3oUTg+N` zVqS33xgGy!`O{;>UO&3a9AtfB_;Ow?rmD@mF&7NOQ!WUqg+`1Q!}1K4TT=3w?l4c> zSgb@crPo&R?WZlC_KWietn7k2^@Sn}J{$B zj(#uy{lBr2{~h-(e1(YZb-{Y)r*!kOkOD$kOW~$X&mM78pWBbh0MZ09rh9*7%pNTD#BQT^g&B6?$4l+x#Xa#8+Co|X!yUm?tJYb$oJu9!44y6txg-p}`~ za{w|alB3mdj8NGPLPL5rz#~V2(97Ug&#-y=Fy%xmZCzi|6E6Mp`v^sNhUA6Uz+`8?FTZ{d+a#uHX4E+sth7P< zpM5!=eG4fsx7(NkQnC`E9`ydMoUeB3nXBw5tmwxdz!G&^uZA6Te?^t8uA$m@^t4Ln zAt>)cz2Ec~^t?;dNhJL>R??pEEB>KH`?vJGFzlf4?rHT(K{C z7Nf(*&nS-IIamLD$40sNulC2_Inuw38+XoFi3`5OXU|O0YphY5zqo~$A3r38T6np` z*;^($gHRBE(nO**?`M1A*TKCxa{b|u6#iiuhN4@$^|Ff(yoHEDmf=H-4ZaT}b2T3N z)vq{ziCrXZZ9Ap zb8FCL&HI&dO}7I)H=E&@APmO~LphHUp1Rs=Ln6b@Pjm5cG5g`duHxdSBeRERyV(8^ zpmOugl#j*=8i}wPuKnw~_fnrZ9xch*jlQgQAGrZ0ZBhFxbb!Yv&51 z&fAw(6((M$AJI(QNA;dawaCc6-3VMtzHr*S^DcYR@EpWD=gpeToyORDSzqt!n|yKu zY}$rpoK?=-gVTS_^(EW?PK$@|>G$GnQn{b>t#GoZ_CG%jmO5|2@YXRSuY5ln8A;g> z$TRQfFykdbX+JiBe(+;#UWU^+db^MW21+gX49X?1Q8r)nk2Jdg+1t|tRjORhJRA^w^aIHdf`HRp$*jDiGS0Tu0bcZz7r%5|rpsj? zK(}M>I!Y){d*p3*`d3#I-&4GIO%}btla`S|qgQFPZLKf&Y^<0u&z?{U6TlQ*SzWc& zv5m7EgXDh?53o6O=@i1~d_pnX8%*bOeBpq4O1`sUJ)+(0StVRbdBtk$uZD%0ltm~_ z<(CwcUCbXdz2dU*!;n6aI5n(s7y>=@_%CQ^#eaLscb~VM~qAI6+97V{VdZDE3cegKEkr3 zJWYPC0Oc$Fwt0gu94z30qeWX4++A$2Y6V*7M^s1^iE#Lh@(LR+;-tW`a!3k@^sX#( zIN%M9&Wbl7=0;GwsDz{kADWOij7H$=;q}ebnu1(+7jKktk|k=}`dxrEp@5BWDNA&J zK}pE<&O4u4?p9iaqcJsUl*NU(%k)$_v@&!?(fxf=N&XK=CKwa*EH6Wtv8b=0ZKU&+<_9vTri7l+L(NC1AI~8I| z()@kxE{r-g38kh{22GU$!g_1(n^UsQizx*vlU{fBSxFT`F^XEvE0{O$W4C+v)L?Jr z$gC&^#!YW(E}Dwze@2gNSyxPUoS|EeATK&H#wK)Y*&Kk7&am+uAbu8%=gJCtDv~7= zEuAf$L;qw2lRwN?8G2!Wg<(Ni(#+oDl**p?1^Uhi>dVO&T@}_g2MXr7)$PPtMHdkc zbJ<08>D@uELD5r6 z31twgGgC2i#zgaY%d6>qZ9hWctd3-?xnTs-VmyD{W8LQNJp zQc_n6pXwoH5UQ4OCA|>ojo~nm>fN#Tvqqa#4RO42Rg8D_qg;%n)%E8J0>`Hcd!#kl z63KAzW$J!H_l288nkwQNn08D1ys z#K)+J$Hx*z`BD<>10t)l>5_gZH(L~NcoPbQXn|sah27GQ5grF$&IEic(Ty)IW1Ft? zE{}pbuk@lZu>CSvZ5i`td*3oB0}@&?RLF#X_%*46C%y!^FB@hjtkh|>fPYC>7F4e% zRDG7Rj<{9`Ie0naroVLjHEb?AK9n^{Ny>&PX&7EX=OW49tzebUE)v=kxEc_V+HJ2b zr09a9v8X-Ga(OVDLFXUj-78*kUW0SzzQhGD@$=jJagq|h^Y=b)7Hu6PV^{1%|(X2OFKydWG$&aXs(h=7)dEdgkQA=b!|P*uw%vvKTi7pf?(+D7>2cl2+ZmOyp~7QB{PuFnZE z$3Dsv%c9}?u@x`M9w zEh9?2NuFP~<$XKY13JBLNYwL$$4_W5lpbWDf&dt$6y~l;WO2vfRfmi86d;6wwV!1Q zAK!|BQGAi;z&cl6pPcfUj6QCPFBa*xOYhzdoKwl#yQC7`F{d@fUK>)Wyn!j0o*$o^ z!r{%{pep5dT*&y?LPQ4izHQpRpUiP=9DO zvSa*IwBux1NFfmGt@-;pI^~}Oi}KQNiQPj*7*4IJvaQJGSc=k}tK zt6!KVZEA+mS)eyB=%%9BdGWWC#U&K-ZJmqs06$8z5G%R8Bd!htwSo({w^xqzK@Pn$ zjiW@sSZ|BT&7Aa?IyFhhW4(30>iIKZ+E9G}ao|T^k+KUx>0W z0NXs5q|8iiN)HkRxLNSv!#=PrcCXCiEM7hyk{S70>-1fP>n-XXhge}{w4OI0)|S*` z`G|H9*JIY;UsciMd#%Hq(!$`tz)v=dG;Xe-pq+f@tR)j??#^cT};HYCn8z-!(&S#iPjlORL>Rw_1`+ zgLVo?OsuS{W4M7B1(~u$#1X;G6?;Ah7WwcKLO_k2S1vWCaiP3fbY{^jDl6wic44!h z+hL1p2Cv)wXQG|J+U5?0+^&||j+{RcWunqP+g!6fgA0K`<(`X);@x|U0fI-O2p7hd zZFIF@H!LI7@rqMz_p5MkV^{Z{^OvQXyaO_euHANmtY(7Ci{q{bMOIcG>4t$JL z(P4_qGfFfxxba;wGW6R@Lv+}vj^%HEP5U0m3aF2>AkYo-$RMoR-284X@p2QL=4_3X zB=`lZVeN|ZRdC_w`O46HelTlHd&cS+gPY|lJ09W^rm!LMw4@a4*KX2wY{I;|7B(x0 zrL8`D(BOt)1Tjz42(=VP|A3#-B&#}auwzf!hz6@EFF-01tKXcUL$W-M&A9+b9~4B@tR8@;({74rptQFwEL8zgbK+ZxyG4Jl+jS-Sq$n^HTSkyDug z?6c#ZkP!1&YJrxKfVaAH-$(3VILxx`*0>mJ9e-jo>Ua80+4FvMKH@DrK}?<*i5=#w z`=^V#9D&xD6+L`v9qwR>T>noFH(xAOa3;@MW)kt0EU?DH@=*x3CnPN`g_)4GyZgs? z=S*_hn4~upfUVRP`{Dy{5Ihz8Z5^o}hV~a!rscD4XE`p3dYE{0dur^}1=Dp2xJ^+h znTQ5Q908j*44Qo2yf3-^Y(o42iWOb5WaPef`nb(}bK)#beqgo8ZwhTRKYsKOh_Jt> zX_uTTZLLDd8pYiX4)p~7Qz{OhS|Gyk6hl;@+iCc{GbV+{QA3vr?R8WoAi%17G+fin z+Zj}6!wIeXHN*fH4_!>rS_5vewC5#T1(VmvrDL)%91CR)rVeN$0@e~$)D+hj%2GQv zPY4XGNe6crDz;uq_iMlKr<_-@QcHLO6bJ^+1hWrIp@8ir!UzYfUH3Vh0`Wi&;f1uY z0MxVyKTRk2Ueyx}n#}$hL54d-U`J(xYoc=e#Oi&RxWWk{!44>pCBcX6uu4T}Ne@=? z7#|(g>j*3oGGJ2$1(^mQ27e~q^VM98hUpwb>PqdlHfL*7a5jd{C%02c4-xZIjnx>= z)0+LztdeUSl->i{Pk_~I{Z*BzfKTlQTK8yCA+5mldhfQmE9%F42* zDPZ^Q7K@0hIx3?_9pKuR96uY27gO@;%vv{CHnFC_BEGAgqCO;Zlq9=nlNtGz1mF1r zHlopLjx{YAWzgMJy;aEqM@#PDGZ1nEKHRMc1|P=42gkxp$9jRIA@*J3y=F6XsZ3}4 zkA#z=(^4GXDj$EKueQ}Py>+^o)NIJSOOiFP7JtuCU|G-C8xr>{3ceB5@VT*A68vHA zn1UVlsC3EXmC|B>&OoWl#)GwFZ4)jv$SS&;-71`fRZl*@;zm3|6Xr!EkW`H6b5E#x zK9nhl<5BQlPP31axWXu~NQ{C)ibJYx{Va!hXsE=bAMMWmcY43cV=-< znFS*)Md4)1fxAo-0P;>T83_yL%Te`Dkd8C)(690Q6CMb*Sef;})d9*KaOA!Ak;r3c z&r%AC5m%bY6$Ox%xxnyyXrLhnuKS{KX&$>!#36^e!yOuc(DqnPypE+~%w>UAD>S;Y zuh-_Syl`t;aS~p@Z)99xMSurbp++c)@$N7O6=K>JjIx#~EQ$eKVsSB z{rh9kA4L)somwP@e9VRl9-iGI6YG6mpmm;5)!N)OinbVdduuG|_-b{WGL1PtH)`54 zgW$&4mQk48Jmn?mzw)TYFR^5)bsBr0Gob`>&$nfCU7*%0irkarUyKa91o__Q5JVfd18{F%B>MDkgOyT^% z{`+g_(U*q_X71;vXr>`9SOJ3e5nF@p`aovDyOJdj#k)GixO7o3Z2_kI*_nBjSg`tc ztswJ39;a|AJcWc53OnoXBhBS?U1g*D#l=(D=sDQ@qpzw3v( zpMUEQY%!8S_ynZk{hak%FWXIy>U1WfXMGk<_*YfNhGeWRty$tr&X3|O1G9Nuc7Tim zk)x8HLE{&~H)WGO{{};W*v_F3TYPG(UIOYu&sNsc^WW&;MG!Q78*Z*de$LGf}wkndAeRY8Li7k zM-s(^xqGyuZ5(2!^2LLznPjCt%SIr&y0kj_Z{T!_KtJ*E7_!{Af;g3>&`?*L?RNhv zi?hE?ZRv4wf=V?qv=va?$`*1(%~M-?LdpG^5rvnh6c}m*RBH=_atPlyUC=_) zh6iFJs_ltlaiH+ms;GBDvKHH;pLzi)z(~!j4A2ny*5;~`E(i}noUk+KH@RwhbNd1P40H|G-2Oo6~?nyDfC^*P38$#_i%F1 zFSc5U_gJSoqAvkYi){jtH9l67Ogepn>cous{IV8I*NqW70kSm=T8ay;>~q~gZ|1+i zf`hTl7iBDLsh^^#;}cZHT{JTa=Jys4pvSptd4)R8z^lLDh>yLidNUlj#l83qx%+29 zrJY>?pUHqvSI#ku+bE#^{rE^BY^5_;B8Wu;D!q!07!V_ebR z!}Fr7vnAX$$}X3W;g#nbwd7UB-;)h<3k?7OvAI~Msb!lK;qDApB!mQE%zMw}iA-g2 zxuef}8(eBR_$Lu2W~9}fTAu(5Ts*ZN8Z^N5j-j4cuS_%anQd-&ws?uPrC*OLRoc1Z z#oniRwz!X8RUiDnqojM`(4qzkHzojKSL#g{FY4~k8Uh`Yl$yI5a%=M}!1;B311mk! zz=6)mgR4t4jEly~fJb!LzqtiH*gj+cA{$x}#Wm9JW~7nuT~_<5c+KC0Z)VOFuxAsJ zSj#PI`V&@--X3V>eoT&G1tQkq(IRGcMDHEJGzsaJgUzdih$aXlPj{ufqJrwL2mcEg zO)P53wcsTCJVi79yS5c1o|kt&dzvr9WoYS3|F%8}azqJe8xrkC)rv~&U3jlt&1eh0 zT!IC!kLFK=y%C`=WLhXu=M#^h^9}9StxZ>#X%W^`S_|Gd(chI*(W#W))zkP8cL0hY zu7`$k=7zW=hc{lud-p{{v$Eg{)-sZt8^!$Ii-*EbB)=@MEmVQ$gKsl^-~+#FN#d7( zJ`@PMXoQcXY4Kse1*uB-@mP;eNqRcL zDD?Q4N2ZH_8WMaR&QV;NU{l#XOgY}(g|I~;5LT*iQ*@||;-6Egz0F%{ah%&)>ML|H zL;|7z+mw@#P=j|(B6Q*6*emT2L$GLMdRQn_%&Kw)r=9r9yF<5)j&PAtBT#{sc9eTh zk%G@_g>4DhkL6-ec)Q}!iN;+riXz(SfKgyr+wSCBz0!$QjEt-)`m80kAWRURPj-Db z3@9!a4w|Jqd7%&TrXe~!f#y8Ap@P>vqSYldWSJB2_o^=9@7x}rbiEkP_Hppw21wh0 zRe5c9WNmWq;AH)ES*_f6Lc~1%QS)ci4qR9J`|gi7xp|**^=%A70$D4ZIl}3REwcM2 z;zwAr`np+V_$_6MkFCYL=jPz(P$(=!`|O_B)vGfyV`<_l*FUiM69+{)+u=zbNa>Ag z2{SBMH|UOV-kfrCTMEujU}IW+o|)nPD{K?uZqofE_It`JMX|wUgB?iay58UmZYyW2YoLQ8y=5b0t1XLm|GA2skEz$!-IZFDGvKtqgvVcwi93EzXNxQ$spnVu z2c$QNM;X?|^F8t-Xe>Ntlj8)n=hF3)_F2Drpvc=q?b|!IszDL41;6k)_A=zeq&q!t zd3i5w9w>dFpJd^zWAtq#_ww`9fA}-7_L6B#*H$W3`>s}N^@p4U29s!^=Q6{+y%dQ_ zB-b~yow)Uq@W?_QGW4XBgF^$Ov(VV$@V&aN{G7|duO04g9P8GlIhykL*kV+B&a)>^ zw;Y)-*8*!pHbTnar>Bj7czTa+G<|qyyhLaddJZA;`m4V@oWm#fNTN*8ENfdO!F^9u zb&CuAZ+ae`(7hc4vH(X1pYK$XUHr%cxI1AF!na}Sl@%rFzq3BsycnU7r%#s3E+q2< zKDkVY6_&>6fuIp{5sx*-I`(W!g>GCWil`sZh!A~iJizIdcm)GZzaN%M;O zDl#{Js0=5!HMzVA#t?22R8*(94m6)}NjW*swkkZywjMpnH|T5*0w*c?dq0UN>J#2C zO&VK8_y)50$oVd$dnH{fB|8R?cfkHYr&QBietJLC6>8f_3DJp&j39tz0&vh2G&M_O zze#NW=#ZZHYPpLh_`Gwbef7!g4f zpYBm@3LgH?x#J;A%<>OjlKNB*sS(4?1Tlx;`~0rrr9+Xxgogizske-3D_q(@tGE<* zXmNMf7I$}d4{iYhrBGaoJCxw=8l-4&3GVLh4wv(tv+lj`k7TVKo6MWNGJ75wgOF(F zTM@&xLQn`NvPTA1@wreCu9CkIi-P;-9^1w-iI_TACad<4k9Vr;8~6&EHYblFlv(u& zZFuZv@k*R|p^V*lAh31l$+B*5+fptacG$B?4^D*Jgd;L|*o> zBJ0r$AU_2;9E;x?*yzAfPgh11DURMTU3}x*Ccr#-h0Am1em%t6`i*q-egNGG zm*1weQfwJynRh+MaKD?|=<1Vz!6#t2nRLp1uG3p=$llE7-h;Ehw#%M;t+^h_S&_@h zr9vd|>A`Kh+DY6Nlx-q*7=A03ATkh2loxO{_X(3Qt=W9C=9U|#(h!@Xi$}eTAN}}% zai?W*Zg^j;W%9=)&T-O%HBCcnEK{F+^ zp}@;?;DK|kfs?@9xW;86*a*<>-T02h&#vgSri|3P41@n7WTIlgNHV3Vsir#dJvl%b z9n{NL63^T+o#}?YXJ%U51A`H&eMCP}z(Kh}0tnCZ$uk|KKG+Hi7|`Ucgk~R87PO#W zuG`IBFZfc=d&FTt;v15v&x{61?6h2ty?C&3WPI`BWpot^$E7ITu2Je~?%!l^N5MYL zbTFjnmd)0Or;wu(N7AVsf?1bc)WC(MIL`zUx_j&rZ}|FqboZ7iE32;;^^Yi^3YzUXXUsHR z=1gHZM0)>-WnfZdt10h_XEbF~<*(yygQ*M^0MMk&is_!hf;movdx*3H4th2q=={V} ztMcNfZ|}sDMBO{(klpj|T|Po18DDavWMEEp>KtxIt@qxmt=j|xDq-?CXM@1rz@&ZH zBW9Gsyi|H?om*!;AD_eybaUaV?ZVMM&gp@>*9Yekm-tr;ok z991#TB4ag`MrB3b$Cs}jN$yu};n@{v)&=^2+In?2vV;v@mWnX{ljZV3x_m{bC%Fzb zTN&c#_$|casVB+ob6$`C7!QeqHiXyI1}0@-NS(OxWQn_jA0c^3m;D3%;5`?p08O3@ zr?XsZ*kt|)Lwt{OQde0naIQKxKRizi{_f?wpmW$jk8j*}B~!lZXURFZNb_z5t*URZ zfFES)$_3TBk!JPR86Bx_62p4BYadM^zQPHnc2t@l#Cd> zFJfvymsYJ;GmC;}>)&p6k<{krG37k%7^g?n)wy6RcE2hEIj1yR(pPssJ7;*(pbsOC zU-2{2X>9U1BQ{nVb-KXYSps?2EgVGs%`jxR_*00|&FtK~sXf3ac(>(tzZ?6z2})V4 z_Mc)SMI6VNa7ct``t7EAd#Dol(972r>?)}S8_?awzCAKe;Q;2g1>L%_gRgO`Tn}e` zR!om6*YS((MJ~v)mLn|*k2MJIrI(^@Z>#z|De1P_Cwz?iO>HBRO=mVkf zJq_MpfX!_lG>GS)#&mk};Tch*MdFqH@t)im=AJG+Ug{x8phSX|hr)%#=V`>P{65u9 zlEEtrMOxX2`AnyR$HR=P8;+{-P^5f<_sm@>yyezMOeIoM^UyFdk&RQ9)_+1{zW+E* zeTNG*G^B?dGsuM80OCHgX!6UgXM`t#DtgF?3l8MV&(C!?Xn!j!NnW0jKi1XNT@K8A z7|u<0QflJj3t7#-n@ttvRZPm9IzB4Ag|R%`iAYIkpjP@d#fD`2N14&YjqOQzYZ40V z^C?SPWPjs+F$12*+BE@3m|7nW%mi_nWV`n@OK3M?3{D5J)NuxSih+Na+S+w%l!#3i zU&Nz($SjpCIJT2sn&cwrIn|X7C#5UPi9B>WW{sT_z4<&Ra#{Z^nc*ujl8kL64mFwH zy$hf79TX?P8vt`3Bc%KB%Gw*!3v@*0z7)z6mI~~#yISpZ{a)%|O+!?qUifygpTLu^ zx?~={*l$zjcgO9Z%k}&FCK{ovo%DoT_au0F$LNnCICT@D_AqzrtkL&n8Y*~sak%s- z!JV(r_GRy9U=-qDG=0qwq>7chw^Ov`;B?Z0!~m3mw>)N6+g3eems_Q+uvUk&)a=JM zbjA~tEoX%SdYmi`+kQ$UD;P_ra6gn?!9<*bu57tJ z1`Er#`LoTgx*%hQTE9$b==I8By4n#_TAzbQDTspJ_?}(FH(sE!BXOwmRe;4;D|BJ#^Q=iBs!9CS zZ3c`E^z$+53md@gYlB7z@UE8ZPWVU27x`-C4Ei(B8wxm50rgenj0gXvEKk~M{dQ1W zLUf&lbRa=+ey^bh2(fmhRe%d!eqtf@QH1TH12yaNg-eUqyW*Mlz;^i&?fqtEG+M3X zfz=0q0(D4NXx$*t)sqa)>QR?_e8|U$a*~8I8#TAhM&>aX+yFQFgt8q`9~O5~=dcjW z`M!Ku=0%-sZxFglalQAxB)+ag?DTw?5|Fou#O<)^PS3n9h1SuOMvGhR95dH$>r@o7 z+7%CN@8MSn6-QqdQjF}d&GLApy!5i!w3NlHgN7Q7_MythgDbqlGV;j6R&R2t1+PnQ zdm83wPJ~EZ<2~?4IEdgkIXjwI=DkMlQBt_S5DBk@8pA;*1^qSyl>>Eer&unz!iKpWSjj_C1 znBEV?6~lIZUD=r5G+0)n7S~-e@&p(`M*n^Xe`!2Fw$c+9YeEGTn#gz9qsbKnW2|HS zivPh?oUg&@cCgOwf>{e~GRdj@dmG87K!>efpaQf0=|6=%Q>NQ{eMy1H!9;aGuGp>w z5MSSe1`$kZ3xX(P-+S=-B&g}tXOqQf!K~K1QV6h8_UTo@e5db(gi!6DtZ8JTkd8u> zj3+2X?BQ*B@2=sWoN@+UAdtPIedrWZ(8Ok8&0P)ElK-qwtII5=rS9#7vbI=T#m67( zD)OlAoi$qc%L`)u=nT3fg|EzM;TNa49{hWh7)PL?SU^1ST_a9zB zy1$ROo%ahUPI%HMK6Ae`+nS?egxE8yeLQAU-FDjhPGMnX&^{xNAC>hf7!Hd*T8Izf z#8+DzpUox@>p79Ymr_wz-B8p}hgc-(hMm!td-ni=7h9Eqh<4i5Yy!shbhr->v_Fyl zg*sK3mERH{*+q}3&YuF=Q%>+qsEdzYLuMNn>o~AOOW=n+6S#jon4eqJ3Dw;GtbAz7v%~J-cY@ju^bjfyY?0>mjU3V4tZ1nCowDR1 zNL{hcrv~N}4aqd7`P=dl!&y^>Q@7Ur+ zxdu7n?tTqJwbph2h_H*W3#2fWbh@#e$;Wvxk0sE4)0lh6y5KI2%*D@Mr(97AR(O z7meT+s9PkeEKC(o?C4-oAU3dn@7Q$%RD9Li({iy9uw0=?ftY?KN*c2?oxATdxryMf zNx5BpN$r6nITvQxO8bq`bjamme@SD{P+7PyxVlGN&V+b&MsDxLdAT#ZUNh0{G+R!? zLYMvKz>+!o9Zv{E^OUF2(fxtI_K=Ewi9{rj8Z8;mMf$CSNKD5J?wms=YkW6c|M)C$ zG{98Y4P=b5pZoX7BHVTCrUGADLiQoOnzm)0#3`90ft%hlOEiv!%_y)tX9n@T|KM(5=aR` zZZC^(0_Ei7;6pG=S@EkA$PE4C&<%lEjShrt_;l8S4PhzV{(XAW7>{Zs*HH(P#8+!v z-DF0O+^U2`{Vx=RB(GxnaT*R%h7EB8U@A4j%g?JB4a{})F5D4ONb^L=3MLRLQql@> zAi;T8BclG}n7@nIAB=iC>c6XPv6lHmiGFACj`8Xxh2Q4qh(ZxrPPLO8lAcp?eJd;$S!pr86AiY z1H^ntZRR!sixh+^vc&e0`xQ?g(%oM-qMg*#ZS=f0(nX0yDe#4c69<)UL!Za`+)nQG zunh-sqdRJ&Y7Yh+m2-IpVgu$}oE64nG{>vkY^tn&#xQYDfLrcMek`he4;x4%SCi_hWwx z3$@HxZw!j8R#=MmPizao|FQ1yMY27h8|3fw6d|LM#An30CMh~Br4w}4uTy~ylqU3* zXMyW;k}l#tU`7zB)KC9uIQY1D)Z}#Qo1%&=?M=8WCTW)LgJlz~J6x{Ny{t+(0Hv4$&zm@YYOD@5@OM zk8>H^KN6l+_atSD{+!#!TFO8zRQjitno5yWIPy$6E(4=vVn`E^1*P0g+~`MyM8 zchrM`I%RKf&Eenv>^UsrXeI0p^NpJD{*rQxdu1_qHPq(w^P?62AOmQRyBUY{pyQ9} z2{|7-EUM2M*jiI6Dw!i;o9E;)3_WbR49$({ql2n7n3zE-v2r#B3?TBdoPuAX=SOk$ z>DKg^_jN#Yh$(Eq5f4sMfy)^h?fkX+Pgk(Vft_m@AMV)tu&C@pdT-md3%Dpt^85)2 z3;n!%^!X^11uXB*EvEZse}nF>x`4UKtGUpB&z~y2cU8J?TSR{DMGhUxU%~>;uF5EA zP&E_W=iyGn0>euNIioGHm0_!|rQA9+QP=mB1v`HWh%?w~0n!>-pvs&{BzOJ|}3 zB<+9}4`?_}dEI4GNY4~?_hyTa98p{}{Ed$(B=SgB7FIjZKL~D;x3{v4*R>Ax_hNnj zvDZ9&H-1@rFsvIqOg2E-=r?Y&Iy)($=8js=1sf~|B;ZkFrfbTp074QdN0tmJc87Z# zH|$971TUw|4>1ESflkZX3DwybFV&_8E%lda15YN>u4%F@zMZ6#9ph4tm9(qd+gnyv zu?CBxAZK@T0Rm+%)kK$HAhv1o#f`l1~1f2}A zV8&NY17bZLi68ajS~fpIBF+8gK%qh*zb$)^k1<>HSSreKXPGODsN0&ds5Q8BsyCj6 z4Zr)z2x(|=ZCMql!ImTpYzPI=5%g5kM9LKPYb&C=GGtXohoqxpETAXdPi|Yh&NiPD zv}RPbG(=5+1igvdd6dMPrN{7m3A*AEkhH8m`itJ@qZkFM$|rTi=?RrJ9y5a3AR-me z)2A>h(bdIc1a$PT{U!0)H$AcRqej!pQqGDW9??nHtyIX4a0vYcYk$_1kk@d;zd73} zhL2B{DCT_QBNq_|CFxGH@@CW+E!B?Cf$PL?NaVg1mKnMpw>L;)nns8FL}Kjo=Z{pU z>H?T?7nW%2?(dv$js%7kbEqCoC;4Iv!8%K7A>)IvF4=H#5@j8|uO~XzzNQ4**9-4q zAX{%chJKOQf9-cD7p3YO%W9MAdQ1n?_8ati`?N~i=>W+6`5Gd7&!ge&xU}sCA{w=M zybfJmSw%vEd2B5l6)zp!1L~8@mBEs1h znD=fCask}kkH_LV49ah&^oOKz%LGo<)pMz7D$7eoH+4wHR=)9Qu+8K2b)fr`=dxPr zx7@0lX)^Y*Y*d8>)05+>MqC+~p!&}y#SMkwR zAW!yYF~cN1L91oqg=4S|=R|CSx{cplXG(?Sx#Cplt->Z7AfKG?H*Zca9hk&LHoLU$ zAwwoCZ%l{0ef-1N9}^Ug;;*~kF$qfOVbLcWkdMXY*1J+iTDM?KciVjR3U{Ak2AMT$ z)%Sdfx=P-+?=UWt*})(h7Le;NeT`c>_<~1#O#{BvzYSg<#Njl}6>>Ks`k(llLY~&I z=UY7ex2j{EwtDXwpY@4o*SRwv9W#dN5d5E*;6nysUxps`Z{wYAeTdr!l_u57AUfD_ zk=pG(hZ@5C^K@(HN=1fyKUQW2j1O5e=Y$=qeA zI7v$LHlgw5yk_>?N}Ze(pC<|kdlm>9S#g>p@?B+iQ$t^7j@A8&qW(*N;X{w3IKB6o zd9C>x%*g_K=;)A^C~ru-GYZPe!O-NM!N09nRRzUvo(vzI#|1klPAjjL3U5zU*L5#r z6B4D_2rQSn@CRGYY3ms)5-CKDAPAh}p(w~pWbi#7cXmxoI05J7Y`!@YA6Hb(A3i9l9#plW8jOW9&c`);(I2MOR<#Q)nud2U?#_@LD0YUtHyo z8Kb7^xVa`cgQB_pQ7n0R)4>dpSHTUVMyS1fVHim>n%b#u6R;`Tn@Kn$1OpI?eGdoh z^lQh4s6&I1iD_VICR+=@eJVU;2H5U^61=0G_7e>GTt0Rr5=rL~y@P*K2b-JowtZo9 zRfz^Yg+}9#1koA|*EC)Xmx{RB3LSp?oBJK=gL%8^|B)lTV{=}rv05qN*+{k{^`jx0 ztT#hRF%I0pZvp+`tp-T43jzH6-Al|7*FEmlVi_9^fOfRdo$1K6{^(Rm8T%4)MK}dO|HbZDr9`RyK4ebK!T{* zqT|9(AAv&d2oT9;jdg0^O4K1=>u4UHpI>abJxgz6e=@JU2evYaDXeEUaNkaNEs?Eq zcJ5ZCbp!&Cmto;J9bZ?Ne9YYV^=urT0W6juv2t!TE%)5&m3910*#4aO_r((dJ=55z zq@v@drsT3UXw`B_#)swyr-0{H(9r>9V0+CIJaE7$KV+aCIGz^x%q3$48h{rmbef4?-xXcOk1&~RvRgLo zQ}-VdAzdCd0VKe=O8F9_?9rEl8y-2Ag=y59{Fad_>Xg>fliPQsT*bW8dt8M<3dpE1 zq(0oH7CrE!s(21{r8@$d04j@=$V^41?Bnh0T685xu{|FUN-D2Y8%!kW5r6Y$3?=wS zX}>ptELFs{AMnYs?ViN(A3QOm|?}3l)JLiFci4d4J#Nke2+<*l%%|al5 z*)07Wm;tnsAR`IXc9?;V>ucXpU=*p>>e4Z{8 zxTH)wq-ClUXyi}=mnH@ex`fk@x$Vff)iOBES$l#ab9R=BjsT>42&NGHD&sOG?w(`@`|p`2{uMgRcCSl$71& zap0N=ryZF$g_oKh@O)G->;`TyVu-f5<0prbDE{dPsy~iZmN=37G#J&Zg+r;U@AuDY zHErP)A^{C*h-nBUTyc~5R{5m^z9XiV>V?8sPqmutito$0+D3zSw17?0w} z1Y&M1mz3wi)`X- z->GBREjYX8GpZB%_?QyNJ;0V{Z^fykZYy2?j{hR^Be71c^ zdzF3r2+8ovp(4TMRGM|%;h=pEZSJn1ohz@KokabNx7RiX&Xhg-*6n|7=C$2j6^cr- zMY@nJ#*ce@=wo6@QVkpqS9!U*ddA4x<|{cmVo7{1%mDK9--wT84B=c#nj}CX6dsXO z>a+czaC7KWac;)wdKh38U-kk7Hn1d|4(U6e!agE+l z$Cw-*cQ`Zs$nnGCjWsEOYOg0DL!wD&CyB_}ay#6T6#TmJg3LNZ#7UXoW=rq{v9_~s ziKu=sZs0Ol>}cRyV-n|1YiCJ9>=O41PW~Uwkw1%nr=QG%P?s&F?$1J*FD+4_%j#O3 z`dD7MJ&B8b{4#dW@mB0{$``zI>%}DWPqaQGN#UOh#Loa4qTqBV3MZb%2 zB06vxW6dhG7Omwij`a>OxRJBuXN$3qz21g3ggd-y&W5yC8FSgVv+GxcKDJDSawLUrubW_&*ulXbfjfLrp~hFuw0^ zB@genhTKe4_!yeWX(3KmgPqDBYC4}2Q5B}@!{EHdm_9cbA1y*c9B*mjb%3PZT05`k z1)98bI>t*WLnq7db4>MI^(uIBQZh(1uyAR68-e5Q^Nzp|25p)Lb`kx>Wv|m`^_Mv@ z0XYn#S$#zj(X}>{mN%Mqxqd(JE9VK0hKdUHn9#T4?vcsq=MRR7>G>hnwl-24MvC6D zf+Ej#fsWBQs;ksKIj>e#&V6ID$vaP*_A8`fE)$NsA4!lt9+2vWtMO$S%F90f7RLlT~APXdn8Bmb+1X8ELAPIB{Z-K-(CKU740ErI7hR$>Cq`$Ea*VBX)^`?aR;%QLMoLOoseeE~)VF_9Ai-xh zybh>FL+K0StAQIyw7+l#Li28O9LMFZ`^41!X$@`gIEKlh`bOHa8(^9bOl54xLxpDr zqWfmQt&0fE&IiSph$YP0zj6+9+`g1I2$92X>xGBl?mPj+rEiqQ~;= z>e%Dz%fA_r6z3xQ|F`@}llyWCJHyU7M60YvjUUg|3|5z=6sN9&1%!^=^6qGdxG_Cw zvfRB6e{c9lB%q1(3-`pb1IByTa64OBKgu>jv&`5cC+{eB#|6TQKP-PYc)%RpN!R)t z%KkHs`C)8_zHw4&wmPPr^WH8m@@);Dib+X@gc|#kw(r{}z`><`6a8#~v-H@d=XTrQ z2LC@H=-b_kJaf+ftKWIWQe|nQacGM^`|3Z^pt}q;bM%u|)vU18`>z`KKesz$>q`3A zV*fp`(~(kM|ZT`q{L-T}_n2sa_Svq2-rjsye(I=s*mb|) zZ&fTapy@3&l~tGK;^Lp;e`QXnc&aTjR${-bMxN#kHTwn$qejuITQT=OBzMAi66n+< z*}CciYX)(*+)XUZL$dyp*|#_N^A=T6g`@HC*%x_*NUjKrIc=Ts@g-4*^N!kwsaH>8 zgb4hhrSlj3D^FFG)siIpbx0Xk zUpSVn0*-Q9%dVRRGus+hpF1LPB6><)BW}h{u_up?kqpmSHo5!5StIA)+`Kf&W0T}h zT4a*)8U2F(X4uEm>d!ts|>o*3tMNJOpW+^G?fCpmQ3>iOV4647Hi*nkpA z=!!`n;q10+wHx>9Y9hNO)W@+s2~wdms=!d+K@}gys_H^##mQOYYP!{hv((_iKlxl2 z;LqRiDMWE6m`JnQLl3{xLIL-m3GiG!xK!N65@P@>_qHxT{AgbY3u?zm}e5n)5 zEiKL(zQa~^53aVK;0-3QqcArg4J?iShy|uNKX-a$8MnYa^q%N*PwlaJt+#gQ_ZJ8ziWx%&;F2R)yajmWV7AJ zSGTgW3zD&Go{Eh=2{ruFBGi{sv!kIYD!Ej9ZE;u_`9a!Cq@QDM)4{?vV*`7)C=olh z?hvw!bn*A?F9W}9y3e_$B>SJn$ZyBv|9dJn)55|1EoznB{CDZ$K63@*P$x9DwHG(F zL<51I7lc?))u7R)%Lfcq4V;B_HQ^06XbNMUm!`%+&AIU3{0#4!1vb|YLL)K>2455j zecaiu(9G)^v6A3|o9-Sqc6WjxfpiB4k_)U*0otF&j#{lf&)!XQrp1e4CAoMMdRkAd zZD+TF1XdwYIccL64k&=P?TWBm=uz(SMX|P4p2(T$?bPr5uEapng3AlMV;zQ)IPzF6 z5d(Uz;rEo?|Kje~yIg-`{D(!xzMn@nEmdV+ z-_e16mw{x4Yy`V4RxjS^CD$paA8N`71u-Yty!_kfN{SK(;pv0QE3OXa7T+)Yj zrI3k$cup}cHfTi0LR`f$k<(WFOx%WkbcTLI)31=i0U&X^Dk4xFs17w=YI2T5+wm^biTlvaV0hIv5JMX3q z<2liK)-{we1H`Las{SEVGEY1~;^B!y``k7tK93QZV7d1m=KX9wE*`A0cXAPxXY#$b z1YryFc&ga!Lh^(fvstqpfl>P{orp$OBf#TUG$L@q2SDjgazq@;H-`-i4c$U%_Wr*Vm$ddx=lw5&C3g zL8M^tOq&UikU0^{aSV?rMAn1@aW=>*0uAKzT_2mmU6y~C$-x84>1~~iN3Rf$YS612 zRY~WlT>YrUrJOG{hPW0~bX6qm^dOes@-M-qF|bhu4)oFvO`fI9a<*s zj^@=N$|-ax{7A9%EX8W8%~@L@V763F-d2X{nX`-w;+m>QCc!w>Oz9YhcQ#atrN$$o zc+gwiKfvL)K4x6OVfjEca*Jf?7Fwh>ybz`!{jH)qVQ){GI)zj9kIyeNf;i^nKZ!Ii zGe5go(U%yn_A4B7^j6>9eplh~3V##emH<97+`bEb1X{xwZEACynMnYdSK3WqC}Eq& z#!(Rwp{`i7Z@+4o*5u?HeQP3qU{i{nLGTmaGdE$H?jEeZbL!oJt~XnQ8@0Bz{J#M~ zkDA^-X=~TX=6b%bl;3klK8mIbgp`a}{y-t)3vA9sEk0KMtKM5fVRhD>ofV)uS;$T@qX8OUoQ!R225@d^TudF&9J)inE^&i^+WB-Fd0JU2p^!fvVe66NL``?_)5 z(u!!IlOxnj&9ajNpf+;{3T+_JNS(9*2D zk94W+TQQ(#IPv1sH7Tl)kQVUEQ3>)MTN~Uy!QV<&akTjzNIUxgj@*y9?Hn74YhQ8T z=S++u^%w;!x?r4x+h7X|vIeg3{2s#ch|b?>SYq$^fi3Z`7H&@H%|Br;yE?$d?#RYB z`Ql?~D@iG8YY)nH+9uh3P*jA_SAT)hB%v{kw`yQ`iH6&y@x)c$hgX8=ZFu?cTgzi| z3pr`2Ig=ca@}EEZ-miS;`bU8K-Q~k7cAm+g;>QQChvl(Qg@JK0#! z=tF?IJT$6PV?xf~74w$GH{rQ~19T_>_sC(0XuB| zjr=Txa>Y-}-x_PRvMTXdwOyvimhDVhuy=?yzPKnCW1Xi(?Xa;t)^0ZTPh8WWE&P!D zNadz<|In^*ZA~-FXJ0@u<(}=Z09BBC5q`+fWZb=EqFNo6dQQ>p@Pd#V@**)Is3m(- zZZe|x>=xnS?c7$3{W7uXd9>gy39bk%T$;^_2e)Q44qXsed-z4z6Ii7q17`P+lo-3W468zBX zT>QhoQbs=C9#=a81<)6aZ`acELbfh_D`;k8s<1!n#9V-GUG6UlQk0rg3pJIfyF}4R z48(@7?dEP4YFn$c1}xB*1_c8ZTAx;a+-%?cJ**B5amWtRTfc3++m{GdrHuJ6pj!i?CZi$7xf8||Pbv#jG5w4ryhdpCj5lJ@vES~Q2T z5QzerNB3M#Q|M$`<{?Jdj}1HuTFL2&>BmH(uyFXK=g_o zt#jHSX=X+ardq!V%qlX1{bsmH{ry==gyqO-#&)Ai$!V7_Fwp@Fvw5Q{G@LY+Oo z@KSEXTdCzGck~%E_%!w|qP$v~&t8&O&qwl>~n5ncJadRyDo$!ql z!VG|aeXvG`_Yu{0nYPuG;5W;u46JYvAxWf}d)oK${bM_P;ghvifH8wlc$lMnJ3fd<-U_KAq z=74^qw^3w$TGwZ0*^9|jhw^NBN6E{RWurB-?izoCbA#Rx==))Y?-97ukbFNs7cXE4 z%p__fyuVMKUUHg?w(t}j>EnSZxhad>$dEyugAy-wAY79Uuz@16i zZ-{Sx{%H7=hgdow*Zdr8te^O>hg!71zn|Y&o(6(6I1NFnd0pP9`R3|^bU755i_W-a zo=vBjLgwj8JADkeRjmKeID~`}9suSi%RP44S$}y<*?3sk$zLC5fwp=Kw#XuVqiso2 zJ0){hdm=zbgkZ%p3bG3gW%5$8hhGWccvFXoYZhcc!F&V0c3$?mPP=WhJbl^wO3NlY!RSW@sY@v}V%kFPS6 zi3MO@9fREY!_o~`OO+=N1@bS!u*U6lmt?ItfW`7@@kH-RUsx2TV=vGiHedzFo2#u6eR2*e&R#g(c%B z^jXfK!)0bOWKq5BG0Q5xpaCpzMQ|}nqF&@K)_lmzjcU%3j&J;b;d=;~MqpjdDap zKFsm^SK_6mv7I~HN9h;P5umJjw}4CEd7d~jYLw$d9Qyn0CvXYE`#~#H(j^93b?Ec~ zF;yauDk*CT@goI8msNCU1z$)YB*vMQI&9=4Qj)L>h1@TueJ0^9_*D|}{E3vcV!0HC z$dZEx2lc4Wc^T5iMxyU60J5!8BjzQg=z|x&(IhfdZF#8`quwr)So7_VUm;jXbW=oq zb2i9291GDWaq1pVP06`jvQJV`rZ2vZ`p48x$CO5lE$RJovTNGQ?>Y$Xi*o;&bv-^k z&4(PlUWf@dPZJ+TpN5V({uSFF?stA`;VT%YL}1~z;ZPFW}4ecsXE;M9beT2VT zmnKC`3K-7Z>$X1aoJ`ZzGcB5waMnco%p_a(MpGqqP!Kbq4%t*4C_2qAtq&+`3bbFP zxS*@X$8t4e))NXu7!oeo?AV%D@;6md{K(Y{?Z@8}foAyi;WN0iadLFaXep&AiT&ub zhDVkpsD5WHl*kT)g+di;RT4}P><$va0%%p}Jw7I6-)0mpS=QV0k zmy7PPA^1N239%ZmDQ!6N`K`I@&=(w(UZ<+%3QMIKul_gUjHYBjAbT62)oedNSRiyo zG5sw9ctdXxtN#&&_-KE@8@;li2(gZK=hR<7G&+D|6Ez{_@X&1ERAFG0r`hEiwd{o+ zYZ4yjq{i4y!)dx;$6%?hn%Vc@Cab31pm(8?4O}T>@$jbS%cLmAKzRekl z=yya(5M}vWBe$V8`HkMJ%@<-VW^T?LS)Pc~s9zg*sL41pT&2n3YwRQu|(dK@=DwLZRs zaA>4_j<(WWb1GY$N|@19Q%M;PNa2i=6W}Cs?~BR&VeNyQO0zLfrY7%d#FAM*PiU~x zzKb9g?!Jd^G&HFtzGep|H(B)b#nBRN1YpZ)daWO^r%{=KLp`_(+E@ddp6K)FhEeM1 zgu+rM)iqani-s1BI(`cjYK-f@a110O4ZoRcaE%g+ZM#Xf5RL1l4~=HKO&Hw0Lm$O@ zfawiZRQehFXmSLNaYHR1WYpO|7H@wnHZ-U)R=g`1| zxDvXBLl9|8*GnPu@1A8Nm%4_CieH?D-jH{{c0rn6Bz9CEPT?b~yE%WB#P;MP@(3$O_*_J*IfRTAUNo~XY! z#%J9(lta^%MoOb4W$`r(4KuZaa@T!txzT~?vEya$$@EENcn5-q)ph^}-W3|O1k3>^ zIR16by`uuWH5s|IvH1Nz5*cMwEU#BWO?`->x>e~w_YW~n=xU(B0n<+r$##J+gI+76 zecL-vZl}72j5EOos=v-$G+ZVoX|Nrwrp+KGH-J{BVw&qWFzenwg0s$JC`)WB5rzMK zo}rInh2n5Fr{?C;BS%qDMSfXH+R4c!3Zh$WpKl!vb2znX%*k2-ywTPQjnUeTmGC-r z5<+t2KAGen>Z7?j24HC&4o>#Z^Eak8YgL#~E816qWB0fJiY5!fww$>`7K8FSi1=)l z?AKfwi&qgsJ8gY(B*ETsh{aM~r zmRiq|gRzdnfhYMZma3tBf;RBUnfu@`^(JeK$TNl#REuNk8jGhOL2c3|RH_F*k~yNQ zdm7tagD_+v{p`m5-`K(@l6uVBwXfv9nN^b)S=+T{w&9;zhWPC}AB4NYkNLb$@P5X>DOGun`w~#k*H=q{$hx0D zX3Ksn;!C4sL=Xy|#Lup}U&th+do4+O$$GC#G$cXl2?LXU*`EQ^?@pTGVDo5V`P7Bh zk-CaTDmYI{W+%>w*Iby=@mx^Q@?#6|$o+bDr(=*2zwmhxbtL@b%S{(O}g_C*)>!2UOE99v2Zi#WoiUnoP|JL0qOkM^J@9pk*pn6N6F zvcuB(>)yuJ3ujb-D7vn#%Wvk6Q3@8&;I0h+Rm?TCTRNaZy5(^%Ox~@!M_CD;2>K-< z2ZOgM#SEs>zoXQ#)yWcFQ&|I$MkZ9R^SA(5G9js1wHC-r`YR%=43gSjnBA*PWe$Pg`%`Ky|YH-Irs=OzZN3=+DSrp~41ZK5$EL{r_h@t4@MfFXj2?Sn zrpl~7{6yZ0%!>s=*rB+9$(gltr4Xkk?%6_)t#?c5-FgW5paDqdD|pmSbJp?A&V;J3 zQ-v4Uyg{-P6yi(*J-pz%zE>ZoI*4iz_P*Ydxq6x9bF^FRS031!pa@%hpkj{3I|*z! zStctMzM?u0K~v7GOI7dw%W53ichgEP-;vHi}ErW6EqHSO3@aW?7 z%5>_?tJp(hzZ3Xd_37)2mQ9SpUF`C0)J$+!-Qx-c%@3c^JcFK&8q+iHU&#&9v%oN@ z;v&uNu|!~OJa?5|yyo%go~57fmfNl_I@%@t>5qr}_G(eAl4d1<_EX<&=&DO4wSMH~1zdqmF4t5atI0frLwmDeX~mXRdWo@? zzWzVWlu&j8g1cjC*r18Mo>4Hk|M)fN3m${(pH~`1#$m!uu(YlIbOGl`OT|37uqm;# z@A85%2x9iTow;f2?YrVy0nw^>25@^=QAe7wGYx3_vl3%Axt(wiQ=HRV&Q_%?f9VBbKXjh+UKGi4!=FiDpi?_LHA`OtF z$fv?f5j@2cpI4!0tDSI=Mc6ceDkluRka}Z-hw+I_%4U^ZZ=7%PVEbk6w$GDBl z@+vSB)jF6cifO+(voH_-Nn1dyAiYtYyt?(6eG4lU&SsWd@e;}j5Z!(7wgDV|(Vfk? zU%X~uv#w;Il$@3?mxTO=yGAC#YN0dy7Lb?iz30{lQ&v;3kR!^20IE3VLB^DXOf<2RHm? zrVvViBR7OeJ4buufP@x2FWhuX(J!_`0$WRWzsHn3qU(XPxRbTY`=bIN2YU&#@Z77E?|~dJLfg z{MbB)U-_RUwddsSD^UOZ87u%RZEDYG5Sp5r|NE}SN018K(vZuZ6<>G|CxA_z!pg65 zlSu!uNN=~qC_1ym4b|vzazEg-bnK7Z6ForqT_4oUS$0yXJq}$0+$oGLQ!g!e-y~WkE_q_V8mmz`m1S^j~;KJ&v z+LxK>X#d@oh?+pkzl>!T1+fS#I4tcufAceV>|L$Ph0H%~l5&$VVYqm5qd0l)t@p=- zNZY|htO1w&L%3x{XCr$ranFb4{YOf;OZaV?#_lhmVOBFTHaL%#q^6hWq{MXwl`Q?h z%Uwg#PHaWRxdSG2N_3O~Iu0zA&_yj0 zx}!gQy(dUlBPybs6Z=JdV?VcH&ZMw#Ao_>foVJy9CcW&A<=(Wg$)W#>BY2rGEoGDI z*#qN-L=6<2!(l@=+ff{a9c4MR#sFkvPt~&w=Z(=B_HlLkf0%m9pg6j)Tl+~!Lh#@Y z!QI^x+}(X}ch}(V?(Xgm!3Kvg_+Y_(kiqpM@AuX@r~hZ}-lbvDW(4+GKjQYUlM@szKc%LGso`$3e5I3*S69}=MHY-VT(R48-T(ug_iNfohr z#RMzEX*x;eb8WxJgnk*0T`Us$Q_kx8&-r#=ULZ|E9ZVc3fl#)A!AOTWt6Q75@FxS` z99W^3TzlH&`;O0S!d-EySo4WWRqKKUfd^#;f(E_aamMRBe_M_HYs#m%yw~;kx#Yra=m78y)u4@{#rVd zHJ1I~rF2QEat%@b=6`t5#AVmNpQJu#5G-fP&Lw=*#^XI=aWgqhrm4#pru`}B(dG2}s3P$QFtU}nzrPgC=Wq)x2YjEY(iieW-)v@(w zG3dJ`lt<6@#kX(+{jp}9f9&GB(6cNkB4TymJ&v5FJk{zXX?smhOdBAOn#= zz{?qXz}e<)JSD}*vMQU#MuLLA=?j@cqhM=*vn#oV>Dy4H1d-_(s-;cH2gnDoegK*s z`g{H+k}kfLw7VRA-Sdt$sz>j0hDyoa{Xzw&_-+o9=#_ZT8nCBA&}_PTY2x2eh3BT1$Moz;;?E#x&zS!o$^eGz=_Zk9vj%?bU z(7Jp?f<7wJ`(uzd8$K`{g$pff_@nct$`q3n?$dgeH8Vb(*5DO!&p@CMoDg8)I{$U2 zHMx-youDS!MU9ZEpfy0;(Z^Sr;K{g=+G1&NaVl(!yWr?qE0|`fIaDvs1aO!r%IN=bzrs86KztULO(6 zqfLur9^#{c|7Cs1=8KdRbcly(7~!d>OArNo!|&=~yK;AfuTgac{N)biX-ai^dbAFA zVPCpV2eL*1sG|Ky2dte7m~=Qw3Ky$My(Ta`9aB6gcrik=Uhos;#22=+?bjPQ8j zX-wq|m^K~MTX~W90;k@A;yCc{1nXM8!6uZAF){?7*)f69tt&JoD++k(N^DcVA(z^Y z7v$WICvm$hoLF{ES-jNj3=LW7I+oagFRJ?^NgkndzY(pAm??Q~l@lqM!bzL~SCP`o zjm{{r!`?jPSq&0mBK<#m1=Xd)BJi8A8Mi~}4w`&`9+YD3Mcno?f5eS~ry7NNgxM=< zF0WAxMZ>xLV%^elu2q&6MN=xVOJdkQ00KUBrh~l2cREw1A(|kWAwK()iQ@$g#|g}| zCX;B~NOYZt>-s;Zeg%1gexitXRDY(BttZr7bauj}rb_D<{_A7e(c}jr*gNaZ_Z<(E zHeZ-{G^?j!&lqhT8Wy;%vscnC;~U776>!*<4w#K@&L~}0qI`{^U+qX?psKW-Ya5{Z zo<0ijyYJ96EUWU4C7L!@R#Q{(0x%Hn3r1&m24~gj|Bh@>isrl_v045qj)H;;CJ-&J zLlQrB8)r?LZpts>DjJbB?2l#<)zLwe%Ic~9azRK@tCnvUxWmd>qZ=UQ4lL0%|Ow17q>`x~JpNg}n zFN>;!nU7$t97y~82`_!~VQ}Orw>xcDUXYG6x7;p!hN^W!*n>TL26KC93I+(HX1Z#ETCzevZc0qi zsJ&1ik{HiS8urk=fdn?f(@4wP8&c9p^t(AexkC39Czrs*r=H^`t`T|GtHu;rw*XK& zn(WA96sOI{Gkr40vdAFf7F4e$Ax;>9@=QLC+#`rOX3Rp!=?c7Yar-_$vYQ9%dm>bj z7*H0uxtQg^n3izqo7D>0^wa0f;!KwF@sdwk%?WqVC5*>9lg_FSzGt+miRTq{NkDPT zjaGlDStfYF3||Ve@`_(h>pi z%6izBTCKPTD!|t=g3cNBF3$&0gI)%fM!pPEGHnwjKp^9vHttDaqAFxM`ZuFf0|mPE zj=0+WS4b9#e|Z}9^+p!)UjRPR0v*?Rpk;BhC+|>!hQw)@5ZvVgWR+~s8g)Y>4!C|{ z0+x?kjqrMXxT1=idYYJJV;deC_=2s0B3vYnu(dg8&JtAVc$^{qkPipSk9-K|p+(S@ zjc%xS9iHI|KT3kBcy>Xte76k~k^3wrVx5P4HJa1CT_-x@{t3NEmu0?bc(pMXyKe?0 z8mH$aFuVTL@wRF*b&EUMoj76(uXR7>XZxFGU$8GmF=BO-e`46+?dc-nq>z5D zIlWlOZiZqiL>C?JJl$_EWeS;oj(g&|oY%UN`X|gbIy{9GRClJ90|IbpQt--h`_lLp zT#+!6)vWFwjSmk`3rkvJHa4JbGV-%>67EfsGHjJVaXj8m#RV+KQx96H4vJlM_d+tf zl^2SRA*zyuc=vrTKi36U_BKux8br|$eWn|pm0}a@gwzy~gvzASX*;h@?Xj7u@02V_ z#q)@0iL8=!8neRqdObPwRh^dTp7RBjCEQF&=(rt)3Hl0hzHBu$H7++5mbEmLECN}R zPO~1^mNmAg#U%wPsj=FuM!}bv*&;^Lv<(@1L4z(6SCW%hN7$jw`x=@*q?L(G1+4J2 zy~NfHMEv9_CE^JG8oJd;9{gg)$h1^$QPfxxmar%8A#}yS+Ko@mkO0I;%E%zJgzyZN z>?&%mM;A7wly=i^D?5+YC|ZX8X(?BAY2}y$txK58e5QKW2ai`4NX<%#=n>k&Q#>Af zp}hmY2Leya`fL2$vUgn6EKZ=3CeoPYWp<~`)tQHaYjU78A>PD9gaTusbYlhY6OM(w z#DbdqPbpLi2KaeBLJTw0cwKVe7XF<6f9AN50r0x)+j<0sRg{ID!FMymZnlF65?WyMml*4K3YxfshLEs zFndVr)Ymr-^-aT?vqiX^n(=8r-HI5$d?_I(kfG2hphIj^jV)dJF6$3MpBuvw45{i) z!ANZ`U~KD;Y&li$@+SI;!J=DZFL!rL5`PT)z z%;KCdzi5*{MMMR0z6Jw3{2)7Zz%fB6WC0}LQsCn9-9Z%R*0rJg#x%Md7B-F$eu~z2 zfHH;xO=$^B!xHP$F}9aMl@LYsyC1Z`ERg!(3E zV{vC!Xsnx(zD(93j!;k)J$N~9HMS@RdC&3b!D&?vZDbV)ysl7I!O&VbjcZ|D zNX`%!xac+&c{WA)Qx@+mNNO6j^-NG6$dnTE0a;&ZGK&SC$(2^8m5{=o+PBu^b+a(Y zdsHh+6YV`JrnsvtO+dn^ndCqsQwQ=tAa)S5ztz6-}4R72g7v58-=AuGh-laJK)szYqWUxAzX`pV4@eH?kt2)y< z%7u^7%a2($Q$(RSYh1K9+?L$s*d@l8d8;O4@|@rIO_meVk!HzBRfkFf@~VA~_*-Mk z)UYf!Gz`JIjgd}fprEF(v_*VRni0k1lVc%Sb$Nfu`xvZ$=cf4{K7tt-QW560N_qtcqFIIWyY^kbAu*c(e?P(!*ljsgNFB5XD2kBK& zgA9%>xc-fNktmq=WH#PF+%|33Y3@sx#}?rHcRQvA>kN4om(bckoD?=2h8hlFBSE*p z3s;5y%H!N%vtHm%6>^A6?RW%Le^H7J#v=ehe*na}rdZ%ilc@27>HBT(jj&fw_E7Su|4oCRh)JniJBzd&{Y z*7y7hJkH&`o$UROGF81jytA~fB{wiqMZ2(!eQ0`$5LOJ9qGJ!cR)Ik860f}Mwyto> zOn8J~>W{Tuer2uJ&UGSlYjgj?LedslQ3eOiujvtIhdH7z;5sfX0hD#pVH}SvYZ8u zJ=;5NkhHDd5#lwnoez*ZEr}4t->{)&;xS$DXturEe*L%BGAlNyq`uTf1u6z@)2liAL}9=rqKy3Yh&Acxgr zxiX$P{V1{{n?XCKM5b+oOKk#?t=b$_iXP$nib{itE}wXdk+p=q=WEcPcP*ZQ4}paF z5E>E44&{omDmP;AYJcV^dR@G<`S&o2J@gN~?e*tFR^0yHNu12Y*315Mtc~Z9qu36n z6`UfI%aNeFx#Z>qsumVB1>dCLxm_g;LXR_g`FW1&m|w=LCg$%{-z0Gm`?VW1H;CL6 zNq*z|4XCMs-TWmbigCrq3tL7(f^YBP0sH)&YNsV5tNE2U_dcl`%-vnJ?A3RmdR9~o zAc!0C59;Psox<3~dL4g1Dx;y1vcKkE{jS^#I*uf5glGCk-mlO81h`G(zU$5`(Jndz z3FHxn-@RT{3^oEuAt>d;`z@U0GwGt z$H?=~96-Us(-xJcqR(|-N;QJL1atoF-zmy^YT@qrx4$#|6wMq_lZ{dC`%=wZTnSk@ z{-N&&*Vo0={20eX9N!0}Me!an6;IU&k6gjC_be&Y37-i(r+3}cF3KZ~)N)3^NH8sC zP!(+d!OptpMECL4tLN0P8ichhrzaCAbFp{_;QcDvEZLB17_M*C!+H1Km3tAD!pfj4 znxt$`P^&q26E?#^?Zk6^xir8Yu*LL#fsL`LvTa;x_?pw~P2cbF-)@0xM%?})ty7T5 z0Az?{<}+6~`i{9rKA6xu6_BH>`*l20;FM6e4KNxkpBYO`VI#;Lypqop+!~g9e7`#B zQ3v05D}tSq>wGXX_Jnd!5{wz_X5qahr37MeLptaPgYLx<&+U8unC*Z&_;SUW8dL|OM>C;Z<1gl_x)~f?fu@Cq?p@HK#R*E^Z;plVEtYDOeAP_ zib?#ozqU1Zu(gmoxu4$817!@K7qRzX>2{%=lqi z$Bn#Zz(3yD9|JxlkY!MWT>x4=30pP?IXOQ_I(M&!T6CYz|1U=QuQ{8O?XHBF;U5IH zf=@DfICA*tneqn2NhMK|u=J$$z8i6@uZQ;}niPtyKv-l3_Qu=V^Y;_-`3YdSmnYYs zUCcZ;(}ZkZ##nr#<9j}FUhz@oyW3F26^QF9su=}8Fmees9B>^`GYJB@>g;yf-TtB1 z`*EU~e07br`c2%Sab0YWUS64)2!kJelv-L;w6&c3Lt6hY&}}ju^M3;w6Ag__Mq8rx zS$TK~j73D`G`-ESiS0I~Yl|*3^}YX>vi`Tjj{AQGeZLu)7-bp&4-mXVm~u=4Funqz z4_*ld>Oa-i<5T7SwW$Ahd%$e`Kk#@W3C|5HLL}UU%i!#yI65U#Khnk3_pbV2@sw`y ztpA_!{U4x;l<)d~r^`swb1WE1SNZk&>i777Y!g~-Mgyu{?Cnsg8E9^`YF%Z&`ViOf z5byW$Hzt1i8|n%|@M*^_U?-i+5@YAtR&j}|==e}Px5FVk{gKsH_$%_%6uZ0YToKZ% z_117Q%~tzKg@xT&p$<_$BN_C-=qS7{k9bhPcJ}C`pyO z?(~&!T-se z$1Lq^i%JU;nEi>PV-Pvy1@P$*@G^Bq85rjvH*csi{JtL}5Z#39`oe&VY&y4Ct;oT# z;ok?AKEoP+CUm9sYx+{3z_Yl64gK5b7`$4s;$&ihK!K#w7#mjC5gh`+N**am(wTeb z#SD~Pe!G5Z8VUYusjA><%;fuqDNiLqYR-7j8bZWQWtzA&4-A>Q-V6ZY?8G}z@(L?W z4X2moPU`sbu=QXztE(xkgXHS?*;=C~zcK$_9tt{~CHb^`tfaY6j3g8?6K)~?`2p?F zZ0tu+WUD@hFSy;{f@sV%Z3?hpp^=w+*8XjQ zADCrm+>TqLI!7k?Cx_=}j__jz@%_a7Kd&$T)9}6P{=bfki63rhZU2;*UH1^gqAx{1 z1*eHy55B@g_nE=izw7|c>>21y=85l00SAU*U2!i}= zebV`%c)6W-y!)|NbD=pyU(e$mZSGfJx^IT`_`UWpNTZvT%8IOifo9_pw)#as@mj(# z$r`9&hJ=KeND2Jl^}e6;wcK7=p4J_aQ4pL&SPC&RE~o3bf4xfYlG~}Z76+(ij3?Y; z`B@*oH5_Vzzjd3zDCh|&_37Xa5IF6=@6Ws`PUnoS|8s5 za}}F2bEi#_yQ^z(1-O2$!E`nT-{T=7%;RLXh5oJ;sH}nS%3FHd{`8rZbrRd0kInY) z1MWLvrKKmUu8-O=jP#bEKL=j|2Z7pcwNMf7K5zu2AHH%?v*E0UHh64^ii2Ac^!0z# zay}~?vG@rtZPq7`6-M-+L{?ef+C;(B>FWroFs%EFis#l74sTrVfcDv~ z0Y0|=@+E84e3&PT6uyg8N8*_T*JY@ib$R#0v0eM4?d`^H;lEYigF#VUUEUdNTtae6 z*-C1(pfv)Ux&bGG4jqErvSK<8;h4(Z#`IoODF9%`OTMEdp+HRLOh-U?>X_J z)5W&6%?|e zyx)$?xYG6C$ZCQuoSfXtE67Cl_AxOH%4>ToiiU<3kvTb%Z6!43P_A4A zLP9bu`D^3+cK8E;^Mwj6ZZ{vCij7Tm18d7SPs6aNBr-c>^>mt>Va$~D2y;_w0Lgd= zhkPt@JI{NLlvS{@2EW7+j<>h2XnR#rj)z@o`k_pY{E#!+(`tA(ktpoD##((_-*yO! zhX<6^6iSMpF6zG3A}HaYdSa(#X2tEUt-9@W+m}utf{~q~Z@_-o+5P+dO8FV{;dt93 zs;7e`^w8LXdU!QF?^aXEuUal;JK5_nOKay~_cuHjY&E@Y^Fb^2i1ZTspuAUU=yrxR z=sPpo%*Hetn}D7iS+C3ah)>RPz*{ohefw%oYTtWJXEY|0xENY*Yus*J!8^#k?%x+a z{Q9C6c{lR2TO$ZeyJ2pva=Gy}y7*4+Ftfe_5d;1b*`h_RTZmKq@em=0lN0kiRo$K9 zrKyb_C}{vILS|f`C7e`pCw~}4xgih2FZuJy_q{zR(Bh8qX!O0-{&nJ#6VF@8kUxxC z0Uzh#W?>CVG$KbP_kDwCL_|bNJ2onnpE4nt-saCvDkUmS z_=LuHmnGe{xE+Juagn;75%fCyz3_d_fQ~=BM?}@IH{Oa_3=QATA6I-L3O}OW*%x%= z)Z8HiN2`BhEr+F}i47NiyUD0X8AYf{!lf^uJJxcnW=tdqlTOebNBokn^8Xt@ngJK`|u8V>@e`;f879zV%=%zKARHe5!f1 zd2e-6-zGgm9FnW$pYvHDo@`rLW)Ak>qsz*>0W_slVjA;u%37`10OgEB^@YU7GvC(v z_NLuq%WdiRBKw7KO=Nmy@V58O_?-WD6?NyA=luPk1;IE(n4$Fgwm#*&42)(7STrT|PQ(8zw`+**j z6ubQy5zzAoz=>3=rL^5svtV3cfDNX!X+P5#?SaOHw9aDi6*==H#laBbKyehbJD#-VToK6KRXb<#0)KDxa~Yi{!!vHGWzfH`{kHgMdws^( z?ziV1%}mSAc2`%|=MHC~#5;ZQSn%mQy>Td#5fG{XFg6`Ko$1>i;lQV+vF^W!ZvEM<7mpLJGX;>9j1VqPHHf-s5#t`h*%j536(K|fg3A*^7 zVX2y2s|wP+dn+v8ra(-wbx*^qq)ChejeTq*6aDd61FQ?sl}sVhb^cRP9gDrJ4gp5X zJSMgZZSw4RQ`g~DH&NCd@(@1-44;MsEjm+z(RoOiKB_mC;PfRjF-u7jS8FKvycIVL zm+g%1R)TV18T(;BVIw#-t$>+jaB&0irSVg%e?#EszSF(p{b=!JP|Ide_uDOVwL-P= zbaP$ZHAALEgfL66tAxH7i#x*YoG=g115K#}c4A$ttl;qRCa+RA6=7ZgA)Nh5xaBlz zX&-N%J&N|_^5o?;JM|C1iKN4wo5!J9z3~Rxes#>C%jBmGpK|PeH`?n;gm#Au_kBj~ z0r^g5)8m~_Wi@;KJov)`*N#_+2WN5mzabai(OS!y1>?r|fH_UsKJSb)PRazuN+e+D zmO}4<&W;zlk@+v>|)p32Jh67*$rTb0_(Mtr# z^1{J%OjiR3Wes?qsD1&kp!>;@I$Y7W%EI@{8=$;A(!S>nwsxkEa=;w2JZZHOok-j^ z!+QGIQ7TPbpA_E6^yyexm)M*Xg-Fu! zh8AWMW`cd5_RBV@X*-kyGDSDR85a^8e<#A;1sz{+S{8Q2-^OH;uo|qFZEkxPFwdLM zqW$*i!hir)&M8rYP zzBFPti}!H2x*2J|Q#t57%w;$gdT&@}LMv+awU5PmCieagz~Z!N>sn2Q5qK4#>xTCi z#-Qw(W3gNo>4{RM81WgRoy+6)e-omMo{*+Vi#{>EoYX;+=nX-c5jYMsl|vHu;>Cb} z=>Uzxo307E+3F}9{ZdFr%YXT+s3PxnZSYA!n|`Q7@-5mv0v{kJEQ*Ev6QYT8Tu2>m zax|CMcrOfpl-Y#0HMU%qyWJAzJNE3zljqZw;0sRQXBhyyecG(^B**R7b#kb!Hart4*FCwe=CSN2XH|z`fgtm7QJraqlb?;eD8|+IclwM|bE2 zkqh;Ai4<=6WgSb@&23B%lhUQx>w{!nd$+k$G;?61`rS$F>Xo zE<6ywbciQ38}~Z4vZ|;FIdwL;tg|PTY$BX6)?;kiilXpgfYUo@y~exaKKIr&+h{VV z*O$&LK#GMaYl3p1t6zI%`b)j9!QIo%1g;U0RIiUf2}LLBJEw+aNVd7JObnz~!R*~? zHdL*SHvJ;)mOJS!%50}M3)m~Y3f_|tPuaw6uPEl5`ep03mnP90%$(Ghn4Q>Kvjx$! zc=R)lHYTm{kkBW{eR{?5=+erjgZz+kYh9%G0MBvV2uAJ0naX12<5UXnd$_)!D@%|%(tz<-z=RMYbgvb zMCQQG@NEq)h94pw{^&|7aQ+su1G=V5G|#6j)XMZVC^UYCa8*g!gkvA^+?wuqTOHL9 z>UZ1I5Z|PJ?7T=AJ)yI-eeSJ|SOr=r=e^idW(n1VI!Y@Hej_03iy&4Io8r~e7 zrxI5oZi#MdX_#SLm0sHp^Yq?RpVh#2j0jtKsK(ftY|n_|!FEi%ayIJnNO#`mo~`|= zZ)iT`rGBG&ZsFnZ!LjBR*=7F>V9VXNFK(QB5UfzUp)wwJ=VeK{|17??uQntW!JexL zobE$b@p~XYc!zKVMmkc!&cn{h#JWHN+sEE#na)M#j~7PWkDW$*?dj&Yzbo~;mmdQ6 zxjBgH91n*ot;0U}KOtpFi)4WAx&JNKXo?Hk;4E=%R{WD2;io1|-kUQ|k9VpleYQJC zp~|OiUyh<4bY=v`f@jH?Ijt_ntv=ET2|q<|J@_%smx(o9w%yoBVK}jNW1}D~mMAy( z9UxpYyWN>ZC&8D@eHG3=F2`nd@YEJCHj~@y|1MLxm8(6``FWU_>xWCFGVVmO3I>e?0=(*}@$kt{dggqUpr~MJ ztH`WAWGNP^<&LNSvf_XVD&ToV9ZY$~{rTOJZ}@pqy&%*)J5G;Ki=w)pA-TPuDO0gD zH8nxUKP99;^9DW5rplZy-(pjtoxu@6e)R%^h{K5<#qAJ@v48Xj%-{+-aTAvMOuCyV zjY(h&z|aMLaU1A>d}`A7NRLmLVNq+=kf=;fF3CMuV%jYB&x6Hzh1d_Jhs|}Fqp+eQ zaJ!U$%W4J4rkHs!xAxQ9-~cLBks11mJ8Wf|?*?b{e<37rBy%;QuEuyJO9c^1-rG_R zp5seze(s`%#{mkE!7EEbj2;dHje*g?)GYZp}H}{zx zCMUYPJAyf3zFbxojlNOTF?*~f`S?;ME%!uSo^d5}-tmw6LQ8mRdX4p>SpSj+jE?ScY5vC^NDx67Dl*)1_)EXS-9r(_Wg~NWYhcKklq?bCxCl zh5qe{Cd3K$9piZgH|NMHeNO*!ZKn8xIskNYGZ`Gs{-cgNV~#~@K2sZQcQ%xyWH?*M zH@imyZM3ecl=P%Kegby6@#GsUdNC(FFx1a2HCEt@wu6ZujAAsEyxN{be*f1w+)_*&3Li~f!kShetmsp89T=_Da0-M z0;&G{%OozNiH4%(w#bM#QiFvu64$_w;<05gJfAVTw!nAU<`l1&&c7-yY;@jLm3^q4;u|f;%740o1nv+{Mh)a$9Dni-|TCu83EQ*{W|;IKxcRT_o%=>E5zxSL)`kB zy%|O3x2({0?D?yX2^FCRBLng@DCsB*3VD8)S>-1tZ)XS+I|U!)ztshjkFz5c5#i*x ze8R9+gC-^r=9*&`*vEI2VeXs(|3=(z@;Tz?vKnQh^Pr%7_;i`hISsvc%cTz!<+aDI z-*ctW!pP~GcQPia%VRR&lTNaO(Gg#FqnPoiROE6$@GEybt*CxK4X535e`Zhw#xWnr ze;`Viqb2UG3SK_R`K+BJRQoeHEyrjo!G%@~`ge6t z&@23}l)YSjUy`7fH}=&el~6q;Yue<*b_csToG1~0d*Z0C%2C1i&To66N@$Cgw&ct_ z1zS2;>3N!`YC0?iHDZX!-bW!|N|kdGFSKqnEzeA_Kg*lrKn|Y0fZ2+{-mf8{Tv~2J z3VPQemsJ>B^j%#SnmoEh`Q?7u)$|RBbV|G}xm6NFpTRJ&$Y8Sb`EscbVU7YO_arD- zX3&L+U~7kL+g@dP#Ry;%Sr(PXneXbeI28pQQHRbgI)9C+NdU-&1Z1#@Y~mpG$%>Ek zFzAzQY{A%82Q=X3!sve+dHX4J-gK6En_5`l945 zkC0d<%k|1gF(HS&&@!%ktz8N1s>Me_Wghn)*rE~ZXO<@HBRZnlHRsbW9{08}TZ$!U zp341&sCf-C3%DccX zb*ZJ4R>(|!IN{_sB-6I1jWPgbqF)^%`F8-*j2;`}JvBa)+V+aPGt<8^Cih;(tldsc zXBxt-qrHN>UG`TTi@w^gejy72>f6c{snV8LR~NPyCm$c1VSMD1p%?DHU{^J=Fbr&J zL(vx(W?^XLW!ENrrop+4Wo#~=(N*Nxk1)9gy)Y9PoIDF2FrG$y>zGO*Zb-@&hG#*@BF_#!v z5h}rfV$>eEhPHtrP%Jo66wTP(sTG)G=LY-1o~d69~o{f1dt3$uz?0~B_zye-CO!~y5ADBH9<{i)C_bayh3>}Vhi&pG_xuZ z5~!CYaBxG_LgN+bQQ15Wp`;=bfg;xBjMHRnd}-U2+Ld&Xl4GM7I#^m_iGYH1gFap< zc|+n{SG02pN2Z=0>-PFf_Kwec8b~b*sJkgCh0JRCHZSdbxEWo6s&^$R6BHe~Y74SG zY;3^tAR${>igQ&xf{%f4?8?ez_Q48S%r3M=%iprZLIy(O1zX$KR=+4%i#YAHI#!G# zGbz~X+Fn;^Xm1~#Mpvc4(UQ#R$6ApG`1LP;-=MhBA;%KjWU>@9~*2y=90Uz}p%9 zLHA5^`sI%8Kh^1+kvv~sU$0TVHySh4WH}MnEx03K23cN_KIb3HEmO#=)z=Jf-g9># zn^RYT@U+@Z zq+va%;$E1dsi|lS7Osiksqi1$SBjBu zn{$$(sVLtzGC>QQUf9|q9%4q&IF;qyDUzjfvPRTM?X6@gYQ17!!TbVpiF#ifg)I7h z#LkZ9mC^rM;8thp<>D?uTO|dH&FZ($hiE`t#VP&Sy<5Tg2aM%YI{#m|8Z*c9kU*rZLFKErNegE_N4L08 zAHlXUn5~vF#iQtlxIlRf$jNWYB-FPSw-r4vzVg*OWCH(C=n{XPlO7ej4msGA*iS-q z)VNx^BhuME{EMt*Xiy&~Wc_R?3~@&W#q#`f=tEh(<%W{0?!>a8Qq~kwP*fMX$HlXDjb83 z?+yDkYA<)2&FZq;T`@<}D|&>~x8EB@ROPjnzHZu7?Oc}wyA&4lh;&t>PL4Dz^Z5!}xB6E+lk6j)3k-lYp8Sv_SwP8 z*5~*?(t6JvI9P|)W+ONS=oP`~M#betmCf<@LoR4hRd$+yhF)=MT(xa*%ieC<61GUD$P31>+i3RE8!a%=H8*;D&`JWEfw6OuI=zRY|HXm6@1f@ttGrl>gjG# zVIx}45{~)s?o>|WCC+PN&ge@4pL*&z(}M>Qn@I+Z86HVJ9!r|BQvsbAnLj_ovx1p_ zSLF^RJz1vPR)}3=P~XH{pl8f37uy&Y#wnW=*H$1g)Cgo^%7_Q7rY*D)|Br0No)>Y%dx>#4NJVA&B z;)`wP!oP9^J88XnH#gJ1!5SkDo&UDuOn=ZeG%1d%jqg~&)fzIzsx-ae(EsDgaqOi} znXC7xqg)bEQ;`VC64$k&94kSx9f_HjRzablN>U>&QOJZ*ogtAo_d_#5}BZ%FYI*wK*$+{6ORaZ$)8+i0x(R9O^e2H`by0KF{ z{KZlZ?(U|1vkR^L7&88!xnmDdJGem_n=K{Lt0X{?YyHxx{)bv>|AP#TFmlwb!dh3Q zZX?RP3f0C~jIAce9JP0Di!ae7amL`oEX7pURD=feiu#*^B^Z)+*UKSl zss!6KygCymhEJv;x!)$?Jp)xTxI5k?7INcmqb^)oGa9LO$gixRqCJYA#9|A}uk{wK*e^=f7sLpnVp< z%7W7LH~E|PqTjW>)okg0JEef|SqEsVmxs25eKSgM%UFL2*||4Cnq{__@i0f4uEoHS6&xi+;FN{DY#QAN+9SpT)s$Kywz&@ zjroYijDHbpT}^pruMSokB?KRt((GmoHL8e(IX^KgS5B?g1fuBOIuunyA*dPxDepE;tQ8j#6?&wtR~^5qFY&TXvZ?dK;eux1 zq{Nw|)%&l82u{F;l_}bIpn#oy z7*mR2I8SU4Ooh zJRZg8&&d>_K;ZU%Gs-1{iz6aZe`S93;TF9WN;%@`S1Q*9&%Wi> zmYFKqZ_yCM^3|4X!GWzImd?l5vJs?amkpL&m*uO;6d@E=;7%1&$?QD0vIHTPx|n4L zTC^E_6Xzo|PFGJ{#S4Tcu2R983 zuJEOC?UM*&jR|69ZMA=nNI#>s=5t`h7}^}J7*W|36b@3&TQ&mXfF!l_xD2NUS&vKK zqjK?7Z9Lv+@%q{0m^UWLaQn3K-{cVS(2pr*>X18_e5Y)vUd(+*ucNo1ePJ1cF6M{F z1dM)1w71pnId@*(Yx$>f`zz=QZSFA2X_ocfzf%N zo@nz{d=conwMa(8?y21(C5zAEOEK2jn3So-BCV>*>F;v~H*!aX39&~+7TX{9IA{$O z>I&Fnv)_GkQSnyN3n@W}=xf!u(Y7DEl3w#V42^1Q*5#a<*Tvt3)5J)hU1+0gWDCjS zT;cY;1AIbjQLpnQ3+UtOv9k~P;Buv4n#U>N4g+n8+Elky%HJDo3hm!g>fgGM8(kqZ z8U$i5jPUea@Uw`_XVa|7)k}E`nLm%r%q~X;Wpm^~kbU+Kt@rMcH|m6JH!eZ5c_DMy zAW&X+?M0ivmRtKd!d^QLsK=qYW;$4B$H?cqaQQ=o>#|#H>}qjME5VXweirZW?|h@uAQ59bvp=aN z7{M)b33%adC6yU*Z8J78P!_(g;bcK+@)6a|xh~Q?h7r8(p%;t{U{%lJJgB|2I-owcA~pP@DG5{3 zKmN}W<9dN$vXNQIQ)3r<9vNeWnuB`kmbToq;wByJN)pfA9Pd|l*_dgluV%7|H0wNDy)29(u<;Zf ze8{v}c9kk=wriUyll#o_DYhNsB<>i)Hma^Pu?bo>Eh|MYc8tXmaTVq02Nc8|o|Vvc zWN-?no6QRGkLH!twCBRnnF>@?C9#rK19IAh6@)MUQ-~%T6V=rrm>tJZ7Uz?GTBvb? zP^K$5v$bNv6@7)OQ^&fn{Z5drq6%Zo{Fu?8%5@wkP%|P2^1!a}2gdQs!c$;)H)7c)BkU|uwKsMXI((AV> zArP+}H_;bD=Ei>GW(o8G@3Wm)NA!!)Jh+RJ&fZfj&wPu8JsGJXs*3(_=G7;*og9!H z{(PdM06azN5>45}mgmRvFz<{ED6C9hld9Q^R$ieXws9g+Kq z@xbpMXuDdq9Y4z(v20E(3yfOfZ)e$l|EX?&LNgQkWT?DUk&=D}k1hS#ct%&L>a-CO zL+XMz!U#Gg(g#Cv@SZtqdt;MXUKp!=c1Q|zLiY-?Je&F2gTN{Sg?Fb;QCo37MdL0E zvujgkDV*?(O{PXORY4Zju^0C5KIfPoSn0%Lkx%d1;=98trzbybG;J#q6k(5haKk$w z!w<~duDDw^T1&w7n7LdF_N5HlZgI{2Cu>Y*G%fqRI_R3w!yVC@Iq|O(s&QN>+1wNf z&)%d&upy=q?Ejt9>qotQm_zUo++?Tu4}3YL{fZ_f#j$_mI31VeJ`2 ztXNO43k0w0=SF=!crqcQp)@XJ&x8}^_WD=YG{<)> zu%?FI7S{Ue-3I2w~>spt54vLpvpZi}-Jd+KuT+*j(PtJ2*|e`q4K6JzaC{98xd?=X(;UA7%AVkm9 z9V_jjm+*B@X|mNG0&DaU+oJgN)G9ZioOr|=_6V+<7t0c-cTAs-yjS^s$)EZ!L?L_U zip;;WUs*v5_3rmiUqws2PZr~a-%fkoI`r$5T}qWpIP1FS^Mj8w z1cqmCyZMKQ>+Y=wxVcY-hsOoIHS6{cy{baqw0hkAPmH{6_~4^&HB|QEQu9LWqW;|P z&m1p0$H3ts(a}z9ZZ*drFZw1>5O`W#{~i$&KQVk6pUIf0l3XAB`r`H3^mCt1G;i;2 zyX2z#^Y>T`5b;`F_RSN}iJkm+c(>>?{dDWgKGih6jFg~rs4D=y24=#@#f7)nYAu`& z)}dtHVokr3bdp|iKgxnT4y(*>`x!7Cy0ib&5gcGXL^szurSG>V+7C?R9p zBbr#?Uo;jSC6{GtY2n{*0m@T*yzvRsrG~ovvqs8(zis_b%+eKyxkQ8Fms+f8B)9rn zu^--#%}(1JY|%JLp?V`XCe9bfh_{l3@qVibbco5uOHRB=PVX`B>w_QKGgg=iq`MBI zs%H;vxiUbRvS|ESjP|>)VbJq=$IvJYagDn}32zpTNQgL#=^L}(vQsc81z8J{xSz(| zSALIXBSVd!D}7&Xvw`0qjM&)*-uGEeVpdMrPv8Me22+i8#bXuRrYHBEtjZ6($(e?$ zEhIM6)Xll|DHO}@wG?`NF9A<%<>~-O+oev5bKXdaYWSPKX>17DP`?c5k6BcBQ zNO^oQ*{j3kQ}0u?tol(#h|V~RO@V52ZOqC(iO=1U8aGMnkKZ*+r*8Zv)TYWt4D?Y@ zeC5$w-`2(Iv+9_UCymyl;uurHFvruu4}Q9xiJjl4=_YvwrvCSM=A<_6~GzLaZsCZCv3m(;p+7gi?3c_Gs?XBsVMW!mt0 zWQAIgr=uegv^onDDfB68;`HSNOs^c!gvw3O0JxHjL(t9_UcWF$tV<(e954FE^$bvi z@w#QeNh&x~Z_#Q8p+wu@!>j264|Zm3mVFfmolhhghdey>1|7&38Z)u^EnJy~_JCpL zYZIq~M&X1D4-6_XNm;#Nb$joR(>K6s3cJNs6(29de7PauSS=*;f`p+5=YGRSX=GK>k|dxMx*i5 zm46dO?9x-*sfe){xfSxggKOYexRxoJQ7k;`iUP2i)Ji)xBT zgW)3FEq3N&pFY%pAQcdWX7@9fdfk%vfNc`b=+<##IBt3jqkrq>3cpWi?b$2)u`GP~ z+&pEiFMQF}cb`x8(1Y2h7+lFH?-vNt0!Bzg-?>bte#;tDSt!j>C56+3pt@>~s z*JQiQ{K0@lPasi#VbFC`FdL&-c7Bv3C$fKilG%8CR!^hLy6b@jDUZ73Xsd$hl6AX7 zYkd;XI6YNZLDphn9DC)kdbu^weBnc2c)!KiW?}F#KgZt0IzjR^rXEYZ+p7Q*DY)k9 zZouHc7DG;)-=6CNJ7^U_Sa+SSiM191p+C~Z{~rk@0!D_&cJ$Bi3PWx0$1lR?-@fK zSV6O=UUq8=@St2DN?PQ&P#KFQFpSW~cYojX$5d)Wueu7P8&HKo-O$v$ z1pC2ECw-6)8OALE$Hr3l2_Y#_z=r07Ut#!K2Bya0s`Bi~uS|>*yS&Z3TLvmJ(7x@m zE7-xIv4vS!o;49a3c2Y#%zQn2Lj|}q=Wcr-5z|QJ zMK{!Iz76TdqK)*Hl;4894%uYXB%oF{%;xKDccUhOs2=IPp+U`m2L<{;6L2l*4UecWS@?Q@5%Xno9|)Ep2->YO@dk6vf5A4 zD;j)h11lJ0JhG8a9MZrUlucVM8DAB&wZPT`B_F=q$-DI#Udc&jLeiQ3<9T^DRUR5Vx=8m>e6N|5^S+_VM;-&PGcc zzx#feltCou#cn$Ng2Ev*QmE>GZXIYwkII#sS?lWBH}E$yVQ{1#*yk7DKF}jg`ob77 zW?MoV4m0wiqvGK_eUGX(Z<=WRuyUdw`d)<^C0|qTlA}EFA(HGE_#8ap32O}Y3umU6 zCF2*q#Lm8^+igT&GhEZnyp`JZPi-}sY*mG?wi!VQUQ&ro%m5lj3AtrOrzH2)Zb#90 zoSBuS3_qh|^w&mR;qOxVsZm|d5Me?$cA^ya@usstwn`}%{}Qy*g{yvlICDPL zKjGti(Ib8LBDTuU!V7lvI~`Y`Mx5NuF3VXiWcm53*!cX+HxA(z8A&kpPBDHaS?zUw zBS9&DrWiMV4z-iw&eWY@fjZb^5`^j}rZ-s2wFMDEbr&TJk81ek3e<>ADH zhmmGI_vO4pn>(St@S)Uf2erutV-`|; zjx3=yiCMkH?#|tpe@P5_r?^d?(Hk=g-b&|JC|R$0b4f-7soD}@&6(S8w{LR9M|XvP zt&7D>?S9*Vh!GlIhP}zgcS5w!H{u@7s1+2X$C_<@1l}k*9;;F{>N#He?#8`@NMJn0Rmu&4NiDESstlnRn!Y2N()EA7HC+@^Nx30{X@Ttn3$dU zSmTqa@jDeOS0{Bv-A7e4)u@aw5e$Er(+G6qeunIQgFxO`uyBT+iwrEmk{;%#HFSpS z!TOr#FuHKNt2$T9V+=G>{;~O4#!KrejY&H=I61kSsR~)@N0;*biw4}!{NZTVe#L+j ztMRLzHa;I5U6})}D_Ux2wnu#7GcW~Y0~fFIe}KD(B3AZ3`ZgZ$J$=~91r~?Uy27jN z@NW3E#yF{P_k0Q^bHbZ$vw2j6B%31w5R<&pb<7KQZ0nbG`nZdw{ZG$ciKNQMOk2w+ z^@OUwZO0!a(GVYe{Lo28Cdj7q^mjfuR!Lvtuyb&5MgCP@;D6yc6V75l zcW%#G5p0f2wM@L|zIO@#Br8%5>q}61L+ziqS|s{XD?(4%6;fCCUMcEn6>X|%WnUsB z8>U24)5E=zwlE+q(dGXn$WJhwN-JgJ#�a=U1R@p7P&@+5r?#r6tA1`ARKW-1)Av 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 a`i3CIr72IyZ=&!H(&VL;q$(tg1O6ZE#*Nzm literal 0 HcmV?d00001 diff --git a/public/markdown/images/recaptcha_set_up.webp b/public/markdown/images/recaptcha_set_up.webp new file mode 100644 index 0000000000000000000000000000000000000000..1a59f301b1e47490f1315e5234eb249d417d4d11 GIT binary patch literal 34838 zcmagE1DGYtvM9XTwrx+_w!5b_ZQHgvZQGnSrfu7{ZQK23pY!%T`@HY|-(Rb;Dl#%w zWJYADRxL$IF){d1063I4pDqAs_^&G{0{~!c zU*wD`5FZ#$o zG(6T;&VSAI*YVeiVU2B+mHylz|1?~HBR~-#4iNf}{I>Z30LKFW022EjoIx4@(DV}k zz+C+gjx-klKnMZ=8mIn)`;SiS^d0p7@c*OaKMmN#1OT`#1_0pH0RWU~003I^Ut@nR z{~v23{4<36XI-{`KBfRGfH8m&APKMm7y{`2KuiDz03(3y&khq31_JsJuu%xUSpoRuDka6o4yVn zOmAYMKI=YwAC=y8KW(3NwZE9Z;68Ht=<|JMK24`{_W0F0*FJpT`CsKOa_Vw`znnf7 z-o!tKX81?>zkeaUWPN1p!`#^Jey#cz`^JB1e>6RAt+{^iUw0j~Bh>%C{W|ca=<@vx z;FWrzc=|g3I`!T7a{d^7KDdjy$l3O_^d0bhdlA1SIPTi+s{Oq24SxgrWPNXXhj@~^ zCAj)(_kH^^eK38pecYtjGX28(e0$H?=U+y+wLK!(>uUAQ{EGYd`Z{`#>E~bZUHJ<9 z()@D#p!oW7=}P*t{Br#y_z?fxy7T?|0^*PJ<^1CO=zDkl_`~_@>&|=5_vrELjs2^5 z1L9%mi~eHi>&CT?n{a>>^H(5htU)}iqF}fLqr?Z)Mf? zkE+&UM(+v7=zM3W^Wg8F_CQfTeYkajjp?u>f(O1)sUw*3Ny}MB{ue`TZ~@w(H>vIs zBnyQlAxF?WcPx6-r~aH{|4!C2sblp*AFHlSZm>+V1~RvLrbE$%~ZP zeuG;xOaiGyP*H{*6LcC{7^l(Ej*56(c2ROO81dvyghJXy_=+ zqsf>&X&aJn4&yOVGfub|2I#o$P^UdlY#*@2%x{zM%meBY8G)5iY_|n-mS8~Mg|W=! zKj)3#SRDDM8esWs+|Sc%k9oglM-+Ip)6bceiePz%Vym61_}=uHc}JXT)J|Z=m9#>&t)k#YtJ6F$b#Fb*$DL}M z!uH(R8U3M6h=TY!Rtp8dE`OQ?{B8C8+J*ZK6;ta|fPu}ZqWD?`0pVjxNd~01gaA9s zCxDmtER#9K2j?s$ThGyc6Q2s2MClzutB6x7#}x$L_Fg-#YY-}_LJoIsB1(Ac zZ|wP+*iph&w24Iz1ZG|a<&kV+HCq+vMWNoIPZC3%LiR;Z7&rM`1F>K!YhZ%b(QtA; zKK5lf&0##K7a{YBAARi>e0|l`7h@!=a3sZ%j1mz9g_#6`=HRG~P#!Q+9+0x=YUDcg zDc3r!UVS8GFHSTzdM)14pX1usq7K-FD_EGu zG#afT*RUbced-r#So()7D!&)ND=s0?wr$lSYdh)8Xf}0a)1nz3C$Zp?W!xXO1ZX^R z@&b*7eeVd5F>l4ZtdaDbI!-@ms%721yh0f`3VcWV7_}tf1if&ZtNCBnRFB*u(&vg= zKC%KvhC<#ew~wss9R8 zaY9CVx(EA#>ZI*sRSSmxKLh+Oqa86H3*;aFqwIg>70oiX2aGK*Gt!xQzdUMYq$$Q+y~!7 z67%2LFC1yJb3Oap8X!X4+gr&MaR#Oa5{Dxg#e}vhR?f)4P9YRi9wpPD$@0Zc`1s#> z>fe5kQ^Q~8JG4)#B3P_|yd%h`M#E_*1=^COKS)nak3Y{I3CZ1$Zt$G9At@+CkjOz- zLjS7x?F?Kn;UBu_+pb8Hue}9@y0wXk(}~8gW#k3P8~=1$nGL=fhs`u``715|t(HJ0 zTLs)7=nQ@T$k@@e7Kl`K9>%^~!fdm(~bUwsx1@1nm{0QIH*7HJ~bwJu$w=o8h2TP}iYWd1Xr zR-h;ssefx(K9S>l8aR+O)~`e$_()6!y$jDz&b|1Q5B)e|BjkrX0Y_q+k1(HSYZycd+v4q14tHN8NR%M$co2<2;QhChrou54gXhhgI+ zqgQ@jqUlQh;xKgV)Y9OsC{6QZx2>cJn;r_uz@zQmjw_lbA?e8L#dxvgpZMN$)p>yx z*e$f$RN;Dx^)u369Vx$fJ=He){<-^;! zV{FL}%6eHDOqdeNJIn!(glh4?<7K-k zpa5!9etHvcdQvO$UGBdOoL~2kK`RVw)&&2f$isgAWnF@(7Lv;Yt~%>BlF95vj4V*u z;)E1XUW+o?p9vRaFI#}9gyM{;*sLdkHy`9z0uhC0-Xp^$P!LIC?>DYDsq%dJe-rlK zt|tlpP4wiy>Zt$n_P>+uf7$Y1HVi|xiZipps?7=?Z-PeCrgjO{HcGGXpTI=&FpdBI z-u#22(?xwDcAKBf77l1(OTgMpuNBFrrG>OJ!&-|FkG^Aj9W>(LrkR~AlxAyA%03`P zgq_2@p&hnoNhl*&WH8LC`pZ|5EHt^Sd)9(;y5^sY!#NVe{ErxaXNCVQ82+zRz@TeO z5?nnvnELD?%qFuw7NMW&jI!Ak4bw=1Xb=N}-+YJEV^D9I3xrAV1{nO^?@X}|bV4J<^@~azU z_#<&U+og}a?#!p(&S5YK*^f1#-vTu)xh_TCt#}*OWg>)D|0WX)E^~iCYtlbsNM7{< z)SBVjvxbTtuikx1e4`k@++$?4WUk>P+6qLa@Zudai>g>4O-b(9Xf3b8S{s1axW>a3 zXlcwB3YP{5V}&UAoR94R#M^43C9u7PpK+41m2>{1(pbG#_f~DJ^VP9 zQ=Kk(c+COhnJ+FBh)hF=rllD(l(pWFR_w7!O)WCeVEO?@19d6$voCOrS29}RaYYht z%siPnTRATj?CKQfw1F4Kc#d6H{SkXTvhoArx+*ZAU#s&w_%Omx6ZHipFTtjRI{ZLz z#m93e?Kk*cmz3XD6^(P^-eI)*DBREXcPdQsiZ&9FZgS$W8@z@)v8_LWwI2^pe}de? z)hpUi*m0yjSmN3i8(A)4#%Lq7=VNsbMv+rUcE2>okC6_HAV9A%7)2VjgS3J6As72I zI-=@{)MLZ$7GhQyPEMhCqe)P~2GxC{eyT%3{n#$L@Xh*dyjP@f!ojBwb%SQG<@O?! z#b)lhfl6u{S#y3q+NI*{bdG33#5GE73N0+o5iB{nab;zLKvmu=p`n%t0U37)wibPj zplYL9#RmC%wz>!gz7^7F*(iIq;10<>O)O3kAY%wzm-GO`tn$+Y^_IW;L$&AuNKLGT zC`er+zGuA&0S3_$2ngx7=?Gka*)l=y1TuDU&)6p%s>9Q5RrPFlN&;eVkBjt`M{da@ zjRsmk_J{TvZl`!D7tGk9>RFRFUFl_L?&iKwvdjdD+51S2r5SF(U)<;0(tbfy>RWD14(@jr;>n~Ak_KRTolg^HUXI|2lz3?kor;U*i5Nd|qEX7%lZ%~t_rD>JQB zr*3g?GG?1bpz+)gWT_~>xmTxh-BeRJng%O)Tkst;i^MbK$QLD;rKc=fk8~!&KZ76S zVd_kJlU4Y|Kke84mMQ47Ti@{4p5~jD)J}Ut1#nG+-fT5SXY6HA_=tW}?YU#;me+Mr z;$b>aR5n;s;@C~&&3xU;g7plD(hh#KsU|_@hmpe#{JU2?$d)%6R7@bk3)7zx>b!-c z9{ONLvJJfZgJ|0#idOP!7rS97#(BpS8VH8>?#bE6J{D)V!q8^BBB_9%XWYJ`AH$St zQHQl4n)kdG&Wg4}@p0cQZU#x&`N3|V@(1l`h80YmX{&2YfY_w;G#ngTvuvUAU@O`^@O@OnyGTY9#J#ditfsIrjr ziEthw7qoX%r0;Zq<5#gZ=;X!ag<+zhp@yJwd|d<_Xv2p28wp@C3cLuu1$Nq5fDeXC zaZ)p7+50=pZUr>6y#BD$u;DX#OUiZP(AIXmt;-i1b~KqOh9ICK!GEFJ)q1N5ttvbS zFySBlP`UPY17sD+#DdW@mStoUVofx|RtFk(F`#pL+~)ym=$pZW6cGv;qvyURXzQdR zn{dBf{|owtKnuhi9Lk|Ri7zH>ORus{hN{0~6z3=65BTo#B3*E&L_EqqPyPyxQHr>a`5c+VaREppxW15S{=AnbGQlK5xo1R= zBLQb*mpKs>UsUh2vMigzeOrYfxFTm~(k&uKiuc%4&i^q+^-P5Y%l9H?@opV6Z92bj ze4($cH?eV+L@kME=)kn+v#^j=;{&#Ku|N$?j&@4gBHN-xGW(X)KJ!XY)ZA`ox36^7 zZ9Ri?qyAD9BZjaL;t|l*W6l3=m#f;-(l)=4?1}PJa(`J5AfTqpKmA|MIOfr3Wqz%g zYX;#_7^$wqmI-8|#w4TYv85`E49^m3=i*kRb;;Kq4!OR*w_3?lNZr1ck_C8~G0>0T z>Fz6hdeN$oksUl~U=;iIOi+jZQ%H3X%gz{C!RD;bHgGDuqYA%u2@1G^lR%`kgr~&x z{9F3bEbM1jUL1$SX&_i0Q4rlnbnws^l7yN`TjZnx$urXvhMB$Gq3bP+7JN>=w-hwT z!@2Dk(?`|8T@sxes-Fyr3oXk(=5^R|=p8O|Txd`-WiFtM+J^@)?;(0$7+pC|oF#pS zjNq>|AorKP!ImVP)889B85gK|5oKSY z>}kK`{(0X3R{$kxtYDe%!}8jdON2|;%m(SzT@(SCLZY(Bk;*~RpN02uyuaDMB#ZC> zk-f6FhwD%~GEP|qIDeX1*9ME;zh~{xDE$d6Kdqs9!BmsYCVR}BLRVBExF zy|31xH$DJ5T`nrJz@vYwV!Hblsr$_k<+xbaCl)=*a5$mp{ep<;_dA$^UO-(5-at@O z`q-a$AEuWo*`>n=h1KTz$ei=zb^;!{Zr``HB(h z)PGR(l}u2~$~P&p-BzM)&mpuSJ@-*fFwSrzsRiZjOL@eHN-G*k*R zn&AyLU!s?^E8v-|XDh2vs9{q#a!kbk;)sZbg`E<^zm15qmp+UYU*BT!rjI|`b856e z@xedmCO1=SK;xT|9R!3faFJPbLtw_2Cn*p@iI%ecrqkZ~qyxiJZ=bSTQCr=~WyRia zXi3ltpBw2f_is%}2KScOF1Ou`MS@op<;ycx<`Z~1xA zjnPaTo7b*51XuvN9O>*sev6$a5)Gn9YMPB~GX%0@x&~sk*79o|y&jHQkm$SKV$Ok- z&VV*lgYTu(wI6_*mz?kfeyCmy8eAik>M>%i31!Oz2**%`A2^16= zED@I*15jJ8VP3c95w%AG@gim{x?4snpCu>TL3s+@GIU z(1Nn@92jE=iHN3+)l2!I)uLDI|IlJ#LeOrL{8Md(}p^&H-C`AdNALiv}yRe z;h~JW`~re!#1F1EeHowSksiosxrq3tIIUC8tPt07rF`fVy>w3!Gdd7L%4q2AD*c%EPo3e>`MM=iLuAW0x!ALTFJJmV_&>wVo!rx%K`Danm6 z0MIeyORU{DZDth)^n~O&lg`dF_-bNv^(5O4lfP?&}gA76lKAu{lDL6udm!OA8|PIvdI) zPc~sfn-{$J{%Hpcbm-ypL(JpiiZM7f>lzw8c>w-gM%DW=#Ke=3(a!mjs*WkkxjtMo zTAP!DOV*EJ2`IM^OxT&x?y^TE1nvS+T3-exFhL67Sg~lX2odo}%!LGB_ZtHsNP1vy zI(%NT(2CuvVwD`XwK37tF4cQ2pmM54l~mP|_dMa*VPgVI^fr1y*QZBslV2M5{kn$i zptM2CF)1)%CkU`{F9qLM)h1 zWjDa~^|yN7vuq#1WkK`xN6VhlhxhlHr%F;;AbPr%0n-qr)L`pHVX&XINy)Y*zbx}H zYu1;~%8abM?ijLmjEyjBA-K6beIA_7h!E-2Y^+?>nftZ8@sQ^`8~qsviU(SO)D!1` zUoHrK4)D5DFxE8Ps8d;?QDF3b&JQGjR)_)M!D$jijbr=yEWf$dfzXnAV!%d(Kvlw7 zsoLuZ)%RF1t9zrdrc`}7M5p>(cpn@(mM_H$kAkWRa+E1iqLJ(sG~f6f_lMIOv^jk) zD^K)r4;&2PNhjc7wrA}P6^68KA!OUXog-8D34>F8ys?RjNp(DC<{qZdm3V$4D-w9# zpK~kiIqx{a4IEX^H_``zZwFUl#5m?y0a^zX6Cmz8S<@mj;Sgzna+uIn@9g{_f5RS? zt}N2cR~e(G!8WcHBjWsd{}muAB@37OQ+hdOS~I6^DJ+!&I_m74f-b^N3p)=m>jf~zN^jRlptNcC5UaZQG!5lT z3tBiL=`&)R2KZ#=FW+mrv45Q*gDQt}v4!F>q}{u?IW&U$r0$YKU(ZlXHmVtpxt(gptytybf!I--ZP4yHzz~cm=TbnuERc{<|9i`x{jkeA5*J~Jacqs zNRm4ts4BP=9=Xx?U${SNiVzJaTjvE`I!Lj=lAo4JT2I{+N{ZImQ%E&ZJVak;c=h zh?=naLVJ=S=i()NDF{Ub@(0sO&H?GsH*MKN@+rGUb) z*>sK`4xk)&YF?oxm~m4)ZxYvCuOI3hYuto}vknDtcrekt0#`#2C24vuS6woxw_8D- z{6?Y60IF;ZoOPek(Vaxq67Y@r@UwlCFUgYmK3aSGS~14-Gos{=`4!Q$Ji9$~@ZG1&gT;XhG)2@Hp-MsV5!IZ8vo!wr$`aR*?}}1@Cg~X<8$)*oRZ%SGY(e z{+AT&bXK>6M3GQfsYGtg)e8;;4*o$c=*V^+4cpYi<#@_19W1-b#g5K+cTt8hka|H< z4=N|iVt5u@u0SAX1OV#dYQb(3cB81R@ST0B-EjAnKuQR|XIuuKLhEw5VxX868czgHx+1n;eWaXt$|Er&8y zYR>+a*kGJ~?Lo0K0*T_M%)Sp#4su?)n2fQI34T)x?s0%hVVLWNum(&nSc2RxPQ_I5 zo=m9ixF0tC)0CNwsb>akn1HZeEqzD98fVY#*S(`SYN+$R99G^|Bly+T_Y&{KAG_|q zT6}egpyZuX$jyJrr=!n3euQ^#$~+0;?Ob$DZqy3Z8^n+y*;1x{xq@@JL?$%cz+w!K z4I|PrTmoIybGzq5Xob7#T4w5;w<8LE*Qx?xs`Brs3@fCs#u`j!^+1fA=iIHYgB}|~ z?(RnJODl~9by1;04M$x30Lj4b=IL#Ta%1{WH3Pt zz-@8{|ivLqd zcnjuULV*i|u`2t;_;r;+S3b^M`9Eg5b^(d`RrezplXSM8q)~_!KRNsc)|hca%S<&)yrP^qqLoQVBGA6R)VJP7 z{xf`K(yOL&mK3J?Z^@mAtozQ>Xq#;fW8*`a3kB4diX|0-rbf@~P} z?~=N4q+NvNctk4KGpZ&qsa_NrC?k>MGdt4pXZp;BezGqzk3}Ip!x7JJPAu?m8N0v9 z#3Y6L7P-Ntzvz*&;Ev_+Z4@u_3XcP^SZ@u~Y3dQQWv%=S<5TI}lC-3AZc!zm@|ZIc zx3cW&RjaF11$i1cQ1BJB-JSa}Wh}+o4Oiu(1fp>NRF8JR|1c_e5A|$2x}Le}k(w7f z>vPO?Furl?p9UGmcea~?5W+WD{hOOl2cBIPZg74;Lv((~0aXjsEyO28txoBr(oxyj z;@GRPmG}t*`O7e%ijsWcydkF&zTD5d+=2$<<=V`k)Byzj+JxbJ3wz)c**DB|Oy}ZO zS{VjG&xV=e=PJ|~7Eg zIw9%2vj%3heQ2f{<(C?~GjVG(3eiTWDa_rFR zCQr4ct(DtJQMc|64P|#pA!y20D45R+I-jx^j#*LGzw*G^h!Q(XLvAEMLIz^;6=W9- z*hY)%AYiEvR!>k;u(#ndn11h^Zqg@m!)g@P7*b4x!UhN_N_}!goxM~ zz98Cg2@hn3)7lHSgzCe$)nV?7ry-B(Is6K&F@JI3Z5zmkMAmho7BTH7eI#SuJ{{)8 z{gpjP_{0rN_7X1e27QmAXFTDRMer191v2ptf=rp*lo-}*?`&ZF$|!M?q0+-s_1(osez%@x3i1q=(Klffp+mfR15P7c-BGNH#Ks4FU43)2Rv*dN-Uq zy=(33U(WTZY?Yn|4Mt+nmhJILtvY1#t`@cyGEq<{6CY;BfkB`894E!{=jkMi5WxtD zt@f_Xbi3}kmcdGR;_#i{$jhb(MSgqfD8Oi-!KVg3l2Ssn#;|sZu2OjjOD;u<;)Tcl z1M(5PGEfJ=C8e(=mh9VoE~vtHN19or8`mI~G{GG$^uD9yD1pBQe>{1B>C( zPRm%-W7ix0xB_bU^iSM;Gah|Am8X;F4wj1);it z3vjU6J}m387F5Q!Z&% zJ&Z<#&D&7&W#w+XSkt1nkW zzZ;)ZI?AzRIF3lkZCC?8$B%rC?HmgRDZYbQw|siNqq2*B^9{kI|3Q~SRfN=31`kUu zETO}i8U2{()?akPnzCjUN?)=xASY#)@Sn^k7Rij^TKgiJfYj|s1*SpbdqJD9Bc^0Z}a(l_jwxGP@aTjM0sEp(n2ifg{D2=ZM^Urui3Ypx~1Vk1*aGplQl(Ic+g@HG{EZeRTEa8lGLPsPBlN}*NmQ0b+s;C$ntA1+ zM`fd}D@d6{b$mRQlQzD-`?9XpDF{(@p5c;@{=MQ^l$UZ+Ddx`-IR365a=z69l3z)x zTIfAU4N^H}>yAo>+6e}YlUdxKOl1@dn9j467!V9b!UsJPXG~PzeRoNSxL8|hLO6~P zwSV4hDNC8w*cRueYDmE049s5Qd*REUeq*b!`jji^_Ht}{ok$5d=rGu z@ufC*t;Nk7w1b8A7eM0#8c0S~xk`eYX)TgFU%L+{l9n>d-xF{@{8ZJ}aX2V_5MdPC zFd&g2Cl&v0L30+p{ZNlt_KwUM8qVmmtcX@im%L&c`zB!M{ECsdLQM6%T4Kf)Ss^{U zUeCp3LJ3%jGeR$r#J3QLO>Co&8m!@QiR7kUZ)E6WPKS!_1+UA8vv%jxPi7?+4cokA!u5n^w(PFt?M0vYDalnDGBL&F2Tp zgNo#2WEtNNPXSVM+yws7!=PhWhX4;E{>tc{P<`(~>>ZJ%&ne$SJXH;RJb6XNV2}N& z7X*2m5*8ZL??oHc0@g5cqQk!KYraqqdS`fi`))#$4OtNin^<-bOSo9ap@`#ilw>LY z4OBeKXH~&mo=i#j<6K)8Fj^kSMAS-$bt1rg-l%=myES<&Ip6|%B+S8prq$qKbf~J- z6Lm^~&x;p6n{dA)zo#_<8~&><1;n(F&edrO)9vWk#hjS@M9Mz}?jyxfSh&O#1$UCP znFML`nUQ1y!+z`3tJM0u%ixmso0t!iS_dCCvw}=y#xL_|-9jf9;uMz>q|8q9Oxs{) ztr2prnqnXhYj(^iJu3!aA!c6C#C3)Q4vp`@fS@5bIV14-m<>Y}qDV8@TIsSlNSqUB zphR6tMvHKa(o-4;nJ6Zs7!vytTu&-w0ifgx#Wzrh%AR%UMOZ&A8T*Ya`!eQ*y&VqM z!BQ13YP+Jh=XWwUp`^o+3`O*W(x`3p4j$~j!A28O=oHA^*79C1m?uM>Pv?Az z0sNCRpaByh$hJNT7chhCB8nJ?5W!wR5({2RLKe2d)`(-RK+@>gla~;WL4w7MJLZ5P z851EVkOh%gc;YlwPI}Fh#V!#Q4g{(0pfBv(vqo46jFR_cmsniqDXNc1%Aa4gha4hO zpHIvTuFk^ZjeW?IaI-)#x`nV8aMT=-%jH<{aH)A!i13&WGQJ!aAIDgxBe53e` zY!5Li!}G)qr?~==i2Ppqi=T)$-&Xs#rnG1_v*akwSlLMX;)8Guo0c}Uj#nf-=TaZEReGNzL!z@_yu@M_Z7rwOBlYUG`Mn@eDYBU#ywmQhE9FE;;A)rZ{LQg(T9KdIy5yQe(%b0y(`TK03+a^`jN$ zZj6<>@D1N|M*9nWSC%$0?;2DcAcwh$ja^QLZEoX|eWtu)1lKbC55Z&cbljZ2JKvr; zQnPs}%|y1B>T2$=Kp4MoERg{5-58q)clNDe&){#tAl_+2G)<2T67m8;IVp*Xa`dD( zsuzKaGN+RsK5C{rbJ6lM`*|0SgL7|8L8l=ve!>vF4*S-{vq&Fgmy=qZy?(Fp;$h{D z%juJ8qUX#w-D}Txf0i?UgQ<)gMW{ycPqXKv1FB^KwE>3HZGCPGbwZhaSCEg6p*EZ5 zH_!JRnEDmESKDMj4G|5aks2LrOzt^X^!#(;{w&L}J_@4tDZ^NARWxA~c^UXK@xXFD z*`D1I;s{w6xm9!?fwP9BB~nn@O~LJngiW3!QPv!Dpa3|t#S`)SKCXgNUAFDmZ?G{K z8?ad=#@PFGF`Nw>J3IX&1L$$-me`|(@B0Y4>F<&x(dvDfN*kq6$PdBU`(_ly{;@eC z^s~sdJI5ACh-_uvf=~N?(v|OJZQ{9318=(wb=E}`g{alrJ-K5@Z9})F3Ig9MEzHbO zK)c>(d9K1K=m5Z^!WiZ>p*U(+Pa2je&V*J6xof%F%b(H(Ln0m34$uIB@@u0u?^sGt z`vb5K)3%sQo=A`aT56D&A<3-ICKme#WBhVsK6L!nROkAND^6l`TTxmTDAAcMs6%}x zs}EI*Of(1#3wNaXDrA@qAmc@n6@o2eRDs7cL%f~u>?hKpwmfQ3Cw$F_#tkKXwDd9l zMdza{@%yl^_q6N*^u18?FhES#0u!?ooQeI zi3R&l0PncAnd^!{gHyODBc=?3RniVx{pbt9xzDKs9WGy`Dbi9?>ECiEe?y_GO)Dhq zrZ_YOe^&_#8zJxyhXUTi<&FU`;8n5$6W5v1h_Houl1b3iR9lnIJxkG*Kp|Tg#%X!i zr6HHZ5h+!cf%AI+UE6{?o0AKdWN$z3q>#0qLu$`7|6YDp25M4S3s5){n>|EMpm?gT zNRqJnCHZ?`Ceb$VI3ua4CV#Gng@Cp9n3aI3>i!Jr-D|ZQgqv{Tew*AG$i-jW9qT)Z z6g2Ij&2#O2(WGtx!wXA{eYOg>?OsPz#LE3~r{pz01A;}ynxm+_9YSfC_>kK`y@u8xn&g z2kBHiOTAo-zMN?3jLS1Po_2uqjk1Qg9dDecZNW05;|y@d{EehaP~py{LWT z9JOs_vtSm6co4inB+SFX@JJ8;k$7E1$P;Fx+K5DNh=%r?JsrDx-t>}~$%*z@&k_p8 zh4e8@A0sB0E~<=%DzmicAAQu&tnWd^&`g5xl(^@8%oo7cnw^*p=r+`4lgrmOBM9h; z@`PbUx;p&n&JfqoH7PYrr$)DeueH2nEO-aW^VQi@6Ue38XD~Q;I8pm)A^9x4vrDv< zrDmU70U&Q&HP@R=UiJyi)Z!Qe@Y?xr?OPSb!AV;I{+b^RB0WbxRmb}?h58)6FiOm( zyI`a5%a}4)%euv+S-BF4R#_xg(F}b0(=j_y-Pt~V#{?^CEVLfoi_R}k%tz(>G8~fQ zMK*x8BH_bf9ccdEm6A2~kQ&&fm)4JzwGI88_J8floOEC|F^pt-=IlAs?HYd?*{b@~ z@P6hefs&-!=z4-t`Sm>r*`2}DDQdJX>}x#|F*OfE-n&X^<;oJJ?!@J#9h)L4v@x5H zUB@*l*K_}8_1a7Hj(S8z3`edj0t|DebOmbKV>Gii zA?bWK%bjkv^js)N{dI!4#yeKU6ZPK@Zvqx#pRcDH`>x*uG}h2i`Um8 zcZXGbO}|_%{UV!XeBWeU;b$|@n{+a;xOh#Eta6}>b1lD6k`g_uC9I}bJ^ZAr1-%NB z3m+{{|2$?2)bc$g#BJ1OsI|$7M<;y*5evCBV!Um>#7$zvr1VZrg<)wd)}IxoJjWPr zEMrC}gSahkKai*|Q5A{%i4amLP#uV*m}2OP?-QHcy*%z#7d4!Jc!#5H?seiC5(EmozKgt3>)adlcPsBN}h$D``hvxV8=zf_# z^86SeTfPt}yUd@2j7WGr{qVfeU3*327fT4{><4ByzrMM)1HV7(Dl?L#gfmxVY4?Fq za!=W3Hi)vUjeG#++`02Hu(YHfx6t)JS^7@V|L$h2Sg5JT@?9;)aZSORpE+LnDOivs zZ==kIe2Sv?bFQU88hQ4-5^F8(7b1*uWz|nfX1yIglMF7NADhk~@r}(t*2qn(O9x*y zgR$jP*(p}yt0izd5}eV+)-(7JwI2!`aW|)GI&f+-*i;!$+y@VJvU(dUfeP^V7@gb> zI}6-9b7!F{JSV|zo^=6h?xwh+c!tVfZ%tJxRGf>+Bs936J_lO9hHqEi14`q@;ycUjIIT9JG4bg(o1pGvvGLrRzi*vQ)$<<${hyAL^M7mqUFt5;3N61pov^rmPl*I9^+7{cZFsiFNMXk{*>eTyUr<41aOQ=4%ECVwvnHJ_pC+ z>QZsrx&GYi>_@Vok;mES3b;cJG;JI-1!4p99sBOjK=yhARZ29U%e{%ym!nW?yRv|q z+rix`B4G0zN9uq(shru|(6dYyNc7-q!_T-rM)@|XY7B(b*o~BOMDAnGu$+usrHQZ~LEtq_lHU0^}5)-Gh zGYo!{0=|p%f08*nLb`&Nlm^C^fN+6aoX$?v;}o5K=wqp^8&hM}U}#Tu5tOeuJy-9M zN83Yo*Yr0O*pc6W(iLiYuESSdkdw)e-+#@|DEL8x@XaaTnE5J^|7i-9S@t&rLIWVJ zkIuM)Q+K?SQF!SJ0X5bmC8N&_Qew3iEFHoP9H%lx0GtyyeK=+atqOFO5tpb7oxdW6 zMECFnfbm#wpu%gv-G17yX#e!07g>~W1~mcCYG&4ZTtIqkkbDH9NiGdl%{rJFUkaxA zdt<;=Qc#oj2`dW+D|{Sp z^vstn>GCs=>U@mNfgOz_>CL+?>xbZ-6u7}v4OWkNZ8y>{0GcP_5@)VRYsv7CF$SB0 z=1Is3`;SR8&=lnfxGY$LfyuGf2CXU0t|1V=32~42Rf5XOL<&EFr|dZtp^j=K`#c5@ z8-CGArhGjIHIK)L2t$M!=QpSGAyq!cF+ciIqng)b()&SaGv~t2H&elRAkUP&N9Xi92{KLh$UmNUjYy zk?&HHDQiL1LHr*^c_BKC(8R2$Sd>8G>2pwSzk-)bh?zzuiGUw{V?I~_o_8S@HnxqL za|HvcnSCB%#B)U~Noyt3aY7ZlB8Bx0mlf~*{+P9DiYQrJ$xh&gjFY5()KE0+XunFz zGSZO!aR}oGvOw@`W0pj0C0%UAs%ByVK7CnpQn6HX5H+7Lhzp_^A0B8}w8POtb5a>_ zqp}p#2BW~92D*~OtT@F2szRf=0=DDTyx(;!iww2|&s5AjEzgU9La4rGVMoBpxS|@j+ghB9DR5^*x!P%dz=SuPE z-$r!`PARc+Hx6vM%o**#uO5EFaE#VnM({wQ;{#nNdD@s&(E&X$GXC(Jmwin`!RS2%Y~kLoCFFblG)fC*^-w>2uVX!Ry-L z-mM3$m}qJN<_P%b<-PGU-b9nr`#PWL4W&yY?<{=jzdpDid#^Dy>%Cj-w;_*$J$1(p z4kI;#p1>_~7A3YY!Pzu=hPFf|VqwIr98^ztB;{F-`KBkM0GZTR%vf{C2h5Cx-f4wI|aLGp-)xSVSCB!w_IettKq<1jHA4uwEzVhE{KsNu=EsgLgSYz znv{`wg^|^CG)WQ9DTNg%h-}xCcKO&M@@82oTqg%)41wg@=RH~{HAl69p$6#iT#3x6 z!n>9nJ=ZHzl&i*|B^;J^CUZHUz7kat|i?SmX8!9wPCkS|rZ72T!J*gNdEgTLY^>t}M?q^P%=$qs4 zM}?h_Kj4b!UY|zJz=*#rEn)qIqC@3Z{bD1l!7Myb_>N$*d};fL!=hxO6GQ(=<@Zgqg_jcU|wpI+0Ly;b6@tL zVl&E{=eTV!wBBk4uhLrIY~-|1zf=692%>%wi|CTZgY*kvMhv7%3=((fnzx(ej^W1a z`22k+z0HVLur$jDj#M#J)}MLO8Hi!sf{w~x%$0T&e#tpvM~9Pxr~o;U><-N{#Hfl5^UJz7^X_8X1&Q2| zj*=NTX4x_{h~HA5X0}T>jfy@Il!GcSJ+9xHdXLKhN`hkz;{mpGZkkDWhNJ^_JwUsN z4p{;b#xF(5$uJ|Tc|kRsAGCB8gA-I9 zMH1)|l97(o_kK+H=-D~N@{l+eWUUD@AQdtd(2Ttdpa*$$$`$E1JoksnrqfIQoS`9P z-^}zAyNXs&t zd-R$i>1s;bCpp8Rl4Q7$!(;P9<((LTWZFWF|e+MEBkvU1Jep(t$ zpC-Ny6K1w%XW42GtP{JESD|if9wDq)O76zJLF?-)8Jf`?4lBa}YR|{`!Lg&`4)NWX zecZNSL1`EDHo30qXOJ{eqwwsV5Of zPon^2PSmFhlAV@*_B^liBEXjwkOLL3u@_UT`c;1oUoF^4$%Voih_TB%R@G9p$<}Ex ziU3izEAM#hXXN=Vl#Ckh%@gk84NiP0sR7y_FzZU#zAZg``0$3poS2Y1${{&CYi$7+ z!-%m;LOD}S)iy}h##y&e7?lq7uw>hQW1D6TbLF6)#*ZrrRh964wN z=(K7;_IZb`(FLcF%UyVRi`80P*<1W?x&6?sU`$a$N%SL@Dn)1&M zz-9Lrf@EA@@#5ws#>oQozWT&(K06quwytEWI)d95XXd%{o+ z7Eg{7Gle{T!tNrZN_gs?nQsP3wd>Z;09Wb{uqYHe{fi!SUJt#1c8$;5z7%2k7yjZp zEu*zaK8l>*U)ODo=MwdXqjLyTB`RjLA(sI>dNxU8WU0fP3t2w;s(o*8MW_soimXwR zV}6+|@-;dfxh405$^HC#o2qXZDc^K#a?2#DT-U47IUYvJP$n*s02vtQ{B$LQ5;K>} zX*(3H$dPAk_oWW`lD5HQfLE$LCF^rYRLaQYI7BE^6?QR3RbYM2x9rb-xu*oWkTCGQ zU$mz#!UXX;F4m%;mvvG9A9kKh>VH=E2s-zvA+acB=HMF9fFTot2K$Xs?g zn*U88ycnY?**@H_#DV2000C~Hphd_^AVLEsGb+t29V74&KBelgmT&SoK`F-PC#Ffclw*y2@1$u9 zjX`N<#EkGNz4A;-=i+i~Tb>qJ71PUF5gC#)oe{!baI`&|sE^LgypVgS1wH@(0q_rr z#9Qvb;Z>{fK##HAFkfUScu6TNL$5SUAXB-k*&=6G!Pmhm!vd2QdF|~aQaV3YZ`S`E z^gZ@PkaS_NZwLS_UQCKDHUB3UQhM{Ak6H= z%(w9+)Q`{A8w2R9f_*=&qNUrC4`!r=D!uG2pme2>Stu`ukkPg_&>)g6$JP)H{RS83 z)mss=ZJrC|y9&;{OHpF2g#8t=8if+-7)eg!GSq(&aCf~?pHdT`?*sx022IgF8LZ6R z8|CcKiYC|D(BfQd5VfRtya#}$n%w-=Fx-Dn(BA~-w^$eqdG`G;g~H*dEKvabV%p{< z&_t*rC9NII+r`7Y@eckugxxF}1U$e*@hQg=a4##xslQwan;sHEB@*<6y77IA!0iTc znPkM5nRVe8a}?;gb%-O~y4HH51wr*G<%F|b91j+<@QP)xfwzshGTN7};Ceq@pyjq! zuRaeDxQ4wnd_EO$D@0Ha0 zlCEgrlYn8Fq>?SMcjzd%mAdOy)I#(3s-W&0(-)1v@mqEYk(6H4l3#kKB$WwfeR$JU z;l`|cL+S($0kl3L2~bT>wNt8Lyp!CLwhgF{-!oG195{qzd)VsIC4{s4gpt2<_k@)I zPqE=e^xrf20LOjl(x0P&c(0(~uP()M?R#@D7E3Y+!Yo7KbJ+FRF$gqzz0<|+P)TXy z)IYzU77&pBh5SipsFZCh(6+I&zd;^*`{ZMH@x4S zQid)Od0-eNU`c!UKcyZYfR9+XK~&?EFfp1@V(|HY&Qw*QTHZ_LDNSMT?4WH-~IymXV`0%5M z>f!2(8vDu9@m?^v)lA)PSbB9JrDUvJ?bF@wdw>8a+Ig!n^p*o+=%9_Xt(<5#(W2G_tw`lfXOtQ>Y$C+ z&hKhdYao@%aV79+7d!ZX#Iy#}`VX0ZjO$B5&FzPJ-B%o^Xm9TrS!x#uc?n`UEz*UG zQ1T63kg9teL~oWrX0=xDn?e*6U6L;&LZ@~T=v)xQ%MiXJwO=(K-pu=4JR+n__l>0}OBRk0I`j{q) zCg!Op*|)72eqQ)K&F#5zO7?repGwNzG4PJ$B%*YKrEN#4#PmNJ0I6W18q{x4% zP+r;u#-1qT=`~tBN|!I8+dE4KX?;$;4}YF*U@+IF`*mqMyTX%%8o4GFyGpa(;YN}y z@2EAt9WytfC6xocZ_aK{U@fty$2_~HqFGze5<_yIi&a#7@s!3uS()Gp>$u zIy`$9H7+L{2T4(rz$qk2>YBLulNqIe%g<}(((vTJJQ6w-;K##s!0PU>dM1`rfp6eG zhIs+0k0S4}HLQ#FR`w}>fQQIfB&PkU-YIP(Gj04kc&h>uaNE%=_X}T9sBRK+SgKS7t zsabeH1WGhDhaa%{H#$@&Cf*%kN$--@U%2W#gbbJ^2};_&7wMo2NZXxAyUo&qHX0B_bW1D%FL zlFE4ry(a=w^Bqj~e8c|(8@En1>J@m#Vvv|xo!E9T{M@OOi;XHLK%s!PE{tXX>vCLJ zeUW`i*=Z*zu70cC^F;c_V(ymC0drDRffT(-h*9hKy7e$Zh9NG*)O!QT3UmL1zlVEq zR@~U#%5iub>O{46pZ2 zgth4tRBDB!N#f>{XFiDi(3cUq{yAG16KRmTY@ZiZhe}A+41}p70wlB7_nOua{gzsw zntOE3sGtIT>2-N8Axp0cD zvZ51(GG#knJdj)C&H@H0MmCH_k!seKp3dA;(Ywv+G0`2)O#&Em(|&HU+p}R$s1&uk zTppGm)&ktl(rHvm3!tTp7tA;w-XvgiH#Xg6_+16tHygN~>kJBGf99wDu1c$pI@3>U zGh>d5qUU3ttk!WakQaD}Fu`2wL1L%FW8Ww-IrMy(?zOdVbYrjvB8CKl#7wVv{WQ#I zn)<~kJHg&bs=#Tx8Fh^~O5Lc)G!05f2?xSDM$|!$U&jqj%e(Wo2pB{yv)LaOoe(i} zv86X#$z1=Wt=+AJd${oa34i)4^R<}IE3VlJ@K@I^Yqjl>0KU>R0UJK_yv|!pE$pFv zA5nr%Z^{~{+KIQAx1Je3RpfxlUx;Xc7!9c7Q~vs2JZMVO z44|xrQZn(w4<{8Yi!W;L0bfOanmR0{hl>EAIkTD^XyLH8-^mK*cynJSJdm(|$jl#G zgt0+wR2cU2Nd7zPI3pHA9IIo_ub$PVgN*|_bvZKu`}1tkD8h6Es!GGRbT z;=IYKsvQUGoX=xn&(ddP&-zqe{mNZ!kPqfg&o;(Sj(%evg|>Xq5D#7`4j{3ekfBfF zFx&6xe`})MzHFheP&#y{mD28``Jllp_W^xu234BEK864cDi# z)c%xb?0GerVpXn|^2XlrLwmt*SeK?rk@JgZ;YtF%)e!|S(hx4gJi@maI$YkH>+_3V ztBGx;>Rz9gN(C%_8)@z^6EIS;8w4`_01{Rc)-QeoUgFqf@1cgTfU%5)(Dh4PqmfTh z9?$Z|VV7F6xNRO#a+&f6u?^US*Qi;yv4%BXl7XbY5m{&EGUW&YhE57R*3QWo7t$mZ zZ9jamA@TeRC3`*rrpeC%n@3qKoV*5qPd5~AT}cR%ahX$2Ko*@aW77g9|JCf>9P;XO zBU^9Y_iK4&;h)$5G~^&tP2(+Hn7PcPuEl>~?Xo^uRDl2swJ9FolmZjOwQ-+uJZ77|<5uzxo~}sg zlrZbg4rTixC<|C7SwsHo5|Sk4D~eKkA?3uI531zYi_ZUgus#_*e-c9J68Bl7Aip8Y zG9C=$sgIp?SK?-|Z9+{6ZmH)9;4`-^F2hIyBi~pU$6X07C?0eQX}^_w#*{Onx85u1 z<|lj4#kXSG-4+dDzUs^NR?xKo<|oo=B?Tff>FCIHxjxqb`!Y7DowacGq?ZH*736k& zLt|Y_)5S};MJgJug0BU-xVRs*A*krD!{7%%kIHZmgSl>aS$WVv%{zls$ap^H zDA;dCM3DY8BuNi_l2)&PMlnyXF@cZ|Yo(n|8}yr*Ndl7aMl)Wjo_(q4&>t|fO+|D% zwHtrHYgr$s_KsxSAyT)dyr5)>NoyYxVA}be2|bc*+|^&K&Qx zKPfJp=hnCf*^xcu0t+tKImcOjaX5CwKyAN4(RJny1=}&8E}mw7?lsz2dLjRR?K^)| z{6SxUgfex?n9S_(x0}eCS92Tp^O%I#=Ic5NZ#ag*$SaZ4uuH~=oPEyL%@NkMojv*p z1?Fj6BqT5?0`H+hz`hQ{zm;Tt(;Em-%oS&Iv6ywsM7`6d-J#PtZDhx`INtJ3?j+kX zFDEQdvC02T7=eDW4lOVVKfTlWe_^}+hcC%nRQv#=(1a33RO|rWVC5Y6FY(FNb~C6# zjpGIk1fKk}WBqcw1n<%;n?lBO7zo=0Sdkh3HnO|}D`bR*1t4AYC|DQ4*mriHLGe~J z5T~^`5!J*?+F!n<6P0GGCo|KeAO+t%Y!{`4x*b+O`y(ViU5Z6G0cwlwd8s<94h2BQ zXL*UqS6+948Y-ZJ(@%USZ10jJ?aj!_-<@OoLnY4Q{KDF>i_3Tuj4nq6!}6w?V%EE) zpy8$r!(C3-S@@I0HUo$wa#b>=~ z=I`Wv4K`EUpq%n649=rtYus^`vH<~-6+dv~S@V`Z$ffc^o}!sKf!VWuN~_}D;jQ)c zb|4;J)KUkBo(5aH)G2f?dcyFW+q{5Bg=LwBBd}{CrK7#{35~8*lI%_j7*Pu7s3Lc= zmu0;s?|h703OnAXr2X#*Q44PJZ2>Jo)%vpEY~7Xii_39G1}LC*x8#H3)Oc-(Qxy_ge&xhzRRkpH+4x$7b2;ym3s1u=Mo z0l{k*4f`1*hV5`xm52gS37nd#=%g0lJN;r;bx>Le&a%Nse|rk?FL)2v)}TdsFJ;T4 zY`%6Er3+@My5M-$w3o`8a4JjC3E9;<9_${VxwGCBF?FjUL&ey|uOBH@+_0I&bF#l-7q6n+mhMW`DmYg*V*nh8$-1oXY1EpQo2x|wAzHY)j^|w2qXbH*PM}OOqd*3h(6LSvQPF~hnP@rK5y$Xs4QqRR;=l6Y|jj0wB!Ku*p`b8xMnZcsBuSfy22LbBtorPIe1_ zH$T@3KyvLBnYn&mw}g;TaE|KG0)t9M$P{+Jh6K-uaU8Y(5h zrM3JzSnnA^*Ajq7SDYw`qC|9y9zfM-Y?O zxY)!$7`%M-w-#S|HQgep=Vp=9lCOLSfF2(0v&v}>yzs%H*or@e$>=~)+)hx_NsRM^ z-A9Spm<=nl&^11}#In=G%|-3i7gZYs^do!75DFy#YL8i#Cr8aZEQKMq@Y0}dRs!~< z(XMb(=p=GhFuB-3rz9a9jRMOn*wPfvo4Zs*X2rm13G^ZnGApQJjp(^~2@DQRT7PtV z*aB;vS9RfL+-8YN$6Bcw$G_ck!9Lx1Km929xt##<0}(x5KwG}55K*;tO3_gI(r$?S z94Q4{iJ=ZS?BpObJ88~fXbdCVV#7vnRj`KB(z0Qq=W^sYcXj?{;`Wv>F1WiPN$uS; zd!l-LQX`lv{jU@^27>~}Y78T?f!hVbcTK9X zem~*PX(RPBPp&+Tz= zy;b*z6VEZhfl~Ou^ocv;dSgeNcPY;%zEnbwj?Fv*z8$zo6J8IeG8VQV$@Kb5$tmV1 z9!-+lp)vHr9mb%u3r;vnS%NN!BDZyo{)C(a#M8T}!_^>>fLrXs+3E-!@;-kl?Q-EG zf%PT#FOAyS2+F!PBD8xvw6pVz&YlLXPj_{$GO=cbt)l6AGM<&ijV7y>fF~;E!^Y8b z=2d57#E@{Bg}V}!$nAi3bHqev&?&RZc4ulxNpEz{wSm=Y1J7M z@^|C3xp!pv@jN7yH9xm}rLg7o$Kr7$wkJAuk!4g0aMT_$Yfu7qV50a29@`*)Ncpd( zXlQ|ko5;A&D@p!XOZGU`F?B@|mwE~Xby6%eiE|WHgXFXwTF4f3VUXkLY0+Xn z>$&b{K4p@M_$$!hk`;_<&Nyozz7@|b~;%J~fNJqJQ5 zIe02ad)cSQeE+}VOJE&g?tV$;{suiZi;1LM`vk z;zlu}YkNf}aP(3haz$O*(aKNoi*}G$0?xkM{*csDnlLd`VuA#-Zk<-4-1Q+so>!`ieiBu+9eoTaMuGRlkBm~I0({|0S}HRD4{@|{oN*{wmX(J5OQ zlCs@R#I|e0PY+M4^kiS~dX?%Vv@F1#Sa!7xr>b4_ia@=R7Yff+PqD(5%c`KEheXf; zMw0uv4HWEUzfta71h=bycPGO9es7sdfmXJ4x6HAwYBqhy@Txv?$>8NTV1X}2G?=x> z+?MjblR6vc4_O^!FB!+-kzBpayB1|H_}f(xQ^s{Z?|c;P#N~M+B^1ddn(P6}Q`)6< zC4;1F+2w*WIGgQH5lE3MRot&&fk|fnUg{sly_C-4tbhQb)-t3Q9MvC9(TRsUMJ!U> z&UaKMiRCHqEXe4WZX)QnHijPK0?z>CQ=BSrBQKdUPuB1y=uiYlxdZoqXE^*yF5zCQ zI$X%{)dCt@t9E%{PjIo`k>@YoPw34?tC05eK)O{Mv-K{be>i>+1-IZ1zWHlJH`Fdi z1A`#^8XBC+5dyaJkotrrj0aI@s}qW&v4KTKCe%0a_t>_K5&75kQe*jjo0FDpjCu+* zF9Q`I`sfp_c&VNSGV4{V2QOg>m0FYksV6xb;k9~DjqSlz6BU*PN6r(P$tyR&wFwd- zs)EvmO7x9eDM-+$=IihGxc2O^=B&Tu)oT4X*G%Ll0Np%aU4a6|8;q8h5{xR1F=LS$ z(6Q)G4i21pgX2I+Br(HZ(OWdx$_0cF|FM`9VId+tg`A*~1anRdY}4B)e-4>!X4JSe-8~)t`%o zMa&{xgcXC+JbwCMlV&WBWB6u6@`S?)T|!3{-$rRpCJv>pg>X(5sI}i3VAt$%mZjZ! zr@#be#2ybDCVIL9u-^HQUmPH^rHm_gepThaE<7sTV%VmeV86Su00C@r->;0elqH@l zd0raOiU5+>78b5TZsJ+Zm>KPb-##Oy*_Y{dnWy$AdwoY>3g$=_enH$xWz#=g7+^dy zm2`GWaG5K11apB0WIzZYzG|QDA_fux4q!Hctc|vy1SC?+zp+|ClW0v5>G*S#k|#YC0If zO#gb!i+~BZWn9ZMI>C_X3|EmYZET6@EkMP)1-nsn{=$#&M(*MN7smTM5oe6px|`7j zL9u*fr>J6S05N`>M3=v6-Nt)ot_nFUgK8hk=!Ci)neOoP%=&?*GI~_cwX%7J z?m-A@T7&{SJ@9nOej%P{G7|9)})Sl0W(yI-#;pn*Qsl5yiN};0|@GRwZ zYz$#kht>Ve?kyNO%E6DB^W49GKm^x+<5DWENsSp{Qf$)Qhg-3j89nIIG-IxJkUyul zY#(CsM~AY?u^}}5*ldG44l|9$*k3Nu-pX}}6VuWfO-SsbY-quWnbHs42vy}QD>URj z8}<{GwN_1aX91!U({g{yj`fLI(_9pqz?f~-2ndu?z?4DtVN6<+pGf?(t^x`HH1q!9w2MRun*9I)g0|ZevO)apbnkZko{` zRunB!ExU&Bb-JB%jixb239=S6r>arm*qgp76_x`*J-0>F<_U?=VACutEw{Dzn1Xn$ z7Er*?IyEdrcKv#e(PC*t+^42ube8m84}YE1>dDmjjGVl z+qi~41cVFN&fAVi{ZJ#SpgfWy4nCyc;C;$E$FEJYOow{4uMq~@;C7i}NyK z4qd2CkPCK&w$GPxwS@F+gfo>FRTXhAI*wdA^uzD^ui&XAcdFdxQHu$POzU#_2$d=m zEB}RR+#h;Ko*-15em=Dim`p>u)$EGN^rDN}3n=WsYR0MsDt@2}1b0r~yX&ZeJp7?* zeZL$Cn)=t>-xI)WypS->1%h1M;ny?{G*DB%WIKef6JY1R2JLp?SuWNYorKOFw9`tl zGd}E3(%UsYqIvCaVcT&8ombPpCfus}==%IU-gCBlL=^exqR%wVv?$+qRiV&llSM`qhkCmw&1Qs2?7WRi4 zMQgfvq5R!a{n}qb%o0-J$tv^F!uwUHX zjq6K?c2tjH1zRp&@C`=VbXGv1*;utW^*|{NJd;`jhvHjmd0~{r&tFXwJYCYD1jD5V z?h;VDdejBD!+J z&no4b`GmFW2-pXQFCk*pe#hqfzInLlB;JP@Rk(Q~S(jYy5SZRql`t;JmeT_Ex}r>M zI&z0w9HIJ-Y75%Pjg^k}T~PUP|I|8l43Bz=gM~A{&jFRmX;rGjS4>I9I_)9x8z+^m zgH+K*BP>Uu$g22J(L(7rl%VcXo9{hSb|f`IihqnEv!?)SmpX|3-VvOCqkPVT{QC4d z795pu*>V998bGAJBpAeVF75Fk-(0Vbl!@lQn=}`u@z>}qbERCJFYk^Fm3NuDv1jnv zIZUl)1WvRZu zn!|Kp5ki7WhVG9}(bOv}G*upV)xxLIGDGD0;!OGJEcRP?&N{@7Ryl+o<#7R8RzvHJ z-!qIOZw{}l#Ma;_F2wGi(jHYvV~(h8Tcjf%Fu@$kJqQS>yad1ZQ&Ut~?8>T#4JlFs zUNTlUk{epmw7>xmU^p@*)~7k$n&68VC9xwTnq+4lSSdVcq#FW8fL8EPw^_+9PeotKu4IbA<4Ru4 z5rxotDt!^qFR(g=L(0Q_QA9GLYdf244P3GF$Y?<|kIAm)C0jcjTRV2vpf3e9MBfTx zCh+x2IlCn%(QR0e9>XN67F{>KzNqG8^Ouy@zMI98n!lyWwcjl-A%MEdN@O*LWGY7$rgi z*KgGklcq7NY$M{0smoM&y81NFfR$(Y|HH9qD=qX>y_0Zxt&|TBcSwx^>!>hvf{1Os;&FaYHy*L$DnamE)}k6 zk-f?if%36O4S1fO)d$$?V9g4ef~SO3WxJmO?gk)g?V4HoSXPtCso5HHE^3@Rm<;7q zt+Pg0*2Qz2b(6#Uya9(xc>b;mgI}4|&_%`5Qs}SN=d%UkYz0HB8cftANt4^jonO{8 zB{5ME%obqN_^~k&S%y`S3m5~K5Uq}5zjdZNt;DE*t`Zlo|G_qit_XpjsN02aM=1wg z)J_qzsD>}(K1si(*sGp$lKx(UUpTsOh|ZO^nw_=mwVZI6r9*Zy7L^0!{~;3+&wMzy z9f*$bG^;7Ry-d!fTO}0b50!i}v^(F|o0LOTlIQ!P4x1X_5kSr*({E%wit<7xHd^mG zHKE!#z&qXZUO=Sg4wx9lx#3#by0RiW-kNjSc?M_ zT0Dy!wIQgYP>k$lt-@nuWkHEXkUCcK(v3S@>_Oe!|89`0SkDk3<@Er5BmSU6RMB>l zn@t5Nw0DD@)`FzhJAIn=8yS-Zq5XHghm!3iqFZzv1MV^9=;&7=kbXQn|JYz$FFV-A zcg9{q%~F+L)X24fSg}} zF#=`f)u*@~)-0v=apHDxrCOL+sEDnry#Bj4?UEQOscLyu4EwKp~NoY_6H^`t@=>bDVA zo5M_#zum5WWC>_lu!$nz<~6!OOnm zy=|Csd^4L3l>#?`0@V;OMF3M;cG>?IPckzj11Se z=x?D+XT^I$#?xE6BwZMm6#SK?*U@yFTBZP|YkB2u!ovk3l>|qYu$G7N`!x*dg8l57 zA01swNIs*T+%&JB-e1$|gSlS9%+94}mQFDe&P%vWvfpJdY_ zh;FMm=LUsov?TL26^KE;Sk(4o)3H;;$|u&<2_Z0hr5Tyqzh26?;oCe%kR#eK*Q>zM z=CQWN_;TEk04ciwy1fw2VmSwbwF5?aHZE$=*W&O2D~UVT*xA3WW1%8<#(3pVuG-k1 z5XWOH2^3ru8<6mx1S4WtFYBxjZ32gs-^$F{mziZ-E97O~2nV11*N#<#PY(D?edE?* zbuKEYj}Jn$%}7=M6+K~V4^TVt+Q$+Rj>ZgW^%^t_hWH@q+xFX6Od5Lh@HDkes)c`U zg%%$N7;E{5#NRv=8>PmlQUi_Y9(5lfVFB9uk8HIoLtiu9+)z}UU~hURbY|C~u9voW z=G)PpTzvkmV-O{&N@Lb1LMQIE3IuEX21!t%tS2GXZSj%yX&dIXwf10oiFv?TvJW5K ziiDMb$}3`BRmObmY_!wqW{{=qo=LYAtcWYiuYW-tL35C0mnrYBF%tY|IT=I!igq|x z2w9_=xLQEt8>*%+AS`fFljGqG5uT?Wc`7K~M1`tVRfLi`8UFLf@>*fM4t9nbqdM?J zt0ae1j&g&C!e|piJw&$+Rs+8{e*3NH_hA2_*XfE9`NqQ{U}!*ryF$!EJjWtAtQd(S zSSAg0m~|k1Eq1!VLlKiW^^B+Fsdl|ytMN*J^ z$<96_TDKo^$R`VKnHd2*i%55NrR@jfUJaDtckqXr*5~)I0(!iFX)m7 zb&X1j=lrzB#A3L8pTz?57b#9Yqfwy)%^06&oX`1xlrwA^HTQ6vG0YIIP@3gAu}ikC z`ub@legSn2qfzI(3Y&i-wi&PmeUeF-UP7QYbLoA7g+lZlJKlt!k(W@mmW3mZ#KyIL z{m+C7ViK=8tdu*+ye@9%aAZ%OOnX73y3_ky+CGNnYbkp-($yCWT*&nKGMP?p_@hCF zfRP$nZv&^Zu2iL4`w#m6=43DZT zVsq3{Go>O{|J2KAf#B&o)DCleAkb&CyW{j%ffogK^7)jAn8=^o%X4HE1~Wabt`9tc ze(CG%=?DwtA6fIR-o#7T4!{ZecafbT0Xtoj`|$aPe- z$__O3jY>Se?nFlDy%e1;bE3h`h!5<972s#8rusnw%xCcp7ZK)*|<0WQG!1 zT4XV~9T#FJQ|RDp4qXAB<;_Uz`LJx(w~eikWpcm*y8g6u$zFYvRld9}*A0jIvU&p% z7A|G1*Ry-~LhP$XT_#LJaC#uFs;4ZKlwQ-4FxN#Y_;hr)6fuZS@T(Yx_ly6C_PFOF zi^upQ_9|rA_~98!4shy;W|ucGRcPpcMJ5byRtGfW-hG zL-@Bs*_G}G(y)K#aMu0TnR)daJ_Hu!7C0qQ62kXnfHb(|zICfbycxmGgy+P_wUocE z*ir$OlFAFivi~>0x)axH0t=P5tMwa6t(#yFM0JT<&zLrNDS;feS7pyZqTZ?{s)+SLkxxq)2lU1jmE8GUE2J49%pURktTg?ewdx$JM~G>OBuqy2IjBt<;e!T za6nu3Lk}*@ASMx*fg^2P)(CT7k)%m-A${o!P~*~Ud-T9nAD;k*`VP7;<}wwacAyV~ zcfm(>=W0%k(6JMN9FRw3-4K{+9~DqhHwxsLx@VL#gDBvO2r$oHlv4wLpV1RamYraA zS>pXS)wlov00D5MR2vm^7#O&;{QKVu-_cjRCj3B!G#*=uDw)fznsWIaKr17gx`L^Q z6@W0ISjC<8RRoYm5gr;P=7aWjR5don>q>78Z`gJ$zxPb&<&CM#=U-0Pp_2z%O@5cUItQqT_>t<-HdQ#)$W7ojotCJG@~R zUHP2#9SUK_gGDk}eXtC=6E+|xOE;Q)XyZQF_RY;RsZY89EQj>_WHB4j;X1}%>1(Sf z=Kjq~m*$JY!vHRb>*wgbH*A5^cfhvKSLXpWpk)-~ND|7eB;IN(Zbaw0t#7MZ$R?z2 zb4cZXckA&y>`8(p;A{7xi%VY_tggtW`{af~qv>#JvVdWkz6HeJ{nX{7ik9#t zfB-5h(zAiVq1@gH9HDmQXC9Z6SJX z;7?B*6W-2w8^%ya(g5EQWPP)Rl|YKF8l z3zfxNwK}Y;^`mN+zy@WHz=-?;jOC~ZC_o8`#k6F0LS{fuH0N$NbX+W_7wtpo%k~%J zjhRAYUQj?fOtrw$vKLpq&gCJfPM3T<@w_s=Nv-v*90t15sG=jb2fbADP(X>U!@{^%fj^MzgXhSbDRE~&x16#rN+W71`70a)&fE8 zZ1(dGQlIGtF0k7gXFK#ALLQ?{^)?~}mY>I?qGHsY!7-TAiZI>LsP=#2yXM=P&|mA0 ze;o>W&RE;2reMyrEbZ~ntr@JgnQ}sWm>`;IU zL`R!aF&(zTfL8wFqUlVUIxKyQl^J-mlz6NjHfEZ<`+@+Q(d-k*X=q^?A@4lt9M+qB zWU=W8GXJZJ^xcK843Zfx@qgXj5|rTisM2gR8KL~b<`0u_o3xy(7SJcP$tOoh*~Aw% z_@gLLh==y)yz-wnGwB9{ zX5WDkYA)^n0hT#f*GkaEMFI^QeQWXv>}r58YSHHk1{F1a7(JSLmByW=>OKzd<96+| zF+n8&QGv{Djc@bWn=kz}dy(2x(N7AD*pV7%&8_kNmCOGb0Hvo)w>rtQ%-0nyIE()Q zT>Cd&vqXN^fDO9=vrRk^y69oWPoVYH0m)hJ>c^BeVw|&KtWe;tnbI~?NUT@V?58B} zc4YpxwDBx~x)QV2SdAz?=t)2sh`!%XZ)PI8RuUPLbg|P*O<(Zt@D=KHH&x(bp3VtS#zvNDc+94GCkQQ4Z58QAK zpT@a#!3J8T4t;#ebF5>88HXKAiZt$g&7BhaOQ z;&y*<0McwMlMXC94%JT+#{k2oOyZB9jsp|pKXd$K+J6N6-!pAJO+fb~j=Cpp_2d!E zhb-U)qz}6hTK7MbTdG##vHzB7h{V~R&AEb|0T%eMa2M7j0l3j}xf)V6Zw54}nS4P{ ziZw$Iq@B>(h{3_?9>D@suyPGc=N$SJM?Ck%K;hgU^@fG$J}{59RQvcV4_8|RnE!wp z?;z5+2XVC?;+*4)SX|%W9kH=1qU-{XDa@V9_{%$6bm*$Z0FdhaUxDYo7zpMQ1MRNzPVL0v4~IO}bzm^;55;GW$sxM1rn-RV3KZ>=`ywTSgCql~;+8nT zHGySHd)N?G%N1lzwEzxE7|{kLY%Az4?YZj1Glw(S+i-HXf8kz`00000Ip>Bzlw=fP z08I!svM40Z_ye&H@vkhsl!Tay48b{eRz-nBtPQ4-FLa#CNRI4#zYj=Ak0iO{0P6U! zN6QpMel7q=q9=X48>oEf#+@w(*A=Ah)v{;G3_zvgF=$xj5JL!B)y}*3E%Zc}h0;`M z+2*jCNo(sOBLQ~=i2EVYS7vwX#=Q_J^u&;v)o6-_L~raU*p=zD3MHe@dVT#|{yUYGY(oCTL16`>HL1Uz7f z8wI)pc2%J^O}E5g#}J})U*cU3LR3D~)^AWSk*PuJbiPzUW$brN1^C-KBhX$OLu>c% zne{ZDmg39G99Nvq!g-xn`fp2I7SjKWT}g!-2((Yy4L}-xA2lavYMag6-HNk%9y4U* z%@`PCZ8Rd4jP>4VE;^i?!|xxWyI3xit<_#%*LHu;ZEz9x303pvXQK}pw7iyg} zKF<33mfGw@n#uKIY|w5VH_8TLa!RLn%eY~PASrl;oTa_BADO&{7dz`=SLn208>#}L z5UCks&144vmKlozL`_Bo>}RgM8k8z@8N2%a>iy2$sn-7kfWGPkiFJX$_*Yn@Wl76L z>so-t6@{yC`3gp)OW%f0pP?%MHjFFYJXnBQEl6{=S0+^Fvr#k8jjQI#cjqH1ROABr zL3{UwLtX^Rq!$q&z;2yqvSULTGm{sh+t)2Hp?p>M1W;JREW#YSTWwEt3M^&*1qx@mbpsYDHyt+quo3xvA8`ivGA>=2_&W-5+UuQ6R0XB;=`uk7Qz5hD{1VdSGeqxdJzG4_$-(Or;lI(^w!294k*P|#4Q z(3VROu2gVIn6f!%`zN=+8`%^_((oPPdf6G8PBWa2VMT|b9!%LAfJd9!YaOu#$=Ht+ Q2D&mpl%-cX|H2pm01$Pyi~s-t literal 0 HcmV?d00001 diff --git a/public/markdown/images/recaptcha_site_and_secret_key.webp b/public/markdown/images/recaptcha_site_and_secret_key.webp new file mode 100644 index 0000000000000000000000000000000000000000..51234dbba8be87c27d825938b1ab2c713d353259 GIT binary patch literal 25646 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�lQ;Rblw_qRxxc&0>iFGk! zpTVXtKU+}-CbyEru}et&TKA-5#i|(IU~3w1BdjA-gKyH(kP@5#4(Ko?%J;>>7s3qC zba^2#!Wv`|D2Ao&2_bhfLu$wL(ue`>i6O&C({7YC_rrqu)e@)U`b?lHb$>G0;wV#U^t1ub+jUMDU? zkI*O>zZ3~-C9&g=CKoy!np;Ps``>Se34rcRjb<2ozpiydq|$ z&$W)rkqq`RocE8xbYeU(e-Amt?X%w53Bixyopqi#pdgY;RCe?aYow+vlaVLd`NP>eiHTF#pZAH(CvXbz-3WwCyaEpGACQMYl4aSysT+@7&3F&OVtLEf_` zo)EXSn7UmcSMIa>CWWXBD4SA#yq>f7q6jX~K+|tupNZeT?)Oeko@zejM|? zQ5&qA0-~ne)4xQNxB~)Ds$u!%H}=Hm^=P7pzA=qmMD6VewIHNyW5HqFszP?3C@vA5 z0WHbJiZwpfmMd#MGD}(e;-+RbfHZaJ3rhu_(IF6I!DhR+AjNKCizJ6Vu-FQ;Tq z;JYUDI-eRD8LCxgP5P$JrTlSXdT42H-bM;>Oj!J+NhQpX8WU=5)juU>c#CrF!4=~t zQ?3JiG0=4id0W&A*1%(i+fiC?!B3|M3BU6SWqKl1a0ciOmN|y)n1Sz5E5mIf(gR5C zh8I}pj&$ieC*Hw}MYsbYVFQjpT?W||%~kr&vu3-pv3lIXdm_SGLGy@uUaVHlllKf0 z0R;_t$0$A_3iy8qUs{n00Zy+8dXR}b(?2mEbK+(LWuKKrrkH5!(>@PJZby&(EvX<{ z*7_q5{suPpQ2XGTO?z4;B{#AvNOE5{+&{VVZWRc|!|r4Fkck(0xh{LfP|#-m$nT!< zX`^$maS(ve$=}2p{^vT?45pv_BtQs7uOt2y zRuPs`jgL&sf+i`*xO?Gv1UiWLIi^cf%?KY5NBg0rp8>|L(ha!p`aMXM*H{P6Ae4Qu zK{TTN=?KBQLp1-=yLS3^6k4hieG)`D{GY@38f&H|pUTft_5wtShMumm|K>By3i8EP zYu9GfZ0dMD>-~V0hmVHfY9f(?*_++!PiYUL?b;8f59(+;s+@B2KEM_P(C1HCQ@^Vb z#=lb!noq290=`i2Rn=dkuup5mVCDgqu2OPHD4QRFo!1H@1*NLCEy^*3fJSlDKtEue zC-Fs%$-UFkw235=mpg5l&eQJkIDPe8%fj2*qrl&doi%i+qD$^B0AK(B0000VnN9`Z zyh${q`S!$2Fp%fZhZf8*g5;uk{C@o0e9I+#0p1&ukn9L?HNidwaktRvCUP9zkr?@k zAVp(7Ci?$nR(!RMa9p<&l_9odiq(^{>D3R)uZM)uOE1N2(hQW>1>yWTR|?%?$AAC; M01_ks000000GhX|mH+?% literal 0 HcmV?d00001 diff --git a/public/markdown/images/talawa-logo-lite-200x200.png b/public/markdown/images/talawa-logo-lite-200x200.png new file mode 100644 index 0000000000000000000000000000000000000000..9d341376612c598c7e08af8bbd79d717abb15a6e GIT binary patch literal 5133 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

    Hi, ${username}

    Your OTP: ${otp}

    Your OTP will expires in 5 minutes.



    Do not share your otp with others.`; + return mailer({ + emailTo: args.data.email, + subject, + body, + }).then((info) => { + logger.info(info); + return { otpToken }; + }); +}; diff --git a/src/resolvers/Mutation/recaptcha.ts b/src/resolvers/Mutation/recaptcha.ts new file mode 100644 index 0000000000..13a8edf882 --- /dev/null +++ b/src/resolvers/Mutation/recaptcha.ts @@ -0,0 +1,19 @@ +import axios from "axios"; +import { RECAPTCHA_SECRET_KEY } from "../../constants"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; +/** + * This function generates recaptcha. + * @param _parent - parent of current request + * @param args - payload provided with the request + * @returns Response of the post request. + */ +export const recaptcha: MutationResolvers["recaptcha"] = async ( + _parent, + args, +) => { + const response = await axios.post( + `https://www.google.com/recaptcha/api/siteverify?secret=${RECAPTCHA_SECRET_KEY}&response=${args.data.recaptchaToken}`, + ); + + return response.data.success; +}; diff --git a/src/resolvers/Mutation/refreshToken.ts b/src/resolvers/Mutation/refreshToken.ts new file mode 100644 index 0000000000..becbcf936a --- /dev/null +++ b/src/resolvers/Mutation/refreshToken.ts @@ -0,0 +1,120 @@ +import jwt from "jsonwebtoken"; +import { + INVALID_REFRESH_TOKEN_ERROR, + REFRESH_TOKEN_SECRET, + USER_NOT_AUTHORIZED_ERROR, + USER_NOT_FOUND_ERROR, +} from "../../constants"; +import { errors, requestContext } from "../../libraries"; +import { AppUserProfile, User } from "../../models"; +import type { InterfaceAppUserProfile } from "../../models"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; +import type { InterfaceJwtTokenPayload } from "../../utilities"; +import { + createAccessToken, + createRefreshToken, + revokeRefreshToken, +} from "../../utilities"; + +/** + * This function creates a new access and refresh token. + * @param _parent - parent of current request + * @param args - payload provided with the request + * @returns New access and refresh tokens. + */ +export const refreshToken: MutationResolvers["refreshToken"] = async ( + _parent, + args, +) => { + // This route should not be protected because the access token will be expired. + if (!args.refreshToken || typeof args.refreshToken !== "string") { + throw new errors.ValidationError( + [ + { + message: requestContext.translate( + INVALID_REFRESH_TOKEN_ERROR.MESSAGE, + ), + code: INVALID_REFRESH_TOKEN_ERROR.CODE, + param: INVALID_REFRESH_TOKEN_ERROR.PARAM, + }, + ], + requestContext.translate(INVALID_REFRESH_TOKEN_ERROR.MESSAGE), + ); + } + + const jwtPayload: InterfaceJwtTokenPayload = jwt.verify( + args.refreshToken, + REFRESH_TOKEN_SECRET as string, + ) as InterfaceJwtTokenPayload; + + // The refresh token received is valid so we can send a new access token + const user = await User.findOne({ + _id: jwtPayload.userId, + }).lean(); + + // Checks whether user exists. + if (!user) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + const appUserProfile = await AppUserProfile.findOne({ + userId: user._id, + }).lean(); + if (!appUserProfile) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + + if ( + appUserProfile.tokenVersion !== jwtPayload.tokenVersion && + appUserProfile.token !== args.refreshToken + ) { + await revokeRefreshToken(jwtPayload.userId); + throw new errors.ValidationError( + [ + { + message: requestContext.translate( + INVALID_REFRESH_TOKEN_ERROR.MESSAGE, + ), + code: INVALID_REFRESH_TOKEN_ERROR.CODE, + param: INVALID_REFRESH_TOKEN_ERROR.PARAM, + }, + ], + requestContext.translate(INVALID_REFRESH_TOKEN_ERROR.MESSAGE), + ); + } + + // send new access and refresh token to user + const newAccessToken = await createAccessToken( + user, + appUserProfile as InterfaceAppUserProfile, + ); + const newRefreshToken = await createRefreshToken( + user, + appUserProfile as InterfaceAppUserProfile, + ); + + //update the token version for the user + const filter = { userId: jwtPayload.userId }; + const update = { + $set: { + token: newRefreshToken, + }, + $inc: { tokenVersion: 1 }, + }; + + await AppUserProfile.findOneAndUpdate(filter, update, { + new: true, + }); + + return { + accessToken: newAccessToken, + refreshToken: newRefreshToken, + }; +}; diff --git a/src/resolvers/Mutation/registerEventAttendee.ts b/src/resolvers/Mutation/registerEventAttendee.ts new file mode 100644 index 0000000000..28a2d6b39f --- /dev/null +++ b/src/resolvers/Mutation/registerEventAttendee.ts @@ -0,0 +1,181 @@ +import { + EVENT_NOT_FOUND_ERROR, + USER_ALREADY_REGISTERED_FOR_EVENT, + USER_NOT_AUTHORIZED_ERROR, + USER_NOT_FOUND_ERROR, +} from "../../constants"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; +import { errors, requestContext } from "../../libraries"; +import type { + InterfaceAppUserProfile, + InterfaceEvent, + InterfaceUser, +} from "../../models"; +import { User, Event, EventAttendee, AppUserProfile } from "../../models"; +import { findEventsInCache } from "../../services/EventCache/findEventInCache"; +import { cacheEvents } from "../../services/EventCache/cacheEvents"; +import mongoose from "mongoose"; +import { findUserInCache } from "../../services/UserCache/findUserInCache"; +import { cacheUsers } from "../../services/UserCache/cacheUser"; +import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; +import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; + +/** + * Registers an attendee for an event. + * + * This function handles the registration process for an attendee to participate in an event. + * It checks the user's authorization, verifies the event's existence, and manages the registration status + * based on whether the user was invited or directly registered. + * + * @param _parent - The parent resolver. + * @param args - Arguments passed to the resolver containing registration data. + * @param context - Context object containing user authentication and request information. + * @returns Promise Returns a promise resolving to the registered attendee data. + * @throws NotFoundError Throws a NotFoundError if the user or event is not found. + * @throws UnauthorizedError Throws an UnauthorizedError if the current user is not authorized to register attendees. + */ + +export const registerEventAttendee: MutationResolvers["registerEventAttendee"] = + async (_parent, args, context) => { + let currentUser: InterfaceUser | null; + const userFoundInCache = await findUserInCache([context.userId]); + currentUser = userFoundInCache[0]; + if (currentUser === null) { + currentUser = await User.findOne({ + _id: context.userId, + }).lean(); + if (currentUser !== null) { + await cacheUsers([currentUser]); + } + } + if (currentUser === null) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + + let currentUserAppProfile: InterfaceAppUserProfile | null; + const appUserProfileFoundInCache = await findAppUserProfileCache([ + currentUser.appUserProfileId?.toString(), + ]); + currentUserAppProfile = appUserProfileFoundInCache[0]; + if (currentUserAppProfile === null) { + currentUserAppProfile = await AppUserProfile.findOne({ + userId: currentUser._id, + }).lean(); + if (currentUserAppProfile !== null) { + await cacheAppUserProfile([currentUserAppProfile]); + } + } + if (!currentUserAppProfile) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + + let event: InterfaceEvent | null; + + const eventFoundInCache = await findEventsInCache([args.data.eventId]); + + event = eventFoundInCache[0]; + + if (eventFoundInCache[0] === null) { + event = await Event.findOne({ + _id: args.data.eventId, + }).lean(); + + if (event !== null) { + await cacheEvents([event]); + } + } + + if (event === null) { + throw new errors.NotFoundError( + requestContext.translate(EVENT_NOT_FOUND_ERROR.MESSAGE), + EVENT_NOT_FOUND_ERROR.CODE, + EVENT_NOT_FOUND_ERROR.PARAM, + ); + } + + const isUserEventAdmin = event.admins.some( + (admin) => + admin === context.userID || + new mongoose.Types.ObjectId(admin.toString()).equals(context.userId), + ); + + if (!isUserEventAdmin && currentUserAppProfile.isSuperAdmin === false) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + + const requestUser = await User.findOne({ + _id: args.data.userId, + }).lean(); + + if (requestUser === null) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + + const eventAttendee = await EventAttendee.findOne({ + ...args.data, + }); + + // If user is already registered for the event + + if (eventAttendee?.isRegistered) { + throw new errors.NotFoundError( + requestContext.translate(USER_ALREADY_REGISTERED_FOR_EVENT.MESSAGE), + USER_ALREADY_REGISTERED_FOR_EVENT.CODE, + USER_ALREADY_REGISTERED_FOR_EVENT.PARAM, + ); + } + + // If user is already invitedForEvent + if (eventAttendee?.isInvited) { + eventAttendee.isRegistered = true; + await eventAttendee.save(); + + await User.updateOne( + { + _id: context.userId, + }, + { + $push: { + registeredEvents: event._id, + }, + }, + ); + + return eventAttendee; + } + + // If user is directly invitedForEvent + const registerAttendee = await EventAttendee.create({ + ...args.data, + isRegistered: true, + }); + + await User.updateOne( + { + _id: context.userId, + }, + { + $push: { + registeredEvents: event._id, + }, + }, + ); + + return registerAttendee.toObject(); + }; diff --git a/src/resolvers/Mutation/registerForEvent.ts b/src/resolvers/Mutation/registerForEvent.ts new file mode 100644 index 0000000000..6718328552 --- /dev/null +++ b/src/resolvers/Mutation/registerForEvent.ts @@ -0,0 +1,116 @@ +import { + EVENT_NOT_FOUND_ERROR, + REGISTRANT_ALREADY_EXIST_ERROR, +} from "../../constants"; +import { errors, requestContext } from "../../libraries"; +import type { InterfaceEvent } from "../../models"; +import { Event, EventAttendee, User } from "../../models"; +import { cacheEvents } from "../../services/EventCache/cacheEvents"; +import { findEventsInCache } from "../../services/EventCache/findEventInCache"; +import { cacheUsers } from "../../services/UserCache/cacheUser"; +import { deleteUserFromCache } from "../../services/UserCache/deleteUserFromCache"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; + +/** + * Enables a user to register for an event. + * + * This resolver function allows a user to register for a specific event. + * It performs the necessary checks to ensure that the user exists, the event exists, + * and that the user has not already registered for the event. + * + * @param _parent - The parent of the current request. + * @param args - The payload provided with the request, including the ID of the event to register for. + * @param context - The context of the entire application, containing user authentication and request information. + * @returns The updated event object after registration. + * @throws NotFoundError if the specified event is not found. + * @throws InputValidationError if the current user is already registered for the event. + * @remarks + * The function performs the following checks: + * 1. Checks if the event exists. + * 2. Checks if the current user has already registered for the event. + * If the user is invited, their registration status is updated. Otherwise, a new entry is created in the EventAttendee collection. + */ + +export const registerForEvent: MutationResolvers["registerForEvent"] = async ( + _parent, + args, + context, +) => { + let event: InterfaceEvent | null; + + const eventFoundInCache = await findEventsInCache([args.id]); + + event = eventFoundInCache[0]; + + if (eventFoundInCache[0] === null) { + event = await Event.findOne({ + _id: args.id, + }).lean(); + + if (event !== null) { + await cacheEvents([event]); + } + } + + // Checks whether event exists. + if (!event) { + throw new errors.NotFoundError( + requestContext.translate(EVENT_NOT_FOUND_ERROR.MESSAGE), + EVENT_NOT_FOUND_ERROR.CODE, + EVENT_NOT_FOUND_ERROR.PARAM, + ); + } + + const currentUserIsEventRegistrant = await EventAttendee.findOne({ + userId: context.userId, + eventId: args.id, + }); + + if (currentUserIsEventRegistrant?.isRegistered) { + throw new errors.InputValidationError( + requestContext.translate(REGISTRANT_ALREADY_EXIST_ERROR.MESSAGE), + REGISTRANT_ALREADY_EXIST_ERROR.CODE, + REGISTRANT_ALREADY_EXIST_ERROR.PARAM, + ); + } + + if (currentUserIsEventRegistrant?.isInvited) { + currentUserIsEventRegistrant.isRegistered = true; + currentUserIsEventRegistrant.save(); + + // Adds event._id to registeredEvents list of currentUser with _id === context.userId. + await User.updateOne( + { + _id: context.userId, + }, + { + $push: { + registeredEvents: event._id, + }, + }, + ); + await deleteUserFromCache(context.userId); + await cacheUsers([context.userId]); + + return currentUserIsEventRegistrant; + } else { + // Adds event._id to registeredEvents list of currentUser with _id === context.userId. + const registeredAttendee = await EventAttendee.create({ + userId: context.userId, + eventId: args.id, + isRegistered: true, + }); + await User.updateOne( + { + _id: context.userId, + }, + { + $push: { + registeredEvents: event._id, + }, + }, + ); + + return registeredAttendee.toObject(); + } +}; diff --git a/src/resolvers/Mutation/rejectMembershipRequest.ts b/src/resolvers/Mutation/rejectMembershipRequest.ts new file mode 100644 index 0000000000..98f6e13e4f --- /dev/null +++ b/src/resolvers/Mutation/rejectMembershipRequest.ts @@ -0,0 +1,100 @@ +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; +import { errors, requestContext } from "../../libraries"; +import { User, Organization, MembershipRequest } from "../../models"; +import { adminCheck } from "../../utilities"; +import { + MEMBERSHIP_REQUEST_NOT_FOUND_ERROR, + ORGANIZATION_NOT_FOUND_ERROR, + USER_NOT_FOUND_ERROR, +} from "../../constants"; +import { cacheOrganizations } from "../../services/OrganizationCache/cacheOrganizations"; +/** + * This function enables to reject membership request. + * @param _parent - parent of current request + * @param args - payload provided with the request + * @param context - context of entire application + * @remarks The following checks are done: + * 1. If the membership request exists. + * 2. If the organization exists. + * 3. If the user to be rejected exists. + * 4. If the user is the admin of the organization. + * @returns Deleted membership request. + */ +export const rejectMembershipRequest: MutationResolvers["rejectMembershipRequest"] = + async (_parent, args, context) => { + const membershipRequest = await MembershipRequest.findOne({ + _id: args.membershipRequestId, + }) + .populate("organization") + .populate("user") + .lean(); + + // Checks whether membershipRequest exists. + if (!membershipRequest) { + throw new errors.NotFoundError( + requestContext.translate(MEMBERSHIP_REQUEST_NOT_FOUND_ERROR.MESSAGE), + MEMBERSHIP_REQUEST_NOT_FOUND_ERROR.CODE, + MEMBERSHIP_REQUEST_NOT_FOUND_ERROR.PARAM, + ); + } + + // Checks whether organization exists. + if (!membershipRequest.organization) { + throw new errors.NotFoundError( + requestContext.translate(ORGANIZATION_NOT_FOUND_ERROR.MESSAGE), + ORGANIZATION_NOT_FOUND_ERROR.CODE, + ORGANIZATION_NOT_FOUND_ERROR.PARAM, + ); + } + + // Checks whether user exists. + if (!membershipRequest.user) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + + // Checks whether currentUser with _id === context.userId is an admin of organization. + await adminCheck(context.userId, membershipRequest.organization); + + // Deletes the membershipRequest. + await MembershipRequest.deleteOne({ + _id: membershipRequest._id, + }); + + // Removes membershipRequest._id from membershipRequests list of organization. + const updatedOrganization = await Organization.findOneAndUpdate( + { + _id: membershipRequest.organization._id, + }, + { + $pull: { + membershipRequests: membershipRequest._id, + }, + }, + { + new: true, + }, + ); + + if (updatedOrganization !== null) { + await cacheOrganizations([updatedOrganization]); + } + + // Removes membershipRequest._id from membershipRequests list of user. + await User.updateOne( + { + _id: membershipRequest.user._id, + }, + { + $pull: { + membershipRequests: membershipRequest._id, + }, + }, + ); + + // Returns deleted membershipRequest. + return membershipRequest; + }; diff --git a/src/resolvers/Mutation/removeActionItem.ts b/src/resolvers/Mutation/removeActionItem.ts new file mode 100644 index 0000000000..d68d8eae11 --- /dev/null +++ b/src/resolvers/Mutation/removeActionItem.ts @@ -0,0 +1,159 @@ +import mongoose from "mongoose"; +import { + ACTION_ITEM_NOT_FOUND_ERROR, + EVENT_NOT_FOUND_ERROR, + USER_NOT_AUTHORIZED_ERROR, + USER_NOT_FOUND_ERROR, +} from "../../constants"; +import { errors, requestContext } from "../../libraries"; +import type { + InterfaceAppUserProfile, + InterfaceEvent, + InterfaceUser, +} from "../../models"; +import { ActionItem, AppUserProfile, Event, User } from "../../models"; +import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; +import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; +import { cacheEvents } from "../../services/EventCache/cacheEvents"; +import { findEventsInCache } from "../../services/EventCache/findEventInCache"; +import { cacheUsers } from "../../services/UserCache/cacheUser"; +import { findUserInCache } from "../../services/UserCache/findUserInCache"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; +/** + * This function enables to remove an action item. + * @param _parent - parent of current request + * @param args - payload provided with the request + * @param context - context of entire application + * @remarks The following checks are done: + * 1. If the user exists. + * 2. If the action item exists. + * 3. If the user is authorized. + * 4. If the user has appUserProfile. + * @returns deleted action item. + */ + +export const removeActionItem: MutationResolvers["removeActionItem"] = async ( + _parent, + args, + context, +) => { + let currentUser: InterfaceUser | null; + const userFoundInCache = await findUserInCache([context.userId]); + currentUser = userFoundInCache[0]; + if (currentUser === null) { + currentUser = await User.findOne({ + _id: context.userId, + }).lean(); + if (currentUser !== null) { + await cacheUsers([currentUser]); + } + } + + // Checks if the user exists + if (currentUser === null) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + let currentUserAppProfile: InterfaceAppUserProfile | null; + const appUserProfileFoundInCache = await findAppUserProfileCache([ + currentUser.appUserProfileId?.toString(), + ]); + currentUserAppProfile = appUserProfileFoundInCache[0]; + if (currentUserAppProfile === null) { + currentUserAppProfile = await AppUserProfile.findOne({ + userId: currentUser._id, + }).lean(); + if (currentUserAppProfile !== null) { + await cacheAppUserProfile([currentUserAppProfile]); + } + } + + if (!currentUserAppProfile) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + + const actionItem = await ActionItem.findOne({ + _id: args.id, + }) + .populate("actionItemCategory") + .lean(); + + // Checks if the actionItem exists + if (!actionItem) { + throw new errors.NotFoundError( + requestContext.translate(ACTION_ITEM_NOT_FOUND_ERROR.MESSAGE), + ACTION_ITEM_NOT_FOUND_ERROR.CODE, + ACTION_ITEM_NOT_FOUND_ERROR.PARAM, + ); + } + + const currentUserIsOrgAdmin = currentUserAppProfile.adminFor.some( + (ogranizationId) => + ogranizationId === actionItem.organization || + new mongoose.Types.ObjectId(ogranizationId?.toString()).equals( + actionItem.organization, + ), + ); + + let currentUserIsEventAdmin = false; + + if (actionItem.event) { + let currEvent: InterfaceEvent | null; + + const eventFoundInCache = await findEventsInCache([actionItem.event]); + + currEvent = eventFoundInCache[0]; + + if (eventFoundInCache[0] === null) { + currEvent = await Event.findOne({ + _id: actionItem.event, + }).lean(); + + if (currEvent !== null) { + await cacheEvents([currEvent]); + } + } + + // Checks whether currEvent exists. + if (!currEvent) { + throw new errors.NotFoundError( + requestContext.translate(EVENT_NOT_FOUND_ERROR.MESSAGE), + EVENT_NOT_FOUND_ERROR.CODE, + EVENT_NOT_FOUND_ERROR.PARAM, + ); + } + + // Checks if the currUser is an admin of the event + currentUserIsEventAdmin = currEvent.admins.some( + (admin) => + admin === context.userID || + new mongoose.Types.ObjectId(admin.toString()).equals(context.userId), + ); + } + + // Checks if the user is authorized for the operation. + if ( + currentUserIsEventAdmin === false && + currentUserIsOrgAdmin === false && + currentUserAppProfile.isSuperAdmin === false + ) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + + await ActionItem.deleteOne({ + _id: args.id, + }); + + return actionItem; +}; diff --git a/src/resolvers/Mutation/removeAdmin.ts b/src/resolvers/Mutation/removeAdmin.ts new file mode 100644 index 0000000000..0615517da3 --- /dev/null +++ b/src/resolvers/Mutation/removeAdmin.ts @@ -0,0 +1,185 @@ +import mongoose from "mongoose"; +import { + ORGANIZATION_NOT_FOUND_ERROR, + USER_NOT_AUTHORIZED_ERROR, + USER_NOT_FOUND_ERROR, + USER_NOT_ORGANIZATION_ADMIN, +} from "../../constants"; +import { errors, requestContext } from "../../libraries"; +import type { + InterfaceAppUserProfile, + InterfaceOrganization, + InterfaceUser, +} from "../../models"; +import { AppUserProfile, Organization, User } from "../../models"; + +import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; +import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; +import { cacheOrganizations } from "../../services/OrganizationCache/cacheOrganizations"; +import { findOrganizationsInCache } from "../../services/OrganizationCache/findOrganizationsInCache"; +import { cacheUsers } from "../../services/UserCache/cacheUser"; +import { findUserInCache } from "../../services/UserCache/findUserInCache"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; +import { superAdminCheck } from "../../utilities"; +/** + * This function enables to remove an admin. + * @param _parent - parent of current request + * @param args - payload provided with the request + * @param context - context of entire application + * @remarks The following checks are done: + * 1. If the user exists + * 2. If the organization exists. + * 3. If the user to be removed is an admin. + * 4. If the user removing the admin is the creator of the organization + * 5 .If the current user and user has appUserProfile or not + * @returns Updated appUserProfile. + */ +export const removeAdmin: MutationResolvers["removeAdmin"] = async ( + _parent, + args, + context, +) => { + let organization: InterfaceOrganization; + + const organizationFoundInCache = await findOrganizationsInCache([ + args.data.organizationId, + ]); + + if (organizationFoundInCache[0] === null) { + organization = (await Organization.findOne({ + _id: args.data.organizationId, + }).lean()) as InterfaceOrganization; + if (organization != null) { + await cacheOrganizations([organization]); + } + } else { + organization = organizationFoundInCache[0]; + } + + // Checks whether organization exists. + if (!organization) { + throw new errors.NotFoundError( + requestContext.translate(ORGANIZATION_NOT_FOUND_ERROR.MESSAGE), + ORGANIZATION_NOT_FOUND_ERROR.CODE, + ORGANIZATION_NOT_FOUND_ERROR.PARAM, + ); + } + + const user = await User.findOne({ + _id: args.data.userId, + }).lean(); + + let currentUser: InterfaceUser | null; + const userFoundInCache = await findUserInCache([context.userId]); + currentUser = userFoundInCache[0]; + if (currentUser === null) { + currentUser = await User.findOne({ + _id: context.userId, + }).lean(); + if (currentUser !== null) { + await cacheUsers([currentUser]); + } + } + if (!currentUser) { + throw new errors.NotFoundError( + USER_NOT_FOUND_ERROR.MESSAGE, + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + + // Checks whether user exists. + if (!user) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + const userAppProfile = await AppUserProfile.findOne({ + userId: user._id, + }).lean(); + if (!userAppProfile) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + + let currentUserAppProfile: InterfaceAppUserProfile | null; + const appUserProfileFoundInCache = await findAppUserProfileCache([ + currentUser.appUserProfileId?.toString(), + ]); + currentUserAppProfile = appUserProfileFoundInCache[0]; + if (currentUserAppProfile === null) { + currentUserAppProfile = await AppUserProfile.findOne({ + userId: currentUser._id, + }).lean(); + if (currentUserAppProfile !== null) { + await cacheAppUserProfile([currentUserAppProfile]); + } + } + if (!currentUserAppProfile) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + // Checks whether user is an admin of the organization. + const userIsOrganizationAdmin = organization.admins.some((admin) => + new mongoose.Types.ObjectId(admin.toString()).equals(user._id), + ); + + if (!userIsOrganizationAdmin) { + throw new errors.UnauthorizedError( + requestContext.translate(`${USER_NOT_ORGANIZATION_ADMIN.MESSAGE}`), + USER_NOT_ORGANIZATION_ADMIN.CODE, + USER_NOT_ORGANIZATION_ADMIN.PARAM, + ); + } + + // Checks whether the current user is a superadmin. + superAdminCheck(currentUserAppProfile as InterfaceAppUserProfile); + + // Removes user._id from admins list of the organization. + const updatedOrganization = await Organization.findOneAndUpdate( + { + _id: organization._id, + }, + { + $set: { + admins: organization.admins.filter( + (admin) => admin.toString() !== user._id.toString(), + ), + }, + }, + { + new: true, + }, + ); + + if (updatedOrganization !== null) { + await cacheOrganizations([updatedOrganization]); + } + + // Removes organization._id from adminFor list of the appUserProfile and returns the updated userProfile. + return (await AppUserProfile.findOneAndUpdate( + { + _id: userAppProfile._id, + }, + { + $set: { + adminFor: userAppProfile.adminFor.filter( + (adminForOrganization) => + adminForOrganization && + adminForOrganization.toString() !== organization._id.toString(), + ), + }, + }, + { + new: true, + }, + ).lean()) as InterfaceAppUserProfile; +}; diff --git a/src/resolvers/Mutation/removeAgendaItem.ts b/src/resolvers/Mutation/removeAgendaItem.ts new file mode 100644 index 0000000000..308e823cff --- /dev/null +++ b/src/resolvers/Mutation/removeAgendaItem.ts @@ -0,0 +1,113 @@ +import { + AGENDA_ITEM_NOT_FOUND_ERROR, + UNAUTHORIZED_REMOVE_AGENDA_ITEM_ERROR, + USER_NOT_AUTHORIZED_ERROR, + USER_NOT_FOUND_ERROR, +} from "../../constants"; +import { errors, requestContext } from "../../libraries"; +import type { + InterfaceAgendaItem, + InterfaceAppUserProfile, + InterfaceUser, +} from "../../models"; +import { AgendaItemModel, AppUserProfile, NoteModel, User } from "../../models"; +import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; +import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; +import { cacheUsers } from "../../services/UserCache/cacheUser"; +import { findUserInCache } from "../../services/UserCache/findUserInCache"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; +/** + * This function removes an agenda item. + * @param _parent - parent of the current request + * @param args - payload provided with the request + * @param context - context of the entire application + * @returns ID of the removed agenda item + * @throws NotFoundError if the user or agenda item is not found + * @throws UnauthorizedError if the user is not the creator of the agenda item + */ +export const removeAgendaItem: MutationResolvers["removeAgendaItem"] = async ( + _parent, + args, + context, +): Promise => { + let currentUser: InterfaceUser | null; + const userFoundInCache = await findUserInCache([context.userId]); + currentUser = userFoundInCache[0]; + if (currentUser === null) { + currentUser = await User.findOne({ + _id: context.userId, + }).lean(); + if (currentUser !== null) { + await cacheUsers([currentUser]); + } + } + if (!currentUser) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + let currentUserAppProfile: InterfaceAppUserProfile | null; + const appUserProfileFoundInCache = await findAppUserProfileCache([ + currentUser.appUserProfileId?.toString(), + ]); + currentUserAppProfile = appUserProfileFoundInCache[0]; + if (currentUserAppProfile === null) { + currentUserAppProfile = await AppUserProfile.findOne({ + userId: currentUser._id, + }).lean(); + if (currentUserAppProfile !== null) { + await cacheAppUserProfile([currentUserAppProfile]); + } + } + if (!currentUserAppProfile) { + throw new errors.UnauthenticatedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + const agendaItem = await AgendaItemModel.findOne({ + _id: args.id, + }).lean(); + if (!agendaItem) { + throw new errors.NotFoundError( + requestContext.translate(AGENDA_ITEM_NOT_FOUND_ERROR.MESSAGE), + AGENDA_ITEM_NOT_FOUND_ERROR.CODE, + AGENDA_ITEM_NOT_FOUND_ERROR.PARAM, + ); + } + + if (!agendaItem.createdBy.equals(currentUser._id)) { + throw new errors.UnauthorizedError( + requestContext.translate(UNAUTHORIZED_REMOVE_AGENDA_ITEM_ERROR.MESSAGE), + UNAUTHORIZED_REMOVE_AGENDA_ITEM_ERROR.CODE, + UNAUTHORIZED_REMOVE_AGENDA_ITEM_ERROR.PARAM, + ); + } + + // Delete the agenda item from the database + await AgendaItemModel.deleteOne({ _id: args.id }); + + // Delete all related notes + await NoteModel.deleteMany({ agendaItemId: args.id }); + + /* + Remove agendaItem._id from appropriate lists + on currentUser's document. + */ + await User.updateOne( + { + _id: currentUser._id, + }, + { + $pull: { + // Add relevant lists here based on your schema + createdAgendaItems: agendaItem._id, + }, + }, + ); + + return agendaItem; +}; diff --git a/src/resolvers/Mutation/removeAgendaSection.ts b/src/resolvers/Mutation/removeAgendaSection.ts new file mode 100644 index 0000000000..8979bb319b --- /dev/null +++ b/src/resolvers/Mutation/removeAgendaSection.ts @@ -0,0 +1,120 @@ +import { + AGENDA_SECTION_NOT_FOUND_ERROR, + USER_NOT_AUTHORIZED_ERROR, + USER_NOT_FOUND_ERROR, +} from "../../constants"; +import { errors, requestContext } from "../../libraries"; +import type { InterfaceAppUserProfile, InterfaceUser } from "../../models"; +import { AgendaSectionModel, AppUserProfile, User } from "../../models"; +import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; +import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; +import { cacheUsers } from "../../services/UserCache/cacheUser"; +import { findUserInCache } from "../../services/UserCache/findUserInCache"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; + +/** + * Resolver function for the GraphQL mutation 'removeAgendaSection'. + * + * This resolver removes an agenda section and performs necessary authorization checks. + * + * @param _parent - The parent object, not used in this resolver. + * @param args - The input arguments for the mutation. + * @param context - The context object containing user information. + * @returns A promise that resolves to the ID of the removed agenda section. + */ +export const removeAgendaSection: MutationResolvers["removeAgendaSection"] = + async (_parent, args, context) => { + // Fetch the current user + let currentUser: InterfaceUser | null; + const userFoundInCache = await findUserInCache([context.userId]); + currentUser = userFoundInCache[0]; + if (currentUser === null) { + currentUser = await User.findOne({ + _id: context.userId, + }).lean(); + if (currentUser !== null) { + await cacheUsers([currentUser]); + } + } + + // If the user is not found, throw a NotFoundError + if (!currentUser) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + let currentUserAppProfile: InterfaceAppUserProfile | null; + const appUserProfileFoundInCache = await findAppUserProfileCache([ + currentUser.appUserProfileId?.toString(), + ]); + currentUserAppProfile = appUserProfileFoundInCache[0]; + if (currentUserAppProfile === null) { + currentUserAppProfile = await AppUserProfile.findOne({ + userId: currentUser._id, + }).lean(); + if (currentUserAppProfile !== null) { + await cacheAppUserProfile([currentUserAppProfile]); + } + } + if (!currentUserAppProfile) { + throw new errors.UnauthenticatedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + + // Fetch the agenda section to be removed + const agendaSection = await AgendaSectionModel.findOne({ + _id: args.id, + }).lean(); + + // If the agenda section is not found, throw a NotFoundError + if (!agendaSection) { + throw new errors.NotFoundError( + requestContext.translate(AGENDA_SECTION_NOT_FOUND_ERROR.MESSAGE), + AGENDA_SECTION_NOT_FOUND_ERROR.CODE, + AGENDA_SECTION_NOT_FOUND_ERROR.PARAM, + ); + } + + // Check if the current user is the creator of the agenda section or is a superadmin + if ( + !( + agendaSection.createdBy && + agendaSection.createdBy.equals(currentUser._id) + ) && + !currentUserAppProfile.isSuperAdmin + ) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + + // Delete the agenda section + await AgendaSectionModel.deleteOne({ _id: args.id }); + + /* + Remove agendaSection._id from appropriate lists + on currentUser's document. + */ + await User.updateOne( + { + _id: currentUser._id, + }, + { + $pull: { + // Add relevant lists here based on your schema + createdAgendaSections: agendaSection._id, + }, + }, + ); + + return args?.id; + }; + +export default removeAgendaSection; diff --git a/src/resolvers/Mutation/removeComment.ts b/src/resolvers/Mutation/removeComment.ts new file mode 100644 index 0000000000..8e8495c16b --- /dev/null +++ b/src/resolvers/Mutation/removeComment.ts @@ -0,0 +1,155 @@ +import { Types } from "mongoose"; +import { + COMMENT_NOT_FOUND_ERROR, + USER_NOT_AUTHORIZED_ERROR, + USER_NOT_FOUND_ERROR, +} from "../../constants"; +import { errors, requestContext } from "../../libraries"; +import type { + InterfaceAppUserProfile, + InterfaceComment, + InterfaceUser, +} from "../../models"; +import { AppUserProfile, Comment, Post, User } from "../../models"; +import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; +import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; +import { deleteCommentFromCache } from "../../services/CommentCache/deleteCommentFromCache"; +import { findCommentsInCache } from "../../services/CommentCache/findCommentsInCache"; +import { cachePosts } from "../../services/PostCache/cachePosts"; +import { cacheUsers } from "../../services/UserCache/cacheUser"; +import { findUserInCache } from "../../services/UserCache/findUserInCache"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; + +/** + * This function enables to remove a comment. + * @param _parent - parent of current request + * @param args - payload provided with the request + * @param context - context of entire application + * @remarks The following checks are done: + * 1. If the user exists + * 2. If the comment exists. + * 3. If the user is the creator of the organization. + * 4. If the user has appUserProfile + * @returns Deleted comment. + */ + +export const removeComment: MutationResolvers["removeComment"] = async ( + _parent, + args, + context, +) => { + let currentUser: InterfaceUser | null; + const userFoundInCache = await findUserInCache([context.userId]); + currentUser = userFoundInCache[0]; + if (currentUser === null) { + currentUser = await User.findOne({ + _id: context.userId, + }).lean(); + if (currentUser !== null) { + await cacheUsers([currentUser]); + } + } + // Checks whether currentUser with _id === context.userId exists. + if (!currentUser) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + let currentUserAppProfile: InterfaceAppUserProfile | null; + const appUserProfileFoundInCache = await findAppUserProfileCache([ + currentUser.appUserProfileId?.toString(), + ]); + currentUserAppProfile = appUserProfileFoundInCache[0]; + if (currentUserAppProfile === null) { + currentUserAppProfile = await AppUserProfile.findOne({ + userId: currentUser._id, + }).lean(); + if (currentUserAppProfile !== null) { + await cacheAppUserProfile([currentUserAppProfile]); + } + } + if (!currentUserAppProfile) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + let comment: InterfaceComment; + + const commentsFoundInCache = await findCommentsInCache([args.id]); + + if (commentsFoundInCache[0] == null) { + comment = (await Comment.findOne({ + _id: args.id, + }) + .populate("postId") + .lean()) as InterfaceComment; + } else { + comment = commentsFoundInCache[0]; + } + + // Checks whether comment exists. + if (!comment) { + throw new errors.NotFoundError( + requestContext.translate(COMMENT_NOT_FOUND_ERROR.MESSAGE), + COMMENT_NOT_FOUND_ERROR.CODE, + COMMENT_NOT_FOUND_ERROR.PARAM, + ); + } + + const isCurrentUserAdminOfOrganization = currentUserAppProfile.adminFor.some( + (organization) => + organization && + new Types.ObjectId(organization.toString()).equals( + comment.postId.organization, + ), + ); + + // Checks whether currentUser with _id === context.userId has the authorization to delete the comment + if ( + !currentUserAppProfile.isSuperAdmin && + !isCurrentUserAdminOfOrganization && + comment.creatorId.toString() !== context.userId + ) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + + // Reduce the commentCount by 1 of the post with _id === commentPost.postId + + const updatedPost = await Post.findOneAndUpdate( + { + _id: comment.postId._id, + }, + { + $inc: { + commentCount: -1, + }, + }, + { + new: true, + }, + ).lean(); + + if (updatedPost !== null) { + await cachePosts([updatedPost]); + } + + // Deletes the comment + await Comment.deleteOne({ + _id: comment._id, + }); + + await deleteCommentFromCache(comment); + + // Replace the populated postId in comment object with just the id + comment.postId = comment.postId._id; + + return comment; +}; diff --git a/src/resolvers/Mutation/removeDirectChat.ts b/src/resolvers/Mutation/removeDirectChat.ts new file mode 100644 index 0000000000..eb1abbe891 --- /dev/null +++ b/src/resolvers/Mutation/removeDirectChat.ts @@ -0,0 +1,81 @@ +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; +import { DirectChat, DirectChatMessage, Organization } from "../../models"; +import { adminCheck } from "../../utilities"; +import { errors, requestContext } from "../../libraries"; +import { + CHAT_NOT_FOUND_ERROR, + ORGANIZATION_NOT_FOUND_ERROR, +} from "../../constants"; +import { findOrganizationsInCache } from "../../services/OrganizationCache/findOrganizationsInCache"; +import { cacheOrganizations } from "../../services/OrganizationCache/cacheOrganizations"; +/** + * This function enables to remove direct chat. + * @param _parent - parent of current request + * @param args - payload provided with the request + * @param context - context of entire application + * @remarks The following checks are done: + * 1. If the organization exists + * 2. If the chat exists + * 3. If the user is an admin of the organization. + * @returns Deleted chat. + */ +export const removeDirectChat: MutationResolvers["removeDirectChat"] = async ( + _parent, + args, + context, +) => { + let organization; + + const organizationFoundInCache = await findOrganizationsInCache([ + args.organizationId, + ]); + + organization = organizationFoundInCache[0]; + + if (organizationFoundInCache.includes(null)) { + organization = await Organization.findOne({ + _id: args.organizationId, + }).lean(); + if (organization) await cacheOrganizations([organization]); + } + + // Checks whether organization exists. + if (!organization) { + throw new errors.NotFoundError( + requestContext.translate(ORGANIZATION_NOT_FOUND_ERROR.MESSAGE), + ORGANIZATION_NOT_FOUND_ERROR.CODE, + ORGANIZATION_NOT_FOUND_ERROR.PARAM, + ); + } + + const directChat = await DirectChat.findOne({ + _id: args.chatId, + }).lean(); + + // Checks whether directChat exists. + if (!directChat) { + throw new errors.NotFoundError( + requestContext.translate(CHAT_NOT_FOUND_ERROR.MESSAGE), + CHAT_NOT_FOUND_ERROR.CODE, + CHAT_NOT_FOUND_ERROR.PARAM, + ); + } + + // Checks whether currentUser with _id === context.userId is an admin of organzation. + await adminCheck(context.userId, organization); + + // Deletes all directChatMessages with _id as one of the ids in directChat.messages list. + await DirectChatMessage.deleteMany({ + _id: { + $in: directChat.messages, + }, + }); + + // Deletes the directChat. + await DirectChat.deleteOne({ + _id: args.chatId, + }); + + // Returns deleted directChat. + return directChat; +}; diff --git a/src/resolvers/Mutation/removeEvent.ts b/src/resolvers/Mutation/removeEvent.ts new file mode 100644 index 0000000000..9302e8de99 --- /dev/null +++ b/src/resolvers/Mutation/removeEvent.ts @@ -0,0 +1,168 @@ +import { Types } from "mongoose"; +import { + EVENT_NOT_FOUND_ERROR, + USER_NOT_AUTHORIZED_ERROR, + USER_NOT_FOUND_ERROR, +} from "../../constants"; +import { session } from "../../db"; +import { + deleteRecurringEvent, + deleteSingleEvent, +} from "../../helpers/event/deleteEventHelpers"; +import { errors, requestContext } from "../../libraries"; +import type { + InterfaceAppUserProfile, + InterfaceEvent, + InterfaceUser, +} from "../../models"; +import { AppUserProfile, Event, User } from "../../models"; +import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; +import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; +import { cacheEvents } from "../../services/EventCache/cacheEvents"; +import { findEventsInCache } from "../../services/EventCache/findEventInCache"; +import { cacheUsers } from "../../services/UserCache/cacheUser"; +import { findUserInCache } from "../../services/UserCache/findUserInCache"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; +/** + * This function enables to remove an event. + * @param _parent - parent of current request + * @param args - payload provided with the request + * @param context - context of entire application + * @remarks The following checks are done: + * 1. If the user exists + * 2. If the event exists + * 3. If the user is an admin of the organization. + * 4. If the user is an admin of the event. + * 5. If the user has appUserProfile + * @returns Deleted event. + */ +export const removeEvent: MutationResolvers["removeEvent"] = async ( + _parent, + args, + context, +) => { + let currentUser: InterfaceUser | null; + const userFoundInCache = await findUserInCache([context.userId]); + currentUser = userFoundInCache[0]; + if (currentUser === null) { + currentUser = await User.findOne({ + _id: context.userId, + }).lean(); + if (currentUser !== null) { + await cacheUsers([currentUser]); + } + } + // Checks whether currentUser exists. + if (!currentUser) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + let currentUserAppProfile: InterfaceAppUserProfile | null; + const appUserProfileFoundInCache = await findAppUserProfileCache([ + currentUser.appUserProfileId?.toString(), + ]); + currentUserAppProfile = appUserProfileFoundInCache[0]; + if (currentUserAppProfile === null) { + currentUserAppProfile = await AppUserProfile.findOne({ + userId: currentUser._id, + }).lean(); + if (currentUserAppProfile !== null) { + await cacheAppUserProfile([currentUserAppProfile]); + } + } + if (!currentUserAppProfile) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + + let event: InterfaceEvent | null; + + const eventFoundInCache = await findEventsInCache([args.id]); + + event = eventFoundInCache[0]; + + if (eventFoundInCache[0] === null) { + event = await Event.findOne({ + _id: args.id, + }).lean(); + + if (event !== null) { + await cacheEvents([event]); + } + } + + // Checks whether event exists. + if (!event) { + throw new errors.NotFoundError( + requestContext.translate(EVENT_NOT_FOUND_ERROR.MESSAGE), + EVENT_NOT_FOUND_ERROR.CODE, + EVENT_NOT_FOUND_ERROR.PARAM, + ); + } + + // Boolean to determine whether user is an admin of organization. + const currentUserIsOrganizationAdmin = currentUserAppProfile.adminFor.some( + (organization) => + organization && + new Types.ObjectId(organization.toString()).equals(event?.organization), + ); + + // Boolean to determine whether user is an admin of event. + const currentUserIsEventAdmin = event.admins.some((admin) => + admin.equals(currentUser?._id), + ); + + // Checks whether currentUser cannot delete event. + if ( + !( + currentUserIsOrganizationAdmin || + currentUserIsEventAdmin || + currentUserAppProfile.isSuperAdmin + ) + ) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + + /* c8 ignore start */ + if (session) { + // start a transaction + session.startTransaction(); + } + + /* c8 ignore stop */ + try { + if (event.recurring) { + // if the event is recurring + await deleteRecurringEvent(args, event, session); + } else { + // if the event is non-recurring + await deleteSingleEvent(event._id.toString(), session); + } + + /* c8 ignore start */ + if (session) { + // commit transaction if everything's successful + await session.commitTransaction(); + } + } catch (error) { + if (session) { + // abort transaction if something fails + await session.abortTransaction(); + } + + throw error; + } + + /* c8 ignore stop */ + return event; +}; diff --git a/src/resolvers/Mutation/removeEventAttendee.ts b/src/resolvers/Mutation/removeEventAttendee.ts new file mode 100644 index 0000000000..98259e7f2a --- /dev/null +++ b/src/resolvers/Mutation/removeEventAttendee.ts @@ -0,0 +1,167 @@ +import { + EVENT_NOT_FOUND_ERROR, + USER_NOT_AUTHORIZED_ERROR, + USER_NOT_FOUND_ERROR, + USER_NOT_REGISTERED_FOR_EVENT, +} from "../../constants"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; +import { errors, requestContext } from "../../libraries"; +import type { + InterfaceAppUserProfile, + InterfaceEvent, + InterfaceUser, +} from "../../models"; +import { User, Event, EventAttendee, AppUserProfile } from "../../models"; +import { findEventsInCache } from "../../services/EventCache/findEventInCache"; +import { cacheEvents } from "../../services/EventCache/cacheEvents"; +import { findUserInCache } from "../../services/UserCache/findUserInCache"; +import { cacheUsers } from "../../services/UserCache/cacheUser"; +import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; +import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; + +/** + * Removes a user from the list of attendees for a specific event. + * + * This function manages the removal of an event attendee by first verifying + * the current user's authorization and the existence of the event. It checks + * if the user making the request is either a super admin or an admin of the event, + * and if the user to be removed is indeed registered as an attendee for the event. + * If all checks pass, the user is removed from the event's attendee list. + * + * @param _parent - This is an unused parameter representing the parent resolver in the GraphQL schema. It can be ignored. + * @param args - Contains the arguments passed to the GraphQL mutation, specifically the event ID and user ID of the attendee to be removed. + * @param context - Provides contextual information, including the current user's ID. This is used to authenticate and authorize the request. + * + * @returns The details of the removed user if the removal was successful. + * + */ +export const removeEventAttendee: MutationResolvers["removeEventAttendee"] = + async (_parent, args, context) => { + // Tries to find the current user in the cache using the user's ID from the context. + let currentUser: InterfaceUser | null; + const userFoundInCache = await findUserInCache([context.userId]); + currentUser = userFoundInCache[0]; + + // If the user is not found in the cache, tries to find them in the database. + if (currentUser === null) { + currentUser = await User.findOne({ + _id: context.userId, + }).lean(); + + // If the user is found in the database, they are cached for future requests. + if (currentUser !== null) { + await cacheUsers([currentUser]); + } + } + + // If the user is still not found, throws an error indicating the user does not exist. + if (currentUser === null) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + + // Tries to find the current user's app profile in the cache. + let currentUserAppProfile: InterfaceAppUserProfile | null; + const appUserProfileFoundInCache = await findAppUserProfileCache([ + currentUser.appUserProfileId?.toString(), + ]); + currentUserAppProfile = appUserProfileFoundInCache[0]; + + // If the app profile is not found in the cache, tries to find it in the database. + if (currentUserAppProfile === null) { + currentUserAppProfile = await AppUserProfile.findOne({ + userId: currentUser._id, + }).lean(); + + // If the profile is found in the database, it is cached for future requests. + if (currentUserAppProfile !== null) { + await cacheAppUserProfile([currentUserAppProfile]); + } + } + + // If the user's app profile is not found, throws an error indicating the user is unauthorized. + if (!currentUserAppProfile) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + + // Tries to find the event in the cache. + let currentEvent: InterfaceEvent | null; + const eventFoundInCache = await findEventsInCache([args.data.eventId]); + currentEvent = eventFoundInCache[0]; + + // If the event is not found in the cache, tries to find it in the database. + if (eventFoundInCache[0] === null) { + currentEvent = await Event.findOne({ + _id: args.data.eventId, + }).lean(); + + // If the event is found in the database, it is cached for future requests. + if (currentEvent !== null) { + await cacheEvents([currentEvent]); + } + } + + // If the event is not found, throws an error indicating the event does not exist. + if (currentEvent === null) { + throw new errors.NotFoundError( + requestContext.translate(EVENT_NOT_FOUND_ERROR.MESSAGE), + EVENT_NOT_FOUND_ERROR.CODE, + EVENT_NOT_FOUND_ERROR.PARAM, + ); + } + + // Checks if the current user is an admin for the event or a super admin. + const isUserEventAdmin = currentEvent.admins.some( + (admin) => admin.toString() === context.userId.toString(), + ); + + // If the user is not an event admin or a super admin, throws an error indicating they are unauthorized. + if (!isUserEventAdmin && currentUserAppProfile.isSuperAdmin === false) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + + // Tries to find the user who is to be removed as an attendee. + const requestUser = await User.findOne({ + _id: args.data.userId, + }).lean(); + + // If the user to be removed is not found, throws an error indicating the user does not exist. + if (requestUser === null) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + + // Checks if the user is already an attendee of the event. + const userAlreadyAttendee = await EventAttendee.exists({ + ...args.data, + }); + + // If the user is not registered as an attendee, throws an error indicating the conflict. + if (!userAlreadyAttendee) { + throw new errors.ConflictError( + requestContext.translate(USER_NOT_REGISTERED_FOR_EVENT.MESSAGE), + USER_NOT_REGISTERED_FOR_EVENT.CODE, + USER_NOT_REGISTERED_FOR_EVENT.PARAM, + ); + } + + // Removes the user from the list of attendees. + await EventAttendee.deleteOne({ ...args.data }); + + // Returns the details of the removed user. + return requestUser; + }; diff --git a/src/resolvers/Mutation/removeEventVolunteer.ts b/src/resolvers/Mutation/removeEventVolunteer.ts new file mode 100644 index 0000000000..d0b42ebe9e --- /dev/null +++ b/src/resolvers/Mutation/removeEventVolunteer.ts @@ -0,0 +1,88 @@ +import { + EVENT_VOLUNTEER_NOT_FOUND_ERROR, + USER_NOT_AUTHORIZED_ERROR, + USER_NOT_FOUND_ERROR, +} from "../../constants"; +import { errors, requestContext } from "../../libraries"; +import type { InterfaceUser } from "../../models"; +import { EventVolunteer, EventVolunteerGroup, User } from "../../models"; +import { cacheUsers } from "../../services/UserCache/cacheUser"; +import { findUserInCache } from "../../services/UserCache/findUserInCache"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; + +/** + * This function enables to remove an Event Volunteer. + * @param _parent - parent of current request + * @param args - payload provided with the request + * @param context - context of entire application + * @remarks The following checks are done: + * 1. If the current user exists + * 2. If the Event volunteer to be removed exists. + * 3. If the current user is leader of the corresponding event volunteer group. + * @returns Event Volunteer. + */ + +export const removeEventVolunteer: MutationResolvers["removeEventVolunteer"] = + async (_parent, args, context) => { + let currentUser: InterfaceUser | null; + const userFoundInCache = await findUserInCache([context.userId]); + currentUser = userFoundInCache[0]; + if (currentUser === null) { + currentUser = await User.findOne({ + _id: context.userId, + }).lean(); + if (currentUser !== null) { + await cacheUsers([currentUser]); + } + } + + if (!currentUser) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + + const volunteer = await EventVolunteer.findOne({ + _id: args.id, + }); + + if (!volunteer) { + throw new errors.NotFoundError( + requestContext.translate(EVENT_VOLUNTEER_NOT_FOUND_ERROR.MESSAGE), + EVENT_VOLUNTEER_NOT_FOUND_ERROR.CODE, + EVENT_VOLUNTEER_NOT_FOUND_ERROR.PARAM, + ); + } + + const group = await EventVolunteerGroup.findById(volunteer.groupId); + + const userIsLeader = + group?.leaderId.toString() === currentUser._id.toString(); + + if (!userIsLeader) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + + await EventVolunteer.deleteOne({ + _id: args.id, + }); + + await EventVolunteerGroup.updateOne( + { + _id: volunteer.groupId, + }, + { + $pull: { + volunteers: volunteer._id, + }, + }, + ); + + return volunteer; + }; diff --git a/src/resolvers/Mutation/removeEventVolunteerGroup.ts b/src/resolvers/Mutation/removeEventVolunteerGroup.ts new file mode 100644 index 0000000000..74b072c277 --- /dev/null +++ b/src/resolvers/Mutation/removeEventVolunteerGroup.ts @@ -0,0 +1,82 @@ +import { + EVENT_VOLUNTEER_GROUP_NOT_FOUND_ERROR, + USER_NOT_AUTHORIZED_ERROR, + USER_NOT_FOUND_ERROR, +} from "../../constants"; +import { errors, requestContext } from "../../libraries"; +import type { InterfaceUser } from "../../models"; +import { Event, EventVolunteer, EventVolunteerGroup, User } from "../../models"; +import { cacheUsers } from "../../services/UserCache/cacheUser"; +import { findUserInCache } from "../../services/UserCache/findUserInCache"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; + +/** + * This function enables to remove an Event Volunteer Group. + * @param _parent - parent of current request + * @param args - payload provided with the request + * @param context - context of entire application + * @remarks The following checks are done: + * 1. If the current user exists + * 2. If the Event volunteer group to be removed exists. + * 3. If the current user is the admin of the corresponding event + * @returns Event Volunteer group. + */ + +export const removeEventVolunteerGroup: MutationResolvers["removeEventVolunteerGroup"] = + async (_parent, args, context) => { + let currentUser: InterfaceUser | null; + const userFoundInCache = await findUserInCache([context.userId]); + currentUser = userFoundInCache[0]; + if (currentUser === null) { + currentUser = await User.findOne({ + _id: context.userId, + }).lean(); + if (currentUser !== null) { + await cacheUsers([currentUser]); + } + } + + if (!currentUser) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + + const volunteerGroup = await EventVolunteerGroup.findOne({ + _id: args.id, + }); + + if (!volunteerGroup) { + throw new errors.NotFoundError( + requestContext.translate(EVENT_VOLUNTEER_GROUP_NOT_FOUND_ERROR.MESSAGE), + EVENT_VOLUNTEER_GROUP_NOT_FOUND_ERROR.CODE, + EVENT_VOLUNTEER_GROUP_NOT_FOUND_ERROR.PARAM, + ); + } + + const event = await Event.findById(volunteerGroup.eventId); + + const userIsEventAdmin = event?.admins.some( + (admin) => admin._id.toString() === currentUser?._id.toString(), + ); + + if (!userIsEventAdmin) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + + await EventVolunteerGroup.deleteOne({ + _id: args.id, + }); + + await EventVolunteer.deleteMany({ + groupId: args.id, + }); + + return volunteerGroup; + }; diff --git a/src/resolvers/Mutation/removeFundraisingCampaingPledge.ts b/src/resolvers/Mutation/removeFundraisingCampaingPledge.ts new file mode 100644 index 0000000000..32bcb9ca36 --- /dev/null +++ b/src/resolvers/Mutation/removeFundraisingCampaingPledge.ts @@ -0,0 +1,105 @@ +import { + FUNDRAISING_CAMPAIGN_PLEDGE_NOT_FOUND_ERROR, + USER_NOT_FOUND_ERROR, +} from "../../constants"; +import { errors, requestContext } from "../../libraries"; +import type { InterfaceUser } from "../../models"; +import { AppUserProfile, FundraisingCampaign, User } from "../../models"; +import { + FundraisingCampaignPledge, + type InterfaceFundraisingCampaignPledges, +} from "../../models/FundraisingCampaignPledge"; +import { cacheUsers } from "../../services/UserCache/cacheUser"; +import { findUserInCache } from "../../services/UserCache/findUserInCache"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; + +/** + * This function enables to remove fundraising campaign pledge . + * @param _parent - parent of current request + * @param args - payload provided with the request + * @param context - context of entire application + * @remarks The following checks are done: + * 1. If the user exists + * 2. If the fundraising campaign pledge exists. + * 3. If the user has made the pledge. + * @returns Deleted fundraising campaign pledge. + */ + +export const removeFundraisingCampaignPledge: MutationResolvers["removeFundraisingCampaignPledge"] = + async ( + _parent, + args, + context, + ): Promise => { + let currentUser: InterfaceUser | null; + const userFoundInCache = await findUserInCache([context.userId]); + currentUser = userFoundInCache[0]; + if (currentUser === null) { + currentUser = await User.findOne({ + _id: context.userId, + }).lean(); + if (currentUser !== null) { + await cacheUsers([currentUser]); + } + } + + // Checks whether currentUser exists. + if (!currentUser) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + const pledge = await FundraisingCampaignPledge.findOne({ + _id: args.id, + }).lean(); + + // Checks whether pledge exists. + if (!pledge) { + throw new errors.NotFoundError( + requestContext.translate( + FUNDRAISING_CAMPAIGN_PLEDGE_NOT_FOUND_ERROR.MESSAGE, + ), + FUNDRAISING_CAMPAIGN_PLEDGE_NOT_FOUND_ERROR.CODE, + FUNDRAISING_CAMPAIGN_PLEDGE_NOT_FOUND_ERROR.PARAM, + ); + } + + // Update AppUserProfile for every pledger + for (const userId of pledge.users) { + const updatedUserProfile = await AppUserProfile.findOneAndUpdate( + { userId }, + { $pull: { pledges: args.id } }, + { new: true }, + ).populate("pledges"); + + // Remove campaign from appUserProfile if there is no pledge left for that campaign. + const pledges = + updatedUserProfile?.pledges as InterfaceFundraisingCampaignPledges[]; + + const campaignId = pledge.campaign?.toString(); + const otherPledges = pledges.filter( + (pledge) => pledge.campaign?.toString() === campaignId, + ); + + if (otherPledges.length === 0) { + await AppUserProfile.updateOne( + { userId }, + { $pull: { campaigns: campaignId } }, + ); + } + } + + // Remove the pledge from the campaign. + await FundraisingCampaign.updateOne( + { _id: pledge.campaign?.toString() }, + { $pull: { pledges: args.id } }, + ); + + // Remove the pledge. + await FundraisingCampaignPledge.deleteOne({ + _id: args.id, + }); + return pledge as InterfaceFundraisingCampaignPledges; + }; diff --git a/src/resolvers/Mutation/removeGroupChat.ts b/src/resolvers/Mutation/removeGroupChat.ts new file mode 100644 index 0000000000..7509d3fa20 --- /dev/null +++ b/src/resolvers/Mutation/removeGroupChat.ts @@ -0,0 +1,80 @@ +import { adminCheck } from "../../utilities"; +import { + CHAT_NOT_FOUND_ERROR, + ORGANIZATION_NOT_FOUND_ERROR, +} from "../../constants"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; +import { errors, requestContext } from "../../libraries"; +import { GroupChat, GroupChatMessage, Organization } from "../../models"; +import { cacheOrganizations } from "../../services/OrganizationCache/cacheOrganizations"; +import { findOrganizationsInCache } from "../../services/OrganizationCache/findOrganizationsInCache"; +/** + * This function enables to remove an graoup chat. + * @param _parent - parent of current request + * @param args - payload provided with the request + * @param context - context of entire application + * @remarks The following checks are done: + * 1. If the group chat exists + * 2. If the organization exists + * 3. If the user is an admin of the organization. + * @returns Deleted group chat. + */ +export const removeGroupChat: MutationResolvers["removeGroupChat"] = async ( + _parent, + args, + context, +) => { + const groupChat = await GroupChat.findOne({ + _id: args.chatId, + }).lean(); + + // Checks if a groupChat with _id === args.chatId exists. + if (!groupChat) { + throw new errors.NotFoundError( + requestContext.translate(CHAT_NOT_FOUND_ERROR.MESSAGE), + CHAT_NOT_FOUND_ERROR.CODE, + CHAT_NOT_FOUND_ERROR.PARAM, + ); + } + + let organization; + + const organizationFoundInCache = await findOrganizationsInCache([ + groupChat.organization, + ]); + + organization = organizationFoundInCache[0]; + + if (organizationFoundInCache.includes(null)) { + organization = await Organization.findOne({ + _id: groupChat.organization, + }).lean(); + if (organization) await cacheOrganizations([organization]); + } + + // Checks if an organization with _id === groupChat.organization exists. + if (!organization) { + throw new errors.NotFoundError( + requestContext.translate(ORGANIZATION_NOT_FOUND_ERROR.MESSAGE), + ORGANIZATION_NOT_FOUND_ERROR.CODE, + ORGANIZATION_NOT_FOUND_ERROR.PARAM, + ); + } + + // Checks whether current user making the request is an admin of organization. + await adminCheck(context.userId, organization); + + // Delete all groupChatMessages that have their ids stored in messages list of groupChat + await GroupChatMessage.deleteMany({ + _id: { + $in: groupChat.messages, + }, + }); + + // Delete the groupChat + await GroupChat.deleteOne({ + _id: groupChat._id, + }); + + return groupChat; +}; diff --git a/src/resolvers/Mutation/removeMember.ts b/src/resolvers/Mutation/removeMember.ts new file mode 100644 index 0000000000..997ef17cc2 --- /dev/null +++ b/src/resolvers/Mutation/removeMember.ts @@ -0,0 +1,168 @@ +import mongoose from "mongoose"; +import { + ADMIN_REMOVING_ADMIN, + ADMIN_REMOVING_CREATOR, + MEMBER_NOT_FOUND_ERROR, + ORGANIZATION_NOT_FOUND_ERROR, + USER_NOT_FOUND_ERROR, + USER_REMOVING_SELF, +} from "../../constants"; +import { errors, requestContext } from "../../libraries"; +import type { InterfaceOrganization } from "../../models"; +import { Organization, User } from "../../models"; +import { cacheOrganizations } from "../../services/OrganizationCache/cacheOrganizations"; +import { findOrganizationsInCache } from "../../services/OrganizationCache/findOrganizationsInCache"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; +import { adminCheck } from "../../utilities"; +/** + * This function enables to remove a member. + * @param _parent - parent of current request + * @param args - payload provided with the request + * @param context - context of entire application + * @remarks The following checks are done: + * 1. If the organization exists + * 2. If the user to be removed exists. + * 3. If the user is the admin of the organization. + * 4. If the user to be removed is a member of the organization. + * @returns Organization. + */ +export const removeMember: MutationResolvers["removeMember"] = async ( + _parent, + args, + context, +) => { + let organization: InterfaceOrganization; + + const organizationFoundInCache = await findOrganizationsInCache([ + args.data.organizationId, + ]); + + if (organizationFoundInCache[0] == null) { + organization = (await Organization.findOne({ + _id: args.data.organizationId, + }).lean()) as InterfaceOrganization; + if (organization) await cacheOrganizations([organization]); + } else { + organization = organizationFoundInCache[0]; + } + + // Checks if organization exists. + if (!organization) { + throw new errors.NotFoundError( + requestContext.translate(ORGANIZATION_NOT_FOUND_ERROR.MESSAGE), + ORGANIZATION_NOT_FOUND_ERROR.CODE, + ORGANIZATION_NOT_FOUND_ERROR.PARAM, + ); + } + + const currentUser = await User.findOne({ + _id: context.userId, + }); + + // Checks whether current user making the request is an admin of organization. + await adminCheck(context.userId, organization); + + const user = await User.findOne({ + _id: args.data.userId, + }).lean(); + + // Checks whether curent user exists + if (!user) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + + const userIsOrganizationMember = organization?.members.some((member) => + new mongoose.Types.ObjectId(member.toString()).equals(user._id), + ); + + if (!userIsOrganizationMember) { + throw new errors.NotFoundError( + requestContext.translate(MEMBER_NOT_FOUND_ERROR.MESSAGE), + MEMBER_NOT_FOUND_ERROR.CODE, + MEMBER_NOT_FOUND_ERROR.PARAM, + ); + } + + // Check if the current user is removing self + if (user._id.equals(currentUser?._id)) { + throw new errors.ConflictError( + requestContext.translate(USER_REMOVING_SELF.MESSAGE), + USER_REMOVING_SELF.CODE, + USER_REMOVING_SELF.PARAM, + ); + } + + const userIsOrganizationAdmin = organization?.admins.some((admin) => + new mongoose.Types.ObjectId(admin.toString()).equals(user._id), + ); + + /* + userIsOrganizationAdmin being true implies that the current user is an admin of organization. + If userIsOrganizationAdmin is true pushes error message to errors list and breaks out of loop. + */ + if (userIsOrganizationAdmin === true) { + throw new errors.ConflictError( + requestContext.translate(ADMIN_REMOVING_ADMIN.MESSAGE), + ADMIN_REMOVING_ADMIN.CODE, + ADMIN_REMOVING_ADMIN.PARAM, + ); + } + + /* + Administrators cannot remove creator of organzation from the members list. + Following if block matches organization's creator's id to + user's id. Match being true implies that current user is the creator + of organization. If match is true assigns error message to errors list + and breaks out of loop. + */ + if ( + new mongoose.Types.ObjectId(organization?.creatorId.toString()).equals( + user._id, + ) + ) { + throw new errors.UnauthorizedError( + requestContext.translate(ADMIN_REMOVING_CREATOR.MESSAGE), + ADMIN_REMOVING_CREATOR.CODE, + ADMIN_REMOVING_CREATOR.PARAM, + ); + } + + // Removes user's id from members list on organization. + organization = (await Organization.findOneAndUpdate( + { + _id: organization?._id, + }, + { + $set: { + members: organization?.members.filter( + (member) => member.toString() !== user._id.toString(), + ), + }, + }, + { + new: true, + }, + ).lean()) as InterfaceOrganization; + if (organization) await cacheOrganizations([organization]); + + // Remove organization's id from joinedOrganizations list on user. + await User.updateOne( + { + _id: user._id, + }, + { + $set: { + joinedOrganizations: user.joinedOrganizations.filter( + (joinedOrganization) => + joinedOrganization.toString() !== organization?._id.toString(), + ), + }, + }, + ); + + return organization ?? ({} as InterfaceOrganization); +}; diff --git a/src/resolvers/Mutation/removeOrganization.ts b/src/resolvers/Mutation/removeOrganization.ts new file mode 100644 index 0000000000..cbe4e298cc --- /dev/null +++ b/src/resolvers/Mutation/removeOrganization.ts @@ -0,0 +1,233 @@ +import { + ORGANIZATION_NOT_FOUND_ERROR, + USER_NOT_AUTHORIZED_ERROR, + USER_NOT_FOUND_ERROR, +} from "../../constants"; +import { errors, requestContext } from "../../libraries"; +import type { InterfaceAppUserProfile, InterfaceUser } from "../../models"; +import { + ActionItem, + ActionItemCategory, + AppUserProfile, + Comment, + Fund, + MembershipRequest, + Organization, + Post, + User, +} from "../../models"; +import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; +import { deleteAppUserFromCache } from "../../services/AppUserProfileCache/deleteAppUserFromCache"; +import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; + +import { cacheOrganizations } from "../../services/OrganizationCache/cacheOrganizations"; +import { deleteOrganizationFromCache } from "../../services/OrganizationCache/deleteOrganizationFromCache"; +import { findOrganizationsInCache } from "../../services/OrganizationCache/findOrganizationsInCache"; +import { cacheUsers } from "../../services/UserCache/cacheUser"; +import { deleteUserFromCache } from "../../services/UserCache/deleteUserFromCache"; +import { findUserInCache } from "../../services/UserCache/findUserInCache"; + +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; +import { superAdminCheck } from "../../utilities"; +import { deletePreviousImage as deleteImage } from "../../utilities/encodedImageStorage/deletePreviousImage"; +/** + * This function enables to remove an organization. + * @param _parent - parent of current request + * @param args - payload provided with the request + * @param context - context of entire application + * @remarks The following checks are done: + * 1. If the user exists. + * 2. If the organization exists + * 3. If the user is the creator of the organization. + * 4. If the user has appUserProfile. + * @returns Updated user. + */ +export const removeOrganization: MutationResolvers["removeOrganization"] = + async (_parent, args, context) => { + let currentUser: InterfaceUser | null; + const userFoundInCache = await findUserInCache([context.userId]); + currentUser = userFoundInCache[0]; + if (currentUser === null) { + currentUser = await User.findOne({ + _id: context.userId, + }).lean(); + if (currentUser !== null) { + await cacheUsers([currentUser]); + } + } + + // Checks whether currentUser exists. + if (!currentUser) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + let currentUserAppProfile: InterfaceAppUserProfile | null; + const appUserProfileFoundInCache = await findAppUserProfileCache([ + currentUser.appUserProfileId?.toString(), + ]); + currentUserAppProfile = appUserProfileFoundInCache[0]; + if (currentUserAppProfile === null) { + currentUserAppProfile = await AppUserProfile.findOne({ + userId: currentUser._id, + }).lean(); + if (currentUserAppProfile !== null) { + await cacheAppUserProfile([currentUserAppProfile]); + } + } + + if (!currentUserAppProfile) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + + let organization; + + const organizationFoundInCache = await findOrganizationsInCache([args.id]); + + organization = organizationFoundInCache[0]; + + if (organizationFoundInCache[0] == null) { + organization = await Organization.findOne({ + _id: args.id, + }).lean(); + if (organization != null) { + await cacheOrganizations([organization]); + } + } + + // Checks whether organization exists. + if (!organization) { + throw new errors.NotFoundError( + requestContext.translate(ORGANIZATION_NOT_FOUND_ERROR.MESSAGE), + ORGANIZATION_NOT_FOUND_ERROR.CODE, + ORGANIZATION_NOT_FOUND_ERROR.PARAM, + ); + } + // Checks whether currentUser is a SUPERADMIN + superAdminCheck(currentUserAppProfile as InterfaceAppUserProfile); + + // Remove each post and comments associated to it for organization.posts list. + await Post.deleteMany({ _id: { $in: organization.posts } }); + await Comment.deleteMany({ postId: { $in: organization.posts } }); + + // Remove organization._id from createdOrganizations list of currentUserAppProfile*. + await AppUserProfile.updateOne( + { + _id: currentUserAppProfile._id, + }, + { + $pull: { + createdOrganizations: organization._id, + }, + }, + ); + + // Remove organization._id from each member's joinedOrganizations field for organization.members list. + await User.updateMany( + { _id: { $in: organization.members } }, + { $pull: { joinedOrganizations: organization._id } }, + ); + + // Remove organization._id from each admin's joinedOrganizations field for organization.admins list. + await User.updateMany( + { _id: { $in: organization.admins } }, + { $pull: { joinedOrganizations: organization._id } }, + ); + + /* + Remove membershipRequest._id from each requester's membershipRequests + field for membershipRequest.user for organization.membershipRequests list. + */ + const membershipRequests = await MembershipRequest.find({ + _id: { $in: organization.membershipRequests }, + }); + + await MembershipRequest.deleteMany({ + _id: { $in: organization.membershipRequests }, + }); + + await User.updateMany( + { _id: { $in: membershipRequests.map((r) => r.user._id) } }, + { + $pull: { + membershipRequests: { $in: organization.membershipRequests }, + }, + }, + ); + + /* + Remove organization._id from each blockedUser's organizationsBlockedBy + field for organization.blockedUsers list. + */ + await User.updateMany( + { _id: { $in: organization.blockedUsers } }, + { $pull: { organizationsBlockedBy: organization._id } }, + ); + + // Get the ids of all ActionItemCategories associated with the organization + const actionItemCategories = await ActionItemCategory.find({ + organizationId: organization?._id, + }); + const actionItemCategoriesIds = actionItemCategories.map( + (category) => category._id, + ); + + // Remove all ActionItemCategory documents whose id is in the actionItemCategories array + await ActionItemCategory.deleteMany({ + _id: { $in: actionItemCategoriesIds }, + }); + + // Remove all ActionItem documents whose actionItemCategory is in the actionItemCategories array + await ActionItem.deleteMany({ + actionItemCategory: { $in: actionItemCategoriesIds }, + }); + //Remove all the funds specific to organization + await Fund.deleteMany({ + _id: { $in: organization.funds }, + }); + // Deletes the organzation. + await Organization.deleteOne({ + _id: organization._id, + }); + + await deleteOrganizationFromCache(organization); + + if (organization?.image) { + await deleteImage(organization?.image); + } + const updatedUser: InterfaceUser = (await User.findOne({ + _id: currentUser._id, + }) + .select(["-password"]) + .lean()) as InterfaceUser; + const updatedAppUserProfile: InterfaceAppUserProfile = + (await AppUserProfile.findOne({ + userId: currentUser._id, + }) + .populate("createdOrganizations") + .populate("createdEvents") + .populate("eventAdmin") + .populate("adminFor") + .lean()) as InterfaceAppUserProfile; + + if (updatedUser) { + await deleteUserFromCache(updatedUser._id.toString()); + await cacheUsers([updatedUser]); + } + if (updatedAppUserProfile) { + await deleteAppUserFromCache(updatedAppUserProfile._id.toString()); + await cacheAppUserProfile([updatedAppUserProfile]); + } + + // Returns updated currentUser. + return { + user: updatedUser, + appUserProfile: updatedAppUserProfile, + }; + }; diff --git a/src/resolvers/Mutation/removeOrganizationCustomField.ts b/src/resolvers/Mutation/removeOrganizationCustomField.ts new file mode 100644 index 0000000000..6d17ec8608 --- /dev/null +++ b/src/resolvers/Mutation/removeOrganizationCustomField.ts @@ -0,0 +1,125 @@ +import { Types } from "mongoose"; +import { + CUSTOM_FIELD_NOT_FOUND, + ORGANIZATION_NOT_FOUND_ERROR, + USER_NOT_AUTHORIZED_ERROR, + USER_NOT_FOUND_ERROR, +} from "../../constants"; +import { errors, requestContext } from "../../libraries"; +import type { InterfaceAppUserProfile, InterfaceUser } from "../../models"; +import { + AppUserProfile, + Organization, + OrganizationCustomField, + User, +} from "../../models"; +import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; +import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; +import { cacheUsers } from "../../services/UserCache/cacheUser"; +import { findUserInCache } from "../../services/UserCache/findUserInCache"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; + +/** + * This function enables an admin to remove an organization colleciton field. + * @param _parent - parent of current request + * @param args - payload provided with the request + * @param context - context of entire application + * @remarks The following checks are done: + * 1. If the user exists + * 2. If the organization exists. + * 3. If the user is an admin for the organization. + * 4. If the custom field to be removed exists + * 5. If the user has appUserProfile + * @returns Deleted Organization Custom Field. + */ + +export const removeOrganizationCustomField: MutationResolvers["removeOrganizationCustomField"] = + async (_parent, args, context) => { + const { organizationId, customFieldId } = args; + + let currentUser: InterfaceUser | null; + const userFoundInCache = await findUserInCache([context.userId]); + currentUser = userFoundInCache[0]; + if (currentUser === null) { + currentUser = await User.findOne({ + _id: context.userId, + }).lean(); + if (currentUser !== null) { + await cacheUsers([currentUser]); + } + } + + if (!currentUser) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + let currentUserAppProfile: InterfaceAppUserProfile | null; + const appUserProfileFoundInCache = await findAppUserProfileCache([ + currentUser.appUserProfileId?.toString(), + ]); + currentUserAppProfile = appUserProfileFoundInCache[0]; + if (currentUserAppProfile === null) { + currentUserAppProfile = await AppUserProfile.findOne({ + userId: currentUser._id, + }).lean(); + if (currentUserAppProfile !== null) { + await cacheAppUserProfile([currentUserAppProfile]); + } + } + if (!currentUserAppProfile) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + + const organization = await Organization.findOne({ + _id: organizationId, + }); + + if (!organization) { + throw new errors.NotFoundError( + requestContext.translate(ORGANIZATION_NOT_FOUND_ERROR.MESSAGE), + ORGANIZATION_NOT_FOUND_ERROR.CODE, + ORGANIZATION_NOT_FOUND_ERROR.PARAM, + ); + } + + const currentUserIsOrganizationAdmin = currentUserAppProfile.adminFor.some( + (orgId) => + orgId && new Types.ObjectId(orgId.toString()).equals(organization._id), + ); + + if ( + !(currentUserIsOrganizationAdmin || currentUserAppProfile.isSuperAdmin) + ) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + + organization.customFields = organization.customFields.filter( + (field) => !field.equals(customFieldId), + ); + + await organization.save(); + + const removedCustomField = + await OrganizationCustomField.findByIdAndDelete(customFieldId); + + if (!removedCustomField) { + throw new errors.UnauthorizedError( + requestContext.translate(CUSTOM_FIELD_NOT_FOUND.MESSAGE), + CUSTOM_FIELD_NOT_FOUND.CODE, + CUSTOM_FIELD_NOT_FOUND.PARAM, + ); + } + + return removedCustomField; + }; diff --git a/src/resolvers/Mutation/removeOrganizationImage.ts b/src/resolvers/Mutation/removeOrganizationImage.ts new file mode 100644 index 0000000000..2add9245cc --- /dev/null +++ b/src/resolvers/Mutation/removeOrganizationImage.ts @@ -0,0 +1,83 @@ +import { + ORGANIZATION_IMAGE_NOT_FOUND_ERROR, + ORGANIZATION_NOT_FOUND_ERROR, +} from "../../constants"; +import { errors, requestContext } from "../../libraries"; +import type { InterfaceOrganization } from "../../models"; +import { Organization } from "../../models"; +import { cacheOrganizations } from "../../services/OrganizationCache/cacheOrganizations"; +import { findOrganizationsInCache } from "../../services/OrganizationCache/findOrganizationsInCache"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; +import { adminCheck, deleteImage } from "../../utilities"; +/** + * This function enables to remove an organization's image. + * @param _parent - parent of current request + * @param args - payload provided with the request + * @param context - context of entire application + * @remarks The following checks are done: + * 1. If the user exists. + * 2. If the organization exists + * 3. If the user is the admin of the organization. + * @returns Updated Organization. + */ +export const removeOrganizationImage: MutationResolvers["removeOrganizationImage"] = + async (_parent, args, context) => { + let organization; + + const organizationFoundInCache = await findOrganizationsInCache([ + args.organizationId, + ]); + + organization = organizationFoundInCache[0]; + + if (organizationFoundInCache[0] == null) { + organization = await Organization.findOne({ + _id: args.organizationId, + }).lean(); + if (organization) await cacheOrganizations([organization]); + } + + // Checks whether organization exists. + if (!organization) { + throw new errors.NotFoundError( + requestContext.translate(ORGANIZATION_NOT_FOUND_ERROR.MESSAGE), + ORGANIZATION_NOT_FOUND_ERROR.CODE, + ORGANIZATION_NOT_FOUND_ERROR.PARAM, + ); + } + + // Checks whether currentUser with _id === context.userId is an admin of organization + await adminCheck(context.userId, organization); + + // Checks whether organization.image exists. + if (!organization.image) { + throw new errors.NotFoundError( + requestContext.translate(ORGANIZATION_IMAGE_NOT_FOUND_ERROR.MESSAGE), + ORGANIZATION_IMAGE_NOT_FOUND_ERROR.CODE, + ORGANIZATION_IMAGE_NOT_FOUND_ERROR.PARAM, + ); + } + + await deleteImage(organization.image); + + // Sets image field of organization to null and returns the updated organization. + const updatedOrganization = await Organization.findOneAndUpdate( + { + _id: organization._id, + }, + { + $set: { + image: null, + }, + }, + { + new: true, + }, + ).lean(); + + if (updatedOrganization !== null) { + await cacheOrganizations([updatedOrganization]); + } + + return updatedOrganization as InterfaceOrganization; + }; diff --git a/src/resolvers/Mutation/removePost.ts b/src/resolvers/Mutation/removePost.ts new file mode 100644 index 0000000000..96669acd6d --- /dev/null +++ b/src/resolvers/Mutation/removePost.ts @@ -0,0 +1,163 @@ +import { Types } from "mongoose"; +import { + POST_NOT_FOUND_ERROR, + USER_NOT_AUTHORIZED_ERROR, + USER_NOT_FOUND_ERROR, +} from "../../constants"; +import { errors, requestContext } from "../../libraries"; +import type { + InterfaceAppUserProfile, + InterfacePost, + InterfaceUser, +} from "../../models"; +import { AppUserProfile, Organization, Post, User } from "../../models"; +import { cacheOrganizations } from "../../services/OrganizationCache/cacheOrganizations"; +import { cachePosts } from "../../services/PostCache/cachePosts"; +import { deletePostFromCache } from "../../services/PostCache/deletePostFromCache"; +import { findPostsInCache } from "../../services/PostCache/findPostsInCache"; +import { cacheUsers } from "../../services/UserCache/cacheUser"; +import { findUserInCache } from "../../services/UserCache/findUserInCache"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; +import { deletePreviousImage as deleteImage } from "../../utilities/encodedImageStorage/deletePreviousImage"; +import { deletePreviousVideo as deleteVideo } from "../../utilities/encodedVideoStorage/deletePreviousVideo"; +import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; +import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; +/** + * This function enables to remove a post. + * @param _parent - parent of current request + * @param args - payload provided with the request + * @param context - context of entire application + * @remarks The following checks are done: + * 1. If the user exists. + * 2. If the post exists + * 3. If the user is the creator of the post. + * 4. If the user to be removed is a member of the organization. + * 5. If the user has appUserProfile. + * @returns Deleted Post. + */ +export const removePost: MutationResolvers["removePost"] = async ( + _parent, + args, + context, +) => { + // Get the currentUser with _id === context.userId exists. + let currentUser: InterfaceUser | null; + const userFoundInCache = await findUserInCache([context.userId]); + currentUser = userFoundInCache[0]; + if (currentUser === null) { + currentUser = await User.findOne({ + _id: context.userId, + }).lean(); + if (currentUser !== null) { + await cacheUsers([currentUser]); + } + } + + // Get the currentUser with _id === context.userId exists. + if (!currentUser) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + let currentUserAppProfile: InterfaceAppUserProfile | null; + const appUserProfileFoundInCache = await findAppUserProfileCache([ + currentUser.appUserProfileId?.toString(), + ]); + currentUserAppProfile = appUserProfileFoundInCache[0]; + if (currentUserAppProfile === null) { + currentUserAppProfile = await AppUserProfile.findOne({ + userId: currentUser._id, + }).lean(); + if (currentUserAppProfile !== null) { + await cacheAppUserProfile([currentUserAppProfile]); + } + } + if (!currentUserAppProfile) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + + let post: InterfacePost | null; + + const postFoundInCache = await findPostsInCache([args.id]); + + post = postFoundInCache[0]; + + if (postFoundInCache[0] === null) { + post = await Post.findOne({ + _id: args.id, + }).lean(); + if (post !== null) { + await cachePosts([post]); + } + } + + // Checks whether post exists. + if (!post) { + throw new errors.NotFoundError( + requestContext.translate(POST_NOT_FOUND_ERROR.MESSAGE), + POST_NOT_FOUND_ERROR.CODE, + POST_NOT_FOUND_ERROR.PARAM, + ); + } + + // Checks whether currentUser is allowed to delete the post or not. + const isCreator = post.creatorId.equals(context.userId); + const isSuperAdmin = currentUserAppProfile.isSuperAdmin; + const isAdminOfPostOrganization = currentUserAppProfile?.adminFor.some( + (orgID) => + orgID && new Types.ObjectId(orgID?.toString()).equals(post?.organization), + ); + + if (!isCreator && !isSuperAdmin && !isAdminOfPostOrganization) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + + // Deletes the post. + const deletedPost = await Post.findOneAndDelete({ + _id: args.id, + }); + + await deletePostFromCache(args.id); + + //deletes the image in post + if (deletedPost?.imageUrl) { + await deleteImage(deletedPost?.imageUrl); + } + + //deletes the video in post + if (deletedPost?.videoUrl) { + await deleteVideo(deletedPost?.videoUrl); + } + + // Removes the post from the organization, doesn't fail if the post wasn't pinned + const updatedOrganization = await Organization.findOneAndUpdate( + { + _id: post.organization, + }, + { + $pull: { + pinnedPosts: args.id, + }, + }, + { + new: true, + }, + ).lean(); + + if (updatedOrganization !== null) { + await cacheOrganizations([updatedOrganization]); + } + + // Returns deleted post. + return post; +}; diff --git a/src/resolvers/Mutation/removeSampleOrganization.ts b/src/resolvers/Mutation/removeSampleOrganization.ts new file mode 100644 index 0000000000..34421cb8a7 --- /dev/null +++ b/src/resolvers/Mutation/removeSampleOrganization.ts @@ -0,0 +1,124 @@ +import { Types } from "mongoose"; +import { + ORGANIZATION_NOT_FOUND_ERROR, + USER_NOT_AUTHORIZED_ERROR, + USER_NOT_FOUND_ERROR, +} from "../../constants"; +import { errors, requestContext } from "../../libraries"; +import type { InterfaceAppUserProfile, InterfaceUser } from "../../models"; +import { AppUserProfile, SampleData, User } from "../../models"; +import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; +import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; +import { cacheUsers } from "../../services/UserCache/cacheUser"; +import { findUserInCache } from "../../services/UserCache/findUserInCache"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; +import { removeSampleOrganization as removeSampleOrgUtil } from "../../utilities/removeSampleOrganizationUtil"; + +/** + * Removes a sample organization from the system. + * + * This function allows the deletion of a sample organization by checking the current user's authorization and the existence of the organization. + * The function first verifies whether the user making the request is authorized by checking if they are either a super admin or an admin of the organization. + * If the user is authorized and the organization exists, the organization is removed from the system. + * + * @param _parent - This is an unused parameter representing the parent resolver in the GraphQL schema. It can be ignored. + * @param _args - The arguments passed to the GraphQL mutation, which are not used in this function. + * @param _context - Provides contextual information, including the current user's ID. This is used to authenticate and authorize the request. + * + * @returns A boolean value indicating whether the operation was successful. + * + */ +export const removeSampleOrganization: MutationResolvers["removeSampleOrganization"] = + async (_parent, _args, _context) => { + // Tries to find the current user in the cache using the user's ID from the context. + let currentUser: InterfaceUser | null; + const userFoundInCache = await findUserInCache([_context.userId]); + currentUser = userFoundInCache[0]; + + // If the user is not found in the cache, tries to find them in the database. + if (currentUser === null) { + currentUser = await User.findOne({ + _id: _context.userId, + }).lean(); + + // If the user is found in the database, they are cached for future requests. + if (currentUser !== null) { + await cacheUsers([currentUser]); + } + } + + // If the user is still not found, throws an error indicating the user does not exist. + if (!currentUser) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + + // Tries to find the current user's app profile in the cache. + let currentUserAppProfile: InterfaceAppUserProfile | null; + const appUserProfileFoundInCache = await findAppUserProfileCache([ + currentUser.appUserProfileId?.toString(), + ]); + currentUserAppProfile = appUserProfileFoundInCache[0]; + + // If the app profile is not found in the cache, tries to find it in the database. + if (currentUserAppProfile === null) { + currentUserAppProfile = await AppUserProfile.findOne({ + userId: currentUser._id, + }).lean(); + + // If the profile is found in the database, it is cached for future requests. + if (currentUserAppProfile !== null) { + await cacheAppUserProfile([currentUserAppProfile]); + } + } + + // If the user's app profile is not found, throws an error indicating the user is unauthorized. + if (!currentUserAppProfile) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + + // Tries to find the existing organization in the sample data. + const existingOrganization = await SampleData.findOne({ + collectionName: "Organization", + }); + + // If the organization is not found, throws an error indicating the organization does not exist. + if (!existingOrganization) { + throw new errors.NotFoundError( + requestContext.translate(ORGANIZATION_NOT_FOUND_ERROR.MESSAGE), + ORGANIZATION_NOT_FOUND_ERROR.CODE, + ORGANIZATION_NOT_FOUND_ERROR.PARAM, + ); + } + + // Checks if the current user is an admin for the organization or a super admin. + const currentUserOrgAdmin = currentUserAppProfile.adminFor.some( + (org) => + org && + new Types.ObjectId(org.toString()).equals( + existingOrganization.documentId, + ), + ); + + // If the user is not an organization admin or a super admin, throws an error indicating they are unauthorized. + if (!currentUserAppProfile.isSuperAdmin && !currentUserOrgAdmin) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + + // Calls the utility function to remove the sample organization. + await removeSampleOrgUtil(); + + // Returns true if the organization was successfully removed. + return true; + }; diff --git a/src/resolvers/Mutation/removeUserCustomData.ts b/src/resolvers/Mutation/removeUserCustomData.ts new file mode 100644 index 0000000000..c17328416c --- /dev/null +++ b/src/resolvers/Mutation/removeUserCustomData.ts @@ -0,0 +1,136 @@ +import { Types } from "mongoose"; +import { + CUSTOM_DATA_NOT_FOUND, + ORGANIZATION_NOT_FOUND_ERROR, + USER_NOT_AUTHORIZED_ERROR, + USER_NOT_FOUND_ERROR, +} from "../../constants"; +import { errors, requestContext } from "../../libraries"; +import type { InterfaceAppUserProfile, InterfaceUser } from "../../models"; +import { AppUserProfile, Organization, User } from "../../models"; +import { UserCustomData } from "../../models/UserCustomData"; +import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; +import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; +import { cacheUsers } from "../../services/UserCache/cacheUser"; +import { findUserInCache } from "../../services/UserCache/findUserInCache"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; + +/** + * Removes custom data associated with the current user within a specified organization. + * + * This function allows an authorized user, such as an organization admin or super admin, to remove custom data associated with the user within a specific organization. The function first verifies the user's identity and authorization, then proceeds to delete the custom data if it exists. + * + * @param _parent - This parameter represents the parent resolver in the GraphQL schema and is not used in this function. + * @param args - The arguments passed to the GraphQL mutation, including the `organizationId` for which the custom data should be removed. + * @param context - Provides contextual information, including the current user's ID. This is used to authenticate and authorize the request. + * + * @returns The removed custom data object if the operation was successful. + * + */ +export const removeUserCustomData: MutationResolvers["removeUserCustomData"] = + async (_parent, args, context) => { + const { organizationId } = args; + + // Tries to find the current user in the cache using the user's ID from the context. + let currentUser: InterfaceUser | null; + const userFoundInCache = await findUserInCache([context.userId]); + currentUser = userFoundInCache[0]; + + // If the user is not found in the cache, tries to find them in the database. + if (currentUser === null) { + currentUser = await User.findOne({ + _id: context.userId, + }).lean(); + + // If the user is found in the database, they are cached for future requests. + if (currentUser !== null) { + await cacheUsers([currentUser]); + } + } + + // If the user is still not found, throws an error indicating the user does not exist. + if (!currentUser) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + + // Tries to find the current user's app profile in the cache. + let currentUserAppProfile: InterfaceAppUserProfile | null; + const appUserProfileFoundInCache = await findAppUserProfileCache([ + currentUser.appUserProfileId?.toString(), + ]); + currentUserAppProfile = appUserProfileFoundInCache[0]; + + // If the app profile is not found in the cache, tries to find it in the database. + if (currentUserAppProfile === null) { + currentUserAppProfile = await AppUserProfile.findOne({ + userId: currentUser._id, + }).lean(); + + // If the profile is found in the database, it is cached for future requests. + if (currentUserAppProfile !== null) { + await cacheAppUserProfile([currentUserAppProfile]); + } + } + + // If the user's app profile is not found, throws an error indicating the user is unauthorized. + if (!currentUserAppProfile) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + + // Tries to find the specified organization in the database. + const organization = await Organization.findOne({ + _id: organizationId, + }).lean(); + + // If the organization is not found, throws an error indicating the organization does not exist. + if (!organization) { + throw new errors.NotFoundError( + requestContext.translate(ORGANIZATION_NOT_FOUND_ERROR.MESSAGE), + ORGANIZATION_NOT_FOUND_ERROR.CODE, + ORGANIZATION_NOT_FOUND_ERROR.PARAM, + ); + } + + // Checks if the current user is an admin for the organization or a super admin. + const currentUserIsOrganizationAdmin = currentUserAppProfile.adminFor.some( + (orgId) => + orgId && new Types.ObjectId(orgId?.toString()).equals(organization._id), + ); + + // If the user is not an organization admin or a super admin, throws an error indicating they are unauthorized. + if ( + !(currentUserIsOrganizationAdmin || currentUserAppProfile.isSuperAdmin) + ) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + + // Tries to find and delete the user's custom data associated with the specified organization. + const userCustomData = await UserCustomData.findOneAndDelete({ + userId: context.userId, + organizationId, + }).lean(); + + // If the custom data is not found, throws an error indicating it does not exist. + if (!userCustomData) { + throw new errors.NotFoundError( + requestContext.translate(CUSTOM_DATA_NOT_FOUND.MESSAGE), + CUSTOM_DATA_NOT_FOUND.CODE, + CUSTOM_DATA_NOT_FOUND.PARAM, + ); + } + + // Returns the removed custom data. + return userCustomData; + }; diff --git a/src/resolvers/Mutation/removeUserFamily.ts b/src/resolvers/Mutation/removeUserFamily.ts new file mode 100644 index 0000000000..93ac3f7375 --- /dev/null +++ b/src/resolvers/Mutation/removeUserFamily.ts @@ -0,0 +1,94 @@ +import { + USER_FAMILY_NOT_FOUND_ERROR, + USER_NOT_FOUND_ERROR, +} from "../../constants"; +import { errors, requestContext } from "../../libraries"; +import { UserFamily } from "../../models/userFamily"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; + +import type { InterfaceAppUserProfile, InterfaceUser } from "../../models"; +import { AppUserProfile, User } from "../../models"; +import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; +import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; +import { cacheUsers } from "../../services/UserCache/cacheUser"; +import { findUserInCache } from "../../services/UserCache/findUserInCache"; +import { superAdminCheck } from "../../utilities"; +/** + * This function enables to remove a user family. + * @param _parent - parent of current request + * @param args - payload provided with the request + * @param context - context of entire application. + * @remarks - The following checks are done: + * 1. If the user family exists. + * 2. If the user is super admin. + * @returns Deleted user family. + */ +export const removeUserFamily: MutationResolvers["removeUserFamily"] = async ( + _parent, + args, + context, +) => { + const userFamily = await UserFamily.findOne({ + _id: args.familyId, + }).lean(); + + let currentUser: InterfaceUser | null; + const userFoundInCache = await findUserInCache([context.userId]); + currentUser = userFoundInCache[0]; + if (currentUser === null) { + currentUser = await User.findOne({ + _id: context.userId, + }).lean(); + if (currentUser !== null) { + await cacheUsers([currentUser]); + } + } + + // Checks whether currentUser exists. + if (!currentUser) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + + let currentUserAppProfile: InterfaceAppUserProfile | null; + const appUserProfileFoundInCache = await findAppUserProfileCache([ + currentUser.appUserProfileId?.toString(), + ]); + currentUserAppProfile = appUserProfileFoundInCache[0]; + if (currentUserAppProfile === null) { + currentUserAppProfile = await AppUserProfile.findOne({ + userId: currentUser._id, + }).lean(); + if (currentUserAppProfile !== null) { + await cacheAppUserProfile([currentUserAppProfile]); + } + } + if (!currentUserAppProfile) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + // Check whether the user is super admin. + superAdminCheck(currentUserAppProfile as InterfaceAppUserProfile); + + // Checks if a family with _id === args.familyId exists + if (!userFamily) { + throw new errors.NotFoundError( + requestContext.translate(USER_FAMILY_NOT_FOUND_ERROR.MESSAGE), + USER_FAMILY_NOT_FOUND_ERROR.CODE, + USER_FAMILY_NOT_FOUND_ERROR.PARAM, + ); + } + + // Deletes the UserFamily. + await UserFamily.deleteOne({ + _id: userFamily._id, + }); + + return userFamily; +}; diff --git a/src/resolvers/Mutation/removeUserFromGroupChat.ts b/src/resolvers/Mutation/removeUserFromGroupChat.ts new file mode 100644 index 0000000000..fea9d35e00 --- /dev/null +++ b/src/resolvers/Mutation/removeUserFromGroupChat.ts @@ -0,0 +1,96 @@ +import { + CHAT_NOT_FOUND_ERROR, + ORGANIZATION_NOT_FOUND_ERROR, + USER_NOT_AUTHORIZED_ERROR, +} from "../../constants"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; +import { errors, requestContext } from "../../libraries"; +import { GroupChat, Organization } from "../../models"; +import { adminCheck } from "../../utilities"; +import { cacheOrganizations } from "../../services/OrganizationCache/cacheOrganizations"; +import { findOrganizationsInCache } from "../../services/OrganizationCache/findOrganizationsInCache"; +import type { InterfaceGroupChat } from "../../models"; +/** + * This function enables to remove a user from group chat. + * @param _parent - parent of current request + * @param args - payload provided with the request + * @param context - context of entire application + * @remarks The following checks are done: + * 1. If the group chat exists. + * 2. If the organization exists + * 3. If the user is the admin of the organization. + * 4. If the user to be removed is a member of the organization. + * @returns Updated group chat. + */ +export const removeUserFromGroupChat: MutationResolvers["removeUserFromGroupChat"] = + async (_parent, args, context) => { + const groupChat = await GroupChat.findOne({ + _id: args.chatId, + }).lean(); + + // Checks whether groupChat exists. + if (!groupChat) { + throw new errors.NotFoundError( + requestContext.translate(CHAT_NOT_FOUND_ERROR.MESSAGE), + CHAT_NOT_FOUND_ERROR.CODE, + CHAT_NOT_FOUND_ERROR.PARAM, + ); + } + + let organization; + + const organizationFoundInCache = await findOrganizationsInCache([ + groupChat.organization, + ]); + + organization = organizationFoundInCache[0]; + + if (organizationFoundInCache[0] == null) { + organization = await Organization.findOne({ + _id: groupChat.organization, + }).lean(); + if (organization) await cacheOrganizations([organization]); + } + + // Checks whether organization exists. + if (!organization) { + throw new errors.NotFoundError( + requestContext.translate(ORGANIZATION_NOT_FOUND_ERROR.MESSAGE), + ORGANIZATION_NOT_FOUND_ERROR.CODE, + ORGANIZATION_NOT_FOUND_ERROR.PARAM, + ); + } + + // Checks whether currentUser with _id == context.userId is an admin of organzation. + await adminCheck(context.userId, organization); + + const userIsMemberOfGroupChat = groupChat.users.some((user) => + user.equals(args.userId), + ); + + // Checks if user with _id === args.userId is not a member of groupChat. + if (userIsMemberOfGroupChat === false) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + + // Removes args.userId from users list of groupChat and returns the updated groupChat. + return (await GroupChat.findOneAndUpdate( + { + _id: args.chatId, + }, + { + $set: { + users: groupChat.users.filter( + (user) => user.toString() !== args.userId.toString(), + ), + }, + }, + { + new: true, + }, + ).lean()) as InterfaceGroupChat; + }; diff --git a/src/resolvers/Mutation/removeUserFromUserFamily.ts b/src/resolvers/Mutation/removeUserFromUserFamily.ts new file mode 100644 index 0000000000..53e4111876 --- /dev/null +++ b/src/resolvers/Mutation/removeUserFromUserFamily.ts @@ -0,0 +1,140 @@ +import { + ADMIN_REMOVING_ADMIN, + ADMIN_REMOVING_CREATOR, + USER_FAMILY_NOT_FOUND_ERROR, + USER_NOT_FOUND_ERROR, + USER_REMOVING_SELF, +} from "../../constants"; +import { errors, requestContext } from "../../libraries"; +import type { InterfaceUser } from "../../models"; +import { User } from "../../models"; +import type { InterfaceUserFamily } from "../../models/userFamily"; +import { UserFamily } from "../../models/userFamily"; +import { cacheUsers } from "../../services/UserCache/cacheUser"; +import { findUserInCache } from "../../services/UserCache/findUserInCache"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; +import { adminCheck } from "../../utilities/userFamilyAdminCheck"; +import mongoose from "mongoose"; +/** + * This function enables to remove a user from group chat. + * @param _parent - parent of current request + * @param args - payload provided with the request + * @param context - context of entire publication + * @remarks The following checks are done: + * 1. If the family exists. + * 2. If the user to be removed is member of the organisation. + * 3. If the user is admin of the family + * @returns Updated group chat. + */ +export const removeUserFromUserFamily: MutationResolvers["removeUserFromUserFamily"] = + async (_parent, args, context) => { + const userFamily = await UserFamily.findById({ + _id: args.familyId, + }).lean(); + let currentUser: InterfaceUser | null; + const userFoundInCache = await findUserInCache([context.userId]); + currentUser = userFoundInCache[0]; + if (currentUser === null) { + currentUser = await User.findOne({ + _id: context.userId, + }).lean(); + if (currentUser !== null) { + await cacheUsers([currentUser]); + } + } + + const user = (await User.findById({ + _id: args.userId, + })) as InterfaceUserFamily; + + const userIsMemberOfUserFamily = userFamily?.users.some((member) => { + return new mongoose.Types.ObjectId(member.toString()).equals(user?._id); + }); + + const userIdUserFamilyAdmin = userFamily?.admins.some((admin) => { + new mongoose.Types.ObjectId(admin.toString()).equals(user?._id); + }); + //Check whether user family exists. + if (!userFamily) { + throw new errors.NotFoundError( + requestContext.translate(USER_FAMILY_NOT_FOUND_ERROR.MESSAGE), + USER_FAMILY_NOT_FOUND_ERROR.CODE, + USER_FAMILY_NOT_FOUND_ERROR.PARAM, + ); + } + + //check whether user is admin of the family. + if (currentUser && currentUser._id) { + const userId: string = currentUser._id.toString(); // Convert ObjectId to string + await adminCheck(userId, userFamily); + } else { + console.error("Invalid currentUser or missing _id."); + // Handle the case where currentUser is undefined or _id is missing + } + + //Check whether user is member of the family. + if (!userIsMemberOfUserFamily) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + + // Check if the current user is removing self + if (user._id.equals(currentUser?._id)) { + throw new errors.ConflictError( + requestContext.translate(USER_REMOVING_SELF.MESSAGE), + USER_REMOVING_SELF.CODE, + USER_REMOVING_SELF.PARAM, + ); + } + + /* + userIsUserFamilyAdmin being true implies that the current user is an admin of userFamily. + If userIsUserFamilyAdmin is true pushes error message to errors list and breaks out of loop. + */ + if (userIdUserFamilyAdmin) { + throw new errors.ConflictError( + requestContext.translate(ADMIN_REMOVING_ADMIN.MESSAGE), + ADMIN_REMOVING_ADMIN.CODE, + ADMIN_REMOVING_ADMIN.PARAM, + ); + } + + /* + Administrators cannot remove creator of userFamily from the members list. + Following if block matches userFamily's creator's id to + user's id. Match being true implies that current user is the creator + of userFamily. If match is true assigns error message to errors list + and breaks out of loop. + */ + if ( + new mongoose.Types.ObjectId(userFamily.creator.toString()).equals( + user._id, + ) + ) { + throw new errors.UnauthorizedError( + requestContext.translate(ADMIN_REMOVING_CREATOR.MESSAGE), + ADMIN_REMOVING_CREATOR.CODE, + ADMIN_REMOVING_CREATOR.PARAM, + ); + } + + //Removes args.userId from users list of user family ans return the updated family. + return (await UserFamily.findOneAndUpdate( + { + _id: args.familyId, + }, + { + $set: { + users: userFamily.users.filter( + (user) => user.toString() !== args.userId.toString(), + ), + }, + }, + { + new: true, + }, + ).lean()) as InterfaceUserFamily; + }; diff --git a/src/resolvers/Mutation/removeUserImage.ts b/src/resolvers/Mutation/removeUserImage.ts new file mode 100644 index 0000000000..4e92a2a3c0 --- /dev/null +++ b/src/resolvers/Mutation/removeUserImage.ts @@ -0,0 +1,74 @@ +import { + USER_NOT_FOUND_ERROR, + USER_PROFILE_IMAGE_NOT_FOUND_ERROR, +} from "../../constants"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; +import { errors, requestContext } from "../../libraries"; +import { User } from "../../models"; +import type { InterfaceUser } from "../../models"; +import { deleteImage } from "../../utilities"; +import { findUserInCache } from "../../services/UserCache/findUserInCache"; +import { cacheUsers } from "../../services/UserCache/cacheUser"; +/** + * This function enables to remove user image. + * @param _parent - parent of current request + * @param args - payload provided with the request + * @param context - context of entire application + * @remarks The following checks are done: + * 1. If the user exists. + * 2. If the image exists + * @returns Updated user. + */ +export const removeUserImage: MutationResolvers["removeUserImage"] = async ( + _parent, + _args, + context, +) => { + let currentUser: InterfaceUser | null; + const userFoundInCache = await findUserInCache([context.userId]); + currentUser = userFoundInCache[0]; + if (currentUser === null) { + currentUser = await User.findOne({ + _id: context.userId, + }).lean(); + if (currentUser !== null) { + await cacheUsers([currentUser]); + } + } + + // Checks whether currentUser exists. + if (!currentUser) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + + // Checks whether currentUser.image already doesn't exist. + console.log(currentUser.image); + if (!currentUser.image) { + throw new errors.NotFoundError( + requestContext.translate(USER_PROFILE_IMAGE_NOT_FOUND_ERROR.MESSAGE), + USER_PROFILE_IMAGE_NOT_FOUND_ERROR.MESSAGE, + USER_PROFILE_IMAGE_NOT_FOUND_ERROR.PARAM, + ); + } + + await deleteImage(currentUser.image); + + // Sets image field to null for currentUser and returns the updated currentUser. + return (await User.findOneAndUpdate( + { + _id: currentUser._id, + }, + { + $set: { + image: null, + }, + }, + { + new: true, + }, + ).lean()) as InterfaceUser; +}; diff --git a/src/resolvers/Mutation/removeUserTag.ts b/src/resolvers/Mutation/removeUserTag.ts new file mode 100644 index 0000000000..ab2a0645c8 --- /dev/null +++ b/src/resolvers/Mutation/removeUserTag.ts @@ -0,0 +1,157 @@ +import { Types } from "mongoose"; +import { + TAG_NOT_FOUND, + USER_NOT_AUTHORIZED_ERROR, + USER_NOT_FOUND_ERROR, +} from "../../constants"; +import { errors, requestContext } from "../../libraries"; +import type { InterfaceAppUserProfile, InterfaceUser } from "../../models"; +import { + AppUserProfile, + OrganizationTagUser, + TagUser, + User, +} from "../../models"; +import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; +import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; +import { cacheUsers } from "../../services/UserCache/cacheUser"; +import { findUserInCache } from "../../services/UserCache/findUserInCache"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; +/** + * Removes a user tag from an organization. + * + * This function removes a specific tag associated with a user in an organization. + * It checks whether the user has the proper authorization to delete the tag. + * It also handles cases where the user or the tag is not found in the system. + * + * The function performs the following steps: + * 1. Attempts to find the user in the cache or database. + * 2. Verifies if the user exists. + * 3. Attempts to find the user's profile in the cache or database. + * 4. Checks if the user has the necessary permissions to delete the tag. + * 5. Fetches the tag that needs to be deleted. + * 6. Retrieves all child tags (including the parent tag) related to the organization. + * 7. Deletes all related tags from the organization and user tag entries. + * + * @param _parent - This parameter is not used in this resolver function. + * @param args - The arguments provided by the GraphQL query, specifically containing the ID of the tag to be removed. + * @param context - The context of the request, containing information about the currently authenticated user. + * + * @returns The tag that was deleted. + */ + +export const removeUserTag: MutationResolvers["removeUserTag"] = async ( + _parent, + args, + context, +) => { + let currentUser: InterfaceUser | null; + const userFoundInCache = await findUserInCache([context.userId]); + currentUser = userFoundInCache[0]; + if (currentUser === null) { + currentUser = await User.findOne({ + _id: context.userId, + }).lean(); + if (currentUser !== null) { + await cacheUsers([currentUser]); + } + } + + // Checks whether currentUser exists. + if (!currentUser) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + let currentUserAppProfile: InterfaceAppUserProfile | null; + const appUserProfileFoundInCache = await findAppUserProfileCache([ + currentUser.appUserProfileId?.toString(), + ]); + currentUserAppProfile = appUserProfileFoundInCache[0]; + if (currentUserAppProfile === null) { + currentUserAppProfile = await AppUserProfile.findOne({ + userId: currentUser._id, + }).lean(); + if (currentUserAppProfile !== null) { + await cacheAppUserProfile([currentUserAppProfile]); + } + } + if (!currentUserAppProfile) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + + // Get the tag object + const tag = await OrganizationTagUser.findOne({ + _id: args.id, + }); + + if (!tag) { + throw new errors.NotFoundError( + requestContext.translate(TAG_NOT_FOUND.MESSAGE), + TAG_NOT_FOUND.CODE, + TAG_NOT_FOUND.PARAM, + ); + } + + // Boolean to determine whether user is an admin of organization of the tag + const currentUserIsOrganizationAdmin = currentUserAppProfile.adminFor.some( + (organization) => + organization && + new Types.ObjectId(organization.toString()).equals(tag.organizationId), + ); + + // Checks whether currentUser cannot delete the tag folder. + if (!currentUserAppProfile.isSuperAdmin && !currentUserIsOrganizationAdmin) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + + // Get all the child tags of the current tag (including itself) + // on the OrganizationTagUser model + // The following implementation makes number of queries = max depth of nesting in the tag provided + let allTagIds: string[] = []; + let currentParents = [tag._id.toString()]; + + while (currentParents.length) { + allTagIds = allTagIds.concat(currentParents); + const foundTags = await OrganizationTagUser.find( + { + organizationId: tag.organizationId, + parentTagId: { + $in: currentParents, + }, + }, + { + _id: 1, + }, + ); + currentParents = foundTags + .map((tag) => tag._id.toString()) + .filter((id: string | null) => id); + } + + // Delete all the tags + await OrganizationTagUser.deleteMany({ + _id: { + $in: allTagIds, + }, + }); + + // Delete all the tag entries in the TagUser model + await TagUser.deleteMany({ + tagId: { + $in: allTagIds, + }, + }); + + return tag; +}; diff --git a/src/resolvers/Mutation/resetCommunity.ts b/src/resolvers/Mutation/resetCommunity.ts new file mode 100644 index 0000000000..70cf329754 --- /dev/null +++ b/src/resolvers/Mutation/resetCommunity.ts @@ -0,0 +1,73 @@ +import { + USER_NOT_AUTHORIZED_ERROR, + USER_NOT_FOUND_ERROR, +} from "../../constants"; +import { errors, requestContext } from "../../libraries"; +import { AppUserProfile, Community, User } from "../../models"; +import type { InterfaceAppUserProfile, InterfaceUser } from "../../models"; +import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; +import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; +import { cacheUsers } from "../../services/UserCache/cacheUser"; +import { findUserInCache } from "../../services/UserCache/findUserInCache"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; +import { superAdminCheck } from "../../utilities"; + +/** + * This function enables to reset Pre login imagery. + * @param _parent - parent of current request + * @param args - payload provided with the request + * @param context - context of entire application + * @remarks The following checks are done: + * 1. If the user exists. + * 2. If the user is super admin. + * @returns Boolean. + */ +export const resetCommunity: MutationResolvers["resetCommunity"] = async ( + _parent, + _args, + context, +) => { + let user: InterfaceUser | null; + const userFoundInCache = await findUserInCache([context.userId]); + user = userFoundInCache[0]; + if (user === null) { + user = await User.findOne({ + _id: context.userId, + }).lean(); + if (user !== null) { + await cacheUsers([user]); + } + } + + if (!user) + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + let currentUserAppProfile: InterfaceAppUserProfile | null; + const appUserProfileFoundInCache = await findAppUserProfileCache([ + user.appUserProfileId?.toString(), + ]); + currentUserAppProfile = appUserProfileFoundInCache[0]; + if (currentUserAppProfile === null) { + currentUserAppProfile = await AppUserProfile.findOne({ + userId: user._id, + }).lean(); + if (currentUserAppProfile !== null) { + await cacheAppUserProfile([currentUserAppProfile]); + } + } + if (!currentUserAppProfile) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + superAdminCheck(currentUserAppProfile as InterfaceAppUserProfile); + + await Community.deleteMany(); + + return true; +}; diff --git a/src/resolvers/Mutation/revokeRefreshTokenForUser.ts b/src/resolvers/Mutation/revokeRefreshTokenForUser.ts new file mode 100644 index 0000000000..e1f5cfd6dd --- /dev/null +++ b/src/resolvers/Mutation/revokeRefreshTokenForUser.ts @@ -0,0 +1,21 @@ +import { AppUserProfile } from "../../models"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; +/** + * This function creates a refresh token for user. + * @param _parent - parent of current request + * @param args - payload provided with the request + * @returns True is operation successful. + */ +export const revokeRefreshTokenForUser: MutationResolvers["revokeRefreshTokenForUser"] = + async (_parent, args, context) => { + await AppUserProfile.updateOne( + { + userId: context.userId, + }, + { + $unset: { token: 1 }, + }, + ); + + return true; + }; diff --git a/src/resolvers/Mutation/saveFcmToken.ts b/src/resolvers/Mutation/saveFcmToken.ts new file mode 100644 index 0000000000..10586972f2 --- /dev/null +++ b/src/resolvers/Mutation/saveFcmToken.ts @@ -0,0 +1,29 @@ +import { AppUserProfile } from "../../models"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; +/** + * This function enables to save Fcm Token. + * @param _parent - parent of current request + * @param args - payload provided with the request + * @param context - context of entire application + * @remarks The following checks are done: + * 1. If the user exists. + * @returns True if operation is successful. + */ +export const saveFcmToken: MutationResolvers["saveFcmToken"] = async ( + _parent, + args, + context, +) => { + await AppUserProfile.updateOne( + { + userId: context.userId, + }, + { + $set: { + token: args.token, + }, + }, + ); + + return true; +}; diff --git a/src/resolvers/Mutation/sendMembershipRequest.ts b/src/resolvers/Mutation/sendMembershipRequest.ts new file mode 100644 index 0000000000..cd4e94767b --- /dev/null +++ b/src/resolvers/Mutation/sendMembershipRequest.ts @@ -0,0 +1,145 @@ +import { + MEMBERSHIP_REQUEST_ALREADY_EXISTS, + ORGANIZATION_NOT_FOUND_ERROR, + USER_NOT_FOUND_ERROR, + USER_NOT_AUTHORIZED_ERROR, + USER_ALREADY_MEMBER_ERROR, +} from "../../constants"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; +import { errors, requestContext } from "../../libraries"; +import { User, MembershipRequest, Organization } from "../../models"; +import { findOrganizationsInCache } from "../../services/OrganizationCache/findOrganizationsInCache"; +import { cacheOrganizations } from "../../services/OrganizationCache/cacheOrganizations"; +import mongoose from "mongoose"; +/** + * This function enables to send membership request. + * @param _parent - parent of current request + * @param args - payload provided with the request + * @param context - context of entire application + * @remarks The following checks are done: + * 1. If the organization exists + * 2. If the user exists. + * 3. If the membership request already exists. + * @returns Membership request. + */ +export const sendMembershipRequest: MutationResolvers["sendMembershipRequest"] = + async (_parent, args, context) => { + let organization; + + const organizationFoundInCache = await findOrganizationsInCache([ + args.organizationId, + ]); + + organization = organizationFoundInCache[0]; + + if (organizationFoundInCache[0] == null) { + organization = await Organization.findOne({ + _id: args.organizationId, + }).lean(); + + if (organization !== null) { + await cacheOrganizations([organization]); + } + } + + if (!organization) { + throw new errors.NotFoundError( + requestContext.translate(ORGANIZATION_NOT_FOUND_ERROR.MESSAGE), + ORGANIZATION_NOT_FOUND_ERROR.CODE, + ORGANIZATION_NOT_FOUND_ERROR.PARAM, + ); + } + + const userExists = await User.exists({ + _id: context.userId, + }); + + // Checks whether user exists. + if (!userExists) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + + // Checks if the user is already a member of the organization + const isMember = organization.members.some((member) => + new mongoose.Types.ObjectId(member.toString()).equals(context.userId), + ); + + if (isMember === true) { + throw new errors.ConflictError( + requestContext.translate(USER_ALREADY_MEMBER_ERROR.MESSAGE), + USER_ALREADY_MEMBER_ERROR.CODE, + USER_ALREADY_MEMBER_ERROR.PARAM, + ); + } + + // Checks if the user is blocked + const user = await User.findById(context.userId).lean(); + if ( + user !== null && + organization.blockedUsers.some((blockedUser) => + new mongoose.Types.ObjectId(blockedUser.toString()).equals(user._id), + ) + ) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + + // Checks if the membership request already exists + const membershipRequestExists = await MembershipRequest.exists({ + user: context.userId, + organization: organization._id, + }); + + if (membershipRequestExists) { + throw new errors.ConflictError( + requestContext.translate(MEMBERSHIP_REQUEST_ALREADY_EXISTS.MESSAGE), + MEMBERSHIP_REQUEST_ALREADY_EXISTS.CODE, + MEMBERSHIP_REQUEST_ALREADY_EXISTS.PARAM, + ); + } + + const createdMembershipRequest = await MembershipRequest.create({ + user: context.userId, + organization: organization._id, + }); + + // add membership request to organization + const updatedOrganization = await Organization.findOneAndUpdate( + { + _id: organization._id, + }, + { + $push: { + membershipRequests: createdMembershipRequest._id, + }, + }, + { + new: true, + }, + ).lean(); + + if (updatedOrganization !== null) { + await cacheOrganizations([updatedOrganization]); + } + + // add membership request to user + await User.updateOne( + { + _id: context.userId, + }, + { + $push: { + membershipRequests: createdMembershipRequest._id, + }, + }, + ); + + return createdMembershipRequest.toObject(); + }; diff --git a/src/resolvers/Mutation/sendMessageToDirectChat.ts b/src/resolvers/Mutation/sendMessageToDirectChat.ts new file mode 100644 index 0000000000..65cbf15f2b --- /dev/null +++ b/src/resolvers/Mutation/sendMessageToDirectChat.ts @@ -0,0 +1,71 @@ +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; +import { errors, requestContext } from "../../libraries"; +import { DirectChat, DirectChatMessage, User } from "../../models"; +import { CHAT_NOT_FOUND_ERROR, USER_NOT_FOUND_ERROR } from "../../constants"; +/** + * This function enables to send message to direct chat. + * @param _parent - parent of current request + * @param args - payload provided with the request + * @param context - context of entire application + * @remarks The following checks are done: + * 1. If the direct chat exists. + * 2. If the user exists + * @returns Direct chat message. + */ +export const sendMessageToDirectChat: MutationResolvers["sendMessageToDirectChat"] = + async (_parent, args, context) => { + const directChat = await DirectChat.findOne({ + _id: args.chatId, + }).lean(); + + if (!directChat) { + throw new errors.NotFoundError( + requestContext.translate(CHAT_NOT_FOUND_ERROR.MESSAGE), + CHAT_NOT_FOUND_ERROR.CODE, + CHAT_NOT_FOUND_ERROR.PARAM, + ); + } + + const currentUserExists = !!(await User.exists({ + _id: context.userId, + })); + + if (currentUserExists === false) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + + // directChat.users can only have 2 users. So, the following method works. + const receiverIndex = directChat.users.findIndex( + (user) => user.toString() !== context.userId.toString(), + ); + + const createdDirectChatMessage = await DirectChatMessage.create({ + directChatMessageBelongsTo: directChat._id, + sender: context.userId, + receiver: directChat.users[receiverIndex], + messageContent: args.messageContent, + }); + + // add createdDirectChatMessage to directChat + await DirectChat.updateOne( + { + _id: directChat._id, + }, + { + $push: { + messages: createdDirectChatMessage._id, + }, + }, + ); + + // calls subscription + context.pubsub.publish("MESSAGE_SENT_TO_DIRECT_CHAT", { + messageSentToDirectChat: createdDirectChatMessage.toObject(), + }); + + return createdDirectChatMessage.toObject(); + }; diff --git a/src/resolvers/Mutation/sendMessageToGroupChat.ts b/src/resolvers/Mutation/sendMessageToGroupChat.ts new file mode 100644 index 0000000000..93d9f7d5dd --- /dev/null +++ b/src/resolvers/Mutation/sendMessageToGroupChat.ts @@ -0,0 +1,87 @@ +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; +import { errors, requestContext } from "../../libraries"; +import { GroupChat, GroupChatMessage, User } from "../../models"; +import { + USER_NOT_AUTHORIZED_ERROR, + CHAT_NOT_FOUND_ERROR, + USER_NOT_FOUND_ERROR, +} from "../../constants"; +/** + * This function enables to send message to group chat. + * @param _parent - parent of current request + * @param args - payload provided with the request + * @param context - context of entire application + * @remarks The following checks are done: + * 1. If the group chat exists. + * 2. If the user exists + * 3. If the group chat contains the user. + * @returns Group chat message. + */ +export const sendMessageToGroupChat: MutationResolvers["sendMessageToGroupChat"] = + async (_parent, args, context) => { + const groupChat = await GroupChat.findOne({ + _id: args.chatId, + }).lean(); + + if (!groupChat) { + throw new errors.NotFoundError( + requestContext.translate(CHAT_NOT_FOUND_ERROR.MESSAGE), + CHAT_NOT_FOUND_ERROR.CODE, + CHAT_NOT_FOUND_ERROR.PARAM, + ); + } + + const currentUserExists = !!(await User.exists({ + _id: context.userId, + })); + + if (currentUserExists === false) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + + const currentUserIsAMemberOfGroupChat = groupChat.users.some((user) => + user.equals(context.userId), + ); + + /* + checks if users list of groupChat with _id === args.chatId contains + current user with _id === context.userId + */ + if (currentUserIsAMemberOfGroupChat === false) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + + const createdGroupChatMessage = await GroupChatMessage.create({ + groupChatMessageBelongsTo: groupChat._id, + sender: context.userId, + createdAt: new Date(), + messageContent: args.messageContent, + }); + + // add createdGroupChatMessage to groupChat + await GroupChat.updateOne( + { + _id: args.chatId, + }, + { + $push: { + messages: createdGroupChatMessage._id, + }, + }, + ); + + // calls subscription + context.pubsub.publish("MESSAGE_SENT_TO_GROUP_CHAT", { + messageSentToGroupChat: createdGroupChatMessage.toObject(), + }); + + return createdGroupChatMessage.toObject(); + }; diff --git a/src/resolvers/Mutation/signUp.ts b/src/resolvers/Mutation/signUp.ts new file mode 100644 index 0000000000..282e197ae3 --- /dev/null +++ b/src/resolvers/Mutation/signUp.ts @@ -0,0 +1,185 @@ +import bcrypt from "bcryptjs"; +import type { Document } from "mongoose"; +import { + EMAIL_ALREADY_EXISTS_ERROR, + LAST_RESORT_SUPERADMIN_EMAIL, + ORGANIZATION_NOT_FOUND_ERROR, +} from "../../constants"; +import { errors, requestContext } from "../../libraries"; +import type { InterfaceAppUserProfile, InterfaceUser } from "../../models"; +import { + AppUserProfile, + MembershipRequest, + Organization, + User, +} from "../../models"; +import { cacheOrganizations } from "../../services/OrganizationCache/cacheOrganizations"; +import { findOrganizationsInCache } from "../../services/OrganizationCache/findOrganizationsInCache"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; +import { + copyToClipboard, + createAccessToken, + createRefreshToken, +} from "../../utilities"; +import { uploadEncodedImage } from "../../utilities/encodedImageStorage/uploadEncodedImage"; +//import { isValidString } from "../../libraries/validators/validateString"; +//import { validatePassword } from "../../libraries/validators/validatePassword"; +/** + * This function enables sign up. + * @param _parent - parent of current request + * @param args - payload provided with the request + * @returns Sign up details. + */ +export const signUp: MutationResolvers["signUp"] = async (_parent, args) => { + const userWithEmailExists = await User.exists({ + email: args.data.email.toLowerCase(), + }); + + if (userWithEmailExists) { + throw new errors.ConflictError( + requestContext.translate(EMAIL_ALREADY_EXISTS_ERROR.MESSAGE), + EMAIL_ALREADY_EXISTS_ERROR.CODE, + EMAIL_ALREADY_EXISTS_ERROR.PARAM, + ); + } + + const organizationFoundInCache = await findOrganizationsInCache([ + args.data.selectedOrganization, + ]); + let organization = organizationFoundInCache[0]; + if (organization === null) { + organization = await Organization.findOne({ + _id: args.data.selectedOrganization, + }).lean(); + } + if (organization != null) { + await cacheOrganizations([organization]); + } + if (!organization) { + throw new errors.NotFoundError( + requestContext.translate( + ORGANIZATION_NOT_FOUND_ERROR.MESSAGE, + ORGANIZATION_NOT_FOUND_ERROR.CODE, + ORGANIZATION_NOT_FOUND_ERROR.PARAM, + ), + ); + } + + const hashedPassword = await bcrypt.hash(args.data.password, 12); + + // Upload file + let uploadImageFileName = null; + if (args.file) { + uploadImageFileName = await uploadEncodedImage(args.file, null); + } + + const isLastResortSuperAdmin = + args.data.email.toLowerCase() === + LAST_RESORT_SUPERADMIN_EMAIL?.toLowerCase(); + + let createdUser: + | (InterfaceUser & Document) + | null; + let appUserProfile: + | (InterfaceAppUserProfile & + Document) + | null; + + //checking if the userRegistration is required by the organization + if (organization.userRegistrationRequired === false) { + //if it is not then user directly joined the organization + createdUser = await User.create({ + ...args.data, + email: args.data.email.toLowerCase(), // ensure all emails are stored as lowercase to prevent duplicated due to comparison errors + image: uploadImageFileName, + password: hashedPassword, + joinedOrganizations: [organization._id], + }); + + await Organization.updateOne( + { + _id: organization._id, + }, + { + $push: { + members: createdUser._id, + }, + }, + ); + } else { + //if required then the membership request to the organization would be send. + createdUser = await User.create({ + ...args.data, + email: args.data.email.toLowerCase(), // ensure all emails are stored as lowercase to prevent duplicated due to comparison errors + image: uploadImageFileName, + password: hashedPassword, + }); + + //create a membershipRequest object + const memberRequest = await MembershipRequest.create({ + user: createdUser._id, + organization: organization._id, + }); + + //send the membership request to the organization + await Organization.updateOne( + { + _id: organization._id, + }, + { + $push: { + membershipRequests: memberRequest._id, + }, + }, + ); + } + appUserProfile = await AppUserProfile.create({ + userId: createdUser._id, + appLanguageCode: args.data.appLanguageCode || "en", + isSuperAdmin: isLastResortSuperAdmin, + }); + const accessToken = await createAccessToken(createdUser, appUserProfile); + const refreshToken = await createRefreshToken(createdUser, appUserProfile); + + copyToClipboard(`{ + "Authorization": "Bearer ${accessToken}" + }`); + const updatedUser = await User.findOneAndUpdate( + { + _id: createdUser._id, + }, + { + appUserProfileId: appUserProfile._id, + }, + { + new: true, + }, + ) + .populate("joinedOrganizations") + .populate("registeredEvents") + .populate("membershipRequests") + .populate("organizationsBlockedBy"); + + if (updatedUser) { + createdUser = updatedUser; + } + + const filteredCreatedUser = updatedUser?.toObject(); + appUserProfile = await AppUserProfile.findOne({ + userId: updatedUser?._id.toString(), + }) + .populate("createdOrganizations") + .populate("createdEvents") + .populate("eventAdmin") + .populate("adminFor") + .lean(); + + delete filteredCreatedUser?.password; + + return { + user: filteredCreatedUser as InterfaceUser, + appUserProfile: appUserProfile as InterfaceAppUserProfile, + accessToken, + refreshToken, + }; +}; diff --git a/src/resolvers/Mutation/togglePostPin.ts b/src/resolvers/Mutation/togglePostPin.ts new file mode 100644 index 0000000000..c69434b0a7 --- /dev/null +++ b/src/resolvers/Mutation/togglePostPin.ts @@ -0,0 +1,247 @@ +import mongoose from "mongoose"; +import { + LENGTH_VALIDATION_ERROR, + PLEASE_PROVIDE_TITLE, + POST_NOT_FOUND_ERROR, + USER_NOT_AUTHORIZED_ERROR, + USER_NOT_AUTHORIZED_TO_PIN, + USER_NOT_FOUND_ERROR, +} from "../../constants"; +import { errors, requestContext } from "../../libraries"; +import { isValidString } from "../../libraries/validators/validateString"; +import type { + InterfaceAppUserProfile, + InterfacePost, + InterfaceUser, +} from "../../models"; +import { AppUserProfile, Organization, Post, User } from "../../models"; +import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; +import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; +import { cacheOrganizations } from "../../services/OrganizationCache/cacheOrganizations"; +import { findOrganizationsInCache } from "../../services/OrganizationCache/findOrganizationsInCache"; +import { cachePosts } from "../../services/PostCache/cachePosts"; +import { findPostsInCache } from "../../services/PostCache/findPostsInCache"; +import { cacheUsers } from "../../services/UserCache/cacheUser"; +import { findUserInCache } from "../../services/UserCache/findUserInCache"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; + +/** + * Toggles the pinning status of a post within an organization. + * + * This function allows an authorized user, such as an organization admin or super admin, to pin or unpin a post within an organization. If the post is already pinned, it will be unpinned, and if it is not pinned, it will be pinned. The function ensures that only authorized users can perform this action and that the title provided for pinning meets validation requirements. + * + * @param _parent - This parameter represents the parent resolver in the GraphQL schema and is not used in this function. + * @param args - The arguments passed to the GraphQL mutation, including the post's `id` and optionally the `title` to be used if pinning the post. + * @param context - Provides contextual information, including the current user's ID. This is used to authenticate and authorize the request. + * + * @returns The updated post object after the pinning status has been toggled. + * + */ +export const togglePostPin: MutationResolvers["togglePostPin"] = async ( + _parent, + args, + context, +) => { + // Get the current user from the cache or database + let currentUser: InterfaceUser | null; + const userFoundInCache = await findUserInCache([context.userId]); + currentUser = userFoundInCache[0]; + if (currentUser === null) { + currentUser = await User.findOne({ + _id: context.userId, + }).lean(); + if (currentUser !== null) { + await cacheUsers([currentUser]); + } + } + + // Check if the user exists + if (!currentUser) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + + // Get the current user's app profile from the cache or database + let currentUserAppProfile: InterfaceAppUserProfile | null; + const appUserProfileFoundInCache = await findAppUserProfileCache([ + currentUser.appUserProfileId?.toString(), + ]); + currentUserAppProfile = appUserProfileFoundInCache[0]; + if (currentUserAppProfile === null) { + currentUserAppProfile = await AppUserProfile.findOne({ + userId: currentUser._id, + }).lean(); + if (currentUserAppProfile !== null) { + await cacheAppUserProfile([currentUserAppProfile]); + } + } + + // Check if the user's app profile exists + if (!currentUserAppProfile) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + + // Get the post from the cache or database + let post: InterfacePost | null; + const postFoundInCache = await findPostsInCache([args.id]); + post = postFoundInCache[0]; + + if (postFoundInCache[0] === null) { + post = await Post.findOne({ + _id: args.id, + }).lean(); + if (post !== null) { + await cachePosts([post]); + } + } + + // Check if the post exists + if (!post) { + throw new errors.NotFoundError( + requestContext.translate(POST_NOT_FOUND_ERROR.MESSAGE), + POST_NOT_FOUND_ERROR.CODE, + POST_NOT_FOUND_ERROR.PARAM, + ); + } + + // Check if the user is authorized to pin or unpin the post + const currentUserIsOrganizationAdmin = currentUserAppProfile.adminFor.some( + (organizationId) => + organizationId && + new mongoose.Types.ObjectId(organizationId.toString()).equals( + post?.organization, + ), + ); + + if (!currentUserAppProfile.isSuperAdmin && !currentUserIsOrganizationAdmin) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_TO_PIN.MESSAGE), + USER_NOT_AUTHORIZED_TO_PIN.CODE, + USER_NOT_AUTHORIZED_TO_PIN.PARAM, + ); + } + + // Toggle the pinning status of the post within the organization + let organization; + const organizationFoundInCache = await findOrganizationsInCache([ + post.organization, + ]); + + organization = organizationFoundInCache[0]; + + if (organizationFoundInCache[0] == null) { + organization = await Organization.findOne({ + _id: post.organization, + }).lean(); + if (organization !== null) { + await cacheOrganizations([organization]); + } + } + + const currentPostIsPinned = organization?.pinnedPosts.some((postID) => + new mongoose.Types.ObjectId(postID.toString()).equals(args.id), + ); + + if (currentPostIsPinned) { + // Unpin the post if it is currently pinned + const updatedOrganization = await Organization.findOneAndUpdate( + { + _id: post.organization, + }, + { + $pull: { + pinnedPosts: args.id, + }, + }, + { + new: true, + }, + ); + + if (updatedOrganization !== null) { + await cacheOrganizations([updatedOrganization]); + } + + const updatedPost = await Post.findOneAndUpdate( + { + _id: args.id, + }, + { + $set: { + pinned: false, + title: "", + }, + }, + ).lean(); + + if (updatedPost !== null) { + await cachePosts([updatedPost]); + } + + return updatedPost as InterfacePost; + } else { + // Pin the post if it is not currently pinned + if (!args.title) { + throw new errors.InputValidationError( + requestContext.translate(PLEASE_PROVIDE_TITLE.MESSAGE), + PLEASE_PROVIDE_TITLE.CODE, + ); + } + + // Validate the title length if provided + if (args?.title) { + const validationResultTitle = isValidString(args?.title, 256); + if (!validationResultTitle.isLessThanMaxLength) { + throw new errors.InputValidationError( + requestContext.translate( + `${LENGTH_VALIDATION_ERROR.MESSAGE} 256 characters in title`, + ), + LENGTH_VALIDATION_ERROR.CODE, + ); + } + } + + const updatedOrganization = await Organization.findOneAndUpdate( + { + _id: post.organization, + }, + { + $push: { + pinnedPosts: args.id, + }, + }, + { + new: true, + }, + ); + + if (updatedOrganization !== null) { + await cacheOrganizations([updatedOrganization]); + } + + const updatedPost = await Post.findOneAndUpdate( + { + _id: args.id, + }, + { + $set: { + pinned: true, + title: args?.title, + }, + }, + ).lean(); + + if (updatedPost !== null) { + await cachePosts([updatedPost]); + } + + return updatedPost as InterfacePost; + } +}; diff --git a/src/resolvers/Mutation/unassignUserTag.ts b/src/resolvers/Mutation/unassignUserTag.ts new file mode 100644 index 0000000000..cd19f6d891 --- /dev/null +++ b/src/resolvers/Mutation/unassignUserTag.ts @@ -0,0 +1,181 @@ +import { Types } from "mongoose"; +import { + TAG_NOT_FOUND, + USER_DOES_NOT_HAVE_THE_TAG, + USER_NOT_AUTHORIZED_ERROR, + USER_NOT_FOUND_ERROR, +} from "../../constants"; +import { errors, requestContext } from "../../libraries"; +import type { InterfaceAppUserProfile, InterfaceUser } from "../../models"; +import { + AppUserProfile, + OrganizationTagUser, + TagUser, + User, +} from "../../models"; +import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; +import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; +import { cacheUsers } from "../../services/UserCache/cacheUser"; +import { findUserInCache } from "../../services/UserCache/findUserInCache"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; + +/** + * Unassigns a tag from a user in an organization. + * + * This function removes a specific tag from a user in an organization. + * It checks whether the current user has the necessary permissions to unassign the tag and + * verifies if the tag and the user exist in the system. If the tag is not currently assigned + * to the user, an error is thrown. + * + * The function performs the following steps: + * 1. Attempts to find the current user in the cache or database. + * 2. Verifies if the current user exists. + * 3. Attempts to find the current user's profile in the cache or database. + * 4. Checks if the current user has the necessary permissions to unassign the tag. + * 5. Fetches the tag that needs to be unassigned. + * 6. Checks if the user to whom the tag is assigned exists. + * 7. Ensures that the tag is actually assigned to the user. + * 8. Removes the tag assignment from the user. + * + * @param _parent - This parameter is not used in this resolver function. + * @param args - The arguments provided by the GraphQL query, specifically containing the user ID and tag ID to unassign. + * @param context - The context of the request, containing information about the currently authenticated user. + * + * @returns The user from whom the tag was unassigned. + */ + +export const unassignUserTag: MutationResolvers["unassignUserTag"] = async ( + _parent, + args, + context, +) => { + let currentUser: InterfaceUser | null; + const userFoundInCache = await findUserInCache([context.userId]); + currentUser = userFoundInCache[0]; + if (currentUser === null) { + currentUser = await User.findOne({ + _id: context.userId, + }).lean(); + if (currentUser !== null) { + await cacheUsers([currentUser]); + } + } + + // Checks whether the currentUser exists. + if (!currentUser) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + let currentUserAppProfile: InterfaceAppUserProfile | null; + const appUserProfileFoundInCache = await findAppUserProfileCache([ + currentUser.appUserProfileId?.toString(), + ]); + currentUserAppProfile = appUserProfileFoundInCache[0]; + if (currentUserAppProfile === null) { + currentUserAppProfile = await AppUserProfile.findOne({ + userId: currentUser._id, + }).lean(); + if (currentUserAppProfile !== null) { + await cacheAppUserProfile([currentUserAppProfile]); + } + } + if (!currentUserAppProfile) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + + // Get the tag object + const tag = await OrganizationTagUser.findOne({ + _id: args.input.tagId, + }).lean(); + + if (!tag) { + throw new errors.NotFoundError( + requestContext.translate(TAG_NOT_FOUND.MESSAGE), + TAG_NOT_FOUND.CODE, + TAG_NOT_FOUND.PARAM, + ); + } + + // Boolean to determine whether user is an admin of organization of the tag. + const currentUserIsOrganizationAdmin = currentUserAppProfile.adminFor.some( + (organization) => + organization && + new Types.ObjectId(organization.toString()).equals(tag?.organizationId), + ); + + // Checks whether currentUser can assign the tag or not. + if (!currentUserIsOrganizationAdmin && !currentUserAppProfile.isSuperAdmin) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + + // Check if the request user (to whom the tag is to be assigned) exists + const requestUser = await User.findOne({ + _id: args.input.userId, + }).lean(); + + if (!requestUser) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + + // Check if the user already has been assigned the tag + const userAlreadyHasTag = await TagUser.exists({ + ...args.input, + }); + + if (!userAlreadyHasTag) { + throw new errors.ConflictError( + requestContext.translate(USER_DOES_NOT_HAVE_THE_TAG.MESSAGE), + USER_DOES_NOT_HAVE_THE_TAG.CODE, + USER_DOES_NOT_HAVE_THE_TAG.PARAM, + ); + } + + // Get all the child tags of the current tag (including itself) + // on the OrganizationTagUser model + // The following implementation makes number of queries = max depth of nesting in the tag provided + let allTagIds: string[] = []; + let currentParents = [tag._id.toString()]; + + while (currentParents.length) { + allTagIds = allTagIds.concat(currentParents); + const foundTags = await OrganizationTagUser.find( + { + organizationId: tag.organizationId, + parentTagId: { + $in: currentParents, + }, + }, + { + _id: 1, + }, + ); + currentParents = foundTags + .map((tag) => tag._id.toString()) + .filter((id: string | null) => id); + } + + // Unassign the tag + await TagUser.deleteMany({ + tagId: { + $in: allTagIds, + }, + userId: args.input.userId, + }); + + return requestUser; +}; diff --git a/src/resolvers/Mutation/unblockUser.ts b/src/resolvers/Mutation/unblockUser.ts new file mode 100644 index 0000000000..e6cde9b989 --- /dev/null +++ b/src/resolvers/Mutation/unblockUser.ts @@ -0,0 +1,193 @@ +import { + ORGANIZATION_NOT_FOUND_ERROR, + USER_NOT_AUTHORIZED_ERROR, + USER_NOT_FOUND_ERROR, +} from "../../constants"; +import { errors, requestContext } from "../../libraries"; +import type { InterfaceOrganization, InterfaceUser } from "../../models"; +import { MembershipRequest, Organization, User } from "../../models"; +import { cacheOrganizations } from "../../services/OrganizationCache/cacheOrganizations"; +import { findOrganizationsInCache } from "../../services/OrganizationCache/findOrganizationsInCache"; +import mongoose from "mongoose"; +import { cacheUsers } from "../../services/UserCache/cacheUser"; +import { findUserInCache } from "../../services/UserCache/findUserInCache"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; +import { adminCheck } from "../../utilities"; +/** + * This function enables to unblock user. + * @param _parent - parent of current request + * @param args - payload provided with the request + * @param context - context of entire application + * @remarks The following checks are done: + * 1. If the organization exists. + * 2. If the user exists + * 3. If the user is an admin of the organization + * @returns updated organization. + */ +export const unblockUser: MutationResolvers["unblockUser"] = async ( + _parent, + args, + context, +) => { + let organization: InterfaceOrganization; + + const organizationFoundInCache = await findOrganizationsInCache([ + args.organizationId, + ]); + + if (organizationFoundInCache[0] == null) { + organization = (await Organization.findOne({ + _id: args.organizationId, + }).lean()) as InterfaceOrganization; + if (organization) await cacheOrganizations([organization]); + } else { + organization = organizationFoundInCache[0]; + } + + // checks if there exists an organization with _id === args.organizationId + if (!organization) { + throw new errors.NotFoundError( + requestContext.translate(ORGANIZATION_NOT_FOUND_ERROR.MESSAGE), + ORGANIZATION_NOT_FOUND_ERROR.CODE, + ORGANIZATION_NOT_FOUND_ERROR.PARAM, + ); + } + + // ensure user exists + let user: InterfaceUser | null; + const userFoundInCache = await findUserInCache([args.userId]); + user = userFoundInCache[0]; + if (user === null) { + user = await User.findOne({ + _id: args.userId, + }).lean(); + if (user !== null) { + await cacheUsers([user]); + } + } + + if (!user) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + + // checks if current user is an admin of the organization with _id === args.organizationId + await adminCheck(context.userId, organization); + + const userIsBlockedFromOrganization = organization.blockedUsers.some( + (blockedUser) => + new mongoose.Types.ObjectId(blockedUser.toString()).equals(user._id), + ); + + // checks if user with _id === args.userId is blocked by organzation with _id == args.organizationId + if (userIsBlockedFromOrganization === false) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + + // remove user from the blockedUsers list inside the organization record + const updatedOrganization = await Organization.findOneAndUpdate( + { + _id: organization._id, + }, + { + $set: { + blockedUsers: organization.blockedUsers.filter( + (blockedUser) => !user?._id.equals(blockedUser), + ), + }, + }, + { + new: true, + }, + ).lean(); + + if (updatedOrganization !== null) { + if (updatedOrganization.userRegistrationRequired === true) { + // create a membership request for the user + const createdMembershipRequest = await MembershipRequest.create({ + user: user._id, + organization: organization._id, + }); + // add membership request to organization + await Organization.findOneAndUpdate( + { + _id: organization._id, + }, + { + $push: { + membershipRequests: createdMembershipRequest._id, + }, + }, + { + new: true, + }, + ).lean(); + // add membership request to user + await User.updateOne( + { + _id: user._id, + }, + { + $push: { + membershipRequests: createdMembershipRequest._id, + }, + }, + ); + } else { + // add user to the members list inside the organization record + await Organization.findOneAndUpdate( + { + _id: organization._id, + }, + { + $push: { + members: user._id, + }, + }, + { + new: true, + }, + ).lean(); + // add organization to the joinedOrganizations list inside the user record + await User.updateOne( + { + _id: user._id, + }, + { + $push: { + joinedOrganizations: organization._id, + }, + }, + ).lean(); + } + await cacheOrganizations([updatedOrganization]); + } + // remove the organization from the organizationsBlockedBy array inside the user record + return (await User.findOneAndUpdate( + { + _id: user._id, + }, + { + $set: { + organizationsBlockedBy: user.organizationsBlockedBy.filter( + (organizationBlockedBy) => + !new mongoose.Types.ObjectId(organization._id.toString()).equals( + organizationBlockedBy, + ), + ), + }, + }, + { + new: true, + }, + ) + .select(["-password"]) + .lean()) as InterfaceUser; +}; diff --git a/src/resolvers/Mutation/unlikeComment.ts b/src/resolvers/Mutation/unlikeComment.ts new file mode 100644 index 0000000000..32e2adddb4 --- /dev/null +++ b/src/resolvers/Mutation/unlikeComment.ts @@ -0,0 +1,76 @@ +import { COMMENT_NOT_FOUND_ERROR } from "../../constants"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; +import { errors, requestContext } from "../../libraries"; +import { Comment } from "../../models"; +import { findCommentsInCache } from "../../services/CommentCache/findCommentsInCache"; +import { cacheComments } from "../../services/CommentCache/cacheComments"; +/** + * This function enables to unlike a comment. + * @param _parent - parent of current request + * @param args - payload provided with the request + * @param context - context of entire application + * @remarks The following checks are done: + * 1. If the user exists. + * 2. If the comment exists + * @returns Comment. + */ +export const unlikeComment: MutationResolvers["unlikeComment"] = async ( + _parent, + args, + context, +) => { + let comment; + + const commentsFoundInCache = await findCommentsInCache([args.id]); + + comment = commentsFoundInCache[0]; + + if (commentsFoundInCache.includes(null)) { + comment = await Comment.findOne({ + _id: args.id, + }).lean(); + + if (comment !== null) { + await cacheComments([comment]); + } + } + + if (!comment) { + throw new errors.NotFoundError( + requestContext.translate(COMMENT_NOT_FOUND_ERROR.MESSAGE), + COMMENT_NOT_FOUND_ERROR.CODE, + COMMENT_NOT_FOUND_ERROR.PARAM, + ); + } + + const currentUserHasLikedComment = comment.likedBy.some((liker) => + liker.equals(context.userId), + ); + + if (currentUserHasLikedComment === true) { + const updatedComment = await Comment.findOneAndUpdate( + { + _id: args.id, + }, + { + $pull: { + likedBy: context.userId, + }, + $inc: { + likeCount: -1, + }, + }, + { + new: true, + }, + ).lean(); + + if (updatedComment !== null) { + await cacheComments([updatedComment]); + } + + return updatedComment; + } + + return comment; +}; diff --git a/src/resolvers/Mutation/unlikePost.ts b/src/resolvers/Mutation/unlikePost.ts new file mode 100644 index 0000000000..b6b09182a4 --- /dev/null +++ b/src/resolvers/Mutation/unlikePost.ts @@ -0,0 +1,76 @@ +import { POST_NOT_FOUND_ERROR } from "../../constants"; +import { errors, requestContext } from "../../libraries"; +import type { InterfacePost } from "../../models"; +import { Post } from "../../models"; +import { cachePosts } from "../../services/PostCache/cachePosts"; +import { findPostsInCache } from "../../services/PostCache/findPostsInCache"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; +/** + * This function enables to unlike a post. + * @param _parent - parent of current request + * @param args - payload provided with the request + * @param context - context of entire application + * @remarks The following checks are done: + * 1. If the user exists. + * 2. If the post exists + * @returns Post. + */ +export const unlikePost: MutationResolvers["unlikePost"] = async ( + _parent, + args, + context, +) => { + let post: InterfacePost | null; + + const postFoundInCache = await findPostsInCache([args.id]); + + post = postFoundInCache[0]; + + if (postFoundInCache[0] === null) { + post = await Post.findOne({ + _id: args.id, + }).lean(); + if (post !== null) { + await cachePosts([post]); + } + } + + if (!post) { + throw new errors.NotFoundError( + requestContext.translate(POST_NOT_FOUND_ERROR.MESSAGE), + POST_NOT_FOUND_ERROR.CODE, + POST_NOT_FOUND_ERROR.PARAM, + ); + } + + const currentUserHasLikedPost = post.likedBy.some((liker) => + liker.equals(context.userId), + ); + + if (currentUserHasLikedPost === true) { + const updatedPost = await Post.findOneAndUpdate( + { + _id: post._id, + }, + { + $pull: { + likedBy: context.userId, + }, + $inc: { + likeCount: -1, + }, + }, + { + new: true, + }, + ).lean(); + + if (updatedPost !== null) { + await cachePosts([updatedPost]); + } + + return updatedPost; + } + + return post; +}; diff --git a/src/resolvers/Mutation/unregisterForEventByUser.ts b/src/resolvers/Mutation/unregisterForEventByUser.ts new file mode 100644 index 0000000000..07e2429d94 --- /dev/null +++ b/src/resolvers/Mutation/unregisterForEventByUser.ts @@ -0,0 +1,69 @@ +import { + EVENT_NOT_FOUND_ERROR, + USER_ALREADY_UNREGISTERED_ERROR, +} from "../../constants"; +import { errors, requestContext } from "../../libraries"; +import type { InterfaceEvent } from "../../models"; +import { Event, EventAttendee } from "../../models"; +import { cacheEvents } from "../../services/EventCache/cacheEvents"; +import { findEventsInCache } from "../../services/EventCache/findEventInCache"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; + +/** + * This function enables a user to unregister from an event. + * @param _parent - parent of current request + * @param args - payload provided with the request + * @param context - context of entire application + * @remarks The following checks are done: + * 1. If the user exists. + * 2. If the event exists. + * 3. If the user is a registrant of the event. + * @returns Updated event. + */ + +export const unregisterForEventByUser: MutationResolvers["unregisterForEventByUser"] = + async (_parent, args, context) => { + let event: InterfaceEvent | null; + + const eventFoundInCache = await findEventsInCache([args.id]); + + event = eventFoundInCache[0]; + + if (eventFoundInCache[0] === null) { + event = await Event.findOne({ + _id: args.id, + }).lean(); + + if (event !== null) { + await cacheEvents([event]); + } + } + // checks if there exists an event with _id === args.id + if (!event) { + throw new errors.NotFoundError( + requestContext.translate(EVENT_NOT_FOUND_ERROR.MESSAGE), + EVENT_NOT_FOUND_ERROR.CODE, + EVENT_NOT_FOUND_ERROR.PARAM, + ); + } + + const userRegisteredForEvent = await EventAttendee.exists({ + userId: context.userId, + eventId: args.id, + }); + + if (!userRegisteredForEvent) { + throw new errors.NotFoundError( + requestContext.translate(USER_ALREADY_UNREGISTERED_ERROR.MESSAGE), + USER_ALREADY_UNREGISTERED_ERROR.CODE, + USER_ALREADY_UNREGISTERED_ERROR.PARAM, + ); + } + + await EventAttendee.deleteOne({ + userId: context.userId, + eventId: args.id, + }); + + return event; + }; diff --git a/src/resolvers/Mutation/updateActionItem.ts b/src/resolvers/Mutation/updateActionItem.ts new file mode 100644 index 0000000000..265a40104c --- /dev/null +++ b/src/resolvers/Mutation/updateActionItem.ts @@ -0,0 +1,232 @@ +import mongoose from "mongoose"; +import { + ACTION_ITEM_NOT_FOUND_ERROR, + EVENT_NOT_FOUND_ERROR, + USER_NOT_AUTHORIZED_ERROR, + USER_NOT_FOUND_ERROR, + USER_NOT_MEMBER_FOR_ORGANIZATION, +} from "../../constants"; +import { errors, requestContext } from "../../libraries"; +import type { + InterfaceAppUserProfile, + InterfaceEvent, + InterfaceUser, +} from "../../models"; +import { ActionItem, AppUserProfile, Event, User } from "../../models"; +import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; +import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; +import { cacheEvents } from "../../services/EventCache/cacheEvents"; +import { findEventsInCache } from "../../services/EventCache/findEventInCache"; +import { cacheUsers } from "../../services/UserCache/cacheUser"; +import { findUserInCache } from "../../services/UserCache/findUserInCache"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; +/** + * This function enables to update an action item. + * @param _parent - parent of current request + * @param args - payload provided with the request + * @param context - context of entire application + * @remarks The following checks are done: + * 1. If the user exists. + * 2. If the new asignee exists. + * 2. If the action item exists. + * 4. If the new asignee is a member of the organization. + * 5. If the user is authorized. + * 6. If the user has appUserProfile. + * @returns Updated action item. + */ + +type UpdateActionItemInputType = { + assigneeId: string; + preCompletionNotes: string; + postCompletionNotes: string; + dueDate: Date; + allotedHours: number; + completionDate: Date; + isCompleted: boolean; +}; + +export const updateActionItem: MutationResolvers["updateActionItem"] = async ( + _parent, + args, + context, +) => { + let currentUser: InterfaceUser | null; + const userFoundInCache = await findUserInCache([context.userId]); + currentUser = userFoundInCache[0]; + if (currentUser === null) { + currentUser = await User.findOne({ + _id: context.userId, + }).lean(); + if (currentUser !== null) { + await cacheUsers([currentUser]); + } + } + + // Checks if the user exists + if (currentUser === null) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + let currentUserAppProfile: InterfaceAppUserProfile | null; + const appUserProfileFoundInCache = await findAppUserProfileCache([ + currentUser.appUserProfileId?.toString(), + ]); + currentUserAppProfile = appUserProfileFoundInCache[0]; + if (currentUserAppProfile === null) { + currentUserAppProfile = await AppUserProfile.findOne({ + userId: currentUser._id, + }).lean(); + if (currentUserAppProfile !== null) { + await cacheAppUserProfile([currentUserAppProfile]); + } + } + if (!currentUserAppProfile) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + + const actionItem = await ActionItem.findOne({ + _id: args.id, + }) + .populate("actionItemCategory") + .lean(); + + // Checks if the actionItem exists + if (!actionItem) { + throw new errors.NotFoundError( + requestContext.translate(ACTION_ITEM_NOT_FOUND_ERROR.MESSAGE), + ACTION_ITEM_NOT_FOUND_ERROR.CODE, + ACTION_ITEM_NOT_FOUND_ERROR.PARAM, + ); + } + + let sameAssignedUser = false; + + if (args.data.assigneeId) { + sameAssignedUser = new mongoose.Types.ObjectId( + actionItem.assignee.toString(), + ).equals(args.data.assigneeId); + + if (!sameAssignedUser) { + const newAssignedUser = await User.findOne({ + _id: args.data.assigneeId, + }); + + // Checks if the new asignee exists + if (newAssignedUser === null) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + + let userIsOrganizationMember = false; + const currorganizationId = actionItem.actionItemCategory.organizationId; + userIsOrganizationMember = newAssignedUser.joinedOrganizations.some( + (organizationId) => + organizationId === currorganizationId || + new mongoose.Types.ObjectId(organizationId.toString()).equals( + currorganizationId, + ), + ); + + // Checks if the new asignee is a member of the organization + if (!userIsOrganizationMember) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_MEMBER_FOR_ORGANIZATION.MESSAGE), + USER_NOT_MEMBER_FOR_ORGANIZATION.CODE, + USER_NOT_MEMBER_FOR_ORGANIZATION.PARAM, + ); + } + } + } + + const currentUserIsOrgAdmin = currentUserAppProfile.adminFor.some( + (ogranizationId) => + ogranizationId === actionItem.organization || + new mongoose.Types.ObjectId(ogranizationId?.toString()).equals( + actionItem.organization, + ), + ); + + let currentUserIsEventAdmin = false; + + if (actionItem.event) { + let currEvent: InterfaceEvent | null; + + const eventFoundInCache = await findEventsInCache([actionItem.event]); + + currEvent = eventFoundInCache[0]; + + if (eventFoundInCache[0] === null) { + currEvent = await Event.findOne({ + _id: actionItem.event, + }).lean(); + + if (currEvent !== null) { + await cacheEvents([currEvent]); + } + } + + // Checks whether currEvent exists. + if (!currEvent) { + throw new errors.NotFoundError( + requestContext.translate(EVENT_NOT_FOUND_ERROR.MESSAGE), + EVENT_NOT_FOUND_ERROR.CODE, + EVENT_NOT_FOUND_ERROR.PARAM, + ); + } + + // Checks if the currUser is an admin of the event + currentUserIsEventAdmin = currEvent.admins.some( + (admin) => + admin === context.userID || + new mongoose.Types.ObjectId(admin.toString()).equals(context.userId), + ); + } + + // Checks if the user is authorized for the operation. + if ( + currentUserIsEventAdmin === false && + currentUserIsOrgAdmin === false && + currentUserAppProfile.isSuperAdmin === false + ) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + + const updatedAssignmentDate = sameAssignedUser + ? actionItem.assignmentDate + : new Date(); + + const updatedAssigner = sameAssignedUser + ? actionItem.assigner + : context.userId; + + const updatedActionItem = await ActionItem.findOneAndUpdate( + { + _id: args.id, + }, + { + ...(args.data as UpdateActionItemInputType), + assignee: args.data.assigneeId || actionItem.assignee, + assignmentDate: updatedAssignmentDate, + assigner: updatedAssigner, + }, + { + new: true, + }, + ).lean(); + + return updatedActionItem; +}; diff --git a/src/resolvers/Mutation/updateActionItemCategory.ts b/src/resolvers/Mutation/updateActionItemCategory.ts new file mode 100644 index 0000000000..20f031f49f --- /dev/null +++ b/src/resolvers/Mutation/updateActionItemCategory.ts @@ -0,0 +1,100 @@ +import { + ACTION_ITEM_CATEGORY_ALREADY_EXISTS, + ACTION_ITEM_CATEGORY_NOT_FOUND_ERROR, + USER_NOT_FOUND_ERROR, +} from "../../constants"; +import { errors, requestContext } from "../../libraries"; +import type { InterfaceUser } from "../../models"; +import { ActionItemCategory, User } from "../../models"; +import { cacheUsers } from "../../services/UserCache/cacheUser"; +import { findUserInCache } from "../../services/UserCache/findUserInCache"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; +import { adminCheck } from "../../utilities"; +/** + * This function enables to update a actionItemCategory. + * @param _parent - parent of current request + * @param args - payload provided with the request + * @param context - context of entire application + * @remarks The following checks are done: + * 1. If the user exists. + * 2. If the actionItemCategory exists. + * 3. If an actionItemCategory with the provided name already exists. + * 4. If the user is authorized. + * @returns Updated actionItemCategory. + */ + +type UpdateActionItemCategoryInputType = { + name: string; + isDisabled: boolean; +}; + +export const updateActionItemCategory: MutationResolvers["updateActionItemCategory"] = + async (_parent, args, context) => { + let currentUser: InterfaceUser | null; + const userFoundInCache = await findUserInCache([context.userId]); + currentUser = userFoundInCache[0]; + if (currentUser === null) { + currentUser = await User.findOne({ + _id: context.userId, + }).lean(); + if (currentUser !== null) { + await cacheUsers([currentUser]); + } + } + + // Checks if the user exists + if (currentUser === null) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + + const actionItemCategory = await ActionItemCategory.findOne({ + _id: args.id, + }) + .populate("organizationId") + .lean(); + + // Checks if the actionItemCategory exists + if (!actionItemCategory) { + throw new errors.NotFoundError( + requestContext.translate(ACTION_ITEM_CATEGORY_NOT_FOUND_ERROR.MESSAGE), + ACTION_ITEM_CATEGORY_NOT_FOUND_ERROR.CODE, + ACTION_ITEM_CATEGORY_NOT_FOUND_ERROR.PARAM, + ); + } + + // checks if an action item category already exists with the provided name + if (args.data.name) { + const actionItemCategoryAlreadyExists = await ActionItemCategory.findOne({ + name: args.data.name, + organizationId: actionItemCategory.organizationId, + }); + + if (actionItemCategoryAlreadyExists) { + throw new errors.ConflictError( + requestContext.translate(ACTION_ITEM_CATEGORY_ALREADY_EXISTS.MESSAGE), + ACTION_ITEM_CATEGORY_ALREADY_EXISTS.CODE, + ACTION_ITEM_CATEGORY_ALREADY_EXISTS.PARAM, + ); + } + } + + await adminCheck(context.userId, actionItemCategory.organizationId); + + const updatedCategory = await ActionItemCategory.findOneAndUpdate( + { + _id: args.id, + }, + { + ...(args.data as UpdateActionItemCategoryInputType), + }, + { + new: true, + }, + ).lean(); + + return updatedCategory; + }; diff --git a/src/resolvers/Mutation/updateAdvertisement.ts b/src/resolvers/Mutation/updateAdvertisement.ts new file mode 100644 index 0000000000..fbca16591c --- /dev/null +++ b/src/resolvers/Mutation/updateAdvertisement.ts @@ -0,0 +1,211 @@ +import { Types } from "mongoose"; +import { + ADVERTISEMENT_NOT_FOUND_ERROR, + END_DATE_VALIDATION_ERROR, + FIELD_NON_EMPTY_ERROR, + INPUT_NOT_FOUND_ERROR, + START_DATE_VALIDATION_ERROR, + USER_NOT_AUTHORIZED_ERROR, + USER_NOT_FOUND_ERROR, +} from "../../constants"; +import { errors, requestContext } from "../../libraries"; +import type { + InterfaceAdvertisement, + InterfaceAppUserProfile, + InterfaceUser, +} from "../../models"; +import { Advertisement, AppUserProfile, User } from "../../models"; +import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; +import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; +import { cacheUsers } from "../../services/UserCache/cacheUser"; +import { findUserInCache } from "../../services/UserCache/findUserInCache"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; +import { uploadEncodedImage } from "../../utilities/encodedImageStorage/uploadEncodedImage"; +import { uploadEncodedVideo } from "../../utilities/encodedVideoStorage/uploadEncodedVideo"; +/** + * Updates an advertisement with new details, including handling media file uploads and validating input fields. + * + * This function updates an existing advertisement based on the provided input. It checks for required fields, validates dates, handles media file uploads, and performs authorization checks to ensure that the current user has the right to update the advertisement. The function returns the updated advertisement after applying changes. + * + * @param _parent - This parameter represents the parent resolver in the GraphQL schema and is not used in this function. + * @param args - The arguments passed to the GraphQL mutation, including the advertisement's `_id` and other fields to update. This may include `startDate`, `endDate`, and `mediaFile`. + * @param context - Provides contextual information, including the current user's ID. This is used to authenticate and authorize the request. + * + * @returns An object containing the updated advertisement with all its fields. + * + */ +export const updateAdvertisement: MutationResolvers["updateAdvertisement"] = + async (_parent, args, context) => { + const { _id, ...otherFields } = args.input; + + // Check if input is provided + if (Object.keys(otherFields).length === 0) { + throw new errors.InputValidationError( + requestContext.translate(INPUT_NOT_FOUND_ERROR.MESSAGE), + INPUT_NOT_FOUND_ERROR.CODE, + INPUT_NOT_FOUND_ERROR.PARAM, + ); + } + + // Check for unintended null values in permitted fields + for (const fieldValue of Object.values(args.input)) { + if ( + fieldValue === null || + (typeof fieldValue === "string" && fieldValue.trim() === "") + ) { + throw new errors.InputValidationError( + requestContext.translate(FIELD_NON_EMPTY_ERROR.MESSAGE), + FIELD_NON_EMPTY_ERROR.CODE, + FIELD_NON_EMPTY_ERROR.PARAM, + ); + } + } + + // Retrieve the current user from cache or database + let currentUser: InterfaceUser | null; + const userFoundInCache = await findUserInCache([context.userId]); + currentUser = userFoundInCache[0]; + if (currentUser === null) { + currentUser = await User.findOne({ + _id: context.userId, + }).lean(); + if (currentUser !== null) { + await cacheUsers([currentUser]); + } + } + + // Check if the current user exists + if (!currentUser) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + + // Retrieve the current user's app profile from cache or database + let currentUserAppProfile: InterfaceAppUserProfile | null; + const appUserProfileFoundInCache = await findAppUserProfileCache([ + currentUser.appUserProfileId?.toString(), + ]); + currentUserAppProfile = appUserProfileFoundInCache[0]; + if (currentUserAppProfile === null) { + currentUserAppProfile = await AppUserProfile.findOne({ + userId: currentUser._id, + }).lean(); + if (currentUserAppProfile !== null) { + await cacheAppUserProfile([currentUserAppProfile]); + } + } + + // Check if the user's app profile exists + if (!currentUserAppProfile) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + + // Retrieve the advertisement from the database + const advertisement = await Advertisement.findOne({ + _id: _id, + }); + if (!advertisement) { + throw new errors.NotFoundError( + requestContext.translate(ADVERTISEMENT_NOT_FOUND_ERROR.MESSAGE), + ADVERTISEMENT_NOT_FOUND_ERROR.CODE, + ADVERTISEMENT_NOT_FOUND_ERROR.PARAM, + ); + } + + // Check if the user is authorized to update the advertisement + const userIsOrganizationAdmin = currentUserAppProfile.adminFor.some( + (organisation) => + organisation === advertisement.organizationId || + new Types.ObjectId(organisation?.toString()).equals( + advertisement.organizationId, + ), + ); + if (!userIsOrganizationAdmin && !currentUserAppProfile.isSuperAdmin) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + + const { startDate, endDate } = args.input; + + // Validate startDate and endDate + if ( + startDate && + new Date(startDate) <= new Date(new Date().toDateString()) + ) { + throw new errors.InputValidationError( + requestContext.translate(START_DATE_VALIDATION_ERROR.MESSAGE), + START_DATE_VALIDATION_ERROR.CODE, + START_DATE_VALIDATION_ERROR.PARAM, + ); + } + + //If endDate is less than or equal to startDate + if (startDate && endDate && new Date(endDate) <= new Date(startDate)) { + throw new errors.InputValidationError( + requestContext.translate(END_DATE_VALIDATION_ERROR.MESSAGE), + END_DATE_VALIDATION_ERROR.CODE, + END_DATE_VALIDATION_ERROR.PARAM, + ); + } + + let uploadMediaFile = null; + + // Handle media file upload + if (args.input.mediaFile) { + const dataUrlPrefix = "data:"; + if (args.input.mediaFile.startsWith(dataUrlPrefix + "image/")) { + uploadMediaFile = await uploadEncodedImage(args.input.mediaFile, null); + } else if (args.input.mediaFile.startsWith(dataUrlPrefix + "video/")) { + uploadMediaFile = await uploadEncodedVideo(args.input.mediaFile, null); + } else { + throw new Error("Unsupported file type."); + } + } + + // Prepare fields to update + const fieldsToUpdate = args.input.mediaFile + ? { ...args.input, mediaUrl: uploadMediaFile } + : { ...args.input }; + + // Update the advertisement in the database + const updatedAdvertisement = await Advertisement.findOneAndUpdate( + { + _id: _id, + }, + { + $set: fieldsToUpdate, + }, + { + new: true, + }, + ).lean(); + + // Prepare and return the updated advertisement payload + const updatedAdvertisementPayload = { + _id: updatedAdvertisement?._id?.toString(), // Ensure _id is converted to String as per GraphQL schema + name: updatedAdvertisement?.name, + organizationId: updatedAdvertisement?.organizationId, + mediaUrl: updatedAdvertisement?.mediaUrl, + type: updatedAdvertisement?.type, + startDate: updatedAdvertisement?.startDate, + endDate: updatedAdvertisement?.endDate, + createdAt: updatedAdvertisement?.createdAt, + updatedAt: updatedAdvertisement?.updatedAt, + creatorId: updatedAdvertisement?.creatorId, + }; + return { + advertisement: { + ...updatedAdvertisementPayload, + } as InterfaceAdvertisement, + }; + }; diff --git a/src/resolvers/Mutation/updateAgendaCategory.ts b/src/resolvers/Mutation/updateAgendaCategory.ts new file mode 100644 index 0000000000..cf2c523930 --- /dev/null +++ b/src/resolvers/Mutation/updateAgendaCategory.ts @@ -0,0 +1,130 @@ +import { + AGENDA_CATEGORY_NOT_FOUND_ERROR, + USER_NOT_AUTHORIZED_ERROR, + USER_NOT_FOUND_ERROR, +} from "../../constants"; +import { errors, requestContext } from "../../libraries"; +import type { + InterfaceAgendaCategory, + InterfaceAppUserProfile, + InterfaceUser, +} from "../../models"; +import { AgendaCategoryModel, AppUserProfile, User } from "../../models"; +import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; +import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; +import { cacheUsers } from "../../services/UserCache/cacheUser"; +import { findUserInCache } from "../../services/UserCache/findUserInCache"; +import type { + MutationResolvers, + UpdateAgendaCategoryInput, +} from "../../types/generatedGraphQLTypes"; +/** + * This is a resolver function for the GraphQL mutation 'updateAgendaCategory'. + * + * This resolver updates an existing agenda category based on the provided ID. + * It checks if the user has the necessary permissions to update the agenda category. + * + * @param _parent - The parent object, not used in this resolver. + * @param args - The input arguments for the mutation. + * @param context - The context object containing user information. + * @returns A promise that resolves to the updated agenda category. + * @throws `NotFoundError` If the agenda category or user is not found. + * @throws `UnauthorizedError` If the user does not have the required permissions. + * @throws `InternalServerError` For other potential issues during agenda category update. + */ + +export const updateAgendaCategory: MutationResolvers["updateAgendaCategory"] = + async (_parent, args, context) => { + // Check if the AgendaCategory exists + // Fetch the user to get the organization ID + + let currentUser: InterfaceUser | null; + const userFoundInCache = await findUserInCache([context.userId]); + currentUser = userFoundInCache[0]; + if (currentUser === null) { + currentUser = await User.findOne({ + _id: context.userId, + }).lean(); + if (currentUser !== null) { + await cacheUsers([currentUser]); + } + } + + // If the user is not found, throw a NotFoundError + if (!currentUser) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + let currentUserAppProfile: InterfaceAppUserProfile | null; + const appUserProfileFoundInCache = await findAppUserProfileCache([ + currentUser.appUserProfileId?.toString(), + ]); + currentUserAppProfile = appUserProfileFoundInCache[0]; + if (currentUserAppProfile === null) { + currentUserAppProfile = await AppUserProfile.findOne({ + userId: currentUser._id, + }).lean(); + if (currentUserAppProfile !== null) { + await cacheAppUserProfile([currentUserAppProfile]); + } + } + if (!currentUserAppProfile) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + const existingAgendaCategory = await AgendaCategoryModel.findById( + args.id, + ).lean(); + + // If the AgendaCategory is not found, throw a NotFoundError + if (!existingAgendaCategory) { + throw new errors.NotFoundError( + requestContext.translate(AGENDA_CATEGORY_NOT_FOUND_ERROR.MESSAGE), + AGENDA_CATEGORY_NOT_FOUND_ERROR.CODE, + AGENDA_CATEGORY_NOT_FOUND_ERROR.PARAM, + ); + } + const currentOrg = await AgendaCategoryModel.findById( + existingAgendaCategory._id, + ) + .select("organizationId") + .lean(); + + const currentUserIsOrgAdmin = currentUserAppProfile.adminFor.some( + (organizationId) => organizationId?.toString() === currentOrg?.toString(), + ); + + if ( + currentUserIsOrgAdmin === false && + !currentUserAppProfile.isSuperAdmin + ) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + + // Update the AgendaCategory + const updatedAgendaCategory = await AgendaCategoryModel.findByIdAndUpdate( + args.id, + { + $set: { + updatedBy: context.userId, + // eslint-disable-next-line + ...(args.input as UpdateAgendaCategoryInput), + }, + }, + { + new: true, + }, + ).lean(); + + return updatedAgendaCategory as InterfaceAgendaCategory; + }; diff --git a/src/resolvers/Mutation/updateAgendaItem.ts b/src/resolvers/Mutation/updateAgendaItem.ts new file mode 100644 index 0000000000..9965c088cf --- /dev/null +++ b/src/resolvers/Mutation/updateAgendaItem.ts @@ -0,0 +1,115 @@ +import { + AGENDA_ITEM_NOT_FOUND_ERROR, + UNAUTHORIZED_UPDATE_AGENDA_ITEM_ERROR, + USER_NOT_AUTHORIZED_ERROR, + USER_NOT_FOUND_ERROR, +} from "../../constants"; +import { errors, requestContext } from "../../libraries"; +import type { + InterfaceAgendaItem, + InterfaceAppUserProfile, + InterfaceUser, +} from "../../models"; +import { AgendaItemModel, AppUserProfile, User } from "../../models"; +import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; +import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; +import { cacheUsers } from "../../services/UserCache/cacheUser"; +import { findUserInCache } from "../../services/UserCache/findUserInCache"; +import type { + MutationResolvers, + UpdateAgendaItemInput, +} from "../../types/generatedGraphQLTypes"; + +/** + * This function allows the user who created an agenda item to update it. + * @param _parent - The parent of the current request. + * @param args - The payload provided with the request. + * @param context - The context of the entire application. + * @returns The updated agenda item. + */ +export const updateAgendaItem: MutationResolvers["updateAgendaItem"] = async ( + _parent, + args, + context, +) => { + // Fetch the current user based on the provided ID + let currentUser: InterfaceUser | null; + const userFoundInCache = await findUserInCache([context.userId]); + currentUser = userFoundInCache[0]; + if (currentUser === null) { + currentUser = await User.findOne({ + _id: context.userId, + }).lean(); + if (currentUser !== null) { + await cacheUsers([currentUser]); + } + } + + if (!currentUser) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + + let currentUserAppProfile: InterfaceAppUserProfile | null; + const appUserProfileFoundInCache = await findAppUserProfileCache([ + currentUser.appUserProfileId?.toString(), + ]); + currentUserAppProfile = appUserProfileFoundInCache[0]; + if (currentUserAppProfile === null) { + currentUserAppProfile = await AppUserProfile.findOne({ + userId: currentUser._id, + }).lean(); + if (currentUserAppProfile !== null) { + await cacheAppUserProfile([currentUserAppProfile]); + } + } + if (!currentUserAppProfile) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + + // Check if the agenda item exists + const agendaItem: InterfaceAgendaItem | null = await AgendaItemModel.findOne({ + _id: args.id, + }).lean(); + + // If the agenda item doesn't exist, throw a NotFoundError + if (!agendaItem) { + throw new errors.NotFoundError( + requestContext.translate(AGENDA_ITEM_NOT_FOUND_ERROR.MESSAGE), + AGENDA_ITEM_NOT_FOUND_ERROR.CODE, + AGENDA_ITEM_NOT_FOUND_ERROR.PARAM, + ); + } + + // Check if the current user created the agenda item + if (!agendaItem.createdBy.equals(currentUser._id)) { + throw new errors.UnauthorizedError( + requestContext.translate(UNAUTHORIZED_UPDATE_AGENDA_ITEM_ERROR.MESSAGE), + UNAUTHORIZED_UPDATE_AGENDA_ITEM_ERROR.CODE, + UNAUTHORIZED_UPDATE_AGENDA_ITEM_ERROR.PARAM, + ); + } + + // Update the agenda item in the database + const updatedAgendaItem = await AgendaItemModel.findByIdAndUpdate( + args.id, + { + $set: { + ...(args.input as UpdateAgendaItemInput), + }, + updatedBy: context.userId, + }, + { + new: true, // Return the updated document + }, + ).lean(); + + return updatedAgendaItem; +}; diff --git a/src/resolvers/Mutation/updateAgendaSection.ts b/src/resolvers/Mutation/updateAgendaSection.ts new file mode 100644 index 0000000000..690d3f1417 --- /dev/null +++ b/src/resolvers/Mutation/updateAgendaSection.ts @@ -0,0 +1,118 @@ +import { + AGENDA_SECTION_NOT_FOUND_ERROR, + USER_NOT_AUTHORIZED_ERROR, + USER_NOT_FOUND_ERROR, +} from "../../constants"; +import { errors, requestContext } from "../../libraries"; +import type { + InterfaceAgendaSection, + InterfaceAppUserProfile, + InterfaceUser, +} from "../../models"; +import { AgendaSectionModel, AppUserProfile, User } from "../../models"; +import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; +import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; +import { cacheUsers } from "../../services/UserCache/cacheUser"; +import { findUserInCache } from "../../services/UserCache/findUserInCache"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; + +/** + * Resolver function for the GraphQL mutation 'updateAgendaSection'. + * + * This resolver updates an agenda section and performs necessary authorization checks. + * + * @param _parent - The parent object, not used in this resolver. + * @param args - The input arguments for the mutation. + * @param context - The context object containing user information. + * @returns A promise that resolves to the updated agenda section. + */ + +export const updateAgendaSection: MutationResolvers["updateAgendaSection"] = + async (_parent, args, context) => { + // Fetch the current user + let currentUser: InterfaceUser | null; + const userFoundInCache = await findUserInCache([context.userId]); + currentUser = userFoundInCache[0]; + if (currentUser === null) { + currentUser = await User.findOne({ + _id: context.userId, + }).lean(); + if (currentUser !== null) { + await cacheUsers([currentUser]); + } + } + + // If the user is not found, throw a NotFoundError + if (!currentUser) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + + let currentUserAppProfile: InterfaceAppUserProfile | null; + const appUserProfileFoundInCache = await findAppUserProfileCache([ + currentUser.appUserProfileId?.toString(), + ]); + currentUserAppProfile = appUserProfileFoundInCache[0]; + if (currentUserAppProfile === null) { + currentUserAppProfile = await AppUserProfile.findOne({ + userId: currentUser._id, + }).lean(); + if (currentUserAppProfile !== null) { + await cacheAppUserProfile([currentUserAppProfile]); + } + } + if (!currentUserAppProfile) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + // Find the agenda section by ID + const agendaSection = await AgendaSectionModel.findById(args.id); + + // If the agenda section is not found, throw a NotFoundError + if (!agendaSection) { + throw new errors.NotFoundError( + requestContext.translate( + AGENDA_SECTION_NOT_FOUND_ERROR.MESSAGE, + AGENDA_SECTION_NOT_FOUND_ERROR.PARAM, + ), + AGENDA_SECTION_NOT_FOUND_ERROR.CODE, + AGENDA_SECTION_NOT_FOUND_ERROR.PARAM, + ); + } + + // Check if the current user is the creator of the agenda section or is a superadmin + if ( + !( + agendaSection.createdBy && + agendaSection.createdBy.equals(currentUser._id) + ) && + !currentUserAppProfile.isSuperAdmin + ) { + throw new errors.UnauthorizedError( + requestContext.translate( + USER_NOT_AUTHORIZED_ERROR.MESSAGE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + const updatedAgendaSection = await AgendaSectionModel.findOneAndUpdate( + { + _id: args.id, + }, + { + ...(args.input as InterfaceAgendaSection), + }, + { + new: true, // Return the updated document + }, + ).lean(); + return updatedAgendaSection; + }; diff --git a/src/resolvers/Mutation/updateCommunity.ts b/src/resolvers/Mutation/updateCommunity.ts new file mode 100644 index 0000000000..dfc672eeda --- /dev/null +++ b/src/resolvers/Mutation/updateCommunity.ts @@ -0,0 +1,105 @@ +import { + USER_NOT_FOUND_ERROR, + USER_NOT_AUTHORIZED_ERROR, + PRELOGIN_IMAGERY_FIELD_EMPTY, +} from "../../constants"; +import { errors, requestContext } from "../../libraries"; +import { AppUserProfile, Community, User } from "../../models"; +import type { InterfaceAppUserProfile, InterfaceUser } from "../../models"; +import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; +import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; +import { cacheUsers } from "../../services/UserCache/cacheUser"; +import { findUserInCache } from "../../services/UserCache/findUserInCache"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; +import { superAdminCheck } from "../../utilities"; + +/** + * This function enables to upload Pre login imagery. + * @param _parent - parent of current request + * @param args - payload provided with the request + * @param context - context of entire application + * @remarks The following checks are done: + * 1. If the user exists. + * 2. If the user is super admin. + * @returns Boolean. + */ + +export const updateCommunity: MutationResolvers["updateCommunity"] = async ( + _parent, + args, + context, +) => { + let user: InterfaceUser | null; + const userFoundInCache = await findUserInCache([context.userId]); + user = userFoundInCache[0]; + if (user === null) { + user = await User.findOne({ + _id: context.userId, + }).lean(); + if (user !== null) { + await cacheUsers([user]); + } + } + + if (!user) + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + + let currentUserAppProfile: InterfaceAppUserProfile | null; + const appUserProfileFoundInCache = await findAppUserProfileCache([ + user.appUserProfileId?.toString(), + ]); + currentUserAppProfile = appUserProfileFoundInCache[0]; + if (currentUserAppProfile === null) { + currentUserAppProfile = await AppUserProfile.findOne({ + userId: user._id, + }).lean(); + if (currentUserAppProfile !== null) { + await cacheAppUserProfile([currentUserAppProfile]); + } + } + if (!currentUserAppProfile) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + superAdminCheck(currentUserAppProfile as InterfaceAppUserProfile); + + // args.data should have logo, name and websiteLink + if (!args.data.name || !args.data.logo || !args.data.websiteLink) { + throw new errors.InputValidationError( + requestContext.translate(PRELOGIN_IMAGERY_FIELD_EMPTY.MESSAGE), + PRELOGIN_IMAGERY_FIELD_EMPTY.CODE, + PRELOGIN_IMAGERY_FIELD_EMPTY.PARAM, + ); + } + + // If previous data exists then delete the previous data + const data = await Community.findOne(); + if (data) { + await Community.deleteOne({ _id: data._id }); + } + + await Community.create({ + name: args.data.name, + websiteLink: args.data.websiteLink, + logoUrl: args.data.logo, + socialMediaUrls: { + facebook: args.data.socialMediaUrls.facebook, + instagram: args.data.socialMediaUrls.facebook, + X: args.data.socialMediaUrls.X, + linkedIn: args.data.socialMediaUrls.linkedIn, + gitHub: args.data.socialMediaUrls.gitHub, + youTube: args.data.socialMediaUrls.youTube, + slack: args.data.socialMediaUrls.slack, + reddit: args.data.socialMediaUrls.reddit, + }, + }); + + return true; +}; diff --git a/src/resolvers/Mutation/updateEvent.ts b/src/resolvers/Mutation/updateEvent.ts new file mode 100644 index 0000000000..84a17d3662 --- /dev/null +++ b/src/resolvers/Mutation/updateEvent.ts @@ -0,0 +1,213 @@ +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; +import { errors, requestContext } from "../../libraries"; +import type { + InterfaceAppUserProfile, + InterfaceEvent, + InterfaceUser, +} from "../../models"; +import { User, Event, AppUserProfile } from "../../models"; +import { + USER_NOT_FOUND_ERROR, + EVENT_NOT_FOUND_ERROR, + USER_NOT_AUTHORIZED_ERROR, + LENGTH_VALIDATION_ERROR, +} from "../../constants"; +import { isValidString } from "../../libraries/validators/validateString"; +import { findEventsInCache } from "../../services/EventCache/findEventInCache"; +import { cacheEvents } from "../../services/EventCache/cacheEvents"; +import { session } from "../../db"; +import { + updateRecurringEvent, + updateSingleEvent, +} from "../../helpers/event/updateEventHelpers"; +import mongoose from "mongoose"; +import { findUserInCache } from "../../services/UserCache/findUserInCache"; +import { cacheUsers } from "../../services/UserCache/cacheUser"; +import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; +import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; + +/** + * This function enables to update an event. + * @param _parent - parent of current request + * @param args - payload provided with the request + * @param context - context of entire application + * @remarks The following checks are done: + * 1. If the user exists. + * 2. If the event exists. + * 3. The the user is an admin of the event. + * @returns Updated event. + */ + +export const updateEvent: MutationResolvers["updateEvent"] = async ( + _parent, + args, + context, +) => { + let currentUser: InterfaceUser | null; + const userFoundInCache = await findUserInCache([context.userId]); + currentUser = userFoundInCache[0]; + if (currentUser === null) { + currentUser = await User.findOne({ + _id: context.userId, + }).lean(); + if (currentUser !== null) { + await cacheUsers([currentUser]); + } + } + + // checks if current user exists + if (currentUser === null) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + + let currentUserAppProfile: InterfaceAppUserProfile | null; + const appUserProfileFoundInCache = await findAppUserProfileCache([ + currentUser.appUserProfileId?.toString(), + ]); + currentUserAppProfile = appUserProfileFoundInCache[0]; + if (currentUserAppProfile === null) { + currentUserAppProfile = await AppUserProfile.findOne({ + userId: currentUser._id, + }).lean(); + if (currentUserAppProfile !== null) { + await cacheAppUserProfile([currentUserAppProfile]); + } + } + if (!currentUserAppProfile) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + + let event: InterfaceEvent | null; + + const eventFoundInCache = await findEventsInCache([args.id]); + + event = eventFoundInCache[0]; + + if (eventFoundInCache[0] === null) { + event = await Event.findOne({ + _id: args.id, + }).lean(); + + if (event !== null) { + await cacheEvents([event]); + } + } + + // checks if there exists an event with _id === args.id + if (!event) { + throw new errors.NotFoundError( + requestContext.translate(EVENT_NOT_FOUND_ERROR.MESSAGE), + EVENT_NOT_FOUND_ERROR.CODE, + EVENT_NOT_FOUND_ERROR.PARAM, + ); + } + + // Boolean to determine whether user is an admin of organization. + const currentUserIsOrganizationAdmin = currentUserAppProfile.adminFor.some( + (organization) => + organization && + new mongoose.Types.ObjectId(organization.toString()).equals( + event?.organization, + ), + ); + + // Boolean to determine whether user is an admin of event. + const currentUserIsEventAdmin = event.admins.some( + (admin) => + admin === context.userID || + new mongoose.Types.ObjectId(admin.toString()).equals(context.userId), + ); + + // Checks whether currentUser cannot update event. + if ( + !( + currentUserIsOrganizationAdmin || + currentUserIsEventAdmin || + currentUserAppProfile.isSuperAdmin + ) + ) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + + // Checks if the recieved arguments are valid according to standard input norms + const validationResultTitle = isValidString(args.data?.title ?? "", 256); + const validationResultDescription = isValidString( + args.data?.description ?? "", + 500, + ); + const validationResultLocation = isValidString(args.data?.location ?? "", 50); + if (!validationResultTitle.isLessThanMaxLength) { + throw new errors.InputValidationError( + requestContext.translate( + `${LENGTH_VALIDATION_ERROR.MESSAGE} 256 characters in title`, + ), + LENGTH_VALIDATION_ERROR.CODE, + ); + } + if (!validationResultDescription.isLessThanMaxLength) { + throw new errors.InputValidationError( + requestContext.translate( + `${LENGTH_VALIDATION_ERROR.MESSAGE} 500 characters in description`, + ), + LENGTH_VALIDATION_ERROR.CODE, + ); + } + if (!validationResultLocation.isLessThanMaxLength) { + throw new errors.InputValidationError( + requestContext.translate( + `${LENGTH_VALIDATION_ERROR.MESSAGE} 50 characters in location`, + ), + LENGTH_VALIDATION_ERROR.CODE, + ); + } + + /* c8 ignore start */ + if (session) { + // start a transaction + session.startTransaction(); + } + + /* c8 ignore stop */ + try { + let updatedEvent: InterfaceEvent = event; + + if (event.recurring) { + // update recurring event + updatedEvent = await updateRecurringEvent(args, event, session); + } else { + // update single event + updatedEvent = await updateSingleEvent(args, event, session); + } + + /* c8 ignore start */ + if (session) { + // commit transaction if everything's successful + await session.commitTransaction(); + } + + /* c8 ignore stop */ + return updatedEvent; + /* c8 ignore start */ + } catch (error) { + if (session) { + // abort transaction if something fails + await session.abortTransaction(); + } + + throw error; + } + + /* c8 ignore stop */ +}; diff --git a/src/resolvers/Mutation/updateEventVolunteer.ts b/src/resolvers/Mutation/updateEventVolunteer.ts new file mode 100644 index 0000000000..68d5cdbdbb --- /dev/null +++ b/src/resolvers/Mutation/updateEventVolunteer.ts @@ -0,0 +1,97 @@ +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; +import type { EventVolunteerResponse } from "../../constants"; +import { + EVENT_VOLUNTEER_INVITE_USER_MISTMATCH, + EVENT_VOLUNTEER_NOT_FOUND_ERROR, + USER_NOT_FOUND_ERROR, +} from "../../constants"; +import type { InterfaceEventVolunteer, InterfaceUser } from "../../models"; +import { User, EventVolunteer } from "../../models"; +import { errors, requestContext } from "../../libraries"; +import { findUserInCache } from "../../services/UserCache/findUserInCache"; +import { cacheUsers } from "../../services/UserCache/cacheUser"; +/** + * This function enables to update an Event Volunteer + * @param _parent - parent of current request + * @param args - payload provided with the request + * @param context - context of entire application + * @remarks The following checks are done: + * 1. Whether the user exists + * 2. Whether the EventVolunteer exists + * 3. Whether the current user is the user of EventVolunteer + * 4. Whether the EventVolunteer is invited + */ +export const updateEventVolunteer: MutationResolvers["updateEventVolunteer"] = + async (_parent, args, context) => { + let currentUser: InterfaceUser | null; + const userFoundInCache = await findUserInCache([context.userId]); + currentUser = userFoundInCache[0]; + if (currentUser === null) { + currentUser = await User.findOne({ + _id: context.userId, + }).lean(); + if (currentUser !== null) { + await cacheUsers([currentUser]); + } + } + + if (!currentUser) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + + const eventVolunteer = await EventVolunteer.findOne({ + _id: args.id, + }).lean(); + + if (!eventVolunteer) { + throw new errors.NotFoundError( + requestContext.translate(EVENT_VOLUNTEER_NOT_FOUND_ERROR.MESSAGE), + EVENT_VOLUNTEER_NOT_FOUND_ERROR.CODE, + EVENT_VOLUNTEER_NOT_FOUND_ERROR.PARAM, + ); + } + + if (eventVolunteer.userId.toString() !== context.userId.toString()) { + throw new errors.ConflictError( + requestContext.translate(EVENT_VOLUNTEER_INVITE_USER_MISTMATCH.MESSAGE), + EVENT_VOLUNTEER_INVITE_USER_MISTMATCH.CODE, + EVENT_VOLUNTEER_INVITE_USER_MISTMATCH.PARAM, + ); + } + + const updatedVolunteer = await EventVolunteer.findOneAndUpdate( + { + _id: args.id, + }, + { + $set: { + eventId: + args.data?.eventId === undefined + ? eventVolunteer.eventId + : (args?.data.eventId as string), + isAssigned: + args.data?.isAssigned === undefined + ? eventVolunteer.isAssigned + : (args.data?.isAssigned as boolean), + isInvited: + args.data?.isInvited === undefined + ? eventVolunteer.isInvited + : (args.data?.isInvited as boolean), + response: + args.data?.response === undefined + ? eventVolunteer.response + : (args.data?.response as EventVolunteerResponse), + }, + }, + { + new: true, + runValidators: true, + }, + ).lean(); + + return updatedVolunteer as InterfaceEventVolunteer; + }; diff --git a/src/resolvers/Mutation/updateEventVolunteerGroup.ts b/src/resolvers/Mutation/updateEventVolunteerGroup.ts new file mode 100644 index 0000000000..e7c67290d4 --- /dev/null +++ b/src/resolvers/Mutation/updateEventVolunteerGroup.ts @@ -0,0 +1,88 @@ +import { + EVENT_VOLUNTEER_GROUP_NOT_FOUND_ERROR, + USER_NOT_AUTHORIZED_ERROR, + USER_NOT_FOUND_ERROR, +} from "../../constants"; +import { errors, requestContext } from "../../libraries"; +import type { InterfaceEventVolunteerGroup, InterfaceUser } from "../../models"; +import { EventVolunteerGroup, User } from "../../models"; +import { cacheUsers } from "../../services/UserCache/cacheUser"; +import { findUserInCache } from "../../services/UserCache/findUserInCache"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; +/** + * This function enables to update the Event Volunteer Group + * @param _parent - parent of current request + * @param args - payload provided with the request + * @param context - context of entire application + * @remarks The following checks are done: + * 1. Whether the user exists + * 2. Whether the EventVolunteerGroup exists + * 3. Whether the current user is the leader of EventVolunteerGroup + */ +export const updateEventVolunteerGroup: MutationResolvers["updateEventVolunteerGroup"] = + async (_parent, args, context) => { + let currentUser: InterfaceUser | null; + const userFoundInCache = await findUserInCache([context.userId]); + currentUser = userFoundInCache[0]; + if (currentUser === null) { + currentUser = await User.findOne({ + _id: context.userId, + }).lean(); + if (currentUser !== null) { + await cacheUsers([currentUser]); + } + } + + if (!currentUser) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + + const group = await EventVolunteerGroup.findOne({ + _id: args.id, + }).lean(); + + if (!group) { + throw new errors.NotFoundError( + requestContext.translate(EVENT_VOLUNTEER_GROUP_NOT_FOUND_ERROR.MESSAGE), + EVENT_VOLUNTEER_GROUP_NOT_FOUND_ERROR.CODE, + EVENT_VOLUNTEER_GROUP_NOT_FOUND_ERROR.PARAM, + ); + } + + if (group.leaderId.toString() !== context.userId.toString()) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + + const updatedGroup = await EventVolunteerGroup.findOneAndUpdate( + { + _id: args.id, + }, + { + $set: { + eventId: + args.data?.eventId === undefined + ? group.eventId + : args?.data.eventId, + name: args.data?.name === undefined ? group.name : args?.data.name, + volunteersRequired: + args.data?.volunteersRequired === undefined + ? group.volunteersRequired + : args?.data.volunteersRequired, + }, + }, + { + new: true, + runValidators: true, + }, + ).lean(); + + return updatedGroup as InterfaceEventVolunteerGroup; + }; diff --git a/src/resolvers/Mutation/updateFund.ts b/src/resolvers/Mutation/updateFund.ts new file mode 100644 index 0000000000..94cfae6d5e --- /dev/null +++ b/src/resolvers/Mutation/updateFund.ts @@ -0,0 +1,133 @@ +import { + FUND_ALREADY_EXISTS, + FUND_NOT_FOUND_ERROR, + ORGANIZATION_NOT_FOUND_ERROR, + USER_NOT_AUTHORIZED_ERROR, + USER_NOT_FOUND_ERROR, +} from "../../constants"; +import { errors, requestContext } from "../../libraries"; +import type { InterfaceAppUserProfile, InterfaceUser } from "../../models"; +import { AppUserProfile, Organization, User } from "../../models"; +import { Fund, type InterfaceFund } from "../../models/Fund"; +import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; +import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; +import { cacheUsers } from "../../services/UserCache/cacheUser"; +import { findUserInCache } from "../../services/UserCache/findUserInCache"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; +import { adminCheck } from "../../utilities"; + +/** + * This function enables to update an organization specific fund. + * @param _parent - parent of current request + * @param args - payload provided with the request + * @param context - context of entire application + * @remarks The following checks are done: + * 1. If the user exists. + * 2. If the Fund of the organization exists. + * 3. If the organization exists. + * 4.If the user is authorized to update the fund. + * 5. If the fund already exists with the same name. + * @returns Updated Fund. + */ + +export const updateFund: MutationResolvers["updateFund"] = async ( + _parent, + args, + context, +): Promise => { + let currentUser: InterfaceUser | null; + const userFoundInCache = await findUserInCache([context.userId]); + currentUser = userFoundInCache[0]; + if (currentUser === null) { + currentUser = await User.findOne({ + _id: context.userId, + }).lean(); + if (currentUser !== null) { + await cacheUsers([currentUser]); + } + } + + //Checks if the current user exists + if (!currentUser) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + + let currentUserAppProfile: InterfaceAppUserProfile | null; + const appUserProfileFoundInCache = await findAppUserProfileCache([ + currentUser.appUserProfileId?.toString(), + ]); + currentUserAppProfile = appUserProfileFoundInCache[0]; + if (currentUserAppProfile === null) { + currentUserAppProfile = await AppUserProfile.findOne({ + userId: currentUser._id, + }).lean(); + if (currentUserAppProfile !== null) { + await cacheAppUserProfile([currentUserAppProfile]); + } + } + if (!currentUserAppProfile) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + + const fund = await Fund.findOne({ + _id: args.id, + }); + //Checks if the fund exists + if (!fund) { + throw new errors.NotFoundError( + requestContext.translate(FUND_NOT_FOUND_ERROR.MESSAGE), + FUND_NOT_FOUND_ERROR.CODE, + FUND_NOT_FOUND_ERROR.PARAM, + ); + } + const organizaton = await Organization.findOne({ + _id: fund.organizationId, + }); + //Checks if the organization exists + if (!organizaton) { + throw new errors.NotFoundError( + requestContext.translate(ORGANIZATION_NOT_FOUND_ERROR.MESSAGE), + ORGANIZATION_NOT_FOUND_ERROR.CODE, + ORGANIZATION_NOT_FOUND_ERROR.PARAM, + ); + } + //checks if the user is authorized to update the fund + await adminCheck(currentUser._id, organizaton); + + //if the name is provided, checks if the fund already exists with the same name + if (args.data.name) { + const exisitingFund = await Fund.findOne({ + name: args.data.name, + organizationId: fund.organizationId, + }); + //checks if the fund already exists + if (exisitingFund) { + throw new errors.ConflictError( + requestContext.translate(FUND_ALREADY_EXISTS.MESSAGE), + FUND_ALREADY_EXISTS.CODE, + FUND_ALREADY_EXISTS.PARAM, + ); + } + } + //updates the fund with the provided data + const updatedFund = await Fund.findOneAndUpdate( + { + _id: args.id, + }, + { + $set: args.data, + }, + { + new: true, + }, + ); + return updatedFund as InterfaceFund; +}; diff --git a/src/resolvers/Mutation/updateFundCampaignPledge.ts b/src/resolvers/Mutation/updateFundCampaignPledge.ts new file mode 100644 index 0000000000..2090dff91c --- /dev/null +++ b/src/resolvers/Mutation/updateFundCampaignPledge.ts @@ -0,0 +1,147 @@ +import { Types } from "mongoose"; +import { + FUNDRAISING_CAMPAIGN_PLEDGE_NOT_FOUND_ERROR, + USER_NOT_FOUND_ERROR, +} from "../../constants"; +import { errors, requestContext } from "../../libraries"; +import type { InterfaceUser } from "../../models"; +import { AppUserProfile, User } from "../../models"; +import { + FundraisingCampaignPledge, + type InterfaceFundraisingCampaignPledges, +} from "../../models/FundraisingCampaignPledge"; +import { cacheUsers } from "../../services/UserCache/cacheUser"; +import { findUserInCache } from "../../services/UserCache/findUserInCache"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; +import { validateDate } from "../../utilities/dateValidator"; + +/** + * This function enables to update a fundraising campaign pledge. + * @param _parent - parent of current request + * @param args - payload provided with the request + * @param context - context of entire application + * @remarks The following checks are done: + * 1. If the user exists. + * 2. If the FundraisingCampaignPledge exists. + * 3. If the user has made the pledge. + * 4. If the start date is valid. + * 5. If the end date is valid. + * @returns Updated campaign pledge. + */ + +export const updateFundraisingCampaignPledge: MutationResolvers["updateFundraisingCampaignPledge"] = + async ( + _parent, + args, + context, + ): Promise => { + let currentUser: InterfaceUser | null; + const userFoundInCache = await findUserInCache([context.userId]); + currentUser = userFoundInCache[0]; + if (currentUser === null) { + currentUser = await User.findOne({ + _id: context.userId, + }).lean(); + if (currentUser !== null) { + await cacheUsers([currentUser]); + } + } + + // Checks whether currentUser exists. + if (!currentUser) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + const pledge = await FundraisingCampaignPledge.findOne({ + _id: args.id, + }).lean(); + + // Checks whether pledge exists. + if (!pledge) { + throw new errors.NotFoundError( + requestContext.translate( + FUNDRAISING_CAMPAIGN_PLEDGE_NOT_FOUND_ERROR.MESSAGE, + ), + FUNDRAISING_CAMPAIGN_PLEDGE_NOT_FOUND_ERROR.CODE, + FUNDRAISING_CAMPAIGN_PLEDGE_NOT_FOUND_ERROR.PARAM, + ); + } + + const startDate: Date | undefined = args.data.startDate; + const endDate: Date | undefined = args.data.endDate; + validateDate(startDate, endDate); + + if (args.data.users && args.data.users.length > 0) { + const users = await User.find({ _id: { $in: args.data.users } }).lean(); + if (users.length !== args.data.users.length) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + + // Identify all users who were previously part of the pledge and were removed + const usersRemoved = pledge.users.filter( + (userId) => userId && !args.data.users?.includes(userId.toString()), + ); + + // Update AppUserProfile for every user who was removed from the pledge + for (const userId of usersRemoved) { + const updatedUserProfile = await AppUserProfile.findOneAndUpdate( + { userId }, + { $pull: { pledges: args.id } }, + { new: true }, + ); + + // Remove campaign from appUserProfile if there is no pledge left for that campaign. + const pledges = + updatedUserProfile?.pledges as InterfaceFundraisingCampaignPledges[]; + + const campaignId = pledge.campaign?.toString(); + const otherPledges = pledges.filter( + (p) => p.campaign?.toString() === campaignId, + ); + + if (otherPledges.length === 0) { + await AppUserProfile.findOneAndUpdate( + { userId }, + { $pull: { campaigns: campaignId } }, + { new: true }, + ); + } + } + + // Identify all users who are newly added to the pledge + const usersAdded = args.data.users.filter( + (userId) => + userId && !pledge.users.includes(new Types.ObjectId(userId)), + ); + + // Update AppUserProfile for every user who is newly added to the pledge + await AppUserProfile.updateMany( + { + userId: { $in: usersAdded }, + }, + { + $addToSet: { pledges: pledge._id, campaigns: pledge.campaign }, + }, + ); + } + + const updatedPledge = await FundraisingCampaignPledge.findOneAndUpdate( + { + _id: args.id, + }, + { + $set: args.data, + }, + { + new: true, + }, + ); + return updatedPledge as InterfaceFundraisingCampaignPledges; + }; diff --git a/src/resolvers/Mutation/updateFundraisingCampaign.ts b/src/resolvers/Mutation/updateFundraisingCampaign.ts new file mode 100644 index 0000000000..8ef52ba6a6 --- /dev/null +++ b/src/resolvers/Mutation/updateFundraisingCampaign.ts @@ -0,0 +1,170 @@ +import { Types } from "mongoose"; +import { + FUNDRAISING_CAMPAIGN_ALREADY_EXISTS, + FUNDRAISING_CAMPAIGN_NOT_FOUND_ERROR, + FUND_NOT_FOUND_ERROR, + USER_NOT_AUTHORIZED_ERROR, + USER_NOT_FOUND_ERROR, +} from "../../constants"; +import { errors, requestContext } from "../../libraries"; +import { + AppUserProfile, + Fund, + FundraisingCampaign, + User, + type InterfaceAppUserProfile, + type InterfaceFundraisingCampaign, + type InterfaceUser, +} from "../../models"; + +import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; +import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; +import { cacheUsers } from "../../services/UserCache/cacheUser"; +import { findUserInCache } from "../../services/UserCache/findUserInCache"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; +import { validateDate } from "../../utilities/dateValidator"; + +/** + * This function enables to update a fundraising campaign. + * @param _parent - parent of current request + * @param args - payload provided with the request + * @param context - context of entire application + * @remarks The following checks are done: + * 1. If the user exists. + * 2. If the FundraisingCampaign exists. + * 3. If the user is authorized to update the fundraising campaign. + * 4. If the fundraising campaign already exists with the same name. + * 5. If the start date is valid. + * 6. If the end date is valid. + * @returns Updated campaign. + */ + +export const updateFundraisingCampaign: MutationResolvers["updateFundraisingCampaign"] = + async (_parent, args, context): Promise => { + let currentUser: InterfaceUser | null; + const userFoundInCache = await findUserInCache([context.userId]); + currentUser = userFoundInCache[0]; + if (currentUser === null) { + currentUser = await User.findOne({ + _id: context.userId, + }).lean(); + if (currentUser !== null) { + await cacheUsers([currentUser]); + } + } + + //Checks if the current user exists + if (!currentUser) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + + let currentUserAppProfile: InterfaceAppUserProfile | null; + const appUserProfileFoundInCache = await findAppUserProfileCache([ + currentUser.appUserProfileId?.toString(), + ]); + currentUserAppProfile = appUserProfileFoundInCache[0]; + if (currentUserAppProfile === null) { + currentUserAppProfile = await AppUserProfile.findOne({ + userId: currentUser._id, + }).lean(); + if (currentUserAppProfile !== null) { + await cacheAppUserProfile([currentUserAppProfile]); + } + } + if (!currentUserAppProfile) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + const campaigin = await FundraisingCampaign.findById({ + _id: args.id, + }); + + //Checks if the fundraising campaign exists + if (!campaigin) { + throw new errors.NotFoundError( + requestContext.translate(FUNDRAISING_CAMPAIGN_NOT_FOUND_ERROR.MESSAGE), + FUNDRAISING_CAMPAIGN_NOT_FOUND_ERROR.CODE, + FUNDRAISING_CAMPAIGN_NOT_FOUND_ERROR.PARAM, + ); + } + let startDate; + let endDate; + + if (args.data.startDate) { + startDate = args.data.startDate; + } + if (args.data.endDate) { + endDate = args.data.endDate; + } + + validateDate(startDate, endDate); + const fund = await Fund.findOne({ + _id: campaigin.fundId?.toString(), + }); + + //Checks if the fund exists + if (!fund) { + throw new errors.NotFoundError( + requestContext.translate(FUND_NOT_FOUND_ERROR.MESSAGE), + FUND_NOT_FOUND_ERROR.CODE, + FUND_NOT_FOUND_ERROR.PARAM, + ); + } + + const currentOrg = await Fund.findById(fund._id) + .select("organizationId") + .lean(); + + const currentOrgId = currentOrg?.organizationId?.toString(); + + const currentUserIsOrgAdmin = currentUserAppProfile.adminFor.some( + (organizationId) => + new Types.ObjectId(organizationId?.toString()).equals(currentOrgId), + ); + + //Checks if the user is authorized to update the fundraising campaign + if (!(currentUserIsOrgAdmin || currentUserAppProfile.isSuperAdmin)) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + + //Checks if the name is provided, checks if the fundraising campaign already exists with the same name + if (args.data.name) { + const exisitingCampaign = await FundraisingCampaign.findOne({ + name: args.data.name, + }); + + if (exisitingCampaign) { + throw new errors.ConflictError( + requestContext.translate(FUNDRAISING_CAMPAIGN_ALREADY_EXISTS.MESSAGE), + FUNDRAISING_CAMPAIGN_ALREADY_EXISTS.CODE, + FUNDRAISING_CAMPAIGN_ALREADY_EXISTS.PARAM, + ); + } + } + + //Updates the fundraising campaign with the provided data + const updatedCampaign = await FundraisingCampaign.findOneAndUpdate( + { + _id: args.id.toString(), + }, + { + $set: args.data, + }, + { + new: true, + }, + ).lean(); + + return updatedCampaign as InterfaceFundraisingCampaign; + }; diff --git a/src/resolvers/Mutation/updateLanguage.ts b/src/resolvers/Mutation/updateLanguage.ts new file mode 100644 index 0000000000..3e21e926a1 --- /dev/null +++ b/src/resolvers/Mutation/updateLanguage.ts @@ -0,0 +1,31 @@ +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; +import { User } from "../../models"; +import type { InterfaceUser } from "../../models"; +/** + * This function enables to update language. + * @param _parent - parent of current request + * @param args - payload provided with the request + * @param context - context of entire application + * @remarks The following checks are done: + * 1. If the user exists. + * @returns Updated language. + */ +export const updateLanguage: MutationResolvers["updateLanguage"] = async ( + _parent, + args, + context, +) => { + return (await User.findOneAndUpdate( + { + _id: context.userId, + }, + { + $set: { + appLanguageCode: args.languageCode, + }, + }, + { + new: true, + }, + ).lean()) as InterfaceUser; +}; diff --git a/src/resolvers/Mutation/updateNote.ts b/src/resolvers/Mutation/updateNote.ts new file mode 100644 index 0000000000..52a7391907 --- /dev/null +++ b/src/resolvers/Mutation/updateNote.ts @@ -0,0 +1,124 @@ +import { + NOTE_NOT_FOUND_ERROR, + USER_NOT_AUTHORIZED_ERROR, + USER_NOT_FOUND_ERROR, + UNAUTHORIZED_UPDATE_NOTE_ERROR, +} from "../../constants"; +import { errors, requestContext } from "../../libraries"; +import type { + InterfaceNote, + InterfaceAppUserProfile, + InterfaceUser, +} from "../../models"; +import { NoteModel, AppUserProfile, User } from "../../models"; +import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; +import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; +import { cacheUsers } from "../../services/UserCache/cacheUser"; +import { findUserInCache } from "../../services/UserCache/findUserInCache"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; + +/** + * Updates an existing note in the system. + * + * This function updates a specific note in the database. It first checks if the current user + * exists and if they have the proper profile. Then it verifies if the note exists and whether + * the current user is authorized to update it. If all checks pass, the function updates the note + * with the provided data. + * + * The function performs the following steps: + * 1. Retrieves the current user from the cache or database. + * 2. Verifies if the current user exists. + * 3. Retrieves the current user's profile from the cache or database. + * 4. Checks if the user has the necessary authorization to update the note. + * 5. Finds the note to be updated in the database. + * 6. Verifies that the note belongs to the current user. + * 7. Updates the note with the new data provided. + * + * @param _parent - This parameter is not used in this resolver function. + * @param args - The arguments provided by the GraphQL query, including the ID of the note to be updated and the new data. + * @param context - The context of the request, containing information about the currently authenticated user. + * + * @returns The updated note. + */ + +export const updateNote: MutationResolvers["updateNote"] = async ( + _parent, + args, + context, +): Promise => { + const userId = context.userId; + + let currentUser: InterfaceUser | null; + const userFoundInCache = await findUserInCache([userId]); + currentUser = userFoundInCache[0]; + if (currentUser === null) { + currentUser = await User.findOne({ + _id: userId, + }).lean(); + if (currentUser !== null) { + await cacheUsers([currentUser]); + } + } + + if (!currentUser) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + + let currentUserAppProfile: InterfaceAppUserProfile | null; + const appUserProfileFoundInCache = await findAppUserProfileCache([ + currentUser.appUserProfileId?.toString(), + ]); + currentUserAppProfile = appUserProfileFoundInCache[0]; + if (currentUserAppProfile === null) { + currentUserAppProfile = await AppUserProfile.findOne({ + userId: currentUser._id, + }).lean(); + if (currentUserAppProfile !== null) { + await cacheAppUserProfile([currentUserAppProfile]); + } + } + if (!currentUserAppProfile) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + + const note: InterfaceNote | null = await NoteModel.findOne({ + _id: args.id, + }).lean(); + + if (!note) { + throw new errors.NotFoundError( + requestContext.translate(NOTE_NOT_FOUND_ERROR.MESSAGE), + NOTE_NOT_FOUND_ERROR.CODE, + NOTE_NOT_FOUND_ERROR.PARAM, + ); + } + if (note.createdBy?.toString() !== currentUser._id.toString()) { + throw new errors.UnauthorizedError( + requestContext.translate(UNAUTHORIZED_UPDATE_NOTE_ERROR.MESSAGE), + UNAUTHORIZED_UPDATE_NOTE_ERROR.CODE, + UNAUTHORIZED_UPDATE_NOTE_ERROR.PARAM, + ); + } + + const updatedNote = await NoteModel.findOneAndUpdate( + { + _id: args.id, + }, + { + ...(args.data as unknown as InterfaceNote), + }, + { + new: true, + }, + ).lean(); + + return updatedNote as InterfaceNote; +}; diff --git a/src/resolvers/Mutation/updateOrganization.ts b/src/resolvers/Mutation/updateOrganization.ts new file mode 100644 index 0000000000..8d27b1bd51 --- /dev/null +++ b/src/resolvers/Mutation/updateOrganization.ts @@ -0,0 +1,77 @@ +import { ORGANIZATION_NOT_FOUND_ERROR } from "../../constants"; +import { errors, requestContext } from "../../libraries"; +import type { InterfaceOrganization } from "../../models"; +import { Organization } from "../../models"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; +import { adminCheck } from "../../utilities"; + +import { cacheOrganizations } from "../../services/OrganizationCache/cacheOrganizations"; +import { findOrganizationsInCache } from "../../services/OrganizationCache/findOrganizationsInCache"; +import { uploadEncodedImage } from "../../utilities/encodedImageStorage/uploadEncodedImage"; +/** + * This function enables to update an organization. + * @param _parent - parent of current request + * @param args - payload provided with the request + * @param context - context of entire application + * @remarks The following checks are done: + * 1. If the organization exists. + * 2. The the user is an admin of the organization. + * @returns Updated organization. + */ + +export const updateOrganization: MutationResolvers["updateOrganization"] = + async (_parent, args, context) => { + let organization; + + const organizationFoundInCache = await findOrganizationsInCache([args.id]); + + organization = organizationFoundInCache[0]; + + if (organizationFoundInCache[0] == null) { + organization = await Organization.findOne({ + _id: args.id, + }).lean(); + if (organization) await cacheOrganizations([organization]); + } + + // Checks if organization with _id === args.id exists. + if (!organization) { + throw new errors.NotFoundError( + requestContext.translate(ORGANIZATION_NOT_FOUND_ERROR.MESSAGE), + ORGANIZATION_NOT_FOUND_ERROR.CODE, + ORGANIZATION_NOT_FOUND_ERROR.PARAM, + ); + } + + // checks if the current user is an admin of the organization + await adminCheck(context.userId, organization); + + let uploadImageFileName; + if (args.file) { + uploadImageFileName = await uploadEncodedImage( + args.file, + organization?.image, + ); + } + + const updatedOrganization = await Organization.findOneAndUpdate( + { + _id: organization._id, + }, + { + $set: { + ...args.data, + image: uploadImageFileName || organization.image, + }, + }, + { + new: true, + }, + ).lean(); + + if (updatedOrganization !== null) { + await cacheOrganizations([updatedOrganization]); + } + + return updatedOrganization as InterfaceOrganization; + }; diff --git a/src/resolvers/Mutation/updatePluginStatus.ts b/src/resolvers/Mutation/updatePluginStatus.ts new file mode 100644 index 0000000000..d9f84131cd --- /dev/null +++ b/src/resolvers/Mutation/updatePluginStatus.ts @@ -0,0 +1,61 @@ +import mongoose from "mongoose"; +import { PLUGIN_NOT_FOUND } from "../../constants"; +import { errors, requestContext } from "../../libraries"; +import type { InterfacePlugin } from "../../models"; +import { Plugin } from "../../models"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; + +/** + * This function enables to update plugin install status. + * @param _parent - parent of current request + * @param args - payload provided with the request contains _id of the plugin and orgID of the org that wants to change it's status. + * @param _context - context of entire application + * @returns Updated PLugin status. + */ +export const updatePluginStatus: MutationResolvers["updatePluginStatus"] = + async (_parent, args, context): Promise => { + const uid = args.id; + // const currOrgID = mongoose.Types.ObjectId(args.orgId) ; + const currOrgID = args.orgId; + + const plugin = await Plugin.findById(uid); + + if (!plugin) { + throw new errors.NotFoundError( + requestContext.translate(PLUGIN_NOT_FOUND.MESSAGE), + PLUGIN_NOT_FOUND.CODE, + PLUGIN_NOT_FOUND.PARAM, + ); + } + + let uninstalledOrgsList = plugin.uninstalledOrgs; + + if (uninstalledOrgsList.includes(new mongoose.Types.ObjectId(currOrgID))) { + //if already uninstalled then install it by removing from array + uninstalledOrgsList = uninstalledOrgsList.filter( + (oid: unknown) => oid != currOrgID, + ); + } else { + //not already present then uninstall plugin on that org by adding it to the list + uninstalledOrgsList.push(new mongoose.Types.ObjectId(currOrgID)); + } + plugin.uninstalledOrgs = uninstalledOrgsList; + + const res = await Plugin.findOneAndUpdate( + { + _id: new mongoose.Types.ObjectId(uid), + }, + { + ...plugin, + }, + { + new: true, + }, + ).lean(); + + // calls subscription + context.pubsub.publish("TALAWA_PLUGIN_UPDATED", { + onPluginUpdate: res, + }); + return res as InterfacePlugin; + }; diff --git a/src/resolvers/Mutation/updatePost.ts b/src/resolvers/Mutation/updatePost.ts new file mode 100644 index 0000000000..82d3669a20 --- /dev/null +++ b/src/resolvers/Mutation/updatePost.ts @@ -0,0 +1,196 @@ +import { Types } from "mongoose"; +import { + LENGTH_VALIDATION_ERROR, + PLEASE_PROVIDE_TITLE, + POST_NEEDS_TO_BE_PINNED, + POST_NOT_FOUND_ERROR, + USER_NOT_AUTHORIZED_ERROR, + USER_NOT_FOUND_ERROR, +} from "../../constants"; +import { errors, requestContext } from "../../libraries"; +import { isValidString } from "../../libraries/validators/validateString"; +import type { + InterfaceAppUserProfile, + InterfacePost, + InterfaceUser, +} from "../../models"; +import { AppUserProfile, Post, User } from "../../models"; +import { cachePosts } from "../../services/PostCache/cachePosts"; +import { findPostsInCache } from "../../services/PostCache/findPostsInCache"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; +import { uploadEncodedImage } from "../../utilities/encodedImageStorage/uploadEncodedImage"; +import { uploadEncodedVideo } from "../../utilities/encodedVideoStorage/uploadEncodedVideo"; +import { findUserInCache } from "../../services/UserCache/findUserInCache"; +import { cacheUsers } from "../../services/UserCache/cacheUser"; +import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; +import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; + +/** + * Updates a post with new details, including handling image and video URL uploads and validating input fields. + * + * This function updates an existing post based on the provided input. It retrieves and validates the current user and their app profile, checks if the user has the necessary permissions, handles media file uploads, and performs input validation before updating the post in the database. The function returns the updated post after applying changes. + * + * @param _parent - This parameter represents the parent resolver in the GraphQL schema and is not used in this function. + * @param args - The arguments passed to the GraphQL mutation, including the post's `id` and data to update, such as `title`, `text`, `imageUrl`, and `videoUrl`. + * @param context - Provides contextual information, including the current user's ID. This is used to authenticate and authorize the request. + * + * @returns The updated post with all its fields. + */ +export const updatePost: MutationResolvers["updatePost"] = async ( + _parent, + args, + context, +) => { + let currentUser: InterfaceUser | null; + const userFoundInCache = await findUserInCache([context.userId]); + currentUser = userFoundInCache[0]; + if (currentUser === null) { + currentUser = await User.findOne({ + _id: context.userId, + }).lean(); + if (currentUser !== null) { + await cacheUsers([currentUser]); + } + } + + if (!currentUser) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + + let currentUserAppProfile: InterfaceAppUserProfile | null; + const appUserProfileFoundInCache = await findAppUserProfileCache([ + currentUser.appUserProfileId?.toString(), + ]); + currentUserAppProfile = appUserProfileFoundInCache[0]; + if (currentUserAppProfile === null) { + currentUserAppProfile = await AppUserProfile.findOne({ + userId: currentUser._id, + }).lean(); + if (currentUserAppProfile !== null) { + await cacheAppUserProfile([currentUserAppProfile]); + } + } + if (!currentUserAppProfile) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + + let post: InterfacePost | null; + + const postFoundInCache = await findPostsInCache([args.id]); + + post = postFoundInCache[0]; + + if (postFoundInCache[0] === null) { + post = await Post.findOne({ + _id: args.id, + }).lean(); + if (post !== null) { + await cachePosts([post]); + } + } + + // Check if the post exists + if (!post) { + throw new errors.NotFoundError( + requestContext.translate(POST_NOT_FOUND_ERROR.MESSAGE), + POST_NOT_FOUND_ERROR.CODE, + POST_NOT_FOUND_ERROR.PARAM, + ); + } + + // Check if the user has the right to update the post + const currentUserIsPostCreator = post.creatorId.equals(context.userId); + const isSuperAdmin = currentUserAppProfile.isSuperAdmin; + const isAdminOfPostOrganization = currentUserAppProfile?.adminFor.some( + (orgID) => + orgID && new Types.ObjectId(orgID?.toString()).equals(post?.organization), + ); + + // checks if current user is an creator of the post with _id === args.id + if ( + !currentUserIsPostCreator && + !isAdminOfPostOrganization && + !isSuperAdmin + ) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + + // Handle image and video URL uploads + if (args.data?.imageUrl && args.data?.imageUrl !== null) { + args.data.imageUrl = await uploadEncodedImage( + args.data.imageUrl, + post.imageUrl, + ); + } + + if (args.data?.videoUrl && args.data?.videoUrl !== null) { + args.data.videoUrl = await uploadEncodedVideo( + args.data.videoUrl, + post.videoUrl, + ); + } + + // Validate title and pinned status + if (args.data?.title && !post.pinned) { + throw new errors.InputValidationError( + requestContext.translate(POST_NEEDS_TO_BE_PINNED.MESSAGE), + POST_NEEDS_TO_BE_PINNED.CODE, + ); + } else if (!args.data?.title && post.pinned) { + throw new errors.InputValidationError( + requestContext.translate(PLEASE_PROVIDE_TITLE.MESSAGE), + PLEASE_PROVIDE_TITLE.CODE, + ); + } + + // Validate input lengths + const validationResultTitle = isValidString(args.data?.title ?? "", 256); + const validationResultText = isValidString(args.data?.text ?? "", 500); + if (!validationResultTitle.isLessThanMaxLength) { + throw new errors.InputValidationError( + requestContext.translate( + `${LENGTH_VALIDATION_ERROR.MESSAGE} 256 characters in title`, + ), + LENGTH_VALIDATION_ERROR.CODE, + ); + } + if (!validationResultText.isLessThanMaxLength) { + throw new errors.InputValidationError( + requestContext.translate( + `${LENGTH_VALIDATION_ERROR.MESSAGE} 500 characters in information`, + ), + LENGTH_VALIDATION_ERROR.CODE, + ); + } + + // Update the post in the database + const updatedPost = await Post.findOneAndUpdate( + { + _id: args.id, + }, + { + ...(args.data as Record), + }, + { + new: true, + }, + ).lean(); + + if (updatedPost !== null) { + await cachePosts([updatedPost]); + } + + return updatedPost as InterfacePost; +}; diff --git a/src/resolvers/Mutation/updateUserPassword.ts b/src/resolvers/Mutation/updateUserPassword.ts new file mode 100644 index 0000000000..f490e970ab --- /dev/null +++ b/src/resolvers/Mutation/updateUserPassword.ts @@ -0,0 +1,161 @@ +import bcrypt from "bcryptjs"; +import { + INVALID_CREDENTIALS_ERROR, + USER_NOT_AUTHORIZED_ERROR, + USER_NOT_FOUND_ERROR, +} from "../../constants"; +import { errors, requestContext } from "../../libraries"; +import type { InterfaceAppUserProfile, InterfaceUser } from "../../models"; +import { AppUserProfile, User } from "../../models"; +import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; +import { deleteAppUserFromCache } from "../../services/AppUserProfileCache/deleteAppUserFromCache"; +import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; +import { cacheUsers } from "../../services/UserCache/cacheUser"; +import { deleteUserFromCache } from "../../services/UserCache/deleteUserFromCache"; +import { findUserInCache } from "../../services/UserCache/findUserInCache"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; + +/** + * Updates the password for the currently authenticated user. + * + * This function allows the current user to update their password. It performs the following steps: + * 1. Retrieves the current user from the cache or database. + * 2. Verifies the current user exists. + * 3. Retrieves the current user's profile from the cache or database. + * 4. Checks if the current user is authorized to update the password. + * 5. Validates the previous password provided by the user. + * 6. Ensures the new password and confirmation match. + * 7. Hashes the new password and updates it in the database. + * 8. Clears the user's token and updates their profile. + * 9. Updates the user and profile caches. + * + * @param _parent - This parameter is not used in this resolver function. + * @param args - The arguments provided by the GraphQL query, including the previous password, new password, and password confirmation. + * @param context - The context of the request, containing information about the currently authenticated user. + * + * @returns An object containing the updated user and their profile. + */ + +export const updateUserPassword: MutationResolvers["updateUserPassword"] = + async (_parent, args, context) => { + let currentUser: InterfaceUser | null; + const userFoundInCache = await findUserInCache([context.userId]); + currentUser = userFoundInCache[0]; + if (currentUser === null) { + currentUser = await User.findOne({ + _id: context.userId, + }).lean(); + if (currentUser !== null) { + await cacheUsers([currentUser]); + } + } + + if (!currentUser) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + let currentUserAppProfile: InterfaceAppUserProfile | null; + const appUserProfileFoundInCache = await findAppUserProfileCache([ + currentUser.appUserProfileId?.toString(), + ]); + currentUserAppProfile = appUserProfileFoundInCache[0]; + if (currentUserAppProfile === null) { + currentUserAppProfile = await AppUserProfile.findOne({ + userId: currentUser._id, + }).lean(); + if (currentUserAppProfile !== null) { + await cacheAppUserProfile([currentUserAppProfile]); + } + } + if (!currentUserAppProfile) { + throw new errors.UnauthorizedError( + USER_NOT_AUTHORIZED_ERROR.MESSAGE, + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + const isPasswordValid = await bcrypt.compare( + args.data.previousPassword, + currentUser?.password || "", + ); + + // Checks whether password is invalid. + if (isPasswordValid === false) { + throw new errors.ValidationError( + [ + { + message: requestContext.translate( + INVALID_CREDENTIALS_ERROR.MESSAGE, + ), + code: INVALID_CREDENTIALS_ERROR.CODE, + param: INVALID_CREDENTIALS_ERROR.PARAM, + }, + ], + requestContext.translate(INVALID_CREDENTIALS_ERROR.MESSAGE), + ); + } + + if (args.data.newPassword !== args.data.confirmNewPassword) { + throw new errors.ValidationError( + [ + { + message: requestContext.translate( + INVALID_CREDENTIALS_ERROR.MESSAGE, + ), + code: INVALID_CREDENTIALS_ERROR.CODE, + param: INVALID_CREDENTIALS_ERROR.PARAM, + }, + ], + requestContext.translate(INVALID_CREDENTIALS_ERROR.MESSAGE), + ); + } + + const hashedPassword = await bcrypt.hash(args.data.newPassword, 12); + const updatedUser = await User.findOneAndUpdate( + { + _id: context.userId, + }, + { + $set: { + password: hashedPassword, + }, + }, + { + new: true, + }, + ); + const updatedAppUserProfile: InterfaceAppUserProfile = + (await AppUserProfile.findOneAndUpdate( + { + userId: context.userId, + }, + { + $set: { + token: null, + }, + }, + { + new: true, + }, + ) + .populate("createdOrganizations") + .populate("createdEvents") + .populate("eventAdmin") + .populate("adminFor") + .lean()) as InterfaceAppUserProfile; + if (updatedUser) { + await deleteUserFromCache(updatedUser._id.toString()); + await cacheUsers([updatedUser]); + } + if (updatedAppUserProfile) { + await deleteAppUserFromCache(updatedAppUserProfile._id.toString()); + await cacheAppUserProfile([updatedAppUserProfile]); + } + return { + user: updatedUser as InterfaceUser, + appUserProfile: updatedAppUserProfile, + }; + }; diff --git a/src/resolvers/Mutation/updateUserProfile.ts b/src/resolvers/Mutation/updateUserProfile.ts new file mode 100644 index 0000000000..ee8c0e36ac --- /dev/null +++ b/src/resolvers/Mutation/updateUserProfile.ts @@ -0,0 +1,170 @@ +import { + EMAIL_ALREADY_EXISTS_ERROR, + USER_NOT_FOUND_ERROR, +} from "../../constants"; +import { errors, requestContext } from "../../libraries"; +import type { InterfaceUser } from "../../models"; +import { AppUserProfile, User } from "../../models"; +import { cacheUsers } from "../../services/UserCache/cacheUser"; +import { deleteUserFromCache } from "../../services/UserCache/deleteUserFromCache"; +import { findUserInCache } from "../../services/UserCache/findUserInCache"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; +import { uploadEncodedImage } from "../../utilities/encodedImageStorage/uploadEncodedImage"; +/** + * This function enables to update user profile. + * @param _parent - parent of current request + * @param args - payload provided with the request + * @param context - context of entire application + * @remarks The following checks are done: + * 1. If the user exists. + * @returns Updated user profile. + */ +export const updateUserProfile: MutationResolvers["updateUserProfile"] = async ( + _parent, + args, + context, +) => { + let currentUser: InterfaceUser | null; + const userFoundInCache = await findUserInCache([context.userId]); + currentUser = userFoundInCache[0]; + if (currentUser === null) { + currentUser = await User.findOne({ + _id: context.userId, + }).lean(); + if (currentUser !== null) { + await cacheUsers([currentUser]); + } + } + + if (!currentUser) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + + if (args.data?.email && args.data?.email !== currentUser?.email) { + const userWithEmailExists = await User.findOne({ + email: args.data?.email.toLowerCase(), + }); + + if (userWithEmailExists) { + throw new errors.ConflictError( + requestContext.translate(EMAIL_ALREADY_EXISTS_ERROR.MESSAGE), + EMAIL_ALREADY_EXISTS_ERROR.MESSAGE, + EMAIL_ALREADY_EXISTS_ERROR.PARAM, + ); + } + } + + // Upload file + let uploadImageFileName; + if (args.file) { + uploadImageFileName = await uploadEncodedImage( + args.file, + currentUser?.image, + ); + } + + // Update User + let updatedUser = await User.findOneAndUpdate( + { + _id: context.userId, + }, + { + $set: { + address: { + city: args.data?.address?.city + ? args.data.address.city + : currentUser?.address?.city, + countryCode: args.data?.address?.countryCode + ? args.data.address.countryCode + : currentUser?.address?.countryCode, + dependentLocality: args.data?.address?.dependentLocality + ? args.data.address.dependentLocality + : currentUser?.address?.dependentLocality, + line1: args.data?.address?.line1 + ? args.data.address.line1 + : currentUser?.address?.line1, + line2: args.data?.address?.line2 + ? args.data.address.line2 + : currentUser?.address?.line2, + postalCode: args.data?.address?.postalCode + ? args.data.address.postalCode + : currentUser?.address?.postalCode, + sortingCode: args.data?.address?.sortingCode + ? args.data.address.sortingCode + : currentUser?.address?.sortingCode, + state: args.data?.address?.state + ? args.data.address.state + : currentUser?.address?.state, + }, + birthDate: args.data?.birthDate + ? args.data.birthDate + : currentUser?.birthDate, + educationGrade: args.data?.educationGrade + ? args.data.educationGrade + : currentUser?.educationGrade, + email: args.data?.email + ? args.data.email.toLowerCase() + : currentUser?.email.toLowerCase(), + employmentStatus: args.data?.employmentStatus + ? args.data.employmentStatus + : currentUser?.employmentStatus, + firstName: args.data?.firstName + ? args.data.firstName + : currentUser?.firstName, + gender: args.data?.gender ? args.data.gender : currentUser?.gender, + image: args.file ? uploadImageFileName : currentUser.image, + lastName: args.data?.lastName + ? args.data.lastName + : currentUser?.lastName, + maritalStatus: args.data?.maritalStatus + ? args.data.maritalStatus + : currentUser?.maritalStatus, + phone: { + home: args.data?.phone?.home + ? args.data?.phone?.home + : currentUser?.phone?.home, + mobile: args.data?.phone?.mobile + ? args.data?.phone?.mobile + : currentUser?.phone?.mobile, + work: args.data?.phone?.work + ? args.data?.phone?.work + : currentUser?.phone?.work, + }, + }, + }, + { + new: true, + runValidators: true, + }, + ).lean(); + if (updatedUser != null) { + await deleteUserFromCache(updatedUser?._id.toString() || ""); + await cacheUsers([updatedUser]); + } + + if (args.data?.appLanguageCode) { + await AppUserProfile.findOneAndUpdate( + { + userId: context.userId, + }, + { + $set: { + appLanguageCode: args.data?.appLanguageCode, + }, + }, + ); + } + + if (updatedUser != null) { + updatedUser.image = updatedUser?.image + ? `${context.apiRootUrl}${updatedUser?.image}` + : null; + } + if (args.data == undefined) updatedUser = null; + + return updatedUser ?? ({} as InterfaceUser); +}; diff --git a/src/resolvers/Mutation/updateUserRoleInOrganization.ts b/src/resolvers/Mutation/updateUserRoleInOrganization.ts new file mode 100644 index 0000000000..5a1688f729 --- /dev/null +++ b/src/resolvers/Mutation/updateUserRoleInOrganization.ts @@ -0,0 +1,162 @@ +import mongoose from "mongoose"; +import { + ADMIN_CANNOT_CHANGE_ITS_ROLE, + ADMIN_CHANGING_ROLE_OF_CREATOR, + ORGANIZATION_NOT_FOUND_ERROR, + USER_NOT_AUTHORIZED_ADMIN, + USER_NOT_AUTHORIZED_ERROR, + USER_NOT_FOUND_ERROR, + USER_NOT_MEMBER_FOR_ORGANIZATION, +} from "../../constants"; +import { errors, requestContext } from "../../libraries"; +import { AppUserProfile, Organization, User } from "../../models"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; + +/** + * This function enables a SUPERADMIN to change the role of a user in an organization. + * @param _parent - parent of current request + * @param args - payload provided with the request + * @param context - context of entire application + * @returns Updated organization. + * Only SUPERADMIN & ADMIN of a organization can update the role of a user in an organization. + */ + +export const updateUserRoleInOrganization: MutationResolvers["updateUserRoleInOrganization"] = + async (_parent, args, context) => { + // Check if organization exists + const organization = await Organization.findOne({ + _id: args.organizationId, + }).lean(); + + if (!organization) { + throw new errors.NotFoundError( + requestContext.translate(ORGANIZATION_NOT_FOUND_ERROR.MESSAGE), + ORGANIZATION_NOT_FOUND_ERROR.CODE, + ORGANIZATION_NOT_FOUND_ERROR.PARAM, + ); + } + + // Check if user exists + const user = await User.findOne({ _id: args.userId }).lean(); + + if (!user) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + + // Checks whether user to be removed is a member of the organization. + const userIsOrganizationMember = organization?.members.some((member) => + new mongoose.Types.ObjectId(member.toString()).equals(user._id), + ); + + if (!userIsOrganizationMember) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_MEMBER_FOR_ORGANIZATION.MESSAGE), + USER_NOT_MEMBER_FOR_ORGANIZATION.CODE, + USER_NOT_MEMBER_FOR_ORGANIZATION.PARAM, + ); + } + + // Check whether the logged in user exists + const loggedInUser = await User.findOne({ _id: context.userId }).lean(); + if (!loggedInUser) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + const loggedInUserAppProfile = await AppUserProfile.findOne({ + userId: loggedInUser._id, + }).lean(); + if (!loggedInUserAppProfile) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + // Check whether loggedIn user is admin of the organization. + const loggedInUserIsOrganizationAdmin = organization?.admins.some((admin) => + new mongoose.Types.ObjectId(admin.toString()).equals(loggedInUser._id), + ); + + if ( + !loggedInUserIsOrganizationAdmin && + loggedInUserAppProfile.isSuperAdmin === false + ) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_AUTHORIZED_ADMIN.MESSAGE), + USER_NOT_AUTHORIZED_ADMIN.CODE, + USER_NOT_AUTHORIZED_ADMIN.PARAM, + ); + } + // Admin of Org cannot change the role of SUPERADMIN in an organization. + if ( + args.role === "SUPERADMIN" && + !loggedInUserAppProfile.isSuperAdmin && + loggedInUserIsOrganizationAdmin + ) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_AUTHORIZED_ADMIN.MESSAGE), + USER_NOT_AUTHORIZED_ADMIN.CODE, + USER_NOT_AUTHORIZED_ADMIN.PARAM, + ); + } + // ADMIN cannot change the role of itself + if ( + new mongoose.Types.ObjectId(context?.userId.toString()).equals( + user._id, + ) && + loggedInUserIsOrganizationAdmin + ) { + throw new errors.ConflictError( + requestContext.translate(ADMIN_CANNOT_CHANGE_ITS_ROLE.MESSAGE), + ADMIN_CANNOT_CHANGE_ITS_ROLE.CODE, + ADMIN_CANNOT_CHANGE_ITS_ROLE.PARAM, + ); + } + + // ADMIN cannot change the role of the creator of the organization. + if ( + new mongoose.Types.ObjectId(organization?.creatorId.toString()).equals( + user._id, + ) + ) { + throw new errors.UnauthorizedError( + requestContext.translate(ADMIN_CHANGING_ROLE_OF_CREATOR.MESSAGE), + ADMIN_CHANGING_ROLE_OF_CREATOR.CODE, + ADMIN_CHANGING_ROLE_OF_CREATOR.PARAM, + ); + } + + // Check user role and update accordingly + if (args.role === "ADMIN") { + const updatedOrg = await Organization.updateOne( + { _id: args.organizationId }, + { + $push: { admins: args.userId }, + }, + ); + await AppUserProfile.updateOne( + { userId: args.userId }, + { $push: { adminFor: args.organizationId } }, + ); + return { ...organization, ...updatedOrg }; + } else { + const updatedOrg = await Organization.updateOne( + { _id: args.organizationId }, + { + $pull: { admins: args.userId }, + }, + ).lean(); + await AppUserProfile.updateOne( + { userId: args.userId }, + { $pull: { adminFor: args.organizationId } }, + ); + return { ...organization, ...updatedOrg }; + } + }; diff --git a/src/resolvers/Mutation/updateUserTag.ts b/src/resolvers/Mutation/updateUserTag.ts new file mode 100644 index 0000000000..794ca3fb15 --- /dev/null +++ b/src/resolvers/Mutation/updateUserTag.ts @@ -0,0 +1,142 @@ +import { Types } from "mongoose"; +import { + NO_CHANGE_IN_TAG_NAME, + TAG_ALREADY_EXISTS, + TAG_NOT_FOUND, + USER_NOT_AUTHORIZED_ERROR, + USER_NOT_FOUND_ERROR, +} from "../../constants"; +import { errors, requestContext } from "../../libraries"; +import type { InterfaceAppUserProfile, InterfaceUser } from "../../models"; +import { AppUserProfile, OrganizationTagUser, User } from "../../models"; +import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; +import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; +import { cacheUsers } from "../../services/UserCache/cacheUser"; +import { findUserInCache } from "../../services/UserCache/findUserInCache"; +import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; +/** + * Updates an existing tag's name based on provided input, including validation and authorization checks. + * + * This function updates the name of an existing tag in the database. It performs various checks to ensure that the current user is authorized to update the tag, validates that the new tag name is not the same as the old one, and ensures that no other tag with the same name exists under the same parent tag. It then updates the tag's name and returns the updated tag. + * + * @param _parent - This parameter represents the parent resolver in the GraphQL schema and is not used in this function. + * @param args - The arguments passed to the GraphQL mutation, including the tag's `id` and the new `name` for the tag. + * @param context - Provides contextual information, including the current user's ID. This is used to authenticate and authorize the request. + * + * @returns The updated tag with its new name. + * + */ +export const updateUserTag: MutationResolvers["updateUserTag"] = async ( + _parent, + args, + context, +) => { + let currentUser: InterfaceUser | null; + const userFoundInCache = await findUserInCache([context.userId]); + currentUser = userFoundInCache[0]; + if (currentUser === null) { + currentUser = await User.findOne({ + _id: context.userId, + }).lean(); + if (currentUser !== null) { + await cacheUsers([currentUser]); + } + } + + // Checks whether currentUser exists. + if (!currentUser) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + let currentUserAppProfile: InterfaceAppUserProfile | null; + const appUserProfileFoundInCache = await findAppUserProfileCache([ + currentUser.appUserProfileId?.toString(), + ]); + currentUserAppProfile = appUserProfileFoundInCache[0]; + if (currentUserAppProfile === null) { + currentUserAppProfile = await AppUserProfile.findOne({ + userId: currentUser._id, + }).lean(); + if (currentUserAppProfile !== null) { + await cacheAppUserProfile([currentUserAppProfile]); + } + } + if (!currentUserAppProfile) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + + // Get the tag object + const existingTag = await OrganizationTagUser.findOne({ + _id: args.input.tagId, + }).lean(); + + if (!existingTag) { + throw new errors.NotFoundError( + requestContext.translate(TAG_NOT_FOUND.MESSAGE), + TAG_NOT_FOUND.CODE, + TAG_NOT_FOUND.PARAM, + ); + } + + // Boolean to determine whether user is an admin of organization of the tag folder. + const currentUserIsOrganizationAdmin = currentUserAppProfile.adminFor.some( + (organization) => + organization && + new Types.ObjectId(organization.toString()).equals( + existingTag?.organizationId, + ), + ); + + // Checks whether currentUser can update the tag + if (!currentUserAppProfile.isSuperAdmin && !currentUserIsOrganizationAdmin) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + + // Throw error if the new tag name is the same as the old one + if (existingTag.name === args.input.name) { + throw new errors.ConflictError( + requestContext.translate(NO_CHANGE_IN_TAG_NAME.MESSAGE), + NO_CHANGE_IN_TAG_NAME.CODE, + NO_CHANGE_IN_TAG_NAME.PARAM, + ); + } + + // Check if another tag with the new name exists under the same parent tag + const anotherTagExists = await OrganizationTagUser.exists({ + name: args.input.name, + parentTagId: existingTag.parentTagId, + organizationId: existingTag.organizationId, + }); + + if (anotherTagExists) { + throw new errors.ConflictError( + requestContext.translate(TAG_ALREADY_EXISTS.MESSAGE), + TAG_ALREADY_EXISTS.CODE, + TAG_ALREADY_EXISTS.PARAM, + ); + } + + // Update the title of the tag and return it + return await OrganizationTagUser.findOneAndUpdate( + { + _id: args.input.tagId, + }, + { + name: args.input.name, + }, + { + new: true, + }, + ).lean(); +}; diff --git a/src/resolvers/Organization/actionItemCategories.ts b/src/resolvers/Organization/actionItemCategories.ts new file mode 100644 index 0000000000..e84de326a8 --- /dev/null +++ b/src/resolvers/Organization/actionItemCategories.ts @@ -0,0 +1,21 @@ +import { ActionItemCategory } from "../../models"; +import type { OrganizationResolvers } from "../../types/generatedGraphQLTypes"; + +/** + * Resolver function for the `actionItemCategories` field of an `Organization`. + * + * This function retrieves the action item categories related to a specific organization. + * + * @param parent - The parent object representing the organization. It contains information about the organization, including the ID of the organization. + * @returns A promise that resolves to the action item category documents found in the database. These documents represent the action item categories related to the organization. + * + * @see ActionItemCategory - The ActionItemCategory model used to interact with the action item categories collection in the database. + * @see OrganizationResolvers - The type definition for the resolvers of the Organization fields. + * + */ +export const actionItemCategories: OrganizationResolvers["actionItemCategories"] = + async (parent) => { + return await ActionItemCategory.find({ + organizationId: parent._id, + }).lean(); + }; diff --git a/src/resolvers/Organization/admins.ts b/src/resolvers/Organization/admins.ts new file mode 100644 index 0000000000..ed113e5037 --- /dev/null +++ b/src/resolvers/Organization/admins.ts @@ -0,0 +1,22 @@ +import { User } from "../../models"; +import type { OrganizationResolvers } from "../../types/generatedGraphQLTypes"; + +/** + * Resolver function for the `admins` field of an `Organization`. + * + * This function retrieves the users who are admins of a specific organization. + * + * @param parent - The parent object representing the organization. It contains information about the organization, including the IDs of the users who are admins. + * @returns A promise that resolves to an array of user documents found in the database. These documents represent the users who are admins of the organization. + * + * @see User - The User model used to interact with the users collection in the database. + * @see OrganizationResolvers - The type definition for the resolvers of the Organization fields. + * + */ +export const admins: OrganizationResolvers["admins"] = async (parent) => { + return await User.find({ + _id: { + $in: parent.admins, + }, + }).lean(); +}; diff --git a/src/resolvers/Organization/advertisements.ts b/src/resolvers/Organization/advertisements.ts new file mode 100644 index 0000000000..77b3f336e0 --- /dev/null +++ b/src/resolvers/Organization/advertisements.ts @@ -0,0 +1,160 @@ +import type { InterfaceAdvertisement } from "../../models"; +import { Advertisement } from "../../models"; +import type { OrganizationResolvers } from "../../types/generatedGraphQLTypes"; +import type { Types } from "mongoose"; +import { + getCommonGraphQLConnectionFilter, + getCommonGraphQLConnectionSort, + parseGraphQLConnectionArguments, + transformToDefaultGraphQLConnection, + type DefaultGraphQLArgumentError, + type ParseGraphQLConnectionCursorArguments, + type ParseGraphQLConnectionCursorResult, +} from "../../utilities/graphQLConnection"; + +import { GraphQLError } from "graphql"; +import { MAXIMUM_FETCH_LIMIT } from "../../constants"; + +/** + * Resolver function for the `advertisements` field of an `Organization`. + * + * This resolver is used to resolve the `advertisements` field of an `Organization` type. + * + * @param parent - The parent object representing the organization. It contains information about the organization, including the ID of the organization. + * @param args - The arguments provided to the field. These arguments are used to filter, sort, and paginate the advertisements. + * @param context - The context object passed to the GraphQL resolvers. It contains the API root URL, which is used to construct the media URL for each advertisement. + * @returns A promise that resolves to a connection object containing the advertisements of the organization. + * + * @see Advertisement - The Advertisement model used to interact with the advertisements collection in the database. + * @see parseGraphQLConnectionArguments - The function used to parse the GraphQL connection arguments (filter, sort, pagination). + * @see transformToDefaultGraphQLConnection - The function used to transform the list of advertisements into a connection object. + * @see getCommonGraphQLConnectionFilter - The function used to get the common filter object for the GraphQL connection. + * @see getCommonGraphQLConnectionSort - The function used to get the common sort object for the GraphQL connection. + * @see MAXIMUM_FETCH_LIMIT - The maximum number of advertisements that can be fetched in a single request. + * @see GraphQLError - The error class used to throw GraphQL errors. + * @see OrganizationResolvers - The type definition for the resolvers of the Organization fields. + * + */ +export const advertisements: OrganizationResolvers["advertisements"] = async ( + parent, + args, + context, +) => { + const parseGraphQLConnectionArgumentsResult = + await parseGraphQLConnectionArguments({ + args, + parseCursor: (args) => + parseCursor({ + ...args, + organizationId: parent._id, + }), + maximumLimit: MAXIMUM_FETCH_LIMIT, + }); + if (!parseGraphQLConnectionArgumentsResult.isSuccessful) { + throw new GraphQLError("Invalid arguments provided.", { + extensions: { + code: "INVALID_ARGUMENTS", + errors: parseGraphQLConnectionArgumentsResult.errors, + }, + }); + } + const { parsedArgs } = parseGraphQLConnectionArgumentsResult; + + const filter = getCommonGraphQLConnectionFilter({ + cursor: parsedArgs.cursor, + direction: parsedArgs.direction, + }); + + //get the sorting object + + const sort = getCommonGraphQLConnectionSort({ + direction: parsedArgs.direction, + }); + + const [objectList, totalCount] = await Promise.all([ + Advertisement.find({ + ...filter, + organizationId: parent._id, + }) + .sort(sort) + .limit(parsedArgs.limit) + .lean() + .exec(), + + Advertisement.find({ + organizationId: parent._id, + }) + .countDocuments() + .exec(), + ]); + + const advertisements = objectList.map( + (advertisement: InterfaceAdvertisement) => ({ + ...advertisement, + mediaUrl: `${context.apiRootUrl}${advertisement.mediaUrl}`, + }), + ); + + return transformToDefaultGraphQLConnection< + ParsedCursor, + InterfaceAdvertisement, + InterfaceAdvertisement + >({ + objectList: advertisements, + parsedArgs, + totalCount, + }); +}; +/* +This is typescript type of the parsed cursor for this connection resolver. +*/ +type ParsedCursor = string; + +/** + * Parses the cursor value for the `advertisements` connection resolver. + * + * This function is used to parse the cursor value provided in the arguments of the `advertisements` connection resolver. + * + * @param cursorValue - The cursor value provided in the arguments. + * @param cursorName - The name of the cursor argument. + * @param cursorPath - The path to the cursor argument in the arguments object. + * @param organizationId - The ID of the organization to which the advertisements belong. + * @returns An object containing the parsed cursor value, or an array of errors if the cursor value is invalid. + * + * @see Advertisement - The Advertisement model used to interact with the advertisements collection in the database. + * @see DefaultGraphQLArgumentError - The type definition for the default GraphQL argument error. + * @see ParseGraphQLConnectionCursorArguments - The type definition for the arguments of the parseCursor function. + * @see ParseGraphQLConnectionCursorResult - The type definition for the result of the parseCursor function. + * + */ +export const parseCursor = async ({ + cursorValue, + cursorName, + cursorPath, + organizationId, +}: ParseGraphQLConnectionCursorArguments & { + organizationId: string | Types.ObjectId; +}): ParseGraphQLConnectionCursorResult => { + const errors: DefaultGraphQLArgumentError[] = []; + const advertisement = await Advertisement.findOne({ + _id: cursorValue, + organizationId, + }); + if (!advertisement) { + errors.push({ + message: `Argument ${cursorName} is an invalid cursor.`, + path: cursorPath, + }); + if (errors.length !== 0) { + return { + errors, + isSuccessful: false, + }; + } + } + + return { + isSuccessful: true, + parsedCursor: cursorValue, + }; +}; diff --git a/src/resolvers/Organization/agendaCategories.ts b/src/resolvers/Organization/agendaCategories.ts new file mode 100644 index 0000000000..159f53bf10 --- /dev/null +++ b/src/resolvers/Organization/agendaCategories.ts @@ -0,0 +1,21 @@ +import { AgendaCategoryModel } from "../../models"; +import type { OrganizationResolvers } from "../../types/generatedGraphQLTypes"; + +/** + * Resolver function for the `agendaCategories` field of an `Organization`. + * + * This function retrieves the agenda categories of a specific organization. + * + * @param parent - The parent object representing the organization. It contains information about the organization, including the ID of the organization. + * @returns A promise that resolves to an array of agenda category documents found in the database. These documents represent the agenda categories of the organization. + * + * @see AgendaCategoryModel - The AgendaCategory model used to interact with the agendaCategories collection in the database. + * @see OrganizationResolvers - The type definition for the resolvers of the Organization fields. + * + */ +export const agendaCategories: OrganizationResolvers["agendaCategories"] = + async (parent) => { + return await AgendaCategoryModel.find({ + organizationId: parent._id, + }).lean(); + }; diff --git a/src/resolvers/Organization/blockedUsers.ts b/src/resolvers/Organization/blockedUsers.ts new file mode 100644 index 0000000000..cd6618f7e7 --- /dev/null +++ b/src/resolvers/Organization/blockedUsers.ts @@ -0,0 +1,24 @@ +import { User } from "../../models"; +import type { OrganizationResolvers } from "../../types/generatedGraphQLTypes"; + +/** + * Resolver function for the `blockedUsers` field of an `Organization`. + * + * This function retrieves the users who are blocked by a specific organization. + * + * @param parent - The parent object representing the organization. It contains information about the organization, including the IDs of the users who are blocked. + * @returns A promise that resolves to an array of user documents found in the database. These documents represent the users who are blocked by the organization. + * + * @see User - The User model used to interact with the users collection in the database. + * @see OrganizationResolvers - The type definition for the resolvers of the Organization fields. + * + */ +export const blockedUsers: OrganizationResolvers["blockedUsers"] = async ( + parent, +) => { + return await User.find({ + _id: { + $in: parent.blockedUsers, + }, + }).lean(); +}; diff --git a/src/resolvers/Organization/creator.ts b/src/resolvers/Organization/creator.ts new file mode 100644 index 0000000000..068faa97c8 --- /dev/null +++ b/src/resolvers/Organization/creator.ts @@ -0,0 +1,32 @@ +import { User } from "../../models"; +import { errors, requestContext } from "../../libraries"; +import type { OrganizationResolvers } from "../../types/generatedGraphQLTypes"; +import { USER_NOT_FOUND_ERROR } from "../../constants"; + +/** + * Resolver function for the `creator` field of an `Organization`. + * + * This function retrieves the user who created a specific organization. + * + * @param parent - The parent object representing the organization. It contains information about the organization, including the ID of the user who created it. + * @returns A promise that resolves to the user document found in the database. This document represents the user who created the organization. + * + * @see User - The User model used to interact with the users collection in the database. + * @see OrganizationResolvers - The type definition for the resolvers of the Organization fields. + * + */ +export const creator: OrganizationResolvers["creator"] = async (parent) => { + const user = await User.findOne({ + _id: parent.creatorId, + }).lean(); + + if (!user) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + + return user; +}; diff --git a/src/resolvers/Organization/funds.ts b/src/resolvers/Organization/funds.ts new file mode 100644 index 0000000000..18dc4eed9a --- /dev/null +++ b/src/resolvers/Organization/funds.ts @@ -0,0 +1,20 @@ +import { Fund } from "../../models"; +import type { OrganizationResolvers } from "../../types/generatedGraphQLTypes"; + +/** + * Resolver function for the `funds` field of an `Organization`. + * + * This function retrieves the funds related to a specific organization. + * + * @param parent - The parent object representing the organization. It contains information about the organization, including the ID of the organization. + * @returns A promise that resolves to the fund documents found in the database. These documents represent the funds related to the organization. + * + * @see Fund - The Fund model used to interact with the funds collection in the database. + * @see OrganizationResolvers - The type definition for the resolvers of the Organization fields. + * + */ +export const funds: OrganizationResolvers["funds"] = async (parent) => { + return await Fund.find({ + organizationId: parent._id, + }).lean(); +}; diff --git a/src/resolvers/Organization/image.ts b/src/resolvers/Organization/image.ts new file mode 100644 index 0000000000..b94afa9975 --- /dev/null +++ b/src/resolvers/Organization/image.ts @@ -0,0 +1,24 @@ +// Context object contains an apiRootUrl for mapping DNS request of server to its domain, for example: http:abcd.com/ +import type { OrganizationResolvers } from "../../types/generatedGraphQLTypes"; + +/** + * Resolver function for the `image` field of an `Organization`. + * + * This function retrieves the image URL of a specific organization. + * + * @param parent - The parent object representing the organization. It contains information about the organization, including the image URL. + * @returns The URL of the image of the organization. + * + * @see OrganizationResolvers - The type definition for the resolvers of the Organization fields. + * + */ +export const image: OrganizationResolvers["image"] = ( + parent, + _args, + context, +) => { + if (parent.image) { + return `${context.apiRootUrl}${parent.image}`; + } + return null; +}; diff --git a/src/resolvers/Organization/index.ts b/src/resolvers/Organization/index.ts new file mode 100644 index 0000000000..50bc85c30e --- /dev/null +++ b/src/resolvers/Organization/index.ts @@ -0,0 +1,34 @@ +import type { OrganizationResolvers } from "../../types/generatedGraphQLTypes"; +import { actionItemCategories } from "./actionItemCategories"; +import { admins } from "./admins"; +import { agendaCategories } from "./agendaCategories"; +import { blockedUsers } from "./blockedUsers"; +import { creator } from "./creator"; +import { funds } from "./funds"; +import { image } from "./image"; +import { members } from "./members"; +import { membershipRequests } from "./membershipRequests"; +import { pinnedPosts } from "./pinnedPosts"; +import { posts } from "./posts"; +import { advertisements } from "./advertisements"; +import { userTags } from "./userTags"; + +import { venues } from "./venues"; +// import { userTags } from "./userTags"; + +export const Organization: OrganizationResolvers = { + admins, + advertisements, + actionItemCategories, + agendaCategories, + blockedUsers, + creator, + image, + members, + membershipRequests, + pinnedPosts, + funds, + userTags, + posts, + venues, +}; diff --git a/src/resolvers/Organization/members.ts b/src/resolvers/Organization/members.ts new file mode 100644 index 0000000000..1cbff039fb --- /dev/null +++ b/src/resolvers/Organization/members.ts @@ -0,0 +1,22 @@ +import { User } from "../../models"; +import type { OrganizationResolvers } from "../../types/generatedGraphQLTypes"; + +/** + * Resolver function for the `members` field of an `Organization`. + * + * This function retrieves the users who are members of a specific organization. + * + * @param parent - The parent object representing the organization. It contains information about the organization, including the IDs of the users who are members of it. + * @returns A promise that resolves to an array of user documents found in the database. These documents represent the users who are members of the organization. + * + * @see User - The User model used to interact with the users collection in the database. + * @see OrganizationResolvers - The type definition for the resolvers of the Organization fields. + * + */ +export const members: OrganizationResolvers["members"] = async (parent) => { + return await User.find({ + _id: { + $in: parent.members, + }, + }).lean(); +}; diff --git a/src/resolvers/Organization/membershipRequests.ts b/src/resolvers/Organization/membershipRequests.ts new file mode 100644 index 0000000000..1af5c31174 --- /dev/null +++ b/src/resolvers/Organization/membershipRequests.ts @@ -0,0 +1,44 @@ +import { MembershipRequest } from "../../models"; +import type { OrganizationResolvers } from "../../types/generatedGraphQLTypes"; + +/** + * Resolver function for the `membershipRequests` field of an `Organization`. + * + * This function retrieves the membership requests related to a specific organization. + * + * @param parent - The parent object representing the organization. It contains information about the organization, including the IDs of the membership requests. + * @returns A promise that resolves to an array of membership request documents found in the database. These documents represent the membership requests related to the organization. + * + * @see MembershipRequest - The MembershipRequest model used to interact with the membership requests collection in the database. + * @see OrganizationResolvers - The type definition for the resolvers of the Organization fields. + * + */ +export const membershipRequests: OrganizationResolvers["membershipRequests"] = + async (parent, args) => { + const membershipRequests = await MembershipRequest.find({ + _id: { + $in: parent.membershipRequests, + }, + }) + .populate("user") + .limit(args.first ?? 0) + .skip(args.skip ?? 0) + .lean(); + + const filteredMembershipRequests = membershipRequests.filter( + (membershipRequest) => { + const user = membershipRequest.user; + + return ( + user && + user.firstName + .toLowerCase() + .startsWith( + args.where?.user?.firstName_contains?.toLowerCase() || "", + ) + ); + }, + ); + + return filteredMembershipRequests; + }; diff --git a/src/resolvers/Organization/pinnedPosts.ts b/src/resolvers/Organization/pinnedPosts.ts new file mode 100644 index 0000000000..46bf4fcf28 --- /dev/null +++ b/src/resolvers/Organization/pinnedPosts.ts @@ -0,0 +1,38 @@ +import { Post } from "../../models"; +import { cachePosts } from "../../services/PostCache/cachePosts"; +import { findPostsInCache } from "../../services/PostCache/findPostsInCache"; +import type { OrganizationResolvers } from "../../types/generatedGraphQLTypes"; + +/** + * Resolver function for the `pinnedPosts` field of an `Organization`. + * + * This function retrieves the posts that are pinned by a specific organization. + * + * @param parent - The parent object representing the organization. It contains information about the organization, including the IDs of the posts that are pinned. + * @returns A promise that resolves to the post documents found in the database. These documents represent the posts that are pinned by the organization. + * + * @see Post - The Post model used to interact with the posts collection in the database. + * @see OrganizationResolvers - The type definition for the resolvers of the Organization fields. + * + */ +export const pinnedPosts: OrganizationResolvers["pinnedPosts"] = async ( + parent, +) => { + const postsInCache = await findPostsInCache(parent.pinnedPosts); + + if (!postsInCache.includes(null)) { + return postsInCache; + } + + const posts = await Post.find({ + _id: { + $in: parent.pinnedPosts, + }, + }).lean(); + + if (posts !== null) { + await cachePosts(posts); + } + + return posts; +}; diff --git a/src/resolvers/Organization/posts.ts b/src/resolvers/Organization/posts.ts new file mode 100644 index 0000000000..7aadc5f786 --- /dev/null +++ b/src/resolvers/Organization/posts.ts @@ -0,0 +1,165 @@ +// import { Post } from "../../models"; +import type { Types } from "mongoose"; +import type { InterfacePost } from "../../models"; +import { Post } from "../../models"; +import type { OrganizationResolvers } from "../../types/generatedGraphQLTypes"; +import { + getCommonGraphQLConnectionFilter, + getCommonGraphQLConnectionSort, + parseGraphQLConnectionArguments, + transformToDefaultGraphQLConnection, + type DefaultGraphQLArgumentError, + type ParseGraphQLConnectionCursorArguments, + type ParseGraphQLConnectionCursorResult, +} from "../../utilities/graphQLConnection"; + +import { GraphQLError } from "graphql"; +import { MAXIMUM_FETCH_LIMIT } from "../../constants"; + +/** + * Resolver function for the `posts` field of an `Organization`. + * + * This resolver is used to resolve the `posts` field of an `Organization` type. + * + * @param parent - The parent object representing the organization. It contains information about the organization, including the ID of the organization. + * @param args - The arguments provided to the field. These arguments are used to filter, sort, and paginate the posts. + * @param context - The context object passed to the GraphQL resolvers. It contains the API root URL, which is used to construct the media URL for each post. + * @returns A promise that resolves to a connection object containing the posts of the organization. + * + * @see Post - The Post model used to interact with the posts collection in the database. + * @see parseGraphQLConnectionArguments - The function used to parse the GraphQL connection arguments (filter, sort, pagination). + * @see transformToDefaultGraphQLConnection - The function used to transform the list of posts into a connection object. + * @see getCommonGraphQLConnectionFilter - The function used to get the common filter object for the GraphQL connection. + * @see getCommonGraphQLConnectionSort - The function used to get the common sort object for the GraphQL connection. + * @see MAXIMUM_FETCH_LIMIT - The maximum number of posts that can be fetched in a single request. + * @see GraphQLError - The error class used to throw GraphQL errors. + * @see OrganizationResolvers - The type definition for the resolvers of the Organization fields. + * + */ +export const posts: OrganizationResolvers["posts"] = async ( + parent, + args, + context, +) => { + const parseGraphQLConnectionArgumentsResult = + await parseGraphQLConnectionArguments({ + args, + parseCursor: (args) => + parseCursor({ + ...args, + organization: parent._id, + }), + maximumLimit: MAXIMUM_FETCH_LIMIT, + }); + if (!parseGraphQLConnectionArgumentsResult.isSuccessful) { + throw new GraphQLError("Invalid arguments provided.", { + extensions: { + code: "INVALID_ARGUMENTS", + errors: parseGraphQLConnectionArgumentsResult.errors, + }, + }); + } + const { parsedArgs } = parseGraphQLConnectionArgumentsResult; + + const filter = getCommonGraphQLConnectionFilter({ + cursor: parsedArgs.cursor, + direction: parsedArgs.direction, + }); + + //get the sorting object + + const sort = getCommonGraphQLConnectionSort({ + direction: parsedArgs.direction, + }); + + const [objectList, totalCount] = await Promise.all([ + Post.find({ + ...filter, + organization: parent._id, + }) + .sort(sort) + .limit(parsedArgs.limit) + .populate({ + path: "likedBy", + select: "image firstName lastName", + }) + .lean() + .exec(), + + Post.find({ + organization: parent._id, + }) + .countDocuments() + .exec(), + ]); + const posts = objectList.map((post: InterfacePost) => ({ + ...post, + imageUrl: post.imageUrl + ? new URL(post.imageUrl, context.apiRootUrl).toString() + : null, + videoUrl: post.videoUrl + ? new URL(post.videoUrl, context.apiRootUrl).toString() + : null, + })); + return transformToDefaultGraphQLConnection< + ParsedCursor, + InterfacePost, + InterfacePost + >({ + objectList: posts, + parsedArgs, + totalCount, + }); +}; +/* +This is typescript type of the parsed cursor for this connection resolver. +*/ +type ParsedCursor = string; + +/** + * Parses the cursor value for the `posts` connection resolver. + * + * This function is used to parse the cursor value for the `posts` connection resolver. + * + * @param cursorValue - The cursor value to be parsed. + * @param cursorName - The name of the cursor argument. + * @param cursorPath - The path of the cursor argument in the GraphQL query. + * @param organization - The ID of the organization to which the posts belong. + * @returns An object containing the parsed cursor value or an array of errors if the cursor is invalid. + * + * @see Post - The Post model used to interact with the posts collection in the database. + * @see ParseGraphQLConnectionCursorArguments - The type definition for the arguments of the parseCursor function. + * @see ParseGraphQLConnectionCursorResult - The type definition for the result of the parseCursor function. + * + */ +export const parseCursor = async ({ + cursorValue, + cursorName, + cursorPath, + organization, +}: ParseGraphQLConnectionCursorArguments & { + organization: string | Types.ObjectId; +}): ParseGraphQLConnectionCursorResult => { + const errors: DefaultGraphQLArgumentError[] = []; + const post = await Post.findOne({ + _id: cursorValue, + organization, + }); + if (!post) { + errors.push({ + message: `Argument ${cursorName} is an invalid cursor.`, + path: cursorPath, + }); + } + if (errors.length !== 0) { + return { + errors, + isSuccessful: false, + }; + } + + return { + isSuccessful: true, + parsedCursor: cursorValue, + }; +}; diff --git a/src/resolvers/Organization/userTags.ts b/src/resolvers/Organization/userTags.ts new file mode 100644 index 0000000000..2b4160cf36 --- /dev/null +++ b/src/resolvers/Organization/userTags.ts @@ -0,0 +1,153 @@ +import type { OrganizationResolvers } from "../../types/generatedGraphQLTypes"; +import type { InterfaceOrganizationTagUser } from "../../models"; +import { OrganizationTagUser } from "../../models"; +import { + getCommonGraphQLConnectionFilter, + getCommonGraphQLConnectionSort, + parseGraphQLConnectionArguments, + transformToDefaultGraphQLConnection, + type DefaultGraphQLArgumentError, + type ParseGraphQLConnectionCursorArguments, + type ParseGraphQLConnectionCursorResult, +} from "../../utilities/graphQLConnection"; +import { GraphQLError } from "graphql"; +import { MAXIMUM_FETCH_LIMIT } from "../../constants"; +import type { Types } from "mongoose"; + +/** + * Resolver function for the `userTags` field of an `Organization`. + * + * This resolver is used to resolve the `userTags` field of an `Organization` type. + * + * @param parent - The parent object representing the organization. It contains information about the organization, including the ID of the organization. + * @param args - The arguments provided to the field. These arguments are used to filter, sort, and paginate the user tags. + * @returns A promise that resolves to a connection object containing the user tags of the organization. + * + * @see OrganizationTagUser - The OrganizationTagUser model used to interact with the user tags collection in the database. + * @see parseGraphQLConnectionArguments - The function used to parse the GraphQL connection arguments (filter, sort, pagination). + * @see transformToDefaultGraphQLConnection - The function used to transform the list of user tags into a connection object. + * @see getCommonGraphQLConnectionFilter - The function used to get the common filter object for the GraphQL connection. + * @see getCommonGraphQLConnectionSort - The function used to get the common sort object for the GraphQL connection. + * @see MAXIMUM_FETCH_LIMIT - The maximum number of user tags that can be fetched in a single request. + * @see GraphQLError - The error class used to throw GraphQL errors. + * @see OrganizationResolvers - The type definition for the resolvers of the Organization fields. + * + */ +export const userTags: OrganizationResolvers["userTags"] = async ( + parent, + args, +) => { + const parseGraphQLConnectionArgumentsResult = + await parseGraphQLConnectionArguments({ + args, + parseCursor: (args) => + parseCursor({ + ...args, + organizationId: parent._id, + }), + maximumLimit: MAXIMUM_FETCH_LIMIT, + }); + + if (!parseGraphQLConnectionArgumentsResult.isSuccessful) { + throw new GraphQLError("Invalid arguments provided.", { + extensions: { + code: "INVALID_ARGUMENTS", + errors: parseGraphQLConnectionArgumentsResult.errors, + }, + }); + } + + const { parsedArgs } = parseGraphQLConnectionArgumentsResult; + + const filter = getCommonGraphQLConnectionFilter({ + cursor: parsedArgs.cursor, + direction: parsedArgs.direction, + }); + + const sort = getCommonGraphQLConnectionSort({ + direction: parsedArgs.direction, + }); + + const [objectList, totalCount] = await Promise.all([ + OrganizationTagUser.find({ + ...filter, + organizationId: parent._id, + parentTagId: null, + }) + .sort(sort) + .limit(parsedArgs.limit) + .lean() + .exec(), + OrganizationTagUser.find({ + organizationId: parent._id, + }) + .countDocuments() + .exec(), + ]); + + return transformToDefaultGraphQLConnection< + ParsedCursor, + InterfaceOrganizationTagUser, + InterfaceOrganizationTagUser + >({ + objectList, + parsedArgs, + totalCount, + }); +}; + +/* +This is typescript type of the parsed cursor for this connection resolver. +*/ +type ParsedCursor = string; + +/** + * Parses the cursor value for the `userTags` connection resolver. + * + * This function is used to parse the cursor value for the `userTags` connection resolver. + * + * @param cursorValue - The cursor value to be parsed. + * @param cursorName - The name of the cursor argument. + * @param cursorPath - The path of the cursor argument in the query. + * @param organizationId - The ID of the organization to which the user tags belong. + * @returns An object containing the parsed cursor value or an array of errors if the cursor is invalid. + * + * @see OrganizationTagUser - The OrganizationTagUser model used to interact with the user tags collection in the database. + * @see DefaultGraphQLArgumentError - The type definition for the default GraphQL argument error. + * @see ParseGraphQLConnectionCursorArguments - The type definition for the arguments of the parseCursor function. + * @see ParseGraphQLConnectionCursorResult - The type definition for the result of the parseCursor function. + * + */ +export const parseCursor = async ({ + cursorValue, + cursorName, + cursorPath, + organizationId, +}: ParseGraphQLConnectionCursorArguments & { + organizationId: string | Types.ObjectId; +}): ParseGraphQLConnectionCursorResult => { + const errors: DefaultGraphQLArgumentError[] = []; + const tag = await OrganizationTagUser.findOne({ + _id: cursorValue, + organizationId, + }); + + if (!tag) { + errors.push({ + message: `Argument ${cursorName} is an invalid cursor.`, + path: cursorPath, + }); + } + + if (errors.length !== 0) { + return { + errors, + isSuccessful: false, + }; + } + + return { + isSuccessful: true, + parsedCursor: cursorValue, + }; +}; diff --git a/src/resolvers/Organization/venues.ts b/src/resolvers/Organization/venues.ts new file mode 100644 index 0000000000..e1d7af0b51 --- /dev/null +++ b/src/resolvers/Organization/venues.ts @@ -0,0 +1,18 @@ +import type { OrganizationResolvers } from "./../../types/generatedGraphQLTypes"; +import { Venue } from "../../models"; + +/** + * Resolver function for the `venues` field of an `Organization`. + * + * This function retrieves the venues related to a specific organization. + * + * @param parent - The parent object representing the organization. It contains information about the organization, including the ID of the organization. + * @returns A promise that resolves to the venue documents found in the database. These documents represent the venues related to the organization. + * + * @see Venue - The Venue model used to interact with the venues collection in the database. + * @see OrganizationResolvers - The type definition for the resolvers of the Organization fields. + * + */ +export const venues: OrganizationResolvers["venues"] = async (parent) => { + return await Venue.find({ organization: parent._id.toString() }).lean(); +}; diff --git a/src/resolvers/Post/comments.ts b/src/resolvers/Post/comments.ts new file mode 100644 index 0000000000..3672aad776 --- /dev/null +++ b/src/resolvers/Post/comments.ts @@ -0,0 +1,35 @@ +import type { PostResolvers } from "../../types/generatedGraphQLTypes"; +import { Comment } from "../../models"; +import { cacheComments } from "../../services/CommentCache/cacheComments"; +import { findCommentsByPostIdInCache } from "../../services/CommentCache/findCommentsByPostIdInCache"; + +/** + * Resolver function for the `comments` field of a `Post`. + * + * This function retrieves the comments associated with a specific post. + * + * @param parent - The parent object representing the post. It contains information about the post, including the ID of the comments associated with it. + * @returns A promise that resolves to an array of comment documents found in the database. These documents represent the comments associated with the post. + * + * @see Comment - The Comment model used to interact with the comments collection in the database. + * @see PostResolvers - The type definition for the resolvers of the Post fields. + * + */ +export const comments: PostResolvers["comments"] = async (parent) => { + const commentsInCache = await findCommentsByPostIdInCache(parent._id); + + if ( + !commentsInCache.includes(null) && + commentsInCache.length === parent.commentCount + ) { + return commentsInCache; + } + + const comment = await Comment.find({ + postId: parent._id, + }).lean(); + + cacheComments(comment); + + return comment; +}; diff --git a/src/resolvers/Post/creator.ts b/src/resolvers/Post/creator.ts new file mode 100644 index 0000000000..d9a7b6e507 --- /dev/null +++ b/src/resolvers/Post/creator.ts @@ -0,0 +1,20 @@ +import type { PostResolvers } from "../../types/generatedGraphQLTypes"; +import { User } from "../../models"; + +/** + * Resolver function for the `creator` field of a `Post`. + * + * This function retrieves the user who created a specific post. + * + * @param parent - The parent object representing the post. It contains information about the post, including the ID of the user who created it. + * @returns A promise that resolves to the user document found in the database. This document represents the user who created the post. + * + * @see User - The User model used to interact with the users collection in the database. + * @see PostResolvers - The type definition for the resolvers of the Post fields. + * + */ +export const creator: PostResolvers["creator"] = async (parent) => { + return await User.findOne({ + _id: parent.creatorId, + }).lean(); +}; diff --git a/src/resolvers/Post/index.ts b/src/resolvers/Post/index.ts new file mode 100644 index 0000000000..05b1e06db4 --- /dev/null +++ b/src/resolvers/Post/index.ts @@ -0,0 +1,8 @@ +import type { PostResolvers } from "../../types/generatedGraphQLTypes"; +import { comments } from "./comments"; +import { creator } from "./creator"; + +export const Post: PostResolvers = { + comments, + creator, +}; diff --git a/src/resolvers/Query/actionItemCategoriesByOrganization.ts b/src/resolvers/Query/actionItemCategoriesByOrganization.ts new file mode 100644 index 0000000000..24e892207d --- /dev/null +++ b/src/resolvers/Query/actionItemCategoriesByOrganization.ts @@ -0,0 +1,23 @@ +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; +import { ActionItemCategory } from "../../models"; +import { getWhere } from "./helperFunctions/getWhere"; +import { getSort } from "./helperFunctions/getSort"; +/** + * This query will fetch all categories for the organization from database. + * @param _parent- + * @param args - An object that contains `organizationId` which is the _id of the Organization and `orderBy` which is the sorting order & where which is the filter. + * @returns A `categories` object that holds all categories for the Organization. + */ +export const actionItemCategoriesByOrganization: QueryResolvers["actionItemCategoriesByOrganization"] = + async (_parent, args) => { + const sort = getSort(args.orderBy); + const where = getWhere(args.where); + const categories = await ActionItemCategory.find({ + organizationId: args.organizationId, + ...where, + }) + .sort(sort) + .lean(); + + return categories; + }; diff --git a/src/resolvers/Query/actionItemsByEvent.ts b/src/resolvers/Query/actionItemsByEvent.ts new file mode 100644 index 0000000000..1c58845720 --- /dev/null +++ b/src/resolvers/Query/actionItemsByEvent.ts @@ -0,0 +1,18 @@ +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; +import { ActionItem } from "../../models"; +/** + * This query will fetch all action items for an event from database. + * @param _parent- + * @param args - An object that contains `eventId` which is the _id of the Event. + * @returns An `actionItems` object that holds all action items for the Event. + */ +export const actionItemsByEvent: QueryResolvers["actionItemsByEvent"] = async ( + _parent, + args, +) => { + const actionItems = await ActionItem.find({ + event: args.eventId, + }).lean(); + + return actionItems; +}; diff --git a/src/resolvers/Query/actionItemsByOrganization.ts b/src/resolvers/Query/actionItemsByOrganization.ts new file mode 100644 index 0000000000..828cf58005 --- /dev/null +++ b/src/resolvers/Query/actionItemsByOrganization.ts @@ -0,0 +1,57 @@ +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; +import type { + InterfaceActionItem, + InterfaceActionItemCategory, + InterfaceUser, +} from "../../models"; +import { ActionItem } from "../../models"; +import { getWhere } from "./helperFunctions/getWhere"; +import { getSort } from "./helperFunctions/getSort"; +/** + * This query will fetch all action items for an organization from database. + * @param _parent- + * @param args - An object that contains `organizationId` which is the _id of the Organization. + * @returns An `actionItems` object that holds all action items for the Event. + */ +export const actionItemsByOrganization: QueryResolvers["actionItemsByOrganization"] = + async (_parent, args) => { + const sort = getSort(args.orderBy); + const where = getWhere(args.where); + + const actionItems = await ActionItem.find({ + organization: args.organizationId, + event: args.eventId, + ...where, + }) + .populate("creator") + .populate("assignee") + .populate("assigner") + .populate("actionItemCategory") + .populate("organization") + .populate("event") + .sort(sort) + .lean(); + + let filteredActionItems: InterfaceActionItem[] = actionItems; + + // Filter the action items based on category name + if (args.where?.categoryName) { + filteredActionItems = filteredActionItems.filter((item) => { + const tempItem = item as InterfaceActionItem; + const category = + tempItem.actionItemCategory as InterfaceActionItemCategory; + return category.name.includes(args?.where?.categoryName as string); + }); + } + + // Filter the action items based on assignee name + if (args.where?.assigneeName) { + filteredActionItems = filteredActionItems.filter((item) => { + const tempItem = item as InterfaceActionItem; + const assignee = tempItem.assignee as InterfaceUser; + return assignee.firstName.includes(args?.where?.assigneeName as string); + }); + } + + return filteredActionItems; + }; diff --git a/src/resolvers/Query/advertisementsConnection.ts b/src/resolvers/Query/advertisementsConnection.ts new file mode 100644 index 0000000000..2b91038e0d --- /dev/null +++ b/src/resolvers/Query/advertisementsConnection.ts @@ -0,0 +1,133 @@ +import { GraphQLError } from "graphql"; +import { MAXIMUM_FETCH_LIMIT } from "../../constants"; +import type { InterfaceAdvertisement } from "../../models"; +import { Advertisement } from "../../models"; +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; +import { + getCommonGraphQLConnectionFilter, + getCommonGraphQLConnectionSort, + parseGraphQLConnectionArguments, + transformToDefaultGraphQLConnection, + type DefaultGraphQLArgumentError, + type ParseGraphQLConnectionCursorArguments, + type ParseGraphQLConnectionCursorResult, +} from "../../utilities/graphQLConnection"; + +/** + * Retrieves a paginated list of advertisements based on the provided connection arguments. + * + * This function handles querying and pagination of advertisements using connection arguments. It performs validation of the connection arguments, applies filters and sorting, and then returns a paginated result containing the advertisements. The media URLs for each advertisement are adjusted based on the API root URL provided in the context. + * + * @param _parent - This parameter represents the parent resolver in the GraphQL schema and is not used in this function. + * @param args - The arguments passed to the GraphQL query, including pagination and filter criteria. + * @param context - Provides contextual information, including the API root URL. This is used to construct the media URLs for the advertisements. + * + * @returns A paginated connection object containing the advertisements, their total count, and the pagination information. + * + */ +export const advertisementsConnection: QueryResolvers["advertisementsConnection"] = + async (_parent, args, context) => { + const parseGraphQLConnectionArgumentsResult = + await parseGraphQLConnectionArguments({ + args, + parseCursor: (args) => + parseCursor({ + ...args, + }), + maximumLimit: MAXIMUM_FETCH_LIMIT, + }); + + if (!parseGraphQLConnectionArgumentsResult.isSuccessful) { + throw new GraphQLError("Invalid arguments provided.", { + extensions: { + code: "INVALID_ARGUMENTS", + errors: parseGraphQLConnectionArgumentsResult.errors, + }, + }); + } + + const { parsedArgs } = parseGraphQLConnectionArgumentsResult; + + const filter = getCommonGraphQLConnectionFilter({ + cursor: parsedArgs.cursor, + direction: parsedArgs.direction, + }); + + const sort = getCommonGraphQLConnectionSort({ + direction: parsedArgs.direction, + }); + + const [objectList, totalCount] = await Promise.all([ + Advertisement.find({ + ...filter, + }) + .sort(sort) + .limit(parsedArgs.limit) + .lean() + .exec(), + Advertisement.find().countDocuments().exec(), + ]); + + const advertisements = objectList.map( + (advertisement: InterfaceAdvertisement) => ({ + ...advertisement, + mediaUrl: `${context.apiRootUrl}${advertisement.mediaUrl}`, + }), + ); + + return transformToDefaultGraphQLConnection< + ParsedCursor, + InterfaceAdvertisement, + InterfaceAdvertisement + >({ + objectList: advertisements, + parsedArgs, + totalCount, + }); + }; + +/** + * Type representing the parsed cursor used in the connection resolver. + */ +type ParsedCursor = string; + +/** + * Validates and transforms the cursor passed to the connection resolver. + * + * This function checks if the provided cursor value corresponds to a valid advertisement in the database. If the cursor is valid, it is returned as-is. Otherwise, an error is recorded. + * + * @param cursorValue - The value of the cursor to be validated. + * @param cursorName - The name of the cursor argument used in the query. + * @param cursorPath - The path in the query where the cursor argument is located. + * + * @returns An object containing a flag indicating success or failure, the parsed cursor, and any errors encountered during validation. + */ +export const parseCursor = async ({ + cursorValue, + cursorName, + cursorPath, +}: ParseGraphQLConnectionCursorArguments): ParseGraphQLConnectionCursorResult => { + const errors: DefaultGraphQLArgumentError[] = []; + const advertisement = await Advertisement.findOne({ + _id: cursorValue, + }); + + if (!advertisement) { + errors.push({ + message: `Argument ${cursorName} is an invalid cursor.`, + path: cursorPath, + }); + } + + if (errors.length !== 0) { + return { + errors, + isSuccessful: false, + }; + } + + return { + isSuccessful: true, + parsedCursor: cursorValue, + }; +}; diff --git a/src/resolvers/Query/agendaCategory.ts b/src/resolvers/Query/agendaCategory.ts new file mode 100644 index 0000000000..ea17d84b3b --- /dev/null +++ b/src/resolvers/Query/agendaCategory.ts @@ -0,0 +1,38 @@ +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; +import { AgendaCategoryModel } from "../../models"; +import { errors } from "../../libraries"; +import { AGENDA_CATEGORY_NOT_FOUND_ERROR } from "../../constants"; + +/** + * This is a resolver function for the GraphQL query 'agendaCategory'. + * + * This resolver fetches an agenda category by its ID. + * + * + * @param _parent - The parent object, not used in this resolver. + * @param args - The input arguments for the query. + * @returns A promise that resolves to the fetched agenda category. + * @throws `NotFoundError` If the agenda category is not found. + * @throws `InternalServerError` For other potential issues during agenda category fetching. + */ + +export const agendaCategory: QueryResolvers["agendaCategory"] = async ( + _parent, + args, +) => { + // Find the AgendaCategory by ID + const foundAgendaCategory = await AgendaCategoryModel.findById( + args.id, + ).lean(); + + // If the AgendaCategory is not found, throw a NotFoundError + if (!foundAgendaCategory) { + throw new errors.NotFoundError( + AGENDA_CATEGORY_NOT_FOUND_ERROR.MESSAGE, + AGENDA_CATEGORY_NOT_FOUND_ERROR.CODE, + AGENDA_CATEGORY_NOT_FOUND_ERROR.PARAM, + ); + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + return foundAgendaCategory as any; +}; diff --git a/src/resolvers/Query/agendaItemByEvent.ts b/src/resolvers/Query/agendaItemByEvent.ts new file mode 100644 index 0000000000..118ea2b1d9 --- /dev/null +++ b/src/resolvers/Query/agendaItemByEvent.ts @@ -0,0 +1,19 @@ +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; +import { AgendaItemModel } from "../../models"; + +/** + * This query will fetch all items for the organization from database. + * @param _parent- + * @param args - An object that contains `organizationId` which is the _id of the Organization. + * @returns A `Item` object that holds all Item for the Organization. + */ +export const agendaItemByEvent: QueryResolvers["agendaItemByEvent"] = async ( + _parent, + args, +) => { + return await AgendaItemModel.find({ + relatedEventId: args.relatedEventId, + }) + .sort({ sequence: 1 }) + .lean(); +}; diff --git a/src/resolvers/Query/agendaItemById.ts b/src/resolvers/Query/agendaItemById.ts new file mode 100644 index 0000000000..58cf6795e7 --- /dev/null +++ b/src/resolvers/Query/agendaItemById.ts @@ -0,0 +1,32 @@ +import { AgendaItemModel } from "../../models"; +import { errors } from "../../libraries"; +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; +import { AGENDA_ITEM_NOT_FOUND_ERROR } from "../../constants"; +/** + * Retrieves an agenda item by its ID. + * + * This function fetches a specific agenda item from the database using its ID. If the agenda item + * is not found, it throws an error indicating that the item does not exist. + * + * @param _parent - This parameter is not used in this resolver function. + * @param args - The arguments provided by the GraphQL query, including the ID of the agenda item to retrieve. + * + * @returns The agenda item with the specified ID. + */ + +export const getAgendaItem: QueryResolvers["getAgendaItem"] = async ( + _parent, + args, +) => { + const agendaItem = await AgendaItemModel.findById(args.id).lean(); + + if (!agendaItem) { + throw new errors.NotFoundError( + AGENDA_ITEM_NOT_FOUND_ERROR.MESSAGE, + AGENDA_ITEM_NOT_FOUND_ERROR.CODE, + AGENDA_ITEM_NOT_FOUND_ERROR.PARAM, + ); + } + + return agendaItem; +}; diff --git a/src/resolvers/Query/agendaItemByOrganization.ts b/src/resolvers/Query/agendaItemByOrganization.ts new file mode 100644 index 0000000000..65fe647b26 --- /dev/null +++ b/src/resolvers/Query/agendaItemByOrganization.ts @@ -0,0 +1,15 @@ +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; +import { AgendaItemModel } from "../../models"; + +/** + * This query will fetch all items for the organization from database. + * @param _parent- + * @param args - An object that contains `organizationId` which is the _id of the Organization. + * @returns A `Item` object that holds all Item for the Organization. + */ +export const agendaItemByOrganization: QueryResolvers["agendaItemByOrganization"] = + async (_parent, args) => { + return await AgendaItemModel.find({ + organizationId: args.organizationId, + }).lean(); + }; diff --git a/src/resolvers/Query/agendaItemCategoriesByOrganization.ts b/src/resolvers/Query/agendaItemCategoriesByOrganization.ts new file mode 100644 index 0000000000..8b1523011e --- /dev/null +++ b/src/resolvers/Query/agendaItemCategoriesByOrganization.ts @@ -0,0 +1,14 @@ +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; +import { AgendaCategoryModel } from "../../models"; +/** + * This query will fetch all categories for the organization from database. + * @param _parent- + * @param args - An object that contains `organizationId` which is the _id of the Organization. + * @returns A `categories` object that holds all categories for the Organization. + */ +export const agendaItemCategoriesByOrganization: QueryResolvers["agendaItemCategoriesByOrganization"] = + async (_parent, args) => { + return await AgendaCategoryModel.find({ + organizationId: args.organizationId, + }).lean(); + }; diff --git a/src/resolvers/Query/checkAuth.ts b/src/resolvers/Query/checkAuth.ts new file mode 100644 index 0000000000..09a0c6a7de --- /dev/null +++ b/src/resolvers/Query/checkAuth.ts @@ -0,0 +1,47 @@ +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; +import { USER_NOT_FOUND_ERROR } from "../../constants"; +import { AppUserProfile, User } from "../../models"; +import { errors } from "../../libraries"; +/** + * This query determines whether or not the user exists in the database (MongoDB). + * @param _parent - The return value of the resolver for this field's parent + * @param _args - An object that contains all GraphQL arguments provided for this field. + * @param context - An object that contains `userId`. + * @returns An `object` that contains user data. + * @remarks You can learn about GraphQL `Resolvers` {@link https://www.apollographql.com/docs/apollo-server/data/resolvers/ | here}. + */ +export const checkAuth: QueryResolvers["checkAuth"] = async ( + _parent, + _args, + context, +) => { + const currentUser = await User.findOne({ + _id: context.userId, + }).lean(); + + if (!currentUser) { + throw new errors.NotFoundError( + USER_NOT_FOUND_ERROR.DESC, + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + const currentUserAppProfile = await AppUserProfile.findOne({ + userId: currentUser._id, + }).lean(); + if (!currentUserAppProfile) { + throw new errors.UnauthorizedError( + USER_NOT_FOUND_ERROR.DESC, + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + + return { + ...currentUser, + image: currentUser.image + ? `${context.apiRootUrl}${currentUser.image}` + : null, + organizationsBlockedBy: [], + }; +}; diff --git a/src/resolvers/Query/customDataByOrganization.ts b/src/resolvers/Query/customDataByOrganization.ts new file mode 100644 index 0000000000..dcaea62c47 --- /dev/null +++ b/src/resolvers/Query/customDataByOrganization.ts @@ -0,0 +1,22 @@ +import { UserCustomData } from "../../models/UserCustomData"; +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; + +/** + * This query will fetch all the customData of the members of the organization in the database. + * @param _parent- + * @param args - An object that contains `id` of the organization. + * @returns An object `customDatas` that contains all the custom fields of the specified organization. + * The following checks are made: + * 1. if the organization exists + */ + +export const customDataByOrganization: QueryResolvers["customDataByOrganization"] = + async (_parent, args) => { + const { organizationId } = args; + + const customData = await UserCustomData.find({ + organizationId, + }).lean(); + + return customData; + }; diff --git a/src/resolvers/Query/customFieldsByOrganization.ts b/src/resolvers/Query/customFieldsByOrganization.ts new file mode 100644 index 0000000000..70caf5dc15 --- /dev/null +++ b/src/resolvers/Query/customFieldsByOrganization.ts @@ -0,0 +1,34 @@ +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; +import { Organization, OrganizationCustomField } from "../../models"; +import { errors, requestContext } from "../../libraries"; +import { ORGANIZATION_NOT_FOUND_ERROR } from "../../constants"; + +/** + * This query will fetch all the custom Fields for the organization in the database. + * @param _parent- + * @param args - An object that contains `id` of the organization. + * @returns An object `CustomFields` that contains all the custom fields of the specified organization. + * The following checks are made: + * 1. if the organization exists + */ + +export const customFieldsByOrganization: QueryResolvers["customFieldsByOrganization"] = + async (_parent, args) => { + const organization = await Organization.findOne({ + _id: args.id, + }); + + if (!organization) { + throw new errors.NotFoundError( + requestContext.translate(ORGANIZATION_NOT_FOUND_ERROR.MESSAGE), + ORGANIZATION_NOT_FOUND_ERROR.CODE, + ORGANIZATION_NOT_FOUND_ERROR.PARAM, + ); + } + + const customFields = await OrganizationCustomField.find({ + organizationId: organization._id.toString(), + }); + + return customFields; + }; diff --git a/src/resolvers/Query/directChatById.ts b/src/resolvers/Query/directChatById.ts new file mode 100644 index 0000000000..00a4b9f852 --- /dev/null +++ b/src/resolvers/Query/directChatById.ts @@ -0,0 +1,31 @@ +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; +import { errors } from "../../libraries"; +import { DirectChat } from "../../models"; +import { CHAT_NOT_FOUND_ERROR } from "../../constants"; + +/** + * This query will fetch all messages for a certain direct chat for the user from database. + * @param _parent- + * @param args - An object that contains `id` of the direct chat. + * @returns A `directChatsMessages` object that holds all of the messages from the specified direct chat. + * If the `directChatsMessages` object is null then it throws `NotFoundError` error. + * @remarks You can learn about GraphQL `Resolvers` + * {@link https://www.apollographql.com/docs/apollo-server/data/resolvers/ | here}. + */ + +export const directChatById: QueryResolvers["directChatById"] = async ( + _parent, + args, +) => { + const directChat = await DirectChat.findById(args.id).lean(); + + if (!directChat) { + throw new errors.NotFoundError( + CHAT_NOT_FOUND_ERROR.DESC, + CHAT_NOT_FOUND_ERROR.CODE, + CHAT_NOT_FOUND_ERROR.PARAM, + ); + } + + return directChat; +}; diff --git a/src/resolvers/Query/directChatsByUserID.ts b/src/resolvers/Query/directChatsByUserID.ts new file mode 100644 index 0000000000..efb34e93dd --- /dev/null +++ b/src/resolvers/Query/directChatsByUserID.ts @@ -0,0 +1,28 @@ +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; +import { errors } from "../../libraries"; +import { DirectChat } from "../../models"; +/** + * This query will fetch all the Direct chats for the current user from the database. + * @param _parent- + * @param args - An object that contains `id` of the user. + * @returns An object `directChats` that contains all direct chats of the current user. + * If the `directChats` object is null then it throws `NotFoundError` error. + * @remarks You can learn about GraphQL `Resolvers` + * {@link https://www.apollographql.com/docs/apollo-server/data/resolvers/ | here}. + */ +export const directChatsByUserID: QueryResolvers["directChatsByUserID"] = + async (_parent, args) => { + const directChats = await DirectChat.find({ + users: args.id, + }).lean(); + + if (directChats.length === 0) { + throw new errors.NotFoundError( + "DirectChats not found", + "directChats.notFound", + "directChats", + ); + } + + return directChats; + }; diff --git a/src/resolvers/Query/directChatsMessagesByChatID.ts b/src/resolvers/Query/directChatsMessagesByChatID.ts new file mode 100644 index 0000000000..173eada6e5 --- /dev/null +++ b/src/resolvers/Query/directChatsMessagesByChatID.ts @@ -0,0 +1,31 @@ +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; +import { errors } from "../../libraries"; +import { DirectChatMessage } from "../../models"; +import { CHAT_NOT_FOUND_ERROR } from "../../constants"; + +/** + * This query will fetch all messages for a certain direct chat for the user from database. + * @param _parent- + * @param args - An object that contains `id` of the direct chat. + * @returns A `directChatsMessages` object that holds all of the messages from the specified direct chat. + * If the `directChatsMessages` object is null then it throws `NotFoundError` error. + * @remarks You can learn about GraphQL `Resolvers` + * {@link https://www.apollographql.com/docs/apollo-server/data/resolvers/ | here}. + */ + +export const directChatsMessagesByChatID: QueryResolvers["directChatsMessagesByChatID"] = + async (_parent, args) => { + const directChatsMessages = await DirectChatMessage.find({ + directChatMessageBelongsTo: args.id, + }).lean(); + + if (directChatsMessages.length === 0) { + throw new errors.NotFoundError( + CHAT_NOT_FOUND_ERROR.DESC, + CHAT_NOT_FOUND_ERROR.CODE, + CHAT_NOT_FOUND_ERROR.PARAM, + ); + } + + return directChatsMessages; + }; diff --git a/src/resolvers/Query/event.ts b/src/resolvers/Query/event.ts new file mode 100644 index 0000000000..eccd5fdbb3 --- /dev/null +++ b/src/resolvers/Query/event.ts @@ -0,0 +1,30 @@ +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; +import { Event } from "../../models"; +import { errors } from "../../libraries"; +import { EVENT_NOT_FOUND_ERROR } from "../../constants"; +/** + * This query will fetch the event with _id === args.id from the database. + * @param _parent- + * @param args - An object that contains `id` of the event that need to be fetched. + * @returns An `event` object. If the `event` object is null then it throws `NotFoundError` error. + * @remarks You can learn about GraphQL `Resolvers` + * {@link https://www.apollographql.com/docs/apollo-server/data/resolvers/ | here}. + */ +export const event: QueryResolvers["event"] = async (_parent, args) => { + const event = await Event.findOne({ + _id: args.id, + }) + .populate("creatorId", "-password") + .populate("admins", "-password") + .lean(); + + if (!event) { + throw new errors.NotFoundError( + EVENT_NOT_FOUND_ERROR.DESC, + EVENT_NOT_FOUND_ERROR.CODE, + EVENT_NOT_FOUND_ERROR.PARAM, + ); + } + + return event; +}; diff --git a/src/resolvers/Query/eventVolunteersByEvent.ts b/src/resolvers/Query/eventVolunteersByEvent.ts new file mode 100644 index 0000000000..e982f58e18 --- /dev/null +++ b/src/resolvers/Query/eventVolunteersByEvent.ts @@ -0,0 +1,20 @@ +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; +import { EventVolunteer } from "../../models"; +/** + * This query will fetch all events volunteers for the given eventId from database. + * @param _parent- + * @param args - An object that contains `id` of the Event. + * @returns An object that holds all Event Volunteers for the given Event + */ +export const eventVolunteersByEvent: QueryResolvers["eventVolunteersByEvent"] = + async (_parent, args) => { + const eventId = args.id; + + const volunteers = EventVolunteer.find({ + eventId: eventId, + }) + .populate("userId", "-password") + .lean(); + + return volunteers; + }; diff --git a/src/resolvers/Query/eventsByOrganization.ts b/src/resolvers/Query/eventsByOrganization.ts new file mode 100644 index 0000000000..a4eefcbdcf --- /dev/null +++ b/src/resolvers/Query/eventsByOrganization.ts @@ -0,0 +1,23 @@ +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; +import { Event } from "../../models"; +import { getSort } from "./helperFunctions/getSort"; +/** + * This query will fetch all the events for an organization from the database. + * @param _parent- + * @param args - An object that contains `orderBy` to sort the object as specified and `id` of the Organization. + * @returns An `events` object that holds all the events for the Organization. + */ +export const eventsByOrganization: QueryResolvers["eventsByOrganization"] = + async (_parent, args) => { + const sort = getSort(args.orderBy); + + const events = await Event.find({ + organization: args.id, + }) + .sort(sort) + .populate("creatorId", "-password") + .populate("admins", "-password") + .lean(); + + return events; + }; diff --git a/src/resolvers/Query/eventsByOrganizationConnection.ts b/src/resolvers/Query/eventsByOrganizationConnection.ts new file mode 100644 index 0000000000..e184a2bc47 --- /dev/null +++ b/src/resolvers/Query/eventsByOrganizationConnection.ts @@ -0,0 +1,45 @@ +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; +import type { InterfaceEvent } from "../../models"; +import { Event } from "../../models"; +import { getSort } from "./helperFunctions/getSort"; +import { getWhere } from "./helperFunctions/getWhere"; +import { createRecurringEventInstancesDuringQuery } from "../../helpers/event/createEventHelpers"; +/** + * Retrieves events for a specific organization based on the provided query parameters. + * + * This function performs the following steps: + * 1. Generates recurring event instances up to a certain date if the organization has any. + * 2. Builds a query filter (`where`) and sorting parameters based on the provided arguments. + * 3. Queries the database for events matching the filter, with sorting, pagination, and related data fetching. + * + * @param _parent - This parameter is not used in this resolver function. + * @param args - The arguments provided by the GraphQL query, including filters (`where`), sorting order (`orderBy`), pagination options (`first` and `skip`), and any other query parameters. + * + * @returns A list of events matching the query parameters, with related data populated. + */ + +export const eventsByOrganizationConnection: QueryResolvers["eventsByOrganizationConnection"] = + async (_parent, args) => { + // dynamically generate recurring event instances upto a certain date during this query + await createRecurringEventInstancesDuringQuery(args.where?.organization_id); + + // get the where and sort + let where = getWhere(args.where); + const sort = getSort(args.orderBy); + + where = { + ...where, + isBaseRecurringEvent: false, + }; + + // find all the events according to the requirements + const events = await Event.find(where) + .sort(sort) + .limit(args.first ?? 0) + .skip(args.skip ?? 0) + .populate("creatorId", "-password") + .populate("admins", "-password") + .lean(); + + return events; + }; diff --git a/src/resolvers/Query/fundsByOrganization.ts b/src/resolvers/Query/fundsByOrganization.ts new file mode 100644 index 0000000000..b6543b771a --- /dev/null +++ b/src/resolvers/Query/fundsByOrganization.ts @@ -0,0 +1,31 @@ +import type { InterfaceFund } from "../../models"; +import { Fund } from "../../models"; +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; +import { getSort } from "./helperFunctions/getSort"; +import { getWhere } from "./helperFunctions/getWhere"; +/** + * Retrieves funds associated with a specific organization based on the provided query parameters. + * + * This function performs the following steps: + * 1. Builds a query filter (`where`) and sorting parameters based on the provided arguments. + * 2. Queries the database for funds associated with the specified organization ID and matching the filter criteria. + * 3. Sorts the results based on the provided sorting order. + * + * @param _parent - This parameter is not used in this resolver function. + * @param args - The arguments provided by the GraphQL query, including the organization ID (`organizationId`), filter criteria (`where`), and sorting order (`orderBy`). + * + * @returns A list of funds associated with the specified organization, matching the filter and sorting criteria. + */ + +export const fundsByOrganization: QueryResolvers["fundsByOrganization"] = + async (_parent, args) => { + const where = getWhere(args.where); + const sort = getSort(args.orderBy); + + const funds = await Fund.find({ + organizationId: args.organizationId, + ...where, + }).sort(sort); + + return funds; + }; diff --git a/src/resolvers/Query/getAgendaSection.ts b/src/resolvers/Query/getAgendaSection.ts new file mode 100644 index 0000000000..de804bdb10 --- /dev/null +++ b/src/resolvers/Query/getAgendaSection.ts @@ -0,0 +1,33 @@ +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; +import { AGENDA_SECTION_NOT_FOUND_ERROR } from "../../constants"; +import { AgendaSectionModel } from "../../models"; +import { errors } from "../../libraries"; + +/** + * Resolver function for the GraphQL query 'getAgendaSection'. + * + * This resolver retrieves an agenda section by its ID. + * + * @param _parent - The parent object, not used in this resolver. + * @param args - The input arguments for the query. + */ +export const getAgendaSection: QueryResolvers["getAgendaSection"] = async ( + _parent, + { id }, +) => { + // Find the agenda section by ID + const agendaSection = await AgendaSectionModel.findById(id).lean(); + + // If the agenda section is not found, throw a NotFoundError + if (!agendaSection) { + throw new errors.NotFoundError( + AGENDA_SECTION_NOT_FOUND_ERROR.MESSAGE, + + AGENDA_SECTION_NOT_FOUND_ERROR.CODE, + AGENDA_SECTION_NOT_FOUND_ERROR.PARAM, + ); + } + + // Return the retrieved agenda section + return agendaSection; +}; diff --git a/src/resolvers/Query/getAllAgendaItems.ts b/src/resolvers/Query/getAllAgendaItems.ts new file mode 100644 index 0000000000..04604cc105 --- /dev/null +++ b/src/resolvers/Query/getAllAgendaItems.ts @@ -0,0 +1,27 @@ +import { AgendaItemModel } from "../../models"; +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; + +/** + * Retrieves all agenda items from the database. + * + * This function performs the following steps: + * 1. Fetches all agenda items stored in the database. + * 2. Returns the list of all agenda items. + * + * @param _parent - This parameter is not used in this resolver function but is included for compatibility with GraphQL resolver signatures. + * @param _args - This parameter is not used in this resolver function but is included for compatibility with GraphQL resolver signatures. + * + * @returns A list of all agenda items stored in the database. + */ + +export const getAllAgendaItems: QueryResolvers["getAllAgendaItems"] = async ( + _parent, + _args, +) => { + console.log(_parent); + console.log(_args); + + // Fetch all agenda items from the database + const allAgendaItems = await AgendaItemModel.find().lean().exec(); + return allAgendaItems; +}; diff --git a/src/resolvers/Query/getAllNotesForAgendaItem.ts b/src/resolvers/Query/getAllNotesForAgendaItem.ts new file mode 100644 index 0000000000..5917ddd385 --- /dev/null +++ b/src/resolvers/Query/getAllNotesForAgendaItem.ts @@ -0,0 +1,29 @@ +import type { InterfaceNote } from "../../models"; +import { NoteModel } from "../../models"; +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; +/** + * Retrieves all notes associated with a specific agenda item from the database. + * + * This function performs the following steps: + * 1. Queries the database for notes that are associated with the specified agenda item ID. + * 2. Returns the list of notes for the given agenda item. + * + * @param _parent - This parameter is not used in this resolver function but is included for compatibility with GraphQL resolver signatures. + * @param args - The arguments provided by the GraphQL query, including the agenda item ID (`agendaItemId`) for which notes are to be retrieved. + * + * @returns A list of notes associated with the specified agenda item. + */ + +export const getAllNotesForAgendaItem: QueryResolvers["getAllNotesForAgendaItem"] = + async (_parent, args) => { + console.log(_parent); + console.log(args); + + // Fetch all notes for a specific agenda item from the database + const allNotesForAgendaItem = await NoteModel.find({ + agendaItemId: args.agendaItemId, + }) + .lean() + .exec(); + return allNotesForAgendaItem as InterfaceNote[]; + }; diff --git a/src/resolvers/Query/getCommunityData.ts b/src/resolvers/Query/getCommunityData.ts new file mode 100644 index 0000000000..6d36d1e334 --- /dev/null +++ b/src/resolvers/Query/getCommunityData.ts @@ -0,0 +1,16 @@ +import { Community } from "../../models"; +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; + +/** + * This query will fetch the community data from the database. + * @returns A `community` object or if it does not exits then it will return null. + * @remarks You can learn about GraphQL `Resolvers` + * {@link https://www.apollographql.com/docs/apollo-server/data/resolvers/ | here}. + */ + +export const getCommunityData: QueryResolvers["getCommunityData"] = + async () => { + const community = await Community.findOne(); + + return community; + }; diff --git a/src/resolvers/Query/getDonationById.ts b/src/resolvers/Query/getDonationById.ts new file mode 100644 index 0000000000..09a7ee0149 --- /dev/null +++ b/src/resolvers/Query/getDonationById.ts @@ -0,0 +1,20 @@ +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; +import type { InterfaceDonation } from "../../models"; +import { Donation } from "../../models"; + +/** + * This query will fetch the donation as a transaction from database. + * @param _parent- + * @param args - An object that contains `id` of the donation. + * @returns A `donation` object. + */ +export const getDonationById: QueryResolvers["getDonationById"] = async ( + _parent, + args, +) => { + const donation = await Donation.findOne({ + _id: args.id, + }).lean(); + + return donation ?? ({} as InterfaceDonation); +}; diff --git a/src/resolvers/Query/getDonationByOrgId.ts b/src/resolvers/Query/getDonationByOrgId.ts new file mode 100644 index 0000000000..2dfe0cfe74 --- /dev/null +++ b/src/resolvers/Query/getDonationByOrgId.ts @@ -0,0 +1,17 @@ +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; +import { Donation } from "../../models"; + +/** + * This query fetch the donation as a transaction for an organization from database. + * @param _parent- + * @param args - An object that contains `orgId` of the Organization. + * @returns A `donation` object. + */ +export const getDonationByOrgId: QueryResolvers["getDonationByOrgId"] = async ( + _parent, + args, +) => { + return await Donation.find({ + orgId: args.orgId, + }).lean(); +}; diff --git a/src/resolvers/Query/getDonationByOrgIdConnection.ts b/src/resolvers/Query/getDonationByOrgIdConnection.ts new file mode 100644 index 0000000000..4e276079c6 --- /dev/null +++ b/src/resolvers/Query/getDonationByOrgIdConnection.ts @@ -0,0 +1,35 @@ +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; +import type { InterfaceDonation } from "../../models"; +import { Donation } from "../../models"; +import { getWhere } from "./helperFunctions/getWhere"; +/** + * Retrieves a paginated list of donations associated with a specific organization from the database. + * + * This function performs the following steps: + * 1. Constructs a query filter using the provided criteria and organization ID. + * 2. Queries the database for donations that match the criteria and belong to the specified organization. + * 3. Applies pagination by limiting and skipping the results based on the provided arguments. + * 4. Returns the list of donations that match the query. + * + * @param _parent - This parameter is not used in this resolver function but is included for compatibility with GraphQL resolver signatures. + * @param args - The arguments provided by the GraphQL query, including: + * - `orgId`: The ID of the organization for which donations are being retrieved. + * - `where`: Optional filter criteria to apply to the donations. + * - `first`: The maximum number of donation records to return (for pagination). + * - `skip`: The number of donation records to skip (for pagination). + * + * @returns A list of donations associated with the specified organization and matching the provided filter criteria. + */ + +export const getDonationByOrgIdConnection: QueryResolvers["getDonationByOrgIdConnection"] = + async (_parent, args) => { + const where = getWhere(args.where); + + return await Donation.find({ + orgId: args.orgId, + ...where, + }) + .limit(args.first ?? 0) + .skip(args.skip ?? 0) + .lean(); + }; diff --git a/src/resolvers/Query/getEventAttendee.ts b/src/resolvers/Query/getEventAttendee.ts new file mode 100644 index 0000000000..817cab1d3c --- /dev/null +++ b/src/resolvers/Query/getEventAttendee.ts @@ -0,0 +1,29 @@ +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; +import { EventAttendee } from "../../models"; + +/** + * Retrieves an attendee record for a specific event and user from the database. + * + * This function performs the following steps: + * 1. Queries the database to find an `EventAttendee` record that matches the provided event ID and user ID. + * 2. Returns the found attendee record, or `null` if no matching record is found. + * + * @param _parent - This parameter is not used in this resolver function but is included for compatibility with GraphQL resolver signatures. + * @param args - The arguments provided by the GraphQL query, including: + * - `eventId`: The ID of the event for which the attendee is being retrieved. + * - `userId`: The ID of the user for whom the attendee record is being retrieved. + * + * @returns The attendee record for the specified event and user, or `null` if no record is found. + */ + +export const getEventAttendee: QueryResolvers["getEventAttendee"] = async ( + _parent, + args, +) => { + const eventAttendee = await EventAttendee.findOne({ + eventId: args.eventId, + userId: args.userId, + }).lean(); + + return eventAttendee; +}; diff --git a/src/resolvers/Query/getEventAttendeesByEventId.ts b/src/resolvers/Query/getEventAttendeesByEventId.ts new file mode 100644 index 0000000000..0784bd993c --- /dev/null +++ b/src/resolvers/Query/getEventAttendeesByEventId.ts @@ -0,0 +1,23 @@ +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; +import { EventAttendee } from "../../models"; +/** + * Retrieves all attendees for a specific event from the database. + * + * This function performs the following steps: + * 1. Queries the database to find all `EventAttendee` records that match the provided event ID. + * 2. Returns an array of attendee records for the specified event. + * + * @param _parent - This parameter is not used in this resolver function but is included for compatibility with GraphQL resolver signatures. + * @param args - The arguments provided by the GraphQL query, including: + * - `eventId`: The ID of the event for which attendees are being retrieved. + * + * @returns An array of attendee records for the specified event. + */ +export const getEventAttendeesByEventId: QueryResolvers["getEventAttendeesByEventId"] = + async (_parent, args) => { + const eventAttendees = await EventAttendee.find({ + eventId: args.eventId, + }).lean(); + + return eventAttendees; + }; diff --git a/src/resolvers/Query/getEventInvitesByUserId.ts b/src/resolvers/Query/getEventInvitesByUserId.ts new file mode 100644 index 0000000000..bd7b633231 --- /dev/null +++ b/src/resolvers/Query/getEventInvitesByUserId.ts @@ -0,0 +1,18 @@ +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; +import { EventAttendee } from "../../models"; +/** + * This query will fetch all the Event Invites in specified order from the database. + * @param _parent- + * @param args - An object containing userId. + * @param context- + * @returns An object that contains list of all Event Attendees. + */ +export const getEventInvitesByUserId: QueryResolvers["getEventInvitesByUserId"] = + async (_parent, args) => { + const eventAttendee = await EventAttendee.find({ + userId: args.userId, + isInvited: true, + }).lean(); + + return eventAttendee; + }; diff --git a/src/resolvers/Query/getEventVolunteerGroups.ts b/src/resolvers/Query/getEventVolunteerGroups.ts new file mode 100644 index 0000000000..bb5e7d558e --- /dev/null +++ b/src/resolvers/Query/getEventVolunteerGroups.ts @@ -0,0 +1,22 @@ +import { EventVolunteerGroup } from "../../models"; +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; +import { getWhere } from "./helperFunctions/getWhere"; +/** + * This query will fetch eventVolunteerGroups as a transaction from database. + * @param _parent- + * @param args - An object that contains where object for eventVolunteerGroups. + * @returns An array of `eventVolunteerGroup` object. + */ +export const getEventVolunteerGroups: QueryResolvers["getEventVolunteerGroups"] = + async (_parent, args) => { + const where = getWhere(args.where); + const eventVolunteerGroups = await EventVolunteerGroup.find({ + ...where, + }) + .populate("eventId") + .populate("creatorId") + .populate("leaderId") + .populate("volunteers"); + + return eventVolunteerGroups; + }; diff --git a/src/resolvers/Query/getFundById.ts b/src/resolvers/Query/getFundById.ts new file mode 100644 index 0000000000..27a4ea43c0 --- /dev/null +++ b/src/resolvers/Query/getFundById.ts @@ -0,0 +1,34 @@ +import type { InterfaceFund } from "../../models"; +import { Fund } from "../../models"; +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; +import { getSort } from "./helperFunctions/getSort"; +import { getWhere } from "./helperFunctions/getWhere"; + +/** + * This query will fetch the fund as a transaction from database. + * @param _parent- + * @param args - An object that contains `id` of the fund. + * @returns A `fund` object. + */ //@ts-expect-error - type error +export const getFundById: QueryResolvers["getFundById"] = async ( + _parent, + args, +) => { + const sort = getSort(args.orderBy); + const where = getWhere(args.where); + const fund = await Fund.findOne({ + _id: args.id, + }) + .populate({ + path: "campaigns", + match: { + ...where, + }, + options: { + sort: sort, + }, + }) + .lean(); + + return fund ?? ({} as InterfaceFund); +}; diff --git a/src/resolvers/Query/getFundraisingCampaignPledgeById.ts b/src/resolvers/Query/getFundraisingCampaignPledgeById.ts new file mode 100644 index 0000000000..2b7b608428 --- /dev/null +++ b/src/resolvers/Query/getFundraisingCampaignPledgeById.ts @@ -0,0 +1,19 @@ +import { + FundraisingCampaignPledge, + type InterfaceFundraisingCampaignPledges, +} from "../../models/FundraisingCampaignPledge"; +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; +/** + * This query will fetch the fundraisingCampaignPledge as a transaction from database. + * @param _parent- + * @param args - An object that contains `id` of the fund. + * @returns A `fundraisingCampaignPledge` object. + */ //@ts-expect-error - type error +export const getFundraisingCampaignPledgeById: QueryResolvers["getFundraisingCampaignPledgeById"] = + async (_parent, args) => { + const pledge = await FundraisingCampaignPledge.findOne({ + _id: args.id, + }).lean(); + + return pledge ?? ({} as InterfaceFundraisingCampaignPledges); + }; diff --git a/src/resolvers/Query/getFundraisingCampaigns.ts b/src/resolvers/Query/getFundraisingCampaigns.ts new file mode 100644 index 0000000000..108225a558 --- /dev/null +++ b/src/resolvers/Query/getFundraisingCampaigns.ts @@ -0,0 +1,32 @@ +import { FundraisingCampaign } from "../../models"; +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; +import { getSort } from "./helperFunctions/getSort"; +import { getWhere } from "./helperFunctions/getWhere"; +/** + * This query will fetch the fundraisingCampaign as a transaction from database. + * @param _parent- + * @param args - An object that contains `id` of the campaign. + * @returns A `fundraisingCampaign` object. + */ +export const getFundraisingCampaigns: QueryResolvers["getFundraisingCampaigns"] = + async (_parent, args) => { + const sortPledge = getSort(args.pledgeOrderBy); + const sortCampaign = getSort(args.campaignOrderby); + const where = getWhere(args.where); + const campaigns = await FundraisingCampaign.find({ + ...where, + }) + .sort(sortCampaign) + .populate("fundId") + .populate({ + path: "pledges", + populate: { + path: "users", + }, + options: { + sort: sortPledge, + }, + }); + + return campaigns; + }; diff --git a/src/resolvers/Query/getNoteById.ts b/src/resolvers/Query/getNoteById.ts new file mode 100644 index 0000000000..9e07493e51 --- /dev/null +++ b/src/resolvers/Query/getNoteById.ts @@ -0,0 +1,37 @@ +import type { InterfaceNote } from "../../models"; +import { NoteModel } from "../../models"; +import { errors } from "../../libraries"; +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; +import { NOTE_NOT_FOUND_ERROR } from "../../constants"; +/** + * Retrieves a note by its ID from the database. + * + * This function performs the following steps: + * 1. Queries the database to find a `Note` record by the provided ID. + * 2. If the note is not found, throws a `NotFoundError` with a predefined error message. + * 3. Returns the note record if found. + * + * @param _parent - This parameter is not used in this resolver function but is included for compatibility with GraphQL resolver signatures. + * @param args - The arguments provided by the GraphQL query, including: + * - `id`: The ID of the note to be retrieved. + * + * @returns The note record corresponding to the provided ID. + * + */ + +export const getNoteById: QueryResolvers["getNoteById"] = async ( + _parent, + args, +) => { + const note = await NoteModel.findById(args.id).lean(); + + if (!note) { + throw new errors.NotFoundError( + NOTE_NOT_FOUND_ERROR.MESSAGE, + NOTE_NOT_FOUND_ERROR.CODE, + NOTE_NOT_FOUND_ERROR.PARAM, + ); + } + + return note as InterfaceNote; +}; diff --git a/src/resolvers/Query/getPledgesByUserId.ts b/src/resolvers/Query/getPledgesByUserId.ts new file mode 100644 index 0000000000..c1c37625a7 --- /dev/null +++ b/src/resolvers/Query/getPledgesByUserId.ts @@ -0,0 +1,67 @@ +import { USER_NOT_AUTHORIZED_ERROR } from "../../constants"; +import { errors, requestContext } from "../../libraries"; +import type { InterfaceFundraisingCampaign, InterfaceUser } from "../../models"; +import { AppUserProfile } from "../../models"; +import { type InterfaceFundraisingCampaignPledges } from "../../models/FundraisingCampaignPledge"; +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; +import { getSort } from "./helperFunctions/getSort"; + +/** + * This query will fetch the fundraisingCampaignPledge as a transaction from database. + * @param _parent- + * @param args - An object that contains `id` of the fund. + * @returns An array of `fundraisingCampaignPledge` object. + */ +export const getPledgesByUserId: QueryResolvers["getPledgesByUserId"] = async ( + _parent, + args, +) => { + const sort = getSort(args.orderBy); + + const appUserProfile = await AppUserProfile.findOne({ + userId: args.userId, + }).populate({ + path: "pledges", + options: { + sort, + }, + populate: [ + { + path: "campaign", + }, + { + path: "users", + }, + ], + }); + + if (!appUserProfile) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + + // Filter the pledges based on campaign name + if (args.where?.name_contains) { + appUserProfile.pledges = appUserProfile.pledges.filter((pledge) => { + const tempPledge = pledge as InterfaceFundraisingCampaignPledges; + const campaign = tempPledge.campaign as InterfaceFundraisingCampaign; + return campaign.name.includes(args?.where?.name_contains as string); + }); + } + + // Filter the pledges based on pledger's name + if (args.where?.firstName_contains) { + appUserProfile.pledges = appUserProfile.pledges.filter((pledge) => { + const tempPledge = pledge as InterfaceFundraisingCampaignPledges; + const users = tempPledge.users as InterfaceUser[]; + return users.some((user) => + user.firstName.includes(args?.where?.firstName_contains as string), + ); + }); + } + + return appUserProfile.pledges as InterfaceFundraisingCampaignPledges[]; +}; diff --git a/src/resolvers/Query/getPlugins.ts b/src/resolvers/Query/getPlugins.ts new file mode 100644 index 0000000000..7d63521e44 --- /dev/null +++ b/src/resolvers/Query/getPlugins.ts @@ -0,0 +1,10 @@ +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; +import { Plugin } from "../../models"; + +/** + * This function returns list of plugins from the database. + * @returns An object that contains a list of plugins. + */ +export const getPlugins: QueryResolvers["getPlugins"] = async () => { + return await Plugin.find().lean(); +}; diff --git a/src/resolvers/Query/getUserTag.ts b/src/resolvers/Query/getUserTag.ts new file mode 100644 index 0000000000..608c2882d8 --- /dev/null +++ b/src/resolvers/Query/getUserTag.ts @@ -0,0 +1,33 @@ +import { OrganizationTagUser } from "../../models"; +import { errors, requestContext } from "../../libraries"; +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; +import { TAG_NOT_FOUND } from "../../constants"; + +/** + * Retrieves a user tag by its ID. + * + * This function fetches a specific user tag from the database using its ID. If the user tag + * is not found, it throws an error indicating that the item does not exist. + * + * @param _parent - This parameter is not used in this resolver function. + * @param args - The arguments provided by the GraphQL query, including the ID of the user tag to retrieve. + * + * @returns The user tag with the specified ID. + */ + +export const getUserTag: QueryResolvers["getUserTag"] = async ( + _parent, + args, +) => { + const userTag = await OrganizationTagUser.findById(args.id).lean(); + + if (!userTag) { + throw new errors.NotFoundError( + requestContext.translate(TAG_NOT_FOUND.MESSAGE), + TAG_NOT_FOUND.CODE, + TAG_NOT_FOUND.PARAM, + ); + } + + return userTag; +}; diff --git a/src/resolvers/Query/getUserTagAncestors.ts b/src/resolvers/Query/getUserTagAncestors.ts new file mode 100644 index 0000000000..cf516eb43e --- /dev/null +++ b/src/resolvers/Query/getUserTagAncestors.ts @@ -0,0 +1,45 @@ +import type { InterfaceOrganizationTagUser } from "../../models"; +import { OrganizationTagUser } from "../../models"; +import { errors, requestContext } from "../../libraries"; +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; +import { TAG_NOT_FOUND } from "../../constants"; + +/** + * Retrieves the ancestor tags of a given user tag. + * + * This function fetches the ancestor tags of a specific user tag from the database. If the user tag + * is not found, it throws an error indicating that the item does not exist. + * + * @param _parent - This parameter is not used in this resolver function. + * @param args - The arguments provided by the GraphQL query, including the ID of the given user tag. + * + * @returns The ancestor tags of the user tag. + */ + +export const getUserTagAncestors: QueryResolvers["getUserTagAncestors"] = + async (_parent, args) => { + let currentTag = await OrganizationTagUser.findById(args.id).lean(); + + if (!currentTag) { + throw new errors.NotFoundError( + requestContext.translate(TAG_NOT_FOUND.MESSAGE), + TAG_NOT_FOUND.CODE, + TAG_NOT_FOUND.PARAM, + ); + } + + const tagAncestors = [currentTag]; + + while (currentTag?.parentTagId) { + const currentParent = (await OrganizationTagUser.findById( + currentTag.parentTagId, + ).lean()) as InterfaceOrganizationTagUser | null; + + if (currentParent) { + tagAncestors.push(currentParent); + currentTag = currentParent; + } + } + + return tagAncestors.reverse(); + }; diff --git a/src/resolvers/Query/getVenueByOrgId.ts b/src/resolvers/Query/getVenueByOrgId.ts new file mode 100644 index 0000000000..1b8d3a60f5 --- /dev/null +++ b/src/resolvers/Query/getVenueByOrgId.ts @@ -0,0 +1,42 @@ +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; +import type { InterfaceVenue } from "../../models"; +import { Venue } from "../../models"; +import { getWhere } from "./helperFunctions/getWhere"; +import { getSort } from "./helperFunctions/getSort"; +/** + * Retrieves venues associated with a specific organization, with optional filtering and sorting. + * + * This function performs the following steps: + * 1. Constructs the query filter using the `getWhere` helper function based on provided filter criteria. + * 2. Determines the sorting order using the `getSort` helper function based on provided sort criteria. + * 3. Queries the `Venue` collection in the database to find venues that match the specified organization ID and any additional filter criteria. + * 4. Limits the number of results based on the `first` argument and skips results based on the `skip` argument. + * 5. Sorts the results according to the specified sort criteria. + * + * @param _parent - This parameter is not used in this resolver function but is included for compatibility with GraphQL resolver signatures. + * @param args - The arguments provided by the GraphQL query, including: + * - `orgId`: The ID of the organization for which venues are being retrieved. + * - `where`: Optional filter criteria to apply to the venue query. + * - `orderBy`: Optional sorting criteria for the results. + * - `first`: Optional limit on the number of results to return. + * - `skip`: Optional number of results to skip for pagination. + * + * @returns A promise that resolves to an array of venues matching the query criteria. + */ + +export const getVenueByOrgId: QueryResolvers["getVenueByOrgId"] = async ( + _parent, + args, +) => { + const where = getWhere(args.where); + const sort = getSort(args.orderBy); + + return await Venue.find({ + organization: args.orgId, + ...where, + }) + .limit(args.first ?? 0) + .skip(args.skip ?? 0) + .sort(sort) + .lean(); +}; diff --git a/src/resolvers/Query/getlanguage.ts b/src/resolvers/Query/getlanguage.ts new file mode 100644 index 0000000000..d2b108cb60 --- /dev/null +++ b/src/resolvers/Query/getlanguage.ts @@ -0,0 +1,36 @@ +import type { + QueryResolvers, + Translation, +} from "../../types/generatedGraphQLTypes"; +import { Language } from "../../models"; +/** + * This query fetch a language for specified `lang_code` from the database. + * @param _parent- + * @param args - An object that contains `lang_code`. + * @returns An object `filteredLanguages`. + */ +export const getlanguage: QueryResolvers["getlanguage"] = async ( + _parent, + args, +) => { + const languages = await Language.find({ + "translation.lang_code": args.lang_code, + }).lean(); + + const filteredLanguages: Translation[] = []; + + languages.forEach((language) => { + language.translation.forEach((languageModel) => { + if (languageModel.lang_code === args.lang_code) { + filteredLanguages.push({ + lang_code: languageModel.lang_code, + en_value: language.en, + translation: languageModel.value, + verified: languageModel.verified, + }); + } + }); + }); + + return filteredLanguages; +}; diff --git a/src/resolvers/Query/groupChatById.ts b/src/resolvers/Query/groupChatById.ts new file mode 100644 index 0000000000..43a00ce65d --- /dev/null +++ b/src/resolvers/Query/groupChatById.ts @@ -0,0 +1,31 @@ +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; +import { errors } from "../../libraries"; +import { GroupChat } from "../../models"; +import { CHAT_NOT_FOUND_ERROR } from "../../constants"; + +/** + * This query will fetch all messages for a certain direct chat for the user from database. + * @param _parent- + * @param args - An object that contains `id` of the direct chat. + * @returns A `directChatsMessages` object that holds all of the messages from the specified direct chat. + * If the `directChatsMessages` object is null then it throws `NotFoundError` error. + * @remarks You can learn about GraphQL `Resolvers` + * {@link https://www.apollographql.com/docs/apollo-server/data/resolvers/ | here}. + */ + +export const groupChatById: QueryResolvers["groupChatById"] = async ( + _parent, + args, +) => { + const directChat = await GroupChat.findById(args.id).lean(); + + if (!directChat) { + throw new errors.NotFoundError( + CHAT_NOT_FOUND_ERROR.DESC, + CHAT_NOT_FOUND_ERROR.CODE, + CHAT_NOT_FOUND_ERROR.PARAM, + ); + } + + return directChat; +}; diff --git a/src/resolvers/Query/groupChatsByUserId.ts b/src/resolvers/Query/groupChatsByUserId.ts new file mode 100644 index 0000000000..a3b3310d3e --- /dev/null +++ b/src/resolvers/Query/groupChatsByUserId.ts @@ -0,0 +1,30 @@ +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; +import { errors } from "../../libraries"; +import { GroupChat } from "../../models"; +/** + * This query will fetch all the Direct chats for the current user from the database. + * @param _parent- + * @param args - An object that contains `id` of the user. + * @returns An object `GroupChat` that contains all direct chats of the current user. + * If the `directChats` object is null then it throws `NotFoundError` error. + * @remarks You can learn about GraphQL `Resolvers` + * {@link https://www.apollographql.com/docs/apollo-server/data/resolvers/ | here}. + */ +export const groupChatsByUserId: QueryResolvers["groupChatsByUserId"] = async ( + _parent, + args, +) => { + const groupChats = await GroupChat.find({ + users: args.id, + }).lean(); + + if (groupChats.length === 0) { + throw new errors.NotFoundError( + "Group Chats not found", + "groupChats.notFound", + "groupChats", + ); + } + + return groupChats; +}; diff --git a/src/resolvers/Query/hasSubmittedFeedback.ts b/src/resolvers/Query/hasSubmittedFeedback.ts new file mode 100644 index 0000000000..25314a1bfd --- /dev/null +++ b/src/resolvers/Query/hasSubmittedFeedback.ts @@ -0,0 +1,71 @@ +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; +import { User, Event, EventAttendee } from "../../models"; +import { errors, requestContext } from "../../libraries"; +import { + EVENT_NOT_FOUND_ERROR, + USER_NOT_FOUND_ERROR, + USER_NOT_CHECKED_IN, + USER_NOT_REGISTERED_FOR_EVENT, +} from "../../constants"; +/** + * Checks whether a user has submitted feedback for a specific event. + * + * This function verifies if the given user and event exist in the database. It then checks if the user is registered and checked in for the event. Finally, it determines whether the user has submitted feedback for that event based on the check-in record. + * + * @param _parent - This parameter represents the parent resolver in the GraphQL schema and is not used in this function. + * @param args - The arguments provided to the GraphQL query. Should include: + * - `userId` (string): The ID of the user to check. + * - `eventId` (string): The ID of the event to check. + * + * @returns A boolean value indicating whether the user has submitted feedback for the event. This is determined by checking the `feedbackSubmitted` property of the check-in record. + */ +export const hasSubmittedFeedback: QueryResolvers["hasSubmittedFeedback"] = + async (_parent, args) => { + const currentUserExists = await User.exists({ + _id: args.userId, + }); + + if (!currentUserExists) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + + const currentEventExists = await Event.exists({ + _id: args.eventId, + }); + + if (!currentEventExists) { + throw new errors.NotFoundError( + requestContext.translate(EVENT_NOT_FOUND_ERROR.MESSAGE), + EVENT_NOT_FOUND_ERROR.CODE, + EVENT_NOT_FOUND_ERROR.PARAM, + ); + } + + const eventAttendeeObject = await EventAttendee.findOne({ + ...args, + }) + .populate("checkInId") + .lean(); + + if (eventAttendeeObject === null) { + throw new errors.ConflictError( + requestContext.translate(USER_NOT_REGISTERED_FOR_EVENT.MESSAGE), + USER_NOT_REGISTERED_FOR_EVENT.CODE, + USER_NOT_REGISTERED_FOR_EVENT.PARAM, + ); + } + + if (eventAttendeeObject.checkInId === null) { + throw new errors.ConflictError( + requestContext.translate(USER_NOT_CHECKED_IN.MESSAGE), + USER_NOT_CHECKED_IN.CODE, + USER_NOT_CHECKED_IN.PARAM, + ); + } + + return eventAttendeeObject.checkInId.feedbackSubmitted; + }; diff --git a/src/resolvers/Query/helperFunctions/getSort.ts b/src/resolvers/Query/helperFunctions/getSort.ts new file mode 100644 index 0000000000..d3f68a704c --- /dev/null +++ b/src/resolvers/Query/helperFunctions/getSort.ts @@ -0,0 +1,343 @@ +import type { SortOrder } from "mongoose"; +import type { + EventOrderByInput, + InputMaybe, + OrganizationOrderByInput, + PostOrderByInput, + UserOrderByInput, + VenueOrderByInput, + PledgeOrderByInput, + CampaignOrderByInput, + FundOrderByInput, + ActionItemsOrderByInput, +} from "../../../types/generatedGraphQLTypes"; + +export const getSort = ( + orderBy: + | InputMaybe< + | EventOrderByInput + | OrganizationOrderByInput + | PostOrderByInput + | UserOrderByInput + | VenueOrderByInput + | FundOrderByInput + | CampaignOrderByInput + | PledgeOrderByInput + | ActionItemsOrderByInput + > + | undefined, +): + | string + | { [key: string]: SortOrder | { $meta: unknown } } + | [string, SortOrder][] + | null + | undefined => { + let sortPayload = {}; + + switch (orderBy) { + case "id_ASC": + sortPayload = { + _id: 1, + }; + break; + + case "id_DESC": + sortPayload = { + _id: -1, + }; + break; + + case "capacity_ASC": + sortPayload = { + capacity: 1, + }; + break; + + case "capacity_DESC": + sortPayload = { + capacity: -1, + }; + break; + + case "title_ASC": + sortPayload = { + title: 1, + }; + break; + + case "title_DESC": + sortPayload = { + title: -1, + }; + break; + + case "description_ASC": + sortPayload = { + description: 1, + }; + break; + + case "description_DESC": + sortPayload = { + description: -1, + }; + break; + + case "amount_ASC": + sortPayload = { + amount: 1, + }; + break; + + case "amount_DESC": + sortPayload = { + amount: -1, + }; + break; + + case "startDate_ASC": + sortPayload = { + startDate: 1, + }; + break; + + case "startDate_DESC": + sortPayload = { + startDate: -1, + }; + break; + + case "endDate_ASC": + sortPayload = { + endDate: 1, + }; + break; + + case "endDate_DESC": + sortPayload = { + endDate: -1, + }; + break; + + case "fundingGoal_ASC": + sortPayload = { + fundingGoal: 1, + }; + break; + + case "fundingGoal_DESC": + sortPayload = { + fundingGoal: -1, + }; + break; + + case "allDay_ASC": + sortPayload = { + allDay: 1, + }; + break; + + case "allDay_DESC": + sortPayload = { + allDay: -1, + }; + break; + + case "startTime_ASC": + sortPayload = { + startTime: 1, + }; + break; + + case "startTime_DESC": + sortPayload = { + startTime: -1, + }; + break; + + case "endTime_ASC": + sortPayload = { + endTime: 1, + }; + break; + + case "endTime_DESC": + sortPayload = { + endTime: -1, + }; + break; + + case "location_ASC": + sortPayload = { + location: 1, + }; + break; + + case "location_DESC": + sortPayload = { + location: -1, + }; + break; + + case "createdAt_ASC": + sortPayload = { + createdAt: 1, + }; + break; + + case "createdAt_DESC": + sortPayload = { + createdAt: -1, + }; + break; + + case "name_ASC": + sortPayload = { + name: 1, + }; + break; + + case "name_DESC": + sortPayload = { + name: -1, + }; + break; + + case "apiUrl_ASC": + sortPayload = { + apiUrl: 1, + }; + break; + + case "apiUrl_DESC": + sortPayload = { + apiUrl: -1, + }; + break; + + case "firstName_ASC": + sortPayload = { + firstName: 1, + }; + break; + + case "firstName_DESC": + sortPayload = { + firstName: -1, + }; + break; + + case "lastName_ASC": + sortPayload = { + lastName: 1, + }; + break; + + case "lastName_DESC": + sortPayload = { + lastName: -1, + }; + break; + + // case "appLanguageCode_ASC": + // sortPayload = { + // appLanguageCode: 1, + // }; + // break; + + // case "appLanguageCode_DESC": + // sortPayload = { + // appLanguageCode: -1, + // }; + // break; + + case "email_ASC": + sortPayload = { + email: 1, + }; + break; + + case "email_DESC": + sortPayload = { + email: -1, + }; + break; + + case "text_ASC": + sortPayload = { + text: 1, + }; + break; + + case "text_DESC": + sortPayload = { + text: -1, + }; + break; + + case "imageUrl_ASC": + sortPayload = { + imageUrl: 1, + }; + break; + + case "imageUrl_DESC": + sortPayload = { + imageUrl: -1, + }; + break; + + case "videoUrl_ASC": + sortPayload = { + videoUrl: 1, + }; + break; + + case "videoUrl_DESC": + sortPayload = { + videoUrl: -1, + }; + break; + + case "likeCount_ASC": + sortPayload = { + likeCount: 1, + }; + break; + + case "likeCount_DESC": + sortPayload = { + likeCount: -1, + }; + break; + + case "commentCount_ASC": + sortPayload = { + commentCount: 1, + }; + break; + + case "commentCount_DESC": + sortPayload = { + commentCount: -1, + }; + break; + + case "dueDate_ASC": + sortPayload = { + dueDate: 1, + }; + break; + + case "dueDate_DESC": + sortPayload = { + dueDate: -1, + }; + break; + + default: + break; + } + + return sortPayload; +}; diff --git a/src/resolvers/Query/helperFunctions/getWhere.ts b/src/resolvers/Query/helperFunctions/getWhere.ts new file mode 100644 index 0000000000..e2288ee6cb --- /dev/null +++ b/src/resolvers/Query/helperFunctions/getWhere.ts @@ -0,0 +1,786 @@ +import type { FilterQuery } from "mongoose"; +import type { + ActionItemWhereInput, + DonationWhereInput, + EventWhereInput, + EventVolunteerGroupWhereInput, + FundWhereInput, + InputMaybe, + OrganizationWhereInput, + PostWhereInput, + UserWhereInput, + VenueWhereInput, + CampaignWhereInput, + PledgeWhereInput, + ActionItemCategoryWhereInput, +} from "../../../types/generatedGraphQLTypes"; + +/** + * This function returns FilterQuery object which can be used to find out documents matching specific args as mentioned in `where`. + * When modifying this function, check if the arg to be added isn't present before, and place `where` argument + * type if not present before in the intersection type. + * @typeParam T - used to return an object of a generic type `FilterQuery` + * @param where - an object that contains properties that can be used to filter out documents. + * @returns a FilterQuery object to filter out documents + * @remarks You can learn about Generics {@link https://www.typescriptlang.org/docs/handbook/2/generics.html | here}. + * @example Here's an example showing how `getWhere()` can be used to get a FilterQuery object matching certain args mentioned in `where` + * ``` + * const inputArgs = getWhere(args.where); + * ``` + */ +export const getWhere = ( + where: + | InputMaybe< + Partial< + EventWhereInput & + EventVolunteerGroupWhereInput & + OrganizationWhereInput & + PostWhereInput & + UserWhereInput & + DonationWhereInput & + ActionItemWhereInput & + ActionItemCategoryWhereInput & + CampaignWhereInput & + FundWhereInput & + PledgeWhereInput & + VenueWhereInput + > + > + | undefined, +): FilterQuery => { + let wherePayload: FilterQuery = {}; + + if (!where) { + return wherePayload; + } + + if (where.id) { + wherePayload = { + ...wherePayload, + _id: where.id, + }; + } + + // Returns all objects other than provided id + if (where.id_not) { + wherePayload = { + ...wherePayload, + _id: { $ne: where.id_not }, + }; + } + + // Return objects with id in the provided list + if (where.id_in) { + wherePayload = { + ...wherePayload, + _id: { $in: where.id_in }, + }; + } + + // Returns objects not included in provided id list + if (where.id_not_in) { + wherePayload = { + ...wherePayload, + _id: { $nin: where.id_not_in }, + }; + } + + // Returns provided title objects + if (where.title) { + wherePayload = { + ...wherePayload, + title: where.title, + }; + } + + // Returns objects with not that title + if (where.title_not) { + wherePayload = { + ...wherePayload, + title: { $ne: where.title_not }, + }; + } + + // Return objects with the given list title + if (where.title_in) { + wherePayload = { + ...wherePayload, + title: { $in: where.title_in }, + }; + } + + // Returns objects with title not in the provided list + if (where.title_not_in) { + wherePayload = { + ...wherePayload, + title: { $nin: where.title_not_in }, + }; + } + + // Returns objects with title containing provided string + if (where.title_contains) { + wherePayload = { + ...wherePayload, + title: { $regex: where.title_contains, $options: "i" }, + }; + } + + // Returns objects with title starts with that provided string + if (where.title_starts_with) { + const regexp = new RegExp("^" + where.title_starts_with); + wherePayload = { + ...wherePayload, + title: regexp, + }; + } + + // Returns provided description objects + if (where.description) { + wherePayload = { + ...wherePayload, + description: where.description, + }; + } + + // Returns objects with not that description + if (where.description_not) { + wherePayload = { + ...wherePayload, + description: { $ne: where.description_not }, + }; + } + + // Return objects with description in provided list + if (where.description_in) { + wherePayload = { + ...wherePayload, + description: { $in: where.description_in }, + }; + } + + // Return objects with description not in provided list + if (where.description_not_in) { + wherePayload = { + ...wherePayload, + description: { $nin: where.description_not_in }, + }; + } + + // Return objects with description should containing provided string + if (where.description_contains) { + wherePayload = { + ...wherePayload, + description: { + $regex: where.description_contains, + $options: "i", + }, + }; + } + + // Returns objects with description starting with provided string + if (where.description_starts_with) { + const regexp = new RegExp("^" + where.description_starts_with); + wherePayload = { + ...wherePayload, + description: regexp, + }; + } + + // Returns objects of a specific organization + if (where.organization_id) { + wherePayload = { + ...wherePayload, + organization: where.organization_id, + }; + } + + // Returns action items belonging to a specific category + if (where.actionItemCategory_id) { + wherePayload = { + ...wherePayload, + actionItemCategoryId: where.actionItemCategory_id, + }; + } + + // Return action items that are completed + if (where.is_completed !== undefined) { + wherePayload = { + ...wherePayload, + isCompleted: where.is_completed, + }; + } + + // Return action items belonging to a specific event + if (where.event_id || where.eventId) { + wherePayload = { + ...wherePayload, + eventId: where.event_id || where.eventId, + }; + } + + // Returns provided location objects + if (where.location) { + wherePayload = { + ...wherePayload, + location: where.location, + }; + } + + // Returns objects with not that location + if (where.location_not) { + wherePayload = { + ...wherePayload, + location: { $ne: where.location_not }, + }; + } + + // Return objects with location in provided list + if (where.location_in) { + wherePayload = { + ...wherePayload, + location: { $in: where.location_in }, + }; + } + + // Return objects with location not in provided list + if (where.location_not_in) { + wherePayload = { + ...wherePayload, + location: { $nin: where.location_not_in }, + }; + } + + // Return objects with location should containing provided string + if (where.location_contains) { + wherePayload = { + ...wherePayload, + location: { + $regex: where.location_contains, + $options: "i", + }, + }; + } + + // Returns provided name donations + if (where.name_of_user) { + wherePayload = { + ...wherePayload, + nameOfUser: where.name_of_user, + }; + } + + // Returns donations with not that name_of_user + if (where.name_of_user_not) { + wherePayload = { + ...wherePayload, + nameOfUser: { $ne: where.name_of_user_not }, + }; + } + + // Return donations with the given list name_of_user + if (where.name_of_user_in) { + wherePayload = { + ...wherePayload, + nameOfUser: { $in: where.name_of_user_in }, + }; + } + + // Returns donations with name_of_user not in the provided list + if (where.name_of_user_not_in) { + wherePayload = { + ...wherePayload, + nameOfUser: { $nin: where.name_of_user_not_in }, + }; + } + + // Returns donations with name_of_user containing provided string + if (where.name_of_user_contains) { + wherePayload = { + ...wherePayload, + nameOfUser: { $regex: where.name_of_user_contains, $options: "i" }, + }; + } + + // Returns donations with name_of_user starts with that provided string + if (where.name_of_user_starts_with) { + const regexp = new RegExp("^" + where.name_of_user_starts_with); + wherePayload = { + ...wherePayload, + nameOfUser: regexp, + }; + } + + // Returns provided name organization + if (where.name) { + wherePayload = { + ...wherePayload, + name: where.name, + }; + } + + // Returns organizations with not that name + if (where.name_not) { + wherePayload = { + ...wherePayload, + name: { $ne: where.name_not }, + }; + } + + // Return organizations with the given list name + if (where.name_in) { + wherePayload = { + ...wherePayload, + name: { $in: where.name_in }, + }; + } + + // Returns organizations with name not in the provided list + if (where.name_not_in) { + wherePayload = { + ...wherePayload, + name: { $nin: where.name_not_in }, + }; + } + + // Returns objects with name containing provided string + if (where.name_contains) { + wherePayload = { + ...wherePayload, + name: { $regex: where.name_contains, $options: "i" }, + }; + } + + // Returns objects where name starts with provided string + if (where.name_starts_with) { + const regexp = new RegExp("^" + where.name_starts_with); + wherePayload = { + ...wherePayload, + name: regexp, + }; + } + + // Returns events of a specific organization + if (where.organization_id) { + wherePayload = { + ...wherePayload, + organization: where.organization_id, + }; + } + + // Returns provided apiUrl organizations + if (where.apiUrl) { + wherePayload = { + ...wherePayload, + apiUrl: where.apiUrl, + }; + } + + // Returns organizations with not that provided apiUrl + if (where.apiUrl_not) { + wherePayload = { + ...wherePayload, + apiUrl: { $ne: where.apiUrl_not }, + }; + } + + // Organizations apiUrl falls in provided list + if (where.apiUrl_in) { + wherePayload = { + ...wherePayload, + apiUrl: { $in: where.apiUrl_in }, + }; + } + + // Return organizations apiUrl not falls in the list + if (where.apiUrl_not_in) { + wherePayload = { + ...wherePayload, + apiUrl: { $nin: where.apiUrl_not_in }, + }; + } + + // Return organizations with apiUrl containing provided string + if (where.apiUrl_contains) { + wherePayload = { + ...wherePayload, + apiUrl: { $regex: where.apiUrl_contains, $options: "i" }, + }; + } + + // Returns organizations with apiUrl starts with provided string + if (where.apiUrl_starts_with) { + const regexp = new RegExp("^" + where.apiUrl_starts_with); + wherePayload = { + ...wherePayload, + apiUrl: regexp, + }; + } + // Returns organizations with provided visibleInSearch condition + if (where.visibleInSearch !== undefined) { + wherePayload = { + ...wherePayload, + visibleInSearch: where.visibleInSearch, + }; + } + // Returns organizations with provided userRegistrationRequired condition + if (where.userRegistrationRequired !== undefined) { + wherePayload = { + ...wherePayload, + isPublic: where.userRegistrationRequired, + }; + } + + //Returns provided firstName user + if (where.firstName) { + wherePayload = { + ...wherePayload, + firstName: where.firstName, + }; + } + + //Returns user with not that firstName + if (where.firstName_not) { + wherePayload = { + ...wherePayload, + firstName: { + $ne: where.firstName_not, + }, + }; + } + + //Return users with the given list firstName + if (where.firstName_in) { + wherePayload = { + ...wherePayload, + firstName: { + $in: where.firstName_in, + }, + }; + } + + //Returns users with firstName not in the provided list + if (where.firstName_not_in) { + wherePayload = { + ...wherePayload, + firstName: { + $nin: where.firstName_not_in, + }, + }; + } + + //Returns users with first name containing provided string + if (where.firstName_contains) { + wherePayload = { + ...wherePayload, + firstName: { + $regex: where.firstName_contains, + $options: "i", + }, + }; + } + + //Returns users with firstName starts with that provided string + if (where.firstName_starts_with) { + const regexp = new RegExp("^" + where.firstName_starts_with); + wherePayload = { + ...wherePayload, + firstName: regexp, + }; + } + + //Returns lastName user + if (where.lastName) { + wherePayload = { + ...wherePayload, + lastName: where.lastName, + }; + } + + //Returns user with not that lastName + if (where.lastName_not) { + wherePayload = { + ...wherePayload, + lastName: { + $ne: where.lastName_not, + }, + }; + } + + //Return users with lastName in provided list + if (where.lastName_in) { + wherePayload = { + ...wherePayload, + lastName: { + $in: where.lastName_in, + }, + }; + } + + //Return users with lastName not in provided list + if (where.lastName_not_in) { + wherePayload = { + ...wherePayload, + lastName: { + $nin: where.lastName_not_in, + }, + }; + } + + //Return users with lastName should containing provided string + if (where.lastName_contains) { + wherePayload = { + ...wherePayload, + lastName: { + $regex: where.lastName_contains, + $options: "i", + }, + }; + } + + //Returns users with LastName starting with provided string + if (where.lastName_starts_with) { + const regexp = new RegExp("^" + where.lastName_starts_with); + wherePayload = { + ...wherePayload, + lastName: regexp, + }; + } + + //Returns provided email user + if (where.email) { + wherePayload = { + ...wherePayload, + email: where.email, + }; + } + + //Returns user with not that provided email + if (where.email_not) { + wherePayload = { + ...wherePayload, + email: { + $ne: where.email_not, + }, + }; + } + + //User email falls in provided list + if (where.email_in) { + wherePayload = { + ...wherePayload, + email: { + $in: where.email_in, + }, + }; + } + + //Return User email not falls in the list + if (where.email_not_in) { + wherePayload = { + ...wherePayload, + email: { + $nin: where.email_not_in, + }, + }; + } + + //Return users with email containing provided string + if (where.email_contains) { + wherePayload = { + ...wherePayload, + email: { + $regex: where.email_contains, + $options: "i", + }, + }; + } + + //Returns user with email starts with provided string + if (where.email_starts_with) { + const regexp = new RegExp("^" + where.email_starts_with); + wherePayload = { + ...wherePayload, + email: regexp, + }; + } + + //Returns provided appLanguageCode user + // if (where.appLanguageCode) { + // wherePayload = { + // ...wherePayload, + // appLanguageCode: where.appLanguageCode, + // }; + // } + + // //Returns user with not that provided appLanguageCode + // if (where.appLanguageCode_not) { + // wherePayload = { + // ...wherePayload, + // appLanguageCode: { + // $ne: where.appLanguageCode_not, + // }, + // }; + // } + + // Objects appLanguageCode falls in provided list + // if (where.appLanguageCode_in) { + // wherePayload = { + // ...wherePayload, + // appLanguageCode: { + // $in: where.appLanguageCode_in, + // }, + // }; + // } + + // // Return objects appLanguageCode not falls in the list + // if (where.appLanguageCode_not_in) { + // wherePayload = { + // ...wherePayload, + // appLanguageCode: { + // $nin: where.appLanguageCode_not_in, + // }, + // }; + // } + + // // Return objects with appLanguageCode containing provided string + // if (where.appLanguageCode_contains) { + // wherePayload = { + // ...wherePayload, + // appLanguageCode: { + // $regex: where.appLanguageCode_contains, + // $options: "i", + // }, + // }; + // } + + // // Returns objects with appLanguageCode starts with provided string + // if (where.appLanguageCode_starts_with) { + // const regexp = new RegExp("^" + where.appLanguageCode_starts_with); + // wherePayload = { + // ...wherePayload, + // appLanguageCode: regexp, + // }; + // } + + // // Return users with admin for provided organizationId + // if (where.admin_for) { + // wherePayload = { + // ...wherePayload, + // adminFor: { + // _id: where.admin_for, + // }, + // }; + // } + + if (where.event_title_contains) { + wherePayload = { + ...wherePayload, + "registeredEvents.title": { + $regex: where.event_title_contains, + $options: "i", + }, + }; + } + + //Returns provided text objects + if (where.text) { + wherePayload = { + ...wherePayload, + text: where.text, + }; + } + + //Returns objects with not the provided text + if (where.text_not) { + wherePayload = { + ...wherePayload, + text: { + $ne: where.text_not, + }, + }; + } + + //Return objects with the given list text + if (where.text_in) { + wherePayload = { + ...wherePayload, + text: { + $in: where.text_in, + }, + }; + } + + //Returns objects with text not in the provided list + if (where.text_not_in) { + wherePayload = { + ...wherePayload, + text: { + $nin: where.text_not_in, + }, + }; + } + + //Returns objects with text containing provided string + if (where.text_contains) { + wherePayload = { + ...wherePayload, + text: { + $regex: where.text_contains, + $options: "i", + }, + }; + } + + //Returns objects with text starts with that provided string + if (where.text_starts_with) { + const regexp = new RegExp("^" + where.text_starts_with); + wherePayload = { + ...wherePayload, + text: regexp, + }; + } + + // Returns objects with provided fundId condition + if (where.fundId) { + wherePayload = { + ...wherePayload, + fundId: where.fundId, + }; + } + + // Returns object with provided organizationId condition + if (where.organizationId) { + wherePayload = { + ...wherePayload, + organizationId: where.organizationId, + }; + } + + // Returns object with provided campaignId condition + if (where.campaignId) { + wherePayload = { + ...wherePayload, + _id: where.campaignId, + }; + } + + // Returns objects where volunteerId is present in volunteers list + if (where.volunteerId) { + wherePayload = { + ...wherePayload, + volunteers: { + $in: [where.volunteerId], + }, + }; + } + + // Returns object with provided is_disabled condition + if (where.is_disabled !== undefined) { + wherePayload = { + ...wherePayload, + isDisabled: where.is_disabled, + }; + } + + return wherePayload; +}; diff --git a/src/resolvers/Query/index.ts b/src/resolvers/Query/index.ts new file mode 100644 index 0000000000..fc878303d8 --- /dev/null +++ b/src/resolvers/Query/index.ts @@ -0,0 +1,111 @@ +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; +import { isSampleOrganization } from "../Query/organizationIsSample"; +import { actionItemCategoriesByOrganization } from "./actionItemCategoriesByOrganization"; +import { actionItemsByEvent } from "./actionItemsByEvent"; +import { actionItemsByOrganization } from "./actionItemsByOrganization"; +import { advertisementsConnection } from "./advertisementsConnection"; +import { agendaCategory } from "./agendaCategory"; +import { agendaItemByEvent } from "./agendaItemByEvent"; +import { agendaItemByOrganization } from "./agendaItemByOrganization"; +import { agendaItemCategoriesByOrganization } from "./agendaItemCategoriesByOrganization"; +import { getAgendaItem } from "./agendaItemById"; +import { getAgendaSection } from "./getAgendaSection"; +import { checkAuth } from "./checkAuth"; +import { customDataByOrganization } from "./customDataByOrganization"; +import { customFieldsByOrganization } from "./customFieldsByOrganization"; +import { directChatsByUserID } from "./directChatsByUserID"; +import { directChatsMessagesByChatID } from "./directChatsMessagesByChatID"; +import { directChatById } from "./directChatById"; +import { groupChatById } from "./groupChatById"; +import { groupChatsByUserId } from "./groupChatsByUserId"; +import { event } from "./event"; +import { eventsByOrganization } from "./eventsByOrganization"; +import { eventsByOrganizationConnection } from "./eventsByOrganizationConnection"; +import { getEventVolunteerGroups } from "./getEventVolunteerGroups"; +import { fundsByOrganization } from "./fundsByOrganization"; +import { getAllAgendaItems } from "./getAllAgendaItems"; +import { getEventInvitesByUserId } from "./getEventInvitesByUserId"; +import { getCommunityData } from "./getCommunityData"; +import { getDonationById } from "./getDonationById"; +import { getDonationByOrgId } from "./getDonationByOrgId"; +import { getDonationByOrgIdConnection } from "./getDonationByOrgIdConnection"; +import { getFundById } from "./getFundById"; +import { getFundraisingCampaigns } from "./getFundraisingCampaigns"; +import { getPledgesByUserId } from "./getPledgesByUserId"; +import { getPlugins } from "./getPlugins"; +import { getlanguage } from "./getlanguage"; +import { getUserTag } from "./getUserTag"; +import { getUserTagAncestors } from "./getUserTagAncestors"; +import { me } from "./me"; +import { myLanguage } from "./myLanguage"; +import { organizations } from "./organizations"; +import { organizationsConnection } from "./organizationsConnection"; +import { organizationsMemberConnection } from "./organizationsMemberConnection"; +import { post } from "./post"; +import { registeredEventsByUser } from "./registeredEventsByUser"; +import { user } from "./user"; +import { userLanguage } from "./userLanguage"; +import { users } from "./users"; +import { usersConnection } from "./usersConnection"; +import { venue } from "./venue"; +import { getEventAttendee } from "./getEventAttendee"; +import { getEventAttendeesByEventId } from "./getEventAttendeesByEventId"; +import { getVenueByOrgId } from "./getVenueByOrgId"; +import { getAllNotesForAgendaItem } from "./getAllNotesForAgendaItem"; +import { getNoteById } from "./getNoteById"; +export const Query: QueryResolvers = { + actionItemsByEvent, + agendaCategory, + getAgendaItem, + getAgendaSection, + getAllAgendaItems, + actionItemsByOrganization, + actionItemCategoriesByOrganization, + agendaItemByEvent, + agendaItemByOrganization, + agendaItemCategoriesByOrganization, + checkAuth, + getCommunityData, + customFieldsByOrganization, + customDataByOrganization, + directChatsByUserID, + directChatsMessagesByChatID, + directChatById, + groupChatById, + groupChatsByUserId, + event, + eventsByOrganization, + eventsByOrganizationConnection, + getDonationById, + advertisementsConnection, + getDonationByOrgId, + getDonationByOrgIdConnection, + getEventInvitesByUserId, + getEventVolunteerGroups, + getAllNotesForAgendaItem, + getNoteById, + getlanguage, + getPlugins, + getUserTag, + getUserTagAncestors, + isSampleOrganization, + me, + myLanguage, + organizations, + organizationsConnection, + organizationsMemberConnection, + post, + registeredEventsByUser, + user, + userLanguage, + users, + usersConnection, + getFundById, + getFundraisingCampaigns, + venue, + fundsByOrganization, + getPledgesByUserId, + getEventAttendee, + getEventAttendeesByEventId, + getVenueByOrgId, +}; diff --git a/src/resolvers/Query/me.ts b/src/resolvers/Query/me.ts new file mode 100644 index 0000000000..6b8fbbc792 --- /dev/null +++ b/src/resolvers/Query/me.ts @@ -0,0 +1,59 @@ +import { + USER_NOT_FOUND_ERROR, + USER_NOT_AUTHORIZED_ERROR, +} from "../../constants"; +import { errors } from "../../libraries"; +import { + AppUserProfile, + User, + type InterfaceAppUserProfile, +} from "../../models"; +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; +/** + * This query fetch the current user from the database. + * @param _parent- + * @param _args- + * @param context - An object that contains `userId`. + * @returns An object `currentUser` for the current user. If the user not found then it throws a `NotFoundError` error. + */ +// Resolver function for field 'me' of type 'Query' +export const me: QueryResolvers["me"] = async (_parent, _args, context) => { + const currentUser = await User.findOne({ + _id: context.userId, + }) + .select(["-password"]) + + .populate("joinedOrganizations") + .populate("registeredEvents") + + .lean(); + + if (!currentUser) { + throw new errors.NotFoundError( + USER_NOT_FOUND_ERROR.DESC, + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + const userAppProfile = await AppUserProfile.findOne({ + userId: currentUser._id, + }) + .populate("createdOrganizations") + .populate("createdEvents") + .populate("eventAdmin") + .populate("adminFor") + .populate("pledges") + .populate("campaigns") + .lean(); + if (!userAppProfile) { + throw new errors.NotFoundError( + USER_NOT_AUTHORIZED_ERROR.DESC, + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + return { + user: currentUser, + appUserProfile: userAppProfile as InterfaceAppUserProfile, + }; +}; diff --git a/src/resolvers/Query/myLanguage.ts b/src/resolvers/Query/myLanguage.ts new file mode 100644 index 0000000000..ca0950dd0a --- /dev/null +++ b/src/resolvers/Query/myLanguage.ts @@ -0,0 +1,43 @@ +import { USER_NOT_FOUND_ERROR } from "../../constants"; +import { errors } from "../../libraries"; +import { AppUserProfile, User } from "../../models"; +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; +/** + * This query fetch the current user language from the database. + * @param _parent- + * @param _args- + * @param context - An object that contains `userId`. + * @returns A string `appLanguageCode` that contains language code. + * If the `appLanguageCode` field not found then it throws a `NotFoundError` error. + */ +export const myLanguage: QueryResolvers["myLanguage"] = async ( + _parent, + _args, + context, +) => { + const currentUser = await User.findOne({ + _id: context.userId, + }).lean(); + + if (!currentUser) { + throw new errors.NotFoundError( + USER_NOT_FOUND_ERROR.DESC, + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + const currentUserAppProfile = await AppUserProfile.findOne({ + userId: currentUser._id, + }) + .select(["appLanguageCode"]) + .lean(); + if (!currentUserAppProfile) { + throw new errors.UnauthorizedError( + USER_NOT_FOUND_ERROR.MESSAGE, + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + + return currentUserAppProfile.appLanguageCode; +}; diff --git a/src/resolvers/Query/organizationIsSample.ts b/src/resolvers/Query/organizationIsSample.ts new file mode 100644 index 0000000000..5e20ccfd22 --- /dev/null +++ b/src/resolvers/Query/organizationIsSample.ts @@ -0,0 +1,40 @@ +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; +import { Organization, SampleData } from "../../models"; +import { errors, requestContext } from "../../libraries"; +import { ORGANIZATION_NOT_FOUND_ERROR } from "../../constants"; +/** + * Checks whether the specified organization is a sample organization. + * + * This function performs the following steps: + * 1. Retrieves the organization from the database using the provided organization ID. + * 2. If the organization is not found, throws an unauthorized error. + * 3. Searches for a sample document associated with the organization ID in the `SampleData` collection. + * 4. Returns `true` if the sample document is found, indicating the organization is a sample organization; otherwise, returns `false`. + * + * @param _parent - This parameter is not used in this resolver function but is included for compatibility with GraphQL resolver signatures. + * @param args - The arguments provided by the GraphQL query, including: + * - `id`: The ID of the organization to check. + * + * @returns A promise that resolves to `true` if the organization is a sample organization, otherwise `false`. + */ + +export const isSampleOrganization: QueryResolvers["isSampleOrganization"] = + async (_parent, args) => { + const organizationId = args.id; + + const organization = await Organization.findById(args.id); + + if (!organization) { + throw new errors.UnauthorizedError( + requestContext.translate(ORGANIZATION_NOT_FOUND_ERROR.MESSAGE), + ORGANIZATION_NOT_FOUND_ERROR.CODE, + ORGANIZATION_NOT_FOUND_ERROR.PARAM, + ); + } + + const sampleOrganization = await SampleData.findOne({ + documentId: organizationId, + }); + + return !!sampleOrganization; + }; diff --git a/src/resolvers/Query/organizations.ts b/src/resolvers/Query/organizations.ts new file mode 100644 index 0000000000..6fda961573 --- /dev/null +++ b/src/resolvers/Query/organizations.ts @@ -0,0 +1,53 @@ +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; +import { Organization } from "../../models"; +import { errors } from "../../libraries"; +import { ORGANIZATION_NOT_FOUND_ERROR } from "../../constants"; +import { getSort } from "./helperFunctions/getSort"; +import { cacheOrganizations } from "../../services/OrganizationCache/cacheOrganizations"; +import { findOrganizationsInCache } from "../../services/OrganizationCache/findOrganizationsInCache"; +/** + * If a 'id' is specified, this query will return an organisation; + * otherwise, it will return all organisations with a size of limit 100. + * @param _parent- + * @param args - An object containing `orderBy` and `id` of the Organization. + * @returns The organization if valid `id` is provided else return organizations with size limit 100. + * @remarks `id` in the args is optional. + */ +export const organizations: QueryResolvers["organizations"] = async ( + _parent, + args, +) => { + const sort = getSort(args.orderBy); + + let organizationFound; + if (args.id) { + const organizationFoundInCache = await findOrganizationsInCache([args.id]); + + if (!organizationFoundInCache.includes(null)) { + return organizationFoundInCache; + } + + organizationFound = await Organization.find({ + _id: args.id, + }) + .sort(sort) + .lean(); + + await cacheOrganizations(organizationFound); + + if (!organizationFound[0]) { + throw new errors.NotFoundError( + ORGANIZATION_NOT_FOUND_ERROR.DESC, + ORGANIZATION_NOT_FOUND_ERROR.CODE, + ORGANIZATION_NOT_FOUND_ERROR.PARAM, + ); + } + + return organizationFound; + } else { + organizationFound = await Organization.find().sort(sort).limit(100).lean(); + await cacheOrganizations(organizationFound); + } + + return organizationFound; +}; diff --git a/src/resolvers/Query/organizationsConnection.ts b/src/resolvers/Query/organizationsConnection.ts new file mode 100644 index 0000000000..d2040aad6f --- /dev/null +++ b/src/resolvers/Query/organizationsConnection.ts @@ -0,0 +1,30 @@ +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; +import type { InterfaceOrganization } from "../../models"; +import { Organization } from "../../models"; +import { getSort } from "./helperFunctions/getSort"; +import { getWhere } from "./helperFunctions/getWhere"; + +/** + * This query will retrieve from the database a list of + * organisation under the specified limit for the specified page in the pagination. + * @param _parent- + * @param args - An object holds the data required to execute the query. + * `args.first` specifies the number of members to retrieve, and `args.after` specifies + * the unique identification for each item in the returned list. + * @returns An object containing the list of organization and pagination information. + * @remarks Connection in graphQL means pagination, + * learn more about Connection {@link https://relay.dev/graphql/connections.htm | here}. + */ +export const organizationsConnection: QueryResolvers["organizationsConnection"] = + async (_parent, args) => { + const where = getWhere(args.where); + const sort = getSort(args.orderBy); + + const organizations = await Organization.find(where) + .sort(sort) + .limit(args.first ?? 0) + .skip(args.skip ?? 0) + .lean(); + + return organizations; + }; diff --git a/src/resolvers/Query/organizationsMemberConnection.ts b/src/resolvers/Query/organizationsMemberConnection.ts new file mode 100644 index 0000000000..0a0c29c2dc --- /dev/null +++ b/src/resolvers/Query/organizationsMemberConnection.ts @@ -0,0 +1,195 @@ +import type { SortOrder } from "mongoose"; +import type { InterfaceUser } from "../../models"; +import { User } from "../../models"; +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; +import { getSort } from "./helperFunctions/getSort"; +import { getWhere } from "./helperFunctions/getWhere"; + +/** + * This query will retrieve from the database a list of members + * in the organisation under the specified limit for the specified page in the pagination. + * @param _parent- + * @param args - An object holds the data required to execute the query. + * `args.first` specifies the number of members to retrieve, and `args.after` specifies + * the unique identification for each item in the returned list. + * @returns An object containing the list of members and pagination information. + * @remarks Connection in graphQL means pagination, + * learn more about Connection {@link https://relay.dev/graphql/connections.htm | here}. + */ +export const organizationsMemberConnection: QueryResolvers["organizationsMemberConnection"] = + async (_parent, args, context) => { + const where = getWhere(args.where); + const sort = getSort(args.orderBy); + + // Pagination based Options + interface InterfacePaginateOptions { + lean?: boolean; + sort?: object | string | [string, SortOrder][]; + pagination?: boolean; + page?: number; + limit?: number; + populate?: { + path: string; + populate?: { + path: string; + model: string; + select?: string[]; + }; + select?: string[]; + }[]; + } + let paginateOptions: InterfacePaginateOptions = + {} as InterfacePaginateOptions; + + if (args.first) { + if (args.skip === null) { + throw "Missing Skip parameter. Set it to either 0 or some other value"; + } + paginateOptions = { + lean: true, + sort: sort, + pagination: true, + page: args.skip, + limit: args.first, + populate: [ + { + path: "appUserProfileId", + populate: [ + { + path: "adminFor", + model: "Organization", + }, + { + path: "createdOrganizations", + model: "Organization", + }, + { + path: "createdEvents", + model: "Organization", + }, + { + path: "eventAdmin", + model: "Organization", + }, + ], + }, + { + path: "registeredEvents", + }, + { + path: "joinedOrganizations", + }, + { + path: "membershipRequests", + }, + { + path: "organizationsBlockedBy", + }, + ], + } as InterfacePaginateOptions; + } else { + paginateOptions = { + sort: sort, + pagination: false, + } as InterfacePaginateOptions; + } + + const usersModel = await User.paginate( + { + joinedOrganizations: { + _id: args.orgId, + }, + ...where, + }, + { + ...paginateOptions, + }, + ); + + let users: InterfaceUser[] = []; // Change the type of users + + if (paginateOptions.pagination) { + users = usersModel.docs.map((user) => ({ + _id: user._id, + identifier: user.identifier, + appUserProfileId: user.appUserProfileId, + address: { + city: user.address?.city, + countryCode: user.address?.countryCode, + postalCode: user.address?.postalCode, + dependentLocality: user.address?.dependentLocality, + sortingCode: user.address?.sortingCode, + line1: user.address?.line1, + line2: user.address?.line2, + state: user.address?.state, + }, + birthDate: user.birthDate, + createdAt: user.createdAt, + educationGrade: user.educationGrade, + email: user.email, + employmentStatus: user.employmentStatus, + firstName: user.firstName, + gender: user.gender, + image: user.image ? `${context.apiRootUrl}${user.image}` : null, + joinedOrganizations: user.joinedOrganizations, + lastName: user.lastName, + maritalStatus: user.maritalStatus, + membershipRequests: user.membershipRequests, + organizationsBlockedBy: user.organizationsBlockedBy, + password: null, + phone: user.phone, + registeredEvents: user.registeredEvents, + status: user.status, + updatedAt: user.updatedAt, + })); + } else { + users = usersModel.docs.map((user) => ({ + _id: user._id, + identifier: user.identifier, + appUserProfileId: user.appUserProfileId, + address: { + city: user.address?.city, + countryCode: user.address?.countryCode, + postalCode: user.address?.postalCode, + dependentLocality: user.address?.dependentLocality, + sortingCode: user.address?.sortingCode, + line1: user.address?.line1, + line2: user.address?.line2, + state: user.address?.state, + }, + birthDate: user.birthDate, + createdAt: user.createdAt, + educationGrade: user.educationGrade, + email: user.email, + employmentStatus: user.employmentStatus, + firstName: user.firstName, + gender: user.gender, + image: user.image ? `${context.apiRootUrl}${user.image}` : null, + joinedOrganizations: user.joinedOrganizations, + lastName: user.lastName, + maritalStatus: user.maritalStatus, + membershipRequests: user.membershipRequests, + organizationsBlockedBy: user.organizationsBlockedBy, + password: null, + phone: user.phone, + registeredEvents: user.registeredEvents, + status: user.status, + updatedAt: user.updatedAt, + })); + } + + return { + pageInfo: { + hasNextPage: usersModel.hasNextPage, + hasPreviousPage: usersModel.hasPrevPage, + totalPages: usersModel.totalPages, + nextPageNo: usersModel.nextPage, + prevPageNo: usersModel.prevPage, + currPageNo: usersModel.page, + }, + edges: users, + aggregate: { + count: usersModel.totalDocs, + }, + }; + }; diff --git a/src/resolvers/Query/post.ts b/src/resolvers/Query/post.ts new file mode 100644 index 0000000000..258c591eb9 --- /dev/null +++ b/src/resolvers/Query/post.ts @@ -0,0 +1,32 @@ +import { POST_NOT_FOUND_ERROR } from "../../constants"; +import { errors } from "../../libraries"; +import { Post } from "../../models"; +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; +/** + * This query will fetch the specified Post from the database. + * @param _parent- + * @param args - An object that contains `id` of the Post. + * @returns An object `post`. If the `appLanguageCode` field not found then it throws a `NotFoundError` error. + */ +export const post: QueryResolvers["post"] = async (_parent, args, context) => { + const post = await Post.findOne({ _id: args.id }) + .populate("organization") + .populate("likedBy") + .lean(); + + if (!post) { + throw new errors.NotFoundError( + POST_NOT_FOUND_ERROR.DESC, + POST_NOT_FOUND_ERROR.CODE, + POST_NOT_FOUND_ERROR.PARAM, + ); + } + post.imageUrl = post.imageUrl + ? `${context.apiRootUrl}${post.imageUrl}` + : null; + post.videoUrl = post.videoUrl + ? `${context.apiRootUrl}${post.videoUrl}` + : null; + + return post; +}; diff --git a/src/resolvers/Query/registeredEventsByUser.ts b/src/resolvers/Query/registeredEventsByUser.ts new file mode 100644 index 0000000000..9f9c74ec8f --- /dev/null +++ b/src/resolvers/Query/registeredEventsByUser.ts @@ -0,0 +1,28 @@ +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; +import { Event } from "../../models"; +import { getSort } from "./helperFunctions/getSort"; + +/** + * This query will fetch all the events for which user registered from the database. + * @param _parent- + * @param args - An object that contains `id` of the user and `orderBy`. + * @returns An object that contains the Event data. + * @remarks The query function uses `getSort()` function to sort the data in specified. + */ +export const registeredEventsByUser: QueryResolvers["registeredEventsByUser"] = + async (_parent, args) => { + const sort = getSort(args.orderBy); + + return await Event.find({ + registrants: { + $elemMatch: { + userId: args.id, + status: "ACTIVE", + }, + }, + }) + .sort(sort) + .populate("creatorId", "-password") + .populate("admins", "-password") + .lean(); + }; diff --git a/src/resolvers/Query/user.ts b/src/resolvers/Query/user.ts new file mode 100644 index 0000000000..c0716be0c3 --- /dev/null +++ b/src/resolvers/Query/user.ts @@ -0,0 +1,51 @@ +import { USER_NOT_FOUND_ERROR } from "../../constants"; +import { errors } from "../../libraries"; +import type { InterfaceAppUserProfile, InterfaceUser } from "../../models"; +import { AppUserProfile, User } from "../../models"; +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; +/** + * This query fetch the user from the database. + * @param _parent- + * @param args - An object that contains `id` for the user. + * @param context- + * @returns An object that contains user data. If the user is not found then it throws a `NotFoundError` error. + */ +export const user: QueryResolvers["user"] = async (_parent, args, context) => { + const currentUserExists = !!(await User.exists({ + _id: context.userId, + })); + + if (currentUserExists === false) { + throw new errors.NotFoundError( + USER_NOT_FOUND_ERROR.DESC, + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + + const user: InterfaceUser = (await User.findOne({ + _id: args.id, + }).lean()) as InterfaceUser; + const userAppProfile: InterfaceAppUserProfile = (await AppUserProfile.findOne( + { + userId: user._id, + }, + ) + .populate("createdOrganizations") + .populate("createdEvents") + .populate("eventAdmin") + .populate("adminFor") + .populate("pledges") + .populate("campaigns") + .lean()) as InterfaceAppUserProfile; + + // This Query field doesn't allow client to see organizations they are blocked by + return { + user: { + ...user, + image: user?.image ? `${context.apiRootUrl}${user.image}` : null, + organizationsBlockedBy: [], + }, + appUserProfile: userAppProfile, + }; +}; diff --git a/src/resolvers/Query/userLanguage.ts b/src/resolvers/Query/userLanguage.ts new file mode 100644 index 0000000000..77af32c410 --- /dev/null +++ b/src/resolvers/Query/userLanguage.ts @@ -0,0 +1,43 @@ +import { + USER_NOT_AUTHORIZED_ERROR, + USER_NOT_FOUND_ERROR, +} from "../../constants"; +import { errors, requestContext } from "../../libraries"; +import { AppUserProfile, User } from "../../models"; +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; +/** + * This query will fetch the language code for the user from the database. + * @param _parent- + * @param args - An object that contains `userId`. + * @returns The language code of the user. + */ +export const userLanguage: QueryResolvers["userLanguage"] = async ( + _parent, + args, +) => { + const user = await User.findOne({ + _id: args.userId, + }).lean(); + + if (!user) { + throw new errors.NotFoundError( + USER_NOT_FOUND_ERROR.DESC, + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + const appUserProfile = await AppUserProfile.findOne({ + userId: user._id, + }) + .select(["appLanguageCode"]) + .lean(); + if (!appUserProfile) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), + USER_NOT_AUTHORIZED_ERROR.CODE, + USER_NOT_AUTHORIZED_ERROR.PARAM, + ); + } + + return appUserProfile.appLanguageCode; +}; diff --git a/src/resolvers/Query/users.ts b/src/resolvers/Query/users.ts new file mode 100644 index 0000000000..ce65967e80 --- /dev/null +++ b/src/resolvers/Query/users.ts @@ -0,0 +1,94 @@ +import { UNAUTHENTICATED_ERROR } from "../../constants"; +import { errors, requestContext } from "../../libraries"; +import type { InterfaceAppUserProfile, InterfaceUser } from "../../models"; +import { AppUserProfile, User } from "../../models"; +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; +import { getSort } from "./helperFunctions/getSort"; +import { getWhere } from "./helperFunctions/getWhere"; + +/** + * This query will fetch all the users in specified order from the database. + * @param _parent- + * @param args - An object that contains relevant data to perform the query. + * @param context- + * @returns An object that contains the list of all the users. + * @remarks The query function uses `getSort()` function to sort the data in specified. + */ +export const users: QueryResolvers["users"] = async ( + _parent, + args, + context, +) => { + const where = getWhere(args.where); + const sort = getSort(args.orderBy); + + const currentUser = await User.findOne({ + _id: context.userId, + }); + + if (!currentUser) { + throw new errors.UnauthenticatedError( + requestContext.translate(UNAUTHENTICATED_ERROR.MESSAGE), + UNAUTHENTICATED_ERROR.CODE, + UNAUTHENTICATED_ERROR.PARAM, + ); + } + const currentUserAppProfile = await AppUserProfile.findOne({ + userId: currentUser._id, + }).lean(); + if (!currentUserAppProfile) { + throw new errors.UnauthenticatedError( + requestContext.translate(UNAUTHENTICATED_ERROR.MESSAGE), + UNAUTHENTICATED_ERROR.CODE, + UNAUTHENTICATED_ERROR.PARAM, + ); + } + + const filterCriteria = { + ...where, + }; + + const users = await User.find(filterCriteria) + .sort(sort) + .limit(args.first ?? 0) + .skip(args.skip ?? 0) + .select(["-password"]) + .populate("joinedOrganizations") + .populate("registeredEvents") + .populate("organizationsBlockedBy") + .lean(); + + return await Promise.all( + users.map(async (user) => { + const isSuperAdmin = currentUserAppProfile.isSuperAdmin; + const appUserProfile = await AppUserProfile.findOne({ userId: user._id }) + .populate("createdOrganizations") + .populate("createdEvents") + .populate("eventAdmin") + .populate("adminFor") + .populate("pledges") + .populate("campaigns"); + + return { + user: { + ...user, + image: user.image ? `${context.apiRootUrl}${user.image}` : null, + organizationsBlockedBy: + isSuperAdmin && currentUser._id !== user._id + ? user.organizationsBlockedBy + : [], + }, + appUserProfile: (appUserProfile as InterfaceAppUserProfile) || { + _id: "", + adminFor: [], + isSuperAdmin: false, + createdOrganizations: [], + createdEvents: [], + eventAdmin: [], + pledges: [], + campaigns: [], + }, + }; + }), + ); +}; diff --git a/src/resolvers/Query/usersConnection.ts b/src/resolvers/Query/usersConnection.ts new file mode 100644 index 0000000000..c87b2d0eab --- /dev/null +++ b/src/resolvers/Query/usersConnection.ts @@ -0,0 +1,49 @@ +import type { InterfaceAppUserProfile, InterfaceUser } from "../../models"; +import { AppUserProfile, User } from "../../models"; +import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; +import { getSort } from "./helperFunctions/getSort"; +import { getWhere } from "./helperFunctions/getWhere"; + +/** + * This query will fetch all the users in a specified order to paginate from the database. + * @param _parent- + * @param args - An object that contains relevant data to execute the query. + * @returns An object that contains list of the users. + * @remarks Connection in graphQL means pagination, + * learn more about Connection {@link https://relay.dev/graphql/connections.htm | here}. + */ + +export const usersConnection: QueryResolvers["usersConnection"] = async ( + _parent, + args, +) => { + const where = getWhere(args.where); + const sort = getSort(args.orderBy); + + const users = await User.find(where) + .sort(sort) + .limit(args.first ?? 0) + .skip(args.skip ?? 0) + .select(["-password"]) + .populate("joinedOrganizations") + .populate("registeredEvents") + .lean(); + return await Promise.all( + users.map(async (user) => { + const userAppProfile = await AppUserProfile.findOne({ + userId: user._id, + }) + .populate("createdOrganizations") + .populate("createdEvents") + .populate("eventAdmin") + .populate("adminFor") + .populate("pledges") + .populate("campaigns") + .lean(); + return { + user: user as InterfaceUser, + appUserProfile: userAppProfile as InterfaceAppUserProfile, + }; + }), + ); +}; diff --git a/src/resolvers/Query/venue.ts b/src/resolvers/Query/venue.ts new file mode 100644 index 0000000000..ec3209c2b4 --- /dev/null +++ b/src/resolvers/Query/venue.ts @@ -0,0 +1,45 @@ +import { + ORGANIZATION_NOT_FOUND_ERROR, + VENUE_NOT_FOUND_ERROR, +} from "../../constants"; +import { errors } from "../../libraries"; +import { Organization, Venue } from "../../models"; +import type { QueryResolvers } from "./../../types/generatedGraphQLTypes"; +/** + * This query fetch the venue from the database. + * @param _parent- + * @param args - An object that contains `id` for the venue. + * @param context- + * @returns An object that contains venue data. If the venue is not found then it throws a `NotFoundError` error. + */ + +export const venue: QueryResolvers["venue"] = async (_parent, args) => { + const venue = await Venue.findById({ + _id: args.id, + }); + + if (!venue) { + throw new errors.NotFoundError( + VENUE_NOT_FOUND_ERROR.MESSAGE, + VENUE_NOT_FOUND_ERROR.CODE, + VENUE_NOT_FOUND_ERROR.PARAM, + ); + } + + const organization = await Organization.findById({ + _id: venue.organization, + }); + + if (!organization) { + throw new errors.NotFoundError( + ORGANIZATION_NOT_FOUND_ERROR.MESSAGE, + ORGANIZATION_NOT_FOUND_ERROR.CODE, + ORGANIZATION_NOT_FOUND_ERROR.PARAM, + ); + } + + return { + ...venue.toObject(), + organization: organization.toObject(), + }; +}; diff --git a/src/resolvers/RecurrenceRule/baseRecurringEvent.ts b/src/resolvers/RecurrenceRule/baseRecurringEvent.ts new file mode 100644 index 0000000000..35200640e8 --- /dev/null +++ b/src/resolvers/RecurrenceRule/baseRecurringEvent.ts @@ -0,0 +1,21 @@ +import type { RecurrenceRuleResolvers } from "../../types/generatedGraphQLTypes"; +import { Event } from "../../models"; + +/** + * Resolver function for the `baseRecurringEvent` field of a `RecurrenceRule`. + * + * This function retrieves the base recurring event associated with a specific recurrence rule. + * + * @param parent - The parent object representing the recurrence rule. It contains information about the recurrence rule, including the ID of the base recurring event associated with it. + * @returns A promise that resolves to the event document found in the database. This document represents the base recurring event associated with the recurrence rule. + * + * @see Event - The Event model used to interact with the events collection in the database. + * @see RecurrenceRuleResolvers - The type definition for the resolvers of the RecurrenceRule fields. + * + */ +export const baseRecurringEvent: RecurrenceRuleResolvers["baseRecurringEvent"] = + async (parent) => { + return await Event.findOne({ + _id: parent.baseRecurringEventId, + }).lean(); + }; diff --git a/src/resolvers/RecurrenceRule/index.ts b/src/resolvers/RecurrenceRule/index.ts new file mode 100644 index 0000000000..3dd2319117 --- /dev/null +++ b/src/resolvers/RecurrenceRule/index.ts @@ -0,0 +1,8 @@ +import type { RecurrenceRuleResolvers } from "../../types/generatedGraphQLTypes"; +import { organization } from "./organization"; +import { baseRecurringEvent } from "./baseRecurringEvent"; + +export const RecurrenceRule: RecurrenceRuleResolvers = { + organization, + baseRecurringEvent, +}; diff --git a/src/resolvers/RecurrenceRule/organization.ts b/src/resolvers/RecurrenceRule/organization.ts new file mode 100644 index 0000000000..6266884482 --- /dev/null +++ b/src/resolvers/RecurrenceRule/organization.ts @@ -0,0 +1,23 @@ +import type { RecurrenceRuleResolvers } from "../../types/generatedGraphQLTypes"; +import { Organization } from "../../models"; + +/** + * Resolver function for the `organization` field of a `RecurrenceRule`. + * + * This function retrieves the organization associated with a specific recurrence rule. + * + * @param parent - The parent object representing the recurrence rule. It contains information about the recurrence rule, including the ID of the organization associated with it. + * @returns A promise that resolves to the organization document found in the database. This document represents the organization associated with the recurrence rule. + * + * @see Organization - The Organization model used to interact with the organizations collection in the database. + * @see RecurrenceRuleResolvers - The type definition for the resolvers of the RecurrenceRule fields. + * + */ + +export const organization: RecurrenceRuleResolvers["organization"] = async ( + parent, +) => { + return await Organization.findOne({ + _id: parent.organizationId, + }).lean(); +}; diff --git a/src/resolvers/Subscription/directMessageChat.ts b/src/resolvers/Subscription/directMessageChat.ts new file mode 100644 index 0000000000..38af5cbd3a --- /dev/null +++ b/src/resolvers/Subscription/directMessageChat.ts @@ -0,0 +1,19 @@ +import { withFilter } from "graphql-subscriptions"; +import type { SubscriptionResolvers } from "../../types/generatedGraphQLTypes"; + +const CHAT_CHANNEL = "CHAT_CHANNEL"; +/** + * This property contained a `subscribe` field, which is used to subscribe + * the user to get updates for the `CHAT_CHANNEL` event. + * @remarks To control updates on a per-client basis, the function uses the `withFilter` + * method imported from `apollo-server-express` module. + * You can learn about `subscription` {@link https://www.apollographql.com/docs/apollo-server/data/subscriptions/ | here }. + */ +export const directMessageChat: SubscriptionResolvers["directMessageChat"] = { + // @ts-expect-error-ts-ignore + subscribe: withFilter( + (_parent, _args, context) => context.pubsub.asyncIterator(CHAT_CHANNEL), + + (payload) => payload?.directMessageChat, + ), +}; diff --git a/src/resolvers/Subscription/index.ts b/src/resolvers/Subscription/index.ts new file mode 100644 index 0000000000..c981720fcb --- /dev/null +++ b/src/resolvers/Subscription/index.ts @@ -0,0 +1,11 @@ +import type { SubscriptionResolvers } from "../../types/generatedGraphQLTypes"; +import { directMessageChat } from "./directMessageChat"; +import { messageSentToDirectChat } from "./messageSentToDirectChat"; +import { messageSentToGroupChat } from "./messageSentToGroupChat"; +import { onPluginUpdate } from "./onPluginUpdate"; +export const Subscription: SubscriptionResolvers = { + directMessageChat, + messageSentToDirectChat, + messageSentToGroupChat, + onPluginUpdate, +}; diff --git a/src/resolvers/Subscription/messageSentToDirectChat.ts b/src/resolvers/Subscription/messageSentToDirectChat.ts new file mode 100644 index 0000000000..55ce56e603 --- /dev/null +++ b/src/resolvers/Subscription/messageSentToDirectChat.ts @@ -0,0 +1,36 @@ +import { withFilter } from "graphql-subscriptions"; +import type { SubscriptionResolvers } from "../../types/generatedGraphQLTypes"; + +const MESSAGE_SENT_TO_DIRECT_CHAT = "MESSAGE_SENT_TO_DIRECT_CHAT"; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export const filterFunction = function (payload: any, variables: any): boolean { + const currentUserId = variables.userId.toString(); + console.log( + currentUserId, + payload.messageSentToDirectChat.receiver.toString(), + payload.messageSentToDirectChat.sender.toString(), + ); + return ( + currentUserId === payload.messageSentToDirectChat.receiver.toString() || + currentUserId === payload.messageSentToDirectChat.sender.toString() + ); +}; +/** + * This property included a `subscribe` method, which is used to + * subscribe the `receiver` and `sender` to receive Direct Chat updates. + * + * @remarks To control updates on a per-client basis, the function uses the `withFilter` + * method imported from `apollo-server-express` module. + * You can learn about `subscription` {@link https://www.apollographql.com/docs/apollo-server/data/subscriptions/ | here }. + */ +export const messageSentToDirectChat: SubscriptionResolvers["messageSentToDirectChat"] = + { + // @ts-expect-error-ts-ignore + subscribe: withFilter( + (_parent, _args, context) => + context.pubsub.asyncIterator([MESSAGE_SENT_TO_DIRECT_CHAT]), + + (payload, variables) => filterFunction(payload, variables), + ), + }; diff --git a/src/resolvers/Subscription/messageSentToGroupChat.ts b/src/resolvers/Subscription/messageSentToGroupChat.ts new file mode 100644 index 0000000000..ec45eb30c2 --- /dev/null +++ b/src/resolvers/Subscription/messageSentToGroupChat.ts @@ -0,0 +1,52 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import { withFilter } from "graphql-subscriptions"; +import type { SubscriptionResolvers } from "../../types/generatedGraphQLTypes"; +import { GroupChat } from "../../models"; + +const MESSAGE_SENT_TO_GROUP_CHAT = "MESSAGE_SENT_TO_GROUP_CHAT"; + +/** + * This function is used to filter the subscription payload based on the current user's membership in the group chat. + * + * @param payload - The payload of the subscription message. + * @param context - The context object containing the current user's ID. + * @returns A promise that resolves to a boolean value indicating whether the current user is a member of the group chat. + */ +export const filterFunction = async function ( + payload: any, + variables: any, +): Promise { + const currentUserId = variables.userId; + const groupChatId = payload.messageSentToGroupChat.groupChatMessageBelongsTo; + + const groupChat = await GroupChat.findOne({ + _id: groupChatId, + }).lean(); + + if (groupChat) { + const currentUserIsGroupChatMember = groupChat.users.some((user) => + user.equals(currentUserId), + ); + return currentUserIsGroupChatMember; + } else { + return false; + } +}; +/** + * This property included a `subscribe` method, which is used to + * subscribe the `current_user` to get updates for Group chats. + * + * @remarks To control updates on a per-client basis, the function uses the `withFilter` + * method imported from `apollo-server-express` module. + * You can learn about `subscription` {@link https://www.apollographql.com/docs/apollo-server/data/subscriptions/ | here }. + */ +export const messageSentToGroupChat: SubscriptionResolvers["messageSentToGroupChat"] = + { + // @ts-expect-error-ts-ignore + subscribe: withFilter( + (_parent, _args, context) => + context.pubsub.asyncIterator([MESSAGE_SENT_TO_GROUP_CHAT]), + + (payload, variables) => filterFunction(payload, variables), + ), + }; diff --git a/src/resolvers/Subscription/onPluginUpdate.ts b/src/resolvers/Subscription/onPluginUpdate.ts new file mode 100644 index 0000000000..848bbaf648 --- /dev/null +++ b/src/resolvers/Subscription/onPluginUpdate.ts @@ -0,0 +1,55 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import { withFilter } from "graphql-subscriptions"; +import type { SubscriptionResolvers } from "../../types/generatedGraphQLTypes"; + +// import { GroupChat } from "../GroupChat"; + +const TALAWA_PLUGIN_UPDATED = "TALAWA_PLUGIN_UPDATED"; +/** + * This property included a `subscribe` method, which is used to + * subscribe the `current_user` to get updates for Group chats. + * + * @remarks To control updates on a per-client basis, the function uses the `withFilter` + * method imported from `apollo-server-express` module. + * You can learn about `subscription` {@link https://www.apollographql.com/docs/apollo-server/data/subscriptions/ | here }. + */ +// const subscribers: any = []; +// const messages: any = []; +// const onMessagesUpdates = (fn:any) => subscribers.push(fn); + +export const filterFunction = async function ( + // eslint-disable-next-line @typescript-eslint/no-unused-vars + payload: any, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + context: any, +): Promise { + return true; +}; + +/** + * This function creates a response object for the `onPluginUpdate` subscription. + * + * @param payload - The payload received from the subscription. + * @returns The response object for the subscription. + */ +export const createPluginUpdateResponse = (payload: any): any => { + return payload.Plugin; +}; + +/** + * This property included a `subscribe` method, which is used to + * subscribe the `current_user` to get updates for Group chats. + * + * @remarks To control updates on a per-client basis, the function uses the `withFilter` + * method imported from `apollo-server-express` module. + * You can learn about `subscription` {@link https://www.apollographql.com/docs/apollo-server/data/subscriptions/ | here }. + */ +export const onPluginUpdate: SubscriptionResolvers["onPluginUpdate"] = { + // @ts-expect-error-ts-ignore + subscribe: withFilter( + (_parent, _args, context) => + context.pubsub.asyncIterator([TALAWA_PLUGIN_UPDATED]), + (payload, _variables, context) => filterFunction(payload, context), + ), + resolve: createPluginUpdateResponse, +}; diff --git a/src/resolvers/User/index.ts b/src/resolvers/User/index.ts new file mode 100644 index 0000000000..538fe582cf --- /dev/null +++ b/src/resolvers/User/index.ts @@ -0,0 +1,8 @@ +import type { UserResolvers } from "../../types/generatedGraphQLTypes"; +// import { tagsAssignedWith } from "./tagsAssignedWith"; +import { posts } from "./posts"; + +export const User: UserResolvers = { + // tagsAssignedWith, + posts, +}; diff --git a/src/resolvers/User/posts.ts b/src/resolvers/User/posts.ts new file mode 100644 index 0000000000..008d8c7915 --- /dev/null +++ b/src/resolvers/User/posts.ts @@ -0,0 +1,132 @@ +// import { Post } from "../../models"; +import type { Types } from "mongoose"; +import type { InterfacePost } from "../../models"; +import { Post } from "../../models"; +import type { UserResolvers } from "../../types/generatedGraphQLTypes"; +import { + getCommonGraphQLConnectionFilter, + getCommonGraphQLConnectionSort, + parseGraphQLConnectionArguments, + transformToDefaultGraphQLConnection, + type DefaultGraphQLArgumentError, + type ParseGraphQLConnectionCursorArguments, + type ParseGraphQLConnectionCursorResult, +} from "../../utilities/graphQLConnection"; + +import { GraphQLError } from "graphql"; +import { MAXIMUM_FETCH_LIMIT } from "../../constants"; + +/** + * Resolver function to fetch and return posts created by a user from the database. + * This function implements cursor-based pagination using GraphQL connection arguments. + * + * @param parent - An object that is the return value of the resolver for this field's parent. + * @param args - Arguments passed to the resolver. These should include pagination arguments such as `first`, `last`, `before`, and `after`. + * + * @returns A Promise that resolves to an object containing an array of posts, the total count of posts, and pagination information. The pagination information includes the `startCursor`, `endCursor`, `hasPreviousPage`, and `hasNextPage`. + * + * @throws GraphQLError Throws an error if the provided arguments are invalid. + */ +export const posts: UserResolvers["posts"] = async (parent, args) => { + const parseGraphQLConnectionArgumentsResult = + await parseGraphQLConnectionArguments({ + args, + parseCursor: (args) => + parseCursor({ + ...args, + creatorId: parent._id, + }), + maximumLimit: MAXIMUM_FETCH_LIMIT, + }); + if (!parseGraphQLConnectionArgumentsResult.isSuccessful) { + throw new GraphQLError("Invalid arguments provided.", { + extensions: { + code: "INVALID_ARGUMENTS", + errors: parseGraphQLConnectionArgumentsResult.errors, + }, + }); + } + const { parsedArgs } = parseGraphQLConnectionArgumentsResult; + + const filter = getCommonGraphQLConnectionFilter({ + cursor: parsedArgs.cursor, + direction: parsedArgs.direction, + }); + + //get the sorting object + + const sort = getCommonGraphQLConnectionSort({ + direction: parsedArgs.direction, + }); + + const [objectList, totalCount] = await Promise.all([ + Post.find({ + ...filter, + creatorId: parent._id, + }) + .sort(sort) + .limit(parsedArgs.limit) + .lean() + .exec(), + + Post.find({ + creatorId: parent._id, + }) + .countDocuments() + .exec(), + ]); + return transformToDefaultGraphQLConnection< + ParsedCursor, + InterfacePost, + InterfacePost + >({ + objectList, + parsedArgs, + totalCount, + }); +}; +/* +This is typescript type of the parsed cursor for this connection resolver. +*/ +type ParsedCursor = string; + +/** + * This function is used to validate and transform the cursor passed to the `posts` connection resolver. + * + * @param args - An object that includes the cursor value, cursor name, cursor path, and the ID of the creator. + * + * @returns A Promise that resolves to an object that includes a boolean indicating whether the operation was successful, and the parsed cursor value. If the operation was not successful, the object also includes an array of errors. + * + * @throws Error Throws an error if the provided cursor is invalid. + * */ +export const parseCursor = async ({ + cursorValue, + cursorName, + cursorPath, + creatorId, +}: ParseGraphQLConnectionCursorArguments & { + creatorId: string | Types.ObjectId; +}): ParseGraphQLConnectionCursorResult => { + const errors: DefaultGraphQLArgumentError[] = []; + const post = await Post.findOne({ + _id: cursorValue, + creatorId, + }); + if (!post) { + errors.push({ + message: `Argument ${cursorName} is an invalid cursor.`, + path: cursorPath, + }); + } + if (errors.length !== 0) { + return { + errors, + isSuccessful: false, + }; + } + + return { + isSuccessful: true, + parsedCursor: cursorValue, + }; +}; diff --git a/src/resolvers/UserFamily/admins.ts b/src/resolvers/UserFamily/admins.ts new file mode 100644 index 0000000000..0eab116e98 --- /dev/null +++ b/src/resolvers/UserFamily/admins.ts @@ -0,0 +1,22 @@ +import { User } from "../../models"; +import type { UserFamilyResolvers } from "../../types/generatedGraphQLTypes"; + +/** + * Resolver function for the `admins` field of a `UserFamily`. + * + * This function retrieves the users who are admins of a specific user family. + * + * @param parent - The parent object representing the user family. It contains information about the user family, including the IDs of the users who are admins. + * @returns A promise that resolves to an array of user documents found in the database. These documents represent the users who are admins of the user family. + * + * @see User - The User model used to interact with the users collection in the database. + * @see UserFamilyResolvers - The type definition for the resolvers of the UserFamily fields. + * + */ +export const admins: UserFamilyResolvers["admins"] = async (parent) => { + return await User.find({ + _id: { + $in: parent.admins, + }, + }).lean(); +}; diff --git a/src/resolvers/UserFamily/creator.ts b/src/resolvers/UserFamily/creator.ts new file mode 100644 index 0000000000..1e0ec81727 --- /dev/null +++ b/src/resolvers/UserFamily/creator.ts @@ -0,0 +1,32 @@ +import { User } from "../../models"; +import { errors, requestContext } from "../../libraries"; +import type { UserFamilyResolvers } from "../../types/generatedGraphQLTypes"; +import { USER_NOT_FOUND_ERROR } from "../../constants"; + +/** + * Resolver function for the `creator` field of a `UserFamily`. + * + * This function retrieves the user who created a specific user family. + * + * @param parent - The parent object representing the user family. It contains information about the user family, including the ID of the user who created it. + * @returns A promise that resolves to the user document found in the database. This document represents the user who created the user family. + * + * @see User - The User model used to interact with the users collection in the database. + * @see UserFamilyResolvers - The type definition for the resolvers of the UserFamily fields. + * + */ +export const creator: UserFamilyResolvers["creator"] = async (parent) => { + const user = await User.findOne({ + _id: parent.creator.toString(), + }).lean(); + + if (!user) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + + return user; +}; diff --git a/src/resolvers/UserFamily/index.ts b/src/resolvers/UserFamily/index.ts new file mode 100644 index 0000000000..a89939e37d --- /dev/null +++ b/src/resolvers/UserFamily/index.ts @@ -0,0 +1,10 @@ +import type { UserFamilyResolvers } from "../../types/generatedGraphQLTypes"; +import { users } from "./users"; +import { admins } from "./admins"; +import { creator } from "./creator"; + +export const UserFamily: UserFamilyResolvers = { + users, + admins, + creator, +}; diff --git a/src/resolvers/UserFamily/users.ts b/src/resolvers/UserFamily/users.ts new file mode 100644 index 0000000000..2a139731b7 --- /dev/null +++ b/src/resolvers/UserFamily/users.ts @@ -0,0 +1,22 @@ +import type { UserFamilyResolvers } from "../../types/generatedGraphQLTypes"; +import { User } from "../../models"; + +/** + * Resolver function for the `users` field of a `UserFamily`. + * + * This function retrieves the users who are part of a specific user family. + * + * @param parent - The parent object representing the user family. It contains information about the user family, including the IDs of the users who are part of it. + * @returns A promise that resolves to an array of user documents found in the database. These documents represent the users who are part of the user family. + * + * @see User - The User model used to interact with the users collection in the database. + * @see UserFamilyResolvers - The type definition for the resolvers of the UserFamily fields. + * + */ +export const users: UserFamilyResolvers["users"] = async (parent) => { + return await User.find({ + _id: { + $in: parent.users, + }, + }).lean(); +}; diff --git a/src/resolvers/UserTag/childTags.ts b/src/resolvers/UserTag/childTags.ts new file mode 100644 index 0000000000..ae95fb2b16 --- /dev/null +++ b/src/resolvers/UserTag/childTags.ts @@ -0,0 +1,139 @@ +import type { UserTagResolvers } from "../../types/generatedGraphQLTypes"; +import type { InterfaceOrganizationTagUser } from "../../models"; +import { OrganizationTagUser } from "../../models"; +import { + getCommonGraphQLConnectionFilter, + getCommonGraphQLConnectionSort, + parseGraphQLConnectionArguments, + transformToDefaultGraphQLConnection, + type DefaultGraphQLArgumentError, + type ParseGraphQLConnectionCursorArguments, + type ParseGraphQLConnectionCursorResult, +} from "../../utilities/graphQLConnection"; +import { GraphQLError } from "graphql"; +import { MAXIMUM_FETCH_LIMIT } from "../../constants"; +import type { Types } from "mongoose"; + +/** + * Resolver function for the `childTags` field of a `UserTag`. + * + * This resolver is used to resolve the `childTags` field of a `UserTag` type. + * + * @param parent - The parent object representing the user tag. It contains information about the user tag, including the ID of the user tag. + * @param args - The arguments provided to the field. These arguments are used to filter, sort, and paginate the child tags. + * @returns A promise that resolves to a connection object containing the child tags of the user tag. + * + * @see OrganizationTagUser - The OrganizationTagUser model used to interact with the organization tag users collection in the database. + * @see parseGraphQLConnectionArguments - The function used to parse the GraphQL connection arguments (filter, sort, pagination). + * @see transformToDefaultGraphQLConnection - The function used to transform the list of child tags into a connection object. + * @see getCommonGraphQLConnectionFilter - The function used to get the common filter object for the GraphQL connection. + * @see getCommonGraphQLConnectionSort - The function used to get the common sort object for the GraphQL connection. + * @see MAXIMUM_FETCH_LIMIT - The maximum number of child tags that can be fetched in a single request. + * @see GraphQLError - The error class used to throw GraphQL errors. + * @see UserTagResolvers - The type definition for the resolvers of the UserTag fields. + * + */ +export const childTags: UserTagResolvers["childTags"] = async ( + parent, + args, +) => { + const parseGraphQLConnectionArgumentsResult = + await parseGraphQLConnectionArguments({ + args, + parseCursor: (args) => + parseCursor({ + ...args, + parentTagId: parent._id, + }), + maximumLimit: MAXIMUM_FETCH_LIMIT, + }); + + if (!parseGraphQLConnectionArgumentsResult.isSuccessful) { + throw new GraphQLError("Invalid arguments provided.", { + extensions: { + code: "INVALID_ARGUMENTS", + errors: parseGraphQLConnectionArgumentsResult.errors, + }, + }); + } + + const { parsedArgs } = parseGraphQLConnectionArgumentsResult; + + const filter = getCommonGraphQLConnectionFilter({ + cursor: parsedArgs.cursor, + direction: parsedArgs.direction, + }); + + const sort = getCommonGraphQLConnectionSort({ + direction: parsedArgs.direction, + }); + + const [objectList, totalCount] = await Promise.all([ + OrganizationTagUser.find({ + ...filter, + parentTagId: parent._id, + }) + .sort(sort) + .limit(parsedArgs.limit) + .lean() + .exec(), + OrganizationTagUser.find({ + parentTagId: parent._id, + }) + .countDocuments() + .exec(), + ]); + + return transformToDefaultGraphQLConnection< + ParsedCursor, + InterfaceOrganizationTagUser, + InterfaceOrganizationTagUser + >({ + objectList, + parsedArgs, + totalCount, + }); +}; + +/* +This is typescript type of the parsed cursor for this connection resolver. +*/ +type ParsedCursor = string; + +/* +This function is used to validate and transform the cursor passed to this connnection +resolver. +*/ +export const parseCursor = async ({ + cursorValue, + cursorName, + cursorPath, + parentTagId, +}: ParseGraphQLConnectionCursorArguments & { + parentTagId: string | Types.ObjectId; +}): ParseGraphQLConnectionCursorResult => { + const errors: DefaultGraphQLArgumentError[] = []; + const tag = await OrganizationTagUser.findOne({ + _id: cursorValue, + parentTagId, + }); + + if (!tag) { + errors.push({ + message: `Argument ${cursorName} is an invalid cursor.`, + path: cursorPath, + }); + } + + if (errors.length !== 0) { + return { + errors, + isSuccessful: false, + }; + } + + return { + isSuccessful: true, + parsedCursor: cursorValue, + }; +}; diff --git a/src/resolvers/UserTag/index.ts b/src/resolvers/UserTag/index.ts new file mode 100644 index 0000000000..ee65404610 --- /dev/null +++ b/src/resolvers/UserTag/index.ts @@ -0,0 +1,12 @@ +import type { UserTagResolvers } from "../../types/generatedGraphQLTypes"; +import { childTags } from "./childTags"; +import { organization } from "./organization"; +import { parentTag } from "./parentTag"; +import { usersAssignedTo } from "./usersAssignedTo"; + +export const UserTag: UserTagResolvers = { + childTags, + organization, + parentTag, + usersAssignedTo, +}; diff --git a/src/resolvers/UserTag/organization.ts b/src/resolvers/UserTag/organization.ts new file mode 100644 index 0000000000..f14406a047 --- /dev/null +++ b/src/resolvers/UserTag/organization.ts @@ -0,0 +1,22 @@ +import type { UserTagResolvers } from "../../types/generatedGraphQLTypes"; +import { Organization } from "../../models"; + +/** + * Resolver function for the `organization` field of a `UserTag`. + * + * This function retrieves the organization associated with a specific user tag. + * + * @param parent - The parent object representing the user tag. It contains information about the user tag, including the ID of the organization associated with it. + * @returns A promise that resolves to the organization document found in the database. This document represents the organization associated with the user tag. + * + * @see Organization - The Organization model used to interact with the organizations collection in the database. + * @see UserTagResolvers - The type definition for the resolvers of the UserTag fields. + * + */ +export const organization: UserTagResolvers["organization"] = async ( + parent, +) => { + return await Organization.findOne({ + _id: parent.organizationId, + }).lean(); +}; diff --git a/src/resolvers/UserTag/parentTag.ts b/src/resolvers/UserTag/parentTag.ts new file mode 100644 index 0000000000..d4ecbd76b0 --- /dev/null +++ b/src/resolvers/UserTag/parentTag.ts @@ -0,0 +1,24 @@ +import type { UserTagResolvers } from "../../types/generatedGraphQLTypes"; +import { OrganizationTagUser } from "../../models"; + +/** + * Resolver function for the `parentTag` field of a `UserTag`. + * + * This function retrieves the parent tag associated with a specific user tag. + * + * @param parent - The parent object representing the user tag. It contains information about the user tag, including the ID of the parent tag associated with it. + * @returns A promise that resolves to the user tag document found in the database. This document represents the parent tag associated with the user tag. + * + * @see OrganizationTagUser - The OrganizationTagUser model used to interact with the user tags collection in the database. + * @see UserTagResolvers - The type definition for the resolvers of the UserTag fields. + * + */ +export const parentTag: UserTagResolvers["parentTag"] = async (parent) => { + // Check if the parentTag is null + if (parent.parentTagId === null) return null; + + // If the parentTag is not null, make a database request to fetch the same + return await OrganizationTagUser.findOne({ + _id: parent.parentTagId, + }).lean(); +}; diff --git a/src/resolvers/UserTag/usersAssignedTo.ts b/src/resolvers/UserTag/usersAssignedTo.ts new file mode 100644 index 0000000000..ebc8dd20a6 --- /dev/null +++ b/src/resolvers/UserTag/usersAssignedTo.ts @@ -0,0 +1,157 @@ +import type { UserTagResolvers } from "../../types/generatedGraphQLTypes"; +import type { InterfaceTagUser, InterfaceUser } from "../../models"; +import { TagUser } from "../../models"; +import { + type DefaultGraphQLArgumentError, + type ParseGraphQLConnectionCursorArguments, + type ParseGraphQLConnectionCursorResult, + getCommonGraphQLConnectionFilter, + getCommonGraphQLConnectionSort, + parseGraphQLConnectionArguments, + transformToDefaultGraphQLConnection, +} from "../../utilities/graphQLConnection"; +import { GraphQLError } from "graphql"; +import { MAXIMUM_FETCH_LIMIT } from "../../constants"; +import type { Types } from "mongoose"; + +/** + * Resolver function for the `usersAssignedTo` field of a `UserTag`. + * + * This resolver is used to resolve the `usersAssignedTo` field of a `UserTag` type. + * + * @param parent - The parent object representing the user tag. It contains information about the user tag, including the ID of the user tag. + * @param args - The arguments provided to the field. These arguments are used to filter, sort, and paginate the users assigned to the user tag. + * @returns A promise that resolves to a connection object containing the users assigned to the user tag. + * + * @see TagUser - The TagUser model used to interact with the tag users collection in the database. + * @see parseGraphQLConnectionArguments - The function used to parse the GraphQL connection arguments (filter, sort, pagination). + * @see transformToDefaultGraphQLConnection - The function used to transform the list of users assigned to the user tag into a connection object. + * @see getCommonGraphQLConnectionFilter - The function used to get the common filter object for the GraphQL connection. + * @see getCommonGraphQLConnectionSort - The function used to get the common sort object for the GraphQL connection. + * @see MAXIMUM_FETCH_LIMIT - The maximum number of users that can be fetched in a single request. + * @see GraphQLError - The error class used to throw GraphQL errors. + * @see UserTagResolvers - The type definition for the resolvers of the UserTag fields. + * + */ +export const usersAssignedTo: UserTagResolvers["usersAssignedTo"] = async ( + parent, + args, +) => { + const parseGraphQLConnectionArgumentsResult = + await parseGraphQLConnectionArguments({ + args, + parseCursor: (args) => + parseCursor({ + ...args, + tagId: parent._id, + }), + maximumLimit: MAXIMUM_FETCH_LIMIT, + }); + + if (!parseGraphQLConnectionArgumentsResult.isSuccessful) { + throw new GraphQLError("Invalid arguments provided.", { + extensions: { + code: "INVALID_ARGUMENTS", + errors: parseGraphQLConnectionArgumentsResult.errors, + }, + }); + } + + const { parsedArgs } = parseGraphQLConnectionArgumentsResult; + + const filter = getCommonGraphQLConnectionFilter({ + cursor: parsedArgs.cursor, + direction: parsedArgs.direction, + }); + + const sort = getCommonGraphQLConnectionSort({ + direction: parsedArgs.direction, + }); + + const [objectList, totalCount] = await Promise.all([ + TagUser.find({ + ...filter, + tagId: parent._id, + }) + .sort(sort) + .limit(parsedArgs.limit) + .populate("userId") + .lean() + .exec(), + + TagUser.find({ + tagId: parent._id, + }) + .countDocuments() + .exec(), + ]); + + return transformToDefaultGraphQLConnection< + ParsedCursor, + InterfaceTagUser, + InterfaceUser + >({ + createNode: (object) => { + return object.userId as InterfaceUser; + }, + objectList, + parsedArgs, + totalCount, + }); +}; + +/* +This is typescript type of the parsed cursor for this connection resolver. +*/ +type ParsedCursor = string; + +/** + * Parses the cursor value for the `usersAssignedTo` connection resolver. + * + * This function is used to parse the cursor value provided to the `usersAssignedTo` connection resolver. + * + * @param cursorValue - The cursor value to be parsed. + * @param cursorName - The name of the cursor argument. + * @param cursorPath - The path of the cursor argument in the GraphQL query. + * @param tagId - The ID of the user tag to which the users are assigned. + * @returns An object containing the parsed cursor value or an array of errors if the cursor value is invalid. + * + * @see TagUser - The TagUser model used to interact with the tag users collection in the database. + * @see DefaultGraphQLArgumentError - The type definition for the default GraphQL argument error. + * @see ParseGraphQLConnectionCursorArguments - The type definition for the arguments provided to the parseCursor function. + * @see ParseGraphQLConnectionCursorResult - The type definition for the result of the parseCursor function. + * + */ +export const parseCursor = async ({ + cursorValue, + cursorName, + cursorPath, + tagId, +}: ParseGraphQLConnectionCursorArguments & { + tagId: string | Types.ObjectId; +}): ParseGraphQLConnectionCursorResult => { + const errors: DefaultGraphQLArgumentError[] = []; + const tagUser = await TagUser.findOne({ + _id: cursorValue, + tagId, + }); + + if (!tagUser) { + errors.push({ + message: `Argument ${cursorName} is an invalid cursor.`, + path: cursorPath, + }); + } + + if (errors.length !== 0) { + return { + errors, + isSuccessful: false, + }; + } + + return { + isSuccessful: true, + parsedCursor: cursorValue, + }; +}; diff --git a/src/resolvers/index.ts b/src/resolvers/index.ts new file mode 100644 index 0000000000..38873057ba --- /dev/null +++ b/src/resolvers/index.ts @@ -0,0 +1,116 @@ +import { composeResolvers } from "@graphql-tools/resolvers-composition"; +import { + DateResolver, + DateTimeResolver, + EmailAddressResolver, + LatitudeResolver, + LongitudeResolver, + PhoneNumberResolver, + PositiveIntResolver, + TimeResolver, + URLResolver, +} from "graphql-scalars"; +import GraphQLUpload from "graphql-upload/GraphQLUpload.mjs"; +import type { Resolvers } from "../types/generatedGraphQLTypes"; +import { ActionItemCategory } from "./ActionItemCategory"; +import { AgendaItem } from "./AgendaItem"; +import { AgendaSection } from "./AgendaSection"; +import { AgendaCategory } from "./AgendaCategory"; +import { CheckIn } from "./CheckIn"; +import { Comment } from "./Comment"; +import { DirectChat } from "./DirectChat"; +import { DirectChatMessage } from "./DirectChatMessage"; +import { Event } from "./Event"; +import { EventVolunteer } from "./EventVolunteer"; +import { Feedback } from "./Feedback"; +import { Fund } from "./Fund"; +import { GroupChat } from "./GroupChat"; +import { GroupChatMessage } from "./GroupChatMessage"; +import { MembershipRequest } from "./MembershipRequest"; +import { Mutation } from "./Mutation"; +import { Organization } from "./Organization"; +import { Post } from "./Post"; +import { RecurrenceRule } from "./RecurrenceRule"; + +import { Query } from "./Query"; +import { Subscription } from "./Subscription"; +import { User } from "./User"; +import { UserFamily } from "./UserFamily"; +import { UserTag } from "./UserTag"; + +import { Advertisement } from "./Advertisement"; + +import { currentUserExists } from "./middleware/currentUserExists"; + +const resolvers: Resolvers = { + ActionItemCategory, + AgendaItem, + AgendaSection, + AgendaCategory, + Advertisement, + CheckIn, + Comment, + DirectChat, + DirectChatMessage, + Event, + EventVolunteer, + Feedback, + Fund, + GroupChat, + UserFamily, + GroupChatMessage, + MembershipRequest, + Mutation, + Organization, + Post, + RecurrenceRule, + Query, + Subscription, + User, + UserTag, + + // graphql-scalar resolver + Date: DateResolver, + DateTime: DateTimeResolver, + EmailAddress: EmailAddressResolver, + Latitude: LatitudeResolver, + Longitude: LongitudeResolver, + PhoneNumber: PhoneNumberResolver, + PositiveInt: PositiveIntResolver, + Time: TimeResolver, + URL: URLResolver, + + // Graphql Upload + Upload: GraphQLUpload, +}; + +const resolversComposition = { + "Mutation.addFeedback": [currentUserExists()], + "Mutation.addOrganizationImage": [currentUserExists()], + "Mutation.blockPluginCreationBySuperadmin": [currentUserExists()], + "Mutation.createComment": [currentUserExists()], + "Mutation.createDirectChat": [currentUserExists()], + "Mutation.createGroupChat": [currentUserExists()], + "Mutation.createOrganization": [currentUserExists()], + "Mutation.createVenue": [currentUserExists()], + "Mutation.deleteVenue": [currentUserExists()], + "Mutation.editVenue": [currentUserExists()], + "Mutation.likeComment": [currentUserExists()], + "Mutation.likePost": [currentUserExists()], + "Mutation.logout": [currentUserExists()], + "Mutation.registerForEvent": [currentUserExists()], + "Mutation.removeOrganizationImage": [currentUserExists()], + "Mutation.saveFcmToken": [currentUserExists()], + "Mutation.sendMembershipRequest": [currentUserExists()], + "Mutation.unlikeComment": [currentUserExists()], + "Mutation.unlikePost": [currentUserExists()], + "Mutation.unregisterForEventByUser": [currentUserExists()], + "Mutation.updateLanguage": [currentUserExists()], + "Mutation.updatePost": [currentUserExists()], + "Mutation.createAdvertisement": [currentUserExists()], +}; + +export const composedResolvers: Resolvers = composeResolvers( + resolvers, + resolversComposition, +); diff --git a/src/resolvers/middleware/currentUserExists.ts b/src/resolvers/middleware/currentUserExists.ts new file mode 100644 index 0000000000..9aec9404fe --- /dev/null +++ b/src/resolvers/middleware/currentUserExists.ts @@ -0,0 +1,37 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable @typescript-eslint/explicit-function-return-type */ +import { User } from "../../models"; +import { USER_NOT_FOUND_ERROR } from "../../constants"; +import { errors, requestContext } from "../../libraries"; + +/** + * Middleware function to check if the current user exists in the database. + * + * This function is used to check if the user making a request to the server exists in the database. + * If the user does not exist, the function throws an error. + * + * @param next - The next function to call in the resolver chain. + * @returns The result of the next function in the resolver chain. + * + * @see User - The User model used to interact with the users collection in the database. + * @see USER_NOT_FOUND_ERROR - The error message to display when the user is not found. + * @see errors - The library used to create custom errors in the application. + */ +export const currentUserExists = + () => + (next: (root: any, args: any, context: any, info: any) => any) => + async (root: any, args: any, context: { userId: any }, info: any) => { + const currentUser = await User.exists({ + _id: context.userId, + }); + + if (!currentUser) { + throw new errors.NotFoundError( + requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), + USER_NOT_FOUND_ERROR.CODE, + USER_NOT_FOUND_ERROR.PARAM, + ); + } + + return next(root, args, context, info); + }; diff --git a/src/server.ts b/src/server.ts new file mode 100644 index 0000000000..730a3ddd88 --- /dev/null +++ b/src/server.ts @@ -0,0 +1,251 @@ +// import "dotenv/config"; // pull env variables from .env file +// import http from "http"; +// import path from "path"; +// import express from "express"; +// import { ApolloServer, PubSub } from "apollo-server-express"; +// import depthLimit from "graphql-depth-limit"; +// import rateLimit from "express-rate-limit"; +// // No type defintions available for package 'xss-clean' +// // @ts-ignore +// import xss from "xss-clean"; +// import helmet from "helmet"; +// import mongoSanitize from "express-mongo-sanitize"; +// import jwt from "jsonwebtoken"; +// import cors from "cors"; +// import requestLogger from "morgan"; +// import i18n from "i18n"; +// import * as database from "./db"; +// import { logger, requestContext, requestTracing, stream } from "./libraries"; +// import { appConfig } from "./config"; +// import { isAuth } from "./middleware"; +// import { +// AuthenticationDirective, +// RoleAuthorizationDirective, +// } from "./directives"; +// import { typeDefs } from "./typeDefs"; +// import { resolvers } from "./resolvers"; +// import type { InterfaceJwtTokenPayload } from "./utilities"; +// import { ACCESS_TOKEN_SECRET, LAST_RESORT_SUPERADMIN_EMAIL } from "./constants"; +// import { User } from "./models"; +// import { express as voyagerMiddleware } from "graphql-voyager/middleware"; +// import { generateErrorMessage } from "zod-error"; +// import { getEnvIssues } from "./env"; + +// const app = express(); + +// app.use(requestTracing.middleware()); + +// const pubsub = new PubSub(); + +// const apiLimiter = rateLimit({ +// windowMs: 60 * 60 * 1000, +// max: 50000, +// message: "Too many requests from this IP, please try again after 15 minutes", +// }); + +// i18n.configure({ +// directory: `${__dirname}/../locales`, +// staticCatalog: { +// en: require("../locales/en.json"), +// hi: require("../locales/hi.json"), +// zh: require("../locales/zh.json"), +// sp: require("../locales/sp.json"), +// fr: require("../locales/fr.json"), +// }, +// queryParameter: "lang", +// defaultLocale: appConfig.defaultLocale, +// locales: appConfig.supportedLocales, +// autoReload: process.env.NODE_ENV !== "production", +// updateFiles: process.env.NODE_ENV !== "production", +// syncFiles: process.env.NODE_ENV !== "production", +// }); + +// app.use(i18n.init); +// app.use(apiLimiter); +// app.use(xss()); +// app.use( +// helmet({ +// contentSecurityPolicy: +// process.env.NODE_ENV === "production" ? undefined : false, +// }) +// ); +// app.use(mongoSanitize()); +// app.use(cors()); +// app.use(express.json({ limit: "50mb" })); +// app.use(express.urlencoded({ limit: "50mb", extended: true })); + +// // Fix added to stream +// app.use( +// requestLogger( +// ':remote-addr - :remote-user [:date[clf]] ":method :url HTTP/:http-version" :status :res[content-length] :response-time ms', +// { +// stream: stream, +// } +// ) +// ); + +// app.use("/images", express.static(path.join(__dirname, "./../images"))); +// app.use(requestContext.middleware()); + +// if (process.env.NODE_ENV !== "production") +// app.use("/voyager", voyagerMiddleware({ endpointUrl: "/graphql" })); + +// app.get("/", (req, res) => +// res.json({ +// "talawa-version": "v1", +// status: "healthy", +// }) +// ); + +// const httpServer = http.createServer(app); + +// // Validating the env variables +// const issues = getEnvIssues(); +// if (issues) { +// logger.error( +// "Invalid environment variables found in your .env file, check the errors below!" +// ); +// console.error( +// generateErrorMessage(issues, { +// delimiter: { error: "\\n" }, +// }) +// ); +// } else { +// logger.info("The environment variables are valid!"); +// } + +// const apolloServer = new ApolloServer({ +// typeDefs, +// resolvers, +// validationRules: [depthLimit(5)], +// schemaDirectives: { +// auth: AuthenticationDirective, +// role: RoleAuthorizationDirective, +// }, +// context: ({ req, res, connection }): any => { +// /** +// * The apiRootUrl for serving static files. +// * This is constructed by extracting the protocol and host information from the `req` object. +// * It is passed to the context object and can be accessed by all the resolver functions. +// * Resolver functions can use this to construct absolute URLs for serving static files. +// * For example, http://testDomain.com/ is apiRootUrl for a server with testDomain.com as Domain Name +// * with no SSL certificate (http://) +// * In local environment, apiRootUrl will be http://localhost:\{port\}/ +// */ +// const apiRootUrl = `${req.protocol}://${req.get("host")}/`; +// if (connection) { +// return { +// ...connection, +// pubsub, +// res, +// req, +// apiRootUrl, +// }; +// } else { +// return { +// ...isAuth(req), +// pubsub, +// res, +// req, +// apiRootUrl, +// }; +// } +// }, +// formatError: ( +// error: any +// ): { message: string; status: number; data: string[] } => { +// if (!error.originalError) { +// return error; +// } +// const message = error.message ?? "Something went wrong !"; +// const data = error.originalError.errors ?? []; +// const code = error.originalError.code ?? 422; +// logger.error(message, error); +// return { +// message, +// status: code, +// data, +// }; +// }, +// subscriptions: { +// onConnect: ( +// connection: any +// ): { currentUserToken: any; currentUserId: string | null } => { +// if (!connection.authorization) { +// throw new Error("userAuthentication"); +// } +// let userId = null; + +// const token = connection.authorization.split(" ")[1]; +// if (token) { +// const decodedToken = jwt.verify( +// token, +// ACCESS_TOKEN_SECRET as string +// ) as InterfaceJwtTokenPayload; +// userId = decodedToken.userId; +// } + +// return { +// currentUserToken: connection, +// currentUserId: userId, +// }; +// }, +// }, +// }); + +// apolloServer.applyMiddleware({ +// app, +// }); +// apolloServer.installSubscriptionHandlers(httpServer); + +// const logWarningForSuperAdminEnvVariable = async (): Promise => { +// const superAdminExist = await User.exists({ userType: "SUPERADMIN" }); +// const isVariablePresentInEnvFile = !!LAST_RESORT_SUPERADMIN_EMAIL; +// if (superAdminExist) { +// if (isVariablePresentInEnvFile) { +// logger.warn( +// "\x1b[1m\x1b[33m%s\x1b[0m", +// "The LAST_RESORT_SUPERADMIN_EMAIL variable configured in your .env file poses a security risk. We strongly recommend that you remove it if not required. Please refer to the documentation in the INSTALLATION.md file.You have created super admin, please remove the LAST_RESORT_SUPERADMIN_EMAIL variable from .env file if you don't require it" +// ); +// } +// } else { +// if (!isVariablePresentInEnvFile) { +// logger.warn( +// "\x1b[1m\x1b[33m%s\x1b[0m", +// "To create your first Super Admin, the LAST_RESORT_SUPERADMIN_EMAIL parameter needs to be set in the .env file. Please refer to the documentation in the INSTALLATION.md file." +// ); +// } +// } +// }; + +// const serverStart = async (): Promise => { +// try { +// await database.connect(); +// httpServer.listen(process.env.PORT || 4000, async () => { +// await logWarningForSuperAdminEnvVariable(); +// logger.info( +// "\x1b[1m\x1b[32m%s\x1b[0m", +// `🚀 Server ready at http://localhost:${process.env.PORT || 4000}${ +// apolloServer.graphqlPath +// }` +// ); +// logger.info( +// "\x1b[1m\x1b[32m%s\x1b[0m", +// `🚀 Subscriptions ready at ws://localhost:${process.env.PORT || 4000}${ +// apolloServer.subscriptionsPath +// }` +// ); +// if (process.env.NODE_ENV !== "production") +// logger.info( +// "\x1b[1m\x1b[32m%s\x1b[0m", +// `🚀 Visualise the schema at http://localhost:${ +// process.env.PORT || 4000 +// }/voyager` +// ); +// }); +// } catch (error) { +// logger.error("Error while connecting to database", error); +// } +// }; + +// serverStart(); diff --git a/src/services/AppUserProfileCache/cacheAppUserProfile.ts b/src/services/AppUserProfileCache/cacheAppUserProfile.ts new file mode 100644 index 0000000000..afeb79f7b1 --- /dev/null +++ b/src/services/AppUserProfileCache/cacheAppUserProfile.ts @@ -0,0 +1,35 @@ +import { logger } from "../../libraries"; +import type { InterfaceAppUserProfile } from "../../models"; +import AppUserCache from "../redisCache"; + +/** + * Stores app user profiles in Redis cache with a specified time-to-live (TTL). + * @param appUserProfiles - Array of app user profiles to be cached. + * @returns Promise + */ +export async function cacheAppUserProfile( + appUserProfiles: InterfaceAppUserProfile[], +): Promise { + try { + // Create a pipeline for efficient Redis operations + const pipeline = AppUserCache.pipeline(); + + appUserProfiles.forEach((appUserProfile) => { + if (appUserProfile !== null) { + // Generate key for each app user profile based on its ID + const key = `appUserProfile:${appUserProfile._id}`; + + // Store app user profile data as JSON string in Redis + pipeline.set(key, JSON.stringify(appUserProfile)); + + // Set TTL for each app user profile to 300 seconds (5 minutes) + pipeline.expire(key, 300); + } + }); + + // Execute the pipeline for batch Redis operations + } catch (error) { + // Log any errors that occur during caching + logger.info(error); + } +} diff --git a/src/services/AppUserProfileCache/deleteAppUserFromCache.ts b/src/services/AppUserProfileCache/deleteAppUserFromCache.ts new file mode 100644 index 0000000000..96983ce068 --- /dev/null +++ b/src/services/AppUserProfileCache/deleteAppUserFromCache.ts @@ -0,0 +1,17 @@ +import AppUserCache from "../redisCache"; + +/** + * Deletes the specified app user profile from Redis cache. + * + * @param appUserProfileId - The string representing the app user profile ID to delete from cache. + * @returns A promise resolving to void. + */ +export async function deleteAppUserFromCache( + appUserProfileId: string, +): Promise { + // Generate the cache key for the app user profile based on its ID + const key = `appUserProfile:${appUserProfileId}`; + + // Delete the app user profile from Redis cache + await AppUserCache.del(key); +} diff --git a/src/services/AppUserProfileCache/findAppUserProfileCache.ts b/src/services/AppUserProfileCache/findAppUserProfileCache.ts new file mode 100644 index 0000000000..fa3b57c33d --- /dev/null +++ b/src/services/AppUserProfileCache/findAppUserProfileCache.ts @@ -0,0 +1,58 @@ +import { Types } from "mongoose"; +import { logger } from "../../libraries"; +import type { InterfaceAppUserProfile } from "../../models"; +import AppUserCache from "../redisCache"; + +export async function findAppUserProfileCache( + ids: string[], +): Promise<(InterfaceAppUserProfile | null)[]> { + if (ids.length === 0) { + return [null]; + } + const keys: string[] = ids.map((id) => { + return `appUserProfile:${id}`; + }); + const appUserProfileFoundInCache = await AppUserCache.mget(keys); + const appUserProfiles = appUserProfileFoundInCache.map( + (appUserProfile: string | null) => { + if (appUserProfile === null) { + return null; + } + try { + const parsedAppUserProfile = JSON.parse(appUserProfile); + return { + ...parsedAppUserProfile, + _id: new Types.ObjectId(parsedAppUserProfile._id), + userId: new Types.ObjectId(parsedAppUserProfile.userId), + adminFor: + parsedAppUserProfile.adminFor.length !== 0 + ? parsedAppUserProfile.adminFor.map((org: string) => { + return new Types.ObjectId(org); + }) + : [], + createdOrganizations: + parsedAppUserProfile.createdOrganizations.length !== 0 + ? parsedAppUserProfile.createdOrganizations.map((org: string) => { + return new Types.ObjectId(org); + }) + : [], + createdEvents: + parsedAppUserProfile.createdEvents.length !== 0 + ? parsedAppUserProfile.createdEvents.map((event: string) => { + return new Types.ObjectId(event); + }) + : [], + eventAdmin: + parsedAppUserProfile.EventAdmin.length !== 0 + ? parsedAppUserProfile.EventAdmin.map((event: string) => { + return new Types.ObjectId(event); + }) + : [], + }; + } catch (error) { + logger.info(`Error parsing appUserProfile from cache: ${error}`); + } + }, + ); + return appUserProfiles; +} diff --git a/src/services/CommentCache/cacheComments.ts b/src/services/CommentCache/cacheComments.ts new file mode 100644 index 0000000000..6e5fc1f6c4 --- /dev/null +++ b/src/services/CommentCache/cacheComments.ts @@ -0,0 +1,43 @@ +import { logger } from "../../libraries"; +import type { InterfaceComment } from "../../models"; +import CommentCache from "../redisCache"; + +/** + * Stores comments in Redis cache with a specified time-to-live (TTL). + * @param comments - Array of comments to be cached. + * @returns Promise + */ +export async function cacheComments( + comments: InterfaceComment[], +): Promise { + try { + // Create a pipeline for efficient Redis operations + const pipeline = CommentCache.pipeline(); + + comments.forEach((comment) => { + if (comment !== null) { + // Generate key for each comment based on its ID + const key = `comment:${comment._id}`; + + // Generate key for indexing comments by postId + const postID = `post_comments:${comment.postId}`; + + // Store comment data as JSON string in Redis + pipeline.set(key, JSON.stringify(comment)); + + // Index comment based on its postId + pipeline.hset(postID, key, "null"); + + // Set TTL for each comment and its postId index to 300 seconds (5 minutes) + pipeline.expire(key, 300); + pipeline.expire(postID, 300); + } + }); + + // Execute the pipeline for batch Redis operations + await pipeline.exec(); + } catch (error) { + // Log any errors that occur during caching + logger.info(error); + } +} diff --git a/src/services/CommentCache/deleteCommentFromCache.ts b/src/services/CommentCache/deleteCommentFromCache.ts new file mode 100644 index 0000000000..70b826270d --- /dev/null +++ b/src/services/CommentCache/deleteCommentFromCache.ts @@ -0,0 +1,18 @@ +import CommentCache from "../redisCache"; +import type { InterfaceComment } from "../../models"; + +/** + * Deletes the specified comment from Redis cache. + * + * @param comment - The InterfaceComment object representing the comment to delete. + * @returns A promise resolving to void. + */ +export async function deleteCommentFromCache( + comment: InterfaceComment, +): Promise { + // Generate the cache key for the comment based on its _id + const key = `comment:${comment._id}`; + + // Delete the comment from Redis cache + await CommentCache.del(key); +} diff --git a/src/services/CommentCache/findCommentsByPostIdInCache.ts b/src/services/CommentCache/findCommentsByPostIdInCache.ts new file mode 100644 index 0000000000..12478344ab --- /dev/null +++ b/src/services/CommentCache/findCommentsByPostIdInCache.ts @@ -0,0 +1,66 @@ +import CommentCache from "../redisCache"; +import type { InterfaceComment } from "../../models"; +import mongoose from "mongoose"; +import { logger } from "../../libraries"; + +export async function findCommentsByPostIdInCache( + postID: mongoose.Types.ObjectId, +): Promise<(InterfaceComment | null)[]> { + if (!postID) { + return [null]; + } + + // fetches the comment id for a particular post + const hashKey = `post_comments:${postID}`; + + const commentIDs = await CommentCache.hkeys(hashKey); + + if (commentIDs.length == 0) { + return []; + } + + // fetches the comment json data in the cache. + + const commentsFoundInCache = await CommentCache.mget(commentIDs); + + const comments = commentsFoundInCache.map((comment: string | null) => { + if (comment === null) { + return null; + } + + try { + const commentObj = JSON.parse(comment); + + // Note: While JSON parsing successfully restores the fields, including those with + // Mongoose Object IDs, these fields are returned as strings due to the serialization + // process. To ensure accurate data representation, we manually convert these string + // values back to their original Mongoose Object ID types before delivering them to + // the requesting resolver. + + return { + ...commentObj, + + _id: new mongoose.Types.ObjectId(commentObj._id), + + createdAt: new Date(commentObj.createdAt), + + creatorId: new mongoose.Types.ObjectId(commentObj.creatorId), + + updatedAt: new Date(commentObj.updatedAt), + + postId: new mongoose.Types.ObjectId(commentObj.postId), + + likedBy: + commentObj?.likedBy.length !== 0 + ? commentObj?.likedBy?.map((user: string) => { + return new mongoose.Types.ObjectId(user); + }) + : [], + }; + } catch (parseError) { + logger.info(`Error parsing JSON:${parseError}`); + } + }); + + return comments; +} diff --git a/src/services/CommentCache/findCommentsInCache.ts b/src/services/CommentCache/findCommentsInCache.ts new file mode 100644 index 0000000000..c41326beb6 --- /dev/null +++ b/src/services/CommentCache/findCommentsInCache.ts @@ -0,0 +1,59 @@ +import CommentCache from "../redisCache"; +import type { InterfaceComment } from "../../models"; +import mongoose from "mongoose"; +import { logger } from "../../libraries"; + +export async function findCommentsInCache( + ids: string[], +): Promise<(InterfaceComment | null)[]> { + if (ids.length === 0) { + return [null]; + } + + const keys: string[] = ids.map((id) => { + return `comment:${id}`; + }); + + const commentsFoundInCache = await CommentCache.mget(keys); + + const comments = commentsFoundInCache.map((comment) => { + if (comment === null) { + return null; + } + + try { + const commentObj = JSON.parse(comment); + + // Note: While JSON parsing successfully restores the fields, including those with + // Mongoose Object IDs, these fields are returned as strings due to the serialization + // process. To ensure accurate data representation, we manually convert these string + // values back to their original Mongoose Object ID types before delivering them to + // the requesting resolver. + + return { + ...commentObj, + + _id: new mongoose.Types.ObjectId(commentObj._id), + + createdAt: new Date(commentObj.createdAt), + + creatorId: new mongoose.Types.ObjectId(commentObj.creatorId), + + updatedAt: new Date(commentObj.updatedAt), + + postId: new mongoose.Types.ObjectId(commentObj.postId), + + likedBy: + commentObj?.likedBy.length !== 0 + ? commentObj?.likedBy?.map((user: string) => { + return new mongoose.Types.ObjectId(user); + }) + : [], + }; + } catch (parseError) { + logger.info(`Error parsing JSON:${parseError}`); + } + }); + + return comments; +} diff --git a/src/services/EventCache/cacheEvents.ts b/src/services/EventCache/cacheEvents.ts new file mode 100644 index 0000000000..a07b9e27d3 --- /dev/null +++ b/src/services/EventCache/cacheEvents.ts @@ -0,0 +1,34 @@ +import { logger } from "../../libraries"; +import type { InterfaceEvent } from "../../models"; +import EventCache from "../redisCache"; + +/** + * Stores events in Redis cache with a specified time-to-live (TTL). + * @param events - Array of events to be cached. + * @returns Promise + */ +export async function cacheEvents(events: InterfaceEvent[]): Promise { + try { + // Create a pipeline for efficient Redis operations + const pipeline = EventCache.pipeline(); + + events.forEach((event) => { + if (event !== null) { + // Generate key for each event based on its ID + const key = `event:${event._id}`; + + // Store event data as JSON string in Redis + pipeline.set(key, JSON.stringify(event)); + + // Set TTL for each event to 300 seconds (5 minutes) + pipeline.expire(key, 300); + } + }); + + // Execute the pipeline for batch Redis operations + await pipeline.exec(); + } catch (error) { + // Log any errors that occur during caching + logger.info(error); + } +} diff --git a/src/services/EventCache/deleteEventFromCache.ts b/src/services/EventCache/deleteEventFromCache.ts new file mode 100644 index 0000000000..f3e283a7a9 --- /dev/null +++ b/src/services/EventCache/deleteEventFromCache.ts @@ -0,0 +1,18 @@ +import EventCache from "../redisCache"; +import type { Types } from "mongoose"; + +/** + * Deletes the specified event from Redis cache. + * + * @param eventId - The ObjectId representing the event to delete from cache. + * @returns A promise resolving to void. + */ +export async function deleteEventFromCache( + eventId: Types.ObjectId, +): Promise { + // Generate the cache key for the event based on its eventId + const key = `event:${eventId}`; + + // Delete the event from Redis cache + await EventCache.del(key); +} diff --git a/src/services/EventCache/findEventInCache.ts b/src/services/EventCache/findEventInCache.ts new file mode 100644 index 0000000000..bfe942c89e --- /dev/null +++ b/src/services/EventCache/findEventInCache.ts @@ -0,0 +1,69 @@ +import EventCache from "../redisCache"; +import type { InterfaceEvent } from "../../models"; +import mongoose from "mongoose"; +import { logger } from "../../libraries"; + +export async function findEventsInCache( + ids: string[], +): Promise<(InterfaceEvent | null)[]> { + if (ids.length === 0) { + return [null]; + } + + const keys: string[] = ids.map((id) => { + return `event:${id}`; + }); + + const eventsFoundInCache = await EventCache.mget(keys); + + const events = eventsFoundInCache.map((event) => { + if (event === null) { + return null; + } + + try { + const eventObj = JSON.parse(event); + + // Note: While JSON parsing successfully restores the fields, including those with + // Mongoose Object IDs, these fields are returned as strings due to the serialization + // process. To ensure accurate data representation, we manually convert these string + // values back to their original Mongoose Object ID types before delivering them to + // the requesting resolver. + + return { + ...eventObj, + + _id: new mongoose.Types.ObjectId(eventObj._id), + + admins: + eventObj?.admins?.length !== 0 + ? eventObj?.admins?.map((admin: string) => { + return new mongoose.Types.ObjectId(admin); + }) + : [], + + organization: new mongoose.Types.ObjectId(eventObj.organization), + + startDate: new Date(eventObj.startDate), + + ...(eventObj?.endDate ? { endDate: new Date(eventObj.endDate) } : {}), // Conditional removal of endDate field + + ...(eventObj?.startTime + ? { startTime: new Date(eventObj.startTime) } + : {}), // Conditional removal of startTime field + + ...(eventObj?.endTime ? { endTime: new Date(eventObj.endTime) } : {}), // Conditional removal of endTime field + + creatorId: new mongoose.Types.ObjectId(eventObj.creatorId), + + createdAt: new Date(eventObj.createdAt), + + updatedAt: new Date(eventObj.updatedAt), + }; + } catch (parseError) { + logger.info(`Error parsing JSON:${parseError}`); + } + }); + + return events; +} diff --git a/src/services/OrganizationCache/cacheOrganizations.ts b/src/services/OrganizationCache/cacheOrganizations.ts new file mode 100644 index 0000000000..6614e98f92 --- /dev/null +++ b/src/services/OrganizationCache/cacheOrganizations.ts @@ -0,0 +1,36 @@ +import { logger } from "../../libraries"; +import type { InterfaceOrganization } from "../../models"; +import OrganizationCache from "../redisCache"; + +/** + * Stores organizations in Redis cache with a specified time-to-live (TTL). + * @param organizations - Array of organizations to be cached. + * @returns Promise + */ +export async function cacheOrganizations( + organizations: InterfaceOrganization[], +): Promise { + try { + // Create a pipeline for efficient Redis operations + const pipeline = OrganizationCache.pipeline(); + + organizations.forEach((org) => { + if (org !== null) { + // Generate key for each organization based on its ID + const key = `organization:${org._id}`; + + // Store organization data as JSON string in Redis + pipeline.set(key, JSON.stringify(org)); + + // Set TTL for each organization to 300 seconds (5 minutes) + pipeline.expire(key, 300); + } + }); + + // Execute the pipeline for batch Redis operations + await pipeline.exec(); + } catch (error) { + // Log any errors that occur during caching + logger.info(error); + } +} diff --git a/src/services/OrganizationCache/deleteOrganizationFromCache.ts b/src/services/OrganizationCache/deleteOrganizationFromCache.ts new file mode 100644 index 0000000000..f760a778e0 --- /dev/null +++ b/src/services/OrganizationCache/deleteOrganizationFromCache.ts @@ -0,0 +1,18 @@ +import OrganizationCache from "../redisCache"; +import type { InterfaceOrganization } from "../../models"; + +/** + * Deletes the specified organization from Redis cache. + * + * @param organization - The InterfaceOrganization object representing the organization to delete. + * @returns A promise resolving to void. + */ +export async function deleteOrganizationFromCache( + organization: InterfaceOrganization, +): Promise { + // Generate the cache key for the organization based on its _id + const key = `organization:${organization._id}`; + + // Delete the organization from Redis cache + await OrganizationCache.del(key); +} diff --git a/src/services/OrganizationCache/findOrganizationsInCache.ts b/src/services/OrganizationCache/findOrganizationsInCache.ts new file mode 100644 index 0000000000..de1837ba04 --- /dev/null +++ b/src/services/OrganizationCache/findOrganizationsInCache.ts @@ -0,0 +1,98 @@ +import OrganizationCache from "../redisCache"; +import type { InterfaceOrganization } from "../../models"; +import mongoose from "mongoose"; +import { logger } from "../../libraries"; + +export async function findOrganizationsInCache( + ids: string[], +): Promise<(InterfaceOrganization | null)[]> { + if (ids.length === 0) { + return [null]; + } + + const keys: string[] = ids.map((id) => { + return `organization:${id}`; + }); + + const organizationFoundInCache = await OrganizationCache.mget(keys); + + const organizations = organizationFoundInCache.map((org: string | null) => { + if (org === null) { + return null; + } + + try { + const organization = JSON.parse(org); + + // Note: While JSON parsing successfully restores the fields, including those with + // Mongoose Object IDs, these fields are returned as strings due to the serialization + // process. To ensure accurate data representation, we manually convert these string + // values back to their original Mongoose Object ID types before delivering them to + // the requesting resolver. + + return { + ...organization, + + createdAt: new Date(organization.createdAt), + + _id: new mongoose.Types.ObjectId(organization._id), + + admins: organization?.admins?.map((admin: string) => { + return new mongoose.Types.ObjectId(admin); + }), + + members: + organization.members.length !== 0 + ? organization.members?.map((member: string) => { + return new mongoose.Types.ObjectId(member); + }) + : [], + + creatorId: new mongoose.Types.ObjectId(organization.creatorId), + + updatedAt: new Date(organization.updatedAt), + + groupChats: + organization.groupChats.length !== 0 + ? organization.groupChat.map((groupChat: string) => { + return new mongoose.Types.ObjectId(groupChat); + }) + : [], + + posts: + organization.posts.length !== 0 + ? organization.posts?.map((post: string) => { + return new mongoose.Types.ObjectId(post); + }) + : [], + + pinnedPosts: + organization.pinnedPosts.length !== 0 + ? organization.pinnedPosts?.map((pinnedPost: string) => { + return new mongoose.Types.ObjectId(pinnedPost); + }) + : [], + + membershipRequests: + organization.membershipRequests.length !== 0 + ? organization.membershipRequests.map( + (membershipRequest: string) => { + return new mongoose.Types.ObjectId(membershipRequest); + }, + ) + : [], + + blockedUsers: + organization.blockedUsers.length !== 0 + ? organization.blockedUsers.map((blockedUser: string) => { + return new mongoose.Types.ObjectId(blockedUser); + }) + : [], + }; + } catch (parseError) { + logger.info(`Error parsing JSON:${parseError}`); + } + }); + + return organizations; +} diff --git a/src/services/PostCache/cachePosts.ts b/src/services/PostCache/cachePosts.ts new file mode 100644 index 0000000000..0a703a1912 --- /dev/null +++ b/src/services/PostCache/cachePosts.ts @@ -0,0 +1,36 @@ +import { logger } from "../../libraries"; +import type { InterfacePost } from "../../models"; +import PostCache from "../redisCache"; + +/** + * Caches the provided array of InterfacePost objects in Redis. + * + * @param posts - An array of InterfacePost objects to be cached. + * @returns A promise resolving to void. + */ +export async function cachePosts(posts: InterfacePost[]): Promise { + try { + // Create a Redis pipeline for efficient multi-command execution + const pipeline = PostCache.pipeline(); + + // Iterate through each post in the array + posts.forEach((post) => { + if (post !== null) { + // Generate the cache key for each post + const key = `post:${post._id}`; + + // Store the post object as a JSON string in Redis + pipeline.set(key, JSON.stringify(post)); + + // Set an expiration time for the cache key (in seconds) + pipeline.expire(key, 300); // 300 seconds (5 minutes) expiration + } + }); + + // Execute the Redis pipeline + await pipeline.exec(); + } catch (error) { + // Log any errors that occur during caching + logger.info(error); + } +} diff --git a/src/services/PostCache/deletePostFromCache.ts b/src/services/PostCache/deletePostFromCache.ts new file mode 100644 index 0000000000..aa0d80a9cf --- /dev/null +++ b/src/services/PostCache/deletePostFromCache.ts @@ -0,0 +1,14 @@ +import PostCache from "../redisCache"; + +/** + * Deletes a post from Redis cache based on its postId. + * @param postId - The unique identifier of the post to delete. + * @returns Promise + */ +export async function deletePostFromCache(postId: string): Promise { + // Construct the cache key for the specified postId + const key = `post:${postId}`; + + // Delete the post from Redis cache + await PostCache.del(key); +} diff --git a/src/services/PostCache/findPostsInCache.ts b/src/services/PostCache/findPostsInCache.ts new file mode 100644 index 0000000000..1ac6944285 --- /dev/null +++ b/src/services/PostCache/findPostsInCache.ts @@ -0,0 +1,63 @@ +import PostCache from "../redisCache"; +import type { InterfacePost } from "../../models"; +import mongoose from "mongoose"; +import { logger } from "../../libraries"; + +export async function findPostsInCache( + ids: string[], +): Promise<(InterfacePost | null)[]> { + if (ids.length === 0) { + return [null]; + } + + const keys: string[] = ids.map((id) => { + return `post:${id}`; + }); + + const postsFoundInCache = await PostCache.mget(keys); + + const posts = postsFoundInCache.map((post) => { + if (post === null) { + return null; + } + + try { + const postObj = JSON.parse(post); + + // Note: While JSON parsing successfully restores the fields, including those with + // Mongoose Object IDs, these fields are returned as strings due to the serialization + // process. To ensure accurate data representation, we manually convert these string + // values back to their original Mongoose Object ID types before delivering them to + // the requesting resolver. + + return { + ...postObj, + + _id: new mongoose.Types.ObjectId(postObj._id), + + createdAt: new Date(postObj.createdAt), + + organization: new mongoose.Types.ObjectId(postObj.organization), + + likeCount: Number(postObj.likeCount), + + commentCount: Number(postObj.commentCount), + + likedBy: + postObj?.likedBy.length !== 0 + ? postObj?.likedBy?.map((user: string) => { + return new mongoose.Types.ObjectId(user); + }) + : [], + + creatorId: new mongoose.Types.ObjectId(postObj.creatorId), + + updatedAt: new Date(postObj.updatedAt), + }; + } catch (parseError) { + logger.info(`Error parsing JSON:${parseError}`); + } + }); + + return posts; +} diff --git a/src/services/UserCache/cacheUser.ts b/src/services/UserCache/cacheUser.ts new file mode 100644 index 0000000000..142420aa9e --- /dev/null +++ b/src/services/UserCache/cacheUser.ts @@ -0,0 +1,36 @@ +import { logger } from "../../libraries"; +import type { InterfaceUser } from "../../models"; +import UserCache from "../redisCache"; + +/** + * Caches the provided array of InterfaceUser objects in Redis. + * + * @param users - An array of InterfaceUser objects to be cached. + * @returns A promise resolving to void. + */ +export async function cacheUsers(users: InterfaceUser[]): Promise { + try { + // Create a Redis pipeline for efficient multi-command execution + const pipeline = UserCache.pipeline(); + + // Iterate through each user in the array + users.forEach((user) => { + if (user !== null) { + // Generate the cache key for each user + const key = `user:${user._id}`; + + // Store the user object as a JSON string in Redis + pipeline.set(key, JSON.stringify(user)); + + // Set an expiration time for the cache key (in seconds) + pipeline.expire(key, 300); // 300 seconds (5 minutes) expiration + } + }); + + // Execute the Redis pipeline + await pipeline.exec(); + } catch (error) { + // Log any errors that occur during caching + logger.info(error); + } +} diff --git a/src/services/UserCache/deleteUserFromCache.ts b/src/services/UserCache/deleteUserFromCache.ts new file mode 100644 index 0000000000..f451fd759d --- /dev/null +++ b/src/services/UserCache/deleteUserFromCache.ts @@ -0,0 +1,9 @@ +import UserCache from "../redisCache"; + +export async function deleteUserFromCache(userId: string): Promise { + // Construct the key for the user in the cache + const key = `user:${userId}`; + + // Delete the user entry from the Redis cache + await UserCache.del(key); +} diff --git a/src/services/UserCache/findUserInCache.ts b/src/services/UserCache/findUserInCache.ts new file mode 100644 index 0000000000..39a95438cb --- /dev/null +++ b/src/services/UserCache/findUserInCache.ts @@ -0,0 +1,73 @@ +import { Types } from "mongoose"; +import { logger } from "../../libraries"; +import type { InterfaceUser } from "../../models"; +import UserCache from "../redisCache"; + +/** + * Retrieves user data from cache based on provided IDs. + * + * @param ids - An array of user IDs to retrieve from cache. + * @returns A promise resolving to an array of InterfaceUser objects or null if not found in cache. + */ +export async function findUserInCache( + ids: string[], +): Promise<(InterfaceUser | null)[]> { + // If no IDs are provided, return an array with null + if (ids.length === 0) { + return [null]; + } + + // Generate cache keys for each ID + const keys: string[] = ids.map((id) => { + return `user:${id}`; + }); + + // Retrieve user data from cache + const userFoundInCache = await UserCache.mget(keys); + + // Parse cached JSON data into InterfaceUser objects + const users = userFoundInCache.map((user: string | null) => { + if (user === null) { + return null; + } + try { + const parsedUser = JSON.parse(user); + + // Convert specific fields to Types.ObjectId for Mongoose compatibility + return { + ...parsedUser, + _id: new Types.ObjectId(parsedUser._id), + appUserProfileId: new Types.ObjectId(parsedUser.appUserProfileId), + joinedOrganizations: + parsedUser.joinedOrganizations.length !== 0 + ? parsedUser.joinedOrganizations.map((org: string) => { + return new Types.ObjectId(org); + }) + : [], + membershipRequests: + parsedUser.membershipRequests.length !== 0 + ? parsedUser.membershipRequests.map((request: string) => { + return new Types.ObjectId(request); + }) + : [], + organizationsBlockedBy: + parsedUser.organizationsBlockedBy.length !== 0 + ? parsedUser.organizationsBlockedBy.map((org: string) => { + return new Types.ObjectId(org); + }) + : [], + registeredEvents: + parsedUser.registeredEvents.length !== 0 + ? parsedUser.registeredEvents.map((event: string) => { + return new Types.ObjectId(event); + }) + : [], + }; + } catch (error) { + // Log error if parsing fails + logger.info(`Error parsing user from cache: ${error}`); + } + }); + + return users; +} diff --git a/src/services/redisCache.ts b/src/services/redisCache.ts new file mode 100644 index 0000000000..8b8ad4a7f0 --- /dev/null +++ b/src/services/redisCache.ts @@ -0,0 +1,20 @@ +import { Redis } from "ioredis"; +import { REDIS_HOST, REDIS_PASSWORD, REDIS_PORT } from "../constants"; + +// Create a new Redis instance +const RedisCache = new Redis({ + host: REDIS_HOST, + port: REDIS_PORT || 6379, + password: REDIS_PASSWORD, +}); + +// Configure Redis settings if no password is set +if (!REDIS_PASSWORD) { + // Set the maximum memory limit of the cache to 100MB + RedisCache.config("SET", "maxmemory", 100 * 1024 * 1024); + + // Set the eviction policy to "Least Frequently Used, evicted first" algorithm + RedisCache.config("SET", "maxmemory-policy", "allkeys-lfu"); +} + +export default RedisCache; diff --git a/src/setup/MongoDB.ts b/src/setup/MongoDB.ts new file mode 100644 index 0000000000..1746a61145 --- /dev/null +++ b/src/setup/MongoDB.ts @@ -0,0 +1,84 @@ +import inquirer from "inquirer"; +import { MongoClient } from "mongodb"; + +/** + * The `checkExistingMongoDB` function checks for an existing MongoDB URL in the environment variables and attempts to establish a connection. + * + * It performs the following steps: + * 1. Retrieves the MongoDB URL from the environment variables. + * 2. If no URL is found, it immediately returns null. + * 3. If a URL is found, it attempts to establish a connection using the `checkConnection` function. + * - If the connection is successful (i.e., `checkConnection` returns true), it returns the URL. + * - If the connection fails (i.e., `checkConnection` returns false), it returns null. + * + * This function is used during the initial setup process to check if a valid MongoDB connection can be made with the existing URL in the environment variables. + * @returns A promise that resolves to a string (if a connection could be made to the existing URL) or null (if no existing URL or connection could not be made). + */ +export async function checkExistingMongoDB(): Promise { + const existingMongoDbUrls = process.env.MONGO_DB_URL; + + if (!existingMongoDbUrls) { + return null; + } + const isConnected = await checkConnection(existingMongoDbUrls); + if (isConnected) { + return existingMongoDbUrls; + } else return null; +} + +// Check the connection to MongoDB with the specified URL. +/** + * The `checkConnection` function attempts to establish a connection to a MongoDB instance using a provided URL. + * + * @param url - The MongoDB connection URL. + * @returns A promise that resolves to a boolean indicating whether the connection was successful (true) or not (false). + * + * It performs the following steps: + * 1. Tries to establish a connection to the MongoDB instance using the provided URL with a server selection timeout of 1000 milliseconds. + * 2. If the connection is successful, it closes the connection and returns true. + * 3. If the connection fails, it logs an error message and returns false. + * - If the error is an instance of the Error class, it logs the error message. + * - If the error is not an instance of the Error class, it logs a generic error message and the error itself. + * + * This function is used during the initial setup process to test the MongoDB connection. + */ +export async function checkConnection(url: string): Promise { + console.log("\nChecking MongoDB connection...."); + + try { + const connection = await MongoClient.connect(url, { + serverSelectionTimeoutMS: 1000, + }); + await connection.close(); + return true; + } catch (error) { + if (error instanceof Error) { + console.log( + `\nConnection to MongoDB failed with error: ${error.message}\n`, + ); + } else { + console.log(`\nConnection to MongoDB failed. Please try again.\n`); + console.log(error); + } + return false; + } +} + +//Mongodb url prompt +/** + * The function `askForMongoDBUrl` prompts the user to enter a MongoDB URL and returns the entered URL + * as a string. + * @returns a Promise that resolves to a string. + */ +export async function askForMongoDBUrl(): Promise { + const { url } = await inquirer.prompt([ + { + type: "input", + name: "url", + message: "Enter your MongoDB URL:", + default: "mongodb://localhost:27017", + }, + ]); + + return url; +} diff --git a/src/setup/askToKeepValues.ts b/src/setup/askToKeepValues.ts new file mode 100644 index 0000000000..4381ed5b9b --- /dev/null +++ b/src/setup/askToKeepValues.ts @@ -0,0 +1,16 @@ +import inquirer from "inquirer"; +/** + * Function to ask if the user wants to keep the entered values + * The function `askToKeepValues` prompts the user with a confirmation message and returns a boolean + * indicating whether the user wants to keep the entered key. + * @returns a boolean value, either true or false. + */ +export async function askToKeepValues(): Promise { + const { keepValues } = await inquirer.prompt({ + type: "confirm", + name: "keepValues", + message: `Would you like to keep the entered key? `, + default: true, + }); + return keepValues; +} diff --git a/src/setup/getMinioBinaryUrl.ts b/src/setup/getMinioBinaryUrl.ts new file mode 100644 index 0000000000..08f05c9a06 --- /dev/null +++ b/src/setup/getMinioBinaryUrl.ts @@ -0,0 +1,27 @@ +import * as os from "os"; + +const platform = os.platform(); + +/** + * Constructs the URL to download the MinIO binary for the current platform. + * + * @returns The URL of the MinIO binary for the current platform. + * @throws Error If the platform is unsupported. + */ +export const getMinioBinaryUrl = (): string => { + let platformPath: string; + switch (platform) { + case "win32": + platformPath = "windows-amd64/minio.exe"; + break; + case "darwin": + platformPath = "darwin-amd64/minio"; + break; + case "linux": + platformPath = "linux-amd64/minio"; + break; + default: + throw new Error(`Unsupported platform: ${platform}`); + } + return `https://dl.min.io/server/minio/release/${platformPath}`; +}; diff --git a/src/setup/getNodeEnvironment.ts b/src/setup/getNodeEnvironment.ts new file mode 100644 index 0000000000..fd8fb48c3a --- /dev/null +++ b/src/setup/getNodeEnvironment.ts @@ -0,0 +1,21 @@ +import inquirer from "inquirer"; + +/** + * Get the node environment + * The function `getNodeEnvironment` is an asynchronous function that prompts the user to select a Node + * environment (either "development" or "production") and returns the selected environment as a string. + * @returns a Promise that resolves to a string representing the selected Node environment. + */ +export async function getNodeEnvironment(): Promise { + const { nodeEnv } = await inquirer.prompt([ + { + type: "list", + name: "nodeEnv", + message: "Select Node environment:", + choices: ["development", "production"], + default: "development", + }, + ]); + + return nodeEnv; +} diff --git a/src/setup/installMinio.ts b/src/setup/installMinio.ts new file mode 100644 index 0000000000..1cfedffd8e --- /dev/null +++ b/src/setup/installMinio.ts @@ -0,0 +1,70 @@ +import * as os from "os"; +import * as fs from "fs"; +import * as path from "path"; +import * as https from "https"; +import * as dotenv from "dotenv"; +import { setPathEnvVar } from "./setPathEnvVar"; +import { getMinioBinaryUrl } from "./getMinioBinaryUrl"; + +dotenv.config(); + +const platform = os.platform(); + +/** + * Installs MinIO by downloading the binary, saving it to a local directory, and setting appropriate permissions. + * + * @returns A promise that resolves with the path to the installed MinIO binary. + * @throws Error If the download or installation fails. + */ +export const installMinio = (): Promise => { + return new Promise((resolve, reject) => { + const installDir = path.join(os.homedir(), ".minio"); + + if (!fs.existsSync(installDir)) { + try { + fs.mkdirSync(installDir, { recursive: true }); + } catch (err: unknown) { + if (err instanceof Error) { + return reject( + new Error( + `Failed to create directory ${installDir}: ${err.message}`, + ), + ); + } + } + } + const minioPath = path.join( + installDir, + `minio${platform === "win32" ? ".exe" : ""}`, + ); + + const file = fs.createWriteStream(minioPath); + + https + .get(getMinioBinaryUrl(), (response) => { + response.pipe(file); + file.on("finish", () => { + file.close(() => { + try { + fs.chmodSync(minioPath, 0o755); + setPathEnvVar(installDir); + } catch (err: unknown) { + if (err instanceof Error) { + return reject( + new Error( + `Failed to set permissions or PATH environment variable: ${err.message}`, + ), + ); + } + } + + resolve(minioPath); + }); + }); + }) + .on("error", (err) => { + fs.unlinkSync(minioPath); + reject(new Error(`Failed to download Minio binary: ${err.message}`)); + }); + }); +}; diff --git a/src/setup/isMinioInstalled.ts b/src/setup/isMinioInstalled.ts new file mode 100644 index 0000000000..7c2ac411f3 --- /dev/null +++ b/src/setup/isMinioInstalled.ts @@ -0,0 +1,35 @@ +import * as os from "os"; +import * as fs from "fs"; +import * as path from "path"; +import { execSync } from "child_process"; +import { setPathEnvVar } from "./setPathEnvVar"; + +const platform = os.platform(); + +/** + * Checks if MinIO is installed either via the command line or by checking the existence of the MinIO binary. + * If installed, it sets the PATH environment variable. + * + * @returns A boolean indicating whether MinIO is installed. + */ +export const isMinioInstalled = (): boolean => { + const installDir = path.join(os.homedir(), ".minio"); + const minioPath = path.join( + installDir, + `minio${platform === "win32" ? ".exe" : ""}`, + ); + + try { + execSync("minio --version", { stdio: "ignore" }); + setPathEnvVar(installDir); + return true; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + } catch (err) { + if (fs.existsSync(minioPath)) { + setPathEnvVar(installDir); + return true; + } + } + + return false; +}; diff --git a/src/setup/isValidEmail.ts b/src/setup/isValidEmail.ts new file mode 100644 index 0000000000..7028d52fe5 --- /dev/null +++ b/src/setup/isValidEmail.ts @@ -0,0 +1,11 @@ +/** + * The function `isValidEmail` checks if a given email address is valid according to a specific pattern. + * @param email - The `email` parameter is a string that represents an email address. + * @returns a boolean value. It returns true if the email passed as an argument matches the specified + * pattern, and false otherwise. + */ +export function isValidEmail(email: string): boolean { + const pattern = /^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$/; + const match = email.match(pattern); + return match !== null && match[0] === email; +} diff --git a/src/setup/reCaptcha.ts b/src/setup/reCaptcha.ts new file mode 100644 index 0000000000..fb7ead8e03 --- /dev/null +++ b/src/setup/reCaptcha.ts @@ -0,0 +1,10 @@ +/** + * The function validates whether a given string matches the pattern of a reCAPTCHA token. + * @param string - The `string` parameter represents the input string that needs to be + * validated. In this case, it is expected to be a string containing a Recaptcha response token. + * @returns a boolean value. + */ +export function validateRecaptcha(string: string): boolean { + const pattern = /^[a-zA-Z0-9_-]{40}$/; + return pattern.test(string); +} diff --git a/src/setup/redisConfiguration.ts b/src/setup/redisConfiguration.ts new file mode 100644 index 0000000000..2983301d3f --- /dev/null +++ b/src/setup/redisConfiguration.ts @@ -0,0 +1,86 @@ +import inquirer from "inquirer"; +import * as redis from "redis"; + +// Check connection to Redis with the specified URL. +/** + * The function `checkRedisConnection` checks if a connection to Redis can be established using the + * provided URL. + * @param url - The `url` parameter is a string that represents the URL of the Redis server. + * It is used to establish a connection to the Redis server. + * @returns a Promise that resolves to a boolean value. + */ +export async function checkRedisConnection(url: string): Promise { + let response = false; + const client = redis.createClient({ url }); + + console.log("\nChecking Redis connection...."); + + try { + await client.connect(); + response = true; + } catch (error) { + console.log(`\nConnection to Redis failed. Please try again.\n`); + } finally { + client.quit(); + } + return response; +} + +// Redis url prompt +/** + * The function `askForRedisUrl` prompts the user to enter the Redis hostname, port, and password, and + * returns an object with these values. + * @returns The function `askForRedisUrl` returns a promise that resolves to an object with the + * properties `host`, `port`, and `password`. + */ +export async function askForRedisUrl(): Promise<{ + host: string; + port: number; + password: string; +}> { + const { host, port, password } = await inquirer.prompt([ + { + type: "input", + name: "host", + message: "Enter Redis hostname (default: localhost):", + default: "localhost", + }, + { + type: "input", + name: "port", + message: "Enter Redis port (default: 6379):", + default: 6379, + }, + { + type: "password", + name: "password", + message: + "Enter Redis password (optional : Leave empty for local connections) :", + }, + ]); + + return { host, port, password }; +} + +//check existing redis url +/** + * The function `checkExistingRedis` checks if there is an existing Redis connection by iterating + * through a list of Redis URLs and testing the connection. + * @returns The function `checkExistingRedis` returns a Promise that resolves to a string or null. + */ +export async function checkExistingRedis(): Promise { + const existingRedisURL = ["redis://localhost:6379"]; + + for (const url of existingRedisURL) { + if (!url) { + continue; + } + + const isConnected = await checkRedisConnection(url); + if (isConnected) { + return url; + } + } + + return null; +} diff --git a/src/setup/setImageUploadSize.ts b/src/setup/setImageUploadSize.ts new file mode 100644 index 0000000000..10c5863d26 --- /dev/null +++ b/src/setup/setImageUploadSize.ts @@ -0,0 +1,39 @@ +import dotenv from "dotenv"; +import fs from "fs"; +import { MAXIMUM_IMAGE_SIZE_LIMIT_KB } from "../constants"; + +/** + * The function `setImageUploadSize` sets the image upload size environment variable and changes the .env file + * @returns The function `checkExistingRedis` returns a void Promise. + */ +export async function setImageUploadSize(size: number): Promise { + if (size > MAXIMUM_IMAGE_SIZE_LIMIT_KB) { + size = MAXIMUM_IMAGE_SIZE_LIMIT_KB; + } + if (process.env.NODE_ENV === "test") { + const config = dotenv.parse(fs.readFileSync(".env_test")); + config.IMAGE_SIZE_LIMIT_KB = size.toString(); + fs.writeFileSync(".env_test", ""); + for (const key in config) { + fs.appendFileSync(".env_test", `${key}=${config[key]}\n`); + } + } else { + const config = dotenv.parse(fs.readFileSync(".env")); + + config.IMAGE_SIZE_LIMIT_KB = size.toString(); + fs.writeFileSync(".env", ""); + for (const key in config) { + fs.appendFileSync(".env", `${key}=${config[key]}\n`); + } + } +} + +/** + * The function validates whether a given image size is less than 20 and greater than 0. + * @param string - The `number` parameter represents the input size of the string + * validated. In this case, it is expected to be a number less than 20 and greater than 0. + * @returns a boolean value. + */ +export function validateImageFileSize(size: number): boolean { + return size > 0; +} diff --git a/src/setup/setPathEnvVar.ts b/src/setup/setPathEnvVar.ts new file mode 100644 index 0000000000..7d88fd4573 --- /dev/null +++ b/src/setup/setPathEnvVar.ts @@ -0,0 +1,44 @@ +// pathUtils.ts +import * as os from "os"; +import { execSync, spawnSync } from "child_process"; + +const platform = os.platform(); + +/** + * Sets the PATH environment variable to include the directory where MinIO is installed. + * + * This function modifies the PATH environment variable to include the specified installation directory. + * It handles different platforms: + * - On Windows, it uses `setx` to update the system PATH variable. + * - On Unix-based systems (macOS and Linux), it appends the directory to the PATH in the current shell session + * and writes the update to the shell configuration file (`~/.bashrc` for Linux, `~/.zshrc` for macOS). + * + * **Assumption:** + * This function assumes that the shell configuration file (`.bashrc` or `.zshrc`) already exists. In most typical + * development environments, these files are present. If the file does not exist, users may need to create it manually + * to ensure the PATH update is applied in future shell sessions. + * + * @param installDir - The directory where MinIO is installed. + * @throws Error If updating the PATH environment variable fails. + */ +export const setPathEnvVar = (installDir: string): void => { + try { + if (platform === "win32") { + const pathEnvVar = `${process.env.PATH};${installDir}`; + spawnSync("setx", ["PATH", pathEnvVar], { + shell: true, + stdio: "inherit", + }); + } else { + process.env.PATH = `${process.env.PATH}:${installDir}`; + const shellConfigFile = platform === "darwin" ? "~/.zshrc" : "~/.bashrc"; + execSync(`echo 'export PATH=$PATH:${installDir}' >> ${shellConfigFile}`); + } + } catch (err: unknown) { + console.log(err); + if (err instanceof Error) + throw new Error( + `Failed to set PATH environment variable: ${err.message}`, + ); + } +}; diff --git a/src/setup/superAdmin.ts b/src/setup/superAdmin.ts new file mode 100644 index 0000000000..aeef732b1f --- /dev/null +++ b/src/setup/superAdmin.ts @@ -0,0 +1,26 @@ +/* eslint-disable @typescript-eslint/explicit-function-return-type */ +import inquirer from "inquirer"; +import { isValidEmail } from "./isValidEmail"; + +/** + * LAST_RESORT_SUPERADMIN_EMAIL prompt + * The function `askForSuperAdminEmail` asks the user to enter an email address and returns it as a promise. + * @returns The email entered by the user is being returned. + */ +export async function askForSuperAdminEmail(): Promise { + console.log( + "\nPlease make sure to register with this email before logging in.\n", + ); + const { email } = await inquirer.prompt([ + { + type: "input", + name: "email", + message: + "Enter the email which you wish to assign as the Super Admin of last resort :", + validate: (input: string) => + isValidEmail(input) || "Invalid email. Please try again.", + }, + ]); + + return email; +} diff --git a/src/setup/updateEnvVariable.ts b/src/setup/updateEnvVariable.ts new file mode 100644 index 0000000000..65e3cf3f0c --- /dev/null +++ b/src/setup/updateEnvVariable.ts @@ -0,0 +1,31 @@ +import fs from "fs"; + +// Update the value of an environment variable in .env file +/** + * The function `updateEnvVariable` updates the values of environment variables in a .env file based on the provided + * configuration object. + * @param config - An object that contains key-value pairs where the keys are strings and the values + * can be either strings or numbers. These key-value pairs represent the environment variables that + * need to be updated. + */ +export function updateEnvVariable(config: { + [key: string]: string | number; +}): void { + if (process.env.NODE_ENV === "test") { + const existingContent: string = fs.readFileSync(".env_test", "utf8"); + let updatedContent: string = existingContent; + for (const key in config) { + const regex = new RegExp(`^${key}=.*`, "gm"); + updatedContent = updatedContent.replace(regex, `${key}=${config[key]}`); + } + fs.writeFileSync(".env_test", updatedContent, "utf8"); + } else { + const existingContent: string = fs.readFileSync(".env", "utf8"); + let updatedContent: string = existingContent; + for (const key in config) { + const regex = new RegExp(`^${key}=.*`, "gm"); + updatedContent = updatedContent.replace(regex, `${key}=${config[key]}`); + } + fs.writeFileSync(".env", updatedContent, "utf8"); + } +} diff --git a/src/setup/updateIgnoreFile.ts b/src/setup/updateIgnoreFile.ts new file mode 100644 index 0000000000..944e5ac1e5 --- /dev/null +++ b/src/setup/updateIgnoreFile.ts @@ -0,0 +1,64 @@ +import * as fs from "fs"; +import path from "path"; + +/** + * Updates the specified ignore file by adding an ignore pattern for a given directory. + * + * This function ensures that the directory to be ignored is relative to the project root. + * It reads the current content of the ignore file, removes any existing entries for the MinIO data directory, + * and appends a new entry if it does not already exist. + * + * @param filePath - The path to the ignore file to be updated. + * @param directoryToIgnore - The directory path that should be ignored, relative to the project root. + * + * @returns void + * + * @remarks + * If the directory is outside the project root, the function will return early without making changes. + * No logging is performed for cases where the ignore pattern already exists in the file, as this is expected behavior. + */ +export const updateIgnoreFile = ( + filePath: string, + directoryToIgnore: string, +): void => { + const projectRoot = process.cwd(); + const relativePath = path.relative(projectRoot, directoryToIgnore); + const ignorePattern = relativePath + "/**"; + + const isInsideProjectRoot = + !relativePath.startsWith("..") && !path.isAbsolute(relativePath); + + // If the directory is outside the project root, simply return without doing anything. + if (!isInsideProjectRoot) { + return; + } + + let content = ""; + + if (fs.existsSync(filePath)) { + content = fs.readFileSync(filePath, "utf8"); + } + + // If the ignorePattern already exists in the content, return early. + // There's no need to modify the file if the pattern is already present, as it's redundant to add the same pattern again. + // No log is necessary here because this is a normal, expected case where no changes are needed. + if (content.includes(ignorePattern)) { + return; + } + + /** + * This regex looks for: + * 1. A line starting with "# MinIO data directory" followed by a newline (\\n). + * 2. Any path (one or more non-newline characters [^\\n]+) followed by "/**" (escaped as \/ and \*). + * 3. It matches the entire pattern up to the next newline (\\n), allowing us to remove the MinIO data entry. + */ + const ignorePatternRegex = /# MinIO data directory\n[^\n]+\/\*\*\n/g; + + content = content.replace(ignorePatternRegex, ""); + + if (!content.includes(ignorePattern)) { + content += `\n# MinIO data directory\n${ignorePattern}\n`; + fs.writeFileSync(filePath, content); + console.log(`Updated ${filePath} with MinIO data directory.`); + } +}; diff --git a/src/setup/verifySmtpConnection.ts b/src/setup/verifySmtpConnection.ts new file mode 100644 index 0000000000..3ca577bec7 --- /dev/null +++ b/src/setup/verifySmtpConnection.ts @@ -0,0 +1,41 @@ +import nodemailer from "nodemailer"; + +type VerifySmtpConnectionReturnType = { + success: boolean; + error: unknown; +}; + +/** + * The function `verifySmtpConnection` verifies the SMTP connection using the provided configuration + * and returns a success status and error message if applicable. + * @param config - The `config` parameter is an object that contains the configuration settings for the + * SMTP connection. It should have the following properties: + * @returns The function `verifySmtpConnection` returns a Promise that resolves to an object of type + * `VerifySmtpConnectionReturnType`. The `VerifySmtpConnectionReturnType` object has two properties: + * `success` and `error`. If the SMTP connection is verified successfully, the `success` property will + * be `true` and the `error` property will be `null`. If the SMTP connection verification fails + */ +export async function verifySmtpConnection( + config: Record, +): Promise { + const transporter = nodemailer.createTransport({ + host: config.SMTP_HOST, + port: Number(config.SMTP_PORT), + secure: config.SMTP_SSL_TLS === "true", + auth: { + user: config.SMTP_USERNAME, + pass: config.SMTP_PASSWORD, + }, + }); + + try { + await transporter.verify(); + console.log("SMTP connection verified successfully."); + return { success: true, error: null }; + } catch (error: unknown) { + console.error("SMTP connection verification failed:"); + return { success: false, error }; + } finally { + transporter.close(); + } +} diff --git a/src/typeDefs/README.md b/src/typeDefs/README.md new file mode 100644 index 0000000000..a944e8527c --- /dev/null +++ b/src/typeDefs/README.md @@ -0,0 +1,81 @@ +# About this directory + +Talawa-api uses schema-first approach for its graphQL implementation and this directory contains the schema definition for it. The main schema is exported through the file `index.ts` to be consumed by a graphQL server. + +
    + +# Structuring + +Most of the files in this directory represent a collection of some distinct type within the graphQL [SDL(Schema Definition Language)](https://graphql.org/learn/). All these collections are then imported into the `index.ts` file, merged into a list and exported under a variable named `typeDefs`. + +Try to use alphabetical structuring whereever possible. This saves the mental overhead of navigating to different files, fields to a big extent. When things get too cluttered try adding newlines and spaces between items. + +
    + +# Documentation + +GraphQL allows developers to document their whole graphQL api within the schema. This is done using of a pair of `"""` symbols. Any text enclosed within these symbols becomes a description for the field it precedes. + +Here's a good example:- + + """ + This is the graphQL object type of a user. + """ + type User { + """ + This is the unique id of the user. + """ + id + + """ + This is userName of the user. + """ + userName + } + + """ + This is the graphQL input type of the input required for updating a user. + """ + input UpdateUserInput{ + """ + This is the new userName the user wants to update their previous userName with. + Constraints:- + 1. Should be at least 1 character long. + 2. Should be at most 30 characters long. + """ + userName: String + } + + type Mutation{ + updateUser( + """ + This is the unique id of the user to update. + """ + id: String! + + """ + This is the input argument which contains data to update the user with. + """ + input: UpdateUserInput! + ): User! + } + +There are other types in graphQL SDL but they will also follow the same syntax for documentation. Try to document every bit of schema that you can while writing the schema itself. This will save you time later on. + +Try to be as explicit as you can be and include everything the fields expect the client to do so that the client consuming your graphQL api doesn't have to manually to check the fields for different edge cases. + +
    + +# Commented out schema + +You can use `#` symbol to comment out stuff in the graphQL schema as shown for the `RandomType` below:- + + # type RandomType{ + # randomField: String! + # } + +
    + +# Schema represents a contract + +A graphQL schema represents a contract between the server and the clients. Be very careful when editing the schema as you can unknowingly edit stuff which breaks functionality for all clients relying on the schema. Read the [graphQL spec](https://spec.graphql.org/October2021/) for more information. diff --git a/src/typeDefs/directives.ts b/src/typeDefs/directives.ts new file mode 100644 index 0000000000..e1f28c4a72 --- /dev/null +++ b/src/typeDefs/directives.ts @@ -0,0 +1,13 @@ +import { gql } from "graphql-tag"; + +// Place fields alphabetically to ensure easier lookup and navigation. + +/** + * GraphQL schema definition for directives. + */ + +export const directives = gql` + directive @auth on FIELD_DEFINITION + + directive @role(requires: UserType) on FIELD_DEFINITION +`; diff --git a/src/typeDefs/enums.ts b/src/typeDefs/enums.ts new file mode 100644 index 0000000000..b3e0a8b4c2 --- /dev/null +++ b/src/typeDefs/enums.ts @@ -0,0 +1,392 @@ +import { gql } from "graphql-tag"; + +// Place fields alphabetically to ensure easier lookup and navigation. +export const enums = gql` + enum ActionItemsOrderByInput { + createdAt_ASC + createdAt_DESC + dueDate_ASC + dueDate_DESC + } + + enum EventOrderByInput { + id_ASC + id_DESC + title_ASC + title_DESC + description_ASC + description_DESC + startDate_ASC + startDate_DESC + endDate_ASC + endDate_DESC + allDay_ASC + allDay_DESC + startTime_ASC + startTime_DESC + endTime_ASC + endTime_DESC + recurrance_ASC + recurrance_DESC + location_ASC + location_DESC + } + + enum RecurringEventMutationType { + allInstances + thisInstance + thisAndFollowingInstances + } + + enum Frequency { + YEARLY + MONTHLY + WEEKLY + DAILY + } + + enum OrganizationOrderByInput { + id_ASC + id_DESC + name_ASC + name_DESC + description_ASC + description_DESC + createdAt_ASC + createdAt_DESC + apiUrl_ASC + apiUrl_DESC + } + + enum PaginationDirection { + BACKWARD + FORWARD + } + + enum PostOrderByInput { + id_ASC + id_DESC + text_ASC + text_DESC + title_ASC + title_DESC + createdAt_ASC + createdAt_DESC + imageUrl_ASC + imageUrl_DESC + videoUrl_ASC + videoUrl_DESC + likeCount_ASC + likeCount_DESC + commentCount_ASC + commentCount_DESC + } + + enum Status { + ACTIVE + BLOCKED + DELETED + } + + enum Type { + UNIVERSAL + PRIVATE + } + + enum UserOrderByInput { + id_ASC + id_DESC + firstName_ASC + firstName_DESC + lastName_ASC + lastName_DESC + email_ASC + email_DESC + createdAt_ASC + createdAt_DESC + } + + enum UserType { + USER + ADMIN + SUPERADMIN + NON_USER + } + + enum VenueOrderByInput { + capacity_ASC + capacity_DESC + } + + enum FundOrderByInput { + createdAt_ASC + createdAt_DESC + } + + enum CampaignOrderByInput { + startDate_ASC + startDate_DESC + endDate_ASC + endDate_DESC + fundingGoal_ASC + fundingGoal_DESC + } + + enum PledgeOrderByInput { + amount_ASC + amount_DESC + startDate_ASC + startDate_DESC + endDate_ASC + endDate_DESC + } + + enum WeekDays { + MONDAY + TUESDAY + WEDNESDAY + THURSDAY + FRIDAY + SATURDAY + SUNDAY + } + + enum EducationGrade { + NO_GRADE + PRE_KG + KG + GRADE_1 + GRADE_2 + GRADE_3 + GRADE_4 + GRADE_5 + GRADE_6 + GRADE_7 + GRADE_8 + GRADE_9 + GRADE_10 + GRADE_11 + GRADE_12 + GRADUATE + } + + enum EmploymentStatus { + FULL_TIME + PART_TIME + UNEMPLOYED + } + + enum Gender { + MALE + FEMALE + OTHER + } + + enum EventVolunteerResponse { + YES + NO + } + + enum MaritalStatus { + SINGLE + ENGAGED + MARRIED + DIVORCED + WIDOWED + SEPERATED + } + + enum AdvertisementType { + BANNER + POPUP + MENU + } + + enum ItemType { + Regular + Note + } + + enum Currency { + AED # United Arab Emirates Dirham + AFN # Afghan Afghani + ALL # Albanian Lek + AMD # Armenian Dram + ANG # Netherlands Antillean Guilder + AOA # Angolan Kwanza + ARS # Argentine Peso + AUD # Australian Dollar + AWG # Aruban Florin + AZN # Azerbaijani Manat + BAM # Bosnia-Herzegovina Convertible Mark + BBD # Barbadian Dollar + BDT # Bangladeshi Taka + BGN # Bulgarian Lev + BHD # Bahraini Dinar + BIF # Burundian Franc + BMD # Bermudian Dollar + BND # Brunei Dollar + BOB # Bolivian Boliviano + BRL # Brazilian Real + BSD # Bahamian Dollar + BTN # Bhutanese Ngultrum + BWP # Botswanan Pula + BYN # Belarusian Ruble + BZD # Belize Dollar + CAD # Canadian Dollar + CDF # Congolese Franc + CHF # Swiss Franc + CLP # Chilean Peso + CNY # Chinese Yuan + COP # Colombian Peso + CRC # Costa Rican Colón + CUP # Cuban Peso + CVE # Cape Verdean Escudo + CZK # Czech Koruna + DJF # Djiboutian Franc + DKK # Danish Krone + DOP # Dominican Peso + DZD # Algerian Dinar + EGP # Egyptian Pound + ERN # Eritrean Nakfa + ETB # Ethiopian Birr + EUR # Euro + FJD # Fijian Dollar + FKP # Falkland Islands Pound + FOK # Faroese Krona + FRO # Fijian Dollar + GBP # British Pound Sterling + GEL # Georgian Lari + GGP # Guernsey Pound + GHS # Ghanaian Cedi + GIP # Gibraltar Pound + GMD # Gambian Dalasi + GNF # Guinean Franc + GTQ # Guatemalan Quetzal + GYD # Guyanaese Dollar + HKD # Hong Kong Dollar + HNL # Honduran Lempira + HRK # Croatian Kuna + HTG # Haitian Gourde + HUF # Hungarian Forint + IDR # Indonesian Rupiah + ILS # Israeli New Shekel + IMP # Manx pound + INR # Indian Rupee + IQD # Iraqi Dinar + IRR # Iranian Rial + ISK # Icelandic Króna + JEP # Jersey Pound + JMD # Jamaican Dollar + JOD # Jordanian Dinar + JPY # Japanese Yen + KES # Kenyan Shilling + KGS # Kyrgystani Som + KHR # Cambodian Riel + KID # Kiribati dollar + KMF # Comorian Franc + KRW # South Korean Won + KWD # Kuwaiti Dinar + KYD # Cayman Islands Dollar + KZT # Kazakhstani Tenge + LAK # Laotian Kip + LBP # Lebanese Pound + LKR # Sri Lankan Rupee + LRD # Liberian Dollar + LSL # Lesotho Loti + LYD # Libyan Dinar + MAD # Moroccan Dirham + MDL # Moldovan Leu + MGA # Malagasy Ariary + MKD # Macedonian Denar + MMK # Myanma Kyat + MNT # Mongolian Tugrik + MOP # Macanese Pataca + MRU # Mauritanian Ouguiya + MUR # Mauritian Rupee + MVR # Maldivian Rufiyaa + MWK # Malawian Kwacha + MXN # Mexican Peso + MYR # Malaysian Ringgit + MZN # Mozambican Metical + NAD # Namibian Dollar + NGN # Nigerian Naira + NIO # Nicaraguan Córdoba + NOK # Norwegian Krone + NPR # Nepalese Rupee + NZD # New Zealand Dollar + OMR # Omani Rial + PAB # Panamanian Balboa + PEN # Peruvian Nuevo Sol + PGK # Papua New Guinean Kina + PHP # Philippine Peso + PKR # Pakistani Rupee + PLN # Polish Zloty + PYG # Paraguayan Guarani + QAR # Qatari Rial + RON # Romanian Leu + RSD # Serbian Dinar + RUB # Russian Ruble + RWF # Rwandan Franc + SAR # Saudi Riyal + SBD # Solomon Islands Dollar + SCR # Seychellois Rupee + SDG # Sudanese Pound + SEK # Swedish Krona + SGD # Singapore Dollar + SHP # Saint Helena Pound + SLL # Sierra Leonean Leone + SOS # Somali Shilling + SPL # Seborgan Luigino + SRD # Surinamese Dollar + STN # São Tomé and Príncipe Dobra + SVC # Salvadoran Colón + SYP # Syrian Pound + SZL # Swazi Lilangeni + THB # Thai Baht + TJS # Tajikistani Somoni + TMT # Turkmenistani Manat + TND # Tunisian Dinar + TOP # Tongan Pa'anga + TRY # Turkish Lira + TTD # Trinidad and Tobago Dollar + TVD # Tuvaluan Dollar + TWD # New Taiwan Dollar + TZS # Tanzanian Shilling + UAH # Ukrainian Hryvnia + UGX # Ugandan Shilling + USD # United States Dollar + UYU # Uruguayan Peso + UZS # Uzbekistan Som + VEF # Venezuelan Bolívar + VND # Vietnamese Dong + VUV # Vanuatu Vatu + WST # Samoan Tala + XAF # CFA Franc BEAC + XCD # East Caribbean Dollar + XDR # Special Drawing Rights + XOF # CFA Franc BCEAO + XPF # CFP Franc + YER # Yemeni Rial + ZAR # South African Rand + ZMW # Zambian Kwacha + ZWD # Zimbabwean Dollar + } + + """ + Possible variants of ordering in which sorting on a field should be + applied for a connection or other list type data structures. + """ + enum SortedByOrder { + """ + When the sorting order should be from the smallest value to largest + value. + """ + ASCENDING + """ + When the sorting order should be from the largest value to the smallest + value. + """ + DESCENDING + } +`; diff --git a/src/typeDefs/errors/common.ts b/src/typeDefs/errors/common.ts new file mode 100644 index 0000000000..c76d90d392 --- /dev/null +++ b/src/typeDefs/errors/common.ts @@ -0,0 +1,45 @@ +import { gql } from "graphql-tag"; + +/** + * GraphQL schema definition for common error types. + */ +export const commonErrors = gql` + interface Error { + message: String! + } + + interface FieldError { + message: String! + path: [String!]! + } + + type UnauthenticatedError implements Error { + message: String! + } + + type UnauthorizedError implements Error { + message: String! + } + + type MaximumLengthError implements FieldError { + message: String! + path: [String!]! + } + + type MinimumLengthError implements FieldError { + message: String! + path: [String!]! + limit: Int! + } + + type MaximumValueError implements FieldError { + message: String! + path: [String!]! + limit: Int! + } + + type MinimumValueError implements FieldError { + message: String! + path: [String!]! + } +`; diff --git a/src/typeDefs/errors/connectionError.ts b/src/typeDefs/errors/connectionError.ts new file mode 100644 index 0000000000..d865acdb3b --- /dev/null +++ b/src/typeDefs/errors/connectionError.ts @@ -0,0 +1,13 @@ +import { gql } from "graphql-tag"; + +/** + * GraphQL schema definition for connection-related errors. + */ +export const connectionError = gql` + union ConnectionError = InvalidCursor | MaximumValueError + + type InvalidCursor implements FieldError { + message: String! + path: [String!]! + } +`; diff --git a/src/typeDefs/errors/createAdminErrors.ts b/src/typeDefs/errors/createAdminErrors.ts new file mode 100644 index 0000000000..d50bb898c3 --- /dev/null +++ b/src/typeDefs/errors/createAdminErrors.ts @@ -0,0 +1,28 @@ +import { gql } from "graphql-tag"; + +/** + * GraphQL schema definition for errors related to creating an admin. + */ +export const createAdminErrors = gql` + type OrganizationNotFoundError implements Error { + message: String! + } + + type UserNotFoundError implements Error { + message: String! + } + + type UserNotAuthorizedError implements Error { + message: String! + } + + type OrganizationMemberNotFoundError implements Error { + message: String! + } + + union CreateAdminError = + | OrganizationNotFoundError + | UserNotFoundError + | UserNotAuthorizedError + | OrganizationMemberNotFoundError +`; diff --git a/src/typeDefs/errors/createCommentErrors.ts b/src/typeDefs/errors/createCommentErrors.ts new file mode 100644 index 0000000000..383d1350c7 --- /dev/null +++ b/src/typeDefs/errors/createCommentErrors.ts @@ -0,0 +1,13 @@ +import { gql } from "graphql-tag"; + +/** + * GraphQL schema definition for errors related to creating a comment. + */ + +export const createCommentErrors = gql` + type PostNotFoundError implements Error { + message: String! + } + + union CreateCommentError = PostNotFoundError +`; diff --git a/src/typeDefs/errors/createDirectChatError.ts b/src/typeDefs/errors/createDirectChatError.ts new file mode 100644 index 0000000000..f2a9b9eb43 --- /dev/null +++ b/src/typeDefs/errors/createDirectChatError.ts @@ -0,0 +1,16 @@ +import { gql } from "graphql-tag"; + +/** + * GraphQL schema definition for errors related to creating a direct chat. + */ +export const createDirectChatErrors = gql` + type OrganizationNotFoundError implements Error { + message: String! + } + + type UserNotFoundError implements Error { + message: String! + } + + union CreateDirectChatError = OrganizationNotFoundError | UserNotFoundError +`; diff --git a/src/typeDefs/errors/createMemberErrors.ts b/src/typeDefs/errors/createMemberErrors.ts new file mode 100644 index 0000000000..4786ca6839 --- /dev/null +++ b/src/typeDefs/errors/createMemberErrors.ts @@ -0,0 +1,32 @@ +import { gql } from "graphql-tag"; + +/** + * GraphQL schema definition for errors related to creating a member. + */ + +export const createMemberErrors = gql` + type UserNotFoundError implements Error { + message: String! + } + + type OrganizationNotFoundError implements Error { + message: String! + } + + type MemberNotFoundError implements Error { + message: String! + } + type UserNotAuthorizedAdminError implements Error { + message: String! + } + type UserNotAuthorizedError implements Error { + message: String! + } + + union CreateMemberError = + | UserNotFoundError + | OrganizationNotFoundError + | MemberNotFoundError + | UserNotAuthorizedAdminError + | UserNotAuthorizedError +`; diff --git a/src/typeDefs/errors/index.ts b/src/typeDefs/errors/index.ts new file mode 100644 index 0000000000..a71db2d6e3 --- /dev/null +++ b/src/typeDefs/errors/index.ts @@ -0,0 +1,18 @@ +import { commonErrors } from "./common"; +import { connectionError } from "./connectionError"; +import { createMemberErrors } from "./createMemberErrors"; +import { createAdminErrors } from "./createAdminErrors"; +import { createCommentErrors } from "./createCommentErrors"; +import { createDirectChatErrors } from "./createDirectChatError"; + +/** + * Array of all error definitions. + */ +export const errors = [ + commonErrors, + connectionError, + createMemberErrors, + createAdminErrors, + createCommentErrors, + createDirectChatErrors, +]; diff --git a/src/typeDefs/index.ts b/src/typeDefs/index.ts new file mode 100644 index 0000000000..f6314a49df --- /dev/null +++ b/src/typeDefs/index.ts @@ -0,0 +1,31 @@ +import { directives } from "./directives"; +import { enums } from "./enums"; +import { errors } from "./errors"; +import { inputs } from "./inputs"; +import { interfaces } from "./interfaces"; +import { mutations } from "./mutations"; +import { queries } from "./queries"; +import { scalars } from "./scalars"; +import { subscriptions } from "./subscriptions"; +import { types } from "./types"; +// import { unions } from "./unions"; + +// 'gql' tag creates a value of type DocumentNode. Here typeDefs is an array of those DocumentNode type variables +// that can be directly consumed by apollo-server. This is done to have our type-defintions defined inside +// typescript files rather than .graphql files. Therefore, saving us the trouble of manually copying over those +// .graphql files to the build directory during build time and also providing the benefits of dynamically altering +// type-defintions using typescript. + +export const typeDefs = [ + directives, + enums, + ...errors, + inputs, + interfaces, + mutations, + queries, + scalars, + subscriptions, + types, + // unions, +]; diff --git a/src/typeDefs/inputs.ts b/src/typeDefs/inputs.ts new file mode 100644 index 0000000000..65cca30e4d --- /dev/null +++ b/src/typeDefs/inputs.ts @@ -0,0 +1,633 @@ +import { gql } from "graphql-tag"; + +// Place fields alphabetically to ensure easier lookup and navigation. +export const inputs = gql` + input CommentInput { + text: String! + } + + input EventAttendeeInput { + userId: ID! + eventId: ID! + } + + input CheckInCheckOutInput { + eventId: ID! + userId: ID! + } + + input createChatInput { + userIds: [ID!]! + organizationId: ID + } + + input createGroupChatInput { + userIds: [ID!]! + organizationId: ID! + title: String! + } + + input createUserFamilyInput { + title: String! + userIds: [ID!]! + } + + input CreateUserTagInput { + name: String! + tagColor: String + parentTagId: ID + organizationId: ID! + } + + input CreateActionItemInput { + assigneeId: ID! + preCompletionNotes: String + allotedHours: Float + dueDate: Date + eventId: ID + } + + input CreateAgendaItemInput { + title: String + description: String + duration: String! + attachments: [String] + relatedEventId: ID + urls: [String] + users: [ID] + categories: [ID] + sequence: Int! + organizationId: ID! + } + + input UpdateAgendaItemInput { + title: String + description: String + duration: String + attachments: [String] + relatedEvent: ID + urls: [String] + users: [ID] + categories: [ID] + sequence: Int + } + + input ActionItemWhereInput { + actionItemCategory_id: ID + event_id: ID + categoryName: String + assigneeName: String + is_completed: Boolean + } + + input ActionItemCategoryWhereInput { + name_contains: String + is_disabled: Boolean + } + + input CreateAgendaCategoryInput { + name: String! + description: String + organizationId: ID! + } + + input CreateAgendaSectionInput { + description: String! + relatedEvent: ID + items: [CreateAgendaItemInput] + sequence: Int! + } + + input CursorPaginationInput { + cursor: String + direction: PaginationDirection! + limit: PositiveInt! + } + + input DonationWhereInput { + id: ID + id_not: ID + id_in: [ID!] + id_not_in: [ID!] + id_contains: ID + id_starts_with: ID + + name_of_user: String + name_of_user_not: String + name_of_user_in: [String!] + name_of_user_not_in: [String!] + name_of_user_contains: String + name_of_user_starts_with: String + } + + input EditVenueInput { + id: ID! + capacity: Int + name: String + description: String + file: String + } + + input EventInput { + title: String! + description: String! + startDate: Date! + endDate: Date! + startTime: Time + endTime: Time + allDay: Boolean! + recurring: Boolean! + isPublic: Boolean! + isRegisterable: Boolean! + images: [String] + location: String + latitude: Latitude + longitude: Longitude + organizationId: ID! + } + + input EventVolunteerInput { + userId: ID! + eventId: ID! + groupId: ID! + } + + input EventVolunteerGroupInput { + name: String + eventId: ID! + volunteersRequired: Int + } + + input EventVolunteerGroupWhereInput { + eventId: ID + volunteerId: ID + name_contains: String + } + + input UpdateEventVolunteerInput { + eventId: ID + isAssigned: Boolean + isInvited: Boolean + response: EventVolunteerResponse + } + + input UpdateEventVolunteerGroupInput { + eventId: ID + name: String + volunteersRequired: Int + } + + input EventWhereInput { + id: ID + id_not: ID + id_in: [ID!] + id_not_in: [ID!] + id_contains: ID + id_starts_with: ID + + title: String + title_not: String + title_in: [String!] + title_not_in: [String!] + title_contains: String + title_starts_with: String + + description: String + description_not: String + description_in: [String!] + description_not_in: [String!] + description_contains: String + description_starts_with: String + + location: String + location_not: String + location_in: [String!] + location_not_in: [String!] + location_contains: String + location_starts_with: String + + organization_id: ID + } + + input FeedbackInput { + eventId: ID! + rating: Int! + review: String + } + + input ForgotPasswordData { + userOtp: String! + newPassword: String! + otpToken: String! + } + input FundInput { + name: String! + organizationId: ID! + refrenceNumber: String + taxDeductible: Boolean! + isDefault: Boolean! + isArchived: Boolean! + } + input FundCampaignInput { + name: String! + fundId: ID! + startDate: Date! + endDate: Date! + fundingGoal: Float! + currency: Currency! + organizationId: ID! + } + input FundCampaignPledgeInput { + campaignId: ID! + userIds: [ID!]! + startDate: Date + endDate: Date + amount: Float! + currency: Currency! + } + + input FundWhereInput { + name_contains: String + } + + input CampaignWhereInput { + id: ID + fundId: ID + organizationId: ID + name_contains: String + } + + input PledgeWhereInput { + id: ID + campaignId: ID + firstName_contains: String + name_contains: String + } + + input LanguageInput { + en_value: String! + translation_lang_code: String! + translation_value: String! + } + + input LoginInput { + email: EmailAddress! + password: String! + } + + input MembershipRequestsWhereInput { + id: ID + id_not: ID + id_in: [ID!] + id_not_in: [ID!] + id_contains: ID + id_starts_with: ID + + user: UserWhereInput + } + + input MessageChatInput { + message: String! + receiver: ID! + } + + input NoteInput { + content: String! + agendaItemId: ID! + } + + input UpdateNoteInput { + content: String + updatedBy: ID! + } + + input OrganizationInput { + name: String! + description: String! + address: AddressInput! + attendees: String + apiUrl: URL + image: String + userRegistrationRequired: Boolean + visibleInSearch: Boolean + } + + input OrganizationWhereInput { + id: ID + id_not: ID + id_in: [ID!] + id_not_in: [ID!] + id_contains: ID + id_starts_with: ID + + name: String + name_not: String + name_in: [String!] + name_not_in: [String!] + name_contains: String + name_starts_with: String + + description: String + description_not: String + description_in: [String!] + description_not_in: [String!] + description_contains: String + description_starts_with: String + + apiUrl: URL + apiUrl_not: URL + apiUrl_in: [URL!] + apiUrl_not_in: [URL!] + apiUrl_contains: URL + apiUrl_starts_with: URL + userRegistrationRequired: Boolean + visibleInSearch: Boolean + } + + input OTPInput { + email: EmailAddress! + } + + input PluginFieldInput { + key: String! + value: String! + } + + input PluginInput { + orgId: ID! + pluginName: String! + pluginKey: String + pluginType: Type + fields: [PluginFieldInput] + } + + input PostInput { + _id: ID + text: String! + title: String + imageUrl: URL + videoUrl: URL + organizationId: ID! + pinned: Boolean + } + + input PostWhereInput { + id: ID + id_not: ID + id_in: [ID!] + id_not_in: [ID!] + id_contains: ID + id_starts_with: ID + + text: String + text_not: String + text_in: [String!] + text_not_in: [String!] + text_contains: String + text_starts_with: String + + title: String + title_not: String + title_in: [String!] + title_not_in: [String!] + title_contains: String + title_starts_with: String + } + + input RecaptchaVerification { + recaptchaToken: String! + } + + input RecurrenceRuleInput { + recurrenceStartDate: Date + recurrenceEndDate: Date + frequency: Frequency + weekDays: [WeekDays] + interval: PositiveInt + count: PositiveInt + weekDayOccurenceInMonth: Int + } + + input SocialMediaUrlsInput { + facebook: String + gitHub: String + instagram: String + linkedIn: String + reddit: String + slack: String + X: String + youTube: String + } + + input ToggleUserTagAssignInput { + userId: ID! + tagId: ID! + } + + input UpdateActionItemInput { + assigneeId: ID + preCompletionNotes: String + postCompletionNotes: String + dueDate: Date + completionDate: Date + allotedHours: Float + isCompleted: Boolean + } + + input UpdateCommunityInput { + name: String! + socialMediaUrls: SocialMediaUrlsInput! + websiteLink: String! + logo: String! + } + + input UpdateEventInput { + title: String + description: String + recurring: Boolean + isRecurringEventException: Boolean + isPublic: Boolean + isRegisterable: Boolean + startDate: Date + endDate: Date + location: String + latitude: Latitude + longitude: Longitude + images: [String] + allDay: Boolean + startTime: Time + endTime: Time + } + input UpdateFundInput { + name: String + taxDeductible: Boolean + isDefault: Boolean + isArchived: Boolean + refrenceNumber: String + } + input UpdateFundCampaignInput { + name: String + startDate: Date + endDate: Date + fundingGoal: Float + currency: Currency + } + input UpdateFundCampaignPledgeInput { + users: [ID] + startDate: Date + endDate: Date + amount: Float + currency: Currency + } + + input UpdateAdvertisementInput { + _id: ID! + name: String + mediaFile: String + type: AdvertisementType + startDate: Date + endDate: Date + } + + input UpdateOrganizationInput { + name: String + description: String + address: AddressInput + userRegistrationRequired: Boolean + visibleInSearch: Boolean + } + + input UpdateUserTagInput { + tagId: ID! + tagColor: String + name: String! + } + + input UpdateActionItemCategoryInput { + name: String + isDisabled: Boolean + } + + input UpdateAgendaCategoryInput { + name: String + description: String + } + + input UpdateAgendaSectionInput { + relatedEvent: ID + description: String + sequence: Int + } + input AddressInput { + city: String + countryCode: String + dependentLocality: String + line1: String + line2: String + postalCode: String + sortingCode: String + state: String + } + + input UserPhoneInput { + home: PhoneNumber + mobile: PhoneNumber + work: PhoneNumber + } + + input UpdateUserInput { + address: AddressInput + birthDate: Date + educationGrade: EducationGrade + email: EmailAddress + employmentStatus: EmploymentStatus + firstName: String + gender: Gender + lastName: String + maritalStatus: MaritalStatus + phone: UserPhoneInput + appLanguageCode: String + } + + input UpdateUserPasswordInput { + previousPassword: String! + newPassword: String! + confirmNewPassword: String! + } + + input UserAndOrganizationInput { + organizationId: ID! + userId: ID! + } + + input UserInput { + firstName: String! + lastName: String! + email: EmailAddress! + password: String! + appLanguageCode: String + selectedOrganization: ID! + } + + input UserWhereInput { + id: ID + id_not: ID + id_in: [ID!] + id_not_in: [ID!] + id_contains: ID + id_starts_with: ID + + firstName: String + firstName_not: String + firstName_in: [String!] + firstName_not_in: [String!] + firstName_contains: String + firstName_starts_with: String + + lastName: String + lastName_not: String + lastName_in: [String!] + lastName_not_in: [String!] + lastName_contains: String + lastName_starts_with: String + + email: EmailAddress + email_not: EmailAddress + email_in: [EmailAddress!] + email_not_in: [EmailAddress!] + email_contains: EmailAddress + email_starts_with: EmailAddress + + event_title_contains: String + } + input PostUpdateInput { + text: String + title: String + imageUrl: String + videoUrl: String + } + + input CreateAdvertisementInput { + endDate: Date! + name: String! + organizationId: ID! + startDate: Date! + type: AdvertisementType! + mediaFile: String! + } + + input VenueInput { + organizationId: ID! + name: String! + capacity: Int! + description: String + file: String + } + + input VenueWhereInput { + name_contains: String + name_starts_with: String + description_starts_with: String + description_contains: String + } +`; diff --git a/src/typeDefs/interfaces.ts b/src/typeDefs/interfaces.ts new file mode 100644 index 0000000000..e6a26b7867 --- /dev/null +++ b/src/typeDefs/interfaces.ts @@ -0,0 +1,32 @@ +import { gql } from "graphql-tag"; + +// Place fields alphabetically to ensure easier lookup and navigation. +export const interfaces = gql` + """ + The standard graphQL connection page info that contains metadata about a + particular instance of a connection. ALl other custom connection page info + types must implement this interface. + """ + interface ConnectionPageInfo { + """ + A field to tell the value of cursor for the last edge of a particular instance of a + connection. + """ + endCursor: String + """ + A field to tell whether the connection has additional edges after the + edge with endCursor as its cursor. + """ + hasNextPage: Boolean! + """ + A field to tell whether the connection has additional edges + before the edge with startCursor as its cursor. + """ + hasPreviousPage: Boolean! + """ + A field to tell the value of cursor for the first edge of a particular instance of a + connection. + """ + startCursor: String + } +`; diff --git a/src/typeDefs/mutations.ts b/src/typeDefs/mutations.ts new file mode 100644 index 0000000000..bca74770e5 --- /dev/null +++ b/src/typeDefs/mutations.ts @@ -0,0 +1,352 @@ +import { gql } from "graphql-tag"; +/** + * This graphQL typeDef defines the logic for different mutations defined in the talawa-api. + */ +// Place fields alphabetically to ensure easier lookup and navigation. +export const mutations = gql` + type Mutation { + acceptMembershipRequest(membershipRequestId: ID!): MembershipRequest! @auth + + addOrganizationCustomField( + organizationId: ID! + type: String! + name: String! + ): OrganizationCustomField! @auth + + addEventAttendee(data: EventAttendeeInput!): User! @auth + + addFeedback(data: FeedbackInput!): Feedback! @auth + + addLanguageTranslation(data: LanguageInput!): Language! @auth + + addOrganizationImage(file: String!, organizationId: String!): Organization! + @auth + addPledgeToFundraisingCampaign( + pledgeId: ID! + campaignId: ID! + ): FundraisingCampaignPledge! @auth + addUserCustomData( + organizationId: ID! + dataName: String! + dataValue: Any! + ): UserCustomData! @auth + + addUserImage(file: String!): User! @auth + + addUserToGroupChat(userId: ID!, chatId: ID!): GroupChat! @auth + + addUserToUserFamily(userId: ID!, familyId: ID!): UserFamily! @auth + + removeUserFromUserFamily(userId: ID!, familyId: ID!): UserFamily! @auth + + removeUserFamily(familyId: ID!): UserFamily! @auth + + createUserFamily(data: createUserFamilyInput!): UserFamily! @auth + + adminRemoveGroup(groupId: ID!): GroupChat! @auth + + assignUserTag(input: ToggleUserTagAssignInput!): User @auth + + blockPluginCreationBySuperadmin( + userId: ID! + blockUser: Boolean! + ): AppUserProfile! @auth @role(requires: SUPERADMIN) + + blockUser(organizationId: ID!, userId: ID!): User! @auth + + cancelMembershipRequest(membershipRequestId: ID!): MembershipRequest! @auth + + checkIn(data: CheckInCheckOutInput!): CheckIn! @auth + + checkOut(data: CheckInCheckOutInput!): CheckOut! @auth + + createMember(input: UserAndOrganizationInput!): CreateMemberPayload! @auth + # createAdmin(data: UserAndOrganizationInput!): AppUserProfile! + # @auth + # @role(requires: SUPERADMIN) + createAdmin(data: UserAndOrganizationInput!): CreateAdminPayload! + @auth + @role(requires: SUPERADMIN) + + #createComment(postId: ID!, data: CommentInput!): CreateCommentPayload! @auth + createActionItem( + data: CreateActionItemInput! + actionItemCategoryId: ID! + ): ActionItem! @auth + + createActionItemCategory( + name: String! + isDisabled: Boolean! + organizationId: ID! + ): ActionItemCategory! @auth + + createAgendaItem(input: CreateAgendaItemInput!): AgendaItem! + + createAgendaCategory(input: CreateAgendaCategoryInput!): AgendaCategory! + + createAgendaSection(input: CreateAgendaSectionInput!): AgendaSection! + + createComment(postId: ID!, data: CommentInput!): Comment @auth + + createDirectChat(data: createChatInput!): DirectChat! @auth + + createDonation( + userId: ID! + orgId: ID! + payPalId: ID! + nameOfUser: String! + amount: Float! + nameOfOrg: String! + ): Donation! + + createEvent( + data: EventInput! + recurrenceRuleData: RecurrenceRuleInput + ): Event! @auth + createFund(data: FundInput!): Fund! @auth + createFundraisingCampaign(data: FundCampaignInput!): FundraisingCampaign! + @auth + createFundraisingCampaignPledge( + data: FundCampaignPledgeInput! + ): FundraisingCampaignPledge! @auth + + createGroupChat(data: createGroupChatInput!): GroupChat! @auth + + createMessageChat(data: MessageChatInput!): MessageChat! @auth + + createOrganization(data: OrganizationInput, file: String): Organization! + @auth + @role(requires: SUPERADMIN) + + createNote(data: NoteInput!): Note! @auth + + createPlugin( + pluginName: String! + pluginCreatedBy: String! + pluginDesc: String! + uninstalledOrgs: [ID!] + ): Plugin! + + createAdvertisement( + input: CreateAdvertisementInput! + ): CreateAdvertisementPayload @auth + + createPost(data: PostInput!, file: String): Post @auth + + createUserTag(input: CreateUserTagInput!): UserTag @auth + + createSampleOrganization: Boolean! @auth + + createVenue(data: VenueInput!): Venue @auth + + deleteAdvertisement(id: ID!): DeleteAdvertisementPayload + + deleteAgendaCategory(id: ID!): ID! @auth + + deleteDonationById(id: ID!): DeletePayload! + + deleteNote(id: ID!): ID! @auth + + deleteVenue(id: ID!): Venue @auth + + editVenue(data: EditVenueInput!): Venue @auth + + forgotPassword(data: ForgotPasswordData!): Boolean! + + inviteEventAttendee(data: EventAttendeeInput!): EventAttendee! + + joinPublicOrganization(organizationId: ID!): User! @auth + + createEventVolunteer(data: EventVolunteerInput!): EventVolunteer! @auth + + createEventVolunteerGroup( + data: EventVolunteerGroupInput! + ): EventVolunteerGroup! @auth + + leaveOrganization(organizationId: ID!): User! @auth + + likeComment(id: ID!): Comment @auth + + likePost(id: ID!): Post @auth + + login(data: LoginInput!): AuthData! + + logout: Boolean! @auth + + otp(data: OTPInput!): OtpData! + + recaptcha(data: RecaptchaVerification!): Boolean! + + refreshToken(refreshToken: String!): ExtendSession! + + registerForEvent(id: ID!): EventAttendee! @auth + + registerEventAttendee(data: EventAttendeeInput!): EventAttendee! + + rejectMembershipRequest(membershipRequestId: ID!): MembershipRequest! @auth + + removeAdmin(data: UserAndOrganizationInput!): AppUserProfile! + @auth + @role(requires: SUPERADMIN) + + removeActionItem(id: ID!): ActionItem! @auth + + removeOrganizationCustomField( + organizationId: ID! + customFieldId: ID! + ): OrganizationCustomField! @auth + + removeComment(id: ID!): Comment @auth + + removeDirectChat(chatId: ID!, organizationId: ID!): DirectChat! @auth + + removeEvent( + id: ID! + recurringEventDeleteType: RecurringEventMutationType + ): Event! @auth + + removeEventAttendee(data: EventAttendeeInput!): User! @auth + + removeAgendaItem(id: ID!): AgendaItem! + + removeEventVolunteer(id: ID!): EventVolunteer! @auth + removeFundraisingCampaignPledge(id: ID!): FundraisingCampaignPledge! @auth + + removeEventVolunteerGroup(id: ID!): EventVolunteerGroup! @auth + + removeGroupChat(chatId: ID!): GroupChat! @auth + + removeMember(data: UserAndOrganizationInput!): Organization! @auth + + removeOrganization(id: ID!): UserData! @auth @role(requires: SUPERADMIN) + + removeOrganizationImage(organizationId: String!): Organization! @auth + + removePost(id: ID!): Post @auth + + removeUserCustomData(organizationId: ID!): UserCustomData! @auth + + removeAdvertisement(id: ID!): Advertisement + + removeAgendaSection(id: ID!): ID! + + removeUserTag(id: ID!): UserTag @auth + + removeSampleOrganization: Boolean! @auth + + removeUserFromGroupChat(userId: ID!, chatId: ID!): GroupChat! @auth + + removeUserImage: User! @auth + + resetCommunity: Boolean! @auth @role(requires: SUPERADMIN) + + revokeRefreshTokenForUser: Boolean! @auth + + saveFcmToken(token: String): Boolean! @auth + + sendMembershipRequest(organizationId: ID!): MembershipRequest! @auth + + sendMessageToDirectChat( + chatId: ID! + messageContent: String! + ): DirectChatMessage! @auth + + sendMessageToGroupChat( + chatId: ID! + messageContent: String! + ): GroupChatMessage! @auth + + signUp(data: UserInput!, file: String): AuthData! + + togglePostPin(id: ID!, title: String): Post! @auth + + unassignUserTag(input: ToggleUserTagAssignInput!): User @auth + + unblockUser(organizationId: ID!, userId: ID!): User! @auth + + unlikeComment(id: ID!): Comment @auth + + unlikePost(id: ID!): Post @auth + + unregisterForEventByUser(id: ID!): Event! @auth + + updateActionItem(id: ID!, data: UpdateActionItemInput!): ActionItem @auth + + updateActionItemCategory( + id: ID! + data: UpdateActionItemCategoryInput! + ): ActionItemCategory @auth + + updateAgendaItem(id: ID!, input: UpdateAgendaItemInput!): AgendaItem + + updateAgendaCategory( + id: ID! + input: UpdateAgendaCategoryInput! + ): AgendaCategory + + updateAgendaSection( + id: ID! + input: UpdateAgendaSectionInput! + ): AgendaSection + + updateAdvertisement( + input: UpdateAdvertisementInput! + ): UpdateAdvertisementPayload @auth + + updateCommunity(data: UpdateCommunityInput!): Boolean! + @auth + @role(requires: SUPERADMIN) + + updateEvent( + id: ID! + data: UpdateEventInput! + recurrenceRuleData: RecurrenceRuleInput + recurringEventUpdateType: RecurringEventMutationType + ): Event! @auth + + updateEventVolunteer( + id: ID! + data: UpdateEventVolunteerInput + ): EventVolunteer! @auth + updateFund(id: ID!, data: UpdateFundInput!): Fund! @auth + + updateEventVolunteerGroup( + id: ID! + data: UpdateEventVolunteerGroupInput + ): EventVolunteerGroup! @auth + + updateFundraisingCampaign( + id: ID! + data: UpdateFundCampaignInput! + ): FundraisingCampaign! @auth + updateFundraisingCampaignPledge( + id: ID! + data: UpdateFundCampaignPledgeInput! + ): FundraisingCampaignPledge! @auth + updatePost(id: ID!, data: PostUpdateInput): Post! @auth + + updateLanguage(languageCode: String!): User! @auth + + updateOrganization( + id: ID! + data: UpdateOrganizationInput + file: String + ): Organization! @auth + + updateNote(id: ID!, data: UpdateNoteInput!): Note! @auth + + updatePluginStatus(id: ID!, orgId: ID!): Plugin! + + updateUserTag(input: UpdateUserTagInput!): UserTag @auth + + updateUserProfile(data: UpdateUserInput, file: String): User! @auth + + updateUserPassword(data: UpdateUserPasswordInput!): UserData! @auth + + updateUserRoleInOrganization( + organizationId: ID! + userId: ID! + role: String! + ): Organization! @auth + } +`; diff --git a/src/typeDefs/queries.ts b/src/typeDefs/queries.ts new file mode 100644 index 0000000000..4db8616859 --- /dev/null +++ b/src/typeDefs/queries.ts @@ -0,0 +1,204 @@ +import { gql } from "graphql-tag"; +/** + * This graphQL typeDef defines the logic for different queries defined in the talawa-api. + */ +// Place fields alphabetically to ensure easier lookup and navigation. +export const queries = gql` + type Query { + adminPlugin(orgId: ID!): [Plugin] + + actionItemsByEvent(eventId: ID!): [ActionItem] + + actionItemsByOrganization( + organizationId: ID! + eventId: ID + where: ActionItemWhereInput + orderBy: ActionItemsOrderByInput + ): [ActionItem] + + actionItemCategoriesByOrganization( + organizationId: ID! + where: ActionItemCategoryWhereInput + orderBy: ActionItemsOrderByInput + ): [ActionItemCategory] + + agendaItemByEvent(relatedEventId: ID!): [AgendaItem] + + agendaItemByOrganization(organizationId: ID!): [AgendaItem] + + agendaItemCategoriesByOrganization(organizationId: ID!): [AgendaCategory] + + getAgendaItem(id: ID!): AgendaItem + + getAllAgendaItems: [AgendaItem] + + agendaCategory(id: ID!): AgendaCategory! + + getAgendaSection(id: ID!): AgendaSection + + checkAuth: User! @auth + + getCommunityData: Community + + customFieldsByOrganization(id: ID!): [OrganizationCustomField] + + customDataByOrganization(organizationId: ID!): [UserCustomData!]! + + directChatsByUserID(id: ID!): [DirectChat] + + directChatById(id: ID!): DirectChat + + groupChatById(id: ID!): GroupChat + + groupChatsByUserId(id: ID!): [GroupChat] + + directChatsMessagesByChatID(id: ID!): [DirectChatMessage] + + event(id: ID!): Event + + eventsByOrganization(id: ID, orderBy: EventOrderByInput): [Event] + + eventsByOrganizationConnection( + where: EventWhereInput + first: Int + skip: Int + orderBy: EventOrderByInput + ): [Event!]! + + eventVolunteersByEvent(id: ID!): [EventVolunteer] + + getEventVolunteerGroups( + where: EventVolunteerGroupWhereInput + ): [EventVolunteerGroup]! + + fundsByOrganization( + organizationId: ID! + where: FundWhereInput + orderBy: FundOrderByInput + ): [Fund] + + getDonationById(id: ID!): Donation! + + getEventAttendeesByEventId(eventId: ID!): [EventAttendee] + + getEventAttendee(userId: ID!, eventId: ID!): EventAttendee + + getEventInvitesByUserId(userId: ID!): [EventAttendee!]! + + getFundById( + id: ID! + orderBy: CampaignOrderByInput + where: CampaignWhereInput + ): Fund! + + getFundraisingCampaigns( + where: CampaignWhereInput + pledgeOrderBy: PledgeOrderByInput + campaignOrderby: CampaignOrderByInput + ): [FundraisingCampaign]! + + getFundraisingCampaignPledgeById(id: ID!): FundraisingCampaignPledge! + + getPledgesByUserId( + userId: ID! + where: PledgeWhereInput + orderBy: PledgeOrderByInput + ): [FundraisingCampaignPledge] + + getDonationByOrgId(orgId: ID!): [Donation] + + getDonationByOrgIdConnection( + orgId: ID! + where: DonationWhereInput + first: Int + skip: Int + ): [Donation!]! + + getlanguage(lang_code: String!): [Translation] + + getPlugins: [Plugin] + + getVenueByOrgId( + orgId: ID! + where: VenueWhereInput + first: Int + skip: Int + orderBy: VenueOrderByInput + ): [Venue] + + getNoteById(id: ID!): Note! + + getUserTag(id: ID!): UserTag + + getUserTagAncestors(id: ID!): [UserTag] + + getAllNotesForAgendaItem(agendaItemId: ID!): [Note] + + advertisementsConnection( + after: String + before: String + first: PositiveInt + last: PositiveInt + ): AdvertisementsConnection + + isSampleOrganization(id: ID!): Boolean! + hasSubmittedFeedback(userId: ID!, eventId: ID!): Boolean + + joinedOrganizations(id: ID): [Organization] + + me: UserData! @auth + + myLanguage: String @auth + + organizations( + id: ID + orderBy: OrganizationOrderByInput + first: Int + skip: Int + where: MembershipRequestsWhereInput + ): [Organization] + + organizationsConnection( + where: OrganizationWhereInput + first: Int + skip: Int + orderBy: OrganizationOrderByInput + ): [Organization]! + + organizationsMemberConnection( + orgId: ID! + where: UserWhereInput + first: Int + skip: Int + orderBy: UserOrderByInput + ): UserConnection! @auth + + plugin(orgId: ID!): [Plugin] + + post(id: ID!): Post + + registeredEventsByUser(id: ID, orderBy: EventOrderByInput): [Event] + + registrantsByEvent(id: ID!): [User] + + user(id: ID!): UserData! @auth + + userLanguage(userId: ID!): String @auth + + users( + where: UserWhereInput + orderBy: UserOrderByInput + first: Int + skip: Int + ): [UserData] @auth + + usersConnection( + where: UserWhereInput + first: Int + skip: Int + orderBy: UserOrderByInput + ): [UserData]! @auth + + venue(id: ID!): Venue + } +`; diff --git a/src/typeDefs/scalars.ts b/src/typeDefs/scalars.ts new file mode 100644 index 0000000000..03c9169b69 --- /dev/null +++ b/src/typeDefs/scalars.ts @@ -0,0 +1,19 @@ +import { gql } from "graphql-tag"; + +// Place fields alphabetically to ensure easier lookup and navigation. +export const scalars = gql` + scalar CountryCode + scalar Date + scalar DateTime + scalar EmailAddress + scalar Latitude + scalar Longitude + scalar ID + scalar PhoneNumber + scalar PositiveInt + scalar Time + scalar URL + scalar Upload + scalar JSON + scalar Any +`; diff --git a/src/typeDefs/subscriptions.ts b/src/typeDefs/subscriptions.ts new file mode 100644 index 0000000000..4c718b9761 --- /dev/null +++ b/src/typeDefs/subscriptions.ts @@ -0,0 +1,11 @@ +import { gql } from "graphql-tag"; + +// Place fields alphabetically to ensure easier lookup and navigation. +export const subscriptions = gql` + type Subscription { + directMessageChat: MessageChat + messageSentToDirectChat(userId: ID!): DirectChatMessage + messageSentToGroupChat(userId: ID!): GroupChatMessage + onPluginUpdate: Plugin + } +`; diff --git a/src/typeDefs/types.ts b/src/typeDefs/types.ts new file mode 100644 index 0000000000..8faf1a6521 --- /dev/null +++ b/src/typeDefs/types.ts @@ -0,0 +1,774 @@ +import { gql } from "graphql-tag"; + +// Place fields alphabetically to ensure easier lookup and navigation. +export const types = gql` + type AggregatePost { + count: Int! + } + + type AggregateUser { + count: Int! + } + + type AuthData { + user: User! + appUserProfile: AppUserProfile! + accessToken: String! + refreshToken: String! + } + + type ActionItemCategory { + _id: ID! + name: String! + organization: Organization + isDisabled: Boolean! + creator: User + createdAt: Date! + updatedAt: Date! + } + + type AgendaItem { + _id: ID! + title: String! + description: String + duration: String! + attachments: [String] + createdBy: User! + updatedBy: User! + urls: [String] + users: [User] + categories: [AgendaCategory] + sequence: Int! + createdAt: Date! + updatedAt: Date! + organization: Organization! + relatedEvent: Event + } + + type AgendaCategory { + _id: ID! + name: String! + description: String + organization: Organization! + createdBy: User! + updatedBy: User + createdAt: Date! + updatedAt: Date + } + + type AgendaSection { + _id: ID! + relatedEvent: Event + description: String! + items: [AgendaItem] + sequence: Int! + createdAt: Date! + updatedAt: Date + createdBy: User + updatedBy: User + } + # Action Item for a ActionItemCategory + type ActionItem { + _id: ID! + assignee: User + assigner: User + actionItemCategory: ActionItemCategory + preCompletionNotes: String + postCompletionNotes: String + allotedHours: Float + assignmentDate: Date! + dueDate: Date! + completionDate: Date! + isCompleted: Boolean! + event: Event + creator: User + createdAt: Date! + updatedAt: Date! + } + + # Stores the detail of an check in of an user in an event + type CheckIn { + _id: ID! + createdAt: DateTime! + feedbackSubmitted: Boolean! + event: Event! + time: DateTime! + updatedAt: DateTime! + user: User! + } + + # Stores the detail of an check out of an user in an event + type CheckOut { + _id: ID! + eventAttendeeId: ID! + createdAt: DateTime! + time: DateTime! + updatedAt: DateTime! + } + + # Used to show whether an user has checked in for an event + type CheckInStatus { + _id: ID! + user: User! + checkIn: CheckIn + } + + type Comment { + _id: ID! + text: String! + post: Post! + likedBy: [User] + likeCount: Int + creator: User + createdAt: DateTime! + updatedAt: DateTime! + } + + type Community { + _id: ID! + name: String! + logoUrl: String + websiteLink: String + socialMediaUrls: SocialMediaUrls + } + type CreateAdminPayload { + user: AppUserProfile + userErrors: [CreateAdminError!]! + } + type UserFamily { + _id: ID! + title: String + users: [User!]! + admins: [User!]! + creator: User! + } + + """ + Default connection page info for containing the metadata for a connection + instance. + """ + type DefaultConnectionPageInfo implements ConnectionPageInfo { + endCursor: String + hasNextPage: Boolean! + hasPreviousPage: Boolean! + startCursor: String + } + + type CreateMemberPayload { + organization: Organization + userErrors: [CreateMemberError!]! + } + + type CreateCommentPayload { + comment: Comment + userErrors: [CreateCommentError!]! + } + + type createDirectChatPayload { + directChat: DirectChat + userErrors: [CreateDirectChatError!]! + } + + type DeletePayload { + success: Boolean! + } + + type DeleteAdvertisementPayload { + advertisement: Advertisement + } + + type DirectChat { + _id: ID! + users: [User!]! + messages: [DirectChatMessage] + creator: User + createdAt: DateTime! + updatedAt: DateTime! + organization: Organization + } + + type DirectChatMessage { + _id: ID! + directChatMessageBelongsTo: DirectChat! + sender: User! + receiver: User! + createdAt: DateTime! + updatedAt: DateTime! + messageContent: String! + } + + type Donation { + _id: ID! + userId: ID! + orgId: ID! + payPalId: String! + nameOfUser: String! + nameOfOrg: String! + amount: Float! + createdAt: DateTime! + updatedAt: DateTime! + } + type Advertisement { + _id: ID! + name: String! + organization: Organization + mediaUrl: URL! + type: AdvertisementType! + startDate: Date! + endDate: Date! + createdAt: DateTime! + creator: User + updatedAt: DateTime! + } + + type AdvertisementEdge { + cursor: String + node: Advertisement + } + + type AdvertisementsConnection { + edges: [AdvertisementEdge] + pageInfo: DefaultConnectionPageInfo! + totalCount: Int + } + + type UpdateAdvertisementPayload { + advertisement: Advertisement + } + + type CreateAdvertisementPayload { + advertisement: Advertisement + } + + type ExtendSession { + accessToken: String! + refreshToken: String! + } + + type Event { + _id: ID! + title: String! + description: String! + startDate: Date! + endDate: Date + images: [String] + startTime: Time + endTime: Time + allDay: Boolean! + recurring: Boolean! + recurrenceRule: RecurrenceRule + baseRecurringEvent: Event + isRecurringEventException: Boolean! + isPublic: Boolean! + isRegisterable: Boolean! + location: String + latitude: Latitude + longitude: Longitude + organization: Organization + creator: User + createdAt: DateTime! + updatedAt: DateTime! + attendees: [User] + # For each attendee, gives information about whether he/she has checked in yet or not + attendeesCheckInStatus: [CheckInStatus!]! + actionItems: [ActionItem] + admins(adminId: ID): [User!] + feedback: [Feedback!]! + averageFeedbackScore: Float + agendaItems: [AgendaItem] + } + + type EventVolunteer { + _id: ID! + createdAt: DateTime! + creator: User + event: Event + group: EventVolunteerGroup + isAssigned: Boolean + isInvited: Boolean + response: String + user: User! + updatedAt: DateTime! + } + + type EventAttendee { + _id: ID! + userId: ID! + eventId: ID! + checkInId: ID + checkOutId: ID + isInvited: Boolean! + isRegistered: Boolean! + isCheckedIn: Boolean! + isCheckedOut: Boolean! + createdAt: DateTime! + updatedAt: DateTime! + } + + type EventVolunteerGroup { + _id: ID! + createdAt: DateTime! + creator: User + event: Event + leader: User! + name: String + updatedAt: DateTime! + volunteers: [EventVolunteer] + volunteersRequired: Int + } + + type Feedback { + _id: ID! + event: Event! + rating: Int! + review: String + createdAt: DateTime! + updatedAt: DateTime! + } + + type Fund { + _id: ID! + organizationId: ID! + name: String! + refrenceNumber: String + taxDeductible: Boolean! + isDefault: Boolean! + isArchived: Boolean! + creator: User + campaigns: [FundraisingCampaign] + createdAt: DateTime! + updatedAt: DateTime! + } + type FundraisingCampaign { + _id: ID! + fundId: Fund! + organizationId: Organization! + name: String! + startDate: Date! + endDate: Date! + fundingGoal: Float! + currency: Currency! + pledges: [FundraisingCampaignPledge] + createdAt: DateTime! + updatedAt: DateTime! + } + type FundraisingCampaignPledge { + _id: ID! + campaign: FundraisingCampaign! + users: [User]! + startDate: Date + endDate: Date + amount: Float! + currency: Currency! + } + + type Group { + _id: ID! + title: String! + description: String + createdAt: DateTime! + updatedAt: DateTime! + organization: Organization! + admins: [User!]! + } + + type GroupChat { + _id: ID! + title: String! + users: [User!]! + messages: [GroupChatMessage] + creator: User + createdAt: DateTime! + updatedAt: DateTime! + organization: Organization! + } + + type GroupChatMessage { + _id: ID! + groupChatMessageBelongsTo: GroupChat! + sender: User! + createdAt: DateTime! + updatedAt: DateTime! + messageContent: String! + } + + type Language { + _id: ID! + en: String! + translation: [LanguageModel] + createdAt: String! + } + + type LanguageModel { + _id: ID! + lang_code: String! + value: String! + verified: Boolean! + createdAt: DateTime! + } + + type MembershipRequest { + _id: ID! + user: User! + organization: Organization! + } + + type Message { + _id: ID! + text: String! + createdAt: DateTime! + updatedAt: DateTime! + imageUrl: URL + videoUrl: URL + creator: User + } + + type MessageChat { + _id: ID! + sender: User! + receiver: User! + message: String! + languageBarrier: Boolean + createdAt: DateTime! + updatedAt: DateTime! + } + + type Note { + _id: ID! + content: String! + createdBy: User! + updatedBy: User! + createdAt: DateTime! + updatedAt: DateTime! + agendaItemId: ID! + } + + type Organization { + image: String + _id: ID! + name: String! + description: String! + address: Address + advertisements( + after: String + before: String + first: Int + last: Int + ): AdvertisementsConnection + creator: User + createdAt: DateTime! + updatedAt: DateTime! + members: [User] + actionItemCategories: [ActionItemCategory] + agendaCategories: [AgendaCategory] + admins(adminId: ID): [User!] + membershipRequests( + first: Int + skip: Int + where: MembershipRequestsWhereInput + ): [MembershipRequest] + userRegistrationRequired: Boolean! + visibleInSearch: Boolean! + blockedUsers: [User] + apiUrl: URL! + pinnedPosts: [Post] + userTags( + after: String + before: String + first: PositiveInt + last: PositiveInt + ): UserTagsConnection + posts( + after: String + before: String + first: PositiveInt + last: PositiveInt + ): PostsConnection + funds: [Fund] + customFields: [OrganizationCustomField!]! + venues: [Venue] + } + + type OrganizationCustomField { + _id: ID! + type: String! + name: String! + organizationId: String! + } + + type OrganizationInfoNode { + image: String + _id: ID! + name: String! + description: String! + creator: User + apiUrl: URL! + userRegistrationRequired: Boolean! + visibleInSearch: Boolean! + } + + type OtpData { + otpToken: String! + } + + type Venue { + _id: ID! + capacity: Int! + description: String + imageUrl: URL + name: String! + organization: Organization! + } + + """ + Information about pagination in a connection. + """ + type PageInfo { + """ + When paginating forwards, are there more items? + """ + hasNextPage: Boolean! + + """ + When paginating backwards, are there more items? + """ + hasPreviousPage: Boolean! + + totalPages: Int + nextPageNo: Int + prevPageNo: Int + currPageNo: Int + } + + # For Plugins + type Plugin { + _id: ID! + pluginName: String! + pluginCreatedBy: String! + pluginDesc: String! + uninstalledOrgs: [ID!] + } + + type PluginField { + key: String! + value: String! + status: Status! + createdAt: DateTime! + } + + type Post { + _id: ID + text: String! + title: String + createdAt: DateTime! + creator: User + updatedAt: DateTime! + imageUrl: URL + videoUrl: URL + organization: Organization! + likedBy: [User] + comments: [Comment] + likeCount: Int + commentCount: Int + pinned: Boolean + } + + type RecurrenceRule { + organization: Organization + baseRecurringEvent: Event + recurrenceStartDate: Date! + recurrenceEndDate: Date + recurrenceRuleString: String! + frequency: Frequency! + weekDays: [WeekDays] + interval: PositiveInt! + count: PositiveInt + weekDayOccurenceInMonth: Int + latestInstanceDate: Date + } + + type SocialMediaUrls { + facebook: String + instagram: String + X: String + linkedIn: String + gitHub: String + youTube: String + slack: String + reddit: String + } + + type Translation { + lang_code: String + en_value: String + translation: String + verified: Boolean + } + + type Address { + city: String + countryCode: String + dependentLocality: String + line1: String + line2: String + postalCode: String + sortingCode: String + state: String + } + + type UserPhone { + home: PhoneNumber + mobile: PhoneNumber + work: PhoneNumber + } + + type User { + _id: ID! + identifier: Int! + appUserProfileId: AppUserProfile + address: Address + birthDate: Date + createdAt: DateTime! + educationGrade: EducationGrade + email: EmailAddress! + employmentStatus: EmploymentStatus + posts( + after: String + before: String + first: PositiveInt + last: PositiveInt + ): PostsConnection + eventAdmin: [Event] + firstName: String! + gender: Gender + image: String + joinedOrganizations: [Organization] + lastName: String! + maritalStatus: MaritalStatus + organizationsBlockedBy: [Organization] + phone: UserPhone + membershipRequests: [MembershipRequest] + registeredEvents: [Event] + pluginCreationAllowed: Boolean! + tagsAssignedWith( + after: String + before: String + first: PositiveInt + last: PositiveInt + organizationId: ID + ): UserTagsConnection + updatedAt: DateTime! + } + type AppUserProfile { + _id: ID! + userId: User! + adminFor: [Organization] + createdEvents: [Event] + createdOrganizations: [Organization] + eventAdmin: [Event] + pledges: [FundraisingCampaignPledge] + campaigns: [FundraisingCampaign] + pluginCreationAllowed: Boolean! + isSuperAdmin: Boolean! + appLanguageCode: String! + } + + type PostsConnection { + edges: [PostEdge!]! + pageInfo: DefaultConnectionPageInfo! + totalCount: Int + } + type PostEdge { + node: Post! + cursor: String! + } + + type UserCustomData { + _id: ID! + organizationId: ID! + userId: ID! + values: JSON! + } + type UserData { + user: User! + appUserProfile: AppUserProfile + } + type UserConnection { + pageInfo: PageInfo! + edges: [User]! + aggregate: AggregateUser! + } + + type UserTag { + """ + A field to get the mongodb object id identifier for this UserTag. + """ + _id: ID! + """ + A field to get the name of this UserTag. + """ + name: String! + """ + A field to traverse the Organization that created this UserTag. + """ + organization: Organization + """ + A field to traverse the parent UserTag of this UserTag. + """ + parentTag: UserTag + """ + A connection field to traverse a list of UserTag this UserTag is a + parent to. + """ + childTags( + after: String + before: String + first: PositiveInt + last: PositiveInt + ): UserTagsConnection + """ + A connection field to traverse a list of User this UserTag is assigned + to. + """ + usersAssignedTo( + after: String + before: String + first: PositiveInt + last: PositiveInt + ): UsersConnection + } + + """ + A default connection on the UserTag type. + """ + type UserTagsConnection { + edges: [UserTagsConnectionEdge!]! + pageInfo: DefaultConnectionPageInfo! + totalCount: Int + } + + """ + A default connection edge on the UserTag type for UserTagsConnection. + """ + type UserTagsConnectionEdge { + cursor: String! + node: UserTag! + } + + """ + A default connection on the User type. + """ + type UsersConnection { + edges: [UsersConnectionEdge!]! + pageInfo: DefaultConnectionPageInfo! + totalCount: Int + } + + """ + A default connection edge on the User type for UsersConnection. + """ + type UsersConnectionEdge { + cursor: String! + node: User! + } +`; diff --git a/src/typeDefs/unions.ts b/src/typeDefs/unions.ts new file mode 100644 index 0000000000..d9c6501960 --- /dev/null +++ b/src/typeDefs/unions.ts @@ -0,0 +1,4 @@ +import { gql } from "graphql-tag"; + +// Place fields alphabetically to ensure easier lookup and navigation. +export const unions = gql``; diff --git a/src/types/generatedGraphQLTypes.ts b/src/types/generatedGraphQLTypes.ts new file mode 100644 index 0000000000..0f4178071b --- /dev/null +++ b/src/types/generatedGraphQLTypes.ts @@ -0,0 +1,4964 @@ +import type { GraphQLResolveInfo, GraphQLScalarType, GraphQLScalarTypeConfig } from 'graphql'; +import type { InterfaceActionItem as InterfaceActionItemModel } from '../models/ActionItem'; +import type { InterfaceActionItemCategory as InterfaceActionItemCategoryModel } from '../models/ActionItemCategory'; +import type { InterfaceAppUserProfile as InterfaceAppUserProfileModel } from '../models/AppUserProfile'; +import type { InterfaceAgendaCategory as InterfaceAgendaCategoryModel } from '../models/AgendaCategory'; +import type { InterfaceAdvertisement as InterfaceAdvertisementModel } from '../models/Advertisement'; +import type { InterfaceAgendaItem as InterfaceAgendaItemModel } from '../models/AgendaItem'; +import type { InterfaceAgendaSection as InterfaceAgendaSectionModel } from '../models/AgendaSection'; +import type { InterfaceCheckIn as InterfaceCheckInModel } from '../models/CheckIn'; +import type { InterfaceMessageChat as InterfaceMessageChatModel } from '../models/MessageChat'; +import type { InterfaceComment as InterfaceCommentModel } from '../models/Comment'; +import type { InterfaceCommunity as InterfaceCommunityModel } from '../models/Community'; +import type { InterfaceDirectChat as InterfaceDirectChatModel } from '../models/DirectChat'; +import type { InterfaceDirectChatMessage as InterfaceDirectChatMessageModel } from '../models/DirectChatMessage'; +import type { InterfaceDonation as InterfaceDonationModel } from '../models/Donation'; +import type { InterfaceEvent as InterfaceEventModel } from '../models/Event'; +import type { InterfaceEventAttendee as InterfaceEventAttendeeModel } from '../models/EventAttendee'; +import type { InterfaceUserFamily as InterfaceUserFamilyModel } from '../models/userFamily'; +import type { InterfaceEventVolunteer as InterfaceEventVolunteerModel } from '../models/EventVolunteer'; +import type { InterfaceEventVolunteerGroup as InterfaceEventVolunteerGroupModel } from '../models/EventVolunteerGroup'; +import type { InterfaceFeedback as InterfaceFeedbackModel } from '../models/Feedback'; +import type { InterfaceFund as InterfaceFundModel } from '../models/Fund'; +import type { InterfaceFundraisingCampaign as InterfaceFundraisingCampaignModel } from '../models/FundraisingCampaign'; +import type { InterfaceFundraisingCampaignPledges as InterfaceFundraisingCampaignPledgesModel } from '../models/FundraisingCampaignPledge'; +import type { InterfaceGroup as InterfaceGroupModel } from '../models/Group'; +import type { InterfaceGroupChat as InterfaceGroupChatModel } from '../models/GroupChat'; +import type { InterfaceGroupChatMessage as InterfaceGroupChatMessageModel } from '../models/GroupChatMessage'; +import type { InterfaceLanguage as InterfaceLanguageModel } from '../models/Language'; +import type { InterfaceMembershipRequest as InterfaceMembershipRequestModel } from '../models/MembershipRequest'; +import type { InterfaceMessage as InterfaceMessageModel } from '../models/Message'; +import type { InterfaceNote as InterfaceNoteModel } from '../models/Note'; +import type { InterfaceOrganization as InterfaceOrganizationModel } from '../models/Organization'; +import type { InterfacePlugin as InterfacePluginModel } from '../models/Plugin'; +import type { InterfacePluginField as InterfacePluginFieldModel } from '../models/PluginField'; +import type { InterfacePost as InterfacePostModel } from '../models/Post'; +import type { InterfaceRecurrenceRule as InterfaceRecurrenceRuleModel } from '../models/RecurrenceRule'; +import type { InterfaceOrganizationTagUser as InterfaceOrganizationTagUserModel } from '../models/OrganizationTagUser'; +import type { InterfaceUser as InterfaceUserModel } from '../models/User'; +import type { InterfaceVenue as InterfaceVenueModel } from '../models/Venue'; +export type Maybe = T | null; +export type InputMaybe = Maybe; +export type Exact = { [K in keyof T]: T[K] }; +export type MakeOptional = Omit & { [SubKey in K]?: Maybe }; +export type MakeMaybe = Omit & { [SubKey in K]: Maybe }; +export type MakeEmpty = { [_ in K]?: never }; +export type Incremental = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never }; +export type Omit = Pick>; +export type RequireFields = Omit & { [P in K]-?: NonNullable }; +/** All built-in and custom scalars, mapped to their actual values */ +export type Scalars = { + ID: { input: string; output: string; } + String: { input: string; output: string; } + Boolean: { input: boolean; output: boolean; } + Int: { input: number; output: number; } + Float: { input: number; output: number; } + Any: { input: any; output: any; } + CountryCode: { input: any; output: any; } + Date: { input: any; output: any; } + DateTime: { input: any; output: any; } + EmailAddress: { input: any; output: any; } + JSON: { input: any; output: any; } + Latitude: { input: any; output: any; } + Longitude: { input: any; output: any; } + PhoneNumber: { input: any; output: any; } + PositiveInt: { input: any; output: any; } + Time: { input: any; output: any; } + URL: { input: any; output: any; } + Upload: { input: any; output: any; } +}; + +export type ActionItem = { + __typename?: 'ActionItem'; + _id: Scalars['ID']['output']; + actionItemCategory?: Maybe; + allotedHours?: Maybe; + assignee?: Maybe; + assigner?: Maybe; + assignmentDate: Scalars['Date']['output']; + completionDate: Scalars['Date']['output']; + createdAt: Scalars['Date']['output']; + creator?: Maybe; + dueDate: Scalars['Date']['output']; + event?: Maybe; + isCompleted: Scalars['Boolean']['output']; + postCompletionNotes?: Maybe; + preCompletionNotes?: Maybe; + updatedAt: Scalars['Date']['output']; +}; + +export type ActionItemCategory = { + __typename?: 'ActionItemCategory'; + _id: Scalars['ID']['output']; + createdAt: Scalars['Date']['output']; + creator?: Maybe; + isDisabled: Scalars['Boolean']['output']; + name: Scalars['String']['output']; + organization?: Maybe; + updatedAt: Scalars['Date']['output']; +}; + +export type ActionItemCategoryWhereInput = { + is_disabled?: InputMaybe; + name_contains?: InputMaybe; +}; + +export type ActionItemWhereInput = { + actionItemCategory_id?: InputMaybe; + assigneeName?: InputMaybe; + categoryName?: InputMaybe; + event_id?: InputMaybe; + is_completed?: InputMaybe; +}; + +export type ActionItemsOrderByInput = + | 'createdAt_ASC' + | 'createdAt_DESC' + | 'dueDate_ASC' + | 'dueDate_DESC'; + +export type Address = { + __typename?: 'Address'; + city?: Maybe; + countryCode?: Maybe; + dependentLocality?: Maybe; + line1?: Maybe; + line2?: Maybe; + postalCode?: Maybe; + sortingCode?: Maybe; + state?: Maybe; +}; + +export type AddressInput = { + city?: InputMaybe; + countryCode?: InputMaybe; + dependentLocality?: InputMaybe; + line1?: InputMaybe; + line2?: InputMaybe; + postalCode?: InputMaybe; + sortingCode?: InputMaybe; + state?: InputMaybe; +}; + +export type Advertisement = { + __typename?: 'Advertisement'; + _id: Scalars['ID']['output']; + createdAt: Scalars['DateTime']['output']; + creator?: Maybe; + endDate: Scalars['Date']['output']; + mediaUrl: Scalars['URL']['output']; + name: Scalars['String']['output']; + organization?: Maybe; + startDate: Scalars['Date']['output']; + type: AdvertisementType; + updatedAt: Scalars['DateTime']['output']; +}; + +export type AdvertisementEdge = { + __typename?: 'AdvertisementEdge'; + cursor?: Maybe; + node?: Maybe; +}; + +export type AdvertisementType = + | 'BANNER' + | 'MENU' + | 'POPUP'; + +export type AdvertisementsConnection = { + __typename?: 'AdvertisementsConnection'; + edges?: Maybe>>; + pageInfo: DefaultConnectionPageInfo; + totalCount?: Maybe; +}; + +export type AgendaCategory = { + __typename?: 'AgendaCategory'; + _id: Scalars['ID']['output']; + createdAt: Scalars['Date']['output']; + createdBy: User; + description?: Maybe; + name: Scalars['String']['output']; + organization: Organization; + updatedAt?: Maybe; + updatedBy?: Maybe; +}; + +export type AgendaItem = { + __typename?: 'AgendaItem'; + _id: Scalars['ID']['output']; + attachments?: Maybe>>; + categories?: Maybe>>; + createdAt: Scalars['Date']['output']; + createdBy: User; + description?: Maybe; + duration: Scalars['String']['output']; + organization: Organization; + relatedEvent?: Maybe; + sequence: Scalars['Int']['output']; + title: Scalars['String']['output']; + updatedAt: Scalars['Date']['output']; + updatedBy: User; + urls?: Maybe>>; + users?: Maybe>>; +}; + +export type AgendaSection = { + __typename?: 'AgendaSection'; + _id: Scalars['ID']['output']; + createdAt: Scalars['Date']['output']; + createdBy?: Maybe; + description: Scalars['String']['output']; + items?: Maybe>>; + relatedEvent?: Maybe; + sequence: Scalars['Int']['output']; + updatedAt?: Maybe; + updatedBy?: Maybe; +}; + +export type AggregatePost = { + __typename?: 'AggregatePost'; + count: Scalars['Int']['output']; +}; + +export type AggregateUser = { + __typename?: 'AggregateUser'; + count: Scalars['Int']['output']; +}; + +export type AppUserProfile = { + __typename?: 'AppUserProfile'; + _id: Scalars['ID']['output']; + adminFor?: Maybe>>; + appLanguageCode: Scalars['String']['output']; + campaigns?: Maybe>>; + createdEvents?: Maybe>>; + createdOrganizations?: Maybe>>; + eventAdmin?: Maybe>>; + isSuperAdmin: Scalars['Boolean']['output']; + pledges?: Maybe>>; + pluginCreationAllowed: Scalars['Boolean']['output']; + userId: User; +}; + +export type AuthData = { + __typename?: 'AuthData'; + accessToken: Scalars['String']['output']; + appUserProfile: AppUserProfile; + refreshToken: Scalars['String']['output']; + user: User; +}; + +export type CampaignOrderByInput = + | 'endDate_ASC' + | 'endDate_DESC' + | 'fundingGoal_ASC' + | 'fundingGoal_DESC' + | 'startDate_ASC' + | 'startDate_DESC'; + +export type CampaignWhereInput = { + fundId?: InputMaybe; + id?: InputMaybe; + name_contains?: InputMaybe; + organizationId?: InputMaybe; +}; + +export type CheckIn = { + __typename?: 'CheckIn'; + _id: Scalars['ID']['output']; + createdAt: Scalars['DateTime']['output']; + event: Event; + feedbackSubmitted: Scalars['Boolean']['output']; + time: Scalars['DateTime']['output']; + updatedAt: Scalars['DateTime']['output']; + user: User; +}; + +export type CheckInCheckOutInput = { + eventId: Scalars['ID']['input']; + userId: Scalars['ID']['input']; +}; + +export type CheckInStatus = { + __typename?: 'CheckInStatus'; + _id: Scalars['ID']['output']; + checkIn?: Maybe; + user: User; +}; + +export type CheckOut = { + __typename?: 'CheckOut'; + _id: Scalars['ID']['output']; + createdAt: Scalars['DateTime']['output']; + eventAttendeeId: Scalars['ID']['output']; + time: Scalars['DateTime']['output']; + updatedAt: Scalars['DateTime']['output']; +}; + +export type Comment = { + __typename?: 'Comment'; + _id: Scalars['ID']['output']; + createdAt: Scalars['DateTime']['output']; + creator?: Maybe; + likeCount?: Maybe; + likedBy?: Maybe>>; + post: Post; + text: Scalars['String']['output']; + updatedAt: Scalars['DateTime']['output']; +}; + +export type CommentInput = { + text: Scalars['String']['input']; +}; + +export type Community = { + __typename?: 'Community'; + _id: Scalars['ID']['output']; + logoUrl?: Maybe; + name: Scalars['String']['output']; + socialMediaUrls?: Maybe; + websiteLink?: Maybe; +}; + +export type ConnectionError = InvalidCursor | MaximumValueError; + +/** + * The standard graphQL connection page info that contains metadata about a + * particular instance of a connection. ALl other custom connection page info + * types must implement this interface. + */ +export type ConnectionPageInfo = { + /** + * A field to tell the value of cursor for the last edge of a particular instance of a + * connection. + */ + endCursor?: Maybe; + /** + * A field to tell whether the connection has additional edges after the + * edge with endCursor as its cursor. + */ + hasNextPage: Scalars['Boolean']['output']; + /** + * A field to tell whether the connection has additional edges + * before the edge with startCursor as its cursor. + */ + hasPreviousPage: Scalars['Boolean']['output']; + /** + * A field to tell the value of cursor for the first edge of a particular instance of a + * connection. + */ + startCursor?: Maybe; +}; + +export type CreateActionItemInput = { + allotedHours?: InputMaybe; + assigneeId: Scalars['ID']['input']; + dueDate?: InputMaybe; + eventId?: InputMaybe; + preCompletionNotes?: InputMaybe; +}; + +export type CreateAdminError = OrganizationMemberNotFoundError | OrganizationNotFoundError | UserNotAuthorizedError | UserNotFoundError; + +export type CreateAdminPayload = { + __typename?: 'CreateAdminPayload'; + user?: Maybe; + userErrors: Array; +}; + +export type CreateAdvertisementInput = { + endDate: Scalars['Date']['input']; + mediaFile: Scalars['String']['input']; + name: Scalars['String']['input']; + organizationId: Scalars['ID']['input']; + startDate: Scalars['Date']['input']; + type: AdvertisementType; +}; + +export type CreateAdvertisementPayload = { + __typename?: 'CreateAdvertisementPayload'; + advertisement?: Maybe; +}; + +export type CreateAgendaCategoryInput = { + description?: InputMaybe; + name: Scalars['String']['input']; + organizationId: Scalars['ID']['input']; +}; + +export type CreateAgendaItemInput = { + attachments?: InputMaybe>>; + categories?: InputMaybe>>; + description?: InputMaybe; + duration: Scalars['String']['input']; + organizationId: Scalars['ID']['input']; + relatedEventId?: InputMaybe; + sequence: Scalars['Int']['input']; + title?: InputMaybe; + urls?: InputMaybe>>; + users?: InputMaybe>>; +}; + +export type CreateAgendaSectionInput = { + description: Scalars['String']['input']; + items?: InputMaybe>>; + relatedEvent?: InputMaybe; + sequence: Scalars['Int']['input']; +}; + +export type CreateCommentError = PostNotFoundError; + +export type CreateCommentPayload = { + __typename?: 'CreateCommentPayload'; + comment?: Maybe; + userErrors: Array; +}; + +export type CreateDirectChatError = OrganizationNotFoundError | UserNotFoundError; + +export type CreateMemberError = MemberNotFoundError | OrganizationNotFoundError | UserNotAuthorizedAdminError | UserNotAuthorizedError | UserNotFoundError; + +export type CreateMemberPayload = { + __typename?: 'CreateMemberPayload'; + organization?: Maybe; + userErrors: Array; +}; + +export type CreateUserTagInput = { + name: Scalars['String']['input']; + organizationId: Scalars['ID']['input']; + parentTagId?: InputMaybe; + tagColor?: InputMaybe; +}; + +export type Currency = + | 'AED' + | 'AFN' + | 'ALL' + | 'AMD' + | 'ANG' + | 'AOA' + | 'ARS' + | 'AUD' + | 'AWG' + | 'AZN' + | 'BAM' + | 'BBD' + | 'BDT' + | 'BGN' + | 'BHD' + | 'BIF' + | 'BMD' + | 'BND' + | 'BOB' + | 'BRL' + | 'BSD' + | 'BTN' + | 'BWP' + | 'BYN' + | 'BZD' + | 'CAD' + | 'CDF' + | 'CHF' + | 'CLP' + | 'CNY' + | 'COP' + | 'CRC' + | 'CUP' + | 'CVE' + | 'CZK' + | 'DJF' + | 'DKK' + | 'DOP' + | 'DZD' + | 'EGP' + | 'ERN' + | 'ETB' + | 'EUR' + | 'FJD' + | 'FKP' + | 'FOK' + | 'FRO' + | 'GBP' + | 'GEL' + | 'GGP' + | 'GHS' + | 'GIP' + | 'GMD' + | 'GNF' + | 'GTQ' + | 'GYD' + | 'HKD' + | 'HNL' + | 'HRK' + | 'HTG' + | 'HUF' + | 'IDR' + | 'ILS' + | 'IMP' + | 'INR' + | 'IQD' + | 'IRR' + | 'ISK' + | 'JEP' + | 'JMD' + | 'JOD' + | 'JPY' + | 'KES' + | 'KGS' + | 'KHR' + | 'KID' + | 'KMF' + | 'KRW' + | 'KWD' + | 'KYD' + | 'KZT' + | 'LAK' + | 'LBP' + | 'LKR' + | 'LRD' + | 'LSL' + | 'LYD' + | 'MAD' + | 'MDL' + | 'MGA' + | 'MKD' + | 'MMK' + | 'MNT' + | 'MOP' + | 'MRU' + | 'MUR' + | 'MVR' + | 'MWK' + | 'MXN' + | 'MYR' + | 'MZN' + | 'NAD' + | 'NGN' + | 'NIO' + | 'NOK' + | 'NPR' + | 'NZD' + | 'OMR' + | 'PAB' + | 'PEN' + | 'PGK' + | 'PHP' + | 'PKR' + | 'PLN' + | 'PYG' + | 'QAR' + | 'RON' + | 'RSD' + | 'RUB' + | 'RWF' + | 'SAR' + | 'SBD' + | 'SCR' + | 'SDG' + | 'SEK' + | 'SGD' + | 'SHP' + | 'SLL' + | 'SOS' + | 'SPL' + | 'SRD' + | 'STN' + | 'SVC' + | 'SYP' + | 'SZL' + | 'THB' + | 'TJS' + | 'TMT' + | 'TND' + | 'TOP' + | 'TRY' + | 'TTD' + | 'TVD' + | 'TWD' + | 'TZS' + | 'UAH' + | 'UGX' + | 'USD' + | 'UYU' + | 'UZS' + | 'VEF' + | 'VND' + | 'VUV' + | 'WST' + | 'XAF' + | 'XCD' + | 'XDR' + | 'XOF' + | 'XPF' + | 'YER' + | 'ZAR' + | 'ZMW' + | 'ZWD'; + +export type CursorPaginationInput = { + cursor?: InputMaybe; + direction: PaginationDirection; + limit: Scalars['PositiveInt']['input']; +}; + +/** + * Default connection page info for containing the metadata for a connection + * instance. + */ +export type DefaultConnectionPageInfo = ConnectionPageInfo & { + __typename?: 'DefaultConnectionPageInfo'; + endCursor?: Maybe; + hasNextPage: Scalars['Boolean']['output']; + hasPreviousPage: Scalars['Boolean']['output']; + startCursor?: Maybe; +}; + +export type DeleteAdvertisementPayload = { + __typename?: 'DeleteAdvertisementPayload'; + advertisement?: Maybe; +}; + +export type DeletePayload = { + __typename?: 'DeletePayload'; + success: Scalars['Boolean']['output']; +}; + +export type DirectChat = { + __typename?: 'DirectChat'; + _id: Scalars['ID']['output']; + createdAt: Scalars['DateTime']['output']; + creator?: Maybe; + messages?: Maybe>>; + organization?: Maybe; + updatedAt: Scalars['DateTime']['output']; + users: Array; +}; + +export type DirectChatMessage = { + __typename?: 'DirectChatMessage'; + _id: Scalars['ID']['output']; + createdAt: Scalars['DateTime']['output']; + directChatMessageBelongsTo: DirectChat; + messageContent: Scalars['String']['output']; + receiver: User; + sender: User; + updatedAt: Scalars['DateTime']['output']; +}; + +export type Donation = { + __typename?: 'Donation'; + _id: Scalars['ID']['output']; + amount: Scalars['Float']['output']; + createdAt: Scalars['DateTime']['output']; + nameOfOrg: Scalars['String']['output']; + nameOfUser: Scalars['String']['output']; + orgId: Scalars['ID']['output']; + payPalId: Scalars['String']['output']; + updatedAt: Scalars['DateTime']['output']; + userId: Scalars['ID']['output']; +}; + +export type DonationWhereInput = { + id?: InputMaybe; + id_contains?: InputMaybe; + id_in?: InputMaybe>; + id_not?: InputMaybe; + id_not_in?: InputMaybe>; + id_starts_with?: InputMaybe; + name_of_user?: InputMaybe; + name_of_user_contains?: InputMaybe; + name_of_user_in?: InputMaybe>; + name_of_user_not?: InputMaybe; + name_of_user_not_in?: InputMaybe>; + name_of_user_starts_with?: InputMaybe; +}; + +export type EditVenueInput = { + capacity?: InputMaybe; + description?: InputMaybe; + file?: InputMaybe; + id: Scalars['ID']['input']; + name?: InputMaybe; +}; + +export type EducationGrade = + | 'GRADE_1' + | 'GRADE_2' + | 'GRADE_3' + | 'GRADE_4' + | 'GRADE_5' + | 'GRADE_6' + | 'GRADE_7' + | 'GRADE_8' + | 'GRADE_9' + | 'GRADE_10' + | 'GRADE_11' + | 'GRADE_12' + | 'GRADUATE' + | 'KG' + | 'NO_GRADE' + | 'PRE_KG'; + +export type EmploymentStatus = + | 'FULL_TIME' + | 'PART_TIME' + | 'UNEMPLOYED'; + +export type Error = { + message: Scalars['String']['output']; +}; + +export type Event = { + __typename?: 'Event'; + _id: Scalars['ID']['output']; + actionItems?: Maybe>>; + admins?: Maybe>; + agendaItems?: Maybe>>; + allDay: Scalars['Boolean']['output']; + attendees?: Maybe>>; + attendeesCheckInStatus: Array; + averageFeedbackScore?: Maybe; + baseRecurringEvent?: Maybe; + createdAt: Scalars['DateTime']['output']; + creator?: Maybe; + description: Scalars['String']['output']; + endDate?: Maybe; + endTime?: Maybe; + feedback: Array; + images?: Maybe>>; + isPublic: Scalars['Boolean']['output']; + isRecurringEventException: Scalars['Boolean']['output']; + isRegisterable: Scalars['Boolean']['output']; + latitude?: Maybe; + location?: Maybe; + longitude?: Maybe; + organization?: Maybe; + recurrenceRule?: Maybe; + recurring: Scalars['Boolean']['output']; + startDate: Scalars['Date']['output']; + startTime?: Maybe; + title: Scalars['String']['output']; + updatedAt: Scalars['DateTime']['output']; +}; + + +export type EventAdminsArgs = { + adminId?: InputMaybe; +}; + +export type EventAttendee = { + __typename?: 'EventAttendee'; + _id: Scalars['ID']['output']; + checkInId?: Maybe; + checkOutId?: Maybe; + createdAt: Scalars['DateTime']['output']; + eventId: Scalars['ID']['output']; + isCheckedIn: Scalars['Boolean']['output']; + isCheckedOut: Scalars['Boolean']['output']; + isInvited: Scalars['Boolean']['output']; + isRegistered: Scalars['Boolean']['output']; + updatedAt: Scalars['DateTime']['output']; + userId: Scalars['ID']['output']; +}; + +export type EventAttendeeInput = { + eventId: Scalars['ID']['input']; + userId: Scalars['ID']['input']; +}; + +export type EventInput = { + allDay: Scalars['Boolean']['input']; + description: Scalars['String']['input']; + endDate: Scalars['Date']['input']; + endTime?: InputMaybe; + images?: InputMaybe>>; + isPublic: Scalars['Boolean']['input']; + isRegisterable: Scalars['Boolean']['input']; + latitude?: InputMaybe; + location?: InputMaybe; + longitude?: InputMaybe; + organizationId: Scalars['ID']['input']; + recurring: Scalars['Boolean']['input']; + startDate: Scalars['Date']['input']; + startTime?: InputMaybe; + title: Scalars['String']['input']; +}; + +export type EventOrderByInput = + | 'allDay_ASC' + | 'allDay_DESC' + | 'description_ASC' + | 'description_DESC' + | 'endDate_ASC' + | 'endDate_DESC' + | 'endTime_ASC' + | 'endTime_DESC' + | 'id_ASC' + | 'id_DESC' + | 'location_ASC' + | 'location_DESC' + | 'recurrance_ASC' + | 'recurrance_DESC' + | 'startDate_ASC' + | 'startDate_DESC' + | 'startTime_ASC' + | 'startTime_DESC' + | 'title_ASC' + | 'title_DESC'; + +export type EventVolunteer = { + __typename?: 'EventVolunteer'; + _id: Scalars['ID']['output']; + createdAt: Scalars['DateTime']['output']; + creator?: Maybe; + event?: Maybe; + group?: Maybe; + isAssigned?: Maybe; + isInvited?: Maybe; + response?: Maybe; + updatedAt: Scalars['DateTime']['output']; + user: User; +}; + +export type EventVolunteerGroup = { + __typename?: 'EventVolunteerGroup'; + _id: Scalars['ID']['output']; + createdAt: Scalars['DateTime']['output']; + creator?: Maybe; + event?: Maybe; + leader: User; + name?: Maybe; + updatedAt: Scalars['DateTime']['output']; + volunteers?: Maybe>>; + volunteersRequired?: Maybe; +}; + +export type EventVolunteerGroupInput = { + eventId: Scalars['ID']['input']; + name?: InputMaybe; + volunteersRequired?: InputMaybe; +}; + +export type EventVolunteerGroupWhereInput = { + eventId?: InputMaybe; + name_contains?: InputMaybe; + volunteerId?: InputMaybe; +}; + +export type EventVolunteerInput = { + eventId: Scalars['ID']['input']; + groupId: Scalars['ID']['input']; + userId: Scalars['ID']['input']; +}; + +export type EventVolunteerResponse = + | 'NO' + | 'YES'; + +export type EventWhereInput = { + description?: InputMaybe; + description_contains?: InputMaybe; + description_in?: InputMaybe>; + description_not?: InputMaybe; + description_not_in?: InputMaybe>; + description_starts_with?: InputMaybe; + id?: InputMaybe; + id_contains?: InputMaybe; + id_in?: InputMaybe>; + id_not?: InputMaybe; + id_not_in?: InputMaybe>; + id_starts_with?: InputMaybe; + location?: InputMaybe; + location_contains?: InputMaybe; + location_in?: InputMaybe>; + location_not?: InputMaybe; + location_not_in?: InputMaybe>; + location_starts_with?: InputMaybe; + organization_id?: InputMaybe; + title?: InputMaybe; + title_contains?: InputMaybe; + title_in?: InputMaybe>; + title_not?: InputMaybe; + title_not_in?: InputMaybe>; + title_starts_with?: InputMaybe; +}; + +export type ExtendSession = { + __typename?: 'ExtendSession'; + accessToken: Scalars['String']['output']; + refreshToken: Scalars['String']['output']; +}; + +export type Feedback = { + __typename?: 'Feedback'; + _id: Scalars['ID']['output']; + createdAt: Scalars['DateTime']['output']; + event: Event; + rating: Scalars['Int']['output']; + review?: Maybe; + updatedAt: Scalars['DateTime']['output']; +}; + +export type FeedbackInput = { + eventId: Scalars['ID']['input']; + rating: Scalars['Int']['input']; + review?: InputMaybe; +}; + +export type FieldError = { + message: Scalars['String']['output']; + path: Array; +}; + +export type ForgotPasswordData = { + newPassword: Scalars['String']['input']; + otpToken: Scalars['String']['input']; + userOtp: Scalars['String']['input']; +}; + +export type Frequency = + | 'DAILY' + | 'MONTHLY' + | 'WEEKLY' + | 'YEARLY'; + +export type Fund = { + __typename?: 'Fund'; + _id: Scalars['ID']['output']; + campaigns?: Maybe>>; + createdAt: Scalars['DateTime']['output']; + creator?: Maybe; + isArchived: Scalars['Boolean']['output']; + isDefault: Scalars['Boolean']['output']; + name: Scalars['String']['output']; + organizationId: Scalars['ID']['output']; + refrenceNumber?: Maybe; + taxDeductible: Scalars['Boolean']['output']; + updatedAt: Scalars['DateTime']['output']; +}; + +export type FundCampaignInput = { + currency: Currency; + endDate: Scalars['Date']['input']; + fundId: Scalars['ID']['input']; + fundingGoal: Scalars['Float']['input']; + name: Scalars['String']['input']; + organizationId: Scalars['ID']['input']; + startDate: Scalars['Date']['input']; +}; + +export type FundCampaignPledgeInput = { + amount: Scalars['Float']['input']; + campaignId: Scalars['ID']['input']; + currency: Currency; + endDate?: InputMaybe; + startDate?: InputMaybe; + userIds: Array; +}; + +export type FundInput = { + isArchived: Scalars['Boolean']['input']; + isDefault: Scalars['Boolean']['input']; + name: Scalars['String']['input']; + organizationId: Scalars['ID']['input']; + refrenceNumber?: InputMaybe; + taxDeductible: Scalars['Boolean']['input']; +}; + +export type FundOrderByInput = + | 'createdAt_ASC' + | 'createdAt_DESC'; + +export type FundWhereInput = { + name_contains?: InputMaybe; +}; + +export type FundraisingCampaign = { + __typename?: 'FundraisingCampaign'; + _id: Scalars['ID']['output']; + createdAt: Scalars['DateTime']['output']; + currency: Currency; + endDate: Scalars['Date']['output']; + fundId: Fund; + fundingGoal: Scalars['Float']['output']; + name: Scalars['String']['output']; + organizationId: Organization; + pledges?: Maybe>>; + startDate: Scalars['Date']['output']; + updatedAt: Scalars['DateTime']['output']; +}; + +export type FundraisingCampaignPledge = { + __typename?: 'FundraisingCampaignPledge'; + _id: Scalars['ID']['output']; + amount: Scalars['Float']['output']; + campaign: FundraisingCampaign; + currency: Currency; + endDate?: Maybe; + startDate?: Maybe; + users: Array>; +}; + +export type Gender = + | 'FEMALE' + | 'MALE' + | 'OTHER'; + +export type Group = { + __typename?: 'Group'; + _id: Scalars['ID']['output']; + admins: Array; + createdAt: Scalars['DateTime']['output']; + description?: Maybe; + organization: Organization; + title: Scalars['String']['output']; + updatedAt: Scalars['DateTime']['output']; +}; + +export type GroupChat = { + __typename?: 'GroupChat'; + _id: Scalars['ID']['output']; + createdAt: Scalars['DateTime']['output']; + creator?: Maybe; + messages?: Maybe>>; + organization: Organization; + title: Scalars['String']['output']; + updatedAt: Scalars['DateTime']['output']; + users: Array; +}; + +export type GroupChatMessage = { + __typename?: 'GroupChatMessage'; + _id: Scalars['ID']['output']; + createdAt: Scalars['DateTime']['output']; + groupChatMessageBelongsTo: GroupChat; + messageContent: Scalars['String']['output']; + sender: User; + updatedAt: Scalars['DateTime']['output']; +}; + +export type InvalidCursor = FieldError & { + __typename?: 'InvalidCursor'; + message: Scalars['String']['output']; + path: Array; +}; + +export type ItemType = + | 'Note' + | 'Regular'; + +export type Language = { + __typename?: 'Language'; + _id: Scalars['ID']['output']; + createdAt: Scalars['String']['output']; + en: Scalars['String']['output']; + translation?: Maybe>>; +}; + +export type LanguageInput = { + en_value: Scalars['String']['input']; + translation_lang_code: Scalars['String']['input']; + translation_value: Scalars['String']['input']; +}; + +export type LanguageModel = { + __typename?: 'LanguageModel'; + _id: Scalars['ID']['output']; + createdAt: Scalars['DateTime']['output']; + lang_code: Scalars['String']['output']; + value: Scalars['String']['output']; + verified: Scalars['Boolean']['output']; +}; + +export type LoginInput = { + email: Scalars['EmailAddress']['input']; + password: Scalars['String']['input']; +}; + +export type MaritalStatus = + | 'DIVORCED' + | 'ENGAGED' + | 'MARRIED' + | 'SEPERATED' + | 'SINGLE' + | 'WIDOWED'; + +export type MaximumLengthError = FieldError & { + __typename?: 'MaximumLengthError'; + message: Scalars['String']['output']; + path: Array; +}; + +export type MaximumValueError = FieldError & { + __typename?: 'MaximumValueError'; + limit: Scalars['Int']['output']; + message: Scalars['String']['output']; + path: Array; +}; + +export type MemberNotFoundError = Error & { + __typename?: 'MemberNotFoundError'; + message: Scalars['String']['output']; +}; + +export type MembershipRequest = { + __typename?: 'MembershipRequest'; + _id: Scalars['ID']['output']; + organization: Organization; + user: User; +}; + +export type MembershipRequestsWhereInput = { + id?: InputMaybe; + id_contains?: InputMaybe; + id_in?: InputMaybe>; + id_not?: InputMaybe; + id_not_in?: InputMaybe>; + id_starts_with?: InputMaybe; + user?: InputMaybe; +}; + +export type Message = { + __typename?: 'Message'; + _id: Scalars['ID']['output']; + createdAt: Scalars['DateTime']['output']; + creator?: Maybe; + imageUrl?: Maybe; + text: Scalars['String']['output']; + updatedAt: Scalars['DateTime']['output']; + videoUrl?: Maybe; +}; + +export type MessageChat = { + __typename?: 'MessageChat'; + _id: Scalars['ID']['output']; + createdAt: Scalars['DateTime']['output']; + languageBarrier?: Maybe; + message: Scalars['String']['output']; + receiver: User; + sender: User; + updatedAt: Scalars['DateTime']['output']; +}; + +export type MessageChatInput = { + message: Scalars['String']['input']; + receiver: Scalars['ID']['input']; +}; + +export type MinimumLengthError = FieldError & { + __typename?: 'MinimumLengthError'; + limit: Scalars['Int']['output']; + message: Scalars['String']['output']; + path: Array; +}; + +export type MinimumValueError = FieldError & { + __typename?: 'MinimumValueError'; + message: Scalars['String']['output']; + path: Array; +}; + +export type Mutation = { + __typename?: 'Mutation'; + acceptMembershipRequest: MembershipRequest; + addEventAttendee: User; + addFeedback: Feedback; + addLanguageTranslation: Language; + addOrganizationCustomField: OrganizationCustomField; + addOrganizationImage: Organization; + addPledgeToFundraisingCampaign: FundraisingCampaignPledge; + addUserCustomData: UserCustomData; + addUserImage: User; + addUserToGroupChat: GroupChat; + addUserToUserFamily: UserFamily; + adminRemoveGroup: GroupChat; + assignUserTag?: Maybe; + blockPluginCreationBySuperadmin: AppUserProfile; + blockUser: User; + cancelMembershipRequest: MembershipRequest; + checkIn: CheckIn; + checkOut: CheckOut; + createActionItem: ActionItem; + createActionItemCategory: ActionItemCategory; + createAdmin: CreateAdminPayload; + createAdvertisement?: Maybe; + createAgendaCategory: AgendaCategory; + createAgendaItem: AgendaItem; + createAgendaSection: AgendaSection; + createComment?: Maybe; + createDirectChat: DirectChat; + createDonation: Donation; + createEvent: Event; + createEventVolunteer: EventVolunteer; + createEventVolunteerGroup: EventVolunteerGroup; + createFund: Fund; + createFundraisingCampaign: FundraisingCampaign; + createFundraisingCampaignPledge: FundraisingCampaignPledge; + createGroupChat: GroupChat; + createMember: CreateMemberPayload; + createMessageChat: MessageChat; + createNote: Note; + createOrganization: Organization; + createPlugin: Plugin; + createPost?: Maybe; + createSampleOrganization: Scalars['Boolean']['output']; + createUserFamily: UserFamily; + createUserTag?: Maybe; + createVenue?: Maybe; + deleteAdvertisement?: Maybe; + deleteAgendaCategory: Scalars['ID']['output']; + deleteDonationById: DeletePayload; + deleteNote: Scalars['ID']['output']; + deleteVenue?: Maybe; + editVenue?: Maybe; + forgotPassword: Scalars['Boolean']['output']; + inviteEventAttendee: EventAttendee; + joinPublicOrganization: User; + leaveOrganization: User; + likeComment?: Maybe; + likePost?: Maybe; + login: AuthData; + logout: Scalars['Boolean']['output']; + otp: OtpData; + recaptcha: Scalars['Boolean']['output']; + refreshToken: ExtendSession; + registerEventAttendee: EventAttendee; + registerForEvent: EventAttendee; + rejectMembershipRequest: MembershipRequest; + removeActionItem: ActionItem; + removeAdmin: AppUserProfile; + removeAdvertisement?: Maybe; + removeAgendaItem: AgendaItem; + removeAgendaSection: Scalars['ID']['output']; + removeComment?: Maybe; + removeDirectChat: DirectChat; + removeEvent: Event; + removeEventAttendee: User; + removeEventVolunteer: EventVolunteer; + removeEventVolunteerGroup: EventVolunteerGroup; + removeFundraisingCampaignPledge: FundraisingCampaignPledge; + removeGroupChat: GroupChat; + removeMember: Organization; + removeOrganization: UserData; + removeOrganizationCustomField: OrganizationCustomField; + removeOrganizationImage: Organization; + removePost?: Maybe; + removeSampleOrganization: Scalars['Boolean']['output']; + removeUserCustomData: UserCustomData; + removeUserFamily: UserFamily; + removeUserFromGroupChat: GroupChat; + removeUserFromUserFamily: UserFamily; + removeUserImage: User; + removeUserTag?: Maybe; + resetCommunity: Scalars['Boolean']['output']; + revokeRefreshTokenForUser: Scalars['Boolean']['output']; + saveFcmToken: Scalars['Boolean']['output']; + sendMembershipRequest: MembershipRequest; + sendMessageToDirectChat: DirectChatMessage; + sendMessageToGroupChat: GroupChatMessage; + signUp: AuthData; + togglePostPin: Post; + unassignUserTag?: Maybe; + unblockUser: User; + unlikeComment?: Maybe; + unlikePost?: Maybe; + unregisterForEventByUser: Event; + updateActionItem?: Maybe; + updateActionItemCategory?: Maybe; + updateAdvertisement?: Maybe; + updateAgendaCategory?: Maybe; + updateAgendaItem?: Maybe; + updateAgendaSection?: Maybe; + updateCommunity: Scalars['Boolean']['output']; + updateEvent: Event; + updateEventVolunteer: EventVolunteer; + updateEventVolunteerGroup: EventVolunteerGroup; + updateFund: Fund; + updateFundraisingCampaign: FundraisingCampaign; + updateFundraisingCampaignPledge: FundraisingCampaignPledge; + updateLanguage: User; + updateNote: Note; + updateOrganization: Organization; + updatePluginStatus: Plugin; + updatePost: Post; + updateUserPassword: UserData; + updateUserProfile: User; + updateUserRoleInOrganization: Organization; + updateUserTag?: Maybe; +}; + + +export type MutationAcceptMembershipRequestArgs = { + membershipRequestId: Scalars['ID']['input']; +}; + + +export type MutationAddEventAttendeeArgs = { + data: EventAttendeeInput; +}; + + +export type MutationAddFeedbackArgs = { + data: FeedbackInput; +}; + + +export type MutationAddLanguageTranslationArgs = { + data: LanguageInput; +}; + + +export type MutationAddOrganizationCustomFieldArgs = { + name: Scalars['String']['input']; + organizationId: Scalars['ID']['input']; + type: Scalars['String']['input']; +}; + + +export type MutationAddOrganizationImageArgs = { + file: Scalars['String']['input']; + organizationId: Scalars['String']['input']; +}; + + +export type MutationAddPledgeToFundraisingCampaignArgs = { + campaignId: Scalars['ID']['input']; + pledgeId: Scalars['ID']['input']; +}; + + +export type MutationAddUserCustomDataArgs = { + dataName: Scalars['String']['input']; + dataValue: Scalars['Any']['input']; + organizationId: Scalars['ID']['input']; +}; + + +export type MutationAddUserImageArgs = { + file: Scalars['String']['input']; +}; + + +export type MutationAddUserToGroupChatArgs = { + chatId: Scalars['ID']['input']; + userId: Scalars['ID']['input']; +}; + + +export type MutationAddUserToUserFamilyArgs = { + familyId: Scalars['ID']['input']; + userId: Scalars['ID']['input']; +}; + + +export type MutationAdminRemoveGroupArgs = { + groupId: Scalars['ID']['input']; +}; + + +export type MutationAssignUserTagArgs = { + input: ToggleUserTagAssignInput; +}; + + +export type MutationBlockPluginCreationBySuperadminArgs = { + blockUser: Scalars['Boolean']['input']; + userId: Scalars['ID']['input']; +}; + + +export type MutationBlockUserArgs = { + organizationId: Scalars['ID']['input']; + userId: Scalars['ID']['input']; +}; + + +export type MutationCancelMembershipRequestArgs = { + membershipRequestId: Scalars['ID']['input']; +}; + + +export type MutationCheckInArgs = { + data: CheckInCheckOutInput; +}; + + +export type MutationCheckOutArgs = { + data: CheckInCheckOutInput; +}; + + +export type MutationCreateActionItemArgs = { + actionItemCategoryId: Scalars['ID']['input']; + data: CreateActionItemInput; +}; + + +export type MutationCreateActionItemCategoryArgs = { + isDisabled: Scalars['Boolean']['input']; + name: Scalars['String']['input']; + organizationId: Scalars['ID']['input']; +}; + + +export type MutationCreateAdminArgs = { + data: UserAndOrganizationInput; +}; + + +export type MutationCreateAdvertisementArgs = { + input: CreateAdvertisementInput; +}; + + +export type MutationCreateAgendaCategoryArgs = { + input: CreateAgendaCategoryInput; +}; + + +export type MutationCreateAgendaItemArgs = { + input: CreateAgendaItemInput; +}; + + +export type MutationCreateAgendaSectionArgs = { + input: CreateAgendaSectionInput; +}; + + +export type MutationCreateCommentArgs = { + data: CommentInput; + postId: Scalars['ID']['input']; +}; + + +export type MutationCreateDirectChatArgs = { + data: CreateChatInput; +}; + + +export type MutationCreateDonationArgs = { + amount: Scalars['Float']['input']; + nameOfOrg: Scalars['String']['input']; + nameOfUser: Scalars['String']['input']; + orgId: Scalars['ID']['input']; + payPalId: Scalars['ID']['input']; + userId: Scalars['ID']['input']; +}; + + +export type MutationCreateEventArgs = { + data: EventInput; + recurrenceRuleData?: InputMaybe; +}; + + +export type MutationCreateEventVolunteerArgs = { + data: EventVolunteerInput; +}; + + +export type MutationCreateEventVolunteerGroupArgs = { + data: EventVolunteerGroupInput; +}; + + +export type MutationCreateFundArgs = { + data: FundInput; +}; + + +export type MutationCreateFundraisingCampaignArgs = { + data: FundCampaignInput; +}; + + +export type MutationCreateFundraisingCampaignPledgeArgs = { + data: FundCampaignPledgeInput; +}; + + +export type MutationCreateGroupChatArgs = { + data: CreateGroupChatInput; +}; + + +export type MutationCreateMemberArgs = { + input: UserAndOrganizationInput; +}; + + +export type MutationCreateMessageChatArgs = { + data: MessageChatInput; +}; + + +export type MutationCreateNoteArgs = { + data: NoteInput; +}; + + +export type MutationCreateOrganizationArgs = { + data?: InputMaybe; + file?: InputMaybe; +}; + + +export type MutationCreatePluginArgs = { + pluginCreatedBy: Scalars['String']['input']; + pluginDesc: Scalars['String']['input']; + pluginName: Scalars['String']['input']; + uninstalledOrgs?: InputMaybe>; +}; + + +export type MutationCreatePostArgs = { + data: PostInput; + file?: InputMaybe; +}; + + +export type MutationCreateUserFamilyArgs = { + data: CreateUserFamilyInput; +}; + + +export type MutationCreateUserTagArgs = { + input: CreateUserTagInput; +}; + + +export type MutationCreateVenueArgs = { + data: VenueInput; +}; + + +export type MutationDeleteAdvertisementArgs = { + id: Scalars['ID']['input']; +}; + + +export type MutationDeleteAgendaCategoryArgs = { + id: Scalars['ID']['input']; +}; + + +export type MutationDeleteDonationByIdArgs = { + id: Scalars['ID']['input']; +}; + + +export type MutationDeleteNoteArgs = { + id: Scalars['ID']['input']; +}; + + +export type MutationDeleteVenueArgs = { + id: Scalars['ID']['input']; +}; + + +export type MutationEditVenueArgs = { + data: EditVenueInput; +}; + + +export type MutationForgotPasswordArgs = { + data: ForgotPasswordData; +}; + + +export type MutationInviteEventAttendeeArgs = { + data: EventAttendeeInput; +}; + + +export type MutationJoinPublicOrganizationArgs = { + organizationId: Scalars['ID']['input']; +}; + + +export type MutationLeaveOrganizationArgs = { + organizationId: Scalars['ID']['input']; +}; + + +export type MutationLikeCommentArgs = { + id: Scalars['ID']['input']; +}; + + +export type MutationLikePostArgs = { + id: Scalars['ID']['input']; +}; + + +export type MutationLoginArgs = { + data: LoginInput; +}; + + +export type MutationOtpArgs = { + data: OtpInput; +}; + + +export type MutationRecaptchaArgs = { + data: RecaptchaVerification; +}; + + +export type MutationRefreshTokenArgs = { + refreshToken: Scalars['String']['input']; +}; + + +export type MutationRegisterEventAttendeeArgs = { + data: EventAttendeeInput; +}; + + +export type MutationRegisterForEventArgs = { + id: Scalars['ID']['input']; +}; + + +export type MutationRejectMembershipRequestArgs = { + membershipRequestId: Scalars['ID']['input']; +}; + + +export type MutationRemoveActionItemArgs = { + id: Scalars['ID']['input']; +}; + + +export type MutationRemoveAdminArgs = { + data: UserAndOrganizationInput; +}; + + +export type MutationRemoveAdvertisementArgs = { + id: Scalars['ID']['input']; +}; + + +export type MutationRemoveAgendaItemArgs = { + id: Scalars['ID']['input']; +}; + + +export type MutationRemoveAgendaSectionArgs = { + id: Scalars['ID']['input']; +}; + + +export type MutationRemoveCommentArgs = { + id: Scalars['ID']['input']; +}; + + +export type MutationRemoveDirectChatArgs = { + chatId: Scalars['ID']['input']; + organizationId: Scalars['ID']['input']; +}; + + +export type MutationRemoveEventArgs = { + id: Scalars['ID']['input']; + recurringEventDeleteType?: InputMaybe; +}; + + +export type MutationRemoveEventAttendeeArgs = { + data: EventAttendeeInput; +}; + + +export type MutationRemoveEventVolunteerArgs = { + id: Scalars['ID']['input']; +}; + + +export type MutationRemoveEventVolunteerGroupArgs = { + id: Scalars['ID']['input']; +}; + + +export type MutationRemoveFundraisingCampaignPledgeArgs = { + id: Scalars['ID']['input']; +}; + + +export type MutationRemoveGroupChatArgs = { + chatId: Scalars['ID']['input']; +}; + + +export type MutationRemoveMemberArgs = { + data: UserAndOrganizationInput; +}; + + +export type MutationRemoveOrganizationArgs = { + id: Scalars['ID']['input']; +}; + + +export type MutationRemoveOrganizationCustomFieldArgs = { + customFieldId: Scalars['ID']['input']; + organizationId: Scalars['ID']['input']; +}; + + +export type MutationRemoveOrganizationImageArgs = { + organizationId: Scalars['String']['input']; +}; + + +export type MutationRemovePostArgs = { + id: Scalars['ID']['input']; +}; + + +export type MutationRemoveUserCustomDataArgs = { + organizationId: Scalars['ID']['input']; +}; + + +export type MutationRemoveUserFamilyArgs = { + familyId: Scalars['ID']['input']; +}; + + +export type MutationRemoveUserFromGroupChatArgs = { + chatId: Scalars['ID']['input']; + userId: Scalars['ID']['input']; +}; + + +export type MutationRemoveUserFromUserFamilyArgs = { + familyId: Scalars['ID']['input']; + userId: Scalars['ID']['input']; +}; + + +export type MutationRemoveUserTagArgs = { + id: Scalars['ID']['input']; +}; + + +export type MutationSaveFcmTokenArgs = { + token?: InputMaybe; +}; + + +export type MutationSendMembershipRequestArgs = { + organizationId: Scalars['ID']['input']; +}; + + +export type MutationSendMessageToDirectChatArgs = { + chatId: Scalars['ID']['input']; + messageContent: Scalars['String']['input']; +}; + + +export type MutationSendMessageToGroupChatArgs = { + chatId: Scalars['ID']['input']; + messageContent: Scalars['String']['input']; +}; + + +export type MutationSignUpArgs = { + data: UserInput; + file?: InputMaybe; +}; + + +export type MutationTogglePostPinArgs = { + id: Scalars['ID']['input']; + title?: InputMaybe; +}; + + +export type MutationUnassignUserTagArgs = { + input: ToggleUserTagAssignInput; +}; + + +export type MutationUnblockUserArgs = { + organizationId: Scalars['ID']['input']; + userId: Scalars['ID']['input']; +}; + + +export type MutationUnlikeCommentArgs = { + id: Scalars['ID']['input']; +}; + + +export type MutationUnlikePostArgs = { + id: Scalars['ID']['input']; +}; + + +export type MutationUnregisterForEventByUserArgs = { + id: Scalars['ID']['input']; +}; + + +export type MutationUpdateActionItemArgs = { + data: UpdateActionItemInput; + id: Scalars['ID']['input']; +}; + + +export type MutationUpdateActionItemCategoryArgs = { + data: UpdateActionItemCategoryInput; + id: Scalars['ID']['input']; +}; + + +export type MutationUpdateAdvertisementArgs = { + input: UpdateAdvertisementInput; +}; + + +export type MutationUpdateAgendaCategoryArgs = { + id: Scalars['ID']['input']; + input: UpdateAgendaCategoryInput; +}; + + +export type MutationUpdateAgendaItemArgs = { + id: Scalars['ID']['input']; + input: UpdateAgendaItemInput; +}; + + +export type MutationUpdateAgendaSectionArgs = { + id: Scalars['ID']['input']; + input: UpdateAgendaSectionInput; +}; + + +export type MutationUpdateCommunityArgs = { + data: UpdateCommunityInput; +}; + + +export type MutationUpdateEventArgs = { + data: UpdateEventInput; + id: Scalars['ID']['input']; + recurrenceRuleData?: InputMaybe; + recurringEventUpdateType?: InputMaybe; +}; + + +export type MutationUpdateEventVolunteerArgs = { + data?: InputMaybe; + id: Scalars['ID']['input']; +}; + + +export type MutationUpdateEventVolunteerGroupArgs = { + data?: InputMaybe; + id: Scalars['ID']['input']; +}; + + +export type MutationUpdateFundArgs = { + data: UpdateFundInput; + id: Scalars['ID']['input']; +}; + + +export type MutationUpdateFundraisingCampaignArgs = { + data: UpdateFundCampaignInput; + id: Scalars['ID']['input']; +}; + + +export type MutationUpdateFundraisingCampaignPledgeArgs = { + data: UpdateFundCampaignPledgeInput; + id: Scalars['ID']['input']; +}; + + +export type MutationUpdateLanguageArgs = { + languageCode: Scalars['String']['input']; +}; + + +export type MutationUpdateNoteArgs = { + data: UpdateNoteInput; + id: Scalars['ID']['input']; +}; + + +export type MutationUpdateOrganizationArgs = { + data?: InputMaybe; + file?: InputMaybe; + id: Scalars['ID']['input']; +}; + + +export type MutationUpdatePluginStatusArgs = { + id: Scalars['ID']['input']; + orgId: Scalars['ID']['input']; +}; + + +export type MutationUpdatePostArgs = { + data?: InputMaybe; + id: Scalars['ID']['input']; +}; + + +export type MutationUpdateUserPasswordArgs = { + data: UpdateUserPasswordInput; +}; + + +export type MutationUpdateUserProfileArgs = { + data?: InputMaybe; + file?: InputMaybe; +}; + + +export type MutationUpdateUserRoleInOrganizationArgs = { + organizationId: Scalars['ID']['input']; + role: Scalars['String']['input']; + userId: Scalars['ID']['input']; +}; + + +export type MutationUpdateUserTagArgs = { + input: UpdateUserTagInput; +}; + +export type Note = { + __typename?: 'Note'; + _id: Scalars['ID']['output']; + agendaItemId: Scalars['ID']['output']; + content: Scalars['String']['output']; + createdAt: Scalars['DateTime']['output']; + createdBy: User; + updatedAt: Scalars['DateTime']['output']; + updatedBy: User; +}; + +export type NoteInput = { + agendaItemId: Scalars['ID']['input']; + content: Scalars['String']['input']; +}; + +export type OtpInput = { + email: Scalars['EmailAddress']['input']; +}; + +export type Organization = { + __typename?: 'Organization'; + _id: Scalars['ID']['output']; + actionItemCategories?: Maybe>>; + address?: Maybe
    ; + admins?: Maybe>; + advertisements?: Maybe; + agendaCategories?: Maybe>>; + apiUrl: Scalars['URL']['output']; + blockedUsers?: Maybe>>; + createdAt: Scalars['DateTime']['output']; + creator?: Maybe; + customFields: Array; + description: Scalars['String']['output']; + funds?: Maybe>>; + image?: Maybe; + members?: Maybe>>; + membershipRequests?: Maybe>>; + name: Scalars['String']['output']; + pinnedPosts?: Maybe>>; + posts?: Maybe; + updatedAt: Scalars['DateTime']['output']; + userRegistrationRequired: Scalars['Boolean']['output']; + userTags?: Maybe; + venues?: Maybe>>; + visibleInSearch: Scalars['Boolean']['output']; +}; + + +export type OrganizationAdminsArgs = { + adminId?: InputMaybe; +}; + + +export type OrganizationAdvertisementsArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; +}; + + +export type OrganizationMembershipRequestsArgs = { + first?: InputMaybe; + skip?: InputMaybe; + where?: InputMaybe; +}; + + +export type OrganizationPostsArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; +}; + + +export type OrganizationUserTagsArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; +}; + +export type OrganizationCustomField = { + __typename?: 'OrganizationCustomField'; + _id: Scalars['ID']['output']; + name: Scalars['String']['output']; + organizationId: Scalars['String']['output']; + type: Scalars['String']['output']; +}; + +export type OrganizationInfoNode = { + __typename?: 'OrganizationInfoNode'; + _id: Scalars['ID']['output']; + apiUrl: Scalars['URL']['output']; + creator?: Maybe; + description: Scalars['String']['output']; + image?: Maybe; + name: Scalars['String']['output']; + userRegistrationRequired: Scalars['Boolean']['output']; + visibleInSearch: Scalars['Boolean']['output']; +}; + +export type OrganizationInput = { + address: AddressInput; + apiUrl?: InputMaybe; + attendees?: InputMaybe; + description: Scalars['String']['input']; + image?: InputMaybe; + name: Scalars['String']['input']; + userRegistrationRequired?: InputMaybe; + visibleInSearch?: InputMaybe; +}; + +export type OrganizationMemberNotFoundError = Error & { + __typename?: 'OrganizationMemberNotFoundError'; + message: Scalars['String']['output']; +}; + +export type OrganizationNotFoundError = Error & { + __typename?: 'OrganizationNotFoundError'; + message: Scalars['String']['output']; +}; + +export type OrganizationOrderByInput = + | 'apiUrl_ASC' + | 'apiUrl_DESC' + | 'createdAt_ASC' + | 'createdAt_DESC' + | 'description_ASC' + | 'description_DESC' + | 'id_ASC' + | 'id_DESC' + | 'name_ASC' + | 'name_DESC'; + +export type OrganizationWhereInput = { + apiUrl?: InputMaybe; + apiUrl_contains?: InputMaybe; + apiUrl_in?: InputMaybe>; + apiUrl_not?: InputMaybe; + apiUrl_not_in?: InputMaybe>; + apiUrl_starts_with?: InputMaybe; + description?: InputMaybe; + description_contains?: InputMaybe; + description_in?: InputMaybe>; + description_not?: InputMaybe; + description_not_in?: InputMaybe>; + description_starts_with?: InputMaybe; + id?: InputMaybe; + id_contains?: InputMaybe; + id_in?: InputMaybe>; + id_not?: InputMaybe; + id_not_in?: InputMaybe>; + id_starts_with?: InputMaybe; + name?: InputMaybe; + name_contains?: InputMaybe; + name_in?: InputMaybe>; + name_not?: InputMaybe; + name_not_in?: InputMaybe>; + name_starts_with?: InputMaybe; + userRegistrationRequired?: InputMaybe; + visibleInSearch?: InputMaybe; +}; + +export type OtpData = { + __typename?: 'OtpData'; + otpToken: Scalars['String']['output']; +}; + +/** Information about pagination in a connection. */ +export type PageInfo = { + __typename?: 'PageInfo'; + currPageNo?: Maybe; + /** When paginating forwards, are there more items? */ + hasNextPage: Scalars['Boolean']['output']; + /** When paginating backwards, are there more items? */ + hasPreviousPage: Scalars['Boolean']['output']; + nextPageNo?: Maybe; + prevPageNo?: Maybe; + totalPages?: Maybe; +}; + +export type PaginationDirection = + | 'BACKWARD' + | 'FORWARD'; + +export type PledgeOrderByInput = + | 'amount_ASC' + | 'amount_DESC' + | 'endDate_ASC' + | 'endDate_DESC' + | 'startDate_ASC' + | 'startDate_DESC'; + +export type PledgeWhereInput = { + campaignId?: InputMaybe; + firstName_contains?: InputMaybe; + id?: InputMaybe; + name_contains?: InputMaybe; +}; + +export type Plugin = { + __typename?: 'Plugin'; + _id: Scalars['ID']['output']; + pluginCreatedBy: Scalars['String']['output']; + pluginDesc: Scalars['String']['output']; + pluginName: Scalars['String']['output']; + uninstalledOrgs?: Maybe>; +}; + +export type PluginField = { + __typename?: 'PluginField'; + createdAt: Scalars['DateTime']['output']; + key: Scalars['String']['output']; + status: Status; + value: Scalars['String']['output']; +}; + +export type PluginFieldInput = { + key: Scalars['String']['input']; + value: Scalars['String']['input']; +}; + +export type PluginInput = { + fields?: InputMaybe>>; + orgId: Scalars['ID']['input']; + pluginKey?: InputMaybe; + pluginName: Scalars['String']['input']; + pluginType?: InputMaybe; +}; + +export type Post = { + __typename?: 'Post'; + _id?: Maybe; + commentCount?: Maybe; + comments?: Maybe>>; + createdAt: Scalars['DateTime']['output']; + creator?: Maybe; + imageUrl?: Maybe; + likeCount?: Maybe; + likedBy?: Maybe>>; + organization: Organization; + pinned?: Maybe; + text: Scalars['String']['output']; + title?: Maybe; + updatedAt: Scalars['DateTime']['output']; + videoUrl?: Maybe; +}; + +export type PostEdge = { + __typename?: 'PostEdge'; + cursor: Scalars['String']['output']; + node: Post; +}; + +export type PostInput = { + _id?: InputMaybe; + imageUrl?: InputMaybe; + organizationId: Scalars['ID']['input']; + pinned?: InputMaybe; + text: Scalars['String']['input']; + title?: InputMaybe; + videoUrl?: InputMaybe; +}; + +export type PostNotFoundError = Error & { + __typename?: 'PostNotFoundError'; + message: Scalars['String']['output']; +}; + +export type PostOrderByInput = + | 'commentCount_ASC' + | 'commentCount_DESC' + | 'createdAt_ASC' + | 'createdAt_DESC' + | 'id_ASC' + | 'id_DESC' + | 'imageUrl_ASC' + | 'imageUrl_DESC' + | 'likeCount_ASC' + | 'likeCount_DESC' + | 'text_ASC' + | 'text_DESC' + | 'title_ASC' + | 'title_DESC' + | 'videoUrl_ASC' + | 'videoUrl_DESC'; + +export type PostUpdateInput = { + imageUrl?: InputMaybe; + text?: InputMaybe; + title?: InputMaybe; + videoUrl?: InputMaybe; +}; + +export type PostWhereInput = { + id?: InputMaybe; + id_contains?: InputMaybe; + id_in?: InputMaybe>; + id_not?: InputMaybe; + id_not_in?: InputMaybe>; + id_starts_with?: InputMaybe; + text?: InputMaybe; + text_contains?: InputMaybe; + text_in?: InputMaybe>; + text_not?: InputMaybe; + text_not_in?: InputMaybe>; + text_starts_with?: InputMaybe; + title?: InputMaybe; + title_contains?: InputMaybe; + title_in?: InputMaybe>; + title_not?: InputMaybe; + title_not_in?: InputMaybe>; + title_starts_with?: InputMaybe; +}; + +export type PostsConnection = { + __typename?: 'PostsConnection'; + edges: Array; + pageInfo: DefaultConnectionPageInfo; + totalCount?: Maybe; +}; + +export type Query = { + __typename?: 'Query'; + actionItemCategoriesByOrganization?: Maybe>>; + actionItemsByEvent?: Maybe>>; + actionItemsByOrganization?: Maybe>>; + adminPlugin?: Maybe>>; + advertisementsConnection?: Maybe; + agendaCategory: AgendaCategory; + agendaItemByEvent?: Maybe>>; + agendaItemByOrganization?: Maybe>>; + agendaItemCategoriesByOrganization?: Maybe>>; + checkAuth: User; + customDataByOrganization: Array; + customFieldsByOrganization?: Maybe>>; + directChatById?: Maybe; + directChatsByUserID?: Maybe>>; + directChatsMessagesByChatID?: Maybe>>; + event?: Maybe; + eventVolunteersByEvent?: Maybe>>; + eventsByOrganization?: Maybe>>; + eventsByOrganizationConnection: Array; + fundsByOrganization?: Maybe>>; + getAgendaItem?: Maybe; + getAgendaSection?: Maybe; + getAllAgendaItems?: Maybe>>; + getAllNotesForAgendaItem?: Maybe>>; + getCommunityData?: Maybe; + getDonationById: Donation; + getDonationByOrgId?: Maybe>>; + getDonationByOrgIdConnection: Array; + getEventAttendee?: Maybe; + getEventAttendeesByEventId?: Maybe>>; + getEventInvitesByUserId: Array; + getEventVolunteerGroups: Array>; + getFundById: Fund; + getFundraisingCampaignPledgeById: FundraisingCampaignPledge; + getFundraisingCampaigns: Array>; + getNoteById: Note; + getPledgesByUserId?: Maybe>>; + getPlugins?: Maybe>>; + getUserTag?: Maybe; + getUserTagAncestors?: Maybe>>; + getVenueByOrgId?: Maybe>>; + getlanguage?: Maybe>>; + groupChatById?: Maybe; + groupChatsByUserId?: Maybe>>; + hasSubmittedFeedback?: Maybe; + isSampleOrganization: Scalars['Boolean']['output']; + joinedOrganizations?: Maybe>>; + me: UserData; + myLanguage?: Maybe; + organizations?: Maybe>>; + organizationsConnection: Array>; + organizationsMemberConnection: UserConnection; + plugin?: Maybe>>; + post?: Maybe; + registeredEventsByUser?: Maybe>>; + registrantsByEvent?: Maybe>>; + user: UserData; + userLanguage?: Maybe; + users?: Maybe>>; + usersConnection: Array>; + venue?: Maybe; +}; + + +export type QueryActionItemCategoriesByOrganizationArgs = { + orderBy?: InputMaybe; + organizationId: Scalars['ID']['input']; + where?: InputMaybe; +}; + + +export type QueryActionItemsByEventArgs = { + eventId: Scalars['ID']['input']; +}; + + +export type QueryActionItemsByOrganizationArgs = { + eventId?: InputMaybe; + orderBy?: InputMaybe; + organizationId: Scalars['ID']['input']; + where?: InputMaybe; +}; + + +export type QueryAdminPluginArgs = { + orgId: Scalars['ID']['input']; +}; + + +export type QueryAdvertisementsConnectionArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; +}; + + +export type QueryAgendaCategoryArgs = { + id: Scalars['ID']['input']; +}; + + +export type QueryAgendaItemByEventArgs = { + relatedEventId: Scalars['ID']['input']; +}; + + +export type QueryAgendaItemByOrganizationArgs = { + organizationId: Scalars['ID']['input']; +}; + + +export type QueryAgendaItemCategoriesByOrganizationArgs = { + organizationId: Scalars['ID']['input']; +}; + + +export type QueryCustomDataByOrganizationArgs = { + organizationId: Scalars['ID']['input']; +}; + + +export type QueryCustomFieldsByOrganizationArgs = { + id: Scalars['ID']['input']; +}; + + +export type QueryDirectChatByIdArgs = { + id: Scalars['ID']['input']; +}; + + +export type QueryDirectChatsByUserIdArgs = { + id: Scalars['ID']['input']; +}; + + +export type QueryDirectChatsMessagesByChatIdArgs = { + id: Scalars['ID']['input']; +}; + + +export type QueryEventArgs = { + id: Scalars['ID']['input']; +}; + + +export type QueryEventVolunteersByEventArgs = { + id: Scalars['ID']['input']; +}; + + +export type QueryEventsByOrganizationArgs = { + id?: InputMaybe; + orderBy?: InputMaybe; +}; + + +export type QueryEventsByOrganizationConnectionArgs = { + first?: InputMaybe; + orderBy?: InputMaybe; + skip?: InputMaybe; + where?: InputMaybe; +}; + + +export type QueryFundsByOrganizationArgs = { + orderBy?: InputMaybe; + organizationId: Scalars['ID']['input']; + where?: InputMaybe; +}; + + +export type QueryGetAgendaItemArgs = { + id: Scalars['ID']['input']; +}; + + +export type QueryGetAgendaSectionArgs = { + id: Scalars['ID']['input']; +}; + + +export type QueryGetAllNotesForAgendaItemArgs = { + agendaItemId: Scalars['ID']['input']; +}; + + +export type QueryGetDonationByIdArgs = { + id: Scalars['ID']['input']; +}; + + +export type QueryGetDonationByOrgIdArgs = { + orgId: Scalars['ID']['input']; +}; + + +export type QueryGetDonationByOrgIdConnectionArgs = { + first?: InputMaybe; + orgId: Scalars['ID']['input']; + skip?: InputMaybe; + where?: InputMaybe; +}; + + +export type QueryGetEventAttendeeArgs = { + eventId: Scalars['ID']['input']; + userId: Scalars['ID']['input']; +}; + + +export type QueryGetEventAttendeesByEventIdArgs = { + eventId: Scalars['ID']['input']; +}; + + +export type QueryGetEventInvitesByUserIdArgs = { + userId: Scalars['ID']['input']; +}; + + +export type QueryGetEventVolunteerGroupsArgs = { + where?: InputMaybe; +}; + + +export type QueryGetFundByIdArgs = { + id: Scalars['ID']['input']; + orderBy?: InputMaybe; + where?: InputMaybe; +}; + + +export type QueryGetFundraisingCampaignPledgeByIdArgs = { + id: Scalars['ID']['input']; +}; + + +export type QueryGetFundraisingCampaignsArgs = { + campaignOrderby?: InputMaybe; + pledgeOrderBy?: InputMaybe; + where?: InputMaybe; +}; + + +export type QueryGetNoteByIdArgs = { + id: Scalars['ID']['input']; +}; + + +export type QueryGetPledgesByUserIdArgs = { + orderBy?: InputMaybe; + userId: Scalars['ID']['input']; + where?: InputMaybe; +}; + + +export type QueryGetUserTagArgs = { + id: Scalars['ID']['input']; +}; + + +export type QueryGetUserTagAncestorsArgs = { + id: Scalars['ID']['input']; +}; + + +export type QueryGetVenueByOrgIdArgs = { + first?: InputMaybe; + orderBy?: InputMaybe; + orgId: Scalars['ID']['input']; + skip?: InputMaybe; + where?: InputMaybe; +}; + + +export type QueryGetlanguageArgs = { + lang_code: Scalars['String']['input']; +}; + + +export type QueryGroupChatByIdArgs = { + id: Scalars['ID']['input']; +}; + + +export type QueryGroupChatsByUserIdArgs = { + id: Scalars['ID']['input']; +}; + + +export type QueryHasSubmittedFeedbackArgs = { + eventId: Scalars['ID']['input']; + userId: Scalars['ID']['input']; +}; + + +export type QueryIsSampleOrganizationArgs = { + id: Scalars['ID']['input']; +}; + + +export type QueryJoinedOrganizationsArgs = { + id?: InputMaybe; +}; + + +export type QueryOrganizationsArgs = { + first?: InputMaybe; + id?: InputMaybe; + orderBy?: InputMaybe; + skip?: InputMaybe; + where?: InputMaybe; +}; + + +export type QueryOrganizationsConnectionArgs = { + first?: InputMaybe; + orderBy?: InputMaybe; + skip?: InputMaybe; + where?: InputMaybe; +}; + + +export type QueryOrganizationsMemberConnectionArgs = { + first?: InputMaybe; + orderBy?: InputMaybe; + orgId: Scalars['ID']['input']; + skip?: InputMaybe; + where?: InputMaybe; +}; + + +export type QueryPluginArgs = { + orgId: Scalars['ID']['input']; +}; + + +export type QueryPostArgs = { + id: Scalars['ID']['input']; +}; + + +export type QueryRegisteredEventsByUserArgs = { + id?: InputMaybe; + orderBy?: InputMaybe; +}; + + +export type QueryRegistrantsByEventArgs = { + id: Scalars['ID']['input']; +}; + + +export type QueryUserArgs = { + id: Scalars['ID']['input']; +}; + + +export type QueryUserLanguageArgs = { + userId: Scalars['ID']['input']; +}; + + +export type QueryUsersArgs = { + first?: InputMaybe; + orderBy?: InputMaybe; + skip?: InputMaybe; + where?: InputMaybe; +}; + + +export type QueryUsersConnectionArgs = { + first?: InputMaybe; + orderBy?: InputMaybe; + skip?: InputMaybe; + where?: InputMaybe; +}; + + +export type QueryVenueArgs = { + id: Scalars['ID']['input']; +}; + +export type RecaptchaVerification = { + recaptchaToken: Scalars['String']['input']; +}; + +export type RecurrenceRule = { + __typename?: 'RecurrenceRule'; + baseRecurringEvent?: Maybe; + count?: Maybe; + frequency: Frequency; + interval: Scalars['PositiveInt']['output']; + latestInstanceDate?: Maybe; + organization?: Maybe; + recurrenceEndDate?: Maybe; + recurrenceRuleString: Scalars['String']['output']; + recurrenceStartDate: Scalars['Date']['output']; + weekDayOccurenceInMonth?: Maybe; + weekDays?: Maybe>>; +}; + +export type RecurrenceRuleInput = { + count?: InputMaybe; + frequency?: InputMaybe; + interval?: InputMaybe; + recurrenceEndDate?: InputMaybe; + recurrenceStartDate?: InputMaybe; + weekDayOccurenceInMonth?: InputMaybe; + weekDays?: InputMaybe>>; +}; + +export type RecurringEventMutationType = + | 'allInstances' + | 'thisAndFollowingInstances' + | 'thisInstance'; + +export type SocialMediaUrls = { + __typename?: 'SocialMediaUrls'; + X?: Maybe; + facebook?: Maybe; + gitHub?: Maybe; + instagram?: Maybe; + linkedIn?: Maybe; + reddit?: Maybe; + slack?: Maybe; + youTube?: Maybe; +}; + +export type SocialMediaUrlsInput = { + X?: InputMaybe; + facebook?: InputMaybe; + gitHub?: InputMaybe; + instagram?: InputMaybe; + linkedIn?: InputMaybe; + reddit?: InputMaybe; + slack?: InputMaybe; + youTube?: InputMaybe; +}; + +/** + * Possible variants of ordering in which sorting on a field should be + * applied for a connection or other list type data structures. + */ +export type SortedByOrder = + /** + * When the sorting order should be from the smallest value to largest + * value. + */ + | 'ASCENDING' + /** + * When the sorting order should be from the largest value to the smallest + * value. + */ + | 'DESCENDING'; + +export type Status = + | 'ACTIVE' + | 'BLOCKED' + | 'DELETED'; + +export type Subscription = { + __typename?: 'Subscription'; + directMessageChat?: Maybe; + messageSentToDirectChat?: Maybe; + messageSentToGroupChat?: Maybe; + onPluginUpdate?: Maybe; +}; + + +export type SubscriptionMessageSentToDirectChatArgs = { + userId: Scalars['ID']['input']; +}; + + +export type SubscriptionMessageSentToGroupChatArgs = { + userId: Scalars['ID']['input']; +}; + +export type ToggleUserTagAssignInput = { + tagId: Scalars['ID']['input']; + userId: Scalars['ID']['input']; +}; + +export type Translation = { + __typename?: 'Translation'; + en_value?: Maybe; + lang_code?: Maybe; + translation?: Maybe; + verified?: Maybe; +}; + +export type Type = + | 'PRIVATE' + | 'UNIVERSAL'; + +export type UnauthenticatedError = Error & { + __typename?: 'UnauthenticatedError'; + message: Scalars['String']['output']; +}; + +export type UnauthorizedError = Error & { + __typename?: 'UnauthorizedError'; + message: Scalars['String']['output']; +}; + +export type UpdateActionItemCategoryInput = { + isDisabled?: InputMaybe; + name?: InputMaybe; +}; + +export type UpdateActionItemInput = { + allotedHours?: InputMaybe; + assigneeId?: InputMaybe; + completionDate?: InputMaybe; + dueDate?: InputMaybe; + isCompleted?: InputMaybe; + postCompletionNotes?: InputMaybe; + preCompletionNotes?: InputMaybe; +}; + +export type UpdateAdvertisementInput = { + _id: Scalars['ID']['input']; + endDate?: InputMaybe; + mediaFile?: InputMaybe; + name?: InputMaybe; + startDate?: InputMaybe; + type?: InputMaybe; +}; + +export type UpdateAdvertisementPayload = { + __typename?: 'UpdateAdvertisementPayload'; + advertisement?: Maybe; +}; + +export type UpdateAgendaCategoryInput = { + description?: InputMaybe; + name?: InputMaybe; +}; + +export type UpdateAgendaItemInput = { + attachments?: InputMaybe>>; + categories?: InputMaybe>>; + description?: InputMaybe; + duration?: InputMaybe; + relatedEvent?: InputMaybe; + sequence?: InputMaybe; + title?: InputMaybe; + urls?: InputMaybe>>; + users?: InputMaybe>>; +}; + +export type UpdateAgendaSectionInput = { + description?: InputMaybe; + relatedEvent?: InputMaybe; + sequence?: InputMaybe; +}; + +export type UpdateCommunityInput = { + logo: Scalars['String']['input']; + name: Scalars['String']['input']; + socialMediaUrls: SocialMediaUrlsInput; + websiteLink: Scalars['String']['input']; +}; + +export type UpdateEventInput = { + allDay?: InputMaybe; + description?: InputMaybe; + endDate?: InputMaybe; + endTime?: InputMaybe; + images?: InputMaybe>>; + isPublic?: InputMaybe; + isRecurringEventException?: InputMaybe; + isRegisterable?: InputMaybe; + latitude?: InputMaybe; + location?: InputMaybe; + longitude?: InputMaybe; + recurring?: InputMaybe; + startDate?: InputMaybe; + startTime?: InputMaybe; + title?: InputMaybe; +}; + +export type UpdateEventVolunteerGroupInput = { + eventId?: InputMaybe; + name?: InputMaybe; + volunteersRequired?: InputMaybe; +}; + +export type UpdateEventVolunteerInput = { + eventId?: InputMaybe; + isAssigned?: InputMaybe; + isInvited?: InputMaybe; + response?: InputMaybe; +}; + +export type UpdateFundCampaignInput = { + currency?: InputMaybe; + endDate?: InputMaybe; + fundingGoal?: InputMaybe; + name?: InputMaybe; + startDate?: InputMaybe; +}; + +export type UpdateFundCampaignPledgeInput = { + amount?: InputMaybe; + currency?: InputMaybe; + endDate?: InputMaybe; + startDate?: InputMaybe; + users?: InputMaybe>>; +}; + +export type UpdateFundInput = { + isArchived?: InputMaybe; + isDefault?: InputMaybe; + name?: InputMaybe; + refrenceNumber?: InputMaybe; + taxDeductible?: InputMaybe; +}; + +export type UpdateNoteInput = { + content?: InputMaybe; + updatedBy: Scalars['ID']['input']; +}; + +export type UpdateOrganizationInput = { + address?: InputMaybe; + description?: InputMaybe; + name?: InputMaybe; + userRegistrationRequired?: InputMaybe; + visibleInSearch?: InputMaybe; +}; + +export type UpdateUserInput = { + address?: InputMaybe; + appLanguageCode?: InputMaybe; + birthDate?: InputMaybe; + educationGrade?: InputMaybe; + email?: InputMaybe; + employmentStatus?: InputMaybe; + firstName?: InputMaybe; + gender?: InputMaybe; + lastName?: InputMaybe; + maritalStatus?: InputMaybe; + phone?: InputMaybe; +}; + +export type UpdateUserPasswordInput = { + confirmNewPassword: Scalars['String']['input']; + newPassword: Scalars['String']['input']; + previousPassword: Scalars['String']['input']; +}; + +export type UpdateUserTagInput = { + name: Scalars['String']['input']; + tagColor?: InputMaybe; + tagId: Scalars['ID']['input']; +}; + +export type User = { + __typename?: 'User'; + _id: Scalars['ID']['output']; + address?: Maybe
    ; + appUserProfileId?: Maybe; + birthDate?: Maybe; + createdAt: Scalars['DateTime']['output']; + educationGrade?: Maybe; + email: Scalars['EmailAddress']['output']; + employmentStatus?: Maybe; + eventAdmin?: Maybe>>; + firstName: Scalars['String']['output']; + gender?: Maybe; + identifier: Scalars['Int']['output']; + image?: Maybe; + joinedOrganizations?: Maybe>>; + lastName: Scalars['String']['output']; + maritalStatus?: Maybe; + membershipRequests?: Maybe>>; + organizationsBlockedBy?: Maybe>>; + phone?: Maybe; + pluginCreationAllowed: Scalars['Boolean']['output']; + posts?: Maybe; + registeredEvents?: Maybe>>; + tagsAssignedWith?: Maybe; + updatedAt: Scalars['DateTime']['output']; +}; + + +export type UserPostsArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; +}; + + +export type UserTagsAssignedWithArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; + organizationId?: InputMaybe; +}; + +export type UserAndOrganizationInput = { + organizationId: Scalars['ID']['input']; + userId: Scalars['ID']['input']; +}; + +export type UserConnection = { + __typename?: 'UserConnection'; + aggregate: AggregateUser; + edges: Array>; + pageInfo: PageInfo; +}; + +export type UserCustomData = { + __typename?: 'UserCustomData'; + _id: Scalars['ID']['output']; + organizationId: Scalars['ID']['output']; + userId: Scalars['ID']['output']; + values: Scalars['JSON']['output']; +}; + +export type UserData = { + __typename?: 'UserData'; + appUserProfile?: Maybe; + user: User; +}; + +export type UserFamily = { + __typename?: 'UserFamily'; + _id: Scalars['ID']['output']; + admins: Array; + creator: User; + title?: Maybe; + users: Array; +}; + +export type UserInput = { + appLanguageCode?: InputMaybe; + email: Scalars['EmailAddress']['input']; + firstName: Scalars['String']['input']; + lastName: Scalars['String']['input']; + password: Scalars['String']['input']; + selectedOrganization: Scalars['ID']['input']; +}; + +export type UserNotAuthorizedAdminError = Error & { + __typename?: 'UserNotAuthorizedAdminError'; + message: Scalars['String']['output']; +}; + +export type UserNotAuthorizedError = Error & { + __typename?: 'UserNotAuthorizedError'; + message: Scalars['String']['output']; +}; + +export type UserNotFoundError = Error & { + __typename?: 'UserNotFoundError'; + message: Scalars['String']['output']; +}; + +export type UserOrderByInput = + | 'createdAt_ASC' + | 'createdAt_DESC' + | 'email_ASC' + | 'email_DESC' + | 'firstName_ASC' + | 'firstName_DESC' + | 'id_ASC' + | 'id_DESC' + | 'lastName_ASC' + | 'lastName_DESC'; + +export type UserPhone = { + __typename?: 'UserPhone'; + home?: Maybe; + mobile?: Maybe; + work?: Maybe; +}; + +export type UserPhoneInput = { + home?: InputMaybe; + mobile?: InputMaybe; + work?: InputMaybe; +}; + +export type UserTag = { + __typename?: 'UserTag'; + /** A field to get the mongodb object id identifier for this UserTag. */ + _id: Scalars['ID']['output']; + /** + * A connection field to traverse a list of UserTag this UserTag is a + * parent to. + */ + childTags?: Maybe; + /** A field to get the name of this UserTag. */ + name: Scalars['String']['output']; + /** A field to traverse the Organization that created this UserTag. */ + organization?: Maybe; + /** A field to traverse the parent UserTag of this UserTag. */ + parentTag?: Maybe; + /** + * A connection field to traverse a list of User this UserTag is assigned + * to. + */ + usersAssignedTo?: Maybe; +}; + + +export type UserTagChildTagsArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; +}; + + +export type UserTagUsersAssignedToArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; +}; + +/** A default connection on the UserTag type. */ +export type UserTagsConnection = { + __typename?: 'UserTagsConnection'; + edges: Array; + pageInfo: DefaultConnectionPageInfo; + totalCount?: Maybe; +}; + +/** A default connection edge on the UserTag type for UserTagsConnection. */ +export type UserTagsConnectionEdge = { + __typename?: 'UserTagsConnectionEdge'; + cursor: Scalars['String']['output']; + node: UserTag; +}; + +export type UserType = + | 'ADMIN' + | 'NON_USER' + | 'SUPERADMIN' + | 'USER'; + +export type UserWhereInput = { + email?: InputMaybe; + email_contains?: InputMaybe; + email_in?: InputMaybe>; + email_not?: InputMaybe; + email_not_in?: InputMaybe>; + email_starts_with?: InputMaybe; + event_title_contains?: InputMaybe; + firstName?: InputMaybe; + firstName_contains?: InputMaybe; + firstName_in?: InputMaybe>; + firstName_not?: InputMaybe; + firstName_not_in?: InputMaybe>; + firstName_starts_with?: InputMaybe; + id?: InputMaybe; + id_contains?: InputMaybe; + id_in?: InputMaybe>; + id_not?: InputMaybe; + id_not_in?: InputMaybe>; + id_starts_with?: InputMaybe; + lastName?: InputMaybe; + lastName_contains?: InputMaybe; + lastName_in?: InputMaybe>; + lastName_not?: InputMaybe; + lastName_not_in?: InputMaybe>; + lastName_starts_with?: InputMaybe; +}; + +/** A default connection on the User type. */ +export type UsersConnection = { + __typename?: 'UsersConnection'; + edges: Array; + pageInfo: DefaultConnectionPageInfo; + totalCount?: Maybe; +}; + +/** A default connection edge on the User type for UsersConnection. */ +export type UsersConnectionEdge = { + __typename?: 'UsersConnectionEdge'; + cursor: Scalars['String']['output']; + node: User; +}; + +export type Venue = { + __typename?: 'Venue'; + _id: Scalars['ID']['output']; + capacity: Scalars['Int']['output']; + description?: Maybe; + imageUrl?: Maybe; + name: Scalars['String']['output']; + organization: Organization; +}; + +export type VenueInput = { + capacity: Scalars['Int']['input']; + description?: InputMaybe; + file?: InputMaybe; + name: Scalars['String']['input']; + organizationId: Scalars['ID']['input']; +}; + +export type VenueOrderByInput = + | 'capacity_ASC' + | 'capacity_DESC'; + +export type VenueWhereInput = { + description_contains?: InputMaybe; + description_starts_with?: InputMaybe; + name_contains?: InputMaybe; + name_starts_with?: InputMaybe; +}; + +export type WeekDays = + | 'FRIDAY' + | 'MONDAY' + | 'SATURDAY' + | 'SUNDAY' + | 'THURSDAY' + | 'TUESDAY' + | 'WEDNESDAY'; + +export type CreateChatInput = { + organizationId?: InputMaybe; + userIds: Array; +}; + +export type CreateDirectChatPayload = { + __typename?: 'createDirectChatPayload'; + directChat?: Maybe; + userErrors: Array; +}; + +export type CreateGroupChatInput = { + organizationId: Scalars['ID']['input']; + title: Scalars['String']['input']; + userIds: Array; +}; + +export type CreateUserFamilyInput = { + title: Scalars['String']['input']; + userIds: Array; +}; + + + +export type ResolverTypeWrapper = Promise | T; + +export type Resolver = ResolverFn; + +export type ResolverFn = ( + parent: TParent, + args: TArgs, + context: TContext, + info?: GraphQLResolveInfo +) => Promise | TResult; + +export type SubscriptionSubscribeFn = ( + parent: TParent, + args: TArgs, + context: TContext, + info?: GraphQLResolveInfo +) => AsyncIterable | Promise>; + +export type SubscriptionResolveFn = ( + parent: TParent, + args: TArgs, + context: TContext, + info?: GraphQLResolveInfo +) => TResult | Promise; + +export interface SubscriptionSubscriberObject { + subscribe: SubscriptionSubscribeFn<{ [key in TKey]: TResult }, TParent, TContext, TArgs>; + resolve?: SubscriptionResolveFn; +} + +export interface SubscriptionResolverObject { + subscribe: SubscriptionSubscribeFn; + resolve: SubscriptionResolveFn; +} + +export type SubscriptionObject = + | SubscriptionSubscriberObject + | SubscriptionResolverObject; + +export type SubscriptionResolver = + | ((...args: any[]) => SubscriptionObject) + | SubscriptionObject; + +export type TypeResolveFn = ( + parent: TParent, + context: TContext, + info?: GraphQLResolveInfo +) => Maybe | Promise>; + +export type IsTypeOfResolverFn = (obj: T, context: TContext, info?: GraphQLResolveInfo) => boolean | Promise; + +export type NextResolverFn = () => Promise; + +export type DirectiveResolverFn = ( + next: NextResolverFn, + parent: TParent, + args: TArgs, + context: TContext, + info?: GraphQLResolveInfo +) => TResult | Promise; + +/** Mapping of union types */ +export type ResolversUnionTypes<_RefType extends Record> = { + ConnectionError: ( InvalidCursor ) | ( MaximumValueError ); + CreateAdminError: ( OrganizationMemberNotFoundError ) | ( OrganizationNotFoundError ) | ( UserNotAuthorizedError ) | ( UserNotFoundError ); + CreateCommentError: ( PostNotFoundError ); + CreateDirectChatError: ( OrganizationNotFoundError ) | ( UserNotFoundError ); + CreateMemberError: ( MemberNotFoundError ) | ( OrganizationNotFoundError ) | ( UserNotAuthorizedAdminError ) | ( UserNotAuthorizedError ) | ( UserNotFoundError ); +}; + +/** Mapping of interface types */ +export type ResolversInterfaceTypes<_RefType extends Record> = { + ConnectionPageInfo: ( DefaultConnectionPageInfo ); + Error: ( MemberNotFoundError ) | ( OrganizationMemberNotFoundError ) | ( OrganizationNotFoundError ) | ( PostNotFoundError ) | ( UnauthenticatedError ) | ( UnauthorizedError ) | ( UserNotAuthorizedAdminError ) | ( UserNotAuthorizedError ) | ( UserNotFoundError ); + FieldError: ( InvalidCursor ) | ( MaximumLengthError ) | ( MaximumValueError ) | ( MinimumLengthError ) | ( MinimumValueError ); +}; + +/** Mapping between all available schema types and the resolvers types */ +export type ResolversTypes = { + ActionItem: ResolverTypeWrapper; + ActionItemCategory: ResolverTypeWrapper; + ActionItemCategoryWhereInput: ActionItemCategoryWhereInput; + ActionItemWhereInput: ActionItemWhereInput; + ActionItemsOrderByInput: ActionItemsOrderByInput; + Address: ResolverTypeWrapper
    ; + AddressInput: AddressInput; + Advertisement: ResolverTypeWrapper; + AdvertisementEdge: ResolverTypeWrapper & { node?: Maybe }>; + AdvertisementType: AdvertisementType; + AdvertisementsConnection: ResolverTypeWrapper & { edges?: Maybe>> }>; + AgendaCategory: ResolverTypeWrapper; + AgendaItem: ResolverTypeWrapper; + AgendaSection: ResolverTypeWrapper; + AggregatePost: ResolverTypeWrapper; + AggregateUser: ResolverTypeWrapper; + Any: ResolverTypeWrapper; + AppUserProfile: ResolverTypeWrapper; + AuthData: ResolverTypeWrapper & { appUserProfile: ResolversTypes['AppUserProfile'], user: ResolversTypes['User'] }>; + Boolean: ResolverTypeWrapper; + CampaignOrderByInput: CampaignOrderByInput; + CampaignWhereInput: CampaignWhereInput; + CheckIn: ResolverTypeWrapper; + CheckInCheckOutInput: CheckInCheckOutInput; + CheckInStatus: ResolverTypeWrapper & { checkIn?: Maybe, user: ResolversTypes['User'] }>; + CheckOut: ResolverTypeWrapper; + Comment: ResolverTypeWrapper; + CommentInput: CommentInput; + Community: ResolverTypeWrapper; + ConnectionError: ResolverTypeWrapper['ConnectionError']>; + ConnectionPageInfo: ResolverTypeWrapper['ConnectionPageInfo']>; + CountryCode: ResolverTypeWrapper; + CreateActionItemInput: CreateActionItemInput; + CreateAdminError: ResolverTypeWrapper['CreateAdminError']>; + CreateAdminPayload: ResolverTypeWrapper & { user?: Maybe, userErrors: Array }>; + CreateAdvertisementInput: CreateAdvertisementInput; + CreateAdvertisementPayload: ResolverTypeWrapper & { advertisement?: Maybe }>; + CreateAgendaCategoryInput: CreateAgendaCategoryInput; + CreateAgendaItemInput: CreateAgendaItemInput; + CreateAgendaSectionInput: CreateAgendaSectionInput; + CreateCommentError: ResolverTypeWrapper['CreateCommentError']>; + CreateCommentPayload: ResolverTypeWrapper & { comment?: Maybe, userErrors: Array }>; + CreateDirectChatError: ResolverTypeWrapper['CreateDirectChatError']>; + CreateMemberError: ResolverTypeWrapper['CreateMemberError']>; + CreateMemberPayload: ResolverTypeWrapper & { organization?: Maybe, userErrors: Array }>; + CreateUserTagInput: CreateUserTagInput; + Currency: Currency; + CursorPaginationInput: CursorPaginationInput; + Date: ResolverTypeWrapper; + DateTime: ResolverTypeWrapper; + DefaultConnectionPageInfo: ResolverTypeWrapper; + DeleteAdvertisementPayload: ResolverTypeWrapper & { advertisement?: Maybe }>; + DeletePayload: ResolverTypeWrapper; + DirectChat: ResolverTypeWrapper; + DirectChatMessage: ResolverTypeWrapper; + Donation: ResolverTypeWrapper; + DonationWhereInput: DonationWhereInput; + EditVenueInput: EditVenueInput; + EducationGrade: EducationGrade; + EmailAddress: ResolverTypeWrapper; + EmploymentStatus: EmploymentStatus; + Error: ResolverTypeWrapper['Error']>; + Event: ResolverTypeWrapper; + EventAttendee: ResolverTypeWrapper; + EventAttendeeInput: EventAttendeeInput; + EventInput: EventInput; + EventOrderByInput: EventOrderByInput; + EventVolunteer: ResolverTypeWrapper; + EventVolunteerGroup: ResolverTypeWrapper; + EventVolunteerGroupInput: EventVolunteerGroupInput; + EventVolunteerGroupWhereInput: EventVolunteerGroupWhereInput; + EventVolunteerInput: EventVolunteerInput; + EventVolunteerResponse: EventVolunteerResponse; + EventWhereInput: EventWhereInput; + ExtendSession: ResolverTypeWrapper; + Feedback: ResolverTypeWrapper; + FeedbackInput: FeedbackInput; + FieldError: ResolverTypeWrapper['FieldError']>; + Float: ResolverTypeWrapper; + ForgotPasswordData: ForgotPasswordData; + Frequency: Frequency; + Fund: ResolverTypeWrapper; + FundCampaignInput: FundCampaignInput; + FundCampaignPledgeInput: FundCampaignPledgeInput; + FundInput: FundInput; + FundOrderByInput: FundOrderByInput; + FundWhereInput: FundWhereInput; + FundraisingCampaign: ResolverTypeWrapper; + FundraisingCampaignPledge: ResolverTypeWrapper; + Gender: Gender; + Group: ResolverTypeWrapper; + GroupChat: ResolverTypeWrapper; + GroupChatMessage: ResolverTypeWrapper; + ID: ResolverTypeWrapper; + Int: ResolverTypeWrapper; + InvalidCursor: ResolverTypeWrapper; + ItemType: ItemType; + JSON: ResolverTypeWrapper; + Language: ResolverTypeWrapper; + LanguageInput: LanguageInput; + LanguageModel: ResolverTypeWrapper; + Latitude: ResolverTypeWrapper; + LoginInput: LoginInput; + Longitude: ResolverTypeWrapper; + MaritalStatus: MaritalStatus; + MaximumLengthError: ResolverTypeWrapper; + MaximumValueError: ResolverTypeWrapper; + MemberNotFoundError: ResolverTypeWrapper; + MembershipRequest: ResolverTypeWrapper; + MembershipRequestsWhereInput: MembershipRequestsWhereInput; + Message: ResolverTypeWrapper; + MessageChat: ResolverTypeWrapper; + MessageChatInput: MessageChatInput; + MinimumLengthError: ResolverTypeWrapper; + MinimumValueError: ResolverTypeWrapper; + Mutation: ResolverTypeWrapper<{}>; + Note: ResolverTypeWrapper; + NoteInput: NoteInput; + OTPInput: OtpInput; + Organization: ResolverTypeWrapper; + OrganizationCustomField: ResolverTypeWrapper; + OrganizationInfoNode: ResolverTypeWrapper & { creator?: Maybe }>; + OrganizationInput: OrganizationInput; + OrganizationMemberNotFoundError: ResolverTypeWrapper; + OrganizationNotFoundError: ResolverTypeWrapper; + OrganizationOrderByInput: OrganizationOrderByInput; + OrganizationWhereInput: OrganizationWhereInput; + OtpData: ResolverTypeWrapper; + PageInfo: ResolverTypeWrapper; + PaginationDirection: PaginationDirection; + PhoneNumber: ResolverTypeWrapper; + PledgeOrderByInput: PledgeOrderByInput; + PledgeWhereInput: PledgeWhereInput; + Plugin: ResolverTypeWrapper; + PluginField: ResolverTypeWrapper; + PluginFieldInput: PluginFieldInput; + PluginInput: PluginInput; + PositiveInt: ResolverTypeWrapper; + Post: ResolverTypeWrapper; + PostEdge: ResolverTypeWrapper & { node: ResolversTypes['Post'] }>; + PostInput: PostInput; + PostNotFoundError: ResolverTypeWrapper; + PostOrderByInput: PostOrderByInput; + PostUpdateInput: PostUpdateInput; + PostWhereInput: PostWhereInput; + PostsConnection: ResolverTypeWrapper & { edges: Array }>; + Query: ResolverTypeWrapper<{}>; + RecaptchaVerification: RecaptchaVerification; + RecurrenceRule: ResolverTypeWrapper; + RecurrenceRuleInput: RecurrenceRuleInput; + RecurringEventMutationType: RecurringEventMutationType; + SocialMediaUrls: ResolverTypeWrapper; + SocialMediaUrlsInput: SocialMediaUrlsInput; + SortedByOrder: SortedByOrder; + Status: Status; + String: ResolverTypeWrapper; + Subscription: ResolverTypeWrapper<{}>; + Time: ResolverTypeWrapper; + ToggleUserTagAssignInput: ToggleUserTagAssignInput; + Translation: ResolverTypeWrapper; + Type: Type; + URL: ResolverTypeWrapper; + UnauthenticatedError: ResolverTypeWrapper; + UnauthorizedError: ResolverTypeWrapper; + UpdateActionItemCategoryInput: UpdateActionItemCategoryInput; + UpdateActionItemInput: UpdateActionItemInput; + UpdateAdvertisementInput: UpdateAdvertisementInput; + UpdateAdvertisementPayload: ResolverTypeWrapper & { advertisement?: Maybe }>; + UpdateAgendaCategoryInput: UpdateAgendaCategoryInput; + UpdateAgendaItemInput: UpdateAgendaItemInput; + UpdateAgendaSectionInput: UpdateAgendaSectionInput; + UpdateCommunityInput: UpdateCommunityInput; + UpdateEventInput: UpdateEventInput; + UpdateEventVolunteerGroupInput: UpdateEventVolunteerGroupInput; + UpdateEventVolunteerInput: UpdateEventVolunteerInput; + UpdateFundCampaignInput: UpdateFundCampaignInput; + UpdateFundCampaignPledgeInput: UpdateFundCampaignPledgeInput; + UpdateFundInput: UpdateFundInput; + UpdateNoteInput: UpdateNoteInput; + UpdateOrganizationInput: UpdateOrganizationInput; + UpdateUserInput: UpdateUserInput; + UpdateUserPasswordInput: UpdateUserPasswordInput; + UpdateUserTagInput: UpdateUserTagInput; + Upload: ResolverTypeWrapper; + User: ResolverTypeWrapper; + UserAndOrganizationInput: UserAndOrganizationInput; + UserConnection: ResolverTypeWrapper & { edges: Array> }>; + UserCustomData: ResolverTypeWrapper; + UserData: ResolverTypeWrapper & { appUserProfile?: Maybe, user: ResolversTypes['User'] }>; + UserFamily: ResolverTypeWrapper; + UserInput: UserInput; + UserNotAuthorizedAdminError: ResolverTypeWrapper; + UserNotAuthorizedError: ResolverTypeWrapper; + UserNotFoundError: ResolverTypeWrapper; + UserOrderByInput: UserOrderByInput; + UserPhone: ResolverTypeWrapper; + UserPhoneInput: UserPhoneInput; + UserTag: ResolverTypeWrapper; + UserTagsConnection: ResolverTypeWrapper & { edges: Array }>; + UserTagsConnectionEdge: ResolverTypeWrapper & { node: ResolversTypes['UserTag'] }>; + UserType: UserType; + UserWhereInput: UserWhereInput; + UsersConnection: ResolverTypeWrapper & { edges: Array }>; + UsersConnectionEdge: ResolverTypeWrapper & { node: ResolversTypes['User'] }>; + Venue: ResolverTypeWrapper; + VenueInput: VenueInput; + VenueOrderByInput: VenueOrderByInput; + VenueWhereInput: VenueWhereInput; + WeekDays: WeekDays; + createChatInput: CreateChatInput; + createDirectChatPayload: ResolverTypeWrapper & { directChat?: Maybe, userErrors: Array }>; + createGroupChatInput: CreateGroupChatInput; + createUserFamilyInput: CreateUserFamilyInput; +}; + +/** Mapping between all available schema types and the resolvers parents */ +export type ResolversParentTypes = { + ActionItem: InterfaceActionItemModel; + ActionItemCategory: InterfaceActionItemCategoryModel; + ActionItemCategoryWhereInput: ActionItemCategoryWhereInput; + ActionItemWhereInput: ActionItemWhereInput; + Address: Address; + AddressInput: AddressInput; + Advertisement: InterfaceAdvertisementModel; + AdvertisementEdge: Omit & { node?: Maybe }; + AdvertisementsConnection: Omit & { edges?: Maybe>> }; + AgendaCategory: InterfaceAgendaCategoryModel; + AgendaItem: InterfaceAgendaItemModel; + AgendaSection: InterfaceAgendaSectionModel; + AggregatePost: AggregatePost; + AggregateUser: AggregateUser; + Any: Scalars['Any']['output']; + AppUserProfile: InterfaceAppUserProfileModel; + AuthData: Omit & { appUserProfile: ResolversParentTypes['AppUserProfile'], user: ResolversParentTypes['User'] }; + Boolean: Scalars['Boolean']['output']; + CampaignWhereInput: CampaignWhereInput; + CheckIn: InterfaceCheckInModel; + CheckInCheckOutInput: CheckInCheckOutInput; + CheckInStatus: Omit & { checkIn?: Maybe, user: ResolversParentTypes['User'] }; + CheckOut: CheckOut; + Comment: InterfaceCommentModel; + CommentInput: CommentInput; + Community: InterfaceCommunityModel; + ConnectionError: ResolversUnionTypes['ConnectionError']; + ConnectionPageInfo: ResolversInterfaceTypes['ConnectionPageInfo']; + CountryCode: Scalars['CountryCode']['output']; + CreateActionItemInput: CreateActionItemInput; + CreateAdminError: ResolversUnionTypes['CreateAdminError']; + CreateAdminPayload: Omit & { user?: Maybe, userErrors: Array }; + CreateAdvertisementInput: CreateAdvertisementInput; + CreateAdvertisementPayload: Omit & { advertisement?: Maybe }; + CreateAgendaCategoryInput: CreateAgendaCategoryInput; + CreateAgendaItemInput: CreateAgendaItemInput; + CreateAgendaSectionInput: CreateAgendaSectionInput; + CreateCommentError: ResolversUnionTypes['CreateCommentError']; + CreateCommentPayload: Omit & { comment?: Maybe, userErrors: Array }; + CreateDirectChatError: ResolversUnionTypes['CreateDirectChatError']; + CreateMemberError: ResolversUnionTypes['CreateMemberError']; + CreateMemberPayload: Omit & { organization?: Maybe, userErrors: Array }; + CreateUserTagInput: CreateUserTagInput; + CursorPaginationInput: CursorPaginationInput; + Date: Scalars['Date']['output']; + DateTime: Scalars['DateTime']['output']; + DefaultConnectionPageInfo: DefaultConnectionPageInfo; + DeleteAdvertisementPayload: Omit & { advertisement?: Maybe }; + DeletePayload: DeletePayload; + DirectChat: InterfaceDirectChatModel; + DirectChatMessage: InterfaceDirectChatMessageModel; + Donation: InterfaceDonationModel; + DonationWhereInput: DonationWhereInput; + EditVenueInput: EditVenueInput; + EmailAddress: Scalars['EmailAddress']['output']; + Error: ResolversInterfaceTypes['Error']; + Event: InterfaceEventModel; + EventAttendee: InterfaceEventAttendeeModel; + EventAttendeeInput: EventAttendeeInput; + EventInput: EventInput; + EventVolunteer: InterfaceEventVolunteerModel; + EventVolunteerGroup: InterfaceEventVolunteerGroupModel; + EventVolunteerGroupInput: EventVolunteerGroupInput; + EventVolunteerGroupWhereInput: EventVolunteerGroupWhereInput; + EventVolunteerInput: EventVolunteerInput; + EventWhereInput: EventWhereInput; + ExtendSession: ExtendSession; + Feedback: InterfaceFeedbackModel; + FeedbackInput: FeedbackInput; + FieldError: ResolversInterfaceTypes['FieldError']; + Float: Scalars['Float']['output']; + ForgotPasswordData: ForgotPasswordData; + Fund: InterfaceFundModel; + FundCampaignInput: FundCampaignInput; + FundCampaignPledgeInput: FundCampaignPledgeInput; + FundInput: FundInput; + FundWhereInput: FundWhereInput; + FundraisingCampaign: InterfaceFundraisingCampaignModel; + FundraisingCampaignPledge: InterfaceFundraisingCampaignPledgesModel; + Group: InterfaceGroupModel; + GroupChat: InterfaceGroupChatModel; + GroupChatMessage: InterfaceGroupChatMessageModel; + ID: Scalars['ID']['output']; + Int: Scalars['Int']['output']; + InvalidCursor: InvalidCursor; + JSON: Scalars['JSON']['output']; + Language: InterfaceLanguageModel; + LanguageInput: LanguageInput; + LanguageModel: LanguageModel; + Latitude: Scalars['Latitude']['output']; + LoginInput: LoginInput; + Longitude: Scalars['Longitude']['output']; + MaximumLengthError: MaximumLengthError; + MaximumValueError: MaximumValueError; + MemberNotFoundError: MemberNotFoundError; + MembershipRequest: InterfaceMembershipRequestModel; + MembershipRequestsWhereInput: MembershipRequestsWhereInput; + Message: InterfaceMessageModel; + MessageChat: InterfaceMessageChatModel; + MessageChatInput: MessageChatInput; + MinimumLengthError: MinimumLengthError; + MinimumValueError: MinimumValueError; + Mutation: {}; + Note: InterfaceNoteModel; + NoteInput: NoteInput; + OTPInput: OtpInput; + Organization: InterfaceOrganizationModel; + OrganizationCustomField: OrganizationCustomField; + OrganizationInfoNode: Omit & { creator?: Maybe }; + OrganizationInput: OrganizationInput; + OrganizationMemberNotFoundError: OrganizationMemberNotFoundError; + OrganizationNotFoundError: OrganizationNotFoundError; + OrganizationWhereInput: OrganizationWhereInput; + OtpData: OtpData; + PageInfo: PageInfo; + PhoneNumber: Scalars['PhoneNumber']['output']; + PledgeWhereInput: PledgeWhereInput; + Plugin: InterfacePluginModel; + PluginField: InterfacePluginFieldModel; + PluginFieldInput: PluginFieldInput; + PluginInput: PluginInput; + PositiveInt: Scalars['PositiveInt']['output']; + Post: InterfacePostModel; + PostEdge: Omit & { node: ResolversParentTypes['Post'] }; + PostInput: PostInput; + PostNotFoundError: PostNotFoundError; + PostUpdateInput: PostUpdateInput; + PostWhereInput: PostWhereInput; + PostsConnection: Omit & { edges: Array }; + Query: {}; + RecaptchaVerification: RecaptchaVerification; + RecurrenceRule: InterfaceRecurrenceRuleModel; + RecurrenceRuleInput: RecurrenceRuleInput; + SocialMediaUrls: SocialMediaUrls; + SocialMediaUrlsInput: SocialMediaUrlsInput; + String: Scalars['String']['output']; + Subscription: {}; + Time: Scalars['Time']['output']; + ToggleUserTagAssignInput: ToggleUserTagAssignInput; + Translation: Translation; + URL: Scalars['URL']['output']; + UnauthenticatedError: UnauthenticatedError; + UnauthorizedError: UnauthorizedError; + UpdateActionItemCategoryInput: UpdateActionItemCategoryInput; + UpdateActionItemInput: UpdateActionItemInput; + UpdateAdvertisementInput: UpdateAdvertisementInput; + UpdateAdvertisementPayload: Omit & { advertisement?: Maybe }; + UpdateAgendaCategoryInput: UpdateAgendaCategoryInput; + UpdateAgendaItemInput: UpdateAgendaItemInput; + UpdateAgendaSectionInput: UpdateAgendaSectionInput; + UpdateCommunityInput: UpdateCommunityInput; + UpdateEventInput: UpdateEventInput; + UpdateEventVolunteerGroupInput: UpdateEventVolunteerGroupInput; + UpdateEventVolunteerInput: UpdateEventVolunteerInput; + UpdateFundCampaignInput: UpdateFundCampaignInput; + UpdateFundCampaignPledgeInput: UpdateFundCampaignPledgeInput; + UpdateFundInput: UpdateFundInput; + UpdateNoteInput: UpdateNoteInput; + UpdateOrganizationInput: UpdateOrganizationInput; + UpdateUserInput: UpdateUserInput; + UpdateUserPasswordInput: UpdateUserPasswordInput; + UpdateUserTagInput: UpdateUserTagInput; + Upload: Scalars['Upload']['output']; + User: InterfaceUserModel; + UserAndOrganizationInput: UserAndOrganizationInput; + UserConnection: Omit & { edges: Array> }; + UserCustomData: UserCustomData; + UserData: Omit & { appUserProfile?: Maybe, user: ResolversParentTypes['User'] }; + UserFamily: InterfaceUserFamilyModel; + UserInput: UserInput; + UserNotAuthorizedAdminError: UserNotAuthorizedAdminError; + UserNotAuthorizedError: UserNotAuthorizedError; + UserNotFoundError: UserNotFoundError; + UserPhone: UserPhone; + UserPhoneInput: UserPhoneInput; + UserTag: InterfaceOrganizationTagUserModel; + UserTagsConnection: Omit & { edges: Array }; + UserTagsConnectionEdge: Omit & { node: ResolversParentTypes['UserTag'] }; + UserWhereInput: UserWhereInput; + UsersConnection: Omit & { edges: Array }; + UsersConnectionEdge: Omit & { node: ResolversParentTypes['User'] }; + Venue: InterfaceVenueModel; + VenueInput: VenueInput; + VenueWhereInput: VenueWhereInput; + createChatInput: CreateChatInput; + createDirectChatPayload: Omit & { directChat?: Maybe, userErrors: Array }; + createGroupChatInput: CreateGroupChatInput; + createUserFamilyInput: CreateUserFamilyInput; +}; + +export type AuthDirectiveArgs = { }; + +export type AuthDirectiveResolver = DirectiveResolverFn; + +export type RoleDirectiveArgs = { + requires?: Maybe; +}; + +export type RoleDirectiveResolver = DirectiveResolverFn; + +export type ActionItemResolvers = { + _id?: Resolver; + actionItemCategory?: Resolver, ParentType, ContextType>; + allotedHours?: Resolver, ParentType, ContextType>; + assignee?: Resolver, ParentType, ContextType>; + assigner?: Resolver, ParentType, ContextType>; + assignmentDate?: Resolver; + completionDate?: Resolver; + createdAt?: Resolver; + creator?: Resolver, ParentType, ContextType>; + dueDate?: Resolver; + event?: Resolver, ParentType, ContextType>; + isCompleted?: Resolver; + postCompletionNotes?: Resolver, ParentType, ContextType>; + preCompletionNotes?: Resolver, ParentType, ContextType>; + updatedAt?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type ActionItemCategoryResolvers = { + _id?: Resolver; + createdAt?: Resolver; + creator?: Resolver, ParentType, ContextType>; + isDisabled?: Resolver; + name?: Resolver; + organization?: Resolver, ParentType, ContextType>; + updatedAt?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type AddressResolvers = { + city?: Resolver, ParentType, ContextType>; + countryCode?: Resolver, ParentType, ContextType>; + dependentLocality?: Resolver, ParentType, ContextType>; + line1?: Resolver, ParentType, ContextType>; + line2?: Resolver, ParentType, ContextType>; + postalCode?: Resolver, ParentType, ContextType>; + sortingCode?: Resolver, ParentType, ContextType>; + state?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type AdvertisementResolvers = { + _id?: Resolver; + createdAt?: Resolver; + creator?: Resolver, ParentType, ContextType>; + endDate?: Resolver; + mediaUrl?: Resolver; + name?: Resolver; + organization?: Resolver, ParentType, ContextType>; + startDate?: Resolver; + type?: Resolver; + updatedAt?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type AdvertisementEdgeResolvers = { + cursor?: Resolver, ParentType, ContextType>; + node?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type AdvertisementsConnectionResolvers = { + edges?: Resolver>>, ParentType, ContextType>; + pageInfo?: Resolver; + totalCount?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type AgendaCategoryResolvers = { + _id?: Resolver; + createdAt?: Resolver; + createdBy?: Resolver; + description?: Resolver, ParentType, ContextType>; + name?: Resolver; + organization?: Resolver; + updatedAt?: Resolver, ParentType, ContextType>; + updatedBy?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type AgendaItemResolvers = { + _id?: Resolver; + attachments?: Resolver>>, ParentType, ContextType>; + categories?: Resolver>>, ParentType, ContextType>; + createdAt?: Resolver; + createdBy?: Resolver; + description?: Resolver, ParentType, ContextType>; + duration?: Resolver; + organization?: Resolver; + relatedEvent?: Resolver, ParentType, ContextType>; + sequence?: Resolver; + title?: Resolver; + updatedAt?: Resolver; + updatedBy?: Resolver; + urls?: Resolver>>, ParentType, ContextType>; + users?: Resolver>>, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type AgendaSectionResolvers = { + _id?: Resolver; + createdAt?: Resolver; + createdBy?: Resolver, ParentType, ContextType>; + description?: Resolver; + items?: Resolver>>, ParentType, ContextType>; + relatedEvent?: Resolver, ParentType, ContextType>; + sequence?: Resolver; + updatedAt?: Resolver, ParentType, ContextType>; + updatedBy?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type AggregatePostResolvers = { + count?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type AggregateUserResolvers = { + count?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export interface AnyScalarConfig extends GraphQLScalarTypeConfig { + name: 'Any'; +} + +export type AppUserProfileResolvers = { + _id?: Resolver; + adminFor?: Resolver>>, ParentType, ContextType>; + appLanguageCode?: Resolver; + campaigns?: Resolver>>, ParentType, ContextType>; + createdEvents?: Resolver>>, ParentType, ContextType>; + createdOrganizations?: Resolver>>, ParentType, ContextType>; + eventAdmin?: Resolver>>, ParentType, ContextType>; + isSuperAdmin?: Resolver; + pledges?: Resolver>>, ParentType, ContextType>; + pluginCreationAllowed?: Resolver; + userId?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type AuthDataResolvers = { + accessToken?: Resolver; + appUserProfile?: Resolver; + refreshToken?: Resolver; + user?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type CheckInResolvers = { + _id?: Resolver; + createdAt?: Resolver; + event?: Resolver; + feedbackSubmitted?: Resolver; + time?: Resolver; + updatedAt?: Resolver; + user?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type CheckInStatusResolvers = { + _id?: Resolver; + checkIn?: Resolver, ParentType, ContextType>; + user?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type CheckOutResolvers = { + _id?: Resolver; + createdAt?: Resolver; + eventAttendeeId?: Resolver; + time?: Resolver; + updatedAt?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type CommentResolvers = { + _id?: Resolver; + createdAt?: Resolver; + creator?: Resolver, ParentType, ContextType>; + likeCount?: Resolver, ParentType, ContextType>; + likedBy?: Resolver>>, ParentType, ContextType>; + post?: Resolver; + text?: Resolver; + updatedAt?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type CommunityResolvers = { + _id?: Resolver; + logoUrl?: Resolver, ParentType, ContextType>; + name?: Resolver; + socialMediaUrls?: Resolver, ParentType, ContextType>; + websiteLink?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type ConnectionErrorResolvers = { + __resolveType: TypeResolveFn<'InvalidCursor' | 'MaximumValueError', ParentType, ContextType>; +}; + +export type ConnectionPageInfoResolvers = { + __resolveType: TypeResolveFn<'DefaultConnectionPageInfo', ParentType, ContextType>; + endCursor?: Resolver, ParentType, ContextType>; + hasNextPage?: Resolver; + hasPreviousPage?: Resolver; + startCursor?: Resolver, ParentType, ContextType>; +}; + +export interface CountryCodeScalarConfig extends GraphQLScalarTypeConfig { + name: 'CountryCode'; +} + +export type CreateAdminErrorResolvers = { + __resolveType: TypeResolveFn<'OrganizationMemberNotFoundError' | 'OrganizationNotFoundError' | 'UserNotAuthorizedError' | 'UserNotFoundError', ParentType, ContextType>; +}; + +export type CreateAdminPayloadResolvers = { + user?: Resolver, ParentType, ContextType>; + userErrors?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type CreateAdvertisementPayloadResolvers = { + advertisement?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type CreateCommentErrorResolvers = { + __resolveType: TypeResolveFn<'PostNotFoundError', ParentType, ContextType>; +}; + +export type CreateCommentPayloadResolvers = { + comment?: Resolver, ParentType, ContextType>; + userErrors?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type CreateDirectChatErrorResolvers = { + __resolveType: TypeResolveFn<'OrganizationNotFoundError' | 'UserNotFoundError', ParentType, ContextType>; +}; + +export type CreateMemberErrorResolvers = { + __resolveType: TypeResolveFn<'MemberNotFoundError' | 'OrganizationNotFoundError' | 'UserNotAuthorizedAdminError' | 'UserNotAuthorizedError' | 'UserNotFoundError', ParentType, ContextType>; +}; + +export type CreateMemberPayloadResolvers = { + organization?: Resolver, ParentType, ContextType>; + userErrors?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export interface DateScalarConfig extends GraphQLScalarTypeConfig { + name: 'Date'; +} + +export interface DateTimeScalarConfig extends GraphQLScalarTypeConfig { + name: 'DateTime'; +} + +export type DefaultConnectionPageInfoResolvers = { + endCursor?: Resolver, ParentType, ContextType>; + hasNextPage?: Resolver; + hasPreviousPage?: Resolver; + startCursor?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type DeleteAdvertisementPayloadResolvers = { + advertisement?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type DeletePayloadResolvers = { + success?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type DirectChatResolvers = { + _id?: Resolver; + createdAt?: Resolver; + creator?: Resolver, ParentType, ContextType>; + messages?: Resolver>>, ParentType, ContextType>; + organization?: Resolver, ParentType, ContextType>; + updatedAt?: Resolver; + users?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type DirectChatMessageResolvers = { + _id?: Resolver; + createdAt?: Resolver; + directChatMessageBelongsTo?: Resolver; + messageContent?: Resolver; + receiver?: Resolver; + sender?: Resolver; + updatedAt?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type DonationResolvers = { + _id?: Resolver; + amount?: Resolver; + createdAt?: Resolver; + nameOfOrg?: Resolver; + nameOfUser?: Resolver; + orgId?: Resolver; + payPalId?: Resolver; + updatedAt?: Resolver; + userId?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export interface EmailAddressScalarConfig extends GraphQLScalarTypeConfig { + name: 'EmailAddress'; +} + +export type ErrorResolvers = { + __resolveType: TypeResolveFn<'MemberNotFoundError' | 'OrganizationMemberNotFoundError' | 'OrganizationNotFoundError' | 'PostNotFoundError' | 'UnauthenticatedError' | 'UnauthorizedError' | 'UserNotAuthorizedAdminError' | 'UserNotAuthorizedError' | 'UserNotFoundError', ParentType, ContextType>; + message?: Resolver; +}; + +export type EventResolvers = { + _id?: Resolver; + actionItems?: Resolver>>, ParentType, ContextType>; + admins?: Resolver>, ParentType, ContextType, Partial>; + agendaItems?: Resolver>>, ParentType, ContextType>; + allDay?: Resolver; + attendees?: Resolver>>, ParentType, ContextType>; + attendeesCheckInStatus?: Resolver, ParentType, ContextType>; + averageFeedbackScore?: Resolver, ParentType, ContextType>; + baseRecurringEvent?: Resolver, ParentType, ContextType>; + createdAt?: Resolver; + creator?: Resolver, ParentType, ContextType>; + description?: Resolver; + endDate?: Resolver, ParentType, ContextType>; + endTime?: Resolver, ParentType, ContextType>; + feedback?: Resolver, ParentType, ContextType>; + images?: Resolver>>, ParentType, ContextType>; + isPublic?: Resolver; + isRecurringEventException?: Resolver; + isRegisterable?: Resolver; + latitude?: Resolver, ParentType, ContextType>; + location?: Resolver, ParentType, ContextType>; + longitude?: Resolver, ParentType, ContextType>; + organization?: Resolver, ParentType, ContextType>; + recurrenceRule?: Resolver, ParentType, ContextType>; + recurring?: Resolver; + startDate?: Resolver; + startTime?: Resolver, ParentType, ContextType>; + title?: Resolver; + updatedAt?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type EventAttendeeResolvers = { + _id?: Resolver; + checkInId?: Resolver, ParentType, ContextType>; + checkOutId?: Resolver, ParentType, ContextType>; + createdAt?: Resolver; + eventId?: Resolver; + isCheckedIn?: Resolver; + isCheckedOut?: Resolver; + isInvited?: Resolver; + isRegistered?: Resolver; + updatedAt?: Resolver; + userId?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type EventVolunteerResolvers = { + _id?: Resolver; + createdAt?: Resolver; + creator?: Resolver, ParentType, ContextType>; + event?: Resolver, ParentType, ContextType>; + group?: Resolver, ParentType, ContextType>; + isAssigned?: Resolver, ParentType, ContextType>; + isInvited?: Resolver, ParentType, ContextType>; + response?: Resolver, ParentType, ContextType>; + updatedAt?: Resolver; + user?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type EventVolunteerGroupResolvers = { + _id?: Resolver; + createdAt?: Resolver; + creator?: Resolver, ParentType, ContextType>; + event?: Resolver, ParentType, ContextType>; + leader?: Resolver; + name?: Resolver, ParentType, ContextType>; + updatedAt?: Resolver; + volunteers?: Resolver>>, ParentType, ContextType>; + volunteersRequired?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type ExtendSessionResolvers = { + accessToken?: Resolver; + refreshToken?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type FeedbackResolvers = { + _id?: Resolver; + createdAt?: Resolver; + event?: Resolver; + rating?: Resolver; + review?: Resolver, ParentType, ContextType>; + updatedAt?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type FieldErrorResolvers = { + __resolveType: TypeResolveFn<'InvalidCursor' | 'MaximumLengthError' | 'MaximumValueError' | 'MinimumLengthError' | 'MinimumValueError', ParentType, ContextType>; + message?: Resolver; + path?: Resolver, ParentType, ContextType>; +}; + +export type FundResolvers = { + _id?: Resolver; + campaigns?: Resolver>>, ParentType, ContextType>; + createdAt?: Resolver; + creator?: Resolver, ParentType, ContextType>; + isArchived?: Resolver; + isDefault?: Resolver; + name?: Resolver; + organizationId?: Resolver; + refrenceNumber?: Resolver, ParentType, ContextType>; + taxDeductible?: Resolver; + updatedAt?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type FundraisingCampaignResolvers = { + _id?: Resolver; + createdAt?: Resolver; + currency?: Resolver; + endDate?: Resolver; + fundId?: Resolver; + fundingGoal?: Resolver; + name?: Resolver; + organizationId?: Resolver; + pledges?: Resolver>>, ParentType, ContextType>; + startDate?: Resolver; + updatedAt?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type FundraisingCampaignPledgeResolvers = { + _id?: Resolver; + amount?: Resolver; + campaign?: Resolver; + currency?: Resolver; + endDate?: Resolver, ParentType, ContextType>; + startDate?: Resolver, ParentType, ContextType>; + users?: Resolver>, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type GroupResolvers = { + _id?: Resolver; + admins?: Resolver, ParentType, ContextType>; + createdAt?: Resolver; + description?: Resolver, ParentType, ContextType>; + organization?: Resolver; + title?: Resolver; + updatedAt?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type GroupChatResolvers = { + _id?: Resolver; + createdAt?: Resolver; + creator?: Resolver, ParentType, ContextType>; + messages?: Resolver>>, ParentType, ContextType>; + organization?: Resolver; + title?: Resolver; + updatedAt?: Resolver; + users?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type GroupChatMessageResolvers = { + _id?: Resolver; + createdAt?: Resolver; + groupChatMessageBelongsTo?: Resolver; + messageContent?: Resolver; + sender?: Resolver; + updatedAt?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type InvalidCursorResolvers = { + message?: Resolver; + path?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export interface JsonScalarConfig extends GraphQLScalarTypeConfig { + name: 'JSON'; +} + +export type LanguageResolvers = { + _id?: Resolver; + createdAt?: Resolver; + en?: Resolver; + translation?: Resolver>>, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type LanguageModelResolvers = { + _id?: Resolver; + createdAt?: Resolver; + lang_code?: Resolver; + value?: Resolver; + verified?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export interface LatitudeScalarConfig extends GraphQLScalarTypeConfig { + name: 'Latitude'; +} + +export interface LongitudeScalarConfig extends GraphQLScalarTypeConfig { + name: 'Longitude'; +} + +export type MaximumLengthErrorResolvers = { + message?: Resolver; + path?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type MaximumValueErrorResolvers = { + limit?: Resolver; + message?: Resolver; + path?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type MemberNotFoundErrorResolvers = { + message?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type MembershipRequestResolvers = { + _id?: Resolver; + organization?: Resolver; + user?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type MessageResolvers = { + _id?: Resolver; + createdAt?: Resolver; + creator?: Resolver, ParentType, ContextType>; + imageUrl?: Resolver, ParentType, ContextType>; + text?: Resolver; + updatedAt?: Resolver; + videoUrl?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type MessageChatResolvers = { + _id?: Resolver; + createdAt?: Resolver; + languageBarrier?: Resolver, ParentType, ContextType>; + message?: Resolver; + receiver?: Resolver; + sender?: Resolver; + updatedAt?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type MinimumLengthErrorResolvers = { + limit?: Resolver; + message?: Resolver; + path?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type MinimumValueErrorResolvers = { + message?: Resolver; + path?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type MutationResolvers = { + acceptMembershipRequest?: Resolver>; + addEventAttendee?: Resolver>; + addFeedback?: Resolver>; + addLanguageTranslation?: Resolver>; + addOrganizationCustomField?: Resolver>; + addOrganizationImage?: Resolver>; + addPledgeToFundraisingCampaign?: Resolver>; + addUserCustomData?: Resolver>; + addUserImage?: Resolver>; + addUserToGroupChat?: Resolver>; + addUserToUserFamily?: Resolver>; + adminRemoveGroup?: Resolver>; + assignUserTag?: Resolver, ParentType, ContextType, RequireFields>; + blockPluginCreationBySuperadmin?: Resolver>; + blockUser?: Resolver>; + cancelMembershipRequest?: Resolver>; + checkIn?: Resolver>; + checkOut?: Resolver>; + createActionItem?: Resolver>; + createActionItemCategory?: Resolver>; + createAdmin?: Resolver>; + createAdvertisement?: Resolver, ParentType, ContextType, RequireFields>; + createAgendaCategory?: Resolver>; + createAgendaItem?: Resolver>; + createAgendaSection?: Resolver>; + createComment?: Resolver, ParentType, ContextType, RequireFields>; + createDirectChat?: Resolver>; + createDonation?: Resolver>; + createEvent?: Resolver>; + createEventVolunteer?: Resolver>; + createEventVolunteerGroup?: Resolver>; + createFund?: Resolver>; + createFundraisingCampaign?: Resolver>; + createFundraisingCampaignPledge?: Resolver>; + createGroupChat?: Resolver>; + createMember?: Resolver>; + createMessageChat?: Resolver>; + createNote?: Resolver>; + createOrganization?: Resolver>; + createPlugin?: Resolver>; + createPost?: Resolver, ParentType, ContextType, RequireFields>; + createSampleOrganization?: Resolver; + createUserFamily?: Resolver>; + createUserTag?: Resolver, ParentType, ContextType, RequireFields>; + createVenue?: Resolver, ParentType, ContextType, RequireFields>; + deleteAdvertisement?: Resolver, ParentType, ContextType, RequireFields>; + deleteAgendaCategory?: Resolver>; + deleteDonationById?: Resolver>; + deleteNote?: Resolver>; + deleteVenue?: Resolver, ParentType, ContextType, RequireFields>; + editVenue?: Resolver, ParentType, ContextType, RequireFields>; + forgotPassword?: Resolver>; + inviteEventAttendee?: Resolver>; + joinPublicOrganization?: Resolver>; + leaveOrganization?: Resolver>; + likeComment?: Resolver, ParentType, ContextType, RequireFields>; + likePost?: Resolver, ParentType, ContextType, RequireFields>; + login?: Resolver>; + logout?: Resolver; + otp?: Resolver>; + recaptcha?: Resolver>; + refreshToken?: Resolver>; + registerEventAttendee?: Resolver>; + registerForEvent?: Resolver>; + rejectMembershipRequest?: Resolver>; + removeActionItem?: Resolver>; + removeAdmin?: Resolver>; + removeAdvertisement?: Resolver, ParentType, ContextType, RequireFields>; + removeAgendaItem?: Resolver>; + removeAgendaSection?: Resolver>; + removeComment?: Resolver, ParentType, ContextType, RequireFields>; + removeDirectChat?: Resolver>; + removeEvent?: Resolver>; + removeEventAttendee?: Resolver>; + removeEventVolunteer?: Resolver>; + removeEventVolunteerGroup?: Resolver>; + removeFundraisingCampaignPledge?: Resolver>; + removeGroupChat?: Resolver>; + removeMember?: Resolver>; + removeOrganization?: Resolver>; + removeOrganizationCustomField?: Resolver>; + removeOrganizationImage?: Resolver>; + removePost?: Resolver, ParentType, ContextType, RequireFields>; + removeSampleOrganization?: Resolver; + removeUserCustomData?: Resolver>; + removeUserFamily?: Resolver>; + removeUserFromGroupChat?: Resolver>; + removeUserFromUserFamily?: Resolver>; + removeUserImage?: Resolver; + removeUserTag?: Resolver, ParentType, ContextType, RequireFields>; + resetCommunity?: Resolver; + revokeRefreshTokenForUser?: Resolver; + saveFcmToken?: Resolver>; + sendMembershipRequest?: Resolver>; + sendMessageToDirectChat?: Resolver>; + sendMessageToGroupChat?: Resolver>; + signUp?: Resolver>; + togglePostPin?: Resolver>; + unassignUserTag?: Resolver, ParentType, ContextType, RequireFields>; + unblockUser?: Resolver>; + unlikeComment?: Resolver, ParentType, ContextType, RequireFields>; + unlikePost?: Resolver, ParentType, ContextType, RequireFields>; + unregisterForEventByUser?: Resolver>; + updateActionItem?: Resolver, ParentType, ContextType, RequireFields>; + updateActionItemCategory?: Resolver, ParentType, ContextType, RequireFields>; + updateAdvertisement?: Resolver, ParentType, ContextType, RequireFields>; + updateAgendaCategory?: Resolver, ParentType, ContextType, RequireFields>; + updateAgendaItem?: Resolver, ParentType, ContextType, RequireFields>; + updateAgendaSection?: Resolver, ParentType, ContextType, RequireFields>; + updateCommunity?: Resolver>; + updateEvent?: Resolver>; + updateEventVolunteer?: Resolver>; + updateEventVolunteerGroup?: Resolver>; + updateFund?: Resolver>; + updateFundraisingCampaign?: Resolver>; + updateFundraisingCampaignPledge?: Resolver>; + updateLanguage?: Resolver>; + updateNote?: Resolver>; + updateOrganization?: Resolver>; + updatePluginStatus?: Resolver>; + updatePost?: Resolver>; + updateUserPassword?: Resolver>; + updateUserProfile?: Resolver>; + updateUserRoleInOrganization?: Resolver>; + updateUserTag?: Resolver, ParentType, ContextType, RequireFields>; +}; + +export type NoteResolvers = { + _id?: Resolver; + agendaItemId?: Resolver; + content?: Resolver; + createdAt?: Resolver; + createdBy?: Resolver; + updatedAt?: Resolver; + updatedBy?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type OrganizationResolvers = { + _id?: Resolver; + actionItemCategories?: Resolver>>, ParentType, ContextType>; + address?: Resolver, ParentType, ContextType>; + admins?: Resolver>, ParentType, ContextType, Partial>; + advertisements?: Resolver, ParentType, ContextType, Partial>; + agendaCategories?: Resolver>>, ParentType, ContextType>; + apiUrl?: Resolver; + blockedUsers?: Resolver>>, ParentType, ContextType>; + createdAt?: Resolver; + creator?: Resolver, ParentType, ContextType>; + customFields?: Resolver, ParentType, ContextType>; + description?: Resolver; + funds?: Resolver>>, ParentType, ContextType>; + image?: Resolver, ParentType, ContextType>; + members?: Resolver>>, ParentType, ContextType>; + membershipRequests?: Resolver>>, ParentType, ContextType, Partial>; + name?: Resolver; + pinnedPosts?: Resolver>>, ParentType, ContextType>; + posts?: Resolver, ParentType, ContextType, Partial>; + updatedAt?: Resolver; + userRegistrationRequired?: Resolver; + userTags?: Resolver, ParentType, ContextType, Partial>; + venues?: Resolver>>, ParentType, ContextType>; + visibleInSearch?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type OrganizationCustomFieldResolvers = { + _id?: Resolver; + name?: Resolver; + organizationId?: Resolver; + type?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type OrganizationInfoNodeResolvers = { + _id?: Resolver; + apiUrl?: Resolver; + creator?: Resolver, ParentType, ContextType>; + description?: Resolver; + image?: Resolver, ParentType, ContextType>; + name?: Resolver; + userRegistrationRequired?: Resolver; + visibleInSearch?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type OrganizationMemberNotFoundErrorResolvers = { + message?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type OrganizationNotFoundErrorResolvers = { + message?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type OtpDataResolvers = { + otpToken?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type PageInfoResolvers = { + currPageNo?: Resolver, ParentType, ContextType>; + hasNextPage?: Resolver; + hasPreviousPage?: Resolver; + nextPageNo?: Resolver, ParentType, ContextType>; + prevPageNo?: Resolver, ParentType, ContextType>; + totalPages?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export interface PhoneNumberScalarConfig extends GraphQLScalarTypeConfig { + name: 'PhoneNumber'; +} + +export type PluginResolvers = { + _id?: Resolver; + pluginCreatedBy?: Resolver; + pluginDesc?: Resolver; + pluginName?: Resolver; + uninstalledOrgs?: Resolver>, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type PluginFieldResolvers = { + createdAt?: Resolver; + key?: Resolver; + status?: Resolver; + value?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export interface PositiveIntScalarConfig extends GraphQLScalarTypeConfig { + name: 'PositiveInt'; +} + +export type PostResolvers = { + _id?: Resolver, ParentType, ContextType>; + commentCount?: Resolver, ParentType, ContextType>; + comments?: Resolver>>, ParentType, ContextType>; + createdAt?: Resolver; + creator?: Resolver, ParentType, ContextType>; + imageUrl?: Resolver, ParentType, ContextType>; + likeCount?: Resolver, ParentType, ContextType>; + likedBy?: Resolver>>, ParentType, ContextType>; + organization?: Resolver; + pinned?: Resolver, ParentType, ContextType>; + text?: Resolver; + title?: Resolver, ParentType, ContextType>; + updatedAt?: Resolver; + videoUrl?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type PostEdgeResolvers = { + cursor?: Resolver; + node?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type PostNotFoundErrorResolvers = { + message?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type PostsConnectionResolvers = { + edges?: Resolver, ParentType, ContextType>; + pageInfo?: Resolver; + totalCount?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type QueryResolvers = { + actionItemCategoriesByOrganization?: Resolver>>, ParentType, ContextType, RequireFields>; + actionItemsByEvent?: Resolver>>, ParentType, ContextType, RequireFields>; + actionItemsByOrganization?: Resolver>>, ParentType, ContextType, RequireFields>; + adminPlugin?: Resolver>>, ParentType, ContextType, RequireFields>; + advertisementsConnection?: Resolver, ParentType, ContextType, Partial>; + agendaCategory?: Resolver>; + agendaItemByEvent?: Resolver>>, ParentType, ContextType, RequireFields>; + agendaItemByOrganization?: Resolver>>, ParentType, ContextType, RequireFields>; + agendaItemCategoriesByOrganization?: Resolver>>, ParentType, ContextType, RequireFields>; + checkAuth?: Resolver; + customDataByOrganization?: Resolver, ParentType, ContextType, RequireFields>; + customFieldsByOrganization?: Resolver>>, ParentType, ContextType, RequireFields>; + directChatById?: Resolver, ParentType, ContextType, RequireFields>; + directChatsByUserID?: Resolver>>, ParentType, ContextType, RequireFields>; + directChatsMessagesByChatID?: Resolver>>, ParentType, ContextType, RequireFields>; + event?: Resolver, ParentType, ContextType, RequireFields>; + eventVolunteersByEvent?: Resolver>>, ParentType, ContextType, RequireFields>; + eventsByOrganization?: Resolver>>, ParentType, ContextType, Partial>; + eventsByOrganizationConnection?: Resolver, ParentType, ContextType, Partial>; + fundsByOrganization?: Resolver>>, ParentType, ContextType, RequireFields>; + getAgendaItem?: Resolver, ParentType, ContextType, RequireFields>; + getAgendaSection?: Resolver, ParentType, ContextType, RequireFields>; + getAllAgendaItems?: Resolver>>, ParentType, ContextType>; + getAllNotesForAgendaItem?: Resolver>>, ParentType, ContextType, RequireFields>; + getCommunityData?: Resolver, ParentType, ContextType>; + getDonationById?: Resolver>; + getDonationByOrgId?: Resolver>>, ParentType, ContextType, RequireFields>; + getDonationByOrgIdConnection?: Resolver, ParentType, ContextType, RequireFields>; + getEventAttendee?: Resolver, ParentType, ContextType, RequireFields>; + getEventAttendeesByEventId?: Resolver>>, ParentType, ContextType, RequireFields>; + getEventInvitesByUserId?: Resolver, ParentType, ContextType, RequireFields>; + getEventVolunteerGroups?: Resolver>, ParentType, ContextType, Partial>; + getFundById?: Resolver>; + getFundraisingCampaignPledgeById?: Resolver>; + getFundraisingCampaigns?: Resolver>, ParentType, ContextType, Partial>; + getNoteById?: Resolver>; + getPledgesByUserId?: Resolver>>, ParentType, ContextType, RequireFields>; + getPlugins?: Resolver>>, ParentType, ContextType>; + getUserTag?: Resolver, ParentType, ContextType, RequireFields>; + getUserTagAncestors?: Resolver>>, ParentType, ContextType, RequireFields>; + getVenueByOrgId?: Resolver>>, ParentType, ContextType, RequireFields>; + getlanguage?: Resolver>>, ParentType, ContextType, RequireFields>; + groupChatById?: Resolver, ParentType, ContextType, RequireFields>; + groupChatsByUserId?: Resolver>>, ParentType, ContextType, RequireFields>; + hasSubmittedFeedback?: Resolver, ParentType, ContextType, RequireFields>; + isSampleOrganization?: Resolver>; + joinedOrganizations?: Resolver>>, ParentType, ContextType, Partial>; + me?: Resolver; + myLanguage?: Resolver, ParentType, ContextType>; + organizations?: Resolver>>, ParentType, ContextType, Partial>; + organizationsConnection?: Resolver>, ParentType, ContextType, Partial>; + organizationsMemberConnection?: Resolver>; + plugin?: Resolver>>, ParentType, ContextType, RequireFields>; + post?: Resolver, ParentType, ContextType, RequireFields>; + registeredEventsByUser?: Resolver>>, ParentType, ContextType, Partial>; + registrantsByEvent?: Resolver>>, ParentType, ContextType, RequireFields>; + user?: Resolver>; + userLanguage?: Resolver, ParentType, ContextType, RequireFields>; + users?: Resolver>>, ParentType, ContextType, Partial>; + usersConnection?: Resolver>, ParentType, ContextType, Partial>; + venue?: Resolver, ParentType, ContextType, RequireFields>; +}; + +export type RecurrenceRuleResolvers = { + baseRecurringEvent?: Resolver, ParentType, ContextType>; + count?: Resolver, ParentType, ContextType>; + frequency?: Resolver; + interval?: Resolver; + latestInstanceDate?: Resolver, ParentType, ContextType>; + organization?: Resolver, ParentType, ContextType>; + recurrenceEndDate?: Resolver, ParentType, ContextType>; + recurrenceRuleString?: Resolver; + recurrenceStartDate?: Resolver; + weekDayOccurenceInMonth?: Resolver, ParentType, ContextType>; + weekDays?: Resolver>>, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type SocialMediaUrlsResolvers = { + X?: Resolver, ParentType, ContextType>; + facebook?: Resolver, ParentType, ContextType>; + gitHub?: Resolver, ParentType, ContextType>; + instagram?: Resolver, ParentType, ContextType>; + linkedIn?: Resolver, ParentType, ContextType>; + reddit?: Resolver, ParentType, ContextType>; + slack?: Resolver, ParentType, ContextType>; + youTube?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type SubscriptionResolvers = { + directMessageChat?: SubscriptionResolver, "directMessageChat", ParentType, ContextType>; + messageSentToDirectChat?: SubscriptionResolver, "messageSentToDirectChat", ParentType, ContextType, RequireFields>; + messageSentToGroupChat?: SubscriptionResolver, "messageSentToGroupChat", ParentType, ContextType, RequireFields>; + onPluginUpdate?: SubscriptionResolver, "onPluginUpdate", ParentType, ContextType>; +}; + +export interface TimeScalarConfig extends GraphQLScalarTypeConfig { + name: 'Time'; +} + +export type TranslationResolvers = { + en_value?: Resolver, ParentType, ContextType>; + lang_code?: Resolver, ParentType, ContextType>; + translation?: Resolver, ParentType, ContextType>; + verified?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export interface UrlScalarConfig extends GraphQLScalarTypeConfig { + name: 'URL'; +} + +export type UnauthenticatedErrorResolvers = { + message?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type UnauthorizedErrorResolvers = { + message?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type UpdateAdvertisementPayloadResolvers = { + advertisement?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export interface UploadScalarConfig extends GraphQLScalarTypeConfig { + name: 'Upload'; +} + +export type UserResolvers = { + _id?: Resolver; + address?: Resolver, ParentType, ContextType>; + appUserProfileId?: Resolver, ParentType, ContextType>; + birthDate?: Resolver, ParentType, ContextType>; + createdAt?: Resolver; + educationGrade?: Resolver, ParentType, ContextType>; + email?: Resolver; + employmentStatus?: Resolver, ParentType, ContextType>; + eventAdmin?: Resolver>>, ParentType, ContextType>; + firstName?: Resolver; + gender?: Resolver, ParentType, ContextType>; + identifier?: Resolver; + image?: Resolver, ParentType, ContextType>; + joinedOrganizations?: Resolver>>, ParentType, ContextType>; + lastName?: Resolver; + maritalStatus?: Resolver, ParentType, ContextType>; + membershipRequests?: Resolver>>, ParentType, ContextType>; + organizationsBlockedBy?: Resolver>>, ParentType, ContextType>; + phone?: Resolver, ParentType, ContextType>; + pluginCreationAllowed?: Resolver; + posts?: Resolver, ParentType, ContextType, Partial>; + registeredEvents?: Resolver>>, ParentType, ContextType>; + tagsAssignedWith?: Resolver, ParentType, ContextType, Partial>; + updatedAt?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type UserConnectionResolvers = { + aggregate?: Resolver; + edges?: Resolver>, ParentType, ContextType>; + pageInfo?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type UserCustomDataResolvers = { + _id?: Resolver; + organizationId?: Resolver; + userId?: Resolver; + values?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type UserDataResolvers = { + appUserProfile?: Resolver, ParentType, ContextType>; + user?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type UserFamilyResolvers = { + _id?: Resolver; + admins?: Resolver, ParentType, ContextType>; + creator?: Resolver; + title?: Resolver, ParentType, ContextType>; + users?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type UserNotAuthorizedAdminErrorResolvers = { + message?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type UserNotAuthorizedErrorResolvers = { + message?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type UserNotFoundErrorResolvers = { + message?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type UserPhoneResolvers = { + home?: Resolver, ParentType, ContextType>; + mobile?: Resolver, ParentType, ContextType>; + work?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type UserTagResolvers = { + _id?: Resolver; + childTags?: Resolver, ParentType, ContextType, Partial>; + name?: Resolver; + organization?: Resolver, ParentType, ContextType>; + parentTag?: Resolver, ParentType, ContextType>; + usersAssignedTo?: Resolver, ParentType, ContextType, Partial>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type UserTagsConnectionResolvers = { + edges?: Resolver, ParentType, ContextType>; + pageInfo?: Resolver; + totalCount?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type UserTagsConnectionEdgeResolvers = { + cursor?: Resolver; + node?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type UsersConnectionResolvers = { + edges?: Resolver, ParentType, ContextType>; + pageInfo?: Resolver; + totalCount?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type UsersConnectionEdgeResolvers = { + cursor?: Resolver; + node?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type VenueResolvers = { + _id?: Resolver; + capacity?: Resolver; + description?: Resolver, ParentType, ContextType>; + imageUrl?: Resolver, ParentType, ContextType>; + name?: Resolver; + organization?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type CreateDirectChatPayloadResolvers = { + directChat?: Resolver, ParentType, ContextType>; + userErrors?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type Resolvers = { + ActionItem?: ActionItemResolvers; + ActionItemCategory?: ActionItemCategoryResolvers; + Address?: AddressResolvers; + Advertisement?: AdvertisementResolvers; + AdvertisementEdge?: AdvertisementEdgeResolvers; + AdvertisementsConnection?: AdvertisementsConnectionResolvers; + AgendaCategory?: AgendaCategoryResolvers; + AgendaItem?: AgendaItemResolvers; + AgendaSection?: AgendaSectionResolvers; + AggregatePost?: AggregatePostResolvers; + AggregateUser?: AggregateUserResolvers; + Any?: GraphQLScalarType; + AppUserProfile?: AppUserProfileResolvers; + AuthData?: AuthDataResolvers; + CheckIn?: CheckInResolvers; + CheckInStatus?: CheckInStatusResolvers; + CheckOut?: CheckOutResolvers; + Comment?: CommentResolvers; + Community?: CommunityResolvers; + ConnectionError?: ConnectionErrorResolvers; + ConnectionPageInfo?: ConnectionPageInfoResolvers; + CountryCode?: GraphQLScalarType; + CreateAdminError?: CreateAdminErrorResolvers; + CreateAdminPayload?: CreateAdminPayloadResolvers; + CreateAdvertisementPayload?: CreateAdvertisementPayloadResolvers; + CreateCommentError?: CreateCommentErrorResolvers; + CreateCommentPayload?: CreateCommentPayloadResolvers; + CreateDirectChatError?: CreateDirectChatErrorResolvers; + CreateMemberError?: CreateMemberErrorResolvers; + CreateMemberPayload?: CreateMemberPayloadResolvers; + Date?: GraphQLScalarType; + DateTime?: GraphQLScalarType; + DefaultConnectionPageInfo?: DefaultConnectionPageInfoResolvers; + DeleteAdvertisementPayload?: DeleteAdvertisementPayloadResolvers; + DeletePayload?: DeletePayloadResolvers; + DirectChat?: DirectChatResolvers; + DirectChatMessage?: DirectChatMessageResolvers; + Donation?: DonationResolvers; + EmailAddress?: GraphQLScalarType; + Error?: ErrorResolvers; + Event?: EventResolvers; + EventAttendee?: EventAttendeeResolvers; + EventVolunteer?: EventVolunteerResolvers; + EventVolunteerGroup?: EventVolunteerGroupResolvers; + ExtendSession?: ExtendSessionResolvers; + Feedback?: FeedbackResolvers; + FieldError?: FieldErrorResolvers; + Fund?: FundResolvers; + FundraisingCampaign?: FundraisingCampaignResolvers; + FundraisingCampaignPledge?: FundraisingCampaignPledgeResolvers; + Group?: GroupResolvers; + GroupChat?: GroupChatResolvers; + GroupChatMessage?: GroupChatMessageResolvers; + InvalidCursor?: InvalidCursorResolvers; + JSON?: GraphQLScalarType; + Language?: LanguageResolvers; + LanguageModel?: LanguageModelResolvers; + Latitude?: GraphQLScalarType; + Longitude?: GraphQLScalarType; + MaximumLengthError?: MaximumLengthErrorResolvers; + MaximumValueError?: MaximumValueErrorResolvers; + MemberNotFoundError?: MemberNotFoundErrorResolvers; + MembershipRequest?: MembershipRequestResolvers; + Message?: MessageResolvers; + MessageChat?: MessageChatResolvers; + MinimumLengthError?: MinimumLengthErrorResolvers; + MinimumValueError?: MinimumValueErrorResolvers; + Mutation?: MutationResolvers; + Note?: NoteResolvers; + Organization?: OrganizationResolvers; + OrganizationCustomField?: OrganizationCustomFieldResolvers; + OrganizationInfoNode?: OrganizationInfoNodeResolvers; + OrganizationMemberNotFoundError?: OrganizationMemberNotFoundErrorResolvers; + OrganizationNotFoundError?: OrganizationNotFoundErrorResolvers; + OtpData?: OtpDataResolvers; + PageInfo?: PageInfoResolvers; + PhoneNumber?: GraphQLScalarType; + Plugin?: PluginResolvers; + PluginField?: PluginFieldResolvers; + PositiveInt?: GraphQLScalarType; + Post?: PostResolvers; + PostEdge?: PostEdgeResolvers; + PostNotFoundError?: PostNotFoundErrorResolvers; + PostsConnection?: PostsConnectionResolvers; + Query?: QueryResolvers; + RecurrenceRule?: RecurrenceRuleResolvers; + SocialMediaUrls?: SocialMediaUrlsResolvers; + Subscription?: SubscriptionResolvers; + Time?: GraphQLScalarType; + Translation?: TranslationResolvers; + URL?: GraphQLScalarType; + UnauthenticatedError?: UnauthenticatedErrorResolvers; + UnauthorizedError?: UnauthorizedErrorResolvers; + UpdateAdvertisementPayload?: UpdateAdvertisementPayloadResolvers; + Upload?: GraphQLScalarType; + User?: UserResolvers; + UserConnection?: UserConnectionResolvers; + UserCustomData?: UserCustomDataResolvers; + UserData?: UserDataResolvers; + UserFamily?: UserFamilyResolvers; + UserNotAuthorizedAdminError?: UserNotAuthorizedAdminErrorResolvers; + UserNotAuthorizedError?: UserNotAuthorizedErrorResolvers; + UserNotFoundError?: UserNotFoundErrorResolvers; + UserPhone?: UserPhoneResolvers; + UserTag?: UserTagResolvers; + UserTagsConnection?: UserTagsConnectionResolvers; + UserTagsConnectionEdge?: UserTagsConnectionEdgeResolvers; + UsersConnection?: UsersConnectionResolvers; + UsersConnectionEdge?: UsersConnectionEdgeResolvers; + Venue?: VenueResolvers; + createDirectChatPayload?: CreateDirectChatPayloadResolvers; +}; + +export type DirectiveResolvers = { + auth?: AuthDirectiveResolver; + role?: RoleDirectiveResolver; +}; diff --git a/src/utilities/PII/decryption.ts b/src/utilities/PII/decryption.ts new file mode 100644 index 0000000000..4521fbae8a --- /dev/null +++ b/src/utilities/PII/decryption.ts @@ -0,0 +1,29 @@ +import crypto from "crypto"; + +/** + * Decrypts the given encrypted text using AES-256-CBC decryption. + * + * @param encryptedText - The encrypted text to decrypt, encoded as a hexadecimal string. + * @param key - The encryption key used for decryption. + * @param iv - The initialization vector (IV), used to ensure different ciphertexts encrypt to different ciphertexts even if the plaintexts are identical. + * @returns The decrypted plaintext string. + */ +export function decrypt( + encryptedText: string, + key: string, + iv: string, +): string { + // Create a decipher object with AES-256-CBC algorithm, using the provided key and IV + const decipher = crypto.createDecipheriv( + "aes-256-cbc", + Buffer.from(key), // Convert key from string to buffer + Buffer.from(iv, "hex"), // Convert IV from hexadecimal string to buffer + ); + + // Decrypt the encrypted text + let decrypted = decipher.update(encryptedText, "hex", "utf8"); + decrypted += decipher.final("utf8"); + + // Return the decrypted plaintext + return decrypted; +} diff --git a/src/utilities/PII/encryption.ts b/src/utilities/PII/encryption.ts new file mode 100644 index 0000000000..26953657fa --- /dev/null +++ b/src/utilities/PII/encryption.ts @@ -0,0 +1,24 @@ +import crypto from "crypto"; + +/** + * Encrypts plaintext using AES-256-CBC encryption. + * @param text - The plaintext to encrypt. + * @param key - The encryption key as a string. + * @param iv - The initialization vector (IV) as a string in hexadecimal format. + * @returns The encrypted ciphertext as a hexadecimal string. + */ +export function encrypt(text: string, key: string, iv: string): string { + // Create a cipher object using AES-256-CBC algorithm with provided key and IV + const cipher = crypto.createCipheriv( + "aes-256-cbc", + Buffer.from(key), // Convert key string to buffer + Buffer.from(iv, "hex"), // Convert IV string from hexadecimal to buffer + ); + + // Encrypt the plaintext + let encrypted = cipher.update(text); // Perform encryption + encrypted = Buffer.concat([encrypted, cipher.final()]); // Finalize encryption and concatenate + + // Return encrypted ciphertext as hexadecimal string + return encrypted.toString("hex"); +} diff --git a/src/utilities/PII/isAuthorised.ts b/src/utilities/PII/isAuthorised.ts new file mode 100644 index 0000000000..0fb2412fcd --- /dev/null +++ b/src/utilities/PII/isAuthorised.ts @@ -0,0 +1,19 @@ +import type { User } from "../../types/generatedGraphQLTypes"; + +/** + * Checks if the requesting user is authorized to access or modify the requested user's data. + * @param requestingUser - The user making the request. + * @param requestedUser - The user whose data is being requested or modified. + * @returns `true` if the requesting user is authorized, `false` otherwise. + */ +export function isAuthorised( + requestingUser: User, + requestedUser: User, +): boolean { + // Check if the requesting user is the same as the requested user + if (requestedUser !== requestedUser) { + return false; // Not authorized if requesting user is not the same as requested user + } + + return true; // Authorized if requesting user is the same as requested user +} diff --git a/src/utilities/TalawaGraphQLError.ts b/src/utilities/TalawaGraphQLError.ts new file mode 100644 index 0000000000..02d344da67 --- /dev/null +++ b/src/utilities/TalawaGraphQLError.ts @@ -0,0 +1,197 @@ +import { GraphQLError, type GraphQLErrorOptions } from "graphql"; + +/** + * The term action used below is used to refer to CRUD(Create/Read/Update/Delete) operations performed + * by the clients. In the context of a graphQL server query, mutation and subscription are the three + * possible ways to perform these actions. + * + * The term resource used below is used to refer to any entity that the client can perform an action + * on. These can be both coarse and fine grained entities. One example for a coarse grained entity + * would be the account of a user. One example for a fine grained entity would be the email of a user. + */ + +/** + * When a resource associated to an argument is not found. + * + * @example + * throw new TalawaGraphQLError("Post not found.", \{ + * argumentPath: ["input", "postId"], + * code: "ARGUMENT_ASSOCIATED_RESOURCE_NOT_FOUND" + * \}) + */ +type ArgumentAssociatedResourceNotFound = { + argumentPath: (string | number)[]; + code: "ARGUMENT_ASSOCIATED_RESOURCE_NOT_FOUND"; +}; + +/** + * When the client tries to perform an action that conflicts with real world expectations of the + * application. + * + * @example + * throw new TalawaGraphQLError("You can only claim your yearly award once per year.", \{ + * code: "FORBIDDEN_ACTION" + * \}) + */ +type ForbiddenAction = { + code: "FORBIDDEN_ACTION"; +}; + +/** + * When the client tries to perform an action on a resource associated to an argument that conflicts + * with real world expectations of the application. One example would be a user trying to follow their + * own account on a social media application. + * + * @example + * throw new TalawaGraphQLError("You cannot follow your own user account.", \{ + * argumentPath: ["id"], + * code: "FORBIDDEN_ACTION_ON_ARGUMENT_ASSOCIATED_RESOURCE" + * \}) + */ +type ForbiddenActionOnArgumentAssociatedResource = { + argumentPath: (string | number)[]; + code: "FORBIDDEN_ACTION_ON_ARGUMENT_ASSOCIATED_RESOURCE"; +}; + +/** + * When the client must be authenticated to perform an action. + * + * @example + * throw new TalawaGraphQLError("You must be authenticated to create a post.", \{ + * code: "UNAUTHENTICATED" + * \}) + */ +type Unauthenticated = { + code: "UNAUTHENTICATED"; +}; + +/** + * When the client provides invalid arguments while performing an action. + * + * @example + * throw new TalawaGraphQLError("Invalid arguments provided.", \{ + * code: "INVALID_ARGUMENTS", + * issues: [ + * \{ + * argumentPath: ["input", "age"], + * message: "Your age must be greater than 18." + * \}, + * \{ + * argumentPath: ["input", "username"], + * message: "Username must be smaller than or equal to 25 characters." + * \}, + * \{ + * argumentPath: ["input", "favoriteFood", 2], + * message: "This favourite food entry must be at least 1 character long." + * \}, + * ] + * \}) + */ +type InvalidArguments = { + code: "INVALID_ARGUMENTS"; + issues: { + argumentPath: (string | number)[]; + message: string; + }[]; +}; + +/** + * When a resource is not found. + * + * @example + * throw new TalawaGraphQLError("Post creator not found.", \{ + * code: "RESOURCE_NOT_FOUND" + * \}) + */ +type ResourceNotFound = { + code: "RESOURCE_NOT_FOUND"; +}; + +/** + * When the client is not authorized to perform an action. + * + * @example + * throw new TalawaGraphQLError("Your account does not meet the minimum requirements to create posts.", \{ + * code: "UNAUTHORIZED_ACTION" + * \}) + */ +type UnauthorizedAction = { + code: "UNAUTHORIZED_ACTION"; +}; + +/** + * When the client is not authorized to perform an action on a resource associated to an argument. + * + * @example + * throw new TalawaGraphQLError("You must be an approved member of this community to access it.", \{ + * argumentPath: ["id"], + * code: "UNAUTHORIZED_ACTION_ON_ARGUMENT_ASSOCIATED_RESOURCE" + * \}) + */ +type UnauthorizedActionOnArgumentAssociatedResource = { + argumentPath: (string | number)[]; + code: "UNAUTHORIZED_ACTION_ON_ARGUMENT_ASSOCIATED_RESOURCE"; +}; + +/** + * When an error that doesn't fit one of the errors listed above occurs. One example would be a database + * request failure. + * + * @example + * throw new TalawaGraphQLError("Something went wrong. Please try again later.", \{ + * code: "UNEXPECTED" + * \}) + */ +type Unexpected = { + code: "UNEXPECTED"; +}; + +type TalawaGraphQLErrorExtensions = + | ArgumentAssociatedResourceNotFound + | ForbiddenAction + | ForbiddenActionOnArgumentAssociatedResource + | Unauthenticated + | InvalidArguments + | ResourceNotFound + | UnauthorizedAction + | UnauthorizedActionOnArgumentAssociatedResource + | Unexpected; + +/** + * A custom class extended from the GraphQLError class to standardize the errors returned from talawa-api's + * graphQL resolvers. This standardization prevents the talawa-api contributers from returning undocumented, + * arbitrary errors to the client applications in the graphQL query responses. This standardization also helps + * the client developers to know beforehand what kind of errors they can expect from talawa-api's graphQL + * responses, helping them design better UI experiences for user feedback. + * + * If necessary, the localization of the error messages(i18n) can be done within the graphQL resolvers where the + * TalawaGraphQLError class is used. + * + * This is the definition of a graphQL resolver for resolving the user record of the best friend of a user:- + * @example + * export const bestFriend = async (parent) =\> \{ + * const user = await dbClient.query.user.findFirst(\{ + * where(fields, operators) \{ + * return operators.eq(fields.id, parent.bestFriendId); + * \} + * \}); + * + * if (user === undefined) \{ + * throw new TalawaGraphQLError("Best friend not found", \{ + * code: "RESOURCE_NOT_FOUND" + * \}) + * \} + * + * return user; + * \} + */ +export class TalawaGraphQLError extends GraphQLError { + constructor( + message: string, + options: GraphQLErrorOptions & { + extensions: TalawaGraphQLErrorExtensions; + }, + ) { + super(message, options); + } +} diff --git a/src/utilities/adminCheck.ts b/src/utilities/adminCheck.ts new file mode 100644 index 0000000000..3d49abcd83 --- /dev/null +++ b/src/utilities/adminCheck.ts @@ -0,0 +1,64 @@ +import type { Types } from "mongoose"; +import mongoose from "mongoose"; +import { USER_NOT_AUTHORIZED_ADMIN } from "../constants"; +import { errors, requestContext } from "../libraries"; +import type { InterfaceOrganization } from "../models"; +import { AppUserProfile } from "../models"; + +/** + * Checks if the current user is an admin of the organization. + * If the user is an admin, the function completes successfully. Otherwise, it throws an UnauthorizedError. + * @remarks + * This is a utility method. + * @param userId - The ID of the current user. It can be a string or a Types.ObjectId. + * @param organization - The organization data of `InterfaceOrganization` type. + * @returns `True` or `False`. + */ +export const adminCheck = async ( + userId: string | Types.ObjectId, + organization: InterfaceOrganization, +): Promise => { + /** + * Check if the user is listed as an admin in the organization. + * Compares the user ID with the admin IDs in the organization. + */ + const userIsOrganizationAdmin = organization.admins.some( + (admin) => + admin === userId || + new mongoose.Types.ObjectId(admin).toString() === userId.toString(), + ); + + /** + * Fetch the user's profile from the AppUserProfile collection. + */ + const userAppProfile = await AppUserProfile.findOne({ + userId, + }).lean(); + + /** + * If the user's profile is not found, throw an UnauthorizedError. + */ + if (!userAppProfile) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_ADMIN.MESSAGE), + USER_NOT_AUTHORIZED_ADMIN.CODE, + USER_NOT_AUTHORIZED_ADMIN.PARAM, + ); + } + + /** + * Check if the user has super admin privileges. + */ + const isUserSuperAdmin: boolean = userAppProfile.isSuperAdmin; + + /** + * If the user is neither an organization admin nor a super admin, throw an UnauthorizedError. + */ + if (!userIsOrganizationAdmin && !isUserSuperAdmin) { + throw new errors.UnauthorizedError( + requestContext.translate(`${USER_NOT_AUTHORIZED_ADMIN.MESSAGE}`), + USER_NOT_AUTHORIZED_ADMIN.CODE, + USER_NOT_AUTHORIZED_ADMIN.PARAM, + ); + } +}; diff --git a/src/utilities/auth.ts b/src/utilities/auth.ts new file mode 100644 index 0000000000..84389ac1f4 --- /dev/null +++ b/src/utilities/auth.ts @@ -0,0 +1,86 @@ +import jwt from "jsonwebtoken"; +import { ACCESS_TOKEN_SECRET, REFRESH_TOKEN_SECRET } from "../constants"; +import type { InterfaceAppUserProfile, InterfaceUser } from "../models"; +import { User } from "../models"; + +/** + * Interface representing the payload of a JWT token. + */ +export interface InterfaceJwtTokenPayload { + tokenVersion: number; + userId: string; + firstName: string; + lastName: string; + email: string; +} + +/** + * Creates an access token (JWT) for a user that expires in 40 minutes. + * The token contains user data and is signed with the access token secret. + * + * @param user - User data + * @param appUserProfile - Application user profile data + * @returns JSON Web Token string payload + */ +export const createAccessToken = ( + user: InterfaceUser, + appUserProfile: InterfaceAppUserProfile, +): string => { + return jwt.sign( + { + tokenVersion: appUserProfile.tokenVersion, + userId: user._id.toString(), + firstName: user.firstName, + lastName: user.lastName, + email: user.email, + }, + ACCESS_TOKEN_SECRET as string, + { + expiresIn: "40m", + }, + ); +}; + +/** + * Creates a refresh token (JWT) for a user that expires in 30 days. + * The token contains user data and is signed with the refresh token secret. + * + * @param user - User data + * @param appUserProfile - Application user profile data + * @returns JSON Web Token string payload + */ +export const createRefreshToken = ( + user: InterfaceUser, + appUserProfile: InterfaceAppUserProfile, +): string => { + return jwt.sign( + { + tokenVersion: appUserProfile?.tokenVersion, + userId: user?._id.toString(), + firstName: user?.firstName, + lastName: user?.lastName, + email: user?.email, + }, + REFRESH_TOKEN_SECRET as string, + { + expiresIn: "30d", + }, + ); +}; + +/** + * Revokes the refresh token for a user by removing the token from the user's profile. + * This function searches for the user by their ID and unsets the token field in the user's document. + * + * @param userId - The ID of the user whose refresh token is to be revoked + * @returns A promise that resolves when the token has been revoked + */ +export const revokeRefreshToken = async (userId: string): Promise => { + const user = await User.findOne({ _id: userId }).lean(); + + if (user) { + const filter = { _id: userId }; + const update = { $unset: { token: "" } }; + await User.findOneAndUpdate(filter, update); + } +}; diff --git a/src/utilities/checkReplicaSet.ts b/src/utilities/checkReplicaSet.ts new file mode 100644 index 0000000000..61d76292b4 --- /dev/null +++ b/src/utilities/checkReplicaSet.ts @@ -0,0 +1,27 @@ +import mongoose from "mongoose"; +import { logger } from "../libraries"; + +/** + * Checks if the MongoDB connection is part of a replica set. + * This function sends a 'hello' command to the MongoDB admin database to retrieve server information, + * and determines if the connection is part of a replica set by checking for the presence of 'hosts' and 'setName' in the result. + * + * @returns A promise that resolves to a boolean indicating whether the connection is part of a replica set (true) or not (false). + */ +export const checkReplicaSet = async (): Promise => { + try { + const adminDb = mongoose.connection.db.admin(); + const result = await adminDb.command({ + hello: 1, + }); + + if ("hosts" in result && "setName" in result) { + return true; + } else { + return false; + } + } catch (error) { + logger.error("Error checking replica set configuration :", error); + return false; + } +}; diff --git a/src/utilities/copyToClipboard.ts b/src/utilities/copyToClipboard.ts new file mode 100644 index 0000000000..ba95a3ec67 --- /dev/null +++ b/src/utilities/copyToClipboard.ts @@ -0,0 +1,15 @@ +import ncp from "copy-paste"; +import { IN_PRODUCTION } from "../constants"; + +/** + * Copies the given text to the clipboard. + * @remarks + * This is a utility method and works only in development or test mode. + * @param text - The content that needs to be copied to the clipboard. + */ +export const copyToClipboard = (text: string): void => { + // Only copies text to the clipboard in development or test mode + if (IN_PRODUCTION !== true) { + ncp.copy(text, () => {}); + } +}; diff --git a/src/utilities/createSampleOrganizationUtil.ts b/src/utilities/createSampleOrganizationUtil.ts new file mode 100644 index 0000000000..fcb51638ec --- /dev/null +++ b/src/utilities/createSampleOrganizationUtil.ts @@ -0,0 +1,347 @@ +import type { InterfaceEvent, InterfacePost, InterfaceUser } from "../models"; +import { + AppUserProfile, + Event, + Organization, + Plugin, + Post, + User, +} from "../models"; + +import { faker } from "@faker-js/faker"; +import type mongoose from "mongoose"; +import { SampleData } from "../models/SampleData"; + +/* eslint-disable */ + +/** + * Generates user data for a given organization and user type. + * + * @param organizationId - The ID of the organization the user belongs to + * @param userType - The type of the user ('ADMIN' or 'USER') + * @returns A promise that resolves to an object containing the created user and their application profile + */ +export const generateUserData = async ( + organizationId: string, + userType: string, +) => { + const gender: "male" | "female" = faker.helpers.arrayElement([ + "male", + "female", + ]); + + const fname = faker.person.firstName(gender); + const lname = faker.person.lastName(gender); + + const adminFor = []; + + if (userType === "ADMIN") { + adminFor.push(organizationId); + } + + const user = new User({ + firstName: fname, + lastName: lname, + email: `${fname.toLowerCase()}${lname.toLowerCase()}@${faker.helpers.arrayElement( + ["xyz", "abc", "lmnop"], + )}.com`, + password: "$2a$12$bSYpay6TRMpTOaAmYPFXku4avwmqfFBtmgg39TabxmtFEiz4plFtW", + joinedOrganizations: [organizationId], + }); + + const appUserProfile = new AppUserProfile({ + userId: user._id, + adminFor, + }); + if (userType == "SUPERADMIN") { + appUserProfile.isSuperAdmin = true; + } + await appUserProfile.save(); + user.appUserProfileId = appUserProfile._id; + + await user.save(); + + const sampleModel = new SampleData({ + documentId: user._id, + collectionName: "User", + }); + const sampleModel2 = new SampleData({ + documentId: appUserProfile._id, + collectionName: "AppUserProfile", + }); + + await sampleModel.save(); + await sampleModel2.save(); + return { + user, + appUserProfile, + }; +}; + +/** + * Generates event data for a given list of users and organization. + * + * @param users - The list of users associated with the event + * @param organizationId - The ID of the organization the event belongs to + * @returns A promise that resolves to the created event + */ +export const generateEventData = async ( + users: InterfaceUser[], + organizationId: string, +): Promise => { + const today = new Date(); + const oneWeekFromNow = new Date(); + oneWeekFromNow.setDate(today.getDate() + 7); + + const startTimestamp = + today.getTime() + + Math.random() * (oneWeekFromNow.getTime() - today.getTime()); + const startDate = new Date(startTimestamp); + + const duration = Math.floor(Math.random() * 7) + 1; // Random duration between 1 and 7 days + const endDate = new Date( + startDate.getTime() + duration * 24 * 60 * 60 * 1000, + ); + + const event = new Event({ + title: faker.lorem.sentence(), + description: faker.lorem.paragraphs(), + location: faker.location.country() + faker.location.city(), + latitude: faker.location.latitude(), + longitude: faker.location.longitude(), + recurring: faker.datatype.boolean({ probability: 0.3 }), + allDay: faker.datatype.boolean(), + startDate, + endDate, + startTime: faker.date.future(), + endTime: faker.date.future(), + isPublic: faker.datatype.boolean({ probability: 0.9 }), + isRegisterable: faker.datatype.boolean(), + creatorId: faker.helpers.arrayElement(users)._id, + admins: [faker.helpers.arrayElement(users)._id], + organization: organizationId, + }); + + await event.save(); + + const sampleModel = new SampleData({ + documentId: event._id, + collectionName: "Event", + }); + + await sampleModel.save(); + + const creatorId = event.creatorId.toString(); + await User.findByIdAndUpdate( + creatorId, + { $push: { eventsCreated: event._id } }, + { new: true }, + ); + + return event; +}; + +/** + * Generates post data for a given list of users and organization. + * + * @param users - The list of users associated with the post + * @param organizationId - The ID of the organization the post belongs to + * @returns A promise that resolves to the created post + */ +export const generatePostData = async ( + users: InterfaceUser[], + organizationId: string, +): Promise> => { + const post = new Post({ + status: "ACTIVE", + likedBy: [], + likeCount: 0, + commentCount: 0, + pinned: false, + text: faker.lorem.sentence(), + title: faker.lorem.words(), + creatorId: faker.helpers.arrayElement(users), + organization: organizationId, + imageUrl: faker.image.url(), + createdAt: faker.date.recent(), + }); + + await post.save(); + + const sampleModel = new SampleData({ + documentId: post._id, + collectionName: "Post", + }); + + await sampleModel.save(); + + return post; +}; + +/** + * Creates multiple posts for a given list of users and organization. + * + * @param numPosts - The number of posts to create + * @param users - The list of users associated with the posts + * @param organizationId - The ID of the organization the posts belong to + * @returns A promise that resolves to an array of created posts + */ +const createPosts = async ( + numPosts: number, + users: InterfaceUser[], + organizationId: string, +): Promise<(InterfacePost & mongoose.Document)[]> => { + const posts = []; + for (let i = 0; i < numPosts; i++) { + const post = await generatePostData(users, organizationId); + posts.push(post); + } + return posts; +}; + +/** + * Creates multiple events for a given list of users and organization. + * + * @param numEvents - The number of events to create + * @param users - The list of users associated with the events + * @param organizationId - The ID of the organization the events belong to + * @returns A promise that resolves to an array of created events + */ +const createEvents = async ( + numEvents: number, + users: InterfaceUser[], + organizationId: string, +): Promise => { + const events = []; + + for (let i = 0; i < numEvents; i++) { + const event = await generateEventData(users, organizationId); + events.push(event); + } + return events; +}; + +/** + * Generates random plugin data for a given number of plugins and list of users. + * + * @param numberOfPlugins - The number of plugins to create + * @param users - The list of users associated with the plugins + * @returns A promise that resolves to an array of promises for created plugins + */ +export const generateRandomPlugins = async ( + numberOfPlugins: number, + users: string[], +): Promise[]> => { + const pluginPromises = []; + for (let i = 0; i < numberOfPlugins; i++) { + const selectedUserId: string = faker.helpers.arrayElement(users); + const selectedUser = await User.findById(selectedUserId); + + const plugin = new Plugin({ + pluginName: faker.company.name(), + pluginCreatedBy: `${selectedUser?.firstName} ${selectedUser?.lastName}`, + pluginDesc: faker.lorem.sentence(), + }); + + const pluginPromise = plugin.save(); + + const sampleModel = new SampleData({ + documentId: plugin._id, + collectionName: "Plugin", + }); + + await sampleModel.save(); + pluginPromises.push(pluginPromise); + } + + await Promise.all(pluginPromises); + return pluginPromises; +}; + +/** + * Creates a sample organization with associated users, events, posts, and plugins. + * + * @returns A promise that resolves when the sample organization and its related data have been created + */ +export const createSampleOrganization = async (): Promise => { + const _id = faker.database.mongodbObjectId(); + const userData = await generateUserData(_id, "ADMIN"); + const creator = userData.user; + + const creatorAppProfile = userData.appUserProfile; + + interface Address { + city: string; + countryCode: string; + dependentLocality: string; + line1: string; + line2: string; + postalCode: string; + sortingCode: string; + state: string; + } + + const address: Address = { + city: faker.location.city(), + countryCode: faker.location.countryCode(), + dependentLocality: faker.location.secondaryAddress(), + line1: faker.location.streetAddress(), + line2: faker.location.secondaryAddress(), + postalCode: faker.location.zipCode(), + sortingCode: faker.location.zipCode(), + state: faker.location.state(), + }; + + const organization = new Organization({ + _id, + name: faker.company.name(), + description: faker.lorem.sentences(), + address, + userRegistrationRequired: false, + creatorId: creator._id, + status: "ACTIVE", + members: [creator._id], + admins: [creator._id], + groupChats: [], + posts: [], + pinnedPosts: [], + membershipRequests: [], + blockedUsers: [], + visibleInSearch: true, + createdAt: Date.now(), + }); + + creatorAppProfile.adminFor.push(organization._id); + + // await creator.save(); + await creatorAppProfile.save(); + + for (let j = 0; j < 10; j++) { + const userType = j === 0 ? "ADMIN" : "USER"; + + const newUserData = await generateUserData(_id, userType); + + const newUser = newUserData.user; + const newUserAppProfile = newUserData.appUserProfile; + + organization.members.push(newUser._id); + + if (userType === "ADMIN") { + organization.admins.push(newUser); + } + } + + await organization.save(); + + const sampleModel = new SampleData({ + documentId: organization._id, + collectionName: "Organization", + }); + + await sampleModel.save(); + + await createEvents(5, organization.members, organization._id.toString()); + await createPosts(5, organization.members, organization._id.toString()); + + await generateRandomPlugins(10, organization.members); +}; diff --git a/src/utilities/dateValidator.ts b/src/utilities/dateValidator.ts new file mode 100644 index 0000000000..3dff36c2b4 --- /dev/null +++ b/src/utilities/dateValidator.ts @@ -0,0 +1,39 @@ +import { + END_DATE_VALIDATION_ERROR, + START_DATE_VALIDATION_ERROR, +} from "../constants"; +import { errors, requestContext } from "../libraries"; + +/** + * Validates the start and end dates. + * @param startDate - The starting date. + * @param endDate - The ending date. + */ +export const validateDate = ( + startDate: Date | undefined, + endDate: Date | undefined, +): void => { + /** + * Checks if the start date is provided and if it's in the past. + * Throws an InputValidationError if the start date is invalid. + */ + if (startDate && new Date(startDate) < new Date(new Date().toDateString())) { + throw new errors.InputValidationError( + requestContext.translate(START_DATE_VALIDATION_ERROR.MESSAGE), + START_DATE_VALIDATION_ERROR.CODE, + START_DATE_VALIDATION_ERROR.PARAM, + ); + } + + /** + * Checks if the end date is provided and if it's before the start date. + * Throws an InputValidationError if the end date is invalid. + */ + if (endDate && startDate && new Date(endDate) < new Date(startDate)) { + throw new errors.InputValidationError( + requestContext.translate(END_DATE_VALIDATION_ERROR.MESSAGE), + END_DATE_VALIDATION_ERROR.CODE, + END_DATE_VALIDATION_ERROR.PARAM, + ); + } +}; diff --git a/src/utilities/deleteDuplicatedImage.ts b/src/utilities/deleteDuplicatedImage.ts new file mode 100644 index 0000000000..0e44555977 --- /dev/null +++ b/src/utilities/deleteDuplicatedImage.ts @@ -0,0 +1,21 @@ +import type { PathLike } from "fs"; +import { unlink } from "fs"; +import { logger } from "../libraries"; + +/** + * Deletes a duplicated image file using fs.unlink(). + * @param imagePath - The path to the image file to delete. + * @throws Throws an error if deletion fails. + */ +export const deleteDuplicatedImage = (imagePath: PathLike): void => { + // Attempt to delete the image file + unlink(imagePath, function (error) { + if (error) { + // Throw an error if deletion fails + throw error; + } + + // Log a success message if deletion succeeds + logger.info("File was deleted as it already exists in the db!"); + }); +}; diff --git a/src/utilities/deleteImage.ts b/src/utilities/deleteImage.ts new file mode 100644 index 0000000000..e578617929 --- /dev/null +++ b/src/utilities/deleteImage.ts @@ -0,0 +1,65 @@ +import { unlink } from "fs"; +import { logger } from "../libraries"; +import { ImageHash } from "../models"; +import { reuploadDuplicateCheck } from "./reuploadDuplicateCheck"; + +/** + * Deletes an image file if it meets deletion criteria based on usage and duplicate checks. + * + * @param imageToBeDeleted - The path of the image file to be deleted + * @param imageBelongingToItem - Optional. Indicates if the image belongs to a specific item for duplicate check + * @returns A promise that resolves once the image is successfully deleted + */ +export const deleteImage = async ( + imageToBeDeleted: string, + imageBelongingToItem?: string, +): Promise => { + let imageIsDuplicate = false; + + if (imageBelongingToItem) { + // Check if the image is a duplicate of another image belonging to the same item + imageIsDuplicate = await reuploadDuplicateCheck( + imageToBeDeleted, + imageBelongingToItem, + ); + } + + if (!imageIsDuplicate) { + // Proceed with deletion only if the image is not a duplicate + + // Retrieve the image hash information from the database + const imageHash = await ImageHash.findOne({ + fileName: imageToBeDeleted, + }).lean(); + + if (imageHash && imageHash?.numberOfUses > 1) { + // If the image is used by multiple users/organizations, log that it cannot be deleted + logger.info("Image cannot be deleted"); + } else { + // If the image is only used once or not tracked by image hash, proceed with deletion + logger.info("Image is only used once and therefore can be deleted"); + + // Delete the image file from the filesystem + unlink(imageToBeDeleted, (error) => { + if (error) { + throw error; + } + + // If no error occurs image has been successfully deleted. + logger.info("File deleted!"); + }); + } + + // Decrease the usage count of the image hash in the database + await ImageHash.updateOne( + { + fileName: imageToBeDeleted, + }, + { + $inc: { + numberOfUses: -1, + }, + }, + ); + } +}; diff --git a/src/utilities/encodedImageStorage/deletePreviousImage.ts b/src/utilities/encodedImageStorage/deletePreviousImage.ts new file mode 100644 index 0000000000..62eaba2b7a --- /dev/null +++ b/src/utilities/encodedImageStorage/deletePreviousImage.ts @@ -0,0 +1,38 @@ +import { unlink } from "fs/promises"; +import path from "path"; +import { EncodedImage } from "../../models/EncodedImage"; + +/** + * Deletes the previous image file if its `numberOfUses` is 1 and updates the `numberOfUses` in the database. + * @param imageToBeDeletedPath - Path of the image to be deleted. + */ +export const deletePreviousImage = async ( + imageToBeDeletedPath: string, +): Promise => { + // Find the EncodedImage document with the given fileName + const imageToBeDeleted = await EncodedImage.findOne({ + fileName: imageToBeDeletedPath ?? "", + }); + + // Check if the image exists and its numberOfUses is 1 + if (imageToBeDeleted?.numberOfUses === 1) { + // Delete the image file from the file system + await unlink(path.join(__dirname, "../../../" + imageToBeDeleted.fileName)); + + // Delete the EncodedImage document from the database + await EncodedImage.deleteOne({ + fileName: imageToBeDeletedPath, + }); + } + + await EncodedImage.findOneAndUpdate( + { + fileName: imageToBeDeletedPath, + }, + { + $inc: { + numberOfUses: -1, + }, + }, + ); +}; diff --git a/src/utilities/encodedImageStorage/encodedImageExtensionCheck.ts b/src/utilities/encodedImageStorage/encodedImageExtensionCheck.ts new file mode 100644 index 0000000000..582f184ebb --- /dev/null +++ b/src/utilities/encodedImageStorage/encodedImageExtensionCheck.ts @@ -0,0 +1,25 @@ +/** + * Checks if the extension of an encoded image URL is valid (png, jpg, jpeg). + * @param encodedUrl - Encoded URL of the image. + * @returns `true` if the extension is valid, otherwise `false`. + */ +export const encodedImageExtentionCheck = (encodedUrl: string): boolean => { + // Extract the extension from the encodedUrl + const extension = encodedUrl.substring( + "data:".length, + encodedUrl.indexOf(";base64"), + ); + + console.log(extension); + + const isValidImage = + extension === "image/png" || + extension === "image/jpg" || + extension === "image/jpeg"; + + if (isValidImage) { + return true; + } + + return false; +}; diff --git a/src/utilities/encodedImageStorage/uploadEncodedImage.ts b/src/utilities/encodedImageStorage/uploadEncodedImage.ts new file mode 100644 index 0000000000..45fcaad12b --- /dev/null +++ b/src/utilities/encodedImageStorage/uploadEncodedImage.ts @@ -0,0 +1,142 @@ +import { nanoid } from "nanoid"; +import * as fs from "fs"; +import { writeFile } from "fs/promises"; +import { encodedImageExtentionCheck } from "./encodedImageExtensionCheck"; +import { errors, requestContext } from "../../libraries"; +import { IMAGE_SIZE_LIMIT_KB, INVALID_FILE_TYPE } from "../../constants"; +import { EncodedImage } from "../../models/EncodedImage"; +import path from "path"; +import { deletePreviousImage } from "./deletePreviousImage"; + +/** + * Checks if the size of the base64 encoded image data is within the allowable limit. + * + * @param size - The size of the image data in kilobytes. + * @returns `true` if the size is within the limit, otherwise `false`. + */ +const checkImageSizeLimit = (size: number): boolean => { + return size > 0 && size <= 20000; +}; + +/** + * Calculates the size of the base64 encoded string in kilobytes. + * + * @param base64String - The base64 encoded string representing the image data. + * @returns The size of the image data in kilobytes. + */ +const base64SizeInKb = (base64String: string): number => { + // Count the number of Base64 characters + const numBase64Chars = base64String.length; + // Calculate the size in bytes + const sizeInBytes = (numBase64Chars * 3) / 4; + // Convert to kilobytes + const sizeInKB = sizeInBytes / 1024; + + return sizeInKB; +}; + +/** + * Uploads an encoded image to the server. + * + * @param encodedImageURL - The URL or content of the encoded image to upload. + * @param previousImagePath - Optional. The path of the previous image to delete before uploading the new one. + * @returns The file name of the uploaded image. + */ +export const uploadEncodedImage = async ( + encodedImageURL: string, + previousImagePath?: string | null, +): Promise => { + // Check if the uploaded image URL/content is a valid image file type + const isURLValidImage = encodedImageExtentionCheck(encodedImageURL); + + // Extract the base64 data from the image URL + const data = encodedImageURL.replace(/^data:image\/\w+;base64,/, ""); + + // Calculate the size of the base64 encoded image data in kilobytes + const sizeInKb = base64SizeInKb(data); + + // Retrieve the size limit from environment variables or set a default limit + const limit = checkImageSizeLimit(Number(process.env.IMAGE_SIZE_LIMIT_KB)) + ? Number(process.env.IMAGE_SIZE_LIMIT_KB) + : 3000; // Default limit in kilobytes + + // Throw an error if the image size exceeds the allowable limit + if (sizeInKb > limit) { + throw new errors.ImageSizeLimitExceeded( + IMAGE_SIZE_LIMIT_KB.MESSAGE, + IMAGE_SIZE_LIMIT_KB.CODE, + IMAGE_SIZE_LIMIT_KB.PARAM, + ); + } + + // Throw an error if the uploaded image is not a valid file type + if (!isURLValidImage) { + throw new errors.InvalidFileTypeError( + requestContext.translate(INVALID_FILE_TYPE.MESSAGE), + INVALID_FILE_TYPE.CODE, + INVALID_FILE_TYPE.PARAM, + ); + } + + // Check if the encoded image already exists in the database + const encodedImageAlreadyExist = await EncodedImage.findOne({ + content: encodedImageURL, + }); + + // If the image already exists, increment its numberOfUses and handle previousImagePath + if (encodedImageAlreadyExist) { + if (encodedImageAlreadyExist?.fileName === previousImagePath) { + return encodedImageAlreadyExist?.fileName; + } + + await EncodedImage.findOneAndUpdate( + { + content: encodedImageURL, + }, + { + $inc: { + numberOfUses: 1, + }, + }, + ); + + if (previousImagePath) { + await deletePreviousImage(previousImagePath); + } + + return encodedImageAlreadyExist.fileName; + } + + // Handle deletion of previous image if previousImagePath is provided + if (previousImagePath) { + await deletePreviousImage(previousImagePath); + } + + // Generate a unique ID for the new image file using nanoid + let id = nanoid(); + + id = "images/" + id + "image.png"; + + const uploadedEncodedImage = await EncodedImage.create({ + fileName: id, + content: encodedImageURL, + }); + + // Convert the base64 data into a buffer + const buf = Buffer.from(data, "base64"); + + // Create an 'images' directory if it doesn't exist + if (!fs.existsSync(path.join(__dirname, "../../../images"))) { + fs.mkdir(path.join(__dirname, "../../../images"), (err) => { + if (err) { + throw err; + } + }); + } + + // Write the image data to the file system + await writeFile(path.join(__dirname, "../../../" + id), buf); + + // Return the fileName of the uploaded image + return uploadedEncodedImage.fileName; +}; diff --git a/src/utilities/encodedVideoStorage/deletePreviousVideo.ts b/src/utilities/encodedVideoStorage/deletePreviousVideo.ts new file mode 100644 index 0000000000..40f248e60a --- /dev/null +++ b/src/utilities/encodedVideoStorage/deletePreviousVideo.ts @@ -0,0 +1,41 @@ +import { unlink } from "fs/promises"; +import path from "path"; +import { EncodedVideo } from "../../models/EncodedVideo"; + +/** + * Deletes the previous video file and updates its database entry. + * + * @param videoToBeDeletedPath - The path of the video file to be deleted. + * @returns A promise that resolves once the video file and database entry are deleted or updated. + */ +export const deletePreviousVideo = async ( + videoToBeDeletedPath: string, +): Promise => { + // Find the EncodedVideo document corresponding to the video file + const videoToBeDeleted = await EncodedVideo.findOne({ + fileName: videoToBeDeletedPath, + }); + + // Check if the video file exists and has only one use left + if (videoToBeDeleted?.numberOfUses === 1) { + // Delete the video file from the file system + await unlink(path.join(__dirname, "../../../" + videoToBeDeleted.fileName)); + + // Delete the EncodedVideo document from the database + await EncodedVideo.deleteOne({ + fileName: videoToBeDeletedPath, + }); + } + + // Decrease the numberOfUses in the database for the video file + await EncodedVideo.findOneAndUpdate( + { + fileName: videoToBeDeletedPath, + }, + { + $inc: { + numberOfUses: -1, + }, + }, + ); +}; diff --git a/src/utilities/encodedVideoStorage/encodedVideoExtensionCheck.ts b/src/utilities/encodedVideoStorage/encodedVideoExtensionCheck.ts new file mode 100644 index 0000000000..290cb28042 --- /dev/null +++ b/src/utilities/encodedVideoStorage/encodedVideoExtensionCheck.ts @@ -0,0 +1,22 @@ +/** + * Checks if the provided base64 encoded URL represents a video with the "mp4" extension. + * @param encodedUrl - The base64 encoded URL of the video. + * @returns `true` if the encoded URL is a valid mp4 video, `false` otherwise. + */ +export const encodedVideoExtentionCheck = (encodedUrl: string): boolean => { + // Extract the extension from the encoded URL + const extension = encodedUrl.substring( + "data:".length, // Start after "data:" + encodedUrl.indexOf(";base64"), // End before ";base64" + ); + + console.log(extension); // Log the extracted extension for debugging purposes + + // Check if the extension matches "video/mp4" + const isValidVideo = extension === "video/mp4"; + if (isValidVideo) { + return true; + } + + return false; +}; diff --git a/src/utilities/encodedVideoStorage/uploadEncodedVideo.ts b/src/utilities/encodedVideoStorage/uploadEncodedVideo.ts new file mode 100644 index 0000000000..c34274e961 --- /dev/null +++ b/src/utilities/encodedVideoStorage/uploadEncodedVideo.ts @@ -0,0 +1,97 @@ +import { nanoid } from "nanoid"; +import * as fs from "fs"; +import { writeFile } from "fs/promises"; +import { encodedVideoExtentionCheck } from "./encodedVideoExtensionCheck"; +import { errors, requestContext } from "../../libraries"; +import { INVALID_FILE_TYPE } from "../../constants"; +import { EncodedVideo } from "../../models/EncodedVideo"; +import path from "path"; +import { deletePreviousVideo } from "./deletePreviousVideo"; + +/** + * Uploads an encoded video to the server. + * + * @param encodedVideoURL - The URL or content of the encoded video to upload. + * @param previousVideoPath - Optional. The path of the previous video to delete before uploading the new one. + * @returns The file name of the uploaded video. + */ +export const uploadEncodedVideo = async ( + encodedVideoURL: string, + previousVideoPath?: string | null, +): Promise => { + // Check if the uploaded video URL/content is a valid video file type + const isURLValidVideo = encodedVideoExtentionCheck(encodedVideoURL); + + if (!isURLValidVideo) { + throw new errors.InvalidFileTypeError( + requestContext.translate(INVALID_FILE_TYPE.MESSAGE), + INVALID_FILE_TYPE.CODE, + INVALID_FILE_TYPE.PARAM, + ); + } + + // Check if the encoded video already exists in the database + const encodedVideoAlreadyExist = await EncodedVideo.findOne({ + content: encodedVideoURL, + }); + + if (encodedVideoAlreadyExist) { + // If the encoded video already exists and its fileName matches previousVideoPath, return its fileName + if (encodedVideoAlreadyExist?.fileName === previousVideoPath) { + return encodedVideoAlreadyExist?.fileName; + } + + // Increment numberOfUses for the existing encoded video in the database + await EncodedVideo.findOneAndUpdate( + { + content: encodedVideoURL, + }, + { + $inc: { + numberOfUses: 1, + }, + }, + ); + + // Delete the previous video if previousVideoPath is provided + if (previousVideoPath) { + await deletePreviousVideo(previousVideoPath); + } + + return encodedVideoAlreadyExist.fileName; + } + + // Delete the previous video if previousVideoPath is provided + if (previousVideoPath) { + await deletePreviousVideo(previousVideoPath); + } + + // Generate a unique ID for the new video file using nanoid + let id = nanoid(); + id = "videos/" + id + "video.mp4"; + + // Create a new entry in EncodedVideo collection for the uploaded video + const uploadedEncodedVideo = await EncodedVideo.create({ + fileName: id, + content: encodedVideoURL, + }); + + // Extract the video data from the URL (assuming it's base64 encoded) + const data = encodedVideoURL.replace(/^data:video\/\w+;base64,/, ""); + const buf = Buffer.from(data, "base64"); + + // Create a 'videos' directory if it doesn't exist + if (!fs.existsSync(path.join(__dirname, "../../../videos"))) { + fs.mkdir(path.join(__dirname, "../../../videos"), (error) => { + if (error) { + throw error; + } + }); + } + + // Write the video data to the file system + await writeFile(path.join(__dirname, "../../../" + id), buf); + + // Return the fileName of the uploaded video + return uploadedEncodedVideo.fileName; +}; diff --git a/src/utilities/graphQLConnection/generateDefaultGraphQLConnection.ts b/src/utilities/graphQLConnection/generateDefaultGraphQLConnection.ts new file mode 100644 index 0000000000..dc8de9f304 --- /dev/null +++ b/src/utilities/graphQLConnection/generateDefaultGraphQLConnection.ts @@ -0,0 +1,43 @@ +import type { ConnectionPageInfo } from "../../types/generatedGraphQLTypes"; + +/** + * This is typescript type of a base graphQL connection edge object. This connection edge object + * can be extended to create a custom connection edge object as long as the new connection edge + * object adheres to the default type of this base connection edge object. + */ +export type DefaultGraphQLConnectionEdge = { + cursor: string; + node: T0; +}; + +/** + * This is typescript type of a base graphQL connection object. This connection object can be + * extended to create a custom connnection object as long as the new connection object adheres + * to the default type of this base connection object. + */ +export type DefaultGraphQLConnection = { + edges: DefaultGraphQLConnectionEdge[]; + pageInfo: ConnectionPageInfo; + totalCount: number; +}; + +/** + * This is a factory function to create a base graphql connection object with default fields + * that correspond to a connection with no data and no traversal properties in any direction. + * @example + * const connection = generateDefaultGraphQLConnection(); + */ +export function generateDefaultGraphQLConnection< + T0, +>(): DefaultGraphQLConnection { + return { + edges: [], + pageInfo: { + endCursor: null, + hasNextPage: false, + hasPreviousPage: false, + startCursor: null, + }, + totalCount: 0, + }; +} diff --git a/src/utilities/graphQLConnection/getCommonGraphQLConnectionFilter.ts b/src/utilities/graphQLConnection/getCommonGraphQLConnectionFilter.ts new file mode 100644 index 0000000000..32e5a35de1 --- /dev/null +++ b/src/utilities/graphQLConnection/getCommonGraphQLConnectionFilter.ts @@ -0,0 +1,68 @@ +import type { GraphQLConnectionTraversalDirection } from "./index"; + +/** + * This is typescript type of the object returned from function `getCommonGraphQLConnectionFilter`. + */ +type CommonGraphQLConnectionFilter = + | { + _id: { + $lt: string; + }; + } + | { + _id: { + $gt: string; + }; + } + | Record; + +/** + * This function is used to get an object containing common mongoose filtering logic. + * + * @remarks + * + * Here are a few assumptions this function makes which are common to most of the + * graphQL connections. + * + * The entity that has the latest creation datetime must appear at the top of the connection. This + * means the default filtering logic would be to filter in descending order by the time of creation of + * an entity, and if two or more entities have the same time of creation filtering in descending order + * by the primary key of the entity. MongoDB object ids are lexographically sortable all on their own + * because they contain information about both the creation time and primary key for the document. + * + * Therefore, this function only returns filtering logic for filtering by the object id of a mongoDB + * document. + * + * @example + * + * const filter = getCommonGraphQLConnectionFilter(\{ + * cursor: "65da3f8df35eb5bfd52c5368", + * direction: "BACKWARD" + * \}); + * const objectList = await User.find(filter).limit(10); + */ +export function getCommonGraphQLConnectionFilter({ + cursor, + direction, +}: { + cursor: string | null; + direction: GraphQLConnectionTraversalDirection; +}): CommonGraphQLConnectionFilter { + if (cursor !== null) { + if (direction === "BACKWARD") { + return { + _id: { + $gt: cursor, + }, + }; + } else { + return { + _id: { + $lt: cursor, + }, + }; + } + } else { + return {}; + } +} diff --git a/src/utilities/graphQLConnection/getCommonGraphQLConnectionSort.ts b/src/utilities/graphQLConnection/getCommonGraphQLConnectionSort.ts new file mode 100644 index 0000000000..b81c80a1e2 --- /dev/null +++ b/src/utilities/graphQLConnection/getCommonGraphQLConnectionSort.ts @@ -0,0 +1,48 @@ +import type { GraphQLConnectionTraversalDirection } from "./index"; + +/** + *This is typescript type of the object returned from `getCommonGraphQLConnectionSort` function. + */ +type CommmonGraphQLConnectionSort = + | { + _id: 1; + } + | { + _id: -1; + }; + +/** + * This function is used to get an object containing common mongoose sorting logic. + * @remarks + * Here are a few assumptions this function makes which are common to most of the + * graphQL connections. + * + * The entity that has the latest creation datetime must appear at the top of the connection. This + * means the default sorting logic would be sorting in descending order by the time of creation of + * an entity, and if two or more entities have the same time of creation sorting in descending order + * by the primary key of the entity. MongoDB object ids are lexographically sortable all on their own + * because they contain information about both the creation time and primary key for the document. + * + * Therefore, this function only returns sorting logic for sorting by the object id of a mongoDB + * document. + * @example + * const sort = getCommonGraphQLConnectionSort(\{ + * direction: "BACKWARD" + * \}); + * const objectList = await User.find().sort(sort).limit(10); + */ +export function getCommonGraphQLConnectionSort({ + direction, +}: { + direction: GraphQLConnectionTraversalDirection; +}): CommmonGraphQLConnectionSort { + if (direction === "BACKWARD") { + return { + _id: 1, + }; + } else { + return { + _id: -1, + }; + } +} diff --git a/src/utilities/graphQLConnection/index.ts b/src/utilities/graphQLConnection/index.ts new file mode 100644 index 0000000000..339bae78b3 --- /dev/null +++ b/src/utilities/graphQLConnection/index.ts @@ -0,0 +1,52 @@ +/** + * This function is used to check nullish state of a value passed to it. Nullish means the + * value being either `null` or `undefined`. If the value is found to be nullish, the function + * returns the boolean `false`, else it returns the boolean `true`. + * @example + * Here's an example:- + * function print(str: string | null) \{ + * if(isNotNullish(str)) \{ + * console.log(`the string is ${str}`) + * \} else \{ + * console.log(`the string is null`) + * \} + * \} + */ +export function isNotNullish(value: T0 | undefined | null): value is T0 { + return value !== undefined && value !== null; +} + +/** + * This is typescript type of a base graphQL argument error. This argument error type can be + * extended to create custom argument error types as long as they adhere to the default type of + * this base graphQL argument error. + */ +export type DefaultGraphQLArgumentError = { + message: string; + path: string[]; +}; + +/** + * This is typescript type of the standard arguments object received by a graphQL connection + * following the relay cursor connection specification, more info here:- {@link https://relay.dev/graphql/connections.htm} + */ +export type DefaultGraphQLConnectionArguments = { + after?: string | null; + before?: string | null; + first?: number | null; + last?: number | null; +}; + +/** + * This is typescript type of the direction the graphQL connection is to be traversed in. + */ +export type GraphQLConnectionTraversalDirection = "FORWARD" | "BACKWARD"; + +export * from "./generateDefaultGraphQLConnection"; +export * from "./getCommonGraphQLConnectionFilter"; +export * from "./getCommonGraphQLConnectionSort"; +export * from "./parseGraphQLConnectionArguments"; +export * from "./parseGraphQLConnectionArgumentsWithSortedBy"; +export * from "./parseGraphQLConnectionArgumentsWithSortedByAndWhere"; +export * from "./parseGraphQLConnectionArgumentsWithWhere"; +export * from "./transformToDefaultGraphQLConnection"; diff --git a/src/utilities/graphQLConnection/parseGraphQLConnectionArguments.ts b/src/utilities/graphQLConnection/parseGraphQLConnectionArguments.ts new file mode 100644 index 0000000000..095e2fc131 --- /dev/null +++ b/src/utilities/graphQLConnection/parseGraphQLConnectionArguments.ts @@ -0,0 +1,194 @@ +import { MAXIMUM_FETCH_LIMIT } from "../../constants"; +import { + type DefaultGraphQLArgumentError, + type DefaultGraphQLConnectionArguments, + type GraphQLConnectionTraversalDirection, + isNotNullish, +} from "./index"; + +/** + *This is typescript type of the single object callback function `parseCursor` takes in as + * an argument. + */ +export type ParseGraphQLConnectionCursorArguments = { + cursorName: "after" | "before"; + cursorPath: string[]; + cursorValue: string; +}; + +/** + * This is typescript type of object returned from the callback function `parseCursor` passed + * as an argument to `parseGraphQLConnectionArguments`, `parseGraphQLConnectionArgumentsWithSortedBy`, + * `parseGraphQLConnectionArgumentsWithWhere` and `parseGraphQLConnectionArgumentsWithSortedByAndWhere` + * functions. + */ +export type ParseGraphQLConnectionCursorResult = Promise< + | { + errors: DefaultGraphQLArgumentError[]; + isSuccessful: false; + } + | { + isSuccessful: true; + parsedCursor: T0; + } +>; + +/** + * This is typescript type of the callback function `parseCursor`. + */ +export type ParseGraphQLConnectionCursor = ( + args: ParseGraphQLConnectionCursorArguments, +) => ParseGraphQLConnectionCursorResult; + +/** + * This is typescript type of the object containing the validated and transformed connection + * arguments passed to `parseGraphQLConnectionArguments` function. + */ +export type ParsedGraphQLConnectionArguments = { + cursor: T0 | null; + direction: GraphQLConnectionTraversalDirection; + limit: number; +}; + +/** + * This is typescript type of the object returned from `parseGraphQLConnectionArguments` + * function. + */ +export type ParseGraphQLConnectionArgumentsResult = + | { + errors: DefaultGraphQLArgumentError[]; + isSuccessful: false; + } + | { + isSuccessful: true; + parsedArgs: ParsedGraphQLConnectionArguments; + }; + +/** + * This function handles validating and transforming arguments of a base graphQL connection. + * @example + * const result = await parseGraphQLConnectionArguments(\{ + * args: \{ + * after, + * first, + * \}, + * maximumLimit: 20, + * parseCursor + * \}) + * if (result.isSuccessful === false) \{ + * throw new GraphQLError("Invalid arguments provided.", \{ + * extensions: \{ + * code: "INVALID_ARGUMENTS", + * errors: result.errors + * \} + * \}) + * \} + * const \{ parsedArgs: \{ cursor, direction, limit \} \} = result; + */ +export async function parseGraphQLConnectionArguments({ + args, + maximumLimit = MAXIMUM_FETCH_LIMIT, + parseCursor, +}: { + args: DefaultGraphQLConnectionArguments; + maximumLimit?: number; + parseCursor: ParseGraphQLConnectionCursor; +}): Promise> { + const { after, before, first, last } = args; + let errors: DefaultGraphQLArgumentError[] = []; + const parsedArgs: ParsedGraphQLConnectionArguments = { + cursor: null, + direction: "FORWARD", + limit: 0, + }; + if (isNotNullish(first)) { + if (isNotNullish(last)) { + errors.push({ + message: "Argument last cannot be provided with argument first.", + path: ["last"], + }); + } + if (isNotNullish(before)) { + errors.push({ + message: "Argument before cannot be provided with argument first.", + path: ["before"], + }); + } + if (first > maximumLimit) { + errors.push({ + message: `Argument first cannot be greater than ${maximumLimit}.`, + path: ["first"], + }); + } + parsedArgs.direction = "FORWARD"; + // The limit is increased by `1` to fetch one additional object that will be used to + // inform the client about existence of at least one more connection edge to be traversed + // in the connection, depending on the connection traversal direction this information + // is conveyed using the `hasNextPage` or `hasPreviousPage` booleans present in the + // pageInfo object of the connection. + parsedArgs.limit = first + 1; + if (isNotNullish(after)) { + const result = await parseCursor({ + cursorName: "after", + cursorPath: ["after"], + cursorValue: after, + }); + if (!result.isSuccessful) { + errors = errors.concat(result.errors); + } else { + parsedArgs.cursor = result.parsedCursor; + } + } + } else if (isNotNullish(last)) { + if (isNotNullish(after)) { + errors.push({ + message: "Argument after cannot be provided with argument last.", + path: ["after"], + }); + } + if (last > maximumLimit) { + errors.push({ + message: `Argument last cannot be greater than ${maximumLimit}.`, + path: ["last"], + }); + } + parsedArgs.direction = "BACKWARD"; + // The limit is increased by `1` to fetch one additional object that will be used to + // inform the client about existence of at least one more connection edge to be traversed + // in the connection, depending on the connection traversal direction this information + // is conveyed using the `hasNextPage` or `hasPreviousPage` booleans present in the + // pageInfo object of the connection. + parsedArgs.limit = last + 1; + if (isNotNullish(before)) { + const result = await parseCursor({ + cursorName: "before", + cursorPath: ["before"], + cursorValue: before, + }); + if (!result.isSuccessful) { + errors = errors.concat(result.errors); + } else { + parsedArgs.cursor = result.parsedCursor; + } + } + } else { + errors.push({ + message: `Argument first was not provided.`, + path: ["first"], + }); + errors.push({ + message: `Argument last was not provided.`, + path: ["last"], + }); + } + if (errors.length !== 0) { + return { + errors, + isSuccessful: false, + }; + } + return { + isSuccessful: true, + parsedArgs, + }; +} diff --git a/src/utilities/graphQLConnection/parseGraphQLConnectionArgumentsWithSortedBy.ts b/src/utilities/graphQLConnection/parseGraphQLConnectionArgumentsWithSortedBy.ts new file mode 100644 index 0000000000..73cd46e5d0 --- /dev/null +++ b/src/utilities/graphQLConnection/parseGraphQLConnectionArgumentsWithSortedBy.ts @@ -0,0 +1,118 @@ +import { MAXIMUM_FETCH_LIMIT } from "../../constants"; +import type { + DefaultGraphQLArgumentError, + DefaultGraphQLConnectionArguments, +} from "./index"; +import { + type ParseGraphQLConnectionCursor, + type ParsedGraphQLConnectionArguments, + parseGraphQLConnectionArguments, +} from "./parseGraphQLConnectionArguments"; + +/** + *This is typescript type of the object returned from callback function `parseSortedBy`. + */ +export type ParseGraphQLConnectionSortedByResult = + | { + isSuccessful: false; + errors: DefaultGraphQLArgumentError[]; + } + | { + isSuccessful: true; + parsedSortedBy: T0; + }; + +/** + * This is typescript type of the object containing validated and transformed connection + * arguments passed to `parseGraphQLConnectionArgumentsWithSortedBy` function. + */ +export type ParsedGraphQLConnectionArgumentsWithSortedBy = { + sort: T1; +} & ParsedGraphQLConnectionArguments; + +/** + * This is typescript type of the object returned from `parseGraphQLConnectionArgumentsWithSortedBy` function. + */ +export type ParseGraphQLConnectionArgumentsWithSortedByResult = Promise< + | { + errors: DefaultGraphQLArgumentError[]; + isSuccessful: false; + } + | { + isSuccessful: true; + parsedArgs: ParsedGraphQLConnectionArgumentsWithSortedBy; + } +>; + +/** + * This function is used for validating and transforming arguments for a graphQL connection that + * also provides sorting capabilities. + * @example + * const result = await parseGraphQLConnectionArgumentsWithSortedBy(\{ + * args: \{ + * after, + * first, + * \}, + * maximumLimit: 20, + * parseCursor, + * parseSortedBy, + * \}) + * if (result.isSuccessful === false) \{ + * throw new GraphQLError("Invalid arguments provided.", \{ + * extensions: \{ + * code: "INVALID_ARGUMENTS", + * errors: result.errors + * \} + * \}) + * \} + * const \{ parsedArgs: \{ cursor, direction, limit, sort \} \} = result; + */ +export async function parseGraphQLConnectionArgumentsWithSortedBy({ + args, + maximumLimit = MAXIMUM_FETCH_LIMIT, + parseCursor, + parseSortedByResult, +}: { + args: DefaultGraphQLConnectionArguments; + maximumLimit?: number; + parseCursor: ParseGraphQLConnectionCursor; + parseSortedByResult: ParseGraphQLConnectionSortedByResult; +}): ParseGraphQLConnectionArgumentsWithSortedByResult { + const parseGraphQLConnectionArgumentsResult = + await parseGraphQLConnectionArguments({ + args, + parseCursor, + maximumLimit, + }); + + if (!parseGraphQLConnectionArgumentsResult.isSuccessful) { + if (!parseSortedByResult.isSuccessful) { + return { + errors: parseGraphQLConnectionArgumentsResult.errors.concat( + parseSortedByResult.errors, + ), + isSuccessful: false, + }; + } else { + return { + errors: parseGraphQLConnectionArgumentsResult.errors, + isSuccessful: false, + }; + } + } else if (!parseSortedByResult.isSuccessful) { + return { + errors: parseSortedByResult.errors, + isSuccessful: false, + }; + } + + return { + isSuccessful: true, + parsedArgs: { + cursor: parseGraphQLConnectionArgumentsResult.parsedArgs.cursor, + direction: parseGraphQLConnectionArgumentsResult.parsedArgs.direction, + limit: parseGraphQLConnectionArgumentsResult.parsedArgs.limit, + sort: parseSortedByResult.parsedSortedBy, + }, + }; +} diff --git a/src/utilities/graphQLConnection/parseGraphQLConnectionArgumentsWithSortedByAndWhere.ts b/src/utilities/graphQLConnection/parseGraphQLConnectionArgumentsWithSortedByAndWhere.ts new file mode 100644 index 0000000000..a5d399d7b3 --- /dev/null +++ b/src/utilities/graphQLConnection/parseGraphQLConnectionArgumentsWithSortedByAndWhere.ts @@ -0,0 +1,153 @@ +import type { + DefaultGraphQLArgumentError, + DefaultGraphQLConnectionArguments, +} from "./index"; +import { MAXIMUM_FETCH_LIMIT } from "../../constants"; +import { + type ParseGraphQLConnectionCursor, + type ParsedGraphQLConnectionArguments, + parseGraphQLConnectionArguments, +} from "./parseGraphQLConnectionArguments"; +import type { ParseGraphQLConnectionSortedByResult } from "./parseGraphQLConnectionArgumentsWithSortedBy"; +import type { ParseGraphQLConnectionWhereResult } from "./parseGraphQLConnectionArgumentsWithWhere"; +/** + * This is typescript type of the object containing validated and transformed connection + * arguments passed to `parseGraphQLConnectionArgumentsWithSortedByAndWhere` function. + */ +export type ParsedGraphQLConnectionArgumentsWithSortedByAndWhere = { + filter: T1; + sort: T2; +} & ParsedGraphQLConnectionArguments; + +/** + * This is typescript type of the object returned from `parseGraphQLConnectionArgumentsWithSortedByAndWhere` function. + */ +export type ParseGraphQLConnectionArgumentsWithSortedByAndWhereResult< + T0, + T1, + T2, +> = Promise< + | { + errors: DefaultGraphQLArgumentError[]; + isSuccessful: false; + } + | { + isSuccessful: true; + parsedArgs: ParsedGraphQLConnectionArgumentsWithSortedByAndWhere< + T0, + T1, + T2 + >; + } +>; + +/** + * This function is used for validating and transforming arguments for a custom graphQL + * connection that also provides filtering and sorting capabilities. + * @example + * const result = await parseGraphQLConnectionArgumentsWithSortedBy(\{ + * args: \{ + * after, + * first, + * \}, + * maximumLimit: 20, + * parseCursor, + * parseSortedBy, + * parseWhere, + * \}) + * if (result.isSuccessful === false) \{ + * throw new GraphQLError("Invalid arguments provided.", \{ + * extensions: \{ + * code: "INVALID_ARGUMENTS", + * errors: result.errors + * \} + * \}) + * \} + * const \{ parsedArgs: \{ cursor, direction, filter, limit, sort \} \} = result; + */ +export async function parseGraphQLConnectionArgumentsWithSortedByAndWhere< + T0, + T1, + T2, +>({ + args, + maximumLimit = MAXIMUM_FETCH_LIMIT, + parseCursor, + parseWhereResult, + parseSortedByResult, +}: { + args: DefaultGraphQLConnectionArguments; + maximumLimit?: number; + parseCursor: ParseGraphQLConnectionCursor; + parseWhereResult: ParseGraphQLConnectionWhereResult; + parseSortedByResult: ParseGraphQLConnectionSortedByResult; +}): ParseGraphQLConnectionArgumentsWithSortedByAndWhereResult { + const parseGraphQLConnectionArgumentsResult = + await parseGraphQLConnectionArguments({ + args, + parseCursor, + maximumLimit, + }); + + if (!parseGraphQLConnectionArgumentsResult.isSuccessful) { + if (!parseWhereResult.isSuccessful) { + if (!parseSortedByResult.isSuccessful) { + return { + errors: parseGraphQLConnectionArgumentsResult.errors.concat( + parseWhereResult.errors.concat(parseSortedByResult.errors), + ), + isSuccessful: false, + }; + } else { + return { + errors: parseGraphQLConnectionArgumentsResult.errors.concat( + parseWhereResult.errors, + ), + isSuccessful: false, + }; + } + } else { + if (!parseSortedByResult.isSuccessful) { + return { + errors: parseGraphQLConnectionArgumentsResult.errors.concat( + parseSortedByResult.errors, + ), + isSuccessful: false, + }; + } else { + return { + errors: parseGraphQLConnectionArgumentsResult.errors, + isSuccessful: false, + }; + } + } + } else if (!parseWhereResult.isSuccessful) { + if (!parseSortedByResult.isSuccessful) { + return { + errors: parseWhereResult.errors.concat(parseSortedByResult.errors), + isSuccessful: false, + }; + } else { + return { + errors: parseWhereResult.errors, + isSuccessful: false, + }; + } + } else if (!parseSortedByResult.isSuccessful) { + return { + errors: parseSortedByResult.errors, + isSuccessful: false, + }; + } + + return { + isSuccessful: true, + parsedArgs: { + cursor: parseGraphQLConnectionArgumentsResult.parsedArgs.cursor, + direction: parseGraphQLConnectionArgumentsResult.parsedArgs.direction, + filter: parseWhereResult.parsedWhere, + limit: parseGraphQLConnectionArgumentsResult.parsedArgs.limit, + sort: parseSortedByResult.parsedSortedBy, + }, + }; +} diff --git a/src/utilities/graphQLConnection/parseGraphQLConnectionArgumentsWithWhere.ts b/src/utilities/graphQLConnection/parseGraphQLConnectionArgumentsWithWhere.ts new file mode 100644 index 0000000000..183819f553 --- /dev/null +++ b/src/utilities/graphQLConnection/parseGraphQLConnectionArgumentsWithWhere.ts @@ -0,0 +1,118 @@ +import type { + DefaultGraphQLArgumentError, + DefaultGraphQLConnectionArguments, +} from "./index"; +import { MAXIMUM_FETCH_LIMIT } from "../../constants"; +import { + type ParseGraphQLConnectionCursor, + type ParsedGraphQLConnectionArguments, + parseGraphQLConnectionArguments, +} from "./parseGraphQLConnectionArguments"; + +/** + * This is typescript type of the object returned from callback function `parseWhere`. + */ +export type ParseGraphQLConnectionWhereResult = + | { + isSuccessful: false; + errors: DefaultGraphQLArgumentError[]; + } + | { + isSuccessful: true; + parsedWhere: T0; + }; + +/** + * This is typescript type of the object containing the validated and transformed connection + * arguments passed to `parseGraphQLConnectionArgumentsWithWhere` function. + */ +export type ParsedGraphQLConnectionArgumentsWithWhere = { + where: T1; +} & ParsedGraphQLConnectionArguments; + +/** + * This is typescript type of the object returned from `parseGraphQLConnectionArgumentsWithWhere` function. + */ +export type ParseGraphQLConnectionArgumentsWithWhereResult = Promise< + | { + errors: DefaultGraphQLArgumentError[]; + isSuccessful: false; + } + | { + isSuccessful: true; + parsedArgs: ParsedGraphQLConnectionArgumentsWithWhere; + } +>; + +/** + * This function handles validating and transforming arguments for a custom graphQL connection + * that also provides filtering capabilities. + * @example + * const result = await parseGraphQLConnectionArgumentsWithSortedBy(\{ + * args: \{ + * after, + * first, + * \}, + * maximumLimit: 20, + * parseCursor, + * parseSortedBy, + * \}) + * if (result.isSuccessful === false) \{ + * throw new GraphQLError("Invalid arguments provided.", \{ + * extensions: \{ + * code: "INVALID_ARGUMENTS", + * errors: result.errors + * \} + * \}) + * \} + * const \{ parsedArgs: \{ cursor, direction, filter, limit \} \} = result; + */ +export async function parseGraphQLConnectionArgumentsWithWhere({ + args, + maximumLimit = MAXIMUM_FETCH_LIMIT, + parseCursor, + parseWhereResult, +}: { + args: DefaultGraphQLConnectionArguments; + maximumLimit?: number; + parseCursor: ParseGraphQLConnectionCursor; + parseWhereResult: ParseGraphQLConnectionWhereResult; +}): ParseGraphQLConnectionArgumentsWithWhereResult { + const parseGraphQLConnectionArgumentsResult = + await parseGraphQLConnectionArguments({ + args, + maximumLimit, + parseCursor, + }); + + if (!parseGraphQLConnectionArgumentsResult.isSuccessful) { + if (!parseWhereResult.isSuccessful) { + return { + errors: parseGraphQLConnectionArgumentsResult.errors.concat( + parseWhereResult.errors, + ), + isSuccessful: false, + }; + } else { + return { + errors: parseGraphQLConnectionArgumentsResult.errors, + isSuccessful: false, + }; + } + } else if (!parseWhereResult.isSuccessful) { + return { + errors: parseWhereResult.errors, + isSuccessful: false, + }; + } + + return { + isSuccessful: true, + parsedArgs: { + cursor: parseGraphQLConnectionArgumentsResult.parsedArgs.cursor, + direction: parseGraphQLConnectionArgumentsResult.parsedArgs.direction, + limit: parseGraphQLConnectionArgumentsResult.parsedArgs.limit, + where: parseWhereResult.parsedWhere, + }, + }; +} diff --git a/src/utilities/graphQLConnection/transformToDefaultGraphQLConnection.ts b/src/utilities/graphQLConnection/transformToDefaultGraphQLConnection.ts new file mode 100644 index 0000000000..e12d3b209c --- /dev/null +++ b/src/utilities/graphQLConnection/transformToDefaultGraphQLConnection.ts @@ -0,0 +1,152 @@ +import type { Types } from "mongoose"; +import { + type DefaultGraphQLConnection, + generateDefaultGraphQLConnection, +} from "./generateDefaultGraphQLConnection"; +import type { ParsedGraphQLConnectionArguments } from "./parseGraphQLConnectionArguments"; + +/** + * This is typescript type of the callback function `createCursor`. + */ +export type CreateCursor = (object: T0) => string; + +/** + * This is typescript type of the callback function `createNode`. + */ +export type CreateNode = (object: T0) => T1; + +export type TransformToDefaultGraphQLConnectionArguments = { + createCursor?: CreateCursor; + createNode?: CreateNode; + objectList: T1[]; + parsedArgs: ParsedGraphQLConnectionArguments; + totalCount: number; +}; + +/** + * This function is used to transform a list of objects to a standard graphQL connection object. + * @remarks + * The logic used in this function is common to almost all graphQL connection creation flows, + * abstracting that away into this function lets developers use a declarative way to create the + * graphQL connection object they want and prevents code duplication. + * @example + * const [objectList, totalCount] = await Promise.all([ + * User.find(filter) + * .sort(sort) + * .limit(limit) + * .exec(), + * User.find(filter) + * .countDocuments() + * .exec(), + * ]); + * + * return transformToDefaultGraphQLConnection\< + * String, + * DatabaseUser, + * DatabaseUser + * \>(\{ + * objectList, + * parsedArgs, + * totalCount, + * \}); + */ +export function transformToDefaultGraphQLConnection< + T0, + T1 extends { + _id: string | Types.ObjectId; + }, + T2, +>({ + /** + * If no custom callback function `createCursor` is provided by the function caller, the default + * function defined below will execute, the assumption is that `_id` is to be used as the + * cursor for the graphQL connection edges list. + */ + createCursor = (object): string => object._id.toString(), + /** + * If no custom callback function `createNode` is provided by the function caller, the default + * function defined below will execute, the assumption is that the type of objects within + * the `objectList` is the same as type of nodes with connection edges. + */ + createNode = (object): T2 => + ({ + ...object, + _id: object._id.toString(), + }) as unknown as T2, + objectList, + parsedArgs: { cursor, direction, limit }, + totalCount, +}: TransformToDefaultGraphQLConnectionArguments< + T0, + T1, + T2 +>): DefaultGraphQLConnection { + // Initialize the connection object. + const connection = generateDefaultGraphQLConnection(); + + // Following are the two possible cases where this default connection object with + // unmodified fields is to be returned. First case is when `totalCount == 0`, because + // this implies that there are no edges available for this connection, second case is + // when `cursor == null` and `objectList.length == 0`, because this implies that there + // are no edges available whether forward or backwards paginating. Checking against the + // first check by itself is sufficient to take care of second case as well. + if (totalCount === 0) { + return connection; + } + + connection.totalCount = totalCount; + + if (direction === "BACKWARD") { + // The cursor being defined means a connection edge corresponding to that cursor exists. + if (cursor !== null) { + connection.pageInfo.hasNextPage = true; + } + // This situation occurs when the client queries for a connection with a valid cursor + // even though there are no more edges to traverse in the backward direction, it means + // `connection.pageInfo.hasPreviousPage == false` in client's previous connection object, + // but they query using `connection.pageInfo.startCursor` anyway. + if (objectList.length === 0) { + return connection; + } + // Number of items in `objectList` being equal to limit means there is at least + // one additional connection edge available for the client to traverse. + if (objectList.length === limit) { + connection.pageInfo.hasPreviousPage = true; + // Removal of 1 extra object contained in the `objectList`. + objectList.pop(); + } + // Order of the `objectList` must be reversed when the graphQL connection is to be traversed + // is opposite of the expected direction, more info here:- + // https://relay.dev/graphql/connections.htm#sec-Pagination-algorithm + objectList = objectList.reverse(); + } else { + // The cursor being defined means a connection edge corresponding to that cursor exists. + if (cursor !== null) { + connection.pageInfo.hasPreviousPage = true; + } + // This situation occurs when the client queries for a connection with a valid cursor + // even though there are no more edges to traverse in the forward direction, it means + // `connection.pageInfo.hasNextPage == false` in client's previous connection object, + // but they query using `connection.pageInfo.endCursor` anyway. + if (objectList.length === 0) { + return connection; + } + // Number of items in `objectList` being equal to limit means there is at least + // one additional connection edge available for the client to traverse. + if (objectList.length === limit) { + connection.pageInfo.hasNextPage = true; + // Removal of 1 extra object contained in the `objectList`. + objectList.pop(); + } + } + + connection.edges = objectList.map((object) => ({ + cursor: createCursor(object), + node: createNode(object), + })); + connection.pageInfo.startCursor = connection.edges[0].cursor; + connection.pageInfo.endCursor = + connection.edges[connection.edges.length - 1].cursor; + + return connection; +} diff --git a/src/utilities/imageAlreadyInDbCheck.ts b/src/utilities/imageAlreadyInDbCheck.ts new file mode 100644 index 0000000000..1d5b8a3506 --- /dev/null +++ b/src/utilities/imageAlreadyInDbCheck.ts @@ -0,0 +1,94 @@ +import { imageHash } from "image-hash"; +import { ImageHash } from "../models"; +import { deleteDuplicatedImage } from "./deleteDuplicatedImage"; +import { reuploadDuplicateCheck } from "./reuploadDuplicateCheck"; +import { errors, requestContext } from "../libraries"; +import { INVALID_FILE_TYPE } from "../constants"; + +/** + * Checks if an image already exists in the database using its hash value. + * If the image exists, it points to the existing image and removes the newly uploaded image. + * If the image does not exist, it saves the image hash in the database. + * @param oldImagePath - Path of the old image that might be replaced. + * @param newImagePath - Path of the newly uploaded image. + * @returns The file name of the existing image if found; otherwise, undefined. + */ +export const imageAlreadyInDbCheck = async ( + oldImagePath: string | null, + newImagePath: string, +): Promise => { + try { + let fileName; + + // Function to get the hash value of the new image + const getImageHash = (): Promise => + new Promise((resolve, reject) => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + imageHash(`./${newImagePath}`, 16, true, (error: any, data: any) => { + if (error) { + reject(error); + } else { + resolve(data); + } + }); + }); + + // Get the hash value of the new image + const hash = await getImageHash(); + + // Check if there is an existing image with the same hash value in the database + const existingImageHash = await ImageHash.findOne({ + hashValue: hash, + }).lean(); + + if (!existingImageHash) { + // If no existing image hash found, create a new entry in the ImageHash collection + await ImageHash.create({ + hashValue: hash, + fileName: newImagePath, + numberOfUses: 1, + }); + } else { + // If an image with the same hash exists, perform duplicate check + const imageIsDuplicate = await reuploadDuplicateCheck( + oldImagePath, + newImagePath, + ); + + if (imageIsDuplicate === false) { + // Increment the number of uses if it's not a duplicate + await ImageHash.updateOne( + { + // Increase the number of places this image is used + hashValue: hash, + }, + { + $inc: { + numberOfUses: 1, + }, + }, + ); + } + + // Delete the newly uploaded image as it's a duplicate + deleteDuplicatedImage(newImagePath); + + // Set the file name to the existing image's file name + fileName = existingImageHash.fileName; + } + + return fileName as string; + } catch (error) { + // Handle errors, such as invalid file types + throw new errors.ValidationError( + [ + { + message: requestContext.translate(INVALID_FILE_TYPE.MESSAGE), + code: INVALID_FILE_TYPE.CODE, + param: INVALID_FILE_TYPE.PARAM, + }, + ], + requestContext.translate(INVALID_FILE_TYPE.MESSAGE), + ); + } +}; diff --git a/src/utilities/imageExtensionCheck.ts b/src/utilities/imageExtensionCheck.ts new file mode 100644 index 0000000000..6fbea005d6 --- /dev/null +++ b/src/utilities/imageExtensionCheck.ts @@ -0,0 +1,34 @@ +import { deleteImage } from "./deleteImage"; +import { errors, requestContext } from "../libraries"; +import { INVALID_FILE_TYPE } from "../constants"; + +/** + * Checks the file extension of the given filename. + * If the extension is not 'png', 'jpg', or 'jpeg', deletes the file and throws a validation error. + * + * @param filename - The name of the file to check + */ +export const imageExtensionCheck = async (filename: string): Promise => { + const fileExtension = filename.split(".").pop(); + + if ( + fileExtension !== "png" && + fileExtension !== "jpg" && + fileExtension !== "jpeg" + ) { + // Delete the file because the extension is not allowed + await deleteImage(filename); + + // Throw a validation error indicating invalid file type + throw new errors.ValidationError( + [ + { + message: requestContext.translate(INVALID_FILE_TYPE.MESSAGE), + code: INVALID_FILE_TYPE.CODE, + param: INVALID_FILE_TYPE.PARAM, + }, + ], + requestContext.translate(INVALID_FILE_TYPE.MESSAGE), + ); + } +}; diff --git a/src/utilities/index.ts b/src/utilities/index.ts new file mode 100644 index 0000000000..d6117422fc --- /dev/null +++ b/src/utilities/index.ts @@ -0,0 +1,7 @@ +export * from "./adminCheck"; +export * from "./auth"; +export * from "./copyToClipboard"; +export * from "./deleteImage"; +export * from "./mailer"; +export * from "./superAdminCheck"; +export * from "./uploadImage"; diff --git a/src/utilities/loadDefaultOrg.ts b/src/utilities/loadDefaultOrg.ts new file mode 100644 index 0000000000..0bf21c59fb --- /dev/null +++ b/src/utilities/loadDefaultOrg.ts @@ -0,0 +1,51 @@ +import fs from "fs/promises"; +import path from "path"; +import { connect, disconnect } from "../db"; +import { AppUserProfile, Organization, User } from "../models"; + +/** + * Loads default organization data into the database. + * @param dbName - Optional name of the database to connect to. + * @returns Promise + */ +export async function loadDefaultOrganiation(dbName?: string): Promise { + try { + // Connect to the database + await connect(dbName); + + // Read and insert default user data + const userData = await fs.readFile( + path.join(__dirname, `../../sample_data/defaultUser.json`), + "utf8", + ); + const userDocs = JSON.parse(userData) as Record[]; + await User.insertMany(userDocs); + + // Read and insert default app user profile data + const appUserData = await fs.readFile( + path.join(__dirname, `../../sample_data/defaultAppUserProfile.json`), + "utf8", + ); + const appUserDocs = JSON.parse(appUserData) as Record[]; + await AppUserProfile.insertMany(appUserDocs); + + // Read and insert default organization data + const organizationData = await fs.readFile( + path.join(__dirname, `../../sample_data/defaultOrganization.json`), + "utf8", + ); + const organizationDocs = JSON.parse(organizationData) as Record< + string, + unknown + >[]; + await Organization.insertMany(organizationDocs); + + // Log success message + console.log("Default organization loaded"); + } catch (error) { + // Log any errors that occur during the process + console.log(error); + } finally { + await disconnect(); // Close the database connection + } +} diff --git a/src/utilities/loadSampleData.ts b/src/utilities/loadSampleData.ts new file mode 100644 index 0000000000..7ff7e666da --- /dev/null +++ b/src/utilities/loadSampleData.ts @@ -0,0 +1,230 @@ +import fs from "fs/promises"; +import path from "path"; +import yargs from "yargs"; +import { connect } from "../db"; +import { + ActionItemCategory, + AgendaCategoryModel, + AppUserProfile, + Community, + Event, + Organization, + Post, + User, +} from "../models"; +import { RecurrenceRule } from "../models/RecurrenceRule"; + +interface InterfaceArgs { + items?: string; + format?: boolean; + _: unknown; +} + +/** + * Lists sample data files and their document counts in the sample_data directory. + */ +async function listSampleData(): Promise { + try { + const sampleDataPath = path.join(__dirname, "../../sample_data"); + const files = await fs.readdir(sampleDataPath); + + console.log("Sample Data Files:\n"); + + console.log( + "| File Name".padEnd(30) + + "| Document Count |\n" + + "|".padEnd(30, "-") + + "|----------------|\n", + ); + + for (const file of files) { + const filePath = path.join(sampleDataPath, file); + const stats = await fs.stat(filePath); + if (stats.isFile()) { + const data = await fs.readFile(filePath, "utf8"); + const docs = JSON.parse(data); + console.log( + `| ${file.padEnd(28)}| ${docs.length.toString().padEnd(15)}|`, + ); + } + } + console.log(); + } catch (err) { + console.error("\x1b[31m", `Error listing sample data: ${err}`); + } +} + +/** + * Clears all collections in the database. + */ +async function formatDatabase(): Promise { + // Clear all collections + await Promise.all([ + Community.deleteMany({}), + User.deleteMany({}), + Organization.deleteMany({}), + ActionItemCategory.deleteMany({}), + AgendaCategoryModel.deleteMany({}), + Event.deleteMany({}), + Post.deleteMany({}), + AppUserProfile.deleteMany({}), + RecurrenceRule.deleteMany({}), + ]); + console.log("Cleared all collections\n"); +} + +/** + * Inserts data into specified collections. + * @param collections - Array of collection names to insert data into + */ +async function insertCollections(collections: string[]): Promise { + try { + // Connect to MongoDB database + await connect(); + + const { format } = yargs + .options({ + items: { + alias: "i", + describe: + "Comma-separated list of collections to load sample data into", + type: "string", + }, + format: { + alias: "f", + describe: + "Formats all the collections present in the database before the insertion of objects. [WARNING] Use carefully.", + type: "boolean", + }, + }) + .parseSync() as InterfaceArgs; + + // Check if formatting is requested + if (format) { + await formatDatabase(); + } + + // Insert data into each specified collection + for (const collection of collections) { + const data = await fs.readFile( + path.join(__dirname, `../../sample_data/${collection}.json`), + "utf8", + ); + const docs = JSON.parse(data) as Record[]; + + switch (collection) { + case "users": + await User.insertMany(docs); + break; + case "organizations": + await Organization.insertMany(docs); + break; + case "actionItemCategories": + await ActionItemCategory.insertMany(docs); + break; + case "agendaCategories": + await AgendaCategoryModel.insertMany(docs); + break; + case "events": + await Event.insertMany(docs); + break; + case "recurrenceRules": + await RecurrenceRule.insertMany(docs); + break; + case "posts": + await Post.insertMany(docs); + break; + case "appUserProfiles": + await AppUserProfile.insertMany(docs); + break; + default: + console.log("\x1b[31m", `Invalid collection name: ${collection}`); + break; + } + + console.log("\x1b[35m", `Added ${collection} collection`); + } + + // Check document counts after import + await checkCountAfterImport(); + + console.log("\nCollections added successfully"); + } catch (err) { + console.error("\x1b[31m", `Error adding collections: ${err}`); + } finally { + process.exit(0); + } +} + +/** + * Checks document counts in specified collections after data insertion. + */ +async function checkCountAfterImport(): Promise { + try { + // Connect to MongoDB database + await connect(); + + const collections = [ + { name: "users", model: User }, + { name: "organizations", model: Organization }, + { name: "actionItemCategories", model: ActionItemCategory }, + { name: "agendaCategories", model: AgendaCategoryModel }, + { name: "events", model: Event }, + { name: "recurrenceRules", model: RecurrenceRule }, + { name: "posts", model: Post }, + { name: "appUserProfiles", model: AppUserProfile }, + ]; + + console.log("\nDocument Counts After Import:\n"); + + // Table header + console.log( + "| Collection Name".padEnd(30) + + "| Document Count |\n" + + "|".padEnd(30, "-") + + "|----------------|\n", + ); + + // Display document counts for each collection + for (const { name, model } of collections) { + const count = await model.countDocuments(); + console.log(`| ${name.padEnd(28)}| ${count.toString().padEnd(15)}|`); + } + } catch (err) { + console.error("\x1b[31m", `Error checking document count: ${err}`); + } +} + +// Default collections available to insert +const collections = [ + "users", + "organizations", + "posts", + "events", + "recurrenceRules", + "appUserProfiles", + "actionItemCategories", + "agendaCategories", +]; + +// Check if specific collections need to be inserted +const { items: argvItems } = yargs + .options({ + items: { + alias: "i", + describe: "Comma-separated list of collections to load sample data into", + type: "string", + }, + }) + .parseSync() as InterfaceArgs; + +(async (): Promise => { + if (argvItems) { + const specificCollections = argvItems.split(","); + await listSampleData(); + await insertCollections(specificCollections); + } else { + await listSampleData(); + await insertCollections(collections); + } +})(); diff --git a/src/utilities/mailer.ts b/src/utilities/mailer.ts new file mode 100644 index 0000000000..cfe5b46d44 --- /dev/null +++ b/src/utilities/mailer.ts @@ -0,0 +1,79 @@ +import type { Transporter } from "nodemailer"; +import nodemailer from "nodemailer"; +import type SMTPTransport from "nodemailer/lib/smtp-transport"; +import { + ERROR_IN_SENDING_MAIL, + MAIL_PASSWORD, + MAIL_USERNAME, + SMTP_OPTIONS, +} from "../constants"; + +/** + * Interface for the fields required to send an email. + */ +export interface InterfaceMailFields { + emailTo: string; // Email address of the recipient + subject: string; // Subject of the email + body: string; // Body content of the email (HTML format) +} + +/** + * Sends an email using Nodemailer. + * @remarks + * This is a utility method for sending emails. + * @param mailFields - An object containing emailTo, subject, and body fields. + * @returns A promise resolving to `SMTPTransport.SentMessageInfo` on success, or an error string on failure. + */ +export const mailer = ( + mailFields: InterfaceMailFields, +): Promise => { + // Nodemailer configuration + let transporter: Transporter; + + // Check if custom SMTP server is configured + if (SMTP_OPTIONS.IS_SMTP) { + transporter = nodemailer.createTransport({ + host: String(SMTP_OPTIONS.SMTP_HOST), + port: Number(SMTP_OPTIONS.SMTP_PORT), + secure: SMTP_OPTIONS.SMTP_SSL_TLS, + auth: { + user: SMTP_OPTIONS.SMTP_USERNAME, + pass: SMTP_OPTIONS.SMTP_PASSWORD, + }, + } as SMTPTransport.Options); + } else { + // Use Gmail transporter if custom SMTP is not configured + transporter = nodemailer.createTransport({ + service: "gmail", + auth: { + user: MAIL_USERNAME, + pass: MAIL_PASSWORD, + }, + }); + } + + const mailOptions = { + from: !SMTP_OPTIONS.IS_SMTP + ? "Talawa<>noreply@gmail.com" + : SMTP_OPTIONS.SMTP_USERNAME, + to: mailFields.emailTo, + subject: mailFields.subject, + html: mailFields.body, + }; + + return new Promise((resolve, reject) => { + // Send email using transporter + transporter.sendMail( + mailOptions, + function (error: Error | null, info: SMTPTransport.SentMessageInfo) { + if (error) { + // Handle error if sending mail fails + reject(ERROR_IN_SENDING_MAIL); + } else { + // Resolve with sent message information if email is sent successfully + resolve(info); + } + }, + ); + }); +}; diff --git a/src/utilities/recurrenceDatesUtil.ts b/src/utilities/recurrenceDatesUtil.ts new file mode 100644 index 0000000000..720ba1f125 --- /dev/null +++ b/src/utilities/recurrenceDatesUtil.ts @@ -0,0 +1,51 @@ +/** + * This function converts the date to UTC. + * @param date - the date to be converted. + * @returns converted date. + */ + +export const convertToUTCDate = (date: Date): Date => { + const year = date.getFullYear(); + const month = date.getMonth(); + const day = date.getDate(); + + // Create a new date object with local year, month, day but at UTC midnight + const utcMidnight = new Date(Date.UTC(year, month, day, 0, 0, 0, 0)); + + return utcMidnight; +}; + +/** + * This function converts the date to a valid rrule string argument. + * @param date - the date string to be converted. + * @returns converted date string. + */ + +export const convertToRRuleDateString = (date: Date): string => { + let dateString = date.toISOString(); + + dateString = dateString.replace(/[-:]/g, ""); + + dateString = dateString.replace(/\.\d{3}/, ""); + + return dateString; +}; + +/** + * This function counts the total number of mondays in a month. + * @param date - a date. + * @returns total number of mondays. + */ + +export const countTotalMondaysInMonth = (date: Date): number => { + let count = 0; + const month = date.getMonth(); + + for (let i = 1; i <= 31; i++) { + const testDate = new Date(date.getFullYear(), month, i); + if (testDate.getMonth() !== month) break; // Month has ended + if (testDate.getDay() === 1) count++; // Monday + } + + return count; +}; diff --git a/src/utilities/removeSampleOrganizationUtil.ts b/src/utilities/removeSampleOrganizationUtil.ts new file mode 100644 index 0000000000..089e97368a --- /dev/null +++ b/src/utilities/removeSampleOrganizationUtil.ts @@ -0,0 +1,44 @@ +import { + AppUserProfile, + Event, + Organization, + Plugin, + Post, + SampleData, + User, +} from "../models"; + +/** + * Removes sample organization data from respective collections based on entries in SampleData collection. + * Also deletes all documents in SampleData collection after removal. + * @returns Promise + */ +export async function removeSampleOrganization(): Promise { + // Retrieve all documents from SampleData collection + const sampleDataDocuments = await SampleData.find({}); + + // Iterate through each document in SampleData + for (const document of sampleDataDocuments) { + const { collectionName, documentId } = document; + + // Define a mapping of collection names to their respective Mongoose models + const collectionModels = { + Organization, + Post, + Event, + User, + Plugin, + AppUserProfile, + }; + + // Determine the model based on collectionName retrieved from SampleData + const collectionModel = collectionModels[ + collectionName + ] as typeof Organization; + // Safely cast the model to its appropriate type and delete the document by ID + await collectionModel.findByIdAndDelete(documentId); + } + + // Delete all documents from SampleData collection after cleanup + await SampleData.deleteMany({}); +} diff --git a/src/utilities/reuploadDuplicateCheck.ts b/src/utilities/reuploadDuplicateCheck.ts new file mode 100644 index 0000000000..6f92297afb --- /dev/null +++ b/src/utilities/reuploadDuplicateCheck.ts @@ -0,0 +1,79 @@ +import { imageHash } from "image-hash"; +import { requestContext, errors, logger } from "../libraries"; + +// Interface for URL request object +interface InterfaceUrlRequestObject { + encoding?: string | null; + url: string | null; +} + +// Interface for Buffer object +interface InterfaceBufferObject { + ext?: string; + data: Buffer; + name?: string; +} + +// Type definition for image path, can be string, InterfaceUrlRequestObject, or InterfaceBufferObject +export type TypeImagePath = + | string + | InterfaceUrlRequestObject + | InterfaceBufferObject; + +/** + * Gets the hash value of an image using the image-hash library. + * @param oldSrc - Path of the image to hash, can be a string, URL request object, or buffer object. + * @returns Promise that resolves to the hash object. + */ +const getImageHash = (oldSrc: TypeImagePath): object => { + return new Promise((resolve, reject) => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + imageHash(oldSrc, 16, true, (error: Error, data: any) => { + if (error) { + reject(error); // Reject promise if error occurs during hashing + } + resolve(data); // Resolve promise with hash data + }); + }); +}; + +/** + * Checks if a user or organization is attempting to re-upload the same image. + * @remarks + * This is a utility method. + * @param oldImagePath - Path of the current image (could be a string, URL request object, or buffer object). + * @param newImagePath - Path of the new image being uploaded (could be a string, URL request object, or buffer object). + * @returns Promise that resolves to true if the images are identical, false otherwise. + */ +export const reuploadDuplicateCheck = async ( + oldImagePath: TypeImagePath | null, + newImagePath: TypeImagePath, +): Promise => { + try { + if (oldImagePath) { + // Calculate hash of old and new images + const oldImageHash = await getImageHash(oldImagePath); + const newImageHash = await getImageHash(newImagePath); + + // Compare hashes to determine if images are identical + return oldImageHash === newImageHash; + } + + // If oldImagePath is null, cannot be a duplicate upload + return false; + } catch (error) { + logger.error(error); // Log error for debugging purposes + + // Throw a validation error with translated message + throw new errors.ValidationError( + [ + { + message: requestContext.translate("invalid.fileType"), + code: "invalid.fileType", + param: "fileType", + }, + ], + requestContext.translate("invalid.fileType"), + ); + } +}; diff --git a/src/utilities/superAdminCheck.ts b/src/utilities/superAdminCheck.ts new file mode 100644 index 0000000000..7e49693a72 --- /dev/null +++ b/src/utilities/superAdminCheck.ts @@ -0,0 +1,23 @@ +import { USER_NOT_AUTHORIZED_SUPERADMIN } from "../constants"; +import { errors, requestContext } from "../libraries"; +import type { InterfaceAppUserProfile } from "../models"; + +/** + * Checks if the provided application user profile is a super admin. + * Throws an UnauthorizedError if the user is not a super admin. + * + * @param appUserProfile - The user profile of the application. + */ +export const superAdminCheck = ( + appUserProfile: InterfaceAppUserProfile, +): void => { + const userIsSuperAdmin: boolean = appUserProfile.isSuperAdmin; + + if (!userIsSuperAdmin) { + throw new errors.UnauthorizedError( + requestContext.translate(USER_NOT_AUTHORIZED_SUPERADMIN.MESSAGE), + USER_NOT_AUTHORIZED_SUPERADMIN.CODE, + USER_NOT_AUTHORIZED_SUPERADMIN.PARAM, + ); + } +}; diff --git a/src/utilities/uploadImage.ts b/src/utilities/uploadImage.ts new file mode 100644 index 0000000000..c99a44a8a5 --- /dev/null +++ b/src/utilities/uploadImage.ts @@ -0,0 +1,75 @@ +import { createWriteStream } from "fs"; +import path from "path"; +import { nanoid } from "nanoid"; +import { logger } from "../libraries"; +import { imageAlreadyInDbCheck } from "./imageAlreadyInDbCheck"; +import { deleteImage } from "./deleteImage"; +import { imageExtensionCheck } from "./imageExtensionCheck"; + +/** + * Uploads a new image, deletes the previously uploaded image if it exists, and checks for duplicates in the database. + * @remarks + * This is a utility method. + * @param newImageFile - File object of the new image with `TypeNewImageFile` type. + * @param oldImagePath - Path of the current image to be replaced. Can be `null` if no image exists. + * @returns An object containing paths of the newly uploaded image and any duplicate image found in the database. + */ +type TypeNewImageFile = { + createReadStream: () => NodeJS.ReadStream; + filename: string; +}; + +export const uploadImage = async ( + newImageFile: TypeNewImageFile, + oldImagePath: string | null, +): Promise<{ newImagePath: string; imageAlreadyInDbPath: string }> => { + // Generate a unique ID for the new image file + const id = nanoid(); + + // Extract filename from new image file + const { createReadStream, filename } = await newImageFile; + + // Validate image file extension (must be PNG or JPG) + await imageExtensionCheck(filename); + + // upload new image + await new Promise((resolve, reject) => + createReadStream() + .pipe( + createWriteStream( + path.join(__dirname, "../../images", `/${id}-${filename}`), + ), + ) + .on("close", resolve) + .on("error", (error: Error) => reject(error)) + .on("finish", () => + resolve({ + path, + }), + ), + ); + + const newImagePath = `images/${id}-${filename}`; + + // If there is an old image path, delete it and perform duplicate check + if (oldImagePath !== null) { + console.log("oldImagePath is not null"); + + logger.info("old image should be deleted"); + + // If user/organization already has an image delete it from the API + await deleteImage(oldImagePath, newImagePath); + } + + // Check if the newly uploaded image already exists in the database + const imageAlreadyInDbPath = await imageAlreadyInDbCheck( + oldImagePath, + newImagePath, + ); + + // Return paths of the newly uploaded image and any duplicate found in the database + return { + newImagePath, + imageAlreadyInDbPath, + }; +}; diff --git a/src/utilities/userFamilyAdminCheck.ts b/src/utilities/userFamilyAdminCheck.ts new file mode 100644 index 0000000000..ea17c934c4 --- /dev/null +++ b/src/utilities/userFamilyAdminCheck.ts @@ -0,0 +1,44 @@ +import type { Types } from "mongoose"; +import mongoose from "mongoose"; +import { USER_NOT_AUTHORIZED_ADMIN } from "../constants"; +import { errors, requestContext } from "../libraries"; +import { AppUserProfile } from "../models"; +import type { InterfaceUserFamily } from "../models/userFamily"; + +/** + * Checks if the current user is an admin of the organization or a super admin. + * Throws an UnauthorizedError if the user is neither an admin nor a super admin. + * + * @remarks + * This function queries the `userFamily` to check if the `userId` is listed as an admin. + * Additionally, it queries the `AppUserProfile` to check if the `userId` is a super admin. + * + * @param userId - The ID of the current user. + * @param userFamily - The user family data of type `InterfaceUserFamily`. + */ +export const adminCheck = async ( + userId: string | Types.ObjectId, + userFamily: InterfaceUserFamily, +): Promise => { + // Check if the user is listed as an admin in userFamily + const userIsUserFamilyAdmin = userFamily.admins.some( + (admin) => + admin === userId || + new mongoose.Types.ObjectId(admin.toString()).equals(userId), + ); + + // Query AppUserProfile to check if the user is a super admin + const appUserProfile = await AppUserProfile.findOne({ + userId: userId, + }); + const isUserSuperAdmin: boolean = appUserProfile?.isSuperAdmin || false; + + // If the user is neither an admin nor a super admin, throw UnauthorizedError + if (!userIsUserFamilyAdmin && !isUserSuperAdmin) { + throw new errors.UnauthorizedError( + requestContext.translate(`${USER_NOT_AUTHORIZED_ADMIN.MESSAGE}`), + USER_NOT_AUTHORIZED_ADMIN.CODE, + USER_NOT_AUTHORIZED_ADMIN.PARAM, + ); + } +}; diff --git a/talawa-api-docs/.nojekyll b/talawa-api-docs/.nojekyll new file mode 100644 index 0000000000..e2ac6616ad --- /dev/null +++ b/talawa-api-docs/.nojekyll @@ -0,0 +1 @@ +TypeDoc added this file to prevent GitHub Pages from using Jekyll. You can turn off this behavior by setting the `githubPages` option to false. \ No newline at end of file diff --git a/talawa-api-docs/README.md b/talawa-api-docs/README.md new file mode 100644 index 0000000000..2eea479b50 --- /dev/null +++ b/talawa-api-docs/README.md @@ -0,0 +1,57 @@ +talawa-api / [Exports](modules.md) + +# Talawa API + +💬 Join our community on Slack. The link can be found in the `Talawa` [README.md](https://github.com/PalisadoesFoundation/talawa) file. + +[![N|Solid](public/markdown/images/talawa-logo-lite-200x200.png)](https://github.com/PalisadoesFoundation/talawa-api) + +[![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0) +[![GitHub stars](https://img.shields.io/github/stars/PalisadoesFoundation/talawa-api.svg?style=social&label=Star&maxAge=2592000)](https://github.com/PalisadoesFoundation/talawa-api) +[![GitHub forks](https://img.shields.io/github/forks/PalisadoesFoundation/talawa-api.svg?style=social&label=Fork&maxAge=2592000)](https://github.com/PalisadoesFoundation/talawa-api) +[![codecov](https://codecov.io/gh/PalisadoesFoundation/talawa-api/branch/develop/graph/badge.svg?token=CECBQTAOKM)](https://codecov.io/gh/PalisadoesFoundation/talawa-api) + +Talawa is a modular open source project to manage group activities of both non-profit organizations and businesses. + +Core features include: + +1. Membership management +2. Groups management +3. Event registrations +4. Recurring meetings +5. Facilities registrations + +`talawa` is based on the original `quito` code created by the [Palisadoes Foundation](http://www.palisadoes.org) as part of its annual Calico Challenge program. Calico provides paid summer internships for Jamaican university students to work on selected open source projects. They are mentored by software professionals and receive stipends based on the completion of predefined milestones. Calico was started in 2015. Visit [The Palisadoes Foundation's website](http://www.palisadoes.org/) for more details on its origin and activities. + +## Table of Contents + +\

    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

  • 1-ucT^ly8* z?(jq+==YDl-&$bRFVR|Q0#MO3N zG63VJ`n?m#U8z3lt09{DyIVfVrJ{<*&rMuja8@zh%iGXTP z#4w#G*Y*gnNHRZ`kyxEkYb-Adu>1(wo1o}S@7Y8ipBfeu+#5AsyE|G;RF)qp7Kk_0RY7>j8 z%$<;LvF|JNbIdUiIh=gsUre>FGsT-Vqs(>MU0YSfC`+BYN(Cgrj~BqSp#J%yQe>XlH+O z$evcvW7I8Ib92Q|b9iJ{Jq=_RCaQ?yb7Z$cEj>lbL=*2o>e2%u)o>Xh(@Avhc}bA>s)g2tpn zcCpnH8UP?GW@Z*+Wm22MpI3l%=ms4zlFS@wX7O_p!7PJr;nTX2aDziTafXm^8#a2C z!-0yZ~VPwd0{(qT5KLtH8eUxupHliM6W$vz)zX!6P{tCFL8)%KR!Mt zvhdW|JU!*>lqYOz@`T@h(-J|!BKnvBkk5ZtzHjb?*fjuOQW1GO8`%q5j+)O==^TDA z;oiJ^*l-@Ucd9EKH~kEm$|VER$|)~L1Ogi^_T{dBhpc^rZW-U_BxuRMJ$%p-x&It| zwQ`wynEUQRb$Dp$jagZH26QOetgXxQLb&doNiouPfB*aEl)aOU?s{w;TUHN=BIth= zQVSITtL(`NH;3HbjsRCGtE#?(XLTG`KyG!`I)Z@wY4cT(eGE}sJ7I9sPkiR!uo)tQ znu_!ufU;9XlG_Er2V?!wG~T3n^elPPHtZ}IQ?!D3ho(H1CRJ0qyqjvVJ?Xd9IMay$ zkWtR-r@#i;wO!T|))Wmp4=VrAVMz?l>-SPV9|5XGEqy$o42Ha$DF74WrG*SuR-rWD zOK+K2Yss|R*;f!(7ErHICueLmi};O8;%LIK*=+O2k&!<|RF{H9pOex@`JY5h3l&n5 zE92y)86IBmU~!D|D~6^m>ZeuU_$!SMk@wJ?F3@FwOSq?iu1I3;zNe84t;Ij9j{a*Q z{DXzyhiEXV*kw|S#PL$r(!xEbtPCpORoB)&ndRi-BA^Pl4~ggvLe+=m!JL0kYytaI z!-{zTy6kaxV*s}@c&-Ug7k6FR?p>J?IZE0ed^|^|sp$36^q=O!5eymam;${nn5MzTA)9N71rT|_o!do z_y-=yC0ctRcN&u zj8pUTE=)%c^%hSVziw}Kj0&g0mD|9iP}OhJp?q5ZhjjC|#c^C9wEe-j@&DuRUYGGy z0Povhala3sE-B03a`e~?YL5gb4OThG0iu%8E6aIa-z@~9RT(07o z16wDj-CI#l=WMEqKVlNp|7pkIWa6yT11+- z9-QXq<_5eCti22l*j)za3+bo%FiQJXDUeab@rc{rL&xQGAqgjiBRUg1Aag#Lebi6?J* z`Foj2GW&GK#0s@`@Q>kX=&1Pd>yGA7Q?#g#S7=q~lH1Dy%<}|Pm=Qab63L&(rM5mf zi8pg?00Ku!Pssqfc)3;c*Nw71p3hTIcq5CKA>@`^wn6;uA!`E9Wm7njg)Va}WG6=& zySjDYO&4Pu)YZ*;m1kiX>gOc>KJ~@>`_BsB+E?2q`AwK(-Wyl#ELvdzyW6!G*UnMPTu>Wc4h} zMOAN!zfBoRaU~Bjt`CAbN~2*iHr!;<&k{xrCko{jPYob@`MmkJB|%r$;Rq#|;4MVd zH3oRdoGqDNDNL`cXIbQ8(~> zr21=;N~7*!rnzk!9a$FxfVQu{V4LolEQSEhJ;?Vwu>gh#2tn+cEf8=r_h)>g&I3f{ zav{t7K90@Xt!f$lu^O)jLWGgZF@5CSUCx9u^v!_e;?tsvj^-2OlWY;=U$*VJKW7vx z&lJ^33^j5-^&Vf{h~1bMMu+>Ijc>pGXFkSiese@(dv`K)k;hGQ$SX70#jNMFyd8oP ze8@-CdNWiOXn`BbqlE>W@yLtzWI%hb;ZZ~tLKLy{H=Hi-7h9l|rRd0z0JOK@U z7Y<7j{|hUIq#>tfrgnFM!qfh@vkS%0HqQ7j09p|tLgOdrTEk`bA02fQFH5aDNEV4E z%w~J^k%T*b`m~hX#=NC#Ljxk3yFgIm|tvZSi6siE3s&n#QOj(4Qz*@G( z-Ib0^!vYi!P4Io21f)5G)QiciByx}QUYy>N`*_g4%Lvva{7%`1J%*aY6gGOb;1%CD zhktVHv9@%p56vz{eedqlqmtT}2%L{Q!R%`-{(0}=+(S2_?=j8Q;H|!2rE_E+KEYyj z;I_4FkEiE>i+-tEvuDInOZx7dRYu-T54il+oD%Qlv=3XA&^c&6n#|$vr&6UH|2^YZ zLS8({QYIV7JMyb)5n{uI%hpBq7x%Mh#E6eVLQ_=jP^q!jPdT}dq9cRfoSh#L=Fg7O5}0dK*?TR1L+$WJzvhtvOJFEJ+YuJ$@_1wQxEHa^)2= z{3Gw7gIg(SuXZ~F(Q>Tl+Z4YBQ3zqFq62@UL3&w^tty=On^gY7eC%y}WokhqX6za3 z`ZCdO46-cc=z0Xv%>c*LB>s9Vkm+cOGVIOU=1EXBYGE%=cehfY4oFN5()=Y4&R`GfhcqZTQUqO%WA$zwj=uwmXadxMer=ZD&2p%`u>_ z(wjR*Q^@mokGuquir($HzS53orY8p)BU|HN^8km8-7<^scYRZe*<;ajv8N!-;naeL z6Ws1rQ7kkMFNn3a&bo~5bG*^}gDZ7b%J-6`Kj=vdnYdT5?^uK%zoNa>ng=4Eg|w&( z+o>a7Ul?1?dTyN|n7NcFoeh4V`^D(L0jYvei-d3Oii}Kp+Z8m*XDXqiOEIu2eUE}n z2aR+3g2Vmdy%*J}!-SS-QCLm3O#}&G}C!j^Y?pA(Tx*ppH+`h z3@j;l4%3ba{d?4>4bPmA+1P3~Hdt8N#U@bHxyL?>p&1Ni=nb4LI*qH1Q<-?`_elyOjHT6g0hjI$%hRh~5{n3;w9i z7P=ti5nY3WRHc%Tfhs)}vE?V@y{f~-qy;qyaM4KD#}slpX@(OuLhkOxfQ!2^(_3G( z`R9D<&4Xjf*#P(yLIk(7G86D3c3gBz?%pM6K)7WJn=wLqMS5N#MSd`sQ0CtFab%%I z{W_P4hcK;&G~KQ7mgH#cJr;jUWFA6XwF4HK%TGQ71d~gvmqG20$Uq8fS4C({-G zeLo$UcL|^&LsPxlfF8eA`kg5Q+3URbNtvRId%rgh(eOfMwAbhO?~sLqua>}u@!pQN z_a=b^rUR*86U(IXn^1Wu*JPg^`AcR%wLJQ`v_D2J+HbtKDBSC2WK$n|#Rk1i*=TjN zC!S!+r5@#voLOxFz#wte6BFfbw9HqF&wV@=EC99c@@^@c>Ytvw?5+T{6}@fSwSep?g3hjo-zPf2V(9i$zsuArD3TSWJ<77gVGlw-u8{0$-uUl(Dd#rG%}X2y!< zi1(4iRkE0Fi^8{FL};B~F4e2q^AEZ`QG-GxKc1>g%ak1!G0^8fl1<79s~@CHDHE1% zKMZ(i;6C*{jN*gez(+^?aI?S}*9ATfCcf6#oFpw(B+}%JrrYzL+2m_*O+GPVS}kL& zq9AjPO0AKw$c$J$K@GCYc1o5olerk4_|y1xG1up$4uMNP4|U^w+UjP05l^M}uiU^a z7PPZ6k+|c=`Pg)ecjRPNgkASp&~o>W&tK04yW?0fA z#3WYcG0yCVb$I=EFGQ0)k3K4lN8UT_ppHj|c~P%i6TqIaAv%o?=Ohc$g@=;ex6K(f zR(B0&;9|&Rh?s@q7iTSq#=1u%>Ss46VJtzwkwBGbB!I!G-agdDQ;RFRCwBh+j?$o#lLaiG~~5n&qIHL-j&k4P0O z#0^;o5fn@5Px*TW(SFf4H;3V9!{4OMigGXYnqMTLt(YuIs9t3eDGE7M)CJW`y$zp% z0m>r{Y~)f7gB3R$vR9%g$F(Wl0fan!OA8_J{jItC^w>pf&3?+ow*$sDr^KwR(09jQ ze|#S2Ns<~|c*5nHg@dtR_yuq-SUqqGAKj%D=faO8u;j%?^;mx2a3;Zb=OZn8IIDNI zpIA0W=RH@Ql}4Am72yLA<9B}rTYKgo*6xyMF^S{v0g=AZt4x~0<-vY88cnh=X9D=S z$nUF%oK2MyNIr3S|AWowu00VJC~W7EEIR{K&}OdqwZg_N@Yv6mhnc zQ(|sZ906$LyGP-Vjxs7cGHnH`&bwXSm5Ql$D}Md+$TknxdN%M9H9(Oz!miZ&!<#@-x4c&QRZTBa!B& zk0RF=S-!7jO{gn?UlWmSgpVF%g`XDVlY@z3GXfL&$i>T=TJUj%pjoQ8zaTE2J*RbR zFqPJbxdY$2XJ**v<ps~Ja<3(2#}fGp=zV9L(=Dia8Nq7}Sr*N6hyJkP#* zUVlsh3g0vz4Tx^+)72M56VpdI(W3nXRf->Fx=N;C7w0m1S6k^Mrd-DSbV=sT+LO7 z3x%YDSY%U^qnrr1_vGe%tdbpj>Yr2{elNi}$L-^s^`m{hi{IuW%XaInG>i{fM)x$& zQmJ=szrP}&p>Kb$Ju@C0Z4xUF;b$lUBorlz>}UX(s6a0^$n?LNaT?Rt*i!U8Nic~+u5521wV$D{T(?P=_CT_$7*0Q;FI3_xp#bE73NB_BfN$<&||hbc7_azD|ax=vyvgH@9Z5v-P5 zhWE|*wzsPZ8Ij!Hj4BqQ!G8Mf0jQFnn59@SHDe%K!#aNs2tlrH$h{2=+&mUR9-s!| z|9p+_VaHE>wLR$c%#9WYL8I5k?tLP`YOKBCP?~C0Z789!e81tn=3o9^WOeK~6rz=0 zkJ~+PIJ_irnHzu&e~MMa=YHClL>n{j+lT0a-8o8Gx`DAB0;4Bh{K>3Jd^42_K1Wf1rCl&ht$;&g1pMB3y&*XXEpW(G39S#X=~ zq^WBLgjKdND%aJezw)Ky(%4939;B@uH(N%I3{vOokwrYjxSFgL4o7&wmx zpJ=i56xn0#Pmw1nA|>SUlNN`Ap0uF$7w|SO3Ph`@61Tw<^cz;bSGZSip=5C687TfH zmfI9nEU@a)EMO%aVMGBj@U5u-B3)0=u#}!1B0A38g~HZ=H=?@{Jrr)G>SBj9v%DeSldgkJ+_gpk8p>qr?h|=h;WlzOgfb!Y${b_)#{JqJ@RB?j(P}!gabkA^S zwj70Qn&67;&&z`=sT=nxCreQ)FnnU&nT|Wr%IQGOQ5P9su#9jsRcMR4kx9}!CFMg_!5lhNL_t)_+{iZrkgnnZxP^UpX z04Dn6;6VR_CTaupcnWCBq_l@8WuiZDY^UBjMkMYq{I=0#IYGdAbTu$ojk+#)Lpx1q zdaZ!oh2-@l1OIYOQ*_Pah{^r7$7l4tiBw10y)_%pd_Qa3+`v)iayWOLl&^YulOpKA z`FNJuw%F_C^U>sm9V+v_!i462>6P$pk4$~bTzDZ1Jz7@q9HL|ob%_OIjm)W2vYOqQ zVcoq!uxG8gyC&+xc*(?SPZA{rHb2FRH=z#0E%1ALBX2Jt=`}VfGj)urr*ot<#w%z# zqxEKu=vH-h+rjF~%q9KWbjHiA8lZBmiM`GHdZD`DtqyX`pacy(+Jszv9Rm98L@w=xF z-gg@xNgkK^74i5sd+9ZLSt77Md)+_qn?A~F53Nt!J=q zYK-M&y>g)Df!*j@Nb9~}_st{?MM5^i3riJp-c3M`ajU8`4;TM`yuDRaTuawB8bg8x z4Fn7B!GcQ%2riAg26uN0fk1F~Xx!c19U2;UcXw;_^nUl=-+8|?{&6nO#aS1td#$d~ zYgN^(DbF*j3cXL%e|;at@s`rQ>ko2XIfIT@NnsR<7 z;&{H{lX;)K{loSHt#n7{_nE93xv`s3jJrz7Z2^%$5NgGCj7Nv$n$`MUb8KXsrb`{- z?fSZOL!Ryj0CmM)=Owh6ci%1}MkdgK*=AquwskJ(md;MljnIa%N#G&RDqP!<8MY*XbK?E- zgDQRD1Od6M=`F)c3DTNG93SabJ-B;{fUg9J8sVpW#|Qhy(aL)dy$55Uu9*x)>CL9y)JUpDo$Y?I{dzK;N3zywbR;QD7fv!82W%uhh&!DZ*h z<}tK2FKG5z0rA>Tzml)nkr2m~Wv;v9U0_s7$2ys$?9XzX0Ei@PVg%)-;Uit!oh7wy zABw@9GCv;su8*q~+L)YRFH6U!{WR7A0MehzlGYi3-hO|HCs~vcQJ>&tz7!nc=9ADC zMe%o(Xu>6J=dn{*t+=>=LuEtm1=i}j#qT_#eh%C_;9)pXK`~)QKcaG2g^4NdDXs4S zV#|Zr#Xz*&kU7dy>k;|1G zg=)S$-_g_1LX2pDw45jPY~F$E#+j%04%69zW@QJu*j##7*J!8>$odHGjZPKBe?koU zL$PE9ka!t2=e1F)^b0G@>{-41U?)Iph&}z&G^WM_X?(wJ+5ir?1HH|j1U^9apA*5KD)aT?FaEL94QhNDH^)y}KbFvQQbC#)I z=S9GAwZ!GVZ*|if4GTRu4Th$-9;u~&A4CP78$=AN0+C`|FA5Eouso0ro?6eYeeXAO zJ)^E!Y)Y5E@4T=52NL~S{LJUqlJxo=XP6ETZ|yO@7@OL;CsCmBN|*mT z;g!xlnL=#cwdUHLwh;!e#sGZ9F2tL|!1{!sV;EbaUTEpb8&>5UozQ#AU}84%)p!Y8 zD5D-HJ2QO9i~DG^Ki&5FUN zThCdE;<9Tg!yT}HYDvZJ`Ne>@2?|5I+tvC*lcJGatO8AWTSBhxfx zk3RU7@Q*0ksGJOD9y#lRmr`**t`;k*#^?o+I&XZ%{oW*Kh108RNv`iDxftY2Co9JzgA1_8-aN0t=a|m{gdveeVa8Emad3i(u@R zmy_?uBoD7zfeE8^mP3tH-i_ae_3GftOEkXlCDl?sN60UF5uMgyNAc*KKH7 z$_&_elo|m4vR2dedE$C{M#;N$(Z_N8)YW@X(H!w_H#G{)GeGunRTcY>4XX+LGwEyB z=4O3*aq8-+cPK43+8tPv2nLBz3jR#w#Z|{=mJl}z8b3;ib@KqNcsniMAB`)#7&I!- z?sF5_#4~p*iF^nyi~cGrv1YNsp3u(AmT&o%#!K7)t?7TU{o=?lf`(A|NRHDqG^?rv zY4WUNav1e(0eDWZ2opp`w(1%0{musv{a%17u5dfJzdkh@cK6>S{L`?6P8-VN6s`0p zHar^}-OvD@BB{&4#UvpG`_bIhUD@y7%UUd`m>+IlS>nUA0A*fnybU%?3;Z1p!p<7i zagq1NWQ8_#*xJhL_a?4unw8Ybmf9Eebwv^)Jmq@)5xwQAgl*)hIB)(}V#EGWER3uE zuOsSF+hE!U^L z-a+svPhT`4n(fWLIz(zMvoh^Fr7k*aEBfZ1|6SiG8$WB+EV=feO}vvgWwSD5 zQ%;=eGrFDprd(YsK!F{3(Rt({P9*1#fs81v{q_e7X5mJ_>+0n>~OSr-T= z5Y{d~`$D)r+1@&UtO<*h9G_N>Th1P8JvDOsKK|P$W+}c84Yblt=A6Zt@n=`MF|;?q zpHIXvMs8u-{e6D!#QQa9w0RiB;KPQhX^K)QXpI*x;^tquw%+L9d}{KLQmp=LOxH_{ zrS`!G!N7yZn)Txd!75-dn5lrKCKP3{eD<2N-O-f^cIVAJew9bs;9sI!%;LOeilpp ze)ih%Yq;JG@CTlS9m8PQ+JG$s{-N51Cz%8sZXZN_0P9kyvb8>$62fR8!x7qQ@kRda zm(o#2E)ST~0RUu=fbN=^k?1W8tKFMDEUOb zZxL)=L|hTtzU4&Y1?Mx_WPn{*Z&$v4ngzPl;Vtj+vxMskFei<@E=y&2OvKS7)ODh~ z@4a5K+hb>a%(EA>)s-b)7_?~Dm72Cf{u4qt#QsHW;I5w)X>=mstnnC=T0AeM&suAPaS7H~l08VmHpA_N&-YZM z#`6hW^#?UrmrmBo4>u8=UxU0t2JVjeFfYlBs&(|XZyh8U2u4a$;O+O~+#Vf|F`U6rPwt$&hER#y}`_c3SY?yVfc9Fo+WhPLCEXw-#m z^yS@8xu4}j$q{enrPl>3LYsdNz8#vc`WhvJaI`qMqU;YnGXVcVF_IGeROdk6*^$|% zhDK3sY!TpPxSIgQCPC_~&Z1@WaOBin;gh}|We83wN>|+$9Kc%lM+pG)%ZN07yBiiKoe!<{)%Xz8t=7b)^Uq?q9|hQE->U4 z{AYl3(1>JzpK~AnameM;Y*b$WTJuw9_V*^&+@#Y~>m%fp%=XC^AJDvhw}|*}F2JrJ zF|cSmUVV2ZV)C@lF7oOf3robghWdxgm&dQ;wdLoRNr0`kkM`#voc{zVAFV$-e(kj$qtQT?RZZ9N~bb>s2ekx%S$Huscm$GF%5$p(=& z7R953{*aOx&(Hg3AO1mX^Rax}-e@8aVZ;5#yZUZ<6QjYq=~w#dwJ>Z|JGj|J;+=$X zuguJ!38x|YgZbBl3uhMAt=oc_4zGtzi9JvBsW@`Zx*#N5)Dfjd<*N)JFLyfcFD5JR zu6O$eo;~lonC{jiR3kI}|0fyIQ=|wzfs>N&*zzAh{AV?~aG+Wt_`W?p`^mg|fX3Ff zYd$bTUuB4OVw8#x@}(Xf9_`uz4@aXnvpXSPv{*oHD)y{~4Lw0Ih@jQu4c;9BYPUVJ z-_+ai#X>Uv;&<>+_6S6)&Ky_W_dAh@8z)F6M<38pGFUl7T8i@QEw>GQqDAcde48Uk zIx{oB`y;HK90hFCWsAW0yX_Hl;EcY-&ja&7{ZiEYiX^>#Yb~KPNW}-&UC)iag}Exe zD8oQAZ^rJoc;W(PrFlK{&wPQBAxwg^uVQ0Bl_caev1=zcc<|wH{RpAP z+u(Q+qL(8pOaMb3@!VOt)(O$^Q2ea3qOo7qmdoAMipklf!*8aA0x@A0O&xWqKEa<6 z>gN!`ycPamf@LJt^}WCN&-ZpEl}AlHt8Njm3D>vNUn0M2wt5*JB(0)ePt9_g5FVoE zM&8*Y>3&TuJks!Xx^*t#`q5r)IuBpx$r6GfcDLCC{o}O^pYd9D;b{9R8C%$}Ji=|g zu-4O-FeCA!_iDmgoMI5#%IGlnt82rSb21A+sWK4fA9EH}9{E136f+XFBMCb<1kMFn zX_gRR(t5DK0~V-J8|A$qebzN3NTIFx@%ll$H$X8FHKB1djFF`2*4~eF()FZ#azU*X zEo8Xy@Rd?t300>X(l}PupO8PD70OWwP@CxIDA99?jt#M`5qN7btXy7CGG>0ONFxY&a$K5(+SKrwMQMD5H) zL$<2^z(#TBwv79|$eGuR1}m1s@nDxQ$)(vk!%2e~VOb%G;^{yM$Sz`XOqvpBdZ^@N0oz;{?auZ{3`l@C>w* zEF%Lp75i_0i!={%eGSonE{lBob;|y+A;9I|^xpxToj0N;@izZJ(iy#RtZ!Y4yZQN3 z;)|EAIpa@FH#dZjWqN-Ar@Tn3COK4hcVRnfP2SF+A`k$O6-W|F}X$S%dHHwsJ0NNvO> z)DV@NbW%(yMY}WG*$50xjz_3nYfW9=Wu*?QupeYM|=f;saAg|%#+^K zn%TDsT>cuaU*;90bB{~n^N2>`6FczuS(UF0dDndyx}wzRZS|UF@dBmVgvnUM{`H;6 z+1kbTXU`Wz9!2umL)?p59ONKkB}itd(oE|GAH4#ElV?(yANX%n(&iq!j_|62etKpPJCQFB^azPv@z^_JGVK zhoJ0Bnsz^h&8fGg>cfWmrdk4~WxTiRCu82*0>|!`dvP-1k{bncSi0mg_-2V`$;Bwu6Tj$?$GOWmDL8>y-N{&g`@aL7tTFYvD5YFAvu;U$A z?cZg#u2?6p;KEov`B}o95TUS>f8(_%dKjZ-VMDY@zQYQMm+tdHdF&=fte#2R)lf-+ zi-MjSB9*80{kl{93kwYO_FpCpFp<#?*{-UmRJ_~!N*q*Q#m^qdIvM6`K$hs47I&oT zFi^a=<;54FB0mqq&o%RHO-<0|c|!_L){6e$;k}whkdYc!W%jRz`(tcYwApn5n$W#S z>sYUb1XgMAFHCSD1~`OuUS27%m)c(fOH8j3MaH?($vP7z#^qFOXCI?_M(8&7XB{e( zkMs=8Y0hu?zNZ3_@I~0y@H=t_Y#%LNMxslitLSN-wC zR|7K!d7t=eTtmve!iy6HzjgrYp$mki(iRT#WJRrPE%;q`H9dxMk+v8?E8PAuksb@y zy8JaMM@!vS*a|@9LH&k(cw-qbWn)jAepGcL{t?nCJCm|g2`+?XeF@L~SLo53q7_}> zMXHI~U9)<{fdQHmI@x_E@7dz@Cy3FkUkFdWxF)go6)&9N-$SM>aW{eQnsK$8XX2&p z)2T;3i`o5CDCh9tgDIN?j?0ISQ-fKOisE<3U=XqF75_S(G57pw3H6{mC-NJ@_+oL& z^Dy@h2^Ej2BO-#F6*W|7Bly(Oy+N@{ot!B_3#J9cpJ*pyJq~2 z=8Q#I+zzy|JU-2Z$44eya7M2T*_ccj63ts+sXOg{&B`C8?0Qp|y}i}i9Gz1t@=B?# zIeI(3Iq0c#xkpUU$qa4rCF&RVOT3g#RY;KoK`-H4--XZpMNdg%&#|VYkU5Uqi<+p= z^;cu*MA0QB&I)Du)Y>qApS+qDlifir*0utJ$AZ?Qx#_AAa12$RS@&0`=MNZB<+Dao z?r6>X@MW|wiInrDVzk6m&?my3Rg%%`R#+6yq_fEhX{w^JCiO|$96E2MrJ%}N!&tp7 zUVR84#7x)l?Poe&o1gtSakzzXbK;qj|9n;Fg>5eU+CtYYMZZ1NVBd+?&Ag9<#ymT* zN@iG{b&qtz`+@b=8PK(Y&QY;F`T2ya`8$7lTjj5<)xOHT-f_!2s9#Hq1t$~WhV1&h z`mQ(KWW0DCQ8%w_``o{t*8H0UFzWOu@E`CbioS#@P{wCaUonK*!FBCu^=~w$PUkNy zhS3xnTl)Doj+CMX<6Wq*y0ftvyv1{LXR>pVp>gTXF5qwvEiu-sDx5OC#KE;JjYpN@ z^6J-?O57K+?J%R9mhqs(GzQXZ*w?yxSp(Gh6wE7lv$Q zb?%b;YvBZ~-LC81I^pfWpvTAV`0G&*6LzVUMmaN;mewZuClQ``YNGUV^2=+7`oDZ9 zC)-b-9{nbf{KRKfH5H+?)-U5C?TSJQf6Hi&UwS6i%PkI^P}3{U7C(44Ti17$oa*zH zj_*^@Xy{;Am+_^~MTe?=>5JqRc2gnrUuytUp@i`m;6Eu+73xAeDLw|pe<5QRsQ+u$ zOzLoa=Y_5z4H_BQ1SJ>!yMN=P|9now(ZXo&|30*n{~Jex{W6jJ|D}iq=kIU-yk^ef z#nsi1t%48msKi~@FY?3w2+JH+n+Jl`32n8*;PdW!bV~RoIq`; zWST&j#qCMM?TKHz&nwOqM`T^Y)1B_yRppES+=_5nY2NE*s>hD?3Mq4Gix^cQmplr#`Km-aX)=ZEvR*Ru97VsNrE-ajlIF%nzyb* z>v0g!BsC3o?q+T{&(r+(9klEAtx8W?ab%*Lr<6z(KYWRqIAY>rwIlQLK&KufK#K*r z^$O{&y=r>x zB$pkbr))dPI<_sL+9WpXaqVT~t%MyZ4>~d%;})8wGm(RA^?YKtfZAIPJ|6%?ObiHQ zYP)Sc#M>|dDlI%8I*xnjJ(RPxx_@Og?U*K{DeU=5&=x(ACga`I@PXBxfu!ZuhK`<| zNA=G*f=zp;>(xonx?}Ktvi%U+(XM#flW5*@Yd>q&%X_4%_N}|ZooRP8G=rZ>BGy4N z+JANBmSz#{zT2mV(j8#>!`OS6q@SOG6&OK<0?r_*>(Zgkt47K+m-CtO8r@7Zr8T~C z5Ii+?{{gqaIDT4~$%BWd(Z>8bd|QJnkN?Q?Lu!Z4cfQ5dOnNNH(6hj6il<2gLdz-tM1wv!x{=o}|_K zOuw(0H~7laAOmaTclWNaDT@AXLxsYM3w66neyu3ki)Qy8*E@P<)2i42nDle;9yl1< zB9i2_ES^tm-!t28iMvl7<bTrzW^XDe-miw z^B{~i^;$sDZEJn;tZ05P9=O!-oVT8OZ%Zq+TKHqEr}+za@Y$<9LIS?iYx1tTa*GJgeuP&OqU!i+=;;yC$R`&FkFe zfrnmY+P}!Z0+Z(wx}bN|yRajKrzy1m1t&nmZ3P?@-BOQM>v%7ldm%|S8|+Wk_r*|` zNe2_Q@3M?O$-_4HBT1{NPsxh8)m;KetTpMEvgms%A`gdHt>#>hky6t|xCVyW8L#E(R zyHUAnZ9eKw`7Ty)gWFFzem!(YJ?Y9RSs0nlX)pP#_QcJH2_C_qc7K8Gd|u;eN|WP7cly z{!B~!;SxJ1y0a-!3V{LLBH65TUZc6r=s|s9RU>6_;bh^a5_ssXu~4M~$W74@-N~Ga zMJpMc{f+YV>?dh3A{o*i3K!NA^W}p9{Ej1p*)P&c2h!i&ALc+(c6;4c_7ISC+ftU0 zSpUZN+vg96?^Ka9t6MzFFF+ zrls3&!JW7+Ea|prl~0k$^hu+A!B(+!QbcRon)H6U@rDlNm&SO~p=F=K*)_)k0Snpy zXbnBD^2y@Qi~XZW6Q9&(tDzwST_ly1bWgewsdCTzF~&tc>|BA%pdSLQ_a+WICq-LR zf|4>=c;z7`J=YpHIK6h=*Y4l)vbLCUucRBi_`If#B{_^LYkPz&!~xb1B2@J~z#l?O z#C4iPv(biqog;rB=kvhFA>|8<&pcmX0SzKd$90*_@AZ&Js(_Etc`mQ zyuO-SudS?p`SHkZN6}*eZL#|bXc&BzNV|MRXtP7`J}iA0D};&`+ZgVj_I)Ghl6i;~ z1Yb~8oIk&Py|Vy6THje4g|R2Jpc`g5#TY|4JTFwev-?AJY_6q1>UwftVo(l5e^kPmxmqje){eT5;MY^IUEc^B?1 zZvQ;C?2XXzYQ^QLglTml;fpe@$EPB~-yfMU(uKo}9cY#asS9|{U2C|foJLEdU9vP^ zg&#H*JZN>>aU4}SnW0BKH@Z^SeO%{zW_4L~E;!+FUrx%;mvm!Sgxo2)YOMkVp4=?m zcgES$b%qRy&ac@7g4~M&Evc`*V4`Ho;({Dqxmln{U*dj2n9Ti zK9(GDXIEG5!XBZ~3gnwMGi;_;rd<}B;tlYTK-;}P7*m|gG%9Z>Fn9T+HV9{9P_Ops z1+^dYk*R69e;mzedfk0M#iAZ}+0u#^@Zp`F&gXV`eD%=AB}yLcLC9ivHOo~dZ?3CQ zUwgsa&$J@zxay4(95-iT9sy;*nZ7wC=bTFI72=D^)PT@8joaS)YmYB@CLh4#`GkEh zpb%67{Gjmgks|C}m`v!& zWUH_-=-2%A_W*p;dHWF#2-N%r0(mnapO?wg(kxpNA2+U#gNi@q=G!yrF-fM7po{!| zhRe)p_5?z{@hdd%?H8^^nID45r+4ThkdEOZAvO?lW&Iyob`evueEeQJ<3^8s{0im9 zK;SFG@C47W?VWRf>ZOjm%cnmo!WO;ylF~mH&Si`&_z~(_A-+5==m~x1_+(x!VFJ%z z)YbEoY%ft!i15T-?pUsXc-?cAc8{A(B=ESPrj#Z#SmZ5LSW`RA$oQ{}`(_}R3CQ&b zUQ#GnC-njYUQ*cmk3gVXa7s^YjqTd7kTm~PU1MR;PP~e{8O7AWu&PH9(W$0}Mp^1^ zE>uDBgIK-&ps8_3EsMAl`xhIZsqdoN$aw~dRt-#8OU}MUSl6M_cmZt^EhdvchPuapu9 zE9l8f^9#%31WU7R_S7XKh_kNt%>EF_Y!r}Qoj1D2e1A#FcNoTd8~^rD{dz*-`D`|# zpiXG7wi|zIKS|vq`M~%an}3hI#w#I&h{}i1Aro%pN#WB1CQxoBYUBnUOV`R5mTr9a z(z{%$f8^}L6^%*V<${OqBq4Wr{)}<8*D`_S%b864GjsG#%%a;SJhOB@BG%rW^$|X1In= zE6HyE7XN|L+VhC>PjkXju|^cl+>$_`IX*rtkG{#totv2A=&1w*$~0GZy7mbtbje(c z2j*!5BWfCg`%1qfm651*+)c{`s%G0XZ@${ zuvSN^k&C>>ZZCM@ju?4-Z6Kz{MSD7}e>lOkb@F?4kp$=D6T^*=}C(@4&!-Zb7 zy(6HSUj@$Snl_Oo)yyAxAqCeVD-m-`9%Trk$PxzRnCIqJ#ut%Oo0;A?MSCSJYItRp z!}E_Z)HcpU@j;Nx!|_G1+X0x8iY0mNl1 z(C?(_)^BHOJvZpnPXax{>+AbV0Oj**{QRvKdzk?^AW&N*Efe(9aG1f-_3(iop*@RP zC7}+a$Y+M-`sO_aN|Uc?anwO{#9ZsKuq+fqkK;&t1R%7_dK{Q7fyYLi9H!(0TYwGl z7^$c-*t!=4E=;3$n`8|c1mMZMbUsDOh-zGD991y&H}ai8&eDt20N)4;_+2BR0mRHvPBu(tc- z0O{|CctYeUDP(JC=?|A)K3{wIr!UXcsU&|QFy-LH{Dd1$M}gubPDAG;-rvb#K>+*7 z(u%RBPHoJTe4l6@p_Zp7ziM=rWVDT+CN4PH(KruJ%_EpNmOlz2dmm_nKD2g$=PK~j zi|@%Y>LT!#8)D+Y9}UrK+J{WCMecu8BVPP6JGRa0WMG@z;J!K2QD=#)#rI(s_7c!Li*XZ1}vFtu0BsrW$1d(9NXc8oT`R%yR)3l-@ zBxI?i1lqkDT(GG{=SV>&jLZ?f%j1woer7%Q(Sh!e?>^Ulc|yb}&Ex21k{>&mZkDg;NK!h^CG{9nMHQ~J z-E%|AZ69&U>JT>%y_dQS>PU3DcCk+{Ya*~8?|HAFKt~&;e|S;wZ!W;%L$1*F0QJfW zNB}3@cL%H7ZNAO2to@;%KHZlt>YQPPHvtY;%gPj=#R}s#d}>0&B{Um{D(5--SSPC% zfy-9IQ2c+IOd$GU&^p?hP)cc4+%anXyJ_jyB)`jsKVu8XpghrG99q`}OOAyFjln0w zdOW#*tgv7`rn#<4&oNLg7a;Za_R5iP#lu$j66I$J>;5nh7Hzr0K~B%Wj-SyFyaqCR-T-R($$qEleN>}*BZ@%4| zaw1e+8jlFL!4;$;#h)K6uswN90@ZF){kO6o9(V1ZJsC+X2Sv+0{-pGwh-62NUDy41 z7Mt5LC;u<3sRJt+H z(aYUf9aE<3wq`g9;E`1g@Xc-Ijgghh>B8toxEI{FwEz6uo-7 zj)QVLN$R-w2Zu8aU$e%UW0nxo?BtKOpHKywb&a%o1x5L)f~~Z@2>@JSn(E6hxd~cW zuf&@24(4kf`MSz2@WEwrv=e7>h_Q_3nXkIP+mWK%pS+yd>5oy!^Z{XtY)fw}lCzI_ z(n*J&jOMrV-Ny^LurfV)S14WNwZkA#1Hz0IaiJFJUp`Qd z1Esx-TaLS%$HwsAK2X=B;{S*iVwp-C&0PN=*7lNne_CieciiFqHEEFzMHEIWA~G^u zMs99gU!F}t`zdnHM}p_g`IpL^(toO&A@;tu_+sgqLiwJJ{WB0E zm4_^zydvo43jd4eJK0z1;oLst?+4k0$4yN%P3~0p7a2KNK;X7&(}`fAqZLVBav2kS z&;E%ZerSGvc^0!bzrx#L6QG+rT|h`xl{^eN9mrp_2Dm99&2@KAGk!b6PqP>BdM~Se zIS;+4{a+P&w+orQI9Ytzs*Z566Q01^2t>=)l?K#cMEMs?FW-7yeXA5qnGS9&jH<3R z;g;9w%iQqGn)_Fl?o<#(a*?|H6t?Am+0jjw%y6`^q>O#nDV`fUP4|j6n`C{1WPUi4 z)^fJW)YyuPnU~vm&e!VXC0{(1=1K*BAUMB*EY?2t*3ER}lQ+wdk;$gIqyS`R8%LAY z%(8vO$W_kVdL2meh@^A(9D)IpkNq z$t)j@CPM-uDzaFv0zF482TR-vM(bN7^DcD779GXHDgS`qlRp~2Gg%pa&;d2Lxw%iT zEb-C2)+m^};se?gz3ciDN;C`vdBy^siUJ-$Oc`*$Z+@L;Tyd?=TmK}EO(r=52eyk{ zCL}RDHRJ~J(Y%G2bP&hZedB{6ev0REy-*2T=+*xI{*pVViK1MzPC&j%KD%@ZNp1;^ z>py1uANSPy^EHr+UtY{ekU00_cYzjrHc_!{fhdCiRL4Eo`tr*1xi6HC0&F5|0^4wAaOZm6|_=IJq>Zy3smSEvQk6+c(OIU3xU3tyN<)H}JuI0Z+(DS0PRXP%^l_9VA zX>j6&MYffm8|h4Wudf`TjoHhvo2@v(ZG1HQr07G#mseN0IZ6s-yi!+19sK;-an-N4 zv6y=ECoN`fpElzl-{J<=w%O_V`2Q#J|Lg4>-`9p?z_h+B(cqXV5oReKBrS&mkZ{~+ zgjafua4?|O63YF)V?B)T=GN1&_YhU@perzG27SvFxm{iT4;0DKVr^N<^=1^$^f@># zWLA#i*3x4l5&C#NZdfy;Q3q&GEu9vyzdY-fK18?oq;H3MJmU<8eJ+TiwCiML&316T z@6|f+B*IPTj0QVyMLhQf1KYc$+z6r*Z#$Iwdiyh4Bc*1ltYS6Vks+`pprM;s6vSGc z6C=tA+=ktWmsj06sjGcevzIJ7g-LABq&nVmKe{)Rx7ZO}qp9M+IJckMuX$BY63Ulc z_a@XHAC*Fj(~X=e38(Okzc;rS$FYElGYn7BssN=8LXc+LKK_P8xc5dS-umQ}{22c3 zuUr5z5(nd|ZtjY|T`j%E5S(!gfg(~PZ)~S67<*%N` zkO9w(rzK&}8%X>4MYv>gc}h3IB5oAkn@1p8jD^eDVYBYmOKo2?2>LEUmY_dUynueW zJNcu|R%c?a)3(6&bewI(%y z&~Z9&lkG!Yvq5~c+8qErChPYQ(Xjf>x=*C4rHA$XUICv1B@#%R;$XD5B~nLZCORxu zt({zuJ%w4Ppnu5_igv5|V`=#|##O$^HKwW zmY7-(2v1&W_*_(>bla{S{LRph`S2q85AyWJif{Xnslcj^LgG13v$~11b>X_D3@zq6 zJ8=|KGL;`|qG4MV)@W$T7YciFTx};HEZ1oZ=Aw0)TRG@DD9H=%0ws2j&*#RO&~b7{ zjD}v+0|Xkj4XY0x8vy7SZhj>f~KcSdY)a_KrbtC%Tk!rsT26bh8uskJQ{I? zu#R3lxTKREI>W@sMUv{1|TWd7LQm1=IM#H`IS8`ASf#^(< z5$9-M(p^2=>1eR{DS}Tn-MNViC5H^YKqe>i#fplW`4pBPau2=-(fvPF010N$?WhYj zpV0x@PL-D~z7rlE3u)S*!H+R2Y5nz9Wd>~@ia+S4jIk}vzjRyaSxXXAWa#gvsiJ~T ziFPm4p`On!0@9@%gis{`UZmjmc9D-3INUzEg5imAs_&p(62WNk+`4nR;$iOZLnajP z&&TuVGZ^A&m+$GMddIY!Xk6VF-oPBPDu$Xyp3m+Mc})S$={^C?CbGw03*gYdTvYbU zL(f0BHCgdKXRoFGVL}(_kK*{r3=g2jnC!NtZuCH39Y;t6%7>Id|&Lg%+1$#xV$+BM-$zht0_y z@Ho^j;Nk3*b=8>u^ZRF?$sg94_!+fHJ3F{aKS}#u)sn=d_ypf`%+)^bZUxkhE$x5< zQR94UfVv72J|K`QE<69lzI$Fmef|%s_Y35;{jkV)lDrn?E~L9T;sbyYO8?J6M8Bty z$hY$9Cv;6TzFlWe4ZbRLVuO5&ugU+nL06EZ1hrK^hW+v*wJ<)HnZRWp1&iFGv}?wr)#V{{--R7c}@;#R}lOHbwcks;z7Z-9&OuJv1i{h+?ro zs$XILNyC^JRvUW?p?v5TGB*VDYZv6!FefmA`WrvQ-5^R4iv?060wAm z+8j%{56@K_gOl#hW@Sz%oGly$iHoXtBcJch3qO?bn@DuA;n{@8k4%=0u6Lu}rRKNR zwQq1Gk0@2ru%GLgq6D&4TA~spPbMY^gwhnoH7V*=dR%hY1G!>@l9gCh!5uAbSUW6= z;`n*lo=>L(3)Ftj%=^`O_7)p@S?=o0pf3ie;Z{dn<_CDEW_?b?QuqXk_fwP7)h(-) zq2*J6q$D<0af!W<8S|_iSJFjJAL(&!k12%-&*vuQ)MNT#@x(aUA3j81Rpeuyk#}(R|Qv;bGnP_7Xpsp5@eAW#fB8~a)Ms{cfRhKlkrmPJ=+A<~lHDIvz|N7w-eood>BE83^k*%d1whg>6xr=1ZaP-s$DYV(nu)W~%# z37FEufjDl*`ly^VjS@1VSMW(spuAOpbu;CIujmBzb_`YyC(-rk%%b$`JIgQ`)H*ltYy-gGn>CmA{(#Z?PVjKFS$@l&!Ax7qsq>3DLN1Gm3eV;Ss`yB4 ztY=kFE5>c5soHBPBDdRX!X)=o6squWQpqYg^@bQ!U3$WgYpIBjgf9*h88=h#eNT79 zc~5$HZ^=7dvwj|xUN7Gb_X+I}YBX>M6zJ%YK_B!+8DNxOV|;X~%+YjXcwoQU zCJ&R7rQ43Oy$rMCjRI~2gCX>ix3Go>6ohkHttn}saq)_)A~=7RSP+foOVC^_KDe1a zD07@=tBF-$aY`acTat>+LLlhNt?n|l&!HL;=h<%LXS}A7$w_aF)!&dOU2Hf)rA#1u zL8-7zp*`bAT3Vd2w0rKMN@8azH0p>s z@OPIN=Wng4_aD+JeU)o4YvuPu{qSkk+i^<~R&EnT`tHeCKzC!} zCl$)YgY#7@|D3ak;b0k2tn?H2OFefSQ#)Trf}6+OlUtHh)Qoo0!SV6FuEhT2WOcPC ze2$XiaL(qHET4i`&%D5iq@-a4T0{LVH}K8X)z!sKPXf#a1oA2T&d>j^2=Cpmwa5Te zgADkN@8h5!=&QU~A|7pBTvRx%UlXI=V>Ui$JL@KlW<|kYnZF7uST|#MROY&HIHWOG zFdzB0&?SvavHyyhfKfb(B~(0RWP=pGN@q#bj7|K#qS~V_et5$x3$FVH`5XYVzwbhO zWy_q9c3MyY%+LIsB7>K5z*6tT@*YEiLG6**Z2T3gF`MZF%4Ze>0bzuFHBg*X7|tKO z-e0{DT;Xp^GT2e{wE8>)ZerBxCKgi^B@;Wd8negVIzdk>>{W4CS=tO5seb=P|1=i( z$~^KujBL{c-R>O9U_biWOF{igw^}09mT=VsaUXp}Ok43=c9;N^cqf&X;vvpzs-`zG zk;RX@-4k!WS9Oqk(OZja^8}o+b(vQ3SV6qWJ%1v6Kir>WR`A(nmM54=9EC8wvqmIh zlGg%mzTbkDhHtQ@a4BPp$knKB^AMmi4-g;>y4F^q%?4XT3qmzL(VJ? zkLAIRmHM~B{XU0EI&(HrEO;w4P;J5lb$Euvu8tH{|3Vwr*~UH2k~=_iccs5Y#ILYX zt?#7%xexyE71e0+2pEoy#>bgF*ZY9$e#;}#VV$OVRsFX-k?=$*KEuEf@~~=@s!jUv zXoGXbz5jbFPr6BCe%U-@xM3Hl#tBbqPxDEJA%sK4vRI6lBF)X=)F2AVAjPT5wIlo~ zgw=%Y%#wI0DT29C6~DQDTh4ll)z*^-`28_GvEuF!oD_Gr zqQQf^6nA&O`JHqA@{TKG+)o)h`$Mw#T5GO3ADIjE!aJdREaYS&dJ3ZuRt#KF^C)*7 znN%sm>@>F(Ex^2**K~1_gY?4Ac%v_xVDRtCFdYKd_H%dlQ+I~~;^2f@W_nUMcR~`N zo#OkUb(l;yLF?YD!c};J!@8%)2nd(wn=ZG4;OEN?c;WnD!x%xC)AL53e6hxC@vVw7 zVdfhxGrGyj+8U|QS;7sCe8;tD!@^j%kg<{sT`?O6-aWEC;n@-SA=V_1Zsl|{dOU`X zWZ0-MpfT>f(ep#2$^vff6%nuu4vHhG$ib3vyUupt*Olp;QtALvHWg0o<1Ct6HavZV=c_|mS~*u z&Yx!E9_~wQ_-sVNVJvl8uC-DmuI7dk3vEA%A>f6C&~91x^| zM}H~s#9it7gg`9hj!Tla_V~F>irZr7HDWIYOH9eFsjVhN1-)MAYP&g8_(55TNO;KR z!{13XWLAhv=Dv@8owALt+*~o*wU?v?vSg8#nI^qmZ_1>X#oCPGYV){4xRhSfnpMZI`FlnIE)jqup^#D}~Y81v8zb7tE z&bWDB!K~(|pag|1VMk>?kB7tQU%wrsFcLbvy(sQOy7~sSnmZrl<;s+V{7yyP;HLJlG#bJMrm4*GI{boHwvTMc z%63`->2}MX zwV9{XG)!!e7xs&a%3XxYkF4uUm%a*noz2IL4omqIE#1G?$^!HiHl}=>q!i?JL)&YT zm{VHzwM~t~;)!!oMK11NVGm1?2vK^TdDtXP_Sdc!BI#-zHj4NaJYgjSqjn)Id1)VD zCzGIKD3ZAE?v`!wVe>dq|3ML%8h@{R{6T|SMl%j9ybd{_Q3IOSPe%Zen zh$0u;-c{rewM+?O)hT$&;YFTM*fvc=&atVmb*iW#ey7I$|x|@0S|r z*tCv%<7jvJ)jVoex!IDR@g`;I{O&MQ&%3gix|Rr)Foue>DsM8y zNd}{Do%H&r+ZPi$_Twn$V4kgcsHkfMR0%u$nQ!&P{mpQyu6p^1OR*cN(~7;WZ9uBv zl{lSuJgz;w$J^hx)D|ZjO|pJ4V|4M}2iAUgBGXv(Yp}da#l>d%kX~;p>}U}aQ3gtV zh!QMKRBBuHyrbgsj@x4N{>iPdxo_tV&Mk>h%SqIXZUb?>7#cLyqD+?Vx6ff0 zLA?=+B1jc=M8D(@ytGBGuj0Wj8F_>RGO7@j@T064m8_E^fl#4l|UU0DbA zu{S$=tf@HLa=Fk-N|mN!sLWX3Bt#5&Xi#)`#KGNy{HCk$|K0huSo`p(i2+FJV6|@d zX)mqj@WGIjmGy}k>)9NInOBb5C!3OzVW)}#2cUO=xjVCk5&=cT$aK*5W6L-ayNgu!m-hY?q3mWwd4_)Nb+6_lZviOwwx=2z_4o*yf1}z z_AE$O2x}1p{1{TC-HlNj*Kt0TWQ3_{OOe-&E2BA6YPLl)><%kHcwg=*{AyP<%tU{0 zV_PN@dtqh{4i_;b(%Gql&#w?E*WZyfH7MQHIAp9+@5W2B)-Pcj(#guq4iBJFsbsj0iaWc!Fxj5yxac zX^`jaCP+0IW*@`)-;lcW-jN0&d!aGR>8OVD7$um{YohE##hldl6o>xoivPaM7VIf^ zk8m+#fkSD+oN(yG8a4!Vjk}r*^!up*)@xDJ8zS`?mey_P>IwbG4{p&rjY@Q zBu8H0N9^ofbG59VOWniEfn4_VLY5rMMQ7O)deA2MO|nvGPIt(sO!~qvlFmIu2k0AY~M+^o~LtQJo}v(?XCLySq)n>k#U2KFXq z^=*;_V+6$y@$W10%5P=d%)YCz2SHmPZ@z(aw(4~qzBq{K!G6)97X(QxqfMPxiAb|L zZ`~-y{Ik`=p^uL-5D0dQ2y>|h-)ai0|J0C$$@Db0;Pox+5&3eV#Qt{4!rEFGdu5TD z<@M=#&&W`X-fzgE@ZKkm;7-w_8aeEh=$?73i@ccbQogy@%w`EB0lh*V2?Mk>MZZX( z3S`n0pEnbpx@<$-?T3sCh3*CLX50G;DVZ_kvtaR9;-@RHn&oa_O~6hT`G^jy-~cCe z^yy_e+zPq(UdZ?IM$qYuo9D=$io=CP0R&2lAHur0i~__QShf=M$u%s=pQnD7#+-GU zge9GI{q}yYe$+!Fen$l(2+29KmY=D^GN>d=@ZaGy#FEzeM3&GF=i0E;GP2N6oZ+;i zPnG%2whfx}#L(&Gq3WFFMP34~^#9@p;3%WNNjWdPBdj`cV|msa{3RjDr2F3Y1;{b% z`fRV(NFPk&2ek65W}H^uULw*9>gMdy=R|(Tk^CGS69?*fcw2@kRUry5R)|=+_}ujA z@;+4zUpX!ZMy*5{n&mmADwMv{<$8@gCT6*XlowGuH^Dd*qFnU^uqq=up4TF<6Rrp|70Bz{a0cAIZFEVQ@ zNOY|l@1aQ@8|h&vg_Aeb;ltggWxQ1TsK_{q1Sy&_vnO+pxnSpu8C{^;QaOMJv9_-H zrY$o@9{KrFzFNJ3<6;zNTM*p&lLwvK0A4(_W#Z7$r7oIq=zqIhP;={iv+(^vx%((6 zi$*0Ry5Is-X^4p`LGC{b$bPjYM;?WTEpCDz#@Bh>FiE%`#q*h@sL8+C9EJ!lxIV$J zzT*sfM`~$+W#qtOI)r%xZ_d`Pw`wW7V)H4OZdW_1{v6m~Z+!rdnDfRJ=e9P5+#0rtH`}&NHK0+cMsR_0<%5~yJRoO^#Q#x?rjgCK}*BBk(gNgbx zcTo_?y%x)*S4#O6+h4jsH~9H{C}0WbWR?87Zoc#%y~AasE5q&2t87)I^*zGAzw>^^ z8#d7PB$`nYp+5^2`hD$I;)vw!kATo2vTe5)Hvwh{*6DR{rm7%+^9F$X1T+*kMtj@a zW%kHP6OlC7?cI3jF+=9$?g>~>&dJ@oU;;0nqE&$IytYYSUfjJl$ZuWxO-x61`u0)X zt$_cf1)!zOE|2gl^96StmNpoyYWD?eG_XAmh_xof!N`3dEgWC2EoL6=K14q~F=J53 zW$-`SKc6jjoK=WJl*d64V0}2`{$HF;Pe@3K6R5cLzCZ-G5n>_X_8QLPG%_zGja<3C zxNl8bkS&IYZq>C`!nx@GFs%Rj7{lGH=3q#-Hw_erHcCm^@N4g$=d?vR#M{*}W^bZJ z0a{lVVx0jk8q_}){?tYN{IO)CbSj^~&O4vXR{#hpfSstSzZc7Q$tXFQ#Q#o*`G7&m zOphFjEPX?oQ@F@sxE@Ey_9Oqq`sOW?;>{M3gx|0^XEoG8o8*eQ&c6qhG8E0SU|SKi z#iGHJMb}Nh8!`7wX}C!!F)r~gc`wo;r&lQ<=Cd(wfGz-Y7}r%n zmE7vHQy!B1ky-B|8YosB-6aY=4GT}1;{g;G@0@TD_sbR_ay=WBX=@%~{#)RdhVh1n z&KaiP-?rrGs^@@N67KY6g8jQGN4y0bp3YNjup!<8JB@yr90SGvXsKo_j>a6mIu;|( zjH2VV3sR86kE$=jHBrI8m@yR=4{48n1K9*0*~g@e;F(5Zw)L4zNCGZDTt5N*SFFL( zU-z61s|;%a>sBl#GBZ5Vz;H)(!i^>to+b0XB^y?6k7a?iIKM=PJS2K`37ke?RxN;3 z`4@E~f6m^*)9jYlEc>Vucw|Z0DOA3`bRGDrUuz+iK{PM^mX+=?S<||m zu3{Z;c92ffrjPWcjgs?q5?^uxuu2EOvj(H+>3!^zII4 z5d&&qN#nYBsh{716GyMx>DNafzN6{w>n`*k7rZ?^C*Iv1Vk#&kPL|*Zfx$dC9((iT zJ9avXU@&Qj7fR{wKcrDm`@`Agm) z0~j>e@UK@H=(@!-mBP&ttfElRR^zYmHcYb8cSJ68)dl!2s_6}Ni**z)QQJ$2s#4%hQI=HUOvnw8Z9{&nsN~FocXhM5r ze1nD~PMNT(uB$1(h%04^ojpb2@HvD09n=@?16y=aakmgNUW%b*+tzBEBda#o@%ZA0=>sShoFk=={<5aITM)1e5 z*Qz@`2KGKYPf^FGed@f6LT2L$xLzQ*OyEDJfaiuNc?A^x{N!JBT?|yTEjldfP|yW@ zS1l!IVt>f7>JX=|KxwO3qG z(Y;t##&TtYR2OunEYCoX4g7czE1!5?Kk0q1NVehEss_RZXKqd=8`sDGBVs=*5WMb( z$Zbi`A9yYOFQWgu%X?hhkzL|A0xl}Bbw#9j$x)sR>Sf3Leq&kL0aGU`%6LT*ksducmJe!bpsx0M*v#8?O#gClK1pJqbu#pbGt2|V zWT6kmWlGrDR<=Saoz4I-#(!j;Z`4#>*B^$9rmvn(4qx{eAP?LDPxg^si0 zuC!(x%q$r_S~sz-&WUbkd?{7;e9`AsDg?!ZU;5U~@(FcfKMV5&Tr?U z%2ROn#3X=)wQr@Wg;=g1gxfq`Y<~7 zNs8(?Cj2zH`hG-b*Tx$V2ojk0X(THr>??D7Cl0EbTy~n~F4W^spc*k(qOpMiMcyID z(GY%w`*R>(XA?K*2Li!{8+*}b}xmL@jhx!eiNK+pOXHf<5Wo8 zIL8nEj*Q6XNy@39z8G&WH=rSz*<-*Ibo&PVVMkfh=;v>vrL@?-vBGFA zecfp>wL01Ha$N>|1*7pi4xQ^HBaBcAdY{jtaGasA>Ql(lB{cPVcO&q~aX5O)S-Fm; z!ORb_Bl)M0gk{tl=i~V{n*jxii(@gS318V~dd`JFRhsBvz^rjPSA>V3cLtXe=1}qp zM)7-%_y=~RcrprGPqY?;!9131_5}KSzL4`OPR)e*{YD`Z$u?l3X83`-CLK@}=|4&c~AU;0-Z<{S*=#X~jv7Usa*O)Kt7^E2lhh*a?LkxLb3)Pd0N=hV%vie#V zP0?h+>5DMW`KjKb{l@|!ofKr{LifQFF^PuK%9gx&r^1@JY$Wn>=1Qy#vsX@i2N!Y> zjT5+AsE~l`gN2`{8)x z-#gV5g5^wDHc(jrzH6pRB%fVeO2U=U|ASF{pT>qS;%K|J%&LKbo~vjYfONDxL=4;f z<+iM;09Pe1wb>Kf!iwlytd19mEiJ9o#3x3Qy(|g;kKb=m??iA5f|^YI zGFtr$s zI!n1eZa7PFDV{%L%18R7q@w;c@S`>XHAmL%#HI4yP#ANUO=ZFp%R#wJ{EAHmSJSpI zj~P`Og)CU@Thxmn25F~Ns)qoM2KBA(pad?O_!(76-yo>V=vM4iTo8W^N6OiSuzyt9X2))k=5t zVGZ?WiB4qIO5tY=7{H=h+<6W)o-wzjgi*4d&$pG19za{?F9yZ}stO~PxEJRf#~igh zIFDER9S=x{n>Zsq1^`q|;K6{!{)G%{4IWnuzknf*f|GXXBnMB9!()AW zGSP-}$R7r0ZJpq%keawexf?dlBQm^Yq&{pU8~2)&PzBg`V&XeubjKR%TVvyk5A}Y^ z;)88_vc!6S7P?B(trr{j< zD(ApL3}UO=eWe%UkBpb>uu7!P7Qj!q$JEGAawkHV)%JvW9!+jxOv{|$+ZcPKRFmp{ zS`Z6vf}w-o-qsJO*o%JOf^IW7K(Ops{om5GKLphARvyhrHX)7eI{ z+2|qz3Xsy!xY#TIYFDGLHS(Y$^ZX}#=!FVg{6DMql$p)fo54-4C7oFOo%wFeT$Eb; zV_S0RZ$XLq&@?dm;CAirs`)?WHO4jCRoZ2>_4ViD*JX#RS**ygGcwO7ZS#Y^+;sgT zq;NXeQv+S2HwXRV!t3Beyddr{G0RCgd#Q?MjSO5m1o*DyGimp|-t+N|Ph?efTYV)i zSQ#WrLtIICV99Rq zNfmp~sYu69bJ0{gofvg85Ig5!QEBe%TE5o9{r_DsTU6SrdYOHxf^$8C+Wd?o3G#wV z&NbdG;%S1;Vig*eeb0a6R4RX%+IW+`+5&BW(1LHG2e%c@i{673J^x36**V>pPrf`F z(Q;yb7>T;;a(%_T^^Y7oY=#H-Xf;%=gaU5PNHG;ft7A7+!B&&JPKBqe)jl^BZ&0#g-t}M=;vv+sz-vMx4UBQ=kqi=rsN2?avJsBL@^`gy$m`r>8#^A7GD;1c9#F2JT@)^kVPIt1=#U=%a^SV&Z70r>EzZQo+7p*8ibBE|>0$Rxs-uPR)-ZmuHnDu(dUO z7MHV5Z&&B}$8>OZS$! z$@X~{Nzs8i?0<{KQXR_B9WM?918HL8?YeYZW49`J*=Q+KKRB>sOa&~d!u5g1*T?-7 zC$;_KiJz?=F}5S(>6Y&?`7Oji&n72T0qOkmxK8r9k;;WHMml+SW_4_;h~^_a+-dFzc0<;=*gVPB>GcR}}X` zig#B?@jFq^6kLji`6)NxgofQtkh632$lp?1g0+iI@$ zgdCAH{6#vJgwfOhvYm7mRa01sevN65f1?tQCisIdwgn`q8ocY>e(wTJKct_ua6I2c zT|2w;S-+G|Vp*U+9}^`Achc0$z~0olI@Elo68L)W8IeZH=q^ij>-8gO5J;?5C1JYW zBD;5Q;USwZ{2n34&hH1Hm}O-Up!R+cu#}LnKc?vHlUud_?%(b$!g=F9E8C;rRz=ek zfzm{tmR{I1yhL#SP@ae1AfPqDPu?t3qC>S@r}=lO)62%PZ*z!<(pH*8qF!jxc@(xp zMmd`H3%nx$f%BXFdKdJ`koEXcxNv$1Qo)ybm#=faCnHsq|JC)v_ln4#{LWcz6gfem zb-UnyX^`E$Mw&f6^<8#@IoF~V34{RPl$DQ;8(Q*-hemFrpyI{0&Aj8!7khh`JMT}J zv<6-UE$FX?Vts!};3IekYdc4cTpgsvJ#rx3Xe-bX2WaW)qu@kS6qA9QdzSL*bxXG2an2Cb1K z22^3@+I{Kz=8j?NXifU#KUot`TZ=G8@qZLE*^B?eW0K*LSWzj6dJ!CT*(-=VR82Qm zIhDWM5uPVAI3-Isc4&T(ZMI*2N3vYvJ_rV9(!Jp9M}&dFN4;e%9-hs8;R-TJ1{*$R zg1~?QNR24?$>F#j32vXOEmZ4=OtfAOLgIuwJJMpS@1& zxL-&fSj6{fAcCi!a=gp3kADdehF5<#FCkv=T7CA?A;fWGh7|9|Y}MOSJ2Ctd1|k7e zf%(MHvkCumobA-GE0S^UevQj$nf%sV$jfn0j(&-os3MS8Huews4zABB9Xf*RaU(tIN`J@7;+ z2n3Ehc1JW_|Fq~9t}pjX_Q5s(jBU5Gk|k^Lb@IqD zEz%Fn|7`@qGs-t@?-%m*1g33!4n}Ky88%cl7aUE=*YvIXOAR`?_M6J)wmBHl~nC>O=(sD+V%{U;X8JA!en@(eDyGs??flFlvs{7RIIluD)} zCb7_Ur3jy%bmSY3#CanPzNwtH7L}f_x~tL+R}hPujrj^CG9``&o{G`6B z?iOAo3PNnb{lv6v#)}k~O&NIn#(2@gDLsEBQ-dcI=F^@&Kw0To5s8U7!2*8X_$C|g z0!<3ndW1pC?Wu@IE6HmP5m_AJQlV#GCBB#(v14x9n9pihj2E!3?d>^SZ+zT7hv3HF zUKW@gmSdi;9pVMZcJBooE;gn5;Evi;-;e?`iwLnLcOep1MUeYlvU>Z6KovBG*|Ekw z!S-F2dl_-eQZN6b<{-N#Oqb10l z=Q0cW`76{&ODqSOh*U&-rnSuOE@IXH_>WG3JI$7Yt|wRDh_GVo=;CLw8h)6+7t%T- zlJVn(lYCD8F1Wxk;|r3ybiD7u}$MsO76j=VR* zXzc4R3NJHW`L7|TzWf1!{8VOtfAaN4$bY$BdJvFk-6SbhB*``ih`z?b$$G|dSs_aR z{bP?Ngj>z=fj|eW(nUe#CK0lt=W{9ignqqC$*cbn3sxvAz~=bwWxiZUMUlC&R%=C( zttSWue@OGajQ%Nlw3?<4bz01DCnDajx;&O}UU%NM9yV=jN2%b*v=h7$x_%!DNDU6d zR@KRqB;XHycsN+|({T7R6^)8z=IHhlkLgNPLv;0-_xsSJW|vMZraIc+-?-WMj9$C39!l&EG2XV~byfKNkRVI@Vo)b*a%D+G`M|zg zsP&l3TI#-q-QXLv-}n7S;Uu?1ybxf)ed1$A<(=y|xkd?bs<6rJG%e)r`yz6WxTJHz zZSPATf4Tu}5}HO(=X~e#5mjaTV=-Qbw{J_5*|7$$K(#DOOG0j~$BJ3z5;M!*sb(s2a`@8S$C(g_ zE&s>v_P6*GPP#?tHU|(`_3xD0rsD@ImNYyO=V{2&P0as?QtFvhxl1hfQe@Cu3@Iu+ z7(#P^`y1ir00S|j|DR6yg-K4`&p6rh!@S@F9Pae0+Skf_Yiob+Lp#ryVO8b*lHVS6 z!J1s5yMa;>(aYVSXqm4Hjp1KOxxA}_)yTm;B6Ok~*rdf7ybh$M#1r6}CyJ{j-(%DNi@Oddo` z23krNUAkVXJ4Ql0c37?H>UIeqY6_Nww1=_}Hgc#k$d^nJh7+D&4wt=jRcG5yUtkzE zv8cme34}M0dKnpdBqK-y&SJhsgo#D6K3CTSE5wrj6N7E?%o zp*(%!p}a(`Il)j#x}GmMIErsxQBd~(;QSj=nVPy2{c5W?A{V@S^W=H<`r7QMZC2Y0 zcKEbxU3O%DCcItOdYK4QrU-m5^41}1?B)WB^7}V?1G*xQ`n2QttEZ=@F|RuLD~l!U zNuB1JAn`0eU35=Z{*(Jf-#;*{EYJ!9UuJ_ZQ<>$ZrPPJ|Kk3x~xY#c~wGxkgJ8pWM z`a8hRod;+=JIFiwPWhH@g)XWPbHfc##3~fY?TsOdxL*{z&-kx#h8-Bo!d6HEs$D{L z$OGbtBZWP#vJN7I=hY6&HV6{R1%Su}!SX21v(W5A58rEd3~3F8zU)JgP>XKu&|`k` z`NhJ?Xu6Zjc-$pk-({;2#-vMTQuU3IjKZV`gBrmBXGUc#8ZCOci_Io6kN~QZID%=7`%bsYCogL)Xs73| zlF}AwK6SgJ{d=-VZp`wNG{{*DVxzlT4hzk>!`qVW)PzGOvuN6%8Hf*T7wXG${QC;c z@9*ip)itavs4O~0Pfa=B-22w)*_|5hnX~BFU>uW2D4SS0G3NHJ&XJcws+#^lju@f< z4AR4akt9Jm!p8>xydsKY7wsEOG@_fiAfobTyPHYCO4sz65I3{^M%|-b>WtlPCy&tV zg#De|fj#{G%OpqHGKcMCwhI)1;Wjt%y4r_fcHzph{K+mkaC^c1<80D+?cF=)yKAFG zyfE9@93S8MMfH%!p7_Tp=lCpLA)%HLX#L%Q+!mzJ#McV24Jp((uhB~*J&!*=uX2%x z%DE`6&TGfUUv)h zY;A&EC;!&n8`Xi*oh7(Cq1P^XfUopu%|Tr)01%@j<)-4yxZXGb8P)h{>BHHoUew zi4|?OTX3TYor=ck>VZ0&SW}(nQK(K)G_ONoAgfNdUk9F3Nd0V!2lcVwiEG)JcDu9d zl~^s*#M5;)E^38zvZh3s1V|3|?fTY}TU2ixH#N_99K)BS@K6Vfr_GV0EG+3**4|DQ zR{tQ=AR6YXvEpVStDpd1z^`1$F6vzBhw|8g74PI0#e7}WSOvB$c#o1=2q$Ztd?(C& zT>;}f3*;iVn;jU)Cy0y-^ zJNyup`Xly8rDB-x>zWX=(cvxi5s}$n%VpBC8TLS;sb&k{d~fq zR&A&R-w+_F@$(i-i*2U8n75eeL$GIC1bV-_UllDxb1KAxoI-v>%TG)Q3}!{4-Wl!D ztx$a$?|%4!m_Dzktv*p8x)`#q^~X*kc>CNEC}5;Zf0=UBC-?RD?4Wo9L>Qrl-ZrCs zJ6f5sE4ZIBa@~p8d5A{lxSB`uetNLwJ>IU*8-m_(*t3|>61r~|OutE(`YS+}fPezD z5&Kubr08kO4lV7Oz4gB{xE+7=GhUw?SF~S00MfVKBxBvRK4073=?-XF4PRYiO-)KT zjOVW`$W;2^+&twsm9Ld=<_~RwXrlS{>0qpehLUf)yCibHrCAnN56L;YnWt#j;o?uaBSobVqf( zc5uCnLj+qa>5IL~vYykU+46z78(6>c0M1%xO3X6vd4hD_j-wNm-i*JcPL4V|%PLJ6 zaStxq2zj5ap~$M2&BPkeT_mC1mv18q?DjvxBMZ%vj+qg^Dxy4m-h5j(c2{_#j7(l0 z(AWq;#Ukz2%!^z&Hz8SRiHDUSu$C26T$JVf9Gc4bR;2*b}HOwwt+RH3GIR5AOui0<&06=YM+Zzpxp2 zzTk;0akf&U2fkmGo|!Z~gnNd1O`dpG>ms%#iC1SxYR+ zHhO17uj&p!HE5kvRvkRDJzvsW>tC$o*T@m34Nf*YK>Ttpl-aU>o4z3kxVCr$@%|l= zU7Ovj(oCS$1R$oAv6xTJKAD=VUdyW5&F#nPV6z?8+~Oz!PZE~omf2ivXibxQl{VTn zi_*`}DIMQ2Rr=nTj4c$=3kVNF1tcp}{l9FN`exF?Ds~Kn7@F(ldz5_}bYbOwej!{X zEe{=PdDW7#)7TA$XeJN-1pzspP<@oTpZ$GTcow5-LjrP*ReY>kUuM{G|&Ur%50C6nHd^cajheOX3B+ z#-K6M!$~;Wy5cT!zVdXRwWLxxw3&atbikMnC~N-NdI_W|NHj)FIAcA%R>);T5WJyz zdCJHvb?Gn^E%&rtZP98ta-Aie#^$As`+!`T8g^^*pzeyVDI7{g;XuEp{iC4uVMW;r z^C@<=A-Q?>-H`c6#f|bx9R6Uo=FveF-f5j1@Y zJ{9)-UGa(5ML-ABK)_s)fR7s7Tl1OVL%u{A{d&z&5wC{DB3Z>`*q#j!y#Q9+r0eeI z4y7KJjFI>c0qhK}gEcDi3A`CPdsB%d@QSZ)fNIL6zrN+St7=2g}f3_)bv zD_7!#1ijVdqvnHbz`0^N!Rk!8EIcF2ngoY+8@!P)(?e0u1aZdRroF?3RB?yycjtb> z81W*nm556EWtQc)1#SZW3%2Yf`68ES`iJ<4G-2}xWkU7*#;@%9TnouGj zLS6?ikIDzFqJcvzV3vK3yoaN&n^%$rY4oE2fwa7tTnNhzh|B) z4YzkL#Jf{l%)t&I)xycneJ$eCYUhJSbzKKGXwbRnB4~=)LWi(*AtVicjyhiL1lu^Z zz|x6*TwPkh1g(cDquX)kQXE?N%|$&6hPi&X4B;r5CX*+;ac1ofgjjl&X$C#bI$=F! z&y)_M-aJpOR{$zIT2xOoienuL1=>^N2(Qv%?MaWrIO^Gl`o6iwL_z$*yryj~qyqH> z;SItPl;Za7gNr!Pe=S~-B|FOy%=c%flmv*6;|~w(5T^;l3!7F{p-gO6R{R-H0SlPg z^7xaz?b_aVu6WnoA2_?qxe>6 z>tTM-Vp2a|4X-F|Z}qo<5(3Sk=F%D3bF|=o3$05z9w|SmzRkBZf;?a`p=Z#b{R+j^ zPp{M}bOUOmX5OHX_<2QRQT&haQ*V;BmhCC+eG~k+|72sN^gaHv!L-p*Xevl@gb+?X zShM#sQB&-{)_HDC7HLU5xC)u(kE~x@?GFCP*gQtJj@K&v6Q(_LSRn#zNv^YI&`hX& zFM2OvGgxh0q$F_YHG81HZ1+NkCuSaBO&=?#@j8XWp2A_sAbUIcK&oN8W^dMy>b^JY z!_M4LT0ZvNehXm+4P98Gke~mD>C}Ah))1oCsOefJn>F-pMp7^$h_-c z5MA|thB?})Z8ANNO+`_xyG8HS>hmTGs9oLsnasS zD)F&{g_*c>&fOl4ofzuAut8$KQ5*cqR+fq{U|k$Jhf#f=Lk)KM2nxH=8!h#Q;2vkU z%D7Tz@O_rDug znzfx@1qp|$0}(W9z|NdxnTtp8WPJx(!68(cQ2UfVP^Llv;7@8ytT_L&zQE&AWSAnD zP8$uWqIVGB>2T<2!-1V^l(wFwb6E)%RV;M&`0&P@Z+OjDLW3!|!ct+ShKVqN)~1@; zp`=!ggPmFCtD03lbI`@>62!F;m(*kH-H{n6@eD2J9+`dvYDQOeliKFts%)4TbgZ9X zU0-V;Agay=VAs)fFaRA$$$0fukUL~c=qAL#o~pzIIEl=$wS~(>rrep-lk~#^YjDo_ z8_-^TlxEGVyWh)?5`|^1O7hP|R7^JH{km`4P&e{s4_zE`uV7=}1r9w{3F2RyFeMz+3L9 zFy7|ekX%fNCL$Pl+z(f#0Vz9%2v7_-_eJ&N;CyCJib2Wv^q z38@enm&Da-RKuuweC|8xC&iB>c>;_bE2}8_9|nipQFlR9%e)F zXGuOC$IWFo!}_=+?m|swEx3ozbTO3;=Gg4w6i+FnGG+x2IgQ;BMb*XWEE2d~S*ddF zCN!a;Iy&b#j!{_wyuRW~8E+?6U@jF0NJ)pLJo!n@_{B@Y%Da3Y`=U+$9#52C6dk{z zUt}@lPm=K%!o*2K480ZO`p`|WGc~OX`3@7mu6@HNC*by;!w6U9bFi@8hi@V5PNUs1 zPp_JfrFU0pOeK0e+mL-)ze8+&+9@|_xJ`hLFH1__n)2~8 zF~tWVN^cQ1DGMDCr(NMc+pxh6$)30P6v?sdAgm2j8*LE?qE1Nl4|R)ZU!Rl z0w4xS+oN8qRawI5d>c$j*6z6`O2Jba225I^r7~^xSwZ^@z8{E(5=8ahM8F?4lQcB0 zC6$}Fd>Yn@zS4RXPXNXkp(@(M+c&}5j~|&lsQ2UKKj4XT=2p0h$lb!! ztG~Q;@KdILTx8JKX-n(rAlnzj{JlG@FVZ(tSL#FQKdWB0>DP9KeBxaj-6a#p{hy7O z-oX4RfON6pV*1Ru^vbohRrgltZ;!%Ge)PJ?;ritBA9YVSW4k=|mNY2LiFgjnyfx z@0cBB?lmUq)!e8ns;{9f2k9dJ(GnglV!+7BBPd2%PEo=rNEpVHn_x=KV?v36nM{TR-5c5ZUSg_twQqh_(_qG~VAKP16zI5$X7t0R&2v z&YObm%zJv?-dxvp%BFG=$moaMPaw$%+dY`sAerLLu?I)>xlhg_1${8e8_$Hb&rH`o z7)zacJiR5u&#`9*s_0lxR#D!bHJF*H*ni3ehQPGcbjc=Dr97 z5gr{tJORmF_Xy$`v#Z)ZhYmjHUtB<`N6lpQafv>dWJJAhGc9K0(<%fE6yiRvQWWX^ zQGw3ws8@Q!`&qdhNR_GD7f1AF(lP^s{=ql@RqwWoJ)c+<&9U&l?=bveBJs|AZtR~L zH>{y#(FI=65`f)mWEM9wrMy!UDUjS7io~d%JUI7T3BcZaYTFOLH3!f6n=MdUoXWt| zF1<5FxTy<buyil%eRI*|cD0PEP@T`t#*@+7-tj&>E-pD#iNf7_C@a)V5tIe ziUo0g)`O~)So|;?J(b^q4f#-W*j#p+!C4kME}Ja++Nh*Ls*sopVdLJP1#kZRcJwH)B-G?v{u8(6%1>N2X@2uDua1JGX&&nnW`$`GGbj_ z6xi~*0a;BPcqPYF{xkk?a8+k}s1#!~5$9qv!Xo8S69?GI8_6oLP;MZ$`awC&m{}S*Uzgo(ZHJu74BF9KJG?LctZfMRo zbC(ROx}-Q4sdYg?`SJ1?K_@+=MY;pQ`L}NSJ%YY4WHxW?S-6c|5vyL=1{2<(_&3NC z14N3ad`a-QbYTy-2}Lbv_LTRSq6v_-sProPc+IrYV-n*LN9^uk)!NUS9YRpj3Bv=@ zk5}z`4hxvjN~pKm8YG$7T6A9a^R%w64PhUxDosTHFV@~NEUK<;0HqNmq(M?qTDoCC zKsuG~?(PN&>Fyqo?k?$;9J;%^hORl|6Yuwa-*wKvvwkqw#ol|>z1H0kEwq-i-FC&l zKbVsBX+YEQ34WIJ#2`Ykg-BYOhsLj+Fk5?Faj#J1!eRv)Y`f;2L~B&NQ4ZKv{uOXB zw4HpfSXALUT-+5ERsp`)3ZKZ%=A7pnF#GjM6ER?w03;@?Oe>)6$9tw*w>UL z0#xt1M8UIqc-9%B+*Ic=W$xpfjZe|p#!#>bNWDGV3OS4fA8}@_H7qk+S~1~p(8d__ z^bpD}7~SaM(u))x#rc1&L~bDs2k(NcHQPvsqH1nzn=^;!%?k?#uv{?wn)8R$ZqSx4J4Mw!49qz$(hpUW+_I%K2fWHv~6g!02=7bZJ&fhe4 zTmm~@J`!_U871i;EvtAAke#$w15=~1}(qh~@dA8>@x3TH>D2`$) ze9c{TrsxAnhx9abJS)RxLE;f2DP3%EMetw})8e#lj>o#UIljjTq3ZQazWVjjW&NvE z2`VuVW_Ak)*?)<&T~f};l8hJ6Ev5ZgCA%$2L^PPtQ10*5kHzusjr1VTP^KQA;uoHt zkhDpkGVz{miGDgfT-=)~#FFGmTIMC32DbbJ%K(&#bXum;rUyfdX*OmBa~wSL_6E}E zx$Ez9&fO?uQmA7ZEMi|+W(!B1j0wNu1XL$(EBZ`*iolH!^56!_9@2tmPNST2dWiN9 z6t~mZaA)tZ$?zsBR`iK>nB$EFW@2d@B9ts69?mr`KnO@mF`j6xjCc!SVLmb>sPzLKn@8?hdCE2&UAN~C-5KX10D?lI%T_g+` z#dL3m4w!ye4>J`&MfAz#Y&BHSOudqVmNnILPkG*wSoMD5LWF`%K}6fZ){mxuQ#EP%FQ;exDU)QglKB#4G+TwK0h5W`jWw3{F_qK-)4*AB<99L)&A+1}axwmRkP`6a)gKZ2Dftxvw#h+sEPwb(_2 z%GQ_89qYAvDh#dpeafp31|DcE5AWkRw;jMDStYo@^3R#XJvBUZ;?gJkNTTQ4SN3kp z7?bKle$V$`d|ls_CLubkyCFh#2O|+gQKSCILSl)nZN<19_@EL50P-Z5rMUg{*G)=R z>n)hJOr_c=FHXQ45vKW%NWhEr$^Tp-CN6=)0}S=5bD8; znp^K}DPcHL`n1`shssrEnmhmw=Msy}QvQ-E+Q)20@>Q{4zpkLx z##Mk$k4H01GW7jvA7R2Vot4j@uF|kN%Q146i1%(I4<+@bD~k^rrbL*a{$W=hf8)Db~+22Wz=urRjy@sYM1G( z1iDU-ev2qu@uWu&&VnE2X>C2#fc(E~G}DM$j1a>oqrT})usAtDkLj^dxnLLyj3=f* z%kmtkyL1k;TndzA@iU!QSnRXs*sk4qRtkFYt!D78PT&$8IddnPOD(oXU_D4(@N#4T zwi@P>d69*rJ1+%f$rZ-as~#7Xgo))MYJD%*IkP0eK*k96R2Tiazcfbx%`ElvZ}I;x zL_T53m{)V^ZHo_zG+8LE{i;M?5a-qK#B+bxbCFgTJ#XaYcdv*a_r|&}A-zATLsPx^ z%Nir?Ox$RJQHbW<`w21I>BDa|0?Sh0#Fh$==^FfvIF-d~?(UO`_NQcI)deJv8X8et zig0Z_gTF}ggA4m=`DcmiEBsrhuRoj&pM4z{9bN4zh?Q2y#RJta0}6D{uCx1cGrQ#% zt$Zt(=0_6tPCwe4F4j9`C?DU`qy{JTzJUsR?}%Tkxt0YV-6(7nYD%&&8ZEZw2b#9^ zboeMuyXPD_%|3UHJt0<)Xkmw9{85@)Ny$(>Y-fkn&dH)}h*BOWqUQ+FkWXAVBRbdCM|tGh^{uhl7G5|ASk z7vn|*+PC5JaZRzqAkgk$vI?`V<$#kHX8KK}!3?LkVD=B+ABVJ()Ys;Od|K>dqWv(0wm$e${)jlO)6 z4+LsFC9>YObvY$;TyM!{l3Fr3I(Wp7*(SaKSkldWUFY)qh%^_fxZdfD8-dwc%>` zOgesFs}&WY(2b6hFd*|ciC ze?lZ;U>ke-PVJRmF@^1#Si|vwk0(?imO+>#JCn0Ou*e? zMTLpPSmXf)pGixq43?qb{Uj$L2^y2(WlS@0K?WVh6XSG6l2GNYHlm;ma%pbi%c){<`s6z9-!Sy zMK3WiakE3;DsATi4r6kByZ7Vf)|9H0WC)pA)$H=jNk_wj;N57NuB6a^7+yeAunt7` z%%?P3zqgx94KHal?FfkgKDGA2Ig7ue{b)V&P1~Tjkh#@becnbff)7_=k~0Ki;$W1~ z=9w%I7O30bbHgP$QYG#4%067>XknHs2A3A4k>jkA>;ddXtMu(3#Cd}rbR>K9`q)oO8l_-FG3gN6Wc zX7b^w%_SI9Vlh6t7uxI4J`n>%|3erpQ2UHJevZcdeeZL{TtHT2WF$LR>9R*BIBnM? z5n4Ic%gZaT_kRd(VAF6|V@F@KO;bWD!15&$5U0I~QI#QQ*mJ->81fk6VL=c1-K~g`)h2rThm7iw85=dx`WnP$fE8jQy>(^k?P& zfahPywBn%t)LNU7prqu6d!L95OUTKI9md_=J&zpV(c`S7+_&S9Ght?<=(3-Bcl@mY zqlvRmztJJ*j$S~XDSK=pp1qY2V9FD_OX`*39t-=GiN#cn$TO~ey&L^)iAPP@fA8F% zvAfIX{Ij6j58K_-?)T%Mq0(J4J3Ykb+L&!YYpq3cM`~X9~XUvFCzGo&zM$lr0RFZzjAT1KU&#BQ3gxL^ zP>9o~hIko{MSkPh%bchR_pgGQ^=|b$d#O`6J$WNF1#?GOzSDyEqpFW7_->WQi!doo zX3+|ieShbC3!b+6_lRx^=(8iS_y{As>k&Cv6MU6<3R|af61ggS=FMown>lZl3^it_ z)i{34;7yg5m958(`|Bh%owT0K27xaxVXD*^ws&@}x%b@*-S2;#n@yW}(RE}Wqq;?A zNTkTK1Y?jE${<$7*((fuCm?$_qV`#3)Oqr)KrD)YDYw%;cjBibpZ1Q>MIj6?UdA%w z(cTS}_QeN8Q>#gnqmrn#C zOPH^Z1rjw_&ThL_1p5j1ul^cmv|oD!1qUnYsJL98L3mpCA^Xy0UUfUVW79`>EN#k5{Ji=J!NLnZ9f2cJLp#@lRO_$;3iTpdcKfc7 z?>DQYrTl-6k`Bi+5J=^-%1`F*_5rEw5znGtT_nCFXCbF+ft58zZ=YcJDXd`B)0)V)kXyiyec)44 zU)1Q6lQw7h3A`10{d7v#EDg_xKga-dtua0|EWI>YZ*dDR#?H>J_566kVOjB_t)tQ( ztx|DZCu7Rk+S+R4S-`Ga{Y_PMZl`rIO(U%biA{~x>|hmt9Md3XRcfbCEc@~K$U$4= z6%Lt2Uf#O!IqSt7&*fdr6yYO#L6 zAZw!J=-Ls zCT-Mf=ingS?4?O5{g(YL0b?>!vRHsvZdcC4`F2DqR8uJtEc>Efh}hw+}`4?Ru) z14LU}#NZzH72~wDG-!n{YJUEV^N^6zDNRj}(}mjLf`Wo0AAOYs0auP5lD#O!^L_pT zfOqUJlXTJT+s;7q=*hEmCT^vv0B3Sbb*|b#4e8FJ;5|9 z%kTQPY66#=AqfP5Wh-q^N^18*Zm9Y>&8RNfhpjTahaap%uV$Bdi)a3G7XiP`&;r2(9jwJK+HM&Q0)ZP3ly_nSTmiM_? zzR%!OeQ)Tss_fC<-_Pdzz#Vi07Ar5MINR5WyCKkrO$f<zo?cWBKkgN-UsEb5;Bnoi`zM~;u+b~L@%aZkz;=sGVfP%@CU`kOVU>d zU`q;be(SD>k#@gr%bzBBpsciIvRNu7Ol(6M-@j7JYR8lPIptb;D~4+?PPp2h(KZ+TdgB~aSSg$bugCEvw#r8MO+j9 zTW;PmE$;NbtXyNK)0l?Xn!1%dQGlG$F_?dXz^XoWi;> zSOl%e^Ma#NJhLg#EJ)llO(f6a?nTpuNmFzUH3n?H0+J48Pckl0{!KfZZlA!4Y$_2-G@$jeA?v>a)`m_uX&tzM#Xp3$DfoWYg)|z<=XQ)5^ zuk(WFat7W9n$XsJbJ1ag+!P+wcK~NLT7t4^HNQ?8m6s<(u@pARg$Cq!wwT}ZYARIw z>WwD!Jm{U-YS`E&hWtRepw%>up_v1LHeY+gizjRbV7UTup&3id&mtIMKx{T zH?fs&r)b`OUEH_%0$w-LdAbE@lEdTI`qz!Cl)KBK-^q$DLL*gl_) zXuP=Bb_HYKE#;p!TCgKs?B_;f@iNRmqiqb03X)fAPi#WI$H%;TrY$WJQYLl%u*d!u z{cR+Ec`^YOru-&^Okm&LQa+y?J{X<)Tu2aCmQ8k+PR4kzsJ_LM98AO=Y7fuo$a%(o zJvyfXCMN59!;$Qdny$3bX|^kmneBGF^nr}Cr4XvZvGGh5&FLX5Du*U9H>WmT@`yv# zNSC660^*OQ+0wTou{&us7K~c9?{g2wR!H`NdIrszT4KQkcDPz=NK@q#J2Lh~xY_$4 zkuh4nq#-GW$nSs5)nOIHhID~~TdO(-n<|%3>B#Ykr1gSrbN5TkjZcNAHdB=mb?v+Q z={AKOj5y(eSY{s*c-LeD2dV1601bb(DpO{wt9y7<&SiCiqF1eUx0ICCF|p^sbFefg zFC`Q5m=%R`0cwHIsvlT*p5SDavc8MvNY2!HU2`T8Z}fAoQ)<{Mk@#WFpeDp^#H2`)pg0S$dga*UuZS8@ zqofcT>6;MyI~p_%T_yEEUZVJv9H9ZNz|S)ry)Ez}j9;^H!^ zmNy(G^nnM=FjTZI&?~jsK3*y$U#=p(*6wX?Wwm|y8NIDrbgjMJtX_kb<=v?(rp#`& zJ#S}sH7W5Rjq@7A3~*&&fL6rKd+-Y!S=P|}c6pW=B6 z=HgL6f!%nWLco_A3yNN3dqtPYiZxeq1-1ogUOa`yEbK% zE#ccIng^X>AOXx#Jbr0x;nHsi+R#8*@>us})Yu!knT4W2U$L^~88ZRUlU zUX(gS&n0}y{!t@+$!jIf3-uP#{FFr8M@BkYXNho}-;*8SS1q{JVc4SfQbtCqH-S!h z)AwT}gPRcEg~5cazygoo+Ipb|Ag%3PsLtW6GJbDxZn2`O&?2*@iK+!%UQ_hd19eBV zye`yWUIMKUOV`$h_eZF$3w*BZV zd7DfV*|GA+1WsgDt8Jy-PvqZkfwK-}yX-#_{US*70*3c!8EA7BG0-$SZ#!<;g)m+l zBMwv}N0?aMF|-rI_&%)^DoIQJE%DleF5HcHr)yN>Bnmk|8A`8w_g~ zzB;!PdhOfiO2d$FGH@30yucnsxv(G=u0$XbvUt*lcUwrhpMCoFdSpK1yFi+BRP*pzt0lru4R4XqVd4r@GxV1PH^>UNxJUvOxH%_JV!TvxMGXNkc$pJoJ!q-^=BiIcAADZ!UdcXygL?|2A6J}BnIh!p)5L%R zu7w{n#Bzo9_6C{7R%vubi)6J)S{DNkXON)|c_c~ihZwI7B_#A(4&baz!)Q!#zbe8l z$&%kq50`0>jdq@9;q%hd(o`D|vcg<@A?_HL3#ue!>p8K*qxMq(GC)+jMQv@ zFnV#%dQBVv`K|!Ry|NQtIa;8IE6ANWxB66IEwTm;XM*wZ{21v$vjBc~${&-*K* zljNTB=>A^=$~#K2t@HUc0o(gZ$j1zf z?hu5bcmgi5@ji;v%mWT(nBZLL4yNeSyR+XHN!kBw=BCcfoioOOb+)eoEK}scR@OdF z_utWImmNd>9_bC%mS)-2gDdi-4Fp-cbp;duClZZ+TrlM(^1AMh_%YxbyCEt%gTz@W zA!P!c_y;uYTfKhadAzH{vSJt`UDl4E*3i#lzl1Yg`OVX?qgyx4Ou0?+hPWyIuvBT4 zn5s?0EE0o{&y{CYv`f!7_Mo`m?=ZC`#X~)tx)aJOZO{R=bPV}^UxZQi7 zjMYb~Y#JL+G1Da*F->>l^2@Zad(=3RWkaE6t*hgr88JNN`kaz)@P9-s&l&5po-d^{ zKc@iShoK%T%1ZSp!95F9uTY`P6cZB@Za!w%&+KO8H62{xtGMBTJ62ytLvl{$`-SA< zCo^KAgFSbnK`oUCC#G-dj)C1`+0_f)wa|q73NhV-QiQm?ftG-^KhbAs`tYw%(>NAO_Tc$Fk zS?);Xcx=fk-?iB-6g)7|G3L~K$rw#K%FAr@1h}^>$;)Y{F8TPDN zCxNw+hYbcsad+_}a`CdBvzJVs8j#v}@P_7-gp|%70#>+E?MDpdRJ|Xra^!&maYw=- zntEGCmz?cnm#onUGDfTN)H><;h!$+~ZIHT_*UO7jxN~F1G4?R>&v&xjOnx0eVaN1v zUE>FVOES;Y^LMpw*ViaYrG9~E(|&D%l;UzNwpEPk)$r{-yO*`T#Gi+B8}!?Z;GH78 zEOtnHt&2@S700bu++HY_|deOWo}AP zL7u!%G~UBf2qX~3w{Koy*+kEC;LsdBNEyXD1b$6Oh}~Uv{*@-pB<--Y=(nJ_wV^A0 zb4znMYv2|Wp4uPuw3)U0Nu46_ZnoJeA{t_pZ`IExLn;^u)8=o%p(sxw^pXRm!MW!V z=ouf6Axm-(fLk>EE?%$nsMxqN*5@Aw2=xWV|6id(1m*(Qt^zzI)Ta|H2!tXitR*D# zk66GXps~X~0@(#XezmJd4VWt3REZn?&&oO3)XATz)ybW?)_VI@3#uo!+~-{B&Jfm8 zEQt6l-h?&2wq+t1jY@y*1@)#?Xw`1gvdejxBpnlksx2P(pix60Ra;g=I#$C&6PH}t z;N>VBQfDO+h*n9(p8TtM9y)s9Xw0IJU7 zw;lCA3VSAG7IWagW&cHKeyW=PiC+3!aCr6ZWv|7pI;`VN>OE6OM86nb-_nm4Sm^z$ zAg(w%*%5|(hwobwHOw6^8NLHv}*@WOrkPt# zK_IR2O9hqe4I-!*$0%)(vko~ac=|FX*0{lXvOxBBY`Kvw_x8!c#L4w&gjtbO(=}e@ zbmSY|1U9CbeQAVb5ElC;3NFG0%%sM8_fDV2(+dn99xl2>;Vt-L9ZTm(W9{gdz}lHc zuLt;9M_F0F`NtY7%Ki}j@(p=&G=>*!E`@9kx;(MBT(1-=X{BFf2 zszogQm+F2h591>sDETfso@#wG-Z7=6{gk`kdz(^Fs1CaDT2H+go%5qz3V3d9$Kn|fIFquHuQi3|g&NAxg#;;RS(n>%EzPRWEfe3tk1HONUfr<&! zZ14ZOO;X5`d3dzxjAfN~vdcoB`_Xk4?mmX|lVOs{U$+P8kN*^m@7@Ebm1<6MZMZTxHXtd0O#*jsLAs3=^k zncEiMD85?1a69*CLnm(*5V(7M+}b-UgbVwxd9%lgp###X&dYYUwuTpK@zly2i|6td zpvPT5Z5JI-SyS^Zr|{4FzvX)a#i^$tSwdt4@+#VMV4ue&9)5NU zZdll$FdB51(~QA>S@P3NLmFW@*#9r}VO;%2Go&aFO}4h>6c03{%vNE~-On2~RzX5JQU4x(3UKr3HQ+u;fS zxh(iIW^4diFo^=~65vTUqYvrB z_|(Yy6hwXK5>#`36`}u|R3$s1F3{Ktu-TP*f#T~)?{_tPx^ci$7itW3AU+(V+&SS= zZ}^BD&6W&LZS8b4akCk9;xRF*(dj3G%AY>``)h91f_1Xh(Q-2zrFi5w`~SX$X|cAB zSL_%uH5>um*wp!=3s!5X0WGrvr0*%K z$Yk`T#mMsIsPo-*Yp+YU>e_P&$}Mj$680{YJ;>yy0!sIZSub;}C1mvu$`P2{N;ToOcAiJr^4Kd3)RT zVSo(|NDcP#Y*6`%TET7c^%q^ir)9>nb|vIIQ;^+mH-a*zO(Su~XWu6n5PDWRJy-Hp z0OdY@Mt|`X>Hh4Du)fCWN53-mPlY{_!oqOSy)&2_W3q$;jnYN@xy%1F2{y~R@u`8m z#dtAN3}i@~5sE_Fi1k&>yP0=IQ|^NTf>+#;Lwg#CS9WxUfb?5lCePkcA||!8!&WV1 zZab?t&%f$-EZ0s0k#S>OzQme3I`U>%t=5Ik&#Q6TE{;s(iYxz1Z2#;-tjR3&(g1-> zWYNK;`GLux^^u{G5AWY^hMl;imuKOZoP)uZ4VxK^JhH|>IVaYdK{m^ZS`lRb=WO0h zC;O7#(eK$RO__)UCh8CMr(cleHd?bDv`@N9e%;u|d!BO#oSlj?nx!Lc;HzI~dt#eimX2(SJtHDDbE$FqH%%t6ba=3f=_9d+zU$t&y;c+pD zhSmkh92!ZQH}W0+kmYNloP?mj;Al zVC4bD&apfu3X?avWF43gHbkS7yR_vLPsUTlOAblNM6}SiBb3ipcdEQR?U2`TF8J)+ zfebQhayKD4Xh1@_{xnR97JfdL6XU%K1+rFC1{{$Ny@h`G8S54>w;k>;=aH??e((Qf zO0di+bcx#x#h6)3Fjtlqn2UPtFPYU_zNrBn-UQ#OG{;c%k7V{#<=S3!K+XR-lqr1l zNNo4coAL6?cBNetAQo4HH+(Oau$GSL8>|dpMIDBi%ySF}Vz_fvpvEtTNiquW=jpKBWG8f<#YwcrR?fMM*HrLIgumYOn-he`# zo4_zc|InH0y`UQ9>eLi+4|7pjtH+&7xu=UxB$OuK-LdQQWEgo}QV}I*oWr_Q06NDO zmsUsHx7AO((HeZ>zM6(tM9AMQ8Do;JRr@zu+R}jZAJa%0bmz}q1-xo+Fv#SLtu}k; zF}{WlY;~o2e%~76PfwWB{1F|E38mO`5Wc|5N>rME5Gxm^G(rEt?#$S=+CMEu`5JQ0LfI^1<1r6Y&zCpK$~qc#X2oQs8>ZH>OHo+MOMRnV z^@tja4WaiB59_vfismXhuICFGw>f_}+dr+DHy~u7U=|^Zs*i}aY|TB!z<(dW9TfY# z2+i=9Mih;Ae);Ixyt6Bux!gC2*y3ZyRuK`c9+NY18Lx-lJ7j*7msdl5Hp}N7sf-mH z{+8qF>iRlgG#tNa#U`7@)JSFGr)ajxi1xbpU5q%<>VoL%obI`EHQgkG@-0~LJMCXP z$`##dgGTnu96-rCMKzwi>BOjB46MFCYgU5Mv%9Um;8(zve+tSiQN^(%U+oVwE?v00 zhK*|0oZw&$y8y{h-<)QrKaEIBgrs+N*M(~`biMl`z@5p%7Cgm~jfJtX(9?YZ-e?RR zX%;u!DKH@J{p~knIGtD>hG<)$*v7adbYpy)zklC6vQHp!o=x~O{wD6*Vit?z9_u@j zkqErjI};D*H;dLJuYK`EnB~3^v~^z|AKqrh2<3))+rhMnSQBQUhBb=g7=}cK=6On7gTui$HHKTfaW4~{3rfkK zbj`oW?SR87IncGZ+Q|0 zK~=GL>3w-FStH%P(cKv5^ZZEw6`{pARkbv8|9qSYoB%8tU)AhiZn6KXk z1`$~{Rhe*>(6e#alD`P8BJED=;Ll(Wg_u&a)aX(l>rmgP(w03j{~(#`Q;8Udh5DBG z3jr4Ou6b#B6UH7mH0K>J>9FdtzCc)_nHzjnh5fD9X(;GFr3T8g(cY*4mr|M?3FBJA zuEp35kzKk^?c-`4Nu{}Xh_3EFh>5v$N5yAoAF2J~ZQFI9@qdh@y2*jPIyLLD;~N~5 z`DibT%Cn>O6@{d?6j`ad@L1L-2Hm#s_c#$i?R=&~ zgA?JAUKX_Qec`Hl?754cfcf?DfE;s0Wn=$A(00nw-`c%CMfr*<{v5~O@QFHb9SRXCApSNrPjBS zOl&QtywWc7gnTA2D<|u8yuS&^D-En&Rw{FYre}O^xlQCFe!5!vYW0arXg7uhUM+4d zi=AO@rP%rEc3Z9Us()6oz(%1Jx6|G-wp43j-n^HLcvkmBbA^sa`=Ly-t^LCBo~Q0+ zfZ-E`Y@OZfX+^avp= zbCs9KmF&JrxXQV3a}~~2$p>PnAaOn0w?^`Nr8T0X_|4yFOHkI&mGz~MX!+Ay3C-r7bE?k~hMzy2N%SYl;*4VQ7eaPuk3=j(hV6hSQIb0~3ht;0juuTBNi z=1qYc%j8??o_%ZS2{8{Y{Gu$1sYK2hiM}hH?WlWwol~If#}LW++9^plJ|bQ;z2g-7 zUUxZWQ}@xbrEHo_6WIdKLB`oixu3s@d%t5*hNPPt4*Dw}(^i6mk)8{CvADA10Fp-% z{KvifxP5`*1=y~fS?=j$Ymd{N0(R_Q`M9dCqN%IIB1{%372S7Er?$`327b!Q9k&Iu z89x~nWbz9??alZlJ9jFX2oi^;w*Lr>L~J?+5V0CS{g9EcAp_{!TB?nR*can=H4WvI zKH4a=6)ZCDUaa;NTdl3Tzm*?;Vzg%xf;)8dgpVjc*lKj;d<%&AO(-Vt2uJ$7r5?9y zwDxN*H5uTa3R(P7*0^R2zCb0pmSskX)Zc}?6+f?5!d_dFW;r1`U;kjBiDWQc(gJuO z+7*~d+{_$g&{h0CyqKtu6O40PDW~&t#7Lq_ERTLzh=g|E@U<61!u0u4ltFMQNN9_i z#iidU%=Z?**m*l^uB23-{PS@U+$5LJ?_E^lSQbMrkRGHL`msPb|?|?Dv6CjoKh{r&935Sg(h;)JY_k$hm#TfYZYI%5Q zEwiJrFfwMA>OL65@N}(n5`?i?b7j1EmPPr?+4BMOxO?as+4lHn8 z;c)hzXB>EyI**Li59fo|Y~l->=VS}%F@5Xty$!YKKt@xmo^u98M->&vrL{cJhBIt( z^}W8SY<5k@_n*f%O;U#fc&d`HqB~S>bTk4Un_-^^_^YDsFfnHt=rbg%pN)5KqVrnL zbZ*?y-;=$S4fG_q@Kx_?PxIt9G3Kj&v0K~?n#TdQ8qlKWrQ?6F6k3gm z*_qbtpS&g@Xz9k}iJ^Qxl(8X0m?8DlaMZMyL(V-pSIvGeaozD+@Li6kuE|Ro(>u#( z1tneGX^vUsC=;XPsWM29X4z;d(Gig+?PaF)G9~4H+oR!4VipA?0ViInory8KsOkk; z79)6Iyp2EcPLzBOVas!H$OZehr5Irj6`+m$O~Q>Y70?0#+3`#G=*ho4xqWE+)FM%O z`?ew%SfM@u$Jx;qRp;;>ZnmBL3-CTSw6%xA*_9M_rT)-@XEcgyZRhEHi1*byFg4aa z8?od-<{RA6z{jPST97TtENY=fqZj)r1yF78olMjk9J0a@MtJ1vY6z_MIsh@coV zCu?Fp5jq;~5g+m#Tdxb$!eR?s51ISDPtr5eL|E3c_VHyaV8(lADHJOgS94rN#w?w)(7Yc7bripC&?txUflv)$Q;w&X%32Sb0vrE7LXZWxEx_{( zb$dJr#E6u|L5FE=bQ08s@bK1IfTL6el2`yCWht~xxYqr(N9_4sn|;( zt!ubY=*fL-BRcncL&n>l7gKvcqaHTdOUfyV$%ie?SbKFhfM{bTogZ3$e47DPS7LJ} zXXcSaPGiLK%-Z;tg{uqj@?)Mr$KVj)JmPS@U41jhbkVTpwEEOx`06^KX5@>GW@{Me zHc8KXE!+>MfX!6OSHm0F8=edKTtXZ|EG4`**!nm)O8y=)P2_r&(}I^B2pDXk;e-WK z95s@^dkD=UeCHkdYW4HW;Dd%;&E8hye1Kn@Bf&4si1$q*pft{|S7>=2Hv5q@8}rrS zAodlif=2(dj>?%ubpomv1TBzw>?#fk?>C{5b@5b{tf8ogw(Sh3xOn^AcOjA!U6jdM zh7%W4P}$%V`Hd7%2YTUMp(qrV2J`{o$~xuY)Fr`KoGV5ZC327lD>h6a%-cx)p$I3I z^tp>TWQKr*W25xQt*bA!P)RRMFNx3cle|Xgu(bgphoGtd<7AsQqPithI)_$MxVC$4 z>Ube_f5X*LiIBbiMm~hmUYMNTC40jcWH{a?uUaOqC^1~B9gBK%yc)i>nstTo!y8@u zd4(&1Y{d%K)W`ckX8lrT5;OJ6R{JPIp6tW*2fb=6?8U5@?3+N*hOTqI$QhXBYh6!~ z$Ah%6*S{;<3d(8`2Grp#hdYTq@e*;XD(h~X2^5qt+B6qnsAu^+u=|BneB90Vvmm27 zVdVSLz^Ir+RfzLmUZF0l&&YD+f+C45girY0mPCMD^{V6DllG=yhm})ZIF-$$nSY07 zmp|sM4!_G$))h*z-r6r|Xnr`scyD9){nZ(yW>g+g8YWjVL8ngR)X5#cfxm{Px))o zTwm-`ri`P2Rs>C$JJ1?3a_^5cG#h3zBYYpm4$lBH-Zl1)Shc$hhH`Th{yd#Ex?_81 z-i2V`@FULgkm1&*;Q3~ElGo*-ore3R+D-bs*Xlju3wR~Ri86Wya?c7`o7C}oB7bhS z+(nJ!gM^7Uid}T+QscaZQRqMIXzjHO4rZhG!H+E;`mF`#eeK(vvVLpAQU&|ktU20d zs~)l-(imIG;g)22F?-*7Cx(Lge97UnGS^+5U_A18?ZrT^L*3wAP6`mUdU~#OdtBaX z#nL5pb6}5M8&MZIXX`Mzw-s53-uX{nsSB{fcT0wbZibexUIQ~g&AJu4iA699>kDRD zA7@~bX1GG4NYQ8zJ@*u#A{Gt5u>HUd!ejS+zG;qZz#@l+hNVdiFOM=kiG3n33v3Tp z%#sEi^^q;5+q%&vl_-`;<-$4#3n0>NB5SDMd=C{buUspF#fF`dJVoZ}3w-T1vuA^~ zp7CXuV$dmTL0`jfK{11Hy5@7keHFb`=)(68cg`nVh}r*-zSYtQ?vS7_AD zswi!dFT+@MdgQB)pE~^&yKrvGWv?C5^((k!9C1k$(bFL1M*U|eYZLfJjwV2~x~Xoa zsWnlEzLW8yu8!#<9v|58Z0=LdO`EZoF2?LMk0QL`wpQ`~LbH zz6r5XM)8Z;uj5kdV`7$oa|L)gRo}O2>aFp4=tQ_Ly)D^gKherQna^ZXj0s;&)e@4c z1GXmHyg5*OaNKT_4PPNr1Rgk&nchx+@_Ko;gN6W(UG;_X+n6g)`MimaJ{$~_$5fE< z6@G>*5gfg!)#DKit##w0ZwLY(4;`SruCQ^Ohj@f~o7c|YUB5;n(U`LWIeI%;wR^c* zG#ZoVe|8zALltiyA&#Cw=q06QGkp*we7wL%CHG8Ics+BAcdfd&CG#vCp=QQ`a{&nVt;1emhmnEJ*ChhSRy^I@=U?87^?rRxs{ z=dTO~AQ?nEuhr^mV|%coUkASqV_Vf9jG9sv(E0l9_Oh^nrhuO`@;O~Tg#ak$Bl~&b zG1UF)^adW9CKL{b-eqYAYzL3hK%BCJR}Uxe8zHR&dKq7rIC|h2qNC^yB4tDuu;x70 zGUT6Cd^|1J)FxSmA)L3a*L{6Lba9o7_C7Kn9RHiHtX;R9<(z1B-zBo+v-yyZ#bL5v zDcqEIOt0wCyz4zVp_?oTb>+?R=i{5tMc!NvYbwjD*jnxthYuWjPfc2QDYKuC@hei# z@vXhX?;_eqGI%nGa4>82oJYxN6IAs)GLP@qNoUF1Sgkmv0qAzwsq>jF}hyUq6Mx#NSo?$~%?iQiG8Y9AN7#oG)r)41+Ng8eECx1LGtm>FbflTg9*H@g210ovAzGzavdGb*(YyeERC~QiPC@=vxcx6&Xj)gC=Gt4{LIJ zZ$HCp#kKS?Z32NarVTqetbum-&_}`Ym0g}88`~ZhOb)*)b`;aM>8=Cge7vtLI|fI5 z+5zdV1+|90O#Q1^efKDVeJ$~l&Tvh3O(llNxth2vnYVG@-hPph(LJtDRNT3wMy#a3t`A^__A^stq(TtN{78GL3y)Vwz^hXVW&U$A%6Kcr~=|_p_c#4GqP9qdHjFLk0M-^FsjzK9*BP>r%qb zw!JE5fe+ZTXN0Rq9ME<|3oWvSTyDR3(lm~IbJ$u@jzeSB_bF`~8 zJULh;I}c7SbZ2;yjUwlwM)eY{B$E`%$NFd+S6{UIT2KYA?aQ{<#GKPW9&5Q0&xij# zKXL+7jd6(69&7%)cwVm({pxi5w?~x2@D7%%VK0Dg{%x=$4b~@Yk+ViIdU^(H+;7S# zP_miTRv&Hb*eMsYda`=1_zRGFT3ve9uV<@ssh&zF4>j56{Ykc;MA2+%h&Z=4-!ic9 zAE&wk(10pdHWNO-Adb0}7$OMs_js>Ss=k={-Jp%ZL=evV2W&H^l?VtF`1&%XAbYH1 z7ddke4g-|Rlf`aRKJVanJM4dvns+rk%~wiwCCwtUkfr4N)fwL#x(^{z3XNH>Bt`Lf zSFhk)ww~7b6_HWqrR38??S1+Ce?HfMm}xOijSC3gR`ms4?}s1$0@s~>jQ+uF7cv_= zU9ah%i|7sdlauML_bPuK1i3OXdl;l73hAAZ@1>vp_IY>uJa2~6T(ct=UMR+q3+yDR z$MOVp9e3BAsi&uioxvIH>&zDrpuAtcdN;Bs>@bua^aQPs05j}bYyar&>gF92{8N;P zk33_dcO>QZfK|5a#(tMJU3S~Vpm66l=dn6pU%YXto^Q`$Xk9ccz&=fvN<5& zOt^;bwN1MFW`b9g?GL8T$qK5Zh`PuNobYIV2~Zq&>V#(AQT!zB0*$1XoqfWZ`Wo`d z!Rf$vnUsU&!;oknWvb{o{eC)TtS|C3s~-y)qfF)@%NSTl=5 zS;vn`1i(^MZMvtgj@m4971mR?$t>+>Y^3p5?9NQq zhPbAZwqS=G`WVfhNuvsn3x6BsKdoc^Y}lES2xsrn`n5Ygg?)WYYAT0d=pzbQ)IlL6 zDvajJ6Lde5c1>@`@Ps!hEawq+#xF&ZEi25+@%>|c>|J(8PSjt}XO7Kt)BdE+rxYWrrPZ z7ylOvfW!B_mgI5s(Ho)P<=Sm>k4AmLhK-pZdpP7rKPe`G!IfDmV%jZ&DL{NTd=#yj z_9V2O|7S`Rg}R41gGkk*6*}J4yK0`fET1!a{h?F%m*!6opZ1GV|79kqXTF_}O+N@w zc%)HA3Q->J++!~C&k7>%F6Ck~@wgB2WP-npZlcQ0dvm`0urT^YCU70KKYCyju2E}C z!hL6KUxM`xO68R61`8y_+iBE4rK9cZ2IviyazB~oS-z<-{9P-?K>Gko*~uF?5yh%k z2~zOh#Dnzx^~&(zwIILyY=ALMfk^R~rTadErt7Qrb#qHim~}F}vkT#RO}T11J`^Rl zs;iIRsV!2T$~R6EbO`Y4OP!LY+$HFg7=FB32X`WxFue)`)TE>DU2P?Om@-<>wy3i zv?5-y<>}r7g*fTWtbx?FGjYA{9{^YR&!}SwX4ysqy|L(`m8;)A<@R$dBffs+Q?yq=;6^=-iT&|DDT3C=cTng9lB#}bFEUMYB zJ{r8dH8`Fg|8yt(S@aP|>b+Oim{t})bGJ&wG(Qjn^aYLXW$UX?7@)@8>b7oLf~}_S zWyaj4QVIHrPjfVH8w|Wh8x3^v10x(_v0&M2%pER+_}xq5fg*Eh=*O1e1aRgoaC?2e zc;R12#W8?PZ71$aIfDyG)WN;7^-$V}j7;n|twpP;B|jbpkeyPk`qIA;1jkP(W+ye~ z?&}2`b&gfU`-aDyO(0-5uB%G#8JrMTK0oZ-#wdf9Z0Z^IZ0_wTj996NEo|$v1KK3K zx$jDQ(t2%PzdQW!Csz6}^th#$bYA`zVwDvDy*hM{X=V>#4>+M}<8;PZbjBT=Nb$we zqcgZ@eNq0qDERU6BSZT=#BS6qsZV0~!mh380H3t^E$Sx!P~lxXf_uf7ET81^0F&JZ zH$KK#g_j>3*WK2u3r17BuM4A5gZkZmHXX$KZ5oHI6h2<{naN&nUhPYRQad<{#Z}YwVxB?`?>kKnyhAr`$9#J=tI?KTr>xxk>I2Qd)s8P`O-5U)(eZTq8H%b0zCMs`4qW#*8e-C5 z(C;pFS6_9Ha@WQH!_2ZwjMnt7hPPjxPw-}}4b0ylh0=H2_5rWAYwSB-8s{(L7sF^i zwMoZ@lRs396OUeWz${hqc8lJ#R=xM!+UL|CNq~Q<&n>gc-oV8-&AuT86lV8hL;`cT z-BRt&rG}6jZpWj}S+hyeRS(>OXy3rSQb;u zsQ3;WinR>i6xA}`12ET)9t^SY*oyf+L~Qol0$`rjxZ z!;_iLFh?l)=EJH2faizha%v1Oiyp*IyPs?A7phaQ%hIFnq>Uf@UcK82=W5T=K@}+v zw5j;OQ%u#X0V4t7H{j8;>wy)m*N(=k{JUu;hax|vr_S?!*e zGFdlFIkxn?)9f%iLCk)BG3ydtj>=0*P?52MR9 z%sk7gTr5GUS(oES#eCC$NLAlO+nv;`*5ZEva{oeWmZv^@{+(|G6Mr)Q02u$ZN67yZ zyNHw6x2-JC)fK`|hS*vypaPaw)?damnN?UG1XzClL2qnz#xOipRa6{KmpMThRN$3Z zHtoIrHbxGd9e1TUZ2{?JWz;wSywqjKTkp()lv=dU-fVG8noY)|zu~}iW@Y#ILbC+| zy;@Kh1$*C4nf_K0-Cq>aAl-0RDa!hdC#P4_yJ;3M1_@mTk)3wNaOuwD&NKUj^HU%k z!~g!#lDO<2-L{N_%C7;|`M`yX*{^EVX~D$hwrktMl?zU2c7^4+lkeM85X65Iph=Zf zm;*6?{=V#)#&Yf4w(L>?1-QO!}9OQx#+i(oJ8g#L zr4n<|mB>6arGBbrLJ#_BiOt&d|Jy#3LUMp58I!_=5*t<3H1M%*lAia=%F2}A|5FtE z^A(#eolkFfbmPge+*|MP0H&aze;TYG9hK|G69yGe1%NS}qZ>Bw?Z^A|v$N>zuIzu) zH-8+fDPbH|0qeA1^=Z-33})l1CBSVl1r?Pbi?n%k_bfl%8^!T|`d@#2O)2Bp6zx68 z?`!53uh>!$e~qiDVLW!_Mh*^me)a}Koz1&U($fXts1qS!HaT^0q;IsWNeyeb3k^U? zU98ij?MWdE$9kuYmFBnZ%!lBHTZ5S`g&HT;^jr4L4yp9AmF$xLFtq>dG4W~3hKYJ2 ze=~J;EIHX!$04@16>f+9G!ee`UdA8zNcwC%)(8l`ELr zHX=CwyudBX+AYGO(DwHpBxX+qlg7LR3^&kO5a9KHzPYTYCL{<88fguXMM(}Sp4Vy|%8AaP0Gr4#bD`4K!^ZPLZP4DBU#bV5)cBt*3K;273seN8V z?B(F|oTc+>4jGUe_d=|$Jbnty8W1hIf%s{}$+-=HiT{qq0mC@9jy1BU{<|Fq(;F9J zQ|E~52xU?9aTMYCx)Z}kCv&tBw!QUk!6oi9Bk?ZV2AhNEwubM=4JQTorKt{@P7zRE zIcjh8zu^Hj)>33bR*N#6hho)C%+2M_xGj}uMS6R4_ib{q@l8Pq9fcX=_LZ5ipPcmc zxEh<*>G{5C{!I53syNo}4C1NQrTu%iI67V0RQxO}tI7%s3JQjbNlSzOCM?_+RA@84 zHeY}1%kG&muucWq)z_eSyspt%Hh0dI!yFs~<=5SUD$fi?Q$E;^EDaSC`u<9@@mR*- zOk#r4)LRBl1@RdaFFZ^tzTS3YING(PZ%l67>-a7UrK{g6z!YZjD6aa(n`k+nL(K8@ zdXQ45Y&P7GdN-%hJ<%L+8qx*`J=61w4mvbZbOJBm+yYz4^P5`o8Iq18+q;~xtz6so zS)8#x-GP0kNySXxUWMQEeVb2&|9Rfor4_stK z&P}b3^#gUV5;8?`R6(tU8Du5N8Tqw0xrR&FF#|Kl>E*h^Zfusu_d*?t#Tf;kXh5q^ zG*IZKU~W!$c^1y>k-UkJN47LSp(ldwn8P?%uIp62**zk{2K#eTt9{#%uHSs-9jir4 zVKc9-?8!?S)Q%0D&7Ru@7ra}oh1-}5-m>hl?>u^Uh4%IT9qOI2&fR-R&G-}>`}^ef z@X6z6P;7%QFW9P7*>EeZ*^XVGq6t0UfuLYHR$DPUen3`Sx96i(2`%7tk;*kpaSaMu z7!XxyYOMr8CunL;-!>s=*=M%gyBD^_N%D97gbwqyfosalt(nlU$`AgLUwn>Ysbxi8 zl~{k<9mATQAR<@%e@T^`}bt?WXX}Ag5v`N--AhHkv&i*m`pag zD*FGXe-C9$OiUnW?`}uOM|wBxV-gdCdN&~Smzy0TaM@4e3T^GSIU)yKz8~kSdfpxc zW_MtAaAoX%yDg=0y?QIgf_c4vf>24ene*YP9y+kE^O!D5!_G?Q^t>(!`@20%jpESN zUtL}GZ(Ts}x$tErrb-A4zXzk+;0%H$u6t*$2S9VPR8nV0EA{hpnpL+7JLiH2V$^|9 zU@@JIoN4V)w+T~ixDuHyj5A{YW#m;4t%Q_0g=U)+rwh!7W>D|k`)JInDW@>QJ)6Lv zi|gAD3t7J4jGUz5I4BNWvJ@U63k$MJAuj!)W_SE1c0SmMPVNVd^VnA^ti4^h8#xEwV}H)L>>^HUa!&?j8)X=0=Z*R?m}j zo{bcLPC|tpf;q1~M}U{>FH<`i^KJW|*Us^ou>oxkRS7@N>g-(z`T|~hENtp0n}9xj z*Nq#KR)24-u&rYx+cfi+FW>9UXsTMDD|$D+fUOQ}WN-*5KwCgO7#tQ^f7ni-dcKPz zQ{(9>8xA+X8dJlUgIs{kTwZwkybydCiYdh`zPLXg(=C+xd+i;1@z992oa7@CD8~7J z^1;n@fb-HdA4F`Hq>!Z7<}QXW+#b9ZB9WL9p0Y);4YS!q3caB(n10Lsu;Nc#$*OOg z#cKbRv$H(&*JRJKVnDl!Sy^?}{i7LR37grKRzpJr{Ibx!XzuDFR6VjeY%JOwA-lV{ zMj!;u7!Wi)k7I(Bn6tBk8&!iWZZVbFn=WmzA_P~%@`AYIXm$~;nXfnYLg%M_?$r_X z&mO`#=f2kRd$Rj0F~pW@{AF`3ZKwXVXz=qhZhb8V-8(88Cta7Oy;*Sfz#r}#1O#U{ zHJDE-=2wQ^2Q7;o2Xt@0`cNzY$G_8M_}={#GJx;bodwR%!}|4ROV(eu28{2vp;Z3O z4;qwH%Kw?w+1Uv`$~(Z)SmWuLhfkULB=JW*J-r)sw2RL^GQ(~{*k895VANmEn=|qF zGei|FjaJyN=l1sYiXr};O=db(hcG$WvHlBL(TPSG1?&}NGrkSjP8eGF&mZ-((BPht zz97+JgnO1tv~a$TVembghD#Ft)8H=0%f^jgd6?m!$Z%z}3n>OA%pt^ z4e;QN3e|E?$$vfV1rk{5T5iOf-KC>Gd}%R94}B9M#sgr9aUs3>YPk0#{q(b!wBbg2 zb^Y;}hjh!<=5F2#ER~~*e1=a<-tOQS54!i84_tqt?C0qft{-A!rVE7RXt_b}k9?7U zU7%%H>oGTJIcPIUNlN-k^XK`=Xb0X%PI{R?Y&Hj8;+P}yoIrdEstJkT5p_~~ThvTX z_QY?yT}`R0bGtgs@Y%4Xliff0V68y28(tnL*4}^JN#TM?P6?g5?}<;{mS@6mq4B9x z3?Hn(bv2LU2QK}VabmNK?%;J-S0Z4qF=C$Q-Q!rl3;RwSQ65xZkd~sVakYdOBDk_H zZB)=fF%2Wvk#J_xR$I~m_}+@Fmkn$6v0%VHu6~-S%)N%l%H31Ns;kdfrV@ zGx_9!QKqkUqS`6gIBcf$BLvi6F5E6iGv7yid5p#y8x-(?vpPYkn%*`(`Ql(h&A9_{ zg3atkkJgjxe#BkjEcOX^CH|uo8MufUsc&;s!xs5%3g-RQ7Oxd(QFOFoK9n3# ziS8I(PWeK)BJymfT05@gw5$-#$X13)R0*|V4fpUSZuGKfTqjwkb@1vwc6G`2v5PgP z)+ld(6-0QoEuc7GK}$J$&G$`ztS)KG-shPq$~Qms)S#D=;fu`) zHENU#*=^{?^%-8^2DSe9PZioVRe9d}ljo~dzu@*kiHJz+XoDpA>u45KK1ox(lU}X1 zkIW8;y~M2_ttDoLnb`ua5-lVpYE@PLDmIv;9(9Q|p8ub`l)#L7uS$uEcN zFWhl+u?apG`l4;(Tc3A3b65 zDK6Z?#o;oCv(0{sKaUwIX57qF(IasHVRWo2UvVzV!P9-1iO^K3yf1c8;LsBPLd@cv z(^zP=3F_;;IgCq_fCl7Kr?lx#aq8#!_hKs)9izut2efZRyd*}CsH(BUKRk{GF9hwo zCj0n4i=0LIuk#4Vno`4AxhZVJXr<&XeDt$ZZNRS1^RVEF^gjd{RI^^ZKE)QY!~$Bxa`YT#TvQ*@-!;P@h%wQ@{$ zr+*@>t-ZGHyi?Uz`Xf#1yR@zAMIRsNHTu5SQ!>$pau;OQvvST=sUz!~@*EEK_%W;b z*fcdK*}b*iIq!(_HFKDohS;muH-kw~tEJ7yukLuYOg{UoL?3!-iTIf#`&g4Z=4V~= z&thF}HJC~Or#AJ1jkWQwvgOLkYFXzm4C|lDf2dUEyeG@ij)?gdfu8PZ z6A~a1_FjC8Zr5=+MM;;1q5p|3EB$4uI4$K`u@#te|A1 zWs@T@S-|*ho0zyjSU{1C6aDeq#j64(rhvbARoA#?1(}KqX!Qwj$G84adpF7Kuqpif z{9ND`h!xc3Ql@A1z%Tj0{c6okjQ>|A{GX4A^|uMvr(iv~jcHr*F+30{mjz{$uH?I~ z7Hm{*qb6m9B{yX1a8?VB?s^n7e(089rQ5} z-;`Dw{BEgc2@|H*;m98@kSaQS*p#Z3_K)vzA>;kNnH%%$roSttc?g_4{jyt7@bM1n z7nc7+l6V9fl>Uz&e5CJ`XcLw!_fzt4i8(rzAIW?_R3gOwr!=$Iv;|Ee1)VGm=2N6 z=*Ki6oAKdOhPWA(kT7jpl8xQsk^TU*Zb@v}fYE$Q09FZd(<#{!jn#d0s_-AkJmZsXHVRx21^vpT5DQ~>bHya2N|sSAJC7@3JS4|m*&RpfMt5t4T4&_%WNGFV1?+aK2Z&bW9+{=*O{+K}qk#kzqE3)144N+nKw6+f? zC3Se9IEm>=5c{mXKAVKlZ=k^#A>0%vnokX5gUp|F>KfLuLUT;gMqgYrNG8$*SvHf|99BE1B?$}>n~3i_9shdeoNlAA(i;& zs?YKE52u^PCmHlSa?>n~18Q&A2uLJQWRFy{ya4@fpg!j$a-45g-H&aR+up~bskVk= z<7)9N%&DV6s%4cvE)z$fcz_22bTK;WsoxKza6yAzx)eJ~Qh+hL9H4SNC~_!py=ePx zJpL;5ta-oNrbV5e;PBSgWaO1Rq@m`*uMmxQ2Se4gPjSvKF;^k?baw2xCKH%)&6rNm z0d2HyEq(QairNxa0|M%o$|FXbwG0Hu8c*0z!#ksXSH}}fJsM(%SEIf@taWEQVw!IP zoHiyv0&e>6yBMySN*|t*oxjFc7%%bcV;01-9q~N9+HiX@RMk*d_Z@VF-tadu0-RB1 z15q(eereQYE*o`T-WR}`sZd(lp9yK`PhGz!jvhr zJwq@iJgp4q6(C9fonT3{ac)cPnO>05Si7Z?Zf8P6cT63!qlN;E*RL^jX>;&B6utSe zIxA>&g|13}o3y}DG75jkmDRQo%wDn|>7?->;l4}tl^M0R zbMw5?6Y={Tifesk&Ow-y7Ow%>T_W+YBm=pgmHABnW%(0YDz3V;#Gd{9T&y;U*l&KJ zSyp>mA!Mw7uM1GCn&PKMJ&DiOWPFyZd4ylCVmtR{$V!BN$=yFMa~qBRAEVjy0s>@? zN4mUXlbfuKPkQ7(f8%yZ@Igk}8Q{pffgoVnvZ3wpgDy`hU>sX>8_^`>Y-5+;YS>RV zeP~KKR-Rn5Hkf^(QBUQ<^(ls-6b6ps#9&QZhEs9vKvt)R#SO2f-@-%;OcsvQCzh)^ zuGiSnXq+S@LIHUpu=e^;Dgfm_^U3JU%^Q*uXZc3+v))&e_b*g@Cq z1E>N>{e*}WLR)$?7PG-n(b`;j|1AvU}=-YfQ?eMg3ESoYno@caN@SXvA^!Ys0mXpbjVW{88wSQ>B!MN9P{i z5k*r0aeRuSwG4x;fZw5JcT_UmW@#O4RS!EK)a~M&?@ArGfAhWAZ5xSx=KHFi*wo|O z7mJW-E(%--_8C8M4XdwkMH<^#mgEMyw2#xOlAwFOVw9;|%6g5fBTNma1&!qy=$lBN z_Qj7|F4tBLHv-_C)T;(p-BnvP*g)t9)QRLxX7_%rHrz(7U|oJ?vxqPBke(5q_ALzB z@kg1u)j~)1DAFa6mce0jl@YeuQ5Lj%M-HBmkB^2KOAOIYR&BV~ToI7@ZMRg+V-=p~ z^l^qi1YEW(t$G*W78_edqYC_5s}(AO@q=-ykWm&tKj>^8k%OZy|G9siZp-R#R~n9d zaO5t%(-mP#@%54O| zFJg1Ibk)a)3yLe_NhHyJo#zXC9I*}qMKt-N$-jf~^(%ZoDt_d?)6^=a-S!FSI@rm~ zXak?@=ne5+wjZk`w@gjE!_|GF-F8^_iT6p?O^5HtlGoeEUrXN{G!T*=03SQnz8{$4 zyFlMc-6*S|Xqq8;EIcTq5RB_0%`aH-Ypcu#V3_~H;;eo46g%R$FDN(0~(v@(mAH@_AJ&#+zIwcaBRXVU9~Vl4q1 zAG~OQt+bX`xRq2B;J?Q7a-<{Oat11FX9Ou`L!YJPxf%I+xchO#TCyg$+2W``6S?za z=5+U43ez>Vx)-eC_j-$EHC1J9vpOlEqgq~SdWUAQwZ0_d{PnR&NebjV43+wdAK=(> z5S`TOPq$#!hUt8WEt2d%ee!D)2l!mz9&y5|%ns$BJKD7*ICazMHe1h{(601Nqb;fix9Al05MXR4@#2h$(=aUMv<=c{=g^e1XFs{} zay&KGULXc)+kLO<+?F*u5Mz;*=(A>u&0*08+?lA)q9L(72BTV-<9?(uEB3F^H+e6$ z|9Es5K8{{OVQFrRv0Je2f92~R+9HXjGW+uN*Xu^g7}TD-up+U6CR*do;_uB(o1(Hg znZZia-CH?BXtFxTUbG77naDg|9G6ClNmJ6e&zv=S@zNXlgvmzOBSKLlM28P10|)Bb z5l)*q95nTe;|L;^ggdM={3#av^7dR62{+_C0z|~r-okJ_Z#(5~^{#cNzy&|1sviy9Fv54?m{*RqHRLocJTL)?g4m#%pl2D8jzy)cc2C>PpEg zSA-`t*b;8l9^=9_nTtW@q#{&Um{nWs2-FKVa!a+GVT0viW-8i@5?0wH28FoSFnWs0 zl^ZXY7^00+R~2UqAw-_|aM3(Ksi6m+m$SJMz9LTeA*a4N^2u-49k>sXA_3p}-JDi# zKD9t6ddFwA?!teq^<8<7{Fyxm$4JB5jhaZ7rcKftj72rAyWLSsIj* zVV&ILCS2>Oc-~Tau%Y1+c!V`FSN_Ib{)jqaDD`y`A9mr`yw!SX&cFrWP=&wCAWf0K zMM8~-j1#QM>pmx%H8%Q_>}Y}U;fvUj$~Ak6czs_!!IG>(*SS?1u1U91#T`J=Te2U^ zi2MX3uer7sHO4#FY_5FFkjLc!eZ>BYuN;aZm$XPz9EqYnE-w zJ-vi?hltaIQ%W1$^Fo7TR0VX55PMzEtd58;%*U+e!nJdh-0H$Bl^PXm6SKJ4@}q8P za1LJEccFF=6924a{@2^*qGLC=q9)`}OO27;p3Oo^`nRuH@x@A|we7gRg(b05FCtbO zZ$nmD!F`7tC1sa8Nej{u;i~>(zyYZUbp9OTpMI3 zTh3>L0F|2sob?tEj{wS z;g*~_tSSC!HOJLT=6Fd%WLXH@0w6>cIrZw2gsi|=jh{1PUUNocZ01V;Fj;8N{LdJ`=sE0Fc~@ftjGhg=k+ zkP*!a4ogSQ$!U=i2!>cm#{Ike&p(ECEI(#N^_wkqWiLKXpmAx%$IZn!v%eb?QJ-3A zeabOKI2rPqV44y8+gUtnFjM(T?=eVt>0lXlDA+SYM>?at5v))wWyedk9b zrvwLiKJoMOA7KB@HT~=2`$8hTrlyZ>F8eVFSY&#~#|if#pFQ7Jird=KPi@!C&_xWU zNbz4^>puQ(b;le`w$fCNkB_%|pxJeFR$k&VdMh`tJ5IqTRa0Zfq;Ebreirl;|JOtY z-1ch!iy~*X=MkspUBFv+^&Dwl#JxEF6`{w^HJ&>NxJSEhLd5m%zDuTa3=>E%ovVG1 zdR>E8QawNb0W+QTVqI!v(u9@oVa&G6^Wl8DIx5-LE$W*_h4-mQmLA4yrg>DIJwAh- zme`aEx#4w~nfpPiGjUaS=35I2KTs;2HqaZ%=uwK9wEhB+u903csNL+%5?f=+%T4(wAK^210)(MUOR ziD|Q9=SH5(L3$7f+NRLkF1#u7m6)VgzVpyNu~k07ok*H?J(k6HlDR-k449=zN#QOH z-JB}As0`jMYOF*`EWM*UbFjQk=MD7gj=`vo=29c z4zA#OJggCX*=S4Cju_qyvH^Dh)wCRc9&81{=5u6afvIA z`7LWEZZ^#5k5okqp`A$J4WglVCnwUq9zM z@tJRovcD!T89ul1NyR~Kfs+SV|9jQN}; zEEH*>+)M3q_$0z6V$(_IulDkLbQv4wIxSsP>=S1T+oAH8iP4{QBa^S^ZO8iF=(I!RZGg;fa_K zTb^czzO8my_a720FhShI#>ZS3CDBJv^n9rLiR!4wAMilPEbqoMf((?GasmF%7HWJm ze4>v;hrpk7tI*%cb0-#bw$BX>a{RCqf6KT>`;#tAhQt-i~YK z-8=Z5X(Xvak0r*c^in3i#*C6?2xKB;9AM0ro15;s|CxkU72^^85 ziIaptL96O)?fsBssnSXu&o10@XJx`yD5kH`$?*?weW*;>+Bam|r#84=en={!Z+y)M zkh<?CIvN2~+Zy$__Bv;uaD}7+9)ISL$&5K;OtlHRr1yI%i zkU}0drJOP3$z5ZL!COQl%2Im%3E(CP3a zPO{ltSglN8X73O$0>tU?uSHcV`Id$AK`IH6_&HR{?%sGR%#H)w3s26U_YbF1I2?$< zVfiU5LBtKaOuaMJiT|@!r*r`Cq{h<^GoqXUgdgIz-V+vMENY{rg|`Kli^9vaK}tx< zG)kk&0te;m^th!DhQ{gF%I2Q1XLo=KW@(|EYJ&`Vi@mXB^(C3QMFR|m8!Qw}`K-;J z*I;RkjEOws=ny47-YexY3cFxAb2x9wFvZ=QuK?P8&h2DT^M5$=%I(duZ4F)n75MvreVOm6(DDu$mQj(G8 zWXolyd0&j=rqAOL!+v|ZCw{XRxR%wQ$;{t>JCD%-w~;~z)=Rjg4~liqQ7E=bDKxMz zunF6Yso^9XZ~mDB zpjEEaccs2v2|q!x_)uKCd^P?QZ=i3zerF_SHJPHDLk*(_bwn|@D3u9~h=~%oMt;b) ze%1a)(1I8*34WRwqF1rrtDfVc4=q%*gAMlanxNW8xnO*!y*~te)W7?y)S2V zX8}0c-GI2%2cfERs*SCyRmj@3Ma@y%mIpk?W;oWhG2V;Jgy)6i4=m(wa#=d~(RW5P zEf2x9Dt@4d?Y3r$-FLv(DPf9__5q=z9vgvTLDL%?gWSO<8Q0QA{{25Z6p@fb$_?A1%i;D&}6yWTp6}Obq?#L~YM{vP{J#*z{Q|F0dmFgaithn`q zTx$Sf`scE6D|5oH@40rX!IM9B9}uk9)nI*+ljG*ta=Z(TKQQ_Mbxp0(4;FN|m9ZZ> zz|#?xp?9(!?N_>SyeDMCi}!86U3v6V?r7+xqDM)L573g+E`)-YB(!v_Fd_TkFjDMm z{fcWC-riFbfpZ78{fhS_nLda(i6Kj3L~q#Q6pw}e<%fjlwF5!w3F#ht^?7$o z>=;F3OITgem)#ZA!C(eEBcK;D&LXe*rBy$xS*uOAnq##ek0boNbKxGQp8EjN#=;Zx z@OU;u=XuV&9tAj;@!yVGNbLt%(}TQHmQx@9%1EwPU3%uZ}bO&Tgeou`)&HiN*nvrK{V& zZ>%CBGsv+SX^bCFsuixkHhqlyxN}_ozXT&fi{2&5TJ{=e3F51Ouv!;z0NT%rc4k*; z4ml^rUXBYcv)}sR23Ps6ilD5-G5@U}s(_A1TtmTbw4Gphby?O{MKAnDp;lPFH)_5z z!Q~x`yjxLdAe@ZQfJoPu%m$6Ug*&^Y1+TI@w4Fqb7xvm$AjWReY3`%p57L}asOs%I z+p(p-RkeUnFTTt^Ty*QgUf~x@pfr2EbFP1D2Sd%tlzK_tq#sGTso=`2AlKq6o&rCW za9?0PzlyM|fL*qqqR>`xXkdm5)Z+dCUd~;$0nqMFe)0g9-vr%;^6e2T)eY2hYua1L zslaY7%TgCAQ;LC#d{!igTlV%Z8Skho>=LFSn}19(Jk+NV9PbYr*1+Y~ZM>;!wlYu? zpzZSH$a)`uUXDA1rs}9il~-}SX*r04<5K&4_$s^$gQ4VTL6(lJCc(B8_IRjKX|t^n z9#kN-REv~VMv^83e|08F*4jIebj+)4)sbE5SpSMy4tIccA|jgKs!svFu>_fRT_W3K zxDt{X&{1i*Pv$I68%i`wt{P9O46=Y4XaB52-t-06KHi+StPU^hKb8~V(i+?;`WPJV zQ4QBI3Wg?Uz|i89XTgDHi%_}kGq#pE1RALTK=j2kJAU5nI*-=urh6z(J2uTh`vp}yx7>- zSdjw?$+;Fdyu7?ySjbRUN&MZ96!dSyVab&)|EY`H2S|S%P$xFeX*OP;i>@-{p4H?4 zi#A)TO`b)idZ^t2MgDUer+^<72#rcY3ZK^i;4mh_mAudBWIE6JB%g!4j{)^$y_lL> z@`@~LZHi0>5F3>V_|3(_&avk&`G@1AKiPH}YGUJ;F3KmSdU^Ve-vh+~O*YC$a+{<{ zh5Ql}4@LG7@aAKQ37L*4u_;O+QR$Jd4ViIDFKajQs+yr-`O3-c)~ls4bl_F$WZ9;< zQ+@*W;HTZWO4KCqe&C1CFZGEMnwR~^bE2aYfTK7@yvy#6qz4OLQj_xbvzch9Cr zm#ZcVqzD^1Y`vNHGvrEqH|9;+Fb}bTi|<&*{TBDG(I}(^5UKP6K)!7Pht96K@P(oS zC&z;Pw~()$Og{}sgu(K9HBYYk;YC+&QjcX31wg4_OD>Am2@+cNU(_%`)%PP}$NIf1F1|PwH4+$plc|KzgS#feU zYgc_r-q_oVE_!Hc!RKFTNbV975PABp*2beZIWR#a!P9JrbE|giAUJ38r{v#16t)m6 zal!(j10K1fbuFDV+`m*K+a^6PqvlBymYlo!*oIerahy$?J>%Z}!^77PPZSyzX~`iM zAxP4Ik1IMuRhO&jmwzOs5A{6#BS}P2)vP(NdWzL;2$fzFPsIpBtCRgxZSm?4fkCV* z1Q`@z3wOXCqHHU(zm&F}p~Ug!<_QO#iNyTkNTSU}@d3d$T(vun>%9++nr`tY*|MgR zFjh)xIVCpA$@rvq(fu7umr+rROdJOl8;)&6lEIUNAO53=xlo2P7WYQQRJw4b+C z5cO;c5JI?n8SUVIuC~q5dz4DGFr5u>i~Wp-Sca>ng$n`^> z-s2Hy>flJmAoJRLi1rCdfK(GIoTpCRzi*qsYc5F)M}3Y{Qr=p6=h1gV7=(OhGX7(B znP3J2e;_9uv#lJ<^;ugsHFb3OBa(~*vr!oGBN+#<&}Y-@0Ee9S4dxo6m*1(rwl;R& z(NSDhf{2qdHLy?ES}Zy$FM)vN#BM9&I!ReskHc26CLP+BPPL_i~ zQ!%&k`L4EDJ?3BQ0$6i<`iAr_*+Z&n0)8J-8V2Wo_zd;QfqbfNO5=&6fiKx_!L_yu zf#3tPexUyl!Cyk$8P;Cy#6l28i4ea#{)jQu7s0^Se zAfXdTM4EIV5PDIhLn7S}NRSpF^w2^e`ECa0nR%Y`u65SC&bz+voV5;rD4IL_-uJ$L z`&X{(+IwFseR3mNBRS#sQ_2YOx9@N}uWvhi%-$DpHV}}$71htQX}hG@_EfTEu>Pti zo6md5_hJ{`jf8m=j-eD zU}W{{9}Yq(XojEkm_*<{+XbYSH@YDL?Rvt6*G6|a-?AKWaGItOB5sAc^KoLrrZjPF z3G2UkLoDUh%*@PvcOUYoC1&)qM4Uq$=y$_=j2~^VpQ88#$#Vq0Ti+R_QnE#OLzcY4 z>Q?UaT6rt`JcpDq(c^Q}>e7ec=V~Z)4eA1xmn6tO-q%15wInfr9`Dm%ZH^K8E`Gdr z@4>s6_%A{iRogc`2&_vq6oTP62N8!IM=&pw9ef4W73Bi->ffF??pRICV z7A{JP{qW<(DENaC!S`xK*Or1k5zg<{r$)JctR*m69}JjX6S498S}>mx;dKAz+ z&1oo8;ib~G_?b?6(x@azh}RBsW_WtPL8)q+AM+F!3LIN@8qTTzIned`!h`#=5pT%( z+l_O4-Q({kzgv#8dGZl9Uz9M?f4fQ)dEx=@Yw6ZgT&<~t9clOG`512%dcBk^$ogMS zzZbmpWRv~+z?YFSEZo!o(vPerk>=I;>V26r^OvQ(s}n{>hzr> z#RMf1sR5Sv>YA!`!7ev~@}E}tUw$O7b2;?jL}F9UOwu3xk9j|cdP`{LnI-DGyf^yJ z*edfal4Gn)^>n{H<~EU0XHFKF838toy%C?pjd8D(ePc}v0Kl`14==vnI#Us3b4y^Lb3bg8PIKbIYZKq`{GS|euhv#`Mt+|+42fs6t z(rl#2VH&otk)6PVQ#KKL*&5qEF1w?m)^6DJsBslQk zD;L+teqMpDKG>^r3-HZ6X^f^bpL0qM9J0d;UGjUUn_X3P#^E=qqLnWn zOqJh1X}YWJ-Ef8{aP+r;m@ne76vEOHLVi07GHCCI}3Xi{si0m0ZZW2+QRg? z3O9CZ4P$Ob$3eb&2HdP!TB4Z&m}T^*tBZ8WS25gdJRcrR4f+1wt9^YriutBZLC)UN zg)uo%MB9$}i!{T|XL0yRmU59MFo#9xmEp^`CR^f)+9G)F5n2X1MkUMVZ#-B&{pe+Z zJ^iO{8_{>c4Ibfg_^)7jR9KtR$Peb_$nCdrnpX#N>Ro$!Ty7VA^!lW3xad6c{?1pd z(C>ozkL3cHU9$_23BBF$>D2Ag3p6hF_IuK4FVA`MDn9dJv%}1u0?!i5S^{feBd4-b zS1KhyZ(-I^mx4*3?{ByY$f<0ccL7_J%hz1tPi{-Lf2Vx50@p7yQ)pUM`R2qcxetpZ z@{fvEI@ZD$vvqPNf>^uDON@u&*4Te+&>cc-yvb-1z~Hi%*{k$IAA_ zR7^^a&@6@2av#5zOz;QaC|ULBnByh$4E)W_wW+yW*SjrAbQ1V{FkHM(H}v_|dw(N3 z;VbYG$y+SIci+VU-#u3u+>zBRwz#cY_T{ zbS_;o`MkE&&){O$@-s$}rW&smGlx!QU1WXbWbF4xnh3wHmyyY^O5t8T=HE!x(hqwB z!)@bHqvZp^i8oUaFHRQN6Xvt*Y5j!SxvagwbK@x=_h^rh(<<$7Lrrbtz3W$GZ*Ftm z&#ZaA#r+UD{4BxX7bDReX5>SS)}QR&XTvf~qhIXWa*U{bZSjG==Lup|R`-ux?%l5+ zq*hkKq6Z?&+#l5KnxwAzolnnz0SEK^u}bXfGFITp4n~u9Pd^-UV=t$p>6{+~ilLqP zi>yg|7J{HU#b~ECk^+kr-(}5*l&B%-ck?6(4>X*exGOCf3^k~aqrZH^BK7i>%BO-o z0@;&_EO1`_K}m7_(MfsG`M#}Sg~9J8Y>2imd;&8RrFL#ldh+> zw36KaPq(g_z1LS_UteLC4r{acn`X0_eZl)p&TI=f?@t`q8AjVA!Js0Eap2r1TU651 z1n-+zDDJ)I(0BWURy7OwKx4+9WVhUyQs!6qBt5b)=EDIXnd^0YeJiCN&3JvkAIN?`96;;4P_~NS%~UK4ST;XTdR1ZO(f^wUcT5M6BHAtM{>nDx_HMEn z{Z6dsp;x=J;fZQ zjMesNSL>(32jm~`t5lBQaa+!6XmpcQ5#y_e-gwc8s+hYPS8yJdPCR1Y@?`J7Std9C zC)fJ=@$6e}JYQJc`bQBC;?Bi1I&a1UjV@6Ga|n`NA+@tye03$ucZ6WaWP0wx>N0=+ z!`+R$Qc+LPumel8D*m)y4cPrkj+@)7S4P*E$ac-ovvzamo<~KGR+pF9DQYLApy<4w z!zphl5EdbQaEvN9@FGg+= z&=a1`5tSN+>dUeFA0v!grQ860A4Z zUuo7flG69TpW1W%U05~d?lq8QGcRzI*~g|(l}hIea&WiLhoPt8VhreFzURf%>isKI zn5GW;^a0pT-nkyG#}vxL#ZJ^B3Lh~*QY*w zOLJ}==M5Phj}OjGDrPS}zRC||-nQ5d}i zY(=g&jC|WvWpuaf;@j4Vy{cqJ9Gsp6CGJCWuKkr3z4&>bFPO#%)%^ZSQ&{x#fs(8( z{pjEGDEpwa_w+5w%#hX#;A~2oJmW>s{lVQYp!Cj{x`{HI+PC~i*7F zta<&jQ|@l!9{?lyxq3+hU!`;(AV)oC?_{5P`4U)f_z;B?yRIO7^QKs1fFH1|BqUR* z0OZ9SI>a;g`R>nOjav&|xfJ2C{c4YH8l9JS-)Soo`#vW4;)2?4AJ)00+neh51!AEF0+%E% zGK&o_ZPbXXa=t}<`=L*$8YNK*H;TGcv)L7UE^(CDJ`q5Opmj#c`0M;SlZV%gS$)SZ zkDR`I?Z$ZaJE@q?8cz#yW(GO6yPat2>G>PpSF7HbX$~wi(kf*y3F@!`R^4cK#F5sLS&obIle~~ zm>JuAXA9SAEQ{}-rD+dbFqsGe6XAyFYw;x zE4YnV{D)raPm}m88=9BT7ya(b@UZF(?bNAL=g*)2^7U&V4g%B~KuOuz*~@?B%CmN( z{79YPo6*maNTNbyt1i{jQmA>6R97G#oaUz9G>mx(TAlukj0(g;PLna2Cv0i&p6?SM zuqo`+ZX7fantyS7U`8zcbaVPYdGZ%MIyK3Ha2d^x2-cM=rjVveH~fXT#?)ONJ^i>8 z&4lMU9se}lKW*j2uI*p~l_u>p!2gzX$rKf(ncxc?DX1NHbXxkq(2F0hFxSkPe{N~f z9Nn*l13do^%*eBw{Y?MA}j z^qu?X1$0lt!2iWJoySqpbUJ;0YxI%C#WWeGUx58io_bs-wTV9k4we+qP5pG1Fx8O$xhnvh z0PCNa!@tX3XGv*dV?Hrz&H4HB%X8}#N`lSLf6vM(ZjCF{F3upQ##0Ur(Jzk4b=<0K zpDw`4i)VudX<3p~QX^TW#0+H!Iy(^ZP)Hl{SZV!t~2jsqgwGes3!epJ_6E z*|Q@f`p#6PwcSh^AA6~@SK?>4ABN3aX%NCgk0eMc)5(PL1t&vif7oDJZ{d*H?L;vP z{m{>cZ1M(gBe`Y>uh(7OwTcKQR_>cS}W! zM+<&pTEq$5bUis^!EGSE<)hHmQ*lqa@2U>_BJPqagm|^OL3i#c@Ge(Hf;{v7p(!8= zE6owzJ_f#fXHj+??%uB^emCQF7*t>1gj(fE_4R5cMC}APPm{#d+rL-ngjSW3E{A5|CeglD4!Vg_?>8Gw6~cqj61VP2b6vI8N6Ye*&tyAO~e- zg5RxAK%%cJ@JCT)W98G!$~J;!x9wIc1c7?&i7i8|Ay$_1c4|4(wTqy+BFGGbZrspz zf734x#MydnlYi=z)GO!^zJQH{Po2W!pAJskomP~; zWF0ax_6I5`b&o|5<=bz3X{YJd_BVo$GLLc1==%P_LXL&7P)(rgt#d3kUHLgD-o9)s zV?MVNqV!V!=2xvK=!d*1;;ohK+c%ZIv+!*4<~?Y3`QpjUN%&3yxm=5T3Jvh+6@#gFYzo@w1W0jp9LVXD z`Gx44tg67g4~gp1`Zwjhsmz~?U-q#4?y=wHH|`n^`~s}(*baX2A}vB{yx^{1@m&`m z%G2OVbnS0t9SYH7WRKU^pEE~mGdr$XwfPrTc}~r3TDIfHX7B>rR|B|9#m{g4RwtaC zH4-NCL6soTt>*sm;sxzL7&pig8A9uyBZA&5%*_Mf`Q6!s+Z7DT8LhD>7s%lX6_M)o zvZTtz)|c?_{!2jo0oMWGN1E#GbN?vr;>jFvH$^_=ij?V+#V z#pL@@yz*ixa&>6ozm`wbyDvUxQc0X~z0;*7xE#xJ&nE9}Rc6l8y(@}$WbYA-4q?{Z-Ns(DlFl&hFO}(y4%G|IO-wxW;dQ zHlIx?^xlW>hM0#|T#Td6vR`6;ZFF8CH>P1ZQ+CFIWTdJPv^?yY*|_^rz_rYyV_RuH zzXSH+%ct(^aph<`z$=bR%^kj5!LIFpTb_sv`WsTyl|j_)9)oJnkn9HSVM{LnV5enm zweT-#`FCa9oT;frGWQ=G%q9eDy?&V^bYS!2>y8i~iPF6Unc%Yfmo1K=D20a*+u6IU z++p;VmJRW$#%FgK23OCx9Xy`+12uTd?8B6H3v;9tg8^P8WRpc!mHVO9XfZU?sqe17 zV^;k3xLw9OAnM+2^s!*(t~oOO(|(>@W6s%k@d3kU}cWF za)H;m(?Ub;_cEp)a?78sxi7*jf7U<#LwGdX?F!t;_Q;4D^v95ooIG!Sj0PdA8r~h) zAV?Ef$_l76-~d6&xu1ccjjB{DBtb4y*U{ z8Pl9fDt04DH9_Jk3nB3WA8kPf>fnOFz@mK_ zEeP3*KN0pl)BdfWg1-kwr)6O!O_v%@1ie8v%tnsyK3l1jGnU%l45(NT2c?L+tMWu2 zP>2V9BN;o><{NgP%u-Qk24mNhs5lGJ@A{HlY!Uh>%%2J?&Y&fStiJ?dOk;6>RKTG0 zeLfOP4!va=FWHus3stEn|CMn1eH`DH@~9+7RUt; zHZQMISawSF8G*2MK}wrGR4j;brgj~yrY6Y;X-d!y2otj%m;3paX?L#i&7{PeHla*m zp6A7uEi9zjBo3DOaJ0~6hN&9Wk~*P(V0!MmLz`J6et~Z1Lm&T2c!TNN(5G9JhAv_S zzPDyl=-c0KrbUd-GRVkiosS5_p@{**SShgi!_lvKvXDPVmWf{z(Kn`lKq{8~iAiGl z{okKw2_9W3QPK$Pb~fT%1$4{!CW}!?Y`zIM$hXwsy>_`-%HCe2jGSDa!Hra|qsu1~ zb%N#<)zlFE{U-{HZwj4Xgbl&Y+w9XmI9H`R`%R5SMn?9gN=p0roxXqg5KK%@6W{~J z>TJ0iUaDJUuUql=L55N$NJ!%7vvJ8WQjm>oTB@^{&k* zFYnGlE6SN@)>_F~9(~jzDImMa!^el6pMTb{eHxo0Z11~ytG%P6@8Zz~o{5@gR5di% z8x~bnY&EkCb{@Yyef){pfxWD8(Xe5Gv7X{4Ah_+_xF8JUcNs0#ghCm@1fv3DL*UaJ z=kx3(0LHwtx$%*Ibcd>CU#U1To~21yP`;6|Xip(gTB>a)Y_i*MqjTt;%Gq*pLIUE7 z_?4rZG;kzv1S6a$absiYv%)4hC=}&OIo`CicWrG=I1(9g+xljb)+KK4e0zz)dfwhe zY@-5yiM4rCh{+y(<(UfFW6FRU;S6hBfIJ3oEEN&$D);tRmd2=7%vv_Lj&2cHA|Sb` zlA4ozZkcp=o0XLn-#&Q2CrWjhRT{w!U*R;E$HvaiM=G?qnG|ls5u9hy-P!pH%Gu4O zZ8!$<-Zg{SOW@_tHlf2J1MDg4Hfl%hrm_KDHz}G{yg!+yW9)+laIDA5)|9#2ttFJt zXyJnnMa#f)v1qN1XrY-$sx7b!Q9Mq@7RbpsKSO9G0!V#k(5Xp;jo@rd)#-EJ#yJ)`zWMDIvh zi9WVPdpJjTA+=dXo8YgBNmERYhX%=5Zri}f;(;pAaz{uv0EYefqi5%rFlzOxhX=p>COnJ@E1OXc8}4trH~E0~AqZmhllJzNWmdUU$TT z9=WX0iWo^OXg=|GD%Us}o{;VRR%_}K7=(<$R)W9zndVKm;hYeV&}3U2Ocl5af z^r@pzYi@1?o1ZRM@Ap*;>wFnt!e5 zvq>qbXO@q(gP3_Z{nXTv%SMhzYMeRUQxs|0Wn-jgac16!@s$?ufdJ0S;E2jGi zYzSO@?A%MWI)eYBNOWn>+$x*BeV{}r(JX~PS~S|EA5EH;8Bq^f+zKlw9yo|6xcFAl6+mfQU9k5BF-$VXkN<+)hV@fz>fwMd}-u3Hp%jZ?)UZ0qlSXf-t^6*%_ z{|Foqu=CjuE_Ydp?z|V&c%eh1;-F~9flNrrRM@>;m@uqS*ik7fw=#S3&$gc0|Dp~o z{SzB@meu@LLxO&@|x8>(g@+BU`g zG{;qbW>K0=lAgSz^93M(J&YnC$xm@qJ%KMv*jF#%UxVR*jnZ*OMx7Zpb(AwHs z8#>!viAFmvr^_y^u7V!%RgDE+x^#(PaKdb?NooS zA^rETDHVA&GOv;+(ogEzaqXpOptjcML{Rz1u|a1JfryZik+FAOno%}C%g#;$X3E(J zWd1MyO*vUvS0ZkI+u}<5rs1;#=2hL^4YVC029bVd>E;UA|2V$08{XlTH{_#FuOvCJ z?5Jf7BZC%Nd+^#)V{n?RhJ+HKMr7|NYt3%Gd2d7QJT&O11Mdma> zB|=r%?Wd=&5gs0YAF`D&@z7}S_3OB}e8aSc2vahddthkDcMoIeAb}qxCM=U1KO9}V z=51uCr0C=5vq&Z<4B6OeR}GDh=GWHZbdG`{Q-`brxlK-9KEJ@}u5;D8sUNgN4w09~ z^}YU41Cu$6`4#JVd3lG!4n!xwSZ>A)D!2i|8zI{Zy*P zcC&ndpc&m(H#91rQ(i6^ar-0u(22CL=ai||h{;cc_&8!*PJp#GQ~dH7ieQ)OO5I<)8gCU)n>2dd2lqIOfoCrJWg(qaz-E z54Bh5McCOgwVm2xI{pkUUa{7xZOZq2{*-01)CU(0|7G6vj9VM2lBqM>M^j;vU!Y_F z1z2BBvgsHW1w?iJE+BWy>c-TYlxTs$;A5xlI##*x!viFca;Eld<0Qk+BMuBd(6UaT9Ncl z6fdU5C}F}}@q{Y3l!QasuyOUV{Y2?n%$t|QlI)*>fq3C=TPxLwM;|6+af(DD5eamu zds)~t&&8e}F6XYICmg{^OS90GPKPD3L#y+7F^%FU<1|Fh)n_f_?c=${H6^?JK#X+} z$kelt?H*+#-TyLs+v6Q6RIQO$r@;rpMzpcs6>_iAQ2W<{@RQ*WKS6E2pDy#A_As{Y{h5MQ8}a&y%cZV0o$irW+H_?=f$ zj49RuDLWDIeR8Sm#F_zmwInZaVZD8_%W9)ydr(T5l~cTT{1rxXaF>;99G4IShe(@+ zIq9Sb#BJv6wwlhteA1=lHto@2ZlS@<-C?;$(=1~sN7TczC{yM2Qo6i25KGPL{oVFx zv^Z{OAmZg$SIYzOy{ry7Y9I0|zFIXC9Z@}(>{15YX>7n3_H&`y`Ykm`fPQ3Qs5yg# z>;jK2>&R+SW=Fx)2Yt9kYEy9&8Bt6l&h|FB-{C+oR8_RIuJ=i|8}eS()+_JxnX^t~ zMTSWft?ufm?c^?ZHNd?G8)qFzU zVc{fgfRbCkQQO=g2uCh=4vZBW-wkVJYRWk`6d ze!yKZ`nT;RYE=CO4jZP%jda3(0=}n_$#+~_3GUS0(GnN6gdZA(4zLsGq22VPh=UgE z=uJ%tkq9HVC-_kF#%(wbuOj#=nTSBr)|Snip6HF~eE@^~LartPdxxgoxb4<6PUW=U zX(dRM&xh*bVjr`u>ZLgYy!76u~<+|)$x#X<-S*7q3iTk zp4=??CN{{r>>>{)eKZN3-;7{sDwhs#y~Y(X^-bl2yY}8)a)L36lqEhR-n9D=&Hg&a z_)>RihyPqHO4-|H`epm%leX$!?08-#Zg&{5sj3W%e|8zyu+qhIP>>t3*cBO>>}#bW&sth1SDi7K zSU zoQ#um`1`oE!94F*OD`3M1ccs>rMa^lh z-uO6dR~vXcFMqSU`rkA2PhKam`~_!KfFt6TyFZ@yAv}kpDs#p0$eW@1ZXB%Q+CQ@9 z%YEDuw}FK8rTI+LP&sZAM5@27ziO4LdXjn2PMpndV~j&z+?gY{ULfgo>M;O0BwV*V zI5=2XSlemx0H0ee=u3`` z<*5w^_e5~!IWP>iP4u>NwYfsj8EC%rq`Ygfa@cfuwG9Aqi1#{h#yHTzT`C^Ac=)T- zDu++&YFI;hFE;f0K#)COsho44uBH6wo|a@TdJU&+wk>=F#Z1bkRsK-k)O1Bqh_m<4 zx~j*tSV3SHzz}o*w+vJhhxM_bIRX79GP1pZJ0{*5S6h9ZQdTd-DhAJtr6^00HzLf# z4lWd|;t|#zMH?yxT0+Zdsym-5k>)y5sRWN@J^XW^#&FlLuoxSV+!+&ru2u!%BXsk3 zc^Yy1WiTku7{+h)Nly!!z!r;as8_`YOUsZK$9;#d zJ9#*1(%M*k4q{$O*9VCd#Mr<0z3XVLCb(Q8>Qw*GJ=qW2#TAhd^Rd5>F_5s#BGv^X z&w)p3MV%C(dK}hJhp{GFpDU59@#CK_w#7x-sRu77C+Fz9*`k?(JV?-oDjmk_BV@yK z#iDBQJ=5mr3y5<-LJXw6I^R5B&ykglAH*W!biaAJspvRJd? zD~`>)RdRUQm$~1+C~Pc?;=JabH|(Idhf-JucS=|)!tkBK0dkv9MoM*o)1}ibIb;NZ zNEPa%I|8jw%t;irr3RPUq7|yg2^r;~p+QSXG^sZCvLIJ@rbe~x<<2=-Tdl41wp#i~ z(Vz_dHgkYm*8z7m__N1PNA^AX-qUGxKojp)ZXA5Y&TiPWp%j>VU7umq;-M=*EesU= zQJ=m{7nF(T)l%6|{;wa;i7@VQs6g~hprKzpGxE0MLZCg4(Ak9MB;vskRQBhi;nmc= zlV<=*i|GSUHvmn`s2r14-2uerd%tbbn0^fY@&*V)d`FHO?!E^Le+ zj#xW5*cQKI+*~Lz6Nx z*K-p9OfJ8vNv*7L3YEOKwo3+QzYinNb+}Zm4~=sAjF^iiS4KGH7~jmDe$FR#G=eRs{H)g0 zg_5)q2<`{Qpg?PD>vTBwUWtizuAyeGx5V(`?)?jI|4jHF1GO(u^t`#9^|1X>deD=D zy8T`KQsc}cSCe4?AdKqdQQhGB2<`gh5jJrhC{1Jg((#0?GzK48F4NNmo&T++4KTR> zjcRGQ+2-=_|Bu@OgZAIVZ3h70^DrU*59HS0I9*9=*8NQ6~f(PJsGVP$@x^_-)f8 zuxc_UHxL7NWTbRGc@Gq(7A1(ybf8WN*(HUE0dw!(XhTrYX1@ldR~ma5i9HtQI{{#M zBlEJdUJVqSWpEEL^60jyp_qGvOCpV18a}h;;R~TN@hTO|FI9}3x~`jwcC%x7I=A!h z8p3l*9YupZIFQuen>KcAd!`|gQc5Flq~Y770w`A}eQ{?wsWSu4uy$8~2Jk|h8K1M( zZ(qXPaI9h2R#Y2Pih{zG%sB2Hxq|$BP0Lqkpp8NqUZ3h=Oo2*9J& zN%C%EiGT}N(PTXg$2Z%2t!ia_D1js6C^5_CiIivgvxqw$rjQ56pyNug6&}Z)U_)wjrl)B6+Oi#a7!QR6lLbX3rSzGZ9tKaL3^2@AU zRQ2(m^{ldF|JTfd+rcvUJDpsFA zxsT$}7ex%ZyPXMn;NIkAURSo%eW#CB0p2m_j$lP?g4Ny>5sg#wSW7z}tnSOF)j}-y z97Qm0APSmie=b(VQrpnAXFNb0t2=6)5YTAnt`yzs6ijog&2!M;h1O+c>{O5w&XYS^FgnC@cIXy>CP#06CiJE4kRcMk*Qwbl9>=-4Yebne7!iVaY^z>OC)JK zM4r|$RmlpK#LhWLAwS5SQff-~0gK<~_tXc)1AgHksO;i=%wgio(-Rbe@ ztqADD&R#wfgof&G$58uqFC-mdJ1q;&zwB)CfEL0IK};t%C&f+bc9QTQFhRb3`^E-h zgp8D0!$(k9J=h_#YJ76Ohn6Me_$gwj8XSrEQRmfVA0ONxw>QJKwCih-2X;$dya(2(4_@A$z^&C{9Vh45 zXEU)3Hz3sgI_wOi#4eQyp;8Xak`dL)+#_nKsw|e?>&l#S-K^0;k0v3zdb%E%an>fp zmhJeP#$4}0zh(14N>y#(F4;U_CzdT&)q2z#2`9+D!Ils+MQwLoBW>tb;_wk8>WWja z&zyglDtWc(TKE>Hm)`{GAzPm6saq*193fK=JyUfVB^RV@Iy8f?ES zAC!6MHpn<|J}_4gxgUm+z5{h*mWb?s;;LoTZWz`!3uGr-XjbWpt!J*gm|KyNQ5E@M zYdN+4#9E4Ym$u*g;e+~(n37Pg0%N1#J@~?c{+Rd^q=KSa@@v6i3-9p~131Z^-Zs0b zRwIT-@^*KkLKlKQ2%aF40}9XNk+Oh9|7NaLslaqN&KsLqOY2d^Nn2?-0n$Svug)O# zvXf#GNvUlWG4>G6u+wMO8aCG0tMJ3G$YeqvVG1bON3;8(_hIlj!_E!{%AAst5>4-U zsO=skFmN}u**1WsM<`!SS65SyBZLF*W7ETmLxE>rgby!;IZJG@;s*_@uZi<_&9eqQ z+FzprRNGYV-uVR6Qh$|dRX4lv1svpa`NqmpSZR7KaWLg3X|ktT+uBD-Y_+?Xg4MRv z)*i#S=zB3*3L4q+*CtqOm#Q~EeG_i)w&N1!FxrG4_Yel47eN)dZVC1PBeKvi|IXLO z_x_GoHWh8Ag!CWL<3hKxJL@EVd-P6#04H=IaI(A=j=Ys?R_r4UUuC zR02{Q*qGP5{?WQR55SGmy5Q0-#Mlt9sVy1`zCpuSr&`iu_>NN`V0V)UMB8KQLck0^ zd0}_l@yUS0R;LBKkJYSyDF?g{fa!GpzBQ?hjC-J6t`Jf6e7YVLs-d`Q`9b1xy`249 z@6S7MS&(+=O6N8fly1y|3YdA_n?4Lvp%}K=NpjkJMU;aB?Cn*`8sB-%*S?mqj*ms> ztl~K1WUb!Bq91Pzy+RhvzRpc;&*RU1sZOdy^NWvI@QzYb?EPCY#f*9&TYa22<{dUz zP6>KP)Bjd~)bkdy(?GWX08M+pYoS~RrZX2WmnLxXOjMy#R8-VpqrE0jL;VRy9jL{X z9TpoxJh9Hqyc2JhYp?cr)T;eiZp5-mla@zG$?&p!RRKQ1kudukjl{7`^vO|hzXK2! z-Fk|HM!{VUv#zVSv<-We?#@`1kL(w3!#DGj2WJ(+n_En<)%dxL@v%_iLX>gugSvG;1l zxmOPGD%GBkfY**ml7?-p4KC2yiH;QXGj)hpGPH@!n+V5g*S!L3P+v)NbEFF+2o+c&Eo+ercrA~Tt%oxRkft{!*x(?=zp#1*YhCC0H2&F*C*8B&Hcn9NsxA;$ zr4LyT3thc(KRpf`ABQ=*fo1yX;Y0*P3g6sx#d6O$$Xn!?An>e9-~1x2d6wr!t|1q^ zavR`72FJ%;(Ubhgv;q)%v__&c6;X;?TU(koE(nWrfyWfSpsWM8{r?00CO;SoRtqE@P;Ry_10OPDx$wL#QFEcn=t9@Z5hE0Zsg<|21|^LC(g zSNfAapK~4lDu@y+G7Yrfav^PS*AvYvGkIiSEi>ukvu+(Q6h>80qtp@NImk!K=4-UO zy5?$?L9~FFhLO{+mDbFJ*ZQ=s&Z1dkYZi)YsZ=84mCA=lk6(@x_ge60A4JPx7=b3L zYuwby62_GP0u;(iSd*`%#erY}Na*K-z7)qcC_Quhpyj}vF=<^(lV)70#;8hb+7Y(M z0ka-zUUx2$0AQLo>{n#%GLOgc!|2#0a0c`4n~aR_1d8pptj_2&@GL%L*_65QcGE!v zJ25EHEo~5@5w@=0oWa;kQI;mPHpdg|w${{;F<|SY3#&Yxe4+c>=;gVKWx zbUHO5O<7^=14m2E>d%TpDJhh!IC|Xv){6Es1WS?4u@6hdEDBcFh6inA z4O55Iizo#sB}yr`dv6KfZXkUPCQa$LZ4lH)Jm%I1HL22K6)Lg=z}qGBz3^9E0SWx- zLECAqq@G+(!%~p6uI43@Rk}P<7Gzzt0&EV5bM>)n3Z*M*Zo`jh+uiRBK@Os;WGsl_ zqk#@nuB8mV^69&?Gt;%&q(^inUZZBm5#vk5i>5?C$`9L*-sB`pFChDXbh%M`Pe7CP zMFMfaR;)2jI^G{L4j*PL6@^g>(VdRCthn=@`x0fYv{r-1r8k3`GE}# z1KmIicx)tz?FJO=_X!dFbCgsC#H zWyItFB*?3a4vsQxS}Pp?a)552T8aN<)8K^a2Dd6u5o498r?&oae1o+)ogFce8jju0 z-*JIv*zWhHP<&xCwZ+tI<$*0rzFt9wuX(qAsBn=fR8gPaQL7>2E1}%LC^x6I$1(8Z+vMgH{fs0P+Dx_gss}yH1f=NI)&w=n zRIX!$s_o*NGXwUif*bwKOFII`4ngKYO{I%dpG3=MHPpWBx1;~n)Aoxzw*FMi|Le&5 zB4lx-g#}hF-Shivtyu0OZ0)I#lv7r|!4Z+mv>W!JLGWUbu9p6m`|Uqm6$42&(g7au?jnVp>-w0r>} zZrTYb839!aT=M9_CT{>rm)Ka|z+p&W6AZX(b~a1z-`Ym)8!lC2MK&X7pn3%;J$;}! z04iIRZ+<{BRAu3IIx71*#pB>f*i<2U8X<~llH=Q5D@h~HwH@DHJ{lmA*m+fU3ky{& zEiDgA3ON7-0(e1RKfhc^7i`+b^2U(vURW0K)gq-HY zi%mLw-nB?;9#ZLmUM_QYe`6M?bh-d)MgNyz4x1$sZKk2EcDVyzu@x(eyRQp-JXTgC z@QUE&r3B>pLGxXk?u0ib`i*9%EnIstic%au&T{7DHf6+v{T<2eQK)I0Gwe_3oglYq z;9u3KN)dO~4h@n}t}gD`>xeSch2_QeLU#swkrRlyIzwj0ESx$PuF4fs@O7&fXI^9f zXwJr0FTLHSb232{x9jP_++*W<^ZPpAlgW21Y>r@QV;d6ETeLhkQ z(Q84QWqg=ePF9eHoO@>wsOqW@7?ju~C=i=Ooa;ZXHl{#@7ERg8*7iGXIbM;fv^PjIJ{h{$?5f|~t^k|O8N%}vc+4(e^nKI(0T zfX&VqRCV>vdo2tGhe91`T1fz~m9IIOmh%;{Jrd6r5&%FNvuv)bX}gqn+m*7`scn3_ zPdNDeY$e0Ni1?X^m&#hXFLPZJ>>Dz?uNQc{*Ej4gbyJpR)LBxVu_AgA`P(@jqp?e4 z%3fQFq|AgoA3_FlpDG*|Ry=iYTSoBbWBrq7dMa?@xPd}dl6QTIh~nH=K(PX#E`f%$ zAl36mD%6v+nYgvKKAe&2-rCn^@iR#)x`x4ztxecB9k=0N(kFADip}JRG)8A=?G8L# z6Sg>Li{<1UPs)b#X$LiPa{u|rPX{~xfm&#mS=Kx1T3A}fDft&Z0~-QD?hw1zR(=u? z4NPaTxoDTP_ydSs?(~MDQ&^sSeI&EAF);}p8Sly$ypT6nX*&cf=e(;|@G1|zEwjwm zS=zx|0pQ>ZX;2sU`p0@>&9bQ^M5vgZ4}Q@5tzc*pr$=f(!rZM(NbXp80{RJ;Ob zRi(5SJt}HjK9y>BC^2c9ME%Ke@+Gz>S61?vgA|iD=!V@I*0PBJiHWh~v_;;b@nP&3 z7JB&WuTV>cd7B|k^0?+}s`aJ40Gf)7kK)y3(DyQSTD4J2(dDkxPXG;fA-rq5w|RZU z3cZsRvK8NycuA~t{1skGZa?sDd%|KV!nJv^qhcvCtC(1EP2H)-!PFKmj15$=t$}Dq zwl|I++YIkvhTjROz|M(*@Bsb^fIfh>a;}C{Ki3CoQ#+<6*Wa8Ul!M+;lVH41pT4$0 zog!5PEzJvS<40%dQ&S@5HCL^{!(i9I0AAWg%7AnR|LkT717F-6?8Py@MiKz`Xle@Ws zoguutu$Chw-P1wsf5Qugrx9eE3jPvNQNhM$K(GQJB7!Qwv9~%t6fVazv3873n{ePU z8BoX$%|5`7c#0kh-Ey;j=`Mfo_gK$r(GM?pF7+fo{&_R}&B+dt#O2fpet&@k+?ba0 z2#tM71rA0*f6H@pLBq60-YB?qtlu)=xY`CYD83jGYk_`@gDo)QPM@iyovvFQKB!{n z|Ko=V*lYKm&9&eM_s40f#8pL8QV6ZTUX28FVy($|1q==kFY?}Y4efWvhO?ZtG9@flGxbTatv;m{k41|J<((6R>bWqCr+H; zx_D87d}MvMh+qHGU7Gd(E0v4>*K!UMnZIKhcFlZOOoOk5v^+R{a$b2;fX}Cpqrb_wx-V5w|7#9IpZYVRFncn+;U_ zfna5&I921#>k26r7Y5v`Pa==*(*oP$4VHt)R9ciYZR6alUHy*n9FfAZEZ|UV-R%C( zEz`gz>nkzsx9cWKFB~DPOk#thUr_yKfurC+8(pAR+2s%0j#_-$lSmuBUpA^;G;ATY z$gn;$mb`tdZYpUY+TQORs^ygm$uuZqGyzOkpxJD` zI~MR8?g1-Dlmk|xA0Pk)8z)F#Uw3x$mz|i{SV!Ot)P5iU-N+kuc6j)3vKi%Y16Vo> zeN*B??3|9m1PUKbj!E#B>My7X_v;G|1r!zWGm`oF`O>PYjq{0LD;-p1&uUEG)bRZszN{^!TS>Cw$TcvDXwEgYLSxi4+K^R+2o* z--nY{T+cjE^eqg_YE0j<^d}MO+bdS`yvKY%UF=OLaT?SBY6-fAqbu8Xk66NH`a`JG z(u(^e54SAKON0#CYONrAWMn{1ImwPV25%L|Kzxq7{`_&X(&APr&s|`krL*nqG-2P^ zLw*IaWKKMR?KhevCdROy@=;}9xT?W-zKpVKXWKJKbaPyK2COs~p)3!_5s*>UXJ&h= z8A{OY4rscEo{V%bBfQpSep$6|Zq1b8f(Xh=*!w)XVM{M7o9k?w{=JB+-bG|i;0VhJbM-hovFCvzWANU)vnd1n9|x&W8=dqRJ(xY+Hr8R!R4rl4 zMO)Ei)r#O&o#~sPC%({7ve4Tfs<`nfLh`Jh{a`aUb}!z3@q)Pc|EliW!;((dwcFq9 zJ$|cZ^4n9B)6rRJS!&i&)4>B=yBZr0X@lkYP^pmTMm(f~Ol!8aI;cxY4Ha0HNNQ?o ziYKtf%mb&&10f=s3KAkFf*}I?HE7oC{m=Sm?`vP*-@wIt`aSpk-1qamKf|fCgi&59 zX!ST=lwS;|iJExQb)^X{s{B$6D;2nht&3=vHK z%KU&QeWj}h7+aFtNVF=xBBM_55SgB?TD~nnjF+O1q)8z-!~aC^wep;+ax|xB14Z`*}u#*6%HiO2$cnQkPCf-Ox1P!&a~{L#)JO1!5u%l z6|6^-SF)WZT}Z=?Bf~36#)tN}Bx*i*@Yi40zowG*?%m5`hj;BrEGL!?t*or{sruSF zWy(%a!7RUdvmB;Nr3b$$%%(z%j_N{=XKH z4GR+;s6iyi@a_Rro}Ip7&JLr|FV6?tmBQ=l+u|Pog)1#e`M51p+M17%k_Do&O+Yq1 z6acuh!13;-rpu!j{?&*^Q`*|bjgmg*)Ksk{4XS5Gd~Oo>2RFkAe$JTBz7AcmD2i*1Yc&SbjG&U&gCX@Lz+04pt1`&&!<2x!U}J^qg&!GhkqMycr`6?NM5CsG z2rj6u0Ux(|eJU=pt?#ZN1lElLd~w{hCAKx>@b+7fNNsS??4p93O-ll0>z|u&zw0%& zCA8Nrrk_rDF#ZG;c6{hqE!l$~b$&AFGn$d{~(uYGKK_}x@v zOx?Q#NxSlL0a|X~+-FI%%-uo~zLuoEmN+&)K1Kqv#z%VgwGoRp1-3n^xzxgAf}`<- zPw+m$Cf9z)i9EXfRxH&OlHEo`w8Z8bH`*qo?IkKF2g*Xs?ERX+tpzB>ONh?NnY1<> zl1<(rB`;AIFG6MMuHJ!Z5p^fVWo=W&eG7sMPjV0~g#mS=Tqs{wQvXRN`CfT^Wg)#Q z)^S&dZZn5!vq9yk{MJi`KYbdrwkykN*B1HO7o0k9GGZNf{GE5EYyb%WyAba7tb8FR z12l&^fFhKRjt(Y^6_b_aVq&_d{Vl3Kz=jraH21_se09{J(0y9kM3=7KhLD@Zu0Y#q zz)STK#93X!y8_b$>ZE0o822L5{y8{HKuUoN|6%u#i@TlpX7-@rMxkDpTe3+~W z;|$*4-L^O&dVO<2jqNGrwS1zq^Ec?S@A*m8qLqfL9P%~sMr^sFU~!VK-}jc1M_s53 zxYy7?KXBg+CdtXce_Q6-)ZlFX`#a|wC|r1eX@KH|1c%RxaZ*;78q>SA%H(1q!Pj~4 zHJ=UEXtht4fC~$dZ4~QlM14}fobHM{U10axd-~V!oCCzI_>tS7sJ+ax#dGXVjHW@x zTdyqlPwXkgn;lG<;tet#aohV-^m4iHLEkDBW2U42%6>n$9BZn6QJlgpv&?ji)SYtg zr|XbBJ+7+rVraUc3lc?rO_j5GW>(A0XAZo_sEjuBWy`r-2mJb&KV;=sbWxRK_hEiUBBNS) zvgYe@eC9=a6BVq~A}2fz#emj-K$J-P?q|M2CgAdZ%6Zcju}p1Nw`E5`HiMPJOA)i zQ2X29@}B0z(41+roIkP<4&V&PFPrb%$3}77OJBWu^~Kh$h?JC+S2Pk!H>rH`7^Tm-9|$RuZG5L!qnc_jh}+ z$2jZS={)v!Fb8^qxv%1){8_R`9%o#6^!&rqB z{Xvt1;^k`va&~?f^sj-Y@jL2-i`t_} z`P^AP(Aa>1;Es+A+n}e=Sc^QgT&_Flr|-R45w5wpu>PU80;;+cAwSUSinZwJKv^Dz zYEo7EbV=-JM}CGLzT7(l8GeLV;O01Vafxi$qE>^>etR0CxfaQ8NTiBdXJA8NTytJt zN&_VMtB-r}^D6mm-mc533AUbgTinDVQOeTPv)kthfIH&dvQl52T@jO?AZ+<^-raYS zZTL7#azVmiIDWuElP_LLaNpS6rAe{9rjo@A%2w1Ms`D3E?@1#L!uGSWH;Gn)s$p*z zGrPq0Y&Q#-E}f|B$KmmHNKtMt4>eD|Goihia43Af)){v*`ONIf0=kSvwYKsz$2d_C z<*{tSz}F z*|zY(Sr2u!BmI^6D40;S*l17?evTOhxz5@4lvnc;6BDl1-@!W4q%qvd_3jUuM6MHC zDUDXW@#moy&_UebhZJ4grWOS*SzMRxH@93TbBxqO&ghEIftZ!-e)mhH->eCxI%VCY z1(MBBp{Gk5Xt&`F@Ft!cUW-jTL=l!K+RXmhs2JGx&=33tuvyRKK~*1nJ}hoGpUhVH zWSPAPj*xk{gBLpC2?WgPDfM_=BiX&#?&KEbh}2By8pt|R$B5PYhy&S3(I~0kYdb`~inf!%cJqJwK^WvZiWG*28!|+-`P>=6amHe9f zQ%;Txq_6x}Nib=Z0BPGjo=RXpukI)1|Xxn5&^s zlspmdzP9dKdr;WQm1aKZhMLn*7?11Mn-}xc&vTI@9^c8wx9Kvr0k*SuEuRqVy= zxIP3T(v9fux0jvZ3=6&E=2~b)vPN=gU5Z@409-EDK5gaZf-5L<5xQ#7M98tb8kkaz zeowE`H3}JpQLw=^ek1L+dd5#&PTtFF)fV0np7YIKB=6DiDfWLVwPg9oG#)BJi$y3* z%jdb@WA>;{93+mHMx|2?8ROLFhbI0+@8UMHMPlI(T^Qw8eT1&`nAB9qjZjox&X|}8 ztENy;OHZ%aKm#`j`C;>a@9U1h_E{QMK<+)4lkNl*GbCrMF-V4=t(_KK`iL3apilOY zeIGqNz!q`k%K4%Q5*Be3sBoY=xc)cQjZXOs=&GMf!Eyw)r8a<62N-pct2bf}6CRDm zf%fSR-7QXpb#V&N--?Z7cSmc2rf=g0k-A?1m6X3zM>Lj$kI&bAI`vOq4>5R|pnnz= z>OW}uYd~EwAl8aeQttPQP%Mor1#(;Tl`DA;pHhQ5>!Yii`Y!#cb^P5*77g&uCm~`$ zIFHtWe&$=C0pM_{4G_}ill9NO&_jph!ZCpZkodDTHYFD_8 z(bo&B2D#*erlkhXQg;~`l}FUGTSoq0dU&<&K}2I|KwVnj%a)M(2>(d$#2Eg6kY#mqr*vwrG5GrfT#j~m0jeKyfE*Y?F+v}#>~+Nqv+ z&=IeaxY3iXM~@VUR-K4U5(cy1_n1+@iRT(A`WK%ldYFHtAN2hx(9|;d6YZ0nc3~%_ z3dg%iS)QFufFB~SU294Zq(wqAgy?-j*WwIJ^L!brBSX{4+_&zb>JIXw4SOm^ZjMae zJJX+STylAcP<20%8tR$l-6o&tP?Tvx)+T|LjAB3!%TOTvD@Vi#2Z!T@6jP$l;y0Y2 zITx3`kE+Y?6>B;?lg*;w5Nw|XPNn$>&6rkQ*}Db`CMBsjTbgWP{!I|Ln4+=1<<%=U z^(^kT<953{sHn7va!*?OVdr{JduO00Vl(W2+TR+vkCT|YE%U9729?DMYLmYqvdlXn zql>%o5J=%?Hx4=s`_yJ&?DSF$^?>KT550PK)9!Yde$~0BwCRTa+t5gD$UeP_>1uK$ zFM8O$t3}B+MLeAF0oQ#&0MD$6dNsjntsM_^LvtCXw!?Ywv(;q`uq048T*g38mdb)K>v9cq+e-W*EmabdAIa6b< zk*=4PX3SFQ$BJ&kGOexHX|Fvcn?DP1Xwwu^sF+jA{BjKzgDbGf&Ivx=yl z`%S9*8YuE8m{!s}(KX=}|Dst-JX1r27S_Bd4=l&KG&}cW;T-e>-0RbA(I{o~RyT*j znm}m{2~v2{4_3;HTtDU1=&nCS;Y0O$U#q|)0riPPB?Tjj2_hi<%!GF+WXjv8x;^p) zrl_fiYJ4K>ex(2S8EaI^NJ-WgHz)B+m**1A=sR5TFn2sswU@Krm+cbkG&zn?iCUd0 zZVGfn=ac`_0^nD=3J6f#vX=s>`2#Sd|4wlYFvZ8VC3if5OQmBg%>UF=s2N;T5a5226TJ0zigDTw%g#yZTWWFRV+c=e^a z5G-@Q2e(Ym76OSEJb|d088rvHa{Bg@6}a^gy{f^$T)1d`d}DWsO2khIo%;|fPTZO} zaJ@3im*a?4nICh-@s_W8SS$DRd~k>hUahQrA~an71xhQ(YXMHdHD5&60AC+~Tw_Ng z*~Wc~*^A6%$@=B}{bos=29vhv-XkY>cBc6+Vy=XG|)47(OCimTe*|CNoG6l!ftvots9UOEoGDX9a)YL?a+41ku%db}8Y>#?(g`PR}q00@^g0H~{2k6=9(NYT5waWyj=0*%W_t&KO ze6nT2s;~5aSfmp?ATYhhxU7%UW4i%UjYpyqoy>$^wT0P{1N`6p-`klq-7QbU22GX@ zX%`Xz76Z5AXow6vuXYt`^&&8)fGN`Sn^RVM|*XaF^h^QM(EuxKoEjJ7+yN5_jCj5Z*S~#_?3Q>qp~i0!)UbX~NMB zVg#VSF5owLj$B;Yq5vokmOk9KXTmWb{{|cJGIc67O{FM6nH{4=X}Wae+8@d`>8fB7;L3a z+^4Fv>dLet)P>;dLh#tJLuBw3t^4kuIA@sq)KJOs^9fGn8+uuK7s_*>%(!2g{ z!2(40h?)*3O=lhlqsn{n=if{+|HZ)5Kpm?Oklq4SR)P#M5RxOBF-b{wK(dEioqBp- z_FwfgIMhXJre?^QS+2%0|I2*nd?v7S>H;#M>r1^L8Fxe}*Y3-DPoCUqZXRjBVhfbJ z)(}7gAE$U0!JXV!On5GFRL)`oP4UalotKd+ z@(ctG;InM^ph~EQw@nsV7Kj+;q`_&JJ}&=FvDwGz{=ABR&FVR(GS|HN@j=s-z81ju z5FnO4((YhC$ZPeu{M5C<*J$@nYCD59Jo&M6^;1eLY)#>{fq4fXmU9Vm#q@d z7i`(de;=edG%&DoO7qbnL-N3~(Do33K5 z0o~UX=$FiMsx^9!euXr-+hL@9@ICh40A6j0A1ZusG-iDpbx!p59AfjyowdgmLn~YG z1i7VR8&5&ONm5-ry~HGJroE-%{KVVN`c6OzJ_qW zu{wG8%bpg22N*2q4D?=t`Rt$U+xDEFy?H5ox1 zjE^6SsVV|5ZTP!_;$d6-4ifI&92f2p;()(8SM*}c$Jd7$WDND~e**`-@@)5|>>g|9 zMkjXOC{uzoXOPfX+ui*ynx}jDiVnZT!RJ`uRO)Bf_mWRY67@ebtZ2W98YfukWsO$6 zseduR!_Re+&_4%Re~sJFjDaiFFwQBKOTxbq)9kZHzo_5q8G#>qZ=q2zodH3kB(p^< zYIt|dW$oG*;mZRr6R9!tN?!MCuZV1A>yy)CF_!_+(Ef@Q*LK9FL1dus8_x_Fi|HNr zw#o{3nxq|;T9<|`?=!^zCFmISpPN9^0}pD(faWydX>VMAm^R_xevF;{yzESeehZ27 zS!fbtpsex^`Z5aI=~TmEM|6`N+=##;c9(*VJ0L7%PT?#ds8o9gK@}=)e}6eutn*7| zycw?q!)J_{>>IS`az;M9H>=!+|8Vj6Opoq@6ZVSbNegO>LTf5|)-^VVj=gM^%ye$a z>Xq@XO3&7Qf7HHPrGs8=mt_Ix?S(WU;-Q+pw8PFwdnG5kSw5eO#fp8lViYy0 z>4_X|L-a=PKMjLd6-+}!bVGX~Hw>sN`mk{M|R|>Td zokWniv?U7vVJ!->-dwuN7#vD}-8<8jt$mk}qss%P%mIGJ;&}1<_wNtbK#ZcN&p!9g z%h?@aUiEERxju=9%lGMiNx&%MGuQbJla3_YqmRXZzQ8tTrr8q06yUM+gs}mF32W3E?1T)bcDf3>0JV<4m278x-t4^o5wT* z1}){Z+LCdgS7$B-!i{{-^Cs_KGXAur?f(bG0kj(LPfj8~K0Um#3!dNmo@zL8;m`j8 Ds0`Or literal 0 HcmV?d00001 diff --git a/public/markdown/images/mino-webui-login.png b/public/markdown/images/mino-webui-login.png new file mode 100644 index 0000000000000000000000000000000000000000..9864a3a13dbb6a399bd4deb93f4fd6a6b888bee7 GIT binary patch literal 650095 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

    &$+s$=+D88qGU>n3Om+e4MD!MB$$XgcvVvw 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ⅈob-H)=vaa`vbx_fsb5qJF8NCR#oDLHM3osI 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ËOMz7k@~vUw@^! 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𝔤@jo-{5A5T06ULsET16LWS~=X+ytip z_$V1@d@k$jE?R;{oyy>o!-Ef#nDaiFlQB(4B2ajsZqnTl=ZA7a79L(j!SRBQ?Q=G$ zCa>C|N^=cCS!t{go`Zvt{MzJb%O%9S&-yl(r)2^T?xxVPS-5wWHf>d;y; z6Y&CCuMYr}ym>guJtbiXF^GBNg8}KvBiCC})$&OHU*q;<@S>IhRbovCt?z(Rt=~Nx zCufaSZ#&gW98F{y!=jHAmkV3h3OiRhitv{y1!EQ^Sp3_s$k4SEZ$A@?&C$vEmBlks zsfa`(cI*XJgQ$bU6%(&b1W{p>N?d{PZGH{eOx@iWVTgL}Guv`GG3$q4zq*XQFJJ=Z z&yfdA$!VicCtgA){-raT`B&Vu|Kw2NsoJJALJ*S_4%mq&4El^|F?aTVSb$P};_$@( zAx+v~CgR~PzUHw8!KJH&A)CO!8{Rm_7v(iybno(^Sa6sYI(LtzPT7*awuB%Mdvc&- z7eW<%(34hC=bbv$@IRp~IDPXESWjIjTidtKFTn691GgchlRuliAuldTLbpqqsmG=W!phTpMW=o&*+#rBdwj>M=T9@f6KEI(y%I_HY z1VBLx5@w1Y<-TM@kRV+Yv@0Jn`aUkdpDWzISjWr{pVlI*qgWnHO|OeZR+(Q}x-kMU zyD@wm({kF>{lQV}vuc7p2$St@m8U@$MBN&YDodBc1+;v>u*EA7hh@y%!J*JxKZCf+ zul#=^#y4}lB_3A?nQ!^Qpm%?meSZD9%faeRBbQgJ+O@BMziOIP^H8Y5Hgm{){KDi* zo&C9bcp$qJ{&$Cr08vZp=jJkNaB?9g4CB8fFb@u&0=Zn!P{+wadd+?tp~%>=C!EQ6 zF3upm7TJ5=wafebLWf_VLAFdF8OK35VUcd(UFVXvk58gU5AgR>B?t=gA0J}OlhcWY z0C_MY_m;+w@y^5-mD}&jKmH)$i?14x2Dv1NFEO~R4@FKGe*ESoYV#&#$ic6A`L(A- zJ}-lGl~OdA(bd}NV;`?VQL@3OD@iAe$wW=7*r{3yzh}o{oBC{&!A7v?#f6CSeN&e;3id5?XCuc)OkE-u#!h4A@po`?U-`N1rfEs2-H zmP&Qi7ogA(*Z0^`>e*eM?3029M86oj=8#UP=D`OewtW)-tkGh}|uN4}*h|vO_}D%-j(rbVy*X&@m?s2devk{LjRIJM~iv za$EWfi~Y58oPeOU}x@(f1PsY*!kEK&C_;bRiUM6|6N(2cJQ`AY(YsU#cy#?CuVx{a1o{CI@34nxMzeII$%z?qR_FsY~-{@4- zYo0@qp}Of2r@4p*PGYA2Hsd|YgK!PvWG-WH#)Kk!KjIzgHAx)sF@tM>vUu7wM`7Jr zN>7J5AvqMyjH+K@Br#h1ara1f77j4#qnW_{+v!1j3ce+fRpF?=wR6ynLJf3pJ=fQC zAtH{j0dkj;<9RU!?ZT6@!`LAB4kw@$#A6&5tp>e3cwSbp^I9)qMiBt2q1;tNm0Psq z5$8)Ak}g#D&pN&@tBV2b3c#`jeGR2!vg%0W2$x7QF~CfN+A@U|FV##>?s< zsAEC($tzyDovDdK3406%*pLuM9CmgmVwVuKYa{=$G&D8)BWlD&CIbLC3R@x!LcjZZ zW$#PK@lY!fTYqE#LflhDWMRLg8Y*Kz6c5nhW|#OkY0Q$WZNe zqY($|%rUo!Q@FfT%Qi+}(;$D@`J&JdVDGBHzyf6DvDUGZi^Zp1+^#)gd2lSsaV~=6 zq#rWc8vGqm0gV2WSgT}|#x%M2Tx-wgVd23*P`O_9l$cKK=)ynIJ+QRnb*()70cimo zmxaiU5{`R^&cVU;R3&ow#kg!k`Jtm`^_os)A~#eM=-khi{%ii;dvEr*$c}SvpdPC3 z#hL95V>x;K7Xf`gy%q%MSs0dmY!v!~FP;KQwJ7|AYY*~1*xXp<{J+`T%}+Rof)z=b z^jZW<{@IXaX-cBpWl{r8*^&;Y|b!pTIu53rB=N> zUS~cVMl(7n23UxjO!w)AljrpvLiQ_qdaeL}eNDdA6qPArjc&@+F-`~HWTb;;(m8IakK=Hjk)v5njQ7fv`Y zAwDR*-Sse79sfnhd!J;%Z0Y^-eEc5O))bBl+6+|3hm?USpw@u3hB5zWL6armCd?mj zN0+{rt8#pAWmcM)W)%}-qOFu{m3}~pNP>=I2LE>epTDNod;cFPKPx&q4#cHbm&avm z%z}?yjW-C^>HIf=C+s4~eSQ6Xd2xx|%Qam2gZ@#?1M$%)s<*t;NI9bB**>CT9e(x3_QNadK6DY>fD{+mPEPA_vLf*0+^I=$sXL-+Bs@!S5k z=t5Aq>C$NeivstyP1%RRtavX{X40#P-Tm=d#&VStRVy1M7!>jMK%;xQC)OJ4+9hIF zW@HjxJeF`?QfS0HrCBJ*DHl4muZ0pL-8DTXIh|*+6D|@VlEeV)mDRGH)FDb0HHy@w`381r#tf!qGZ z0NE=a8(%_(ek1!W?*59abEzIos@BQi>3qir&5`3-*hufS%jP1TqCb6@aW?GH+xUB0 zJxR`#sQ{jV;HE?szYdQE!2hw zHoKP9(~1{*C+qY-#MeAysq9;f$|Ul<$If}P?^}HLk%GnF;K3DS^Epi+Ku`#f_IVk( zxta5pz4eDceOV-s?KF6F=7IG;mm}sV_m#fPb^ieYu)GR>_OU*5;x#fO8vKK`Uo~uy zNd*bC?;I19rg^G#vu=owX+7&FlkrSowVk|Y9 z&aLCLyUL$tz{xn`1Xu@in%F8Fh6jlk8u~n~I#D?g#MZL;rK#s&WQYN|JL7XAjLEaV z4Rx*OM{__o1qPA?Y^ywlS4g~tKy5*5j~N8;DWHb-)5gaDO$WCPd&|OxOG8bi3B`6-YQ0q{RsX7hxe^MmKKt& zyJyZhZF(|SVAie?X+dp74Y!r2rsHM70JmX-$B0-ah4z4~k&TlRmDPwtC9QXS&~1p17zBau(!+2Mgjnwj?Ro%6M$#j$td zsJ^KyICg0V+tSw z_#2bJqMLi=i}?UCnE2W7B|8)6*YW~PoJ%LD?4i|v;BG~8*5vS9n2(|u3J?LM^h#@U zS8oca*ljI5Z0-+SbEN|88ZT_aCSeySLg&omt(L|Kp`{dVWuYj*T=V0Pbr4o(FbS$o z;g5WiNGddy4YepgZD02=_-DPV&+=)CT%uVWfjPL39Lt&*0ZSY*K!R*C6gpD800V&| z&m~EMO39weY!MiBYg>Y)$r!V3;!n;(sxnWIym>;Yg#=BYBG&9-Y8Fp%Gu9BH!TZ{k zN;gMFE!(ONx3)P{cPp-JK$skz4*FMoXfzCB0C-;_4jC-v=x|AqphcB8sF=Y7RmZpu z;E}!Q&ot;QlW{lt-WC0C)H(g7TQ$0x(;S{5_SSM@(1A~i z`JJT%&Fo)owYiaR6D_XMX8o1SAnwU$HF{OCn?*d$&l&h*1RI8e;7LI%y~S2v)ll`* zbw^m52A!mtnQdJJGUZac zpSP`@bE8)x^Fp8rI}oFORvHpii;tCaW=ilWF=I>Gki%Oc8n9#Cta~GVcfud{&v#Ph{n$ z%!OOt{7G9BOnWCR2HH50P$l<ZEWhQ^v@+em-)gRr2o=0z7MxLN0qpJ<9RxC&EI-Vu!{Bc%bTw&=?-?>?)rLy|x^6 z%(Xo`a{cltXLHMdmD2$Rs&QVA?Ua@+VT8JA?O`Q1hLeAD{z2t$`oPj*qoWf5Fyl5lcSC$YD@3eZ{~Xohc;=ylbO@{Jek_O)~Sul%|}+H8aku3DpAOHktcdBx=0zlR=0fUgd&JW2L!bOX!;RNqr}aw6AWLZRxcQI5eeRfV z8+-NWm)gVz1#AZuzZY2aMuwm*G6oe_zslI*1vo64GTVs;2V$_I%(Ty1UxpD$qj?%P*!qsN8WYMq^ z^?ROl)xw1_)nSKAiUQo%kiiFXidIc>)Vz3qp?{%=nn5as+NA_+=m3auQZzuCFc}uS z8Dwl2G-k7gZpw;1ExHtR^OE1Eh_yH_lP3Q)+xm=Cw+P}r;+cYe>YUtMYm(?#532`ssv96qII$f)`&p6XkYBfmV`anl;{g95h$$P$s zlFmE#o~$Rbnr2C%M=iZMV~V-fLZbfRHcSdyM8LE!{kNSQx|0YiL)|rt?7uQ`^=vxd ze;o?!=~afrgA5S9;mcM=lV>jeT-ooouCCs33=fK4B!uMzhhoW=-D<4BbX>O7Yq}#} zpEKHQqh89YZHUoU^ANFJV~??qFZgheR&(=D`qeC-!pJ`f1pm&uK_B=vc6Xh9dLD%_ zRbiYXLWBN*jrq656jierpiI%dCtlJuX{u^lNy$STEmhUx8~{Y6)R!)>IT=r5Z*m1)Y^3r{E@~#L3XR?cw}Y zvMxQrt|En|95m49Dkg(JW^NmGk@5XEEI_X-moPqmg1;x!if5w&#>Nm>^8PX4qC;+s z9INZ3?TVr!rpJOo=?E#Y^)+gYbAZd`x7fifxU1@4J?V@HoLIImvQOSFHJw~I?cG8# z=BjqTuG*gTwWylcl4vv$X*8`1kebaTJXFwnR2Z}oprS*VxCgqms3}jc>ezdSht?}m z2-Eb!i~kcXo`Tj>0IiBkrde4dJ?{HdbWXcJf9oOU^`N3DNueDEJ=`ES_f#Sf^xSv; zCAG$cJOJHJns5E+d~+eom29U-f+zZvkVJ&yDE8Ukep?JWzOP3n+!n_9g`s{wFiV;@ zf$@JYw<8Qv{sjAEn>JwbDqlLH%5iREYv02BR{+Q#z1s#Cb1(O!JMK(hYEbtTVWM?-d!^?@v z({P*-BnUj14{s$#2#9?(9A5NGpYx>`HreudBL_W4dEW$-?{6r<-5~$n+RTuUH+sg) zAu)~7(sh8HFOc%%cI3E`bw*cit(N;RCu;R79qt`#%4H4rH3CV3?3uCo#o1efLrakX zv%1IAkMY}mrbPG`t3<&Q9LRu+AfS7{&Sn?!zr>rB=9M{A7L$nC!A*W@CkC15g60!! z(`=so;|L`^T7dBCww@C~hPvBX&pN-}SL>MoAH-8iy#c36_8ZPK8d)8Wujuskw~zIl zLa6tC5*u@>9UbIoE(BmEko{S8TPw?}iYrv1<0C<#;goITP*gH(eWBiYs!jjI!Nq_= zkuC&T*o4eZ?ZCBmZ)_<$+z>ng+Ac)v zB@cY*vYuqW87_eN?XhZ1J8?@Oj?@6-J~MaP2RV(Fp=qPK zzw)?ZDOpa}k=@7Iq<7ova(>8T*c9lmNG(IodNy<*rF8~Bx=go<#Sl}jSdi()EByQx z|J<#3_e=)DWKDh7xioKxx&jjd7X|?j2Ep20(Tf+-soJ=4sqA={re6DCY}duhHOL*b z*>=%BNlL_ip*`OI}P zuX8s`25fW)_tcS#da=wKYJIfR)A|Uu^7!L~57q-;*7}ShugEe4heBQxyN`=1Zqebz z4Rb%~5}WjO4(!d4kVK&7b<`9;7v$vo zbDbPKo+Zn{t!_ny4j9&* z$04I1ow#J+NrX^b5WO1)32KKD1IXq|EDfmuS$6Nk{@X8I`}QnYjKLy5B1W&5-^CAn z`BP@RmA#7G{JzL|x=%b!g_g$gp>d41&IaoQpA$}|Xql`P`gU>PxG^7*OEH^zT-{%Ac zG<1aLR+du&Wwp(5zZJsG6gL)vrKkUI9UPY(AxxH8ph?d)X9E~T3ptqnQ;&ElQsAtA zAp}B8cW}t_7KV>N$yuuZ+)$;^Hmchczw@7-t8@6NeH1#6gUsUWvy@hf@lnjO9k}P_ z%9$nvi}+L6OMQQgFi1pcVe(5lsz|9{38DCL!nBxcBl7#l;0i-)L*(GbWZW-iRMTo7~qb81Ujb zlpD@BuzC)xbezk+Nuf^f?^VrnAt#Riyk&g;+ls!?ZO{^6WaY@|&yP(X)rc5Fb>l~e z&*nOBk_ew<$QFAC`@AbQ<7Hp9H3_3jZb{)Hw(L0v7Ok4j9cE7*Y~SRU^c)(#`COp$ z;WRB(6O0Ly`HzvD1`|gkTv6l)!GIx{#V8i6T@=bfK_#R8kLfN|r4bn@pz7B0yn)@S zvpnZu4)@B0x8wbZ{!<%}%b}Yhi*sB}zoz?#paERrl(V!+D`*ok5%L5Wy=b|mf?2E7 zZ^-#~5&rKX3K}?V;X{6&IUdQR)eg^r;17aVTpe<{pDGole&F((fvV0RT1McR43@>zr0!(D$$J7J8D-;puw)X5X$%6}))O z;2Zl}Rmv8@-?lQrZxcF!^5Jj+vJW-Q;*0CHr+)cuKR?9F7ZFkN@N-eJGo5Aw#tsMv zdu!#gMqfd0wz4)cs?2y27xnmeMzt5*;Umx^I@I^4C1?O3aEeO?1YxTfO(dy#^rsxd z2QRMuf&l`@?tFt^YFc;4fHy4tR#76ACL*OHRF1>&hM%Zt9_qX2!gB+Li+}g?iI~4)d*0#W2z35%ND2u{LhkD@{hDvBO>#05tZeEx$~;nKN9bKPTq$TIzEwvq z7;=sVS{OmHv38fJ35GxcQG}I4-vdV%`3DoI=it&asa=zy5!k7HNTb0-1wGVFjZp54 zug4gf5Qs&ne2ehPs7$!Fk8p>A@rzCrI9emTt{hC|Y zc9=n&uZ=l1XxT40A3Khi589L{4ip9mw|@SWMPlimY^IwUQ#1QhNE^PBd9YaHJ@fz? zKN~Rai}(NhC(A+@(9B6M@UtcwK9n!NWy!qPx8H~_mvc2Nz(gSAZJ%yvV7aLJD1H1; zkGbEqjOn&aL@gZKL8vC$%sA#c6)a4egpBWcS^Z$c9^|tS0W}K-w;E(pJf{r1{~i_M z-D{;wN1D?PM9+jJM4*kZVX)!ngs6DJm($7*&&tq!U#+(nRaKgvHYD?H;jhOc2qQuF zLK9(%jXH>5+W+$A54|3zC$d_eTukdtA76!g!i|(!+>QM6K*gV77o>YD`y(pZLw5(N z!tctnuk06COQ4`#_VcdO%fR5B=5XCUmEv1#b9Gxlvus=n9tnNizkX8xjBWa}(Jsg5 z^7rb>i9do1uP+L$3pwsvZ{#^4;ZTR*#0E0e)=lwNM3}k@tDD8kNXpvwVn25)8*yO` zTktP&w{61`f?u|#ZpG*6Phdj3N^U@~lSNAW5X#_I0n4q(tN9!#w{}+Jivgir@?Q=2 zW;@;1)Xw+UJ69ZC?i>&G5iIW&y1Q8gLn>#jlD;xQ_1c+&tYm(e7B{jdrr|$xX}r79RP3K5 zXibS~sl04uuC#{6g5X^NgVfvAiYMy+ko6YsaH?7SEJ$&nG7B(DoPJ9RX#QX)<2tMApwtpLihi`oHRGeI#|4Inp4d(AGM0d><2oBfo_R zz`wX?A&QjY)Mb=uyc>|bhi1vDUZHk3u&EMq(6_qJ@jka>Y?dgU|0b{Z~)GRW$vpp67XLqS01_XsJ~6j5JHH! zBcVr6U<8O#0iY(<V^bCb+tNlO3rFPa&cc8KSi^n~uy}QM_e#tMcV*2V+Q8wbq#rpm2Y}-&V z;tnUm2WB<&<5J<#RhG*jY*>G%iPIz{0gN*M)Ff8;Qn8wd7$0kUQuDfO|9}SHnVE&r z{5F>>&U<&oB|PDALGZyw5&;XhvOJ1QS76CGz*C+6pEVO+-amL6Whh}1SP3>rK#w0BQlBwJusoA zP6r3j8M1THG1?VR=Zjrsmi7c-btXarbTNLHW!D{BVZDQ6qs*=h#8)qcSiPRn3vX6W zg0adEBA z(4 zL=PA|><1%6_FWc%UrOaD1JPs7-a*{Vde7tP+=62%ZPo|B_}wcZpbctRUEh44PS$pB zqmG`omk^?OUDmbEZ_HQ>Znu7Puu>OSU^wvQB&gJ09aAibArlBwGHKN-JjvNh+uhbi zN!JLO-mw!r_AU@rBqr^SB_~!+tSUhQfP@~UChs2{B1@lmSGuQ&z@)mTtyMLR&FSE! zN_r^Ym$uX0E$LEI?bSZ(iSUX2@9ufGwPCQ$5}vkW&yU7A*y=-Nigt?IM8h(#WQN;c zJGdpJnj-6)*o3cdF`ke>7zK@)w6lF+d6bDzXTSV-OkR=?M}(QRoG9L zmcQu{8q|F~8aW<;_(LoBF?s)-$!bn~$Fl`yI5!N7+UVo^)9y}Tp;!vG8aIf>d!FtO z`J}S9I}8Er@c&cL)hFrPsXn5~I@zFbI@{+zdaigu%0t^6SR;+rp8b07r$noQ2LKy| z|B4myY4-kmYO2m_3Lb@$-3u@`rq>82B*HvRYO94$J|xtA>ypIUciC4&zQ+kAK8?vp z+s5rDYF)YfQDGV4M7%#RF`9HY;x|(MlZymBMOV(AI|xrtRpXh^H9fmt>Ti{eSF_d; z2?LZcde&2%xEA4ucF&T3JPsDDSx=rN4}Gs z%NLIuRLw#HYI}BGPirhiOv|ixQ$O+6-+AnhKikY_Oke!_JfHfOByEgR(PI)ob1L1UPrvfSX9zQOMKtb$GFrR6VH%MG>jI{ljMD$4L%Z|h^q&%lFcS$6lCxR`q6gHa<&SX zb#rhj|NKp*qp^DpksiqB<&S{)Sy&YP2g&{1^;WOd-5n!RULFOOC;hsgT<3_ks-7gh z!&mtS4GV1(q41mTS&ql7P5HW~QcxV*kSPH}@x$E()yJ)>Zi=<~ca9)xs$gCX{-jnw zxYOHhc=aD$uv;EPak9TZ72Ztvq>nCTJzR>yl=Fbn) zive-jwKu=C3={Ym$A}CZMeV)ci0gG5yN-afr@hgOhJnwXCwak(nd{qw(*9W1$=IgJR*j=3 z9ZAYI%w(-J6xYpL+*vg=YD$E*V<3h<3~=@N-@XmSOmQF2a%2`8)5~!quO}(3yi>?S z9CdANJQwjpXIVRHJR8vc$8>uY!8dbr3iB^ZwNkGbXbz>Iw@SCqY<*~r;%PPeT4^Yk zS#rSomxZ_bC%*L6wUaE~`5L97EEa^?*%*H`wY?k$gp_Q|(BDoDb7PT!V~$LQ-#aOZ z8)S@Kp{BLHtHgm9saB}7?yvKdu+Scl<2R-K_yACqoXs#5RBX4Fgmb*O5!>okr5Moz z01?u<@5a89qnTO#hq5LG-rT2ik;6J|tRj#AnY3Q>H@Ef0lk@9(Ox4dc2Rq(edw(U& zUt4*kLHcm^%TRjWkG{;YVA269W8AYv_XSBbS!v{LNPj9e(}Bek7|G})FH(#@m7|lRzXy+~v5TgP@e>ti> zQ#02X5fjYE)ORiCDiv>$F`Yy}V6(9ALQe~2YJ+-D9vUpt?~&OR^Yrbivt0()N13(a z>4C$})s#LW(xX$zm=^{UHqd_>oO zhy?fgqOCeItQ+Xob2(W^;*W^YX9sk#g?#@^?^6a*l{}h{yc~sc!}MzleK63vTNikW zYbjSm%}5YrK?a1qFaHjozYBU4O3Ru^M&jS@*pnzWwhQf@M~~3-_%;y>_HP}(+Dm(6(BPvy?Dh(V0 zV(|$$aGG!0>ZT^*eKCfdEX+aBI9;~sh9oV!9X!iZtJW>*B$o}KRkBYyn zqqtoZ#A4pB9Xwj|f$Ln`_iLLNwGuM+4zA69cLNoBR}PAkiud^u26kV|VnGr9*n7LM zRVh4bft1#xkA8&yzqkG_pT9GMRI^z8x7;{~0(p;toar|d3)%SXFAQA^^FRZb)n4ub z!mggZd+j+gJ1E`J9*(PZ3j^W}8P(NH>F-}^CtPOOx0eQv@{%&p_6+Sm#V_`-nc{YE z*;9Q0SyQ`G16_VB6`V7$!3uulzv_jA_*uDl1*(53+d!MITk0ZFm1gAJyPw(6rFR{T z)^J;P3horWmjg!GLNPLAql{g9TKZ~BlirYh^s- z{#V>c85}Pc^Qd8(DBOIN#Zi)o5FJP9J3mf^l??3Mg({4!bx#c9fE3>}K3At)az=9d z)Wr`_V)?q9N;ZxF--4LX-n14#QU+PM#*N&f%bB#2vs>gm=t|+bk|}y?Q;n^t_DL`E1t0;0jTlW*_f_LOJ5zp)a(`fm(&u1*Iejj4<4aj* z30ERN<5`E4_Ndv;LBeyX5%W9KY80h-baulomn~%|Yri34&c-A@TbGOuCyBO}kr`$x zRX&SKo}pFP%4Bn_C40|v!HNzOQPrUcE^q{`qD|6^t~`3ik!}fBt$Jk5{dFDl`_-YM zggy-uFT^;t$aTBEGIIZR}aw%qI~g?6uo30owbMfRQ9!$51!tt z_TYcT#06CAHUF+OKmiQr>2NG$-BMXT?6OeW=PdtuG|VP=yBk$!v$bk}ImP4O^F24@ zQ8i&4%6NMWe(=0T{rrbrgV^wDXkK%(Bd0ht@~Nn92CgZ1(7Y25n+;xg5cOiWo)~Q{ z>dUpz_>92Yu;P381)Efp&*SZ?V#)J-G+OP~uMEsD&l8h}^@hZPL8x=VE(sz*wc2*B5_S4M8d*miSMTUP1pCTrFCuhpCH+-yIf30vAPZhUQ3hSA<> z|FE3rv^n1|ACyGJOv=j-58I6K_&fGJxOPTAP>;0a{5DGtgM0vt1Yci^MrU%5H5e7J zQyKi$xK6L_-agC}hX}NO{j+QNHey)gDEfoD&@H7tPT?8t=g+U!>%Y4U6}@-wc@u~K z{gxYfoG59&Ib5GcDZdKeHe9+hKp!k%d~wnp(2?j{z9c_gH*V)TPu0V}z9@0aSx{i1 zeRsPpva3Katc<$kmg4^Y`*f~)v8xMj$t&+jZg0?&GvAUa$}+Hw$Mo_nT(aoB!LcMp z;pw!MsoGa!smWH(U%l1s)=wd%=-&Q4 zJkKH-{W*b95e6vXbuJJleUjLye0S;C+>eS2Wyz^_t+<g2)Ek01BJ4xdkwunhVeX7oVs^>!qjB)}EQT=mylxxCosFs($%bM+S{H3W zF824ubZE&F|8J%$+3Y_u#>t^LywkT!IqCiR-3(b?nfG~k`8*p6)V~-}Qw8l}e^1fn zW2YRxd^cg+BEeyHB!c@iSQ&@!6cfTgTm^|<&j;U>>%^N1!+k((j5i+WgycvJ_gq*Y zn9N3d&ixqS#DAacOk+XACra1M5lPgvbKhaTu;BVRXsV}Vz9k49u+sSOWM20+RLs`_a>my~zY?BE(<@Uhj%Fi_9~&Db|FbtXFIr zV~)PMubcWKh-S17SeOxIxvYd0kA)99r+nd|+5(4+fKiB?YDh+XFC2<_-c@GkiddmC zu;vG^__qLH|Ku_^2}6bGpS#htot`>7>O{c>1Vs+X38p>ROdakgbbxe*s|3qv*>B%9 zYW|L*WlaolN=8J-nQ(RCV+g}^Q&lTQJb&EY>15aj%d!S!Kj-Nke6ZJuovh((`df$r zBVL$?&(mNiEd`a25MAEa+aRxrs_z5vLMud4>(+9UNkRdl)3{Ju{dy8G$pP`fsO!(p zH4+FL|DNa@od$mGOFM+j? zF#z++L9eBEC}h^15IQjWhYiaxW)G_S?_i$9>$jRZ68}oO$saLYen1B5#`|ddJ!U2L zKHRiU(_LT;Hx@*9g|dyc@phLNyTsyM)cMOP-=ivw!_)q@#1kOA^TS;wu+a9NXP~5` z-T5%ug>9y(i_sX0F8WPhIDARq^Cy2q|KM?NYI{QoWs%p^g+^MW#5WekNF-xORh){s8Y#`!~oXpnUkAeVnWJJWo*owNqN5O1JvVZR4BrgXyp(``I z#Sy#$pDs(M%O{ckaSd`Z$(CWm49}Bqf{pTbL`*j)L@+Jp#&B+F9t!#(k3!#=bK%yT zFW5R=Gk_z`C75xnVqC7%| zxz+8Cr}d@UJvkzKXzj^7d_N)CqKWUjgu>a>O-U_2;QvL(*#Jd(eDF8Y{;-opCKb9c zD)0~-Kf^=Ct1vh+Qi$s$Dg_4_MD>+wux?)*Av^h?J+Y{Hhe9g;Cok$A&F2(xZ_9HB zNptUsP*ov?ZavE|CU1qzz8RWUzLMl*o94{`J$Qta*vqR36=46no3&FI5&AtdTBs8Vi%e$4B zJd9hnz_{zeB)g#|Qjaw+ac10-g=}g$BBAr|rr*O}pIf?X!gZ{gc-_~XSZcyV0g-iN z{yBoFe$Q*Z{_=kQ^6zA^=dt86`Y=wP~s%&VSLtn*Koi4^zXtpK+%iqP1rd zB!F73n@wLij!Mdr?anYo3LlgZ8nPe7laTc0^cFhlG=;G(AsLMgXeHrrT2Nv$Y43Y| zwX@}--%WAChY`jK73B-ps;snw{8xhBWFFr2mo!>!Hlyc*KUFxq;~ov&jtqMLBR{Fl z$9#$xYXyiOe~OxR_U&|aE9cTjn}18&>=IN~=~KjAv&D-WtI`#rzG4$buy-=vd07}} zL|)r>-xbZiw7zFV$Rp|_rKV40kgd;8h3Vgej|LrtAoH;{Uly!IK7v2r&91a>wS`}% zBN+!d9|gJKC*x3t_aA*3F9WkwBw)@Hm-TcVqxsLlpoxOB=XoH7U1yiG8_n^NwnogP zCWfc_=l(yyS|Dr<@pD-HaAK%+b{DXP5K5g7mftgT#h-AuswsD>Kv zsRd?xT31Zss_*^TmltZxy7rP^N~RD>Df>*BNg*M|xM>ZjaQ@9ZmelDT$3jCXTfk9# z7E%|V0&Fuo)^qwRulEtvNA~#TU=|meqQWO>m#z`_=(8cE#H`wSOgKRP@`=Sw<_nf8 zmfrpb%y9~?loJq(SM_F6O~XTNj;)8r#l^%VlhDRk{)-R}7<*hDow&9(wVVibGUT8R z)3~|qa%O=oE{b+*6!f}_gyU?9m~qe6gaVj_-uf#FLTJozj)0f=cuBFty^3ntIiUGv zLS38xSh?lU8~bIeACU+vl-Dd|*7ZqT+6FsL>?oXM0LIxv51WSJV_fUKwoHVK)W(xm2y7cyV4ZXQ_(#+r^No}{zKtIXDy@n zP>d?x_rdnGn6~VWrlHp3{1(kzdHPbfa zo&fqxWqv)0Q_Y zn&(#CvZiSS2XAfd8z4Qh&kQthCj9)4(VU>!ysSi>thtXW0cd2XL?}t{fI#_fy}4 zTxY1Nj_I3x+I`=QM@j~>wRl{<&S#iPD7V??j=Z^F#DAnLF2J+PY#}o!XnDAQaTiip zRof%%pMDjirtGBxuS>LnF>h{80+y$jg=KsF@vjhM?)b}Q6&;R|N2HFo=VP?1`R44b zU-DP|ir}_!J6~UR$N>$j6)9ayM0y90R5LU161V!(e0jVVb4mZ?>OufaVqxa=7c<+fv_4mU&9P=^lVjZ-GR+k7>b0ZgqR zfP`p-W+FhTWR~fH$%3*vmOi<4He^a~09>E!qxH{{j>~0em}VLA-(mD5q=pxEmX>t) zieY8CJVZa;N^;(5%?|`4Tt$7v(2K-~f6C&y4jgPY8aNmJ>|}j*|CnAg+c33IsA!5% zn($}0YmaYOACi~x)K&TnnoY6$mN-itGpp9sJpNdjG$JDfwtNtDw)X6iHl$0?0F@6Q zZP9qWhGKZ@o4t!sv96)@{w?0*T|^S=TF9=#)x@jNPRl4JhRDlAISZl0_X@2hKSvkP zebyM=cJ}NEJ3hvme`}@>fC1vQZR%&5gRf2dkt08J)ChPkWjfYPh1Rjc3N}mVsCkss zTqqfD<^;p=*RvOoKD4UD3tVdtp%gGn50`(;#9B)GAj^RZ=ovIyNGmi_-OeTco=*Dz zOEsa#*`hydNN|x5ZWcu#vHGxgk+=9bU|YU0yKyRUO;5kvLoa~wp^ zO%oCLevf7_<#Bg z)E5SO9JF%}(nepPAz(Yn>72?ZMzQ9scbePT9ZWxNi>}IuY^VK*h!yaezJa602*^W^ zFU%c*ZCiSGoBS@8&ddauplSK1j3(j%qg4BE{3nNk-+(6`1&Y`WUOen z#Vx@!C2>oZPXI~y6L*(2GXR`uP8=0P)aE2Me23hq>)MGPUvy#9H(+8nG6^e*>h=#y z(0EH~El{AZckB!upjk8~z zkdTy6-MlFP+i-aYP%E?SQQBWpr^RikYL0UF?RV9>mG6Ds_Ylc|(X3u5nh3Av8-tKY zBV$UfMM;rAU20DP{~^g*mZ_^VX9y+^BN+;#@>`HY6vf5w1&HH=4SXAVT$tx`W(k1} zkdX5=YVYJi#Qnk?MCCw|cye5J=?ZGQEAhCRy`cX^)2w$%Jr1izI z)4TjG@Bv_yUt>>EKNDq)^GvK`%3ZNmJ1T}-~)mo;q7eD*u^qaqK{7@(kD9jZ>>V~WQ z*84jFF@8zX65`jS6aZTZ33u_A`mo_W%V{^J7%xY0IGvLv2o;bB?3c=Q$s~;WQm#ht z4+%6I__mTcq{IvHcFObq9%pg)qj>+T`2LyQ)1Y9I{$Hb~Z1P#y4@oKj6dnA3G+hNy z98I?!+&yTpK!UpjcPF^JySuwP0fIx2;2Kz#aU7t|OiqhOTL_a$Jxl^shWEG(`k>dG%! zPCjWu=2F+wd?|uaO(a-})gd+??NwWojm%JxA47_af2W!A(&#S@3MDE^gzHK%$zH~}9I4^IPR zxnq~%9n9`NWQmi?VAl}U*stp-k6-RRxc$8Z$vtv>>fQr|M(5N8oo8qS!~3>R0}}1& z@m{Rzq4%675xin`-PnviDyvQ^tBHyq{FOFtpyR>IQ{>Z@-{+UTlJ2^Z>K*C~h>as| z)$GYj)wF5>w_pVAKE81Gzh$P=>UOWLrxm=F*Z@_}*WaTRd&O{&0Q}%5M$S6h)ADpS z2B_W!0wI&RXN?a)%$L=LubB_k{mTnB6IOXWkK+lOo1jQTJP%fS zEA#tbl_e}M66!>QecydKH@%QVmLd?25}QWfd>o-eiO~sC(=oN0u>rtnfIeca{&KZn zz>#``DE;Bj$DH^kJB_x$#`D?t)SyS86gn_52ik89rcCNbOdYhNE0sXG2T z5X6-Ies!oc9M+O4kcs5X5f>9t{A&IhGkT^xo!XLlQ1O=CkBW?6cYg3C9SPTe#K<{U z%ozJqC)er$nQ5i&)9au$QMlp(giv0!ImLLi#na;P^+_V#{rN-KxLZtiYp_{e*G8J^ zSv(SO?r^y&@8^A3`QswIUDF-BO`mai%zob_fc(s3RTg}CsR-`_-L;WAOE4*nu%lO^w&$E0ey&^-a|Fj zKaAGj&U6yFQo@-n_qJNm%Q0-v1)NI%SilCf83qq{uUAGo-T#>psyj@5N8&|!-|9QN zh?UR6`5weZw84l$1U9=%Rjb&P%>!M8{%ZqF>+gxz>(Xr94uy*KmjV+4F=T8eF!tUZ zf~gNT`CYJn_zPu~4r>MkDTrrGJR%$%z8)Cbvl{<36Al{faE}r}dhB+f&+1=#J%2`Y zH0BdD=oK{H`X~bY6m>_RkNe60f`Tr5E72^8+k_(|V*+ zHz}I8Y8LmdN_C&g24dB5n`z4|L!_XNpq?{*wfpGM>`hl=3^5spk{Pni{=|9yU?+yA z5NAR7?9`>VLe-MpL6@WgHgs6#%B;@5EK#htJ9UjN?(MqWvq>=k3y`xwNl!-cXKzR; zAT>2LT~$j03(Od^73(L`mn*SpXCs~x`s@8s=)`l`79mA%f)+2-vi-bb(IZPiAx@cO z=P>eI)_6dl`shFs?Dl~e42^Uzl}itW9%+0^^P{ctHyKNK*! zPTSn_)3ihn+^_yyt`+4f4tNB}-qkA}6O}n$rLzB_Jd6+WVR$ct8ZQ+i`MkyN_$#;gR z9-r@&%4ssNNp7pT(UL|ic%yNAlsxUov6G6*c86#k*GqGqFytg8J*3u*_6yJEV!yY~ z;xM>gO^4Vr23tN}p3DZg)c-b7(2C7mp~s}IkJF!zeOyN+iySg=u=7QqJ=po}0-Llp zX7|i`6b8D$ zFx!_h0vfF>W~UFxhf|~^P4ChF;qVAP|7usOvgmfi2|hiWPJS6{npd&cY2MX9%~!7G zeYZqQM97I81OJaSw0&(0Et)4SaQbbgCMG`mzO2gf^%FkGST!X)`Mo~K3U4I!b>aki zQqDIG)H$E)+x;f1f2$w|Yr3nY3AH zOth;S)b>1M2DLDbu||s4=XAdIm}n{$-VbA+!T^>XE2iE2aY|C)vpe#jBS7bI?3Im{ zSTnPgvBw?a%_k{WgO0Nw8_Pe+DzuToMkDLqS1C5KyjdV<){!NMG5L9bv}zfFY%G;F zPZ<=K>HZbJDt4 z>-=K*ZEv!T*lR z75u&Vx7n82@J$&ly}t%cj{wkw36WQ~grje%;jVhHmPoTjM?}_EJ#QO=0pAx8K6uNL zJ_hC|+N8ujB<>=s@%{OP6o_|Pl)A1psme#nU#B+lXLxtshTsL#0$JKG?kL*H>3R;Of23s6Eg#N; z7l1xu7_&J+vdiKg3xB^+`qnI&vEBj6$25`4CohaV>sn&1{M}da1kM* zWEj9}`9#ro=Q1=x7O<14N6szAKj<`H%+yv)0J_4^Y_q0$0|byD7;*X$rdP-dIAcsc zH5X$Akdbe?li(@ngQUKoZAdxRiGS?_lsZQ2uLV#-*eF*MKjdP?_9rsb=$mv6tpje0u@v0AVwU@ zMQzz$+I*FV3LZb$U@XZTJE<=9R>`RRhj$gx0dNXLTX+6;^AT zm0p{c(u2oHF;iil+IZ6ZdHBS^|FaV=R1oFWi)|D7G5xX{Bj1wmWHT56t=luvak2~u zTD!(w&d-$1&6GVhvVwuhHv@-cb%9O8pap9WQNgb(sNZ^9na^&*YgK)L00f`8?0r3f z?r>o*FwrVC3K3wOkb{@5X)lc-aJqV7;lajE$wIHZP9r3?jJ5n>r`iruSQ)!8xn zYD(`KdKH3D!3px4JW7iiZizz)cHi?DP%a(?z6Un6hb=<|$x~#z;|qqcmgwf(I2&K} zNVg2a_JG?rh(lSpvpW(hzyp;WgR6f+$Ly-A$$Fz9Dv$K@#H1;}Rb|=oAaIOZtod6vqCj*x~C~;I%csTkAZ<7V? z6_^Mig+e{?K_N}kmj48UU79Y0qm2C>U=@w}`|s|cI64AV#5?e5VJTwGQV~8Sw@Ku= z(uKQQdg_@nwR=nLY7}9>s{zrg4EIKjQ8vI;_Fi4yzuYL*wXB+ny_815M{-0bnp72~qX=}uR2?jpWwRSq^_?S1M zQ(9KdH&tr5fGn>YUu3JIzj|51SA~gSR%p7P5CFSm;_53Nt6AjQibjvw36$A!mDvTB zO9SvdRA`R)7lZ>Mgag0-M1TL6gbm?CtQ7IGXnNryxz&Dc3(1^;A+msmN@B&(%yN^A6Bdw>Br41seu18f zFC= zHpdIx;x(w0BijOx*Fh%IBWrQS1!pR#4Q`CXYi;M2U_-@=irvIGkq!8hM z`gh$y%|3=p@j$N<-#I5j8kRKrzRfyHJXBitQ&M}H#T4Fa>m~`D_cU5?dbUZc+m+9qkvzB{S2 zWSBb-6d`!l$b-%ZlvaC}mlRID z=aZredQ;F8cExGXGL+h{(50&UIh=UavKQ(lyYiE!DDYZUn>@2>sElg0tqD(dvn~8J zXTjGs2c?Y-!}dD?8lDS&NJq-gUj`FG2qVGyI~p-BKWqBKsCn4e(Ki0GyCd5v4uS_C z;-2lBDLi~U@YR}=f`Lx3vU*Adxi!n;TRQl0D?6fVe~$G^9_HQ$9sAkHlD_?Zu#N*c zQn5|w%rK@_lP5n&9R9(d(RtaeLou(@td}ER#S4WFV#6jWTa8RE)0Uo(4x;POftX{l z4UNVJ$2tp|XpbC^R{TI*{yQoZlt?O~2LT`BEtHNcHG<+hPcIHj& zz(f~NL)J%~rXT^$WaTARJ?uUf{X9i?S{1B}emt2mY}2=!FdY8L?t%1=1o|Gi2lWgtP!H`o zY;rXqQGXES&=NIzn~!re_y9j3HBn>4Ee*NDsy~g4>jb{=yYbAgG0fdL*Bn+G(!0P$1eEV67rj-#i$BM6UO9 zKf7Rq9&-oa0d`KVi_{}Z65_d+?bGlASV{4yuZ8LjU@I}$0A;h~Z;6?i5;W#(W+@nb zd;C~bo)i;AB)%O8Jo6?3>mk`qMtgK_)ruvl&a$^DYp$JGKaBf-b4D6u#T#Uy(U>W< z;p2G`LLKCag}uie$BMNxUMjW+|M*OVsXZ*$t;52QF=TyDb z?r{hilNsry%3H<^atkV_EYa*#ONYc~8- zUI$k%b`0K7SJ%X^eFU28KGid$$zG8&oe;v!tDxtXvLk}gIkV5vmFL!!_bG-3PM%NE zr8%GcR9g-vQ>@ux%AHXUO~8&k1z~q{zwz+A5M}h0d|)D_qm)*BmtRBOxmRIM#o>Fd zEPXRu^_2ZPhKRVHTZi8mU-{in+}_TF-@_kDfZbcZEhCWJBqLp5Ov?{@` zUpt>OmNAXSZd$EB`)Hf|3|THM4pt;H`38T1gWqCE+2+;fNn6xk`gu8ZF_ML+W<7}? zEACRO$Oig@`&1%$B%Dfr630nD5yR0=SkyDIvj)q>zVgb|=71}lb$o>7L83~3ip>B( zUvhC_M75k0j)D@*bp0{5K;&VX{${hdIqzcX*Psaky6C~4wz9gtjg?W2W}uUqaGO9N z(Xfw+`f*@2i|Xo>u9V)Nlwbl3wR{DrDqrIG#G+{#!C0 z0HE1`BvYgLVU(1pyw&@w1zm8cs)C48#3Bo+s1ojsD)2Y%o}`iNHMPLB6uZ=d|M#|Ix0wl3n16erd!0Wk|VXqaT@& zjQ8N$&O^HrKZsBLH~t-20+~rcfPhj&%)85U2W;3d9%VyHixI{qhHB|;T)VY)2HDxjmSqM>`^P%C+2pbU%bF(QhH#U=IkHgwg34gslgoRA z1>VUX&?l~#pW)#p>wi!4=6(3Qt@z=G=x&w*@!5H}IZTF_A!UQiTVP7_wA@ z0_}zJYx=;wV&P&jCI@ z0JwTMnuvE0_eLoP-S$;IpPtuF^0_16!_w)PPFXL{$KTNzdEKOlMXwL1h3$~6CQcnf zm0V4|H)AobylzPIY+2rISq_a(wo>k?MQfsLddEq&q)5V)gdm~4AE1_mZ!)!NbPdX={_+ z3x^19qcfv0I=af25>OX$9QWxntUZ&mfcdk~FC)#z0z+c{mp+rma=4YE90>+fxOcN~@{eCQqa%tcS+pv3RGfFWgkbTr6!(+sF{&zp1 zO?F%?q9||dR?t&bE}fmnmsR_<`UG@=uL)KKhI2kOX)k`Cj#&K5khAtuG&Uy^5-oQN zru6spva4KuLWpW@+_tBb3o+Tab~7s9my^uaGr6o?nSG5dKI<>ki4k4hcAvd6>h||X z%@_Vz$(LPHDquH^O}*3)7}v{cRI&y0M^P*NSI)HCPV(v*1g?c}Db&$w^7^juPznY1 z)EcZ9VuPl>ZqFL0Y%mIiJm2MYwOOoW4NZT{x@>3C?bIY&e!08>fXA0Fte?M$S3cC# zPL}aJhOxZ8jMrB>N8P|(B4%JsnTvMsU&nY<7@P^+JyUR4j=6IU8AW*cJxy+Vvyge8 zW3nI&(caVPTXiRkB=r@FeA+KX+tX1Y+9m-aVt)5d1mI`TXx=8ir}-t$Agyom zFsbSNH`o5%jNbB>bGSr%aey22H^?Y(5Eq>8P(lb0Ge4oN0z6h0qeq&rBJoDKd68jp>4 z;NyOj?m4d>45^HVAB9i+BpF(Z3fV7}dZfhq>gqcU+H;<%))X&J?{&h6Z3G{9W1lE@hJVt4Y_IiG)J8Erv@EFPy}=dx)3zg_Hb`k z*Lhb0$*--O_dHA#$3suQ`)^XEh~$bVr&Q)G{{CE4a#RmNhUF;gUB0s*!`-P&Cx8K> zO1WC>4S8I&hytRJ0xU@%HXc1`0N|+mghyHx329yc3kIa7TrZ{Ugl{{!`6OkteSzH% z!ToHf{;7D73J^@LXJfT=&UiFIkcpMRrlCd@98$rcfdL3dmVJ<=-e@?;QDK1VgwYia z)Of9oRQ>c0 z&P5uUK58}t0R%vreST-F8O^Y&R;y>K(wWYGwJK&w`9n#Ku%kv_;c*km(!RaXQ+%mN zVzP>)3hqO;901@n>)7&;9ZrdZMHoo75u?J1wY0RG`;5m)*r+iPF1qd~ z-XDs|N`U1|E6r4JaQa$-=u2U1EJ{5B?W_@UA_^LIP3T>H`z~t8Kb80bh^zEzW{>>G9SbyUz< zO}di_>=)j6I1c0SD$2uQULRg{&|qPsMSPQePJ5=bpbmh5?1llWtbe+uB*1^(_ZRM` zobtcUNm>QwMsn(wta?_xUotPsKL^9|8WN{ z!cq-Ud2Gy&i#CHccy_&x;k}b4b?l2aK-acYC>0qdyeQVX>bd!FIBIBktkKy|G8E*bwQ)L8EhVGgBnu`ikVUIG?S~4{ zDBlzjXHWqJXNQODQ6lWx`@RrGrFYE~#@fG_In1!)6f=U~s}WmYybBR8GYJq%8d@`B zf=u6-Gt<}{%t=;)JO~_ZfjLzrct>k%EjHA3o-5S-)OcKRZAQbT9rYlV9)*hQb;}+Z zoV(TI3Dviv{2Nsrn`g-w;X~pF9X6|a3Bh+isBm5I=CZ@RzbaJPceTT!AF-d(1sH^Q zSFa@zG5>*kp|-P#D>CdIgPl5n3?Pg49S$85 zgu))_GpPBZ<6no%y%!T8RrpLh2N!FrTdr+PDQzn{B8WgV*$7#J%eup+d~e^RX#g2O z5-)OuVP^=r6Q0+mzz;6hMfyHoSd~#eA+}q7kGR?b!sDJ1)|@2QY3q-#V+2R!ct^o; zH$n&EXfd}ClW`Mcdl&b--*vX20Jp54h8lH5b=#a$ie|K?jh~@_p1o-BxEB+p8a85n z3qeLk))l&#R)sp~pkH98xo^omWphG9L2fQBuQSvrR3pJ4=sAkz7I`5iQ9*4Uih@`< z@s^`V3Z~m#&0j5TvX3m~pj*z9T2S+0A_vT3Lg(2JnUwzw8Lxyz6UQtv9Mek&LqB)P7 z$RTr(&%yfaBo*%3@a^i0=U_L6Lqmwt;10<>a-~fUW)U2{(n4~02F)7EFEmXOu;VJX zT%G300o9o2%37k;X;k5q?!njMGAj)vPzOw37ESdf_1{ z;j>5yKr=;ni5^lY1oGQMu`%cnee4#{t-O+vK8`^AzU;fUq!&g7RXuNkkl3bJPDG5; zV>UD8ZE9juu%M!(16g`{nfz&)#fjl##YzhPwAsk-1w6}gdI*`qREJp$7{uLjY_n^3 zYN^dr+@GxB(a6Bbm}IHZ08MH2_;Zk{%ndJlI$NQcrb;u|mAAB6<3JT9z+1fO?=eif zxy0COn=svL1O2kTwI!2OGEFsw&4RbWn+#77EL3l>pt8fy2qk*yn0DL)l!Qo#Sf7jO zBwG9Os0-5l&0g1p&lu=55c;+@w;7~GFp@aok8V#w+n<7}2ay*wtw$%>KsO%XoHvoD zZF#WC{adK8-sfF0#@2;LvEh%!YGP=4LdnevXi)7{e3^Cq*g#iNoywT($c3O}7*wy? zCXOwxw)rtTRWUS46;F)ukOwvOJfD(^Pw2(Sk}`p*FR2?N>@w(H$Df!oU>qg)J#SSA z&%zH&SQUQ8x3A^>A4QFshEA=CTpuxtyef`xZIj*SW!`z zhm7to1d(YM*%xg#U3Sy?a%;-dAukm(-WEP@k=NPMgR{Q-4%BK6&F5AF`H~Yk!`csWr7Vza>;!xPkP2Lg3-*Pd*eP1z zljTNz41LzZW;G+rvhaVHrgeA>PT|hIra0wta!`N#F?yiW)q%sL z%Ikv_YiRyE*bh?CZhxyIp#Zjr9Tfb2%@Jdha)o!1GTNQA_BMuA!-u1a7a3>rW|T7W z@ie2E_zA^YUdNZeE~-yP22-j=qtrWoi!md<+n(a^%SieN3(V%nE`Rwxu0>p}gGw4J zrT;b;U4-l8i1^dk^NDdNQ9!1XZ&c_;#%oJE{ps#qXCuQ0S84(uGRs^tCTVul=t_gDfTY4WEy5Ts_1lu=Kv~D% z_v-msH`gq0?nOOgFID2B5wFd3OSJYr4|&5`J>{3k#GK{f5&Yo~#qM^VveTe(Gcox4 z6SF%FqCY7;qU>^>*ofA9yRDAJb+GPp8}6QZH+znj**&zXD^t|G!!W}iya9m90ltF%LhrU;_{YdNU z7}@UqjlrFh^eD|6f_B}FVx^VYFA%H;)-rA?MaT(Yg}JWLWNz{@6>8pcW@Hh?yP(;E zVg<1gJ{hmrZd8`S;p!9PuoiJ+=yaL_+D6ngq4?-`GWSruFTp4BXnva;mB$V$MNu-6 zUKGX$TlG}-r=DW3TL+q+sWK(nUL!=>X&JSxcqHwYPf3eqBI*9$bJVS1w7ghzhR3wN zD?1E9>vU0RjXM9u1_l@!Gws*UCN+s3nzAC`U*>Q>GC|$d1_C8p;`AeT+ zG^Y)7_-bo6X3e4zgG8U<1+0rW&4G(%_8*Gj#lN}!JiNByvj>-r2kP&s;fN+T_TwnG zK2R|Vcil-N_d-9zL-;fKOS_1=Bcjtga%X=gY%*>}`Gt)oB$9etz{(E&dt){p9}o6} zV)01z(h3Ru+k1@rutSJ}iN-+Ep(A!J06kZ-x%N!v@&@6QK@fCZToSyK)|lGG&0zwC z3-=Qq_Uwc^RE`as$a42piFw}ug6d(#?GtS42f}MH&tIWc9)c^h zbU0rk$b@I;)t8w@#m%i2m{Uh)r+P6ruiCmXcvks26X4*QE&}HRptadqy zRu*Ic7#)A6ZFq9oP3`f?LHK&Tb?y}!-X}R*@SC|GJGBB2Sm~0id5mJWRI!gQ?SoDWI)=naN;~z{~k6X+^FNSg~q~`JKkd$h!(!xYZ|?1L&C5e zK61P1&_{^Vt~9VyKSS^h{_1`a>$*o3C%j71^}{19fR0DYeEDJ?jS0v1YCx~ z8^7=Fn&`xLFWSnVtz_+B>GRhWtu__R_3;z6a1e8)7gE}pWd{wH^rftSgY`xKkUhWQ zX@n@@X&rtOsf5JB@Pv~5b|pt>w=RwYBgkj_7{l-bxp=e`5W?M(qp6W=gXl63W^QVO(0TkrB=#Y5Vh} z0~~Wu0ae|sRU;(e&_W0i1dky~C5Ry&1KQ2%F>ep89F}h2`Ur?$*SF7_x$$I79UJqmh%9Qu)jShT`&)%~U?u4P50vq%@eKc(D+7IGlEhp7qW6so&eyv*EhN1;O(O!n|&_5#?IzRuK#Y(UO8$uK!7ALjY7WVE~ zscSZyvO;tj*Wsas3JH@;Q7lJbfL_;jGfHo^9Hkgn29>sQ9SXo{(+G%#Pz`%%urOWw z5~ zg3Z3cKbV`K(~E$~+x_IH`XXPg=|qL~RAFE5e#W|{1p@qcahG~m-}Yj-b=}D9_C@ix zY1zJR)`A^$bGsnTXu|WRuP1ZgeTaIL`ji(4K^`80iiDu__%Q6#ca0U)dr-f0>>4{D zU3t1Rc1Yvv8$7g9Gy$fYMf6E8j$^0InjU|WYIM+-p?Na=)U1e@FnG5K)pbKae}&)k zFC6WDKO6P3g;5P*V40@Rh`L(^MzDWJqjIsxu~&w|^?@hky?#}vqGIu<5}sq8E)Vt< z|Gg6Qv#o+Ujt)zU!~TnZ@gku|1!z%;b5Gv0zXeUL#o46Cc&9GhnJ2eqzuLP^U;&7r zTzLHmGAfcyNBj?Qfq5LB$38obNwIdF=pUafR6v}gg$7*;jihE_wSD6Ck!F zR4}g|n1`#Ws<=mg3J)m0d`Ntgcbd%kn{Q8$(Wu5g1tUuT%{jZsFXs;t$_E0%mi?39$Zo%h$t3(F=S*uDKJ7n{{8W!?ptl!{#PFR_2>|4NUI~1l-=D- zZeI(701eLOTDN~#g+~Hw`x%l}cH2LY4yBKYPrccm!|Qw0{yFkDyWkmAEb|#C>G_?! z^9Zi}7el{j;lII~ao6DAu^dGxv)hFj|8y!%3o2EIJ>8v_{QEq3I(3fa)LVj&VuqZC zg9to<#+;M8Z3-c0v*c+e_OM}a!}`*8uglJ7_n=!A9p2;R&YPY0$HIzD8zB9?E>DAV zbL-$m&^<|;HjMxTt{%$vgVi;G5^^GdNh{_Rhh!2e{7J_C`;B&kclQn?PV|UTf`8O$ zpolvUj}<|a8po?ud-4{?9GosX-J5m80pvHL0*tmpGRFs4^e)lw)J z8)AP|?UpB^w(`hdcxsP6;D&elxafVY5pst#Nymr`_=0iMu;W6!38hOJxq*h}&5l?P;q z{F6lPvme&>VAlj(`m1%ax^LRndJY)3hyOaFL8lfxRAJA?oh9d=Uf(3q2W~v3h@ae9 zk$Y@w{gFzWAA+%gN7o8q*sPtm@65B%#oBdyuwj4z)LZ(M3$@luXk{q=NEhH@q&mP= zAa9QEwGtDJaXUro={OY5<&4YTkmz9gqZv|ZyXAa!$ z?c2wZ+B8ERNIR6hJl|1{BE(Y;ofRj+`P!o7*!$SOpnMM*gaNYZw@LANxLlRZbQZFW zl;~6a=tW*-AbB@BD{hN-XlJqOKg0+3L7=0e0Rbn!3|7mqdw(q)1z?kE^_bO(L8^Ro zpjG)O)^Y<69;KW@iO^CRm1EcC^_W8Q_kSJX`fm&k_HoQ!)Lz80L+u18aEYQ0W&CvQ7G!BcM!j!;Y`zEgxls30$+(vmzRzIrJqG+Fyqh~%m8#};%3zI^Yo)J z;_V@Me_XANgt}~^vnhQrkW&{9(}8#R`*mMTWTjix7YGt{tamy{+s3TVz9{F!`NeI^~b5`xsQ^kwd1S!KS|u&LB)RA ztP}ZLH+3Nn3omZj@n8Jt#3%3gu@>yrm`M2*q4BbRbrc3@z)teP0#D&F3efqf{} zxMkJSiXOrls`{vkq`+)Tr?TW8Acd}c-eO+@$s+QXWIltxia7<0;ZQYU(T?0KTgM;; znIZ-4Aie@^tf`J%9K`s{*WZ@W$PTi0ug}6iNj`S<&gS+g-Cq0=(SI(hCie&wDl2|{ zJWjm81iEOW=gxS&nkz8&B+0fY+L`??H4p-}FCRNeQ0}dD`io&Cdd-QwO-EbW?&k0* z&$Nia+9aqVo0Kqbyn1Se5RqhTJ3}+7LwWET9gCNnlZNs!PYnh?%w`&G$K|@%Nc_)t zI{nxU@+W4lOEGXeRM0Z(PNZN0UY-LP*Qwid408pG(#|~&m+;9Uf!t?-EBA#W#&czV zpKFIgmIj)OvJ|VQy*U>!ohdnuUZHJDJ z+;&siNR$%J4Cd9NZ*AQSi$7my`pi3JC|9$2XD09S4xe;Kst4OJe79eo>r!LTImzs1 zFU^y)Z%6IvX&DEwi$8wIEfbPZTUJQr%MaM z5WbfP1)T3-=4=3+c^`y8eIG^*`C_V6qX1@V_Dy18lUlU&_1)?oy!2v!=FIV86`mv0)tPk1v;=XxZQzs>hI>$_eB0}?J}Q$=RyG6)zO@$wt9Zj zk^l-hIl$lVnI0_xK|o(%KICT01D2$~Yp<#j<%hGA8p(1a9VJGGhyD7VIIz8#T;9q3 zp8qC#^(e||nv&z0>8u?~6#!IpU2i%&nyI9+>kg`Epn>G4um=RN2m0l6hwVswZ`Qne z&YR5*?m<)?iEr~|JrVE|_T|9dpO?>MxY5)fZ>$E_@2Bzh&4j9b~ z3z*h(Rn|A94E&MC@BgQ0$N4jTPMxJ3oBlGqpC2Y*!CCXn*YJt|CH&tIl>F7zm>8>( zB_!z5NpQPU3r6+tg)$D+D2d`p?Cp5{AAk9$p!)KegXLn!oS~@F&j~27%8&Ph| z$G_XD$;7DwD|t!U5}kX~r7DbTE;#a8cPEYNP88`)e&^dQnK)Tc3YB^tJ4PGzq3eEa zkINjzsEj=I9@Ry?Np|4*?k2PtF~jKgw*CAzCe|zdQN_x~=Y031$@|Ew=c;92Lgtn-}Kz8Z< z*sujUUs!uppzt#`Mj&KlpZ#%?GvXaX7DM=Bk^r{TmR=4k1@g{^SMromS@<>`l@iyp zpqTX9!v$W zUa9@G0|dk`=|zYh5U;|}&6xh3fE3b?5Y$2W&aw=C4hAiTuOS0`>}p0J5=7wM8VR@= zyiCGr%dX!z3E6x7e!dpF{|U*`JCw(5s(+gLt))O1=k9X43`j7z@0~^P`0r zIJ;Pa*RarbFcBm3L=sK8ij7=+kif2IUMrHgi?Lqn3CX6ySQHOP=NK{`yj zzduvM9{y=xMcIFb%atr1u#a#^B-_qIO)ko>!{qQhne;aw#7^+}PVxmmosZ8m4oJkj zTjPftoj8$HD(XL5{z+S-!v4X{W$K=p+7S^tx2+a~vcy;W)>rP$8w0kkS3wa59Uf?l za1i6+!@p5YGY~DwG1p|`Re>~jbwx+%LV{Or{!*=ttXi<)-u>MM;vvG(&tZlS2O;al z@g*>WCK`pZV|K_0fNuI0G;Z&5eo7NgOY(R6szln!4M?kG8RK zO`KC1ly+lEUEXZ3c8GTfd8cS9Yt8!#A+NonZ-zr6xOH`F{Ld2+Lp760lyUgWj?!YT zuH?}D$aj96p)|sqqAe*QhS@CrCeRVy0aXC6E`wHNmqSn3Hj(NadM}S>Ff=S&00RciH0dM2Cf8HqCH)V?D%=sg~ zYZJY`h)JZ%5ueYAP+XAtpLlWTP;Uz9X#~ocUu|lj0s;#@t9j+(G&qM>Xx2Gw0AO^|>ywlbKot%LBsQCOuD*m%7c=5~ zZ?CuQ&AZu*KlAdY0T9Ugn-?$wPX{M4k_NAO+T5Lq+76gDKG5F?dd(&C*WZ=y-TG^` zdO?0oz1!t~3O0}%z+yy6x_2n)@!vhQZdlZnn{m1=-&t3fRv+^jzVe948GAc=9Knz; zX7CVRjGX-+7C;7rbW7F$ZgWfjY^FDRVEq&zer^!^8)b0_R_&FN>ibxJZbboJ5w zwBSo|FppOCbt6|4m-U)Vi`R~WW8~w0D#_UsgXhqeY|_ipsr{<4mJ;7_SaJ*+05eVN5H}2K8GjQgtq!)!-1}+2k;c>b^l(|1r%GumMbMQOMGSDT= z#j(cbK~K{@MDUUkW6%=m#K1TWAxJO8r|NX&VB>+_<5ROng4qwB@S>y19@D9M)a_JS z5%fb6<%%x)9Tu^-PmgiD$ZF)C9?gRHYa}+JK;MUm%q*tHv1zHy@Dnw-OQh|^ksBO< zyEU+4YN>0T@uw^rrWEPIQOtMlgt6IF0!aV}e|1RUKdw<%4xb;nc`LEWU7jTSYb30W1aXH2`L~wTUjQ}JwqddS`bO>7 z%jpx-3i(3%$q23)!h@DAGR-gJmn%*)f z&ZcP_K7rr_cMtAPaCdjN;KAKBxI=Jv*Wm6JAh^4`yTiBF{k&gQ*Vgif?V0K6?m5~{ z#Lmth2H{!VGA(?xv+2hr>Pm_j#%fwSRmMMxEM_+}1bPfv*PzLHu;iqC3A7Rer}5q%hx+Tq=U0VjXeIgTNC!1KR41)6{|_1ieO_hMPx;QownuPM)C zyA>OasGUE9ZLg=Y57>=Q0c}3h5#w#DHpD#FnnU)`PoxKL!T)v8u8^?fBkJV$jI^1!)d~<)R{+GT#p$?>y_?Hi;-q3Ai^mB&424 zKCRzthQNV0r82ZHhg|}mU7+OB?&=LUu=o$`^(Hpb@^oa_68QOjZ2x}6mdgQhPd*7^ zlwYlR)1VG>J|5i8qs4dX8_~)rNX^*g%%CCdF@B9T2tBrT zj(~j&@Zc$P+WI0N(+yoi4{W)5sRb5w^(q^bbbB8hjWUkLg&I-FY+d{(Wuj38G}HQP zZXni@Z$95{8>00MKHnE=KQG5-Z69IaD8WR*Eugay6v85#bl;9R`Oqwsure!P@Do;! zOTff!&wN2Z7a;Tn1{{?LAf|>E-};VFB0?q^K~j|nxyBqymBT2A5;W;_=mvt-JQj3o zbS{;MNP_KGt7)( zJ+V;$#c3j)nI%vV7}hNx-%@|A1$5P_0v1v z&GcGh)eT?K#tW|yC1Y|hFw^&mWpC1Z&;Dh(Lv_fyP{2Rr-`m!3raJ@BGI#IVn08+% z15=rt(QcYqS@rNpEUWid|Xuoo5TTOR^6m0Fa%Oy76J`)WjHh|jGe0SylpN}ZVHgi9rQ~-?$>bUiKUL#GG&M;q>k8Yq z+%^Z>KWAJ;)^)mbtHvFSb)k^y1QTl+P=F#{hWWet{l17Hzb=Jr%h*-EIo;aGv*Y^2 zxbY?_7$E8^HFEnfjtlzw5eA84tp9e@S^FF>n8?O)D=v`M1!@+S`qt~%e-pbQ!%6%b zHJMwrajQrmYJZboMnOIE$*|xz&pR^)z-aN&fsyeru4DgQ5!?lHqlNOYDvJ*6Co9J; zhmYY&>mwq$z+<3jzU0g4-m&Sk#PPjfmg?0;^?--3@|JkX#9E^K#K!Zoiq3ZAh#Sw~ zi2)qLDt%1AUJ3k~)f?seX@NPVY}(D-@!PW#BNSZEVIFmc`V+n1Z75c~d&Wkr49?5? zOJfaDjNJP+yWN1O#O`Gk$c_BL)x~(+(oX-Ic8Hw!b>uby)N1?)qziA4iIL=%6Wgqw zUn>ec0{)=DR?LW(xqTWSG z2I(}nQqLBPMcrODQw9?g&J546Z7E@RVvIS3l&iWFwdgSEMTor#jR||FIGzpU-ZL;R zN~^bpeV2n!I(f1Qhqmn(aOBJ?Fn~g%-+dbVO!(#^3c3}&QUDb;!CQ;&(oIqPd~HG` z>jZ{bnRfM{?17nJAxlG6s5e5tVnZO4;lBv5h^Bgt{Re7?5D5ku?-H(fg-3bdHf!e%#NLo?Qek2E6+Csvw!kzd>$oV@REB=^Vj zb>n^!dXY7}E{>*&UXSorloS~L(jr9!^b;`-Zpv+jMtx8Y6Rmyfb%^SzT$WAL5(xq# zXUh~UH4YjpSwlTjGU(leuZIDNmomKI1GOuU|N0(3NMbGN1v9zx^fVaVDdh;AtU4o! zb$iU43vgR9$2qT%zjyOB1`ucVSY5}%Z$4j!i163>NacTz&HHjetYxj_)rp)KIe9J! zp9dNCELLI=YuUc`v@BO_?P069BUOF3}rQze{ao5(H|U zR1sUO&f6f9U3qLxRT?zhE3agHdMbkhTYnbuq(m8h+iP1p8N?++@h~KRncCb%M0MjK zjl+bOBs+K67`bjP4z0G);hrAh%Rvn1afgAX3)Vpc;byJ0KH#0CW;M-AK+=~6uW4H% z%|OUQH^*Hagdm;6k6=K|o1Fg}*au2pZ-2kAFb3EMOPMCsmLnHK%2>?qP%%YT-nDr2 zgQcljk$R0C8wg+I>{Wd+Ir4F2`>KC$So&kC3<;Fc`X}(s2Lzb_Ogb4L3k<=XBAvrQ z>V1=}d}i_x6nB;8br1OKjT-Q?)BH8SLC?RtN6P77su}Q-k+p!+mkWPLc^;k0eTpI| znX{q{QE)#6fqm+2eqy67$a9MZ2eb)a-;IY3REm=&Xx_}(-KHch133Ngg`~hYjvE06Qoz_qp;t_a$TS! zbb9u))(Wwt)yQ($ipRXDUL;igZ#v>Iicy_(EFOa{Ar4SDXj z9RqpNT8d#a8aV78+YjpIZ6pq*$~fpGx6!g%I;FS&UQ6SNA_HVjjFUEcE9NoE_rxs9 zM+;6cX=C*QQY8{pfrED(k^Wg%RpH~I#5_=ow}pO2ahgyDUfCQNaLw!FJBPfwT;w9V zpJ)GUu%Lv`Tnx4j7$+uKgx_o0h_&HJq~E!nRC!U=qk$5phtSpjwd?Mx5rIFi5h(R~ zOn)N)9eD1r&iK^Y0MxzSRQ<2`{@QJWSlEmcKU)41uRxcFqLW&4nvHIYsqJ@mVG}oJ zNo{|xriay#Vo(9zuY4oedfa2>{1Z+ZFR1{o%TfqMrE^OMFNMd;o?J7Q9^rez@UrEi zIJ#9gv0fU?AAQbzb^>-t5(ec%fFMT#qYSDJPL2{@n@6pzru?5OEb4ze_p@EsNU$$ZcI7N@$s`;IpEvp^WIkQh z@$DW<+G9_i9&u*B;cGnvIes?e`ou~}EN5)e+I|Q3k9>P+F)aDb@yWdZ3#a!LbG-m_ zjcA)N74$j7zQXvX<%gtn}WIJWMci)hy0x7W|t7a z{1*}?y#W~MHtvHT4wJ=`=Yn5J?_|1z5=zj|;mP+lm%pp`i_LDXnBuUQ?PGS6 z7dmD+%s9&^M^H#wyHhg2`MkYf9KGMfO9ut@V2{p3u3B^nQ)n^U?&;$le{ja2d=Zbs z7UIN5#0yzvT7!`Tdd%vP`3?Musd8d(JiI9k0=I?gT1T&>(_(C)N!KzG#2+r)Jqd_@ z$4&0ewm0<(#+md8R!)V}s4AoT$Cr_)!T~)d;f#kvG4e7oiD3RT9{cd&s~VY{ zdT`fDirRm=zo0rfVh+&)#LQN&Gw@2cGRLcXqcat`qtbFw%JyI;*El+eF;zeksBfC? zlaOyTjj<~#91zZ`(tmq%J7+~GB?RU_qf0-SI6^&AfI;QY#^CdQSc{`xgx;g8Uk))} zH|L&21eC@n+kP@AQHK5W0e`u?jZHOD-|I*&1^0jQSY3R>GjRAcyIX0g(CHYW-A zKMkf)Ulyn6&h)U>+Oyc*GLyYmtVMC615*+#PMe&(mKOTHrZ06@Gw%kNy#twwS@NtqPzVs$LTZ5-+X z9VE44R=tSc?7*awO3mI)rww^CmVHW zLLJpXhXqo2u1V|T;sWJ)^%Ti(?wS+Z5MggYX?}ZhMN1^WlnxSGT|C8T_LVUNATVXV ze0lY3US(NvWx))pPISgxSZfr52wR%< zUc0ac*Jxck7$R>EmU6GoW^I}l1jkG6vwyCO4U2_ebmOce4E$K)e>-rsOF#;|Tg?Yk zAOIgVaJ0X-CKc1Cr0O}khWwTQtRtkCU z5mvL;Nx3DQ$n&V>jk#ZbOr(N$dhWW2v9xz6t+%zX5q+@W{jfapTVJ;AxzDj}ht~|Q z@W0~;JvCtex_OQQxzf>~m(IVo19c*FZ`<+0zZ(P!L}1&u!VvHG(c&rz^FNx9$uN#+ z55HPN(5oh~(e~>q>9%}EEJSUitLH;R_1VMu)6iG-B;F3u@UBV|$w+S<%wA?J?V%qZ za@A)~cQTQZQ!`Ujh+?4ao~wS|Z}cB9Yq9PCfIr@6-&rXE-YwjQd|Do`HAF^P;d(Zj z8Dc7%!_8%3)ImcQv4N458c#ernw?yomX-W=v==lDr}obVS5fR(O*R?5;3iwJuRv-B zsk^)J*X9y-joGhJ6Ox`vPT;4s{Ar6&n2?_4kq1Tsby+_a!;f4l`pyvQoNkxmqtqpA zbhbNij&IaTwa-)ABy{vR5iwaks0*@!LdkKd{xxb?hQ}j{h5Tm9a&qCv1B;Bf8TMAJ zX$X*O8;q2kub7q7Dq0Ep&RI|Xd>)XmBQ9=B@h?P>&M83e4qxTgn~t&fI<+jEm|u+` zItk(X!YrO7>7QrLk4Vag%v?>9+-huHg;|B)jvuA+9XflyeUv6K5x6>1^$DQVCt9%< z-5>}6UkwvF>?a5n0R{p#W$20?9lp2BnmTaOC-%#7(IwtCEc=dH^Vl@u{dGkJ3wT;P z3^a90teejFDn;8YhJ!)_n+|c{4**e0=+otV8b}5gt!;mSV!qF;om^53p7PXQ43ZId zXabN){@tW3?v_%f|5Xc_E;gWmZ>W9>ZQt=;ZC{Z=yiAmS283O(G7pR=nY~daM1PcZ z6li9WVUdppNjai`qz&&$mmz2D9;NLbCO-d+QyyC42Pa6@Y+U~xv~ro=!Gv7w^rsJj z>dvm?K6q`%b7Ose!bT2)(uhcS^|PkuOzOAE%C3?kzd+>4d%Y?adBD$Vcvq{CQw#?E z{h~Xi&77-%)z1W1xPys=t!x?xQv?Y!7Sz)mVCtSjBX*scA%7H$-y7M-qy>=1-jBWXtErnIlm#fLux02xdD0U4#*% zd*(nAYOXw$OH{;$wKKx(4eSe;!(+Lt0X*WH?prgu?5U#eKIN#Bm*2YCn(#jac=@*o z%Jxt39`uqH&gooJl{qQpZ^BYd$+NZ`KfIUM>U?Pp{-SvC_C4#Wn;Su;Hx{#(WYpBR z7QDGTGQh)>9Dbh?;|5yJFr9YjxN1}yk8~XWY&iCru&N;bS3Z=r!Zie)RggHYBn|QW z=-s?b0^SGN!x9$*%9kH7L=Dve6-jI;LRP}uu9mQZgh)PpZU1g=$gHvUd42TdFtP41 zaV9UoSJA|#L-lI%Z?1DJ^uUbO3g|^%827wn{NpI{&AK*+2~@6ZGaNns)vYq`6oY_b zBuF=wY!n9h9fR9IWT%z3mrpt43wjFn<8bAGWsj@x#CPM$G9vf@l3v`i-MDU_Lro~F@4*=@2tip>CM z{BB^Pv@k@(mYxrO&e$Bu;)3V%v^GV+nwqw#@kxEa{qa(N63DY?&M3z&CF3eEOM(b4 z2Kl2;hjZ9iJfRlN%tjd}z!7cX&7MibVbuydB7jG+&#M^Qm6ioePF4z)NHwQLQMk+n zg<8sa)XH61S@dB$0ZV$i0N42@Jsd)#=!CIBiRd5uL`a0XmG1`hcK2oB3-Lj{zdbuQ zn6}&<*L^DdQ#Pd^CMAV5AsVFrZ*umgNk*+jg3xil3ISs4Zb{ z_2Y|T{GaZ!s6w&5KhkRoHc#mYq5U1T!Fapi8Av@Q8TLR`5gX&jabrg0l8{KRFh)L8 z*vz=6v-gi4@L+xKMNVj>66-PugIhv9hKvZmK}1wqe>R^Ehns$Mzi2&ha_RztpxqfH zA2O9+!Wy#NG;@qXggyJ^XKYm#&-Z33+AfVkncN6K>7&2QLT?L~UHeRUEb6kDmcw|G zr|}t4cu#13RT(_zntk3gQHY^nU~)pQJd|r;0A0|ysyOVJ*%4e$DHhK!B3Mr;6TFvo zt2Yy&{neSAsHUusVCST$xrPz`Z6G@}zVL&E*iJl%6VJ>z6+q$?3BWk|tKL3x-yW8t=8XlCzj1rq~x%MMSM!8b>0?VDOp14T+hx zNBnL93MrA}^*hPuu5)5gqdH6=O1#MFKN>bAo>mX;^2`6 zZ9b1GSXXowsyywqkJ2Jc3tB(v4d; zt3S;Cb1H$P3?bRrPbt90S$wo8wMoDW&nmu1KvmzJ?RuES4WSa82DuLHy4PT`=l8yq z$9<3?BC+-;|FvOE*Lf)aBB#9TF0D-gpR-p`@1T%Sz=DnU`t;%aAI^GX&C9Felt^`_ z`r}2-YIj1mf5pYv#V?2uQKpAZt6qJGlZ`yu@ZU}&QC8Zn012r+UDwtKwdrti2pKYk zggpJv*&>`Tz*sUijzgxX449-?AggLx$K^!91~1YYI&B2lBMzxs0xvSGdzv?68p?cn zkiW4sKJu(aI*R*SyrUfk(g*+)$_oi|sq_ifU0FJ}C}@MNyptrxi{^`>Gv>dHk{2Y+ zDA7D`QI(O&`cafK!16@!VGFVudj>dq2HarP-`>LA9%7hnBlHeA5+yJAYHIV)>w7fI zvyZ`|MSQ3#Rx>*V%OSi(g`cPqeq z+i1qtR6e97xx_H_=S!B|62>yaiW5-TC@RK()V8f_NpiZgpU5(4*6qlW^czHaIUR4Z?5r`^(xTLETz_g8!c>fH}#0ao`l8(fm- z)!a|h#*ZCWuX}RPn;(e4PY=P1&FzIVarsy_4~5KEJE63KF1rQB0anAh zJmUAyp|n4-Z+D`^hHPOT=%n`)PO{XO%j9^I@CNZD`!;d^NJ?Zed{@2S2=)arBeaVjck)T ze>n+y9;Ukg%3Qd3{JgDrE?sf=OwBxw#ET=UJmScybn4l_ta+>CHq0Crxy}{t)^&J&n zuPdw36?n>R_^!g>%Zsy#jB-L&LO_^jH>h7Hnrn5YW z2*SVkOZ)euR`VP&aCyhMeOI+yk`P0f`yfW^-K{b^t5*ASNuk8R`{eo3jL%2G z@=Qco@oU#%)nwOPWh(D()+$S+{grm?`R^XB-rz`}p9!l2CiX`Z@FfmNBhWnJl=lCRBkQ18A?_K4`^ z$9$|)!p!>htlKUtcvu{S&7Hb;dGaa;cRUt?ME1T7uH;Y@26Fa`r|R+ z0QTEJgvP|i>m7uM`X+?(`H|O#r?2{SKhK&=7R%kDDUyDslOp%|N?ZvA0fz@d5CiUtr6x$R zY7dlvpz~o1_NCBR1Odh+B4qminx^qzB#sGSK-Kf%F(eK|*Cw^%Mt-OmcAhaC>H^X?n2;>fty-T_<< zw2mT_9VI{6>b3k*6kRoUxL|+nmW@Wbo|PeKlP1S2QP(X>{u*n$r~}>0u^bF>@2;OS zxqscpOZY9R#TgRK*jeWs_QYOeWofvNDL276uL3`4=8E;&js2>o_ zlr9Tbayt|b+whu%)fnl*o3k?dNB$mken2B$uJ$@vw5|ryk7*22v>5Vn*v)t#)sjHY z0ilfB(`DQAu{~<;^vGNMSi_;Ark+MDT_U60{5{@514AucsCe39mtkYxrkbXLZJPPz zhZpWZix4)Y<6=Mq4%g$wsE@7t7~ztxnu+r-?ULAvO_S!@(iy@V9~k%{n_B;q_+ep! zh-VEV5{9a2`@E(wo*M&0rMnt9eL@HT8VjlQx_x9-zJt4MLm}r-7I9(%r4~+lx(Cv1 zW81{ahd5bL`|lo*Nq@yb&C*Wap}0jZ(H~ zLVMD7$ifx-nBlth3*r^)5s7av;4M9tmJYa*yj()!uE6eE7#?~*%PA)15&v!M2=wHj z&F6d_kovj$Q?BS4WDq|s3GNpZVj|Piax>F%RbA?-Gn??vRh$@MgjCB_8(bt$1kd~f z6;m~FY-?}`Qx~sJ z!dL~(EstzNt&CX@&i4~bh1P%k^~s!Dbmqq zk%JdZ+LiLn5(P0!%3)M4N90~*>NQB6DGzQ9oVUlFv6adEZ}$;Aji7q5jIMFRyT_Qa zRrT_PlliX(Z+6M56^k4#6{=O^KX-D~Hu*pv+0e3q@53KLpyzE}W3@tc*;t!Dp;EiT zuCStmO}+-nOOJ_uZ~`kU_T!M~?N?GqQT}$jj|+hTS95UOFk45OKe2KC-=St=bjP-7 zYWji1rmUO`D&>lfBa&YNKBcw%P6JuqMF-nts6YpWL<~+mw6r!$t9XjNlS@uW0@;T` zxhB{&p_9u=EBF2P0voxa{V{17`*+s@pZ4hwU7`DbU-r+n=hfEDaz{rTlrA4-yzi_b z0bTo7LLQA;7yEK-=zQVQs)+TjPP0S(`dy94)56X&FoHVOI?(QOCV6LS6RtA*G&1=M zV*QR7RIbGauXlN-T)gt+)2~@Q-Q}D(HSXXag8M+$L&fG2ra_SzL}8jlv+Ro%f1O){ z@6GTqW|=ijM6ha+-E~-6?BgiRtDaBxn?G=KliF68Xb?Be7juNu3=H6TC#FzTu-()aY1kbnh&eG(Bc_Y)zkC@Sn?7S_duFIvTj>cSy?E zKeOv6uvl8;Y*F@<6WIBr8dGuqusFfaqGt1l3E9FHY}kx;nC2J~6Znn)=+bz9N+V;q zrK5ddxItg$(_Hw_rWve=oOcZM&OmfbpmX%l=>Qsu-EK(`n^mDX-L0X)0hcG~xOB2& z=Wt%n`KXmi9^D-*uCmA32-;G9`6}#^WH;d|9@k#Ms;&FywO+}-T~iTH3%GzRb`#X_ z7QDB6VfyCby;S>3D)-yHqbS;Zl3Pcg$NoQ+)7JkrGa*ip+?gAt(pq$G?=;_E*&L;b z;cGA5crk1H(U93mbr^b1c{6@NrT59qA&*;hj#%@}ZMl~~;7q{SUWWapH=)?H#5Ghr z@2`5J6(~4QyAI53aPWJ79$gR$0)RbvQ8g*W5MrS^eQSBMrcz3a>c01%6Usn5!SeQp z?a=DZ(t{G2wjY_U?ob5C6i>lOujKrWpwhRW0atR^OI%-D@LM!(MH*d1qFtP#t2Xpt zjV#RqZXUk4xO#oy2aTL}Cs~&^!HwD7P18&Fk}wD1n%>p+4jASvA6vb#324!vTH+6t zVQ7fExPDR~5G$@eV~eNiib#@cKI9w9NX8>`Tfy8~ZJFe(FY8C%o{$FjW=KewB3KQ- zotFxI51su{>)D|XgsD-p(~wKKZiLa8l~^rEQ=OLm%gA>A-2c)$`Rb6s!l937M8 zQ}UiW$?5z#i!svda+xNIa$-_Kko{xF{vm#IM^QsmYPf8_PcXhrZ>1l1b69CL{HM0) z?6l+OaYU>k=;H8P4Ki6D?ctJ1Ne_~Q$4N*Ip#CFmi-y1|L3))aG<=yt$;WUEmbLt& zX+^)F9XWsOYBhIKDvyKFcjg@J`Fzfjphc4}ag@Nbje;UvIxgJ)!z9RCn!)vz$seZu zo6-!34rg~bRCWF%sL`*$mU;ayh*|?qRvXLHU`NAi^_Z-~)MY>0YiuoTYneDdjSp#9 z_Khm1L{nHfhT$Co<9IYvUm%Z#SmLoO;$zjug8h=#%_zXUi6jh3^QlqjBjaDK#&D7` zPDphLV^>d&wHA&aI3ZZ)QNC;|kPMJ~_Mny0;y1R|3(th+gqB1fe>YaV=OvS(7%1IW z4xhGm@!%~|o6k~&`>mt={rDUMDkE^$BUqG|3^Me$1dNMSFA(tMFAR>`d*M2t`22Zs z^cl|2fYc(j@tJaYE?!}w0qW3Ch>UPU0fvhAmdfuk{CDLHI zbN#%o)sCle=vtJ?$Ru<76Wn~z^wkiUhhP<_EmdXT$YxFQYiay;m-Fs!BWdeF(@g}bFA7zR?HOk*ani}?hl^K>67FC<=htm~E_^9uzj{dvIXBIRInS>UV5NwfkmRzEXKg4=Pc0+^ z!eW(ZO;`d4cbr>kdBr2wQ3|4Bl0$EIHckwX_&N@(kovzY77p)T>A~b(Fld5(E1&|f z3*w(4V60RY-xb}*B^4(m6}z_XeDzG16>Y}9{#!LSZ&lkb29Yn^NMcJVwS&^)u&X%g zbrgTs)V_|EEx5m5%A6VXe!a_YrZ-w)dJu%m{nLf$4=0kgu6b5AMbliwvEU9dUPZFR z8W$=Qa;cT%07jXUT3>6;V3Y}3ynZ;+;PyWpNb+1$#40iU0VzJzi-A z-X^`Sr~dS-cr}0ih50s@7XTKd2*#{^tY8+qqN^W+m4NbS$P;j%6qzFx=|@5D>lAGR zQgE+>F#etDjn?H3f>134c8t?qd%F2pWe`H~pJk0R$eiqC*k2Vv` zsHFX3=-W{+Vi5{{fhL8nv5eMBr0r@E(pd=_2kbBgm7@nA(B`We^Zazs_q?3?d8{gT z2io{bL_Aqb^Q!ldU96z}c9#?Oz&|SABFNN}c}yG#o7#}HvO=ps{haEC3MIviRd1%H zk3pO?D2w0c8ripL)adK2Lj{3YVXx`v=-AxOueOC0CaBPd6b+HBM4L_0hXP_&*RTbh z^VrIcMpVZW%F;o%?R$Z7#k4CKlMn@f-`pCzy2gmH5T!gCL}nz~;-`sbT=0>UeKi?i z2|U>qamkQ-HMm*36M^S3?Epao+keJgN?T(vl;e@>ptd&|GC!IM?w2S-Ks?;@k`op` zM2D*^vs za3ep9tQ(}ii<1+r=}}g}@E{O_xcC;N=!U`qQ{-1ZI4xZ!;NRmw)t**Mv#gnPRumOv z@Nc3DYPCuGH9U^B`hO0VlY{U56Lv6@`~V<^9Uqp$ii)VM$F4s#@JHsR!Vf!s<-?d{ z&TP~v9Mrj5WBcp<>Y(vW$kc)U)SXDZfmc{Uv2Dd@Y z%@+AahP+^Bt!&BY9)i=+h2jqjpF8Eme68D$SGt!zsi_(#?&AB%&}KL_WQ5{6{`_;X_r}UU6nXq@dPX+` z50GC1A$g)fu*?x4;&|!y#JG# zyf8!8HvP>mJiv2_i}IzafyC;V$Agh?y}a`-eJPKzqxGa~`B9&}JP>!`c`vaWP5h_E z$?s{FZ~lL6deeXtb&4Tzxu|GQydUk;UE@DLYZrWnlu|^OG%uh7&!Gdq0xYIGRz~QH z<@*V{`KSZqnT2Fwr65VO<Dmv$Pw6=ZU0=ENbL&aZ*Lx%wpM>)`I z5FZN?#LNVK0_*VElFI2-urrjv-3wA2}t?bEbCJ}kj*4wPI`%Cg$&l5yQ(YUaKCr!PB?A3IM9=KN35IdK1s9Yo61cx8#jV*^>U6NE?*FrdpsWdySrf`RH_E0tz{k9Uv2CI;?5d%7C``s!2B zrR%bJhIzqB!d{eHyl`>-VZU>CwBv@zUr#*48V1_$&|NLyn*}y5y~=E2njskR;z1k# zcTgkrus(6h;=?0VCubVaBj4e?vhgq#pUcer2>Tg|sJ(2Zt!xEOky-Lv8afsqwYr0d z?mGMri{ghiV=>ocp4~f;oPRhIcQKQ6C%8_+W}JeSGIPOi=%nG1R@{t4f!Lokvprqc z@Oqhvfu7z!(&^v;tQ10I^2K*90JM}LApdYgc?9%GHJ{yy z=67wMZmM6X9p0mIeHCuz+P?y+?+u#oQ(r*r&$%#1phzD}7I}kKQCp7zfO5rn)#?5I zXvkvm!OkU(^8NeoMAqLkKr1=mx3KGK$D}~i1OLAh=;Q3{GML0-NOiZ-;P?_ON2KR% zzkGbpclYcG{FH)XCL<50pazJ5KlmCynPT)_F1iN&BG(W|G{L|C`52^!VDk*@-`9L_ZI#s7GHMDAhEhi(Lg1TtZRHXSz+*)~PH4d5 zdf$x@r8p{1Wh!%btsb&&+hE7B;x@-U%Gc$Ykp-8gUNAZq#iPt5Q$d)Q7^6B`9To3t zo1he0di6BH+3A5eiBrNcxy`?Om)v&Rjer{zF2WH6_CIy3;5}RM_F8$N45dK zxfxk8l41>bKt+W=F|3iJ?i_RxsDKP?VBgw4(b+!nj;IV5;M~0s8JpgCF#blIQ=1{a$H!3N|L z3X%IS z-822zhCwISp-FfWq?EVWLSpMJQ5Fwf*E1gq$fD1YCpxySo<8q;3;lNm6Z&`6K)(O) zQoDtgwV*^{<}B>h{Kz+v_ynqWVi+3!GPmU<P0D3@v zNvHDe41&!tM~BE?>b?;$-8D!EK=cbUwfwb18WsRT?Y_3vX#9K79)6*L2fUR`pDkKG z@(MM9AMW~+BtZ;#dAsT%jt(76%jTW;okdvtD90=gA+qtrU2Bt}a{Ns_`(LRouV6X2 zx(2hTK&ev{Km2#{D-HdHNxtDR7z_Q5k(7~%obDF zU2W#{Fm6W_=p(HsAeJ5G(-ViZAJ?a{{(h5;pJ6!2rYlW}3VdfY48iTguL}=8Z4IVpXJJ678o#ZM3Gsx#F zo)2G{;y($u-V=+b%|!eL=ZR!@1YW1>ZYKB10Pv?|p}Xz_opz+d(DtBJfqzryz2r3o zVf5Wvp;029>En}dBnBGzL->03ei^}w3i@~1Es&&0|GC=C!hlf1R+c}=s5a%TIKJ8y z_1zTHCfG%4Go2|2hM|EB=#sU{@QZYc{EPE>lK$CewZ5CCZ)G3{GJU;hW$dYDyS)>V!JunaW$PwM zpJm@1K3qx|)DlC~xiTyYZQ6l^MqP9;yi_wi;`R_-H8boa6M1|bWJ(%YGNbn^5v+`Z zGb*F^>8*cu^7yz|B+4g6s1)Y^Z?{n~jsD;bn#RU-yK1}YIpmlu zRe}1oc%Pu_)cIXfV{;%#KU6(C*M~|c%RWFOvxhGD)ipuw@EHepz2@Sn#FFMEzLxcL(7caf&q?y%^S&8hcJhMYeDwR+ zpv;iV&1CcD@4^M?oV*~qi+Y*PkoYZZ4j z)U;Sadn&x39X3Y9_;M@l{>Qu{wJgDBb+gjxn>&sa6#*a&1~0auPn<6mpx>RPA1 z3&~Q39W!IOonAY3#7UsHbUe%3{TicPvwj%uPT8g9?SexB*wz+FC53)tm7tn{0{E-w z(o34vd11fmSu$(Ze+dT`lBJOpf%Z&rO0Z<~Ej$pWB0-V#Xs=-d%O_51{9jxTHDzLA zvgZ#?ryK{%h3>1f18*cM==GbaHQ2WFb)wGh=e63$&u6Izw_7Mkjy6S->94rS#sB80 z>Wk&2KQ1ZBvyHtT7XD>nTyiy-cVhsFS}Juq*NYe+`_iU+>@amX)?=L|4MW_7ZT@llI&8D=@wz3wyr+qL4^PFVq?S>JY(bHZq%a6r&}2Q%=7{S z9@4WIv2Z@p7Lu7C2Fa!k7>@l$M1Lje4;hf7gi*rjcHMkWlHt^x=ye>N8d8o#EXp7G zf>M<<1xvy$Bx^yQ{{^apv^Pdal!8^OgK&xB-2azGv^S%sLA1st~9@4c#k zctfPl_X*N8fQh=;vCTrwV0F+qm$Z7sN!tWtVUrlA zU)(E&Ev1mu4wvY7-xR+vYtOfB7El}wG|0=ws*MP1u<+VF)M6&Xe^{Am!uLad-q#?t zE`KwHrAL-am_{!vq$Zaur&6ZHBo7N50nZ}7G5^Xr1a|_{P@=Deyz2mOMK)vR_K^Ac z-T^8QKJb$v;-UrvV%aw#0P7JV4B!_)l6RTA_k&yfYlgST0VPp(GvP|-=G^Pi1}YFX z*@bdS^dHW`bbWn2I5=qFbFXHMx8`w}RV4?iEBGFUqEzp4f(2I&_CqcBnYxpr zfL-7b1ZPGb!%kwVLiBXYM4=gD{GL}6B66=I|Ei}PQ(Oj$LglEXf^A6@5J14prIx6$ zuOd9u%g2W98ZfX}6Ry>YlOxE)%e4}U6^TVQaF>obOw{#;o&8PJ4Lf|iHtc)QEj z?v!Z{=e)&hK-edj#Us$;Mc&9^kxzP*NUA0b4^Ms(A|MD25th{$qrp?7N7Y9bc06ct z{g_Du=}!-}`dZX@%SbreFh)(SEcKh(pWsx{y`#X4e5aJhFhVBjy3pe~T`jE|5^j z_+GU!YB5_JO~}_~13kbDTJrnejuz}kq)-LTzb18gHwn~%$m5THJARE1pa_27T35`R zGvpUQHYRc=>?go!=0woY#$97dHS?xbl3sL=MEC4yIL>9xDk4mR-YWm0v=(yrZ7$;L z=WSz)ElFamAwEO%vRMst+L$GR7)H`zgv=)ub*G||mcDT*b6OQ*=-95I7A7DGigB&= zDLkZj_89YZyBzOc65IlkFYDLlc~nAW(z(FWiOTSV7m#cAnVqoE7K+QuPm2Ona^=vi zD#4+)iuNU*xt|h^A!=nvqn8RL6eGq1?wN#uWY@()C1TAz=>7+_{adOvwre{s-Wt!a zZL>IAsm3NFQ|q`is~3j# z+kT}N2cXebS2Z~6k12l9u8h@~CIeJG(^4WysKZ4{)h1F@*&XaIgO+|-NI}fT8|CAj zH<|reiZb&;g9e@O{`FF(e8Hf$MJ0W8B?DCjr;2K(fwsP~nw~`^yLKfg;&p!Qh%XUe zC`zaN*W~1=^axz>3irpN_4W+eS{)cf-bcHoftU=4NI-I?G0 z!8C2skE+^`gOHoE;8=x~&%KyCgoS@YgVHBIB`3lvuhl29Zo02h0pzNS`KM-E{B-?Po#z>NM_`3^i3Yay#R) zPu?PodHO_6+4UXXK5H%<8f#W>YxAb(50HSua7MqWT4Yte`ssdK{IIfh9TF?xliW#2 z2qcFcJqwm0`Zps5@Gjt1m@KUY*Fy!{;`^vHZtBa?ly>Ial(OVa* zhz-#v)WiY6T{fEs`v2XPuIt@lg-lL|x2NlKE>I{1K?BqiFtzC3Pm;&h$xqM5#&cKZ zK1oJjRslI#LnF1jJR-^nj9ThwU>pI0nNNsIoE!q6?QhKE{i3IyEju5DgrNT7s3aHN zOfPl-BgT+cSnbL}o#&f84spdhdCNQIkTkUNHgi*tB^@C4wGp#o{MgZ}qq4hH2%kP> zn5v+$mbtU>`dBLb{f;_qM2ec*1|%2qMXF-dCa6-z#}L3&|3SyqaV8dTak^#2s;A|+ z)92gXQtLhZ1?T5$9TI577KEVp!%pKX=0c)+J2~tKs4H4(^Ig6OnL+ba|0$-YEcv{; z;vgk$;C8UdOlUV2+k5BV4qHb|{l7vm-<&;CIUS66V&ei*JQ!JC5tc`8k*=(?}y|Fj8jg7UjZQI7i+Ss=3cb?Dp_g2jxQx+d_WR0J| zm3!fS7)DflwBKQH+vuFf1mPbD;08Y{IRf!gbY-mpwh{djhJN^(e+p(H1hn-dV|5oZ z#2;m*;fH7hwN!~E${f3_vg`mn!=Z0+(!c;!F(qr#-JRIcS<_V2^PahMuLigFbggLBK>nm>x$)J3If>y8%n~sZ!?}=tJX)&ZDv&@hDG_wxBJ)xoaV1P)|!2&9Z2Wi>K zqjfs5^w^THxe`^W;GeXpzbU-^^Z``zW6xo}bf1k@Qv39zmL1%ex7VP0x2jY6A@?+eq??w68szaIp1>*^mBun2-JH^oVIA&|ndUON8 zPfK*20H^rY5kDM_#I1Ztd0hshOy! z#fbR+7Xj*vNaJ_&QP5I(NU?Zw$>&>WR=*N$l4MZLj{41MYhc0&;&ktt00T5TD(rQT z7|2RTj%)P6{~4yud*lDVM}(GGX-6zIcSusZukQN_Xy_Pxc$S&wKZTEnK-~SuxBVyOhkf_v}hN5Wj`mSF%7 zni(L(nI+xti26^~9v_qvLQK5r`(Y6fcmI3KUDbLPNeq4BiS*-C76l0UBr09{eD*K; zyIM_z-u4`#1H*Tu$zGBRo zU(*Au1?zRa#kDV=Iv9XwSplja9`BWYcjs=;#lwT>s+`#InKCtX5DvPPVgvD+7Otl% ztC3Aiv<#qH!2nb%gww0u68uFyA*LT=r9U*n4cW&Dxn@D^cMuFQ&}^!GrVRKIj}c*x zDmKSXQDl);G-!w_`SQv&-r+Oea~D!9@HHjN=~yQ-^_!Ci@ISjY&F`Agr=8xc=yQ~sV2 zq+u-U$NNpXZ0P;wlHa*7{NnbpPul+&sNB{jR`T2E9Tfsk>u*n8MT|-7ff6);a!_Aj zAtgFT8lGpNC8}(g_Qe$Go3X@0I&A*M>u;Fsf*rJ=aDpK?cE>)vtK}S*el1F9iqhesQnGHyH