commit 3e5aaab43318fe02bc7b41488af0ab3f6ab6261f Author: Anthony Hughes Date: Thu Mar 21 22:38:38 2024 +0000 Initial commit diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..2f3720f --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,1526 @@ +[0.1.0] +* Initial package (forked from Gogs app) + +[0.1.1] +* Removed reference to Gogs + +[0.1.2] +* Updated description + +[0.1.3] +* Updated to version 1.1.2 + +[1.0.0] +* Update to version 1.1.3 + +[1.0.1] +* Update Git to v2.7.4-0ubuntu1.2 +* Fixes critical security issue that allows remote command execution in git +* https://people.canonical.com/~ubuntu-security/cve/2017/CVE-2017-1000117.html + +[1.0.2] +* Preserve SECRET_KEY across updates and restarts + +[1.0.3] +* Update to version 1.1.4 + +[1.1.0] +* Update to version 1.2.0 +* New logo! +* SECURITY: Sanitation fix from Gogs (#1461) +* Status-API +* Implement GPG api +* https://github.com/go-gitea/gitea/releases/tag/v1.2.0 + +[1.1.1] +* Update to version 1.2.1 +* Fix PR, milestone and label functionality if issue unit is disabled (#2710) (#2714) +* Fix plain readme didn't render correctly on repo home page (#2705) (#2712) +* Fix so that user can still fork his own repository to his organizations (#2699) (#2707) +* Fix .netrc authentication (#2700) (#2708) +* Fix slice out of bounds error in mailer (#2479) (#2696) + +[1.1.2] +* Update to version 1.2.2 +* Add checks for commits with missing author and time (#2771) (#2785) +* Fix sending mail with a non-latin display name (#2559) (#2783) +* Sync MaxGitDiffLineCharacters with conf/app.ini (#2779) (#2780) +* Update vendor git (#2765) (#2772) +* Fix emojify image URL (#2769) (#2773) + +[1.1.3] +* Update to version 1.2.3 +* Only require one email when validating GPG key (#2266, #2467, #2663) (#2788) +* Fix order of comments (#2835) (#2839) + +[1.2.0] +* Update to version 1.3.0 + +[1.3.0] +* Update to version 1.3.1 +* Add documentationUrl +* Sanitize logs for mirror sync (#3057, #3082) (#3078) +* Fix missing branch in release bug (#3108) (#3117) +* Fix repo indexer and submodule bug (#3107) (#3110) +* Fix legacy URL redirects (#3100) (#3106) +* Fix redis session failed (#3086) (#3089) +* Fix issue list branch link broken (#3061) (#3070) +* Fix missing password length check when change password (#3039) (#3071) + +[1.3.1] +* Update Gitea to 1.3.2 +* Fix run web with -p push failed (#3154) (#3179) +* Fix source download link when no code unit allowed (#3166) (#3169) +* Allow adding collaborators with (fullname) (#3103) (#3168) +* Fix repo links (#3093) (#3163) +* Fix Uninitialized variable in ParsePatch (#3156) (#3162) +* Fix migration order v1.3 (#3157) +* Fix avatar URLs (#3069) (#3143) + +[1.4.0] +* Fix email sending (use SMTPS) + +[1.4.1] +* Update Gitea to 1.3.3 +* Security fixes + * Fix escaping changed title in comments (#3530) (#3535) + * Escape search query display (#3486) (#3489) +* Bug fixes + * Fix repo-transfer-and-team-repo-count bug (#3241) (#3244) + * Open external tracker in blank window, consistently with wiki (#3227) (#3228) + * Change SSL Mode from checkbox to string in admin page (#3208) (#3211) + +[1.5.0] +* Update Gitea to 1.4.0 + +[1.5.1] +* Update Gitea to 1.4.1 +* Add “error” as reserved username (#3882) (#3886) +* Do not allow inactive users to access repositories using private key (#3887) (#3889) +* Fix path cleanup in file editor, when initilizing new repository and LFS oids (#3871) (#3873) +* Remove unnecessary allowed safe HTML (#3778) (#3779) +* Correctly check http git access rights for reverse proxy authorized users (#3721) (#3743) +* Fix to use only needed columns from tables to get repository git paths (#3870) (#3883) +* Fix GPG expire time display when time is zero (#3584) (#3884) +* Fix to update only issue last update time when adding a comment (#3855) (#3860) +* Fix repository star count after deleting user (#3781) (#3783) +* Use the active branch for the code tab (#3720) (#3776) +* Set default branch name on first push (#3715) (#3723) +* Show clipboard button if disable HTTP of git protocol (#3773) (#3774) + +[1.5.2] +* Update Gitea to 1.4.2 +* Adjust z-index for floating labels (#3939) (#3950) +* Add missing token validation on application settings page (#3976) #3978 +* Webhook and hook_task clean up (#4006) +* Fix webhook bug of response info is not displayed in UI (#4023) +* Fix writer cannot read bare repo guide (#4033) (#4039) +* Don't force due date to current time (#3830) (#4057) +* Fix wiki redirects (#3919) (#4065) +* Fix attachment ENABLED (#4064) (#4066) +* Added deletion of an empty line at the end of file (#4054) (#4074) +* Use ResolveReference instead of path.Join (#4073) +* Fix #4081 Check for leading / in base before removing it (#4083) +* Respository's home page not updated after first push (#4075) + +[1.5.2-1] +* Rebuild Gitea package because of https://github.com/go-gitea/gitea/issues/4167 +* Adjust z-index for floating labels (#3939) (#3950) +* Add missing token validation on application settings page (#3976) #3978 +* Webhook and hook_task clean up (#4006) +* Fix webhook bug of response info is not displayed in UI (#4023) +* Fix writer cannot read bare repo guide (#4033) (#4039) +* Don't force due date to current time (#3830) (#4057) +* Fix wiki redirects (#3919) (#4065) +* Fix attachment ENABLED (#4064) (#4066) +* Added deletion of an empty line at the end of file (#4054) (#4074) +* Use ResolveReference instead of path.Join (#4073) +* Fix #4081 Check for leading / in base before removing it (#4083) +* Respository's home page not updated after first push (#4075) + +[1.5.3] +* Update Gitea to 1.4.3 +* SECURITY + * HTML-escape plain-text READMEs (#4192) (#4214) + * Fix open redirect vulnerability on login screen (#4312) (#4312) +* BUGFIXES + * Fix broken monitoring page when running processes are shown (#4203) (#4208) + * Fix delete comment bug (#4216) (#4228) + * Delete reactions added to issues and comments when deleting repository (#4232) (#4237) + * Fix wiki URL encoding bug (#4091) (#4254) + * Fix code tab link when viewing tags (#3908) (#4263) + * Fix webhook type conflation (#4285) (#4285) + +[1.5.4] +* Allow customization using gitea's custom data directory + +[1.6.0] +* Update Gitea to 1.5.0 +* Security + * Check that repositories can only be migrated to own user or organizations (#4366) (#4370) + * Limit uploaded avatar image-size to 4096px x 3072px by default (#4353) + * Do not allow to reuse TOTP passcode (#3878) +* Features + * Add cli commands to regen hooks & keys (#3979) + * Add support for FIDO U2F (#3971) + * Added user language setting (#3875) + * Add topic support (#3711) + * Multiple assignees (#3705) + * Add protected branch whitelists for merging (#3689) + * Global code search support (#3664) + * Add label descriptions (#3662) + * Add issue search via API (#3612) + * Add repository setting to enable/disable health checks (#3607) + * Emoji Autocomplete (#3433) + * Implements generator cli for secrets (#3531) + +[1.6.1] +* Update Gitea to 1.5.1 +* Security + * Don't disclose emails of all users when sending out emails (#4784) + * Improve URL validation for external wiki and external issues (#4710) (#4740) + * Make cookies HttpOnly and obey COOKIE_SECURE flag (#4706) (#4707) +* Bugfixes + * Fix missing release title in webhook (#4783) (#4800) + * Make sure to reset commit count in the cache on mirror syncing (#4770) + * Fixed bug where team with admin privelege type doesn't get any unit (#4759) + * Fix failure on creating pull request with assignees (#4583) (#4727) + * Hide org/create menu item in Dashboard if user has no rights (#4678) (#4686) + +[1.7.0] +* Update base image + +[1.7.1] +* Update Gitea to 1.5.2 + +[1.7.2] +* Update Gitea to 1.5.3 +* Security + * Fix remote command execution vulnerability in upstream library (#5177) (#5196) + +[1.8.0] +* Update Gitea to 1.6.0 + +[1.8.1] +* Update Gitea to 1.6.1 + +[1.8.2] +* Update Gitea to 1.6.2 +* SECURITY + * Sanitize uploaded file names (#5571) (#5573) + * HTMLEncode user added text (#5570) (#5575) +* BUGFIXES + * Fix indexer reindex bug when gitea restart (#5563) (#5564) + * Fix bug when a read perm user to edit his issue (#5516) (#5534) + * Detect force push failure on deletion of protected branches (#5522) (#5531) + * Fix forgot deletion of notification when delete repository (#5506) (#5514) + * Fix undeleted content when deleting user (#5429) (#5509) + * Fix empty wiki (#5504) (#5508) + +[1.8.3] +* Update Gitea to 1.6.3 +* SECURITY: Prevent DeleteFilePost doing arbitrary deletion (#5631) +* BUGFIX: Fix wrong text getting saved on editing second comment on an issue (#5608) + +[1.8.4] +* Update Gitea to 1.6.4 +* Fix SSH key now can be reused as public key after deleting as deploy key (#5671) (#5685) +* When redirecting clean the path to avoid redirecting to external site (#5669) (#5703) +* Fix to use correct value for "MSpan Structures Obtained" (#5706) (#5715) + +[1.9.0] +* Update Gitea to 1.7.0 + +[1.9.1] +* Update Gitea to 1.7.1 +* [Changelog](https://github.com/go-gitea/gitea/releases/tag/v1.7.1) +* Disable redirect for i18n (#5910) (#5916) +* Only allow local login if password is non-empty (#5906) (#5908) +* Fix go-get URL generation (#5905) (#5907) +* Fix TLS errors when using acme/autocert for local connections (#5820) (#5826) +* Request for public keys only if LDAP attribute is set (#5816) (#5819) +* Fix delete correct temp directory (#5840) (#5839) +* Fix an error while adding a dependency via UI (#5862) (#5876) +* Fix null pointer in attempt to Sudo if not logged in (#5872) (#5884) +* When creating new repository fsck option should be enabled (#5817) (#5885) +* Prevent nil dereference in mailIssueCommentToParticipants (#5891) (#5895) (#5894) +* Fix bug when read public repo lfs file (#5913) (#5912) +* Respect value of REQUIRE_SIGNIN_VIEW (#5901) (#5915) +* Fix compare button on upstream repo leading to 404 (#5877) (#5914) + +[1.9.2] +* Update Gitea to 1.7.2 +* Remove all CommitStatus when a repo is deleted (#5940) (#5941) +* Fix notifications on pushing with deploy keys by setting hook environment variables (#5935) (#5944) +* Silence console logger in gitea serv (#5887) (#5943) +* Handle milestone webhook events for issues and PR (#5947) (#5955) +* Show user who created the repository instead of the organization in action feed (#5948) (#5956) +* Fix ssh deploy and user key constraints (#1357) (#5939) (#5966) +* Fix bug when deleting a linked account will removed all (#5989) (#5990) +* Fix empty ssh key importing in ldap (#5984) (#6009) +* Fix metrics auth token detection (#6006) (#6017) +* Create repository on organisation by default on its dashboard (#6026) (#6048) +* Make sure labels are actually returned in API (#6053) (#6059) +* Switch to more recent build of xgo (#6070) (#6072) +* In basic auth check for tokens before call UserSignIn (#5725) (#6083) + +[1.9.3] +* Update Gitea to 1.7.3 +* Fix server 500 when trying to migrate to an already existing repository (#6188) (#6197) +* Load Issue attributes for API /repos/{owner}/{repo}/issues/{index} (#6122) (#6185) +* Fix bug whereby user could change private repository to public when force private enabled. (#6156) (#6165) +* Fix bug when update owner team then visit team's repo return 404 (#6119) (#6166) +* Fix heatmap and repository menu display in Internet Explorer 9+ (#6117) (#6137) +* Fix prohibit login check on authorization (#6106) (#6115) +* Fix LDAP protocol error regression by moving to ldap.v3 (#6105) (#6107) +* Fix deadlock in webhook PullRequest (#6102) (#6104) +* Fix redirect loop when password change is required and Gitea is installed as a suburl (#5965) (#6101) +* Fix compare button regression (#5929) (#6098) +* Recover panic in orgmode.Render if bad orgfile (#4982) (#5903) (#6097) + +[1.9.4] +* Update Gitea to 1.7.4 +* Fix potential XSS vulnerability in repository description. (#6306) (#6308) +* Fix wrong release commit id (#6224) (#6300) +* Fix panic on empty signed commits (#6292) (#6300) +* Fix organization dropdown not being scrollable when using mouse wheel (#5988) (#6246) +* Fix displaying dashboard even if required to change password (#6214) (#6215) + +[1.9.5] +* Update Gitea to 1.7.5 +* unitTypeCode not being used in accessLevelUnit (#6419) (#6423) +* ParsePatch function to work with quoted diff --git strings (#6323) (#6332) + +[1.9.6] +* Update Gitea to 1.7.6 +* Prevent remote code execution vulnerability with mirror repo URL settings (#6593) (#6595) +* Allow resend of confirmation email when logged in (#6482) (#6487) + +[1.10.0] +* Update Gitea to 1.8.0 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.8.0) +* Prevent remote code execution vulnerability with mirror repo URL settings (#6593) (#6594) +* Resolve 2FA bypass on API (#6676) (#6674) +* Prevent the creation of empty sessions for non-logged in users (#6690) (#6677) +* Expose issue stopwatch toggling via API (#5970) +* Pull request conflict files detection (#5951) +* Implement "conversation lock" for issue comments (#5073) +* Feature: Archive repos (#5009) +* Allow to set organization visibility (public, internal, private) (#1763) +* Added URL mapping for Release attachments like on github.com (#1707) + +[1.10.1] +* Update Gitea to 1.8.1 + +[1.10.2] +* Update Gitea to 1.8.2 + +[1.11.0] +* better custom app.ini integration +* optional sso support + +[1.12.0] +* Update Gitea to 1.8.3 +* Update manifest to v2 + +[1.13.0] +* Update Gitea to 1.9.0 + +[1.13.1] +* Update Gitea to 1.9.1 + +[1.13.2] +* Make sessions persist restarts + +[1.13.3] +* Update Gitea to 1.9.2 +* Fix wrong sender when send slack webhook (#7918) (#7924) +* Upload support text/plain; charset=utf8 (#7899) +* Lfs/lock: round locked_at timestamp to second (#7872) (#7875) +* Fix non existent milestone with 500 error (#7867) (#7873) +* SECURITY + * Fix No PGP signature on 1.9.1 tag (#7874) + * Release built with go 1.12.9 to fix security fixes in golang std lib, ref: https://groups.google.com/forum/#!msg/golang-announce/oeMaeUnkvVE/a49yvTLqAAAJ +* ENHANCEMENT + * Fix pull creation with empty changes (#7920) (#7926) +* BUILD + * Drone/docker: prepare multi-arch release + provide arm64 image (#7571) (#7884) + +[1.13.4] +* Update Gitea to 1.9.3 +* Fix go get from a private repository with Go 1.13 (#8100) +* Strict name matching for Repository.GetTagID() (#8082) +* Avoid ambiguity of branch/directory names for the git-diff-tree command (#8070) +* Add change title notification for issues (#8064) +* Run CORS handler first for /api routes (#7967) (#8053) +* Evaluate emojis in commit messages in list view (#8044) +* Fix failed to synchronize tags to releases for repository (#7990) (#7994) +* Fix adding default Telegram webhook (#7972) (#7992) +* Abort synchronization from LDAP source if there is some error (#7965) +* Fix deformed emoji in commit message (#8071) +* Keep blame view buttons sequence consistent with normal view when viewing a file (#8007) (#8009) + +[1.13.5] +* Update Gitea to 1.9.4 +* Highlight issue references (#8101) (#8404) +* Fix bug when migrating a private repository #7917 (#8403) +* Change general form binding to gogs form (#8334) (#8402) +* Fix editor commit to new branch if PR disabled (#8375) (#8401) +* Fix milestone num_issues (#8221) (#8400) +* Allow users with explicit read access to give approvals (#8398) +* Fix commit status in PR #8316 and PR #8321 (#8339) +* Fix API for edit and delete release attachment (#8290) +* Fix assets on release webhook (#8283) +* Fix release API URL generation (#8239) +* Allow registration when button is hidden (#8238) +* MS Teams webhook misses commit messages (backport v1.9) (#8225) + +[1.13.6] +* Update Gitea to 1.9.5 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.9.5) +* Hide some user information via API if user doesn't have enough permission (#8655) (#8658) +* Fix milestone close timestamp (#8728) (#8731) +* Fix deadline on update issue or PR via API (#8699) +* Fix 'New Issue Missing Milestone Comment' (#8678) (#8682) +* Fix 500 when getting user as unauthenticated user (#8653) (#8662) +* Use AppSubUrl for more redirections (#8647) (#8652) +* Add SubURL to redirect path (#8632) (#8634) (#8640) +* Fix #8582 by handling empty repos (#8587) (#8593) +* Fix bug on pull requests when transfer head repository (#8571) +* Add missed close in ServeBlobLFS (#8527) (#8543) +* Return false if provided branch name is empty for IsBranchExist (#8485) (#8492) +* Create .ssh dir as necessary (#8369) (#8486) (#8489) +* Restore functionality for early gits (#7775) (#8476) +* Add check for empty set when dropping indexes during migration (#8475) +* Ensure Request Body Readers are closed in LFS server (#8454) (#8459) +* Ensure that LFS files are relative to the LFS content path (#8455) (#8458) +* Ignore mentions for users with no access (#8395) (#8484) + +[1.14.0] +* Update Gitea to 1.10.0 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.10.0) + +[1.14.1] +* Update Gitea to 1.10.1 +* Fix max length check and limit in multiple repo forms (#9148) (#9204) +* Properly fix displaying virtual session provider in admin panel (#9137) (#9203) +* Upgrade levelqueue to 0.1.0 (#9192) (#9199) +* Fix panic when diff (#9187) (#9193) +* Smtp logger configuration sendTos should be an array (#9154) (#9157) +* Always Show Password Field on Link Account Sign-in Page (#9150) +* Create PR on Current Repository by Default (#8670) (#9141) +* Fix race on indexer (#9136) (#9139) +* Fix reCAPTCHA URL (#9119) +* Hide migrated credentials (#9098) +* Update golang.org/x/crypto vendor to use acme v2 (#9056) (#9085) +* Fix password checks on admin create/edit user (#9076) (#9081) +* Fix add search as a reserved username (#9063) (#9065) +* Fix permission checks for close/reopen from commit (#8875) (#9033) +* Ensure Written is set in GZIP ProxyResponseWriter (#9018) (#9025) +* Fix broken link to branch from issue list (#9003) (#9021) +* Fix wrong system notice when repository is empty (#9020) +* Shadow password correctly for session config (#8984) (#9002) + +[1.14.2] +* Update Gitea to 1.10.2 +* Allow only specific Columns to be updated on Issue via API (#9539) (#9580) +* Add ErrReactionAlreadyExist error (#9550) (#9564) +* Fix bug when migrate from API (#8631) (#9563) +* Use default avatar for ghost user (#9536) (#9537) +* Fix repository issues pagination bug when there are more than one label filter (#9512) (#9528) +* Fix deleted branch not removed when push the branch again (#9516) (#9524) +* Fix missing repository status when migrating repository via API (#9511) +* Trigger webhook when deleting a branch after merging a PR (#9510) +* Fix paging on /repos/{owner}/{repo}/git/trees/{sha} API endpoint (#9482) +* Fix NewCommitStatus (#9434) (#9435) +* Use OriginalURL instead of CloneAddr in migration logging (#9418) (#9420) +* Fix Slack webhook payload title generation to work with Mattermost (#9404) +* DefaultBranch needs to be prefixed by BranchPrefix (#9356) (#9359) +* Fix issue indexer not triggered when migrating a repository (#9333) +* Fix bug that release attachment files not deleted when deleting repository (#9322) (#9329) +* Fix migration releases (#9319) (#9326) (#9328) +* Fix File Edit: Author/Committer interchanged (#9297) (#9300) + +[1.14.3] +* Update Gitea to 1.10.3 +* Hide credentials when submitting migration (#9102) (#9704) +* Never allow an empty password to validate (#9682) (#9684) +* Prevent redirect to Host (#9678) (#9680) +* Hide public repos owned by private orgs (#9609) (#9616) +* Allow assignee on Pull Creation when Issue Unit is deactivated (#9836) (#9838) +* Fix download file wrong content-type (#9825) (#9835) +* Fix wrong identify poster on a migrated pull request when submit review (#9827) (#9831) +* Fix dump non-exist log directory (#9818) (#9820) +* Fix compare (#9808) (#9815) +* Fix missing msteam webhook on organization (#9781) (#9795) +* Fix add team on collaborator page when same name as organization (#9783) +* Fix cache problem on dashboard (#9358) (#9703) +* Send tag create and push webhook when release created on UI (#8671) (#9702) +* Branches not at ref commit ID should not be listed as Merged (#9614) (#9639) + +[1.15.0] +* Update Gitea to 1.11.0 + +[1.15.1] +* Update Gitea to 1.11.1 +* Repo name added to automatically generated commit message when merging (#9997) (#10285) +* Fix Workerpool deadlock (#10283) (#10284) +* Divide GetIssueStats query in smaller chunks (#10176) (#10282) +* Fix reply on code review (#10257) +* Stop hanging issue indexer initialisation from preventing shutdown (#10243) (#10249) +* Fix filter label emoji width (#10241) (#10244) +* Fix issue sidebar menus having an infinite height (#10239) (#10240) +* Fix commit between two commits calculation if there is only last commit (#10225) (#10226) +* Only check for conflicts/merging if the PR has not been merged in the interim (#10132) (#10206) +* Blacklist manifest.json & milestones user (#10292) (#10293) + +[1.15.2] +* Update Gitea to 1.11.2 + +[1.15.3] +* Update Gitea to 1.11.3 + +[1.15.4] +* Update Gitea to 1.11.4 + +[1.16.0] +* Update Gitea to [1.11.5](https://github.com/go-gitea/gitea/releases/tag/v1.11.5) +* Update base image to 2.0.0 + +[1.16.1] +* Update Gitea to 1.11.6 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.11.6) +* Fix missing authorization check on pull for public repos of private/limited org (#11656) (#11683) +* Use session for retrieving org teams (#11438) (#11439) +* Return json on 500 error from API (#11574) (#11660) +* Fix wrong milestone in webhook message (#11596) (#11612) +* Prevent (caught) panic on login (#11590) (#11598) +* Fix commit page js error (#11527) + +[1.17.0] +* Update Gitea to 1.12.1 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.12.0) + +[1.18.0] +* Add forumUrl and update tags and screenshots + +[1.18.1] +* Update Gitea to 1.12.2 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.12.2) + +[1.18.2] +* Update Gitea to 1.12.3 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.12.3) +* Don't change creation date when updating Release (#12343) (#12351) +* Show 404 page when release not found (#12328) (#12332) +* Fix emoji detection in certain cases (#12320) (#12327) +* Reduce emoji size (#12317) (#12327) +* Fix double-indirection bug in logging IDs (#12294) (#12308) +* Link to pull list page on sidebar when view pr (#12256) (#12263) +* Extend Notifications API and return pinned notifications by default (#12164) (#12232) + +[1.18.3] +* Update Gitea to 1.12.4 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.12.4) +* Escape provider name in oauth2 provider redirect (#12648) (#12650) +* Escape Email on password reset page (#12610) (#12612) +* When reading expired sessions - expire them (#12686) (#12690) +* StaticRootPath configurable at compile time (#12371) (#12652) +* Fix to show an issue that is related to a deleted issue (#12651) (#12692) +* Expire time acknowledged for cache (#12605) (#12611) +* Fix diff path unquoting (#12554) (#12575) +* Improve HTML escaping helper (#12562) +* models: break out of loop (#12386) (#12561) +* Default empty merger list to those with write permissions (#12535) (#12560) +* Skip SSPI authentication attempts for /api/internal (#12556) (#12559) +* Prevent NPE on commenting on lines with invalidated comments (#12549) (#12550) +* Remove hardcoded ES indexername (#12521) (#12526) +* Fix bug preventing transfer to private organization (#12497) (#12501) +* Keys should not verify revoked email addresses (#12486) (#12495) +* Do not add prefix on http/https submodule links (#12477) (#12479) +* Fix ignored login on compare (#12476) (#12478) +* Fix incorrect error logging in Stats indexer and OAuth2 (#12387) (#12422) +* Upgrade google/go-github to v32.1.0 (#12361) (#12390) +* Render emoji's of Commit message on feed-page (#12373) +* Fix handling of diff on unrelated branches when Git 2.28 used (#12370) + +[1.18.4] +* Update Gitea to 1.12.5 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.12.5) +* Allow U2F with default settings for gitea in subpath (#12990) (#13001) +* Prevent empty div when editing comment (#12404) (#12991) +* On mirror update also update address in DB (#12964) (#12967) +* Allow extended config on cron settings (#12939) (#12943) +* Open transaction when adding Avatar email-hash pairs to the DB (#12577) (#12940) +* Fix internal server error from ListUserOrgs API (#12910) (#12915) +* Update only the repository columns that need updating (#12900) (#12912) +* Fix panic when adding long comment (#12892) (#12894) +* Add size limit for content of comment on action ui (#12881) (#12890) +* Convert User expose ID each time (#12855) (#12883) +* Support slashes in release tags (#12864) (#12882) +* Add missing information to CreateRepo API endpoint (#12848) (#12867) +* On Migration respect old DefaultBranch (#12843) (#12858) +* Fix notifications page links (#12838) (#12853) +* Stop cloning unnecessarily on PR update (#12839) (#12852) +* Escape more things that are passed through str2html (#12622) (#12850) +* Remove double escape on labels addition in comments (#12809) (#12810) +* Fix "only mail on mention" bug (#12775) (#12789) +* Fix yet another bug with diff file names (#12771) (#12776) +* RepoInit Respect AlternateDefaultBranch (#12746) (#12751) +* Fix Avatar Resize (resize algo NearestNeighbor -> Bilinear) (#12745) (#12750) + +[1.18.5] +* Update Gitea to 1.12.6 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.12.6) +* Prevent git operations for inactive users (#13527) (#13537) +* Disallow urlencoded new lines in git protocol paths if there is a port (#13521) (#13525) +* API should only return Json (#13511) (#13564) +* Fix before and since query arguments at API (#13559) (#13560) +* Prevent panic on git blame by limiting lines to 4096 bytes at most (#13470) (#13492) +* Fix link detection in repository description with tailing '_' (#13407) (#13408) +* Remove obsolete change of email on profile page (#13341) (#13348) +* Fix permission check on get Reactions API endpoints (#13344) (#13346) +* Add migrated pulls to pull request task queue (#13331) (#13335) +* API deny wrong pull creation options (#13308) (#13327) +* Fix initial commit page & binary munching problem (#13249) (#13259) +* Fix diff parsing (#13157) (#13136) (#13139) +* Return error 404 not 500 from API if team does not exist (#13118) (#13119) +* Prohibit automatic downgrades (#13108) (#13111) +* Fix GitLab Migration Option AuthToken (#13101) +* GitLab Label Color Normalizer (#12793) (#13100) +* Log the underlying panic in runMigrateTask (#13096) (#13098) +* Fix attachments list in edit comment (#13036) (#13097) +* Fix deadlock when deleting team user (#13093) +* Fix error create comment on outdated file (#13041) (#13042) +* Fix repository create/delete event webhooks (#13008) (#13027) +* Fix internal server error on README in submodule (#13006) (#13016) + +[1.19.0] +* Update Gitea to 1.13.0 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.13.0) + +[1.19.1] +* Update Gitea to 1.13.1 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.13.1) +* Security: Hide private participation in Orgs (#13994) (#14031) +* Security: Fix escaping issue in diff (#14153) (#14154) + +[1.19.2] +* Update Gitea to 1.13.2 +* Prevent panic on fuzzer provided string (#14405) (#14409) +* Add secure/httpOnly attributes to the lang cookie (#14279) (#14280) +* If release publisher is deleted use ghost user (#14375) +* Internal ssh server respect Ciphers, MACs and KeyExchanges settings (#14523) (#14530) +* Set the name Mapper in migrations (#14526) (#14529) +* Fix wiki preview (#14515) +* Update code.gitea.io/sdk/gitea v0.13.1 -> v0.13.2 (#14497) +* ChangeUserName: rename user files back on DB issue (#14447) +* Fix lfs preview bug (#14428) (#14433) +* Ensure timeout error is shown on u2f timeout (#14417) (#14431) +* Fix Deadlock & Delete affected reactions on comment deletion (#14392) (#14425) +* Use path not filepath in routers/editor (#14390) (#14396) +* Check if label template exist first (#14384) (#14389) +* Fix migration v141 (#14387) (#14388) +* Use Request.URL.RequestURI() for fcgi (#14347) +* Use ServerError provided by Context (#14333) (#14345) +* Fix edit-label form init (#14337) +* Fix mailIssueCommentBatch for pull request (#14252) (#14296) +* Render links for commit hashes followed by comma (#14224) (#14227) +* Send notifications for mentions in pulls, issues, (code-)comments (#14218) (#14221) +* Fix avatar bugs (#14217) (#14220) +* Ensure that schema search path is set with every connection on postgres (#14131) (#14216) +* Fix dashboard issues labels filter bug (#14210) (#14214) +* When visit /favicon.ico but the static file is not exist return 404 but not continue to handle the route (#14211) (#14213) +* Fix branch selector on new issue page (#14194) (#14207) +* Check for notExist on profile repository page (#14197) (#14203) + +[1.20.0] +* Use base image v3 + +[1.20.1] +* Update Gitea to 1.13.3 +* Turn default hash password algorithm back to pbkdf2 from argon2 until we find a better one (#14673) (#14675) +* Fix paging of file commit logs (#14831) (#14879) +* Print useful error if SQLite is used in settings but not supported (#14476) (#14874) +* Fix display since time round (#14226) (#14873) +* When Deleting Repository only explicitly close PRs whose base is not this repository (#14823) (#14842) +* Set HCaptchaSiteKey on Link Account pages (#14834) (#14839) +* Fix a couple of CommentAsPatch issues. (#14804) (#14820) +* Disable broken OAuth2 providers at startup (#14802) (#14811) +* Repo Transfer permission checks (#14792) (#14794) +* Fix double alert in oauth2 application edit view (#14764) (#14768) +* Fix broken spans in diffs (#14678) (#14683) +* Prevent race in PersistableChannelUniqueQueue.Has (#14651) (#14676) +* HasPreviousCommit causes recursive load of commits unnecessarily (#14598) (#14649) +* Do not assume all 40 char strings are SHA1s (#14624) (#14648) +* Allow org labels to be set with issue templates (#14593) (#14647) +* Accept multiple SSH keys in single LDAP SSHPublicKey attribute (#13989) (#14607) +* Fix bug about ListOptions and stars/watchers pagnation (#14556) (#14573) +* Fix GPG key deletion during account deletion (#14561) (#14569) + +[1.20.2] +* Update Gitea to 1.13.4 +* Fix issue popups (#14898) (#14899) +* Fix race in LFS ContentStore.Put(...) (#14895) (#14913) +* Fix a couple of issues with a feeds (#14897) (#14903) +* When transfering repository and database transaction failed, rollback the renames (#14864) (#14902) +* Fix race in local storage (#14888) (#14901) +* Fix 500 on pull view page if user is not loged in (#14885) (#14886) + +[1.20.3] +* Update Gitea to 1.13.5 +* Update to goldmark 1.3.3 (#15059) (#15061) +* Another clusterfuzz spotted issue (#15032) (#15034) +* Fix set milestone on PR creation (#14981) (#15001) +* Prevent panic when editing forked repos by API (#14960) (#14963) +* Fix bug when upload on web (#15042) (#15055) +* Delete Labels & IssueLabels on Repo Delete too (#15039) (#15051) +* Fix postgres ID sequences broken by recreate-table (#15015) (#15029) +* Fix several render issues (#14986) (#15013) +* Make sure sibling images get a link too (#14979) (#14995) +* Fix Anchor jumping with escaped query components (#14969) (#14977) +* Fix release mail html template (#14976) +* Fix excluding more than two labels on issues list (#14962) (#14973) +* Don't mark each comment poster as OP (#14971) (#14972) +* Add "captcha" to list of reserved usernames (#14930) +* Re-enable import local paths after reversion from #13610 (#14925) (#14927) + +[1.20.4] +* Update Gitea to 1.13.6 +* Fix bug on avatar middleware (#15124) (#15125) +* Fix another clusterfuzz identified issue (#15096) (#15114) +* Fix nil exeption for get pull reviews API #15104 (#15106) +* Fix markdown rendering in milestone content (#15056) (#15092) + +[1.20.5] +* Update Gitea to 1.13.7 +* Update to bluemonday-1.0.6 (#15294) (#15298) +* Clusterfuzz found another way (#15160) (#15169) +* Fix wrong user returned in API (#15139) (#15150) +* Add 'fonts' into 'KnownPublicEntries' (#15188) (#15317) +* Speed up enry.IsVendor (#15213) (#15246) +* Response 404 for diff/patch of a commit that not exist (#15221) (#15238) +* Prevent NPE in CommentMustAsDiff if no hunk header (#15199) (#15201) +* Add size to Save function (#15264) (#15271) + +[1.21.0] +* Update Gitea to 1.14.0 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.14.0) + +[1.21.1] +* Update Gitea to 1.14.1 +* Fix bug clone wiki (#15499) (#15502) +* Github Migration ignore rate limit, if not enabled (#15490) (#15495) +* Use subdir for URL (#15446) (#15493) +* Query the DB for the hash before inserting in to email_hash (#15457) (#15491) +* Ensure review dismissal only dismisses the correct review (#15477) (#15489) +* Use index of the supported tags to choose user lang (#15452) (#15488) +* Fix wrong file link in code search page (#15466) (#15486) +* Quick template fix for built-in SSH server in admin config (#15464) (#15481) +* Prevent superfluous response.WriteHeader (#15456) (#15476) +* Fix ambiguous argument error on tags (#15432) (#15474) +* Add created_unix instead of expiry to migration (#15458) (#15463) +* Fix repository search (#15428) (#15442) +* Prevent NPE on avatar direct rendering if federated avatars disabled (#15434) (#15439) +* Fix wiki clone urls (#15430) (#15431) +* Fix dingtalk icon url at webhook (#15417) (#15426) +* Standardise icon on projects PR page (#15387) (#15408) +* Add option to skip LFS/attachment files for dump (#15407) (#15492) +* Clone panel fixes (#15436) +* Use semantic dropdown for code search query type (#15276) (#15364) + +[1.21.2] +* Update Gitea to 1.14.2 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.14.2) +* Display conflict-free merge messages for pull requests (#15773) (#15796) +* Exponential Backoff for ByteFIFO (#15724) (#15793) +* Issue list alignment tweaks (#15483) (#15766) +* Implement delete release attachments and update release attachments' name (#14130) (#15666) +* Add placeholder text to deploy key textarea (#15575) (#15576) +* Project board improvements (#15429) (#15560) +* Repo branch page: label size, PR ref, new PR button alignment (#15363) (#15365) + +[1.21.3] +* Update Gitea to 1.14.3 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.14.3) +* Encrypt migration credentials at rest (#15895) (#16187) +* Only check access tokens if they are likely to be tokens (#16164) (#16171) +* Add missing SameSite settings for the i_like_gitea cookie (#16037) (#16039) +* Fix setting of SameSite on cookies (#15989) (#15991) + +[1.21.4] +* Update Gitea to 1.14.4 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.14.4) +* Fix relative links in postprocessed images (#16334) (#16340) +* Fix list_options GetStartEnd (#16303) (#16305) +* Fix API to use author for commits instead of committer (#16276) (#16277) +* Handle misencoding of login_source cfg in mssql (#16268) (#16275) +* Fixed issues not updated by commits (#16254) (#16261) +* Improve efficiency in FindRenderizableReferenceNumeric and getReference (#16251) (#16255) +* Use html.Parse rather than html.ParseFragment (#16223) (#16225) +* Fix milestone counters on new issue (#16183) (#16224) +* reqOrgMembership calls need to be preceded by reqToken (#16198) (#16219) + +[1.21.5] +* Update Gitea to 1.14.5 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.14.5) +* Hide mirror passwords on repo settings page (#16022) (#16355) +* Update bluemonday to v1.0.15 (#16379) (#16380) +* Retry rename on lock induced failures (#16435) (#16439) +* Validate issue index before querying DB (#16406) (#16410) +* Fix crash following ldap authentication update (#16447) (#16449) +* Redirect on bad CSRF instead of presenting bad page (#14937) (#16378) + +[1.21.6] +* Update Gitea to 1.14.6 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.14.6) +* SECURITY + * Bump github.com/markbates/goth from v1.67.1 to v1.68.0 (#16538) (#16540) + * Switch to maintained JWT lib (#16532) (#16535) + * Upgrade to latest version of golang-jwt (as forked for 1.14) (#16590) (#16607) + +[1.22.0] +* Update Gitea to 1.15.0 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.15.0) + +[1.22.1] +* Update Gitea to 1.15.1 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.15.1) + +[1.22.2] +* Update Gitea to 1.15.2 +* Add unique constraint back into issue_index (#16938) +* Close storage objects before cleaning (#16934) (#16942) + +[1.22.3] +* Update Gitea to 1.15.3 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.15.3) +* Add fluid to ui container class to remove margin (#16396) (#16976) +* Add caller to cat-file batch calls (#17082) (#17089) +* Many bug fixes + +[1.22.4] +* Update Gitea to 1.15.4 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.15.4) +* Raw file API: don't try to interpret 40char filenames as commit SHA (#17185) (#17272) +* Don't allow merged PRs to be reopened (#17192) (#17271) +* Fix incorrect repository count on organization tab of dashboard (#17256) (#17266) +* Fix unwanted team review request deletion (#17257) (#17264) +* Fix broken Activities link in team dashboard (#17255) (#17258) +* API pull's head/base have correct permission(#17214) (#17245) +* Fix stange behavior of DownloadPullDiffOrPatch in incorect index (#17223) (#17227) +* Upgrade xorm to v1.2.5 (#17177) (#17188) +* Fix missing repo link in issue/pull assigned emails (#17183) (#17184) +* Fix bug of get context user (#17169) (#17172) +* Nicely handle missing user in collaborations (#17049) (#17166) +* Add Horizontal scrollbar to inner menu on Chrome (#17086) (#17164) +* Fix wrong i18n keys (#17150) (#17153) +* Fix Archive Creation: correct transaction ending (#17151) +* Prevent panic in Org mode HighlightCodeBlock (#17140) (#17141) +* Create doctor command to fix repo_units broken by dumps from 1.14.3-1.14.6 (#17136) (#17137) + +[1.22.5] +* Update Gitea to 1.15.5 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.15.5) +* Upgrade Bluemonday to v1.0.16 (#17372) (#17374) +* Ensure correct SSH permissions check for private and restricted users (#17370) (#17373) +* Prevent NPE in CSV diff rendering when column removed (#17018) (#17377) +* Offer rsa-sha2-512 and rsa-sha2-256 algorithms in internal SSH (#17281) (#17376) +* Don't panic if we fail to parse U2FRegistration data (#17304) (#17371) +* Ensure popup text is aligned left (backport for 1.15) (#17343) +* Ensure that git daemon export ok is created for mirrors (#17243) (#17306) +* Disable core.protectNTFS (#17300) (#17302) +* Use pointer for wrappedConn methods (#17295) (#17296) +* AutoRegistration is supposed to be working with disabled registration (backport) (#17292) +* Handle duplicate keys on GPG key ring (#17242) (#17284) +* Fix SVG side by side comparison link (#17375) (#17391) + +[1.22.6] +* Update Gitea to 1.15.6 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.15.6) +* Prevent panic in serv.go with Deploy Keys (#17434) (#17435) +* Fix CSV render error (#17406) (#17431) +* Read expected buffer size (#17409) (#17430) +* Ensure that restricted users can access repos for which they are members (#17460) (#17464) +* Make commit-statuses popup show correctly (#17447) (#17466) + +[1.23.0] +* Update Gitea to 1.15.7 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.15.7) +* Enable rendering of jupyter notebooks, rst, asciidoc by default +* Only allow webhook to send requests to allowed hosts (#17482) (#17510) +* Fix login redirection links (#17451) (#17473) + +[1.23.1] +* Update Gitea to 1.15.8 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.15.8) +* Move POST /{username}/action/{action} to simply POST /{username} (#18045) (#18046) +* Fix delete u2f keys bug (#18040) (#18042) +* Reset Session ID on login (#18018) (#18041) +* Prevent off-by-one error on comments on newly appended lines (#18029) (#18035) +* Stop printing 03d after escaped characters in logs (#18030) (#18034) + +[1.23.2] +* Update Gitea to 1.15.9 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.15.9) +* Fix wrong redirect on org labels (#18128) (#18134) +* Fix: unstable sort skips/duplicates issues across pages (#18094) (#18095) +* Revert "Fix delete u2f keys bug (#18042)" (#18107) +* Migrating wiki don't require token, so we should move it out of the require form (#17645) (#18104) +* Prevent NPE if gitea uploader fails to open url (#18080) (#18101) +* Reset locale on login (#17734) (#18100) +* Correctly handle failed migrations (#17575) (#18099) +* Instead of using routerCtx just escape the url before routing (#18086) (#18098) +* Quote references to the user table in consistency checks (#18072) (#18073) +* Add NotFound handler (#18062) (#18067) +* Ensure that git repository is closed before transfer (#18049) (#18057) +* Use common sessioner for API and web routes (#18114) + +[1.23.3] +* Update Gitea to 1.15.10 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.15.10) +* Fix inconsistent PR comment counts (#18260) (#18261) +* Fix release link broken (#18252) (#18253) +* Fix update user from site administration page bug (#18250) (#18251) +* Set HeadCommit when creating tags (#18116) (#18173) +* Use correct translation key for error messages due to max repo limits (#18135 & #18153) (#18152) +* Fix purple color in suggested label colors (#18241) (#18242) +* Bump mermaid from 8.10.1 to 8.13.8 (#18198) (#18206) + +[1.23.4] +* Update Gitea to 1.16.0 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.16.0) + +[1.23.5] +* Update Gitea to 1.16.1 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.16.1) +* Update JS dependencies, fix lint (#18389) (#18540) +* Add dropdown icon to label set template dropdown (#18564) (#18571) +* Comments on migrated issues/prs must link to the comment ID (#18630) (#18637) +* Stop logging an error when notes are not found (#18626) (#18635) +* Ensure that blob-excerpt links work for wiki (#18587) (#18624) +* Only attempt to flush queue if the underlying worker pool is not finished (#18593) (#18620) + +[1.23.6] +* Update Gitea to 1.16.2 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.16.2) +* Show fullname on issue edits and gpg/ssh signing info (#18828) +* Immediately Hammer if second kill is sent (#18823) (#18826) +* Allow mermaid render error to wrap (#18791) + +[1.23.7] +* Update Gitea to 1.16.3 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.16.3) + +[1.23.8] +* Update Gitea to 1.16.4 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.16.4) +* Restrict email address validation (#17688) (#19085) +* Fix lfs bug (#19072) (#19080) + +[1.23.9] +* Update Gitea to 1.16.5 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.16.5) +* Prevent redirect to Host (2) (#19175) (#19186) +* Try to prevent autolinking of displaynames by email readers (#19169) (#19183) +* Clean paths when looking in Storage (#19124) (#19179) +* Do not send notification emails to inactive users (#19131) (#19139) +* Do not send activation email if manual confirm is set (#19119) (#19122) + +[1.23.10] +* Update Gitea to 1.16.6 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.16.6) + +[1.23.11] +* Update Gitea to 1.16.7 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.16.7) +* Escape git fetch remote (#19487) (#19490) +* On Migrations, only write commit-graph if wiki clone was successful (#19563) (#19568) +* Respect DefaultUserIsRestricted system default when creating new user (#19310) (#19560) +* Don't error when branch's commit doesn't exist (#19547) (#19548) +* Support hostname:port to pass host matcher's check (#19543) (#19544) +* Prevent dangling archiver goroutine (#19516) (#19526) +* Fix migrate release from github (#19510) (#19523) +* When view `_Siderbar` or `_Footer`, just display once (#19501) (#19522) +* Fix blame page select range error and some typos (#19503) +* Fix name of doctor fix "authorized-keys" in hints (#19464) (#19484) +* User specific repoID or xorm builder conditions for issue search (#19475) (#19476) +* Prevent dangling cat-file calls (goroutine alternative) (#19454) (#19466) +* RepoAssignment ensure to close before overwrite (#19449) (#19460) +* Set correct PR status on 3way on conflict checking (#19457) (#19458) +* Mark TemplateLoading error as "UnprocessableEntity" (#19445) (#19446) + +[1.23.12] +* Update Gitea to 1.16.8 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.16.8) +* Add doctor check/fix for bogus action rows (#19656) (#19669) +* Make .cs highlighting legible on dark themes (#19604) (#19605) +* Delete user related oauth stuff on user deletion too (#19677) (#19680) +* Fix new release from tags list UI (#19670) (#19673) +* Prevent NPE when checking repo units if the user is nil (#19625) (#19630) + +[1.24.0] +* Update Gitea to 1.17.0 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.17.0) +* Automatically render wiki TOC (#19873) +* Adding button to link accounts from user settings (#19792) +* Allow set default merge style while creating repo (#19751) +* Auto merge pull requests when all checks succeeded (#9307 & #19648) +* Improve reviewing PR UX (#19612) +* Add support for rendering console output with colors (#19497) + +[1.24.1] +* Update Gitea to 1.17.1 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.17.1) +* Correctly escape within tribute.js (#20831) (#20832) +* Add support for NuGet API keys (#20721) (#20734) +* Display project in issue list (#20583) +* Add disable download source configuration (#20548) (#20579) +* Add username check to doctor (#20140) (#20671) +* Enable Wire 2 for Internal SSH Server (#20616) (#20617) +* Use the total issue count for UI (#20785) (#20827) +* Add proxy host into allow list (#20798) (#20819) +* Add missing translation for queue flush workers (#20791) (#20792) +* Improve comment header for mobile (#20781) (#20789) +* Fix git.Init for doctor sub-command (#20782) (#20783) +* Check webhooks slice length before calling xorm (#20642) (#20768) +* Remove manual rollback for failed generated repositories (#20639) (#20762) +* Use correct field name in npm template (#20675) (#20760) +* Keep download count on Container tag overwrite (#20728) (#20735) +* Fix v220 migration to be compatible for MSSQL 2008 r2 (#20702) (#20707) +* Use request timeout for git service rpc (#20689) (#20693) +* Send correct NuGet status codes (#20647) (#20677) +* Use correct context to get package content (#20673) (#20676) +* Fix the JS error "EventSource is not defined" caused by some non-standard browsers (#20584) (#20663) +* Add default commit messages to PR for squash merge (#20618) (#20645) +* Fix package upload for files >32mb (#20622) (#20635) +* Fix the new-line copy-paste for rendered code (#20612) +* Clean up and fix clone button script (#20415 & #20600) (#20599) +* Fix default merge style (#20564) (#20565) +* Add repository condition for issue count (#20454) (#20496) +* Make branch icon stand out more (#20726) (#20774) +* Fix loading button with invalid form (#20754) (#20759) +* Fix SecToTime edge-cases (#20610) (#20611) +* Executable check always returns true for windows (#20637) (#20835) +* Check issue labels slice length before calling xorm Insert (#20655) (#20836) +* Fix owners cannot create organization repos bug (#20841) (#20854) +* Prevent 500 is head repo does not have PullRequest unit in IsUserAllowedToUpdate (#20839) (#20848) + +[1.24.2] +* Update Gitea to 1.17.2 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.17.2) +* Double check CloneURL is acceptable (#20869) (#20892) +* Add more checks in migration code (#21011) (#21050) +* Fix hard-coded timeout and error panic in API archive download endpoint (#20925) (#21051) +* Improve arc-green code theme (#21039) (#21042) +* Enable contenthash in filename for dynamic assets (#20813) (#20932) +* Don't open new page for ext wiki on same repository (#20725) (#20910) +* Disable doctor logging on panic (#20847) (#20898) +* Remove calls to load Mirrors in user.Dashboard (#20855) (#20897) +* Update codemirror to 5.65.8 (#20875) +* Rework repo buttons (#20602, #20718) (#20719) +* Ensure delete user deletes all comments (#21067) (#21068) +* Delete unreferenced packages when deleting a package version (#20977) (#21060) +* Redirect if user does not exist on admin pages (#20981) (#21059) +* Set uploadpack.allowFilter etc on gitea serv to enable partial clones with ssh (#20902) (#21058) +* Fix 500 on time in timeline API (#21052) (#21057) +* Fill the specified ref in webhook test payload (#20961) (#21055) +* Add another index for Action table on postgres (#21033) (#21054) +* Fix broken insecureskipverify handling in redis connection uris (#20967) (#21053) +* Add Dev, Peer and Optional dependencies to npm PackageMetadataVersion (#21017) (#21044) +* Do not add links to Posters or Assignees with ID < 0 (#20577) (#21037) +* Fix modified due date message (#20388) (#21032) +* Fix missed sort bug (#21006) +* Fix input.value attr for RequiredClaimName/Value (#20946) (#21001) +* Change review buttons to icons to make space for text (#20934) (#20978) +* Fix download archiver of a commit (#20962) (#20971) +* Return 404 NotFound if requested attachment does not exist (#20886) (#20941) +* Set no-tags in git fetch on compare (#20893) (#20936) +* Allow multiple metadata files for Maven packages (#20674) (#20916) +* Increase Content field size of gpg_key and public_key to MEDIUMTEXT (#20896) (#20911) +* Fix mirror address setting not working (#20850) (#20904) +* Fix push mirror address backend get error Address cause setting page display error (#20593) (#20901) +* Fix panic when an invalid oauth2 name is passed (#20820) (#20900) +* In PushMirrorsIterate and MirrorsIterate if limit is negative do not set it (#20837) (#20899) +* Ensure that graceful start-up is informed of unused SSH listener (#20877) (#20888) +* Pad GPG Key ID with preceding zeroes (#20878) (#20885) +* Fix SQL Query for SearchTeam (#20844) (#20872) +* Fix the mode of custom dir to 0700 in docker-rootless (#20861) (#20867) +* Fix UI mis-align for PR commit history (#20845) (#20859) + +[1.24.3] +* Update Gitea to 1.17.3 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.17.3) +* SECURITY + * Sanitize and Escape refs in git backend (#21464) (#21463) + * Bump golang.org/x/text (#21412) (#21413) + * Update bluemonday (#21281) (#21287) +* ENHANCEMENTS + * Fix empty container layer history and UI (#21251) (#21278) + * Use en-US as fallback when using other default language (#21200) (#21256) + * Make the vscode clone link respect transport protocol (#20557) (#21128) + +[1.24.4] +* Make email display name configurable + +[1.24.5] +* Support autosigning via gnupg + +[1.25.0] +* Update Gitea to 1.17.4 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.17.4) +* Do not allow Ghost access to limited visible user/org (#21849) (#21875) +* Fix package access for admins and inactive users (#21580) (#21592) +* Fix button in branch list, avoid unexpected page jump before restore branch actually done (#21562) (#21927) +* Fix vertical align of committer avatar rendered by email address (#21884) (#21919) +* Fix setting HTTP headers after write (#21833) (#21874) +* Ignore line anchor links with leading zeroes (#21728) (#21777) +* Enable Monaco automaticLayout (#21516) + +[1.25.1] +* Trust reverse proxy IP + +[1.26.0] +* Update Gitea to 1.18.0 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.18.0) +* Remove ReverseProxy authentication from the API (#22219) (#22251) +* Support Go Vulnerability Management (#21139) +* Forbid HTML string tooltips (#20935) +* Rework mailer settings (#18982) +* Remove U2F support (#20141) +* Refactor i18n to locale (#20153) +* Enable contenthash in filename for dynamic assets (#20813) +* And a lot more enhancements + +[1.26.1] +* Update Gitea to 1.18.1 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.18.1) +* Update github.com/zeripath/zapx/v15 (#22485) +* Fix pull request API field closed_at always being null (#22482) (#22483) +* Fix container blob mount (#22226) (#22476) +* Fix error when calculating repository size (#22392) (#22474) +* Fix Operator does not exist bug on explore page with ONLY_SHOW_RELEVANT_REPOS (#22454) (#22472) +* Fix environments for KaTeX and error reporting (#22453) (#22473) +* Remove the netgo tag for Windows build (#22467) (#22468) +* Fix migration from GitBucket (#22477) (#22465) +* Prevent panic on looking at api "git" endpoints for empty repos (#22457) (#22458) +* Fix PR status layout on mobile (#21547) (#22441) +* Fix wechatwork webhook sends empty content in PR review (#21762) (#22440) +* Remove duplicate "Actions" label in mobile view (#21974) (#22439) +* Fix leaving organization bug on user settings -> orgs (#21983) (#22438) +* Fixed colour transparency regex matching in project board sorting (#22092) (#22437) +* Correctly handle select on multiple channels in Queues (#22146) (#22428) +* Prepend refs/heads/ to issue template refs (#20461) (#22427) +* Restore function to "Show more" buttons (#22399) (#22426) +* Continue GCing other repos on error in one repo (#22422) (#22425) +* Allow HOST has no port (#22280) (#22409) +* Fix omit `avatar_url` in discord payload when empty (#22393) (#22394) +* Don't display stop watch top bar icon when disabled and hidden when click other place (#22374) (#22387) +* Don't lookup mail server when using sendmail (#22300) (#22383) +* Fix gravatar disable bug (#22337) +* Fix update settings table on install (#22326) (#22327) +* Fix sitemap (#22272) (#22320) +* Fix code search title translation (#22285) (#22316) +* Fix due date rendering the wrong date in issue (#22302) (#22306) +* Fix get system setting bug when enabled redis cache (#22298) +* Fix bug of DisableGravatar default value (#22297) +* Fix key signature error page (#22229) (#22230) + +[1.26.2] +* Update Gitea to 1.18.2 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.18.2) +* When updating by rebase we need to set the environment for head repo (#22535) (#22536) +* Fix issue not auto-closing when it includes a reference to a branch (#22514) (#22521) +* Fix invalid issue branch reference if not specified in template (#22513) (#22520) +* Fix 500 error viewing pull request when fork has pull requests disabled (#22512) (#22515) +* Reliable selection of admin user (#22509) (#22511) +* Set `disable_gravatar`/`enable_federated_avatar` when offline mode is true (#22479) (#22496) + +[1.26.3] +* Update Gitea to 1.18.3 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.18.3) +* Prevent multiple To recipients (#22566) (#22569) +* Truncate commit summary on repo files table. (#22551) (#22552) +* Mute all links in issue timeline (#22534) + +[1.26.4] +* Update Gitea to 1.18.4 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.18.4) +* SECURITY + * Provide the ability to set password hash algorithm parameters (#22942) (#22943) + * Add command to bulk set must-change-password (#22823) (#22928) +* ENHANCEMENTS + * Use import of OCI structs (#22765) (#22805) + * Fix color of tertiary button on dark theme (#22739) (#22744) + * Link issue and pull requests status change in UI notifications directly to their event in the timelined view. (#22627) (#22642) +* BUGFIXES + * Notify on container image create (#22806) (#22965) + * Fix blame view missing lines (#22826) (#22929) + * Fix incorrect role labels for migrated issues and comments (#22914) (#22923) + * Fix PR file tree folders no longer collapsing (#22864) (#22872) + * Escape filename when assemble URL (#22850) (#22871) + +[1.27.0] +* Email display name support + +[1.27.1] +* Update Gitea to 1.18.5 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.18.5) +* Hide 2FA status from other members in organization members list (#22999) (#23023) +* Add `force_merge` to merge request and fix checking mergable (#23010) (#23032) +* Use --message=%s for git commit message (#23028) (#23029) +* Render access log template as text instead of HTML (#23013) (#23025) +* Fix the Manually Merged form (#23015) (#23017) + +[1.28.0] +* Update Gitea to 1.19.0 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.19.0) + +[1.28.1] +* Update Gitea to 1.19.1 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.19.1) +* Breaking: Rename actions unit to repo.actions and add docs for it (#23733) (#23881) +* Add card type to org/user level project on creation, edit and view (#24043) (#24066) +* Refactor commit status for Actions jobs (#23786) (#24060) +* Show errors for KaTeX and mermaid on the preview tab (#24009) (#24019) +* Show protected branch rule names again (#23907) (#24018) +* Adjust sticky PR header to cover background (#23956) (#23999) +* Discolor pull request tab labels (#23950) (#23987) +* Treat PRs with agit flow as fork PRs when triggering actions. (#23884) (#23967) +* Left-align review comments (#23937) + +[1.28.2] +* Update Gitea to 1.19.2 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.19.2) +* Require repo scope for PATs for private repos and basic authentication (#24362) (#24364) +* Only delete secrets belonging to its owner (#24284) (#24286) +* Fix typo in API route (#24310) (#24332) +* Fix access token issue on some public endpoints (#24194) (#24259) +* Fix broken clone script on an empty archived repo (#24339) (#24348) +* Fix Monaco IOS keyboard button (#24341) (#24347) +* Don't set meta theme-color by default (#24340) (#24346) + +[1.28.3] +* Update Gitea to 1.19.3 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.19.3) +* Use golang 1.20.4 to fix CVE-2023-24539, CVE-2023-24540, and CVE-2023-29400 +* Enable whitespace rendering on selection in Monaco (#24444) (#24485) +* Improve milestone filter on issues page (#22423) (#24440) +* Fix api error message if fork exists (#24487) (#24493) +* Fix user-cards format (#24428) (#24431) + +[1.28.4] +* Update Gitea to 1.19.4 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.19.4) +* Fix open redirect check for more cases (#25143) (#25155) +* Return 404 in the API if the requested webhooks were not found (#24823) (#24830) +* Fix organization field being null in GET /api/v1/teams/{id} (#24694) (#24696) +* Set --font-weight-bold to 600 (#24840) +* Make mailer SMTP check have timed context (#24751) (#24759) +* Do not select line numbers when selecting text from the action run logs (#24594) (#24596) + +[1.29.0] +* Update Gitea to 1.20.0 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.20.0) +* [Blog](https://blog.gitea.com/release-of-1.20.0/) +* Add button on diff header to copy file name, misc diff header tweaks (#24986) +* API endpoint for changing/creating/deleting multiple files (#24887) +* Support changing git config through app.ini, use diff.algorithm=histogram by default (#24860) +* Add up and down arrows to selected lookup repositories (#24727) +* Add Go package registry (#24687) +* Add status indicator on main home screen for each repo (#24638) +* Support for status check pattern (#24633) + +[1.29.1] +* Update Gitea to 1.20.1 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.20.1) +* Disallow dangerous URL schemes (#25960) (#25964) +* Show the mismatched ROOT_URL warning on the sign-in page if OAuth2 is enabled (#25947) (#25972) +* Make pending commit status yellow again (#25935) (#25968) +* Fix version in rpm repodata/primary.xml.gz (#26009) (#26048) +* Fix env config parsing for "GITEA____APP_NAME" (#26001) (#26013) +* ParseScope with owner/repo always sets owner to zero (#25987) (#25989) +* Fix SSPI auth panic (#25955) (#25969) +* Avoid creating directories when loading config (#25944) (#25957) +* Make environment-to-ini work with INSTALL_LOCK=true (#25926) (#25937) +* Ignore `runs-on` with expressions when warning no matched runners (#25917) (#25933) +* Avoid opening/closing PRs which are already merged (#25883) (#25903) +* RPM Registry: Show zypper commands for SUSE based distros as well (#25981) (#26020) +* Correctly refer to dev tags as nightly in the docker docs (#26004) (#26019) +* Update path related documents (#25417) (#25982) +* Adding remaining enum for migration repo model type. (#26021) (#26034) +* Fix the route for pull-request's authors (#26016) (#26018) +* Fix commit status color on dashboard repolist (#25993) (#25998) +* Avoid hard-coding height in language dropdown menu (#25986) (#25997) +* Add shutting down notice (#25920) (#25922) +* Fix incorrect milestone count when provide a keyword (#25880) (#25904) + +[1.29.2] +* Update Gitea to 1.20.2 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.20.2) +* Calculate `MAX_WORKERS` default value by CPU number (#26177) (#26183) +* Display deprecated warning in admin panel pages as well as in the log file (#26094) (#26154) + +[1.29.3] +* Update Gitea to 1.20.3 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.20.3) +* Fix the wrong derive path (#26271) (#26318) +* Fix API leaking Usermail if not logged in (#25097) (#26350) +* Add ThreadID parameter for Telegram webhooks (#25996) (#26480) +* Add minimum polyfill to support "relative-time-element" in PaleMoon (#26575) (#26578) +* Fix dark theme highlight for "NameNamespace" (#26519) (#26527) +* Detect ogg mime-type as audio or video (#26494) (#26505) +* Use object-fit: contain for oauth2 custom icons (#26493) (#26498) +* Move dropzone progress bar to bottom to show filename when uploading (#26492) (#26497) +* Remove last newline from config file (#26468) (#26471) +* Minio: add missing region on client initialization (#26412) (#26438) +* Add pull request review request webhook event (#26401) (#26407) +* Fix text truncate (#26354) (#26384) +* Fix incorrect color of selected assignees when create issue (#26324) (#26372) +* Display human-readable text instead of cryptic filemodes (#26352) (#26358) +* Hide last indexed SHA when a repo could not be indexed yet (#26340) (#26345) +* Fix the topic validation rule and suport dots (#26286) (#26303) +* Fix due date rendering the wrong date in issue (#26268) (#26274) +* Don't autosize textarea in diff view (#26233) (#26244) +* Fix commit compare style (#26209) (#26226) +* Warn instead of reporting an error when a webhook cannot be found (#26039) (#26211) +* Use "input" event instead of "keyup" event for migration form (#26602) (#26605) +* Do not use deprecated log config options by default (#26592) (#26600) +* Fix "issueReposQueryPattern does not match query" (#26556) (#26564) +* Sync repo's IsEmpty status correctly (#26517) (#26560) +* Fix project filter bugs (#26490) (#26558) +* Use hidden over clip for text truncation (#26520) (#26522) +* Set "type=button" for editor's toolbar buttons (#26510) (#26518) +* Fix NuGet search endpoints (#25613) (#26499) +* Fix storage path logic especially for relative paths (#26441) (#26481) +* Close stdout correctly for "git blame" (#26470) (#26473) +* Check first if minio bucket exists before trying to create it (#26420) (#26465) +* Avoiding accessing undefined tributeValues #26461 (#26462) +* Call git.InitSimple for runRepoSyncReleases (#26396) (#26450) +* Add transaction when creating pull request created dirty data (#26259) (#26437) +* Fix wrong middleware sequence (#26428) (#26436) +* Fix admin queue page title and fix CI failures (#26409) (#26421) +* Introduce ctx.PathParamRaw to avoid incorrect unescaping (#26392) (#26405) +* Bypass MariaDB performance bug of the "IN" sub-query, fix incorrect IssueIndex (#26279) (#26368) +* Fix incorrect CLI exit code and duplicate error message (#26346) (#26347) +* Prevent newline errors with Debian packages (#26332) (#26342) +* Fix bug with sqlite load read (#26305) (#26339) +* Make git batch operations use parent context timeout instead of default timeout (#26325) (#26330) +* Support getting changed files when commit ID is EmptySHA (#26290) (#26316) +* Clarify the logger's MODE config option (#26267) (#26281) +* Use shared template for webhook icons (#26242) (#26246) +* Fix pull request check list is limited (#26179) (#26245) +* Fix attachment clipboard copy on insecure origin (#26224) (#26231) +* Fix access check for org-level project (#26182) (#26223) +* Improve profile readme rendering (#25988) (#26453) +* [docs] Add missing backtick in quickstart.zh-cn.md (#26349) (#26357) +* Upgrade x/net to 0.13.0 (#26301) + +[1.29.4] +* Update Gitea to 1.20.4 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.20.4) +* Check blocklist for emails when adding them to account (#26812) (#26831) +* Add branch_filter to hooks API endpoints (#26599) (#26632) +* Fix incorrect "tabindex" attributes (#26733) (#26734) +* Use line-height: normal by default (#26635) (#26708) +* Fix unable to display individual-level project (#26198) (#26636) +* Fix wrong review requested number (#26784) (#26880) +* Avoid double-unescaping of form value (#26853) (#26863) +* Redirect from {repo}/issues/new to {repo}/issues/new/choose when blank issues are disabled (#26813) (#26847) +* Sync tags when adopting repos (#26816) (#26834) +* Fix verifyCommits error when push a new branch (#26664) (#26810) +* Include the GITHUB_TOKEN/GITEA_TOKEN secret for fork pull requests (#26759) (#26806) +* Fix some slice append usages (#26778) (#26798) +* Add fix incorrect can_create_org_repo for org owner team (#26683) (#26791) +* Fix bug for ctx usage (#26763) +* Make issue template field template access correct template data (#26698) (#26709) +* Use correct minio error (#26634) (#26639) +* Ignore the trailing slashes when comparing oauth2 redirect_uri (#26597) (#26618) +* Set errwriter for urfave/cli v1 (#26616) +* Fix reopen logic for agit flow pull request (#26399) (#26613) +* Fix context filter has no effect in dashboard (#26695) (#26811) +* Fix being unable to use a repo that prohibits accepting PRs as a PR source. (#26785) (#26790) +* Fix Page Not Found error (#26768) + +[1.30.0] +* Implement OIDC auth + +[1.30.1] +* Update Gitea to 1.20.5 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.20.5) +* Fix z-index on markdown completion (#27237) (#27242 & #27238) +* Use secure cookie for HTTPS sites (#26999) (#27013) +* Fix git 2.11 error when checking IsEmpty (#27393) (#27396) +* Allow get release download files and lfs files with oauth2 token format (#26430) (#27378) +* Fix orphan check for deleted branch (#27310) (#27320) +* Quote table release in sql queries (#27205) (#27219) +* Fix release URL in webhooks (#27182) (#27184) +* Fix successful return value for SyncAndGetUserSpecificDiff (#27152) (#27156) +* fix pagination for followers and following (#27127) (#27138) +* Fix issue templates when blank isses are disabled (#27061) (#27082) +* Fix context cache bug & enable context cache for dashabord commits' authors(#26991) (#27017) +* Fix INI parsing for value with trailing slash (#26995) (#27001) +* Fix PushEvent NullPointerException jenkinsci/github-plugin (#27203) (#27249) +* Fix organization field being null in POST /orgs/{orgid}/teams (#27150) (#27167 & #27162) +* Fix bug of review request number (#27406) (#27104) + +[1.31.0] +* Update base image to 4.2.0 + +[1.32.0] +* Update Gitea to 1.21.0 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.21.0) + +[1.32.1] +* Update Gitea to 1.21.1 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.21.1) + +[1.32.2] +* Update Gitea to 1.21.2 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.21.2) +* Rebuild with recently released golang version +* Fix missing check (#28406) (#28411) +* Do some missing checks (#28423) (#28432) +* Fix margin in server signed signature verification view (#28379) (#28381) +* Fix object does not exist error when checking citation file (#28314) (#28369) +* Use filepath instead of path to create SQLite3 database file (#28374) (#28378) +* Fix the runs will not be displayed bug when the main branch have no workflows but other branches have (#28359) (#28365) +* Handle repository.size column being NULL in migration v263 (#28336) (#28363) +* Convert git commit summary to valid UTF8. (#28356) (#28358) +* Fix migration panic due to an empty review comment diff (#28334) (#28362) +* Add HEAD support for rpm repo files (#28309) (#28360) +* Fix RPM/Debian signature key creation (#28352) (#28353) +* Keep profile tab when clicking on Language (#28320) (#28331) +* Fix missing issue search index update when changing status (#28325) (#28330) +* Fix wrong link in protect_branch_name_pattern_desc (#28313) (#28315) +* Read previous info from git blame (#28306) (#28310) +* Ignore "non-existing" errors when getDirectorySize calculates the size (#28276) (#28285) +* Use appSubUrl for OAuth2 callback URL tip (#28266) (#28275) +* Meilisearch: require all query terms to be matched (#28293) (#28296) +* Fix required error for token name (#28267) (#28284) +* Fix issue will be detected as pull request when checking First-time contributor (#28237) (#28271) +* Use full width for project boards (#28225) (#28245) +* Increase "version" when update the setting value to a same value as before (#28243) (#28244) +* Also sync DB branches on push if necessary (#28361) (#28403) +* Make gogit Repository.GetBranchNames consistent (#28348) (#28386) +* Recover from panic in cron task (#28409) (#28425) +* Deprecate query string auth tokens (#28390) (#28430) +* Improve doctor cli behavior (#28422) (#28424) +* Fix margin in server signed signature verification view (#28379) (#28381) +* Refactor template empty checks (#28351) (#28354) +* Read previous info from git blame (#28306) (#28310) +* Use full width for project boards (#28225) (#28245) +* Enable system users search via the API (#28013) (#28018) + +[1.32.3] +* Update Gitea to 1.21.3 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.21.3) +* Update golang.org/x/crypto (#28519) +* chore(api): support ignore password if login source type is LDAP for creating user API (#28491) (#28525) +* Add endpoint for not implemented Docker auth (#28457) (#28462) +* Add option to disable ambiguous unicode characters detection (#28454) (#28499) +* Refactor SSH clone URL generation code (#28421) (#28480) +* Polyfill SubmitEvent for PaleMoon (#28441) (#28478) +* Fix the issue ref rendering for wiki (#28556) (#28559) +* Fix duplicate ID when deleting repo (#28520) (#28528) +* Only check online runner when detecting matching runners in workflows (#28286) (#28512) +* Initalize stroage for orphaned repository doctor (#28487) (#28490) +* Fix possible nil pointer access (#28428) (#28440) +* Don't show unnecessary citation JS error on UI (#28433) (#28437) +* Fix inperformant query on retrifing review from database. (#28552) (#28562) +* Improve the prompt for "ssh-keygen sign" (#28509) (#28510) +* Update docs for DISABLE_QUERY_AUTH_TOKEN (#28485) (#28488) +* Fix Chinese translation of config cheat sheet[API] (#28472) (#28473) +* Retry SSH key verification with additional CRLF if it failed (#28392) (#28464) + +[1.32.4] +* Update Gitea to 1.21.4 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.21.4) +* Update github.com/cloudflare/circl (#28789) (#28790) +* Require token for GET subscription endpoint (#28765) (#28768) +* Use refname:strip-2 instead of refname:short when syncing tags (#28797) (#28811) +* Fix links in issue card (#28806) (#28807) +* Fix nil pointer panic when exec some gitea cli command (#28791) (#28795) +* Require token for GET subscription endpoint (#28765) (#28778) +* Fix button size in "attached header right" (#28770) (#28774) +* Fix convert.ToTeams on empty input (#28426) (#28767) +* Hide code related setting options in repository when code unit is disabled (#28631) (#28749) + +[1.32.5] +* Update Gitea to 1.21.5 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.21.5) +* Prevent anonymous container access if RequireSignInView is enabled (#28877) (#28882) +* Update go dependencies and fix go-git (#28893) (#28934) +* Revert "Speed up loading the dashboard on mysql/mariadb (#28546)" (#29006) (#29007) +* Fix an actions schedule bug (#28942) (#28999) +* Fix update enable_prune even if mirror_interval is not provided (#28905) (#28929) +* Fix uploaded artifacts should be overwritten (#28726) backport v1.21 (#28832) +* Preserve BOM in web editor (#28935) (#28959) +* Strip / from relative links (#28932) (#28952) +* Don't remove all mirror repository's releases when mirroring (#28817) (#28939) +* Implement MigrateRepository for the actions notifier (#28920) (#28923) +* Respect branch info for relative links (#28909) (#28922) +* Don't reload timeline page when (un)resolving or replying conversation (#28654) (#28917) +* Only migrate the first 255 chars of a Github issue title (#28902) (#28912) +* Fix sort bug on repository issues list (#28897) (#28901) +* Fix DeleteCollaboration transaction behaviour (#28886) (#28889) +* Fix schedule not trigger bug because matching full ref name with short ref name (#28874) (#28888) +* Fix migrate storage bug (#28830) (#28867) +* Fix archive creating LFS hooks and breaking pull requests (#28848) (#28851) +* Fix reverting a merge commit failing (#28794) (#28825) +* Upgrade xorm to v1.3.7 to fix a resource leak problem caused by Iterate (#28891) (#28895) +* Fix incorrect PostgreSQL connection string for Unix sockets (#28865) (#28870) + +[1.32.6] +* Update Gitea to 1.21.7 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.21.7) +* Fix XSS vulnerabilities (#29336) +* Use general token signing secret (#29205) (#29325) +* Refactor issue template parsing and fix API endpoint (#29069) (#29140) +* Fix swift packages not resolving (#29095) (#29102) +* Refactor git version functions and check compatibility (#29155) (#29157) +* Improve user experience for outdated comments (#29050) (#29086) +* Hide code links on release page if user cannot read code (#29064) (#29066) +* Wrap contained tags and branches again (#29021) (#29026) +* Fix incorrect button CSS usages (#29015) (#29023) +* Strip trailing newline in markdown code copy (#29019) (#29022) +* Remove SSH workaround (#27893) (#29332) +* Only log error when tag sync fails (#29295) (#29327) +* Fix SSPI user creation (#28948) (#29323) +* Improve the issue_comment workflow trigger event (#29277) (#29322) +* Discard unread data of git cat-file (#29297) (#29310) +* Fix error display when merging PRs (#29288) (#29309) +* Prevent double use of git cat-file session. (#29298) (#29301) +* Fix missing link on outgoing new release notifications (#29079) (#29300) +* Fix debian InRelease Acquire-By-Hash newline (#29204) (#29299) +* Always write proc-receive hook for all git versions (#29287) (#29291) +* Do not show delete button when time tracker is disabled (#29257) (#29279) +* Workaround to clean up old reviews on creating a new one (#28554) (#29264) +* Fix bug when the linked account was disactived and list the linked accounts (#29263) +* Do not use lower tag names to find releases/tags (#29261) (#29262) +* Fix missed edit issues event for actions (#29237) (#29251) +* Only delete scheduled workflows when needed (#29091) (#29235) +* Make submit event code work with both jQuery event and native event (#29223) (#29234) +* Fix push to create with capitalize repo name (#29090) (#29206) +* Use ghost user if user was not found (#29161) (#29169) +* Dont load Review if Comment is CommentTypeReviewRequest (#28551) (#29160) +* Refactor parseSignatureFromCommitLine (#29054) (#29108) +* Avoid showing unnecessary JS errors when there are elements with different origin on the page (#29081) (#29089) +* Fix gitea-origin-url with default ports (#29085) (#29088) +* Fix orgmode link resolving (#29024) (#29076) +* Fix: Elasticsearch: Request Entity Too Large #28117 (#29062) (#29075) +* Do not render empty comments (#29039) (#29049) +* Avoid sending update/delete release notice when it is draft (#29008) (#29025) + +[1.32.7] +* Update Gitea to 1.21.8 +* [Full changelog](https://github.com/go-gitea/gitea/releases/tag/v1.21.8) +* Only use supported sort orders for "/explore/users" page (#29430) (#29443) +* Fix wrong line number in code search result (#29260) (#29623) +* Use Get but not Post to get actions artifacts (#29734) (#29737) +* Fix inconsistent rendering of block mathematical expressions (#29677) (#29711) +* Fix rendering internal file links in org (#29669) (#29705) +* Don't show AbortErrors on logout (#29639) (#29667) +* Fix user-defined markup links targets (#29305) (#29666) +* Fix incorrect rendering csv file when file size is larger than UI.CSV.MaxFileSize (#29653) (#29663) +* Fix hidden test's failure (#29254) (#29662) diff --git a/CloudronManifest.json b/CloudronManifest.json new file mode 100644 index 0000000..255c0ef --- /dev/null +++ b/CloudronManifest.json @@ -0,0 +1,43 @@ +{ + "id": "org.forgejo.cloudronapp", + "title": "Forgejo (unofficial)", + "author": "Codeberg e.V.", + "description": "file://DESCRIPTION.md", + "tagline": "A self-hosted lightweight software forge.", + "version": "0.0.7", + "upstreamVersion": "1.21.7-0", + "healthCheckPath": "/explore", + "httpPort": 3000, + "memoryLimit": 536870912, + "addons": { + "mysql": { }, + "sendmail": { "supportsDisplayName": true }, + "localstorage": { }, + "oidc": { "loginRedirectUri": "/user/oauth2/cloudron/callback" } + }, + "tcpPorts": { + "SSH_PORT": { + "title": "SSH Port", + "description": "SSH Port over which repos can be pushed & pulled", + "defaultValue": 29418 + } + }, + "manifestVersion": 2, + "website": "https://forgejo.org", + "contactEmail": "contact@forgejo.org", + "icon": "file://logo.png", + "optionalSso": true, + "mediaLinks": [ + "https://forgejo.org/_astro/hello-world.f0327754_ZgSUOs.webp", + "https://forgejo.org/_astro/pull-request-button.3d7a9576_Z1RfA9x.webp", + "https://forgejo.org/_astro/pull-request-review-global.49c41d42_1OeOAb.webp", + "https://forgejo.org/_astro/project.06d8d4dc_2aiHpd.webp", + "https://docs.codeberg.org/assets/images/collaborating/citable-code/releases2.webp" + ], + "tags": [ "version control", "git", "code hosting", "development", "github", "bitbucket", "gitlab" ], + "changelog": "file://CHANGELOG.md", + "postInstallMessage": "file://POSTINSTALL.md", + "minBoxVersion": "7.5.1", + "forumUrl": "https://matrix.to/#/#forgejo:matrix.org", + "documentationUrl": "https://forgejo.org/docs/latest/" +} diff --git a/DESCRIPTION.md b/DESCRIPTION.md new file mode 100644 index 0000000..20b2d8b --- /dev/null +++ b/DESCRIPTION.md @@ -0,0 +1,27 @@ +Forgejo is a self-hosted lightweight software forge. Easy to install and low maintenance, it just does the job. It is similar to Gitea, GitHub, or Gitlab. + +**Note:** _This app is not developed by the Forgejo team and was created by me, Lucid Cocoon aka Anthony Hughes. I am simply integrating the Forgejo Docker image into a Cloudron app and making no changes to the Forgejo image itself. You may contact me for issues with installing and managing the app through Cloudron, but for issues with Forgejo itself please contact the Forgejo team._ + +### Forge great software with Forgejo +Take back control of your software development process, self-host your projects and get everyone involved in delivering quality software on the same page. + +#### Simple software project management +Ease of use is important to get things done efficiently. Forgejo’s user experience is designed for collaboration and productivity. + +#### Self-hosted alternative to GitHub +With a rich feature set, Forgejo still has a low server profile and requires an order of magnitude less resources than other forges. + +#### Self-hosted alternative to GitHub +Liberate your software from proprietary shackles. Forgejo offers a familiar environment to GitHub users, allowing smooth transition to a platform you own. + +#### Guaranteed 100% Free Software +Forgejo will always be Free and Open Source Software. Furthermore we exclusively use Free Software for our own project development. + +#### Easy to install and maintain +Hosting your own software forge does not require expert skills. With Forgejo you can control your server with minimal effort. + +#### Beyond coding, we forge ahead +An exciting future awaits. We will innovate the Software Forge and enable collaborative software development facilitated by decentralized platforms. + +### Bug reports +The Forgejo Cloudron App integration is an **unofficial** app created by Lucid Cocoon (aka Anthony Hughes aka me) and not supported by the Forgejo team. Please open bugs for it at [Lucid Cocoon](https://forge.lucidcocoon.scot/forgejo-cloudron-app/issues) and I will do my best to resolve it. For issues with Forgejo itself please open bugs at [Codeberg](https://codeberg.org/forgejo/forgejo/issues). diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..8736022 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,45 @@ +FROM cloudron/base:4.2.0@sha256:46da2fffb36353ef714f97ae8e962bd2c212ca091108d768ba473078319a47f4 + +RUN apt-get update && \ + apt-get install -y openssh-server git asciidoctor pandoc && \ + rm -rf /etc/ssh_host_* && \ + rm -r /var/cache/apt /var/lib/apt/lists +RUN pip3 install jupyter + +ADD supervisor/ /etc/supervisor/conf.d/ + +RUN adduser --disabled-login --gecos 'Gitea' git +# by default, git account is created as inactive which prevents login via openssh +# https://github.com/gitlabhq/gitlabhq/issues/5304 +RUN passwd -d git + +RUN mkdir -p /home/git/gitea +WORKDIR /home/git + +# for autosign feature +ENV GNUPGHOME="/app/data/gnupg" + +ARG VERSION="1.21.7-0" + +# RUN curl -L https://dl.gitea.io/gitea/${VERSION}/gitea-${VERSION}-linux-amd64 -o /home/git/gitea/gitea \ +# && chmod +x /home/git/gitea/gitea + +RUN curl -L https://codeberg.org/forgejo/forgejo/releases/download/v${VERSION}/forgejo-${VERSION}-linux-amd64 -o /home/git/gitea/gitea \ + && chmod +x /home/git/gitea/gitea + +# setup config paths +ADD app.ini.template /home/git/app.ini.template + +# setup log paths +RUN mkdir -p /run/gitea && chown -R git:git /run/gitea +RUN sed -e 's,^logfile=.*$,logfile=/run/gitea/supervisord.log,' -i /etc/supervisor/supervisord.conf + +RUN ln -s /app/data/ssh /home/git/.ssh +RUN ln -s /app/data/gitconfig /home/git/.gitconfig + +ADD start.sh /home/git/start.sh + +COPY sshd_config /etc/ssh/sshd_config + +CMD [ "/home/git/start.sh" ] + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..1a9d816 --- /dev/null +++ b/LICENSE @@ -0,0 +1,9 @@ +MIT License (MIT) +Copyright (c) 2016 Cloudron UG + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + diff --git a/POSTINSTALL.md b/POSTINSTALL.md new file mode 100644 index 0000000..4ec3c9d --- /dev/null +++ b/POSTINSTALL.md @@ -0,0 +1,10 @@ +This app is pre-setup with an admin account. The initial credentials are: + +**Username**: root
+**Password**: changeme
+ +Please change the admin password immediately. + + +Use the `Local` authentication source for logging in as admin. + diff --git a/README.md b/README.md new file mode 100644 index 0000000..4c18cf3 --- /dev/null +++ b/README.md @@ -0,0 +1,36 @@ +# Gitea Cloudron App + +This repository contains the Cloudron app package source for [Gitea](http://gitea.io/). + +## Installation + +[![Install](https://cloudron.io/img/button.svg)](https://cloudron.io/button.html?app=io.gitea.cloudronapp) + +or using the [Cloudron command line tooling](https://cloudron.io/references/cli.html) + +``` +cloudron install --appstore-id io.gitea.cloudronapp +``` + +## Building + +The app package can be built using the [Cloudron command line tooling](https://cloudron.io/references/cli.html). + +``` +cd gitea-app + +cloudron build +cloudron install +``` + +## Testing + +The e2e tests are located in the `test/` folder and require [nodejs](http://nodejs.org/). They are creating a fresh build, install the app on your Cloudron, perform tests, backup, restore and test if the repos are still ok. The tests expect port 29418 to be available. + +``` +cd gitea-app/test + +npm install +PATH=$PATH:node_modules/.bin USERNAME= PASSWORD= mocha --bail test.js +``` + diff --git a/app.ini.template b/app.ini.template new file mode 100644 index 0000000..3a2d4eb --- /dev/null +++ b/app.ini.template @@ -0,0 +1,134 @@ +APP_NAME = Gitea +RUN_USER = git +RUN_MODE = prod + + +[database] +; those settings are protected and can't be modified +DB_TYPE = mysql +HOST = ##MYSQL_HOST:##MYSQL_PORT +NAME = ##MYSQL_DATABASE +USER = ##MYSQL_USERNAME +PASSWD = ##MYSQL_PASSWORD +SSL_MODE = disable +PATH = + + +[server] +; those settings are protected and can't be modified +PROTOCOL = http +DOMAIN = ##DOMAIN +ROOT_URL = https://%(DOMAIN)s/ +HTTP_ADDR = +HTTP_PORT = 3000 +DISABLE_SSH = ##DISABLE_SSH +SSH_PORT = ##SSH_PORT +APP_DATA_PATH = /app/data/appdata + +; Landing page for non-logged users, can be "home" or "explore" +LANDING_PAGE = explore + + +[repository] +; this setting is protected and can't be modified +ROOT = /app/data/repository + +SCRIPT_TYPE = bash + + +[repository.upload] +ENABLED = true + +; this setting is protected and can't be modified +TEMP_PATH = /run/gitea/tmp/uploads + + +[release.attachment] +ENABLED = true +; APP_DATA_PATH/attachments +PATH = + +[oauth2_client] +ENABLE_AUTO_REGISTRATION = true +USERNAME = sub +UPDATE_AVATAR = false +ACCOUNT_LINKING = auto + +[mailer] +ENABLED = true + +; those settings are protected and can't be modified +SMTP_ADDR = ##MAIL_SERVER +SMTP_PORT = ##MAIL_PORT +USER = ##MAIL_SMTP_USERNAME +PASSWD = ##MAIL_SMTP_PASSWORD +FROM = ##MAIL_FROM +PROTOCOL = smtps +FORCE_TRUST_SERVER_CERT = true + + +[security] +; those settings are protected and can't be modified +INSTALL_LOCK = true +SECRET_KEY = ##SECRET_KEY +REVERSE_PROXY_LIMIT = 1 +REVERSE_PROXY_TRUSTED_PROXIES = * + +[service] +DISABLE_REGISTRATION = false +SHOW_REGISTRATION_BUTTON = false +ENABLE_NOTIFY_MAIL = true + + +[log] +; those settings are protected and can't be modified +MODE = console +; used for xorm.log +ROOT_PATH = /run/gitea + + +[picture] +; APP_DATA_PATH/avatars +AVATAR_UPLOAD_PATH = +GRAVATAR_SOURCE = gravatar +DISABLE_GRAVATAR = false + + +[attachment] +ENABLE = true +; APP_DATA_PATH/attachments +PATH = + + +[indexer] +; this setting is protected and can't be modified +ISSUE_INDEXER_PATH = /app/data/appdata/indexers/issues.bleve + +[session] +PROVIDER = file +PROVIDER_CONFIG = /run/gitea/sessions +COOKIE_SECURE = true +COOKIE_NAME = cloudron_gitea +GC_INTERVAL_TIME = 2592000 + +[markup.asciidoc] +ENABLED = true +FILE_EXTENSIONS = .adoc,.asciidoc +RENDER_COMMAND = "asciidoctor -s -a showtitle --out-file=- -" +; Input is not a standard input but a file +IS_INPUT_FILE = false + +[markup.restructuredtext] +ENABLED = true +FILE_EXTENSIONS = .rst +RENDER_COMMAND = "timeout 30s pandoc +RTS -M512M -RTS -f rst" +IS_INPUT_FILE = false + +[markup.jupyter] +ENABLED = true +FILE_EXTENSIONS = .ipynb +RENDER_COMMAND = "jupyter nbconvert --stdin --stdout --to html --template basic" +IS_INPUT_FILE = false + +[markup.sanitizer.jupyter.img] +ALLOW_DATA_URI_IMAGES = true diff --git a/cloudron-app-build-instructions.md b/cloudron-app-build-instructions.md new file mode 100644 index 0000000..92bc761 --- /dev/null +++ b/cloudron-app-build-instructions.md @@ -0,0 +1,16 @@ +# Log in to Docker +sudo docker login + + + +# Build the docker image: +sudo docker build -t /: . + +# Push to Docker +sudo docker push : + +# Install to Cloudron +cloudron install --image /: +Location: + + diff --git a/logo.png b/logo.png new file mode 100644 index 0000000..eda0347 Binary files /dev/null and b/logo.png differ diff --git a/sshd_config b/sshd_config new file mode 100644 index 0000000..fae92d8 --- /dev/null +++ b/sshd_config @@ -0,0 +1,80 @@ +# Package generated configuration file +# See the sshd_config(5) manpage for details + +# What ports, IPs and protocols we listen for +Port 29418 +# Use these options to restrict which interfaces/protocols sshd will bind to +ListenAddress 0.0.0.0 +ListenAddress :: +Protocol 2 +# HostKeys for protocol version 2 +HostKey /app/data/sshd/ssh_host_rsa_key +HostKey /app/data/sshd/ssh_host_dsa_key +HostKey /app/data/sshd/ssh_host_ecdsa_key +HostKey /app/data/sshd/ssh_host_ed25519_key + +# Logging +SyslogFacility AUTH +LogLevel INFO + +# Authentication: +LoginGraceTime 120 +PermitRootLogin prohibit-password +StrictModes yes + +PubkeyAuthentication yes +#AuthorizedKeysFile %h/.ssh/authorized_keys + +# Don't read the user's ~/.rhosts and ~/.shosts files +IgnoreRhosts yes +# similar for protocol version 2 +HostbasedAuthentication no +# Uncomment if you don't trust ~/.ssh/known_hosts for RhostsRSAAuthentication +#IgnoreUserKnownHosts yes + +# To enable empty passwords, change to yes (NOT RECOMMENDED) +PermitEmptyPasswords no + +# Change to yes to enable challenge-response passwords (beware issues with +# some PAM modules and threads) +ChallengeResponseAuthentication no + +# Change to no to disable tunnelled clear text passwords +#PasswordAuthentication yes + +# Kerberos options +#KerberosAuthentication no +#KerberosGetAFSToken no +#KerberosOrLocalPasswd yes +#KerberosTicketCleanup yes + +# GSSAPI options +#GSSAPIAuthentication no +#GSSAPICleanupCredentials yes + +X11Forwarding yes +X11DisplayOffset 10 +PrintMotd no +PrintLastLog yes +TCPKeepAlive yes +#UseLogin no + +#MaxStartups 10:30:60 +#Banner /etc/issue.net + +# Allow client to pass locale environment variables +AcceptEnv LANG LC_* + +Subsystem sftp /usr/lib/openssh/sftp-server + +# Set this to 'yes' to enable PAM authentication, account processing, +# and session processing. If this is enabled, PAM authentication will +# be allowed through the ChallengeResponseAuthentication and +# PasswordAuthentication. Depending on your PAM configuration, +# PAM authentication via ChallengeResponseAuthentication may bypass +# the setting of "PermitRootLogin without-password". +# If you just want the PAM account and session checks to run without +# PAM authentication, then enable this but set PasswordAuthentication +# and ChallengeResponseAuthentication to 'no'. +UsePAM no +UseDNS no diff --git a/start.sh b/start.sh new file mode 100755 index 0000000..19628c6 --- /dev/null +++ b/start.sh @@ -0,0 +1,125 @@ +#!/bin/bash + +set -eu -o pipefail + +mkdir -p /run/gitea/tmp/uploads /run/sshd /run/gitea/sessions + +setup_oidc_source() { + set -eu + + echo "==> Setup OIDC source" + + now=$(date +%s) + mysql -u"${CLOUDRON_MYSQL_USERNAME}" -p"${CLOUDRON_MYSQL_PASSWORD}" -h mysql --database="${CLOUDRON_MYSQL_DATABASE}" -e \ + "REPLACE INTO login_source (id, type, name, is_active, cfg, created_unix, updated_unix) VALUES (1,6,'cloudron', 1,'{\"Provider\":\"openidConnect\",\"ClientID\":\"${CLOUDRON_OIDC_CLIENT_ID}\",\"ClientSecret\":\"${CLOUDRON_OIDC_CLIENT_SECRET}\",\"OpenIDConnectAutoDiscoveryURL\":\"${CLOUDRON_OIDC_ISSUER}/.well-known/openid-configuration\",\"CustomURLMapping\":null,\"IconURL\":\"\",\"Scopes\":[\"openid email profile\"],\"RequiredClaimName\":\"\",\"RequiredClaimValue\":\"\",\"GroupClaimName\":\"\",\"AdminGroup\":\"\",\"GroupTeamMap\":\"\",\"GroupTeamMapRemoval\":false,\"RestrictedGroup\":\"\"}','${now}','${now}')" +} + +setup_root_user() { + set -eu + + if sudo -H -u git /home/git/gitea/gitea admin user create --username root --password changeme --email admin@cloudron.local --admin -c /run/gitea/app.ini; then + echo "==> root user added" + else + echo "==> Failed to add root user" + exit 1 + fi +} + +setup_auth() { + set -eu + + # Wait for gitea to finish db setup, before we do any db operations + while ! curl --fail http://localhost:3000/explore; do + echo "==> Waiting for gitea to come up" + sleep 1 + done + + echo "==> Gitea is up, setting up auth" + + if [[ -n "${CLOUDRON_OIDC_ISSUER:-}" ]]; then + setup_oidc_source + fi + + user_count=$(mysql -u"${CLOUDRON_MYSQL_USERNAME}" -p"${CLOUDRON_MYSQL_PASSWORD}" -h mysql --database="${CLOUDRON_MYSQL_DATABASE}" -N -B -e "SELECT count(*) FROM user") + # be careful, not to create root user for existing LDAP based installs + if [[ "${user_count}" == "0" ]]; then + echo "==> Setting up root user for first run" + setup_root_user + fi +} + +# SSH_PORT can be unset to disable SSH +disable_ssh="false" +if [[ -z "${SSH_PORT:-}" ]]; then + echo "SSH disabled" + SSH_PORT=29418 # arbitrary port to keep sshd happy + disable_ssh="true" +fi + +if [[ ! -f "/app/data/sshd/ssh_host_ed25519_key" ]]; then + echo "Generating ssh host keys" + mkdir -p /app/data/sshd + ssh-keygen -qt rsa -N '' -f /app/data/sshd/ssh_host_rsa_key + ssh-keygen -qt dsa -N '' -f /app/data/sshd/ssh_host_dsa_key + ssh-keygen -qt ecdsa -N '' -f /app/data/sshd/ssh_host_ecdsa_key + ssh-keygen -qt ed25519 -N '' -f /app/data/sshd/ssh_host_ed25519_key +else + echo "Reusing existing host keys" +fi + +chmod 0600 /app/data/sshd/*_key +chmod 0644 /app/data/sshd/*.pub + +sed -e "s/^Port .*/Port ${SSH_PORT}/" /etc/ssh/sshd_config > /run/gitea/sshd_config + +if [[ ! -f /app/data/app.ini ]]; then + echo -e "; Add customizations here - https://docs.gitea.io/en-us/config-cheat-sheet/" > /app/data/app.ini + + echo "==> Generating new SECRET_KEY" + crudini --set "/app/data/app.ini" security SECRET_KEY $(pwgen -1 -s) +fi + +# merge user config file +cp /home/git/app.ini.template "/run/gitea/app.ini" +crudini --merge "/run/gitea/app.ini" < "/app/data/app.ini" + +# override important values +crudini --set "/run/gitea/app.ini" database DB_TYPE mysql +crudini --set "/run/gitea/app.ini" database HOST "${CLOUDRON_MYSQL_HOST}:${CLOUDRON_MYSQL_PORT}" +crudini --set "/run/gitea/app.ini" database NAME "${CLOUDRON_MYSQL_DATABASE}" +crudini --set "/run/gitea/app.ini" database USER "${CLOUDRON_MYSQL_USERNAME}" +crudini --set "/run/gitea/app.ini" database PASSWD "${CLOUDRON_MYSQL_PASSWORD}" +crudini --set "/run/gitea/app.ini" database SSL_MODE "disable" +crudini --set "/run/gitea/app.ini" server PROTOCOL "http" +crudini --set "/run/gitea/app.ini" server DOMAIN "${CLOUDRON_APP_DOMAIN}" +crudini --set "/run/gitea/app.ini" server ROOT_URL "https://%(DOMAIN)s/" +crudini --set "/run/gitea/app.ini" server HTTP_ADDR "" +crudini --set "/run/gitea/app.ini" server HTTP_PORT "3000" +crudini --set "/run/gitea/app.ini" server DISABLE_SSH "${disable_ssh}" +crudini --set "/run/gitea/app.ini" server SSH_PORT "${SSH_PORT}" +crudini --set "/run/gitea/app.ini" server APP_DATA_PATH "/app/data/appdata" +crudini --set "/run/gitea/app.ini" repository ROOT "/app/data/repository" +crudini --set "/run/gitea/app.ini" repository.upload TEMP_PATH "/run/gitea/tmp/uploads" +crudini --set "/run/gitea/app.ini" mailer SMTP_ADDR "${CLOUDRON_MAIL_SMTP_SERVER}" +crudini --set "/run/gitea/app.ini" mailer SMTP_PORT "${CLOUDRON_MAIL_SMTPS_PORT}" +crudini --set "/run/gitea/app.ini" mailer PROTOCOL smtps +crudini --set "/run/gitea/app.ini" mailer USER "${CLOUDRON_MAIL_SMTP_USERNAME}" +crudini --set "/run/gitea/app.ini" mailer PASSWD "${CLOUDRON_MAIL_SMTP_PASSWORD}" +crudini --set "/run/gitea/app.ini" mailer FROM "${CLOUDRON_MAIL_FROM_DISPLAY_NAME:-Gitea} <${CLOUDRON_MAIL_FROM}>" +crudini --set "/run/gitea/app.ini" mailer FORCE_TRUST_SERVER_CERT "true" +crudini --set "/run/gitea/app.ini" security INSTALL_LOCK "true" +crudini --set "/run/gitea/app.ini" security REVERSE_PROXY_LIMIT 1 +crudini --set "/run/gitea/app.ini" security REVERSE_PROXY_TRUSTED_PROXIES "*" +crudini --set "/run/gitea/app.ini" log MODE "console" +crudini --set "/run/gitea/app.ini" log ROOT_PATH "/run/gitea" +crudini --set "/run/gitea/app.ini" log LEVEL "debug" +crudini --set "/run/gitea/app.ini" indexer ISSUE_INDEXER_PATH "/app/data/appdata/indexers/issues.bleve" + +echo "==> Creating dirs and changing permissions" +mkdir -p /app/data/repository /app/data/ssh /app/data/custom /app/data/gnupg +chown -R git:git /app/data /run/gitea + +# this expects app.ini to be available +( setup_auth ) & + +exec /usr/bin/supervisord --configuration /etc/supervisor/supervisord.conf --nodaemon -i Gitea diff --git a/supervisor/gitea.conf b/supervisor/gitea.conf new file mode 100644 index 0000000..95e1e37 --- /dev/null +++ b/supervisor/gitea.conf @@ -0,0 +1,12 @@ +[program:gitea] +directory=/home/git/gitea +command=/home/git/gitea/gitea web -c /run/gitea/app.ini -p 3000 +user=git +autostart=true +autorestart=true +; https://veithen.github.io/2015/01/08/supervisord-redirecting-stdout.html +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 +environment=HOME="/home/git",USER="git",GITEA_CUSTOM="/app/data/custom" diff --git a/supervisor/sshd.conf b/supervisor/sshd.conf new file mode 100644 index 0000000..274c89e --- /dev/null +++ b/supervisor/sshd.conf @@ -0,0 +1,10 @@ +[program:sshd] +directory=/ +command=/usr/sbin/sshd -f /run/gitea/sshd_config -D +user=root +autostart=true +autorestart=true +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 diff --git a/test/git_ssh_wrapper.sh b/test/git_ssh_wrapper.sh new file mode 100755 index 0000000..6715459 --- /dev/null +++ b/test/git_ssh_wrapper.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +ssh -o IdentitiesOnly=yes -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i ${SCRIPT_DIR}/id_ed25519 "$@" diff --git a/test/id_ed25519 b/test/id_ed25519 new file mode 100644 index 0000000..c463ce4 --- /dev/null +++ b/test/id_ed25519 @@ -0,0 +1,7 @@ +-----BEGIN OPENSSH PRIVATE KEY----- +b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW +QyNTUxOQAAACDECyFdxcmgOemNvs0wUhkgzfj9IS2OTG6bU5AXfNkXfgAAAJAoNQg/KDUI +PwAAAAtzc2gtZWQyNTUxOQAAACDECyFdxcmgOemNvs0wUhkgzfj9IS2OTG6bU5AXfNkXfg +AAAEC9nIZlzus9hn/b99E/cnSE2Vpycx0invItrrzgOX9qwMQLIV3FyaA56Y2+zTBSGSDN ++P0hLY5MbptTkBd82Rd+AAAADW5lYnVsb25AbHVuYXI= +-----END OPENSSH PRIVATE KEY----- diff --git a/test/id_ed25519.pub b/test/id_ed25519.pub new file mode 100644 index 0000000..ff4045e --- /dev/null +++ b/test/id_ed25519.pub @@ -0,0 +1 @@ +ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMQLIV3FyaA56Y2+zTBSGSDN+P0hLY5MbptTkBd82Rd+ nebulon@lunar diff --git a/test/package-lock.json b/test/package-lock.json new file mode 100644 index 0000000..3606b9e --- /dev/null +++ b/test/package-lock.json @@ -0,0 +1,3072 @@ +{ + "name": "test", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "test", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "chromedriver": "^122.0.5", + "expect.js": "^0.3.1", + "mocha": "^10.3.0", + "selenium-webdriver": "^4.18.1", + "superagent": "^8.1.2" + } + }, + "node_modules/@testim/chrome-version": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@testim/chrome-version/-/chrome-version-1.1.4.tgz", + "integrity": "sha512-kIhULpw9TrGYnHp/8VfdcneIcxKnLixmADtukQRtJUmsVlMg0niMkwV0xZmi8hqa57xqilIHjWFA0GKvEjVU5g==" + }, + "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/node": { + "version": "16.11.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.11.tgz", + "integrity": "sha512-KB0sixD67CeecHC33MYn+eYARkqTheIRNuu97y2XMjR7Wu3XibO1vaY6VBV6O/a89SPI81cEUIYT87UqUWlZNw==", + "optional": true + }, + "node_modules/@types/yauzl": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.2.tgz", + "integrity": "sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA==", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "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/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "engines": { + "node": ">=6" + } + }, + "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/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "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/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "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/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "node_modules/axios": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz", + "integrity": "sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==", + "dependencies": { + "follow-redirects": "^1.15.4", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "node_modules/basic-ftp": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.4.tgz", + "integrity": "sha512-8PzkB0arJFV4jJWSGOYR+OEic6aeKMu/osRhBULN6RY0ykby6LKhbmuQ5ublvaas5BOwboah5D87nrHyuh8PPA==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "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/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "engines": { + "node": "*" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/chalk/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/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "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" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chromedriver": { + "version": "122.0.5", + "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-122.0.5.tgz", + "integrity": "sha512-5WkCY4ioJZ1Qna6KWqPSrIz1MwGh6tHW7F67XTSbZn/GaMJrpiuy6b5c1BetrddSax+NX8u4tg4l3Wy1THecLQ==", + "hasInstallScript": true, + "dependencies": { + "@testim/chrome-version": "^1.1.4", + "axios": "^1.6.7", + "compare-versions": "^6.1.0", + "extract-zip": "^2.0.1", + "proxy-agent": "^6.4.0", + "proxy-from-env": "^1.1.0", + "tcp-port-used": "^1.0.2" + }, + "bin": { + "chromedriver": "bin/chromedriver" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.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/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/compare-versions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.0.tgz", + "integrity": "sha512-LNZQXhqUvqUTotpZ00qLSaify3b4VFD588aRr8MKFw4CMUr98ytzCW5wDH5qx/DEY5kCDXcbcRuCqL0szEf2tg==" + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "node_modules/cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==" + }, + "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/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/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/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": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "engines": { + "node": ">=0.3.1" + } + }, + "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/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "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/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/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/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/expect.js": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/expect.js/-/expect.js-0.3.1.tgz", + "integrity": "sha1-sKWaDS7/VDdUTr8M6qYBWEHQm1s=" + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "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/formidable": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.2.tgz", + "integrity": "sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==", + "dependencies": { + "dezalgo": "^1.0.4", + "hexoid": "^1.0.0", + "once": "^1.4.0", + "qs": "^6.11.0" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "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": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "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-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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/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/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "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-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/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hexoid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", + "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", + "engines": { + "node": ">=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/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/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "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-regex": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", + "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", + "engines": { + "node": ">=8" + } + }, + "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-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "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-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/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "engines": { + "node": ">=8" + } + }, + "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-url": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==" + }, + "node_modules/is2": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/is2/-/is2-2.0.7.tgz", + "integrity": "sha512-4vBQoURAXC6hnLFxD4VW7uc04XiwTTl/8ydYJxKvPwkWQrSjInkuM5VZVg6BGr1/natq69zDuvO9lGpLClJqvA==", + "dependencies": { + "deep-is": "^0.1.3", + "ip-regex": "^4.1.0", + "is-url": "^1.2.4" + }, + "engines": { + "node": ">=v0.10.0" + } + }, + "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/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/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/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "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/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/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/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "dependencies": { + "mime-db": "1.51.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mocha": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.3.0.tgz", + "integrity": "sha512-uF2XJs+7xSLsrmIvn37i/wnc91nw7XjOQB8ccyx5aEgdnohr7n+rEiZP23WkCYHjilR6+EboEnbq/ZQDz4LSbg==", + "dependencies": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "8.1.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/mocha/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/mocha/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/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/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/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/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/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } + }, + "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/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/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "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": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" + }, + "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/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/proxy-agent": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", + "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.3", + "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-agent/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/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/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "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/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "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/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/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/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "engines": { + "node": ">=0.10.0" + } + }, + "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/selenium-webdriver": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.18.1.tgz", + "integrity": "sha512-uP4OJ5wR4+VjdTi5oi/k8oieV2fIhVdVuaOPrklKghgS59w7Zz3nGa5gcG73VcU9EBRv5IZEBRhPr7qFJAj5mQ==", + "dependencies": { + "jszip": "^3.10.1", + "tmp": "^0.2.1", + "ws": ">=8.14.2" + }, + "engines": { + "node": ">= 14.20.0" + } + }, + "node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dependencies": { + "randombytes": "^2.1.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==" + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/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.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/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/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-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/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-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/superagent": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.1.2.tgz", + "integrity": "sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==", + "dependencies": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.4", + "debug": "^4.3.4", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.0", + "formidable": "^2.1.2", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.11.0", + "semver": "^7.3.8" + }, + "engines": { + "node": ">=6.4.0 <13 || >=14" + } + }, + "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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/tcp-port-used": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tcp-port-used/-/tcp-port-used-1.0.2.tgz", + "integrity": "sha512-l7ar8lLUD3XS1V2lfoJlCBaeoaWo/2xfYt81hM7VlvR4RrMVFqfmzfhLVk40hAb368uitje5gPtBRL1m/DGvLA==", + "dependencies": { + "debug": "4.3.1", + "is2": "^2.0.6" + } + }, + "node_modules/tcp-port-used/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/tmp/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/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/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "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/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/workerpool": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==" + }, + "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/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/ws": { + "version": "8.14.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", + "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", + "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/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/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "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" + } + } + }, + "dependencies": { + "@testim/chrome-version": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@testim/chrome-version/-/chrome-version-1.1.4.tgz", + "integrity": "sha512-kIhULpw9TrGYnHp/8VfdcneIcxKnLixmADtukQRtJUmsVlMg0niMkwV0xZmi8hqa57xqilIHjWFA0GKvEjVU5g==" + }, + "@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==" + }, + "@types/node": { + "version": "16.11.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.11.tgz", + "integrity": "sha512-KB0sixD67CeecHC33MYn+eYARkqTheIRNuu97y2XMjR7Wu3XibO1vaY6VBV6O/a89SPI81cEUIYT87UqUWlZNw==", + "optional": true + }, + "@types/yauzl": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.2.tgz", + "integrity": "sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA==", + "optional": true, + "requires": { + "@types/node": "*" + } + }, + "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==", + "requires": { + "debug": "^4.3.4" + } + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==" + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "requires": { + "tslib": "^2.0.1" + } + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "axios": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz", + "integrity": "sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==", + "requires": { + "follow-redirects": "^1.15.4", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "basic-ftp": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.4.tgz", + "integrity": "sha512-8PzkB0arJFV4jJWSGOYR+OEic6aeKMu/osRhBULN6RY0ykby6LKhbmuQ5ublvaas5BOwboah5D87nrHyuh8PPA==" + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==" + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "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==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.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" + } + }, + "chromedriver": { + "version": "122.0.5", + "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-122.0.5.tgz", + "integrity": "sha512-5WkCY4ioJZ1Qna6KWqPSrIz1MwGh6tHW7F67XTSbZn/GaMJrpiuy6b5c1BetrddSax+NX8u4tg4l3Wy1THecLQ==", + "requires": { + "@testim/chrome-version": "^1.1.4", + "axios": "^1.6.7", + "compare-versions": "^6.1.0", + "extract-zip": "^2.0.1", + "proxy-agent": "^6.4.0", + "proxy-from-env": "^1.1.0", + "tcp-port-used": "^1.0.2" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "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==", + "requires": { + "color-name": "~1.1.4" + } + }, + "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==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "compare-versions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.0.tgz", + "integrity": "sha512-LNZQXhqUvqUTotpZ00qLSaify3b4VFD588aRr8MKFw4CMUr98ytzCW5wDH5qx/DEY5kCDXcbcRuCqL0szEf2tg==" + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==" + }, + "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==" + }, + "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==" + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==" + }, + "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==" + }, + "degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "requires": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "requires": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==" + }, + "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==" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "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==" + }, + "escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "source-map": "~0.6.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "expect.js": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/expect.js/-/expect.js-0.3.1.tgz", + "integrity": "sha1-sKWaDS7/VDdUTr8M6qYBWEHQm1s=" + }, + "extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "requires": { + "@types/yauzl": "^2.9.1", + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + } + }, + "fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "requires": { + "pend": "~1.2.0" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "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==", + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==" + }, + "follow-redirects": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==" + }, + "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==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "formidable": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.2.tgz", + "integrity": "sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==", + "requires": { + "dezalgo": "^1.0.4", + "hexoid": "^1.0.0", + "once": "^1.4.0", + "qs": "^6.11.0" + } + }, + "fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "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==" + }, + "get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "requires": { + "pump": "^3.0.0" + } + }, + "get-uri": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.3.tgz", + "integrity": "sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==", + "requires": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4", + "fs-extra": "^11.2.0" + } + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "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==" + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + }, + "hexoid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", + "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==" + }, + "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==", + "requires": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + } + }, + "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==", + "requires": { + "agent-base": "^7.0.2", + "debug": "4" + } + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "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==", + "requires": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + } + }, + "ip-regex": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", + "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==" + }, + "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==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "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==" + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" + }, + "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==" + }, + "is-url": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==" + }, + "is2": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/is2/-/is2-2.0.7.tgz", + "integrity": "sha512-4vBQoURAXC6hnLFxD4VW7uc04XiwTTl/8ydYJxKvPwkWQrSjInkuM5VZVg6BGr1/natq69zDuvO9lGpLClJqvA==", + "requires": { + "deep-is": "^0.1.3", + "ip-regex": "^4.1.0", + "is-url": "^1.2.4" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "requires": { + "argparse": "^2.0.1" + } + }, + "jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==" + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "requires": { + "immediate": "~3.0.5" + } + }, + "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==", + "requires": { + "p-locate": "^5.0.0" + } + }, + "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==", + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + } + }, + "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==", + "requires": { + "yallist": "^4.0.0" + } + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==" + }, + "mime-db": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==" + }, + "mime-types": { + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "requires": { + "mime-db": "1.51.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mocha": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.3.0.tgz", + "integrity": "sha512-uF2XJs+7xSLsrmIvn37i/wnc91nw7XjOQB8ccyx5aEgdnohr7n+rEiZP23WkCYHjilR6+EboEnbq/ZQDz4LSbg==", + "requires": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "8.1.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==" + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "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==", + "requires": { + "p-limit": "^3.0.2" + } + }, + "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==", + "requires": { + "@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" + } + }, + "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==", + "requires": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + } + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "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==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, + "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==" + }, + "proxy-agent": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", + "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==", + "requires": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.3", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.0.1", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.2" + }, + "dependencies": { + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==" + } + } + }, + "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==" + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "requires": { + "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" + }, + "dependencies": { + "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==" + } + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "requires": { + "picomatch": "^2.2.1" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "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==" + }, + "selenium-webdriver": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.18.1.tgz", + "integrity": "sha512-uP4OJ5wR4+VjdTi5oi/k8oieV2fIhVdVuaOPrklKghgS59w7Zz3nGa5gcG73VcU9EBRv5IZEBRhPr7qFJAj5mQ==", + "requires": { + "jszip": "^3.10.1", + "tmp": "^0.2.1", + "ws": ">=8.14.2" + } + }, + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "requires": { + "randombytes": "^2.1.0" + } + }, + "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==" + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==" + }, + "socks": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.1.tgz", + "integrity": "sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ==", + "requires": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + } + }, + "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==", + "requires": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "socks": "^2.7.1" + } + }, + "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 + }, + "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==" + }, + "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==", + "requires": { + "safe-buffer": "~5.1.0" + }, + "dependencies": { + "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==" + } + } + }, + "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==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "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==" + }, + "superagent": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.1.2.tgz", + "integrity": "sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==", + "requires": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.4", + "debug": "^4.3.4", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.0", + "formidable": "^2.1.2", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.11.0", + "semver": "^7.3.8" + } + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "tcp-port-used": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tcp-port-used/-/tcp-port-used-1.0.2.tgz", + "integrity": "sha512-l7ar8lLUD3XS1V2lfoJlCBaeoaWo/2xfYt81hM7VlvR4RrMVFqfmzfhLVk40hAb368uitje5gPtBRL1m/DGvLA==", + "requires": { + "debug": "4.3.1", + "is2": "^2.0.6" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + } + } + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "requires": { + "rimraf": "^3.0.0" + }, + "dependencies": { + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "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==", + "requires": { + "is-number": "^7.0.0" + } + }, + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "workerpool": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==" + }, + "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==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "ws": { + "version": "8.14.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", + "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", + "requires": {} + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==" + }, + "yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "requires": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + } + }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "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==" + } + } +} diff --git a/test/package.json b/test/package.json new file mode 100644 index 0000000..0573ada --- /dev/null +++ b/test/package.json @@ -0,0 +1,18 @@ +{ + "name": "test", + "version": "1.0.0", + "description": "", + "main": "test.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + "dependencies": { + "chromedriver": "^122.0.5", + "expect.js": "^0.3.1", + "mocha": "^10.3.0", + "selenium-webdriver": "^4.18.1", + "superagent": "^8.1.2" + } +} diff --git a/test/test.js b/test/test.js new file mode 100755 index 0000000..eeebb01 --- /dev/null +++ b/test/test.js @@ -0,0 +1,319 @@ +#!/usr/bin/env node + +/* jshint esversion: 8 */ +/* global it:false */ +/* global xit:false */ +/* global describe:false */ +/* global before:false */ +/* global after:false */ + +'use strict'; + +require('chromedriver'); + +const execSync = require('child_process').execSync, + expect = require('expect.js'), + fs = require('fs'), + path = require('path'), + superagent = require('superagent'), + { Builder, By, until } = require('selenium-webdriver'), + { Options } = require('selenium-webdriver/chrome'); + +if (!process.env.USERNAME || !process.env.PASSWORD || !process.env.EMAIL) { + console.log('USERNAME, PASSWORD and EMAIL env vars need to be set'); + process.exit(1); +} + +describe('Application life cycle test', function () { + this.timeout(0); + + const TIMEOUT = parseInt(process.env.TIMEOUT, 10) || 5000; + const EXEC_ARGS = { cwd: path.resolve(__dirname, '..'), stdio: 'inherit' }; + const LOCATION = 'test'; + const SSH_PORT = 29420; + + let app, browser; + var athenticated_by_oidc = false; + + const repodir = '/tmp/testrepo'; + const reponame = 'testrepo'; + + const username = process.env.USERNAME; + const password = process.env.PASSWORD; + const email = process.env.EMAIL; + + before(function () { + browser = new Builder().forBrowser('chrome').setChromeOptions(new Options().windowSize({ width: 1280, height: 1024 })).build(); + }); + + after(function () { + browser.quit(); + fs.rmSync(repodir, { recursive: true, force: true }); + }); + + function getAppInfo() { + var inspect = JSON.parse(execSync('cloudron inspect')); + app = inspect.apps.filter(function (a) { return a.location.indexOf(LOCATION) === 0; })[0]; + expect(app).to.be.an('object'); + } + + async function waitForElement(elem) { + await browser.wait(until.elementLocated(elem), TIMEOUT); + await browser.wait(until.elementIsVisible(browser.findElement(elem)), TIMEOUT); + } + + function sleep(millis) { + return new Promise(resolve => setTimeout(resolve, millis)); + } + + async function setAvatar() { + await browser.get('https://' + app.fqdn + '/user/settings'); + + var button = await browser.findElement(By.xpath('//label[contains(text(), "Use Custom Avatar")]')); + await browser.executeScript('arguments[0].scrollIntoView(false)', button); + await browser.findElement(By.xpath('//label[contains(text(), "Use Custom Avatar")]')).click(); + await browser.findElement(By.xpath('//input[@type="file" and @name="avatar"]')).sendKeys(path.resolve(__dirname, '../logo.png')); + await browser.findElement(By.xpath('//button[contains(text(), "Update Avatar")]')).click(); + await browser.wait(until.elementLocated(By.xpath('//p[contains(text(),"Your avatar has been updated.")]')), TIMEOUT); + } + + async function checkAvatar() { + await browser.get(`https://${app.fqdn}/${username}`); + + const avatarSrc = await browser.findElement(By.xpath('//div[@id="profile-avatar"]/a/img')).getAttribute('src'); + + const response = await superagent.get(avatarSrc); + expect(response.statusCode).to.equal(200); + } + + async function login(username, password) { + await browser.get('https://' + app.fqdn + '/user/login'); + + await browser.findElement(By.id('user_name')).sendKeys(username); + await browser.findElement(By.id('password')).sendKeys(password); + await browser.findElement(By.xpath('//form[@action="/user/login"]//button')).click(); + await browser.wait(until.elementLocated(By.xpath('//img[contains(@class, "avatar")]')), TIMEOUT); + } + + async function adminLogin() { + await login('root', 'changeme'); + } + + async function loginOIDC(username, password) { + browser.manage().deleteAllCookies(); + await browser.get(`https://${app.fqdn}/user/login`); + await browser.sleep(2000); + + + await browser.findElement(By.xpath('//a[contains(@class, "openidConnect") and contains(., "Sign in with cloudron")]')).click(); + await browser.sleep(2000); + + if (!athenticated_by_oidc) { + await waitForElement(By.xpath('//input[@name="username"]')); + await browser.findElement(By.xpath('//input[@name="username"]')).sendKeys(username); + await browser.findElement(By.xpath('//input[@name="password"]')).sendKeys(password); + await browser.sleep(2000); + await browser.findElement(By.id('loginSubmitButton')).click(); + await browser.sleep(2000); + + athenticated_by_oidc = true; + } + + await waitForElement(By.xpath('//img[contains(@class, "avatar")]')); + } + + async function logout() { + await browser.get('https://' + app.fqdn); + + await browser.findElement(By.xpath('//img[contains(@class, "avatar")]')).click(); + await sleep(2000); + await browser.findElement(By.xpath('//a[@data-url="/user/logout"]')).click(); + await sleep(2000); + } + + async function addPublicKey() { + var publicKey = fs.readFileSync(__dirname + '/id_ed25519.pub', 'utf8'); + + await browser.get('https://' + app.fqdn + '/user/settings/keys'); + + await browser.wait(until.elementLocated(By.id('add-ssh-button')), TIMEOUT); + await browser.findElement(By.id('add-ssh-button')).click(); + await browser.findElement(By.id('ssh-key-title')).sendKeys('testkey'); + await browser.findElement(By.id('ssh-key-content')).sendKeys(publicKey.trim()); // #3480 + var button = browser.findElement(By.xpath('//button[contains(text(), "Add Key")]')); + await browser.executeScript('arguments[0].scrollIntoView(false)', button); + await browser.findElement(By.xpath('//form//button[contains(text(),"Add Key")]')).click(); + + await browser.wait(until.elementLocated(By.xpath('//p[contains(text(), "has been added.")]')), TIMEOUT); + } + + async function addPublicKeyOld() { + var publicKey = fs.readFileSync(__dirname + '/id_ed25519.pub', 'utf8'); + + await browser.get('https://' + app.fqdn + '/user/settings/keys'); + + await browser.wait(until.elementLocated(By.id('add-ssh-button')), TIMEOUT); + await browser.findElement(By.id('add-ssh-button')).click(); + await browser.findElement(By.id('ssh-key-title')).sendKeys('testkey'); + await browser.findElement(By.id('ssh-key-content')).sendKeys(publicKey.trim()); // #3480 + var button = browser.findElement(By.xpath('//button[contains(text(), "Add Key")]')); + await browser.executeScript('arguments[0].scrollIntoView(false)', button); + await browser.findElement(By.xpath('//button[contains(text(), "Add Key") and contains(@class, "green")]')).click(); + + await browser.wait(until.elementLocated(By.xpath('//p[contains(text(), "has been added.")]')), TIMEOUT); + } + + async function createRepo() { + var getRepoPage = await browser.get('https://' + app.fqdn + '/repo/create'); + + await browser.findElement(By.id('repo_name')).sendKeys(reponame); + var button = browser.findElement(By.xpath('//button[contains(text(), "Create Repository")]')); + await browser.executeScript('arguments[0].scrollIntoView(true)', button); + await browser.findElement(By.id('auto-init')).click(); + await browser.findElement(By.xpath('//button[contains(text(), "Create Repository")]')).click(); + + await browser.wait(function () { + return browser.getCurrentUrl().then(function (url) { + return url === 'https://' + app.fqdn + '/' + username + '/' + reponame; + }); + }, TIMEOUT); + } + + async function checkCloneUrl() { + await browser.get('https://' + app.fqdn + '/' + username + '/' + reponame); + await browser.findElement(By.id('repo-clone-ssh')).click(); + + var cloneUrl = await browser.findElement(By.id('repo-clone-url')).getAttribute('value'); + expect(cloneUrl).to.be(`ssh://git@${app.fqdn}:${SSH_PORT}/${username}/${reponame}.git`); + } + + function cloneRepo() { + fs.rmSync(repodir, { recursive: true, force: true }); + var env = Object.create(process.env); + env.GIT_SSH = __dirname + '/git_ssh_wrapper.sh'; + execSync(`git clone ssh://git@${app.fqdn}:${SSH_PORT}/${username}/${reponame}.git ${repodir}`, { env: env }); + } + + function pushFile() { + const env = Object.create(process.env); + env.GIT_SSH = __dirname + '/git_ssh_wrapper.sh'; + execSync(`touch newfile && git add newfile && git commit -a -mx && git push ssh://git@${app.fqdn}:${SSH_PORT}/${username}/${reponame} main`, + { env: env, cwd: repodir }); + fs.rmSync(repodir, { recursive: true, force: true }); + } + + function fileExists() { + expect(fs.existsSync(repodir + '/newfile')).to.be(true); + } + + async function sendMail() { + await browser.get(`https://${app.fqdn}/admin/config`); + + var button = await browser.findElement(By.xpath('//button[contains(text(), "Send")]')); + await browser.executeScript('arguments[0].scrollIntoView(true)', button); + await browser.findElement(By.xpath('//input[@name="email"]')).sendKeys('test@cloudron.io'); + await browser.findElement(By.xpath('//button[contains(text(), "Send")]')).click(); + await browser.wait(until.elementLocated(By.xpath('//p[contains(text(), "A testing email has been sent")]')), TIMEOUT); + } + + xit('build app', function () { execSync('cloudron build', EXEC_ARGS); }); + it('install app', function () { execSync(`cloudron install --location ${LOCATION} -p SSH_PORT=${SSH_PORT}`, EXEC_ARGS); }); + + it('can get app information', getAppInfo); + + it('can admin login', adminLogin); + it('can send mail', sendMail); + it('can logout', logout); + + it('can login', loginOIDC.bind(null, username, password)); + it('can set avatar', setAvatar); + it('can get avatar', checkAvatar); + + it('can add public key', addPublicKey); + + it('can create repo', createRepo); + + it('displays correct clone url', checkCloneUrl); + + it('can clone the url', cloneRepo); + + it('can add and push a file', pushFile); + + it('can restart app', function () { execSync('cloudron restart --app ' + app.id); }); + + xit('can login', loginOIDC.bind(null, username, password)); // no need to relogin since session persists + it('displays correct clone url', checkCloneUrl); + it('can clone the url', cloneRepo); + it('file exists in repo', fileExists); + + it('backup app', function () { execSync('cloudron backup create --app ' + app.id, EXEC_ARGS); }); + it('restore app', function () { execSync('cloudron restore --app ' + app.id, EXEC_ARGS); }); + + it('can login', loginOIDC.bind(null, username, password)); + it('can get avatar', checkAvatar); + it('can clone the url', cloneRepo); + it('file exists in repo', function () { expect(fs.existsSync(repodir + '/newfile')).to.be(true); }); + + it('move to different location', async function () { + //browser.manage().deleteAllCookies(); // commented because of error "'Network.deleteCookie' wasn't found" + // ensure we don't hit NXDOMAIN in the mean time + await browser.get('about:blank'); + + execSync('cloudron configure --location ' + LOCATION + '2 --app ' + app.id, EXEC_ARGS); + }); + it('can get app information', getAppInfo); + + it('can login', loginOIDC.bind(null, username, password)); + it('can get avatar', checkAvatar); + it('displays correct clone url', checkCloneUrl); + it('can clone the url', cloneRepo); + it('file exists in repo', function () { expect(fs.existsSync(repodir + '/newfile')).to.be(true); }); + + it('uninstall app', async function () { + // ensure we don't hit NXDOMAIN in the mean time + await browser.get('about:blank'); + execSync('cloudron uninstall --app ' + app.id, EXEC_ARGS); + }); + + // No SSO + it('install app (no sso)', function () { execSync(`cloudron install --no-sso --location ${LOCATION} -p SSH_PORT=${SSH_PORT}`, EXEC_ARGS); }); + + it('can get app information', getAppInfo); + it('can admin login (no sso)', adminLogin); + it('can logout', logout); + + it('uninstall app (no sso)', async function () { + await browser.get('about:blank'); + execSync('cloudron uninstall --app ' + app.id, EXEC_ARGS); + }); + + // test update + it('can install app', function () { execSync(`cloudron install --appstore-id ${app.manifest.id} --location ${LOCATION} -p SSH_PORT=${SSH_PORT}`, EXEC_ARGS); }); + + it('can get app information', getAppInfo); + it('can login', loginOIDC.bind(null, username, password)); + it('can set avatar', setAvatar); + it('can get avatar', checkAvatar); + it('can add public key', addPublicKey); + it('can create repo', createRepo); + it('can clone the url', cloneRepo); + it('can add and push a file', pushFile); + + it('can update', function () { execSync('cloudron update --app ' + app.id, EXEC_ARGS); }); + it('can get app information', getAppInfo); + + it('can admin login', adminLogin); + it('can send mail', sendMail); + it('can logout', logout); + + it('can login', loginOIDC.bind(null, username, password)); + it('can get avatar', checkAvatar); + it('can clone the url', cloneRepo); + it('file exists in cloned repo', fileExists); + + it('uninstall app', async function () { + // ensure we don't hit NXDOMAIN in the mean time + await browser.get('about:blank'); + execSync('cloudron uninstall --app ' + app.id, EXEC_ARGS); + }); +});