From 65a7943588df84cb15d02447e5af09854884f2cd Mon Sep 17 00:00:00 2001 From: Lucas Colombo Date: Sat, 1 Jul 2023 16:19:40 -0300 Subject: [PATCH] =?UTF-8?q?=F0=9F=A5=82=20Initial=20commit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .cocorc | 2 + .design/logos.ai | 1460 + .eslintrc.json | 13 + .github/workflows/release.yml | 22 + .gitignore | 164 + .prettierignore | 6 + .prettierrc | 20 + .vscode/settings.json | 39 + LICENSE | 21 + README.md | 255 + package-lock.json | 5699 ++++ package.json | 28 + src/__templates/home.tmpl | 51 + src/templates/admin/actions.tmpl | 7 + src/templates/admin/applications/list.tmpl | 8 + .../admin/applications/oauth2_edit.tmpl | 6 + src/templates/admin/auth/edit.tmpl | 461 + src/templates/admin/auth/list.tmpl | 38 + src/templates/admin/auth/new.tmpl | 122 + src/templates/admin/auth/source/ldap.tmpl | 141 + src/templates/admin/auth/source/oauth.tmpl | 109 + src/templates/admin/auth/source/smtp.tmpl | 59 + src/templates/admin/auth/source/sspi.tmpl | 43 + src/templates/admin/base/search.tmpl | 23 + src/templates/admin/config.tmpl | 366 + src/templates/admin/cron.tmpl | 39 + src/templates/admin/dashboard.tmpl | 137 + src/templates/admin/emails/list.tmpl | 101 + src/templates/admin/hook_new.tmpl | 55 + src/templates/admin/hooks.tmpl | 9 + src/templates/admin/layout_footer.tmpl | 11 + src/templates/admin/layout_head.tmpl | 13 + src/templates/admin/navbar.tmpl | 71 + src/templates/admin/notice.tmpl | 71 + src/templates/admin/org/list.tmpl | 54 + src/templates/admin/packages/list.tmpl | 90 + src/templates/admin/queue.tmpl | 34 + src/templates/admin/queue_manage.tmpl | 59 + src/templates/admin/repo/list.tmpl | 109 + src/templates/admin/repo/search.tmpl | 29 + src/templates/admin/repo/unadopted.tmpl | 75 + src/templates/admin/runners/edit.tmpl | 5 + src/templates/admin/stacktrace-row.tmpl | 66 + src/templates/admin/stacktrace.tmpl | 48 + src/templates/admin/stats.tmpl | 17 + src/templates/admin/user/edit.tmpl | 216 + src/templates/admin/user/list.tmpl | 109 + src/templates/admin/user/new.tmpl | 90 + src/templates/api/packages/pypi/simple.tmpl | 15 + src/templates/base/alert.tmpl | 20 + src/templates/base/alert_details.tmpl | 7 + src/templates/base/disable_form_autofill.tmpl | 31 + src/templates/base/footer.tmpl | 31 + src/templates/base/footer_content.tmpl | 30 + src/templates/base/head.tmpl | 84 + src/templates/base/head_navbar.tmpl | 205 + src/templates/base/head_script.tmpl | 45 + src/templates/base/head_style.tmpl | 8 + src/templates/base/modal_actions_confirm.tmpl | 38 + src/templates/base/paginate.tmpl | 32 + src/templates/code/searchform.tmpl | 14 + src/templates/code/searchresults.tmpl | 43 + src/templates/custom/body_inner_post.tmpl | 0 src/templates/custom/body_inner_pre.tmpl | 0 src/templates/custom/body_outer_post.tmpl | 0 src/templates/custom/body_outer_pre.tmpl | 0 src/templates/custom/extra_links.tmpl | 0 src/templates/custom/extra_links_footer.tmpl | 0 src/templates/custom/extra_tabs.tmpl | 0 src/templates/custom/footer.tmpl | 0 src/templates/custom/header.tmpl | 0 src/templates/devtest/fomantic-modal.tmpl | 49 + src/templates/devtest/gitea-ui.tmpl | 247 + src/templates/devtest/list.tmpl | 12 + src/templates/devtest/tmplerr-sub.tmpl | 3 + src/templates/devtest/tmplerr.tmpl | 12 + src/templates/explore/code.tmpl | 25 + src/templates/explore/navbar.tmpl | 18 + src/templates/explore/organizations.tmpl | 38 + src/templates/explore/repo_list.tmpl | 71 + src/templates/explore/repo_search.tmpl | 42 + src/templates/explore/repos.tmpl | 10 + src/templates/explore/search.tmpl | 24 + src/templates/explore/users.tmpl | 33 + src/templates/home.tmpl | 9 + src/templates/install.tmpl | 335 + src/templates/mail/auth/activate.tmpl | 17 + src/templates/mail/auth/activate_email.tmpl | 17 + src/templates/mail/auth/register_notify.tmpl | 18 + src/templates/mail/auth/reset_passwd.tmpl | 17 + src/templates/mail/issue/assigned.tmpl | 29 + src/templates/mail/issue/default.tmpl | 91 + src/templates/mail/notify/collaborator.tmpl | 21 + src/templates/mail/notify/repo_transfer.tmpl | 18 + src/templates/mail/release.tmpl | 61 + src/templates/mail/team_invite.tmpl | 16 + src/templates/org/create.tmpl | 57 + src/templates/org/header.tmpl | 18 + src/templates/org/home.tmpl | 95 + src/templates/org/member/members.tmpl | 103 + src/templates/org/menu.tmpl | 47 + src/templates/org/projects/list.tmpl | 6 + src/templates/org/projects/new.tmpl | 6 + src/templates/org/projects/view.tmpl | 6 + src/templates/org/settings/actions.tmpl | 9 + src/templates/org/settings/applications.tmpl | 9 + .../settings/applications_oauth2_edit.tmpl | 5 + src/templates/org/settings/delete.tmpl | 35 + src/templates/org/settings/hook_new.tmpl | 48 + src/templates/org/settings/hooks.tmpl | 5 + src/templates/org/settings/labels.tmpl | 19 + src/templates/org/settings/layout_footer.tmpl | 11 + src/templates/org/settings/layout_head.tmpl | 14 + src/templates/org/settings/navbar.tmpl | 42 + src/templates/org/settings/options.tmpl | 98 + src/templates/org/settings/packages.tmpl | 6 + .../settings/packages_cleanup_rules_edit.tmpl | 5 + .../packages_cleanup_rules_preview.tmpl | 5 + src/templates/org/settings/runners_edit.tmpl | 5 + src/templates/org/team/invite.tmpl | 23 + src/templates/org/team/members.tmpl | 76 + src/templates/org/team/navbar.tmpl | 4 + src/templates/org/team/new.tmpl | 161 + src/templates/org/team/repositories.tmpl | 89 + src/templates/org/team/sidebar.tmpl | 94 + src/templates/org/team/teams.tmpl | 55 + src/templates/package/content/alpine.tmpl | 52 + src/templates/package/content/cargo.tmpl | 62 + src/templates/package/content/chef.tmpl | 48 + src/templates/package/content/composer.tmpl | 50 + .../content/composer_dependencies.tmpl | 19 + src/templates/package/content/conan.tmpl | 34 + src/templates/package/content/conda.tmpl | 30 + src/templates/package/content/container.tmpl | 90 + src/templates/package/content/cran.tmpl | 59 + src/templates/package/content/debian.tmpl | 65 + src/templates/package/content/generic.tmpl | 18 + src/templates/package/content/go.tmpl | 14 + src/templates/package/content/helm.tmpl | 57 + src/templates/package/content/maven.tmpl | 71 + src/templates/package/content/npm.tmpl | 56 + .../package/content/npm_dependencies.tmpl | 19 + src/templates/package/content/nuget.tmpl | 52 + src/templates/package/content/pub.tmpl | 19 + src/templates/package/content/pypi.tmpl | 31 + src/templates/package/content/rpm.tmpl | 26 + src/templates/package/content/rubygems.tmpl | 40 + .../content/rubygems_dependencies.tmpl | 19 + src/templates/package/content/swift.tmpl | 40 + src/templates/package/content/vagrant.tmpl | 18 + src/templates/package/metadata/alpine.tmpl | 5 + src/templates/package/metadata/cargo.tmpl | 7 + src/templates/package/metadata/chef.tmpl | 5 + src/templates/package/metadata/composer.tmpl | 5 + src/templates/package/metadata/conan.tmpl | 6 + src/templates/package/metadata/conda.tmpl | 6 + src/templates/package/metadata/container.tmpl | 9 + src/templates/package/metadata/cran.tmpl | 5 + src/templates/package/metadata/debian.tmpl | 4 + src/templates/package/metadata/generic.tmpl | 0 src/templates/package/metadata/helm.tmpl | 4 + src/templates/package/metadata/maven.tmpl | 5 + src/templates/package/metadata/npm.tmpl | 8 + src/templates/package/metadata/nuget.tmpl | 4 + src/templates/package/metadata/pub.tmpl | 5 + src/templates/package/metadata/pypi.tmpl | 5 + src/templates/package/metadata/rpm.tmpl | 4 + src/templates/package/metadata/rubygems.tmpl | 5 + src/templates/package/metadata/swift.tmpl | 4 + src/templates/package/metadata/vagrant.tmpl | 5 + src/templates/package/settings.tmpl | 68 + src/templates/package/shared/cargo.tmpl | 24 + .../package/shared/cleanup_rules/edit.tmpl | 73 + .../package/shared/cleanup_rules/list.tmpl | 34 + .../package/shared/cleanup_rules/preview.tmpl | 34 + src/templates/package/shared/list.tmpl | 55 + src/templates/package/shared/versionlist.tmpl | 39 + src/templates/package/view.tmpl | 115 + src/templates/post-install.tmpl | 24 + src/templates/projects/list.tmpl | 92 + src/templates/projects/new.tmpl | 70 + src/templates/projects/view.tmpl | 269 + src/templates/repo/actions/list.tmpl | 27 + src/templates/repo/actions/runs_list.tmpl | 32 + src/templates/repo/actions/status.tmpl | 29 + src/templates/repo/actions/view.tmpl | 29 + src/templates/repo/activity.tmpl | 240 + src/templates/repo/blame.tmpl | 68 + src/templates/repo/branch/list.tmpl | 244 + src/templates/repo/branch_dropdown.tmpl | 89 + src/templates/repo/cite/cite_buttons.tmpl | 11 + src/templates/repo/cite/cite_modal.tmpl | 22 + src/templates/repo/clone_buttons.tmpl | 15 + src/templates/repo/clone_script.tmpl | 42 + src/templates/repo/commit_page.tmpl | 290 + src/templates/repo/commit_status.tmpl | 18 + src/templates/repo/commit_statuses.tmpl | 22 + src/templates/repo/commits.tmpl | 20 + src/templates/repo/commits_list.tmpl | 87 + src/templates/repo/commits_list_small.tmpl | 50 + src/templates/repo/commits_table.tmpl | 36 + src/templates/repo/create.tmpl | 225 + src/templates/repo/create_helper.tmpl | 3 + src/templates/repo/diff/blob_excerpt.tmpl | 80 + src/templates/repo/diff/box.tmpl | 228 + src/templates/repo/diff/comment_form.tmpl | 43 + .../repo/diff/comment_form_datahandler.tmpl | 7 + src/templates/repo/diff/comments.tmpl | 72 + src/templates/repo/diff/compare.tmpl | 244 + src/templates/repo/diff/conversation.tmpl | 66 + src/templates/repo/diff/csv_diff.tmpl | 58 + src/templates/repo/diff/escape_title.tmpl | 2 + src/templates/repo/diff/image_diff.tmpl | 81 + src/templates/repo/diff/new_comment.tmpl | 5 + src/templates/repo/diff/new_review.tmpl | 51 + src/templates/repo/diff/options_dropdown.tmpl | 33 + src/templates/repo/diff/section_code.tmpl | 6 + src/templates/repo/diff/section_split.tmpl | 155 + src/templates/repo/diff/section_unified.tmpl | 71 + src/templates/repo/diff/stats.tmpl | 5 + .../repo/diff/whitespace_dropdown.tmpl | 30 + src/templates/repo/editor/cherry_pick.tmpl | 30 + src/templates/repo/editor/commit_form.tmpl | 74 + src/templates/repo/editor/delete.tmpl | 13 + src/templates/repo/editor/diff_preview.tmpl | 11 + src/templates/repo/editor/edit.tmpl | 78 + src/templates/repo/editor/patch.tmpl | 57 + src/templates/repo/editor/upload.tmpl | 33 + src/templates/repo/empty.tmpl | 82 + src/templates/repo/file_info.tmpl | 33 + src/templates/repo/find/files.tmpl | 21 + src/templates/repo/forks.tmpl | 18 + src/templates/repo/graph.tmpl | 62 + src/templates/repo/graph/commits.tmpl | 79 + src/templates/repo/graph/div.tmpl | 7 + src/templates/repo/graph/svgcontainer.tmpl | 24 + src/templates/repo/header.tmpl | 253 + src/templates/repo/home.tmpl | 164 + src/templates/repo/icon.tmpl | 15 + .../repo/issue/branch_selector_field.tmpl | 54 + src/templates/repo/issue/choose.tmpl | 59 + src/templates/repo/issue/comment_tab.tmpl | 22 + .../repo/issue/fields/checkboxes.tmpl | 12 + src/templates/repo/issue/fields/dropdown.tmpl | 17 + src/templates/repo/issue/fields/header.tmpl | 6 + src/templates/repo/issue/fields/input.tmpl | 4 + src/templates/repo/issue/fields/markdown.tmpl | 3 + src/templates/repo/issue/fields/textarea.tmpl | 25 + src/templates/repo/issue/label_precolors.tmpl | 16 + src/templates/repo/issue/labels.tmpl | 25 + .../repo/issue/labels/edit_delete_label.tmpl | 64 + src/templates/repo/issue/labels/label.tmpl | 7 + .../repo/issue/labels/label_list.tmpl | 83 + .../issue/labels/label_load_template.tmpl | 24 + .../repo/issue/labels/label_new.tmpl | 50 + .../issue/labels/labels_selector_field.tmpl | 42 + .../repo/issue/labels/labels_sidebar.tmpl | 11 + src/templates/repo/issue/list.tmpl | 406 + .../repo/issue/milestone/select_menu.tmpl | 38 + .../repo/issue/milestone_issues.tmpl | 205 + src/templates/repo/issue/milestone_new.tmpl | 63 + src/templates/repo/issue/milestones.tmpl | 146 + src/templates/repo/issue/navbar.tmpl | 4 + src/templates/repo/issue/new.tmpl | 16 + src/templates/repo/issue/new_form.tmpl | 190 + src/templates/repo/issue/openclose.tmpl | 14 + src/templates/repo/issue/search.tmpl | 16 + src/templates/repo/issue/view.tmpl | 12 + src/templates/repo/issue/view_content.tmpl | 200 + .../repo/issue/view_content/add_reaction.tmpl | 12 + .../repo/issue/view_content/attachments.tmpl | 42 + .../repo/issue/view_content/comments.tmpl | 843 + .../view_content/comments_delete_time.tmpl | 18 + .../repo/issue/view_content/context_menu.tmpl | 27 + .../repo/issue/view_content/pull.tmpl | 381 + .../view_content/pull_merge_instruction.tmpl | 19 + .../repo/issue/view_content/reactions.tmpl | 15 + .../view_content/reference_issue_dialog.tmpl | 30 + .../repo/issue/view_content/sidebar.tmpl | 689 + .../view_content/update_branch_by_merge.tmpl | 37 + src/templates/repo/issue/view_title.tmpl | 119 + src/templates/repo/migrate/codebase.tmpl | 116 + src/templates/repo/migrate/git.tmpl | 90 + src/templates/repo/migrate/gitbucket.tmpl | 132 + src/templates/repo/migrate/gitea.tmpl | 128 + src/templates/repo/migrate/github.tmpl | 130 + src/templates/repo/migrate/gitlab.tmpl | 127 + src/templates/repo/migrate/gogs.tmpl | 130 + src/templates/repo/migrate/helper.tmpl | 0 src/templates/repo/migrate/migrate.tmpl | 32 + src/templates/repo/migrate/migrating.tmpl | 100 + src/templates/repo/migrate/onedev.tmpl | 116 + src/templates/repo/migrate/options.tmpl | 26 + src/templates/repo/packages.tmpl | 6 + src/templates/repo/projects/list.tmpl | 93 + src/templates/repo/projects/new.tmpl | 6 + src/templates/repo/projects/view.tmpl | 277 + src/templates/repo/pulls/commits.tmpl | 10 + src/templates/repo/pulls/files.tmpl | 14 + src/templates/repo/pulls/fork.tmpl | 70 + src/templates/repo/pulls/status.tmpl | 34 + src/templates/repo/pulls/tab_menu.tmpl | 17 + src/templates/repo/release/list.tmpl | 133 + src/templates/repo/release/new.tmpl | 152 + src/templates/repo/release_tag_header.tmpl | 27 + src/templates/repo/search.tmpl | 73 + src/templates/repo/search_name.tmpl | 1 + src/templates/repo/settings/actions.tmpl | 9 + src/templates/repo/settings/branches.tmpl | 77 + .../repo/settings/collaboration.tmpl | 121 + src/templates/repo/settings/deploy_keys.tmpl | 86 + src/templates/repo/settings/githook_edit.tmpl | 27 + src/templates/repo/settings/githooks.tmpl | 23 + .../repo/settings/layout_footer.tmpl | 11 + src/templates/repo/settings/layout_head.tmpl | 14 + src/templates/repo/settings/lfs.tmpl | 55 + src/templates/repo/settings/lfs_file.tmpl | 57 + .../repo/settings/lfs_file_find.tmpl | 46 + src/templates/repo/settings/lfs_locks.tmpl | 56 + src/templates/repo/settings/lfs_pointers.tmpl | 66 + src/templates/repo/settings/nav.tmpl | 19 + src/templates/repo/settings/navbar.tmpl | 50 + src/templates/repo/settings/options.tmpl | 1030 + .../repo/settings/protected_branch.tmpl | 263 + src/templates/repo/settings/runner_edit.tmpl | 5 + src/templates/repo/settings/secrets.tmpl | 5 + src/templates/repo/settings/tags.tmpl | 126 + src/templates/repo/settings/webhook/base.tmpl | 5 + .../repo/settings/webhook/base_list.tmpl | 58 + .../repo/settings/webhook/delete_modal.tmpl | 10 + .../repo/settings/webhook/dingtalk.tmpl | 11 + .../repo/settings/webhook/discord.tmpl | 19 + .../repo/settings/webhook/feishu.tmpl | 12 + .../repo/settings/webhook/gitea.tmpl | 40 + src/templates/repo/settings/webhook/gogs.tmpl | 28 + .../repo/settings/webhook/history.tmpl | 81 + src/templates/repo/settings/webhook/list.tmpl | 4 + .../repo/settings/webhook/matrix.tmpl | 27 + .../repo/settings/webhook/msteams.tmpl | 11 + src/templates/repo/settings/webhook/new.tmpl | 47 + .../repo/settings/webhook/packagist.tmpl | 19 + .../repo/settings/webhook/settings.tmpl | 288 + .../repo/settings/webhook/slack.tmpl | 28 + .../repo/settings/webhook/telegram.tmpl | 15 + .../repo/settings/webhook/wechatwork.tmpl | 11 + src/templates/repo/shabox_badge.tmpl | 15 + src/templates/repo/sub_menu.tmpl | 50 + src/templates/repo/tag/list.tmpl | 79 + src/templates/repo/unicode_escape_prompt.tmpl | 22 + src/templates/repo/upload.tmpl | 15 + src/templates/repo/user_cards.tmpl | 29 + src/templates/repo/view_file.tmpl | 128 + src/templates/repo/view_list.tmpl | 99 + src/templates/repo/watchers.tmpl | 8 + src/templates/repo/wiki/new.tmpl | 48 + src/templates/repo/wiki/pages.tmpl | 30 + src/templates/repo/wiki/revision.tmpl | 45 + src/templates/repo/wiki/start.tmpl | 15 + src/templates/repo/wiki/view.tmpl | 115 + src/templates/shared/actions/runner_edit.tmpl | 101 + src/templates/shared/actions/runner_list.tmpl | 91 + src/templates/shared/combomarkdowneditor.tmpl | 59 + src/templates/shared/issueicon.tmpl | 25 + src/templates/shared/issuelist.tmpl | 158 + src/templates/shared/searchbottom.tmpl | 12 + src/templates/shared/secrets/add_list.tmpl | 67 + src/templates/shared/user/authorlink.tmpl | 1 + src/templates/shared/user/avatarlink.tmpl | 1 + src/templates/shared/user/namelink.tmpl | 1 + src/templates/status/404.tmpl | 12 + src/templates/status/500.tmpl | 67 + src/templates/swagger/ui.tmpl | 12 + src/templates/swagger/v1_json.tmpl | 22926 ++++++++++++++++ src/templates/user/auth/activate.tmpl | 52 + src/templates/user/auth/captcha.tmpl | 28 + src/templates/user/auth/change_passwd.tmpl | 7 + .../user/auth/change_passwd_inner.tmpl | 26 + src/templates/user/auth/finalize_openid.tmpl | 47 + src/templates/user/auth/forgot_passwd.tmpl | 40 + src/templates/user/auth/grant.tmpl | 33 + src/templates/user/auth/grant_error.tmpl | 16 + src/templates/user/auth/link_account.tmpl | 34 + src/templates/user/auth/oidc_wellknown.tmpl | 49 + src/templates/user/auth/prohibit_login.tmpl | 16 + src/templates/user/auth/reset_passwd.tmpl | 67 + src/templates/user/auth/signin.tmpl | 10 + src/templates/user/auth/signin_inner.tmpl | 74 + src/templates/user/auth/signin_navbar.tmpl | 21 + src/templates/user/auth/signin_openid.tmpl | 38 + src/templates/user/auth/signup.tmpl | 7 + src/templates/user/auth/signup_inner.tmpl | 60 + .../user/auth/signup_openid_connect.tmpl | 36 + .../user/auth/signup_openid_navbar.tmpl | 12 + .../user/auth/signup_openid_register.tmpl | 38 + src/templates/user/auth/twofa.tmpl | 27 + src/templates/user/auth/twofa_scratch.tmpl | 26 + src/templates/user/auth/webauthn.tmpl | 23 + src/templates/user/auth/webauthn_error.tmpl | 13 + src/templates/user/code.tmpl | 25 + src/templates/user/dashboard/dashboard.tmpl | 15 + src/templates/user/dashboard/feeds.tmpl | 128 + src/templates/user/dashboard/issues.tmpl | 115 + src/templates/user/dashboard/milestones.tmpl | 157 + src/templates/user/dashboard/navbar.tmpl | 108 + src/templates/user/dashboard/repolist.tmpl | 59 + src/templates/user/heatmap.tmpl | 14 + .../user/notification/notification.tmpl | 3 + .../user/notification/notification_div.tmpl | 126 + .../notification_subscriptions.tmpl | 79 + src/templates/user/overview/header.tmpl | 92 + .../user/overview/package_versions.tmpl | 6 + src/templates/user/overview/packages.tmpl | 6 + src/templates/user/profile.tmpl | 159 + src/templates/user/settings/account.tmpl | 186 + src/templates/user/settings/actions.tmpl | 10 + src/templates/user/settings/appearance.tmpl | 170 + src/templates/user/settings/applications.tmpl | 110 + .../user/settings/applications_oauth2.tmpl | 6 + .../settings/applications_oauth2_edit.tmpl | 6 + .../applications_oauth2_edit_form.tmpl | 52 + .../settings/applications_oauth2_list.tmpl | 59 + .../user/settings/grants_oauth2.tmpl | 40 + src/templates/user/settings/hook_new.tmpl | 49 + src/templates/user/settings/hooks.tmpl | 5 + src/templates/user/settings/keys.tmpl | 7 + src/templates/user/settings/keys_gpg.tmpl | 123 + .../user/settings/keys_principal.tmpl | 67 + src/templates/user/settings/keys_ssh.tmpl | 112 + .../user/settings/layout_footer.tmpl | 11 + src/templates/user/settings/layout_head.tmpl | 13 + src/templates/user/settings/navbar.tmpl | 52 + src/templates/user/settings/organization.tmpl | 50 + src/templates/user/settings/packages.tmpl | 25 + .../settings/packages_cleanup_rules_edit.tmpl | 5 + .../packages_cleanup_rules_preview.tmpl | 5 + src/templates/user/settings/profile.tmpl | 133 + src/templates/user/settings/repos.tmpl | 130 + src/templates/user/settings/runner_edit.tmpl | 5 + .../user/settings/security/accountlinks.tmpl | 53 + .../user/settings/security/openid.tmpl | 63 + .../user/settings/security/security.tmpl | 11 + .../user/settings/security/twofa.tmpl | 35 + .../user/settings/security/twofa_enroll.tmpl | 25 + .../user/settings/security/webauthn.tmpl | 38 + .../fonts/KaTeX_AMS-Regular.73ea273a.woff2 | Bin 0 -> 28076 bytes .../KaTeX_Caligraphic-Bold.a1abf90d.woff2 | Bin 0 -> 6912 bytes .../KaTeX_Caligraphic-Regular.d6484fce.woff2 | Bin 0 -> 6908 bytes .../fonts/KaTeX_Fraktur-Bold.931d67ea.woff2 | Bin 0 -> 11348 bytes .../KaTeX_Fraktur-Regular.172d3529.woff2 | Bin 0 -> 11316 bytes .../fonts/KaTeX_Main-Bold.39890742.woff2 | Bin 0 -> 25324 bytes .../KaTeX_Main-BoldItalic.20f389c4.woff2 | Bin 0 -> 16780 bytes .../fonts/KaTeX_Main-Italic.fe2176f7.woff2 | Bin 0 -> 16988 bytes .../fonts/KaTeX_Main-Regular.f650f111.woff2 | Bin 0 -> 26272 bytes .../KaTeX_Math-BoldItalic.dcbcbd93.woff2 | Bin 0 -> 16400 bytes .../fonts/KaTeX_Math-Italic.6d3d25f4.woff2 | Bin 0 -> 16440 bytes .../fonts/KaTeX_SansSerif-Bold.95591a92.woff2 | Bin 0 -> 12216 bytes .../KaTeX_SansSerif-Italic.7d393d38.woff2 | Bin 0 -> 12028 bytes .../KaTeX_SansSerif-Regular.cd5e231e.woff2 | Bin 0 -> 10344 bytes .../fonts/KaTeX_Script-Regular.c81d1b2a.woff2 | Bin 0 -> 9644 bytes .../fonts/KaTeX_Size1-Regular.6eec866c.woff2 | Bin 0 -> 5468 bytes .../fonts/KaTeX_Size2-Regular.2960900c.woff2 | Bin 0 -> 5208 bytes .../fonts/KaTeX_Size3-Regular.e1951519.woff2 | Bin 0 -> 3624 bytes .../fonts/KaTeX_Size4-Regular.e418bf25.woff2 | Bin 0 -> 4928 bytes .../KaTeX_Typewriter-Regular.c295e7f7.woff2 | Bin 0 -> 13568 bytes src/themes/fonts/codicon.4a477f66.ttf | Bin 0 -> 73464 bytes src/themes/img/favicon.svg | 10 + src/themes/img/loading.svg | 15 + src/themes/img/logo.svg | 10 + src/themes/scss/dark.scss | 66 + src/themes/scss/gitea/index.scss | 295 + src/themes/scss/gitea/modules/_chroma.scss | 310 + .../scss/gitea/modules/_codemirror.scss | 95 + src/themes/scss/utils/_color-utils.scss | 85 + tools/build.js | 43 + tools/deploy.js | 34 + tools/restart.js | 19 + tools/serve.js | 40 + tools/tasks/copy-to.js | 34 + tools/tasks/deploy.js | 33 + tools/tasks/fonts.js | 32 + tools/tasks/img.js | 129 + tools/tasks/restart-service.js | 31 + tools/tasks/scss.js | 64 + tools/tasks/templates.js | 17 + tools/utils/funcs.js | 162 + tools/utils/logger.js | 105 + tools/utils/task-debouncer.js | 67 + 🍵 lugit-theme.code-workspace | 10 + 488 files changed, 57991 insertions(+) create mode 100644 .cocorc create mode 100644 .design/logos.ai create mode 100644 .eslintrc.json create mode 100644 .github/workflows/release.yml create mode 100644 .gitignore create mode 100644 .prettierignore create mode 100644 .prettierrc create mode 100644 .vscode/settings.json create mode 100644 LICENSE create mode 100644 README.md create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/__templates/home.tmpl create mode 100644 src/templates/admin/actions.tmpl create mode 100644 src/templates/admin/applications/list.tmpl create mode 100644 src/templates/admin/applications/oauth2_edit.tmpl create mode 100644 src/templates/admin/auth/edit.tmpl create mode 100644 src/templates/admin/auth/list.tmpl create mode 100644 src/templates/admin/auth/new.tmpl create mode 100644 src/templates/admin/auth/source/ldap.tmpl create mode 100644 src/templates/admin/auth/source/oauth.tmpl create mode 100644 src/templates/admin/auth/source/smtp.tmpl create mode 100644 src/templates/admin/auth/source/sspi.tmpl create mode 100644 src/templates/admin/base/search.tmpl create mode 100644 src/templates/admin/config.tmpl create mode 100644 src/templates/admin/cron.tmpl create mode 100644 src/templates/admin/dashboard.tmpl create mode 100644 src/templates/admin/emails/list.tmpl create mode 100644 src/templates/admin/hook_new.tmpl create mode 100644 src/templates/admin/hooks.tmpl create mode 100644 src/templates/admin/layout_footer.tmpl create mode 100644 src/templates/admin/layout_head.tmpl create mode 100644 src/templates/admin/navbar.tmpl create mode 100644 src/templates/admin/notice.tmpl create mode 100644 src/templates/admin/org/list.tmpl create mode 100644 src/templates/admin/packages/list.tmpl create mode 100644 src/templates/admin/queue.tmpl create mode 100644 src/templates/admin/queue_manage.tmpl create mode 100644 src/templates/admin/repo/list.tmpl create mode 100644 src/templates/admin/repo/search.tmpl create mode 100644 src/templates/admin/repo/unadopted.tmpl create mode 100644 src/templates/admin/runners/edit.tmpl create mode 100644 src/templates/admin/stacktrace-row.tmpl create mode 100644 src/templates/admin/stacktrace.tmpl create mode 100644 src/templates/admin/stats.tmpl create mode 100644 src/templates/admin/user/edit.tmpl create mode 100644 src/templates/admin/user/list.tmpl create mode 100644 src/templates/admin/user/new.tmpl create mode 100644 src/templates/api/packages/pypi/simple.tmpl create mode 100644 src/templates/base/alert.tmpl create mode 100644 src/templates/base/alert_details.tmpl create mode 100644 src/templates/base/disable_form_autofill.tmpl create mode 100644 src/templates/base/footer.tmpl create mode 100644 src/templates/base/footer_content.tmpl create mode 100644 src/templates/base/head.tmpl create mode 100644 src/templates/base/head_navbar.tmpl create mode 100644 src/templates/base/head_script.tmpl create mode 100644 src/templates/base/head_style.tmpl create mode 100644 src/templates/base/modal_actions_confirm.tmpl create mode 100644 src/templates/base/paginate.tmpl create mode 100644 src/templates/code/searchform.tmpl create mode 100644 src/templates/code/searchresults.tmpl create mode 100644 src/templates/custom/body_inner_post.tmpl create mode 100644 src/templates/custom/body_inner_pre.tmpl create mode 100644 src/templates/custom/body_outer_post.tmpl create mode 100644 src/templates/custom/body_outer_pre.tmpl create mode 100644 src/templates/custom/extra_links.tmpl create mode 100644 src/templates/custom/extra_links_footer.tmpl create mode 100644 src/templates/custom/extra_tabs.tmpl create mode 100644 src/templates/custom/footer.tmpl create mode 100644 src/templates/custom/header.tmpl create mode 100644 src/templates/devtest/fomantic-modal.tmpl create mode 100644 src/templates/devtest/gitea-ui.tmpl create mode 100644 src/templates/devtest/list.tmpl create mode 100644 src/templates/devtest/tmplerr-sub.tmpl create mode 100644 src/templates/devtest/tmplerr.tmpl create mode 100644 src/templates/explore/code.tmpl create mode 100644 src/templates/explore/navbar.tmpl create mode 100644 src/templates/explore/organizations.tmpl create mode 100644 src/templates/explore/repo_list.tmpl create mode 100644 src/templates/explore/repo_search.tmpl create mode 100644 src/templates/explore/repos.tmpl create mode 100644 src/templates/explore/search.tmpl create mode 100644 src/templates/explore/users.tmpl create mode 100644 src/templates/home.tmpl create mode 100644 src/templates/install.tmpl create mode 100644 src/templates/mail/auth/activate.tmpl create mode 100644 src/templates/mail/auth/activate_email.tmpl create mode 100644 src/templates/mail/auth/register_notify.tmpl create mode 100644 src/templates/mail/auth/reset_passwd.tmpl create mode 100644 src/templates/mail/issue/assigned.tmpl create mode 100644 src/templates/mail/issue/default.tmpl create mode 100644 src/templates/mail/notify/collaborator.tmpl create mode 100644 src/templates/mail/notify/repo_transfer.tmpl create mode 100644 src/templates/mail/release.tmpl create mode 100644 src/templates/mail/team_invite.tmpl create mode 100644 src/templates/org/create.tmpl create mode 100644 src/templates/org/header.tmpl create mode 100644 src/templates/org/home.tmpl create mode 100644 src/templates/org/member/members.tmpl create mode 100644 src/templates/org/menu.tmpl create mode 100644 src/templates/org/projects/list.tmpl create mode 100644 src/templates/org/projects/new.tmpl create mode 100644 src/templates/org/projects/view.tmpl create mode 100644 src/templates/org/settings/actions.tmpl create mode 100644 src/templates/org/settings/applications.tmpl create mode 100644 src/templates/org/settings/applications_oauth2_edit.tmpl create mode 100644 src/templates/org/settings/delete.tmpl create mode 100644 src/templates/org/settings/hook_new.tmpl create mode 100644 src/templates/org/settings/hooks.tmpl create mode 100644 src/templates/org/settings/labels.tmpl create mode 100644 src/templates/org/settings/layout_footer.tmpl create mode 100644 src/templates/org/settings/layout_head.tmpl create mode 100644 src/templates/org/settings/navbar.tmpl create mode 100644 src/templates/org/settings/options.tmpl create mode 100644 src/templates/org/settings/packages.tmpl create mode 100644 src/templates/org/settings/packages_cleanup_rules_edit.tmpl create mode 100644 src/templates/org/settings/packages_cleanup_rules_preview.tmpl create mode 100644 src/templates/org/settings/runners_edit.tmpl create mode 100644 src/templates/org/team/invite.tmpl create mode 100644 src/templates/org/team/members.tmpl create mode 100644 src/templates/org/team/navbar.tmpl create mode 100644 src/templates/org/team/new.tmpl create mode 100644 src/templates/org/team/repositories.tmpl create mode 100644 src/templates/org/team/sidebar.tmpl create mode 100644 src/templates/org/team/teams.tmpl create mode 100644 src/templates/package/content/alpine.tmpl create mode 100644 src/templates/package/content/cargo.tmpl create mode 100644 src/templates/package/content/chef.tmpl create mode 100644 src/templates/package/content/composer.tmpl create mode 100644 src/templates/package/content/composer_dependencies.tmpl create mode 100644 src/templates/package/content/conan.tmpl create mode 100644 src/templates/package/content/conda.tmpl create mode 100644 src/templates/package/content/container.tmpl create mode 100644 src/templates/package/content/cran.tmpl create mode 100644 src/templates/package/content/debian.tmpl create mode 100644 src/templates/package/content/generic.tmpl create mode 100644 src/templates/package/content/go.tmpl create mode 100644 src/templates/package/content/helm.tmpl create mode 100644 src/templates/package/content/maven.tmpl create mode 100644 src/templates/package/content/npm.tmpl create mode 100644 src/templates/package/content/npm_dependencies.tmpl create mode 100644 src/templates/package/content/nuget.tmpl create mode 100644 src/templates/package/content/pub.tmpl create mode 100644 src/templates/package/content/pypi.tmpl create mode 100644 src/templates/package/content/rpm.tmpl create mode 100644 src/templates/package/content/rubygems.tmpl create mode 100644 src/templates/package/content/rubygems_dependencies.tmpl create mode 100644 src/templates/package/content/swift.tmpl create mode 100644 src/templates/package/content/vagrant.tmpl create mode 100644 src/templates/package/metadata/alpine.tmpl create mode 100644 src/templates/package/metadata/cargo.tmpl create mode 100644 src/templates/package/metadata/chef.tmpl create mode 100644 src/templates/package/metadata/composer.tmpl create mode 100644 src/templates/package/metadata/conan.tmpl create mode 100644 src/templates/package/metadata/conda.tmpl create mode 100644 src/templates/package/metadata/container.tmpl create mode 100644 src/templates/package/metadata/cran.tmpl create mode 100644 src/templates/package/metadata/debian.tmpl create mode 100644 src/templates/package/metadata/generic.tmpl create mode 100644 src/templates/package/metadata/helm.tmpl create mode 100644 src/templates/package/metadata/maven.tmpl create mode 100644 src/templates/package/metadata/npm.tmpl create mode 100644 src/templates/package/metadata/nuget.tmpl create mode 100644 src/templates/package/metadata/pub.tmpl create mode 100644 src/templates/package/metadata/pypi.tmpl create mode 100644 src/templates/package/metadata/rpm.tmpl create mode 100644 src/templates/package/metadata/rubygems.tmpl create mode 100644 src/templates/package/metadata/swift.tmpl create mode 100644 src/templates/package/metadata/vagrant.tmpl create mode 100644 src/templates/package/settings.tmpl create mode 100644 src/templates/package/shared/cargo.tmpl create mode 100644 src/templates/package/shared/cleanup_rules/edit.tmpl create mode 100644 src/templates/package/shared/cleanup_rules/list.tmpl create mode 100644 src/templates/package/shared/cleanup_rules/preview.tmpl create mode 100644 src/templates/package/shared/list.tmpl create mode 100644 src/templates/package/shared/versionlist.tmpl create mode 100644 src/templates/package/view.tmpl create mode 100644 src/templates/post-install.tmpl create mode 100644 src/templates/projects/list.tmpl create mode 100644 src/templates/projects/new.tmpl create mode 100644 src/templates/projects/view.tmpl create mode 100644 src/templates/repo/actions/list.tmpl create mode 100644 src/templates/repo/actions/runs_list.tmpl create mode 100644 src/templates/repo/actions/status.tmpl create mode 100644 src/templates/repo/actions/view.tmpl create mode 100644 src/templates/repo/activity.tmpl create mode 100644 src/templates/repo/blame.tmpl create mode 100644 src/templates/repo/branch/list.tmpl create mode 100644 src/templates/repo/branch_dropdown.tmpl create mode 100644 src/templates/repo/cite/cite_buttons.tmpl create mode 100644 src/templates/repo/cite/cite_modal.tmpl create mode 100644 src/templates/repo/clone_buttons.tmpl create mode 100644 src/templates/repo/clone_script.tmpl create mode 100644 src/templates/repo/commit_page.tmpl create mode 100644 src/templates/repo/commit_status.tmpl create mode 100644 src/templates/repo/commit_statuses.tmpl create mode 100644 src/templates/repo/commits.tmpl create mode 100644 src/templates/repo/commits_list.tmpl create mode 100644 src/templates/repo/commits_list_small.tmpl create mode 100644 src/templates/repo/commits_table.tmpl create mode 100644 src/templates/repo/create.tmpl create mode 100644 src/templates/repo/create_helper.tmpl create mode 100644 src/templates/repo/diff/blob_excerpt.tmpl create mode 100644 src/templates/repo/diff/box.tmpl create mode 100644 src/templates/repo/diff/comment_form.tmpl create mode 100644 src/templates/repo/diff/comment_form_datahandler.tmpl create mode 100644 src/templates/repo/diff/comments.tmpl create mode 100644 src/templates/repo/diff/compare.tmpl create mode 100644 src/templates/repo/diff/conversation.tmpl create mode 100644 src/templates/repo/diff/csv_diff.tmpl create mode 100644 src/templates/repo/diff/escape_title.tmpl create mode 100644 src/templates/repo/diff/image_diff.tmpl create mode 100644 src/templates/repo/diff/new_comment.tmpl create mode 100644 src/templates/repo/diff/new_review.tmpl create mode 100644 src/templates/repo/diff/options_dropdown.tmpl create mode 100644 src/templates/repo/diff/section_code.tmpl create mode 100644 src/templates/repo/diff/section_split.tmpl create mode 100644 src/templates/repo/diff/section_unified.tmpl create mode 100644 src/templates/repo/diff/stats.tmpl create mode 100644 src/templates/repo/diff/whitespace_dropdown.tmpl create mode 100644 src/templates/repo/editor/cherry_pick.tmpl create mode 100644 src/templates/repo/editor/commit_form.tmpl create mode 100644 src/templates/repo/editor/delete.tmpl create mode 100644 src/templates/repo/editor/diff_preview.tmpl create mode 100644 src/templates/repo/editor/edit.tmpl create mode 100644 src/templates/repo/editor/patch.tmpl create mode 100644 src/templates/repo/editor/upload.tmpl create mode 100644 src/templates/repo/empty.tmpl create mode 100644 src/templates/repo/file_info.tmpl create mode 100644 src/templates/repo/find/files.tmpl create mode 100644 src/templates/repo/forks.tmpl create mode 100644 src/templates/repo/graph.tmpl create mode 100644 src/templates/repo/graph/commits.tmpl create mode 100644 src/templates/repo/graph/div.tmpl create mode 100644 src/templates/repo/graph/svgcontainer.tmpl create mode 100644 src/templates/repo/header.tmpl create mode 100644 src/templates/repo/home.tmpl create mode 100644 src/templates/repo/icon.tmpl create mode 100644 src/templates/repo/issue/branch_selector_field.tmpl create mode 100644 src/templates/repo/issue/choose.tmpl create mode 100644 src/templates/repo/issue/comment_tab.tmpl create mode 100644 src/templates/repo/issue/fields/checkboxes.tmpl create mode 100644 src/templates/repo/issue/fields/dropdown.tmpl create mode 100644 src/templates/repo/issue/fields/header.tmpl create mode 100644 src/templates/repo/issue/fields/input.tmpl create mode 100644 src/templates/repo/issue/fields/markdown.tmpl create mode 100644 src/templates/repo/issue/fields/textarea.tmpl create mode 100644 src/templates/repo/issue/label_precolors.tmpl create mode 100644 src/templates/repo/issue/labels.tmpl create mode 100644 src/templates/repo/issue/labels/edit_delete_label.tmpl create mode 100644 src/templates/repo/issue/labels/label.tmpl create mode 100644 src/templates/repo/issue/labels/label_list.tmpl create mode 100644 src/templates/repo/issue/labels/label_load_template.tmpl create mode 100644 src/templates/repo/issue/labels/label_new.tmpl create mode 100644 src/templates/repo/issue/labels/labels_selector_field.tmpl create mode 100644 src/templates/repo/issue/labels/labels_sidebar.tmpl create mode 100644 src/templates/repo/issue/list.tmpl create mode 100644 src/templates/repo/issue/milestone/select_menu.tmpl create mode 100644 src/templates/repo/issue/milestone_issues.tmpl create mode 100644 src/templates/repo/issue/milestone_new.tmpl create mode 100644 src/templates/repo/issue/milestones.tmpl create mode 100644 src/templates/repo/issue/navbar.tmpl create mode 100644 src/templates/repo/issue/new.tmpl create mode 100644 src/templates/repo/issue/new_form.tmpl create mode 100644 src/templates/repo/issue/openclose.tmpl create mode 100644 src/templates/repo/issue/search.tmpl create mode 100644 src/templates/repo/issue/view.tmpl create mode 100644 src/templates/repo/issue/view_content.tmpl create mode 100644 src/templates/repo/issue/view_content/add_reaction.tmpl create mode 100644 src/templates/repo/issue/view_content/attachments.tmpl create mode 100644 src/templates/repo/issue/view_content/comments.tmpl create mode 100644 src/templates/repo/issue/view_content/comments_delete_time.tmpl create mode 100644 src/templates/repo/issue/view_content/context_menu.tmpl create mode 100644 src/templates/repo/issue/view_content/pull.tmpl create mode 100644 src/templates/repo/issue/view_content/pull_merge_instruction.tmpl create mode 100644 src/templates/repo/issue/view_content/reactions.tmpl create mode 100644 src/templates/repo/issue/view_content/reference_issue_dialog.tmpl create mode 100644 src/templates/repo/issue/view_content/sidebar.tmpl create mode 100644 src/templates/repo/issue/view_content/update_branch_by_merge.tmpl create mode 100644 src/templates/repo/issue/view_title.tmpl create mode 100644 src/templates/repo/migrate/codebase.tmpl create mode 100644 src/templates/repo/migrate/git.tmpl create mode 100644 src/templates/repo/migrate/gitbucket.tmpl create mode 100644 src/templates/repo/migrate/gitea.tmpl create mode 100644 src/templates/repo/migrate/github.tmpl create mode 100644 src/templates/repo/migrate/gitlab.tmpl create mode 100644 src/templates/repo/migrate/gogs.tmpl create mode 100644 src/templates/repo/migrate/helper.tmpl create mode 100644 src/templates/repo/migrate/migrate.tmpl create mode 100644 src/templates/repo/migrate/migrating.tmpl create mode 100644 src/templates/repo/migrate/onedev.tmpl create mode 100644 src/templates/repo/migrate/options.tmpl create mode 100644 src/templates/repo/packages.tmpl create mode 100644 src/templates/repo/projects/list.tmpl create mode 100644 src/templates/repo/projects/new.tmpl create mode 100644 src/templates/repo/projects/view.tmpl create mode 100644 src/templates/repo/pulls/commits.tmpl create mode 100644 src/templates/repo/pulls/files.tmpl create mode 100644 src/templates/repo/pulls/fork.tmpl create mode 100644 src/templates/repo/pulls/status.tmpl create mode 100644 src/templates/repo/pulls/tab_menu.tmpl create mode 100644 src/templates/repo/release/list.tmpl create mode 100644 src/templates/repo/release/new.tmpl create mode 100644 src/templates/repo/release_tag_header.tmpl create mode 100644 src/templates/repo/search.tmpl create mode 100644 src/templates/repo/search_name.tmpl create mode 100644 src/templates/repo/settings/actions.tmpl create mode 100644 src/templates/repo/settings/branches.tmpl create mode 100644 src/templates/repo/settings/collaboration.tmpl create mode 100644 src/templates/repo/settings/deploy_keys.tmpl create mode 100644 src/templates/repo/settings/githook_edit.tmpl create mode 100644 src/templates/repo/settings/githooks.tmpl create mode 100644 src/templates/repo/settings/layout_footer.tmpl create mode 100644 src/templates/repo/settings/layout_head.tmpl create mode 100644 src/templates/repo/settings/lfs.tmpl create mode 100644 src/templates/repo/settings/lfs_file.tmpl create mode 100644 src/templates/repo/settings/lfs_file_find.tmpl create mode 100644 src/templates/repo/settings/lfs_locks.tmpl create mode 100644 src/templates/repo/settings/lfs_pointers.tmpl create mode 100644 src/templates/repo/settings/nav.tmpl create mode 100644 src/templates/repo/settings/navbar.tmpl create mode 100644 src/templates/repo/settings/options.tmpl create mode 100644 src/templates/repo/settings/protected_branch.tmpl create mode 100644 src/templates/repo/settings/runner_edit.tmpl create mode 100644 src/templates/repo/settings/secrets.tmpl create mode 100644 src/templates/repo/settings/tags.tmpl create mode 100644 src/templates/repo/settings/webhook/base.tmpl create mode 100644 src/templates/repo/settings/webhook/base_list.tmpl create mode 100644 src/templates/repo/settings/webhook/delete_modal.tmpl create mode 100644 src/templates/repo/settings/webhook/dingtalk.tmpl create mode 100644 src/templates/repo/settings/webhook/discord.tmpl create mode 100644 src/templates/repo/settings/webhook/feishu.tmpl create mode 100644 src/templates/repo/settings/webhook/gitea.tmpl create mode 100644 src/templates/repo/settings/webhook/gogs.tmpl create mode 100644 src/templates/repo/settings/webhook/history.tmpl create mode 100644 src/templates/repo/settings/webhook/list.tmpl create mode 100644 src/templates/repo/settings/webhook/matrix.tmpl create mode 100644 src/templates/repo/settings/webhook/msteams.tmpl create mode 100644 src/templates/repo/settings/webhook/new.tmpl create mode 100644 src/templates/repo/settings/webhook/packagist.tmpl create mode 100644 src/templates/repo/settings/webhook/settings.tmpl create mode 100644 src/templates/repo/settings/webhook/slack.tmpl create mode 100644 src/templates/repo/settings/webhook/telegram.tmpl create mode 100644 src/templates/repo/settings/webhook/wechatwork.tmpl create mode 100644 src/templates/repo/shabox_badge.tmpl create mode 100644 src/templates/repo/sub_menu.tmpl create mode 100644 src/templates/repo/tag/list.tmpl create mode 100644 src/templates/repo/unicode_escape_prompt.tmpl create mode 100644 src/templates/repo/upload.tmpl create mode 100644 src/templates/repo/user_cards.tmpl create mode 100644 src/templates/repo/view_file.tmpl create mode 100644 src/templates/repo/view_list.tmpl create mode 100644 src/templates/repo/watchers.tmpl create mode 100644 src/templates/repo/wiki/new.tmpl create mode 100644 src/templates/repo/wiki/pages.tmpl create mode 100644 src/templates/repo/wiki/revision.tmpl create mode 100644 src/templates/repo/wiki/start.tmpl create mode 100644 src/templates/repo/wiki/view.tmpl create mode 100644 src/templates/shared/actions/runner_edit.tmpl create mode 100644 src/templates/shared/actions/runner_list.tmpl create mode 100644 src/templates/shared/combomarkdowneditor.tmpl create mode 100644 src/templates/shared/issueicon.tmpl create mode 100644 src/templates/shared/issuelist.tmpl create mode 100644 src/templates/shared/searchbottom.tmpl create mode 100644 src/templates/shared/secrets/add_list.tmpl create mode 100644 src/templates/shared/user/authorlink.tmpl create mode 100644 src/templates/shared/user/avatarlink.tmpl create mode 100644 src/templates/shared/user/namelink.tmpl create mode 100644 src/templates/status/404.tmpl create mode 100644 src/templates/status/500.tmpl create mode 100644 src/templates/swagger/ui.tmpl create mode 100644 src/templates/swagger/v1_json.tmpl create mode 100644 src/templates/user/auth/activate.tmpl create mode 100644 src/templates/user/auth/captcha.tmpl create mode 100644 src/templates/user/auth/change_passwd.tmpl create mode 100644 src/templates/user/auth/change_passwd_inner.tmpl create mode 100644 src/templates/user/auth/finalize_openid.tmpl create mode 100644 src/templates/user/auth/forgot_passwd.tmpl create mode 100644 src/templates/user/auth/grant.tmpl create mode 100644 src/templates/user/auth/grant_error.tmpl create mode 100644 src/templates/user/auth/link_account.tmpl create mode 100644 src/templates/user/auth/oidc_wellknown.tmpl create mode 100644 src/templates/user/auth/prohibit_login.tmpl create mode 100644 src/templates/user/auth/reset_passwd.tmpl create mode 100644 src/templates/user/auth/signin.tmpl create mode 100644 src/templates/user/auth/signin_inner.tmpl create mode 100644 src/templates/user/auth/signin_navbar.tmpl create mode 100644 src/templates/user/auth/signin_openid.tmpl create mode 100644 src/templates/user/auth/signup.tmpl create mode 100644 src/templates/user/auth/signup_inner.tmpl create mode 100644 src/templates/user/auth/signup_openid_connect.tmpl create mode 100644 src/templates/user/auth/signup_openid_navbar.tmpl create mode 100644 src/templates/user/auth/signup_openid_register.tmpl create mode 100644 src/templates/user/auth/twofa.tmpl create mode 100644 src/templates/user/auth/twofa_scratch.tmpl create mode 100644 src/templates/user/auth/webauthn.tmpl create mode 100644 src/templates/user/auth/webauthn_error.tmpl create mode 100644 src/templates/user/code.tmpl create mode 100644 src/templates/user/dashboard/dashboard.tmpl create mode 100644 src/templates/user/dashboard/feeds.tmpl create mode 100644 src/templates/user/dashboard/issues.tmpl create mode 100644 src/templates/user/dashboard/milestones.tmpl create mode 100644 src/templates/user/dashboard/navbar.tmpl create mode 100644 src/templates/user/dashboard/repolist.tmpl create mode 100644 src/templates/user/heatmap.tmpl create mode 100644 src/templates/user/notification/notification.tmpl create mode 100644 src/templates/user/notification/notification_div.tmpl create mode 100644 src/templates/user/notification/notification_subscriptions.tmpl create mode 100644 src/templates/user/overview/header.tmpl create mode 100644 src/templates/user/overview/package_versions.tmpl create mode 100644 src/templates/user/overview/packages.tmpl create mode 100644 src/templates/user/profile.tmpl create mode 100644 src/templates/user/settings/account.tmpl create mode 100644 src/templates/user/settings/actions.tmpl create mode 100644 src/templates/user/settings/appearance.tmpl create mode 100644 src/templates/user/settings/applications.tmpl create mode 100644 src/templates/user/settings/applications_oauth2.tmpl create mode 100644 src/templates/user/settings/applications_oauth2_edit.tmpl create mode 100644 src/templates/user/settings/applications_oauth2_edit_form.tmpl create mode 100644 src/templates/user/settings/applications_oauth2_list.tmpl create mode 100644 src/templates/user/settings/grants_oauth2.tmpl create mode 100644 src/templates/user/settings/hook_new.tmpl create mode 100644 src/templates/user/settings/hooks.tmpl create mode 100644 src/templates/user/settings/keys.tmpl create mode 100644 src/templates/user/settings/keys_gpg.tmpl create mode 100644 src/templates/user/settings/keys_principal.tmpl create mode 100644 src/templates/user/settings/keys_ssh.tmpl create mode 100644 src/templates/user/settings/layout_footer.tmpl create mode 100644 src/templates/user/settings/layout_head.tmpl create mode 100644 src/templates/user/settings/navbar.tmpl create mode 100644 src/templates/user/settings/organization.tmpl create mode 100644 src/templates/user/settings/packages.tmpl create mode 100644 src/templates/user/settings/packages_cleanup_rules_edit.tmpl create mode 100644 src/templates/user/settings/packages_cleanup_rules_preview.tmpl create mode 100644 src/templates/user/settings/profile.tmpl create mode 100644 src/templates/user/settings/repos.tmpl create mode 100644 src/templates/user/settings/runner_edit.tmpl create mode 100644 src/templates/user/settings/security/accountlinks.tmpl create mode 100644 src/templates/user/settings/security/openid.tmpl create mode 100644 src/templates/user/settings/security/security.tmpl create mode 100644 src/templates/user/settings/security/twofa.tmpl create mode 100644 src/templates/user/settings/security/twofa_enroll.tmpl create mode 100644 src/templates/user/settings/security/webauthn.tmpl create mode 100644 src/themes/fonts/KaTeX_AMS-Regular.73ea273a.woff2 create mode 100644 src/themes/fonts/KaTeX_Caligraphic-Bold.a1abf90d.woff2 create mode 100644 src/themes/fonts/KaTeX_Caligraphic-Regular.d6484fce.woff2 create mode 100644 src/themes/fonts/KaTeX_Fraktur-Bold.931d67ea.woff2 create mode 100644 src/themes/fonts/KaTeX_Fraktur-Regular.172d3529.woff2 create mode 100644 src/themes/fonts/KaTeX_Main-Bold.39890742.woff2 create mode 100644 src/themes/fonts/KaTeX_Main-BoldItalic.20f389c4.woff2 create mode 100644 src/themes/fonts/KaTeX_Main-Italic.fe2176f7.woff2 create mode 100644 src/themes/fonts/KaTeX_Main-Regular.f650f111.woff2 create mode 100644 src/themes/fonts/KaTeX_Math-BoldItalic.dcbcbd93.woff2 create mode 100644 src/themes/fonts/KaTeX_Math-Italic.6d3d25f4.woff2 create mode 100644 src/themes/fonts/KaTeX_SansSerif-Bold.95591a92.woff2 create mode 100644 src/themes/fonts/KaTeX_SansSerif-Italic.7d393d38.woff2 create mode 100644 src/themes/fonts/KaTeX_SansSerif-Regular.cd5e231e.woff2 create mode 100644 src/themes/fonts/KaTeX_Script-Regular.c81d1b2a.woff2 create mode 100644 src/themes/fonts/KaTeX_Size1-Regular.6eec866c.woff2 create mode 100644 src/themes/fonts/KaTeX_Size2-Regular.2960900c.woff2 create mode 100644 src/themes/fonts/KaTeX_Size3-Regular.e1951519.woff2 create mode 100644 src/themes/fonts/KaTeX_Size4-Regular.e418bf25.woff2 create mode 100644 src/themes/fonts/KaTeX_Typewriter-Regular.c295e7f7.woff2 create mode 100644 src/themes/fonts/codicon.4a477f66.ttf create mode 100644 src/themes/img/favicon.svg create mode 100644 src/themes/img/loading.svg create mode 100644 src/themes/img/logo.svg create mode 100644 src/themes/scss/dark.scss create mode 100644 src/themes/scss/gitea/index.scss create mode 100644 src/themes/scss/gitea/modules/_chroma.scss create mode 100644 src/themes/scss/gitea/modules/_codemirror.scss create mode 100644 src/themes/scss/utils/_color-utils.scss create mode 100644 tools/build.js create mode 100644 tools/deploy.js create mode 100644 tools/restart.js create mode 100644 tools/serve.js create mode 100644 tools/tasks/copy-to.js create mode 100644 tools/tasks/deploy.js create mode 100644 tools/tasks/fonts.js create mode 100644 tools/tasks/img.js create mode 100644 tools/tasks/restart-service.js create mode 100644 tools/tasks/scss.js create mode 100644 tools/tasks/templates.js create mode 100644 tools/utils/funcs.js create mode 100644 tools/utils/logger.js create mode 100644 tools/utils/task-debouncer.js create mode 100644 🍵 lugit-theme.code-workspace diff --git a/.cocorc b/.cocorc new file mode 100644 index 0000000..8a03036 --- /dev/null +++ b/.cocorc @@ -0,0 +1,2 @@ +useEmoji: true +askScope: false \ No newline at end of file diff --git a/.design/logos.ai b/.design/logos.ai new file mode 100644 index 0000000..601bad0 --- /dev/null +++ b/.design/logos.ai @@ -0,0 +1,1460 @@ +%PDF-1.6 % +1 0 obj <>/OCGs[27 0 R 28 0 R 29 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + logos + + + 2023-06-30T07:30:52-03:00 + 2023-06-30T07:30:52-03:00 + 2023-06-30T07:30:52-02:00 + Adobe Illustrator 26.0 (Windows) + + + + 192 + 256 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8AmOd09myX8vP+UkT/AIxS fqzW9rf3PxDr+0/7r4h6nnLvOOxV475t/wCUk1D/AIyn9Qzr9D/cx9z1Oi/uo+5Kcy3KdirsVeif lh/vBe/8ZV/4jnP9s/XH3Oi7W+qPuZpmldS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq8Hzuns 2S/l5/ykif8AGKT9Wa3tb+5+Idf2n/dfEM/1zzJp+i+h9cEh+scuHpqG+xStakfzZodNo55r4a2d Lp9LLLfD0Sr/AJWP5e/luP8AgF/5qzK/kjN5OT/JeXyY5e+WNW127m1ewRPql45eH1GCtQfDuN+4 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 + + + + uuid:eaeb02ed-34a2-4367-87dc-ffab6ee97523 + xmp.did:1e4ab4ed-b8c8-e047-8c52-16c966090be3 + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + xmp.iid:b2c80867-177f-d845-8d40-b6de0240b885 + xmp.did:b2c80867-177f-d845-8d40-b6de0240b885 + uuid:5D20892493BFDB11914A8590D31508C8 + default + + + + + saved + xmp.iid:b2c80867-177f-d845-8d40-b6de0240b885 + 2023-06-30T07:20:20-03:00 + Adobe Illustrator 26.0 (Windows) + / + + + saved + xmp.iid:1e4ab4ed-b8c8-e047-8c52-16c966090be3 + 2023-06-30T07:30:04-03:00 + Adobe Illustrator 26.0 (Windows) + / + + + + Print + AIRobin + Document + False + True + 1 + + 448.000000 + 160.000000 + Pixels + + + + Cyan + Magenta + + + + + + Default Swatch Group + 0 + + + + White + RGB + PROCESS + 255 + 255 + 255 + + + Black + RGB + PROCESS + 35 + 31 + 32 + + + brand + PROCESS + 100.000000 + RGB + 227 + 115 + 255 + + + + + + + Adobe PDF library 16.03 + + + + + + + + + + + + + + + + + + + + + + + + + +endstream endobj 3 0 obj <> endobj 5 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/TrimBox[0.0 0.0 160.0 160.0]/Type/Page>> endobj 26 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/TrimBox[0.0 0.0 448.0 160.0]/Type/Page>> endobj 31 0 obj <>/Resources<>/ExtGState<>/Properties<>/XObject<>>>/TrimBox[0.0 0.0 448.0 160.0]/Type/Page>> endobj 38 0 obj <>stream +HTj0 zǒdmݭ7-l[{?(|9ǒe+3Cfl3c)%%o=>}1m2q"nt@HM22Kaf!o^Nk@Wqqk ܠ V[~X\KW8TSAˡ1R`q +K %FѺ6egY_~8BRY +endstream endobj 39 0 obj <> endobj 41 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 0.89 0.451 1 scn +/GS0 gs +352 160 -32 -32 re +224 160 m +224 128 l +272 128 l +272 96 l +224 96 l +224 128 l +192 128 l +192 80 l +304 80 l +304 160 l +h +0 80 32 80 re +144 80 32 48 re +48 80 32 80 re +432 112 m +432 80 l +320 80 l +320 112 l +368 112 l +368 160 l +400 160 l +400 112 l +h +f + +endstream endobj 43 0 obj <> endobj 35 0 obj <> endobj 34 0 obj [/ICCBased 44 0 R] endobj 44 0 obj <>stream +HyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽'0 ֠Jb  + 2y.-;!KZ ^i"L0- @8(r;q7Ly&Qq4j|9 +V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'Kt;\ ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹A om?W= +x-[0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?׸c. R ߁-25 S>ӣVd`rn~Y&+`;A4 A9=-tl`;~p Gp| [`L`< "A YA+Cb(R,*T2B- +ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9 +N')].uJr + wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4 +n3ܣkGݯz=[==<=GTB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O[$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! +zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km +endstream endobj 27 0 obj <> endobj 28 0 obj <> endobj 29 0 obj <> endobj 49 0 obj [/View/Design] endobj 50 0 obj <>>> endobj 47 0 obj [/View/Design] endobj 48 0 obj <>>> endobj 45 0 obj [/View/Design] endobj 46 0 obj <>>> endobj 40 0 obj <> endobj 8 0 obj <> endobj 18 0 obj <> endobj 19 0 obj <>stream +%!PS-Adobe-3.0 +%%Creator: Adobe Illustrator(R) 24.0 +%%AI8_CreatorVersion: 26.0.3 +%%For: (Lucas Colombo) () +%%Title: (logos.ai) +%%CreationDate: 6/30/2023 7:30 AM +%%Canvassize: 16383 +%%BoundingBox: 0 -608 448 0 +%%HiResBoundingBox: 0 -608 448 0 +%%DocumentProcessColors: Cyan Magenta +%AI5_FileFormat 14.0 +%AI12_BuildNumber: 778 +%AI3_ColorUsage: Color +%AI7_ImageSettings: 0 +%%RGBProcessColor: 0 0 0 ([Registration]) +%%+ 0.890196084976196 0.450980395078659 1 (brand) +%AI3_Cropmarks: 0.000000000000909 -384 448 -224 +%AI3_TemplateBox: 256.5 -256.5 256.5 -256.5 +%AI3_TileBox: -172 -610 620 2 +%AI3_DocumentPreview: None +%AI5_ArtSize: 14400 14400 +%AI5_RulerUnits: 6 +%AI24_LargeCanvasScale: 1 +%AI9_ColorModel: 1 +%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 +%AI5_TargetResolution: 800 +%AI5_NumLayers: 3 +%AI17_Begin_Content_if_version_gt:24 4 +%AI10_OpenToVie: -1280.4 517.2 0.555555555555556 0 8014.5 8246.7 1519 906 18 0 0 46 121 1 1 0 1 1 0 1 1 0 1 +%AI17_Alternate_Content +%AI9_OpenToView: -1280.4 517.2 0.555555555555556 1519 906 18 0 0 46 121 1 1 0 1 1 0 1 1 0 1 +%AI17_End_Versioned_Content +%AI5_OpenViewLayers: 777 +%AI17_Begin_Content_if_version_gt:24 4 +%AI17_Alternate_Content +%AI17_End_Versioned_Content +%%PageOrigin:-50 -652 +%AI7_GridSettings: 32 4 32 4 1 0 0.419607847929001 0.490196079015732 0.619607865810394 0.709803938865662 0.745098054409027 0.80980396270752 +%AI9_Flatten: 1 +%AI12_CMSettings: 00.MS +%%EndComments + +endstream endobj 20 0 obj <>stream +%AI24_ZStandard_Data(/Xܠ>xq ,Pd2zh(lRowa"{saggǯNZ Q !!- qm3X+8p8 + LA * +B *T@b (Tp P`8Ppq@2y"$ D@@4 A d ͕Xs.ywD^x*"eAi*m9HK*vIbaǰ6Sp6sJOR/&|,(:_-SPa"BH +]Zwm~ qL9^Q]q a0G ф 7 đ@qXj8(q +;Rd"i8~9 AIP$H,eґ!تL_xE1[ 9ﲻe"ːp0 +A48va8 (S aCUaXA +UXR`YHƝ'qP—]S6"Y}={9#2C+˳KʲZrvW +mt4ޝ8eiq$Cep0L@$ ca7 +Mq0UJ$ ppUMH<3 _Ž4QFpPA@whׇ#˂wvfdNLW W;eQ]q|TeHM^Y}O<=YՏ3nCSFCp"H+0V&1ʧ驛BF*;;F '~$yM aEF DbAW Yp+ @{J97 UU{QK`rU"oh|oҜIhˈӽMVSgCI[(bX$SkU;7ݟvV[f+K,]-=mjz3_s3Jt, #0au$ #aJ` `XXwqa]'&PY7a8pFp>m& 2Qg#ߨ"{́I"l8$@O2d PIeIXv7]9'{ շj8‹ + q φCy# hG0lśEp0rqC 2 +@U%@?l\XFFa88ag#%ptWxbeyHĬ7wEi 0C La8P~$Qᐆo8  ! p8 |0ㆃQHP0 đ a` :!s L8a,+bEEpj333xcWV- aCiRXpf-P8f$zH.&-2a88(aqHEyXg)(V" e q !Ρˌ64cde8V8X ^26)C>wX_Lj~*]`ٝM pmKK`*EY1=3P,GH8l DD!8p8Z*LqR!JbpCX(G8D "Q c +ca$ay|#T(7`8 C0m8h8h +\PVȅ`p0pFb0.pfs)rD$"+' `)9R Hh+UJ( :.qs( +ā@  1 đP ` +Ha80 @$ІÍb1N`( +DbTa;aV,fáEp4#Dm8,CX(fAZta"@ ~3hn8WjHp4D"q-DOg0Zsٕ 7eԳhhÓE3*Cʾ22uݧDv9^ T5r۟C=QYqʬL\rl8,<; : BԈ'0|(IP K\8"q$ EbE)8*PBE-lqC# *4A %hA ,BTNmWl6k8بQD=]tffhii6 aĢg8 }?CK\) x`0(++-t>T|F6Nxas:j8787p,f GFdf.H  -CZU+>xtūtQ(P3, *CLYX>t/̜wn;zA @@aD" DEX +#a06@ 3jA+qč>n + Fmgs]&DH#LKf%hјX- E )f1 +p$x 4T3C335ǘcQ`2 MQ\/RԢ뾈Utvf3,a +[]gp\7XhxD +|"2$a^cGqpHfeH!2!ːjy=9xbz +p s $X@ H$A  "8p .L0499,herhL!UXXA*TBDF\ + +0pTb"2 +DXxPG&,&DNĂ@@ ,eƒ DPBPx` D~{ǟ2O7.C +$H 6! 0 4 "P 2``A h`u&Bd. a"D.+:K4Ҋ7d2K~v[]9,Mv,Y#WЍh-TN,+y% Ӷ,fF\_ێ}W, +Z;e)dD]xxM9g4CD;͜%d)ѽMHhɣ:RGyr%TgcǥnҲ\Z=F.K,~fLb>r4UwfĄ@!,'>dqZ|O.E_٬If'Fuc<=D$pjiXYYbsY.QbUvlS*6DЇxFZ~o5ɰԳ{~}t'oUS+,F.U~*CtKP m.ul:Vl^O5bbEt^ѷ_RO]eRsFd.7v,7#[/eF^moǢzoK67|Ҹt-vym<;3T:[tx+_KKf8k>FXh5CUkGg|DdVci>XiR.;KXM*̓d!^[fʘ$o/)Nb7oMN$81VPm %m]u_Rb.'J\'^2IӻHSYrHpet!Yأ:dwltDx_ Ʃ e!=fXU hdڐ=.Fo)$9UFieLHs-Fj;ycWsU؎)sΤhs>tV6,*;,#l)P4x%sR!W}#8Hſ5E*_V袼bvSf/'[4hV9[efXNbvDf)WKNIC{^fv[]~kX<%RK3*K4ؗ7+.ɧ4"B<&"4V9"tX6vZA>iCcѥGyy-3>+:wK&%,Xnz~-^ϦxoM[ՕH_ ,)c{JtquNFzX{W miU[޽t*D<_^FN 0GUFJdzT<m>1dvkuvɫI$OWH0:"LY#b]xF$Km Bv@iDx57U٘JZ:lͯj]xm Kssߓ|XΡK!$*OkWM\iM讙VBw'Y~iU}d+E"R:kZI_fӭ\KFL>%KSzަPkRHfWP)sJZM+PHχ+ɱ;߭8F=1~7W=k1,IfGAg) g,k~\3 Vu=Ve M^ ]T%/۞?y +[vG$ ]iWJzz߫+vtS4U#WDʭ854񦥰Ħ9sͧHŲ6ˈ,ݜڍW3N3J^x8fI%O]b\EW6 e{ռ\(K4Yxa9]Bn )fD̎iS0KLVƈd2/A,T"5x31b"3yd#1~Wؼ;^Tt{ҪPaLNhUuQ j^/6VB|^R,!fSs'Δ%Dnꞻ:/T#FdY\9r2r;Hb}tC 32ZNhqli;"#lt6!/&J*,Ki$XFy)Ж6Y?´WW3ɜ7VW3eA,TLf~3'9+c剋`z줻Bi6ZXo)UT;CՇcOfT3]*-D9YdS3k5N.$jmZОfͥӬ9o,c*J/l3y3v ]1u&uI3eGMG5?#/+-1Ȏ4&gWlF{YˇvԺZƪ9Dz4/nCNJ|4oBЈ5uJqV3ѵ +}ClKbJ6dWhYrdÒeױ:Syc J5Mӫwgn욖ϔ4am|h솪>DO)T:4yf*$NXrY35$9靆~׶ԑD%&ʒ^'d`[leź"\*|j ++6Bf38,ye]XsDs,3KrëBկ%3Hx6dlHz&2*IxjswP܋ngt;6 +҉Gf]ղ +sdw#~5ػQn"˒d̈:S#T\7X+խĶ˙/6F&uׇyx + J~Jf2*"&+*R}3f"**zۣYѝ+ST8O 2UeUDΞ4]]q֡XeDOM o&[VW[G3]3SRD2leޙNggJ"E띈NRW瘫^K6xGv'i]tHs֧cYg1nn:wGvfiяv&d(zCΓQ/nrW$,25ӞtH|dۓ"rk$3B$*mȍsgXp+|唚U/Z7?UTS5f8D}4ôA,&ͼtTvU%9MU}7w{Qϻ[[)Jӓs!krDryB?ys򓟢u,,dlXGWHzJfՖJTv%3bA$xh7YLg+&)"" +$\xp2 (`RAUe]{^'$b6=)dO;<+kxo%^ZW?/_wN+jqND-se|i좕BZ\At=TGnC'K{/˭ZgB;ٍ +R,l6xi"IQjQl&NW.w"#e{Hϟrx.DUwzq %}p<-،t7ht!-~5h"0iN$RFءݝQaVISVyp0iW<{8MwNߠv7g3w%BI䥹Ȫ{Xz9$R)눥}/QSs䗟 I|k/I۫J̜I=u!w'&ݿusVU;%M8Ytv⤧lJωoJNʅ/)Y<"IJ4rF*9uD:2v⑏1K ]n?ەBrgx<Ҿ{|Q3hwG|meUSy]ޤ' Y9CKbDzJ|[Qk#whR;ZpNe]Y+nh3v/2굜4K+O2rwJl 6-d [Qq۲ܛwUm.[g䲭TfuZt"{Z6l6&=J뭰Uz8Xդr]-C՛[ֲyV":]!dލ>xj-XgמVϓJVKyybly +甝?{U[h5L Eۣesr5vNɭ;s|z]6y%U旽Tssͭg-̚{5VǚD-5ۖ^k֢g4_fϊ㢟^sjL{cδXN;i"k|hn& ?ªX#=뼝ZtVT'jNjJk̺fn+gg+n-:%YZ;˺ϥÏ*J, J+ZUcmY̬G˾\O+Ou4=fUº^Wx;rzr.vn8HdMU{ò~~=5eo^";謟Y?Wf\5+fV}W$!M.{2t}]"[ϔutUi_zHι^׹^r\ޭ]9j%2ê+]jO*U^u*2<+~_+n!##VCa o| +c +ޝNW, 򛬂%Z'&LzMD9 0ZA2+W0i2XY3%*ϊU^Q V1ϫ/BĹSbUsE*;G,>3jv˴aKFb3WLf}R2Fev'ΚСo)2i䨔nl.8O=]7RnwB}YƖibCvI\dU,%CWi,˼ApvMLMV#2W]֔Xy;*KjAduⵚmNbI*~"3ʹB'5ص՛褼ްǤ2͌_iNB:Z9ճSjZ&G,I7;yef4T"mj +/6Jr`&0냃h%ě)WsA]朽pE<Y>S9?F#zY)ڡK>M,ݲ7t m;YݣQ!l,ݽ3t5lCIM&ˮϙ|KhxDtv~~XG团y=̱?|WadUD5?O6f{?h$ {sĺIU]%44{ĿW<kŨ}HHgE>S,|\Ff }[3[7ْ=vnB;?d$tt&N Zn:X5]#7[yG`I7-gD,˩kw=|fC%ߐbIvy*u=-k㜴i<+|5^ݽwqiKm[oҨnuB:"էj:Mܲ2wc[stIyVWL<2X;xRi18F3)h^wtCK[*6Ot%ser}䣡I+QJ#4|S3|觻ZCE&fY!1nTB N!=wIs˖r.1%dV?:2[a=fbV[|6 %݆+WДnCxJhuC~G\d<ʣ3b/kYrPo.釞Gϙd䣺_"NbGeE^nN hgg7ɼr,^o4CcN?/el*98f1iVv*Ƽ#gͭ;V9HȗBGuh; +jkr5Y;}G(}inV^g[ݔ4BfvjY"_frtV>tfr=='b:(km``mv={! V |јLk LOJ!jFF#084DBaќ> +ɒBX$ 2$HPǂ J~n'eyZͲ(# *J,*P 9'в^l1: R5ˢݛ/̲Jn$,KpEejdIiWE de44mͲHB8dY]gW+6Y9 .3abY9cqU'1cYy%S˰j|.7b.ˁey%., @,kMˁ2B`ħ,i8pA˲鍂nW79wBmŖ2DEeq>'*afN,ι*겙b.eY;G,LkVey,?"FejAh.NdKLP,כdKBWBЬjoYgq?6UD-:@ז-FDdٷ,,{q˶,`nlB4F'^Dd_@ಢ8pYGȡQC>DRsY%Ie@]'|+ݘM$n调Ry. qh]׷c&$ƚ(DnD(ba pYefuԀL!1>,2h~ɂY;RChEpaA,V6҂FiRdpGDxv1~FyiI_SxD`R)+W?0kŠ2JB%#d̄YF~H6tֹ#$,LDeмڐJW)X0q)xj2'i/WeZqƕJ֘Y/t5V{$85~`p2 8(4]eV$f}kB1ode| 22Qs` kL,*"^f=ܗD2?YҺ*NAq'̪[t1K$KPP ,` eZf)G-:B]@. zLYL3{*@ưү*22) +;3}YNb:ck'&љTf]}=HtYϘL_ 3+0}%EϚXϬ֌&P 8AFa/S5d1:}3+ܒ}OVt("e`3 +w`gV Zcq+!Yfu&hV F.i_'V=uѬl- ͺ;pfș-f2gcY#M~Nב$joPàQX{H*-*B,,u0?[1~= ttP9$nh*ϬYh֓>sG5)fDͪPp3{q#wDYLr犚MB[ODVPE&[&ֵU'r+GM^Ydf9ʈ&YjV¥ڋ8WĥMHU\4լjFD]"q ݅YYtA;V8s k֭/šYdMƑ4Yq#, +75~7x jȱJŸ1?=FͲE֚w ĥ"b `fqI%eU앚ULq?ʱe.NU8᠔zgS0?;Q^JwutZ_sլ %Ze%kֻ1m?`ԭCg%˛I~vBfpY5GhfTN>lk^Rk B=l]5vV"H>uLŢ̚ؽZeu@Y!^#$5녠f^lM%Qe߫YVeuՒx6hԾrrejBQV*#t%'s0TB~FMWű7XZY! ֬Lbg5˘ƒUif_dp|f=(,SlM*լ⸝jd^pi^D}N:]<R]!fP 8D<j/jyqGE;xY1Az?dQto*{{ P,z!v\7k +{U:]#ADTUE5fŞ/|B:xo}f;XyJYt/iI%yTNW0Y¤z(08 KY?e @U(,`A)Xkͪ5Y_Nڽ_an֑Au8Z9Y n|2UAw D7|;  + VYgiWd5=wZ~PY@hÒ$O3e!KNbb0EQ7yU{L,oM۬yڬc6p0czE?Jɕ։˪Wܽgi* J!1͢'feq,pmVpuY!D"V:t2Bf%Nhugard[z/?eY9lh/#m='_dN"$O B, +icgd8 +M]{vc/%Y=kVd͂ 9q9'LX2Jt 'xx5+jޖ5$c5{3`O|_L`ceeͺ6fՈdC څә9;*x٬R*2 Nf`Cf}#/d?KXEuGLf5jP^LI*(Ί&AI6k=V5CKYGج17iD$/V6E:ކ:R }` ]8pȰ,؟UƖ> uY~p/ý0gqIf 5m.f]vhdTf]{x fax&5`KL.6l0>ȸ:>mV3GlsMemۼ8>mmѐ:H RI-Ƽt ;F^\m2fqǢ93b(z>1­bQwAk^N#4Ί Hiٔ5Ye2W)zD M8rfUdPf|K5 ]bbZp/rӢ!-qSd֒Qd6fO\Yr[422X!PdVh5! -hVqYސ;PЗof +zm{(ѦQBE,8@hVHZS^u-xRTEf;1,܋6hĢ&v,Tҹ,VB]Z?ͪ0~'OwёunO"5E90\h _ЬGAW@/1vYQHe-)pe4+DΖލ.ij/0H .,2@]0A peOo=M8ꑆPv (0Z0I0A%`@J .C>"4W*fQth %k8bpi)f%$ T&Xŧ7NO1Hr:c')- 6C^ L1"إܹɽM_̙O@1;Kw`'h tZNI(Q14B9c5k'8-km,~Ojj^f:6 MQsH`V,ډpe]ZS|p\ímANU1d|&|/k }bW5t.Tӌuzņ +vBXd~, <)ڀ6nMqm 2MLdPwBS_iH2/6ż#3~ +;Ś Q)KSClP5T{h  BA{39֊}nu;艹XYF\3 S}M&@ jA6=r 2K0o0knA&DENj:o #D,8'ffQ$:<$ـF4wbJ)Cbj.Ffc( +%5zQMnuk?/:-Uu0(7 Vс*moO <_X?v>T@Ʈe%xE ZY2yyEa۲s '5Rriu䄤~x\-»GEUY[S+Q[JђҼJً͹aüb=`o0/-@`qA%x`*,rc'ao7 rM3On'$D-gZZ`mBձnM蟵F?alI5)$Hw|p4Pp@!dfw"ttVk3OaE(!',#sͦ4q1HHHD7<k)[Hib5=.R~R-D/[ +4ۣ/2كఝ3(Jj&굌}=EMK_['L[3h̪FV}`B^&E2mP.#um%}%_'7">e'6v3xIE`ՀTXp ffT^]^E%*ANZ ST"6memzo HD@&NQtDx2Yw9aH&pc՜}XsN%gǯ+ |ZOeMW'0>hWAj U) +o x/`I٤e ^=YU苔6N*D"mpt8Ñ$d˷RU`'$g +i#5 +yjeTr8()[ZzMffFK i擡, EBdĔ +G$ZgCUllU lr4]=dBi +t F~{9FBy!Md1UѱV0^!  `+k;i2lp!.NއO.p"$b y*-Vrk}ͳZN%h''J:ိEUTLb[ X]\ -#Х-NC6Iq!F%1J/x#.SDH}@0 96C,?υ0'QHyOFr>,YasעF4g<"C\rũwfIW ʐdbJWОH0vpCБgx<}:ҩ\yvw9P!`:d;fmbmu9"}>0^/5!!1,GS!_%{kc[wc`;;v[I_^/8k*cv6EYJLQk͚ئ'ncw X'DY)8ۼ擨@9s BJcwn.K|$ɯ&8SB(@Ap,_D+[.X1pCYŋ@k>_)S11rށgT(WK\B 5dMdp9d?yGhVH'eaiu;`d#x%amND֓g*1 40zDΘQ4YF__x 0Cj^4yutѴ5UQ~QH]~@_\# +lE+Do~,73)&dWCY¤nsEbq('[rWaX yAigq7E4KͶ_ya~ywr$$*jJI!cxĿn-s ϟNX42o;lgIѲؘMvҩK'9Rni%B0,.*оDžWf%]ix/$VN2Or]^߬>5wArepahT J vpJ.jg +1w{#C5lpe(Ӡ~OڕI{\cT_N@f*AG,y"vEީLߙRX{mRG\yAI\.;`X07jȚP(\|qzx/"l) + .eA u_g'cOq;(f +oQ9_Y|rS}< +U/(-2ⴈtQ%Ba8pbpV?}J-:q6 +(i8Uh.jAtQQti4biA[pv] ~ &}1Tgȅ1T>X,ov85ʩLX_qUK4˛ڤBy^ykX7UX 7!BOo;r9$&h*!`0K=QVG1Y5 +o"Jò)FH3mc;܋4=:'΍F+L.=.w 6Ô617N~aY"l77'vx2&PgP4k"~ b-"g°^ gڜVJVv 9 =5> G@ e]D/6\ j9/Pw޻DT ͎`D*,r 㵈]V@{-eP \ -LIv> +buPvc (N_tсWq)Bb42 |Apؕt5qY1>amR\0_ܰW̘ 2b3@Ë3uEhagE#AɿE%GVsOk0ӹ}fέϒQc72W & +f[SSq\έhr+uؑDUi-j( 1I:LVrM*S5O,nIjmQZWG@G ! txT qe z ++N_@cRZım[Rr\  /eS!f]th +LE9i;I+끐(]RI7mg:ҿۛP92Nl<.+ϸ/UfXɜ1OȖ z輽֜7#jBl\:aHeXM$_W'g!p% &O'ٛ~>30@<%W7{KV_tD͖D.7ʕ)1Fഭǒa (?2.e n5z&hH|^1?џd)#@ lI n"}-oRHp[SG\T"})mp]Rd2zƒL1Jg4644\6w8~`⨪[ru?AHRn`EBOHG.#dCf`CL h `Xc3t"RN`i-$~g13eP{DV ctPEMo:H۵d3K94l6&CEKj5zԗjGw@_Zi vpƒÕ{ͺڍR qT/dז3_Z[UƘ֏:b03"y1դN!BkTqNtD+ t[EaPh @L *ѐyRp"}Kujp64sTuudUсЦ!YdD]n߇0\3(t5"Po91q=\b]Mfdyhv +M+WCs:-V]@_tǫ@xSf{Il&3vF/!F"SJyM:U^Ldž*)s I`̑ ­dy3@OAo1wLP%$; #c1hky 2YboQx`kϡ[ +ՈŜ"?X,:ܷ\nz}u W%$圪<^Q Ю!0C9HTdPOo|SU@"F<6>|m1#l>Z*"ek|'RǽflL;});TRϵ,b/(pbZ3?׭2`[AjcfH4$F˜Ąw]V1wq$_qyAS:'%:*1Y +\ Jpy >.(om;mm +2@a[n:z b%H[:NK@i͔ ~w{ lRA_,F`!,X)<]vY&:K С #T%+@ϽB,$bsd E)YlQ!ve>O#w`d!S`?5ٮ_ 6D_+6D^a7گ\UP" &NXAӔ +arZZ0+{á݌H]6%S5h*5)YHg)eh-WCV>鱒MQvE2!T*H *A<mj2#>^].^vN>enSD`Ј42fzvtR3Kgl +4C~6#>Ă۲ +QhiC)*g%~/ӼZLt?< cf8O *?a@wT\~jvGORpL8\Y5da~BFh>;˵BndN١aҍ*\c'E O|LJLt + L>NQ&؟BK:I + ^3TmĢo)WlkɈorpYQ;,dMcU +IS8obSOjA5^TeP;[ew]fKBϝ">7en?1`P;"g>PpUj&x^z W:zZNn 2$HˣԒ]$ ΟR"ue eV X  md*.BȕNhD4}8#Z +ȰB"ȩ6e_ld8oOHvȝeRGe+k5,̘H=r6 s + 0.z%2ބwx ư˟>d ,Wq=CSv]Mwr|`dG]߼sN$Ar3aY=}29aFŃv7yX4mхst;~U\Z' ;- ϷijB'CM8UI".(WCDG^l<*.|Guuul=[qSO!݋/v^jOXPDIG)K0Ft-ARƗ֐$:x{(>j?{Ӵ49פzAZ KjiA+,t5]*0gocAX{,H;Xpu8H+NrRB*g@*2߱%5ҕcYDuJ`$!H:V5felւ\gz#O 輨c\Q)~MAU#Z"#;tN{9 Gː.FH\x(0pBxB%+8Z/WBubFx=R7ʥ'Tݦ['_h@^vL3`>T~Wp9vpvc簥;wrF]MT׵iZ o+h2;э#*uD}#-C,DUd3/@ˠ?L6{0Nmfa3i^fe/2ErEHJ3[ { ^M@\F߁+ʰEGc4ei3sx\ +<=Cvt_KQsW)4O_أn2,!v],f?c + )ug@;ͨV yuWו\?7G*ȼ?sfx*WLծ7\m+!W^V{tj3j;{HXR.oGl]%  Kq\v8UL939>MtJmfq% >jqST+h?J$K`<1_QhK y? +ynʰgFbc'CC%Sk Jg;ualZCLb qh%xVaAØ@8V. +h2J-lWń>fNca!2k@'Z7!{;cY8&+Ȣ574CK{*2MF5," ;U 7\;z%tx8]Uv[B}aC\o}=5LhbWEՅuY7ჰR6A嗋O4MG0IDӁd̆7D0wAͿH_B-eƂ3HX2|q6;VuX.[{vEtIT`ʍd܈?qv"h0 wف=Mٔ%D?Zy|},7s!z\_('Ml XmFH##DhքIrg#@Ęܷzф6R${JఞZXÞ +/Id*XΠ 5]m&p;k wMwi$eb 7A0Nē bPP;%I3A55GydIɫC\m;5A%`Xroݽ0΁o _O:#t-@gQ1'^*%M}4 +MX 8p3`>a;PZey10`P͛z!APp3n*D=ۤi}l,Ex[^} cbQ*& +&c3hGLɶi@祬emZ}עcHqЏMPNPA&@ϥIZqܛqhG*lֹHybhIY־Ӗ@uk5l831 p*wH7PۄX#ňĵ{l޳=<~]ΩI +YPq󼒲T#v l.lqE^sF9=e4s#F#7b8B)~Lܻ=ibtH@3?k_DIs_wAu\Q +ɬ-и8F縫|+]\WޤXpF8Z~0=cXT:~Dy=pp5w0TJط%q[H:o#ҲC7=Cbmcǔ +hO x 神YHSZ9x&- qء!=awԭ%ۄi`sP2ľ-˲FoBլj]xIV٘EK&_ Yк[B+*J +T^5lAB|XWAS9.wKBu,-3̀PlU45-([ xJ&14冨ӯ4{_{YyHJkk6 Lgf<z#τy $&9zLJQaF]QO^DöYȭtXʉװZAad9*7:c1Q]5 eU(TU@ 㸞P H/tQLP) +{' &:,r&f5ei'ŻKS _z`)?0N2 ّE=I+d6LP~GI%B: :y(1.YJNIԛ1ӣ<6eúrctIs)w[x9zY * ۼG:D-t=.) 8!L)M֜! +^4F.(1Na`i]J_{)<\\Ƭ$czGDv2xwV;9k c- DKJKAhU'1|I@$?C, =~ +n5'Cin{2Zbg[Wǡkp^oq:Pm=CԱӗ#H OD1VBV`!FjpΧr +R% S!R0Rɔ1K7Z*mbf▶! I¯㈫.DNMMi,cd`#˸+AE/4B52cV`#ՃCu囜(X[V`U+X^\FL>lXmm6z\RrZpnh h{qeÞȆ|q’=z?Cp&^u{4eZs b\2viZR+8j5(EyXAJ4P.T"ӷ``Z| t6r\!gWͩ{\@-sȘ0,?_f +IuYP{ +(e 6LBR]h#ȱcvlߑ62c&& 3Hbp@E3!.+{;EbqI@_+1l6t(0Ack6xnW[Gij^k Ն ȏ8Փb[ Z"&k#wd-_tn7_$۶`NL$E~mpn+lN^Rdo+%Mt[X㖐u CK30k"zQ=0 'F_<I(S:ηB6cU{TaEZ) JbG_M5%% )tٓW=}`A-XNq'#$os)p@]`5H(Pf:Q$x|Zے `z)teϒF9im%I0JwZ7LtDW0L.ODΘk~QF(Z~`@j@$VZa; vnzG̎twSVGǂSYh'-#}R+!X8A$+L%^4"O=$3buq!-YjqL32.#y)R.8+RWBu#*8Sm'(:aEzlY?sZ2Cgɑa5$s\vY|)lv~js*,tg(ީmhY]d0l5R!K211-U"mbs]Ccv|:~b 0zl =1bẐ,i-?3{T0b  +z4BV`.6o'2=+$9ɋNT+ITngbka *!)z#6-P}(. Qݐo^i7Z>>R&$5Tz /,/UmSߗ%moy-#d ca.j:- Y 8 fˆ'eYDEv`âَIˤ _ "f(+rt6%m4I(fƞJcgM|nX 0QM41l|&QE!&M ;(C &GYK:߾" QH;H.aTz +=)PX_?(as(d^|"WXnlM͉ԙ7 =8͉x-SBJ:]:Uۘ|GxFQ?rb6nrpY aB+ %{d[w6'2 -JG>ڟ׮1U| +<  m fxi)Gϑ{9 +BBk$ayc#c4az~*|>&#䡰1(ꆘ'4x .$NzN Y&uBuIx%5v ׹JU[|Hax K'KYM47K#tr=Vkl\yv} SJXC'5,:Y_`%H@mת὘XՑVj +ن'?z>㛥o/4cύ16,bW);aOkB˺z@StWe96V<7{EIG yr$Vt{d1a neh׾5B/c/Y*,66ڹpw,ZC(NqB<`0,Vcn"Y5 KٶZqY L2ZK'ƧՖ.{""Ry6!T^*6p/ a7y& À')3g?ǍMrIK<0)a"[ۙ.. ym6Sf؉t/˙rIww,^Dwi6kX2FNzҔ5gR^G6ܼш|~!!~MG2HNh?﷍OzȖ~%'py!,`khr{ ӥl:=x݋eT$I٫ \œufawލe>f^f(Tچo:j1#NOakMbzG5)N^_4ېG|\U)қp4yyiyv&c)N wYKl \]C0KUmA J2 h5f)q͂w 5u3ypJ ;(! +L24Я|ǡ>@%IոlHz=8*1\J!,%"\֮MY`i&4,\v%FI9eTm ڮKl:+PJU\-9Lj)e<HsJB7aLD8c}gn)~AaÏ9aK!-Xܒx|nަ0(!%,؎ܪi$.AfmU4/0RXػ$z$*EP!߈i ~zUw%?EX0CdaiL3ĘbX]GXƃe\X}iG lbʩHSN*MآUK:^慲E, 9D2'fh[@/>HT3AYbHYcqvxx ޲-iKm#oS6a†qe JIj@'*`JYX*(ȝN0b* w* +W|lH[! /υwb VV[HuC >hպ˜L0[:ACu@vzL +*w] Vn}/E4kQTf iONz {hnSAĞM"RrXf+╚@Ґ.3ioe HHO4nf`4XWX>&l _A\3`qV.K~,nw3d |*So<6buSQJ~֗G,2 p9ZTq>=HQ\4 F.cCGV'\v$Zt-J+]d2\ H꿽vAW>[0C(/2F +(c4zHId(W嫘*kUTPf1ʓY|r1b 4A3,3jw=X +$8MwH˛jQ_))pQ}B2#3q 1,\Jt*^Ŧ GGC=q2iO##v/DԢ_x\a/ơ@18(` ;/@3GHvSڽ5(_M܃)q-tr1Oclndhy +Ph +c-y5o9R ~=%)3) W_ c}1d>WFt@t5ʹ|үzLJp|?ikAņ_e0i"pu#V3Vwv2*Xrx>} 6\ ljGTw2x)*ArljsclP>@:BȗJ4ϝ"_p ][eI! Wg{-a}-6evXZ{P +T3>_%9@A# m'zCk耯wd,lhvyhe݂2kqN &H7T+}>U Ǻ!$QW"4V:ISccҾjCWup I}ZTҰl(,kS!(gwJ̢LӲ)1V:<0\Z4 Ij2VZ9Չ.yBPqq}-`e~(ʃOEi:P'}[q8-E}y}=-qډ&1no\3,4Ŗ #;KxNO#EHR;TO&uC)N+zDMTbI9dk3һ%@4=ڌӹq$ +Lo`}?sdyCs~E,5w>eYQWjoEZ}/W>{5Zc;z;.*!jPArZ:A սBn4WoNk&ί{?S5oTnI"#65ޜjj_=ꢽݽaUǗoɎ͓]{ '̃N;inQwnžAq G1/;P90ӌi|?YKojJ ս6PfUG]thæo3( +{皹gʔ61 +vM5,h_+!ߠYϦgV}v/Fm$MQB\TA6\->˟П|0jZ$Zo[d,j^g:G ]x/}f^Ý: H!?2݊ Eʘ%[e361I._1t1ge[}DG3^bo2?xW}n 0 eQqODݏ$~)11=Q=kK(+C ȴG%M%!i ek2)D94JY-*D:‰ccs-OO,҇=02^ @boT}PKuq#XCdIb\IA3_Kco35#0 B shQ(mp얼p +]xk:j"ڀ%VUhuug)n&k{9\KIU]:YKhB.p/zGӚS ~yGxP3zɵ.j7G 9ണ,ݰ4E;βʄuMFb}]X%咗'ԨK(Цz, +y=>/֞D~z8e? `耧pthq|f۩ɻkׅ=b<>,S.Y-hoeDG2|+yN\5W76jOo#wX pŔ%7g~3Ge,KґB2W'V`C7!f1I^~Ykl%#a{`G'ǑU#cE:#wDzi{{DO[|\{uQ(ڸOM>3U߇.|oP~>A:~pLR:[b[F#`=2? *t2e6 +& +̫^i8lP,E&YH&B~j@4S__C?ӼړS&^?0]z'sO>i/ t0Da(n0{V{7iְIlpbL; .q"2 fQF+ck?0f4)]riU;^̺WEK6:z0;dwP8sux1T޼E~VlOD@Zm67؇["=u;W3it&琻O<@͢ߦ?҇ ڭFjp/Go3ƗtLpX䢊ڨY: + L2K d˅R i8PK1^0 +sH Aai p4Y Gd2 c)hylP,u1( N0QPP>c{DcMa._~X)W5l.xYnVaP}HCԘ~2r%k軎RϻVd>-z ңJg3ӿdvfێiZ{eoG<.m~&VMƗUw~–9|h?rMj\6w/[NV7,dgc XM\~^CR뚪k) +@l]3a*Ǖ0*/zň^s h~OXHG.f=$o|_οV-:..kA\\,7c%nќ=a ]\`KWu6K.#_CS 6hB +e?"j" '=Cΐw +T#h:2HwxH=O&v;;?\374Zd6S]I^&Ne9lCf. w[BlΝN\[ 1)Qt} 1e3(ƺ,K =L}z@YGZ&!0i"_irص/OHm@]q2JF;"B]oMjK%x䞱E--))͛ރ?UK +ujH WtOq4[WŕgrbZai{RMw9ޣ(1+;FK UX?QHrf4 J?% +7i2x@iU7mSfjBƯN=nڿ̩5=f= AJl33?V[4  樾QtL%;'j*͉ ,xřZt_ZKޜui7RL/:nd=17W*:=ff\o#YU*c{Za.сݘ|I7w>&&+4l A)}p 2AU I3yyIoL/Gr$YN11xbd)(u&~_V/{M\DcC:N0^3ׅ\O3b^1l@GsO9qDAVvF>`PV$ +h`HǽXSzħ,OXMؓRR ɸvp^0zkzҟFBIE +V +f%Bqw\ǒR! +Alݍyŕh'|/c]njn4u ~ֿ-~Xed h;pnEb=6r,i4h(zGmq٫}-ZoU2T^sk [J)g3&=^kwCӽ6=AT<"쫞nSL#|NҞEM*iiN2t/Iv3_$B3kF94?Jy_]"2c]U(\ϟ8ZĿ'ES榧0|!{9e.1}2%2ӗ9Ӈd&#=g7I8>ȕ?&sRoWC 3 +1$MTCGR<#5RKRH͑C,9$=17<ߨDǪRQ)(IV:;U]DKtH꥗{iKxcΈcf"~'']kʉi>H%>*_83OcQ;ە^yGGNy:?甛(F?ĕ 筬FVl&·?O8ZhHJ]*ꇼsŠw,5=Zu1tDqU%h"jUZf"jהd _c:y:ty+yp{W .[|UetG2O!MKWUV̆%Sj$nuL/R&yGFc\e%c6w'ΑWtGᾖDv$1aaѸ'^Ӡ&PCj/oU^ă꡸L93^G"-S )Q U|SG*VL5 |: +BEѪG-4. +ʪuNEUU‘!ەG0[Ԩ; ]wQS!!-56@0vjҲHyFhH6+G~ҿkm1k';*O4#O/nM%ێi[٥]#ӕ*wre%w/wZHmnOрPyEx$y:˓,ye6 zŧE($[,Ù= H,EF ߹I,!ݤ"?3c/8RQ*TJwS%HX,kQ )7X^>x22! 9)hߕ +A5;Hgl!7|x(jS _YjgY,ڨ~m,!?fYccvT *Ơ&5ybj6QpQ `k:Fu5pab=IDOb%F5m(HPKLz+6 KӬ4tS-=ʟK\$֚llARYi'>Ϩ~5CtS3!畮-7X8glNSE)VR%Lsę4 +h\" +auiH<2&Ry ޏͥ3 A:HQ~'H67;_Y|3;y :rB4S">O˕(I_ZZxxD*oUnL&3kFO1}S"LQ}`,a#H*Lp4EGǑVRϘA~E//Q&Т3#~dD"⾠5ζQj4ڧ*G֟ɮ Cz#S#<ڙvsE1̣ţ#N&!]$!S@4CjC#FJS 5SM2U ъM",T:S0!ι=;OrA2+Ͻ3cUpx7FE#QbV*ǙAqV++G0eU,,eSkýJa6]Pzf`,#PEX Ca2 +]0Dž18Ȃty5P%P%L(2fa@@wz3SsxRCia(< erԗIr_BY/آ"[s=bv-*odʢZQ;Sj5]'b&>O:#O2b9*dG [#/%iH%}LRJZI/Mv^iZVC<{ûpDHfd|4}2ﴠ$ZwZ>Z:у3W%k5dek8DED:c܏8YBu/A#MN +GC9iU('#j"%j" Iΐ-Ee9!F3n67YщDTŴ':oy\'SWIETy3K/z~ I 4=WiVمVq+*ֲ")+2d I{&ErQt AbPH8[Ie@O!HyTɖP̃Qק CɊ%ɡÐQg}19BL(!(Ī@GL9::,([c_L*BFAVdQP"3fArK<-\dbrȚjH31jx614P7,QPTZ ߙFSHĘ4ƣ$FH#*_]FC}}$hlSԚ_SSr+2,$B>Ak=vc[ݡﺕ_9[[s+7nqwZjk>AY#s҄Rc%JUk"U.]8YݻLۙV"DJ"7*?VQ}YbFVC4a& v)Y #2 key4<8EDk3S%/ʐN( J1x1^"D%KLT]r= + SΔ!`6B(H!C1IqIȼ\mn(S7r`KZ?j0ɾ1:7٬HIkb@4PJ1&+Z+ouDDױ5R 拏udG;b]#KrkFس\4$ZəC q "Yʅo+Mb9Hٱ(aRQjE+: ho/x5e 0+FVqEB"dT'5&ڞ(E IDj0{1B E,DGgE*N?"CD)u1Y.ʕZ<^ǣZZs]MnP֠ V(Ϸc%4V뫴P~BXt^qQ"TcTS\TD#G8zq(pRu9ԪxDWeZ4άM~rIOT)Qau闄[^idT8^4C,^g0eJ( ʏ`%R[*FE w~rM++덊i'VÃ2upf#s*:`Yc?>OJ` $!W!PK\]U:0軆{b1^x Z* UxA T1!@=B41nIMT +I 0-=e~Ԟt>P +R<2w |cF6x(5 EI(@tătoҽ{\i +^{jIebp#X^ +W.Fn%YXo9} 4".810zקqV-ET ҁpXY=p])c +A̙^b(@e^jr}Q %ZUvN\sHp TG͂ \: @ӘxPzg?^4@wh*hA ^1xRL#9fHGAI@2P ˠ.2ʠ Ry@:#^Ц!?Tzu 6:1wZ x[Q 2$*Q_ ՆAAku +{AW +@S~INJ`/HR`{A^$/gTg_Er-qY/A_5+{$.R/a_ )ak((_ U;|A_ VtF.@| jA:G76 ]/~!/9\ޣq%ez|Hs͂(_@zB_ R|Ce)cQVq0s1X{#rAH3\tL$/3p~#_ m/hU oGv_ŐKdT̬ 4B6 pNxd 3Uoуr؃A.B@C_y^{yq킙q`//|}/88:` +} W+.I u>pX g`z Wο-XmyE/"N 'ME喺` FPn(ՂvMp лhAY6\n Zqw .j~qhJBx!JxDQNasG'hW>}a9l.rA \mZ։hMD=RK1ِ4gՐ^eIJ&Df+1AГaRJd]v F% &K0wg:Ph|D4:Q2,XqC,n6FJˎȖh'=EHmMLgkŕG\XL)GI{jy #Aqp9HpgsDnZ$ȕKlep*U`B;G`;rAnHpEq1giJ0װ`~rͭS}zi7)4Fpz\e؋`E-/ ) \.68"oV.~7Ks0A'0#7<4~O Y(*J{ɷ c)e(W=?-FH{0z愠i&4xC[!P;;*Ȩ8 z8 Ш!!G*TVv9 c`oFFڥ!b +{S|#EG6{JcdT&$-0.߮%`OmyQx؊s,}yw(0{{rI$&wu=@J"G?&9'60M'x|B3O 8ow +KRg+gȋew 2B ?.aʭNɒ݁F +[[/e(ײ2I[TۧFov3R^FEӁ +t`hvZș~:)Df< ;P32[ExsPeӶ*,mKD$s#&u9C$ڮ:@ڧ$b2MKTB`制UǸ + +ڦW>udHuJB2zX/,a5ۦA -{xŷ\t0(/> /Jٮ aαuo06FR2=:@Dǚ?bfZu@J)~J^ +nGhl{gP, +P`IX:3'nziN-@@aD@0}[d49VPAOBeD0RTHYEQ2Mr6~8%Q24{L3%"^DWpp =Mb K( FzԽ&/= +cQh l;7pE`O6=zJUm6;Ķe L@DਥT?@15|ABn>@x8 G@tyBQCN.1ÈwzF_ٕ/L]% DYFP#,Xgc@FLA3=)[?;^^3  _P2MVzHdz20" q܀_10'K(NꎚMͮ\h +8>2ese//P`r0kBřz݃SFqN(uklxn5\?a3+i\8[r*Ő&vR2aŮ< ,]}krgok̈;eB& ̞Yd:g*#oBYI̶a) +D +QF%+EW] ̓Z`,M8s9eKd]` )@BVu&ͨt,!|*) $0(VVWK}k=dc8]+tPƒ`rYxs',sЄGjn&.8#QRjWyee3 gɬL`/jp @+w6DTJ nNRĀHɂf08 pdB 630iA^͋@wT㒇 +#1W%dQBfP_J@ E٤7gfW^6 _MB2iTV^ O4p x pɔ Ԩ l  ^LU@C ii !}oe +Ya>N.r5*LA3^lgE RŽ`h@8b{`ptGSꢥ5n36>["/w' n Nq nGh 0TI?^ŚT- +XپTbϴ) %@>^;SY_|>\~ i9G%ϖI f3-<&%xH&PSB7F{{ErpZ0J?J0 -I!WXw+V6!Ɯep]zOB?@\HŸ\ ,梸%ON ѭ^ ()2cLF$5\a/#,S?5nGe8 s 3L!t8y[g8U[W2hcsrFw ag?QNq3S$,h&%1NHp|-cZn c@ + [8twC,.0u X^+[H̲t 0!|b,Qc@+,bw@K6,7ǀ줸1y IcEU*BU0`hrv)Rǀp?xb2:,Qb5$€+ډ0<2;daf?w _qDUߋweX4M%5Pͪ1o%'Z8$7)I*&ƖmX@r4I1WG9<$(}UNpZKzXB]yO QxE]wxl0#+eEUNO˝|D7?'`)ĩ]j ьk` t%`:%B= xu'Hh8Do,6>IO`C4ÌXߟQOV'D,,5:'! @͉NГ>Om=;ΞbVyj䎾@:mCqy[^ % VZ}b1Q8Nu (qd ^;[?T +fЁX 8a\sX|O4> +2wR惱q7OrR&?VR\P凫k[ `XIـu Ch[(tS^ꞟEr;@u5m.R%DMgM +Q s"̟*/>SYdrj=NW`fQ7E0[89OD#G?Xo2C/V!肏Sר=Qڵ)/ 9YҲĆ{02 rysS&?\_ H'hreHA]49EydRj*^c ?mv'J&ӕMO3=] bIO"!AHȔ6#: +UfSx{vkm~abhjIGhF'g} gf:C8[£iϭnl+V[W&}a9{sM9"i-쿨tnpKu +ZHo E=U*4o(kܬfvEvd;h=?Ho|JXJRQ4rЃ + @?Z=Xm߳V*} Gyhp< l`_#5(,K9(+c>+}#cX*hؙvRUL# ͕ǔ?vmmN2D:rC9" Zʓ㳹P0 BI ٳt"A$ٵJ;Usy!~zZGpe'#3nXcAƑz;I<8ڤX)x:ε#ߩ_5"|gyc+fWXxyKWݺ6eb'k-46\p#~jiۈTn"A<&Wϖ';QGi#/B. Wؽx,Jb ]7LOP'C YZKz`ST& >dT[j`,{rV[ݛ}Rˁq;M (/d~aUw hʒ?",GEYMxʔK'RN^–`L\p +Z qrZ[ֿ߫Rm{8v< Է7k/H΅05^6 8Kce? ͡+XuRlpFF;~Mv-&+1gNogq 4 +5?oV-$ pl ٢ПoynHoQl{N6;DYXL*תxB +o؆(e}v0ڄ(gyL^3ae4T}?|8+24.wKx +(X$1?W݂J O/V_ +}_SOн3Y%@xbj҂Dfݦ5iS}fLuѿ|و1"et@773a4?;ʡV DY z3/AyCS> 1q +':D&,eCmI1TBн >g F\ 3+cHD~#LD?+b<џh_џ +|,'~0'kƘuyk+)KuEUČ(ȌgdH DYUO)B6-%o@$iL^FKWJCqaκ*+Mjb ۺ66eؐ.M(u:pןP=~OqtߛIEѮoP=c,>ڈMuT3 *tUج5T4DkP#}YWr J_Ɲa@0t ~ŃJt$ Ii\.R_ַFt^(dr F7B8J.wJ*Kq@@ߌEQ2v= VoeɅ5&Ob? 5,Y_u&ZbDR)M~ 2'0@?$o7O"b0RM*?"!(2]/1x^H?aw|Xhc-$SskFBeuΈ_/Q4|W7@65;F5^)'Fͱ% = J_kߦe!ARfMѐj73}+ywwa0o?ݿFgVIJ.Cn?b"fcII{A!쳿 {fD=CG]pPO'AgG|}_|1ܼ{WYXhƎ'4Cߨek4T~gWW&J*TT?$FAW_נ=>@u|28?VŸ*o[dSQR"$~V 1Rpz?,ru> 8CWCcBsMg~N^WO[e- cf~k @wtKC1PG?_"q4/?>~2u߷1z^NgF1ez ,xY%U:HuPTĴϲY/J&nC+Z!Y W]kFl4z2W}A2rµő<~KN_d?;'VIQ _wYv} BÎa~}LnRZ`ά`bO͊F4R;erN@-%>֣9(हz`Q= ;&*)Rn;ش<`~P'0Kw:VΊŸ+>2L#!sȢ01T=ar +,~w=a6,-_?mJCџr8Onx9=ORS :`IA1kFHiqY>^[L01o +YmJx̝Un9kwnq< 9q)09WBk[rg~tͯL\p#*o 0VO_Vogj?-twRj >zٕ'k0RO6&"LƬ%p,c +RkkOWL~b1Sk'KP  XC ȿQevQlXǠw{yN˅HtA8E[ x|r:cD/\°!BM*-"g7`u 7(>L}~V$/$R,>Ds>G@,療ۄjmw{?/ +fcr hR{J 0oc):(ʛw%{BݤiF1⯶xOv -wFNH[wy;Ϫ:tǪG|1P +ty6=7"ȩx^wcZَ\Wz3W`I"?<Ώk-^c=vƃi/(hw +D&z-p-4[_I;?Y2X~;'Н'`[ǨЯgG G<%ip~p!^ kg1P<^Й[ hCy)Vgp!R晪ZaX*\Y8q+ZÿNr&m@D;*%r /W*'#Ò) ++xYa/^d=L[F94Ȋ*%eY#cҿ ?4sͪcO+!R9 +zqŌdX2BEvklh,' /+6AO4mre!ƥhyH wYR!UMXzlG=0Hz4syp.@]LFʧDcﲔ4ǩ +* k[OX=_)!8+ 6rbk:`N,A>JGղpJ&0yD5S[}o#? +Dճ`4 +JRQ E͕T9+y0n{\ѡ\ ?+uC'c7 G7[rav%#]eSXwC1yRg4!~So߀N6/kWWrlj̄`;/b,>[9yHԚƫy%L*RW߶y}2!d|unCfO݄lW:KouyUR4/_6dŪ2PRsU}2k7eݤZ;T4ȁB< Ș&΃˯xB?G 'ҩRB$zKΩۀ[@jdjY`!1r+}NTHi[IЯtZY7W|Tm"DrbmtL+fҦ=iWt C \)az* u8tK )Y?Lvzb?k]qEwNX*!ReiTFlFz`"9wqCœ!{BZB乇+'J]O$-.$nRt|-|u3:-m͠Od'SҕK4 Gh¾d.b(QDcoYbTD$ )^O ١`W9g=hg$9 O9U'!2C]zQLчﻌ|,x::~x Iϐ- xNsiP$$e%2ysh>,Ȟɦ[<@l[4RMce_t@T.3;B7O(| =ȳN/q @,l'&jYI;AS;}Z5{$!; hl Ө>߶ug4jrcdK =D@aB 0/ÏM)d=>6mBل3΅JBn2W Ll}MuXM:7AI]]7屐TDaE[OڋM*`W ǽ; +v,T%8?NB%紡iM(sLOȏCj<2!'VY09NAfMC8EӢ + EQ BJgk6=NZUD5?>q;SD^˔g +>M"BE"n9Ti()%ibCN=~~C"CW8M!b0frX. +P[P  P0eH&-8[&`dkZdKEbtAB&ԛ*T KMe}e ^fm +q9SD=>>HoV_*W> )Qr'o+}P9KlNe1M!S7#.N7rऻMahp CY3Cc < k8&dfOx?=P_IeZ_@7H;|d^o(fhe p5|)E_$oC4@7 &UY!ܔqHVLժ$Њ  PJ"P$nU&, +'Qqtib$ǩ6#l8lj7OSq0lCŅSϬAUlC/ ''3 jl϶=ېTY_jZMqR4 #/mh ·d ROe5M8="fVdJЮST'q=!9*::$ET._(2VP&s(sVwrKK9t&4X?eĽs<:D V`V2%٦q>Jc Э9DE-7+AjІ *ZR5KN-cMNMCv9N͡+@5,Td(с.nYw$#D 9Gq%|e4^"P4 +9٪(L'!ME2{c8 #P}DF!'Ts'0K 9 j<1}l }G$r +Z~6PJGr9qe4lrnuh`U;vE+g ^NHX,nDQ5fz9*Lb=m6=êfҎlSaŘ@ +PgN'€1 /[N4B> +njdN +윮Box J g+[G +_lhYw~Ϣehu"p@+yT#g$(u۩o _key9Atz@(Vۼ، T׹IR1+ +ysx譥IsгH!׉C$w[pQsU5'F빒t3kN;gZYsj`$3l;E-* 1~:P P2w+5Dp\hĜX>Uxz;T|JȍSO*8*K^Dt +QTyU3u2ximMP.R'ب6p࡚FAE)ibQrL4L7xpRIh!"2ڠ ubY"Jdb Ll^|> +e}֒9[ t:S_B +NRgcO\+yC!ØUѩ9$9=yҫ &s7NOԠ&\H'p =tyЦ CtrGpnRhHUy)p@sNZjHu9i8(srLBW5ِa;'`P~#横; "6J3U Bwh+JvNk"Yg,}yh"෠˟S1룰E +!"`wKزZ͜9Q9,vIUSEwHWwÔ[zvRٔ5fͅ!!(w'W ]g(;H?vbG;D5 *Ӿ/!1Hh8~LCBdi{}!zpԭfղ,; +TNGS޾s@A.fZR-SE~vbCTP5fC̅YCWQ b"_ʝf59i-p[tI]ǚV9=s}\s(@E&9bdgܻdYCkW)/iy椗iLB>63.XLqhjn}WSsK&j {&1SR}(# ;4kG)2(s|]-&*BRϡ;DzsR"1;U#C؏4u(3 u<4t|!g)t.8H_e tzjVs,[AcR$v;NV?>PcV5&IR{x(j֋S&;PSN1~L[:E'.:ʰ@/ C!")"2#b=H;2ۊDDD%;Qf`"r%*\̉*#cTU:\^_qDPo % }G3̅Bz.rְVJ]d X*Hn\Db -_I9_bְ!@tB$10~%9LŸ_I8'WZOih{%u"'j$z p,NPU!$5ݸV,..K7ˣ#H5 +Tz K5Y&ݱa!{y/4g^;8kH#__:ᑚKbGxFMu WTKΔ,Hi*l7om@IVVR2~I pKPgRɾK"}==HhӠ94@aF)~]3c6fKa1DNT._zPLG"eX{X#:NfŔ\j @lSR#7~6BtHL׎'/eC!ILAJC/wcH&BX2<&ZH2%r%ɤ\7Un'&bMjV+(BN2Bej|qROQ1,(~@׭C ѱ%i 4 7ve([ +ѫjL30, f>dz`6]O4h.#qB$~ebqL;xQ5,-'(ML ]jQӃ1i4rQ&fH7́Y2u=&eQ^џELhXIR&kHD2_-'`T(9 +綪HtEԅn*eBSM9T,,G)YH)m{F5/UnV"`fSs t|Sx[!$]f’彲؍,z|LJff:g4!ʙxEA'u~hT0PK 5I gBD!T9SB)3źL4:DĂ+@gs:C*f'H$Ț3ݘYa1gJ]Z3ENVhss&hyOsUH(o޻L(F:,/Sj,8T3 vOthb}.əAa`ՙd+Zg=v%pM Lm0S8Yf<~Iad풹fja^Ʃ:]0٧֌w9x=%cZ x8zϚ  єnщ j"m 8R~jdS *5QSTbpTt +FiJc to(ݩ@<"H4 0Ƀ8apb)X1]Nlz` 2։. +}h ǩ1Cwj9|h;3Uyr`>*#O8Ƃ?xTJRZ_@q>`ົSf +2 +endstream endobj 21 0 obj <>stream +)Q&5ijE[ +}(> Qbzyz$ .dTfʶ 9;o(dzR fOj%`ɷ/zR)<֐d|ͩd3tCeKXd>&/ :zJ!kT@D)!?s,gő͛/.&?m#!+һp_L4uTwѽ`4g'OZҢmMzt싐(j*r= '$ + b勦橦c5O}2UP_L&;9v0}OVl42fxDOuTt:Q#}̏x=] +]4,߯eOPd䒊)pn>FSœ".U'+VT(?e FUDld؀>T*P(C2Sw'(%3堒P^ 5gbS( UPK$\:Ҥ*!L;?DTHZ?b)߼],9\:J#;^6@`@8{veUAdIL(UّR Ƅ2dDa;:B4G1J7D107&_EQU*Xh$I`Glɒ ȪsY0NJ/-[ +5X{>'Qt,9>[+P.yCZpm+$$iI8%jӂPBZ4 ³HEJra+*ͣXit׊cqi*.mRgqE0蓨j3v_36A@mh/#q@Œ4jJLQ'.9rl[k:EYJ5NDŢANk$5Do*!"[ibZ8ybwu.{Y&RyrpJbg^E!UӞ=Q0)# Q?Ax@%eĸ;S!G~U-w'I[ QSƫ + +$UMw$+r2Ck\TCmO+CXW$3|$'d!/k2DkJCl\6ٖȰ}gVJ2 =+9ОP&d`QVE5@BWXSS N X8| [~.|[6<XĠ&By)P?P%l lzLY3(_ 4bR-znU%EL{ (2,v4x)XQU@)MۦVryD ʳ +X%V+XIKUAOfoڔU%,."CHvTfU -HLcZVXWϸL} a Q8wk3dbAUץuU%uSNAW=I{玨U%p؎0^VZdU,N`[!(XF"QKI*Vaこq\FȬgQC)5/B8X |V!GL( "ygAmRI<*-RjOV+,L{N;;5_XQJT/ ԓ0Vnձsj{Ro\F-Ԥ}(혘)9r"󦤁7DũU|ZiZ9N^`1ALi{B}v E[Iw䳸hp'>ų4"rkS=%\n 9M8cS[çАj9c~*$j\E3m>SUԶO5`7E$S*i,[a%DlzX] +} +aGC!B:mQ s[j+Rc*ڳ@qxl[?o)@i55LU2?T +TT~T(@mm"UI*~.4+}"kVIQAV`LXc%jdK*?Ѹt\WW`>2%O@lX?( : dFkA\@@h΢ ́a)4pF;OekK +@PTdݸ5vn`BcեSE|"M ڏ>wNa.c.f[ +}&Bv[z,/r称W[,,%>Y"HP"PAI(ܗ1/h 4?sQ/8əg6 R0 +"9dvYVƥՋT)&+OT׶F?Vdv}w+ݯȓCYǵ +jXm;,%˚ǢU>{T +Hܹ-Da2(@jxX7-6` i&B|&tX c5рq3QWQX)c>֨§~9}sI]>6LN]v޽RPG4Lr >Vr 8L +UB_0TՒHKUx_[zceܠ)X+"cͧ:Vs>XLr0U,ݹDa{ÍL4HYWvto>V|^L +$>񰲲W%PF-%^@v@}_U})Md " +;]b@<]XIJ\1,caa>V_e,u%kE\Pk|,mߊq)I鉏EK5ă |LU++LLʻg^6j HH)wy,ߦgd!x6cY#08#}>|!UGbciq, +!~B~1.XIGܩʙ`oQk(n2ǒ^˷%Mx.8R,Ʋpo@VTʜcAA vxӟJ! cP:ϏfLno"@wfpB졡kȂZ{3IwnȂjOY4P6j(ښG€ +H.diNIYnAvif8# Ȋ,}@֬zK,tȊ^J5Cy~x!WW)bP + qS'sVp0b=s -)ROoc]r wyv†! hǿYPuɅb!()΂@p!kF#H*diL>CHd4VA*Ϗg,IH +C'o,TyPÜxPNbad_CVN@Zl2%0Rg/$ 8ص5]dHF,=c)osPPzJ 6YDw"1j}PdM!ΐ7XNɑ5' jeLԴrYd3`dȌ[ CdJg '+] IHxO&z,)7VarJtQPauz>&W8_ɪzP\ܼ8YduM^Gׁ|Tv 'D.' 5HX3'LuIN'+v +-F %:W"GO'Z1S"6;Yn g-:YJ}c8K,=O|:Yw^]s' WLG['9aLI`WuqdLfE)"w 63.F/=Y}T73.ztxi7ޭʓa$Idސ"A^3#=r7U' EA'/9ԪHx,ot'7!4dU758]w'('Yp%.ZcGd(?YU6 f鴇d92|$O 9/!bX83 /zd!#L-m)pxdhy4P?Y'6ڞ,~[) {`'r'5¦@=. uLE:u'+ڇon[юM,ܟ7c %Sd 1%,^'jS]Ծ<\ .:xq&;,dM$ڛ+G d*7 &6NEY<'7s}q}4V2y0_ZNfe!QUyWZTSE) i">oFYxP e ,%8ʲ΍hLBIz)a&CYj.jY!%8'3-渎9Pe1(kzu ȉ䈫F5=HFYM+GY✮Bkq O폲R.pQ@eޭDʊØHY2S ,P6[v`#* M~DMB2ҫ?p t tQV,T#e.쿆WϮIYj>Ea<#e09'FRDc$bV!eW%i&e{ HYc +XI$~'e!)B0{SJY$Uc閲2odKY2͗lY~1a`.%cg<)k"e(ӌPEʒ%с-2)Mޡi 6ϹF h %eȪ,)wqUd6˥p|Rg`/:)=&eyIY7!W|HõwL>[RHqR)j5) zleM`ÏtOh|\Y~+KjteQHѣL}d:d{5+K|eb&WV{(LIJ@^z +zǖ*We: 3C٥7w>ASBXHd}(b$ +U +Fʒ}į,hedž DoW֭Q\./Oz|ߺ.yv.qele bì5q?e ;N5VEȈVK~5yWY?wep,fٕ5#G] B1ەtZ,/_YKWeMYv BepI5X3VbY] NXGve;f`|,Le5nc2?u*,)^5Ʋʧiz?J>ver5}X־@\@| ,L=Ų`| +[ԅreCQk; Nma``dBxXV5Ic^6dY5YBQ- tere9T9ڨ&,K_~aYН0!N}e bJݼYE5Iw63&q[׍輲NcDzwƏ? ,{N#nʤ˚6f%"i"Dg,/I֌ yuIՎۈei.5˲8׳ə{#= Ͳ%ͲL,)* , ^)?"%$+RҔ#/?C̵?EV0)n.4 ō"w0ola*q؂%)bE (9SB凘 g. <2Q6:gгpфq`|Sspu()&:_̋Plx.jHݰX)=)MI'$~=nIa.%?yNJ7ANك4qB5e6DF+DILF +(D`|faitSYhCIC`)MVZ$VIOdB{<#Dx5@DŽbBOOUb 39#!ܵ]f/246 8;EňzEC袋NU+~0)TC#CS6p2l>l Ef)җaE,i l ~N ܋8şCi< CaX ~:WҼcb0$Cw=\? bb̀@ade~Hȭ"ad ./{a40[e(Ep kAh(_,ÿqyJX'os8 Y{2hԶ)oo.g(\N\Hy"Ot! < +?2!ZeƗB~Abf9 ͌1~4)\~@!$R%?A JK"JFK<{ K*ѩ24T&T1j ?p?`AC ]AϷŸE}`]Ü%pAG !Y\&2fF&}b}SnKQ^TzaJ!h!+mԽ$A45{7bЫ6F Sܳ)z灙NHQ5(aoM'_B, fȸX)I9$H]J3gv)YSR*˕-33eXhY~/Jl%JЅ2l9Cq@.|Gt2 C' K"Aa}! #qV["Fa CNOZfAk¦9l;VtÐᔰG%2B 7u?rva_Q$Ԙiۍq\ tOST1(tnmzma!Eh> + +pYagG b +ɨbCU-_h(3H|B9 }|  ۴:7Phh$\tEb8:x\"9'^|bl! E& +y$Wp@l t,\ + +@^#0 rriD&8 LF j;NiR<9E9 Ji{,J?sn8瓮LS:jc.4\9 5׹Vi q}4ı #(9ISJƘ(4HiH$BbܨFO +r\X1[?74:91#Ey2XZրp{CCENcX`+Oq_iV.+zi qh(.N]:w|'f73=~EGO3tDoleg)*B'4ȵ̋hӘìr)M8H*^1MfAw ]rFkJ=* +\&! 00GSy&6骭ZI rՐ,(Wu5)BP/W#4跤%WbZ5Nvl +4=q}teC +]zg%l;8|p=s]%Ǻlr4`Ze!X;]1=iUXL9{Ex]QS4?540_L0(<,@THB_+^rňe`9%@D7WHr |Ƶ,`Isn^ii $ k%nV rZrIYM +ʊQIs\?aRIХW}& +Зȝ$>4Tڋ5rvP(?kpNgD3.F5Ds989 `FzȩΩ F 69 kdFca"H/!9 ̚6F +pTvN`A\*]S(l7Ҡ00ڈtczN"4): Hj9zpBOpM 0H}Aq|;Píut]$a qubd!2tVz*k: ܡP%٦|F*Pv]I#4hI=?3A*L2%Rzuj=(Ik +'~:?d`o\)8A3-bKP:YL4$Pc}Q_ NcLRӀ15D-D/夌F)iZiσ)WF? /IÅ!%@͔6< f=riGὤ4RRMrh.Z,l &m#ʃ5ը謀;@X­; v9cl؝$kR,x]r^߭BKk1T;wkƘ|x;񹐮&-;QxpILs&,wNÐR#1}ٍۋy,KE@>yg<F yݼӨуa)x*9Fr̥!cd<٣rce'4|Zg>jhp"\';1/}(.9[=Yp{Ԡ)4;X:tG4 &S\;.~ OЏc>*O㒁ad6ؼ"< /75E< ,4+VAsSiF),p-·a+qOcz=cMeJW$OyiBq𡷃^lQ,i%3C):P.+~E?4^복b1⒋[< jrs< At?XbX#E e}x*YQ9N_fo<_&_e"*|cOcdj+h4($wY yk/hH҂;.O>YqIGѡptZ!0X+rl%$P&O#w0|$&Ov٣hs@4b/]uЏa8hLmy5%Ī0GDW/G)p[y? jGRa~%"/V 4p/|guU4q<%a@7ݚY@zHL#nذCyYێWF&%=1H@nHIDJ-9-S:0Oㅽ2a!@ /tŻlXDaچ4 +N kOL< ܔYӈ]2;y@Oã cJ4b_EY+RT :>O'sC +;HtX'O>!' wt)OQFP%i/{#Zܾi 7h$¸G >7h#CM҃>H@>X< ]w\) g?@QVS:j|Hq{h}S<)OC^l}iIi=S 82"t ++H: +#LEtpcJxaFt0 d}WвZx4X<;%3:Gž "06T%TZʳ' y@%= +!< NaPE< Np J9a%6$ 0\4vQ1ŖAVF020.>!C~UqQޜT~9\< ՚eBQ7Q4嵋"OiYAeOc'^zWOc(Ԡ< !0yKT,kiw,8OaN7@\YH 4S/s+/~4?4h@лi)A7,נ^XiOnjW$lJӀR}pi x4x]"BwRc>b[a/}K_ۑѿm&sl%]pU +;6^ri=Q$:mEC1:_r"j],u Kٹ:LS*"ْ:e[ +m[%4d+U-2Ϩ{՘*)rRYN83V]@V * 9<jcL8EtQH +ojs^to(ҁE: 4ܰuOqT:smv6C4y 6PwW"^DC{CTtx b|i=v/ Voi1C: 2 i,KzihHygOoH4/=q ѹNU@>q4 iP'$ajQo%N! uizNcYCzٟ,0dvUl1+~9/ O4j.s75EEiҗy4(~ѹ{v"i;2ȾC?PTQe\j1D?І>O}; 4vT×NVp + 2IlgTria 04_6x>;)Gt!N6\@O{ddwv"R4u M+LuAhd9_J4'pFu"4Nų.?=#9CJ@OFWT +"SzidLkQ]ui} ! \< +lӨ0ЊI $42n Bʝ)Rp3umpd{x :}&2wP:~?~5xkcI{CI|r41iTSwFaN$`#3s8ӐD袖2zHV +1>VRo fgN4Li9qj Qwi#nChltyԞ/Ҡ>iz|4,$Ώi\޺p(ZXXgЭaqzS?[ȰU\:Uֻqiԟx O"h4HNtӆv*sZeQi.}āNC 0C4p@ +v&򯀮ѭf?}_۱S42 +@]`AX%m]1aDˮfhj +i*|5AMNUӘ |87KeHB4:cn/v2 L"R۬Ӱg a1(⍆'R ":H.<9g8a8g`ni@_ Sɩ i(b`ɀ: vBo! 6Á3d{]Dw2Y 9냄 +9\iuBDtյN#4~vXyG 2kQsvL,ewHnuiFfLtop4q9U37ZそFʰFu ?':J R f*׏v⃣$N\FN9:xlpP#&wZu[*~fm̧.T%=i`P^: $[fuCSE3؁G3NiK$C";}5Cb:XVz3 ׯ=Oax\VC: U*XZ?FK=V@tx˩jvm 3 +c +a5h7g%؜t Di[RZm40mY:K:'Jư,0qJdcZ0di̐yP ո7ߛY٪'J@ z3X?NCVu7VQ)qhNպ8A@ٜdWWs_:tt +Ki_-֗nU!wP2[.7]F^v#c" W2d(t,E2e .;2l"#ȗe 2 .d`deAFX+~NW_EvefC H#חcp1̰/c$,tL#t1,tK1j}ٽ`161< A|1&c<`ܼ +$?><9,s[V+WY=bP3x1c11ȢXQe%}Цk +4 c(|a$2sT=C 2 /ӱ#/2F`:$ 255/"a0EefˊޛH zY|ge_V"0IR3Z,01˰."df̚3fOi]f4nެ?8 HHe\9|gb0rgi# 1LRϒ5A-<# >c@YO)Dh@UUpASh_  +_IY<2G$Ց֩4[`*aKapPLkϴHpx<4#< " +"OO; O|Zj#X^Q#!=v.H#xj +> Zj` 3jA4lZ;+ƍ2Qv)kV(Zb[LpQrMO`45y!1L{M*f[w"l$Ɉ,63̩X B?f;A| Ŗ`,بņ gH_V` oi0dI茗`kh8~$qko5&`<gGXΓ-LB@$Zl- 2y%XJaǶ:t7WXt̜@ !g!CgKŌ48hgKg&|[helvꚅEp'gszSe l?A=bT,µ7C[@{1レ#R +5bY$,leEʶxY\,cYl#*AdYa׫,DY$dAdASټxxC%ۋ @[(6d\_l, dXX0k*Q,֒ BbAaq9}Xa`a&Âu17?,2PSvA,}pm,bQiCi&[gxWİP'0,_66 LM+nV1,!a(`d34,cE6dаE48lXÂɆd5OfÂg[ͻȲI6,kX@`aAijle`i1aѺf#5Xptlm_A+Phj5u+_zll+نJŶ Z!3]W.ӕa빢h 5`2xU07P^Eob +vz{U̿6kf%uRX㖀x {9^ȹ(EFב(ISFa .Ơ,OQ@r * |űx́j ɝ͜D]Da58 ir.S+ιH{}hiZ{}: .FD#UֈJ>"E{ ݨ: vtB?Q8os td[A@Q==tQ(ΉbBKHXa**]tOLz囎t@hfI7uT'?QVlu' +url؟tYDŵ|5PdIN`f D(r| +URPHAP.Ph ?:֝w?A[?щ0dO`>{Y _ɶAeuճD*OPI.u1.J<|)\hO4ʺCF+E'C:D\uȨd'&uWy]$|bu 4%ϭ|Kup] Yu]E^'tzO0+bNq9$ YxH'ޗ呈DNxyb{6O@∇Je[q E]:CPrv"Yx섕NdTK 9#ڷ(i'L<*x&5^؋9@AK1S +$Aמԃ޿\C5x9!z ` w(9 +f`^ǘ#8 P'0NX< %'Pj<߄5s.&{M m +~B?yD#b<X^ykö&%?lfn"%B/%`ԇ(%0ȟՊzX$b9oI~q gءIh/*6/Px^~$$rJBhJʹp%EBDGb)%|GB7N3MHآ"a.h^v"KiCb$V00$㢗ėwm/zA:*H;g <6@blDG\HG|#E wWi:XvĬuAˡ7x~E3/B:9 +k.W,BMHA@=z7⊇F[ +^j1h0X0zЈtF )}1#p(#$z1be1~e4`m_D^)S !gS&>[W\BojE F%VW"D4EG(R QDOv"tQIw\"S"Dp'()~uyQ&"Hou`JāA4"~q~A!<hLGZzWLjCnQ{SC 8hSg.C8Dl^__= a[׌{S<ȥ?Xz'Bq D#!̄#ɄV|Ƈ 5x{!!N>bڃv-'QmAPA,q> Ѻ*A')AA@ؠOk ڰsPqr>jDwgk>/:%:r |6狄 {>qk#klE8S7B1UUߓ?}M_ .}hq/L-}> Rlkf!Y? ~ݥP PqݎuDTZk?YR뱿#7BiH@%9iJ DFD$^ B6z)I߇_&@lA] x. -Edf)B=@\ Dȟ' amsj'9.A:e$@(PYŭ-\k.@ g D#+hr1 2~K]A̠#@b߂Q̀0@, Dln= ؤX]AKHqFm;l-}p`h`X?d&\7?LH@GгG 8$ȗ}"\_>A$D:֘C@8$xW2M$#h$&{xJ$y {A̷{kvJ![끥e='\z@0ӃI `ߕ =4+g{J9 A^~$D $h5!jK 20@o,,G;WS!07hMKz&G7׊-dtRܙGЊ-:op0Ah3M@(%Aմ޸,#(])o v%~jQ][#oH\& u|#xI{ïUUBohrAwvC`766X Nj۰D&D iW`im8HQ6~6l6PTɳ#$!#V-jc )%6l&l@l0l$6\q DkP v YÚc *V%FϪA*4k'd44< 6 OQ< ZHҰCPIp壁 Kh׌d4@O&u}2APĒ!$J`GF!"( jp{ 14hoikCMc.Bbb )'`YQe0A075\ꖔ3@08*7Y~r"= Q +. 6!h , T ` 8@h Xp6 +@B|HJ5Q(Nb+"yr@@N 9ہq52*dFIqsN"DhAvƭ!5>ā0U]UAR9h @ a>(d䢆-L]G2E^sę4$%2ѐ?}V#)N( JC~}EzpN% 1415=a" +FS"nu܇TM- +޻/11. +e|fA&eJ}A14fe4^oHR@Yƛ>E/-UShzozB%!1DFY43SgQR> |<\4xPA`\`A.@`p`4@%@t` `P` `hT *8  p2 06 + 3%!`LC + '* +kaHajj7$Ty=#XYWZwq&,:nn +gE&V]DI%L'h2/^N?4hxBEk6jZs} Ulat+IE*ci)hpB#QSz2A3|kE<5Ss.n}Do+s$޹"j?i4}|t]Z*Ϟμוҝ'*ќZoa$=h>C۶[ Cv&(P萳rHT/"xltj} :*QBZRI%y}%mZN?%^5RU։@5YzUO 2*Q5!g<81jnN02b<!<;?"?u E~6$,L=\"# EbiQ`{lxZ4j.F{Дa tne8ekƴ %,ul34{2R7􆡅WI&,iACP?yVxhscKb*RCJ|^'V rpW<+,Lb<QGFjafsm ע$ʣ>Pʯ*:!(! 65I|`ȍH HE[IoJeuKŪf3~N=YJx{{ 3G7x uP`8LC5 6RbTSzTZF%i*T{r|r]j쩊֟Z|໨~/^OT.Q1Q-~}LL?ipeM(r1A, 2!sP=!xMkHۂjFS΁.,).oxP\[x]-Ҋ&]l5!q]3]4"I-]Zl\>GsMd.`A|ؐ`~`AdE(̡olx^'@D0ØR\!:#fhoMQMhFir<&5p5+E: ׌eJ2\C=U@U.\]^EqTsLrǐDزquVL.Euh9DL*XoJH2"SdmFq +mB(e] IcicvzV,(~GloYNTgK&|$šsc3`Ñ_f>r\E8DSC +ѽ8H,i=$A'lN r3SA)[u k\RdUs[Y!jt%eTe3tЪ.HLNcR8ut#K i; 'Yς6C$~jDGZRo29"4Caiu " /r\*bSbr <$~ LH>$R4.r!'H2B-9 Ŏc'J7&zJ.Q34;&x5x1b0jU6=--$\ O/;b$1ZXI KS͉&ɠL'|F: \Fgy|jU SToyf"7 t@К"H"LQI~<2&CM 6Sl#VMT)Į}AȀg6@c&sX`<@&) ۤ@72yIPBuzd=s7?yL>X2Eٚzޜ_NzB,de' zDA.vZ;Q6Vg@=Ke |6޴"]L}2NTH45` gOimʖk{5&9OC<^o SI>}b[:W; +s2Z/<J*^[)niX籃0<k_ ~EPl~m8tw:P΢4Su(`r)xOYw":ws/zf֨L " "?wl؟U`qG4?o=Q꿟ZO1#aCni=^,t0?b,H:mx."C (vShcJz]w^jPT-ލF?jDߺ.Zb/o6V+w (6h6~ˢ/kQݼDKMWRA7ck*G-O殂 + = LP⓹Dt,ch<ahZQ E:@6%zEݕR"0݋Ġ]Rdoҗ[+< y4딻{/*d{@΄[Մ-]qyKQEJ˓n* }:.3. @QFI[7Щ5Taض*gtU$Pٔ룼a2Sըã'Ӂ#%[pOet#7 +#y mΧ ^K >50TC,pdjݤcs;KMj.T*RuQWA+^R-&DQv"_,pL̆sWOì* +"_g$feOƟf1dx) +Do9XVxhƿaٞ@tAr?F*XD xF.x QEgQ*yб,FD$C.S*Z#ZD M_1=N- C  3m[WgE*3tJH& n>JljGh1lhK,ԱVDM`[Elz`Y%2L44QV—Ĵ-%j&R|6uH:(eDiWݯ장,25T%!V>**t)jiN~ҹd#2\0 `(wHH&2G΃m&7F5{ %+| + _Y q6K_md/EbzI>5?Ar](.vfcQ \AoER,jDf_}&G-l/mqc>szTÖL ξ9]^.`pD3%C|`~$+E +H3OA9=\6*Ƙ>5H|DU0](c=+W#fA^S N Z3 o0@I7)] +3 ~XBA}nU6utዱE0$Z2\ͯKShJf SBs$lMk1kCWOƅ;]KJoʲo!쐂RWHJNX/,~U1pZKEA;A8~Hbw1E0E*8-i)"Zb^ENA<ˏ.L#9"*Ad>\ f^N)Uo71R;P#궣*)0Q`Adl{I:gY.\ 0eFNj2E[j (ҟGEkks!BdO _tVV k6*">Z,L4ʐ (c?<ՄP{ +#y$V*8oElwt{@4*px܀pD&4hzziT6t.NjWTu,jkKw+l|ݏ~OwNڱ1hq=:\pᒛ{ \QSwvt5v;r;)2~j[q1tXk܈R GS)[pmk;C(s9Qk,/ǀPx9v^,^)B˛"fw. 8 +%>DFTCFB# ψvA,S]G)/~>S,vDdI~Іq_cTzuC{UFqe<ԿS3H<2n05S䬭`^aM39dPy0?ίhS|؅О`(Wenl-ҵӊw=F f)X&1Gɉ@݂XL(|Җ| +>[aӿcI#A vq^hG yVqmK̎S!":EJ ˂~xcLD_•_s򘄚Tйt E9D!Äu +yI䪅aO_ ]:Db{ eJ ׉/C0(!y?2>c9έu@+ìell$t}o []NKM"o)R_Xﵵ-1aPE<)+ֱx\bhhԌXɳԃ KK 9J ̟Ǿ뜯h=΁ik%^G౉ %ml=BU0>C2hء쫴?'YEORv)HDѴAS(K8"`]ajHHQ!Uӕiin(5APa%rS蓊o` X76u<ʺLE[吊N֣{M@ +@W$7zǰb]3rR` YAd,i APqsc=ww/+M}5xJ`|:兊BdMBp6m9K7/^r_!AϽJK{Ҷ!n C^N ʔ>v|rEaË.&w6KCPA.(EO!↵;(!f$:HP.`ɱh$`<4@o.D$rSˇ q?$AI,;<5<WHT;G/|0,E"&9l0/FfFv-f,96O'9t>}э٪ ${ZS^QQ!ϑe4Xc`eG +dEQ\Cm,\B=X@,|_QxtWN镇MW ф]LLP+#q\I,@%Jxf+2 ZDi%H(uVqTU 0V +3UAU\x"|V)H?êm ZT1L *>y*˂g*Uv,!1wIBxxb$]ws"̂&L{Q&Bx؅ rBÒP Ll> X AF ! +2tD6XSW0%a+0 )T0)Rb )סQ^TGIoV0FE:@BPBD q(kaɷ3 5xKZݕ;@^XZPZ:JNLp爼L)'٦^ȮQd3QAF=sh}SDⰯ)kՆ4hJjK|&i~w,ޛQX?y1LЩUFr3~YLXcS*?sqg{[<=iM-Ws)fdF[,kS<_Va!H̀ +5`rP@? vZAF2M.s(M.N-0:7kSB|iǕ0KEAq$y e +1iv10= +d)e*Sr{ۘKxf?i?o"H9'iń{e h+WeiʎԬfwE00FO2L2>'#}(beϦr^cZGPAȇTg1B `6:9 eyV /_\ \}IL|Wy Ot2C!`W?ig Y.2Ð$J@ 1([q-6[Ŕg >FKK L7{+ b>Il!,ń%e$أy<-lP!ڏZDKdmLWX }f=XAN6p>0 "!qnoP`&[ƣ+P4*O;,$?(0U8sQT4m :'4 h2g[ObؕǪhUyA"~z;#OR19=p YݽpǽYWBWml_ q]~R(C& nu-7UcsPgDo ]mF2)|U@$?D9ۼr>sjˁd1] Z%̙"d":Y6u G7'kHW΅:^ ܩU>M_~`CʂQ5,mJh2BДʕNq3kJr֢ԍ TmlQMlS9%1|@w6{lscYꦰs%pS'UYC5 {CKC V.u\eق LyNܤP,YOI61BLIwO ^,XGaKFT L"-!adk@YE+Y!"Lcx j7:MobiJD|@ϞQ:iٱ)ӽՇy59)ilmq1&p i#>ydfT6%., `G5Al o0B+'S$l%bjRGXK0(i ÒL[ V [EqGMCrG-rx8ĭgSk[I +5f bُ +!@!_\k +1] zJReYE {7 +G2?4];ð~ZWo}L @RGm)qٖ+[sTDµ^BSR UeU鉹L),/H*d!< tj.X}/T)"A,bIQX*9| u|>^_5j +W:CKBܴkJlP[7"| +[I! |w 5?Tϻ`6HsTm_'뀱BWɟ{ +B}d@~XR/g糚'؇d  &GP?L Ct9szF,fU\ѹQ%R 8E\eOC.e7:榝;Y>޺?ƪYWߞ X*T FEfruV 1 +%L-T@vV1ā'Tz2 I+8&`.!r\{B>|t|fA# I"6?Ŝ%^$O7R5d] +0$JҪ àF# &6!.F (T7׈:﷤ +?Q:2m\Mh,E9:fm[$;%ԣ*z#fb"j=WBy\bx!*b#ӵ {1H`Eyv=_6&S9[ d4+ 7~$ +%Pa,Ktņ5[=,nD|0z[+L! |c)VIA`{0vIrLˀM\%iaT +e0%w .HUcVc}PAFjf!z^?(ġ3FOΟEac?&jCy չ>f%%]%T~@uNqU#cKN,hjַ~3<;iu…] +*!T*ĻԈH̘GEUBp+{IZLf@ْ,Z ,Z"GФQ+nwZ`_D̔Jw;ؠ \zkZ^EX;Kd⬸B)8L)Jֹs$Lm&ⲃ,bHUf Bl[YLj!DdHHŊtqSWgj5/?;ۓfTi +EfciNJ[=0u?MǧZS6db5 _e7 #ddZfe9jt𲧡6;X|,^f ]9LPBu^?LT${)fO|K̔3P#߿}1q.a_pYFkN>f?v03 XPP/Df3fHU|"*D zyM@f;Xe%02 +O2c62K"!DIfP+ ezcYí8B2C4d&oX23e&U%3 \fw4}Z:+O{Ct(j 0웋8|2ƹ*L`v_ԨBGb2jpaa<fu`:F9`VըHIa G133Cr̘fȑr6t=5j4̈1ӔEFzaR!LǬ{'3:^̕1Wx5SD9&ٙy[*BCfA:5ˊk&E̾ffgR$qf6g3g Qj9jųA3Zh ^BghȊQi?ã4))Z2hZT`h9 5 DZRdtvRqiRL3O&4iGΥ?4F;iGY5C5iZ&$ZF-+GjXjΩqdJ9 >T7jSݥA?5j)2k 5|*՚֏mmO5?! +lמ<_]8"=:RW65>Quƺ=a51!@50-'NXFWi{$ +˶er0gt71&QC%ŁXި1y&Ř Ǡtn:g,}u`s5-Q#e66jy孕62J٢φvhˏ9l"|(1‘-Mlg܄iJ$!Ϧgݞ-LCl5Xl9wDٰ~^(g- Gv(ntr?[mjMdNQɣF񫶊imQEQLG u C[nmֆmyӶMp.4c-B5Z6ĪiKk7 +v>qq^hƀSRCEۧ8M(n)jPMԨMZD+(M85Aw|,9zN˨a_CKhM|cGk^DDΤ H]EݥaxoNKxo HλQNǻwp-j Fasv;7AIQO;D U\*}}`p +O3< p?uē3_U/O&9Mc18̔ɺ㩰GI^Z.oyy"3x*!=>÷I\ACTx `PC$ +B +oY8Hxjjx-P݇9AMb'c QԈG'5/⭁5&A͚hgD'⡣D Ϩ%~Ɩך]NhǛn4~x Tphx Z )%ϦNP+O-ρQ+4љ;τy^j2)ңJ46o~^Zǥ)54^C4PI izK5pҁJEF9?QC,z}" @H&j얛KMqsצg "j .,P#@T 5{wFs2Q72 &Nae7>7B4?q+I~V&d&ըRA 5N=ocEPCVt{9 UB5431oB=FR@_Qjsz5P ℨ5ՅzVrNOJӋy+ FP#G +jTL275$2FQZ%~TPe jWPPV j(:h. PQ+]W/I@7Z7e/OމȦ= y$=)SmmW޲Pcȇ)O<{/n2Ί={ C wC z6Γ_RLJ`iIxn/Qv5Fo,j%dH`+m'cυ5 5" +8^0|5(j4LNSOj9}jHo>=O1h806ԈEN}jP#lXYWBsub>تS?^QDuPUp7n +r_@gwxF[1P:J3[@7~axDC<&D 09??g @L~nCo7i!ĿjSP#)Ga;d j\Gn|Fˡ< -5~&~UQ54/`+ xg@D <h^,. +#<\S]Ry(01Ѝ5p79x\>l·Ǝ1ݢ*X:tiDø /aaFГ AnӐ#X&a*7SF89 < +Un?$ "Aw9r6$i  +t ( $/EI-Ks FzЗq9 r  k~`,YWŁiT )t c*iQ4+ _ HKX4}$5Ao5i!$c,Ap_!E,4T\NJɏ)An o4nNiױ2Jy\bxJ gP'A~,L=(:;̶|Dh 8\2 d$x46SG|ܽMa4lS`W4?Gah4 +OӀJ$D4:kpSj< 1x"U$XWOJ1hqk#AC^h! 2z_ nHOIalB m$A!8Ӿ$H-`* $#ʁB +ȡr<~'@JWq ~fH +@<5$I4R>Q}MPa JAKO#`-{ƠPd#0ìyu7*y'=dG}\z[p6OCH˒`"Dɖ<4=M4t&O6@Ab4"y@r<H:&OcAMlӐa0H ?4TPAya/N@AHE$AA+P Ġ`ICN ;%OP +iȹzwF$k=A@X;" FFv"EJZU(1Ă +.#:$P1'4(ELu[ԒQVDl)l8.e| T:R&(cT7^QB=4$Nx|%@WL; }+Ja;4*;ܾF}Xdd(Ȗó(j4)$iAiNbTp,ѐw OGvT$34i8T0i\]T=4:" +0< P9O;7k{xω觠Jם 4R*HeT 23sN$ō `r>hi$ҿhw +4TAN  +z0r5tz0m: p+ +b +^Fi6T0UքuiuVVPgAGvڝ%4]+wzn{ +`Ӑ714l)GDIF Z‚(iXetr`7cQrI,8*-k eF: &0*+lLi43kճiĦ 4ro/~ zm5Mm(7Mci.?4; mMC^r#o/X}ۯqXfƷt v{FB/F+M#m8W EԽ`QPilx8xWq6@5윃I49sii_pd9 pryRξ @%|oFqW|޻C9 T_Xl?_4{X4 +iM Frqȗ/=}AGr/x{4 md ( |O5 atIC9i,ړb%*dPHֱ+Rx*lygqtml+268I"u< 'f&L*DlQTG!K^ Z +sD8,qeT9)h>e!c|DƆ #<nPvFL,Kj.2|i|XCy#My'.5O{40E55, +Ͳ.A߰o\`b;Qnb(Xp(Gu"PЁ]-[5Ֆ*Tᯊ5䢕6$[YRBU.Z19b 5K͔Ҽ5cfUÝDZatUc+2[/yU%qgUB-ߊиz՜Ne؉:fg:;AwFu+ǎe!2_+~KQݼQwgbϡϗĸ_]F]R.85'"vHDD8A2:ppPZkvN3s}Ec9 ;>Y:EJD]*s^zUԽaO^^ŴE\sp,Y?p3BpXPF'(:/$TTyW(A^ȗEdh@ɧ,όi V(,N!1QpnG.ltN?c6HRN+,Q"Fa9#/9w$iQky|H ++j4C t |D~J9f,hM‰B$b ȍ%η\G>u8U8n(f "͐Ne|AK32|58hfb 'hEЬ|q"IZ O$IbHy<jeVRe +< |raN(pH'ʋ=XaDI8:(5jtKLQy䋑uNFlYCTye,p{Lj`RȞhd؊_O8;*if{$gIjI I +}lc(ENx^*٪f2ArMDZc$ܰ1ƃ VXLXwlŊ}.C\kLvqq=# +I`rW@Ir X\H~ Qg8Q>(;מ;^\kgeWL/6(cPpb#YM&*Y![1i4hդޥ[kb_'cb%8M0Ѓ4Ze"6bE 9J~,E`MxtӇZڎՐ2 #qTVN2m EGTM"'6t^It8Jd Ӡ &"2XP8"\ECC1jfWNPDZ0z3 `OU"LAa\uȵ7`/S:8 + G|BTj.2uHUŠJqdUo U+j=f||&(S]j&LbgxT.;)$C!>ʟjAX K@zG!*T=|&'m +ѡM"QfPFjDC0AQ!R&&\Y/R1>5%'4T*AbjBy+{ =L!a-M haV +142U1#D"?-ah* #Mē- +%RB*\3S_C, QH%p?BCDA9x-3$0w9=#2<(M5P>#2TpSI!H,&_.'kCkĆB묜 ^9:=\jBS4"SMЅ#B(Og|w1dOEq8TBYU 5{KESCX yUPkaZ[C >> %oF"c5-#\vMAAPћɌԃ8\ D)4ZP29h{-_ƃX$)LkΨ PSp (#*'T́-T᧍-)hAAgbK{),Gh|"<l9x\1 ]wQ̉Х6*O I$qocȳ 48g;BeJX:mk0 ϢW֯".S$?2{(285u<;lH^t݌|4RcՃ'V5kkSzgqެK/_b`ow8*̚)b?ocX|ZZnⓞMk-: 8~!3YU}5fP֢ڜ P̵D^Y]M$*X(6ܛ"bU5'v rU[[7C{}x0F0ZʮozmgLcZrY4O{zaۻf\] UEAS2Y _ 6d892l' 2*p  B x2:3rvvY07Oz +5$X}~ onA;<53,dјDli/nBN'L*,$z/a)*&)M{؂D e 'LB=Cxf(ڊx5< k +|<)[zR;6sR#/RH ^ejڠ ?**Ajy17,OX<}ƥlzv>\^x# < 뷳BO;m:89}?T MogL[ݼ'g[0kqBrPhlSઃW"\S1W5@G50A> Eu|M>oWRd* 㱞 ,cUAͥ4j;:֏َ>I8T:B1GV@ȰbG!BZom7ќË6bW'La ,>*Qrރ}Vִʬ^r=}i{0\_[78p?]'Y|0S+KMhtiNyxS z Fsg# Hȶ/)le .W0PK<'}T~ぎ$I +?=@d:'t7u&WQ̃fTl|6* +niro +FoEj LQU)l;  kn~Y/e֫$xE}famK2{ptda %/go)1ngy] }m>GgOJ@Y%%oƌQ N<ޣpc7* 3id +'Zv.Oy*==44[#z<6TQp7e #/@ysQ*e k ,TDlpIM0/)BdXӤ&@%!>1v̰U1*9alOyuӎ́Nv62x NAn>35]JX!UZag 3Bʩ5}(Tc .GOfQXXduO7 Ja*uk<&S&#;$eYOQ'Y"ۢڰ'֐ !rr.h%E Dwأ" )po_WXR& QJGNl"h| nE_"GMg ]3Jεi?^a/O @IGZĢ^6TlDg7).'ՠgOr5tAjK;eؚ754tB-[xC0cTCrߖ5s0\iLsL/մ ͢e#eN)E8-+}!8h]64B=SxP!7~Z?aˏs)K(;'%0wnVp%dL]}KJfCp!0<5J[Տ˫a)'!@7TZԊ*LQKОe^e_d%yS$x"Q}ZWE$߷\2c,~ +mnF(A n@c4l:45 IU<st+~^c>%5aJ5z"W,  >=ў՛A-5{Y~NMqrC84hb/ +_۠:[`iM +\f\ ka7P+~zp?:|r('Ap,_-@Pv {¦fV-dݽPM!F Q؁NF,WLV8$^€լlAaƗT'AJ5,2P5vHePNf!]wC %8ŽN#s_D:hc|<-͜^H8@zj4U,=1TR`[]YeqFR`&Ls<8#]p/PZ,Lf^'M;{gCC= L?(>hL +AS³*CYKD"B7gtܩgc4{9Ԫhh0xJW/8uϷG,L|P`-KgOTVGQQ#\4-E<(a_1][227h;MjQ.R8~4ڈDž/UAS+SOXZ?MWeMe~p~8an =lč%@ +T?Rdbf-/o[RnjHtÙq"&|0[3.%6YiN6Qw,EE5<r"d#NQfo[LT84Mۘ] :$^'Жąe(. +d;9 i⵲@NCˊ+E#:m*hB{G5xa +$P}$z1I iWejftռwSr{ViƛO԰Y龍*e3"lj#XnBmq,I;MsپZJ5JE+Ɋ 'B!!Oh]G{HA6'in=[W7B41#'!~^*Bg;vkVHZQU B!icиTK@=y^ێ}f[S@\:/lU!>n@ Gj-jCpz)b¢M$m{t3A mH[0q/1aGbg>u]@/ |f9RW~\ [Tc=JϴS@P|Us.ޘy&L,i͊L Ih~iuRQo +Yg8|OڜKPQA2 Uw~f!ډ EFR2AH ok蒬 T:v D&I{ufPb4W +fՍuïpψFz#DPAӅc"Bvv۲&ouB@~e#_k{AISͽ`KFh:x=E⭙P0xb8!B'wFR#w0K=0|tL;$yλ,b۔yl;~C{t"=2!wʄpn]88{?Jθ0#y'#9 ce7Ž!"̌_*x) +&'9f.uڣZǑS׍(3 +^j{; C+)av iQnϻ(b +BP,*xǺ:N6Me%,i?S-[t4{Κ}\L nO҄>y(r1٬n볞hM[mDŽzU{P + pP %$;=gGΘn=0\֫C`Aok˨u +QQ6MէDg'LZcdSkPR<^v; YRw^ZM@˙޺[H׀s4u۸jMZ"m'el^٤$f*9"@v5*E@@sYԁ]1q})Ur;]DJG37㌃2Y-mNY&6f`Dwo@ CYM;6 Mrx;Zu0G^,./#rPi9 ,!2I lEa3kR4Lpi.ivLEK'7v 6K5v̵qe&ۺr]A)8Kv`Thv\xB^l?V /|p;Yd\b G] +SyQP"=&Q&GD?ޑӄ~CYU9_g{tq٥O++R}DEwge +YGO8n][-)TG^x HٔBiejsL6By-%De&93u'n+8I "UxwJD5{n#"h>k=LY6&=t~K7OX&?{ T Y+Qd.0HVeI3{h8+uE4> =4EƧ/lx3W}˧rJ#ӆ[^>U@zLE NyץJv b%;\=aoτh'P*v`~hkugѝ ֫H<֘i$*!Mμ_IL&H`ϣ<BA +\a^p2霐s,TA~yY^ú8N F3 ʼ*Qfǵ< ׊!rvtYpz?ո=_:}4_+'lg[,&}W=J[ +Z5V}OUl~pgWZD[3؟E> ;/{u #?+ {UuXUVM9lVͶ +%e: d1kX [5„2N L&[ya70YBܳ# C=OL"u;Ƈ_&[L?Ӏe +Θp\J%7\ЅfxX8&Lݐ̷K h #+* :m J̉\#, ?6~4g'H# QK8,f ^* N@`EW8eAV~E"z{`F& /Xc kc L3vqwʫxWRXmjpߚJ`JHX:%]Ɯ#&`ºN-&vGJe1 ;aWdF&;;tLٙ#cmq-V S U>m+ D[ ĀQjVYt +6ډD=*af~2WC@i{LɵC: $CUDw*w?'2gL+$ T@ KmQ +Th$H <=9ݷĔYNYrlk' Ah! +9.N}L-t bATKT H8)AcB2~oO<ؒÈ8˸#ܥ60TDV9Xð{"40c!h*R)\uĔ<` +LG߉)V%:SDj^xA|DoXpW8e3 ^!#7E6dZ65~ +<'R~10:A[C Hv +Wo3vD}Kck[Y nB9L4gq ?˱!29 t&d,0~J SΘJY֎eIYx_ q=ђJ@PC*@ʝm6Y(X~2Hg!sva a H Yۼ BP-'XO.Wy + d@e#_8S: #);1#2ηU!COĝ.2ى3]j\!VD%";}W `8F:v^1d̷[EXʁH+AA x Ƞ^Eqaj tށY}Lxj*uZe_zPu|t:Q2CXO4}_vA /,ru|_վd`?&؅wT&~Gt/?ޑ] 8_LpUT'w^qSRv|}w!dup kthGlSR=a@:asُ<_g]e[H fmE aBF&)!Tc0(E4~(IP g4 +i̮QղUhG?c@H7A=LW$ so`o=Q`f9]@ ژJAu"۾<*ؚU%f +Daб8AK c6rCb"aĨ+VIҖ07ÚlF%L0g@eD̕->HQrL> Rv'X *rँ#rTLh5D`H0m\ 4`0&̚@I 0P? 0Bd0i +`Q**8ĿM4'"D dLK.H6%H('Px}C}AQ1~@m|GQxLQP_%Ik7}:{s=&͗#Z]ȗ?ӻh= zÝyLlX/F^6>pg(|᝸F^);X!\M.i|ʪqy&mz[dwq@%6yzVտ0|򒬜6-0͍F^XOf)亦W_?r)x33_a^ +4^,i4 鱌FC IFpYƌ``8o%Y8a3``,i (hnIvr(p@سnZ MHN,?!<{ .^W,>wi__ +endstream endobj 22 0 obj <>stream +tľr],i]uAzcm+ƀ72#+oìY +iCYW*{OF- .%@hyN)h[}2:dn,)D9qfdA'64_aQk,c$k$-T@dp.r1!n}5HGu3!$@{XbMD*4.7WT:Y(5Ғ4*`P+ϛ0o:}8Uz~"GDǫ}NEx_+gD-SX? \rBjzb@G{&$j5k} fP7T rPآ0F>,&@Kx}~'弋ӗ5קS+GU"xEg5 3AH.KOkbEN9`Lf_ssTOF*3AB?Sk+13dϪZofEn^1s+ +$`Xަ]kSo jDlj20xމUgjOxw#ߥqPŹn.e]崠:ܶwHW(s-*ƕܷä{0*[һ%?rO~3`5˿(޻9F{GOeٻUF.$SEa0gH\xt0h4鮿j?[wqF;f}cS::lR%51O9{(cvY1̽4&@7ZF`eb4vb#7ݢ?A9v8lAVX;o͕tSm'N$Ʃ7 +6sUQ=)Wip~m'P5`rp!֩վd{,vY:XvdYqeO2ö)ѥ{uYde,'N^Z .'߾ ` [`/&vK av\>Y%ԁӳ XU +y2Q!ۮӔ7t$dYV|Ơw*'w^ċy:C0~іG-Ѵ?Ƕ>rpqLw0u#܅Jw µ֧J\뢜\$d{}9JQ#tFFo:.4v +ٰ;/ i;فkn闥m{iI+{s$QZ \~ Zr͙2i_e҈K:;ņ A~*?hN I-pUx槈-.'uO~lWO8*"A+{[퇱%GBFD]/L$(#qYvcL'NTʂ |9(J7%JH]+ YݾEJ? o .zfg`NGhd +sP7/LbQlΧ<.F/.3-w\Pέ:F 85z>CcC~R,R0P|avsPc( ?\8`L=xʏ·nbic6RqXا|) )mJr_[lk&#ZFU,;Ў1RB ǤZu y@ +N6䧸_I_(#}_/XpZ^XrC6[| |}HzՋ6[] ~Z P!-CDFH@,u|U< }L,_g:~G"?B%K%׹5D$vlvJ&= 4z=T|\X]|mWE -*F#'իzpZ7*[[Fa.P`zٖ]5Y:;xH6tw_nܮtR&E;`X@`z}Da,Yx&ZRey!K +L G? Z(6w[]17LpoPt)S +# /Ң =u|9@(_xVh~x_LD9gij +4ZP]^8XKʤiV Ձp۴%7MlEkhB>ƢZVS8B% qQ|&\'#ޑ=nފ\z2Զb]ښdwW`.p Mi:>rLz+*eFh>uk? NJOwR +'ododxak&E ѿvϳYRhGaIA7$ e%禨LǃF<]N>8 q&* +0))<[3!|z+G33heu|yE'7g7 +̃"|whf܌&TxʩD2z` IiH?!717 F6a +ew@$Pz+6{܀IZ)@E^ϷΕgO;]ᕻ BZPV)_ΦBeaB]H"C7|޹ӆl^@{/e3iy۞xLjS;fGTZnl<y]8<0G%_39Usg3]uC.o%!/nI@[ieSq \' +3+vz,Vo{W Vӄ>8sA"nLU@,bOxXwuUƚ ZYcGI[哒 4K;so6 7d Vv28lsd?@~sIo)q][Q-ҀYB Ӡfu$9f|ދ22-SՒ.ŧ8YEm‚~vş j(6A=L/lO,N>R} .$B[H3 CN5&l rti_80Tk>/81?@H'蓍JEQTNN{ +50>JNOu *;P}~P +1,x;՜T W%F=W׵%pRGASlɘ.diG r +>\ruGv^APV^Br2xSF#:skUY@ ;o0]&Y!`PkERAJybtMPO;0"#PcX\:$bZ@)6CEgI;/bRuxigLFduL=hN'2ё1jk粍>oggrdcӟBJoTH5ZFPgda .E/{ Ls_^h :Aʴ\rt9T)՚Ӷ9~YlXy'lZmEw_"݊>gHw\o8.RguL^4/*3]R,D>U3ސ_+BCcu;D2cwg^je +;qϹgT]:+gaQVu(wO?e4,'.t[ +W$o,eVߧ?1e5LyݙGEŇō׳q7\$hrymrno#P)%Y@INY^boi7v9†kW +M0d@`qu +5Pتm8|.D-,L䥔ȉw2 8ZPw`G@|jF-<2&I2| P_s2 0C(/ éNKdNŇTi ࣭ՎtvT?6^cJkvb`V0DɷYC-D[BTz9${nL"ă<(ʢj,r.N,5U*,q+Six iۡf~3[>R̡dyH .dCvvz +?"f{iF@SI|4Kr0u`7otk|†RUZQ cf;0cG*h_*@#'VU;gI>8EHB3G5e9+whrL/J5ˆҶ$REKS:SJpw[#do1 5*=Tyڊ$zN?~QC0)n~)E` H Gݎ@@ d[Aau0!Eʺ0v\EsE?r[:;s5B">'/>wgRII-Iܒ\.C[ߞP=E>?y^J5BN,mU32|x%`3İpj+Pf& *,.-e~=*5H%y4Ƒ +/jfJW)ebi&.ff;drshQt-qGؓa`ݞ,eNxh&0 ›hrp;Aiѓk4h96wg1> d;gc 1g}sIH}lr5̬_Q\*Ϧp 5#Kr&a׼>%t60/Uݟ(aGVc+aˎ0JEf*o )ըP)TԘPҐ +U&dWHTG{L9R 2T!<п$ݹg<$A.K.Ra BaqJC{Kvn!|: SIARBxL`r;=Uki5V3 9HS!JBw=+! }rw+a B\X#2Kv? kBDH+3[Q,AZ')$„IɄ<LȲ$%3vfUkןN6!Mr3S>q}ؼ9ƍCo`{txom@Qu:KC0 w$/߿oߧӮx+@'O_Dc!6 s o{wbYYT-zz^9{Lw +r O6~(}#ss]n(voC{uuU(IW0B&;TZՑm*m2ۧ!3X{]>r/PE1iHs`1>u>RO~|ˀvM"kMݢB״yoqp0W*mfU4oE%Ry^I~b Mpa[]_)uU.oQ-jt-w2yEj;r1؉4NS$aR5 4 +Gu3`눧2I Vq"&%+T‹׽Tmhç(6)DR)DOբIS$;pAeZR53d~EĜ(E/Fv8!9~)P)-90gRq'ا/T AXF +l2fag[Yk7W~&mpaˠB +Mnl_w9l^\?ºqbDttAid(!MG0(S.m4 }AZRi[l[ע ^ +[&A,ru` +p#~`@s};U`N#omd .&y jtپRH..@u=I9Z`f}O"u6F{aaMб6(jFt󹸘Y&P"[i)hV͸|n`>/"F} ]7}` ?LWp신,#P#`n_!LE Tp$|mV_vǛ&;] >C3Tb 'obT?WDnݼmkAH mZĂ'*gFD͟$LooJE{NpCm%Db&|DXw7 .2Y]s-ͯ7)סI9Dpq/WvZ o}Ep}wy2|}LF1Gۧ P)iyq3\Cs5I3(&_J*_<^ćk:!-V-9ՠc V_,]g=/,h|.*N\dmJ&^RX?RQ9v/hi"l>…3 薡`u&0F ;5iT<}xVW\؞plÉmWJͲr}^|[Pi^mҩ.Yw|O< W=+7naْX*-hAiå'&([ +S"rgI;hvM3=0FP+\qhA])Ze.D5!MGaVKk:p3GV ɦ *EoΦxik5n>;U3cؘmQU,q~r߾V[O Yyk-~i-X<'Nk [z9 +:9_ L,:=2*R2XRI!:mIC)/춤b$݌@qVyK+ƄJ oLmV'ԣbUC}D㔥NIیg`n,ȤB JuM8*yܼ>V>cU!¨J{*p;͢uj` +So'A ff$;9% ;@e`Z@,+5FLEMC` yzus8yc7; U)dZV݋8z΋-ie[T]J 䃭Jh4͋ +74Z5g\Z_B2kQuVcLe;/^o8'8sN9ѱ4 YZQo0נ艛Jj p2Z N[z(n/C >8#D *~kr%r_d +=E%z[H!66^Fo%l1H r.S{SO7Z!`Q(+*`݋AͣlJ̜6n'r3J_5l$hzJ >蒤_W dBl|MIC%{F &}K v }\S50T@{Ba~GA:ګ\zIhü 0BR +rĻFː}7/XLQ PbS[z`“8x*p/4N:)+zõCSC4mTh+m}dd'_m۸զ]k8O7ʡ&J-U82YUMNWڬQ0չ)Zl)UBRE*W"4VL hHGWŖOp*0ƛ!է U%kf&*oYU\QgDXCabv' +EG`UxPJ ;;$A>ɪ}yUDvVj +X[8-+ UynN]VRIQWa]S|*j!:؈WP0ͥ*&) +8#H${afъWax?*dU04$C*r\f*œL|ȫi+Uo+c bfN? +fF''5;/J*Щ;9%Nнd/h͑a݉qnediF$FV5gJe8*6Y=keRrk.QZB)av`L9zS)e H^~qt$y2÷_J)y.btC/k/],W M,1Y {7 =FT*ӢÏN갱/ǪGFq<, +.tB(QG@HⅶX2H8ѻIOVA6ָIrE$ԣ ?@.y;D7{0 "B)ΓR_{;R9FL`Dn\Щ;L8Ae`c;~u""1d^lnQ:Td@VFLwћ^aĶ1n%pvR2!zeQOji&BۙâJwQ^#3(\|^+ %a*ҹӅS52s-PS$"F[zQ}$Kg%tŌRTdqPl#ņFr1|#\8=&6Z:hoƫVAsrt*bbcަJ;qjU.tahFAvmkAP +i}D1aAThxtjtp~{sAP7F2׼qqx?:8,4&sZ+<;p2: nwQ\< +WB07Ց館_mI~7gl`"O>F/ Z< IV #`[*)C}&(f+,ol1=jx@4la* +} +*p OG34NK➕'ϼ1K_bnX?vx?z.ٽ^cpLtG2QZ/]\qi8[dԷlx ˊ,!HcQ1ċaCc#劅ϕv1"OqCF2bxW9?D^2Spne =8 +X>^C鼾k 9,ZA?`3]JIt%骙"9S|%n6V啞b\EmdH@\Xf?so18ZM.\<дQxBF؂qI]ŀ`ctB!g£2i|;ldmH_-6 p}A#זXAaP,H rgm:P7sX!XQ4Q$Xטr\kHxӄBʘ\4j"#!Cj|WhBNj xhױ3^h<3sBNE%k!`1H\\/o؈nqNkG-R?/m{j|.襎l|)r-\agF \dWc")S-0ª(KhkW +?)#E:T7\\ P(>NqY8V"vg[}N-FzCJ_`Zy/SU'PDuSm) P~R%WpP?2wxhMAĢL-y.' 7 "_բ +{4hVY6H=SGVך6#^GmYK/R!Y-EF.X3Hjq = 2Vb>SKcrmOt&nj?l&l]ɾzU6ayI'3j4֎"zڨqxvH.vn['>^,]%V >^+xM0=V,5_%~}YzZ"dok.'΅/ڑAL% ƧQ^>.V:}޴^ǜ @Wȍ1$(Yc(3G,vO/DdakIK5OYclf^Ѱ4BOu[ ) (l0ud\[3j $ZpJNmng$[Xr="YT1β^$9Zbd6ՠIwy@ : ڡ;A+ iLޖx$Zp#rif:Žzwd}y)*YR4f1; ^N:lƽ412S/P4 HgQ#E HEl#cE/5.CARcM_lM%$ /5L":`wP, +=JgM6[!`ѻQC/iATu&#i:KBt!L U[@\zgi +n ̺/uH"`FL5Pέl>ak/RHpOhn/d7^ n)Kk;V2G%j^ ;#]|wAD&fM };tm}͙DD/Zp@D@$ICZh{3HU;Ca+\.yH^8_/A/ydIᎶ]!&ZC4gU/^F]mNK#[43IQ\>8 <ˤ zfE qx^|:1u"3/K0ا7AVu&EY 8,ˬP  [< FD6_׺u OC,[a+uq4C,R%=GdHʌ_Έɚz]ձ1}tօ^ heyi/Z-Y0=0StB://X*{zΏ+R&1 y*l18.) q52oQ +![t7WH0 BBJBj' %+^cH ّZ@X`!xu +|O|kZ?i1ceep0;t +)QٽMf)P'|볋ˊԟQ +#E.K݉0ܟ2CKm +9Cz&l1+aNU.4b%\56A:2?z#|23l5JB@n\&+DR`=0DXW\=l+A +c zT$nI.&n2։t]82j%.P0Ꮐrٹ4%I^zgV[,qpv8R!,(rMS*v.Еkln֑'؋X> vуw"ugQ k)CqÎ?L1<F/ `2J5{! ++GM_b0#?O.l{iî +\ ыA1KPڊ{1WBB/x;'aLǺR[B +7e<fK̫{ge`X~!`<? [l\-!:u-{p~ziT,v@q\f*AXг(c B Rp؇et,*Y2z6eerpr\F3vڟWq:@zq3p)2'#i!8lu,W@tc33 Mfy52C8GyfI*W6s|7 +LxFySQ-YqR``yPkfmQX o֝gźfmvZ.k[V5rlUIVR{EȚ'{WCV%.&KlYgHP* )fȚvnN\׶yM\[$!ߚVc# +_~;#HoCu9 cQqnOá6R7B62)~|5./jir7{<W!Vuc/RҦ +:i¦/ҝw3ZCbom$b#YI/CQݘSEm Q?J9vFuY +̄ (mmR}Hu>_?<4k^FtΉМX_"ƀ%=2ybfMnYI7 e9E-C_֏) u8hQ-D "`87pg]Fta>f8чn{|]N-׷+)L'Cj/ F9K 9MY_Vp,l$*>1*Xj8 B|@yx({Y/zr5$G$[hFx,3f8,;̳ ^?n^>uB֞m-ph.ςܮjq}y<ҝI +|| I 5l:qO1(3(雗G$|6uhkhXvAҝ* Qjp`RTP"9m9+̧RjzPjDӳHbB(^Y=!EjEME +=d971ZAi@s0{>nj(^> +Kc; +ˠ#x/c7 oWq -%c0Ptw^V`pOg$9;škz\hȗa0d@+ʓ`s-xḍo1s')g$z#%7G`w$@_דՊ4#۳+%PcD H^C;|0՜&Q"-+}륗^g᚛OgP$5La1O. +e߼{*\Ա>%ݞ_Lq G"2[uY~EKGvo2w<5ު} 3)1 [zY`F%$|0%Q%IQf!df-1 "/Iꇁ_ҡˮsʭ&O)4xUl&;dLx1eٓ"=;)RJ,QO!5߭$s׉E MtPa`uB6PTB8gޖ,Nm<YMm3&fU3M‰MOyarMt8] ♬~US5,RURȁY9)HHl}Wi; pј~aFnͼ='Iւ6_}Ε3>G8=Iz젌ˌ'y+L m `5Hs:3_drFH2s-9@Kq 9 tdv +%s +mD_6si֠WJ57V}Zy'YWf}aXSqXgE1ZDB541VBp1qnŲ(3;%k_eǦ_T^86R <<? ?g9N;:n[E?FGGGGGGGGGGGGQ*3X87b$U XKKW8ZAy2XÞFRC04*+?ԨHi cR0'WmAp49y~`LJ2+DȬ|z%]b @Y) ._f5zqb~AOj A(YT@*޺iUA=gEk#WcK bukÌ&|jS|RbXP +Pxp!bd&[rJvYDxCL,=TiFK 2^V"KfK-ǠD0,FV(U"rU21̊䢤u,8m!,`'SU*TdwJ<9eWXJ -zc"ZyN>S- fIڛ&ks8q2;FGWO:Hy?QÌJ*uAR`V?ITPQ+ XG J؊)Eí{EL9b0xdN *Gos_nuCdESW<9JO2.T^NP>< +'䦙-^ϸD+R^$ }F**8*Ujy5dz X02VHL{;hbdp#F Tܔ̄ (K4b~hrc%C +ZrA}\7 v F Yt<Eⓒ3"K0}C$nx@1)h5WDsؿbHE c ^O)u +S% +1~p2-n׎ Ko8QŐ7G5_{=CE 2btvhR<8UK2{ h=hjr`)ԛb2(a#E5AИŊE$U=XB5C0YXIEiEOS,W4|E*L1~Kᖑ_"|1_U˛m)W]AobN/"ϊG'瑜~ѯGcńH˅U!yR쿫*UkP/VO.׭:.U4P JUz[ſaLN<8VH`B R  k v8JҨB#|5&^&ӬB$mdTJ*T@  ةdE JHT䓫XdT!W>|r .dY@JĘ!ZAhEe 'LID7^']. 2<z#xS G k3^-c͓ +NYB5*gJ7g\g"Q;+n[4ܢa=f"0.UY'vN׽Z iכ zV4喐gԫ@XBUrI𣚷ZO[Fefz!5b,T ಋ'gm]Z䦭c.鴈nU'$s4M[oS>{ʇ/픫%8jKszܢdu#9YzNr50DX&ZFnˆU@0(PAj_8>fWr;RO~ QmjEG.z[%as䲼ڤheZA9fRq'-]7QR&A=Rk_gh]?:NC7)QtsIM}RɐpOIc! eIMGiBSpqP<nםVEèM1'A>-{ &=cܢ]j7hOc]+bǞRI,JOj9v#eMw2ɡ,I+:R͑jzJ8r;/[do/`b,I(jՒ{FWG%p7C܎TӴ(aEa[es4~q.X]eu3+ 郒SIEIk:r1zdi5Ep9È<&{zWZ൤SIO-T52)tdkq1.?Bbw S"9}zבv1}T0jO9fwλ?O#M$ B;lsl IAn6'sr6':ZZجrݽ;H=:tݶtJp̛-=YY渚PNpSl2}1ǐ6gNYO)(WSنQRS0M_6X`*~eB(uC1MӚVE˧ +vU/{jUzRK18nRR=Ch9JM lȐͪisZݠ`;~OkbW>NGմUH'ŪiZ6w騜ဂiqiCx)B!f'S5lV-Np 'pub;;UD*s^)̐6 97t8NᤜMu;gnPPF7K,S9ӑ9NtЌwu?i#iTm=n8hsws}jƑ=?͸ԌwYNjٰNq1^'wy٠^s_כ.~ў7_>{Bp,c l^΋Oʹ ݦj4!)LNzwNit]o锛qbA:XY'pԌ&yign-Hܖf/|մe;;"d 9;`[3./8f~q;!qơM=ytS)yƹnZN@QNEŻq ,h<M5-l,96VN9~ Ian6!!{8qkG?0ƺ(TEසG(F7G{^q ` +(cr:ppAtO;#xu^g4Q%n:`q·XiNI\FrB'GRN$W晵[gWXM39EX0ñ:ZsYe즁P\;X0C8v[u$s ݿeN?䦧w;nlp mhC~~IBM HsiݶNhaiM=&e7ISfZՕ|& qXtd~kːecB"4liL٬s=[n{jE-k9MĪ$}ar[+tZ^VmsȮhf} _q<2`N;9w/EۄMis՜vsişWmh!gz`EE&JZ\:q՟'{IwFLj<9:4hɗ KfA RS$Y.s9M:f5Nq@빪iOz' RQYhYׯzpĦEmHEohE?G̢H]oQGQ4iě.8v8&qNiwXr8ffZq%nz cq_&$javMCBHղVD/o2fYiYn[#:.RS]id7Kbl`cw>y&Sݲr<ٍJO[ ٔθ :r2'/񖩝 Xf@Q20Ӻ0<9!6)K篣: H!q7W먜MizIpG0$D?1D_ͱGG%eAO rZ*u:)"n v*=ot/ Ufud/Oa"03i={Ic%uF/jmm9F_y›ֺc!^̔x@7)dO^/I9-~z)_Wtͯ3'm#I_-xIa(k᜛im(jګe(VC'22$<ߐ 9-9/BnBP-Ad8emY;٨Yoݻ<,z0tlHN, mYNi/ JӜ,eD1Oֹmt0AOVowrᔛSТw,Y_uNG܄)R)PxP(R_gMK7!4ȱl?Ay $aKA)JQ$Ð.$ n.D^&7N T W +)Xbw.U?vd{_73HB˗ۂPsM7(`C/;WkPzв9HY) y~V& *nkI^ĠuhUIEvPJMl*GIݪuԬcnR|ZTԛhNGALS9),7.8"#IuaxLu I^'suZ- :g!)r2|G f錛M"E٨Y&_mg˲yl8떥Z6,eN6}q=oCV/Kpm7Xw\mq'MpL65)Zd%*MmC7!kց;ݶy6pNG4lïAURNHuf;pPΦղc܄ۦ{<ܶfh{prQEr9;/$ =IzRO3U_iR[KfQo+{_s%IUьuQd2Ve=J, 0Uep/>8R1LLVA;Lrz\ +>,Wp7C:vSp2Jj'w-:}_Ugc.^\Բ;z֥vگ=۪Ŷrld34Q 7(B&5t)Pbxr8 +NoVNK< x{|!)f,.$(?4՜Ѫ~3޶6{ܚuhdu& 7!&gcnBNղ_$KZU mfn[mf(5Kl`Qf6؟ .~`gʞ8S⏎9R䮯&Ym,>1N1tyU^z~9#X*vMzב5V܊RҴ> $=gJE\U O4Th]֋$W(,ןiHq-ؽu0husq?GԻZ='\7p9Z{s\5NmU&uff܄uH骇 ~ pVNݶX-C92I917ն5pon'EV}L8Ə'oi{Fwu9flşo76:jm=e :OOIΟwv8iq :=]W_'ԟdu"s\0/޶4LIʞre$'D8}Ƒ /z}!qJ/%f~ZjYm0LCYjҚ`j.9Nj.!T-m[ JhWṅWTP9 *oZ5&v dqxdZ-eˢT/-iu"D))-ajUTb%%7OE ;pHT~{ &I_u֏!/~o$MW-efY__5q4\Q`L7{|8Ee",=*Ggk9 84cy;9)Yƫ%b)W5h5dݰʿ`xÓ˦xLMi鏞O9bEveczSƑME8JJOwN?/Axn3hwQvCÌa%5MFi= NtkN'U{zH<䌃{u-Zau'g=Eib!)LΦWM.*].)M CP9EC?xX,RWH1Rݴrv8zX{m͜n[ue)ep_G{~ǙT3dyS#ؓ(%A$~jA;j=.l^NA/;dGլ4LƟ +J(EMj~at +fJlEI$q'zf9^qmց9m?^H闣 z_7 zuWBK~00/ŗs#$,fI]4uYR4t)DUEdGQXn2VE>ZM㡘chR9n\q'r]1l?0&SeQZ:92y7M3JbnC9^gq떍ӡCzKEVجrBPNe:jҺ֠g[f_8Ns(bm$$OiJn𻿯:y7M(#C޶@jYҪ^mW2\_i0 2EvO)g)Z-IA\n?C(Q>ErŐ4peH=k%Lnc<9^'k;Q~Y.i5Y6(knO(G_oxGE|&(I5s.AIZ{,ޖ'QY IzUܾc=&wk~A=:;i<PrR}]2~}/w,zef~'gd>d.tN׵m߶Ln2M}߲]~'sHA kEH%i^umsHh`.ە{mro;2~{M!khb(Nlܞav۷Kg}_t׹ߺ^wr{r}7?oiyqko[gص͗ݖ\y~w͠s>]s[wo}y|[w}m]q|ݵ:<=nn߸M{^2O<}5~.|紉[i}.^-߶\}2nӸm6nunۺ-]rm]m}rroӴNLtN9}\7/w]r}r}w\=׻\~=O}]u[o[zqo}u~9.Zqu^o{q<ܮi]o\osqq]uq:u\qZqqݮzs;s;o]qu}uuZkiz{y\ؾi<{iq\w\uqYiZwD0TTaTL.blvh!#Ď^gBXT jՐb'>EҴQ:ѤH!q鶥F>z9v(pp{>srhUU^+X&-h]UMw]E[*|kE8h@!L@Eti\enYijzqʣ8l<՝Vն>U_sgYjY} A0$s2a7Q ;PY~nnZDWsP335)-#;NX] b (B|,ffbv:feN$O8)# Rק)^Ԍxta'G-hhDX?p /cqpY: A}Q-ۊaf*w\In0sY'o#x JCUxWI4+LЃIq5SVG`Epo͡hfܶfo#%qiQJ!t`G ,%3LXYr$ԻF؝yV@{v;n&2oi`H2ykk |~ZGUj09)qkU,+Gl˛g-">Oa4glM7OvV)he?iAӏax +I";beZ"tOOj35PNFGUuPm 7ri-@|,N6n6cw]ItuۮWIs8QqkX)y)}ZL>P M >b/IXn[7mö\ϋ?=b;Iǯ+ +ePˮYl,j*ZZhMIpXEC;N>̘y~~EJɪz.rТHb>45_9_'KxA%=-SgbP O:<{瓻3E0\9.8msd$`isa1w Wu{2vTͳ&e%0(‡̧q)r0,\@KhCH +i{ kql=T0U IMsG2<b`QR&I =`NxИDum<(%.kJWs$eCB\ϛYb_ S||TM9`eg<=Oߕ=<,iqM4}ic9n8y(BQ~ny.C qR4.I!Dp3.4&0hi՗,Fv:ߧneR5շ0{v4IcҤffhԘp^, ?2BꘑizJt6vv8_Htm[9uCOO~(q&bEaeEJEJ"M1jq>Sw}O/Ei&kOdqZD0\I140$D HygHF%{?m͟q?EX +̅H(Q\#uǬ.^xȯ 붝Gr8ƽWcukj&G3/8LHN$~x9aiKOOͱ~dgCv6ױl[Dž \w7˛$AoE1 +c 5\*6Iv`GSˆB$R/J…L*UZQ"HD`V(+1+iA:rٗ~9~begsjGhqMRJ +SVSt8L E6N^xˆ'xqp !EOg#"0PJPtܢߔ^?kZc_m$.rBI ˏ׍T%OW$٣M? s(/Xa!q_b㰽NǩFr6 &d܄Y:e0q@iQ󣞧w\ע_P +oπt(j[WUdnM-?iPfZ~O͘Jf0pHKfOp-G18`zi#/&*ޚ]̒/g1bpQҳ"h^Yz[$ټeMRsQO b<P Hcv9E?Mz35Рc +h7!}( +$у>nau2vX6jpa!fW4,A,[bi0Z6mVqY2SI!hUB:'&xX̨ph!qa(~Q5E{.JvGnjۑ~igYrWQO,4ȞF=P!f%I.F9ntB>{ӎ իsD lVR$+>HiBO۲ؖTGgߍ=ښߒ;>R5ת:K_>ԔAo`bH ovYv:j'C8}y8OTmq@^j)^o5FȡD$+Z%?ۣђCyƟwv8:hMmͱGOU⯣AJvE[1ZH%C-^+@bFD;9@: #NJHnZ?INϴN&:o +՜D2&^f'lBkZl8%į~G4Rɱe*!?J+_coO",''"83).^#X/OozUtq9:<1d8ǒݗexlTuqS"aMm2ů|]WS&K~$nheO581dhEEIJ^t1/KR,J-*J!\J\2am͟w6PN̐T i)1@1%fDu-.(ꥉ$_m::A/A>0GF FH-Xt|z;e\'/(x9֢~tqz MkE!^{k|z,S.R"jZ2. .P u=bNPp^Ĕ|~EN4fE:( /TXFOOdMoWBr *H-V8H<}ʶu|ybR1DT4jEjg13TXX85+J's<]iUd!XzLj[ۦf +)}dP-`",-4 +U%4t=)-.*0|hgy%=ha--ׁ6ԺN-(M?)ʢ%CTII+eU0˒ۘgÏZêo(u%yq7)]7cqxIUl]ܮlzsE1=?"O:IZvyuᡇrUQ&yNn{bW*5VAâedU:f:0/?ZW>a%Ի_gn 7regFSHJSVqm+)8Iz#+Nb&'OѱxD%-KgT'-RKUΜ.#9|<$|zϊfaD!DL#Hʔa:S@ytٙFEZyH;#iu~TDHt[6%~8* VVBZ0K|;+#w^@>m?I59]q8]'~ru)Y&ㆣC=+nOQےVĶh'/7M{$IB*; !Ii'IHK(eoG?- +?!EnQ,ypP-IԶG̴;M_z߰iN+a|n/iEYav4;xRFry^^Rǥ4u5̓0`,dxbմju4K@A ^PS۔ܺh`tX(YpuMtR,\*U]tԶyNʞ]`!]=xziY2xFʁ +ɋGϧ(VU6\MK˟g1_Wz]HGsrݕe}9]nN^r}2QUr)9ҍ3s[/%3edndĢ&mI6*6SH7GQÚݮS/K|U.+IWԺƕvuYh6OĮiާmoQ3W/Oo>׹r\>z'͢5MU_wݪ^;z}i\7Բ獜MٜYכT+/"e+HFmU[:ݐ3z*}I{eXaL(=?8],v{:$*):f 0\%ϋoV4M9!&Eu-7OTEN 4D9/E +3f|:!gKgqLpΎFr:߆roʚimv.z&u~XC m +BERt^<"'C3MʎV'-4$0. (Esreʹf}HdRl8RXWǫrUwR?N3r"9I53N k-.Ǖv'ɷPmKC2܄&c蓣mh7z[O],I쪒eMyP8s`2"RuEaB>̖C.q"$k?obYvmQ+Z׺4crAƍw40M3Բ|)jci-|&IJ^MӦIfv8N44ᴚvikc)=oGoC8|^fĢי[OMfYn6+9Fo:qm;iy[jk[H&]j?5Cng]qȨ]Qm7խԶ VS&%DfGbՑΐ>8H\,V(^U$k7xc]wanf'C:a(zWX{E_w#cq↣ric{lMpKIG2,3*ʝjnof9bٞ=-j)P 8an 5RJRt)Rߗi67Qr\q$ ]+8٧.r\kUziǵwE4yHD7]a{C0&GϻD峫 49Դ2H+.M n$Ip Xk$7:۾͆K"/EjXr?E4i[N&(IJ,%ICm⦅Z&fAu&+(EwE9R 7ہ,PLDcm܄hBJm ِ5G\Q6E +޷r8&80SNYO}\8v6SdQմ:m}-u8=={&ϸ4U1dκuyOeeD5Jl^Ջp>3iThdJTޤz_qpҭ9ٶ\%2#&1*T[^3n&P!/ZNpו&fq֭m{8XHTR K"}'B,IT^ٹ_Hܚ|zij'Lv̛NX |ޏiYqT2۽GuXUՇaϋh0G=ϋU5 +hQCjLnKg9>p{6w4SE=:j*ڧ h}iV$͔@#( b!4 "A Ё8 +$,Yg[$ %`( )/0*XԠJ f kp! +H(<HPBP,p +f@~P"+H V @:cbmꅲhe{F#|2 +T@J@@![01@A +N0xa +X#$3 pPg #*$ ! R+pA [0(A D1xJ( +ZP lиaZŴ^%yKsE^OsE" VB/?H/` h ``%P >@@ౣK||V~j_Ֆ# T@Fh/! +M(0xI0B +\.  Qwc۶@/}ӵWטH@ PP&Pa +S&ܠ8HB *@MhB +^#h=x021˧oM:&g)@ p +[@)X +LpB$A ]x`6 +bP(7^E5N&UdG &b.XA +X%0at1 " A( M0D8X(;k% _$ejѢG@KX. UV@8 A'z ;vQÅd%_VK$4`,05! Ord! T`B`@ x0('2'&/.icUNÑiZ<`P4 S03a \t=X` 9v`qqY@\}(Kb"(P `* m& +W= %, E <<9 WnAeu +R# ZԐ/ S$DA +LX"*'`;tȨ!=JOɱdeGWB ' a%! Hh +L@"08jHy.=YP)ǴVIt@VB5\a \``$/@H&` +2 $6jpѢ-JZ0RWd#KI"p"YB@0 n#<+X! +9ABpX  bdTLSR/VL`V)z ^P2; `) nPN C >0@J :EMˉ5|j2#.bȀ.`@p`  X 0; ʌJ FrbNsc<IA<`2 +Qz'A2b̨IDvqOK# +@X{j1ی)fZmץ9XX,=t "|/r[1$q,&U1NJW)QQ{۬V)QF(~\n}Ya"jU${Dne\&_viTDodC*/+~Q#e)1Wbu5ѓ83N'Ԫ*C5ШA}M24JHoᵎѣ}}sdoבȊd:hgW_xӬD*On]\L$9GNGph igq5] E:-u<+m^L!_E_L!XZ}91̌Hn .KD:Jϋ&,&e=zQN(eSLa*R^gdEq|Ȑ1>H)F6 Իd:%ق]mM|& tMEʏ-tP!S1XHy|mrdA$&ׅ!t|9WSQ۪8%%=^?>Pvi* e'Cl$bZ4zFrD#%,X …ˊ\`=^&EҡB ʏΣd|j!Xa ^G9 EnL*iI|q!҃ /&.HX#fE,Rj$Hz]I.^68& Z-[>:X!eum+!ϊShœd<-YRX's3.)Vna|jeϢvU.E^5}ёQ=YV˰~ʩ"bтkQ<]>-qCP4x<붭ZErq"||ynی xv7M~͝OCMJ-%]WBv˶}D2QG',~ƣzM/\( TQ%W=C.e}W|Ń| fIizJĈ\@} +fIZYT < z1^J$qU?5{q+ +bFlՂuBYq*OO3\_Ȇjj$=SkOmcC'7ޣd^9Ve;XLv`"E$!f9dp9R#* eus,' RA}2e*b ԪtH` >\N`#cUZp~1(?g?w2Qrb[5/>ȘA=  iB;em1hI=_\3U8O˒~gϚv*>>xainffKRL4[~Ů?{)h$^*R"hfjqO7O]wՔ6W6Ch^~̌>/{nٳ fr{`QǚaVH!I+"ϧeٯ#rdݕ9IÄ~\LQs{<)C%R-$QAˌԟ& +ĎhKf]=ZFhL1%?;tĎMe䡑B"B՜DCxRW^dWĢze. V]{$qTkAhinIt:զ,E+%Q@Aecde$VǡFqq*K d]ˉHn\!%$ė|f&MGK?5EG>d8ht%)q[ +F KFIkFuY41\Q(|g%! +t'?s +HJTED}1}+NhW54)_&9Q=}!Z3~qL2KoQx,!r"~ C%pЁr2`{\ rh9b#e + G +LJdUHQ"R!1媰;>k#))&8.?,PC h7s,5HvWTXSs{̊CeN.D_@IP=Ԡ^#v0>Βܳ&A'"GqmH+E$bAH g,]SAb1Eh})_w]  kįsxhI;Đ1CJեXc~P)5jD;ОY$ ]waW!}HUQ: 2JT5P^0]ϓ&>OBbSQʑr!rrI`>gӗǦB#ƊHK[&}%…!;^Y40UI~UF<<^PB#ERa +x|oUEݏ-b"lbbˆލ$~]\fmONٟEO>be*xvWs0+E?`q .ZWbvDQ񊓢 acEhF [hq̸\QBJJI* BaD][@zjDSbWĦQE|p $@oq2r#&eɏ*T`PtC~˨L#n(.'|UsXPZzVNEHP*Lb2i+^gR2(4VFb}ga S(F>aWXoVH1K;XF^D? EYӦ30WI4*rM] +_qL2 $ƥ SB+hbH?ȏ1iHr=xvGL U +BE*6` Mʼn51c p*Tw}D0h)/+ .s9B@HLj~T>0b&0BXф>TV1yZH4^.U*];q #-(T)ɉHUW$( .#0bm,qsinBE  5RgX‡=4ſaF5b'V4?G rĐIFv;f1|QJ<3#_ /4O (_Nl} & +WUC)bOPb@G H‰vICѸL'ϩu".p4@ ;ԼИ>+R^+J W yR> +Th2Ce" +ČGL4hxp|<|j\ŷU+V\Jxv" RRl,o#%ǐjxҊo==y՗ѿ )\L%&\(}ѱnԦ-X$')0,R'qMtaF q(#!\1cf,8HP-}s6`F1$ IKbUJ-%٫N%w-~ d:)1PkS{]<˖uDѭ +/&/$(܍($2nW 鮒,L^Lر2 +jxĆ '*},=3N<_]qMSEPzqbhw{ѯ.oyNSemIr'cEɛʦS1s\4$s0yNٗ`v6(]]7m㫘eͬjnmRE0E"yfڪeV]H=UZR,;-`Ī+9V?yq29:zȩ^uEVAp/ǓMv~U'.S_B4^NKS5:=!V6 sS7| Q4ovw&蟞"VeճfzQc/C묈$1&(-KZKk8XJJޥ*&k~Co:H"Z6lcEZ uuQ6ٳ I tudpwc[-A'ŕ~o19],QI2኿X`D$fچqT3mr)}ZJ3P(Ze%#ֵEPĢ-#?f%!yV3Ln8!w܉3VtS+j[xdͳk";miPtEJibYN+Q嶑G?EMoY=%1X_- v]y59iM9q?,F~}'q#{st^B, Ѵ?MAkʗ$9V4u!;owˮY ZU?MSMP<@!U!ʲX`؉,YLt1>tEʑ\{N= =%j\Ywhx{zӋb}Rs23 +,4{N9b&_ïGOEfQve&^4/.rAfpR N +_]2RPbH۶r6)ۆ".XH"*`z'3P*~FT%G=?evnݺ_JMK}~sOZi̔Txw56YP軻G1ERQR8`GMT<֞ۻb"I5R>&=/] z?7Mtϫ״~aeoQjP"80{߲ +l,sP Y)Nx4 X):Lr43T~ìbZZU"}z] Wm(BFNƛq$0H9&gW/H+:N1;. T݋̰PI}Xcz ʚLe:%(Zt?;1Xy^BO$cCsf!|r4]r2K(&yJZ}&doL{[I6_B QqPU@,Up0=)"\E&!O%Y}M9\$[Π=Y4` nCn0cи@ VE$% I~%#AEP0p0h(AfV_ѭ\c\M\\ʱ@ `ph,UtF?lL+%. +5Gx08a+ G -$ ЍdAr1fN;t4ʲ#T &6pc9h"O@"lt1htVjM4<(H +( =@ K +; 1>T'| :5QXGl~\$P9h7hB<P"T$0D_Dl҃ R ':ٵ5( (EXЃ=xQ LY鍮'Gn8be6LNvfѺ EDns|Ṓ=wUvd-B0 řq|c*ͺ;?za,@%8~Hd = h~ eL;$*$-L-1]"C#I9mtm{j]܆o+`YOLyW^];md?04ϧJXkmKiT슾A\'WvFpibo(}'nI%(>jon牝y(xvy"I枞3,)]U7D9穗e~? 6O.dSj-HԸiYDG%XEAmW_ܪˊJn\XIs_YOd%ByB;}뱬`Xj|>fa]K?lm8`" @0n}Uuw5ű<ρ?q7&:HхYE۟6r?ِKZfԭcBP<˥%zu)ЌEWYDQ<?&Q>}gѤŒ_Wp9vBۍG4M!ڗ#nTP$H$u+ׅjKX5EDk3Ŷ7ǯ9rp99pT)E),a~,;z8EԶ5I(ji{P4x,aOqXqu&uhE_WO~&_fB\=Aom10M'~O,9͒94Ɛz1bO_ uƑrY Xtk}A)TLzV/QD3E Tx_n|ʒ`n\oX-?ϑퟞ;IzG\Mr"繓dHMU[ZW ̵O(8Zg"DcڢDR T0z~(YFǥa^X*|e׍,$9=Yc~ ޤ\zJ %rѣdx^9f#׶.Q𼦭-߮dZ}:⸷Auc'K6ݻ6J)" .`z>mMgM\oUUԮ* &i% EKv` WYeɎ~a&\u{4nu] u&n+M}hee0|OGQ]pgW\]YtsTu >f߽ΦL(XuE" Y<W[[n1GӾ}uU6g u4oM(+{N<}mSu,O7`hyo8:3?9 iqqjFJtepL)"yj%ݵ蓫'Eq jDۍS-6TPO|=^M5Q +iSt.Z]zKQ[?]|14xbSO oS5\o_n5HV!9Vɳ$:$7B@ĘQnj$n1y^2aW6lu"{^BKr&VI $C + 42[$erAiAqr>T$%7yh]_[~MIkbQSn>~'ponhx'I_*@Z3,+A|6-HV"d?̺ )1imMKqc' EWr_<sL +Gtyt҈tۮv"`bL"S-ꆟvG~zJw!yL~?ǴỸfcr:ƹjuX-s-Ϫ` a7mϚnz$*yDmbڅמL h#m҈d(z~1:iP|O7MOq0)#h@:аnwTϡV\;aҊʖA+&*%>P1c9hqBPzޠn z.NF ~MwZPDh5${]+%xTDpi7b{2EWW +6pFv$mǩZ0- + 3ZF. b1/ML(1c>h@q#zy+`hK +g!4T]$ +==æ)Uz]W{ZD('R +K"X {1q#G8h0Aq4M3o$#r8d'.Lpl;OE$Z|P0lݒ~%y۔{ۧTB)IBȞMLՇQњJӋ4dre-׹a] ek9<MoQQԣ^%U/czVj0t9mC2iS j壓?$]:v^@<]7n̋{GTˮ>OtʞG̿nlqK*GxoQ$S2oq(෋c|^wTRt +.>~ӓ:ȑBxpS] L + h]QIb ?Q2Ċ.K9bPH@, / @pAR㥄2 h/T`h\4hLw<?,@ $NL(?!4ԏ!fAK)tH%{ZFuD 5X8Ć,f -Zy1z9TyiYe,3m<?+K}ƥ׍i!'BդH)FyNǞ{vabe) Ȫ + MŒ:2]D~-;asp/P|V$yr]Sl..ױjךEST4U-?[/G-d^0=p=M<{ TErrXcFEEc 1%AA"hL"&(>~6e B 1JJph8R`7LX1?ŔO0D3B#d̈XF8JX.$3G:1S& / XĘ|mdO~֥r\~$Ǡvu8)- o@1jG "WF0PDlPMgX&i.,+|B0O) +wI5 + ɐ<5K?fهmk$vEU@Qu2DLˈeO܀%`y~6nĶ~8hūkMu1v 8@XR2(&~EKIM3 +˵eKlyž'n6D3,V͋z]TMk47$w4 H(ADG54$I.\*-v:c*9u0SOq5hz71rBƌ *rc$jk$j$1fĿ G.GbU˭.b6M=$QJoܓ$=[z_70EBCHd.bl\N,SE<@IyD8&(W4z& 6bN+>' p"Z8x#X0*ZvH!QkvsbDz|<\8A>smrJ5i)B0L^0׍!áPMa /)P hXJf4  @AШD@OajU_U_Λ&(=Yۏ܁ƙΆxP{E :]u`pt!A۫ +cV%)G cZ+iQ^we2FX~=/ǔ7o˾v:t|K2eaAE +gZ67.-5#%!5qI` JO\nS;0;'~)?H  ^PXN깈=d`$VUB @ +˨/m2ZV @-'_$&$鮣?fbL׎EU%~bxZF]Ew's R +82R[y.(k"x<.!l~2عzEI4#u|Y9M9S+ciIa"$035˨9azAS ~C:bĈXTo& igv:-yHRab0~Q?rXR~i,F̐B TgH(ǰ壟>vY-BdEgY{pHn8$Sѐ},_>G2v+;SHp WEl%C܀D bH|PQB.~⇋t9VYȪU+~z-Oh@ ՌXjE +󽚺"(j$[-{/ (J\pjQfP%=cM}L jfeR/a9jDZ|ȃ\-{pZ!^yMrUz'v ) B̈|,mR\; \*-M@;qqQ47f0GfݰX DeNEۃ1T+&8P˖7)lѲ=8>UM/[ח>a1մ=`Qbnj"v𡂥:3Ϫj?+&qҪGQlw]$_l`9 "j]-}ZduŸ^,ֿ%}8}SvϓdD6\ZfZUh,7#9n62LNhXOh.7`{Q=0jŰZ7ZVxX1#D0(vI5,Qsg^(%gr;s0Vu&Gr$q^_t|û$v豂$V#%xp !j^x^L(^0TP4.^&crmo7GЪΠǗcM8]IIE{-D&xQA 3jphF!&JnEB}G bh9ia39մTϣVyyޗ~ m5+>n\c)f[|}[F?Ljm Fl0+*d~Ԡ@-^dO3|W, b\M}$i^F""}5;Zql=s8Yfڙi׍ݳorG` %LIQB#G *XV^ma0l`'II9UC>M5qq m~ ,mw`ajq ˞W=u)Bbso}<ɡv!Cqc>pI!y'e̐:pHqaCƈmQ*z>^|fϨ`M33$+ZXd /p(YQSlio4=1Mcq]C< +FT*S S +AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF&L 2Ad "D&L 2Ad "D&L 2A $H A $H A $H A $H A $H A $H A $H A $H A $H A $H A $H A $H A^瀥"f=*ԦvHv8&hm"(|R!eFʤZQ8 mɑWv{dSrU}Ĭ y; &;T&%nQiǑD4BͶ>4 +_rZ -A6/Y1tNN'B[2?ţ'\r-O[b|_n{$Qﻋe0}RtI/%A+zݞ goQzzJ{cumbW.M162ԓt\Ĥ_n6Nlt3#)!XHTx栧r6x"v6DZbķ>hsf~9J8'sǽYdaxYmtp[2 M/dm}9xF)ZO [NKvK'"C~@l)R)h9 n+:0(on=ܾ3-Uf=%ȋ?zرbE!# SQ)6w]cHE_0Y(p d>?e[N87rj@)wv6lg LsD)#% !]e?J~y|IU)9lӳu%vAo:Ś6JѾ$፛=< ?hR&5IMY1Ii5M/:FiMOۛnBT +qQU>#l6/î5egRemEno5k#.e(]qRtgU-l;b(ʝ{X^z1ir2~czWOZdxt%K[Wp۱ e>޵U[(5{2'~}<{,厫N6xdqyU?M:~Zsd.+Ҋթ=

oe(XZS{yyD0۟kOp;ժ"t<%^yˮd;=ZߓI==*ڒҪ72E +2*3PI`oWwDvQBɘ=uIjY9>gZd8z==244`)y9I5lǩNe%x+"4jvY&K~Y1˝s1'm]c +&wX UK +T fwA] C)Z]E +sr^]Y[j?=sr=G޶ʦZ&# -i:ߪecX,Wib"˞Zc(⠗FШ`^3qw)zRԮv"EYB+~&zAAZW%ziU1" #5*SX%Ǣe_Wsqrdٚe6VUqӢjڪi7ф \F^>y +NQ0Z㢷IW=ˀ<'6݋`~S|U5 &I5MmZ:ds9-4,W[9Kܦn/I-=ؗnq3m4R!VDvbB!y[r v"Df$?rq +/O5/zд-P1E +S] :b(r4 ?ٴbGhه_m9T䲟A:Y!2^GuԌ *ĂyNg ?M6NN8$S3_mhfxcs3\(/ EϱƣhmQ9 D/7A\b{gq7+j=a0?q/IGA:^c|`׊]ңwjn}iq2šc,kl Ӛc9GBLIğ%uFK?";kFЪ6ZK-/4A r`AGjwPRabO#qbE s5c$HEEP/ǹKs)Vˑ81K'}A(zWܚo]sΫun;τ_ɱ z0\V{IMMu<ʞy$WyL$]]z2,Kﻗi=w vK&)w6k'AQl5xs Mw1Aa;9,cGT`״hnBNN z[o_Rn[?!zR<4ڶbHE]v(S̟G-?/~I,iM\TĐ[ CjBKy&9Mws6V%+҈H^#ț"%U%:3J~׎Gp"4ܒқ~X7>U49vBi*z̖VT74T=5ltŰ Nkpû,qeEjtZ?5ws$쏢=9R+VU4Г.xZ&yYdbѪ%f~<)'ɓ៖v#Z{eljXt%9~>})`WK jP@=$=R\.;!J|G.$m0Lt6!,q,Q9.ecL=NXFX)\NZu tUCi9rU En{bq>Z ղEa{?¿V_]_LZCp/nkQ1_Dk~z([XlI{f=;i~tN|)`vԲԌ2eqRAO2Ph9U+\UQ;bS޶A>HQsE< t.LV'ſGa:Vw]MiTZ՘,9nth=Mf<13eD~ +^o#7!fv:0,O( +kۖuӬvMQŦ/Ͳ}4I5`.c(V}3>pױrn։;v2ղ)"탊%/娚߿Iу6DZ4bYr>E =pAu^6A>*V%a?ybu 0.m_=nT䶵"ZOO)q'U0wvGOj38Vܣg[˒zi< fk19!ljԲVU.J j}#ȣ窖Q<|}cmt.~=Xun,r &nQĿS%m춝o-^oiX@1a)ѕ7Yr6i&?ܷ5 hc{u6ZW;/ujN'U72$EmX&=ay!o4Qn:BT@r%M-OsZ֚=/hmI$E,):ci3ӓYjM51o Vc1d)va([ʮzEKIzLRC/!~8e_.$5]I<9ZXqKB$*~?OAڟ'MW0;->_cU-z~V1{fIEIZ`ut}Zgӕ@4Ҍ m俦ybH"Y㸛d N=lA슚c]WS(:y>eMp%9ZQ8$L%D$|Ů;әOԺm^8W}t"z]>]!fhUE) +BOPd]@~=_nݟGrӠo4VTPD2(j}(v_(hgMEZĪ!|986u&7rzzq_==**_b*zWWzJ40l5C[q2Vͱ6V9zg, +endstream endobj 23 0 obj <>stream +]B?.*1  ҟYw?=An#& qL$.uhvR7B%CaQz_w,W-[^)Q7gn?'EYb岻qK_ӀvW̎RԢ{ v Z%z nG)E,yiI~R AȠB]3BiK2eUtܚ˾'$[F2,S>~ɞjz?Q$0ϓW۞x-y~6EK><<7/i% +-Kү+}.s[b Xfo8VPݗV5@z4.sy8}-d :Mŏ:D3}0Eu&-ڥy""0Q9p1!lL'xmZQT,Inp('cOgm,} c.2zܴH~bsz4,ģeH .j[q ЊhirYfQ1څ,M[&o6UkW̦Z$GzމEc<2'"^mױ]ho3'RSR^a3<{EOʗv!\nqP.U&aя_|x,[ ErWK=fzە|Fg>w2M[v|zYzכ(nK@} ?kȄGQWQ-z,kzI%V} Dّq=0]ryŞZgamik|P0AʑvhH +5,B^Lղ4M[Ejʛm}⧺r٘3V*L"Qȥd1}4nHfkLϧgccgY@XbS4{\0_iìǰGM,a1<+fz%PnT/5ms)~Ӭc_Ua<.HK||DaTiױfW%\ĸybM#qYޭӂ!^ yxf=Բ>~9\ԪOd=ĠĐ@Y刋I-Oy59rW VJն"o'AK@˵f+nyfH)m*a9 _clB ,=YrU_E6U2;+KŢ_泓4 ״7K_;"&DRy%w]3L^/HZ.DZ1(~C.d>| /ICJBU3Eȗ"m) L=K?岣Ԭ b7ƪBEB,,MĪI"w>4l/ԏPd&} ?~%=eTc|>.~ղs|,mYo{jk&IJ12,'=TJ\t"q69h\jRzڟw!m,v)FspƥbAqI@+zݘRs=Muf8J,4XĎQ0aJ~Kcc6-7IAMԮ(ub %G)=rjϲ$eDϷx^Oc&5+/0imn#(c +H!)kze*yQWei_'N0hyeףA׍AQMh4*bn[A\O#훥 ~m:O^A牃".$^B`7E 펃EBIQ!kM{2O'C,e](q|Ibv8w/Њ仮=jۺi9hYjQ}2d_Q/}㎛Ħ"v\3b,*NTqԚ`wNڢa$0X߫Iٓ w(=kЫ&Ř)烓J7`bƆ 52ưP.+:QKN$mSwDiҍJĞY򻗣ecZ)Q Z5Y@{]qlɰ]h}`Xet(xr,JnS?K~VE>D V̴@+MoW?UD0 [8-n_;Vmn|pX6VhvC (AElY3<]Stu,UKjqfbS=CBVM%u24$(MqLw. f7"xܸ@驂Y˒3߫Z֓4Q^qAf:LY:Nf4i".~<ة\-[qu2@\<]=f9{[@~9&mx >Y~eWR9VH`w^v-EybtV]a`R{9zPea[hY1.~3RE(:IϘ_u2a[iRHcY{*1р9n\4]-ZXhq 'WNn9ۦ<nH,XpZHMie9~'EJD3sKv,*K~yRQ~c<|M(:"}u h(lmi4Pêbh\@!Hr ~whCچfò99r63wzQ I hau&Y,b/yx^J P˞IU-37\o0" VidRdIheIKʢ<4,\+ۢie d$E) +s[ N }fB6^6;LF^EM/[( ߒ\6ʇq"2Xs*#uㄵm1͑?KBC +6̯aJɮ +nW w[#;dFtyd9>Z5'zm#"yYP!1=tJ4𧽐3'1JZ*I|AC 0IdZ`C%v#W@|̦Ok՞+چ) yVŏdW7I,  o4}eCk9I:Ur&jmȗ%w]9w{ER"\fI]_ #_9Ǔ-KB"xa,h9F]qQʲf`mYEmZzR~ԴN~OJC?KwYd ז̦ +^1EP*uVJ7`-I3WJ;owjS?Wؔ'A-i<1f^/: 3Y[w-<(-{.tN'5'=d _OonmOx=E[ۛ#MK/;0-VMꃋHţh89dzY.''~Ɗ 4`=MCh^h5YB-?/ǖރ +# /\aM5=Y2ʎU>Mxt(/$,X^y3 kJ#Ǒ5-"=[r cQW4yzW1uP,sGhjq,'G|ӪWU&=u۩zͱC +NphLrܟ#?WɭEKv[$K:ɕ̂2&5ZsyӃ/nܲKq\.|ɏB+EÔ<5J\. $B/o7eQ{T5nNJH-$=HZ+='WR $'K@>`Jv\eԦ-uƶXwO3RĶ$ыE[Ģw$i(]G*a_&V%aѻ$eQr#fOSIE/tmEJCԞ)C3*3`m5gT%$&OR1J +EX!9 ,05-AHcu!bBGЪ陚*%i73a~宼zێ, D13:Č~QwɎW?ɘL +Mn_uM%#$?Usm?E{\!y\P"^O0 G.1djT(S fK-A V_>;2G9 p{zl +nQmʊ]њYȃPP9#F2':JV,V!P[L%)hEOrb5R.SpzGf5zMONR)S `Ffi bWyivU~]&D\J2C6딛:rh 8,g*-r8(!0ݠ[0-9Ĭ<>űMԸԼT)Zj$8`TNB!Y<4Ԟ}G bȈ:ϳXp\@*{gE'@!xЂPq dD%V!bjRJ C *hT*n*^,Z|R%.]e@:^<,fx||̪x^$UNh̘ZTeu"E𯷵' BD0%N~m}вDQ0')1%в?Ih1QL5 sDM X*t ED}Lm_B X*ųv4P 2ȰP.&R ay-jhTDXKS|F%q1SU1! +pZvӻf"_Na ̘@5,R\5U?)rQٱUQ)n_:M%5]A/cxo+RU*f=`(IMϓ,:u׍ԥ4VB3Qש5]ibȸ8U%0T,odJ:fٛd^HfJ5^$~]QH*ҘBj7I\$kHͧ7Z:Ԍ^j%lQZŲ>9Zjup\*9))AE:s⧧n%[><"QbM,*?z4 +?sM/B̏=-cƥb}ND9Ɂ&$:ZFkŊ[Zrz8AU=xt#*!\Hzt\F-\ӲF%;5(PjB"}^>԰|P{DKp96=TbK%#c2, +‡m Fħ +^-JCvoGKG .%-OE2Fq(S>=-XaF!2&Mq7bD+%Nå&ÕPO#zwPc%1yR@{ !$WWtÅaj\$/_eϰR+*c +Ք~!Ix#MrٖHz-V#- .j3|AIgHb=NRб2-T P?bIĈ$Y|;&ķ|ZGLkc<Eh85WUl~Y>300NJVX&Ō VGȊUkHAQ }Ĥ< G-d`J- Ӟ-5^ W.HQ C+4ϤwEX%ě ϭ\6 kHȍ$/*~BÌ]oGJȓzjRv{SKQ%7 [1@?ԄQڶ  NB#yZNk=6֙? $sy5JX.Z%G!(kI+X?#Ilʺ$3\Y${M)-E*Pz r]}nq7.T]EJ/'Mد/P6ZRJDApd4 Ħr, r+ jW̲sKoxP݃^ˉKS-|#W>^pOakw*T~\<7g +TCN!H$I@ HD򐘼;OҺ$DA 0B!!B,g;xώ~J(汗jjIK(18d2\SiߴU'D*) )a^mN[?SNVoM& U&:.C%RF Js@)iqQ!1D(cXDA$JSaXTaCYҌPNJqhLQiqa RB0$R֨XAAdQ%#*"ʰXQa&6N(#d hIQV0b )#U"eP(3A@i(T!5. 03Q# =e2(^ SIS@1cJ" :,Rb(P1I)2*-2Δ 1CJ(D+H1\Q#DcDED+*9D e ģR-)1*f|@!eCDb Je&Hcp+>;.qr ;pTBK SE\Ud4*CӝČ6J!#DyK'P!F]q~-qRDՕv0,%R]A Dc=UzmB_ O`'ڠvlQ"=4(5;YP# hi¹ ׾)-!kž !^4EnwfN([k^gQOS$\^i5."`MW!? +ZC䰖K#ixp=9b҇"z\A + hǮE0$/沷pB>P+=KCh wõQlĖm5C܁:JjkKiw/,H&HT:~UzTJ—;rZ"PYTJQ"h%C!P l]wpS7`L"j :*.5 +jbH(-쀼d DO^1װ +<&ưfXl;AVw50b EfpFi(J߽ؗD +uoxҷU+C!!BWXpɶ?Xj@OWGhua(nXPɐժjP}8hP c?uVYg5u#j8ʁM"06G]VS4 H4kL?YT{IǓ8O,ɥw1-UR#`$.7<$;G[BϽ? o L)>э|xetP%9\}'VsDAIJCu8h e^K5 nt# aOHlɈ__O1  ͡3+H86a^9DsTY|VdQ?( ؝tgpYjsh>*^kO3F )\,JRM"d(-l9=:`)77tg N׺?OOV0ƚ2OgUcGS,t̓ɕG[ĕZ@Kx϶/MZ%u FGWn`d\Ɠ-h_>77E +ާ6%`uǴ׿,K2PWmnp16[&x5v`7 +%PQ$Iq%zdaPl@~gn =B;^E` lWlaiEͅ7EnD&*N( =#43NfkmƂiLj>F{N CKmi7Dcv +-ypmEWlS9E H'|ύ2* +=w@TD bm™ke[b}` O]+5̷31`&Lpt]/tE,M[< 5J8z;2?٩c]d$J"T#u\`䵁 +x[# +<s1N4@.M'{yv*6vzrZMUV?Åu_dVTց ,HV{ 1vteUO>"Ɯ$mZZ(Uz +UgP)KrGwRo=oYT2bbP[p1c&d |pY8 J'z&>$ܰ Jbʢc/DTz"T/2[{Ipùv/2p]k?mW Z~A}8nU/ D5Iݕ:sOiBI>W0QˠS:wp;'@P{grVjVBOJqPf έb^ocGKc#njda;q‡K_(Ǟ=cԤ>8/ͮ-(xE2KU <ߩ|deFzD=NX,F39} :yXyZݱhR{jO 27zQuH&X>'OVdRq?WRI"q_~21%.}3&9,M# Fpi p5(6-0H;_""V~:'j$f0KMx1@SO#F)+;RS64ݹv9Yi?z7zwRO\&mE)S$ $yT 0e'5z]%?n3ּJ +d&s^|PFyf$óp4QmcSӓynM 1-d*:Y)ꏵ1dʓ/݆`pHq+rMDaQ& ~JA@zFY O}"*x2L1wI=,$[}X/>R q]N{B;ugbzFE +{kܶW,{=7,l} G#|+,OȁyΕ4tL,^UKjA 4S7;Q KOq׉> ~ޅPzOЀ#G?ձ+T K&8{Ozm9}.5]GAO[Շ]!j[x?͚,3@xS> Rk-qۛIc>/{IR 5݀š,fU%6)Ty"m3*d@jl%0|LJq#a0 i!d@oکCN\DthmhmHo6=; Fw"hvGB;~2k] Vգ3 a{!{I|`jp9:<-%X$y'eID-4e:l2Ho'ӳXff!j!qf/t7_]lUor$õU Va@tHiMCJJ}x7*= gs3T9h^ՂNοPSfrV!HlӺ̪vr8$ٰ(J4Nr9"06{m5[ uS+pߡ{L3$!DV#^!HR{_<۟0ae,$9z*lZgN{y)$%޴& le|kl88T 7(py.^Rs{yj'8+ +QToS4B|$'YMJ bq ƼIl_!ɑt2BPRsfVdj]*@gCu~\d)kCM2]GdMq1>lѧxdq&ZJ(YL߷ +se +[끚"Fan7X? 6Qag89iNiEAQ$?;;YouO`ޙZeE*,*Dcu_ƀs;!a"&Ht^HL9b fYN˫8%;I9wO&|;B#V_\24UZ=nʁ~/L+ψivcS6fk79Shga{`kse'@7fsZ'k]E[0WR$ +d3˓U#"uq>Fl:R{6R M:ڔ1k#(-658fv,szAnrsД-SKNusDu7+H+uuEEC>!8E9+[iް}kλ9N4Ԁ8BCv(mz 6 q:\!pr*zplwOޤGjIm:7BԨ`7$gڑ3v*C=1R8 C|aEy; C|ՐӦ6-ґ,|@HpsO~ʵ!kvP'q)[;`L bR252y@0ԦѢV7KސQ#<$ 5D=5D}@H!Sc8ݪ=$N 9cCksci:朥v\}Ie> Tui6ZS]fךɋ%2o2ҜJרtⳞJ^-|w Gˀ_00mˈtw6d-RbP(,@@a d@@4@2E8@   _:!Nut wݪ +p@, ˺UMZ=g+o9V>s+K}4)^+ pwHY͵! + D)a + "@h@"aJ|Р2ؕʫ|:֭Ɨe8뛫ӝ~qh! f8cɍLQCMtKo,Ei<“|GkxHe +wN~ -MF bvQ44Kb0eH)սtx< Ug;%Jh䭴!*䬸' +q]JQW.|UEQ(jQ**-8ts;Q|5 5-lcbuY< L8V̚:bWaؽ= +4hB RZJʑt|@4j Q_J,Շ<$RZ.cXXwFK,$z+7Whzz ](dE"UCʮ%޻(Yn0Vbyz (;˩95J4klDmې3kD6&7֢(,sekr {%:GWQaiV!qsPLbNyAoWQոwV;幱` 4$1o cCtvXEIj'%B51,afWcí1Kx;c??GiLE(So8uDj3;*͌̆xG2YIoFkeOwnTq*zSieoY݈NZϴG23LʬOK3v^9{O}龤Sj% W٢40'׌J=֎=K{{P˕hً䑦vdI: ]ǃKP}t,׆.-.o{z;vQ4^1rQ,W?%Qs6WCr}f9KE-kFc.[Nԩ 썧i($XP <@ +  ƒ<`K7tQkp{jyUq#ͦB[.]#F(ڏҪc!Z`i>e+|!RU-,s~y7U8wC!zϻSn8$ +wAe;vWt@, qa6?'͝9i ;KTCGî2&u D.fЕ&^44ƨ.M4FB)WVN}wܝ7Ͷm*cp +e2{ba  9Û})߈?wG\]yxXƳmp=+o~ooFʮB|nRސTO_YXXYU7ffxYYƻTU%*n}&.n +=ib + ˰aVZfeeՕ5 \W6nz_ק: tYluv̲ʕbJJ+a-s\WL|oHi݆kcjcv5;UCtvlm m nlmMfF̽1[KlH2Yy(ՈOӚu%VUiU .̌L@h  `Fh4H(I2" 'B`dq^JO KwR#|R͏nJV6>8pX˭B  x%MR SrBZ۔S>ikv3? ڒ97e';bu-&nӦ<9Gp"JeMG4f&jWN/|qgG蘢$pu{|. Yb{4S7$u !'!GԝJr>$^n+oAsN}#@Ez=ce]ws\9=G,ⱠR Ŕm*G] QG܂<(Y㗺˕\hD(Hx%52 7.+[iL`.윦01Pje WDO.T\r'F9HUS?J*`C~w2M'pp3|°?CQ tp`Uץj1j&>+%@iӟB_G2| q:5$-3 !' +J1UKSژe=iY9ӟmȒ u{ lD/F XhaT c|Z1¬޾XH%a\YHzՀ7 (95i0gՊaagܩ +T V@`Cx4Yemok/ZOD||! j[ęGRfV} ;Q;3r@Ob5!kކ"Fu!8ԥ%Vn@*pHW*;VY~ H[c99)d4Y@BR0L)%z4ҤX:O`SY>srN%L(%PPw^S9czXր0 ҕsۖE^~,B +Zw.[N 8EzZ(1S^шQ :9T <;f Fcs[Z^?k~xyݠTl(t9F;/=HXN; 5n]ǔ@)$}Lm!`PIeZ0m^:1-P_F;;}4*5FFsk,.|U,dtDg糒xtǿlT =:f?Ⱥ_ ;k%vE" +I◃.G{kşEUDS +_f]i./,)DvW^L:+'.e^:wVj&&RœѳVG=YPqҜ'}\(/XpGU0./6kq[d2 = FJvD|$~u~S 9/N6͂s5d(_ۅ]uPrxf48tj]T$sF# B\r qalqtRNt{i)TY$S,"pVJ 3իG0/2Qʘ[<51]*|{P'Oa +xNFYQJx>[K@4_Woz&>w/Op,8A }2]ΎzցnrOwރul9%r0MMZ 2 ey&@2kIiw7ANه^J~~VE*T4wcZE4°gUB2DW / 8Uݍ*@V{ IÁxFDB sDE`H$D,po`?z iH}؞}i{vv%fXD[ڽZs*MШUi!Q(f-?X>mItp_Q75:gid= T◶R9VeKE:_g |E727MmjKR.E2ăzL{$ !"7H Uc~޴3yLtlQr6QcU+$T5m阌:ӤC)aUz#D[Rk*uȪL(XznQ!/#O:iRrUp`,Jc!0AR{=H=2#(zm_}9rCh\ >+nIMx0f8(<t70"_V,{4Νh 26ɹ"SE6 +lkC_W,N2G,tGkz}FUD>YlldЈFmLp9LE*$dM6yŵ_kw8RςAUD\Y*ѨGRҟfY-:oyLN.V)]koS%1 E~e"a;CuZCtY讜e"DЅ$rpi)纐yف:xC k +=o` $MvJ$p3sZߟ5sd ɛ\]Z3m.\[`6#ĺ6+˨Q B;k) S$VՅ6[Jչ2<]i1ZWk̟_8X ů>t>SkOj׵zgpUik%Ay0^? rjV +13[szq()0ˤ/h+`NRnIm/tL`Qֹ\6\>yQT d_~,dž7{)/_|P|$>% ҵ +ԺTHZ ZaYhZW'X1/1:udbmk~2xg1)x׺ ٙ@_anzAOKH0=asgV\Qa#ml(Yv`}`(o3ר igL)0]f +A(9Ў{-akm73mRY;d0z^ (L@Y$ȷW>}!3VGvfФy 4AIزl/%s.l/ =вƉfRu5g2w&GO] [T*uvǧugU +{B..%sd>II {Rv7fI 0i 0O5Hיs;fBf+vNyKާt'"8+|u!HԿ!@#^K}T0{u(Zg!p#0b4* +֌+Z84w>#,zxG 9n)y Ac?)BaJϩϊ~73=&gA=+e<9wKxS +wbo·wG>ȡ$]~$fV*0&60{y ,+˚n'+$!F N$AN$!Ɯk'SHŴZ^nV!,fx[k=֪!3GBȡt$ő'#aFP#!:X~kב>,L=h2X/ 2^Qő +d i@JQ!2~$gΣ{ $Aa f$J蔄"1O3%y$FI-=p$u$D z$h[Wa6O?چXNd%$+j-QskHBY~Zu㬮FB0H"VR7me Zȳ[H#x($ 6|ua=3'įF D"b{@\saΐ%rS+Ǔw7GUal:7RfbBLuI~s ڰ4}ph)/'-aqdja9UZf0Y +ELf# )u9ۃ( ) q7,j|(FyN Mm`|PXTI"$f 5P  XL:|&F͙ sZυ`geE֜2bzcPh@X^<-ARMYɊ,^ }M{?ͅAV%Zfus.2Nh[[bIk؈I>WS"Þ#jOEsC S-u>Bo#c٤} X4=ףά{u8D@ +@֪zi=UpG^tmoC+`Y%w .=+KUqrʲE24ngLJlcRZ&Pzޔeeki +vP5 9axp'q>H, ~"M΀2?#~!r/fvC" T?YҾL^-J^'a=)ct\MO`κpKYى c8D-V=D04].&75L7⇴B.FZF-H}hh5=q'w9~L Ÿ1:9BOL2#݈IrgZΰFi Y%7# +6&l5z|3(z'DY$$5Әa +Qe/%:ט (1e/%~ܙT!bx͗Y\o!J7DaڕIP9,9NZBXfӁHQe+)Ծ`J @9oոm<\/%bQD#i{.`Yg!{MiVŁ+ڹq [b.s+FAVcZtw7l;?.P._}@;OW O s砼=Mjk>0nG$*I]=Uf_͝ [Ǩ5˘”!* +Bt^%"Sq 6J AyQFh~'d$K3ef[GSdr%j\d7%  h%Գq:2tЮ~6| >[߶#m"$7GV! qR"D%Wf]Ibӑ7 ;mt"EGO'xcܼuʊIIIsrj3C18CngF  NU mEe$.Y?=o]Y^\ +ui*@֋8oM6F?M{$5f*-O$MKP`tkM;A˟Zrz1*v㊥i쑋 &*ƧPuKp0G@Dx3Et6 hzC4+&d1Jt!dzu6e ϟ_AJkB"2C]*0N}ռ +3]CN$/N0OV5 Pfurq)vqkhA 7*yq;cq;I3ּB %}A_ =DKVIK3,Ӭ~eĉBW߀!d(ol*T!~*Fl?r5~m}e\R#Z7]hY3?rV>͘hՔtáQO +.܊ |Vl%50A w ~Ĵ4yTA"^O Q:Άlʠ?K?9'PE:XP oB{cW ynu*Ievsw~=VCt``wnP]{7+ +{ZE%ډ}&<-H; 4"T J;]Sm_ڦN3@ p U h~ "`=ranFQJo3 `wMж#QƆBXU \lO"߆-n,j DTUznpCeBe11 -E75i&Q$ƌ&lrUVi_'nDZ0[: +rΈ~@4 H◟.SRv2 !aO4Gfͣ/. \3b7Bmblr Umu5뉔;$8#"-vS"xw2Q﬷Bsn$Y\m.t0W^o\Bs^Gm0͡'8fRc3C$51U n8"I`jOő~z1ܪǍUX6J}L~"!- kN[~L~C4rdS10 z4_cKȋՊVI"fz;ǸDYWF6nhDs)'c6oGP ~lˑH&0Ƙu2GhB(CQSqgr=5+5ꗰx7!F5Eb]^$b/w\uMiˏRtD9zt)Eu4C"ʤ!/j.+օ J|`#(fk\g}u uܣ"1Wi vQ6^RR>Bb=s-c W >70ѽ47@0mDC Ӄ.Q}.o#&XmM!ÅO@rWzId9|z.:/X\Wg!{3J 8\jj7W}CX!d8%-?[+D §lzx;DŽPj 셍4R tȴ+XBSp-aC enTTԶ*CbD$z$2Q"U^`ޖZCI!HTΙӏlLʹˬ`]!%P236" : EA ;FZ9&S`9#8H k<_Rn5vM+B7%h'&[IS#\hT9@˾^~7 #~1WP,|⃤ݫ(p ~7b|< '\q(Vޯ{`*HߵJ"Sd;ʾFu\ZD_@ τ#E!2l^?pIQ%l_=Ye0*˱XطS6R9=^:p:3Oy%ʹb,`a {P]Ka#VHp2@ +j#nQQگI<2һ`X:?,zbUdO@dTg]k ܖPʉO?LGbYȂIiIT^ސ=Ƙ s ?f_9W6i"@PS1;uz-X!r=2Wqn'R\=㝋 +$؝>dߨP<,žafŦBةҕ'` & }#7ި +掵^tr(6D/QK5«w歬\IQZʉSB}O)˖B$Ij_6tmȬ*>L 2H-[J +w?9`8!*RJ&B9jRt$Jy PҪ*T(c2N{Xep1q 8['tY yWQ& Wz +Mm hνKH794\ `tYU2kK0Te +s{L)e`K87oG1U$&}, +0aiczo*>]Q)T5K/q~ 18@;` Ćɡ09zѩ*Ƣ NvSwPƋp~:! +' SC=&%¸4*ξ { {XuE*_& ZSB@Q_|#1Ib ]6uκ'n_2k\"MO(I\VZRn; k{ť<5z3*jVׯ+a@ʉJ U,^h]H*6ci LZk; qoX7wj6]&hYaѧ][:Ll1#4E;<9*NHڴt7D0b޸rQ1h \Гfɘz;&'EA0] Jd[lnxY.֒AI)~Cͧ?+%dR+3f'рI~\0c$j*$S*Ն-ԷDʲw)lRt44=7)'\n97DjUc +D8 qFR 6zh$ |oC9+E8.U֞;橕_/<&GvΙ z" \"4`!)ajsVCtlEF$v;͡3<_Koz< pX9+U%>; +)89 +k4b9Iڈ@WdYTWUda1tsj)I$"$"LKFS4k>6=mhCDSI8O +JO6z=F|>xaQBv?U+IAQorDLj3tlw N˸!V>ACc4kcԦLjs72O@nKל :Ce~s0J/jci[GIuP;_Z +N۪^ZH"9c8%Lݔ, %_A04bvSyc$N#YD-eo!21I*N; |2$nVFY]:/&;dQ^ȟZJaeJcDM=1U ߷p!jP_߳fV6BҘ%˅D%YI&>k$& +NMF]0 O4G `n+8,D$U4 k]u×.Eb[z^vrI@jLѝW7%_ܔOfʎ] FQ}w;w7r&81+Y]F;x_q1i UM82=M:-/b- +{B(LJh\# cqY%yŠKFu]+ûu ]CKcLK d768C& {hI\Z\B;_"ЧE1+& ?4Mxq˰gͪ,WQx-zstw*0#LWhr57H +V6N_A>k4umJSk!HƗ~f(1ƒCz +yr0*#EcH +'!Tt~z1ИTq=/X,Io1'(YSus!n% Ǧ!ᬡ6J<pPNv K0͖LZnУyɮ0-z8J +ڣw6gk55E HuW$;hf= +]N\(<H/@r4Fb.ӛh3Z7DϦ;7yf+Ơ* pE&Ϥ3" IP\yXe%:Ya$F )*Y%B8/ϣ14[/_%y {JW74lty̩)%ie!]~ /_TQe*@ ^]>&%_v&L.GYU5ϘZE D»#21ۂޡ۩8,?@.ۈõEB +Mϭ"?H~iä@0Pk$Tf +_:(qG$4/l ՏF;^Aq!" U5 +8vF_?]L?<޺|:B8E,^P`M1<y²/}|af@oNҔʟɸ9Ge_wL6PmHkAW*!6}a8_ c*:(}J,|Q#yUe6'&^FT1ARfZ.7UL^KKmR SҀ92js#́Dk?lPWC5Bn"(dQ~&źa{a"ʓnQ/v5ǔ:SO_MFzں2 &AҰp1Mb[vm7Y4V%]:Rç98Z8 yڤ%|}́0\~fQ~$%C D)xoRAE#ևyj̀ @L!eNX&k#gZaPAc!˗;9sCӊhB)z}dN%ךl=W#ULO͠[,21!w)aI[ՍD%] `@Du ifQ$d{s>i`ϚI&j/8\oVfR#pi<d[̍odžsn6PH)R#o8{ja<:ݤâf!k4Ppu'Π+K/'/Q25+zc[$6aQ + NKy%hN 4`eJ/" ЬP Q*Y]cZd_``W|J- =U* +5Pij"[hk!Qh9֥PwY0IסK/<>R`xy =5.Cau#ڢr/ g,.=C&w%"Q.6B^)GUW j#oq/b&LuB&ÒWTvYV*Oթ`sy*6 хJ 1VQÁ,pQwM6YdzZ2v>;D$Pqk' S7XN\AJ L'A(Ö5KYeq횧\T@v|#eHG`SOjA(R P%a&,+4h ecr[w~A8"kj&xqB;\<¨Œ @.FOj7~~m +H +Ee22} AdvvN|o1Yˠ SO mc`ꚓ0Ml_Il}rDF6@#kJbIΆ22ƚfDƨM.6&Wօ-駞 +G?,@W]!>FR{Q-Փ0X_/9Lœi5F'~~CC! ^qc0zc@ӋSSf<ǩQKH̋hD6u(pnڛG:V)sV8k (JXk!ek.֒>YsL ,@Qs4$ o}F1LdLQ 6TO-r 0>e%T獢Ӊ{bWSjs>.~NNG%7Vd|P>@ 𵏊 +jס-崛m!jޥ7B|]#>;v+ӵ6/mpH5**_sêv8l?kw Djhaٖ=rqY8ǢoeI5,=D,Y6# 7~nwߺr$qlZyYy2 i+ ^#q7֒Mj=D>DC*c趢obl86Ut ہ[ /ຄlnxZyE?/"d +< +Oer8)H߇q!Mp:MMb#[Vm1\ٛ2=6Wvvԍ HǸ9{ZӤ{)ǡ;I '0rܞD!^Eg {VMp /0i9mW!Ի CRB06b'>>jV)wvu21 1%UrzvzѺPf\*AI`2tq%z]YQ#10mi҆ +ftE@13%5fR\S9N1Nhh*7r(3ېl1R 6V@Q =nK6ufXK8r.QſDylxG51֘) Ls!B:I锿WU_^C '^ aܲTӈ;κV%%ܥ?? <LZrVڵ(G1ѴOj,%)T@UAd'T p⫐ +CEF8@/ChjX1 Ŵ(=N'|dD6 jW;꙲޾cW6P1b?e^̦rM5z+}Ɩe\"žJF14 =hvGnZe5=Ty$R8UN &Z-jCC.YoqI +ϰ% 4GM8;{rk𨲄^zRHr[Us`}k4 +~lt2_$7SVg#/O&nQaW h6ZX2봉ձp,N#u<)PVGH> p+\+PAtS_({x%&unbU8?J|'&dA$nGq[FSu[/ kyս?BTiF!bb $9)ֶ0K;8":Djui(.]LJ{D,d>yu%%,cw$kjR0' +a0 M~9T"Qr81ZJf@ZI+hnHiux*N8:"l\h]S~mANPP (ag^ɗp!:R]S쩻:.w`, " Ɵ#}@\*"}K͵~Ղ/ǭ3qiX*TVq#[J>mzV rq%岆J"xw6gxyN從 +Hɪ54} <0*g2Ck$1qj^ %@H7?Gna}(B2b/co~<"Ɍ݂[$i;pC>{z_%on} -P'BM6y Ԍƌk .n= ظ /?Fk3TxaCWBNYʡȯW!5#hrޅB OfLKԽmJ4px6vek W%_:m +IeP5p8'8\Z#F-FJ;1ũx[ |pdY5SI'xzR-0՞,Zv1 fv} HEOǗ'ys^[+廙6{("J .RԂ)[oE" }~ @|g +[H7EԍBF]sd׋6 F598P~C9DI5B?+уSP5қ,5\;FW#L6t. +)EUW繖VyK  yT~8FN =c]NXfhWv15f hR1;}v,J3lΎ]@ NFa5.a'j(P+E4rT`b4Lm'GM1- 50 +T &>`˗}ˋߡ&T6`Í[B/j0bFVkp'1N}VZ<1L!EVOrfxREI'2ptxvg 4OAzcx'O +cY2iٺ( etkcG.ft4gLy{Dp?%4Fi,g, ]8Lc'֗X^3TϠDLj~rΐv7\aႛMvw$L[,"5`C>M]imTrO(,|DDp++;7k'xNekS%Ċ:i'mq`8h~t%',Da<ȞC`hW`Tp  uRkĭjHi + d)^;_nETbQAlowC.!䑌#HOȾ";{1{IS'Tˁ(4ITB$[=¾h^4γ;; ߑL)*s0N&~ ~ g!b@Ccכ5H\cu&b&99b0eH .ѷX^7,eY|uYaQk&`WL#VG ?1Cj$9+yu*ae HeGj )t&U;!Vč)H/ǕS E-TŘŎk*-D]%:b/vQ؀j2?`yʹ(+jd*t]DtNuf]Mah?W!AH0Uv^Pʛx`7#H!G=mЌ OQݔ($: .ЏDB ÐGvB]F_I*0 W?N3ztk׶Z c {܋HRHQ'5j-lT{/dsf`JV^n.~\oBڞ +e^^AAZQ eszϷt걅d&hG fgi@wiOU2ξAr +hq٠ 6_@(*uU cywS-.*N1kؔܘm<Ы^Nr!Fm9Q)<GUyn@شtnmb/'az_CA>I 점 ~߶j+sdD_dtC@Sj?|φXfGuŻ>XFfmA]sY9E ob5bzU [;r֑G*gZxS`PpMjɿ8 Z`VޙLM~E֝hg07}ÈQm@|tMD{-JZI~q͑ȺU҃TqeNݔ3v^n>AG¿u|Wt :i7bbCI#ߔ#Bz~r,댗 ET oin\PpkճwGΚ۠ Cz +.oE,^jùoO,p(yl fE@!o+h5$;іuo+&lP7`b1ɨ&%-'SGDsvq =g`YB܌!9[Q^IL_AdQv:Ǘ9-aUSFheXExdIJ^7`]T{܂mc$KnMBAoXR'])_9DkvC +RWLw PS*['R|T^V!/ESk}Z'u;Y0 PLyfBE=kosK? -խx^FwV֏%uJk-}Llnyu>S]3-~p|nFȿh6%Jz]Dؕ/ Nl4" +\M]y> X䆊Ri -tW7^bqsF, ɺ)Ɛh) ݨb3GͷnL;9WG6T-FNtUnWXn=һ]{۽]Mb?]esrNm:cL )UU _)/ 5}dz'DD`Y! LՇR=w"d +z P \SP$y Zf>b]׹mmQđ~%JE81kRdJuGuмD躎Nt]`GD "u]l Bu:Rx #jQ@1fDڔu.PVu]WO ]u:zuI КPNt@jSY@@Ru6PQ{nZ:cE0F΃ͯwb$Ē܂ ve8Br_ز8fe6h5vLa4|Ƿ nfd8ycxV]9$L<xx~q%_[kMp vySg]c|yp5Kg5[ +va{/ܺn$]UD֯GӴ[|4a,h_8#pnݞo k4\wGLo fo\ʲ ߉|ln6cv6Ɯ0w7}e6PϜdؕ|Zzn z6e +s9zyyUT]W)K|[vE=fQXvg]}kk]IWava@ZܱWz;ޚ˹P,諒8To vlXr\p!v'oL\{cy \v|,Ű ]6K*OMoѷ^Wpl=<+oMf .Ⱦr~knz.,-/(v]sܚ,oCq|\XXo&o 2U4__p=ث1YzC^|̆et^9¾/r^M0^T#3 *=^ٍ=wՔ*uYǯ<<[厽DSS~ߺcBqJX0n? Hd +ۆ5`4jzˍ#_{y`La1]C;wrA7yή_%\?^Y{ sƱ9;ͳԛTy"Gq\e2 +4/TcGѴw~f?r6dWva "YHe=nedeXs_o{۾=,`8 cՒf%qLvit @]!araPϳKϯ~iB׾q\Ox k-vlFg@f.nD71gnru< +#(= \NÕ8+`-_H_o,F +xǯs'$8 `[u'/m] 7| ޡ0d؝I*0FŒ{k.  Yΐn~NxWMμݸbv;=ٹO0e‚ɷ29g$jk:ºəcLt?'s{v=O0MϙgT9q$9Α'Gr O0G$kjNn#wyÑ08<Nbw~L‘mq:x` r o3o392g/p+sew[Ȱ{OMeq/l&8{jz՛^LvߧjgAN=E}Y ,O4n<Oѧf7/7˒eY󲗟;ys{{:#C?nv. $陪7=G)HrG%e?vOK>Wiɥ%fɕ)i\jr&NLY~,sy_0T/gsGSKKɉrgӳoesh/QJPh2U?ʕLQ4MӓSEXyďTs'wZreg{Ӳ_S~)jgyճӧ|Tձ^c},MSx}T45E_y<œ鉎"壪DRTiGԋS/zOQUUUDMSQʹ,MM5=jhRcy)~TM,E/ӱ~._eRxziYW7GT킁DĠ>&zeJ~ ,/&G46^oDŽɟV)C{y}tW<^ 9: rzw:M/Md$^^qF7㮕FC\aFreIHKI$!G(㎆4>RfAu8 *\@vg&nJS&IcqF,8Ȋ T WOi" h[/N(MQf\*^)>' f l֦M)' +NI"X!kN}`bwiw>%IoIJ#aDum%4`0X`L 6z@{bk^=UAAO(!ALN? }/7!YpwoqgRc9V F."<1fv[!.!kʃ:D9g"@*R0KQa,M|e~Ati!C:ۃ'|, 9gq`@! W<-րw0FW&<Ȉ<БxϬB1}z^ +q = t%]΃cycob+НK=Ky*>P:V%&E dң`ֵCKG VhYʊ $jVGUAqvw{xedĎ")v##PZ@t``v^ +Ln:Cu'v]7 6$9W)t]שn"L# B + 麎 VDC Vu]P_h  Zx(:e0 _ u6ij bࢨJųm"#xh& +!'ˆ)*X@73ـ mvx`,EwD']hERt%DuF&ѱT45B3E@_w?fLe3 oB:*J{AM_]ījC^uY٨$ +V䶫=N?Jb(Q9Jb([ߢfL&V˿Ev>NRI%OԒ6D,aCHlRd`.&3IȔ/ioS` I徼iP2- !ocjҦ>ƞ# |Lm܄2^.rO{Yr]CEfYZ+}[)23EE<"Ni֎O4wmn'|ZqmEw +(]AYQR5lR(+&:#gg 'F1A}ǦD̎ɵ۪nHO0MD +n5BS!]c~/R]!V2NW+;Z5mwV8`'a/ +g>P!ӣG8 u eu>TK&B[ Ɓ IňEňbGY#Sh P޿V rJ_` f{L/!m&t:B((.Uu1^B́O0f/|fĒ-eKRT"Dp$-eKkH"R)J|oClO--zdtfLI3id5l߈H8|{\@{eKP'(CW)=@0`2EoS-q3ExčeޡeQ]{&IB((5l~$?^bj˓rϋ EŹjґ + 2PHN +:xTiih Sk)id*ܭlO0Pez|EP v p +-OWvApnu1M`Y79ݐ'dz% D*آǁ6&:rdQhY"<2U$x1:1$y H:m"rX,) 4yv1c-yCb$R1D P[5^iY4(LrPuv5Y|:w}ut )ybⱷC+[A7`@P Gu"Kg[IL!e@cnRSRX"pm(%"RCB+mar*p W=/ҁ + +8``rH9F\aljz6 Qמ`@c=Rj{.Iڞ`0mUǜ#U`6er3%tݰ!VZ<n(!J!*w{Bks W( V5 oaZXY(BktEM ?rHB8|" O a7mv Pҙ2&PI|QIB` MB@oDqj1mrM5|`ZޭRL`6l feyRYi'PBk$rO=Brt!2P0/`Ȝ s,s*Hp,+Ú5M]i:p{a.7׌״[ah7o<0j:cy:86i>u(\c٦nayhH s-`@9O"@,):E=dAsxu7h Z` `+i1q(gAX +- Se'§jj:b1hkah+ѐz8/dNWםCg; Chiv*@ر\YjG(b# )hO0A2_f[IlCZf#(i6!I! y02!ES3I˫hջ%m+3L1'NK JZqkV2cGm$s A\CqѦ>b!'">k,}.0M!HLO3D䍹sJ ce9)iCT4HNVS5,e]eW:!Wk;̕HYbSOsfMZ_`[ /gA%s R/k\kKJ5$%/ǤNM[]d!(be} ی84F$]2Ma1Eb)5 10<ȏ!zdX\1>~9hRrQ10a]&Y[yO0+y JYUŪdU{B*o90I>CR(M# +l76 +EJ횂$/DӺ>&ӯ$b=H=`XGcq2Jq1@A ұ<.W ENz\`VhKK'ڃ5WD 1X<`\mKYWmMK:d])FA3R`oHmF% +g~16\B+zc4Г('$nU(=/q4@U be]wu};D/!,[]̯ԖPHM!Dx;$'?u?{u"{cUHީ7h~(w`>HB +[S[6bgG]OdkD.ք *In((k-V0|>70O0 !K9 +٧Qߨ==y0֒XH]UdBl$+ *Ǫu5!=0 LnL*FI:#ܶޖe$J듹ͥCf G5Neq8`g*meERt[E0Jn2q8m(2^ ²aC1Ў5$[}ZN>v4*#,[.95L[2z|)P#wy܏MQXhY8"e#cO4eK'G/EI k] R)ZL$JEUeIfE,Ag0b% #tJ iTΙ$^F;вpDrp4^=Crf|w*ɁCx\aJ+vtb8CA*:2 m ;Ú ,a bh{$>Ig`N)JHFbECCmiY}rB&28ƑIQAB1LUn]۵T2/Eۻ 7VS)I핣$k8؅d-_\mԡ뵬ASmwe|h{XL˦^G@BaNN\$1@;UY>RvɌ`K'Ƅon8Ôl(ӫŧR~(Ư1Λ&wq3qO"^I"^ +j}nG`T#Z +ta m}$^US7x X'A}@\M'n|JsO3pPbh&l~fk!)ԹKs:Vl$d8c^hITFr'mԪawl_8&k;QB5^4HrzR()A߂?6E'`q!Gm:BbVu*$]2 dHݹ-$9z)6e@ `>JDڝtzx <a-Qߙp+ߚ1;Ig+Z*[P1%VF,Dt@C_Ce;ѝ e&Qv§m%V1c"B4Vؤ3bLjkcQ$h].BP܁PsDFHKF0T?VD`IlIoJ(鯲ya:1BLnAo@5EƁJG:q=}!1"5`J_C̈aQljP{H-5OfB: w3)Zh@8^f)SFv w}fރސRj\>8]W}z؇g~ا._'BǬ9f`6q[1-_TME7/cuy2CẲXQ[O3݋(h0jai;o%Y7 XR|3Q`JBa#\Y/1%Qa`IQ,)6/ԫۦ&rR-x(Ӡ K]l}Oby _{+?4 ïWUxNL;_ʴ_٣W#_i{DGrQi>;m)Wi$Z)$ʷ{'bgFl *ҝGڵ <2(x]"80һG 5?6+$USRmU%-O &?*'v}>&e?]2ֆ&%jUxBn"u#y:bRLzm\bR rФ!Җ5O^n`6q2 :MBDԬӰe=|Ѝ +g+Cgι7On2 p!am"cV(;zhI˶xMꅴ6Wp cR'-@l9}TA}<Ë>JuR$G祿TWhaIV+9WzX~fE~a:)-I$ F, V~*b!OQ -qxILzv0\Jt%H+ft?@l=+4ڵ z{A ?-|n׊M;Lze[ͮJCsŏ^ ȥ8+) VÌh?9C:N6~9mRm]s!fXjVmᒻ.nMNx-My^6>*|!yuidc[H ]BW^?gJȬgBHw&Q#$b`Isnlh-OKWZˋf)_(4= "ߡVo%)jъgz +5l'Hq:\tk }XD!`و>=2ԣP<teVMQq a\Cn`/CR_[IY9~x9mjW%f%Ǭm0VS.8DYrqrDrn3Kh !0tFgc7kobb+=*v(k-]@w |$'w@L!-xe9'rqZJ`bף)*ՊUE]5h4?Ͻ2<b@#(8!8P|l M@Y"ٟ\bj!L9:'qB6=ē%A?0YuSb({@` șUR>d5xLL_V6W/pr W^Ȗl8x\ "u^̮{ѡRr}oM0\e v?PξS:.A'hJ>}xb6p xQP ( (@#+!]`jE-ۤ4X,@B.2;`C1Oa6MBrWZ>#C1L5L: +eE\2ܥa(.$_MЧ1p])stڸj0qKeqW ]Rd-EAkҾpfNobY!']bhIy^VYU4^ko@ 3 M/ Ai,H'/04"t)0_2e@S5`Fζ#xp ?ZY +|ת*d01C3O ZZՇ+U T>&,8:ͣ:8C㈏j/8DD\p ^{HBB$QC׀\P>f~k+0%J#ɛ=w=9@ x`N,CBdz%'9-DygB3`Hk;rpT۫W)9R H4aw( + ?T(ca9|JXU1;TRb2H<25) 4Y6Y[=&sݴ Qdqu>W(e@" +ǃ.,8Ѕ19{Y@~ +!_!K"i cvf{mV>,Gx=o,D <:o*R7eq;V ̛/~OVK%ݿ^݉ ~0ox$ EMQb;H6&6XwyoO }8 e?`/ 2+Jl-Λ/hs[Ee;mmX$/Rgtr|]Fctr;4!_{`Xm˨)nQ8:3[mw<9Aw>R,j@sL6BvOzDH4CLJ|K#|+DfF &&t~i-mv=zdZ3P@}fEd?;o?:@}_"OUy>K0X~?T.g/_zso~`RY,!BhOVORu +\Pb"rA=ֲ#̧޿vUD;\'A.J$_5x9v=jy;qAUXDDR?B/ !Y]@2>lyKL1_]n4Qэ~Dp*=5 +di yeҫc[GIT_ċGləehf'dlRr6!a,,EܺV)d`: KU~#cd oaN.p];.wfsz\3gk\I@&>UEYĦR7Rya],nM~qmzʦ_% +PO4VbhRzae۹NT.F5j/ @d.E'Z߀L\!Dc#o`>So恉eS6iG +bBI|R*u\,U,tRɫ|./k]Ps +`UXȍE 92Q9,e>.l=!AjZqFv/b +1ߋt]mhh3:)RL}P%cw(kyyb?6Suˆ ]tf8 "MtH?4q)dYp0,uV_#}M}(SHm YV[eۉ%"6֌I\Y]OfpJ4JEU6[ 7V{ K_p |Z|y?MRbWLyp6 v& Mo5kLHJwlx2wJs{B'6ҔGBE +QMlՇҋmjdến>*-kbr^,c99CKisʼ$zM DҟL̳ij q9Ŭś5W c'Fj*Z Q'@Q$z&IKAfX}M5l&JuׯRӹ'D5mS_ψ漓AM+\uWKf^_k,ᘘHϠ薯ɨdJ`)V=ww[5T0q^R]3Xɴi K|2~\F,lSb XN yG5,[F~cdX>ɑġlp"fyD~8c< -[?K5ߗG)hsf=?vq ~wA..`HeeP;\GnPY "l 9I" +`j61;pVu/PUC_&MY~Ñ 9 ;UFj+:wO@pmQ +#%@yvLT>a"D]!^C=dmjQp$`9&ư4)d?,Wu8}ʦ]17p +RZzwD@b=Ѻ%di/N +&w'k- FCؼzgFZ2rB9'41tDey~Ƌ|(7O``u; %yf3jbT[A]*n{iu᷈9, )6IOaOĥia 6qQ;ih k$ImJ˛MwT98si7k+GS-7G`͠(S hף//A3ٸ3ʗKőd|DNG"- .8qezT.KӔpQ7&G[V᱂H1>fs +{8"R-OZ1˅hdc g7G<ė+UaҐ=1$Tz; b=ྺ8nD.V*zڊD_8$9jea4Z (XaSPp +'inp+MEOD<aWak%Jf +Շ,t"/@n΅"L\K,-v4  4yv$JYz2{X38sҲƿ\AJUIF1ig۞\40Crt9DU|$Thp Z+EC٥C6u?#S,7Dc}xBĘdԹj S2'0|@12h#*[}0A1b{/T\?n.\H@Q?<2=OpE}mֹ#{Q}z6~ HWm:<#tI,n 5/C-9>Lx XA֐ +J +&K"DcIgׁx\JcYx E;uKtor"Dukmrj˺D_-dL۬,A;0E9KhRN%NY蓀qp UF<N+DӴGbZ!{a)pv歄SzӉeEI#ScG"'m +oRPX=J"Gq &형1BCjRnm\[*VX+ +[w˃Vq&6O!:z˒C#5JFy,r/DgdyD=^]O@-Aͦ_\$hQN>1U_KPB=ݞ[ZyH C(U3M'oz% +hkSZ đn luC36gvG y:p) +qh#@~I6+u Wn6 z?ylPO{9ynƌo7`OZCص,5Hw  +TƷ=Q^+8^{A6ALr v"Ϙ(rgMX3֙۞l6a'ޤSmWJnݯ);c, ˮIwlO8Ɗ8mwՈeDHa Lj)5[C AJaD(Lt_U=#>#~ʋ LE:>*S)H^iȥ=Ԡ>%(Il5:jrbvnMPNqe6E6IT 5ݾ- Y $vɑ+=˜ϗ28a:ϔN@_l6Q퐝 &RY1o~ +"O6Qd1/2%e=c~K%Iq\M3 )c4B]}g8O2fu:VTuHe&OjH%}~hA[yTzJP>0E/cBml'YMm;0ǛU]Pzq#s"gZ?c0EFѯڋcK@@P7CґlvWӒBLKVbǼLTܰU^2G,F`OO㆏`ʰ{c*m'ǓeЉF_H9"[x8S9SU/?iQzZ{8ǔ' ަZK ZގGcSn$K-4LY:ǺGv3X~C=~݅GQ&jJF2Ͻ&=RPtZ:Ki8q\7!۟^2I-ȅMǷ]J-O8p94䩫-nٴ0m4q=!u! +d .l( <-0 %{d"3i@=_ KAKEY +枀kxusg> +>stream +CAsjZxRh/nH`A?kuGJڲ!R9^r)Ik.:ATK&.|=Գк;DZ_v[S%ql}FSj|m >79 `̟FtT>Ӭ +\/@9b$z4RPhVΗJ] D$F_h rI*όtδ"(y]ZwGR$t?Yփ z[ S1?L] ě&*)V7K%!dF +E,>0٢WQ8Th< c-8jzQ]4!)s^]V,dm;馭[# \=%@ęɷd3'ɉRPAb}{LYrA,3)ZYf|]MF6Mm1rf/, t, %oTԢB'I^-dZc`n&|%6r\lx+̌q.gc5v]47~fxJGЧˑzާ*li-T uCm8 :MYU; xƐNe?3[Gj1QۭS+y$<3n I48C'Ŝ[bmn H.cT9JH뇜[t0fᒀd:8X02,wnt&hoOuW RP.jqpg̀fF~¨*X2s3E)A [M0^ JT_mn:ƾE'ri=iߖN-jܱDn*ܶB5+>geU A==% +c7jXb7'拁5 +{z19ƀZKCd[Pq" ~AVٲ`Ú`Fofl"J8ߧu h]Ĕ4S\,3ݗs"65a/%XXq['?"UGשY"+cu\fftTEn[M 5ָUe >PUX,{eЉƎg3*@E^j'FL¦ G*پHSjUoZJoi.ֵM)b@T$"zc\goŔJf*`NiČB <ե7tdH Z~dϧQO@ꌞTd{Zx [,{^` +)[7I-\Au)[hX)Eȵ^݊w>ٛU7(,M٨0''6HqZ!}kIИM͓gC5 .X2a`#LvKm`"C'G؎^ףp*#L Rg }#첩5G蛊7qt%$,v7z`O#@c:FII6f3es>Y6" uxghQ{n8Oab V?lZWRe0=UWBӡnJhN뗍FQtcl~H|<\ŗE"1/nXM$LG:@JZh=*#? R"fHSE#i %w(0.~_PDž?B$ +kpIBY\JKL6Xy]f 5g?%tb ̲pݧ(Po=.B"os79LT L"bNpBylYkP+dZVR Z[?qxclj)~ Yyp÷(>7sWŋ*El ++#9]ˏfiF3hϤL+ A{G(fcjdlwi::=j<@m :ڟ[q/2նk!ZďS'$;JYK2Qje0݇wY;!r,HQȂN C<<ǸMꅥ"U-9w"*Yo@TsBIb|oL :;j9զxˠ۞j lzbCg0Ѧ6( +pȼ^]ŝw< HM[0N}5ղK>^9/PHf[T˖74+T;Xv6߂c^FTTr Xsp̍Q1LT#3*Cw2DCCxcF ̻jST+yxDQH +KJ Y=&b[P$ D3 +eCDPnTEa~ѩq=/'?uUɟJ ~q Cm][*Ra]A杍z8 eB&gjĚ,(^j1 +lGCC,F/oq? 0„t +kghYՏkN,;-U*1} h +Q tbii:_!YTu-!a(ڨ*Ta["(b=?xp 1pc#e !'lZW;$6 A&ꁗX' ᬍ(ijYhs@eYۦ\%wDuYEzC w]STG;#N@%YХݞ7vn$%[B),֢`Yw+y3|ON_,Qx[kё.KTZ230"x<]0ZH!544LfUɑ=r y'rۙfRIX!+[p$ﰡ`ifҦ͆>u0Kn)^jf)7qC]ВT)[@| E9V"m-pe>q<]k:BB+wl3Cm^=0A!@9cv! ]C6ŌdtUWaC%_oaIə(N r\(8Qs'%wB `E1h5N{,C?W@^gOZ  uaMBՕйCD\} [ߌ6ᩱ\'&݊]u.S|y`t#YuDʼn=# |^ /~#̟ha߮k2X(~K'QۗzkhB#6 f$ ؁Dmc M,+>X- mg/ +0~7 +n'ˍ*CL 8Er)Mh` xX}Á'|3XrJT,(A3 ]laTB vZQ Kӵ;CJ|."|8rbx4U(BK&/؊WG N1y7DC!@V@c;>hgoM*\Hr5)t]7 "fQnnJ^-BKǡ5"!|㺨߁27:gE4f@9dAP+9pU[~ c!83C%3,fScYCB--(/=j_!S$f +. /Őqq$NK:zZUkr=6rA@ ioMtFѢS0zM/_M#t*Iߙ1Q\jDF["޲h/:q"R.ڦJcHJqC .쨈'QT@G7Io3mF|]#kr 3b!4UPNGfMd5z^_6qWJZf֘M d7j]]]+/h2\$Z>+aDJ5BYy֚ب#'ydEޏ.j(9F6A{[Eӵ$]U!)?iD~j +%#qsxHޓ,%/pG2ԛrhMM%)" /;Otk'}N'yy' q+ A!T^v'P :G2wИ +\oH @Q1 rbQ,^t׎Tݾ?.୸TfpE"ctCBxޅJd5*2Mռ\r"ڰDG8G\*'.A4+EBa,B (k`uXD&i'UP opW" ?zxS'" $KKJt湴L)2 8IoXz~"D&%}љ!S~FM ''V (}+8Dd/tMiXVB)N\d+KSTp,0߂Mбt1)yM:qK ϙkp(inbaj2qwtƮʆ^g)/ģcG(``yd),G&"0c\axE:u!0rz֌Qذ d"Rdhq^dᧅ6dX9uw,ν|s5s Nru1kNK|A3ڐ4m.2EO0P'xƕ6$QďM rb1P 5ᭂs B% QPQ7КXCR"-bwP|X,^:Q/TJhiX,`ԠbM<-}A--O2-TK>-q,s nri6& \s8ǙAj`2LaykV.t!5-AC< ^K`[Ϸ2{eAư[^~.riYwr2+GJ2Ga)@ڏhz 8>\ˁ؀@Q) YAUtP0u5aJ*1&rßYNZQA ( V ek}I$\\(:eN)Ū&a)XܤO):OXn殦IGvsvU ٚ&@]`'>qӎ.5eR6W;JX\c(PJw] /xcPGO+..L”ldWSFBxXԊ/K$uN`WRnOF[[ u>G{ʊ  +{.2b86[$ +{%0F9<@k2u\fHg&x'L  +xwO\H:e阨YA8bv]~XwheڅE5ْߋc!Թ~EGS3BC tC ݩ{5po~LrӋe*%fQߗQ%q(Of!1 Qh!JO,ML}M( : %ΰ 7sz\ַO9*5]GgYyq\ (U5H7J+%X(ײ13i47T |6 'b<}9K =wpK9/u='_@{咻5AP+`B]&2Dnsőj;(wvIv(mGAʻH .&nkgn(TAQ0\}D@GDS[?Q!sԵ;FHv9/2%:մ_TZ.4.Y#^}\)>vA]v̓j(񉶛g$NQzmRnK(.J ^]DvK#qЊ## +endstream endobj 42 0 obj [/ICCBased 44 0 R] endobj 36 0 obj <>stream +H\Mn b.`3 mzmm2!l7יyfz:ϺxssiY\t@h]~RY3!")--aXsgK=IVdKwtm &1H=KLcDT;Hͬ&6D`j[MvEz^ܧ{랋l^Us +endstream endobj 37 0 obj <> endobj 51 0 obj [/ICCBased 44 0 R] endobj 32 0 obj <>stream +HdK +1D}L:1(,aEDU/U݁Sb3'>1fi\L2 ⷖ-s/2G4B+e +BڨORh + ;.jKA@Q:R{ԅyki`V44 +endstream endobj 33 0 obj <> endobj 52 0 obj [/ICCBased 44 0 R] endobj 30 0 obj [29 0 R 28 0 R 27 0 R] endobj 53 0 obj <> endobj xref +0 54 +0000000004 65535 f +0000000016 00000 n +0000000175 00000 n +0000022777 00000 n +0000000000 00000 f +0000022842 00000 n +0000000000 00000 f +0000000000 00000 f +0000028459 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000028532 00000 n +0000028772 00000 n +0000030267 00000 n +0000095856 00000 n +0000161445 00000 n +0000227034 00000 n +0000292623 00000 n +0000000000 00000 f +0000023243 00000 n +0000027778 00000 n +0000027849 00000 n +0000027917 00000 n +0000302145 00000 n +0000023645 00000 n +0000301828 00000 n +0000302048 00000 n +0000025094 00000 n +0000024981 00000 n +0000301420 00000 n +0000301731 00000 n +0000024081 00000 n +0000024377 00000 n +0000028336 00000 n +0000024439 00000 n +0000301385 00000 n +0000024918 00000 n +0000025129 00000 n +0000028220 00000 n +0000028251 00000 n +0000028104 00000 n +0000028135 00000 n +0000027988 00000 n +0000028019 00000 n +0000301793 00000 n +0000302110 00000 n +0000302184 00000 n +trailer +<<3DF9902BF72B554C8410B076CE7E4393>]>> +startxref +302367 +%%EOF diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..a093c74 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,13 @@ +{ + "env": { + "node": true, + "es2021": true + }, + "extends": "eslint:recommended", + "parserOptions": { + "ecmaVersion": "latest", + "sourceType": "module" + }, + "rules": { + } +} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..688277f --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,22 @@ +name: Release +on: + push: + tags: + - "v*" + +jobs: + release: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: 20 + - run: npm ci + - run: npm run build + - name: Create tarball + run: tar czf catppuccin-gitea.tar.gz --directory=./dist . + - name: Add zips to release + uses: softprops/action-gh-release@v1 + with: + files: ./lugit-theme.tar.gz diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..eccf49d --- /dev/null +++ b/.gitignore @@ -0,0 +1,164 @@ +### Node ### +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +### Node Patch ### +# Serverless Webpack directories +.webpack/ + +# Optional stylelint cache + +# SvelteKit build / generate output +.svelte-kit + +### VisualStudioCode ### +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.vscode/*.code-snippets + +# Local History for Visual Studio Code +.history/ + +# Built Visual Studio Code Extensions +*.vsix + +### VisualStudioCode Patch ### +# Ignore all local history of files +.history +.ionide + +# Support for Project snippet scope + +# End of https://www.toptal.com/developers/gitignore/api/node,visualstudiocode +# Support for Project snippet scope + diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..f7fe484 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,6 @@ +# Add files here to ignore them from prettier formatting + +dist/ +bin/ +lib/ +node_modules/ \ No newline at end of file diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..4d8927b --- /dev/null +++ b/.prettierrc @@ -0,0 +1,20 @@ +{ + "singleQuote": true, + "useTabs": false, + "tabWidth": 4, + "printWidth": 90, + "overrides": [ + { + "files": ["*.yml", "*.yaml"], + "options": { + "tabWidth": 2 + } + }, + { + "files": ["*.scss"], + "options": { + "printWidth": 100 + } + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..2c4a516 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,39 @@ +{ + "files.exclude": { + // 📙 sub-libs + // "tools": true, + ".design": true, + + // ⚙️ config + "**/**/*code-workspace": true, + ".cocorc": true, + // "**/**/package.json": true, + + // 🔄️ CI/CD + ".github": true, + + // 🧼 linters & styles + "**/**/.prettierrc": true, + "**/**/*.eslintrc.*": true, + ".prettierignore": true, + + // 📝 readmes + "**/**/README.md": true, + "LICENSE": true, + + // 🗑️ + "node_modules": true, + "package-lock.json": true, + ".gitignore": true, + ".git": true, + // "dist": true, + ".vscode": true, + + // 🧪 tests + "**/**/test": true, + "**/**/tests": true, + "**/**/*.specs.ts": true, + "**/**/*.specs.js": true, + }, + "scss.lint.emptyRules": "ignore" +} \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..91ec279 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 lucas-labs + +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/README.md b/README.md new file mode 100644 index 0000000..444efb6 --- /dev/null +++ b/README.md @@ -0,0 +1,255 @@ +

+ +

+ +🎨 lucas-labs/lui-micro > A lightweight scss library for building themed UIs 🤏. + +

+ +
+
+ +## 📄 Documentation + +### 📦 Install + +Download with NPM/PNPM/YARN: + +* `pnpm i @lucas-labs/lui-micro` +* `npm i @lucas-labs/lui-micro` +* `yarn add @lucas-labs/lui-micro` + +Then import it in your `.scss` file: + +```scss +@use '~@lucas-labs/lui-micro' as lui; +@include lui.init(); +``` + +### ⚙️ Options +The `lui.init` mixin can receive several params: + +* `$theme`: default theme configuration map +* `$breakpoints `: media-breakpoints for breakpoint utilities. +* `$options`: map with options for the library. It can have the following keys: + * `reboot`: boolean. If `true`, the reboot will be applied. Default: `true`. + * `basic`: boolean. If `true`, the basic styles will be applied. Default: `true`. + * `theme`: boolean. If `true`, the theme will be applied. Default: `true`. + * `merge-theme-with-prebuilt`: boolean. If `true`, the theme will be merged with the default theme. If you choose not to merge it, you will need to provide all the necesary variables. Default: `true`. + * `color-utilities`: boolean. If `true`, color utilities will be created. Default: `false`. + * `typography-utilities`: boolean. If `true`, typography utilities will be created. Default: `false`. + * `fg-var-name`: string. Indicates the name of the variable that will be used in the theme config to set the foreground color. Default: `text` + * `bg-var-name`: string. Indicates the name of the variable that will be used in the theme config to set the background color. Default: `background` + +> 💡 All parameters are optional! (defaults will be used) + +### 🎨 Theme / Customization + +You can create any number of themes, but one of them needs to be the default theme. Normally, the default theame is created when calling `lui.init`. + +#### Breakpoints +To set the breakpoints, you need to pass a map to the $breakpoints parameter in the `lui.init` mixin: + +```scss +@use '~@lucas-labs/lui-micro' as lui; +@include lui.init( + // this is also the default breakpoint map, + // so if you don't pass anything, this will be used + $breakpoints: ( + xs: 0px, + sm: 576px, + md: 768px, + lg: 992px, + xl: 1200px, + ) +); +``` + +#### Setting default theme +You can set a default theme by passing a map object as a parameter to the `lui.init` mixin or by using the theme creation utility. + +- Using `init` mixin example: + +```scss +@use '~@lucas-labs/lui-micro' as lui; +@include lui.init( + $theme: ( + colors: ( + ... + ), + variables: ( + ... + ), + typography: ( + ... + ), + ) +); +``` + +> 💡 You can see an example of a more complete theme config [here](./demo/style.scss). + +- Using theme-creation utility: + +```scss +@use '~@lucas-labs/lui-micro' as lui; +@use '~@lucas-labs/lui-micro/theme' as theme; + +@include lui.init(); +@include theme.create-theme( + $theme: ( + ... + colors: ( + background: ..., + text: ..., + primary: ..., + + // nested maps are allowed (also allowed for variables) + grouped: ( + a-nested-color: #fff, + even-more-nested: ( + ... + ), + ) + ... + ), + ... + ) + $as-default: true // set as-default as true, so lui defaults to this theme + // this theme will be also used as a base for when you + // create a new theme +); +``` + +#### Setting default theme +By using the create-theme utility you can also create themes as non-default themes. This means you'll be able to change between themes at runtime. This is possible because themes are made only of css variables. + +```scss +@use '~@lucas-labs/lui-micro' as lui; +@use '~@lucas-labs/lui-micro/core' as core; + +// setting a deault theme called "light" +@include lui.init( + $theme: ( + name: "light", + ... + ) +); + +// creating another theme called "dark" that will not be default +@include core.create-theme( + $theme: ( + name: "dark" + ... + ) + // don't pass $as-default here, or pass it as "false" +); +``` + +Now to change themes at runtime, you'll need to set an argument in your tag: + +```html + +... + +``` + +To change it back to de default, either you set the `theme` attribute to its name, or remove the theme attribute from the html tag (it will default to the default theme): + +```html + +... + +``` + + +### Mixins + +#### Vars and colors +The library includes some mixins that can be used to access the theme variables and colors + +```scss +@use '@lucas-labs/lui-micro/color'; +@use '@lucas-labs/lui-micro/var'; + +.my-div { + background-color: color.get('primary'); // background-color: var(--c-primary); + color: color.get('primary', 'rgb'); // color: var(--c-primary-rgb); + + // it works with nested colors too + // provided you defined your nested theme-color as + // colors: ( + // my: ( + // nested: ( + // color: #000, + // ) + // ) + // ) + border-color: color.get('my/nested/color'); // border-color: var(--c-my_nested_color); + // dots instead of slashes can be used too + border-color: color.get('my.nested.color'); // border-color: var(--c-my_nested_color); + + + + // get a theme variable + border-radius: var.get('font-family'); // border-radius: var(--v-font-family); + + // as with colors, it works with nested variables too + // provided you defined your nested variable as + // variables: ( + // my: ( + // nested: ( + // variable: 10px, + // ) + // ) + // ) + border-radius: var.get('my/nested/variable'); // border-radius: var(--v-my_nested_variable); +} +``` + +#### Breakpoints + +The library includes several mixins to help you create responsive layouts and styles. + +```scss +@use '@lucas-labs/lui-micro/bp'; + +// @use '@lucas-labs/lui-micro/bp' with ( +// $breakpoints: ( sm: 576px, ... ) +// ); + +.my-div { + // create a breakpoint + @include bp.up('sm') { + // styles for sm and up + } + + @include bp.down('sm') { + // styles for sm and down + } + + @include bp.only('sm') { + // styles for sm only + } + + @include bp.between('sm', 'md') { + // styles for sm and md + } + + @include bp.not('sm') { + // styles for everything but sm + } + +} +``` +#### Typographies + +The library includes a mixin to get typography styles from the theme. + +```scss +@use '@lucas-labs/lui-micro/typo'; + +.my-div { + @include typo.typography('heading/h7'); +} +``` diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..82d7a52 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,5699 @@ +{ + "name": "@lucas-labs/lugit-theme", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@lucas-labs/lugit-theme", + "version": "0.1.0", + "license": "MIT", + "dependencies": { + "@lucas-labs/lui-micro": "^3.1.4" + }, + "devDependencies": { + "chokidar": "^3.5.3", + "eslint": "^8.43.0", + "fabric": "5.3", + "imagemin-zopfli": "^7.0.0", + "prettier": "^2.8.8", + "sass": "^1.63.6", + "svgo": "^3.0.2" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "http://localhost:4873/@aashutoshrathi%2fword-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "http://localhost:4873/@eslint-community%2feslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.5.1", + "resolved": "http://localhost:4873/@eslint-community%2fregexpp/-/regexpp-4.5.1.tgz", + "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.0.3", + "resolved": "http://localhost:4873/@eslint%2feslintrc/-/eslintrc-2.0.3.tgz", + "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.5.2", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.43.0", + "resolved": "http://localhost:4873/@eslint%2fjs/-/js-8.43.0.tgz", + "integrity": "sha512-s2UHCoiXfxMvmfzqoN+vrQ84ahUSYde9qNO1MdxmoEhyHWsfmwOpFlwYV+ePJEVc7gFnATGUi376WowX1N7tFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.10", + "resolved": "http://localhost:4873/@humanwhocodes%2fconfig-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "http://localhost:4873/@humanwhocodes%2fmodule-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "http://localhost:4873/@humanwhocodes%2fobject-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@lucas-labs/lui-micro": { + "version": "3.1.4", + "resolved": "http://localhost:4873/@lucas-labs%2flui-micro/-/3b01aad9d6a6b85645f0119ccb190caf1912aa9b", + "integrity": "sha512-qGFaGa1xjDACiVPiRtnvHFVl6A7l3g+3Ejrw2BqluoNv/3ePDvhVRsjj0u4YCxHD4C6DjIVIZaraOS52CB6E2A==", + "license": "MIT" + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.10", + "resolved": "http://localhost:4873/@mapbox%2fnode-pre-gyp/-/node-pre-gyp-1.0.10.tgz", + "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "http://localhost:4873/@nodelib%2ffs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "http://localhost:4873/@nodelib%2ffs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "http://localhost:4873/@nodelib%2ffs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@sindresorhus/is": { + "version": "0.7.0", + "resolved": "http://localhost:4873/@sindresorhus%2fis/-/is-0.7.0.tgz", + "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "http://localhost:4873/@tootallnate%2fonce/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "http://localhost:4873/@trysound%2fsax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "http://localhost:4873/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "http://localhost:4873/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true, + "license": "ISC", + "optional": true + }, + "node_modules/acorn": { + "version": "8.9.0", + "resolved": "http://localhost:4873/acorn/-/acorn-8.9.0.tgz", + "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "http://localhost:4873/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "resolved": "http://localhost:4873/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "license": "MIT", + "optional": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "http://localhost:4873/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "http://localhost:4873/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "http://localhost:4873/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "http://localhost:4873/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "http://localhost:4873/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "http://localhost:4873/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "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.3", + "resolved": "http://localhost:4873/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "http://localhost:4873/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true, + "license": "ISC", + "optional": true + }, + "node_modules/arch": { + "version": "2.2.0", + "resolved": "http://localhost:4873/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/archive-type": { + "version": "4.0.0", + "resolved": "http://localhost:4873/archive-type/-/archive-type-4.0.0.tgz", + "integrity": "sha512-zV4Ky0v1F8dBrdYElwTvQhweQ0P7Kwc1aluqJsYtOBP01jXcWCyW2IEfI1YiqsG+Iy7ZR+o5LF1N+PGECBxHWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "file-type": "^4.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/archive-type/node_modules/file-type": { + "version": "4.4.0", + "resolved": "http://localhost:4873/file-type/-/file-type-4.4.0.tgz", + "integrity": "sha512-f2UbFQEk7LXgWpi5ntcO86OeA/cC80fuDDDaX/fZ2ZGel+AF7leRQqBBW1eJNiiQkrZlAoM6P+VYP5P6bOlDEQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "http://localhost:4873/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dev": true, + "license": "ISC", + "optional": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "http://localhost:4873/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-find-index": { + "version": "1.0.2", + "resolved": "http://localhost:4873/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "http://localhost:4873/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "http://localhost:4873/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "http://localhost:4873/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bin-build": { + "version": "3.0.0", + "resolved": "http://localhost:4873/bin-build/-/bin-build-3.0.0.tgz", + "integrity": "sha512-jcUOof71/TNAI2uM5uoUaDq2ePcVBQ3R/qhxAz1rX7UfvduAL/RXD3jXzvn8cVcDJdGVkiR1shal3OH0ImpuhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "decompress": "^4.0.0", + "download": "^6.2.2", + "execa": "^0.7.0", + "p-map-series": "^1.0.0", + "tempfile": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-check": { + "version": "4.1.0", + "resolved": "http://localhost:4873/bin-check/-/bin-check-4.1.0.tgz", + "integrity": "sha512-b6weQyEUKsDGFlACWSIOfveEnImkJyK/FGW6FAG42loyoquvjdtOIqO6yBFzHyqyVVhNgNkQxxx09SFLK28YnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^0.7.0", + "executable": "^4.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-version": { + "version": "3.1.0", + "resolved": "http://localhost:4873/bin-version/-/bin-version-3.1.0.tgz", + "integrity": "sha512-Mkfm4iE1VFt4xd4vH+gx+0/71esbfus2LsnCGe8Pi4mndSPyT+NGES/Eg99jx8/lUGWfu3z2yuB/bt5UB+iVbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^1.0.0", + "find-versions": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/bin-version-check": { + "version": "4.0.0", + "resolved": "http://localhost:4873/bin-version-check/-/bin-version-check-4.0.0.tgz", + "integrity": "sha512-sR631OrhC+1f8Cvs8WyVWOA33Y8tgwjETNPyyD/myRBXLkfS/vl74FmH/lFcRl9KY3zwGh7jFhvyk9vV3/3ilQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bin-version": "^3.0.0", + "semver": "^5.6.0", + "semver-truncate": "^1.1.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/bin-version-check/node_modules/semver": { + "version": "5.7.1", + "resolved": "http://localhost:4873/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/bin-version/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "http://localhost:4873/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/bin-version/node_modules/execa": { + "version": "1.0.0", + "resolved": "http://localhost:4873/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/bin-version/node_modules/get-stream": { + "version": "4.1.0", + "resolved": "http://localhost:4873/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/bin-version/node_modules/path-key": { + "version": "2.0.1", + "resolved": "http://localhost:4873/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-version/node_modules/semver": { + "version": "5.7.1", + "resolved": "http://localhost:4873/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/bin-version/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "http://localhost:4873/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bin-version/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "http://localhost:4873/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bin-version/node_modules/which": { + "version": "1.3.1", + "resolved": "http://localhost:4873/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/bin-wrapper": { + "version": "4.1.0", + "resolved": "http://localhost:4873/bin-wrapper/-/bin-wrapper-4.1.0.tgz", + "integrity": "sha512-hfRmo7hWIXPkbpi0ZltboCMVrU+0ClXR/JgbCKKjlDjQf6igXa7OwdqNcFWQZPZTgiY7ZpzE3+LjjkLiTN2T7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "bin-check": "^4.1.0", + "bin-version-check": "^4.0.0", + "download": "^7.1.0", + "import-lazy": "^3.1.0", + "os-filter-obj": "^2.0.0", + "pify": "^4.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/bin-wrapper/node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "http://localhost:4873/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-wrapper/node_modules/download": { + "version": "7.1.0", + "resolved": "http://localhost:4873/download/-/download-7.1.0.tgz", + "integrity": "sha512-xqnBTVd/E+GxJVrX5/eUJiLYjCGPwMpdL+jGhGU57BvtcA7wwhtHVbXBeUk51kOpW3S7Jn3BQbN9Q1R1Km2qDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "archive-type": "^4.0.0", + "caw": "^2.0.1", + "content-disposition": "^0.5.2", + "decompress": "^4.2.0", + "ext-name": "^5.0.0", + "file-type": "^8.1.0", + "filenamify": "^2.0.0", + "get-stream": "^3.0.0", + "got": "^8.3.1", + "make-dir": "^1.2.0", + "p-event": "^2.1.0", + "pify": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/bin-wrapper/node_modules/download/node_modules/pify": { + "version": "3.0.0", + "resolved": "http://localhost:4873/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-wrapper/node_modules/file-type": { + "version": "8.1.0", + "resolved": "http://localhost:4873/file-type/-/file-type-8.1.0.tgz", + "integrity": "sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/bin-wrapper/node_modules/got": { + "version": "8.3.2", + "resolved": "http://localhost:4873/got/-/got-8.3.2.tgz", + "integrity": "sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^0.7.0", + "cacheable-request": "^2.1.1", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "into-stream": "^3.1.0", + "is-retry-allowed": "^1.1.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "mimic-response": "^1.0.0", + "p-cancelable": "^0.4.0", + "p-timeout": "^2.0.1", + "pify": "^3.0.0", + "safe-buffer": "^5.1.1", + "timed-out": "^4.0.1", + "url-parse-lax": "^3.0.0", + "url-to-options": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-wrapper/node_modules/got/node_modules/pify": { + "version": "3.0.0", + "resolved": "http://localhost:4873/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-wrapper/node_modules/make-dir": { + "version": "1.3.0", + "resolved": "http://localhost:4873/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-wrapper/node_modules/make-dir/node_modules/pify": { + "version": "3.0.0", + "resolved": "http://localhost:4873/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-wrapper/node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "http://localhost:4873/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-wrapper/node_modules/p-cancelable": { + "version": "0.4.1", + "resolved": "http://localhost:4873/p-cancelable/-/p-cancelable-0.4.1.tgz", + "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-wrapper/node_modules/p-event": { + "version": "2.3.1", + "resolved": "http://localhost:4873/p-event/-/p-event-2.3.1.tgz", + "integrity": "sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-timeout": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/bin-wrapper/node_modules/p-timeout": { + "version": "2.0.1", + "resolved": "http://localhost:4873/p-timeout/-/p-timeout-2.0.1.tgz", + "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-wrapper/node_modules/pify": { + "version": "4.0.1", + "resolved": "http://localhost:4873/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/bin-wrapper/node_modules/prepend-http": { + "version": "2.0.0", + "resolved": "http://localhost:4873/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-wrapper/node_modules/url-parse-lax": { + "version": "3.0.0", + "resolved": "http://localhost:4873/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prepend-http": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "http://localhost:4873/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "1.2.3", + "resolved": "http://localhost:4873/bl/-/bl-1.2.3.tgz", + "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "http://localhost:4873/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "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/bl/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "http://localhost:4873/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/bl/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "http://localhost:4873/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "http://localhost:4873/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true, + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "http://localhost:4873/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "http://localhost:4873/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "http://localhost:4873/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "http://localhost:4873/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-alloc": { + "version": "1.2.0", + "resolved": "http://localhost:4873/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "node_modules/buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "http://localhost:4873/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true, + "license": "MIT" + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "http://localhost:4873/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-fill": { + "version": "1.0.0", + "resolved": "http://localhost:4873/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cacheable-request": { + "version": "2.1.4", + "resolved": "http://localhost:4873/cacheable-request/-/cacheable-request-2.1.4.tgz", + "integrity": "sha512-vag0O2LKZ/najSoUwDbVlnlCFvhBE/7mGTY2B5FgCBDcRD+oVV1HYTOwM6JZfMg/hIcM6IwnTZ1uQQL5/X3xIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-response": "1.0.2", + "get-stream": "3.0.0", + "http-cache-semantics": "3.8.1", + "keyv": "3.0.0", + "lowercase-keys": "1.0.0", + "normalize-url": "2.0.1", + "responselike": "1.0.2" + } + }, + "node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "1.0.0", + "resolved": "http://localhost:4873/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha512-RPlX0+PHuvxVDZ7xX+EBVAp4RsVxP/TdDSN2mJYdiq1Lc4Hz7EUSjUI7RZrKKlmrIzVhf6Jo2stj7++gVarS0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "http://localhost:4873/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "2.1.1", + "resolved": "http://localhost:4873/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/camelcase-keys": { + "version": "2.1.0", + "resolved": "http://localhost:4873/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/canvas": { + "version": "2.11.2", + "resolved": "http://localhost:4873/canvas/-/canvas-2.11.2.tgz", + "integrity": "sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.0", + "nan": "^2.17.0", + "simple-get": "^3.0.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/caw": { + "version": "2.0.1", + "resolved": "http://localhost:4873/caw/-/caw-2.0.1.tgz", + "integrity": "sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-proxy": "^2.0.0", + "isurl": "^1.0.0-alpha5", + "tunnel-agent": "^0.6.0", + "url-to-options": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "http://localhost:4873/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "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/chokidar": { + "version": "3.5.3", + "resolved": "http://localhost:4873/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT", + "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/chownr": { + "version": "2.0.0", + "resolved": "http://localhost:4873/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "license": "ISC", + "optional": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/clone-response": { + "version": "1.0.2", + "resolved": "http://localhost:4873/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + } + }, + "node_modules/clone-response/node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "http://localhost:4873/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "http://localhost:4873/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "http://localhost:4873/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "http://localhost:4873/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "license": "ISC", + "optional": true, + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "http://localhost:4873/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "http://localhost:4873/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "http://localhost:4873/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "http://localhost:4873/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "http://localhost:4873/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true, + "license": "ISC", + "optional": true + }, + "node_modules/console-stream": { + "version": "0.1.1", + "resolved": "http://localhost:4873/console-stream/-/console-stream-0.1.1.tgz", + "integrity": "sha512-QC/8l9e6ofi6nqZ5PawlDgzmMw3OxIXtvolBzap/F4UDBJlDaZRSNbL/lb41C29FcbSJncBFlJFj2WJoNyZRfQ==", + "dev": true + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "http://localhost:4873/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "http://localhost:4873/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "http://localhost:4873/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "http://localhost:4873/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "http://localhost:4873/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "http://localhost:4873/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "http://localhost:4873/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "http://localhost:4873/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "http://localhost:4873/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/cssom": { + "version": "0.5.0", + "resolved": "http://localhost:4873/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "http://localhost:4873/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "http://localhost:4873/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/currently-unhandled": { + "version": "0.4.1", + "resolved": "http://localhost:4873/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-find-index": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/data-urls": { + "version": "3.0.2", + "resolved": "http://localhost:4873/data-urls/-/data-urls-3.0.2.tgz", + "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/data-urls/node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "http://localhost:4873/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "http://localhost:4873/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "http://localhost:4873/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "http://localhost:4873/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "http://localhost:4873/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/decompress": { + "version": "4.2.1", + "resolved": "http://localhost:4873/decompress/-/decompress-4.2.1.tgz", + "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "decompress-tar": "^4.0.0", + "decompress-tarbz2": "^4.0.0", + "decompress-targz": "^4.0.0", + "decompress-unzip": "^4.0.1", + "graceful-fs": "^4.1.10", + "make-dir": "^1.0.0", + "pify": "^2.3.0", + "strip-dirs": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-response": { + "version": "4.2.1", + "resolved": "http://localhost:4873/decompress-response/-/decompress-response-4.2.1.tgz", + "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "mimic-response": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/decompress-tar": { + "version": "4.1.1", + "resolved": "http://localhost:4873/decompress-tar/-/decompress-tar-4.1.1.tgz", + "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "file-type": "^5.2.0", + "is-stream": "^1.1.0", + "tar-stream": "^1.5.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-tarbz2": { + "version": "4.1.1", + "resolved": "http://localhost:4873/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", + "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "decompress-tar": "^4.1.0", + "file-type": "^6.1.0", + "is-stream": "^1.1.0", + "seek-bzip": "^1.0.5", + "unbzip2-stream": "^1.0.9" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-tarbz2/node_modules/file-type": { + "version": "6.2.0", + "resolved": "http://localhost:4873/file-type/-/file-type-6.2.0.tgz", + "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-targz": { + "version": "4.1.1", + "resolved": "http://localhost:4873/decompress-targz/-/decompress-targz-4.1.1.tgz", + "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "decompress-tar": "^4.1.1", + "file-type": "^5.2.0", + "is-stream": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-unzip": { + "version": "4.0.1", + "resolved": "http://localhost:4873/decompress-unzip/-/decompress-unzip-4.0.1.tgz", + "integrity": "sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "file-type": "^3.8.0", + "get-stream": "^2.2.0", + "pify": "^2.3.0", + "yauzl": "^2.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-unzip/node_modules/file-type": { + "version": "3.9.0", + "resolved": "http://localhost:4873/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress-unzip/node_modules/get-stream": { + "version": "2.3.1", + "resolved": "http://localhost:4873/get-stream/-/get-stream-2.3.1.tgz", + "integrity": "sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "object-assign": "^4.0.1", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress-unzip/node_modules/pify": { + "version": "2.3.0", + "resolved": "http://localhost:4873/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress/node_modules/make-dir": { + "version": "1.3.0", + "resolved": "http://localhost:4873/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress/node_modules/make-dir/node_modules/pify": { + "version": "3.0.0", + "resolved": "http://localhost:4873/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress/node_modules/pify": { + "version": "2.3.0", + "resolved": "http://localhost:4873/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "http://localhost:4873/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "http://localhost:4873/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "http://localhost:4873/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/detect-libc": { + "version": "2.0.1", + "resolved": "http://localhost:4873/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "http://localhost:4873/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "http://localhost:4873/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "http://localhost:4873/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domexception": { + "version": "4.0.0", + "resolved": "http://localhost:4873/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "http://localhost:4873/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "http://localhost:4873/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/download": { + "version": "6.2.5", + "resolved": "http://localhost:4873/download/-/download-6.2.5.tgz", + "integrity": "sha512-DpO9K1sXAST8Cpzb7kmEhogJxymyVUd5qz/vCOSyvwtp2Klj2XcDt5YUuasgxka44SxF0q5RriKIwJmQHG2AuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "caw": "^2.0.0", + "content-disposition": "^0.5.2", + "decompress": "^4.0.0", + "ext-name": "^5.0.0", + "file-type": "5.2.0", + "filenamify": "^2.0.0", + "get-stream": "^3.0.0", + "got": "^7.0.0", + "make-dir": "^1.0.0", + "p-event": "^1.0.0", + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/download/node_modules/make-dir": { + "version": "1.3.0", + "resolved": "http://localhost:4873/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/duplexer3": { + "version": "0.1.5", + "resolved": "http://localhost:4873/duplexer3/-/duplexer3-0.1.5.tgz", + "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "http://localhost:4873/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "http://localhost:4873/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "http://localhost:4873/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "http://localhost:4873/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "http://localhost:4873/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "http://localhost:4873/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "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/eslint": { + "version": "8.43.0", + "resolved": "http://localhost:4873/eslint/-/eslint-8.43.0.tgz", + "integrity": "sha512-aaCpf2JqqKesMFGgmRPessmVKjcGXqdlAYLLC3THM8t5nBRZRQ+st5WM/hoJXkdioEXLLbXgclUpM0TXo5HX5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.3", + "@eslint/js": "8.43.0", + "@humanwhocodes/config-array": "^0.11.10", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.5.2", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.0", + "resolved": "http://localhost:4873/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.1", + "resolved": "http://localhost:4873/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "http://localhost:4873/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/espree": { + "version": "9.5.2", + "resolved": "http://localhost:4873/espree/-/espree-9.5.2.tgz", + "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "http://localhost:4873/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "http://localhost:4873/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "http://localhost:4873/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "http://localhost:4873/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "http://localhost:4873/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/exec-buffer": { + "version": "3.2.0", + "resolved": "http://localhost:4873/exec-buffer/-/exec-buffer-3.2.0.tgz", + "integrity": "sha512-wsiD+2Tp6BWHoVv3B+5Dcx6E7u5zky+hUwOHjuH2hKSLR3dvRmX8fk8UD8uqQixHs4Wk6eDmiegVrMPjKj7wpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^0.7.0", + "p-finally": "^1.0.0", + "pify": "^3.0.0", + "rimraf": "^2.5.4", + "tempfile": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/exec-buffer/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "http://localhost:4873/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/execa": { + "version": "0.7.0", + "resolved": "http://localhost:4873/execa/-/execa-0.7.0.tgz", + "integrity": "sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/execa/node_modules/cross-spawn": { + "version": "5.1.0", + "resolved": "http://localhost:4873/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "node_modules/execa/node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "http://localhost:4873/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "license": "ISC", + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/execa/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "http://localhost:4873/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "http://localhost:4873/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa/node_modules/which": { + "version": "1.3.1", + "resolved": "http://localhost:4873/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/execa/node_modules/yallist": { + "version": "2.1.2", + "resolved": "http://localhost:4873/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "dev": true, + "license": "ISC" + }, + "node_modules/executable": { + "version": "4.1.1", + "resolved": "http://localhost:4873/executable/-/executable-4.1.1.tgz", + "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^2.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/executable/node_modules/pify": { + "version": "2.3.0", + "resolved": "http://localhost:4873/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ext-list": { + "version": "2.2.2", + "resolved": "http://localhost:4873/ext-list/-/ext-list-2.2.2.tgz", + "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "^1.28.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ext-name": { + "version": "5.0.0", + "resolved": "http://localhost:4873/ext-name/-/ext-name-5.0.0.tgz", + "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ext-list": "^2.0.0", + "sort-keys-length": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/fabric": { + "version": "5.3.0", + "resolved": "http://localhost:4873/fabric/-/fabric-5.3.0.tgz", + "integrity": "sha512-AVayKuzWoXM5cTn7iD3yNWBlfEa8r1tHaOe2g8NsZrmWKAHjryTxT/j6f9ncRfOWOF0I1Ci1AId3y78cC+GExQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "canvas": "^2.8.0", + "jsdom": "^19.0.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "http://localhost:4873/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "http://localhost:4873/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "http://localhost:4873/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "http://localhost:4873/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "http://localhost:4873/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/figures": { + "version": "1.7.0", + "resolved": "http://localhost:4873/figures/-/figures-1.7.0.tgz", + "integrity": "sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "http://localhost:4873/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "http://localhost:4873/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-type": { + "version": "5.2.0", + "resolved": "http://localhost:4873/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/filename-reserved-regex": { + "version": "2.0.0", + "resolved": "http://localhost:4873/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", + "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/filenamify": { + "version": "2.1.0", + "resolved": "http://localhost:4873/filenamify/-/filenamify-2.1.0.tgz", + "integrity": "sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA==", + "dev": true, + "license": "MIT", + "dependencies": { + "filename-reserved-regex": "^2.0.0", + "strip-outer": "^1.0.0", + "trim-repeated": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "http://localhost:4873/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "http://localhost:4873/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-versions": { + "version": "3.2.0", + "resolved": "http://localhost:4873/find-versions/-/find-versions-3.2.0.tgz", + "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver-regex": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "http://localhost:4873/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "http://localhost:4873/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "http://localhost:4873/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "http://localhost:4873/from2/-/from2-2.3.0.tgz", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/from2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "http://localhost:4873/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "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/from2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "http://localhost:4873/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/from2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "http://localhost:4873/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "http://localhost:4873/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true, + "license": "MIT" + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "http://localhost:4873/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "license": "ISC", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "http://localhost:4873/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "http://localhost:4873/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "http://localhost:4873/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "http://localhost:4873/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "http://localhost:4873/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dev": true, + "license": "ISC", + "optional": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/get-proxy": { + "version": "2.1.0", + "resolved": "http://localhost:4873/get-proxy/-/get-proxy-2.1.0.tgz", + "integrity": "sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "npm-conf": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/get-stdin": { + "version": "4.0.1", + "resolved": "http://localhost:4873/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/get-stream": { + "version": "3.0.0", + "resolved": "http://localhost:4873/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "http://localhost:4873/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "http://localhost:4873/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "13.20.0", + "resolved": "http://localhost:4873/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/got": { + "version": "7.1.0", + "resolved": "http://localhost:4873/got/-/got-7.1.0.tgz", + "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "decompress-response": "^3.2.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-plain-obj": "^1.1.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "p-cancelable": "^0.3.0", + "p-timeout": "^1.1.1", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "url-parse-lax": "^1.0.0", + "url-to-options": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/got/node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "http://localhost:4873/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/got/node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "http://localhost:4873/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "http://localhost:4873/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "http://localhost:4873/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "http://localhost:4873/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "http://localhost:4873/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "http://localhost:4873/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "http://localhost:4873/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbol-support-x": { + "version": "1.4.2", + "resolved": "http://localhost:4873/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", + "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/has-to-string-tag-x": { + "version": "1.4.1", + "resolved": "http://localhost:4873/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", + "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbol-support-x": "^1.4.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "http://localhost:4873/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true, + "license": "ISC", + "optional": true + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "http://localhost:4873/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true, + "license": "ISC" + }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "http://localhost:4873/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/http-cache-semantics": { + "version": "3.8.1", + "resolved": "http://localhost:4873/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", + "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "http://localhost:4873/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "http://localhost:4873/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "http://localhost:4873/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "http://localhost:4873/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "http://localhost:4873/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/imagemin-zopfli": { + "version": "7.0.0", + "resolved": "http://localhost:4873/imagemin-zopfli/-/imagemin-zopfli-7.0.0.tgz", + "integrity": "sha512-nmffj58rVb0O3AlCZLBBVKGyZ5MYPZZfKxUhvA7bwPGougHl/F7EUKSse9jkgXjdvtJYG2ojJeh5N67mYgBM9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "exec-buffer": "^3.0.0", + "is-png": "^2.0.0", + "zopflipng-bin": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/immutable": { + "version": "4.3.0", + "resolved": "http://localhost:4873/immutable/-/immutable-4.3.0.tgz", + "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==", + "dev": true, + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "http://localhost:4873/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-lazy": { + "version": "3.1.0", + "resolved": "http://localhost:4873/import-lazy/-/import-lazy-3.1.0.tgz", + "integrity": "sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "http://localhost:4873/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "2.1.0", + "resolved": "http://localhost:4873/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==", + "dev": true, + "license": "MIT", + "dependencies": { + "repeating": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "http://localhost:4873/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "http://localhost:4873/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "http://localhost:4873/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "license": "ISC" + }, + "node_modules/into-stream": { + "version": "3.1.0", + "resolved": "http://localhost:4873/into-stream/-/into-stream-3.1.0.tgz", + "integrity": "sha512-TcdjPibTksa1NQximqep2r17ISRiNE9fwlfbg3F8ANdvP5/yrFTew86VcO//jk4QTaMlbjypPBq76HN2zaKfZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "from2": "^2.1.1", + "p-is-promise": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "http://localhost:4873/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "http://localhost:4873/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.12.1", + "resolved": "http://localhost:4873/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dev": true, + "license": "MIT", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "http://localhost:4873/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finite": { + "version": "1.1.0", + "resolved": "http://localhost:4873/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "http://localhost:4873/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "http://localhost:4873/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-natural-number": { + "version": "4.0.1", + "resolved": "http://localhost:4873/is-natural-number/-/is-natural-number-4.0.1.tgz", + "integrity": "sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "http://localhost:4873/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-object": { + "version": "1.0.2", + "resolved": "http://localhost:4873/is-object/-/is-object-1.0.2.tgz", + "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "http://localhost:4873/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "http://localhost:4873/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-png": { + "version": "2.0.0", + "resolved": "http://localhost:4873/is-png/-/is-png-2.0.0.tgz", + "integrity": "sha512-4KPGizaVGj2LK7xwJIz8o5B2ubu1D/vcQsgOGFEDlpcvgZHto4gBnyd0ig7Ws+67ixmwKoNmu0hYnpo6AaKb5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "http://localhost:4873/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/is-retry-allowed": { + "version": "1.2.0", + "resolved": "http://localhost:4873/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "http://localhost:4873/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "http://localhost:4873/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "http://localhost:4873/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "http://localhost:4873/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/isurl": { + "version": "1.0.0", + "resolved": "http://localhost:4873/isurl/-/isurl-1.0.0.tgz", + "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-to-string-tag-x": "^1.2.0", + "is-object": "^1.0.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "http://localhost:4873/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "19.0.0", + "resolved": "http://localhost:4873/jsdom/-/jsdom-19.0.0.tgz", + "integrity": "sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.5.0", + "acorn-globals": "^6.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.1", + "decimal.js": "^10.3.1", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^3.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^10.0.0", + "ws": "^8.2.3", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/json-buffer": { + "version": "3.0.0", + "resolved": "http://localhost:4873/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "http://localhost:4873/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "http://localhost:4873/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/keyv": { + "version": "3.0.0", + "resolved": "http://localhost:4873/keyv/-/keyv-3.0.0.tgz", + "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.0" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "http://localhost:4873/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/load-json-file": { + "version": "1.1.0", + "resolved": "http://localhost:4873/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/load-json-file/node_modules/pify": { + "version": "2.3.0", + "resolved": "http://localhost:4873/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "http://localhost:4873/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "http://localhost:4873/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/logalot": { + "version": "2.1.0", + "resolved": "http://localhost:4873/logalot/-/logalot-2.1.0.tgz", + "integrity": "sha512-Ah4CgdSRfeCJagxQhcVNMi9BfGYyEKLa6d7OA6xSbld/Hg3Cf2QiOa1mDpmG7Ve8LOH6DN3mdttzjQAvWTyVkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "figures": "^1.3.5", + "squeak": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/longest": { + "version": "1.0.1", + "resolved": "http://localhost:4873/longest/-/longest-1.0.1.tgz", + "integrity": "sha512-k+yt5n3l48JU4k8ftnKG6V7u32wyH2NfKzeMto9F/QRE0amxy/LayxwlvjjkZEIzqR+19IrtFO8p5kB9QaYUFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loud-rejection": { + "version": "1.6.0", + "resolved": "http://localhost:4873/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "http://localhost:4873/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lpad-align": { + "version": "1.1.2", + "resolved": "http://localhost:4873/lpad-align/-/lpad-align-1.1.2.tgz", + "integrity": "sha512-MMIcFmmR9zlGZtBcFOows6c2COMekHCIFJz3ew/rRpKZ1wR4mXDPzvcVqLarux8M33X4TPSq2Jdw8WJj0q0KbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-stdin": "^4.0.1", + "indent-string": "^2.1.0", + "longest": "^1.0.0", + "meow": "^3.3.0" + }, + "bin": { + "lpad-align": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "http://localhost:4873/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "license": "ISC", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "http://localhost:4873/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "http://localhost:4873/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/map-obj": { + "version": "1.0.1", + "resolved": "http://localhost:4873/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "http://localhost:4873/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/meow": { + "version": "3.7.0", + "resolved": "http://localhost:4873/meow/-/meow-3.7.0.tgz", + "integrity": "sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "http://localhost:4873/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "http://localhost:4873/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "2.1.0", + "resolved": "http://localhost:4873/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "http://localhost:4873/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "http://localhost:4873/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "http://localhost:4873/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "license": "ISC", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "http://localhost:4873/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "http://localhost:4873/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "http://localhost:4873/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "optional": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "http://localhost:4873/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/nan": { + "version": "2.17.0", + "resolved": "http://localhost:4873/nan/-/nan-2.17.0.tgz", + "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "http://localhost:4873/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "http://localhost:4873/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-fetch": { + "version": "2.6.12", + "resolved": "http://localhost:4873/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "http://localhost:4873/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "http://localhost:4873/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "http://localhost:4873/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "http://localhost:4873/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "license": "ISC", + "optional": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "http://localhost:4873/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.1", + "resolved": "http://localhost:4873/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "http://localhost:4873/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "2.0.1", + "resolved": "http://localhost:4873/normalize-url/-/normalize-url-2.0.1.tgz", + "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "prepend-http": "^2.0.0", + "query-string": "^5.0.1", + "sort-keys": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/normalize-url/node_modules/prepend-http": { + "version": "2.0.0", + "resolved": "http://localhost:4873/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/normalize-url/node_modules/sort-keys": { + "version": "2.0.0", + "resolved": "http://localhost:4873/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-obj": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-conf": { + "version": "1.1.3", + "resolved": "http://localhost:4873/npm-conf/-/npm-conf-1.1.3.tgz", + "integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==", + "dev": true, + "license": "MIT", + "dependencies": { + "config-chain": "^1.1.11", + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "http://localhost:4873/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "2.0.1", + "resolved": "http://localhost:4873/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "http://localhost:4873/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dev": true, + "license": "ISC", + "optional": true, + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "http://localhost:4873/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nwsapi": { + "version": "2.2.5", + "resolved": "http://localhost:4873/nwsapi/-/nwsapi-2.2.5.tgz", + "integrity": "sha512-6xpotnECFy/og7tKSBVmUNft7J3jyXAka4XvG6AUhFWRz+Q/Ljus7znJAA3bxColfQLdS+XsjoodtJfCgeTEFQ==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "http://localhost:4873/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "http://localhost:4873/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "http://localhost:4873/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/os-filter-obj": { + "version": "2.0.0", + "resolved": "http://localhost:4873/os-filter-obj/-/os-filter-obj-2.0.0.tgz", + "integrity": "sha512-uksVLsqG3pVdzzPvmAHpBK0wKxYItuzZr7SziusRPoz67tGV8rL1szZ6IdeUrbqLjGDwApBtN29eEE3IqGHOjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "arch": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-cancelable": { + "version": "0.3.0", + "resolved": "http://localhost:4873/p-cancelable/-/p-cancelable-0.3.0.tgz", + "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-event": { + "version": "1.3.0", + "resolved": "http://localhost:4873/p-event/-/p-event-1.3.0.tgz", + "integrity": "sha512-hV1zbA7gwqPVFcapfeATaNjQ3J0NuzorHPyG8GPL9g/Y/TplWVBVoCKCXL6Ej2zscrCEv195QNWJXuBH6XZuzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-timeout": "^1.1.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "http://localhost:4873/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-is-promise": { + "version": "1.1.0", + "resolved": "http://localhost:4873/p-is-promise/-/p-is-promise-1.1.0.tgz", + "integrity": "sha512-zL7VE4JVS2IFSkR2GQKDSPEVxkoH43/p7oEnwpdCndKYJO0HVeRB7fA8TJwuLOTBREtK0ea8eHaxdwcpob5dmg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "http://localhost:4873/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "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": "http://localhost:4873/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map-series": { + "version": "1.0.0", + "resolved": "http://localhost:4873/p-map-series/-/p-map-series-1.0.0.tgz", + "integrity": "sha512-4k9LlvY6Bo/1FcIdV33wqZQES0Py+iKISU9Uc8p8AjWoZPnFKMpVIVD3s0EYn4jzLh1I+WeUZkJ0Yoa4Qfw3Kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-reduce": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-reduce": { + "version": "1.0.0", + "resolved": "http://localhost:4873/p-reduce/-/p-reduce-1.0.0.tgz", + "integrity": "sha512-3Tx1T3oM1xO/Y8Gj0sWyE78EIJZ+t+aEmXUdvQgvGmSMri7aPTHoovbXEreWKkL5j21Er60XAWLTzKbAKYOujQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-timeout": { + "version": "1.2.1", + "resolved": "http://localhost:4873/p-timeout/-/p-timeout-1.2.1.tgz", + "integrity": "sha512-gb0ryzr+K2qFqFv6qi3khoeqMZF/+ajxQipEF6NteZVnvz9tzdsfAVj3lYtn1gAXvH5lfLwfxEII799gt/mRIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "http://localhost:4873/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "2.2.0", + "resolved": "http://localhost:4873/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "http://localhost:4873/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "http://localhost:4873/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "http://localhost:4873/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "http://localhost:4873/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "http://localhost:4873/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-type": { + "version": "1.1.0", + "resolved": "http://localhost:4873/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-type/node_modules/pify": { + "version": "2.3.0", + "resolved": "http://localhost:4873/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "http://localhost:4873/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "http://localhost:4873/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "http://localhost:4873/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "3.0.0", + "resolved": "http://localhost:4873/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "http://localhost:4873/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "http://localhost:4873/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "http://localhost:4873/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prepend-http": { + "version": "1.0.4", + "resolved": "http://localhost:4873/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "http://localhost:4873/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "http://localhost:4873/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "http://localhost:4873/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "dev": true, + "license": "ISC" + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "http://localhost:4873/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "http://localhost:4873/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "http://localhost:4873/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "http://localhost:4873/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/query-string": { + "version": "5.1.1", + "resolved": "http://localhost:4873/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "http://localhost:4873/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "http://localhost:4873/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/read-pkg": { + "version": "1.1.0", + "resolved": "http://localhost:4873/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up": { + "version": "1.0.1", + "resolved": "http://localhost:4873/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "1.1.2", + "resolved": "http://localhost:4873/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "2.1.0", + "resolved": "http://localhost:4873/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "http://localhost:4873/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "http://localhost:4873/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/redent": { + "version": "1.0.0", + "resolved": "http://localhost:4873/redent/-/redent-1.0.0.tgz", + "integrity": "sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeating": { + "version": "2.0.1", + "resolved": "http://localhost:4873/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-finite": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "http://localhost:4873/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "http://localhost:4873/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "http://localhost:4873/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/responselike": { + "version": "1.0.2", + "resolved": "http://localhost:4873/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "lowercase-keys": "^1.0.0" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "http://localhost:4873/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "http://localhost:4873/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "http://localhost:4873/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "http://localhost:4873/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "http://localhost:4873/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/sass": { + "version": "1.63.6", + "resolved": "http://localhost:4873/sass/-/sass-1.63.6.tgz", + "integrity": "sha512-MJuxGMHzaOW7ipp+1KdELtqKbfAWbH7OLIdoSMnVe3EXPMTmxTmlaZDCTsgIpPCs3w99lLo9/zDKkOrJuT5byw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "http://localhost:4873/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "license": "ISC", + "optional": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/seek-bzip": { + "version": "1.0.6", + "resolved": "http://localhost:4873/seek-bzip/-/seek-bzip-1.0.6.tgz", + "integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^2.8.1" + }, + "bin": { + "seek-bunzip": "bin/seek-bunzip", + "seek-table": "bin/seek-bzip-table" + } + }, + "node_modules/semver": { + "version": "7.5.3", + "resolved": "http://localhost:4873/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "dev": true, + "license": "ISC", + "optional": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-regex": { + "version": "2.0.0", + "resolved": "http://localhost:4873/semver-regex/-/semver-regex-2.0.0.tgz", + "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/semver-truncate": { + "version": "1.1.2", + "resolved": "http://localhost:4873/semver-truncate/-/semver-truncate-1.1.2.tgz", + "integrity": "sha512-V1fGg9i4CL3qesB6U0L6XAm4xOJiHmt4QAacazumuasc03BvtFGIMCduv01JWQ69Nv+JST9TqhSCiJoxoY031w==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^5.3.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/semver-truncate/node_modules/semver": { + "version": "5.7.1", + "resolved": "http://localhost:4873/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "http://localhost:4873/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true, + "license": "ISC", + "optional": true + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "http://localhost:4873/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "http://localhost:4873/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "http://localhost:4873/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "http://localhost:4873/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "optional": true + }, + "node_modules/simple-get": { + "version": "3.1.1", + "resolved": "http://localhost:4873/simple-get/-/simple-get-3.1.1.tgz", + "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "decompress-response": "^4.2.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/sort-keys": { + "version": "1.1.2", + "resolved": "http://localhost:4873/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sort-keys-length": { + "version": "1.0.1", + "resolved": "http://localhost:4873/sort-keys-length/-/sort-keys-length-1.0.1.tgz", + "integrity": "sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "sort-keys": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "http://localhost:4873/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "http://localhost:4873/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "http://localhost:4873/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "http://localhost:4873/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "http://localhost:4873/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.13", + "resolved": "http://localhost:4873/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/squeak": { + "version": "1.3.0", + "resolved": "http://localhost:4873/squeak/-/squeak-1.3.0.tgz", + "integrity": "sha512-YQL1ulInM+ev8nXX7vfXsCsDh6IqXlrremc1hzi77776BtpWgYJUMto3UM05GSAaGzJgWekszjoKDrVNB5XG+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^1.0.0", + "console-stream": "^0.1.1", + "lpad-align": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/squeak/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "http://localhost:4873/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/squeak/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "http://localhost:4873/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/squeak/node_modules/chalk": { + "version": "1.1.3", + "resolved": "http://localhost:4873/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/squeak/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "http://localhost:4873/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/squeak/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "http://localhost:4873/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/squeak/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "http://localhost:4873/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/strict-uri-encode": { + "version": "1.1.0", + "resolved": "http://localhost:4873/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "http://localhost:4873/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "http://localhost:4873/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "optional": true, + "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": "http://localhost:4873/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "http://localhost:4873/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-dirs": { + "version": "2.1.0", + "resolved": "http://localhost:4873/strip-dirs/-/strip-dirs-2.1.0.tgz", + "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-natural-number": "^4.0.1" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "http://localhost:4873/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-indent": { + "version": "1.0.1", + "resolved": "http://localhost:4873/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-stdin": "^4.0.1" + }, + "bin": { + "strip-indent": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "http://localhost:4873/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-outer": { + "version": "1.0.1", + "resolved": "http://localhost:4873/strip-outer/-/strip-outer-1.0.1.tgz", + "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-outer/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "http://localhost:4873/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "http://localhost:4873/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "http://localhost:4873/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svgo": { + "version": "3.0.2", + "resolved": "http://localhost:4873/svgo/-/svgo-3.0.2.tgz", + "integrity": "sha512-Z706C1U2pb1+JGP48fbazf3KxHrWOsLme6Rv7imFBn5EnuanDW1GPaA/P1/dvObE670JDePC3mnj0k0B7P0jjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.2.1", + "csso": "^5.0.5", + "picocolors": "^1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "http://localhost:4873/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "http://localhost:4873/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/tar": { + "version": "6.1.15", + "resolved": "http://localhost:4873/tar/-/tar-6.1.15.tgz", + "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "dev": true, + "license": "ISC", + "optional": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar-stream": { + "version": "1.6.2", + "resolved": "http://localhost:4873/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/tar-stream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "http://localhost:4873/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "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/tar-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "http://localhost:4873/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/tar-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "http://localhost:4873/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/temp-dir": { + "version": "1.0.0", + "resolved": "http://localhost:4873/temp-dir/-/temp-dir-1.0.0.tgz", + "integrity": "sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/tempfile": { + "version": "2.0.0", + "resolved": "http://localhost:4873/tempfile/-/tempfile-2.0.0.tgz", + "integrity": "sha512-ZOn6nJUgvgC09+doCEF3oB+r3ag7kUvlsXEGX069QRD60p+P3uP7XG9N2/at+EyIRGSN//ZY3LyEotA1YpmjuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "temp-dir": "^1.0.0", + "uuid": "^3.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "http://localhost:4873/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "http://localhost:4873/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/timed-out": { + "version": "4.0.1", + "resolved": "http://localhost:4873/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-buffer": { + "version": "1.1.1", + "resolved": "http://localhost:4873/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "http://localhost:4873/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.3", + "resolved": "http://localhost:4873/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "3.0.0", + "resolved": "http://localhost:4873/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/trim-newlines": { + "version": "1.0.0", + "resolved": "http://localhost:4873/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/trim-repeated": { + "version": "1.0.0", + "resolved": "http://localhost:4873/trim-repeated/-/trim-repeated-1.0.0.tgz", + "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/trim-repeated/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "http://localhost:4873/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "http://localhost:4873/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "http://localhost:4873/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "http://localhost:4873/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unbzip2-stream": { + "version": "1.4.3", + "resolved": "http://localhost:4873/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "node_modules/universalify": { + "version": "0.2.0", + "resolved": "http://localhost:4873/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "http://localhost:4873/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "http://localhost:4873/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/url-parse-lax": { + "version": "1.0.0", + "resolved": "http://localhost:4873/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "prepend-http": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/url-to-options": { + "version": "1.0.1", + "resolved": "http://localhost:4873/url-to-options/-/url-to-options-1.0.1.tgz", + "integrity": "sha512-0kQLIzG4fdk/G5NONku64rSH/x32NOA39LVQqlK8Le6lvTF6GGRJpqaQFGgU+CLwySIqBSMdwYM0sYcW9f6P4A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "http://localhost:4873/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "http://localhost:4873/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "http://localhost:4873/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "http://localhost:4873/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "3.0.0", + "resolved": "http://localhost:4873/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz", + "integrity": "sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "http://localhost:4873/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "http://localhost:4873/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "http://localhost:4873/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "10.0.0", + "resolved": "http://localhost:4873/whatwg-url/-/whatwg-url-10.0.0.tgz", + "integrity": "sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "http://localhost:4873/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "http://localhost:4873/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "license": "ISC", + "optional": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "http://localhost:4873/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.13.0", + "resolved": "http://localhost:4873/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "http://localhost:4873/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "http://localhost:4873/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "http://localhost:4873/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "http://localhost:4873/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC", + "optional": true + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "http://localhost:4873/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "http://localhost:4873/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zopflipng-bin": { + "version": "6.0.1", + "resolved": "http://localhost:4873/zopflipng-bin/-/zopflipng-bin-6.0.1.tgz", + "integrity": "sha512-+aybvXv/xafL6I67uSH5yLHrSy4/OaSOV9tniw4yZFIHpINXUcctVHE/WzHxOONrL2GHzJ8Fd4iDrNyaS6TVbg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "bin-build": "^3.0.0", + "bin-wrapper": "^4.0.1", + "logalot": "^2.1.0" + }, + "bin": { + "zopflipng": "cli.js" + }, + "engines": { + "node": ">=10" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..159353d --- /dev/null +++ b/package.json @@ -0,0 +1,28 @@ +{ + "name": "@lucas-labs/lugit-theme", + "version": "0.1.0", + "type": "module", + "description": "Custom theme for lucaslabs' internal git server", + "main": "index.js", + "scripts": { + "build": "node tools/build.js", + "serve": "node tools/serve.js", + "deploy": "node tools/deploy.js", + "restart": "node tools/restart.js", + "style:check": "npx prettier -c ." + }, + "author": "lucas-labs", + "license": "MIT", + "devDependencies": { + "chokidar": "^3.5.3", + "eslint": "^8.43.0", + "fabric": "5.3", + "imagemin-zopfli": "^7.0.0", + "prettier": "^2.8.8", + "sass": "^1.63.6", + "svgo": "^3.0.2" + }, + "dependencies": { + "@lucas-labs/lui-micro": "^3.1.4" + } +} diff --git a/src/__templates/home.tmpl b/src/__templates/home.tmpl new file mode 100644 index 0000000..1f10f3c --- /dev/null +++ b/src/__templates/home.tmpl @@ -0,0 +1,51 @@ +{{template "base/head" .}} +
+
+
+ +
+

+ {{AppName}} +

+

{{.locale.Tr "startpage.app_desc"}}

+
+
+
+
+
+

+ {{svg "octicon-flame"}} {{.locale.Tr "startpage.install"}} +

+

+ {{.locale.Tr "startpage.install_desc" | Str2html}} +

+
+
+

+ {{svg "octicon-device-desktop"}} {{.locale.Tr "startpage.platform"}} +

+

+ {{.locale.Tr "startpage.platform_desc" | Str2html}} +

+
+
+
+
+

+ {{svg "octicon-rocket"}} {{.locale.Tr "startpage.lightweight"}} +

+

+ {{.locale.Tr "startpage.lightweight_desc" | Str2html}} +

+
+
+

+ {{svg "octicon-code"}} {{.locale.Tr "startpage.license"}} +

+

+ {{.locale.Tr "startpage.license_desc" | Str2html}} +

+
+
+
+{{template "base/footer" .}} diff --git a/src/templates/admin/actions.tmpl b/src/templates/admin/actions.tmpl new file mode 100644 index 0000000..9640e0f --- /dev/null +++ b/src/templates/admin/actions.tmpl @@ -0,0 +1,7 @@ +{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin actions")}} +
+ {{if eq .PageType "runners"}} + {{template "shared/actions/runner_list" .}} + {{end}} +
+{{template "admin/layout_footer" .}} diff --git a/src/templates/admin/applications/list.tmpl b/src/templates/admin/applications/list.tmpl new file mode 100644 index 0000000..a292051 --- /dev/null +++ b/src/templates/admin/applications/list.tmpl @@ -0,0 +1,8 @@ +{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin config")}} +
+

+ {{.locale.Tr "settings.applications"}} +

+ {{template "user/settings/applications_oauth2_list" .}} +
+{{template "admin/layout_footer" .}} diff --git a/src/templates/admin/applications/oauth2_edit.tmpl b/src/templates/admin/applications/oauth2_edit.tmpl new file mode 100644 index 0000000..668bfe0 --- /dev/null +++ b/src/templates/admin/applications/oauth2_edit.tmpl @@ -0,0 +1,6 @@ +{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin config")}} +
+ + {{template "user/settings/applications_oauth2_edit_form" .}} +
+{{template "admin/layout_footer" .}} diff --git a/src/templates/admin/auth/edit.tmpl b/src/templates/admin/auth/edit.tmpl new file mode 100644 index 0000000..c30ee5c --- /dev/null +++ b/src/templates/admin/auth/edit.tmpl @@ -0,0 +1,461 @@ +{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin edit authentication")}} +
+

+ {{.locale.Tr "admin.auths.edit"}} +

+
+
+ {{template "base/disable_form_autofill"}} + {{.CsrfTokenHtml}} + +
+ + + {{.Source.TypeName}} +
+
+ + +
+ + + {{if or .Source.IsLDAP .Source.IsDLDAP}} + {{$cfg:=.Source.Cfg}} +
+ + +
+
+ + +
+
+ + +
+
+
+ + +
+
+ {{if .Source.IsLDAP}} +
+ + +
+
+ + +
+ {{end}} +
+ + +
+ {{if .Source.IsDLDAP}} +
+ + +
+ {{end}} +
+ + +
+
+ + +
+
+ + +

{{.locale.Tr "admin.auths.restricted_filter_helper"}}

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ + + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + + {{if .Source.IsLDAP}} +
+
+ + +
+
+
+ + +
+
+
+ + +
+
+ {{end}} +
+
+ + +

{{.locale.Tr "admin.auths.skip_local_two_fa_helper"}}

+
+
+
+
+ + +
+
+ {{end}} + + + {{if .Source.IsSMTP}} + {{$cfg:=.Source.Cfg}} +
+ + +
+
+ + +
+
+ + +
+
+
+ + +
+

{{.locale.Tr "admin.auths.force_smtps_helper"}}

+
+
+
+ + +
+
+
+ + +

{{.locale.Tr "admin.auths.helo_hostname_helper"}}

+
+
+
+ + +
+
+
+ + +

{{.locale.Tr "admin.auths.allowed_domains_helper"}}

+
+
+
+ + +

{{.locale.Tr "admin.auths.skip_local_two_fa_helper"}}

+
+
+ {{end}} + + + {{if .Source.IsPAM}} + {{$cfg:=.Source.Cfg}} +
+ + +
+
+ + +
+
+
+ + +

{{.locale.Tr "admin.auths.skip_local_two_fa_helper"}}

+
+
+ {{end}} + + + {{if .Source.IsOAuth2}} + {{$cfg:=.Source.Cfg}} +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+ + +

{{.locale.Tr "admin.auths.skip_local_two_fa_helper"}}

+
+
+
+
+ + +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ + {{range .OAuth2Providers}}{{if .CustomURLSettings}} + + + + + + + {{end}}{{end}} + +
+ + +
+
+ + +

{{.locale.Tr "admin.auths.oauth2_required_claim_name_helper"}}

+
+
+ + +

{{.locale.Tr "admin.auths.oauth2_required_claim_value_helper"}}

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ {{end}} + + + {{if .Source.IsSSPI}} + {{$cfg:=.Source.Cfg}} +
+
+ + +

{{.locale.Tr "admin.auths.sspi_auto_create_users_helper"}}

+
+
+
+
+ + +

{{.locale.Tr "admin.auths.sspi_auto_activate_users_helper"}}

+
+
+
+
+ + +

{{.locale.Tr "admin.auths.sspi_strip_domain_names_helper"}}

+
+
+
+ + +

{{.locale.Tr "admin.auths.sspi_separator_replacement_helper"}}

+
+
+ + +

{{.locale.Tr "admin.auths.sspi_default_language_helper"}}

+
+ {{end}} + {{if .Source.IsLDAP}} +
+
+ + +
+
+ {{end}} +
+
+ + +
+
+ +
+ + +
+
+
+ +

+ {{.locale.Tr "admin.auths.tips"}} +

+
+
GMail Settings:
+

Host: smtp.gmail.com, Port: 587, Enable TLS Encryption: true

+ +
{{.locale.Tr "admin.auths.tips.oauth2.general"}}:
+

{{.locale.Tr "admin.auths.tips.oauth2.general.tip"}}

+
+
+ + + +{{template "admin/layout_footer" .}} diff --git a/src/templates/admin/auth/list.tmpl b/src/templates/admin/auth/list.tmpl new file mode 100644 index 0000000..c9f7c0d --- /dev/null +++ b/src/templates/admin/auth/list.tmpl @@ -0,0 +1,38 @@ +{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin authentication")}} +
+

+ {{.locale.Tr "admin.auths.auth_manage_panel"}} ({{.locale.Tr "admin.total" .Total}}) + +

+
+ + + + + + + + + + + + + + {{range .Sources}} + + + + + + + + + + {{end}} + +
ID{{.locale.Tr "admin.auths.name"}}{{.locale.Tr "admin.auths.type"}}{{.locale.Tr "admin.auths.enabled"}}{{.locale.Tr "admin.auths.updated"}}{{.locale.Tr "admin.users.created"}}{{.locale.Tr "admin.users.edit"}}
{{.ID}}{{.Name}}{{.TypeName}}{{if .IsActive}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}{{DateTime "short" .UpdatedUnix}}{{DateTime "short" .CreatedUnix}}{{svg "octicon-pencil"}}
+
+
+{{template "admin/layout_footer" .}} diff --git a/src/templates/admin/auth/new.tmpl b/src/templates/admin/auth/new.tmpl new file mode 100644 index 0000000..37d1635 --- /dev/null +++ b/src/templates/admin/auth/new.tmpl @@ -0,0 +1,122 @@ +{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin new authentication")}} +
+

+ {{.locale.Tr "admin.auths.new"}} +

+
+
+ {{template "base/disable_form_autofill"}} + {{.CsrfTokenHtml}} + +
+ + +
+
+ + +
+ + + {{template "admin/auth/source/ldap" .}} + + + {{template "admin/auth/source/smtp" .}} + + +
+ + + + +
+
+
+ + +

{{.locale.Tr "admin.auths.skip_local_two_fa_helper"}}

+
+
+ + + {{template "admin/auth/source/oauth" .}} + + + {{template "admin/auth/source/sspi" .}} + +
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+ +
+ +
+
+
+ +

+ {{.locale.Tr "admin.auths.tips"}} +

+
+
GMail Settings:
+

Host: smtp.gmail.com, Port: 587, Enable TLS Encryption: true

+ +
{{.locale.Tr "admin.auths.tips.oauth2.general"}}:
+

{{.locale.Tr "admin.auths.tips.oauth2.general.tip"}}

+ +
{{.locale.Tr "admin.auths.tip.oauth2_provider"}}
+
+
  • Bitbucket
  • + {{.locale.Tr "admin.auths.tip.bitbucket"}} +
  • Dropbox
  • + {{.locale.Tr "admin.auths.tip.dropbox"}} +
  • Facebook
  • + {{.locale.Tr "admin.auths.tip.facebook"}} +
  • GitHub
  • + {{.locale.Tr "admin.auths.tip.github"}} +
  • GitLab
  • + {{.locale.Tr "admin.auths.tip.gitlab"}} +
  • Google
  • + {{.locale.Tr "admin.auths.tip.google_plus"}} +
  • OpenID Connect
  • + {{.locale.Tr "admin.auths.tip.openid_connect"}} +
  • Twitter
  • + {{.locale.Tr "admin.auths.tip.twitter"}} +
  • Discord
  • + {{.locale.Tr "admin.auths.tip.discord"}} +
  • Gitea
  • + {{.locale.Tr "admin.auths.tip.gitea"}} +
  • Nextcloud
  • + {{.locale.Tr "admin.auths.tip.nextcloud"}} +
  • Yandex
  • + {{.locale.Tr "admin.auths.tip.yandex"}} +
  • Mastodon
  • + {{.locale.Tr "admin.auths.tip.mastodon"}} +
    +
    +
    +{{template "admin/layout_footer" .}} diff --git a/src/templates/admin/auth/source/ldap.tmpl b/src/templates/admin/auth/source/ldap.tmpl new file mode 100644 index 0000000..26eef89 --- /dev/null +++ b/src/templates/admin/auth/source/ldap.tmpl @@ -0,0 +1,141 @@ +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    +
    + + +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +

    {{.locale.Tr "admin.auths.restricted_filter_helper"}}

    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    + + +
    +
    + + +
    +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    +
    + + +
    +
    +
    + + +

    {{.locale.Tr "admin.auths.skip_local_two_fa_helper"}}

    +
    +
    +
    +
    + + +
    +
    +
    diff --git a/src/templates/admin/auth/source/oauth.tmpl b/src/templates/admin/auth/source/oauth.tmpl new file mode 100644 index 0000000..a0c5a87 --- /dev/null +++ b/src/templates/admin/auth/source/oauth.tmpl @@ -0,0 +1,109 @@ +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    +
    + + +

    {{.locale.Tr "admin.auths.skip_local_two_fa_helper"}}

    +
    +
    + +
    +
    + + +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    + + {{range .OAuth2Providers}}{{if .CustomURLSettings}} + + + + + + + {{end}}{{end}} + +
    + + +
    +
    + + +

    {{.locale.Tr "admin.auths.oauth2_required_claim_name_helper"}}

    +
    +
    + + +

    {{.locale.Tr "admin.auths.oauth2_required_claim_value_helper"}}

    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    diff --git a/src/templates/admin/auth/source/smtp.tmpl b/src/templates/admin/auth/source/smtp.tmpl new file mode 100644 index 0000000..e83f7af --- /dev/null +++ b/src/templates/admin/auth/source/smtp.tmpl @@ -0,0 +1,59 @@ +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    +
    + + +

    {{.locale.Tr "admin.auths.force_smtps_helper"}}

    +
    +
    +
    +
    + + +
    +
    +
    + + +

    {{.locale.Tr "admin.auths.helo_hostname_helper"}}

    +
    +
    +
    + + +
    +
    +
    + + +

    {{.locale.Tr "admin.auths.allowed_domains_helper"}}

    +
    +
    +
    + + +

    {{.locale.Tr "admin.auths.skip_local_two_fa_helper"}}

    +
    +
    +
    diff --git a/src/templates/admin/auth/source/sspi.tmpl b/src/templates/admin/auth/source/sspi.tmpl new file mode 100644 index 0000000..9608616 --- /dev/null +++ b/src/templates/admin/auth/source/sspi.tmpl @@ -0,0 +1,43 @@ +
    +
    +
    + + +

    {{.locale.Tr "admin.auths.sspi_auto_create_users_helper"}}

    +
    +
    +
    +
    + + +

    {{.locale.Tr "admin.auths.sspi_auto_activate_users_helper"}}

    +
    +
    +
    +
    + + +

    {{.locale.Tr "admin.auths.sspi_strip_domain_names_helper"}}

    +
    +
    +
    + + +

    {{.locale.Tr "admin.auths.sspi_separator_replacement_helper"}}

    +
    +
    + + +

    {{.locale.Tr "admin.auths.sspi_default_language_helper"}}

    +
    +
    diff --git a/src/templates/admin/base/search.tmpl b/src/templates/admin/base/search.tmpl new file mode 100644 index 0000000..ae1a4d2 --- /dev/null +++ b/src/templates/admin/base/search.tmpl @@ -0,0 +1,23 @@ + +
    +
    + + +
    +
    diff --git a/src/templates/admin/config.tmpl b/src/templates/admin/config.tmpl new file mode 100644 index 0000000..17fb244 --- /dev/null +++ b/src/templates/admin/config.tmpl @@ -0,0 +1,366 @@ +{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin config")}} +
    +

    + {{.locale.Tr "admin.config.server_config"}} +

    +
    +
    +
    {{.locale.Tr "admin.config.app_name"}}
    +
    {{AppName}}
    +
    {{.locale.Tr "admin.config.app_ver"}}
    +
    {{AppVer}}{{.AppBuiltWith}}
    +
    {{.locale.Tr "admin.config.custom_conf"}}
    +
    {{.CustomConf}}
    +
    {{.locale.Tr "admin.config.app_url"}}
    +
    {{.AppUrl}}
    +
    {{.locale.Tr "admin.config.domain"}}
    +
    {{.Domain}}
    +
    {{.locale.Tr "admin.config.offline_mode"}}
    +
    {{if .OfflineMode}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}
    +
    {{.locale.Tr "admin.config.disable_router_log"}}
    +
    {{if .DisableRouterLog}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}
    + +
    + +
    {{.locale.Tr "admin.config.run_user"}}
    +
    {{.RunUser}}
    +
    {{.locale.Tr "admin.config.run_mode"}}
    +
    {{.RunMode}}
    + +
    + +
    {{.locale.Tr "admin.config.git_version"}}
    +
    {{.GitVersion}}
    + +
    + +
    {{.locale.Tr "admin.config.repo_root_path"}}
    +
    {{.RepoRootPath}}
    +
    {{.locale.Tr "admin.config.static_file_root_path"}}
    +
    {{.StaticRootPath}}
    +
    {{.locale.Tr "admin.config.custom_file_root_path"}}
    +
    {{.CustomRootPath}}
    +
    {{.locale.Tr "admin.config.log_file_root_path"}}
    +
    {{.LogRootPath}}
    +
    {{.locale.Tr "admin.config.script_type"}}
    +
    {{.ScriptType}}
    +
    {{.locale.Tr "admin.config.reverse_auth_user"}}
    +
    {{.ReverseProxyAuthUser}}
    +
    +
    + +

    + {{.locale.Tr "admin.config.ssh_config"}} +

    +
    +
    +
    {{.locale.Tr "admin.config.ssh_enabled"}}
    +
    {{if not .SSH.Disabled}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}
    + {{if not .SSH.Disabled}} +
    {{.locale.Tr "admin.config.ssh_start_builtin_server"}}
    +
    {{if .SSH.StartBuiltinServer}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}
    +
    {{.locale.Tr "admin.config.ssh_domain"}}
    +
    {{.SSH.Domain}}
    +
    {{.locale.Tr "admin.config.ssh_port"}}
    +
    {{.SSH.Port}}
    +
    {{.locale.Tr "admin.config.ssh_listen_port"}}
    +
    {{.SSH.ListenPort}}
    + + {{if not .SSH.StartBuiltinServer}} +
    {{.locale.Tr "admin.config.ssh_root_path"}}
    +
    {{.SSH.RootPath}}
    +
    {{.locale.Tr "admin.config.ssh_key_test_path"}}
    +
    {{.SSH.KeyTestPath}}
    +
    {{.locale.Tr "admin.config.ssh_keygen_path"}}
    +
    {{.SSH.KeygenPath}}
    +
    {{.locale.Tr "admin.config.ssh_minimum_key_size_check"}}
    +
    {{if .SSH.MinimumKeySizeCheck}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}
    + {{if .SSH.MinimumKeySizeCheck}} +
    {{.locale.Tr "admin.config.ssh_minimum_key_sizes"}}
    +
    {{.SSH.MinimumKeySizes}}
    + {{end}} + {{end}} + {{end}} +
    +
    + +

    + {{.locale.Tr "admin.config.lfs_config"}} +

    +
    +
    +
    {{.locale.Tr "admin.config.lfs_enabled"}}
    +
    {{if .LFS.StartServer}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}
    + {{if .LFS.StartServer}} +
    {{.locale.Tr "admin.config.lfs_content_path"}}
    +
    {{JsonUtils.EncodeToString .LFS.Storage.ToShadowCopy}}
    +
    {{.locale.Tr "admin.config.lfs_http_auth_expiry"}}
    +
    {{.LFS.HTTPAuthExpiry}}
    + {{end}} +
    +
    + +

    + {{.locale.Tr "admin.config.db_config"}} +

    +
    +
    +
    {{.locale.Tr "admin.config.db_type"}}
    +
    {{.DbCfg.Type}}
    + {{if not (eq .DbCfg.Type "sqlite3")}} +
    {{.locale.Tr "admin.config.db_host"}}
    +
    {{if .DbCfg.Host}}{{.DbCfg.Host}}{{else}}-{{end}}
    +
    {{.locale.Tr "admin.config.db_name"}}
    +
    {{if .DbCfg.Name}}{{.DbCfg.Name}}{{else}}-{{end}}
    +
    {{.locale.Tr "admin.config.db_user"}}
    +
    {{if .DbCfg.User}}{{.DbCfg.User}}{{else}}-{{end}}
    + {{end}} + {{if eq .DbCfg.Type "postgres"}} +
    {{.locale.Tr "admin.config.db_schema"}}
    +
    {{if .DbCfg.Schema}}{{.DbCfg.Schema}}{{else}}-{{end}}
    +
    {{.locale.Tr "admin.config.db_ssl_mode"}}
    +
    {{if .DbCfg.SSLMode}}{{.DbCfg.SSLMode}}{{else}}-{{end}}
    + {{end}} + {{if eq .DbCfg.Type "sqlite3"}} +
    {{.locale.Tr "admin.config.db_path"}}
    +
    {{if .DbCfg.Path}}{{.DbCfg.Path}}{{else}}-{{end}}
    + {{end}} +
    +
    + +

    + {{.locale.Tr "admin.config.service_config"}} +

    +
    +
    +
    {{.locale.Tr "admin.config.register_email_confirm"}}
    +
    {{if .Service.RegisterEmailConfirm}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}
    +
    {{.locale.Tr "admin.config.disable_register"}}
    +
    {{if .Service.DisableRegistration}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}
    +
    {{.locale.Tr "admin.config.allow_only_internal_registration"}}
    +
    {{if .Service.AllowOnlyInternalRegistration}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}
    +
    {{.locale.Tr "admin.config.allow_only_external_registration"}}
    +
    {{if .Service.AllowOnlyExternalRegistration}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}
    +
    {{.locale.Tr "admin.config.show_registration_button"}}
    +
    {{if .Service.ShowRegistrationButton}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}
    +
    {{.locale.Tr "admin.config.enable_openid_signup"}}
    +
    {{if .Service.EnableOpenIDSignUp}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}
    +
    {{.locale.Tr "admin.config.enable_openid_signin"}}
    +
    {{if .Service.EnableOpenIDSignIn}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}
    +
    {{.locale.Tr "admin.config.require_sign_in_view"}}
    +
    {{if .Service.RequireSignInView}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}
    +
    {{.locale.Tr "admin.config.mail_notify"}}
    +
    {{if .Service.EnableNotifyMail}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}
    +
    {{.locale.Tr "admin.config.disable_key_size_check"}}
    +
    {{if .SSH.MinimumKeySizeCheck}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}
    +
    {{.locale.Tr "admin.config.enable_captcha"}}
    +
    {{if .Service.EnableCaptcha}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}
    +
    {{.locale.Tr "admin.config.default_keep_email_private"}}
    +
    {{if .Service.DefaultKeepEmailPrivate}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}
    +
    {{.locale.Tr "admin.config.default_allow_create_organization"}}
    +
    {{if .Service.DefaultAllowCreateOrganization}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}
    +
    {{.locale.Tr "admin.config.enable_timetracking"}}
    +
    {{if .Service.EnableTimetracking}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}
    + {{if .Service.EnableTimetracking}} +
    {{.locale.Tr "admin.config.default_enable_timetracking"}}
    +
    {{if .Service.DefaultEnableTimetracking}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}
    +
    {{.locale.Tr "admin.config.default_allow_only_contributors_to_track_time"}}
    +
    {{if .Service.DefaultAllowOnlyContributorsToTrackTime}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}
    + {{end}} +
    {{.locale.Tr "admin.config.default_visibility_organization"}}
    +
    {{.Service.DefaultOrgVisibility}}
    + +
    {{.locale.Tr "admin.config.no_reply_address"}}
    +
    {{if .Service.NoReplyAddress}}{{.Service.NoReplyAddress}}{{else}}-{{end}}
    +
    {{.locale.Tr "admin.config.default_enable_dependencies"}}
    +
    {{if .Service.DefaultEnableDependencies}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}
    +
    +
    {{.locale.Tr "admin.config.active_code_lives"}}
    +
    {{.Service.ActiveCodeLives}} {{.locale.Tr "tool.raw_minutes"}}
    +
    {{.locale.Tr "admin.config.reset_password_code_lives"}}
    +
    {{.Service.ResetPwdCodeLives}} {{.locale.Tr "tool.raw_minutes"}}
    +
    +
    + +

    + {{.locale.Tr "admin.config.webhook_config"}} +

    +
    +
    +
    {{.locale.Tr "admin.config.queue_length"}}
    +
    {{.Webhook.QueueLength}}
    +
    {{.locale.Tr "admin.config.deliver_timeout"}}
    +
    {{.Webhook.DeliverTimeout}} {{.locale.Tr "tool.raw_seconds"}}
    +
    {{.locale.Tr "admin.config.skip_tls_verify"}}
    +
    {{if .Webhook.SkipTLSVerify}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}
    +
    +
    + +

    + {{.locale.Tr "admin.config.mailer_config"}} +

    +
    +
    +
    {{.locale.Tr "admin.config.mailer_enabled"}}
    +
    {{if .MailerEnabled}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}
    + {{if .MailerEnabled}} +
    {{.locale.Tr "admin.config.mailer_name"}}
    +
    {{.Mailer.Name}}
    + {{if eq .Mailer.Protocol "sendmail"}} +
    {{.locale.Tr "admin.config.mailer_use_sendmail"}}
    +
    {{svg "octicon-check"}}
    +
    {{.locale.Tr "admin.config.mailer_sendmail_path"}}
    +
    {{.Mailer.SendmailPath}}
    +
    {{.locale.Tr "admin.config.mailer_sendmail_args"}}
    +
    {{.Mailer.SendmailArgs}}
    +
    {{.locale.Tr "admin.config.mailer_sendmail_timeout"}}
    +
    {{.Mailer.SendmailTimeout}} {{.locale.Tr "tool.raw_seconds"}}
    + {{else if eq .Mailer.Protocol "dummy"}} +
    {{.locale.Tr "admin.config.mailer_use_dummy"}}
    +
    {{svg "octicon-check"}}
    + {{else}}{{/* SMTP family */}} +
    {{.locale.Tr "admin.config.mailer_protocol"}}
    +
    {{.Mailer.Protocol}}
    +
    {{.locale.Tr "admin.config.mailer_enable_helo"}}
    +
    {{if .Mailer.EnableHelo}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}
    +
    {{.locale.Tr "admin.config.mailer_smtp_addr"}}
    +
    {{.Mailer.SMTPAddr}}
    +
    {{.locale.Tr "admin.config.mailer_smtp_port"}}
    +
    {{.Mailer.SMTPPort}}
    + {{end}} +
    {{.locale.Tr "admin.config.mailer_user"}}
    +
    {{if .Mailer.User}}{{.Mailer.User}}{{else}}(empty){{end}}
    +
    +
    {{.locale.Tr "admin.config.send_test_mail"}}
    +
    +
    + {{.CsrfTokenHtml}} +
    + +
    + +
    +
    + {{end}} +
    +
    + +

    + {{.locale.Tr "admin.config.cache_config"}} +

    +
    +
    +
    {{.locale.Tr "admin.config.cache_adapter"}}
    +
    {{.CacheAdapter}}
    + {{if eq .CacheAdapter "memory"}} +
    {{.locale.Tr "admin.config.cache_interval"}}
    +
    {{.CacheInterval}} {{.locale.Tr "tool.raw_seconds"}}
    + {{end}} + {{if .CacheConn}} +
    {{.locale.Tr "admin.config.cache_conn"}}
    +
    {{.CacheConn}}
    +
    {{.locale.Tr "admin.config.cache_item_ttl"}}
    +
    {{.CacheItemTTL}}
    + {{end}} +
    +
    + +

    + {{.locale.Tr "admin.config.session_config"}} +

    +
    +
    +
    {{.locale.Tr "admin.config.session_provider"}}
    +
    {{.SessionConfig.Provider}}
    +
    {{.locale.Tr "admin.config.provider_config"}}
    +
    {{if .SessionConfig.ProviderConfig}}{{.SessionConfig.ProviderConfig}}{{else}}-{{end}}
    +
    {{.locale.Tr "admin.config.cookie_name"}}
    +
    {{.SessionConfig.CookieName}}
    +
    {{.locale.Tr "admin.config.gc_interval_time"}}
    +
    {{.SessionConfig.Gclifetime}} {{.locale.Tr "tool.raw_seconds"}}
    +
    {{.locale.Tr "admin.config.session_life_time"}}
    +
    {{.SessionConfig.Maxlifetime}} {{.locale.Tr "tool.raw_seconds"}}
    +
    {{.locale.Tr "admin.config.https_only"}}
    +
    {{if .SessionConfig.Secure}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}
    +
    +
    + +

    + {{.locale.Tr "admin.config.picture_config"}} +

    +
    +
    +
    {{.locale.Tr "admin.config.disable_gravatar"}}
    +
    +
    + +
    +
    +
    +
    {{.locale.Tr "admin.config.enable_federated_avatar"}}
    +
    +
    + +
    +
    +
    +
    + +

    + {{.locale.Tr "admin.config.git_config"}} +

    +
    +
    +
    {{.locale.Tr "admin.config.git_disable_diff_highlight"}}
    +
    {{if .Git.DisableDiffHighlight}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}
    +
    {{.locale.Tr "admin.config.git_max_diff_lines"}}
    +
    {{.Git.MaxGitDiffLines}}
    +
    {{.locale.Tr "admin.config.git_max_diff_line_characters"}}
    +
    {{.Git.MaxGitDiffLineCharacters}}
    +
    {{.locale.Tr "admin.config.git_max_diff_files"}}
    +
    {{.Git.MaxGitDiffFiles}}
    +
    {{.locale.Tr "admin.config.git_gc_args"}}
    +
    {{.Git.GCArgs}}
    + +
    + +
    {{.locale.Tr "admin.config.git_migrate_timeout"}}
    +
    {{.Git.Timeout.Migrate}} {{.locale.Tr "tool.raw_seconds"}}
    +
    {{.locale.Tr "admin.config.git_mirror_timeout"}}
    +
    {{.Git.Timeout.Mirror}} {{.locale.Tr "tool.raw_seconds"}}
    +
    {{.locale.Tr "admin.config.git_clone_timeout"}}
    +
    {{.Git.Timeout.Clone}} {{.locale.Tr "tool.raw_seconds"}}
    +
    {{.locale.Tr "admin.config.git_pull_timeout"}}
    +
    {{.Git.Timeout.Pull}} {{.locale.Tr "tool.raw_seconds"}}
    +
    {{.locale.Tr "admin.config.git_gc_timeout"}}
    +
    {{.Git.Timeout.GC}} {{.locale.Tr "tool.raw_seconds"}}
    +
    +
    + +

    + {{.locale.Tr "admin.config.log_config"}} +

    +
    +
    + {{if .Loggers.xorm.IsEnabled}} +
    {{$.locale.Tr "admin.config.xorm_log_sql"}}
    +
    {{if $.LogSQL}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}
    + {{end}} + + {{if .Loggers.access.IsEnabled}} +
    {{$.locale.Tr "admin.config.access_log_template"}}
    +
    {{$.AccessLogTemplate}}
    + {{end}} + + {{range $loggerName, $loggerDetail := .Loggers}} +
    {{$.locale.Tr "admin.config.logger_name_fmt" $loggerName}}
    + {{if $loggerDetail.IsEnabled}} +
    {{$loggerDetail.EventWriters | JsonUtils.EncodeToString | JsonUtils.PrettyIndent}}
    + {{else}} +
    {{$.locale.Tr "admin.config.disabled_logger"}}
    + {{end}} + {{end}} +
    +
    +
    +{{template "admin/layout_footer" .}} diff --git a/src/templates/admin/cron.tmpl b/src/templates/admin/cron.tmpl new file mode 100644 index 0000000..c154619 --- /dev/null +++ b/src/templates/admin/cron.tmpl @@ -0,0 +1,39 @@ +{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin monitor")}} +
    +

    + {{.locale.Tr "admin.monitor.cron"}} +

    +
    +
    + + + + + + + + + + + + + + {{range .Entries}} + + + + + + + + + + {{end}} + +
    {{.locale.Tr "admin.monitor.name"}}{{.locale.Tr "admin.monitor.schedule"}}{{.locale.Tr "admin.monitor.next"}}{{.locale.Tr "admin.monitor.previous"}}{{.locale.Tr "admin.monitor.execute_times"}}{{.locale.Tr "admin.monitor.last_execution_result"}}
    {{$.locale.Tr (printf "admin.dashboard.%s" .Name)}}{{.Spec}}{{DateTime "full" .Next}}{{if gt .Prev.Year 1}}{{DateTime "full" .Prev}}{{else}}-{{end}}{{.ExecTimes}}{{if eq .Status ""}}—{{else if eq .Status "finished"}}{{svg "octicon-check" 16}}{{else}}{{svg "octicon-x" 16}}{{end}}
    + + {{.CsrfTokenHtml}} +
    +
    +
    +{{template "admin/layout_footer" .}} diff --git a/src/templates/admin/dashboard.tmpl b/src/templates/admin/dashboard.tmpl new file mode 100644 index 0000000..9d503a1 --- /dev/null +++ b/src/templates/admin/dashboard.tmpl @@ -0,0 +1,137 @@ +{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin dashboard")}} +
    + {{if .NeedUpdate}} +
    +

    {{(.locale.Tr "admin.dashboard.new_version_hint" .RemoteVersion AppVer) | Str2html}}

    +
    + {{end}} +

    + {{.locale.Tr "admin.dashboard.operations"}} +

    +
    +
    + {{.CsrfTokenHtml}} + + + + + + + + + + + + + + + + + + + {{if and (not .SSH.Disabled) (not .SSH.StartBuiltinServer)}} + + + + + + + + + {{end}} + + + + + + + + + + + + + + + + + + + + + +
    {{.locale.Tr "admin.dashboard.delete_inactive_accounts"}}
    {{.locale.Tr "admin.dashboard.delete_repo_archives"}}
    {{.locale.Tr "admin.dashboard.delete_missing_repos"}}
    {{.locale.Tr "admin.dashboard.git_gc_repos"}}
    {{.locale.Tr "admin.dashboard.resync_all_sshkeys"}}
    + {{.locale.Tr "admin.dashboard.resync_all_sshkeys.desc"}}
    {{.locale.Tr "admin.dashboard.resync_all_sshprincipals"}}
    + {{.locale.Tr "admin.dashboard.resync_all_sshprincipals.desc"}}
    {{.locale.Tr "admin.dashboard.resync_all_hooks"}}
    {{.locale.Tr "admin.dashboard.reinit_missing_repos"}}
    {{.locale.Tr "admin.dashboard.sync_external_users"}}
    {{.locale.Tr "admin.dashboard.repo_health_check"}}
    {{.locale.Tr "admin.dashboard.delete_generated_repository_avatars"}}
    +
    +
    + +

    + {{.locale.Tr "admin.dashboard.system_status"}} +

    +
    +
    +
    {{.locale.Tr "admin.dashboard.server_uptime"}}
    +
    {{.SysStatus.StartTime}}
    +
    {{.locale.Tr "admin.dashboard.current_goroutine"}}
    +
    {{.SysStatus.NumGoroutine}}
    +
    +
    {{.locale.Tr "admin.dashboard.current_memory_usage"}}
    +
    {{.SysStatus.MemAllocated}}
    +
    {{.locale.Tr "admin.dashboard.total_memory_allocated"}}
    +
    {{.SysStatus.MemTotal}}
    +
    {{.locale.Tr "admin.dashboard.memory_obtained"}}
    +
    {{.SysStatus.MemSys}}
    +
    {{.locale.Tr "admin.dashboard.pointer_lookup_times"}}
    +
    {{.SysStatus.Lookups}}
    +
    {{.locale.Tr "admin.dashboard.memory_allocate_times"}}
    +
    {{.SysStatus.MemMallocs}}
    +
    {{.locale.Tr "admin.dashboard.memory_free_times"}}
    +
    {{.SysStatus.MemFrees}}
    +
    +
    {{.locale.Tr "admin.dashboard.current_heap_usage"}}
    +
    {{.SysStatus.HeapAlloc}}
    +
    {{.locale.Tr "admin.dashboard.heap_memory_obtained"}}
    +
    {{.SysStatus.HeapSys}}
    +
    {{.locale.Tr "admin.dashboard.heap_memory_idle"}}
    +
    {{.SysStatus.HeapIdle}}
    +
    {{.locale.Tr "admin.dashboard.heap_memory_in_use"}}
    +
    {{.SysStatus.HeapInuse}}
    +
    {{.locale.Tr "admin.dashboard.heap_memory_released"}}
    +
    {{.SysStatus.HeapReleased}}
    +
    {{.locale.Tr "admin.dashboard.heap_objects"}}
    +
    {{.SysStatus.HeapObjects}}
    +
    +
    {{.locale.Tr "admin.dashboard.bootstrap_stack_usage"}}
    +
    {{.SysStatus.StackInuse}}
    +
    {{.locale.Tr "admin.dashboard.stack_memory_obtained"}}
    +
    {{.SysStatus.StackSys}}
    +
    {{.locale.Tr "admin.dashboard.mspan_structures_usage"}}
    +
    {{.SysStatus.MSpanInuse}}
    +
    {{.locale.Tr "admin.dashboard.mspan_structures_obtained"}}
    +
    {{.SysStatus.MSpanSys}}
    +
    {{.locale.Tr "admin.dashboard.mcache_structures_usage"}}
    +
    {{.SysStatus.MCacheInuse}}
    +
    {{.locale.Tr "admin.dashboard.mcache_structures_obtained"}}
    +
    {{.SysStatus.MCacheSys}}
    +
    {{.locale.Tr "admin.dashboard.profiling_bucket_hash_table_obtained"}}
    +
    {{.SysStatus.BuckHashSys}}
    +
    {{.locale.Tr "admin.dashboard.gc_metadata_obtained"}}
    +
    {{.SysStatus.GCSys}}
    +
    {{.locale.Tr "admin.dashboard.other_system_allocation_obtained"}}
    +
    {{.SysStatus.OtherSys}}
    +
    +
    {{.locale.Tr "admin.dashboard.next_gc_recycle"}}
    +
    {{.SysStatus.NextGC}}
    +
    {{.locale.Tr "admin.dashboard.last_gc_time"}}
    +
    {{.SysStatus.LastGC}}
    +
    {{.locale.Tr "admin.dashboard.total_gc_pause"}}
    +
    {{.SysStatus.PauseTotalNs}}
    +
    {{.locale.Tr "admin.dashboard.last_gc_pause"}}
    +
    {{.SysStatus.PauseNs}}
    +
    {{.locale.Tr "admin.dashboard.gc_times"}}
    +
    {{.SysStatus.NumGC}}
    +
    +
    +
    +{{template "admin/layout_footer" .}} diff --git a/src/templates/admin/emails/list.tmpl b/src/templates/admin/emails/list.tmpl new file mode 100644 index 0000000..1da40cb --- /dev/null +++ b/src/templates/admin/emails/list.tmpl @@ -0,0 +1,101 @@ +{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin user")}} +
    +

    + {{.locale.Tr "admin.emails.email_manage_panel"}} ({{.locale.Tr "admin.total" .Total}}) +

    +
    + +
    +
    + + +
    +
    +
    +
    + + + + + + + + + + + + {{range .Emails}} + + + + + + + + {{end}} + +
    + {{.locale.Tr "admin.users.name"}} + {{SortArrow "username" "reverseusername" $.SortType false}} + {{.locale.Tr "admin.users.full_name"}} + {{.locale.Tr "email"}} + {{SortArrow "email" "reverseemail" $.SortType true}} + {{.locale.Tr "admin.emails.primary"}}{{.locale.Tr "admin.emails.activated"}}
    {{.Name}}{{.FullName}}{{if .IsPrimary}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}} + {{if .CanChange}} + + {{if .IsActivated}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}} + + {{else}} + {{if .IsActivated}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}} + {{end}} +
    +
    + + {{template "base/paginate" .}} + + + +
    +{{template "admin/layout_footer" .}} diff --git a/src/templates/admin/hook_new.tmpl b/src/templates/admin/hook_new.tmpl new file mode 100644 index 0000000..1abdd4c --- /dev/null +++ b/src/templates/admin/hook_new.tmpl @@ -0,0 +1,55 @@ +{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin settings new webhook")}} +
    +

    + {{if .PageIsAdminDefaultHooksNew}} + {{.locale.Tr "admin.defaulthooks.add_webhook"}} + {{else if .PageIsAdminSystemHooksNew}} + {{.locale.Tr "admin.systemhooks.add_webhook"}} + {{else if .Webhook.IsSystemWebhook}} + {{.locale.Tr "admin.systemhooks.update_webhook"}} + {{else}} + {{.locale.Tr "admin.defaulthooks.update_webhook"}} + {{end}} +
    + {{if eq .HookType "gitea"}} + + {{else if eq .HookType "gogs"}} + + {{else if eq .HookType "slack"}} + + {{else if eq .HookType "discord"}} + + {{else if eq .HookType "dingtalk"}} + + {{else if eq .HookType "telegram"}} + + {{else if eq .HookType "msteams"}} + + {{else if eq .HookType "feishu"}} + + {{else if eq .HookType "matrix"}} + {{svg "gitea-matrix" 26}} + {{else if eq .HookType "wechatwork"}} + + {{else if eq .HookType "packagist"}} + + {{end}} +
    +

    +
    + {{template "repo/settings/webhook/gitea" .}} + {{template "repo/settings/webhook/gogs" .}} + {{template "repo/settings/webhook/slack" .}} + {{template "repo/settings/webhook/discord" .}} + {{template "repo/settings/webhook/dingtalk" .}} + {{template "repo/settings/webhook/telegram" .}} + {{template "repo/settings/webhook/msteams" .}} + {{template "repo/settings/webhook/feishu" .}} + {{template "repo/settings/webhook/matrix" .}} + {{template "repo/settings/webhook/wechatwork" .}} + {{template "repo/settings/webhook/packagist" .}} +
    + + {{template "repo/settings/webhook/history" .}} +
    +{{template "admin/layout_footer" .}} diff --git a/src/templates/admin/hooks.tmpl b/src/templates/admin/hooks.tmpl new file mode 100644 index 0000000..c77d27d --- /dev/null +++ b/src/templates/admin/hooks.tmpl @@ -0,0 +1,9 @@ +{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin hooks")}} +
    + + {{template "repo/settings/webhook/base_list" .SystemWebhooks}} + {{template "repo/settings/webhook/base_list" .DefaultWebhooks}} + + {{template "repo/settings/webhook/delete_modal" .}} +
    +{{template "admin/layout_footer" .}} diff --git a/src/templates/admin/layout_footer.tmpl b/src/templates/admin/layout_footer.tmpl new file mode 100644 index 0000000..8d6e564 --- /dev/null +++ b/src/templates/admin/layout_footer.tmpl @@ -0,0 +1,11 @@ +{{if false}}{{/* to make html structure "likely" complete to prevent IDE warnings */}} +
    +
    +
    + {{/* block: admin-setting-content */}} +{{end}} + +
    +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/admin/layout_head.tmpl b/src/templates/admin/layout_head.tmpl new file mode 100644 index 0000000..6d84f8f --- /dev/null +++ b/src/templates/admin/layout_head.tmpl @@ -0,0 +1,13 @@ +{{template "base/head" .ctxData}} +
    +
    + {{template "admin/navbar" .ctxData}} +
    + {{template "base/alert" .ctxData}} + {{/* block: admin-setting-content */}} + +{{if false}}{{/* to make html structure "likely" complete to prevent IDE warnings */}} +
    +
    +
    +{{end}} diff --git a/src/templates/admin/navbar.tmpl b/src/templates/admin/navbar.tmpl new file mode 100644 index 0000000..641d3fa --- /dev/null +++ b/src/templates/admin/navbar.tmpl @@ -0,0 +1,71 @@ + diff --git a/src/templates/admin/notice.tmpl b/src/templates/admin/notice.tmpl new file mode 100644 index 0000000..5cd617a --- /dev/null +++ b/src/templates/admin/notice.tmpl @@ -0,0 +1,71 @@ +{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin notice")}} +
    +

    + {{.locale.Tr "admin.notices.system_notice_list"}} ({{.locale.Tr "admin.total" .Total}}) +

    + + + + + + + + + + + + + {{range .Notices}} + + + + + + + + + {{end}} + + {{if .Notices}} + + + + + + + {{end}} +
    ID{{.locale.Tr "admin.notices.type"}}{{.locale.Tr "admin.notices.desc"}}{{.locale.Tr "admin.users.created"}}{{.locale.Tr "admin.notices.op"}}
    {{.ID}}{{$.locale.Tr .TrStr}}{{.Description}}{{DateTime "short" .CreatedUnix}}{{svg "octicon-note" 16}}
    +
    + {{.CsrfTokenHtml}} + +
    + + +
    + {{template "base/paginate" .}} +
    + + + +{{template "admin/layout_footer" .}} diff --git a/src/templates/admin/org/list.tmpl b/src/templates/admin/org/list.tmpl new file mode 100644 index 0000000..a400dcb --- /dev/null +++ b/src/templates/admin/org/list.tmpl @@ -0,0 +1,54 @@ +{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin user")}} +
    +

    + {{.locale.Tr "admin.orgs.org_manage_panel"}} ({{.locale.Tr "admin.total" .Total}}) + +

    +
    + {{template "admin/base/search" .}} +
    +
    + + + + + + + + + + + + + + {{range .Users}} + + + + + + + + + + {{end}} + +
    ID{{SortArrow "oldest" "newest" $.SortType false}} + {{.locale.Tr "admin.orgs.name"}} + {{SortArrow "alphabetically" "reversealphabetically" $.SortType true}} + {{.locale.Tr "admin.orgs.teams"}}{{.locale.Tr "admin.orgs.members"}}{{.locale.Tr "admin.users.repos"}} + {{.locale.Tr "admin.users.created"}} + {{SortArrow "recentupdate" "leastupdate" $.SortType false}} + {{.locale.Tr "admin.users.edit"}}
    {{.ID}} + {{.Name}} + {{if .Visibility.IsPrivate}} + {{svg "octicon-lock"}} + {{end}} + {{.NumTeams}}{{.NumMembers}}{{.NumRepos}}{{DateTime "short" .CreatedUnix}}{{svg "octicon-pencil"}}
    +
    + + {{template "base/paginate" .}} +
    +{{template "admin/layout_footer" .}} diff --git a/src/templates/admin/packages/list.tmpl b/src/templates/admin/packages/list.tmpl new file mode 100644 index 0000000..f320878 --- /dev/null +++ b/src/templates/admin/packages/list.tmpl @@ -0,0 +1,90 @@ +{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin user")}} +
    +

    + {{.locale.Tr "admin.packages.package_manage_panel"}} ({{.locale.Tr "admin.total" .TotalCount}}, + {{.locale.Tr "admin.packages.total_size" (FileSize .TotalBlobSize)}}, + {{.locale.Tr "admin.packages.unreferenced_size" (FileSize .TotalUnreferencedBlobSize)}}) +

    +
    +
    +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + {{range .PackageDescriptors}} + + + + + + + + + + + + + {{end}} + +
    ID{{.locale.Tr "admin.packages.owner"}}{{.locale.Tr "admin.packages.type"}} + {{.locale.Tr "admin.packages.name"}} + {{SortArrow "name_asc" "name_desc" .SortType false}} + + {{.locale.Tr "admin.packages.version"}} + {{SortArrow "version_desc" "version_asc" .SortType false}} + {{.locale.Tr "admin.packages.creator"}}{{.locale.Tr "admin.packages.repository"}}{{.locale.Tr "admin.packages.size"}} + {{.locale.Tr "admin.packages.published"}} + {{SortArrow "created_asc" "created_desc" .SortType true}} + {{.locale.Tr "admin.notices.op"}}
    {{.Version.ID}} + {{.Owner.Name}} + {{if .Owner.Visibility.IsPrivate}} + {{svg "octicon-lock"}} + {{end}} + {{.Package.Type.Name}}{{.Creator.Name}} + {{if .Repository}} + {{.Repository.Name}} + {{end}} + {{FileSize .CalculateBlobSize}}{{DateTime "short" .Version.CreatedUnix}}{{svg "octicon-trash"}}
    +
    + + {{template "base/paginate" .}} +
    + + + +{{template "admin/layout_footer" .}} diff --git a/src/templates/admin/queue.tmpl b/src/templates/admin/queue.tmpl new file mode 100644 index 0000000..f58f25e --- /dev/null +++ b/src/templates/admin/queue.tmpl @@ -0,0 +1,34 @@ +{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin monitor")}} +
    +

    + {{.locale.Tr "admin.monitor.queues"}} +

    +
    + + + + + + + + + + + + + {{range $qid, $q := .Queues}} + + + + + + + + {{end}} + +
    {{.locale.Tr "admin.monitor.queue.name"}}{{.locale.Tr "admin.monitor.queue.type"}}{{.locale.Tr "admin.monitor.queue.exemplar"}}{{.locale.Tr "admin.monitor.queue.numberworkers"}}{{.locale.Tr "admin.monitor.queue.numberinqueue"}}
    {{$q.GetName}}{{$q.GetType}}{{$q.GetItemTypeName}}{{$sum := $q.GetWorkerNumber}}{{if lt $sum 0}}-{{else}}{{$sum}}{{end}}{{$sum = $q.GetQueueItemNumber}}{{if lt $sum 0}}-{{else}}{{$sum}}{{end}}{{if lt $sum 0}}{{$.locale.Tr "admin.monitor.queue.review"}}{{else}}{{$.locale.Tr "admin.monitor.queue.review_add"}}{{end}} +
    +
    +
    +{{template "admin/layout_footer" .}} + diff --git a/src/templates/admin/queue_manage.tmpl b/src/templates/admin/queue_manage.tmpl new file mode 100644 index 0000000..d456c2f --- /dev/null +++ b/src/templates/admin/queue_manage.tmpl @@ -0,0 +1,59 @@ +{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin monitor")}} +
    +

    + {{.locale.Tr "admin.monitor.queue" .Queue.GetName}} +

    +
    + + + + + + + + + + + + + + + + + + + + + +
    {{.locale.Tr "admin.monitor.queue.name"}}{{.locale.Tr "admin.monitor.queue.type"}}{{.locale.Tr "admin.monitor.queue.exemplar"}}{{.locale.Tr "admin.monitor.queue.numberworkers"}}{{.locale.Tr "admin.monitor.queue.maxnumberworkers"}}{{.locale.Tr "admin.monitor.queue.numberinqueue"}}
    {{.Queue.GetName}}{{.Queue.GetType}}{{.Queue.GetItemTypeName}}{{$sum := .Queue.GetWorkerNumber}}{{if lt $sum 0}}-{{else}}{{$sum}}{{end}}{{if lt $sum 0}}-{{else}}{{.Queue.GetWorkerMaxNumber}}{{end}} + {{$sum = .Queue.GetQueueItemNumber}} + {{if lt $sum 0}} + - + {{else}} + {{$sum}} +
    + {{$.CsrfTokenHtml}} + +
    + {{end}} +
    +
    + +

    + {{.locale.Tr "admin.monitor.queue.settings.title"}} +

    +
    +

    {{.locale.Tr "admin.monitor.queue.settings.desc"}}

    +
    + {{$.CsrfTokenHtml}} +
    +
    + + +
    + +
    +
    +
    +
    +{{template "admin/layout_footer" .}} diff --git a/src/templates/admin/repo/list.tmpl b/src/templates/admin/repo/list.tmpl new file mode 100644 index 0000000..f485784 --- /dev/null +++ b/src/templates/admin/repo/list.tmpl @@ -0,0 +1,109 @@ +{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin")}} +
    +

    + {{.locale.Tr "admin.repos.repo_manage_panel"}} ({{.locale.Tr "admin.total" .Total}}) + +

    +
    + {{template "admin/repo/search" .}} +
    +
    + + + + + + + + + + + + + + + + + + {{range .Repos}} + + + + + + + + + + + + + + {{end}} + +
    ID{{SortArrow "oldest" "newest" $.SortType false}}{{.locale.Tr "admin.repos.owner"}} + {{.locale.Tr "admin.repos.name"}} + {{SortArrow "alphabetically" "reversealphabetically" $.SortType false}} + {{.locale.Tr "admin.repos.watches"}} + {{.locale.Tr "admin.repos.stars"}} + {{SortArrow "moststars" "feweststars" $.SortType false}} + + {{.locale.Tr "admin.repos.forks"}} + {{SortArrow "mostforks" "fewestforks" $.SortType false}} + {{.locale.Tr "admin.repos.issues"}} + {{.locale.Tr "admin.repos.size"}} + {{SortArrow "size" "reversesize" $.SortType false}} + {{.locale.Tr "admin.auths.updated"}}{{.locale.Tr "admin.users.created"}}{{.locale.Tr "admin.notices.op"}}
    {{.ID}} + {{.Owner.Name}} + {{if .Owner.Visibility.IsPrivate}} + {{svg "octicon-lock"}} + {{end}} + + {{.Name}} + {{if .IsArchived}} + {{$.locale.Tr "repo.desc.archived"}} + {{end}} + {{if .IsTemplate}} + {{if .IsPrivate}} + {{$.locale.Tr "repo.desc.private_template"}} + {{else}} + {{if .Owner.Visibility.IsPrivate}} + {{$.locale.Tr "repo.desc.internal_template"}} + {{end}} + {{end}} + {{else}} + {{if .IsPrivate}} + {{$.locale.Tr "repo.desc.private"}} + {{else}} + {{if .Owner.Visibility.IsPrivate}} + {{$.locale.Tr "repo.desc.internal"}} + {{end}} + {{end}} + {{end}} + {{if .IsFork}} + {{svg "octicon-repo-forked"}} + {{else if .IsMirror}} + {{svg "octicon-mirror"}} + {{end}} + {{.NumWatches}}{{.NumStars}}{{.NumForks}}{{.NumIssues}}{{FileSize .Size}}{{DateTime "short" .UpdatedUnix}}{{DateTime "short" .CreatedUnix}}{{svg "octicon-trash"}}
    +
    + + {{template "base/paginate" .}} +
    + + + +{{template "admin/layout_footer" .}} diff --git a/src/templates/admin/repo/search.tmpl b/src/templates/admin/repo/search.tmpl new file mode 100644 index 0000000..15aa31b --- /dev/null +++ b/src/templates/admin/repo/search.tmpl @@ -0,0 +1,29 @@ + +
    +
    + + +
    +
    diff --git a/src/templates/admin/repo/unadopted.tmpl b/src/templates/admin/repo/unadopted.tmpl new file mode 100644 index 0000000..27898a1 --- /dev/null +++ b/src/templates/admin/repo/unadopted.tmpl @@ -0,0 +1,75 @@ +{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin")}} +
    +

    + {{.locale.Tr "admin.repos.unadopted"}} + +

    +
    +
    +
    + + + +
    +
    +
    + {{if .search}} +
    + {{if .Dirs}} +
    + {{range $dirI, $dir := .Dirs}} +
    + {{svg "octicon-file-directory-fill"}} {{$dir}} +
    + + + + +
    +
    + {{end}} +
    + {{template "base/paginate" .}} + {{else}} +
    + {{.locale.Tr "admin.repos.unadopted.no_more"}} +
    + {{template "base/paginate" .}} + {{end}} +
    + {{end}} +
    + +{{template "admin/layout_footer" .}} diff --git a/src/templates/admin/runners/edit.tmpl b/src/templates/admin/runners/edit.tmpl new file mode 100644 index 0000000..1165c84 --- /dev/null +++ b/src/templates/admin/runners/edit.tmpl @@ -0,0 +1,5 @@ +{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin runners")}} +
    + {{template "shared/actions/runner_edit" .}} +
    +{{template "admin/layout_footer" .}} diff --git a/src/templates/admin/stacktrace-row.tmpl b/src/templates/admin/stacktrace-row.tmpl new file mode 100644 index 0000000..15e51e4 --- /dev/null +++ b/src/templates/admin/stacktrace-row.tmpl @@ -0,0 +1,66 @@ +
    +
    +
    + {{if eq .Process.Type "request"}} + {{svg "octicon-globe" 16}} + {{else if eq .Process.Type "system"}} + {{svg "octicon-cpu" 16}} + {{else if eq .Process.Type "normal"}} + {{svg "octicon-terminal" 16}} + {{else}} + {{svg "octicon-code" 16}} + {{end}} +
    +
    +
    {{.Process.Description}}
    +
    {{if ne .Process.Type "none"}}{{TimeSince .Process.Start .root.locale}}{{end}}
    +
    +
    + {{if or (eq .Process.Type "request") (eq .Process.Type "normal")}} + {{svg "octicon-trash" 16 "text-red"}} + {{end}} +
    +
    + {{if .Process.Stacks}} +
    + {{range .Process.Stacks}} +
    +
    + +
    +
    + {{svg "octicon-code" 16}}{{.Description}}{{if gt .Count 1}} * {{.Count}}{{end}} +
    +
    + {{range .Labels}} +
    {{.Name}}
    {{.Value}}
    + {{end}} +
    +
    +
    +
    + {{range .Entry}} +
    + {{svg "octicon-dot-fill" 16}} +
    +
    {{.Function}}
    +
    {{.File}}:{{.Line}}
    +
    +
    + {{end}} +
    +
    +
    + {{end}} +
    + {{end}} + + {{if .Process.Children}} +
    + {{range .Process.Children}} + {{template "admin/stacktrace-row" dict "Process" . "root" $.root}} + {{end}} +
    + {{end}} + +
    diff --git a/src/templates/admin/stacktrace.tmpl b/src/templates/admin/stacktrace.tmpl new file mode 100644 index 0000000..46ad421 --- /dev/null +++ b/src/templates/admin/stacktrace.tmpl @@ -0,0 +1,48 @@ +{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin monitor")}} +
    + +
    + +
    +
    + + {{.locale.Tr "tool.raw_seconds"}} +
    +
    +
    + +
    + +

    + {{printf "%d Goroutines" .GoroutineCount}}{{/* Goroutine is non-translatable*/}} + {{- if .ProcessCount -}}, {{.locale.Tr "admin.monitor.processes_count" .ProcessCount}}{{- end -}} +

    + + {{if .ProcessStacks}} +
    +
    + {{range .ProcessStacks}} + {{template "admin/stacktrace-row" dict "Process" . "root" $}} + {{end}} +
    +
    + {{end}} +
    + + + +{{template "admin/layout_footer" .}} diff --git a/src/templates/admin/stats.tmpl b/src/templates/admin/stats.tmpl new file mode 100644 index 0000000..c755969 --- /dev/null +++ b/src/templates/admin/stats.tmpl @@ -0,0 +1,17 @@ +{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin monitor")}} +
    +

    + {{.locale.Tr "admin.dashboard.statistic"}} +

    +
    + + {{range $statsKey := .StatsKeys}} + + + + + {{end}} +
    {{$statsKey}}{{index $.StatsCounter $statsKey}}
    +
    +
    +{{template "admin/layout_footer" .}} diff --git a/src/templates/admin/user/edit.tmpl b/src/templates/admin/user/edit.tmpl new file mode 100644 index 0000000..4e98223 --- /dev/null +++ b/src/templates/admin/user/edit.tmpl @@ -0,0 +1,216 @@ +{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin edit user")}} +
    +

    + {{.locale.Tr "admin.users.edit_account"}} +

    +
    +
    + {{template "base/disable_form_autofill"}} + {{.CsrfTokenHtml}} +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +

    {{.locale.Tr "admin.users.password_helper"}}

    +
    +
    + + +
    +
    + + +
    + +
    + +
    + + +

    {{.locale.Tr "admin.users.max_repo_creation_desc"}}

    +
    + +
    + +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    + {{if not .DisableRegularOrgCreation}} +
    +
    + + +
    +
    + {{end}} + + {{if .TwoFactorEnabled}} +
    +
    +
    + + +
    +
    + {{end}} + +
    + +
    + + +
    +
    +
    + +

    + {{.locale.Tr "settings.avatar"}} +

    +
    +
    + {{.CsrfTokenHtml}} + {{if not (DisableGravatar $.Context)}} +
    +
    + + +
    +
    +
    + + +
    + {{end}} + +
    +
    + + +
    +
    + +
    + + +
    + +
    + + {{$.locale.Tr "settings.delete_current_avatar"}}{{/* TODO: Convert links without href to buttons for a11y */}} +
    +
    +
    +
    + + + +{{template "admin/layout_footer" .}} diff --git a/src/templates/admin/user/list.tmpl b/src/templates/admin/user/list.tmpl new file mode 100644 index 0000000..2f76f2d --- /dev/null +++ b/src/templates/admin/user/list.tmpl @@ -0,0 +1,109 @@ +{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin user")}} +
    +

    + {{.locale.Tr "admin.users.user_manage_panel"}} ({{.locale.Tr "admin.total" .Total}}) + +

    +
    +
    + + + + + +
    + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + {{range .Users}} + + + + + + + + + + + {{if .LastLoginUnix}} + + {{else}} + + {{end}} + + + {{end}} + +
    ID{{SortArrow "oldest" "newest" .SortType false}} + {{.locale.Tr "admin.users.name"}} + {{SortArrow "alphabetically" "reversealphabetically" $.SortType true}} + {{.locale.Tr "email"}}{{.locale.Tr "admin.users.activated"}}{{.locale.Tr "admin.users.admin"}}{{.locale.Tr "admin.users.restricted"}}{{.locale.Tr "admin.users.2fa"}}{{.locale.Tr "admin.users.repos"}}{{.locale.Tr "admin.users.created"}} + {{.locale.Tr "admin.users.last_login"}} + {{SortArrow "lastlogin" "reverselastlogin" $.SortType false}} + {{.locale.Tr "admin.users.edit"}}
    {{.ID}}{{.Name}}{{if .IsActive}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}{{if .IsAdmin}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}{{if .IsRestricted}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}{{if index $.UsersTwoFaStatus .ID}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}{{.NumRepos}}{{DateTime "short" .CreatedUnix}}{{DateTime "short" .LastLoginUnix}}{{$.locale.Tr "admin.users.never_login"}}{{svg "octicon-pencil"}}
    +
    + + {{template "base/paginate" .}} +
    +{{template "admin/layout_footer" .}} diff --git a/src/templates/admin/user/new.tmpl b/src/templates/admin/user/new.tmpl new file mode 100644 index 0000000..691d63a --- /dev/null +++ b/src/templates/admin/user/new.tmpl @@ -0,0 +1,90 @@ +{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin new user")}} +
    +

    + {{.locale.Tr "admin.users.new_account"}} +

    +
    +
    + {{template "base/disable_form_autofill"}} + {{.CsrfTokenHtml}} + +
    + + +
    + +
    + + +
    + +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    + +
    +
    + + +
    +
    + + + {{if .CanSendEmail}} +
    +
    + + +
    +
    + {{end}} + +
    + +
    +
    +
    +
    +{{template "admin/layout_footer" .}} diff --git a/src/templates/api/packages/pypi/simple.tmpl b/src/templates/api/packages/pypi/simple.tmpl new file mode 100644 index 0000000..77cb035 --- /dev/null +++ b/src/templates/api/packages/pypi/simple.tmpl @@ -0,0 +1,15 @@ + + + + Links for {{.PackageDescriptor.Package.Name}} + + +

    Links for {{.PackageDescriptor.Package.Name}}

    + {{range .PackageDescriptors}} + {{$p := .}} + {{range .Files}} + {{.File.Name}}
    + {{end}} + {{end}} + + diff --git a/src/templates/base/alert.tmpl b/src/templates/base/alert.tmpl new file mode 100644 index 0000000..160584f --- /dev/null +++ b/src/templates/base/alert.tmpl @@ -0,0 +1,20 @@ +{{if .Flash.ErrorMsg}} +
    +

    {{.Flash.ErrorMsg | Str2html}}

    +
    +{{end}} +{{if .Flash.SuccessMsg}} +
    +

    {{.Flash.SuccessMsg | Str2html}}

    +
    +{{end}} +{{if .Flash.InfoMsg}} +
    +

    {{.Flash.InfoMsg | Str2html}}

    +
    +{{end}} +{{if .Flash.WarningMsg}} +
    +

    {{.Flash.WarningMsg | Str2html}}

    +
    +{{end}} diff --git a/src/templates/base/alert_details.tmpl b/src/templates/base/alert_details.tmpl new file mode 100644 index 0000000..1d7ec15 --- /dev/null +++ b/src/templates/base/alert_details.tmpl @@ -0,0 +1,7 @@ +{{.Message}} +
    + {{.Summary}} + + {{.Details | Str2html}} + +
    diff --git a/src/templates/base/disable_form_autofill.tmpl b/src/templates/base/disable_form_autofill.tmpl new file mode 100644 index 0000000..6f06395 --- /dev/null +++ b/src/templates/base/disable_form_autofill.tmpl @@ -0,0 +1,31 @@ +{{/* +Why we need to disable form autofill: +1. Many pages contain different password inputs for different usages, eg: repo setting, autofill will make a mess. +2. We have `areYouSure` confirm dialog if a user leaves a pages without submit. +Autofill will make the form changed even if the user didn't input anything. Then the user keeps seeing annoying confirm dialog. + +In history, Gitea put `` in forms to bypass the autofill, +but there were still many forms suffered the autofill problem. + +Now we improve it. + +Solutions which do NOT work: +1. Adding `autocomplete=off` doesn't help. New Chrome completely ignores it. +2. Use a JavaScript to run in a few seconds later after the page is loaded to process the autofilled inputs, it doesn't work. +Because for security reason, the inputs won't be filled before the user makes an interaction in the page. +So we can not predict the correct time to run the JavaScript code. + +Solutions which work: +1. Some hacky methods like: https://github.com/matteobad/detect-autofill +2. This solution: use invisible inputs. Be aware of: +(a) The inputs must be at the beginning of the form, and can not be hidden. +(b) The input for username must have a valid name. +(c) There should be no negative word (eg: fake) in the `name` attribute. +(d) Chrome seems to use a weighted algorithm to choose an input to fill text, so the using "username" as input name is better than using "user". +We make the names of these dummy inputs begin with an underline to indicate it is for special usage, +and these dummy form values won't be used by backend code. +*/}} + diff --git a/src/templates/base/footer.tmpl b/src/templates/base/footer.tmpl new file mode 100644 index 0000000..e3cac80 --- /dev/null +++ b/src/templates/base/footer.tmpl @@ -0,0 +1,31 @@ +{{if false}} + {{/* to make html structure "likely" complete to prevent IDE warnings */}} + + +
    +{{end}} + + {{template "custom/body_inner_post" .}} + +
    + + {{template "custom/body_outer_post" .}} + + {{template "base/footer_content" .}} + + +{{if .EnableCaptcha}} + {{if eq .CaptchaType "recaptcha"}} + + {{end}} + {{if eq .CaptchaType "hcaptcha"}} + + {{end}} + {{if eq .CaptchaType "cfturnstile"}} + + {{end}} +{{end}} + +{{template "custom/footer" .}} + + diff --git a/src/templates/base/footer_content.tmpl b/src/templates/base/footer_content.tmpl new file mode 100644 index 0000000..3b87f25 --- /dev/null +++ b/src/templates/base/footer_content.tmpl @@ -0,0 +1,30 @@ +
    + + +
    diff --git a/src/templates/base/head.tmpl b/src/templates/base/head.tmpl new file mode 100644 index 0000000..4858d0b --- /dev/null +++ b/src/templates/base/head.tmpl @@ -0,0 +1,84 @@ + + + + + {{if .Title}}{{.Title | RenderEmojiPlain}} - {{end}}{{if .Repository.Name}}{{.Repository.Name}} - {{end}}{{AppName}} + {{if .ManifestData}}{{end}} + + + + +{{if .GoGetImport}} + + +{{end}} +{{if and .EnableFeed .FeedURL}} + + +{{end}} + + + {{template "base/head_script" .}} + +{{if .PageIsUserProfile}} + + + + + {{if .ContextUser.Description}} + + {{end}} +{{else if .Repository}} + {{if .Issue}} + + + {{if .Issue.Content}} + + {{end}} + {{else}} + + + {{if .Repository.Description}} + + {{end}} + {{end}} + + {{if (.Repository.AvatarLink $.Context)}} + + {{else}} + + {{end}} +{{else}} + + + + + +{{end}} + + {{template "base/head_style" .}} + {{template "custom/header" .}} + + + {{template "custom/body_outer_pre" .}} + +
    + + + {{template "custom/body_inner_pre" .}} + + {{if not .PageIsInstall}} + {{template "base/head_navbar" .}} + {{end}} + +{{if false}} + {{/* to make html structure "likely" complete to prevent IDE warnings */}} +
    + + +{{end}} diff --git a/src/templates/base/head_navbar.tmpl b/src/templates/base/head_navbar.tmpl new file mode 100644 index 0000000..5e41636 --- /dev/null +++ b/src/templates/base/head_navbar.tmpl @@ -0,0 +1,205 @@ +{{$notificationUnreadCount := 0}} +{{if and .IsSigned .NotificationUnreadCount}} + {{$notificationUnreadCount = call .NotificationUnreadCount}} +{{end}} + + diff --git a/src/templates/base/head_script.tmpl b/src/templates/base/head_script.tmpl new file mode 100644 index 0000000..4e1dffa --- /dev/null +++ b/src/templates/base/head_script.tmpl @@ -0,0 +1,45 @@ +{{/* +==== DO NOT EDIT ==== +If you are customizing Gitea, please do not change this file. +If you introduce mistakes in it, Gitea JavaScript code wouldn't run correctly. +*/}} + + diff --git a/src/templates/base/head_style.tmpl b/src/templates/base/head_style.tmpl new file mode 100644 index 0000000..7e8cba2 --- /dev/null +++ b/src/templates/base/head_style.tmpl @@ -0,0 +1,8 @@ + +{{if .IsSigned}} + {{if ne .SignedUser.Theme "gitea"}} + + {{end}} +{{else if ne DefaultTheme "gitea"}} + +{{end}} diff --git a/src/templates/base/modal_actions_confirm.tmpl b/src/templates/base/modal_actions_confirm.tmpl new file mode 100644 index 0000000..6cf3ecb --- /dev/null +++ b/src/templates/base/modal_actions_confirm.tmpl @@ -0,0 +1,38 @@ +{{/* +Template Attributes: +* locale + +Two buttons (negative, positive): +* ModalButtonTypes: "yes" (default) or "confirm" +* ModalButtonColors: "green" (default) / "blue" / "yellow" +* ModalButtonCancelText +* ModalButtonOkText + +Single danger button (GitHub-like): +* ModalButtonDangerText "This action will destroy your data" + +The ".ok.button" and ".cancel.button" selectors are also used by Fomantic Modal internally +*/}} +
    + {{if .ModalButtonDangerText}} + + {{else}} + {{$textNegitive := .locale.Tr "modal.no"}} + {{$textPositive := .locale.Tr "modal.yes"}} + {{if eq .ModalButtonTypes "confirm"}} + {{$textNegitive = .locale.Tr "modal.cancel"}} + {{$textPositive = .locale.Tr "modal.confirm"}} + {{end}} + {{if .ModalButtonCancelText}}{{$textNegitive = .ModalButtonCancelText}}{{end}} + {{if .ModalButtonOkText}}{{$textPositive = .ModalButtonOkText}}{{end}} + + {{$stylePositive := "green"}} + {{if eq .ModalButtonColors "blue"}} + {{$stylePositive = "blue"}} + {{else if eq .ModalButtonColors "yellow"}} + {{$stylePositive = "yellow"}} + {{end}} + + + {{end}} +
    diff --git a/src/templates/base/paginate.tmpl b/src/templates/base/paginate.tmpl new file mode 100644 index 0000000..9dd1549 --- /dev/null +++ b/src/templates/base/paginate.tmpl @@ -0,0 +1,32 @@ +{{$paginationLink := .Page.GetParams}} +{{with .Page.Paginater}} + {{if gt .TotalPages 1}} + + {{end}} +{{end}} diff --git a/src/templates/code/searchform.tmpl b/src/templates/code/searchform.tmpl new file mode 100644 index 0000000..dfe7bc5 --- /dev/null +++ b/src/templates/code/searchform.tmpl @@ -0,0 +1,14 @@ +
    +
    + + + +
    +
    diff --git a/src/templates/code/searchresults.tmpl b/src/templates/code/searchresults.tmpl new file mode 100644 index 0000000..684e286 --- /dev/null +++ b/src/templates/code/searchresults.tmpl @@ -0,0 +1,43 @@ +
    + {{range $term := .SearchResultLanguages}} + + + {{$term.Language}} +
    {{$term.Count}}
    +
    + {{end}} +
    + diff --git a/src/templates/custom/body_inner_post.tmpl b/src/templates/custom/body_inner_post.tmpl new file mode 100644 index 0000000..e69de29 diff --git a/src/templates/custom/body_inner_pre.tmpl b/src/templates/custom/body_inner_pre.tmpl new file mode 100644 index 0000000..e69de29 diff --git a/src/templates/custom/body_outer_post.tmpl b/src/templates/custom/body_outer_post.tmpl new file mode 100644 index 0000000..e69de29 diff --git a/src/templates/custom/body_outer_pre.tmpl b/src/templates/custom/body_outer_pre.tmpl new file mode 100644 index 0000000..e69de29 diff --git a/src/templates/custom/extra_links.tmpl b/src/templates/custom/extra_links.tmpl new file mode 100644 index 0000000..e69de29 diff --git a/src/templates/custom/extra_links_footer.tmpl b/src/templates/custom/extra_links_footer.tmpl new file mode 100644 index 0000000..e69de29 diff --git a/src/templates/custom/extra_tabs.tmpl b/src/templates/custom/extra_tabs.tmpl new file mode 100644 index 0000000..e69de29 diff --git a/src/templates/custom/footer.tmpl b/src/templates/custom/footer.tmpl new file mode 100644 index 0000000..e69de29 diff --git a/src/templates/custom/header.tmpl b/src/templates/custom/header.tmpl new file mode 100644 index 0000000..e69de29 diff --git a/src/templates/devtest/fomantic-modal.tmpl b/src/templates/devtest/fomantic-modal.tmpl new file mode 100644 index 0000000..aaa4c2c --- /dev/null +++ b/src/templates/devtest/fomantic-modal.tmpl @@ -0,0 +1,49 @@ +{{template "base/head" .}} +
    + + + + + + + + + + + + + +
    +{{template "base/footer" .}} diff --git a/src/templates/devtest/gitea-ui.tmpl b/src/templates/devtest/gitea-ui.tmpl new file mode 100644 index 0000000..bfec3e7 --- /dev/null +++ b/src/templates/devtest/gitea-ui.tmpl @@ -0,0 +1,247 @@ +{{template "base/head" .}} +
    +
    +

    Button

    +
    + Style: + + + + +
    +
    + State: + +
    +
    + +
      +
    • +

      General purpose:

      + + + + + + + + +
    • +
    • +

      Recommended colors:

      + + + + + + + + + + +
    • +
    • +

      Supported but not recommended:

      +

      Do not use if there is no strong requirement. Do not use grey/black buttons, they don't work well with dark theme.

      + + + + + + + + + + + + + + +
    • +
    • +

      Inline / Plain:

      +
      + + + +
      +
    • +
    + +
    +
    + +
    +

    Tooltip

    +
    text with tooltip
    +
    text with interactive tooltip
    +
    + +
    +

    GiteaOriginUrl

    +
    +
    +
    + +
    +

    LocaleNumber

    +
    {{.locale.PrettyNumber 1}}
    +
    {{.locale.PrettyNumber 12}}
    +
    {{.locale.PrettyNumber 123}}
    +
    {{.locale.PrettyNumber 1234}}
    +
    {{.locale.PrettyNumber 12345}}
    +
    {{.locale.PrettyNumber 123456}}
    +
    {{.locale.PrettyNumber 1234567}}
    +
    + +
    +

    TimeSince

    +
    Now: {{TimeSince .TimeNow $.locale}}
    +
    5s past: {{TimeSince .TimePast5s $.locale}}
    +
    5s future: {{TimeSince .TimeFuture5s $.locale}}
    +
    2m past: {{TimeSince .TimePast2m $.locale}}
    +
    2m future: {{TimeSince .TimeFuture2m $.locale}}
    +
    1y past: {{TimeSince .TimePast1y $.locale}}
    +
    1y future: {{TimeSince .TimeFuture1y $.locale}}
    +
    + +
    +

    SVG alignment

    + +

    Text with SVG

    +
    {{svg "octicon-alert"}} {{svg "octicon-x"}} text (block)
    +
    {{svg "octicon-alert"}} {{svg "octicon-x"}} text
    (inline)
    +
    +
    {{svg "octicon-alert"}} flex every line
    +
    {{svg "octicon-alert"}} flex every item
    +
    + +

    Button with SVG

    +
    + +
    + + 123 +
    +
    + +

    Input with SVG

    +
    + +
    + +

    Dropdown with SVG

    +
    + + + + +
    + + +
    +
    + +
    + + + + +
    + +
    + + + + +
    +
    + +
    +

    ComboMarkdownEditor

    +
    ps: no JS code attached, so just a layout
    + {{template "shared/combomarkdowneditor" .}} +
    + + +
    +{{template "base/footer" .}} diff --git a/src/templates/devtest/list.tmpl b/src/templates/devtest/list.tmpl new file mode 100644 index 0000000..5044f2a --- /dev/null +++ b/src/templates/devtest/list.tmpl @@ -0,0 +1,12 @@ + +
      + {{range .SubNames}} +
    • {{.}}
    • + {{end}} +
    diff --git a/src/templates/devtest/tmplerr-sub.tmpl b/src/templates/devtest/tmplerr-sub.tmpl new file mode 100644 index 0000000..c4c8516 --- /dev/null +++ b/src/templates/devtest/tmplerr-sub.tmpl @@ -0,0 +1,3 @@ +sub template triggers an executing error + + {{.locale.NoSuch "asdf"}} diff --git a/src/templates/devtest/tmplerr.tmpl b/src/templates/devtest/tmplerr.tmpl new file mode 100644 index 0000000..2fe3f1e --- /dev/null +++ b/src/templates/devtest/tmplerr.tmpl @@ -0,0 +1,12 @@ +{{template "base/head" .}} +
    +
    +
    + hello hello hello hello hello hello hello hello hello hello +
    +
    + {{template "devtest/tmplerr-sub" .}} +
    +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/explore/code.tmpl b/src/templates/explore/code.tmpl new file mode 100644 index 0000000..924a3e6 --- /dev/null +++ b/src/templates/explore/code.tmpl @@ -0,0 +1,25 @@ +{{template "base/head" .}} +
    + {{template "explore/navbar" .}} +
    + {{template "code/searchform" .}} +
    +
    + {{if .CodeIndexerUnavailable}} +
    +

    {{$.locale.Tr "explore.code_search_unavailable"}}

    +
    + {{else if .SearchResults}} +

    + {{.locale.Tr "explore.code_search_results" (.Keyword|Escape) | Str2html}} +

    + {{template "code/searchresults" .}} + {{else if .Keyword}} +
    {{$.locale.Tr "explore.code_no_results"}}
    + {{end}} +
    + + {{template "base/paginate" .}} +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/explore/navbar.tmpl b/src/templates/explore/navbar.tmpl new file mode 100644 index 0000000..3a55681 --- /dev/null +++ b/src/templates/explore/navbar.tmpl @@ -0,0 +1,18 @@ + diff --git a/src/templates/explore/organizations.tmpl b/src/templates/explore/organizations.tmpl new file mode 100644 index 0000000..a20dd75 --- /dev/null +++ b/src/templates/explore/organizations.tmpl @@ -0,0 +1,38 @@ +{{template "base/head" .}} +
    + {{template "explore/navbar" .}} +
    + {{template "explore/search" .}} + +
    + {{range .Users}} +
    + {{avatar $.Context .}} +
    + + {{.Name}} {{.FullName}} + {{if .Visibility.IsPrivate}} + {{$.locale.Tr "repo.desc.private"}} + {{end}} + +
    + {{if .Location}} + {{svg "octicon-location"}} {{.Location}} + {{end}} + {{if and .Website}} + {{svg "octicon-link"}} + {{.Website}} + {{end}} + {{svg "octicon-clock"}} {{$.locale.Tr "user.joined_on" (DateTime "short" .CreatedUnix) | Safe}} +
    +
    +
    + {{else}} +
    {{$.locale.Tr "explore.org_no_results"}}
    + {{end}} +
    + + {{template "base/paginate" .}} +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/explore/repo_list.tmpl b/src/templates/explore/repo_list.tmpl new file mode 100644 index 0000000..49adfe5 --- /dev/null +++ b/src/templates/explore/repo_list.tmpl @@ -0,0 +1,71 @@ +
    + {{range .Repos}} +
    +
    +
    + {{$avatar := (repoAvatar . 32 "gt-mr-3")}} + {{if $avatar}} + {{$avatar}} + {{end}} + + {{if or $.PageIsExplore $.PageIsProfileStarList}}{{if .Owner}}{{.Owner.Name}} / {{end}}{{end}}{{.Name}} + +
    + {{if .IsArchived}} + {{$.locale.Tr "repo.desc.archived"}} + {{end}} + {{if .IsTemplate}} + {{if .IsPrivate}} + {{$.locale.Tr "repo.desc.private_template"}} + {{else}} + {{if .Owner.Visibility.IsPrivate}} + {{$.locale.Tr "repo.desc.internal_template"}} + {{end}} + {{end}} + {{else}} + {{if .IsPrivate}} + {{$.locale.Tr "repo.desc.private"}} + {{else}} + {{if .Owner.Visibility.IsPrivate}} + {{$.locale.Tr "repo.desc.internal"}} + {{end}} + {{end}} + {{end}} + {{if .IsFork}} + {{svg "octicon-repo-forked"}} + {{else if .IsMirror}} + {{svg "octicon-mirror"}} + {{end}} +
    +
    + +
    +
    + {{$description := .DescriptionHTML $.Context}} + {{if $description}}

    {{$description}}

    {{end}} + {{if .Topics}} +
    + {{range .Topics}} + {{if ne . ""}}
    {{.}}
    {{end}} + {{end}} +
    + {{end}} +

    {{$.locale.Tr "org.repo_updated"}} {{TimeSinceUnix .UpdatedUnix $.locale}}

    +
    +
    + {{else}} +
    + {{$.locale.Tr "explore.repo_no_results"}} +
    + {{end}} +
    diff --git a/src/templates/explore/repo_search.tmpl b/src/templates/explore/repo_search.tmpl new file mode 100644 index 0000000..dac9246 --- /dev/null +++ b/src/templates/explore/repo_search.tmpl @@ -0,0 +1,42 @@ + +
    + + +
    + + {{if .PageIsExploreRepositories}} + + {{else}} + + {{end}} + +
    +
    +{{if and .PageIsExploreRepositories .OnlyShowRelevant}} +
    + {{.locale.Tr "explore.relevant_repositories" ((printf "%s%s" $.Link "?only_show_relevant=0")|Escape) | Safe}} +
    +{{end}} +
    diff --git a/src/templates/explore/repos.tmpl b/src/templates/explore/repos.tmpl new file mode 100644 index 0000000..dfede2f --- /dev/null +++ b/src/templates/explore/repos.tmpl @@ -0,0 +1,10 @@ +{{template "base/head" .}} +
    + {{template "explore/navbar" .}} +
    + {{template "explore/repo_search" .}} + {{template "explore/repo_list" .}} + {{template "base/paginate" .}} +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/explore/search.tmpl b/src/templates/explore/search.tmpl new file mode 100644 index 0000000..72dee41 --- /dev/null +++ b/src/templates/explore/search.tmpl @@ -0,0 +1,24 @@ + +
    +
    + + +
    +
    +
    diff --git a/src/templates/explore/users.tmpl b/src/templates/explore/users.tmpl new file mode 100644 index 0000000..1f3b944 --- /dev/null +++ b/src/templates/explore/users.tmpl @@ -0,0 +1,33 @@ +{{template "base/head" .}} +
    + {{template "explore/navbar" .}} +
    + {{template "explore/search" .}} + +
    + {{range .Users}} +
    + {{avatar $.Context .}} +
    + {{.Name}} {{.FullName}} +
    + {{if .Location}} + {{svg "octicon-location"}} {{.Location}} + {{end}} + {{if and $.ShowUserEmail .Email $.IsSigned (not .KeepEmailPrivate)}} + {{svg "octicon-mail"}} + {{.Email}} + {{end}} + {{svg "octicon-clock"}} {{$.locale.Tr "user.joined_on" (DateTime "short" .CreatedUnix) | Safe}} +
    +
    +
    + {{else}} +
    {{$.locale.Tr "explore.user_no_results"}}
    + {{end}} +
    + + {{template "base/paginate" .}} +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/home.tmpl b/src/templates/home.tmpl new file mode 100644 index 0000000..cc78499 --- /dev/null +++ b/src/templates/home.tmpl @@ -0,0 +1,9 @@ +{{template "base/head" .}} +
    +
    +
    + +
    +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/install.tmpl b/src/templates/install.tmpl new file mode 100644 index 0000000..0ef1cd8 --- /dev/null +++ b/src/templates/install.tmpl @@ -0,0 +1,335 @@ +{{template "base/head" .}} +
    +
    +
    +

    + {{.locale.Tr "install.title"}} +

    +
    + {{template "base/alert" .}} + +

    {{.locale.Tr "install.docker_helper" "https://docs.gitea.io/en-us/install-with-docker/" | Safe}}

    + +
    + +

    {{.locale.Tr "install.db_title"}}

    +

    {{.locale.Tr "install.require_db_desc"}}

    +
    + + +
    + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + +
    +
    + + +
    +
    + + + {{.locale.Tr "install.db_schema_helper"}} +
    +
    + +
    +
    + + + {{.locale.Tr "install.sqlite_helper" | Safe}} +
    +
    + + {{if .Err_DbInstalledBefore}} +
    +

    {{.locale.Tr "install.reinstall_confirm_message"}}

    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    + {{end}} + + +

    {{.locale.Tr "install.general_title"}}

    +
    + + + {{.locale.Tr "install.app_name_helper"}} +
    +
    + + + {{.locale.Tr "install.repo_path_helper"}} +
    +
    + + + {{.locale.Tr "install.lfs_path_helper"}} +
    +
    + + + {{.locale.Tr "install.run_user_helper"}} +
    +
    + + + {{.locale.Tr "install.domain_helper"}} +
    +
    + + + {{.locale.Tr "install.ssh_port_helper"}} +
    +
    + + + {{.locale.Tr "install.http_port_helper"}} +
    +
    + + + {{.locale.Tr "install.app_url_helper"}} +
    +
    + + + {{.locale.Tr "install.log_root_path_helper"}} +
    +
    +
    + + +
    + {{.locale.Tr "install.enable_update_checker_helper"}} +
    + + + +

    {{.locale.Tr "install.optional_title"}}

    + + +
    + + {{.locale.Tr "install.email_title"}} + +
    + + +
    +
    + + +
    +
    + + + {{.locale.Tr "install.smtp_from_helper"}} +
    +
    + + +
    +
    + + +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    + + +
    + + {{.locale.Tr "install.server_service_title"}} + +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    + + + {{.locale.Tr "install.no_reply_address_helper"}} +
    +
    + + + {{.locale.Tr "install.password_algorithm_helper"}} +
    +
    + + +
    + + {{.locale.Tr "install.admin_title"}} + +

    {{.locale.Tr "install.admin_setting_desc"}}

    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    + +{{template "base/footer" .}} diff --git a/src/templates/mail/auth/activate.tmpl b/src/templates/mail/auth/activate.tmpl new file mode 100644 index 0000000..a15afe3 --- /dev/null +++ b/src/templates/mail/auth/activate.tmpl @@ -0,0 +1,17 @@ + + + + + + {{.locale.Tr "mail.activate_account.title" (.DisplayName|DotEscape)}} + + +{{$activate_url := printf "%suser/activate?code=%s" AppUrl (QueryEscape .Code)}} + +

    {{.locale.Tr "mail.activate_account.text_1" (.DisplayName|DotEscape) AppName | Str2html}}


    +

    {{.locale.Tr "mail.activate_account.text_2" .ActiveCodeLives | Str2html}}

    {{$activate_url}}


    +

    {{.locale.Tr "mail.link_not_working_do_paste"}}

    + +

    © {{AppName}}

    + + diff --git a/src/templates/mail/auth/activate_email.tmpl b/src/templates/mail/auth/activate_email.tmpl new file mode 100644 index 0000000..b15cc2a --- /dev/null +++ b/src/templates/mail/auth/activate_email.tmpl @@ -0,0 +1,17 @@ + + + + + + {{.locale.Tr "mail.activate_email.title" (.DisplayName|DotEscape)}} + + +{{$activate_url := printf "%suser/activate_email?code=%s&email=%s" AppUrl (QueryEscape .Code) (QueryEscape .Email)}} + +

    {{.locale.Tr "mail.hi_user_x" (.DisplayName|DotEscape) | Str2html}}


    +

    {{.locale.Tr "mail.activate_email.text" .ActiveCodeLives | Str2html}}

    {{$activate_url}}


    +

    {{.locale.Tr "mail.link_not_working_do_paste"}}

    + +

    © {{AppName}}

    + + diff --git a/src/templates/mail/auth/register_notify.tmpl b/src/templates/mail/auth/register_notify.tmpl new file mode 100644 index 0000000..3cdb456 --- /dev/null +++ b/src/templates/mail/auth/register_notify.tmpl @@ -0,0 +1,18 @@ + + + + + + {{.locale.Tr "mail.register_notify.title" (.DisplayName|DotEscape) AppName}} + + +{{$set_pwd_url := printf "%[1]suser/forgot_password" AppUrl}} + +

    {{.locale.Tr "mail.hi_user_x" (.DisplayName|DotEscape) | Str2html}}


    +

    {{.locale.Tr "mail.register_notify.text_1" AppName}}


    +

    {{.locale.Tr "mail.register_notify.text_2" .Username}}

    {{AppUrl}}user/login


    +

    {{.locale.Tr "mail.register_notify.text_3" ($set_pwd_url | Escape) | Str2html}}


    + +

    © {{AppName}}

    + + diff --git a/src/templates/mail/auth/reset_passwd.tmpl b/src/templates/mail/auth/reset_passwd.tmpl new file mode 100644 index 0000000..172844c --- /dev/null +++ b/src/templates/mail/auth/reset_passwd.tmpl @@ -0,0 +1,17 @@ + + + + + + {{.locale.Tr "mail.reset_password.title" (.DisplayName|DotEscape)}} + + +{{$recover_url := printf "%suser/recover_account?code=%s" AppUrl (QueryEscape .Code)}} + +

    {{.locale.Tr "mail.hi_user_x" (.DisplayName|DotEscape) | Str2html}}


    +

    {{.locale.Tr "mail.reset_password.text" .ResetPwdCodeLives | Str2html}}

    {{$recover_url}}


    +

    {{.locale.Tr "mail.link_not_working_do_paste"}}

    + +

    © {{AppName}}

    + + diff --git a/src/templates/mail/issue/assigned.tmpl b/src/templates/mail/issue/assigned.tmpl new file mode 100644 index 0000000..d02ea39 --- /dev/null +++ b/src/templates/mail/issue/assigned.tmpl @@ -0,0 +1,29 @@ + + + + + + {{.Subject}} + + +{{$repo_url := printf "%s" (Escape .Issue.Repo.HTMLURL) (Escape .Issue.Repo.FullName)}} +{{$link := printf "#%d" (Escape .Link) .Issue.Index}} + +

    + {{if .IsPull}} + {{.locale.Tr "mail.issue_assigned.pull" .Doer.Name $link $repo_url | Str2html}} + {{else}} + {{.locale.Tr "mail.issue_assigned.issue" .Doer.Name $link $repo_url | Str2html}} + {{end}} +

    + + + diff --git a/src/templates/mail/issue/default.tmpl b/src/templates/mail/issue/default.tmpl new file mode 100644 index 0000000..422a4f0 --- /dev/null +++ b/src/templates/mail/issue/default.tmpl @@ -0,0 +1,91 @@ + + + + + {{.Subject}} + + + + + + + {{if .IsMention}}

    {{.locale.Tr "mail.issue.x_mentioned_you" .Doer.Name | Str2html}}

    {{end}} + {{if eq .ActionName "push"}} +

    + {{if .Comment.IsForcePush}} + {{$oldCommitUrl := printf "%s/commit/%s" .Comment.Issue.PullRequest.BaseRepo.HTMLURL .Comment.OldCommit}} + {{$oldShortSha := ShortSha .Comment.OldCommit}} + {{$oldCommitLink := printf "%[2]s" (Escape $oldCommitUrl) (Escape $oldShortSha)}} + + {{$newCommitUrl := printf "%s/commit/%s" .Comment.Issue.PullRequest.BaseRepo.HTMLURL .Comment.NewCommit}} + {{$newShortSha := ShortSha .Comment.NewCommit}} + {{$newCommitLink := printf "%[2]s" (Escape $newCommitUrl) (Escape $newShortSha)}} + + {{.locale.Tr "mail.issue.action.force_push" .Doer.Name .Comment.Issue.PullRequest.HeadBranch $oldCommitLink $newCommitLink | Str2html}} + {{else}} + {{.locale.TrN (len .Comment.Commits) "mail.issue.action.push_1" "mail.issue.action.push_n" .Doer.Name .Comment.Issue.PullRequest.HeadBranch (len .Comment.Commits) | Str2html}} + {{end}} +

    + {{end}} +

    + {{if eq .ActionName "close"}} + {{.locale.Tr "mail.issue.action.close" (Escape .Doer.Name) .Issue.Index | Str2html}} + {{else if eq .ActionName "reopen"}} + {{.locale.Tr "mail.issue.action.reopen" (Escape .Doer.Name) .Issue.Index | Str2html}} + {{else if eq .ActionName "merge"}} + {{.locale.Tr "mail.issue.action.merge" (Escape .Doer.Name) .Issue.Index (Escape .Issue.PullRequest.BaseBranch) | Str2html}} + {{else if eq .ActionName "approve"}} + {{.locale.Tr "mail.issue.action.approve" (Escape .Doer.Name) | Str2html}} + {{else if eq .ActionName "reject"}} + {{.locale.Tr "mail.issue.action.reject" (Escape .Doer.Name) | Str2html}} + {{else if eq .ActionName "review"}} + {{.locale.Tr "mail.issue.action.review" (Escape .Doer.Name) | Str2html}} + {{else if eq .ActionName "review_dismissed"}} + {{.locale.Tr "mail.issue.action.review_dismissed" (Escape .Doer.Name) (Escape .Comment.Review.Reviewer.Name) | Str2html}} + {{else if eq .ActionName "ready_for_review"}} + {{.locale.Tr "mail.issue.action.ready_for_review" (Escape .Doer.Name) | Str2html}} + {{end}} + + {{- if eq .Body ""}} + {{if eq .ActionName "new"}} + {{.locale.Tr "mail.issue.action.new" (Escape .Doer.Name) .Issue.Index | Str2html}} + {{end}} + {{else}} + {{.Body | Str2html}} + {{end -}} + {{- range .ReviewComments}} +


    + {{$.locale.Tr "mail.issue.in_tree_path" .TreePath}} +
    +
    {{.Patch}}
    +
    {{.RenderedContent | Safe}}
    +
    + {{end -}} + {{if eq .ActionName "push"}} + + {{end}} +

    + + + diff --git a/src/templates/mail/notify/collaborator.tmpl b/src/templates/mail/notify/collaborator.tmpl new file mode 100644 index 0000000..9810c70 --- /dev/null +++ b/src/templates/mail/notify/collaborator.tmpl @@ -0,0 +1,21 @@ + + + + + + {{.Subject}} + + + +

    {{.locale.Tr "mail.repo.collaborator.added.text"}} {{.RepoName}}

    + + + diff --git a/src/templates/mail/notify/repo_transfer.tmpl b/src/templates/mail/notify/repo_transfer.tmpl new file mode 100644 index 0000000..586f83e --- /dev/null +++ b/src/templates/mail/notify/repo_transfer.tmpl @@ -0,0 +1,18 @@ + + + + + {{.Subject}} + + +{{$url := printf "%[2]s" (Escape .Link) (Escape .Repo)}} + +

    {{.Subject}}. + {{.locale.Tr "mail.repo.transfer.body" $url | Str2html}} +

    + --- +
    + {{.locale.Tr "mail.view_it_on" AppName}}. +

    + + diff --git a/src/templates/mail/release.tmpl b/src/templates/mail/release.tmpl new file mode 100644 index 0000000..f588d82 --- /dev/null +++ b/src/templates/mail/release.tmpl @@ -0,0 +1,61 @@ + + + + + {{.Subject}} + + + + + +{{$release_url := printf "%s" (.Release.HTMLURL | Escape) (.Release.TagName | Escape)}} +{{$repo_url := printf "%s" (.Release.Repo.HTMLURL | Escape) (.Release.Repo.FullName | Escape)}} + +

    + {{.locale.Tr "mail.release.new.text" .Release.Publisher.Name $release_url $repo_url | Str2html}} +

    +

    {{.locale.Tr "mail.release.title" .Release.Title}}

    +

    + {{.locale.Tr "mail.release.note"}}
    + {{- if eq .Release.RenderedNote ""}} + {{else}} + {{.Release.RenderedNote | Str2html}} + {{end -}} +

    +

    +

    + --- +
    + {{.locale.Tr "mail.release.downloads"}} +

    +

    + + + diff --git a/src/templates/mail/team_invite.tmpl b/src/templates/mail/team_invite.tmpl new file mode 100644 index 0000000..8357895 --- /dev/null +++ b/src/templates/mail/team_invite.tmpl @@ -0,0 +1,16 @@ + + + + + + +{{$invite_url := printf "%sorg/invite/%s" AppUrl (QueryEscape .Invite.Token)}} + +

    {{.locale.Tr "mail.team_invite.text_1" (DotEscape .Inviter.DisplayName) (DotEscape .Team.Name) (DotEscape .Organization.DisplayName) | Str2html}}

    +

    {{.locale.Tr "mail.team_invite.text_2"}}

    {{$invite_url}}

    +

    {{.locale.Tr "mail.link_not_working_do_paste"}}

    +

    {{.locale.Tr "mail.team_invite.text_3" .Invite.Email}}

    + +

    © {{AppName}}

    + + diff --git a/src/templates/org/create.tmpl b/src/templates/org/create.tmpl new file mode 100644 index 0000000..7e988ba --- /dev/null +++ b/src/templates/org/create.tmpl @@ -0,0 +1,57 @@ +{{template "base/head" .}} +
    +
    +
    +
    + {{.CsrfTokenHtml}} +

    + {{.locale.Tr "new_org"}} +

    +
    + {{template "base/alert" .}} +
    + + + {{.locale.Tr "org.org_name_helper"}} +
    + +
    + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    + +
    + + +
    +
    +
    +
    +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/org/header.tmpl b/src/templates/org/header.tmpl new file mode 100644 index 0000000..6106fe5 --- /dev/null +++ b/src/templates/org/header.tmpl @@ -0,0 +1,18 @@ +{{with .Org}} +
    +
    +
    +
    + {{avatar $.Context . 100}} + {{.DisplayName}} + + {{if .Visibility.IsLimited}}
    {{$.locale.Tr "org.settings.visibility.limited_shortname"}}
    {{end}} + {{if .Visibility.IsPrivate}}
    {{$.locale.Tr "org.settings.visibility.private_shortname"}}
    {{end}} +
    +
    +
    +
    +
    +{{end}} + +{{template "org/menu" .}} diff --git a/src/templates/org/home.tmpl b/src/templates/org/home.tmpl new file mode 100644 index 0000000..d540f80 --- /dev/null +++ b/src/templates/org/home.tmpl @@ -0,0 +1,95 @@ +{{template "base/head" .}} +
    +
    + {{avatar $.Context .Org 140 "org-avatar"}} +
    +
    + {{.Org.DisplayName}} + + {{if .Org.Visibility.IsLimited}}{{.locale.Tr "org.settings.visibility.limited_shortname"}}{{end}} + {{if .Org.Visibility.IsPrivate}}{{.locale.Tr "org.settings.visibility.private_shortname"}}{{end}} + + {{if .EnableFeed}} + {{svg "octicon-rss" 24}} + {{end}} +
    + {{if $.RenderedDescription}}
    {{$.RenderedDescription|Str2html}}
    {{end}} +
    + {{if .Org.Location}}
    {{svg "octicon-location"}} {{.Org.Location}}
    {{end}} + {{if .Org.Website}}
    {{svg "octicon-link"}} {{.Org.Website}}
    {{end}} +
    +
    + +
    + + {{template "org/menu" .}} + +
    +
    +
    + {{template "explore/repo_search" .}} + {{template "explore/repo_list" .}} + {{template "base/paginate" .}} +
    + +
    + {{if .CanCreateOrgRepo}} +
    + {{.locale.Tr "new_repo"}} + {{if not .DisableNewPullMirrors}} + {{.locale.Tr "new_migrate"}} + {{end}} +
    +
    + {{end}} +

    + {{.locale.Tr "org.members"}} + {{.MembersTotal}} {{svg "octicon-chevron-right"}} +

    +
    + {{$isMember := .IsOrganizationMember}} + {{range .Members}} + {{if or $isMember (call $.IsPublicMember .ID)}} + {{avatar $.Context . 48}} + {{end}} + {{end}} +
    + + {{if .IsOrganizationMember}} +
    + {{.locale.Tr "org.teams"}} + {{.Org.NumTeams}} {{svg "octicon-chevron-right"}} +
    + + {{if .IsOrganizationOwner}} + + {{end}} + {{end}} +
    +
    +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/org/member/members.tmpl b/src/templates/org/member/members.tmpl new file mode 100644 index 0000000..3d5b3be --- /dev/null +++ b/src/templates/org/member/members.tmpl @@ -0,0 +1,103 @@ +{{template "base/head" .}} +
    + {{template "org/header" .}} +
    + {{template "base/alert" .}} + +
    + {{range .Members}} +
    +
    + {{avatar $.Context . 48}} +
    + +
    {{.FullName}}
    +
    +
    +
    +
    + {{$.locale.Tr "org.members.membership_visibility"}} +
    +
    + {{$isPublic := index $.MembersIsPublicMember .ID}} + {{if $isPublic}} + {{$.locale.Tr "org.members.public"}} + {{if or (eq $.SignedUser.ID .ID) $.IsOrganizationOwner}}({{$.locale.Tr "org.members.public_helper"}}){{end}} + {{else}} + {{$.locale.Tr "org.members.private"}} + {{if or (eq $.SignedUser.ID .ID) $.IsOrganizationOwner}}({{$.locale.Tr "org.members.private_helper"}}){{end}} + {{end}} +
    +
    + {{if not $.PublicOnly}} +
    +
    + {{$.locale.Tr "org.members.member_role"}} +
    +
    + {{if index $.MembersIsUserOrgOwner .ID}}{{svg "octicon-shield-lock"}} {{$.locale.Tr "org.members.owner"}}{{else}}{{$.locale.Tr "org.members.member"}}{{end}} +
    +
    +
    + {{if $.IsOrganizationOwner}} +
    + {{$.locale.Tr "admin.users.2fa"}} +
    +
    + + {{if index $.MembersTwoFaStatus .ID}} + {{svg "octicon-check"}} + {{else}} + {{svg "octicon-x"}} + {{end}} + +
    + {{end}} +
    + {{end}} +
    +
    + {{if eq $.SignedUser.ID .ID}} +
    + +
    + {{else if $.IsOrganizationOwner}} +
    + +
    + {{end}} +
    +
    +
    + {{end}} +
    + + {{template "base/paginate" .}} +
    +
    + + + +{{template "base/footer" .}} diff --git a/src/templates/org/menu.tmpl b/src/templates/org/menu.tmpl new file mode 100644 index 0000000..1bb19a0 --- /dev/null +++ b/src/templates/org/menu.tmpl @@ -0,0 +1,47 @@ + diff --git a/src/templates/org/projects/list.tmpl b/src/templates/org/projects/list.tmpl new file mode 100644 index 0000000..1f113b2 --- /dev/null +++ b/src/templates/org/projects/list.tmpl @@ -0,0 +1,6 @@ +{{template "base/head" .}} +
    + {{template "user/overview/header" .}} + {{template "projects/list" .}} +
    +{{template "base/footer" .}} diff --git a/src/templates/org/projects/new.tmpl b/src/templates/org/projects/new.tmpl new file mode 100644 index 0000000..7011eb5 --- /dev/null +++ b/src/templates/org/projects/new.tmpl @@ -0,0 +1,6 @@ +{{template "base/head" .}} +
    + {{template "user/overview/header" .}} + {{template "projects/new" .}} +
    +{{template "base/footer" .}} diff --git a/src/templates/org/projects/view.tmpl b/src/templates/org/projects/view.tmpl new file mode 100644 index 0000000..c2d8f01 --- /dev/null +++ b/src/templates/org/projects/view.tmpl @@ -0,0 +1,6 @@ +{{template "base/head" .}} +
    + {{template "user/overview/header" .}} + {{template "projects/view" .}} +
    +{{template "base/footer" .}} diff --git a/src/templates/org/settings/actions.tmpl b/src/templates/org/settings/actions.tmpl new file mode 100644 index 0000000..b3b24e0 --- /dev/null +++ b/src/templates/org/settings/actions.tmpl @@ -0,0 +1,9 @@ +{{template "org/settings/layout_head" (dict "ctxData" . "pageClass" "organization settings actions")}} +
    + {{if eq .PageType "runners"}} + {{template "shared/actions/runner_list" .}} + {{else if eq .PageType "secrets"}} + {{template "shared/secrets/add_list" .}} + {{end}} +
    +{{template "org/settings/layout_footer" .}} diff --git a/src/templates/org/settings/applications.tmpl b/src/templates/org/settings/applications.tmpl new file mode 100644 index 0000000..5934f99 --- /dev/null +++ b/src/templates/org/settings/applications.tmpl @@ -0,0 +1,9 @@ +{{template "org/settings/layout_head" (dict "ctxData" . "pageClass" "organization settings options")}} +
    +

    + {{.locale.Tr "settings.applications"}} +

    + + {{template "user/settings/applications_oauth2_list" .}} +
    +{{template "org/settings/layout_footer" .}} diff --git a/src/templates/org/settings/applications_oauth2_edit.tmpl b/src/templates/org/settings/applications_oauth2_edit.tmpl new file mode 100644 index 0000000..987803a --- /dev/null +++ b/src/templates/org/settings/applications_oauth2_edit.tmpl @@ -0,0 +1,5 @@ +{{template "org/settings/layout_head" (dict "ctxData" . "pageClass" "organization settings options")}} +
    + {{template "user/settings/applications_oauth2_edit_form" .}} +
    +{{template "org/settings/layout_footer" .}} diff --git a/src/templates/org/settings/delete.tmpl b/src/templates/org/settings/delete.tmpl new file mode 100644 index 0000000..9c8644d --- /dev/null +++ b/src/templates/org/settings/delete.tmpl @@ -0,0 +1,35 @@ +{{template "org/settings/layout_head" (dict "ctxData" . "pageClass" "organization settings delete")}} + +
    +

    + {{.locale.Tr "org.settings.delete_account"}} +

    +
    +
    +

    {{svg "octicon-alert"}} {{.locale.Tr "org.settings.delete_prompt" | Str2html}}

    +
    +
    + {{.CsrfTokenHtml}} +
    + + +
    + +
    +
    +
    + + + +{{template "org/settings/layout_footer" .}} diff --git a/src/templates/org/settings/hook_new.tmpl b/src/templates/org/settings/hook_new.tmpl new file mode 100644 index 0000000..1bf74fb --- /dev/null +++ b/src/templates/org/settings/hook_new.tmpl @@ -0,0 +1,48 @@ +{{template "org/settings/layout_head" (dict "ctxData" . "pageClass" "organization settings new webhook")}} +
    +

    + {{if .PageIsSettingsHooksNew}}{{.locale.Tr "repo.settings.add_webhook"}}{{else}}{{.locale.Tr "repo.settings.update_webhook"}}{{end}} +
    + {{if eq .HookType "gitea"}} + + {{else if eq .HookType "gogs"}} + + {{else if eq .HookType "slack"}} + + {{else if eq .HookType "discord"}} + + {{else if eq .HookType "dingtalk"}} + + {{else if eq .HookType "telegram"}} + + {{else if eq .HookType "msteams"}} + + {{else if eq .HookType "feishu"}} + + {{else if eq .HookType "matrix"}} + {{svg "gitea-matrix" 26}} + {{else if eq .HookType "wechatwork"}} + + {{else if eq .HookType "packagist"}} + + {{end}} +
    +

    +
    + {{template "repo/settings/webhook/gitea" .}} + {{template "repo/settings/webhook/gogs" .}} + {{template "repo/settings/webhook/slack" .}} + {{template "repo/settings/webhook/discord" .}} + {{template "repo/settings/webhook/dingtalk" .}} + {{template "repo/settings/webhook/telegram" .}} + {{template "repo/settings/webhook/msteams" .}} + {{template "repo/settings/webhook/feishu" .}} + {{template "repo/settings/webhook/matrix" .}} + {{template "repo/settings/webhook/wechatwork" .}} + {{template "repo/settings/webhook/packagist" .}} +
    + + {{template "repo/settings/webhook/history" .}} +
    + +{{template "org/settings/layout_footer" .}} diff --git a/src/templates/org/settings/hooks.tmpl b/src/templates/org/settings/hooks.tmpl new file mode 100644 index 0000000..9f30796 --- /dev/null +++ b/src/templates/org/settings/hooks.tmpl @@ -0,0 +1,5 @@ +{{template "org/settings/layout_head" (dict "ctxData" . "pageClass" "organization settings webhooks")}} +
    + {{template "repo/settings/webhook/list" .}} +
    +{{template "org/settings/layout_footer" .}} diff --git a/src/templates/org/settings/labels.tmpl b/src/templates/org/settings/labels.tmpl new file mode 100644 index 0000000..be40861 --- /dev/null +++ b/src/templates/org/settings/labels.tmpl @@ -0,0 +1,19 @@ +{{template "org/settings/layout_head" (dict "ctxData" . "pageClass" "organization settings labels")}} +
    +
    +
    + {{$.locale.Tr "org.settings.labels_desc" | Str2html}} +
    +
    +
    + +
    +
    +
    +
    + {{template "repo/issue/labels/label_new" .}} + {{template "repo/issue/labels/label_list" .}} +
    +{{template "repo/issue/labels/edit_delete_label" .}} +{{template "org/settings/layout_footer" .}} + diff --git a/src/templates/org/settings/layout_footer.tmpl b/src/templates/org/settings/layout_footer.tmpl new file mode 100644 index 0000000..09d88c0 --- /dev/null +++ b/src/templates/org/settings/layout_footer.tmpl @@ -0,0 +1,11 @@ +{{if false}}{{/* to make html structure "likely" complete to prevent IDE warnings */}} +
    +
    +
    + {{/* block: org-setting-content */}} +{{end}} + +
    +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/org/settings/layout_head.tmpl b/src/templates/org/settings/layout_head.tmpl new file mode 100644 index 0000000..c245a3b --- /dev/null +++ b/src/templates/org/settings/layout_head.tmpl @@ -0,0 +1,14 @@ +{{template "base/head" .ctxData}} +
    + {{template "org/header" .ctxData}} +
    + {{template "org/settings/navbar" .ctxData}} +
    + {{template "base/alert" .ctxData}} + {{/* block: org-setting-content */}} + +{{if false}}{{/* to make html structure "likely" complete to prevent IDE warnings */}} +
    +
    +
    +{{end}} diff --git a/src/templates/org/settings/navbar.tmpl b/src/templates/org/settings/navbar.tmpl new file mode 100644 index 0000000..6bea9f5 --- /dev/null +++ b/src/templates/org/settings/navbar.tmpl @@ -0,0 +1,42 @@ +
    + +
    diff --git a/src/templates/org/settings/options.tmpl b/src/templates/org/settings/options.tmpl new file mode 100644 index 0000000..21b1420 --- /dev/null +++ b/src/templates/org/settings/options.tmpl @@ -0,0 +1,98 @@ +{{template "org/settings/layout_head" (dict "ctxData" . "pageClass" "organization settings options")}} +
    +

    + {{.locale.Tr "org.settings.options"}} +

    +
    +
    + {{.CsrfTokenHtml}} +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    + +
    + +
    +
    + + +
    +
    +
    + + {{if .SignedUser.IsAdmin}} +
    + +
    + + +

    {{.locale.Tr "admin.users.max_repo_creation_desc"}}

    +
    + {{end}} + +
    + +
    +
    + +
    + +
    + {{.CsrfTokenHtml}} +
    + + +
    + +
    + + {{$.locale.Tr "settings.delete_current_avatar"}} +
    +
    +
    +
    +{{template "org/settings/layout_footer" .}} diff --git a/src/templates/org/settings/packages.tmpl b/src/templates/org/settings/packages.tmpl new file mode 100644 index 0000000..91106c3 --- /dev/null +++ b/src/templates/org/settings/packages.tmpl @@ -0,0 +1,6 @@ +{{template "org/settings/layout_head" (dict "ctxData" . "pageClass" "organization settings packages")}} +
    + {{template "package/shared/cleanup_rules/list" .}} + {{template "package/shared/cargo" .}} +
    +{{template "org/settings/layout_footer" .}} diff --git a/src/templates/org/settings/packages_cleanup_rules_edit.tmpl b/src/templates/org/settings/packages_cleanup_rules_edit.tmpl new file mode 100644 index 0000000..ff4c2dd --- /dev/null +++ b/src/templates/org/settings/packages_cleanup_rules_edit.tmpl @@ -0,0 +1,5 @@ +{{template "org/settings/layout_head" (dict "ctxData" . "pageClass" "organization settings packages")}} +
    + {{template "package/shared/cleanup_rules/edit" .}} +
    +{{template "org/settings/layout_footer" .}} diff --git a/src/templates/org/settings/packages_cleanup_rules_preview.tmpl b/src/templates/org/settings/packages_cleanup_rules_preview.tmpl new file mode 100644 index 0000000..5a2f061 --- /dev/null +++ b/src/templates/org/settings/packages_cleanup_rules_preview.tmpl @@ -0,0 +1,5 @@ +{{template "org/settings/layout_head" (dict "ctxData" . "pageClass" "organization settings packages")}} +
    + {{template "package/shared/cleanup_rules/preview" .}} +
    +{{template "org/settings/layout_footer" .}} diff --git a/src/templates/org/settings/runners_edit.tmpl b/src/templates/org/settings/runners_edit.tmpl new file mode 100644 index 0000000..acd67a4 --- /dev/null +++ b/src/templates/org/settings/runners_edit.tmpl @@ -0,0 +1,5 @@ +{{template "org/settings/layout_head" (dict "ctxData" . "pageClass" "organization settings runners")}} +
    + {{template "shared/actions/runner_edit" .}} +
    +{{template "org/settings/layout_footer" .}} diff --git a/src/templates/org/team/invite.tmpl b/src/templates/org/team/invite.tmpl new file mode 100644 index 0000000..55ecd04 --- /dev/null +++ b/src/templates/org/team/invite.tmpl @@ -0,0 +1,23 @@ +{{template "base/head" .}} +
    +
    + {{template "base/alert" .}} +
    +
    + {{avatar $.Context .Organization 140}} +
    +
    +
    {{.locale.Tr "org.teams.invite.title" .Team.Name .Organization.Name | Str2html}}
    +
    {{.locale.Tr "org.teams.invite.by" .Inviter.Name}}
    +
    {{.locale.Tr "org.teams.invite.description"}}
    +
    +
    +
    + {{.CsrfTokenHtml}} + +
    +
    +
    +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/org/team/members.tmpl b/src/templates/org/team/members.tmpl new file mode 100644 index 0000000..f1ccbc0 --- /dev/null +++ b/src/templates/org/team/members.tmpl @@ -0,0 +1,76 @@ +{{template "base/head" .}} +
    + {{template "org/header" .}} +
    + {{template "base/alert" .}} +
    + {{template "org/team/sidebar" .}} +
    + {{template "org/team/navbar" .}} + {{if .IsOrganizationOwner}} +
    +
    + {{.CsrfTokenHtml}} + +
    + +
    + +
    +
    + {{end}} +
    + {{range .Team.Members}} +
    + {{avatar $.Context . 48 "gt-mr-3 gt-mb-0"}} + + {{.DisplayName}} + + {{if and $.IsOrganizationOwner (not (and ($.Team.IsOwnerTeam) (eq (len $.Team.Members) 1)))}} +
    + +
    + {{end}} +
    + {{else}} +
    + {{$.locale.Tr "org.teams.members.none"}} +
    + {{end}} +
    + {{if and .Invites $.IsOrganizationOwner}} +

    {{$.locale.Tr "org.teams.invite_team_member.list"}}

    +
    + {{range .Invites}} +
    + {{.Email}} +
    + {{$.CsrfTokenHtml}} + + +
    +
    + {{end}} +
    + {{end}} +
    +
    +
    +
    + +{{template "base/footer" .}} diff --git a/src/templates/org/team/navbar.tmpl b/src/templates/org/team/navbar.tmpl new file mode 100644 index 0000000..44fe5f1 --- /dev/null +++ b/src/templates/org/team/navbar.tmpl @@ -0,0 +1,4 @@ + diff --git a/src/templates/org/team/new.tmpl b/src/templates/org/team/new.tmpl new file mode 100644 index 0000000..0cba09b --- /dev/null +++ b/src/templates/org/team/new.tmpl @@ -0,0 +1,161 @@ +{{template "base/head" .}} +
    + {{template "org/header" .}} +
    +
    +
    +
    + {{.CsrfTokenHtml}} +

    + {{if .PageIsOrgTeamsNew}}{{.locale.Tr "org.create_new_team"}}{{else}}{{.locale.Tr "org.teams.settings"}}{{end}} +

    +
    + {{template "base/alert" .}} +
    + + {{if eq .Team.LowerName "owners"}} + + {{end}} + + {{.locale.Tr "org.team_name_helper"}} +
    +
    + + + {{.locale.Tr "org.team_desc_helper"}} +
    + {{if not (eq .Team.LowerName "owners")}} +
    + +
    +
    +
    + + + {{.locale.Tr "org.teams.specific_repositories_helper" | Str2html}} +
    +
    +
    +
    + + + {{.locale.Tr "org.teams.all_repositories_helper" | Str2html}} +
    +
    + +
    +
    + + + {{.locale.Tr "org.teams.can_create_org_repo_helper"}} +
    +
    +
    +
    + +
    +
    +
    + + + {{.locale.Tr "org.teams.general_access_helper"}} +
    +
    +
    +
    + + + {{.locale.Tr "org.teams.admin_access_helper"}} +
    +
    +
    +
    + +
    + + + + + + + + + + + + {{range $t, $unit := $.Units}} + {{if ge $unit.MaxPerm 2}} + + + + + + + {{end}} + {{end}} + +
    {{.locale.Tr "units.unit"}}{{.locale.Tr "org.teams.none_access"}} + {{svg "octicon-question" 16 "gt-ml-2"}}{{.locale.Tr "org.teams.read_access"}} + {{svg "octicon-question" 16 "gt-ml-2"}}{{.locale.Tr "org.teams.write_access"}} + {{svg "octicon-question" 16 "gt-ml-2"}}
    +
    +
    + + {{$.locale.Tr $unit.DescKey}} +
    +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    + {{range $t, $unit := $.Units}} + {{if lt $unit.MaxPerm 2}} +
    +
    + + + {{$.locale.Tr $unit.DescKey}} +
    +
    + {{end}} + {{end}} +
    + {{end}} + +
    + {{if .PageIsOrgTeamsNew}} + + {{else}} + + {{if not (eq .Team.LowerName "owners")}} + + {{end}} + {{end}} +
    +
    +
    +
    +
    +
    +
    + + +{{template "base/footer" .}} diff --git a/src/templates/org/team/repositories.tmpl b/src/templates/org/team/repositories.tmpl new file mode 100644 index 0000000..9263caf --- /dev/null +++ b/src/templates/org/team/repositories.tmpl @@ -0,0 +1,89 @@ +{{template "base/head" .}} +
    + {{template "org/header" .}} +
    + {{template "base/alert" .}} +
    + {{template "org/team/sidebar" .}} +
    + {{template "org/team/navbar" .}} + {{$canAddRemove := and $.IsOrganizationOwner (not $.Team.IncludesAllRepositories)}} + {{if $canAddRemove}} +
    +
    +
    + {{.CsrfTokenHtml}} +
    + +
    + +
    +
    +
    +
    + + +
    +
    +
    + {{end}} +
    + {{range .Team.Repos}} +
    + {{if .IsPrivate}} + {{svg "octicon-lock" 16 "gt-mr-3"}} + {{else if .IsFork}} + {{svg "octicon-repo-forked" 16 "gt-mr-3"}} + {{else if .IsMirror}} + {{svg "octicon-mirror" 16 "gt-mr-3"}} + {{else}} + {{svg "octicon-repo" 16 "gt-mr-3"}} + {{end}} + + {{$.Org.Name}}/{{.Name}} + + {{if $canAddRemove}} +
    + {{$.CsrfTokenHtml}} + +
    + {{end}} +
    + {{else}} +
    + {{$.locale.Tr "org.teams.repos.none"}} +
    + {{end}} +
    +
    +
    +
    +
    + + + + + +{{template "base/footer" .}} diff --git a/src/templates/org/team/sidebar.tmpl b/src/templates/org/team/sidebar.tmpl new file mode 100644 index 0000000..f215dd5 --- /dev/null +++ b/src/templates/org/team/sidebar.tmpl @@ -0,0 +1,94 @@ +
    +

    + {{.Team.Name}} +
    + {{if .Team.IsMember $.SignedUser.ID}} +
    + +
    + {{else if .IsOrganizationOwner}} +
    + {{$.CsrfTokenHtml}} + + +
    + {{end}} +
    +

    +
    +
    + {{if .Team.Description}} + {{.Team.Description}} + {{else}} + {{.locale.Tr "org.teams.no_desc"}} + {{end}} +
    + {{if eq .Team.LowerName "owners"}} +
    + {{.locale.Tr "org.teams.owners_permission_desc" | Str2html}} +
    + {{else}} +
    +

    {{.locale.Tr "org.team_access_desc"}}

    +
      + {{if .Team.IncludesAllRepositories}} +
    • {{.locale.Tr "org.teams.all_repositories" | Str2html}} + {{else}} +
    • {{.locale.Tr "org.teams.specific_repositories" | Str2html}} + {{end}} + {{if .Team.CanCreateOrgRepo}} +
    • {{.locale.Tr "org.teams.can_create_org_repo"}} + {{end}} +
    + {{if (eq .Team.AccessMode 2)}} +

    {{.locale.Tr "org.settings.permission"}}

    + {{.locale.Tr "org.teams.write_permission_desc" | Str2html}} + {{else if (eq .Team.AccessMode 3)}} +

    {{.locale.Tr "org.settings.permission"}}

    + {{.locale.Tr "org.teams.admin_permission_desc" | Str2html}} + {{else}} + + + + + + + + + {{range $t, $unit := $.Units}} + {{if (not $unit.Type.UnitGlobalDisabled)}} + + + + + {{end}} + {{end}} + +
    {{.locale.Tr "units.unit"}}{{.locale.Tr "org.team_permission_desc"}}
    {{$.locale.Tr $unit.NameKey}}{{if eq ($.Team.UnitAccessMode $.Context $unit.Type) 0 -}} + {{$.locale.Tr "org.teams.none_access"}} + {{- else if or (eq $.Team.ID 0) (eq ($.Team.UnitAccessMode $.Context $unit.Type) 1) -}} + {{$.locale.Tr "org.teams.read_access"}} + {{- else if eq ($.Team.UnitAccessMode $.Context $unit.Type) 2 -}} + {{$.locale.Tr "org.teams.write_access"}} + {{- end}}
    + {{end}} +
    + {{end}} +
    + {{if .IsOrganizationOwner}} + + {{end}} +
    + diff --git a/src/templates/org/team/teams.tmpl b/src/templates/org/team/teams.tmpl new file mode 100644 index 0000000..dcf937f --- /dev/null +++ b/src/templates/org/team/teams.tmpl @@ -0,0 +1,55 @@ +{{template "base/head" .}} +
    + {{template "org/header" .}} +
    + {{template "base/alert" .}} + {{if .IsOrganizationOwner}} + +
    + {{end}} + +
    + {{range .Teams}} +
    +
    + {{.Name}} +
    + {{if .IsMember $.SignedUser.ID}} +
    + +
    + {{else if $.IsOrganizationOwner}} +
    + {{$.CsrfTokenHtml}} + +
    + {{end}} +
    +
    +
    + {{range .Members}} + {{template "shared/user/avatarlink" dict "Context" $.Context "user" .}} + {{end}} +
    +
    +

    {{.NumMembers}} {{$.locale.Tr "org.lower_members"}} · {{.NumRepos}} {{$.locale.Tr "org.lower_repositories"}}

    +
    +
    + {{end}} +
    +
    +
    + +{{template "base/footer" .}} diff --git a/src/templates/package/content/alpine.tmpl b/src/templates/package/content/alpine.tmpl new file mode 100644 index 0000000..97e2289 --- /dev/null +++ b/src/templates/package/content/alpine.tmpl @@ -0,0 +1,52 @@ +{{if eq .PackageDescriptor.Package.Type "alpine"}} +

    {{.locale.Tr "packages.installation"}}

    +
    +
    +
    + +
    /$branch/$repository
    +

    {{.locale.Tr "packages.alpine.registry.info" | Safe}}

    +
    +
    + +
    curl -JO 
    +
    +
    + +
    +
    sudo apk add {{$.PackageDescriptor.Package.Name}}={{$.PackageDescriptor.Version.Version}}
    +
    +
    +
    + +
    +
    +
    + +

    {{.locale.Tr "packages.alpine.repository"}}

    +
    + + + + + + + + + + + + + + + +
    {{.locale.Tr "packages.alpine.repository.branches"}}
    {{StringUtils.Join .Branches ", "}}
    {{.locale.Tr "packages.alpine.repository.repositories"}}
    {{StringUtils.Join .Repositories ", "}}
    {{.locale.Tr "packages.alpine.repository.architectures"}}
    {{StringUtils.Join .Architectures ", "}}
    +
    + + {{if .PackageDescriptor.Metadata.Description}} +

    {{.locale.Tr "packages.about"}}

    +
    + {{.PackageDescriptor.Metadata.Description}} +
    + {{end}} +{{end}} diff --git a/src/templates/package/content/cargo.tmpl b/src/templates/package/content/cargo.tmpl new file mode 100644 index 0000000..bfa585e --- /dev/null +++ b/src/templates/package/content/cargo.tmpl @@ -0,0 +1,62 @@ +{{if eq .PackageDescriptor.Package.Type "cargo"}} +

    {{.locale.Tr "packages.installation"}}

    +
    +
    +
    + +
    [registry]
    +default = "gitea"
    +
    +[registries.gitea]
    +index = ""
    +
    +[net]
    +git-fetch-with-cli = true
    +
    +
    + +
    cargo add {{.PackageDescriptor.Package.Name}}@{{.PackageDescriptor.Version.Version}}
    +
    +
    + +
    +
    +
    + + {{if or .PackageDescriptor.Metadata.Description .PackageDescriptor.Metadata.Readme}} +

    {{.locale.Tr "packages.about"}}

    + {{if .PackageDescriptor.Metadata.Description}}
    {{.PackageDescriptor.Metadata.Description}}
    {{end}} + {{if .PackageDescriptor.Metadata.Readme}}
    {{RenderMarkdownToHtml $.Context .PackageDescriptor.Metadata.Readme}}
    {{end}} + {{end}} + + {{if .PackageDescriptor.Metadata.Dependencies}} +

    {{.locale.Tr "packages.dependencies"}}

    +
    + + + + + + + + + {{range .PackageDescriptor.Metadata.Dependencies}} + + + + + {{end}} + +
    {{.locale.Tr "packages.dependency.id"}}{{.locale.Tr "packages.dependency.version"}}
    {{.Name}}{{.Req}}
    +
    + {{end}} + + {{if .PackageDescriptor.Metadata.Keywords}} +

    {{.locale.Tr "packages.keywords"}}

    +
    + {{range .PackageDescriptor.Metadata.Keywords}} + {{.}} + {{end}} +
    + {{end}} +{{end}} diff --git a/src/templates/package/content/chef.tmpl b/src/templates/package/content/chef.tmpl new file mode 100644 index 0000000..77f1f37 --- /dev/null +++ b/src/templates/package/content/chef.tmpl @@ -0,0 +1,48 @@ +{{if eq .PackageDescriptor.Package.Type "chef"}} +

    {{.locale.Tr "packages.installation"}}

    +
    +
    +
    + +
    knife[:supermarket_site] = ''
    +
    +
    + +
    knife supermarket install {{.PackageDescriptor.Package.Name}} {{.PackageDescriptor.Version.Version}}
    +
    +
    + +
    +
    +
    + + {{if or .PackageDescriptor.Metadata.Description .PackageDescriptor.Metadata.LongDescription}} +

    {{.locale.Tr "packages.about"}}

    +
    + {{if .PackageDescriptor.Metadata.Description}}

    {{.PackageDescriptor.Metadata.Description}}

    {{end}} + {{if .PackageDescriptor.Metadata.LongDescription}}{{RenderMarkdownToHtml $.Context .PackageDescriptor.Metadata.LongDescription}}{{end}} +
    + {{end}} + + {{if .PackageDescriptor.Metadata.Dependencies}} +

    {{.locale.Tr "packages.dependencies"}}

    +
    + + + + + + + + + {{range $dependency, $version := .PackageDescriptor.Metadata.Dependencies}} + + + + + {{end}} + +
    {{.locale.Tr "packages.dependency.id"}}{{.locale.Tr "packages.dependency.version"}}
    {{$dependency}}{{$version}}
    +
    + {{end}} +{{end}} diff --git a/src/templates/package/content/composer.tmpl b/src/templates/package/content/composer.tmpl new file mode 100644 index 0000000..d0f88da --- /dev/null +++ b/src/templates/package/content/composer.tmpl @@ -0,0 +1,50 @@ +{{if eq .PackageDescriptor.Package.Type "composer"}} +

    {{.locale.Tr "packages.installation"}}

    +
    +
    +
    + +
    {
    +	"repositories": [{
    +			"type": "composer",
    +			"url": ""
    +		}
    +	]
    +}
    +
    +
    + +
    composer require {{.PackageDescriptor.Package.Name}}:{{.PackageDescriptor.Version.Version}}
    +
    +
    + +
    +
    +
    + + {{if .PackageDescriptor.Metadata.Description}} +

    {{.locale.Tr "packages.about"}}

    +
    + {{.PackageDescriptor.Metadata.Description}} +
    + {{end}} + + {{if or .PackageDescriptor.Metadata.Require .PackageDescriptor.Metadata.RequireDev}} +

    {{.locale.Tr "packages.dependencies"}}

    +
    +
    + {{template "package/content/composer_dependencies" dict "root" $ "dependencies" .PackageDescriptor.Metadata.Require "title" (.locale.Tr "packages.composer.dependencies")}} + {{template "package/content/composer_dependencies" dict "root" $ "dependencies" .PackageDescriptor.Metadata.RequireDev "title" (.locale.Tr "packages.composer.dependencies.development")}} +
    +
    + {{end}} + + {{if or .PackageDescriptor.Metadata.Keywords}} +

    {{.locale.Tr "packages.keywords"}}

    +
    + {{range .PackageDescriptor.Metadata.Keywords}} + {{.}} + {{end}} +
    + {{end}} +{{end}} diff --git a/src/templates/package/content/composer_dependencies.tmpl b/src/templates/package/content/composer_dependencies.tmpl new file mode 100644 index 0000000..b55c1b5 --- /dev/null +++ b/src/templates/package/content/composer_dependencies.tmpl @@ -0,0 +1,19 @@ +{{if .dependencies}} +

    {{.title}}

    + + + + + + + + + {{range $dependency, $version := .dependencies}} + + + + + {{end}} + +
    {{.root.locale.Tr "packages.dependency.id"}}{{.root.locale.Tr "packages.dependency.version"}}
    {{$dependency}}{{$version}}
    +{{end}} diff --git a/src/templates/package/content/conan.tmpl b/src/templates/package/content/conan.tmpl new file mode 100644 index 0000000..07ad6b6 --- /dev/null +++ b/src/templates/package/content/conan.tmpl @@ -0,0 +1,34 @@ +{{if eq .PackageDescriptor.Package.Type "conan"}} +

    {{.locale.Tr "packages.installation"}}

    +
    +
    +
    + +
    conan remote add gitea 
    +
    +
    + +
    conan install --remote=gitea {{.PackageDescriptor.Package.Name}}/{{.PackageDescriptor.Version.Version}}
    +
    +
    + +
    +
    +
    + + {{if .PackageDescriptor.Metadata.Description}} +

    {{.locale.Tr "packages.about"}}

    +
    + {{if .PackageDescriptor.Metadata.Description}}{{.PackageDescriptor.Metadata.Description}}{{end}} +
    + {{end}} + + {{if or .PackageDescriptor.Metadata.Keywords}} +

    {{.locale.Tr "packages.keywords"}}

    +
    + {{range .PackageDescriptor.Metadata.Keywords}} + {{.}} + {{end}} +
    + {{end}} +{{end}} diff --git a/src/templates/package/content/conda.tmpl b/src/templates/package/content/conda.tmpl new file mode 100644 index 0000000..71c2c98 --- /dev/null +++ b/src/templates/package/content/conda.tmpl @@ -0,0 +1,30 @@ +{{if eq .PackageDescriptor.Package.Type "conda"}} +

    {{.locale.Tr "packages.installation"}}

    +
    +
    +
    + +
    channel_alias: 
    +channels:
    +  - 
    +default_channels:
    +  - 
    +
    +
    + + {{$channel := .PackageDescriptor.PackageProperties.GetByName "conda.channel"}} +
    conda install{{if $channel}} -c {{$channel}}{{end}} {{.PackageDescriptor.PackageProperties.GetByName "conda.name"}}={{.PackageDescriptor.Version.Version}}
    +
    +
    + +
    +
    +
    + + {{if or .PackageDescriptor.Metadata.Description .PackageDescriptor.Metadata.Summary}} +

    {{.locale.Tr "packages.about"}}

    +
    + {{if .PackageDescriptor.Metadata.Description}}{{.PackageDescriptor.Metadata.Description}}{{else}}{{.PackageDescriptor.Metadata.Summary}}{{end}} +
    + {{end}} +{{end}} diff --git a/src/templates/package/content/container.tmpl b/src/templates/package/content/container.tmpl new file mode 100644 index 0000000..d928b36 --- /dev/null +++ b/src/templates/package/content/container.tmpl @@ -0,0 +1,90 @@ +{{if eq .PackageDescriptor.Package.Type "container"}} +

    {{.locale.Tr "packages.installation"}}

    +
    +
    +
    + + {{if eq .PackageDescriptor.Metadata.Type "helm"}} +
    helm pull oci://{{.RegistryHost}}/{{.PackageDescriptor.Owner.LowerName}}/{{.PackageDescriptor.Package.LowerName}} --version {{.PackageDescriptor.Version.LowerVersion}}
    + {{else}} + {{$separator := ":"}} + {{if not .PackageDescriptor.Metadata.IsTagged}} + {{$separator = "@"}} + {{end}} +
    docker pull {{.RegistryHost}}/{{.PackageDescriptor.Owner.LowerName}}/{{.PackageDescriptor.Package.LowerName}}{{$separator}}{{.PackageDescriptor.Version.LowerVersion}}
    + {{end}} +
    +
    + +
    {{range .PackageDescriptor.Files}}{{if eq .File.LowerName "manifest.json"}}{{.Properties.GetByName "container.digest"}}{{end}}{{end}}
    +
    +
    + +
    +
    +
    + {{if .PackageDescriptor.Metadata.Manifests}} +

    {{.locale.Tr "packages.container.multi_arch"}}

    +
    + + + + + + + + + + {{range .PackageDescriptor.Metadata.Manifests}} + + + + + + {{end}} + +
    {{.locale.Tr "packages.container.digest"}}{{.locale.Tr "packages.container.multi_arch"}}{{.locale.Tr "admin.packages.size"}}
    {{.Digest}}{{.Platform}}{{FileSize .Size}}
    +
    + {{end}} + {{if .PackageDescriptor.Metadata.Description}} +

    {{.locale.Tr "packages.about"}}

    +
    + {{.PackageDescriptor.Metadata.Description}} +
    + {{end}} + {{if .PackageDescriptor.Metadata.ImageLayers}} +

    {{.locale.Tr "packages.container.layers"}}

    +
    + + + {{range .PackageDescriptor.Metadata.ImageLayers}} + + + + {{end}} + +
    {{.}}
    +
    + {{end}} + {{if .PackageDescriptor.Metadata.Labels}} +

    {{.locale.Tr "packages.container.labels"}}

    +
    + + + + + + + + + {{range $key, $value := .PackageDescriptor.Metadata.Labels}} + + + + + {{end}} + +
    {{.locale.Tr "packages.container.labels.key"}}{{.locale.Tr "packages.container.labels.value"}}
    {{$key}}{{$value}}
    +
    + {{end}} +{{end}} diff --git a/src/templates/package/content/cran.tmpl b/src/templates/package/content/cran.tmpl new file mode 100644 index 0000000..dcabdbc --- /dev/null +++ b/src/templates/package/content/cran.tmpl @@ -0,0 +1,59 @@ +{{if eq .PackageDescriptor.Package.Type "cran"}} +

    {{.locale.Tr "packages.installation"}}

    +
    +
    +
    + +
    options("repos" = c(getOption("repos"), c(gitea="")))
    +
    +
    + +
    install.packages("{{.PackageDescriptor.Package.Name}}")
    +
    +
    + +
    +
    +
    + + {{if or .PackageDescriptor.Metadata.Description .PackageDescriptor.Metadata.Title}} +

    {{.locale.Tr "packages.about"}}

    +
    + {{if .PackageDescriptor.Metadata.Description}}{{.PackageDescriptor.Metadata.Description}}{{.PackageDescriptor.Metadata.Title}}{{else}}{{end}} +
    + {{end}} + + {{if or .PackageDescriptor.Metadata.Imports .PackageDescriptor.Metadata.Depends .PackageDescriptor.Metadata.LinkingTo .PackageDescriptor.Metadata.Suggests}} +

    {{.locale.Tr "packages.dependencies"}}

    +
    + + + {{if .PackageDescriptor.Metadata.Imports}} + + + + + {{end}} + {{if .PackageDescriptor.Metadata.Depends}} + + + + + {{end}} + {{if .PackageDescriptor.Metadata.LinkingTo}} + + + + + {{end}} + {{if .PackageDescriptor.Metadata.Suggests}} + + + + + {{end}} + +
    Imports{{StringUtils.Join .PackageDescriptor.Metadata.Imports ", "}}
    Depends{{StringUtils.Join .PackageDescriptor.Metadata.Depends ", "}}
    LinkingTo{{StringUtils.Join .PackageDescriptor.Metadata.LinkingTo ", "}}
    Suggests{{StringUtils.Join .PackageDescriptor.Metadata.Suggests ", "}}
    +
    + {{end}} +{{end}} diff --git a/src/templates/package/content/debian.tmpl b/src/templates/package/content/debian.tmpl new file mode 100644 index 0000000..8b60b33 --- /dev/null +++ b/src/templates/package/content/debian.tmpl @@ -0,0 +1,65 @@ +{{if eq .PackageDescriptor.Package.Type "debian"}} +

    {{.locale.Tr "packages.installation"}}

    +
    +
    +
    + +
    sudo curl  -o /etc/apt/trusted.gpg.d/gitea-{{$.PackageDescriptor.Owner.Name}}.asc
    +echo "deb  $distribution $component" | sudo tee -a /etc/apt/sources.list.d/gitea.list
    +sudo apt update
    +

    {{.locale.Tr "packages.debian.registry.info" | Safe}}

    +
    +
    + +
    +
    sudo apt install {{$.PackageDescriptor.Package.Name}}={{$.PackageDescriptor.Version.Version}}
    +
    +
    +
    + +
    +
    +
    + +

    {{.locale.Tr "packages.debian.repository"}}

    +
    + + + + + + + + + + + + + + + +
    {{.locale.Tr "packages.debian.repository.distributions"}}
    {{StringUtils.Join .Distributions ", "}}
    {{.locale.Tr "packages.debian.repository.components"}}
    {{StringUtils.Join .Components ", "}}
    {{.locale.Tr "packages.debian.repository.architectures"}}
    {{StringUtils.Join .Architectures ", "}}
    +
    + + {{if .PackageDescriptor.Metadata.Description}} +

    {{.locale.Tr "packages.about"}}

    +
    + {{.PackageDescriptor.Metadata.Description}} +
    + {{end}} + + {{if .PackageDescriptor.Metadata.Dependencies}} +

    {{.locale.Tr "packages.dependencies"}}

    +
    + + + {{range .PackageDescriptor.Metadata.Dependencies}} + + + + {{end}} + +
    {{.}}
    +
    + {{end}} +{{end}} diff --git a/src/templates/package/content/generic.tmpl b/src/templates/package/content/generic.tmpl new file mode 100644 index 0000000..556e319 --- /dev/null +++ b/src/templates/package/content/generic.tmpl @@ -0,0 +1,18 @@ +{{if eq .PackageDescriptor.Package.Type "generic"}} +

    {{.locale.Tr "packages.installation"}}

    +
    +
    +
    + +
    
    +{{- range .PackageDescriptor.Files -}}
    +curl 
    +{{end -}}
    +				
    +
    +
    + +
    +
    +
    +{{end}} diff --git a/src/templates/package/content/go.tmpl b/src/templates/package/content/go.tmpl new file mode 100644 index 0000000..2343d94 --- /dev/null +++ b/src/templates/package/content/go.tmpl @@ -0,0 +1,14 @@ +{{if eq .PackageDescriptor.Package.Type "go"}} +

    {{.locale.Tr "packages.installation"}}

    +
    +
    +
    + +
    GOPROXY= go install {{$.PackageDescriptor.Package.Name}}@{{$.PackageDescriptor.Version.Version}}
    +
    +
    + +
    +
    +
    +{{end}} diff --git a/src/templates/package/content/helm.tmpl b/src/templates/package/content/helm.tmpl new file mode 100644 index 0000000..9b4f575 --- /dev/null +++ b/src/templates/package/content/helm.tmpl @@ -0,0 +1,57 @@ +{{if eq .PackageDescriptor.Package.Type "helm"}} +

    {{.locale.Tr "packages.installation"}}

    +
    +
    +
    + +
    helm repo add {{AppDomain}} 
    +helm repo update
    +
    +
    + +
    helm install {{.PackageDescriptor.Package.Name}} {{AppDomain}}/{{.PackageDescriptor.Package.Name}}
    +
    +
    + +
    +
    +
    + + {{if .PackageDescriptor.Metadata.Description}} +

    {{.locale.Tr "packages.about"}}

    +
    + {{.PackageDescriptor.Metadata.Description}} +
    + {{end}} + + {{if .PackageDescriptor.Metadata.Dependencies}} +

    {{.locale.Tr "packages.dependencies"}}

    +
    + + + + + + + + + {{range .PackageDescriptor.Metadata.Dependencies}} + + + + + {{end}} + +
    {{.locale.Tr "packages.dependency.id"}}{{.locale.Tr "packages.dependency.version"}}
    {{.Name}}{{.Version}}
    +
    + {{end}} + + {{if .PackageDescriptor.Metadata.Keywords}} +

    {{.locale.Tr "packages.keywords"}}

    +
    + {{range .PackageDescriptor.Metadata.Keywords}} + {{.}} + {{end}} +
    + {{end}} +{{end}} diff --git a/src/templates/package/content/maven.tmpl b/src/templates/package/content/maven.tmpl new file mode 100644 index 0000000..f18f120 --- /dev/null +++ b/src/templates/package/content/maven.tmpl @@ -0,0 +1,71 @@ +{{if eq .PackageDescriptor.Package.Type "maven"}} +

    {{.locale.Tr "packages.installation"}}

    +
    +
    +
    + +
    <repositories>
    +	<repository>
    +		<id>gitea</id>
    +			<url></url>
    +	</repository>
    +</repositories>
    +
    +<distributionManagement>
    +	<repository>
    +		<id>gitea</id>
    +		<url></url>
    +	</repository>
    +
    +	<snapshotRepository>
    +		<id>gitea</id>
    +		<url></url>
    +	</snapshotRepository>
    +</distributionManagement>
    +
    +
    + +
    <dependency>
    +	<groupId>{{.PackageDescriptor.Metadata.GroupID}}</groupId>
    +	<artifactId>{{.PackageDescriptor.Metadata.ArtifactID}}</artifactId>
    +	<version>{{.PackageDescriptor.Version.Version}}</version>
    +</dependency>
    +
    +
    + +
    mvn install
    +
    +
    + +
    mvn dependency:get -DremoteRepositories= -Dartifact={{.PackageDescriptor.Metadata.GroupID}}:{{.PackageDescriptor.Metadata.ArtifactID}}:{{.PackageDescriptor.Version.Version}}
    +
    +
    + +
    +
    +
    + + {{if .PackageDescriptor.Metadata.Description}} +

    {{.locale.Tr "packages.about"}}

    +
    + {{.PackageDescriptor.Metadata.Description}} +
    + {{end}} + + {{if .PackageDescriptor.Metadata.Dependencies}} +

    {{.locale.Tr "packages.dependencies"}}

    +
    +
    + {{range .PackageDescriptor.Metadata.Dependencies}} +
    + {{svg "octicon-package-dependencies" 16 ""}} +
    +
    {{.GroupID}}:{{.ArtifactID}}
    +
    {{.Version}}
    +
    +
    + {{end}} +
    +
    + {{end}} +{{end}} diff --git a/src/templates/package/content/npm.tmpl b/src/templates/package/content/npm.tmpl new file mode 100644 index 0000000..a8d3f40 --- /dev/null +++ b/src/templates/package/content/npm.tmpl @@ -0,0 +1,56 @@ +{{if eq .PackageDescriptor.Package.Type "npm"}} +

    {{.locale.Tr "packages.installation"}}

    +
    +
    +
    + +
    {{if .PackageDescriptor.Metadata.Scope}}{{.PackageDescriptor.Metadata.Scope}}:{{end}}registry=
    +
    +
    + +
    npm install {{.PackageDescriptor.Package.Name}}@{{.PackageDescriptor.Version.Version}}
    +
    +
    + +
    "{{.PackageDescriptor.Package.Name}}": "{{.PackageDescriptor.Version.Version}}"
    +
    +
    + +
    +
    +
    + + {{if or .PackageDescriptor.Metadata.Description .PackageDescriptor.Metadata.Readme}} +

    {{.locale.Tr "packages.about"}}

    +
    + {{if .PackageDescriptor.Metadata.Readme}} +
    + {{RenderMarkdownToHtml $.Context .PackageDescriptor.Metadata.Readme}} +
    + {{else if .PackageDescriptor.Metadata.Description}} + {{.PackageDescriptor.Metadata.Description}} + {{end}} +
    + {{end}} + + {{if or .PackageDescriptor.Metadata.Dependencies .PackageDescriptor.Metadata.DevelopmentDependencies .PackageDescriptor.Metadata.PeerDependencies .PackageDescriptor.Metadata.OptionalDependencies}} +

    {{.locale.Tr "packages.dependencies"}}

    +
    +
    + {{template "package/content/npm_dependencies" dict "root" $ "dependencies" .PackageDescriptor.Metadata.Dependencies "title" (.locale.Tr "packages.npm.dependencies")}} + {{template "package/content/npm_dependencies" dict "root" $ "dependencies" .PackageDescriptor.Metadata.DevelopmentDependencies "title" (.locale.Tr "packages.npm.dependencies.development")}} + {{template "package/content/npm_dependencies" dict "root" $ "dependencies" .PackageDescriptor.Metadata.PeerDependencies "title" (.locale.Tr "packages.npm.dependencies.peer")}} + {{template "package/content/npm_dependencies" dict "root" $ "dependencies" .PackageDescriptor.Metadata.OptionalDependencies "title" (.locale.Tr "packages.npm.dependencies.optional")}} +
    +
    + {{end}} + + {{if .PackageDescriptor.Metadata.Keywords}} +

    {{.locale.Tr "packages.keywords"}}

    +
    + {{range .PackageDescriptor.Metadata.Keywords}} + {{.}} + {{end}} +
    + {{end}} +{{end}} diff --git a/src/templates/package/content/npm_dependencies.tmpl b/src/templates/package/content/npm_dependencies.tmpl new file mode 100644 index 0000000..b55c1b5 --- /dev/null +++ b/src/templates/package/content/npm_dependencies.tmpl @@ -0,0 +1,19 @@ +{{if .dependencies}} +

    {{.title}}

    + + + + + + + + + {{range $dependency, $version := .dependencies}} + + + + + {{end}} + +
    {{.root.locale.Tr "packages.dependency.id"}}{{.root.locale.Tr "packages.dependency.version"}}
    {{$dependency}}{{$version}}
    +{{end}} diff --git a/src/templates/package/content/nuget.tmpl b/src/templates/package/content/nuget.tmpl new file mode 100644 index 0000000..f3013ad --- /dev/null +++ b/src/templates/package/content/nuget.tmpl @@ -0,0 +1,52 @@ +{{if eq .PackageDescriptor.Package.Type "nuget"}} +

    {{.locale.Tr "packages.installation"}}

    +
    +
    +
    + +
    dotnet nuget add source --name {{.PackageDescriptor.Owner.Name}} --username your_username --password your_token 
    +
    +
    + +
    dotnet add package --source {{.PackageDescriptor.Owner.Name}} --version {{.PackageDescriptor.Version.Version}} {{.PackageDescriptor.Package.Name}}
    +
    +
    + +
    +
    +
    + + {{if or .PackageDescriptor.Metadata.Description .PackageDescriptor.Metadata.ReleaseNotes}} +

    {{.locale.Tr "packages.about"}}

    +
    + {{if .PackageDescriptor.Metadata.Description}}{{.PackageDescriptor.Metadata.Description}}{{end}} + {{if .PackageDescriptor.Metadata.ReleaseNotes}}{{Str2html .PackageDescriptor.Metadata.ReleaseNotes}}{{end}} +
    + {{end}} + + {{if .PackageDescriptor.Metadata.Dependencies}} +

    {{.locale.Tr "packages.dependencies"}}

    +
    + + + + + + + + + + {{range $framework, $dependencies := .PackageDescriptor.Metadata.Dependencies}} + {{range $dependencies}} + + + + + + {{end}} + {{end}} + +
    {{.locale.Tr "packages.dependency.id"}}{{.locale.Tr "packages.dependency.version"}}{{.locale.Tr "packages.nuget.dependency.framework"}}
    {{.ID}}{{.Version}}{{$framework}}
    +
    + {{end}} +{{end}} diff --git a/src/templates/package/content/pub.tmpl b/src/templates/package/content/pub.tmpl new file mode 100644 index 0000000..28aa29a --- /dev/null +++ b/src/templates/package/content/pub.tmpl @@ -0,0 +1,19 @@ +{{if eq .PackageDescriptor.Package.Type "pub"}} +

    {{.locale.Tr "packages.installation"}}

    +
    +
    +
    + +
    dart pub add {{.PackageDescriptor.Package.Name}}:{{.PackageDescriptor.Version.Version}} --hosted-url=
    +
    +
    + +
    +
    +
    + {{if or .PackageDescriptor.Metadata.Description .PackageDescriptor.Metadata.Readme}} +

    {{.locale.Tr "packages.about"}}

    + {{if .PackageDescriptor.Metadata.Description}}
    {{.PackageDescriptor.Metadata.Description}}
    {{end}} + {{if .PackageDescriptor.Metadata.Readme}}
    {{RenderMarkdownToHtml $.Context .PackageDescriptor.Metadata.Readme}}
    {{end}} + {{end}} +{{end}} diff --git a/src/templates/package/content/pypi.tmpl b/src/templates/package/content/pypi.tmpl new file mode 100644 index 0000000..07c387e --- /dev/null +++ b/src/templates/package/content/pypi.tmpl @@ -0,0 +1,31 @@ +{{if eq .PackageDescriptor.Package.Type "pypi"}} +

    {{.locale.Tr "packages.installation"}}

    +
    +
    +
    + +
    pip install --index-url  {{.PackageDescriptor.Package.Name}}
    +
    +
    + +
    +
    +
    + {{if or .PackageDescriptor.Metadata.Description .PackageDescriptor.Metadata.LongDescription .PackageDescriptor.Metadata.Summary}} +

    {{.locale.Tr "packages.about"}}

    +
    +

    {{if .PackageDescriptor.Metadata.Summary}}{{.PackageDescriptor.Metadata.Summary}}{{end}}

    + {{if .PackageDescriptor.Metadata.LongDescription}} + {{RenderMarkdownToHtml $.Context .PackageDescriptor.Metadata.LongDescription}} + {{else if .PackageDescriptor.Metadata.Description}} + {{RenderMarkdownToHtml $.Context .PackageDescriptor.Metadata.Description}} + {{end}} +
    + {{end}} + {{if .PackageDescriptor.Metadata.RequiresPython}} +

    {{.locale.Tr "packages.requirements"}}

    +
    + {{.locale.Tr "packages.pypi.requires"}}: {{.PackageDescriptor.Metadata.RequiresPython}} +
    + {{end}} +{{end}} diff --git a/src/templates/package/content/rpm.tmpl b/src/templates/package/content/rpm.tmpl new file mode 100644 index 0000000..63bb8b0 --- /dev/null +++ b/src/templates/package/content/rpm.tmpl @@ -0,0 +1,26 @@ +{{if eq .PackageDescriptor.Package.Type "rpm"}} +

    {{.locale.Tr "packages.installation"}}

    +
    +
    +
    + +
    dnf config-manager --add-repo 
    +
    +
    + +
    +
    dnf install {{$.PackageDescriptor.Package.Name}}
    +
    +
    +
    + +
    +
    +
    + + {{if or .PackageDescriptor.Metadata.Summary .PackageDescriptor.Metadata.Description}} +

    {{.locale.Tr "packages.about"}}

    + {{if .PackageDescriptor.Metadata.Summary}}
    {{.PackageDescriptor.Metadata.Summary}}
    {{end}} + {{if .PackageDescriptor.Metadata.Description}}
    {{.PackageDescriptor.Metadata.Description}}
    {{end}} + {{end}} +{{end}} diff --git a/src/templates/package/content/rubygems.tmpl b/src/templates/package/content/rubygems.tmpl new file mode 100644 index 0000000..6e6ee71 --- /dev/null +++ b/src/templates/package/content/rubygems.tmpl @@ -0,0 +1,40 @@ +{{if eq .PackageDescriptor.Package.Type "rubygems"}} +

    {{.locale.Tr "packages.installation"}}

    +
    +
    +
    + +
    gem install {{.PackageDescriptor.Package.Name}} --version "{{.PackageDescriptor.Version.Version}}" --source ""
    +
    +
    + +
    source "" do
    +	gem "{{.PackageDescriptor.Package.Name}}", "{{.PackageDescriptor.Version.Version}}"
    +end
    +
    +
    + +
    +
    +
    + {{if .PackageDescriptor.Metadata.Description}} +

    {{.locale.Tr "packages.about"}}

    +
    {{.PackageDescriptor.Metadata.Description}}
    + {{end}} + {{if or .PackageDescriptor.Metadata.RequiredRubyVersion .PackageDescriptor.Metadata.RequiredRubygemsVersion}} +

    {{.locale.Tr "packages.requirements"}}

    +
    + {{if .PackageDescriptor.Metadata.RequiredRubyVersion}}

    {{.locale.Tr "packages.rubygems.required.ruby"}}: {{range $i, $v := .PackageDescriptor.Metadata.RequiredRubyVersion}}{{if gt $i 0}}, {{end}}{{$v.Restriction}}{{$v.Version}}{{end}}

    {{end}} + {{if .PackageDescriptor.Metadata.RequiredRubygemsVersion}}

    {{.locale.Tr "packages.rubygems.required.rubygems"}}: {{range $i, $v := .PackageDescriptor.Metadata.RequiredRubygemsVersion}}{{if gt $i 0}}, {{end}}{{$v.Restriction}}{{$v.Version}}{{end}}

    {{end}} +
    + {{end}} + {{if or .PackageDescriptor.Metadata.RuntimeDependencies .PackageDescriptor.Metadata.DevelopmentDependencies}} +

    {{.locale.Tr "packages.dependencies"}}

    +
    +
    + {{template "package/content/rubygems_dependencies" dict "root" $ "dependencies" .PackageDescriptor.Metadata.RuntimeDependencies "title" (.locale.Tr "packages.rubygems.dependencies.runtime")}} + {{template "package/content/rubygems_dependencies" dict "root" $ "dependencies" .PackageDescriptor.Metadata.DevelopmentDependencies "title" (.locale.Tr "packages.rubygems.dependencies.development")}} +
    +
    + {{end}} +{{end}} diff --git a/src/templates/package/content/rubygems_dependencies.tmpl b/src/templates/package/content/rubygems_dependencies.tmpl new file mode 100644 index 0000000..80febc8 --- /dev/null +++ b/src/templates/package/content/rubygems_dependencies.tmpl @@ -0,0 +1,19 @@ +{{if .dependencies}} +

    {{.title}}

    + + + + + + + + + {{range .dependencies}} + + + + + {{end}} + +
    {{.root.locale.Tr "packages.dependency.id"}}{{.root.locale.Tr "packages.dependency.version"}}
    {{.Name}}{{range $i, $v := .Version}}{{if gt $i 0}}, {{end}}{{$v.Restriction}}{{$v.Version}}{{end}}
    +{{end}} diff --git a/src/templates/package/content/swift.tmpl b/src/templates/package/content/swift.tmpl new file mode 100644 index 0000000..ea87599 --- /dev/null +++ b/src/templates/package/content/swift.tmpl @@ -0,0 +1,40 @@ +{{if eq .PackageDescriptor.Package.Type "swift"}} +

    {{.locale.Tr "packages.installation"}}

    +
    +
    +
    + +
    swift package-registry set 
    +
    +
    + +
    dependencies: [
    +	.package(id: "{{.PackageDescriptor.Package.Name}}", from:"{{.PackageDescriptor.Version.Version}}")
    +]
    +
    +
    + +
    swift package resolve
    +
    +
    + +
    +
    +
    + + {{if .PackageDescriptor.Metadata.Description}} +

    {{.locale.Tr "packages.about"}}

    +
    + {{if .PackageDescriptor.Metadata.Description}}{{.PackageDescriptor.Metadata.Description}}{{end}} +
    + {{end}} + + {{if .PackageDescriptor.Metadata.Keywords}} +

    {{.locale.Tr "packages.keywords"}}

    +
    + {{range .PackageDescriptor.Metadata.Keywords}} + {{.}} + {{end}} +
    + {{end}} +{{end}} diff --git a/src/templates/package/content/vagrant.tmpl b/src/templates/package/content/vagrant.tmpl new file mode 100644 index 0000000..b6ec2ea --- /dev/null +++ b/src/templates/package/content/vagrant.tmpl @@ -0,0 +1,18 @@ +{{if eq .PackageDescriptor.Package.Type "vagrant"}} +

    {{.locale.Tr "packages.installation"}}

    +
    +
    +
    + +
    vagrant box add --box-version {{.PackageDescriptor.Version.Version}} ""
    +
    +
    + +
    +
    +
    + {{if .PackageDescriptor.Metadata.Description}} +

    {{.locale.Tr "packages.about"}}

    +
    {{.PackageDescriptor.Metadata.Description}}
    + {{end}} +{{end}} diff --git a/src/templates/package/metadata/alpine.tmpl b/src/templates/package/metadata/alpine.tmpl new file mode 100644 index 0000000..9011bfc --- /dev/null +++ b/src/templates/package/metadata/alpine.tmpl @@ -0,0 +1,5 @@ +{{if eq .PackageDescriptor.Package.Type "alpine"}} + {{if .PackageDescriptor.Metadata.Maintainer}}
    {{svg "octicon-person" 16 "mr-3"}} {{.PackageDescriptor.Metadata.Maintainer}}
    {{end}} + {{if .PackageDescriptor.Metadata.ProjectURL}}
    {{svg "octicon-link-external" 16 "mr-3"}} {{.locale.Tr "packages.details.project_site"}}
    {{end}} + {{if .PackageDescriptor.Metadata.License}}
    {{svg "octicon-law" 16 "gt-mr-3"}} {{.PackageDescriptor.Metadata.License}}
    {{end}} +{{end}} diff --git a/src/templates/package/metadata/cargo.tmpl b/src/templates/package/metadata/cargo.tmpl new file mode 100644 index 0000000..79078b4 --- /dev/null +++ b/src/templates/package/metadata/cargo.tmpl @@ -0,0 +1,7 @@ +{{if eq .PackageDescriptor.Package.Type "cargo"}} + {{range .PackageDescriptor.Metadata.Authors}}
    {{svg "octicon-person" 16 "gt-mr-3"}} {{.}}
    {{end}} + {{if .PackageDescriptor.Metadata.ProjectURL}}
    {{svg "octicon-link-external" 16 "gt-mr-3"}} {{.locale.Tr "packages.details.project_site"}}
    {{end}} + {{if .PackageDescriptor.Metadata.RepositoryURL}}
    {{svg "octicon-link-external" 16 "gt-mr-3"}} {{.locale.Tr "packages.cargo.details.repository_site"}}
    {{end}} + {{if .PackageDescriptor.Metadata.DocumentationURL}}
    {{svg "octicon-link-external" 16 "gt-mr-3"}} {{.locale.Tr "packages.cargo.details.documentation_site"}}
    {{end}} + {{if .PackageDescriptor.Metadata.License}}
    {{svg "octicon-law" 16 "gt-mr-3"}} {{.PackageDescriptor.Metadata.License}}
    {{end}} +{{end}} diff --git a/src/templates/package/metadata/chef.tmpl b/src/templates/package/metadata/chef.tmpl new file mode 100644 index 0000000..b414535 --- /dev/null +++ b/src/templates/package/metadata/chef.tmpl @@ -0,0 +1,5 @@ +{{if eq .PackageDescriptor.Package.Type "chef"}} + {{if .PackageDescriptor.Metadata.Author}}
    {{svg "octicon-person" 16 "gt-mr-3"}} {{.PackageDescriptor.Metadata.Author}}
    {{end}} + {{if .PackageDescriptor.Metadata.RepositoryURL}}
    {{svg "octicon-link-external" 16 "gt-mr-3"}} {{.locale.Tr "packages.details.repository_site"}}
    {{end}} + {{if .PackageDescriptor.Metadata.License}}
    {{svg "octicon-law" 16 "gt-mr-3"}} {{.PackageDescriptor.Metadata.License}}
    {{end}} +{{end}} diff --git a/src/templates/package/metadata/composer.tmpl b/src/templates/package/metadata/composer.tmpl new file mode 100644 index 0000000..e6f67a1 --- /dev/null +++ b/src/templates/package/metadata/composer.tmpl @@ -0,0 +1,5 @@ +{{if eq .PackageDescriptor.Package.Type "composer"}} + {{range .PackageDescriptor.Metadata.Authors}}
    {{svg "octicon-person" 16 "gt-mr-3"}} {{.Name}}
    {{end}} + {{if .PackageDescriptor.Metadata.Homepage}}
    {{svg "octicon-link-external" 16 "gt-mr-3"}} {{.locale.Tr "packages.details.project_site"}}
    {{end}} + {{range .PackageDescriptor.Metadata.License}}
    {{svg "octicon-law" 16 "gt-mr-3"}} {{.}}
    {{end}} +{{end}} diff --git a/src/templates/package/metadata/conan.tmpl b/src/templates/package/metadata/conan.tmpl new file mode 100644 index 0000000..0060f91 --- /dev/null +++ b/src/templates/package/metadata/conan.tmpl @@ -0,0 +1,6 @@ +{{if eq .PackageDescriptor.Package.Type "conan"}} + {{if .PackageDescriptor.Metadata.Author}}
    {{svg "octicon-person" 16 "gt-mr-3"}} {{.PackageDescriptor.Metadata.Author}}
    {{end}} + {{if .PackageDescriptor.Metadata.ProjectURL}}
    {{svg "octicon-link-external" 16 "gt-mr-3"}} {{.locale.Tr "packages.details.project_site"}}
    {{end}} + {{if .PackageDescriptor.Metadata.License}}
    {{svg "octicon-law" 16 "gt-mr-3"}} {{.PackageDescriptor.Metadata.License}}
    {{end}} + {{if .PackageDescriptor.Metadata.RepositoryURL}}
    {{svg "octicon-link-external" 16 "gt-mr-3"}} {{.locale.Tr "packages.conan.details.repository"}}
    {{end}} +{{end}} diff --git a/src/templates/package/metadata/conda.tmpl b/src/templates/package/metadata/conda.tmpl new file mode 100644 index 0000000..4021e6b --- /dev/null +++ b/src/templates/package/metadata/conda.tmpl @@ -0,0 +1,6 @@ +{{if eq .PackageDescriptor.Package.Type "conda"}} + {{if .PackageDescriptor.Metadata.License}}
    {{svg "octicon-law" 16 "gt-mr-3"}} {{.PackageDescriptor.Metadata.License}}
    {{end}} + {{if .PackageDescriptor.Metadata.ProjectURL}}
    {{svg "octicon-link-external" 16 "gt-mr-3"}} {{.locale.Tr "packages.details.project_site"}}
    {{end}} + {{if .PackageDescriptor.Metadata.RepositoryURL}}
    {{svg "octicon-link-external" 16 "gt-mr-3"}} {{.locale.Tr "packages.conda.details.repository_site"}}
    {{end}} + {{if .PackageDescriptor.Metadata.DocumentationURL}}
    {{svg "octicon-link-external" 16 "gt-mr-3"}} {{.locale.Tr "packages.conda.details.documentation_site"}}
    {{end}} +{{end}} diff --git a/src/templates/package/metadata/container.tmpl b/src/templates/package/metadata/container.tmpl new file mode 100644 index 0000000..7ff1370 --- /dev/null +++ b/src/templates/package/metadata/container.tmpl @@ -0,0 +1,9 @@ +{{if eq .PackageDescriptor.Package.Type "container"}} +
    {{svg "octicon-package" 16 "gt-mr-3"}} {{.PackageDescriptor.Metadata.Type.Name}}
    + {{if .PackageDescriptor.Metadata.Platform}}
    {{svg "octicon-cpu" 16 "gt-mr-3"}} {{.PackageDescriptor.Metadata.Platform}}
    {{end}} + {{range .PackageDescriptor.Metadata.Authors}}
    {{svg "octicon-person" 16 "gt-mr-3"}} {{.}}
    {{end}} + {{if .PackageDescriptor.Metadata.Licenses}}
    {{svg "octicon-law" 16 "gt-mr-3"}} {{.PackageDescriptor.Metadata.Licenses}}
    {{end}} + {{if .PackageDescriptor.Metadata.ProjectURL}}
    {{svg "octicon-link-external" 16 "gt-mr-3"}} {{.locale.Tr "packages.details.project_site"}}
    {{end}} + {{if .PackageDescriptor.Metadata.RepositoryURL}}
    {{svg "octicon-link-external" 16 "gt-mr-3"}} {{.locale.Tr "packages.details.repository_site"}}
    {{end}} + {{if .PackageDescriptor.Metadata.DocumentationURL}}
    {{svg "octicon-link-external" 16 "gt-mr-3"}} {{.locale.Tr "packages.details.documentation_site"}}
    {{end}} +{{end}} diff --git a/src/templates/package/metadata/cran.tmpl b/src/templates/package/metadata/cran.tmpl new file mode 100644 index 0000000..7b113ec --- /dev/null +++ b/src/templates/package/metadata/cran.tmpl @@ -0,0 +1,5 @@ +{{if eq .PackageDescriptor.Package.Type "cran"}} + {{if .PackageDescriptor.Metadata.License}}
    {{svg "octicon-law" 16 "mr-3"}} {{.PackageDescriptor.Metadata.License}}
    {{end}} + {{range .PackageDescriptor.Metadata.Authors}}
    {{svg "octicon-person" 16 "mr-3"}} {{.}}
    {{end}} + {{range .PackageDescriptor.Metadata.ProjectURL}}
    {{svg "octicon-link-external" 16 "mr-3"}} {{$.locale.Tr "packages.details.project_site"}}
    {{end}} +{{end}} diff --git a/src/templates/package/metadata/debian.tmpl b/src/templates/package/metadata/debian.tmpl new file mode 100644 index 0000000..93b6db3 --- /dev/null +++ b/src/templates/package/metadata/debian.tmpl @@ -0,0 +1,4 @@ +{{if eq .PackageDescriptor.Package.Type "debian"}} + {{if .PackageDescriptor.Metadata.Maintainer}}
    {{svg "octicon-person" 16 "mr-3"}} {{.PackageDescriptor.Metadata.Maintainer}}
    {{end}} + {{if .PackageDescriptor.Metadata.ProjectURL}}
    {{svg "octicon-link-external" 16 "mr-3"}} {{.locale.Tr "packages.details.project_site"}}
    {{end}} +{{end}} diff --git a/src/templates/package/metadata/generic.tmpl b/src/templates/package/metadata/generic.tmpl new file mode 100644 index 0000000..e69de29 diff --git a/src/templates/package/metadata/helm.tmpl b/src/templates/package/metadata/helm.tmpl new file mode 100644 index 0000000..33e603b --- /dev/null +++ b/src/templates/package/metadata/helm.tmpl @@ -0,0 +1,4 @@ +{{if eq .PackageDescriptor.Package.Type "helm"}} + {{range .PackageDescriptor.Metadata.Maintainers}}
    {{svg "octicon-person" 16 "gt-mr-3"}} {{.Name}}
    {{end}} + {{if .PackageDescriptor.Metadata.Home}}
    {{svg "octicon-link-external" 16 "gt-mr-3"}} {{.locale.Tr "packages.details.project_site"}}
    {{end}} +{{end}} diff --git a/src/templates/package/metadata/maven.tmpl b/src/templates/package/metadata/maven.tmpl new file mode 100644 index 0000000..78c0d32 --- /dev/null +++ b/src/templates/package/metadata/maven.tmpl @@ -0,0 +1,5 @@ +{{if eq .PackageDescriptor.Package.Type "maven"}} + {{if .PackageDescriptor.Metadata.Name}}
    {{svg "octicon-note" 16 "gt-mr-3"}} {{.PackageDescriptor.Metadata.Name}}
    {{end}} + {{if .PackageDescriptor.Metadata.ProjectURL}}
    {{svg "octicon-link-external" 16 "gt-mr-3"}} {{.locale.Tr "packages.details.project_site"}}
    {{end}} + {{range .PackageDescriptor.Metadata.Licenses}}
    {{svg "octicon-law" 16 "gt-mr-3"}} {{.}}
    {{end}} +{{end}} diff --git a/src/templates/package/metadata/npm.tmpl b/src/templates/package/metadata/npm.tmpl new file mode 100644 index 0000000..cbebf99 --- /dev/null +++ b/src/templates/package/metadata/npm.tmpl @@ -0,0 +1,8 @@ +{{if eq .PackageDescriptor.Package.Type "npm"}} + {{if .PackageDescriptor.Metadata.Author}}
    {{svg "octicon-person" 16 "gt-mr-3"}} {{.PackageDescriptor.Metadata.Author}}
    {{end}} + {{if .PackageDescriptor.Metadata.ProjectURL}}
    {{svg "octicon-link-external" 16 "gt-mr-3"}} {{.locale.Tr "packages.details.project_site"}}
    {{end}} + {{if .PackageDescriptor.Metadata.License}}
    {{svg "octicon-law" 16 "gt-mr-3"}} {{.PackageDescriptor.Metadata.License}}
    {{end}} + {{range .PackageDescriptor.VersionProperties}} + {{if eq .Name "npm.tag"}}
    {{svg "octicon-versions" 16 "gt-mr-3"}} {{.Value}}
    {{end}} + {{end}} +{{end}} diff --git a/src/templates/package/metadata/nuget.tmpl b/src/templates/package/metadata/nuget.tmpl new file mode 100644 index 0000000..3b56102 --- /dev/null +++ b/src/templates/package/metadata/nuget.tmpl @@ -0,0 +1,4 @@ +{{if eq .PackageDescriptor.Package.Type "nuget"}} + {{if .PackageDescriptor.Metadata.Authors}}
    {{svg "octicon-person" 16 "gt-mr-3"}} {{.PackageDescriptor.Metadata.Authors}}
    {{end}} + {{if .PackageDescriptor.Metadata.ProjectURL}}
    {{svg "octicon-link-external" 16 "gt-mr-3"}} {{.locale.Tr "packages.details.project_site"}}
    {{end}} +{{end}} diff --git a/src/templates/package/metadata/pub.tmpl b/src/templates/package/metadata/pub.tmpl new file mode 100644 index 0000000..8147ba8 --- /dev/null +++ b/src/templates/package/metadata/pub.tmpl @@ -0,0 +1,5 @@ +{{if eq .PackageDescriptor.Package.Type "pub"}} + {{if .PackageDescriptor.Metadata.ProjectURL}}
    {{svg "octicon-link-external" 16 "gt-mr-3"}} {{.locale.Tr "packages.details.project_site"}}
    {{end}} + {{if .PackageDescriptor.Metadata.RepositoryURL}}
    {{svg "octicon-link-external" 16 "gt-mr-3"}} {{.locale.Tr "packages.details.repository_site"}}
    {{end}} + {{if .PackageDescriptor.Metadata.DocumentationURL}}
    {{svg "octicon-link-external" 16 "gt-mr-3"}} {{.locale.Tr "packages.details.documentation_site"}}
    {{end}} +{{end}} diff --git a/src/templates/package/metadata/pypi.tmpl b/src/templates/package/metadata/pypi.tmpl new file mode 100644 index 0000000..205487d --- /dev/null +++ b/src/templates/package/metadata/pypi.tmpl @@ -0,0 +1,5 @@ +{{if eq .PackageDescriptor.Package.Type "pypi"}} + {{if .PackageDescriptor.Metadata.Author}}
    {{svg "octicon-person" 16 "gt-mr-3"}} {{.PackageDescriptor.Metadata.Author}}
    {{end}} + {{if .PackageDescriptor.Metadata.ProjectURL}}
    {{svg "octicon-link-external" 16 "gt-mr-3"}} {{.locale.Tr "packages.details.project_site"}}
    {{end}} + {{if .PackageDescriptor.Metadata.License}}
    {{svg "octicon-law" 16 "gt-mr-3"}} {{.PackageDescriptor.Metadata.License}}
    {{end}} +{{end}} diff --git a/src/templates/package/metadata/rpm.tmpl b/src/templates/package/metadata/rpm.tmpl new file mode 100644 index 0000000..1bbc2c8 --- /dev/null +++ b/src/templates/package/metadata/rpm.tmpl @@ -0,0 +1,4 @@ +{{if eq .PackageDescriptor.Package.Type "rpm"}} + {{if .PackageDescriptor.Metadata.ProjectURL}}
    {{svg "octicon-link-external" 16 "gt-mr-3"}} {{.locale.Tr "packages.details.project_site"}}
    {{end}} + {{if .PackageDescriptor.Metadata.License}}
    {{svg "octicon-law" 16 "gt-mr-3"}} {{.PackageDescriptor.Metadata.License}}
    {{end}} +{{end}} diff --git a/src/templates/package/metadata/rubygems.tmpl b/src/templates/package/metadata/rubygems.tmpl new file mode 100644 index 0000000..7e9af01 --- /dev/null +++ b/src/templates/package/metadata/rubygems.tmpl @@ -0,0 +1,5 @@ +{{if eq .PackageDescriptor.Package.Type "rubygems"}} + {{range .PackageDescriptor.Metadata.Authors}}
    {{svg "octicon-person" 16 "gt-mr-3"}} {{.}}
    {{end}} + {{if .PackageDescriptor.Metadata.ProjectURL}}
    {{svg "octicon-link-external" 16 "gt-mr-3"}} {{.locale.Tr "packages.details.project_site"}}
    {{end}} + {{range .PackageDescriptor.Metadata.Licenses}}
    {{svg "octicon-law" 16 "gt-mr-3"}} {{.}}
    {{end}} +{{end}} diff --git a/src/templates/package/metadata/swift.tmpl b/src/templates/package/metadata/swift.tmpl new file mode 100644 index 0000000..8a9ab07 --- /dev/null +++ b/src/templates/package/metadata/swift.tmpl @@ -0,0 +1,4 @@ +{{if eq .PackageDescriptor.Package.Type "swift"}} + {{if .PackageDescriptor.Metadata.Author.String}}
    {{svg "octicon-person" 16 "mr-3"}} {{.PackageDescriptor.Metadata.Author}}
    {{end}} + {{if .PackageDescriptor.Metadata.RepositoryURL}}
    {{svg "octicon-link-external" 16 "mr-3"}} {{.locale.Tr "packages.details.project_site"}}
    {{end}} +{{end}} diff --git a/src/templates/package/metadata/vagrant.tmpl b/src/templates/package/metadata/vagrant.tmpl new file mode 100644 index 0000000..030da9c --- /dev/null +++ b/src/templates/package/metadata/vagrant.tmpl @@ -0,0 +1,5 @@ +{{if eq .PackageDescriptor.Package.Type "vagrant"}} + {{if .PackageDescriptor.Metadata.Author}}
    {{svg "octicon-person" 16 "gt-mr-3"}} {{.PackageDescriptor.Metadata.Author}}
    {{end}} + {{if .PackageDescriptor.Metadata.ProjectURL}}
    {{svg "octicon-link-external" 16 "gt-mr-3"}} {{.locale.Tr "packages.details.project_site"}}
    {{end}} + {{if .PackageDescriptor.Metadata.RepositoryURL}}
    {{svg "octicon-link-external" 16 "gt-mr-3"}} {{.locale.Tr "packages.conan.details.repository"}}
    {{end}} +{{end}} diff --git a/src/templates/package/settings.tmpl b/src/templates/package/settings.tmpl new file mode 100644 index 0000000..205d875 --- /dev/null +++ b/src/templates/package/settings.tmpl @@ -0,0 +1,68 @@ +{{template "base/head" .}} +
    + {{template "user/overview/header" .}} +
    + {{template "base/alert" .}} +

    {{.PackageDescriptor.Package.Name}} ({{.PackageDescriptor.Version.Version}}) / {{.locale.Tr "repo.settings"}}

    +

    + {{.locale.Tr "packages.settings.link"}} +

    +
    +

    {{.locale.Tr "packages.settings.link.description"}}

    +
    + {{template "base/disable_form_autofill"}} + {{.CsrfTokenHtml}} + +
    + +
    +
    + +
    +
    +
    +

    + {{.locale.Tr "repo.settings.danger_zone"}} +

    +
    +
    +
    + +
    +
    +
    {{.locale.Tr "packages.settings.delete"}}
    +

    {{.locale.Tr "packages.settings.delete.description"}}

    +
    + +
    +
    +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/package/shared/cargo.tmpl b/src/templates/package/shared/cargo.tmpl new file mode 100644 index 0000000..687fc84 --- /dev/null +++ b/src/templates/package/shared/cargo.tmpl @@ -0,0 +1,24 @@ +

    + {{.locale.Tr "packages.owner.settings.cargo.title"}} +

    +
    +
    +
    + +
    +
    + {{.CsrfTokenHtml}} + +
    +
    + +
    +
    + {{.CsrfTokenHtml}} + +
    +
    + +
    +
    +
    diff --git a/src/templates/package/shared/cleanup_rules/edit.tmpl b/src/templates/package/shared/cleanup_rules/edit.tmpl new file mode 100644 index 0000000..f8525af --- /dev/null +++ b/src/templates/package/shared/cleanup_rules/edit.tmpl @@ -0,0 +1,73 @@ +

    {{if .IsEditRule}}{{.locale.Tr "packages.owner.settings.cleanuprules.edit"}}{{else}}{{.locale.Tr "packages.owner.settings.cleanuprules.add"}}{{end}}

    +
    +
    + {{.CsrfTokenHtml}} + +
    +
    + + +
    +
    +
    + + +
    +
    +
    + + +
    +
    +
    +

    {{.locale.Tr "packages.owner.settings.cleanuprules.keep.title"}}

    +
    + + +
    +
    + + +

    {{.locale.Tr "packages.owner.settings.cleanuprules.keep.pattern.container" | Safe}}

    +
    +
    +

    {{.locale.Tr "packages.owner.settings.cleanuprules.remove.title"}}

    +
    + + +
    +
    + + +
    +
    + {{if .IsEditRule}} + + + {{.locale.Tr "packages.owner.settings.cleanuprules.preview"}} + {{else}} + + {{end}} +
    +
    +
    diff --git a/src/templates/package/shared/cleanup_rules/list.tmpl b/src/templates/package/shared/cleanup_rules/list.tmpl new file mode 100644 index 0000000..485bff5 --- /dev/null +++ b/src/templates/package/shared/cleanup_rules/list.tmpl @@ -0,0 +1,34 @@ +

    + {{.locale.Tr "packages.owner.settings.cleanuprules.title"}} + +

    +
    +
    + {{range .CleanupRules}} +
    + + {{svg .Type.SVGName 36}} +
    + {{.Type.Name}} +
    {{if .Enabled}}{{$.locale.Tr "enabled"}}{{else}}{{$.locale.Tr "disabled"}}{{end}}
    + {{if .KeepCount}}
    {{$.locale.Tr "packages.owner.settings.cleanuprules.keep.count"}}: {{if eq .KeepCount 1}}{{$.locale.Tr "packages.owner.settings.cleanuprules.keep.count.1"}}{{else}}{{$.locale.Tr "packages.owner.settings.cleanuprules.keep.count.n" .KeepCount}}{{end}}
    {{end}} + {{if .KeepPattern}}
    {{$.locale.Tr "packages.owner.settings.cleanuprules.keep.pattern"}}: {{StringUtils.EllipsisString .KeepPattern 100}}
    {{end}} + {{if .RemoveDays}}
    {{$.locale.Tr "packages.owner.settings.cleanuprules.remove.days"}}: {{$.locale.Tr "tool.days" .RemoveDays}}
    {{end}} + {{if .RemovePattern}}
    {{$.locale.Tr "packages.owner.settings.cleanuprules.remove.pattern"}}: {{StringUtils.EllipsisString .RemovePattern 100}}
    {{end}} +
    +
    + {{else}} +
    {{.locale.Tr "packages.owner.settings.cleanuprules.none"}}
    + {{end}} +
    +
    diff --git a/src/templates/package/shared/cleanup_rules/preview.tmpl b/src/templates/package/shared/cleanup_rules/preview.tmpl new file mode 100644 index 0000000..5992ea6 --- /dev/null +++ b/src/templates/package/shared/cleanup_rules/preview.tmpl @@ -0,0 +1,34 @@ +

    {{.locale.Tr "packages.owner.settings.cleanuprules.preview"}}

    +
    +

    {{.locale.Tr "packages.owner.settings.cleanuprules.preview.overview" (len .VersionsToRemove)}}

    +
    +
    + + + + + + + + + + + + + {{range .VersionsToRemove}} + + + + + + + + + {{else}} + + + + {{end}} + +
    {{.locale.Tr "admin.packages.type"}}{{.locale.Tr "admin.packages.name"}}{{.locale.Tr "admin.packages.version"}}{{.locale.Tr "admin.packages.creator"}}{{.locale.Tr "admin.packages.size"}}{{.locale.Tr "admin.packages.published"}}
    {{.Package.Type.Name}}{{.Package.Name}}{{.Version.Version}}{{.Creator.Name}}{{FileSize .CalculateBlobSize}}{{DateTime "short" .Version.CreatedUnix}}
    {{.locale.Tr "packages.owner.settings.cleanuprules.preview.none"}}
    +
    diff --git a/src/templates/package/shared/list.tmpl b/src/templates/package/shared/list.tmpl new file mode 100644 index 0000000..707fbe3 --- /dev/null +++ b/src/templates/package/shared/list.tmpl @@ -0,0 +1,55 @@ +
    + {{template "base/alert" .}} +
    +
    + + + +
    +
    +
    + {{range .PackageDescriptors}} +
  • +
    +
    + {{.Package.Name}} + {{svg .Package.Type.SVGName 16}} {{.Package.Type.Name}} +
    +
    + {{$timeStr := TimeSinceUnix .Version.CreatedUnix $.locale}} + {{$hasRepositoryAccess := false}} + {{if .Repository}} + {{$hasRepositoryAccess = index $.RepositoryAccessMap .Repository.ID}} + {{end}} + {{if $hasRepositoryAccess}} + {{$.locale.Tr "packages.published_by_in" $timeStr .Creator.HomeLink (.Creator.GetDisplayName | Escape) .Repository.Link (.Repository.FullName | Escape) | Safe}} + {{else}} + {{$.locale.Tr "packages.published_by" $timeStr .Creator.HomeLink (.Creator.GetDisplayName | Escape) | Safe}} + {{end}} +
    +
    +
  • + {{else}} + {{if not .HasPackages}} +
    + {{svg "octicon-package" 32}} +

    {{.locale.Tr "packages.empty"}}

    + {{if and .Repository .CanWritePackages}} + {{$packagesUrl := URLJoin .Owner.HomeLink "-" "packages"}} +

    {{.locale.Tr "packages.empty.repo" $packagesUrl | Safe}}

    + {{end}} +

    {{.locale.Tr "packages.empty.documentation" "https://docs.gitea.io/en-us/usage/packages/overview/" | Safe}}

    +
    + {{else}} +

    {{.locale.Tr "packages.filter.no_result"}}

    + {{end}} + {{end}} + {{template "base/paginate" .}} +
    +
    diff --git a/src/templates/package/shared/versionlist.tmpl b/src/templates/package/shared/versionlist.tmpl new file mode 100644 index 0000000..ba48858 --- /dev/null +++ b/src/templates/package/shared/versionlist.tmpl @@ -0,0 +1,39 @@ +
    +

    {{.PackageDescriptor.Package.Name}} / {{.locale.Tr "packages.versions"}}

    +
    +
    + + + {{if eq .PackageDescriptor.Package.Type "container"}} + + {{end}} + +
    +
    +
    + {{range .PackageDescriptors}} +
  • +
    + +
    + {{$.locale.Tr "packages.published_by" (TimeSinceUnix .Version.CreatedUnix $.locale) .Creator.HomeLink (.Creator.GetDisplayName | Escape) | Safe}} +
    +
    +
  • + {{else}} +

    {{.locale.Tr "packages.filter.no_result"}}

    + {{end}} + {{template "base/paginate" .}} +
    +
    diff --git a/src/templates/package/view.tmpl b/src/templates/package/view.tmpl new file mode 100644 index 0000000..755c93f --- /dev/null +++ b/src/templates/package/view.tmpl @@ -0,0 +1,115 @@ +{{template "base/head" .}} +
    + {{template "user/overview/header" .}} +
    +
    +
    +

    {{.PackageDescriptor.Package.Name}} ({{.PackageDescriptor.Version.Version}})

    +
    +
    + {{$timeStr := TimeSinceUnix .PackageDescriptor.Version.CreatedUnix $.locale}} + {{if .HasRepositoryAccess}} + {{.locale.Tr "packages.published_by_in" $timeStr .PackageDescriptor.Creator.HomeLink (.PackageDescriptor.Creator.GetDisplayName | Escape) .PackageDescriptor.Repository.Link (.PackageDescriptor.Repository.FullName | Escape) | Safe}} + {{else}} + {{.locale.Tr "packages.published_by" $timeStr .PackageDescriptor.Creator.HomeLink (.PackageDescriptor.Creator.GetDisplayName | Escape) | Safe}} + {{end}} +
    +
    +
    +
    + {{template "package/content/alpine" .}} + {{template "package/content/cargo" .}} + {{template "package/content/chef" .}} + {{template "package/content/composer" .}} + {{template "package/content/conan" .}} + {{template "package/content/conda" .}} + {{template "package/content/container" .}} + {{template "package/content/cran" .}} + {{template "package/content/debian" .}} + {{template "package/content/generic" .}} + {{template "package/content/go" .}} + {{template "package/content/helm" .}} + {{template "package/content/maven" .}} + {{template "package/content/npm" .}} + {{template "package/content/nuget" .}} + {{template "package/content/pub" .}} + {{template "package/content/pypi" .}} + {{template "package/content/rpm" .}} + {{template "package/content/rubygems" .}} + {{template "package/content/swift" .}} + {{template "package/content/vagrant" .}} +
    +
    + {{.locale.Tr "packages.details"}} +
    +
    {{svg .PackageDescriptor.Package.Type.SVGName 16 "gt-mr-3"}} {{.PackageDescriptor.Package.Type.Name}}
    + {{if .HasRepositoryAccess}} +
    {{svg "octicon-repo" 16 "gt-mr-3"}} {{.PackageDescriptor.Repository.FullName}}
    + {{end}} +
    {{svg "octicon-calendar" 16 "gt-mr-3"}} {{TimeSinceUnix .PackageDescriptor.Version.CreatedUnix $.locale}}
    +
    {{svg "octicon-download" 16 "gt-mr-3"}} {{.PackageDescriptor.Version.DownloadCount}}
    + {{template "package/metadata/alpine" .}} + {{template "package/metadata/cargo" .}} + {{template "package/metadata/chef" .}} + {{template "package/metadata/composer" .}} + {{template "package/metadata/conan" .}} + {{template "package/metadata/conda" .}} + {{template "package/metadata/container" .}} + {{template "package/metadata/cran" .}} + {{template "package/metadata/debian" .}} + {{template "package/metadata/generic" .}} + {{template "package/metadata/helm" .}} + {{template "package/metadata/maven" .}} + {{template "package/metadata/npm" .}} + {{template "package/metadata/nuget" .}} + {{template "package/metadata/pub" .}} + {{template "package/metadata/pypi" .}} + {{template "package/metadata/rpm" .}} + {{template "package/metadata/rubygems" .}} + {{template "package/metadata/swift" .}} + {{template "package/metadata/vagrant" .}} + {{if not (and (eq .PackageDescriptor.Package.Type "container") .PackageDescriptor.Metadata.Manifests)}} +
    {{svg "octicon-database" 16 "gt-mr-3"}} {{FileSize .PackageDescriptor.CalculateBlobSize}}
    + {{end}} +
    + {{if not (eq .PackageDescriptor.Package.Type "container")}} +
    + {{.locale.Tr "packages.assets"}} ({{len .PackageDescriptor.Files}}) +
    + {{range .PackageDescriptor.Files}} +
    + {{.File.Name}} + {{FileSize .Blob.Size}} +
    + {{end}} +
    + {{end}} + {{if .LatestVersions}} +
    + {{.locale.Tr "packages.versions"}} ({{.TotalVersionCount}}) + {{.locale.Tr "packages.versions.view_all"}} +
    + {{range .LatestVersions}} +
    + {{.Version}} + {{DateTime "short" .CreatedUnix}} +
    + {{end}} +
    + {{end}} + {{if or .CanWritePackages .HasRepositoryAccess}} +
    +
    + {{if .HasRepositoryAccess}} +
    {{svg "octicon-issue-opened" 16 "gt-mr-3"}} {{.locale.Tr "repo.issues"}}
    + {{end}} + {{if .CanWritePackages}} +
    {{svg "octicon-tools" 16 "gt-mr-3"}} {{.locale.Tr "repo.settings"}}
    + {{end}} +
    + {{end}} +
    +
    +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/post-install.tmpl b/src/templates/post-install.tmpl new file mode 100644 index 0000000..5048b91 --- /dev/null +++ b/src/templates/post-install.tmpl @@ -0,0 +1,24 @@ +{{template "base/head" .}} +
    +
    +
    +
    +
    +
    +
    +
    + {{.locale.Tr +
    +
    +
    + +
    +
    +
    +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/projects/list.tmpl b/src/templates/projects/list.tmpl new file mode 100644 index 0000000..f14dc9d --- /dev/null +++ b/src/templates/projects/list.tmpl @@ -0,0 +1,92 @@ +
    +
    + {{if .CanWriteProjects}} + +
    + {{end}} + + {{template "base/alert" .}} + + + +
    + {{range .Projects}} +
  • +

    + {{svg .IconName 16}} + {{.Title}} +

    +
    +
    +
    + {{svg "octicon-issue-opened" 14}} + {{$.locale.PrettyNumber .NumOpenIssues}} {{$.locale.Tr "repo.issues.open_title"}} +
    +
    + {{svg "octicon-check" 14}} + {{$.locale.PrettyNumber .NumClosedIssues}} {{$.locale.Tr "repo.issues.closed_title"}} +
    +
    + {{if and $.CanWriteProjects (not $.Repository.IsArchived)}} + + {{end}} +
    + {{if .Description}} +
    + {{.RenderedContent|Str2html}} +
    + {{end}} +
  • + {{end}} + + {{template "base/paginate" .}} +
    +
    +
    + +{{if $.CanWriteProjects}} + +{{end}} diff --git a/src/templates/projects/new.tmpl b/src/templates/projects/new.tmpl new file mode 100644 index 0000000..6d1ae04 --- /dev/null +++ b/src/templates/projects/new.tmpl @@ -0,0 +1,70 @@ +
    +

    + {{if .PageIsEditProjects}} + {{.locale.Tr "repo.projects.edit"}} +
    {{.locale.Tr "repo.projects.edit_subheader"}}
    + {{else}} + {{.locale.Tr "repo.projects.new"}} +
    {{.locale.Tr "repo.projects.new_subheader"}}
    + {{end}} +

    + {{template "base/alert" .}} +
    + {{.CsrfTokenHtml}} +
    + +
    + + +
    +
    + + +
    + + {{if not .PageIsEditProjects}} +
    + + +
    + {{end}} + +
    + + +
    +
    +
    +
    +
    + + {{.locale.Tr "repo.milestones.cancel"}} + + +
    +
    +
    +
    diff --git a/src/templates/projects/view.tmpl b/src/templates/projects/view.tmpl new file mode 100644 index 0000000..3549377 --- /dev/null +++ b/src/templates/projects/view.tmpl @@ -0,0 +1,269 @@ +
    +
    +
    +
    +
    +
    + {{if .CanWriteProjects}} + {{.locale.Tr "new_project_column"}} + {{end}} + +
    +
    +
    + +
    +
    +
    + +
    + {{range $board := .Boards}} + +
    +
    +
    +
    + {{.NumIssues}} +
    + {{.Title}} +
    + {{if and $.CanWriteProjects (ne .ID 0)}} + + {{end}} +
    +
    + +
    + + {{range (index $.IssuesMap .ID)}} + + +
    + {{if eq $.Project.CardType 1}}{{/* Images and Text*/}} +
    + {{range (index $.issuesAttachmentMap .ID)}} + {{.Name}} + {{end}} +
    + {{end}} +
    +
    + + {{template "shared/issueicon" .}} + + + {{.Title}} + +
    +
    + + {{.Repo.FullName}}#{{.Index}} + {{$timeStr := TimeSinceUnix .GetLastEventTimestamp $.locale}} + {{if .OriginalAuthor}} + {{$.locale.Tr .GetLastEventLabelFake $timeStr (.OriginalAuthor|Escape) | Safe}} + {{else if gt .Poster.ID 0}} + {{$.locale.Tr .GetLastEventLabel $timeStr (.Poster.HomeLink|Escape) (.Poster.GetDisplayName | Escape) | Safe}} + {{else}} + {{$.locale.Tr .GetLastEventLabelFake $timeStr (.Poster.GetDisplayName | Escape) | Safe}} + {{end}} + +
    + {{- if .MilestoneID}} + + {{- end}} + {{- range index $.LinkedPRs .ID}} + + {{- end}} +
    + + {{if or .Labels .Assignees}} +
    + {{range .Labels}} + {{RenderLabel $.Context .}} + {{end}} +
    + {{range .Assignees}} + {{avatar $.Context . 28 "mini gt-mr-3"}} + {{end}} +
    +
    + {{end}} +
    + + + {{end}} +
    +
    + {{end}} +
    + +
    + +
    + +{{if .CanWriteProjects}} + +{{end}} diff --git a/src/templates/repo/actions/list.tmpl b/src/templates/repo/actions/list.tmpl new file mode 100644 index 0000000..ca97b67 --- /dev/null +++ b/src/templates/repo/actions/list.tmpl @@ -0,0 +1,27 @@ +{{template "base/head" .}} +
    + {{template "repo/header" .}} +
    +
    + +
    + {{template "repo/actions/runs_list" .}} +
    +
    +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/repo/actions/runs_list.tmpl b/src/templates/repo/actions/runs_list.tmpl new file mode 100644 index 0000000..fdef2e6 --- /dev/null +++ b/src/templates/repo/actions/runs_list.tmpl @@ -0,0 +1,32 @@ +
    + {{range .Runs}} +
  • +
    + {{template "repo/actions/status" (dict "status" .Status.String "locale" $.locale)}} +
    +
    + +
    + {{if not $.CurWorkflow}}{{.WorkflowID}} {{end}}#{{.Index}}: {{$.locale.Tr "actions.runs.commit"}} + {{ShortSha .CommitSHA}}{{$.locale.Tr "actions.runs.pushed_by"}} {{.TriggerUser.GetDisplayName}} + + {{if .RefLink}} + {{.PrettyRef}} + {{else}} + {{.PrettyRef}} + {{end}} + +
    +
    +
    +
    {{TimeSinceUnix .Updated $.locale}}
    +
    {{.Duration}}
    +
    +
  • + {{end}} +
    +{{template "base/paginate" .}} diff --git a/src/templates/repo/actions/status.tmpl b/src/templates/repo/actions/status.tmpl new file mode 100644 index 0000000..cdc747a --- /dev/null +++ b/src/templates/repo/actions/status.tmpl @@ -0,0 +1,29 @@ + +{{- $size := 16 -}} +{{- if .size -}} +{{- $size = .size -}} +{{- end -}} + +{{- $className := "" -}} +{{- if .className -}} +{{- $className = .className -}} +{{- end -}} + + +{{if eq .status "success"}} + {{svg "octicon-check-circle-fill" $size (printf "text green %s" $className)}} +{{else if eq .status "skipped"}} + {{svg "octicon-skip" $size (printf "text grey %s" $className)}} +{{else if eq .status "waiting"}} + {{svg "octicon-clock" $size (printf "text yellow %s" $className)}} +{{else if eq .status "blocked"}} + {{svg "octicon-blocked" $size (printf "text yellow %s" $className)}} +{{else if eq .status "running"}} + {{svg "octicon-meter" $size (printf "text yellow job-status-rotate %s" $className)}} +{{else if or (eq .status "failure") or (eq .status "cancelled") or (eq .status "unknown")}} + {{svg "octicon-x-circle-fill" $size (printf "text red %s" $className)}} +{{end}} + diff --git a/src/templates/repo/actions/view.tmpl b/src/templates/repo/actions/view.tmpl new file mode 100644 index 0000000..297232f --- /dev/null +++ b/src/templates/repo/actions/view.tmpl @@ -0,0 +1,29 @@ +{{template "base/head" .}} + +
    + {{template "repo/header" .}} +
    +
    +
    + +{{template "base/footer" .}} diff --git a/src/templates/repo/activity.tmpl b/src/templates/repo/activity.tmpl new file mode 100644 index 0000000..ed29ece --- /dev/null +++ b/src/templates/repo/activity.tmpl @@ -0,0 +1,240 @@ +{{template "base/head" .}} +
    + {{template "repo/header" .}} +
    +

    + {{DateTime "long" .DateFrom}} - {{DateTime "long" .DateUntil}} + + +

    +
    + + {{if (or (.Permission.CanRead $.UnitTypeIssues) (.Permission.CanRead $.UnitTypePullRequests))}} +

    {{.locale.Tr "repo.activity.overview"}}

    +
    + {{if .Permission.CanRead $.UnitTypePullRequests}} +
    + {{if gt .Activity.ActivePRCount 0}} +
    + + +
    + {{else}} +
    + +
    + {{end}} + {{.locale.TrN .Activity.ActivePRCount "repo.activity.active_prs_count_1" "repo.activity.active_prs_count_n" .Activity.ActivePRCount | Safe}} +
    + {{end}} + {{if .Permission.CanRead $.UnitTypeIssues}} +
    + {{if gt .Activity.ActiveIssueCount 0}} +
    + + +
    + {{else}} +
    + +
    + {{end}} + {{.locale.TrN .Activity.ActiveIssueCount "repo.activity.active_issues_count_1" "repo.activity.active_issues_count_n" .Activity.ActiveIssueCount | Safe}} +
    + {{end}} +
    + + {{end}} + + {{if .Permission.CanRead $.UnitTypeCode}} + {{if eq .Activity.Code.CommitCountInAllBranches 0}} +
    +

    {{.locale.Tr "repo.activity.no_git_activity"}}

    +
    + {{end}} + {{if gt .Activity.Code.CommitCountInAllBranches 0}} +
    +
    + {{.locale.Tr "repo.activity.git_stats_exclude_merges"}} + {{.locale.TrN .Activity.Code.AuthorCount "repo.activity.git_stats_author_1" "repo.activity.git_stats_author_n" .Activity.Code.AuthorCount}} + {{.locale.TrN .Activity.Code.AuthorCount "repo.activity.git_stats_pushed_1" "repo.activity.git_stats_pushed_n"}} + {{.locale.TrN .Activity.Code.CommitCount "repo.activity.git_stats_commit_1" "repo.activity.git_stats_commit_n" .Activity.Code.CommitCount}} + {{.locale.Tr "repo.activity.git_stats_push_to_branch" .Repository.DefaultBranch}} + {{.locale.TrN .Activity.Code.CommitCountInAllBranches "repo.activity.git_stats_commit_1" "repo.activity.git_stats_commit_n" .Activity.Code.CommitCountInAllBranches}} + {{.locale.Tr "repo.activity.git_stats_push_to_all_branches"}} + {{.locale.Tr "repo.activity.git_stats_on_default_branch" .Repository.DefaultBranch}} + {{.locale.TrN .Activity.Code.ChangedFiles "repo.activity.git_stats_file_1" "repo.activity.git_stats_file_n" .Activity.Code.ChangedFiles}} + {{.locale.TrN .Activity.Code.ChangedFiles "repo.activity.git_stats_files_changed_1" "repo.activity.git_stats_files_changed_n"}} + {{.locale.Tr "repo.activity.git_stats_additions"}} + {{.locale.TrN .Activity.Code.Additions "repo.activity.git_stats_addition_1" "repo.activity.git_stats_addition_n" .Activity.Code.Additions}} + {{.locale.Tr "repo.activity.git_stats_and_deletions"}} + {{.locale.TrN .Activity.Code.Deletions "repo.activity.git_stats_deletion_1" "repo.activity.git_stats_deletion_n" .Activity.Code.Deletions}}. +
    +
    +
    +
    +
    + {{end}} + {{end}} + + {{if gt .Activity.PublishedReleaseCount 0}} +

    + {{svg "octicon-tag"}} + {{.locale.Tr "repo.activity.title.releases_published_by" + (.locale.TrN .Activity.PublishedReleaseCount "repo.activity.title.releases_1" "repo.activity.title.releases_n" .Activity.PublishedReleaseCount) + (.locale.TrN .Activity.PublishedReleaseAuthorCount "repo.activity.title.user_1" "repo.activity.title.user_n" .Activity.PublishedReleaseAuthorCount) + }} +

    +
    + {{range .Activity.PublishedReleases}} +

    + {{$.locale.Tr "repo.activity.published_release_label"}} + {{.TagName}} + {{if not .IsTag}} + {{.Title | RenderEmoji $.Context}} + {{end}} + {{TimeSinceUnix .CreatedUnix $.locale}} +

    + {{end}} +
    + {{end}} + + {{if gt .Activity.MergedPRCount 0}} +

    + {{svg "octicon-git-pull-request"}} + {{.locale.Tr "repo.activity.title.prs_merged_by" + (.locale.TrN .Activity.MergedPRCount "repo.activity.title.prs_1" "repo.activity.title.prs_n" .Activity.MergedPRCount) + (.locale.TrN .Activity.MergedPRAuthorCount "repo.activity.title.user_1" "repo.activity.title.user_n" .Activity.MergedPRAuthorCount) + }} +

    +
    + {{range .Activity.MergedPRs}} +

    + {{$.locale.Tr "repo.activity.merged_prs_label"}} + #{{.Index}} {{.Issue.Title | RenderEmoji $.Context}} + {{TimeSinceUnix .MergedUnix $.locale}} +

    + {{end}} +
    + {{end}} + + {{if gt .Activity.OpenedPRCount 0}} +

    + {{svg "octicon-git-branch"}} + {{.locale.Tr "repo.activity.title.prs_opened_by" + (.locale.TrN .Activity.OpenedPRCount "repo.activity.title.prs_1" "repo.activity.title.prs_n" .Activity.OpenedPRCount) + (.locale.TrN .Activity.OpenedPRAuthorCount "repo.activity.title.user_1" "repo.activity.title.user_n" .Activity.OpenedPRAuthorCount) + }} +

    +
    + {{range .Activity.OpenedPRs}} +

    + {{$.locale.Tr "repo.activity.opened_prs_label"}} + #{{.Index}} {{.Issue.Title | RenderEmoji $.Context}} + {{TimeSinceUnix .Issue.CreatedUnix $.locale}} +

    + {{end}} +
    + {{end}} + + {{if gt .Activity.ClosedIssueCount 0}} +

    + {{svg "octicon-issue-closed"}} + {{.locale.Tr "repo.activity.title.issues_closed_from" + (.locale.TrN .Activity.ClosedIssueCount "repo.activity.title.issues_1" "repo.activity.title.issues_n" .Activity.ClosedIssueCount) + (.locale.TrN .Activity.ClosedIssueAuthorCount "repo.activity.title.user_1" "repo.activity.title.user_n" .Activity.ClosedIssueAuthorCount) + }} +

    +
    + {{range .Activity.ClosedIssues}} +

    + {{$.locale.Tr "repo.activity.closed_issue_label"}} + #{{.Index}} {{.Title | RenderEmoji $.Context}} + {{TimeSinceUnix .ClosedUnix $.locale}} +

    + {{end}} +
    + {{end}} + + {{if gt .Activity.OpenedIssueCount 0}} +

    + {{svg "octicon-issue-opened"}} + {{.locale.Tr "repo.activity.title.issues_created_by" + (.locale.TrN .Activity.OpenedIssueCount "repo.activity.title.issues_1" "repo.activity.title.issues_n" .Activity.OpenedIssueCount) + (.locale.TrN .Activity.OpenedIssueAuthorCount "repo.activity.title.user_1" "repo.activity.title.user_n" .Activity.OpenedIssueAuthorCount) + }} +

    +
    + {{range .Activity.OpenedIssues}} +

    + {{$.locale.Tr "repo.activity.new_issue_label"}} + #{{.Index}} {{.Title | RenderEmoji $.Context}} + {{TimeSinceUnix .CreatedUnix $.locale}} +

    + {{end}} +
    + {{end}} + + {{if gt .Activity.UnresolvedIssueCount 0}} +

    + {{svg "octicon-comment-discussion"}} + {{.locale.TrN .Activity.UnresolvedIssueCount "repo.activity.title.unresolved_conv_1" "repo.activity.title.unresolved_conv_n" .Activity.UnresolvedIssueCount}} +

    +
    + {{.locale.Tr "repo.activity.unresolved_conv_desc"}} +
    +
    + {{range .Activity.UnresolvedIssues}} +

    + {{$.locale.Tr "repo.activity.unresolved_conv_label"}} + #{{.Index}} + {{if .IsPull}} + {{.Title | RenderEmoji $.Context}} + {{else}} + {{.Title | RenderEmoji $.Context}} + {{end}} + {{TimeSinceUnix .UpdatedUnix $.locale}} +

    + {{end}} +
    + {{end}} +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/repo/blame.tmpl b/src/templates/repo/blame.tmpl new file mode 100644 index 0000000..c7116a5 --- /dev/null +++ b/src/templates/repo/blame.tmpl @@ -0,0 +1,68 @@ +
    +

    +
    + {{template "repo/file_info" .}} +
    +
    +
    + {{.locale.Tr "repo.file_raw"}} + {{if not .IsViewCommit}} + {{.locale.Tr "repo.file_permalink"}} + {{end}} + {{.locale.Tr "repo.normal_view"}} + {{.locale.Tr "repo.file_history"}} + + +
    +
    +

    +
    +
    + + + {{range $row := .BlameRows}} + + + + + {{if $.EscapeStatus.Escaped}} + + {{end}} + + + {{end}} + +
    +
    +
    +
    + {{$row.Avatar}} +
    + +
    + {{$row.CommitSince}} +
    +
    +
    +
    + {{if $row.PreviousSha}} + + {{svg "octicon-versions"}} + + {{end}} + + + + {{if $row.EscapeStatus.Escaped}} + + {{end}} + + {{$row.Code}} +
    +
    +
    +
    diff --git a/src/templates/repo/branch/list.tmpl b/src/templates/repo/branch/list.tmpl new file mode 100644 index 0000000..8617bca --- /dev/null +++ b/src/templates/repo/branch/list.tmpl @@ -0,0 +1,244 @@ +{{template "base/head" .}} +
    + {{template "repo/header" .}} +
    + {{template "base/alert" .}} + {{template "repo/sub_menu" .}} + {{if .DefaultBranchBranch}} +

    + {{.locale.Tr "repo.default_branch"}} + {{if and $.IsWriter (not $.Repository.IsArchived) (not .IsDeleted)}} + + {{svg "octicon-arrow-switch"}} + + {{end}} +

    + +
    + + + + + + + +
    + {{if .DefaultBranchBranch.IsProtected}} + {{svg "octicon-shield-lock"}} + {{end}} + {{.DefaultBranch}} +

    {{svg "octicon-git-commit" 16 "gt-mr-2"}}{{ShortSha .DefaultBranchBranch.Commit.ID.String}} · {{RenderCommitMessage $.Context .DefaultBranchBranch.Commit.CommitMessage .RepoLink .Repository.ComposeMetas}} · {{.locale.Tr "org.repo_updated"}} {{TimeSince .DefaultBranchBranch.Commit.Committer.When .locale}}

    +
    + {{if and $.IsWriter (not $.Repository.IsArchived) (not .IsDeleted)}} + + {{end}} + {{if .EnableFeed}} + {{svg "octicon-rss"}} + {{end}} + {{if not $.DisableDownloadSourceArchives}} + + {{end}} + {{if and $.IsWriter (not $.Repository.IsArchived) (not .IsDeleted) (not $.IsMirror)}} + + {{end}} +
    +
    + {{end}} + + {{if gt (len .Branches) 1}} +

    + {{.locale.Tr "repo.branches"}} +

    +
    + + + {{range .Branches}} + {{if ne .Name $.DefaultBranch}} + + + + + + + {{end}} + {{end}} + +
    + {{if .IsDeleted}} + {{.Name}} +

    {{$.locale.Tr "repo.branch.deleted_by" .DeletedBranch.DeletedBy.Name}} {{TimeSinceUnix .DeletedBranch.DeletedUnix $.locale}}

    + {{else}} + {{if .IsProtected}} + {{svg "octicon-shield-lock"}} + {{end}} + {{.Name}} +

    {{svg "octicon-git-commit" 16 "gt-mr-2"}}{{ShortSha .Commit.ID.String}} · {{RenderCommitMessage $.Context .Commit.CommitMessage $.RepoLink $.Repository.ComposeMetas}} · {{$.locale.Tr "org.repo_updated"}} {{TimeSince .Commit.Committer.When $.locale}}

    + {{end}} +
    + {{if and (not .IsDeleted) $.DefaultBranchBranch}} +
    +
    +
    {{.CommitsBehind}}
    + {{/* old code bears 0/0.0 = NaN output, so it might output invalid "width: NaNpx", it just works and doesn't caues any problem. */}} +
    +
    +
    +
    {{.CommitsAhead}}
    +
    +
    +
    + {{end}} +
    + {{if not .LatestPullRequest}} + {{if .IsIncluded}} + + {{svg "octicon-git-pull-request"}} {{$.locale.Tr "repo.branch.included"}} + + {{else if and (not .IsDeleted) $.AllowsPulls (gt .CommitsAhead 0)}} + + + + {{end}} + {{else if and .LatestPullRequest.HasMerged .MergeMovedOn}} + {{if and (not .IsDeleted) $.AllowsPulls (gt .CommitsAhead 0)}} + + + + {{end}} + {{else}} + {{if not .LatestPullRequest.IsSameRepo}}{{.LatestPullRequest.BaseRepo.FullName}}{{end}}#{{.LatestPullRequest.Issue.Index}} + {{if .LatestPullRequest.HasMerged}} + {{svg "octicon-git-merge" 16 "gt-mr-2"}}{{$.locale.Tr "repo.pulls.merged"}} + {{else if .LatestPullRequest.Issue.IsClosed}} + {{svg "octicon-git-pull-request" 16 "gt-mr-2"}}{{$.locale.Tr "repo.issues.closed_title"}} + {{else}} + {{svg "octicon-git-pull-request" 16 "gt-mr-2"}}{{$.locale.Tr "repo.issues.open_title"}} + {{end}} + {{end}} + + {{if and $.IsWriter (not $.Repository.IsArchived) (not .IsDeleted)}} + + {{end}} + {{if $.EnableFeed}} + {{svg "octicon-rss"}} + {{end}} + {{if and (not .IsDeleted) (not $.DisableDownloadSourceArchives)}} + + {{end}} + {{if and $.IsWriter (not $.Repository.IsArchived) (not .IsDeleted) (not $.IsMirror)}} + + {{end}} + {{if and $.IsWriter (not $.IsMirror) (not $.Repository.IsArchived) (not .IsProtected)}} + {{if .IsDeleted}} + + {{else}} + + {{end}} + {{end}} +
    +
    + {{template "base/paginate" .}} + {{end}} +
    +
    + + + + + + +{{template "base/footer" .}} diff --git a/src/templates/repo/branch_dropdown.tmpl b/src/templates/repo/branch_dropdown.tmpl new file mode 100644 index 0000000..9848995 --- /dev/null +++ b/src/templates/repo/branch_dropdown.tmpl @@ -0,0 +1,89 @@ +{{/* Attributes: +* root +* ContainerClasses +* (TODO: search "branch_dropdown" in the template direcotry) +*/}} +{{$defaultBranch := $.root.BranchName}} +{{if and .root.IsViewTag (not .noTag)}} + {{$defaultBranch = .root.TagName}} +{{end}} +{{if eq $defaultBranch ""}} + {{$defaultBranch = $.root.Repository.DefaultBranch}} +{{end}} + +{{$type := ""}} +{{if and .root.IsViewTag (not .noTag)}} + {{$type = "tag"}} +{{else if .root.IsViewBranch}} + {{$type = "branch"}} +{{else}} + {{$type = "tree"}} +{{end}} + +{{$showBranchesInDropdown := not .root.HideBranchesInDropdown}} + + + +
    + {{/* show dummy elements before Vue componment is mounted, this code must match the code in BranchTagSelector.vue */}} + +
    diff --git a/src/templates/repo/cite/cite_buttons.tmpl b/src/templates/repo/cite/cite_buttons.tmpl new file mode 100644 index 0000000..6f93152 --- /dev/null +++ b/src/templates/repo/cite/cite_buttons.tmpl @@ -0,0 +1,11 @@ + + + + + diff --git a/src/templates/repo/cite/cite_modal.tmpl b/src/templates/repo/cite/cite_modal.tmpl new file mode 100644 index 0000000..e296a1d --- /dev/null +++ b/src/templates/repo/cite/cite_modal.tmpl @@ -0,0 +1,22 @@ + diff --git a/src/templates/repo/clone_buttons.tmpl b/src/templates/repo/clone_buttons.tmpl new file mode 100644 index 0000000..e451c0a --- /dev/null +++ b/src/templates/repo/clone_buttons.tmpl @@ -0,0 +1,15 @@ + +{{if $.CloneButtonShowHTTPS}} + +{{end}} +{{if $.CloneButtonShowSSH}} + +{{end}} + + diff --git a/src/templates/repo/clone_script.tmpl b/src/templates/repo/clone_script.tmpl new file mode 100644 index 0000000..0797b40 --- /dev/null +++ b/src/templates/repo/clone_script.tmpl @@ -0,0 +1,42 @@ + diff --git a/src/templates/repo/commit_page.tmpl b/src/templates/repo/commit_page.tmpl new file mode 100644 index 0000000..9fdb123 --- /dev/null +++ b/src/templates/repo/commit_page.tmpl @@ -0,0 +1,290 @@ +{{template "base/head" .}} +
    + {{template "repo/header" .}} +
    + {{$class := ""}} + {{if .Commit.Signature}} + {{$class = (printf "%s%s" $class " isSigned")}} + {{if .Verification.Verified}} + {{if eq .Verification.TrustStatus "trusted"}} + {{$class = (printf "%s%s" $class " isVerified")}} + {{else if eq .Verification.TrustStatus "untrusted"}} + {{$class = (printf "%s%s" $class " isVerifiedUntrusted")}} + {{else}} + {{$class = (printf "%s%s" $class " isVerifiedUnmatched")}} + {{end}} + {{else if .Verification.Warning}} + {{$class = (printf "%s%s" $class " isWarning")}} + {{end}} + {{end}} +
    +
    +

    {{RenderCommitMessage $.Context .Commit.Message $.RepoLink $.Repository.ComposeMetas}}{{template "repo/commit_statuses" dict "Status" .CommitStatus "Statuses" .CommitStatuses "root" $}}

    + {{if not $.PageIsWiki}} +
    + + {{.locale.Tr "repo.diff.browse_source"}} + + {{if and ($.Permission.CanWrite $.UnitTypeCode) (not $.Repository.IsArchived) (not .IsDeleted)}}{{- /* */ -}} + + {{end}} +
    + {{end}} +
    + {{if IsMultilineCommitMessage .Commit.Message}} +
    {{RenderCommitBody $.Context .Commit.Message $.RepoLink $.Repository.ComposeMetas}}
    + {{end}} + {{if .BranchName}} + {{svg "octicon-git-branch" 16 "gt-mr-2"}}{{.BranchName}} + {{end}} + {{if .TagName}} + {{svg "octicon-tag" 16 "gt-mr-2"}}{{.TagName}} + {{end}} +
    +
    +
    + {{if .Author}} + {{avatar $.Context .Author 28 "gt-mr-3"}} + {{if .Author.FullName}} + {{.Author.FullName}} + {{else}} + {{.Commit.Author.Name}} + {{end}} + {{else}} + {{avatarByEmail $.Context .Commit.Author.Email .Commit.Author.Email 28 "gt-mr-3"}} + {{.Commit.Author.Name}} + {{end}} + {{TimeSince .Commit.Author.When $.locale}} + {{if or (ne .Commit.Committer.Name .Commit.Author.Name) (ne .Commit.Committer.Email .Commit.Author.Email)}} + {{.locale.Tr "repo.diff.committed_by"}} + {{if ne .Verification.CommittingUser.ID 0}} + {{avatar $.Context .Verification.CommittingUser 28 "gt-mx-3"}} + {{.Commit.Committer.Name}} + {{else}} + {{avatarByEmail $.Context .Commit.Committer.Email .Commit.Committer.Name 28 "gt-mr-3"}} + {{.Commit.Committer.Name}} + {{end}} + {{end}} +
    +
    + {{if .Parents}} +
    + {{.locale.Tr "repo.diff.parent"}} + {{range .Parents}} + {{if $.PageIsWiki}} + {{ShortSha .}} + {{else}} + {{ShortSha .}} + {{end}} + {{end}} +
    + {{end}} +
    + {{.locale.Tr "repo.diff.commit"}} + {{ShortSha .CommitID}} +
    +
    +
    + {{if .Commit.Signature}} +
    +
    + {{if .Verification.Verified}} + {{if ne .Verification.SigningUser.ID 0}} + {{svg "gitea-lock" 16 "gt-mr-3"}} + {{if eq .Verification.TrustStatus "trusted"}} + {{.locale.Tr "repo.commits.signed_by"}}: + {{else if eq .Verification.TrustStatus "untrusted"}} + {{.locale.Tr "repo.commits.signed_by_untrusted_user"}}: + {{else}} + {{.locale.Tr "repo.commits.signed_by_untrusted_user_unmatched"}}: + {{end}} + {{avatar $.Context .Verification.SigningUser 28 "gt-mr-3"}} + {{.Verification.SigningUser.GetDisplayName}} + {{else}} + {{svg "gitea-lock-cog" 16 "gt-mr-3"}} + {{.locale.Tr "repo.commits.signed_by"}}: + {{avatarByEmail $.Context .Verification.SigningEmail "" 28}} + {{.Verification.SigningUser.GetDisplayName}} + {{end}} + {{else}} + {{svg "gitea-unlock" 16 "gt-mr-3"}} + {{.locale.Tr .Verification.Reason}} + {{end}} +
    +
    + {{if .Verification.Verified}} + {{if ne .Verification.SigningUser.ID 0}} + {{svg "octicon-verified" 16 "gt-mr-3"}} + {{if .Verification.SigningSSHKey}} + {{.locale.Tr "repo.commits.ssh_key_fingerprint"}}: + {{.Verification.SigningSSHKey.Fingerprint}} + {{else}} + {{.locale.Tr "repo.commits.gpg_key_id"}}: + {{.Verification.SigningKey.PaddedKeyID}} + {{end}} + {{else}} + {{svg "octicon-unverified" 16 "gt-mr-3"}} + {{if .Verification.SigningSSHKey}} + {{.locale.Tr "repo.commits.ssh_key_fingerprint"}}: + {{.Verification.SigningSSHKey.Fingerprint}} + {{else}} + {{.locale.Tr "repo.commits.gpg_key_id"}}: + {{.Verification.SigningKey.PaddedKeyID}} + {{end}} + {{end}} + {{else if .Verification.Warning}} + {{svg "octicon-unverified" 16 "gt-mr-3"}} + {{if .Verification.SigningSSHKey}} + {{.locale.Tr "repo.commits.ssh_key_fingerprint"}}: + {{.Verification.SigningSSHKey.Fingerprint}} + {{else}} + {{.locale.Tr "repo.commits.gpg_key_id"}}: + {{.Verification.SigningKey.PaddedKeyID}} + {{end}} + {{else}} + {{if .Verification.SigningKey}} + {{if ne .Verification.SigningKey.KeyID ""}} + {{svg "octicon-verified" 16 "gt-mr-3"}} + {{.locale.Tr "repo.commits.gpg_key_id"}}: + {{.Verification.SigningKey.PaddedKeyID}} + {{end}} + {{end}} + {{if .Verification.SigningSSHKey}} + {{if ne .Verification.SigningSSHKey.Fingerprint ""}} + {{svg "octicon-verified" 16 "gt-mr-3"}} + {{.locale.Tr "repo.commits.ssh_key_fingerprint"}}: + {{.Verification.SigningSSHKey.Fingerprint}} + {{end}} + {{end}} + {{end}} +
    +
    + {{end}} + {{if .Note}} +
    + {{svg "octicon-note" 16 "gt-mr-3"}} + {{.locale.Tr "repo.diff.git-notes"}}: + {{if .NoteAuthor}} + + {{if .NoteAuthor.FullName}} + {{.NoteAuthor.FullName}} + {{else}} + {{.NoteCommit.Author.Name}} + {{end}} + + {{else}} + {{.NoteCommit.Author.Name}} + {{end}} + {{TimeSince .NoteCommit.Author.When $.locale}} +
    +
    +
    {{RenderNote $.Context .Note $.RepoLink $.Repository.ComposeMetas}}
    +
    + {{end}} + {{template "repo/diff/box" .}} +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/repo/commit_status.tmpl b/src/templates/repo/commit_status.tmpl new file mode 100644 index 0000000..d52e151 --- /dev/null +++ b/src/templates/repo/commit_status.tmpl @@ -0,0 +1,18 @@ +{{if eq .State "pending"}} + {{svg "octicon-dot-fill" 18 "commit-status icon text grey"}} +{{end}} +{{if eq .State "running"}} + {{svg "octicon-dot-fill" 18 "commit-status icon text yellow"}} +{{end}} +{{if eq .State "success"}} + {{svg "octicon-check" 18 "commit-status icon text green"}} +{{end}} +{{if eq .State "error"}} + {{svg "gitea-exclamation" 18 "commit-status icon text red"}} +{{end}} +{{if eq .State "failure"}} + {{svg "octicon-x" 18 "commit-status icon text red"}} +{{end}} +{{if eq .State "warning"}} + {{svg "gitea-exclamation" 18 "commit-status icon text yellow"}} +{{end}} diff --git a/src/templates/repo/commit_statuses.tmpl b/src/templates/repo/commit_statuses.tmpl new file mode 100644 index 0000000..20a59bf --- /dev/null +++ b/src/templates/repo/commit_statuses.tmpl @@ -0,0 +1,22 @@ +{{if .Statuses}} + {{if and (eq (len .Statuses) 1) .Status.TargetURL}} + + {{template "repo/commit_status" .Status}} + + {{else}} + + {{template "repo/commit_status" .Status}} + + {{end}} +
    + {{range .Statuses}} +
    + {{template "repo/commit_status" .}} + {{.Context}} {{.Description}} + {{if .TargetURL}} + {{$.root.locale.Tr "repo.pulls.status_checks_details"}} + {{end}} +
    + {{end}} +
    +{{end}} diff --git a/src/templates/repo/commits.tmpl b/src/templates/repo/commits.tmpl new file mode 100644 index 0000000..3400dbd --- /dev/null +++ b/src/templates/repo/commits.tmpl @@ -0,0 +1,20 @@ +{{template "base/head" .}} +
    + {{template "repo/header" .}} +
    + {{template "repo/sub_menu" .}} +
    +
    + {{template "repo/branch_dropdown" dict "root" . "ContainerClasses" "gt-mr-2"}} + + + {{svg "octicon-git-branch"}} + + {{.locale.Tr "repo.commit_graph"}} + +
    +
    + {{template "repo/commits_table" .}} +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/repo/commits_list.tmpl b/src/templates/repo/commits_list.tmpl new file mode 100644 index 0000000..36333c5 --- /dev/null +++ b/src/templates/repo/commits_list.tmpl @@ -0,0 +1,87 @@ +
    + + + + + + + + + + + {{$commitRepoLink := $.RepoLink}}{{if $.CommitRepoLink}}{{$commitRepoLink = $.CommitRepoLink}}{{end}} + {{range .Commits}} + + + + + {{if .Committer}} + + {{else}} + + {{end}} + + {{end}} + +
    {{.locale.Tr "repo.commits.author"}}SHA1{{.locale.Tr "repo.commits.message"}}{{.locale.Tr "repo.commits.date"}}
    + {{$userName := .Author.Name}} + {{if .User}} + {{if .User.FullName}} + {{$userName = .User.FullName}} + {{end}} + {{avatar $.Context .User 28 "gt-mr-2"}}{{$userName}} + {{else}} + {{avatarByEmail $.Context .Author.Email .Author.Name 28 "gt-mr-2"}} + {{$userName}} + {{end}} + + + {{$class := "ui sha label"}} + {{if .Signature}} + {{$class = (printf "%s%s" $class " isSigned")}} + {{if .Verification.Verified}} + {{if eq .Verification.TrustStatus "trusted"}} + {{$class = (printf "%s%s" $class " isVerified")}} + {{else if eq .Verification.TrustStatus "untrusted"}} + {{$class = (printf "%s%s" $class " isVerifiedUntrusted")}} + {{else}} + {{$class = (printf "%s%s" $class " isVerifiedUnmatched")}} + {{end}} + {{else if .Verification.Warning}} + {{$class = (printf "%s%s" $class " isWarning")}} + {{end}} + {{end}} + {{if $.PageIsWiki}} + + {{else if $.Reponame}} + + {{else}} + + {{end}} + {{ShortSha .ID.String}} + {{if .Signature}} + {{template "repo/shabox_badge" dict "root" $ "verification" .Verification}} + {{end}} + {{if $.Reponame}} + + {{else}} + + {{end}} + + + {{if $.PageIsWiki}} + {{.Summary | RenderEmoji $.Context}} + {{else}} + {{$commitLink:= printf "%s/commit/%s" $commitRepoLink (PathEscape .ID.String)}} + {{RenderCommitMessageLinkSubject $.Context .Message $commitRepoLink $commitLink $.Repository.ComposeMetas}} + {{end}} + + {{if IsMultilineCommitMessage .Message}} + + {{end}} + {{template "repo/commit_statuses" dict "Status" .Status "Statuses" .Statuses "root" $}} + {{if IsMultilineCommitMessage .Message}} +
    {{RenderCommitBody $.Context .Message $commitRepoLink $.Repository.ComposeMetas}}
    + {{end}} +
    {{TimeSince .Committer.When $.locale}}{{TimeSince .Author.When $.locale}}
    +
    diff --git a/src/templates/repo/commits_list_small.tmpl b/src/templates/repo/commits_list_small.tmpl new file mode 100644 index 0000000..6bbc195 --- /dev/null +++ b/src/templates/repo/commits_list_small.tmpl @@ -0,0 +1,50 @@ +{{$index := 0}} +
    +{{range .comment.Commits}} + {{$tag := printf "%s-%d" $.comment.HashTag $index}} + {{$index = Eval $index "+" 1}} +
    + {{svg "octicon-git-commit"}} + {{if .User}} + {{avatar $.root.Context .User}} + {{else}} + {{avatarByEmail $.root.Context .Author.Email .Author.Name}} + {{end}} + + {{$commitLink:= printf "%s/commit/%s" $.comment.Issue.PullRequest.BaseRepo.Link (PathEscape .ID.String)}} + + + {{template "repo/commit_statuses" dict "Status" .Status "Statuses" .Statuses "root" $.root}} + {{$class := "ui sha label"}} + {{if .Signature}} + {{$class = (printf "%s%s" $class " isSigned")}} + {{if .Verification.Verified}} + {{if eq .Verification.TrustStatus "trusted"}} + {{$class = (printf "%s%s" $class " isVerified")}} + {{else if eq .Verification.TrustStatus "untrusted"}} + {{$class = (printf "%s%s" $class " isVerifiedUntrusted")}} + {{else}} + {{$class = (printf "%s%s" $class " isVerifiedUnmatched")}} + {{end}} + {{else if .Verification.Warning}} + {{$class = (printf "%s%s" $class " isWarning")}} + {{end}} + {{end}} + + {{ShortSha .ID.String}} + {{if .Signature}} + {{template "repo/shabox_badge" dict "root" $.root "verification" .Verification}} + {{end}} + + + + {{RenderCommitMessageLinkSubject $.root.Context .Message ($.comment.Issue.PullRequest.BaseRepo.Link|Escape) $commitLink $.comment.Issue.PullRequest.BaseRepo.ComposeMetas}} + {{if IsMultilineCommitMessage .Message}} + + {{end}} + {{if IsMultilineCommitMessage .Message}} +
    {{RenderCommitBody $.root.Context .Message ($.comment.Issue.PullRequest.BaseRepo.Link|Escape) $.comment.Issue.PullRequest.BaseRepo.ComposeMetas}}
    + {{end}} +
    +{{end}} +
    diff --git a/src/templates/repo/commits_table.tmpl b/src/templates/repo/commits_table.tmpl new file mode 100644 index 0000000..eeb50a2 --- /dev/null +++ b/src/templates/repo/commits_table.tmpl @@ -0,0 +1,36 @@ +

    +
    + {{if or .PageIsCommits (gt .CommitCount 0)}} + {{.CommitCount}} {{.locale.Tr "repo.commits.commits"}} {{if .RefName}}({{.RefName}}){{end}} + {{else if .IsNothingToCompare}} + {{.locale.Tr "repo.commits.nothing_to_compare"}} {{if .RefName}}({{.RefName}}){{end}} + {{else}} + {{.locale.Tr "repo.commits.no_commits" $.BaseBranch $.HeadBranch}} {{if .RefName}}({{.RefName}}){{end}} + {{end}} +
    + +

    + +{{if and .Commits (gt .CommitCount 0)}} + {{template "repo/commits_list" .}} +{{end}} + +{{template "base/paginate" .}} diff --git a/src/templates/repo/create.tmpl b/src/templates/repo/create.tmpl new file mode 100644 index 0000000..05e7052 --- /dev/null +++ b/src/templates/repo/create.tmpl @@ -0,0 +1,225 @@ +{{template "base/head" .}} +
    +
    +
    +
    + {{.CsrfTokenHtml}} +

    + {{.locale.Tr "new_repo"}} +

    +
    + {{template "base/alert" .}} + {{template "repo/create_helper" .}} + + {{if not .CanCreateRepo}} +
    +

    {{.locale.TrN .MaxCreationLimit "repo.form.reach_limit_of_creation_1" "repo.form.reach_limit_of_creation_n" .MaxCreationLimit}}

    +
    + {{end}} +
    + + + {{.locale.Tr "repo.owner_helper"}} +
    + +
    + + + {{.locale.Tr "repo.repo_name_helper"}} +
    +
    + +
    + {{if .IsForcedPrivate}} + + + {{else}} + + + {{end}} +
    + {{.locale.Tr "repo.visibility_description"}} +
    +
    + + +
    +
    + + +
    + +
    +
    + +
    + + +
    +
    + + +
    +
    +
    + +
    + + +
    +
    + + +
    +
    +
    + +
    + + +
    +
    + + +
    +
    +
    + +
    +
    + + +
    + +
    + +
    + + + {{.locale.Tr "repo.repo_gitignore_helper_desc"}} +
    +
    + + + {{.locale.Tr "repo.license_helper_desc" "https://choosealicense.com/" | Str2html}} +
    + +
    + + + {{.locale.Tr "repo.readme_helper_desc"}} +
    +
    +
    + + +
    +
    +
    + + + {{.locale.Tr "repo.default_branch_helper"}} +
    +
    + + +
    + {{.locale.Tr "repo.trust_model_helper"}} +
      +
    • {{.locale.Tr "repo.trust_model_helper_collaborator"}}
    • +
    • {{.locale.Tr "repo.trust_model_helper_committer"}}
    • +
    • {{.locale.Tr "repo.trust_model_helper_collaborator_committer"}}
    • +
    • {{.locale.Tr "repo.trust_model_helper_default"}}
    • +
    +
    +
    +
    + +
    + + +
    +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/repo/create_helper.tmpl b/src/templates/repo/create_helper.tmpl new file mode 100644 index 0000000..ec253e9 --- /dev/null +++ b/src/templates/repo/create_helper.tmpl @@ -0,0 +1,3 @@ +{{if not $.DisableMigrations}} +

    {{.locale.Tr "repo.new_repo_helper" ((printf "%s%s" AppSubUrl "/repo/migrate")|Escape) | Safe}}

    +{{end}} diff --git a/src/templates/repo/diff/blob_excerpt.tmpl b/src/templates/repo/diff/blob_excerpt.tmpl new file mode 100644 index 0000000..23149f6 --- /dev/null +++ b/src/templates/repo/diff/blob_excerpt.tmpl @@ -0,0 +1,80 @@ +{{if $.IsSplitStyle}} + {{range $k, $line := $.section.Lines}} + + {{if eq .GetType 4}} + +
    + {{if or (eq $line.GetExpandDirection 3) (eq $line.GetExpandDirection 5)}} + + {{end}} + {{if or (eq $line.GetExpandDirection 3) (eq $line.GetExpandDirection 4)}} + + {{end}} + {{if eq $line.GetExpandDirection 2}} + + {{end}} +
    + + {{$inlineDiff := $.section.GetComputedInlineDiffFor $line $.locale}}{{/* + */}}{{template "repo/diff/section_code" dict "diff" $inlineDiff "locale" $.locale}} + {{else}} + {{$inlineDiff := $.section.GetComputedInlineDiffFor $line $.locale}} + + {{if and $line.LeftIdx $inlineDiff.EscapeStatus.Escaped}}{{end}} + {{if $line.LeftIdx}}{{end}} + {{/* + */}}{{if $line.LeftIdx}}{{template "repo/diff/section_code" dict "diff" $inlineDiff "locale" $.locale}}{{else}}{{/* + */}}{{/* + */}}{{end}}{{/* + */}} + + {{if and $line.RightIdx $inlineDiff.EscapeStatus.Escaped}}{{end}} + {{if $line.RightIdx}}{{end}} + {{/* + */}}{{if $line.RightIdx}}{{template "repo/diff/section_code" dict "diff" $inlineDiff "locale" $.locale}}{{else}}{{/* + */}}{{/* + */}}{{end}}{{/* + */}} + {{end}} + + {{end}} +{{else}} + {{range $k, $line := $.section.Lines}} + + {{if eq .GetType 4}} + +
    + {{if or (eq $line.GetExpandDirection 3) (eq $line.GetExpandDirection 5)}} + + {{end}} + {{if or (eq $line.GetExpandDirection 3) (eq $line.GetExpandDirection 4)}} + + {{end}} + {{if eq $line.GetExpandDirection 2}} + + {{end}} +
    + + {{else}} + + + {{end}} + {{$inlineDiff := $.section.GetComputedInlineDiffFor $line $.locale}} + {{if $inlineDiff.EscapeStatus.Escaped}}{{end}} + + {{$inlineDiff.Content}} + + {{end}} +{{end}} diff --git a/src/templates/repo/diff/box.tmpl b/src/templates/repo/diff/box.tmpl new file mode 100644 index 0000000..67d0434 --- /dev/null +++ b/src/templates/repo/diff/box.tmpl @@ -0,0 +1,228 @@ +{{if .DiffNotAvailable}} +
    +
    +
    + {{template "repo/diff/whitespace_dropdown" .}} + {{template "repo/diff/options_dropdown" .}} + {{if and .PageIsPullFiles $.SignedUserID (not .IsArchived)}} + {{template "repo/diff/new_review" .}} + {{end}} +
    +
    +
    +

    {{.locale.Tr "repo.diff.data_not_available"}}

    +{{else}} +
    +
    +
    + + +
    + {{svg "octicon-diff" 16 "gt-mr-2"}}{{.locale.Tr "repo.diff.stats_desc" .Diff.NumFiles .Diff.TotalAddition .Diff.TotalDeletion | Str2html}} +
    +
    +
    + {{if and .PageIsPullFiles $.SignedUserID (not .IsArchived)}} +
    + + +
    + {{end}} + {{template "repo/diff/whitespace_dropdown" .}} + {{template "repo/diff/options_dropdown" .}} + {{if and .PageIsPullFiles $.SignedUserID (not .IsArchived)}} + {{template "repo/diff/new_review" .}} + {{end}} +
    +
    + +
    +
    +
    + +
    + {{range $i, $file := .Diff.Files}} + {{/*notice: the index of Diff.Files should not be used for element ID, because the index will be restarted from 0 when doing load-more for PRs with a lot of files*/}} + {{$blobBase := call $.GetBlobByPathForCommit $.BeforeCommit $file.OldName}} + {{$blobHead := call $.GetBlobByPathForCommit $.HeadCommit $file.Name}} + {{$isImage := or (call $.IsBlobAnImage $blobBase) (call $.IsBlobAnImage $blobHead)}} + {{$isCsv := (call $.IsCsvFile $file)}} + {{$showFileViewToggle := or $isImage (and (not $file.IsIncomplete) $isCsv)}} + {{$isExpandable := or (gt $file.Addition 0) (gt $file.Deletion 0) $file.IsBin}} + {{$isReviewFile := and $.IsSigned $.PageIsPullFiles (not $.IsArchived)}} +
    +

    +
    + +
    + {{if $file.IsBin}} + + {{$.locale.Tr "repo.diff.bin"}} + + {{else}} + {{template "repo/diff/stats" dict "file" . "root" $}} + {{end}} +
    + {{if $file.IsRenamed}}{{$file.OldName}} → {{end}}{{$file.Name}}{{if .IsLFSFile}} ({{$.locale.Tr "repo.stored_lfs"}}){{end}} + + {{if $file.IsGenerated}} + {{$.locale.Tr "repo.diff.generated"}} + {{end}} + {{if $file.IsVendored}} + {{$.locale.Tr "repo.diff.vendored"}} + {{end}} + {{if and $file.Mode $file.OldMode}} + {{$file.OldMode}} → {{$file.Mode}} + {{else if $file.Mode}} + {{$file.Mode}} + {{end}} +
    +
    + {{if $showFileViewToggle}} +
    + + +
    + {{end}} + {{if $file.IsProtected}} + {{$.locale.Tr "repo.diff.protected"}} + {{end}} + {{if and $isReviewFile $file.HasChangedSinceLastReview}} + {{$.locale.Tr "repo.pulls.has_changed_since_last_review"}} + {{end}} + {{if not (or $file.IsIncomplete $file.IsBin $file.IsSubmodule)}} + + + {{end}} + {{if and (not $file.IsSubmodule) (not $.PageIsWiki)}} + {{if $file.IsDeleted}} + {{$.locale.Tr "repo.diff.view_file"}} + {{else}} + {{$.locale.Tr "repo.diff.view_file"}} + {{end}} + {{end}} + {{if $isReviewFile}} + + {{end}} +
    +

    +
    +
    + {{if or $file.IsIncomplete $file.IsBin}} +
    + {{if $file.IsIncomplete}} + {{if $file.IsIncompleteLineTooLong}} + {{$.locale.Tr "repo.diff.file_suppressed_line_too_long"}} + {{else}} + {{$.locale.Tr "repo.diff.file_suppressed"}} + {{$.locale.Tr "repo.diff.load"}} + {{end}} + {{else}} + {{$.locale.Tr "repo.diff.bin_not_shown"}} + {{end}} +
    + {{else}} + + {{if $.IsSplitStyle}} + {{template "repo/diff/section_split" dict "file" . "root" $}} + {{else}} + {{template "repo/diff/section_unified" dict "file" . "root" $}} + {{end}} +
    + {{end}} +
    + {{if $showFileViewToggle}} + {{/* for image or CSV, it can have a horizontal scroll bar, there won't be review comment context menu (position absolute) which would be clipped by "overflow" */}} +
    + + {{if $isImage}} + {{template "repo/diff/image_diff" dict "file" . "root" $ "blobBase" $blobBase "blobHead" $blobHead}} + {{else}} + {{template "repo/diff/csv_diff" dict "file" . "root" $ "blobBase" $blobBase "blobHead" $blobHead}} + {{end}} +
    +
    + {{end}} +
    +
    + {{end}} + + {{if .Diff.IsIncomplete}} +
    +

    + {{$.locale.Tr "repo.diff.too_many_files"}} + {{.locale.Tr "repo.diff.show_more"}} +

    +
    + {{end}} +
    +
    + + {{if not $.Repository.IsArchived}} + + {{end}} + + {{template "repo/issue/view_content/reference_issue_dialog" .}} +
    +{{end}} diff --git a/src/templates/repo/diff/comment_form.tmpl b/src/templates/repo/diff/comment_form.tmpl new file mode 100644 index 0000000..109f167 --- /dev/null +++ b/src/templates/repo/diff/comment_form.tmpl @@ -0,0 +1,43 @@ +{{if and $.root.SignedUserID (not $.Repository.IsArchived)}} +
    + {{$.root.CsrfTokenHtml}} + + + + + + + + + + {{template "shared/combomarkdowneditor" (dict + "locale" $.root.locale + "MarkdownPreviewUrl" (print $.root.Repository.Link "/markup") + "MarkdownPreviewContext" $.root.RepoLink + "TextareaName" "content" + "TextareaPlaceholder" ($.locale.Tr "repo.diff.comment.placeholder") + "DropzoneParentContainer" "form" + )}} + + +
    +{{end}} diff --git a/src/templates/repo/diff/comment_form_datahandler.tmpl b/src/templates/repo/diff/comment_form_datahandler.tmpl new file mode 100644 index 0000000..d0e4934 --- /dev/null +++ b/src/templates/repo/diff/comment_form_datahandler.tmpl @@ -0,0 +1,7 @@ +{{if $.comment}} + {{template "repo/diff/comment_form" dict "root" $.root "hidden" $.hidden "reply" $.reply "Line" $.comment.UnsignedLine "File" $.comment.TreePath "Side" $.comment.DiffSide "HasComments" true}} +{{else if $.root}} + {{template "repo/diff/comment_form" $}} +{{else}} + {{template "repo/diff/comment_form" dict "root" $}} +{{end}} diff --git a/src/templates/repo/diff/comments.tmpl b/src/templates/repo/diff/comments.tmpl new file mode 100644 index 0000000..d19ac1f --- /dev/null +++ b/src/templates/repo/diff/comments.tmpl @@ -0,0 +1,72 @@ +{{range .comments}} + +{{$createdStr:= TimeSinceUnix .CreatedUnix $.root.locale}} +
    + {{if .OriginalAuthor}} + + {{else}} + {{template "shared/user/avatarlink" dict "Context" $.root.Context "user" .Poster}} + {{end}} +
    +
    +
    + {{if .OriginalAuthor}} + + {{svg (MigrationIcon $.root.Repository.GetOriginalURLHostname)}} + {{.OriginalAuthor}} + + + {{$.root.locale.Tr "repo.issues.commented_at" (.HashTag|Escape) $createdStr | Safe}} + + + {{if $.root.Repository.OriginalURL}} + ({{$.root.locale.Tr "repo.migrated_from" ($.root.Repository.OriginalURL | Escape) ($.root.Repository.GetOriginalURLHostname | Escape) | Safe}}) + {{end}} + + {{else}} + + {{template "shared/user/namelink" .Poster}} + {{$.root.locale.Tr "repo.issues.commented_at" (.HashTag|Escape) $createdStr | Safe}} + + {{end}} +
    +
    + {{if .Invalidated}} + {{$referenceUrl := printf "%s#%s" $.root.Issue.Link .HashTag}} + + {{$.root.locale.Tr "repo.issues.review.outdated"}} + + {{end}} + {{if and .Review}} + {{if eq .Review.Type 0}} +
    + {{$.root.locale.Tr "repo.issues.review.pending"}} +
    + {{else}} +
    + {{$.root.locale.Tr "repo.issues.review.review"}} +
    + {{end}} + {{end}} + {{template "repo/issue/view_content/add_reaction" dict "ctxData" $.root "ActionURL" (printf "%s/comments/%d/reactions" $.root.RepoLink .ID)}} + {{template "repo/issue/view_content/context_menu" dict "ctxData" $.root "item" . "delete" true "issue" false "diff" true "IsCommentPoster" (and $.root.IsSigned (eq $.root.SignedUserID .PosterID))}} +
    +
    +
    +
    + {{if .RenderedContent}} + {{.RenderedContent|Str2html}} + {{else}} + {{$.root.locale.Tr "repo.issues.no_content"}} + {{end}} +
    +
    {{.Content}}
    +
    +
    + {{$reactions := .Reactions.GroupByType}} + {{if $reactions}} + {{template "repo/issue/view_content/reactions" dict "ctxData" $.root "ActionURL" (printf "%s/comments/%d/reactions" $.root.RepoLink .ID) "Reactions" $reactions}} + {{end}} +
    +
    +{{end}} diff --git a/src/templates/repo/diff/compare.tmpl b/src/templates/repo/diff/compare.tmpl new file mode 100644 index 0000000..4efe816 --- /dev/null +++ b/src/templates/repo/diff/compare.tmpl @@ -0,0 +1,244 @@ +{{template "base/head" .}} +
    + {{template "repo/header" .}} + {{$showDiffBox := false}} +
    +

    + {{if and $.PageIsComparePull $.IsSigned (not .Repository.IsArchived)}} + {{.locale.Tr "repo.pulls.compare_changes"}} +
    {{.locale.Tr "repo.pulls.compare_changes_desc"}}
    + {{else}} + {{.locale.Tr "action.compare_commits_general"}} + {{end}} +

    + {{if .Flash.WarningMsg}} + {{/* + There's already an importing of alert.tmpl in new_form.tmpl, + but only the negative message will be displayed within forms for some reasons, see semantic.css:10659. + To avoid repeated negative messages, the importing here if for .Flash.WarningMsg only. + */}} + {{template "base/alert" .}} + {{end}} + {{$BaseCompareName := $.BaseName -}} + {{- $HeadCompareName := $.HeadRepo.OwnerName -}} + {{- if and (eq $.BaseName $.HeadRepo.OwnerName) (ne $.Repository.Name $.HeadRepo.Name) -}} + {{- $HeadCompareName = printf "%s/%s" $.HeadRepo.OwnerName $.HeadRepo.Name -}} + {{- end -}} + {{- $OwnForkCompareName := "" -}} + {{- if .OwnForkRepo -}} + {{- $OwnForkCompareName = .OwnForkRepo.OwnerName -}} + {{- end -}} + {{- $RootRepoCompareName := "" -}} + {{- if .RootRepo -}} + {{- $RootRepoCompareName = .RootRepo.OwnerName -}} + {{- if eq $.HeadRepo.OwnerName .RootRepo.OwnerName -}} + {{- $HeadCompareName = printf "%s/%s" $.HeadRepo.OwnerName $.HeadRepo.Name -}} + {{- end -}} + {{- end -}} +
    + {{svg "octicon-git-compare"}} + + {{.CompareSeparator}} + +
    + + {{if .IsNothingToCompare}} + {{if and $.IsSigned $.AllowEmptyPr (not .Repository.IsArchived)}} +
    {{.locale.Tr "repo.pulls.nothing_to_compare_and_allow_empty_pr"}}
    +
    + +
    +
    + {{template "repo/issue/new_form" .}} +
    + {{else}} +
    {{.locale.Tr "repo.pulls.nothing_to_compare"}}
    + {{end}} + {{else if and .PageIsComparePull (gt .CommitCount 0)}} + {{if .HasPullRequest}} +
    +
    + {{.locale.Tr "repo.pulls.has_pull_request" (Escape $.RepoLink) (Escape $.RepoRelPath) .PullRequest.Index | Safe}} +

    + {{RenderIssueTitle $.Context .PullRequest.Issue.Title $.RepoLink $.Repository.ComposeMetas}} + #{{.PullRequest.Issue.Index}} +

    +
    + +
    + {{else}} + {{if and $.IsSigned (not .Repository.IsArchived)}} +
    + +
    + {{else if .Repository.IsArchived}} +
    + {{if .Repository.ArchivedUnix.IsZero}} + {{.locale.Tr "repo.archive.title"}} + {{else}} + {{.locale.Tr "repo.archive.title_date" (DateTime "long" .Repository.ArchivedUnix) | Safe}} + {{end}} +
    + {{end}} + {{if $.IsSigned}} +
    + {{template "repo/issue/new_form" .}} +
    + {{end}} + {{$showDiffBox = true}} + {{end}} + {{else}} + {{$showDiffBox = true}} + {{end}} +
    + + {{if $showDiffBox}} +
    + {{template "repo/commits_table" .}} + {{template "repo/diff/box" .}} +
    + {{end}} +
    +{{template "base/footer" .}} diff --git a/src/templates/repo/diff/conversation.tmpl b/src/templates/repo/diff/conversation.tmpl new file mode 100644 index 0000000..ce34479 --- /dev/null +++ b/src/templates/repo/diff/conversation.tmpl @@ -0,0 +1,66 @@ +{{$resolved := (index .comments 0).IsResolved}} +{{$invalid := (index .comments 0).Invalidated}} +{{$resolveDoer := (index .comments 0).ResolveDoer}} +{{$isNotPending := (not (eq (index .comments 0).Review.Type 0))}} +{{$referenceUrl := printf "%s#%s" $.Issue.Link (index .comments 0).HashTag}} +
    + {{if $resolved}} +
    +
    + {{svg "octicon-check" 16 "icon gt-mr-2"}} + {{$resolveDoer.Name}} {{$.locale.Tr "repo.issues.review.resolved_by"}} + {{if $invalid}} + + + {{$.locale.Tr "repo.issues.review.outdated"}} + + {{end}} +
    +
    + + +
    +
    + {{end}} +
    +
    + + {{template "repo/diff/comments" dict "root" $ "comments" .comments}} + +
    +
    +
    + + +
    + {{if and $.CanMarkConversation $isNotPending}} + + {{end}} + {{if and $.SignedUserID (not $.Repository.IsArchived)}} + + {{end}} +
    + {{template "repo/diff/comment_form_datahandler" dict "hidden" true "reply" (index .comments 0).ReviewID "root" $ "comment" (index .comments 0)}} +
    +
    diff --git a/src/templates/repo/diff/csv_diff.tmpl b/src/templates/repo/diff/csv_diff.tmpl new file mode 100644 index 0000000..0f46da3 --- /dev/null +++ b/src/templates/repo/diff/csv_diff.tmpl @@ -0,0 +1,58 @@ + + + {{$result := call .root.CreateCsvDiff .file .blobBase .blobHead}} + {{if $result.Error}} +
    {{$result.Error}}
    + {{else if $result.Sections}} + + {{range $i, $section := $result.Sections}} + + {{range $j, $row := $section.Rows}} + + {{if and (eq $i 0) (eq $j 0)}} + + {{range $j, $cell := $row.Cells}} + {{if not $cell}} + + {{else if eq $cell.Type 2}} + + {{else if eq $cell.Type 3}} + + {{else if eq $cell.Type 4}} + + {{else if eq $cell.Type 5}} + + {{else if eq $cell.Type 6}} + + {{else}} + + {{end}} + {{end}} + {{else}} + + {{range $j, $cell := $row.Cells}} + {{if not $cell}} + + {{else if eq $cell.Type 2}} + + {{else if eq $cell.Type 3}} + + {{else if eq $cell.Type 4}} + + {{else if eq $cell.Type 5}} + + {{else if eq $cell.Type 6}} + + {{else}} + + {{end}} + {{end}} + {{end}} + + {{end}} + + {{end}} +
    {{.RowIdx}}{{.LeftCell}} {{.RightCell}}{{.RightCell}}{{.LeftCell}}{{.RightCell}}{{.LeftCell}} {{.RightCell}}{{.RightCell}}{{if .RowIdx}}{{.RowIdx}}{{end}}{{.LeftCell}} {{.RightCell}}{{.RightCell}}{{.LeftCell}}{{.RightCell}}{{.LeftCell}} {{.RightCell}}{{.RightCell}}
    + {{end}} + + diff --git a/src/templates/repo/diff/escape_title.tmpl b/src/templates/repo/diff/escape_title.tmpl new file mode 100644 index 0000000..7aa5af4 --- /dev/null +++ b/src/templates/repo/diff/escape_title.tmpl @@ -0,0 +1,2 @@ +{{if .diff.EscapeStatus.HasInvisible}}{{.locale.Tr "repo.invisible_runes_line"}} {{end}}{{/* +*/}}{{if .diff.EscapeStatus.HasAmbiguous}}{{.locale.Tr "repo.ambiguous_runes_line"}}{{end}} diff --git a/src/templates/repo/diff/image_diff.tmpl b/src/templates/repo/diff/image_diff.tmpl new file mode 100644 index 0000000..ec14ef9 --- /dev/null +++ b/src/templates/repo/diff/image_diff.tmpl @@ -0,0 +1,81 @@ +{{if or .blobBase .blobHead}} + + +
    + +
    +
    +
    + {{if .blobBase}} + +

    {{.root.locale.Tr "repo.diff.file_before"}}

    + +

    + + {{.root.locale.Tr "repo.diff.file_image_width"}}: +  |  + {{.root.locale.Tr "repo.diff.file_image_height"}}: +  |  + + {{.root.locale.Tr "repo.diff.file_byte_size"}}: {{FileSize .blobBase.Size}} +

    +
    + {{end}} + {{if .blobHead}} + +

    {{.root.locale.Tr "repo.diff.file_after"}}

    + +

    + + {{.root.locale.Tr "repo.diff.file_image_width"}}: +  |  + {{.root.locale.Tr "repo.diff.file_image_height"}}: +  |  + + {{.root.locale.Tr "repo.diff.file_byte_size"}}: {{FileSize .blobHead.Size}} +

    +
    + {{end}} +
    +
    + {{if and .blobBase .blobHead}} +
    +
    +
    + + + + + + + + +
    +
    +
    +
    +
    +
    +
    + +
    + + +
    +
    +
    + {{end}} +
    +
    +
    + + +{{end}} diff --git a/src/templates/repo/diff/new_comment.tmpl b/src/templates/repo/diff/new_comment.tmpl new file mode 100644 index 0000000..6a71539 --- /dev/null +++ b/src/templates/repo/diff/new_comment.tmpl @@ -0,0 +1,5 @@ +
    +
    + {{template "repo/diff/comment_form_datahandler" .}} +
    +
    diff --git a/src/templates/repo/diff/new_review.tmpl b/src/templates/repo/diff/new_review.tmpl new file mode 100644 index 0000000..dc9a82c --- /dev/null +++ b/src/templates/repo/diff/new_review.tmpl @@ -0,0 +1,51 @@ +
    + +
    +
    +
    + {{.CsrfTokenHtml}} + +
    +
    {{$.locale.Tr "repo.diff.review.header"}}
    + {{svg "octicon-x" 16}} +
    +
    + {{template "shared/combomarkdowneditor" (dict + "locale" $.locale + "MarkdownPreviewUrl" (print .Repository.Link "/markup") + "MarkdownPreviewContext" .RepoLink + "TextareaName" "content" + "TextareaPlaceholder" ($.locale.Tr "repo.diff.review.placeholder") + "DropzoneParentContainer" "form" + )}} +
    + {{if .IsAttachmentEnabled}} +
    + {{template "repo/upload" .}} +
    + {{end}} +
    + {{$showSelfTooltip := (and $.IsSigned ($.Issue.IsPoster $.SignedUser.ID))}} + {{if $showSelfTooltip}} + + + + {{else}} + + {{end}} + + {{if $showSelfTooltip}} + + + + {{else}} + + {{end}} +
    +
    +
    +
    diff --git a/src/templates/repo/diff/options_dropdown.tmpl b/src/templates/repo/diff/options_dropdown.tmpl new file mode 100644 index 0000000..172e674 --- /dev/null +++ b/src/templates/repo/diff/options_dropdown.tmpl @@ -0,0 +1,33 @@ + diff --git a/src/templates/repo/diff/section_code.tmpl b/src/templates/repo/diff/section_code.tmpl new file mode 100644 index 0000000..c95ce83 --- /dev/null +++ b/src/templates/repo/diff/section_code.tmpl @@ -0,0 +1,6 @@ +{{.diff.Content}} diff --git a/src/templates/repo/diff/section_split.tmpl b/src/templates/repo/diff/section_split.tmpl new file mode 100644 index 0000000..1c9bfed --- /dev/null +++ b/src/templates/repo/diff/section_split.tmpl @@ -0,0 +1,155 @@ +{{$file := .file}} + + + + + + + + + + +{{range $j, $section := $file.Sections}} + {{range $k, $line := $section.Lines}} + {{$hasmatch := ne $line.Match -1}} + {{if or (ne .GetType 2) (not $hasmatch)}} + + {{if eq .GetType 4}} + +
    + {{if or (eq $line.GetExpandDirection 3) (eq $line.GetExpandDirection 5)}} + + {{end}} + {{if or (eq $line.GetExpandDirection 3) (eq $line.GetExpandDirection 4)}} + + {{end}} + {{if eq $line.GetExpandDirection 2}} + + {{end}} +
    + {{$inlineDiff := $section.GetComputedInlineDiffFor $line $.root.locale}} + {{if $inlineDiff.EscapeStatus.Escaped}}{{end}} + {{/* + */}}{{template "repo/diff/section_code" dict "diff" $inlineDiff "locale" $.root.locale}}{{/* + */}} + {{else if and (eq .GetType 3) $hasmatch}}{{/* DEL */}} + {{$match := index $section.Lines $line.Match}} + {{- $leftDiff := ""}}{{if $line.LeftIdx}}{{$leftDiff = $section.GetComputedInlineDiffFor $line $.root.locale}}{{end}} + {{- $rightDiff := ""}}{{if $match.RightIdx}}{{$rightDiff = $section.GetComputedInlineDiffFor $match $.root.locale}}{{end}} + + {{if $line.LeftIdx}}{{if $leftDiff.EscapeStatus.Escaped}}{{end}}{{end}} + {{if $match.RightIdx}}{{end}} + {{/* + */}}{{if and $.root.SignedUserID $.root.PageIsPullFiles}}{{/* + */}}{{/* + */}}{{svg "octicon-plus"}}{{/* + */}}{{/* + */}}{{end}}{{/* + */}}{{if $match.RightIdx}}{{/* + */}}{{template "repo/diff/section_code" dict "diff" $rightDiff "locale" $.root.locale}}{{/* + */}}{{else}}{{/* + */}}{{/* + */}}{{end}}{{/* + */}} + {{else}} + {{$inlineDiff := $section.GetComputedInlineDiffFor $line $.root.locale}} + + {{if $line.LeftIdx}}{{if $inlineDiff.EscapeStatus.Escaped}}{{end}}{{end}} + {{if $line.LeftIdx}}{{end}} + {{/* + */}}{{if and $.root.SignedUserID $.root.PageIsPullFiles (not (eq .GetType 2))}}{{/* + */}}{{/* + */}}{{svg "octicon-plus"}}{{/* + */}}{{/* + */}}{{end}}{{/* + */}}{{if $line.LeftIdx}}{{/* + */}}{{template "repo/diff/section_code" dict "diff" $inlineDiff "locale" $.root.locale}}{{/* + */}}{{else}}{{/* + */}}{{/* + */}}{{end}}{{/* + */}} + + {{if $line.RightIdx}}{{if $inlineDiff.EscapeStatus.Escaped}}{{end}}{{end}} + {{if $line.RightIdx}}{{end}} + {{/* + */}}{{if and $.root.SignedUserID $.root.PageIsPullFiles (not (eq .GetType 3))}}{{/* + */}}{{/* + */}}{{svg "octicon-plus"}}{{/* + */}}{{/* + */}}{{end}}{{/* + */}}{{if $line.RightIdx}}{{/* + */}}{{template "repo/diff/section_code" dict "diff" $inlineDiff "locale" $.root.locale}}{{/* + */}}{{else}}{{/* + */}}{{/* + */}}{{end}}{{/* + */}} + {{end}} + + {{if and (eq .GetType 3) $hasmatch}} + {{$match := index $section.Lines $line.Match}} + {{if or (gt (len $line.Comments) 0) (gt (len $match.Comments) 0)}} + + + {{if gt (len $line.Comments) 0}} + {{if eq $line.GetCommentSide "previous"}} + {{template "repo/diff/conversation" dict "." $.root "comments" $line.Comments}} + {{end}} + {{end}} + {{if gt (len $match.Comments) 0}} + {{if eq $match.GetCommentSide "previous"}} + {{template "repo/diff/conversation" dict "." $.root "comments" $match.Comments}} + {{end}} + {{end}} + + + {{if eq $line.GetCommentSide "proposed"}} + {{template "repo/diff/conversation" dict "." $.root "comments" $line.Comments}} + {{end}} + {{if gt (len $match.Comments) 0}} + {{if eq $match.GetCommentSide "proposed"}} + {{template "repo/diff/conversation" dict "." $.root "comments" $match.Comments}} + {{end}} + {{end}} + + + {{end}} + {{else if gt (len $line.Comments) 0}} + + + {{if gt (len $line.Comments) 0}} + {{if eq $line.GetCommentSide "previous"}} + {{template "repo/diff/conversation" dict "." $.root "comments" $line.Comments}} + {{end}} + {{end}} + + + {{if eq $line.GetCommentSide "proposed"}} + {{template "repo/diff/conversation" dict "." $.root "comments" $line.Comments}} + {{end}} + + + {{end}} + {{end}} + {{end}} +{{end}} diff --git a/src/templates/repo/diff/section_unified.tmpl b/src/templates/repo/diff/section_unified.tmpl new file mode 100644 index 0000000..8f9c122 --- /dev/null +++ b/src/templates/repo/diff/section_unified.tmpl @@ -0,0 +1,71 @@ +{{$file := .file}} + + + + + + + +{{range $j, $section := $file.Sections}} + {{range $k, $line := $section.Lines}} + + {{if eq .GetType 4}} + {{if $.root.AfterCommitID}} + +
    + {{if or (eq $line.GetExpandDirection 3) (eq $line.GetExpandDirection 5)}} + + {{end}} + {{if or (eq $line.GetExpandDirection 3) (eq $line.GetExpandDirection 4)}} + + {{end}} + {{if eq $line.GetExpandDirection 2}} + + {{end}} +
    + + {{else}} + {{/* for code file preview page or comment diffs on pull comment pages, do not show the expansion arrows */}} + + {{end}} + {{else}} + + + {{end}} + {{$inlineDiff := $section.GetComputedInlineDiffFor $line $.root.locale -}} + + {{- if $inlineDiff.EscapeStatus.Escaped -}} + + {{- end -}} + + + {{if eq .GetType 4}} + {{/* + */}}{{template "repo/diff/section_code" dict "diff" $inlineDiff "locale" $.root.locale}}{{/* + */}} + {{else}} + {{/* + */}}{{if and $.root.SignedUserID $.root.PageIsPullFiles}}{{/* + */}}{{/* + */}}{{svg "octicon-plus"}}{{/* + */}}{{/* + */}}{{end}}{{/* + */}}{{template "repo/diff/section_code" dict "diff" $inlineDiff "locale" $.root.locale}}{{/* + */}} + {{end}} + + {{if gt (len $line.Comments) 0}} + + + {{template "repo/diff/conversation" dict "." $.root "comments" $line.Comments}} + + + {{end}} + {{end}} +{{end}} diff --git a/src/templates/repo/diff/stats.tmpl b/src/templates/repo/diff/stats.tmpl new file mode 100644 index 0000000..ff7e90d --- /dev/null +++ b/src/templates/repo/diff/stats.tmpl @@ -0,0 +1,5 @@ +{{Eval .file.Addition "+" .file.Deletion}} + + {{/* if the denominator is zero, then the float result is "width: NaNpx", as before, it just works */}} +
    +
    diff --git a/src/templates/repo/diff/whitespace_dropdown.tmpl b/src/templates/repo/diff/whitespace_dropdown.tmpl new file mode 100644 index 0000000..2bd8f2f --- /dev/null +++ b/src/templates/repo/diff/whitespace_dropdown.tmpl @@ -0,0 +1,30 @@ + +{{if .IsSplitStyle}}{{svg "gitea-join"}}{{else}}{{svg "gitea-split"}}{{end}} diff --git a/src/templates/repo/editor/cherry_pick.tmpl b/src/templates/repo/editor/cherry_pick.tmpl new file mode 100644 index 0000000..4f1937b --- /dev/null +++ b/src/templates/repo/editor/cherry_pick.tmpl @@ -0,0 +1,30 @@ +{{template "base/head" .}} +
    + {{template "repo/header" .}} +
    + {{template "base/alert" .}} +
    + {{.CsrfTokenHtml}} + + + +
    + +
    + {{template "repo/editor/commit_form" .}} +
    +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/repo/editor/commit_form.tmpl b/src/templates/repo/editor/commit_form.tmpl new file mode 100644 index 0000000..6a3f86f --- /dev/null +++ b/src/templates/repo/editor/commit_form.tmpl @@ -0,0 +1,74 @@ +
    + {{avatar $.Context .SignedUser 48 "commit-avatar"}} +
    +

    {{- if .CanCommitToBranch.WillSign}} + {{svg "octicon-lock" 24}} + {{.locale.Tr "repo.editor.commit_signed_changes"}} + {{- else}} + {{svg "octicon-unlock" 24}} + {{.locale.Tr "repo.editor.commit_changes"}} + {{- end}}

    +
    + +
    +
    + +
    +
    +
    + + +
    +
    +
    +
    +
    + + +
    +
    + {{if not .Repository.IsEmpty}} +
    +
    + {{if .CanCreatePullRequest}} + + {{else}} + + {{end}} + +
    +
    +
    +
    + {{svg "octicon-git-branch"}} + + +
    +
    + {{end}} +
    +
    + + {{.locale.Tr "repo.editor.cancel"}} +
    diff --git a/src/templates/repo/editor/delete.tmpl b/src/templates/repo/editor/delete.tmpl new file mode 100644 index 0000000..2c0c2fc --- /dev/null +++ b/src/templates/repo/editor/delete.tmpl @@ -0,0 +1,13 @@ +{{template "base/head" .}} +
    + {{template "repo/header" .}} +
    + {{template "base/alert" .}} +
    + {{.CsrfTokenHtml}} + + {{template "repo/editor/commit_form" .}} +
    +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/repo/editor/diff_preview.tmpl b/src/templates/repo/editor/diff_preview.tmpl new file mode 100644 index 0000000..e2e922b --- /dev/null +++ b/src/templates/repo/editor/diff_preview.tmpl @@ -0,0 +1,11 @@ +
    +
    +
    + + + {{template "repo/diff/section_unified" dict "file" .File "root" $}} + +
    +
    +
    +
    diff --git a/src/templates/repo/editor/edit.tmpl b/src/templates/repo/editor/edit.tmpl new file mode 100644 index 0000000..2f47616 --- /dev/null +++ b/src/templates/repo/editor/edit.tmpl @@ -0,0 +1,78 @@ +{{template "base/head" .}} +
    + {{template "repo/header" .}} +
    + {{template "base/alert" .}} +
    + {{.CsrfTokenHtml}} + + +
    + +
    + + {{template "repo/editor/commit_form" .}} +
    +
    + + + + +
    +{{template "base/footer" .}} diff --git a/src/templates/repo/editor/patch.tmpl b/src/templates/repo/editor/patch.tmpl new file mode 100644 index 0000000..4f4032e --- /dev/null +++ b/src/templates/repo/editor/patch.tmpl @@ -0,0 +1,57 @@ +{{template "base/head" .}} +
    + {{template "repo/header" .}} +
    + {{template "base/alert" .}} +
    + {{.CsrfTokenHtml}} + + +
    + +
    + + {{template "repo/editor/commit_form" .}} +
    +
    + + +
    +{{template "base/footer" .}} diff --git a/src/templates/repo/editor/upload.tmpl b/src/templates/repo/editor/upload.tmpl new file mode 100644 index 0000000..d9408c9 --- /dev/null +++ b/src/templates/repo/editor/upload.tmpl @@ -0,0 +1,33 @@ +{{template "base/head" .}} +
    + {{template "repo/header" .}} +
    + {{template "base/alert" .}} +
    + {{.CsrfTokenHtml}} +
    + +
    +
    + {{template "repo/upload" .}} +
    + {{template "repo/editor/commit_form" .}} +
    +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/repo/empty.tmpl b/src/templates/repo/empty.tmpl new file mode 100644 index 0000000..50f209b --- /dev/null +++ b/src/templates/repo/empty.tmpl @@ -0,0 +1,82 @@ +{{template "base/head" .}} +
    + {{template "repo/header" .}} +
    +
    +
    + {{template "base/alert" .}} + {{if .Repository.IsArchived}} +
    + {{if .Repository.ArchivedUnix.IsZero}} + {{.locale.Tr "repo.archive.title"}} + {{else}} + {{.locale.Tr "repo.archive.title_date" (DateTime "long" .Repository.ArchivedUnix) | Safe}} + {{end}} +
    + {{end}} + {{if .Repository.IsBroken}} +
    + {{.locale.Tr "repo.broken_message"}} +
    + {{else if .CanWriteCode}} +

    + {{.locale.Tr "repo.quick_guide"}} +

    +
    +
    +

    {{.locale.Tr "repo.clone_this_repo"}} {{.locale.Tr "repo.clone_helper" "http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository" | Str2html}}

    + +
    + {{if and .CanWriteCode (not .Repository.IsArchived)}} + + {{.locale.Tr "repo.editor.new_file"}} + + {{if .RepositoryUploadEnabled}} + + {{.locale.Tr "repo.editor.upload_file"}} + + {{end}} + {{end}} +
    + {{template "repo/clone_buttons" .}} +
    +
    +
    + + {{if not .Repository.IsArchived}} +
    + +
    +

    {{.locale.Tr "repo.create_new_repo_command"}}

    +
    +
    touch README.md
    +git init
    +{{if ne .Repository.DefaultBranch "master"}}git checkout -b {{.Repository.DefaultBranch}}{{end}}
    +git add README.md
    +git commit -m "first commit"
    +git remote add origin {{$.CloneButtonOriginLink.HTTPS}}
    +git push -u origin {{.Repository.DefaultBranch}}
    +
    +
    +
    + +
    +

    {{.locale.Tr "repo.push_exist_repo"}}

    +
    +
    git remote add origin {{$.CloneButtonOriginLink.HTTPS}}
    +git push -u origin {{.Repository.DefaultBranch}}
    +
    +
    + {{end}} + {{else}} +
    + {{.locale.Tr "repo.empty_message"}} +
    + {{end}} + {{template "repo/clone_script" .}} +
    +
    +
    +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/repo/file_info.tmpl b/src/templates/repo/file_info.tmpl new file mode 100644 index 0000000..44256a0 --- /dev/null +++ b/src/templates/repo/file_info.tmpl @@ -0,0 +1,33 @@ +
    + {{if .FileIsSymlink}} +
    + {{.locale.Tr "repo.symbolic_link"}} +
    + {{end}} + {{if .NumLinesSet}}{{/* Explicit attribute needed to show 0 line changes */}} +
    + {{.NumLines}} {{.locale.TrN .NumLines "repo.line" "repo.lines"}} +
    + {{end}} + {{if .FileSize}} +
    + {{FileSize .FileSize}}{{if .IsLFSFile}} ({{.locale.Tr "repo.stored_lfs"}}){{end}} +
    + {{end}} + {{if .LFSLock}} +
    + {{svg "octicon-lock" 16 "gt-mr-2"}} + {{.LFSLockOwner}} +
    + {{end}} + {{if .LexerName}} +
    + {{.LexerName}} +
    + {{end}} + {{if .IsExecutable}} +
    + {{.locale.Tr "repo.executable_file"}} +
    + {{end}} +
    diff --git a/src/templates/repo/find/files.tmpl b/src/templates/repo/find/files.tmpl new file mode 100644 index 0000000..dab46cf --- /dev/null +++ b/src/templates/repo/find/files.tmpl @@ -0,0 +1,21 @@ +{{template "base/head" .}} +
    + {{template "repo/header" .}} +
    +
    + {{.RepoName}} + / +
    + +
    +
    + + + +
    +
    +

    {{.locale.Tr "repo.find_file.no_matching"}}

    +
    +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/repo/forks.tmpl b/src/templates/repo/forks.tmpl new file mode 100644 index 0000000..13810b4 --- /dev/null +++ b/src/templates/repo/forks.tmpl @@ -0,0 +1,18 @@ +{{template "base/head" .}} +
    + {{template "repo/header" .}} +
    +

    + {{.locale.Tr "repo.forks"}} +

    + {{range .Forks}} +
    + {{avatar $.Context .Owner}} + {{.Owner.Name}} / {{.Name}} +
    + {{end}} +
    + + {{template "base/paginate" .}} +
    +{{template "base/footer" .}} diff --git a/src/templates/repo/graph.tmpl b/src/templates/repo/graph.tmpl new file mode 100644 index 0000000..b4cfee8 --- /dev/null +++ b/src/templates/repo/graph.tmpl @@ -0,0 +1,62 @@ +{{template "base/head" .}} +
    + {{template "repo/header" .}} +
    +
    +

    + {{.locale.Tr "repo.commit_graph"}} +
    + + + +
    +

    +
    +
    + {{template "repo/graph/svgcontainer" .}} + {{template "repo/graph/commits" .}} +
    +
    +
    + +{{template "base/footer" .}} diff --git a/src/templates/repo/graph/commits.tmpl b/src/templates/repo/graph/commits.tmpl new file mode 100644 index 0000000..f5fc273 --- /dev/null +++ b/src/templates/repo/graph/commits.tmpl @@ -0,0 +1,79 @@ +
    + +
    diff --git a/src/templates/repo/graph/div.tmpl b/src/templates/repo/graph/div.tmpl new file mode 100644 index 0000000..c0bd4e2 --- /dev/null +++ b/src/templates/repo/graph/div.tmpl @@ -0,0 +1,7 @@ +
    + {{template "repo/graph/svgcontainer" .}} + {{template "repo/graph/commits" .}} + +
    diff --git a/src/templates/repo/graph/svgcontainer.tmpl b/src/templates/repo/graph/svgcontainer.tmpl new file mode 100644 index 0000000..99c3c87 --- /dev/null +++ b/src/templates/repo/graph/svgcontainer.tmpl @@ -0,0 +1,24 @@ +
    + + {{range $flowid, $flow := .Graph.Flows}} + + + {{range $flow.Commits}} + + {{end}} + + {{end}} + +
    diff --git a/src/templates/repo/header.tmpl b/src/templates/repo/header.tmpl new file mode 100644 index 0000000..33791fd --- /dev/null +++ b/src/templates/repo/header.tmpl @@ -0,0 +1,253 @@ +
    +{{with .Repository}} +
    +
    +
    +
    + {{$avatar := (repoAvatar . 32 "gt-mr-3")}} + {{if $avatar}} + {{$avatar}} + {{else}} + {{template "repo/icon" .}} + {{end}} + {{.Owner.Name}} +
    /
    + {{.Name}} +
    + {{if .IsTemplate}} + {{if .IsPrivate}} + {{$.locale.Tr "repo.desc.private_template"}} + {{else}} + {{if .Owner.Visibility.IsPrivate}} + {{$.locale.Tr "repo.desc.internal_template"}} + {{end}} + {{end}} + {{else}} + {{if .IsPrivate}} + {{$.locale.Tr "repo.desc.private"}} + {{else}} + {{if .Owner.Visibility.IsPrivate}} + {{$.locale.Tr "repo.desc.internal"}} + {{end}} + {{end}} + {{end}} + {{if .IsArchived}} + {{$.locale.Tr "repo.desc.archived"}} + {{end}} +
    + {{if $.EnableFeed}} + {{svg "octicon-rss" 18}} + {{end}} +
    + {{if $.PullMirror}} + {{$address := MirrorRemoteAddress $.Context . $.PullMirror.GetRemoteName false}} +
    {{$.locale.Tr "repo.mirror_from"}} {{$address.Address}}
    + {{end}} + {{if .IsFork}}
    {{$.locale.Tr "repo.forked_from"}} {{.BaseRepo.FullName}}
    {{end}} + {{if .IsGenerated}}
    {{$.locale.Tr "repo.generated_from"}} {{.TemplateRepo.FullName}}
    {{end}} +
    + {{if not (or .IsBeingCreated .IsBroken)}} +
    + {{if $.RepoTransfer}} +
    + {{$.CsrfTokenHtml}} +
    + +
    +
    +
    + {{$.CsrfTokenHtml}} +
    + +
    +
    + {{end}} +
    + {{$.CsrfTokenHtml}} +
    + + + {{CountFmt .NumWatches}} + +
    +
    + {{if not $.DisableStars}} +
    + {{$.CsrfTokenHtml}} +
    + + + {{CountFmt .NumStars}} + +
    +
    + {{end}} + {{if and (not .IsEmpty) ($.Permission.CanRead $.UnitTypeCode)}} +
    + + {{svg "octicon-repo-forked"}}{{$.locale.Tr "repo.fork"}} + + + + {{CountFmt .NumForks}} + +
    + {{end}} +
    + {{end}} +
    +
    +{{end}} +
    + {{if not (or .Repository.IsBeingCreated .Repository.IsBroken)}} + + {{else if .Permission.IsAdmin}} + + {{end}} +
    +
    +
    diff --git a/src/templates/repo/home.tmpl b/src/templates/repo/home.tmpl new file mode 100644 index 0000000..8589574 --- /dev/null +++ b/src/templates/repo/home.tmpl @@ -0,0 +1,164 @@ +{{template "base/head" .}} +
    + {{template "repo/header" .}} +
    + {{template "base/alert" .}} + {{if and (not .HideRepoInfo) (not .IsBlame)}} +
    +
    + {{$description := .Repository.DescriptionHTML $.Context}} + {{if $description}}{{$description}}{{else if .IsRepositoryAdmin}}{{.locale.Tr "repo.no_desc"}}{{end}} + {{.Repository.Website}} +
    + {{if .RepoSearchEnabled}} + + {{end}} +
    +
    + {{range .Topics}}{{.Name}}{{end}} + {{if and .Permission.IsAdmin (not .Repository.IsArchived)}}{{end}} +
    + {{end}} + {{if and .Permission.IsAdmin (not .Repository.IsArchived)}} +
    +
    + +
    +
    + + +
    +
    + {{end}} + {{if .Repository.IsArchived}} +
    + {{if .Repository.ArchivedUnix.IsZero}} + {{.locale.Tr "repo.archive.title"}} + {{else}} + {{.locale.Tr "repo.archive.title_date" (DateTime "long" .Repository.ArchivedUnix) | Safe}} + {{end}} +
    + {{end}} + {{template "repo/sub_menu" .}} +
    +
    + {{template "repo/branch_dropdown" dict "root" . "ContainerClasses" "gt-mr-2"}} + {{if and .CanCompareOrPull .IsViewBranch (not .Repository.IsArchived)}} + {{$cmpBranch := ""}} + {{if ne .Repository.ID .BaseRepo.ID}} + {{$cmpBranch = printf "%s/%s:" (.Repository.OwnerName|PathEscape) (.Repository.Name|PathEscape)}} + {{end}} + {{$cmpBranch = printf "%s%s" $cmpBranch (.BranchName|PathEscapeSegments)}} + {{$compareLink := printf "%s/compare/%s...%s" .BaseRepo.Link (.BaseRepo.DefaultBranch|PathEscapeSegments) $cmpBranch}} + + {{svg "octicon-git-pull-request"}} + + {{end}} + + {{$n := len .TreeNames}} + {{$l := Eval $n "-" 1}} + {{if eq $n 0}} + {{.locale.Tr "repo.find_file.go_to_file"}} + {{end}} + + {{if and .CanWriteCode .IsViewBranch (not .Repository.IsArchived) (not .IsViewFile)}} + + {{end}} + + {{if and (eq $n 0) (.Repository.IsTemplate)}} + + {{.locale.Tr "repo.use_template"}} + + {{end}} + {{if ne $n 0}} + + {{StringUtils.EllipsisString .Repository.Name 30}} + {{- range $i, $v := .TreeNames -}} + / + {{- if eq $i $l -}} + {{StringUtils.EllipsisString $v 30}} + {{- else -}} + {{$p := index $.Paths $i}}{{StringUtils.EllipsisString $v 30}} + {{- end -}} + {{- end -}} + + {{end}} +
    +
    + + {{if eq $n 0}} +
    + {{template "repo/clone_buttons" .}} + + {{template "repo/clone_script" .}}{{/* the script will update `.js-clone-url` and related elements */}} +
    + {{template "repo/cite/cite_modal" .}} + {{end}} + {{if and (ne $n 0) (not .IsViewFile) (not .IsBlame)}} + + {{svg "octicon-history" 16 "gt-mr-3"}}{{.locale.Tr "repo.file_history"}} + + {{end}} +
    +
    + {{if .IsViewFile}} + {{template "repo/view_file" .}} + {{else if .IsBlame}} + {{template "repo/blame" .}} + {{else}} + {{template "repo/view_list" .}} + {{end}} +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/repo/icon.tmpl b/src/templates/repo/icon.tmpl new file mode 100644 index 0000000..e956745 --- /dev/null +++ b/src/templates/repo/icon.tmpl @@ -0,0 +1,15 @@ +
    + {{if $.IsTemplate}} + {{svg "octicon-repo-template" 32}} + {{else}} + {{if $.IsPrivate}} + {{svg "octicon-lock" 32}} + {{else if $.IsMirror}} + {{svg "octicon-mirror" 32}} + {{else if $.IsFork}} + {{svg "octicon-repo-forked" 32}} + {{else}} + {{svg "octicon-repo" 32}} + {{end}} + {{end}} +
    diff --git a/src/templates/repo/issue/branch_selector_field.tmpl b/src/templates/repo/issue/branch_selector_field.tmpl new file mode 100644 index 0000000..2577a0f --- /dev/null +++ b/src/templates/repo/issue/branch_selector_field.tmpl @@ -0,0 +1,54 @@ +{{if and (not .Issue.IsPull) (not .PageIsComparePull)}} + + +
    + {{$.CsrfTokenHtml}} +
    + + + +
    +{{end}} diff --git a/src/templates/repo/issue/choose.tmpl b/src/templates/repo/issue/choose.tmpl new file mode 100644 index 0000000..b531645 --- /dev/null +++ b/src/templates/repo/issue/choose.tmpl @@ -0,0 +1,59 @@ +{{template "base/head" .}} +
    + {{template "repo/header" .}} +
    + {{template "base/alert" .}} + +
    + {{range .IssueTemplates}} +
    +
    +
    + {{.Name | RenderEmojiPlain}} +
    {{.About | RenderEmojiPlain}} +
    + +
    +
    + {{end}} + {{range .IssueConfig.ContactLinks}} +
    +
    +
    + {{.Name | RenderEmojiPlain}} +
    {{.About | RenderEmojiPlain}} +
    + +
    +
    + {{end}} + {{if .IssueConfig.BlankIssuesEnabled}} +
    +
    +
    + {{.locale.Tr "repo.issues.choose.blank"}} +
    {{.locale.Tr "repo.issues.choose.blank_about"}} +
    + +
    +
    + {{end}} + {{- if .IssueConfigError}}{{/* normal warning flash makes problems here*/}} +
    +
    +
    {{.locale.Tr "repo.issues.choose.invalid_config"}}
    + {{.IssueConfigError}}
    +
    +
    + {{end}} +
    + +{{template "base/footer" .}} diff --git a/src/templates/repo/issue/comment_tab.tmpl b/src/templates/repo/issue/comment_tab.tmpl new file mode 100644 index 0000000..c40e6dd --- /dev/null +++ b/src/templates/repo/issue/comment_tab.tmpl @@ -0,0 +1,22 @@ +{{$textareaContent := .BodyQuery}} +{{if not $textareaContent}}{{$textareaContent = .IssueTemplate}}{{end}} +{{if not $textareaContent}}{{$textareaContent = .PullRequestTemplate}}{{end}} +{{if not $textareaContent}}{{$textareaContent = .content}}{{end}} + +
    + {{template "shared/combomarkdowneditor" (dict + "locale" $.locale + "MarkdownPreviewUrl" (print .Repository.Link "/markup") + "MarkdownPreviewContext" .RepoLink + "TextareaName" "content" + "TextareaContent" $textareaContent + "TextareaPlaceholder" ($.locale.Tr "repo.diff.comment.placeholder") + "DropzoneParentContainer" "form, .ui.form" + )}} +
    + +{{if .IsAttachmentEnabled}} +
    + {{template "repo/upload" .}} +
    +{{end}} diff --git a/src/templates/repo/issue/fields/checkboxes.tmpl b/src/templates/repo/issue/fields/checkboxes.tmpl new file mode 100644 index 0000000..80835b6 --- /dev/null +++ b/src/templates/repo/issue/fields/checkboxes.tmpl @@ -0,0 +1,12 @@ +
    + {{template "repo/issue/fields/header" .}} + {{$field := .}} + {{range $i, $opt := .item.Attributes.options}} +
    +
    + + +
    +
    + {{end}} +
    diff --git a/src/templates/repo/issue/fields/dropdown.tmpl b/src/templates/repo/issue/fields/dropdown.tmpl new file mode 100644 index 0000000..23aa373 --- /dev/null +++ b/src/templates/repo/issue/fields/dropdown.tmpl @@ -0,0 +1,17 @@ +
    + {{template "repo/issue/fields/header" .}} + {{/* FIXME: required validation */}} + +
    diff --git a/src/templates/repo/issue/fields/header.tmpl b/src/templates/repo/issue/fields/header.tmpl new file mode 100644 index 0000000..6034fed --- /dev/null +++ b/src/templates/repo/issue/fields/header.tmpl @@ -0,0 +1,6 @@ +{{if .item.Attributes.label}} +

    {{.item.Attributes.label}}{{if .item.Validations.required}}{{end}}

    +{{end}} +{{if .item.Attributes.description}} + {{RenderMarkdownToHtml .Context .item.Attributes.description}} +{{end}} diff --git a/src/templates/repo/issue/fields/input.tmpl b/src/templates/repo/issue/fields/input.tmpl new file mode 100644 index 0000000..3fc8a86 --- /dev/null +++ b/src/templates/repo/issue/fields/input.tmpl @@ -0,0 +1,4 @@ +
    + {{template "repo/issue/fields/header" .}} + +
    diff --git a/src/templates/repo/issue/fields/markdown.tmpl b/src/templates/repo/issue/fields/markdown.tmpl new file mode 100644 index 0000000..fd5b6af --- /dev/null +++ b/src/templates/repo/issue/fields/markdown.tmpl @@ -0,0 +1,3 @@ +
    +
    {{RenderMarkdownToHtml .Context .item.Attributes.value}}
    +
    diff --git a/src/templates/repo/issue/fields/textarea.tmpl b/src/templates/repo/issue/fields/textarea.tmpl new file mode 100644 index 0000000..49d51eb --- /dev/null +++ b/src/templates/repo/issue/fields/textarea.tmpl @@ -0,0 +1,25 @@ +{{$useMarkdownEditor := not .item.Attributes.render}} +
    + {{template "repo/issue/fields/header" .}} + + {{/* the real form element to provide the value */}} + + + {{if $useMarkdownEditor}} + {{template "shared/combomarkdowneditor" (dict + "locale" .root.locale + "ContainerClasses" "gt-hidden" + "MarkdownPreviewUrl" (print .root.RepoLink "/markup") + "MarkdownPreviewContext" .root.RepoLink + "TextareaContent" .item.Attributes.value + "TextareaPlaceholder" .item.Attributes.placeholder + "DropzoneParentContainer" ".combo-editor-dropzone" + )}} + + {{if .root.IsAttachmentEnabled}} +
    + {{template "repo/upload" .root}} +
    + {{end}} + {{end}} +
    diff --git a/src/templates/repo/issue/label_precolors.tmpl b/src/templates/repo/issue/label_precolors.tmpl new file mode 100644 index 0000000..555595f --- /dev/null +++ b/src/templates/repo/issue/label_precolors.tmpl @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/templates/repo/issue/labels.tmpl b/src/templates/repo/issue/labels.tmpl new file mode 100644 index 0000000..a122333 --- /dev/null +++ b/src/templates/repo/issue/labels.tmpl @@ -0,0 +1,25 @@ +{{template "base/head" .}} +
    + {{template "repo/header" .}} +
    + + {{if and (or .CanWriteIssues .CanWritePulls) (not .Repository.IsArchived)}} + {{template "repo/issue/labels/label_new" .}} + {{end}} + {{template "base/alert" .}} + {{template "repo/issue/labels/label_list" .}} +
    +
    + +{{if and (or .CanWriteIssues .CanWritePulls) (not .Repository.IsArchived)}} +{{template "repo/issue/labels/edit_delete_label" .}} +{{end}} + +{{template "base/footer" .}} diff --git a/src/templates/repo/issue/labels/edit_delete_label.tmpl b/src/templates/repo/issue/labels/edit_delete_label.tmpl new file mode 100644 index 0000000..b4eb6be --- /dev/null +++ b/src/templates/repo/issue/labels/edit_delete_label.tmpl @@ -0,0 +1,64 @@ + + + diff --git a/src/templates/repo/issue/labels/label.tmpl b/src/templates/repo/issue/labels/label.tmpl new file mode 100644 index 0000000..0101628 --- /dev/null +++ b/src/templates/repo/issue/labels/label.tmpl @@ -0,0 +1,7 @@ + + {{RenderLabel $.Context .label}} + diff --git a/src/templates/repo/issue/labels/label_list.tmpl b/src/templates/repo/issue/labels/label_list.tmpl new file mode 100644 index 0000000..325efd1 --- /dev/null +++ b/src/templates/repo/issue/labels/label_list.tmpl @@ -0,0 +1,83 @@ +

    + {{.locale.Tr "repo.issues.label_count" .NumLabels}} + +

    + +
    + {{if and (not $.PageIsOrgSettingsLabels) (or $.CanWriteIssues $.CanWritePulls) (eq .NumLabels 0) (not $.Repository.IsArchived)}} + {{template "repo/issue/labels/label_load_template" .}} +
    + {{else if and ($.PageIsOrgSettingsLabels) (eq .NumLabels 0)}} + {{template "repo/issue/labels/label_load_template" .}} +
    + {{end}} + + +
    diff --git a/src/templates/repo/issue/labels/label_load_template.tmpl b/src/templates/repo/issue/labels/label_load_template.tmpl new file mode 100644 index 0000000..d883953 --- /dev/null +++ b/src/templates/repo/issue/labels/label_load_template.tmpl @@ -0,0 +1,24 @@ +
    +
    +
    +

    {{.locale.Tr "repo.issues.label_templates.info"}}

    +
    +
    + {{.CsrfTokenHtml}} +
    + +
    + +
    +
    +
    +
    diff --git a/src/templates/repo/issue/labels/label_new.tmpl b/src/templates/repo/issue/labels/label_new.tmpl new file mode 100644 index 0000000..41dced4 --- /dev/null +++ b/src/templates/repo/issue/labels/label_new.tmpl @@ -0,0 +1,50 @@ + diff --git a/src/templates/repo/issue/labels/labels_selector_field.tmpl b/src/templates/repo/issue/labels/labels_selector_field.tmpl new file mode 100644 index 0000000..05580ea --- /dev/null +++ b/src/templates/repo/issue/labels/labels_selector_field.tmpl @@ -0,0 +1,42 @@ + diff --git a/src/templates/repo/issue/labels/labels_sidebar.tmpl b/src/templates/repo/issue/labels/labels_sidebar.tmpl new file mode 100644 index 0000000..89fe26b --- /dev/null +++ b/src/templates/repo/issue/labels/labels_sidebar.tmpl @@ -0,0 +1,11 @@ +
    + {{.root.locale.Tr "repo.issues.new.no_label"}} + + {{range .root.Labels}} + {{template "repo/issue/labels/label" dict "root" $.root "label" .}} + {{end}} + {{range .root.OrgLabels}} + {{template "repo/issue/labels/label" dict "root" $.root "label" .}} + {{end}} + +
    diff --git a/src/templates/repo/issue/list.tmpl b/src/templates/repo/issue/list.tmpl new file mode 100644 index 0000000..023c325 --- /dev/null +++ b/src/templates/repo/issue/list.tmpl @@ -0,0 +1,406 @@ +{{template "base/head" .}} +
    + {{template "repo/header" .}} +
    + + {{if .PinnedIssues}} +
    + {{range .PinnedIssues}} +
    + {{if eq $.Project.CardType 1}} +
    + {{range (index $.issuesAttachmentMap .ID)}} + {{.Name}} + {{end}} +
    + {{end}} +
    +
    +
    + {{template "shared/issueicon" .}} +
    + {{.Title | RenderEmoji $.Context | RenderCodeBlock}} + {{if $.IsRepoAdmin}} + + {{svg "octicon-x" 16}} + + {{end}} +
    +
    + + #{{.Index}} + {{$timeStr := TimeSinceUnix .GetLastEventTimestamp $.locale}} + {{if .OriginalAuthor}} + {{$.locale.Tr .GetLastEventLabelFake $timeStr (.OriginalAuthor|Escape) | Safe}} + {{else if gt .Poster.ID 0}} + {{$.locale.Tr .GetLastEventLabel $timeStr (.Poster.HomeLink|Escape) (.Poster.GetDisplayName | Escape) | Safe}} + {{else}} + {{$.locale.Tr .GetLastEventLabelFake $timeStr (.Poster.GetDisplayName | Escape) | Safe}} + {{end}} + +
    + {{- if .MilestoneID}} + + {{- end}} +
    + + {{if or .Labels .Assignees}} +
    + {{range .Labels}} + {{RenderLabel $.Context .}} + {{end}} +
    + {{range .Assignees}} + {{avatar $.Context . 28 "mini gt-mr-3"}} + {{end}} +
    +
    + {{end}} +
    + {{end}} +
    + {{end}} + +
    + {{template "repo/issue/navbar" .}} + {{template "repo/issue/search" .}} + {{if not .Repository.IsArchived}} + {{if .PageIsIssueList}} + {{.locale.Tr "repo.issues.new"}} + {{else}} + {{.locale.Tr "repo.pulls.new"}} + {{end}} + {{else}} + {{if not .PageIsIssueList}} + {{$.locale.Tr "action.compare_commits_general"}} + {{end}} + {{end}} +
    +
    +
    + {{if and ($.CanWriteIssuesOrPulls) (gt (len .Issues) 0)}} + + {{end}} + {{template "repo/issue/openclose" .}} +
    +
    + +
    +
    + +
    +
    + {{template "repo/issue/openclose" .}} +
    +
    + +
    +
    + {{template "shared/issuelist" dict "." . "listType" "repo"}} +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/repo/issue/milestone/select_menu.tmpl b/src/templates/repo/issue/milestone/select_menu.tmpl new file mode 100644 index 0000000..497313e --- /dev/null +++ b/src/templates/repo/issue/milestone/select_menu.tmpl @@ -0,0 +1,38 @@ +{{if or .OpenMilestones .ClosedMilestones}} + +
    +{{end}} +
    {{.locale.Tr "repo.issues.new.clear_milestone"}}
    +{{if and (not .OpenMilestones) (not .ClosedMilestones)}} +
    + {{.locale.Tr "repo.issues.new.no_items"}} +
    +{{else}} + {{if .OpenMilestones}} +
    +
    + {{.locale.Tr "repo.issues.new.open_milestone"}} +
    + {{range .OpenMilestones}} + + {{svg "octicon-milestone" 16 "gt-mr-2"}} + {{.Name}} + + {{end}} + {{end}} + {{if .ClosedMilestones}} +
    +
    + {{.locale.Tr "repo.issues.new.closed_milestone"}} +
    + {{range .ClosedMilestones}} + + {{svg "octicon-milestone" 16 "gt-mr-2"}} + {{.Name}} + + {{end}} + {{end}} +{{end}} diff --git a/src/templates/repo/issue/milestone_issues.tmpl b/src/templates/repo/issue/milestone_issues.tmpl new file mode 100644 index 0000000..3cd84d5 --- /dev/null +++ b/src/templates/repo/issue/milestone_issues.tmpl @@ -0,0 +1,205 @@ +{{template "base/head" .}} +
    + {{template "repo/header" .}} +
    +
    +

    {{.Milestone.Name}}

    + {{if not .Repository.IsArchived}} +
    + {{if or .CanWriteIssues .CanWritePulls}} + {{if .Milestone.IsClosed}} + {{$.locale.Tr "repo.milestones.open"}} + + {{else}} + {{$.locale.Tr "repo.milestones.close"}} + + {{end}} + {{.locale.Tr "repo.milestones.edit"}} + {{end}} + {{.locale.Tr "repo.issues.new"}} +
    + {{end}} +
    + {{if .Milestone.RenderedContent}} +
    + {{.Milestone.RenderedContent|Str2html}} +
    + {{end}} +
    + +
    +
    + {{$closedDate:= TimeSinceUnix .Milestone.ClosedDateUnix $.locale}} + {{if .IsClosed}} + {{svg "octicon-clock"}} {{$.locale.Tr "repo.milestones.closed" $closedDate | Safe}} + {{else}} + + {{if .Milestone.DeadlineString}} + + {{svg "octicon-calendar"}} + {{DateTime "short" .Milestone.DeadlineString}} + + {{else}} + {{svg "octicon-calendar"}} + {{$.locale.Tr "repo.milestones.no_due_date"}} + {{end}} + {{end}} +
    +
    {{.locale.Tr "repo.milestones.completeness" .Milestone.Completeness | Safe}}
    +
    +
    +
    + +
    +
    + {{template "repo/issue/openclose" .}} +
    +
    + +
    +
    + +
    +
    + {{template "repo/issue/openclose" .}} +
    +
    + +
    +
    + {{template "shared/issuelist" dict "." . "listType" "milestone"}} +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/repo/issue/milestone_new.tmpl b/src/templates/repo/issue/milestone_new.tmpl new file mode 100644 index 0000000..ac34fb0 --- /dev/null +++ b/src/templates/repo/issue/milestone_new.tmpl @@ -0,0 +1,63 @@ +{{template "base/head" .}} +
    + {{template "repo/header" .}} +
    + +
    +

    + {{if .PageIsEditMilestone}} + {{.locale.Tr "repo.milestones.edit"}} +
    {{.locale.Tr "repo.milestones.edit_subheader"}}
    + {{else}} + {{.locale.Tr "repo.milestones.new"}} +
    {{.locale.Tr "repo.milestones.new_subheader"}}
    + {{end}} +

    + {{template "base/alert" .}} +
    + {{.CsrfTokenHtml}} +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    +
    +
    +
    + {{if .PageIsEditMilestone}} + + {{.locale.Tr "repo.milestones.cancel"}} + + + {{else}} + + {{end}} +
    +
    +
    +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/repo/issue/milestones.tmpl b/src/templates/repo/issue/milestones.tmpl new file mode 100644 index 0000000..c23da11 --- /dev/null +++ b/src/templates/repo/issue/milestones.tmpl @@ -0,0 +1,146 @@ +{{template "base/head" .}} +
    + {{template "repo/header" .}} +
    + + {{template "base/alert" .}} + + + + +
    + {{range .Milestones}} +
  • +
    +

    + {{svg "octicon-milestone" 16}} + {{.Name}} +

    +
    + {{.Completeness}}% + +
    +
    +
    +
    +
    + {{svg "octicon-issue-opened" 14}} + {{$.locale.PrettyNumber .NumOpenIssues}} {{$.locale.Tr "repo.issues.open_title"}} +
    +
    + {{svg "octicon-check" 14}} + {{$.locale.PrettyNumber .NumClosedIssues}} {{$.locale.Tr "repo.issues.closed_title"}} +
    + {{if .TotalTrackedTime}} +
    + {{svg "octicon-clock"}} + {{.TotalTrackedTime|Sec2Time}} +
    + {{end}} + {{if .UpdatedUnix}} +
    + {{svg "octicon-clock"}} + {{$.locale.Tr "repo.milestones.update_ago" (TimeSinceUnix .UpdatedUnix $.locale) | Safe}} +
    + {{end}} +
    + {{if .IsClosed}} + {{$closedDate:= TimeSinceUnix .ClosedDateUnix $.locale}} + {{svg "octicon-clock" 14}} + {{$.locale.Tr "repo.milestones.closed" $closedDate | Safe}} + {{else}} + {{if .DeadlineString}} + + {{svg "octicon-calendar" 14}} + {{DateTime "short" .DeadlineString}} + + {{else}} + {{svg "octicon-calendar" 14}} + {{$.locale.Tr "repo.milestones.no_due_date"}} + {{end}} + {{end}} +
    +
    + {{if and (or $.CanWriteIssues $.CanWritePulls) (not $.Repository.IsArchived)}} + + {{end}} +
    + {{if .Content}} +
    + {{.RenderedContent|Str2html}} +
    + {{end}} +
  • + {{end}} + + {{template "base/paginate" .}} +
    +
    +
    + +{{if or .CanWriteIssues .CanWritePulls}} + +{{end}} +{{template "base/footer" .}} diff --git a/src/templates/repo/issue/navbar.tmpl b/src/templates/repo/issue/navbar.tmpl new file mode 100644 index 0000000..2f1ea7a --- /dev/null +++ b/src/templates/repo/issue/navbar.tmpl @@ -0,0 +1,4 @@ + diff --git a/src/templates/repo/issue/new.tmpl b/src/templates/repo/issue/new.tmpl new file mode 100644 index 0000000..780e874 --- /dev/null +++ b/src/templates/repo/issue/new.tmpl @@ -0,0 +1,16 @@ +{{template "base/head" .}} +
    + {{template "repo/header" .}} +
    + {{if .Flash.WarningMsg}} + {{/* + There's already an importing of alert.tmpl in new_form.tmpl, + but only the negative message will be displayed within forms for some reasons, see semantic.css:10659. + To avoid repeated negative messages, the importing here if for .Flash.WarningMsg only. + */}} + {{template "base/alert" .}} + {{end}} + {{template "repo/issue/new_form" .}} +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/repo/issue/new_form.tmpl b/src/templates/repo/issue/new_form.tmpl new file mode 100644 index 0000000..00da68e --- /dev/null +++ b/src/templates/repo/issue/new_form.tmpl @@ -0,0 +1,190 @@ +
    + {{.CsrfTokenHtml}} + {{if .Flash}} +
    + {{template "base/alert" .}} +
    + {{end}} +
    +
    +
    + {{avatar $.Context .SignedUser 40}} +
    +
    + + {{if .PageIsComparePull}} +
    {{.locale.Tr "repo.pulls.title_wip_desc" (index .PullRequestWorkInProgressPrefixes 0| Escape) | Safe}}
    + {{end}} +
    + {{if .Fields}} + + {{range .Fields}} + {{if eq .Type "input"}} + {{template "repo/issue/fields/input" dict "Context" $.Context "item" .}} + {{else if eq .Type "markdown"}} + {{template "repo/issue/fields/markdown" dict "Context" $.Context "item" .}} + {{else if eq .Type "textarea"}} + {{template "repo/issue/fields/textarea" dict "Context" $.Context "item" . "root" $}} + {{else if eq .Type "dropdown"}} + {{template "repo/issue/fields/dropdown" dict "Context" $.Context "item" .}} + {{else if eq .Type "checkboxes"}} + {{template "repo/issue/fields/checkboxes" dict "Context" $.Context "item" .}} + {{end}} + {{end}} + {{else}} + {{template "repo/issue/comment_tab" .}} + {{end}} +
    + +
    +
    +
    +
    +
    + +
    + {{template "repo/issue/branch_selector_field" .}} + + + {{template "repo/issue/labels/labels_selector_field" .}} + {{template "repo/issue/labels/labels_sidebar" dict "root" $}} + +
    + + + +
    + {{.locale.Tr "repo.issues.new.no_milestone"}} + +
    + + {{if .IsProjectsEnabled}} +
    + + + +
    + {{.locale.Tr "repo.issues.new.no_projects"}} + +
    + {{end}} +
    + + +
    + + {{.locale.Tr "repo.issues.new.no_assignees"}} + + {{range .Assignees}} + + {{avatar $.Context . 28 "gt-mr-3 gt-vm"}}{{.GetDisplayName}} + + {{end}} +
    + {{if and .PageIsComparePull (not (eq .HeadRepo.FullName .BaseCompareRepo.FullName)) .CanWriteToHeadRepo}} +
    +
    +
    + + +
    +
    + {{end}} +
    + +
    diff --git a/src/templates/repo/issue/openclose.tmpl b/src/templates/repo/issue/openclose.tmpl new file mode 100644 index 0000000..a5916ed --- /dev/null +++ b/src/templates/repo/issue/openclose.tmpl @@ -0,0 +1,14 @@ + diff --git a/src/templates/repo/issue/search.tmpl b/src/templates/repo/issue/search.tmpl new file mode 100644 index 0000000..1322468 --- /dev/null +++ b/src/templates/repo/issue/search.tmpl @@ -0,0 +1,16 @@ + diff --git a/src/templates/repo/issue/view.tmpl b/src/templates/repo/issue/view.tmpl new file mode 100644 index 0000000..1ef9e73 --- /dev/null +++ b/src/templates/repo/issue/view.tmpl @@ -0,0 +1,12 @@ +{{template "base/head" .}} +
    + {{template "repo/header" .}} +
    + {{template "repo/issue/view_title" .}} + {{if .Issue.IsPull}} + {{template "repo/pulls/tab_menu" .}} + {{end}} + {{template "repo/issue/view_content" .}} +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/repo/issue/view_content.tmpl b/src/templates/repo/issue/view_content.tmpl new file mode 100644 index 0000000..e451db1 --- /dev/null +++ b/src/templates/repo/issue/view_content.tmpl @@ -0,0 +1,200 @@ +
    + + + + + + + + {{$createdStr:= TimeSinceUnix .Issue.CreatedUnix $.locale}} +
    +
    +
    + {{if .Issue.OriginalAuthor}} + + + + {{else}} + + {{avatar $.Context .Issue.Poster 40}} + + {{end}} +
    +
    +
    + {{if .Issue.OriginalAuthor}} + + {{svg (MigrationIcon .Repository.GetOriginalURLHostname)}} + {{.Issue.OriginalAuthor}} + + + {{.locale.Tr "repo.issues.commented_at" (.Issue.HashTag|Escape) $createdStr | Safe}} + + + {{if .Repository.OriginalURL}} ({{$.locale.Tr "repo.migrated_from" (.Repository.OriginalURL|Escape) (.Repository.GetOriginalURLHostname|Escape) | Safe}}){{end}} + + {{else}} + + {{avatar $.Context .Issue.Poster 24}} + + + {{template "shared/user/authorlink" .Issue.Poster}} + {{.locale.Tr "repo.issues.commented_at" (.Issue.HashTag|Escape) $createdStr | Safe}} + + {{end}} +
    +
    + {{if gt .Issue.ShowRole 0}} + {{if (.Issue.ShowRole.HasRole "Writer")}} +
    + {{$.locale.Tr "repo.issues.collaborator"}} +
    + {{end}} + {{if (.Issue.ShowRole.HasRole "Owner")}} +
    + {{$.locale.Tr "repo.issues.owner"}} +
    + {{end}} + {{end}} + {{if not $.Repository.IsArchived}} + {{template "repo/issue/view_content/add_reaction" dict "ctxData" $ "ActionURL" (printf "%s/issues/%d/reactions" $.RepoLink .Issue.Index)}} + {{template "repo/issue/view_content/context_menu" dict "ctxData" $ "item" .Issue "delete" false "issue" true "diff" false "IsCommentPoster" $.IsIssuePoster}} + {{end}} +
    +
    +
    +
    + {{if .Issue.RenderedContent}} + {{.Issue.RenderedContent|Str2html}} + {{else}} + {{.locale.Tr "repo.issues.no_content"}} + {{end}} +
    +
    {{.Issue.Content}}
    +
    + {{if .Issue.Attachments}} + {{template "repo/issue/view_content/attachments" dict "ctxData" $ "Attachments" .Issue.Attachments "Content" .Issue.RenderedContent}} + {{end}} +
    + {{$reactions := .Issue.Reactions.GroupByType}} + {{if $reactions}} + {{template "repo/issue/view_content/reactions" dict "ctxData" $ "ActionURL" (printf "%s/issues/%d/reactions" $.RepoLink .Issue.Index) "Reactions" $reactions}} + {{end}} +
    +
    + + {{template "repo/issue/view_content/comments" .}} + + {{if and .Issue.IsPull (not $.Repository.IsArchived)}} + {{template "repo/issue/view_content/pull".}} + {{end}} + + {{if .IsSigned}} + {{if and (or .IsRepoAdmin .HasIssuesOrPullsWritePermission (not .Issue.IsLocked)) (not .Repository.IsArchived)}} +
    + + {{avatar $.Context .SignedUser 40}} + +
    +
    + {{template "repo/issue/comment_tab" .}} + {{.CsrfTokenHtml}} + + +
    +
    +
    + {{else if .Repository.IsArchived}} +
    + {{if .Issue.IsPull}} + {{.locale.Tr "repo.archive.pull.nocomment"}} + {{else}} + {{.locale.Tr "repo.archive.issue.nocomment"}} + {{end}} +
    + {{end}} + {{else}} {{/* not .IsSigned */}} + {{if .Repository.IsArchived}} +
    + {{if .Issue.IsPull}} + {{.locale.Tr "repo.archive.pull.nocomment"}} + {{else}} + {{.locale.Tr "repo.archive.issue.nocomment"}} + {{end}} +
    + {{else}} +
    + {{.locale.Tr "repo.issues.sign_in_require_desc" (.SignInLink|Escape) | Safe}} +
    + {{end}} + {{end}}{{/* end if: .IsSigned */}} +
    +
    + + {{template "repo/issue/view_content/sidebar" .}} +
    + + + +{{template "repo/issue/view_content/reference_issue_dialog" .}} + +
    + {{.locale.Tr "repo.issues.no_content"}} +
    + + diff --git a/src/templates/repo/issue/view_content/add_reaction.tmpl b/src/templates/repo/issue/view_content/add_reaction.tmpl new file mode 100644 index 0000000..37931f2 --- /dev/null +++ b/src/templates/repo/issue/view_content/add_reaction.tmpl @@ -0,0 +1,12 @@ +{{if .ctxData.IsSigned}} + +{{end}} diff --git a/src/templates/repo/issue/view_content/attachments.tmpl b/src/templates/repo/issue/view_content/attachments.tmpl new file mode 100644 index 0000000..f342340 --- /dev/null +++ b/src/templates/repo/issue/view_content/attachments.tmpl @@ -0,0 +1,42 @@ +
    + {{if .Attachments}} +
    + {{end}} + {{$hasThumbnails := false}} + {{- range .Attachments -}} + + {{end -}} + + {{if $hasThumbnails}} +
    +
    + {{- range .Attachments -}} + {{if FilenameIsImage .Name}} + {{if not (StringUtils.Contains $.Content .UUID)}} + + {{.Name}} + + {{end}} + {{end}} + {{end -}} +
    + {{end}} + +
    diff --git a/src/templates/repo/issue/view_content/comments.tmpl b/src/templates/repo/issue/view_content/comments.tmpl new file mode 100644 index 0000000..0e3fccd --- /dev/null +++ b/src/templates/repo/issue/view_content/comments.tmpl @@ -0,0 +1,843 @@ +{{template "base/alert"}} +{{range .Issue.Comments}} + {{if call $.ShouldShowCommentType .Type}} + {{$createdStr:= TimeSinceUnix .CreatedUnix $.locale}} + + + {{if eq .Type 0}} +
    + {{if .OriginalAuthor}} + + + + {{else}} + + {{avatar $.Context .Poster 40}} + + {{end}} +
    +
    +
    + {{if .OriginalAuthor}} + + {{svg (MigrationIcon $.Repository.GetOriginalURLHostname)}} + {{.OriginalAuthor}} + + + {{$.locale.Tr "repo.issues.commented_at" (.HashTag|Escape) $createdStr | Safe}} {{if $.Repository.OriginalURL}} + + + ({{$.locale.Tr "repo.migrated_from" ($.Repository.OriginalURL|Escape) ($.Repository.GetOriginalURLHostname|Escape) | Safe}}){{end}} + + {{else}} + {{if gt .Poster.ID 0}} + + {{avatar $.Context .Poster 24}} + + {{end}} + + {{template "shared/user/authorlink" .Poster}} + {{$.locale.Tr "repo.issues.commented_at" (.HashTag|Escape) $createdStr | Safe}} + + {{end}} +
    +
    + {{if (.ShowRole.HasRole "Poster")}} +
    + {{$.locale.Tr "repo.issues.poster"}} +
    + {{end}} + {{if (.ShowRole.HasRole "Writer")}} +
    + {{$.locale.Tr "repo.issues.collaborator"}} +
    + {{end}} + {{if (.ShowRole.HasRole "Owner")}} +
    + {{$.locale.Tr "repo.issues.owner"}} +
    + {{end}} + {{if not $.Repository.IsArchived}} + {{template "repo/issue/view_content/add_reaction" dict "ctxData" $ "ActionURL" (printf "%s/comments/%d/reactions" $.RepoLink .ID)}} + {{template "repo/issue/view_content/context_menu" dict "ctxData" $ "item" . "delete" true "issue" true "diff" false "IsCommentPoster" (and $.IsSigned (eq $.SignedUserID .PosterID))}} + {{end}} +
    +
    +
    +
    + {{if .RenderedContent}} + {{.RenderedContent|Str2html}} + {{else}} + {{$.locale.Tr "repo.issues.no_content"}} + {{end}} +
    +
    {{.Content}}
    +
    + {{if .Attachments}} + {{template "repo/issue/view_content/attachments" dict "ctxData" $ "Attachments" .Attachments "Content" .RenderedContent}} + {{end}} +
    + {{$reactions := .Reactions.GroupByType}} + {{if $reactions}} + {{template "repo/issue/view_content/reactions" dict "ctxData" $ "ActionURL" (printf "%s/comments/%d/reactions" $.RepoLink .ID) "Reactions" $reactions}} + {{end}} +
    +
    + {{else if eq .Type 1}} +
    + {{svg "octicon-dot-fill"}} + {{template "shared/user/avatarlink" dict "Context" $.Context "user" .Poster}} + + {{template "shared/user/authorlink" .Poster}} + {{if .Issue.IsPull}} + {{$.locale.Tr "repo.pulls.reopened_at" .EventTag $createdStr | Safe}} + {{else}} + {{$.locale.Tr "repo.issues.reopened_at" .EventTag $createdStr | Safe}} + {{end}} + +
    + {{else if eq .Type 2}} +
    + {{svg "octicon-circle-slash"}} + {{template "shared/user/avatarlink" dict "Context" $.Context "user" .Poster}} + + {{template "shared/user/authorlink" .Poster}} + {{if .Issue.IsPull}} + {{$.locale.Tr "repo.pulls.closed_at" .EventTag $createdStr | Safe}} + {{else}} + {{$.locale.Tr "repo.issues.closed_at" .EventTag $createdStr | Safe}} + {{end}} + +
    + {{else if eq .Type 28}} +
    + {{svg "octicon-git-merge"}} + {{template "shared/user/avatarlink" dict "Context" $.Context "user" .Poster}} + + {{template "shared/user/authorlink" .Poster}} + {{$link := printf "%s/commit/%s" $.Repository.Link ($.Issue.PullRequest.MergedCommitID|PathEscape)}} + {{if eq $.Issue.PullRequest.Status 3}} + {{$.locale.Tr "repo.issues.comment_manually_pull_merged_at" (printf "%[2]s" ($link|Escape) (ShortSha $.Issue.PullRequest.MergedCommitID)) (printf "%[1]s" ($.BaseTarget|Escape)) $createdStr | Safe}} + {{else}} + {{$.locale.Tr "repo.issues.comment_pull_merged_at" (printf "%[2]s" ($link|Escape) (ShortSha $.Issue.PullRequest.MergedCommitID)) (printf "%[1]s" ($.BaseTarget|Escape)) $createdStr | Safe}} + {{end}} + +
    + {{else if eq .Type 3 5 6}} + {{$refFrom:= ""}} + {{if ne .RefRepoID .Issue.RepoID}} + {{$refFrom = $.locale.Tr "repo.issues.ref_from" (.RefRepo.FullName|Escape)}} + {{end}} + {{$refTr := "repo.issues.ref_issue_from"}} + {{if .Issue.IsPull}} + {{$refTr = "repo.issues.ref_pull_from"}} + {{else if eq .RefAction 1}} + {{$refTr = "repo.issues.ref_closing_from"}} + {{else if eq .RefAction 2}} + {{$refTr = "repo.issues.ref_reopening_from"}} + {{end}} + {{$createdStr:= TimeSinceUnix .CreatedUnix $.locale}} +
    + {{svg "octicon-bookmark"}} + {{template "shared/user/avatarlink" dict "Context" $.Context "user" .Poster}} + {{if eq .RefAction 3}}{{end}} + + {{template "shared/user/authorlink" .Poster}} + {{$.locale.Tr $refTr (.EventTag|Escape) $createdStr (.RefCommentLink|Escape) $refFrom | Safe}} + + {{if eq .RefAction 3}}{{end}} + + +
    + {{else if eq .Type 4}} +
    + {{svg "octicon-bookmark"}} + {{template "shared/user/avatarlink" dict "Context" $.Context "user" .Poster}} + + {{template "shared/user/authorlink" .Poster}} + {{$.locale.Tr "repo.issues.commit_ref_at" .EventTag $createdStr | Safe}} + +
    + {{svg "octicon-git-commit"}} + {{.Content | Str2html}} +
    +
    + {{else if eq .Type 7}} + {{if or .AddedLabels .RemovedLabels}} +
    + {{svg "octicon-tag"}} + {{template "shared/user/avatarlink" dict "Context" $.Context "user" .Poster}} + + {{template "shared/user/authorlink" .Poster}} + {{if and .AddedLabels (not .RemovedLabels)}} + {{$.locale.TrN (len .AddedLabels) "repo.issues.add_label" "repo.issues.add_labels" (RenderLabels $.Context .AddedLabels $.RepoLink) $createdStr | Safe}} + {{else if and (not .AddedLabels) .RemovedLabels}} + {{$.locale.TrN (len .RemovedLabels) "repo.issues.remove_label" "repo.issues.remove_labels" (RenderLabels $.Context .RemovedLabels $.RepoLink) $createdStr | Safe}} + {{else}} + {{$.locale.Tr "repo.issues.add_remove_labels" (RenderLabels $.Context .AddedLabels $.RepoLink) (RenderLabels $.Context .RemovedLabels $.RepoLink) $createdStr | Safe}} + {{end}} + +
    + {{end}} + {{else if eq .Type 8}} +
    + {{svg "octicon-milestone"}} + {{template "shared/user/avatarlink" dict "Context" $.Context "user" .Poster}} + + {{template "shared/user/authorlink" .Poster}} + {{if gt .OldMilestoneID 0}}{{if gt .MilestoneID 0}}{{$.locale.Tr "repo.issues.change_milestone_at" (.OldMilestone.Name|Escape) (.Milestone.Name|Escape) $createdStr | Safe}}{{else}}{{$.locale.Tr "repo.issues.remove_milestone_at" (.OldMilestone.Name|Escape) $createdStr | Safe}}{{end}}{{else if gt .MilestoneID 0}}{{$.locale.Tr "repo.issues.add_milestone_at" (.Milestone.Name|Escape) $createdStr | Safe}}{{end}} + +
    + {{else if eq .Type 9}} +
    + {{svg "octicon-person"}} + {{if gt .AssigneeID 0}} + {{if .RemovedAssignee}} + {{template "shared/user/avatarlink" dict "Context" $.Context "user" .Assignee}} + + {{template "shared/user/authorlink" .Assignee}} + {{if eq .Poster.ID .Assignee.ID}} + {{$.locale.Tr "repo.issues.remove_self_assignment" $createdStr | Safe}} + {{else}} + {{$.locale.Tr "repo.issues.remove_assignee_at" (.Poster.GetDisplayName|Escape) $createdStr | Safe}} + {{end}} + + {{else}} + {{template "shared/user/avatarlink" dict "Context" $.Context "user" .Assignee}} + + {{template "shared/user/authorlink" .Assignee}} + {{if eq .Poster.ID .AssigneeID}} + {{$.locale.Tr "repo.issues.self_assign_at" $createdStr | Safe}} + {{else}} + {{$.locale.Tr "repo.issues.add_assignee_at" (.Poster.GetDisplayName|Escape) $createdStr | Safe}} + {{end}} + + {{end}} + {{end}} +
    + {{else if eq .Type 10}} +
    + {{svg "octicon-pencil"}} + {{template "shared/user/avatarlink" dict "Context" $.Context "user" .Poster}} + + {{template "shared/user/authorlink" .Poster}} + {{$.locale.Tr "repo.issues.change_title_at" (.OldTitle|RenderEmoji $.Context) (.NewTitle|RenderEmoji $.Context) $createdStr | Safe}} + +
    + {{else if eq .Type 11}} +
    + {{svg "octicon-git-branch"}} + {{template "shared/user/avatarlink" dict "Context" $.Context "user" .Poster}} + + {{template "shared/user/authorlink" .Poster}} + {{$.locale.Tr "repo.issues.delete_branch_at" (.OldRef|Escape) $createdStr | Safe}} + +
    + {{else if eq .Type 12}} +
    + {{svg "octicon-clock"}} + {{template "shared/user/avatarlink" dict "Context" $.Context "user" .Poster}} + + {{template "shared/user/authorlink" .Poster}} + {{$.locale.Tr "repo.issues.start_tracking_history" $createdStr | Safe}} + +
    + {{else if eq .Type 13}} +
    + {{svg "octicon-clock"}} + {{template "shared/user/avatarlink" dict "Context" $.Context "user" .Poster}} + + {{template "shared/user/authorlink" .Poster}} + {{$.locale.Tr "repo.issues.stop_tracking_history" $createdStr | Safe}} + + {{template "repo/issue/view_content/comments_delete_time" dict "ctxData" $ "comment" .}} +
    + {{svg "octicon-clock"}} + {{.Content}} +
    +
    + {{else if eq .Type 14}} +
    + {{svg "octicon-clock"}} + {{template "shared/user/avatarlink" dict "Context" $.Context "user" .Poster}} + + {{template "shared/user/authorlink" .Poster}} + {{$.locale.Tr "repo.issues.add_time_history" $createdStr | Safe}} + + {{template "repo/issue/view_content/comments_delete_time" dict "ctxData" $ "comment" .}} +
    + {{svg "octicon-clock"}} + {{.Content}} +
    +
    + {{else if eq .Type 15}} +
    + {{svg "octicon-clock"}} + {{template "shared/user/avatarlink" dict "Context" $.Context "user" .Poster}} + + {{template "shared/user/authorlink" .Poster}} + {{$.locale.Tr "repo.issues.cancel_tracking_history" $createdStr | Safe}} + +
    + {{else if eq .Type 16}} +
    + {{svg "octicon-clock"}} + {{template "shared/user/avatarlink" dict "Context" $.Context "user" .Poster}} + + {{template "shared/user/authorlink" .Poster}} + {{$.locale.Tr "repo.issues.due_date_added" (DateTime "long" .Content) $createdStr | Safe}} + +
    + {{else if eq .Type 17}} +
    + {{svg "octicon-clock"}} + {{template "shared/user/avatarlink" dict "Context" $.Context "user" .Poster}} + + {{template "shared/user/authorlink" .Poster}} + {{$parsedDeadline := StringUtils.Split .Content "|"}} + {{if eq (len $parsedDeadline) 2}} + {{$from := DateTime "long" (index $parsedDeadline 1)}} + {{$to := DateTime "long" (index $parsedDeadline 0)}} + {{$.locale.Tr "repo.issues.due_date_modified" $to $from $createdStr | Safe}} + {{end}} + +
    + {{else if eq .Type 18}} +
    + {{svg "octicon-clock"}} + {{template "shared/user/avatarlink" dict "Context" $.Context "user" .Poster}} + + {{template "shared/user/authorlink" .Poster}} + {{$.locale.Tr "repo.issues.due_date_remove" (DateTime "long" .Content) $createdStr | Safe}} + +
    + {{else if eq .Type 19}} +
    + {{svg "octicon-package-dependents"}} + {{template "shared/user/avatarlink" dict "Context" $.Context "user" .Poster}} + + {{template "shared/user/authorlink" .Poster}} + {{$.locale.Tr "repo.issues.dependency.added_dependency" $createdStr | Safe}} + + {{if .DependentIssue}} + + {{end}} +
    + {{else if eq .Type 20}} +
    + {{svg "octicon-package-dependents"}} + {{template "shared/user/avatarlink" dict "Context" $.Context "user" .Poster}} + + {{template "shared/user/authorlink" .Poster}} + {{$.locale.Tr "repo.issues.dependency.removed_dependency" $createdStr | Safe}} + + {{if .DependentIssue}} + + {{end}} +
    + {{else if eq .Type 22}} +
    +
    + {{if .OriginalAuthor}} + {{else}} + {{/* Some timeline avatars need a offset to correctly allign with their speech + bubble. The condition depends on review type and for positive reviews whether + there is a comment element or not */}} + + {{avatar $.Context .Poster 40}} + + {{end}} + {{svg (printf "octicon-%s" .Review.Type.Icon)}} + + {{if .OriginalAuthor}} + + {{svg (MigrationIcon $.Repository.GetOriginalURLHostname)}} + {{.OriginalAuthor}} + + {{if $.Repository.OriginalURL}} + ({{$.locale.Tr "repo.migrated_from" ($.Repository.OriginalURL|Escape) ($.Repository.GetOriginalURLHostname|Escape) | Safe}}){{end}} + {{else}} + {{template "shared/user/authorlink" .Poster}} + {{end}} + + {{if eq .Review.Type 1}} + {{$.locale.Tr "repo.issues.review.approve" $createdStr | Safe}} + {{else if eq .Review.Type 2}} + {{$.locale.Tr "repo.issues.review.comment" $createdStr | Safe}} + {{else if eq .Review.Type 3}} + {{$.locale.Tr "repo.issues.review.reject" $createdStr | Safe}} + {{else}} + {{$.locale.Tr "repo.issues.review.comment" $createdStr | Safe}} + {{end}} + {{if .Review.Dismissed}} +
    {{$.locale.Tr "repo.issues.review.dismissed_label"}}
    + {{end}} +
    +
    + {{if or .Content .Attachments}} +
    +
    +
    +
    + {{if gt .Poster.ID 0}} + + {{avatar $.Context .Poster 24}} + + {{end}} + + {{if .OriginalAuthor}} + + {{svg (MigrationIcon $.Repository.GetOriginalURLHostname)}} + {{.OriginalAuthor}} + + {{if $.Repository.OriginalURL}} + ({{$.locale.Tr "repo.migrated_from" ($.Repository.OriginalURL|Escape) ($.Repository.GetOriginalURLHostname|Escape) | Safe}}){{end}} + {{else}} + {{template "shared/user/authorlink" .Poster}} + {{end}} + + {{$.locale.Tr "repo.issues.review.left_comment" | Safe}} + +
    +
    + {{if (.ShowRole.HasRole "Poster")}} +
    + {{$.locale.Tr "repo.issues.poster"}} +
    + {{end}} + {{if (.ShowRole.HasRole "Writer")}} +
    + {{$.locale.Tr "repo.issues.collaborator"}} +
    + {{end}} + {{if (.ShowRole.HasRole "Owner")}} +
    + {{$.locale.Tr "repo.issues.owner"}} +
    + {{end}} + {{if not $.Repository.IsArchived}} + {{template "repo/issue/view_content/add_reaction" dict "ctxData" $ "ActionURL" (printf "%s/comments/%d/reactions" $.RepoLink .ID)}} + {{template "repo/issue/view_content/context_menu" dict "ctxData" $ "item" . "delete" false "issue" true "diff" false "IsCommentPoster" (and $.IsSigned (eq $.SignedUserID .PosterID))}} + {{end}} +
    +
    +
    +
    + {{if .RenderedContent}} + {{.RenderedContent|Str2html}} + {{else}} + {{$.locale.Tr "repo.issues.no_content"}} + {{end}} +
    +
    {{.Content}}
    +
    + {{if .Attachments}} + {{template "repo/issue/view_content/attachments" dict "ctxData" $ "Attachments" .Attachments "Content" .RenderedContent}} + {{end}} +
    + {{$reactions := .Reactions.GroupByType}} + {{if $reactions}} + {{template "repo/issue/view_content/reactions" dict "ctxData" $ "ActionURL" (printf "%s/comments/%d/reactions" $.RepoLink .ID) "Reactions" $reactions}} + {{end}} +
    +
    + {{end}} + + {{if .Review.CodeComments}} +
    + {{range $filename, $lines := .Review.CodeComments}} + {{range $line, $comms := $lines}} +
    +
    + {{$invalid := (index $comms 0).Invalidated}} + {{$resolved := (index $comms 0).IsResolved}} + {{$resolveDoer := (index $comms 0).ResolveDoer}} + {{$isNotPending := (not (eq (index $comms 0).Review.Type 0))}} +
    + {{$filename}} + {{if $invalid}} + + {{$.locale.Tr "repo.issues.review.outdated"}} + + {{end}} +
    +
    + {{if or $invalid $resolved}} + + + {{end}} +
    +
    + {{$diff := (CommentMustAsDiff (index $comms 0))}} + {{if $diff}} + {{$file := (index $diff.Files 0)}} +
    +
    +
    + + + {{template "repo/diff/section_unified" dict "file" $file "root" $}} + +
    +
    +
    +
    + {{end}} +
    +
    + {{range $comms}} + {{$createdSubStr:= TimeSinceUnix .CreatedUnix $.locale}} +
    +
    +
    +
    + {{if not .OriginalAuthor}} + + {{avatar $.Context .Poster 20}} + + {{end}} + + {{if .OriginalAuthor}} + + {{svg (MigrationIcon $.Repository.GetOriginalURLHostname)}} + {{.OriginalAuthor}} + + {{if $.Repository.OriginalURL}} + ({{$.locale.Tr "repo.migrated_from" ($.Repository.OriginalURL|Escape) ($.Repository.GetOriginalURLHostname|Escape) | Safe}}){{end}} + {{else}} + {{template "shared/user/authorlink" .Poster}} + {{end}} + {{$.locale.Tr "repo.issues.commented_at" (.HashTag|Escape) $createdSubStr | Safe}} + +
    +
    + {{if (.ShowRole.HasRole "Poster")}} +
    + {{$.locale.Tr "repo.issues.poster"}} +
    + {{end}} + {{if (.ShowRole.HasRole "Writer")}} +
    + {{$.locale.Tr "repo.issues.collaborator"}} +
    + {{end}} + {{if (.ShowRole.HasRole "Owner")}} +
    + {{$.locale.Tr "repo.issues.owner"}} +
    + {{end}} + {{if not $.Repository.IsArchived}} + {{template "repo/issue/view_content/add_reaction" dict "ctxData" $ "ActionURL" (printf "%s/comments/%d/reactions" $.RepoLink .ID)}} + {{template "repo/issue/view_content/context_menu" dict "ctxData" $ "item" . "delete" true "issue" true "diff" true "IsCommentPoster" (and $.IsSigned (eq $.SignedUserID .PosterID))}} + {{end}} +
    +
    +
    +
    + {{if .RenderedContent}} + {{.RenderedContent|Str2html}} + {{else}} + {{$.locale.Tr "repo.issues.no_content"}} + {{end}} +
    +
    {{.Content}}
    +
    +
    + {{$reactions := .Reactions.GroupByType}} + {{if $reactions}} + {{template "repo/issue/view_content/reactions" dict "ctxData" $ "ActionURL" (printf "%s/comments/%d/reactions" $.RepoLink .ID) "Reactions" $reactions}} + {{end}} +
    +
    + {{end}} +
    +
    +
    + {{if $resolved}} +
    + {{svg "octicon-check" 16 "gt-mr-2"}} + {{$resolveDoer.Name}} {{$.locale.Tr "repo.issues.review.resolved_by"}} +
    + {{end}} +
    +
    + {{if and $.CanMarkConversation $isNotPending}} + + {{end}} + {{if and $.SignedUserID (not $.Repository.IsArchived)}} + + {{end}} +
    +
    + {{template "repo/diff/comment_form_datahandler" dict "hidden" true "reply" (index $comms 0).ReviewID "root" $ "comment" (index $comms 0)}} +
    +
    + {{end}} + {{end}} +
    + {{end}} +
    + {{else if eq .Type 23}} +
    + {{svg "octicon-lock"}} + {{template "shared/user/avatarlink" dict "Context" $.Context "user" .Poster}} + {{if .Content}} + + {{template "shared/user/authorlink" .Poster}} + {{$.locale.Tr "repo.issues.lock_with_reason" .Content $createdStr | Safe}} + + {{else}} + + {{template "shared/user/authorlink" .Poster}} + {{$.locale.Tr "repo.issues.lock_no_reason" $createdStr | Safe}} + + {{end}} +
    + {{else if eq .Type 24}} +
    + {{svg "octicon-key"}} + {{template "shared/user/avatarlink" dict "Context" $.Context "user" .Poster}} + + {{template "shared/user/authorlink" .Poster}} + {{$.locale.Tr "repo.issues.unlock_comment" $createdStr | Safe}} + +
    + {{else if eq .Type 25}} +
    + {{svg "octicon-git-branch"}} + {{template "shared/user/avatarlink" dict "Context" $.Context "user" .Poster}} + + {{.Poster.Name}} + {{$.locale.Tr "repo.pulls.change_target_branch_at" (.OldRef|Escape) (.NewRef|Escape) $createdStr | Safe}} + +
    + {{else if eq .Type 26}} +
    + {{svg "octicon-clock"}} + {{template "shared/user/avatarlink" dict "Context" $.Context "user" .Poster}} + + {{template "shared/user/authorlink" .Poster}} + + {{$.locale.Tr "repo.issues.del_time_history" $createdStr | Safe}} + +
    + {{svg "octicon-clock"}} + {{.Content}} +
    +
    + {{else if eq .Type 27}} +
    + {{svg "octicon-eye"}} + {{template "shared/user/avatarlink" dict "Context" $.Context "user" .Poster}} + + {{template "shared/user/authorlink" .Poster}} + {{if (gt .AssigneeID 0)}} + {{if .RemovedAssignee}} + {{if eq .PosterID .AssigneeID}} + {{$.locale.Tr "repo.issues.review.remove_review_request_self" $createdStr | Safe}} + {{else}} + {{$.locale.Tr "repo.issues.review.remove_review_request" (.Assignee.GetDisplayName|Escape) $createdStr | Safe}} + {{end}} + {{else}} + {{$.locale.Tr "repo.issues.review.add_review_request" (.Assignee.GetDisplayName|Escape) $createdStr | Safe}} + {{end}} + {{else}} + + {{$teamName := "Ghost Team"}} + {{if .AssigneeTeam}} + {{$teamName = .AssigneeTeam.Name}} + {{end}} + {{if .RemovedAssignee}} + {{$.locale.Tr "repo.issues.review.remove_review_request" ($teamName|Escape) $createdStr | Safe}} + {{else}} + {{$.locale.Tr "repo.issues.review.add_review_request" ($teamName|Escape) $createdStr | Safe}} + {{end}} + {{end}} + +
    + {{else if and (eq .Type 29) (or (gt .CommitsNum 0) .IsForcePush)}} + + {{if and .Issue.IsClosed (gt .ID $.LatestCloseCommentID)}} + {{continue}} + {{end}} +
    + {{svg "octicon-repo-push"}} + + {{template "shared/user/authorlink" .Poster}} + {{if .IsForcePush}} + {{$.locale.Tr "repo.issues.force_push_codes" ($.Issue.PullRequest.HeadBranch|Escape) (ShortSha .OldCommit) (($.Issue.Repo.CommitLink .OldCommit)|Escape) (ShortSha .NewCommit) (($.Issue.Repo.CommitLink .NewCommit)|Escape) $createdStr | Safe}} + {{else}} + {{$.locale.TrN (len .Commits) "repo.issues.push_commit_1" "repo.issues.push_commits_n" (len .Commits) $createdStr | Safe}} + {{end}} + + {{if and .IsForcePush $.Issue.PullRequest.BaseRepo.Name}} + + {{$.locale.Tr "repo.issues.force_push_compare"}} + + {{end}} +
    + {{if not .IsForcePush}} + {{template "repo/commits_list_small" dict "comment" . "root" $}} + {{end}} + {{else if eq .Type 30}} + {{if not $.UnitProjectsGlobalDisabled}} +
    + {{svg "octicon-project"}} + {{template "shared/user/avatarlink" dict "Context" $.Context "user" .Poster}} + + {{template "shared/user/authorlink" .Poster}} + {{$oldProjectDisplayHtml := "Unknown Project"}} + {{if .OldProject}} + {{$trKey := printf "projects.type-%d.display_name" .OldProject.Type}} + {{$oldProjectDisplayHtml = printf `%s` ($.locale.Tr $trKey | Escape) (.OldProject.Title | Escape)}} + {{end}} + {{$newProjectDisplayHtml := "Unknown Project"}} + {{if .Project}} + {{$trKey := printf "projects.type-%d.display_name" .Project.Type}} + {{$newProjectDisplayHtml = printf `%s` ($.locale.Tr $trKey | Escape) (.Project.Title | Escape)}} + {{end}} + {{if and (gt .OldProjectID 0) (gt .ProjectID 0)}} + {{$.locale.Tr "repo.issues.change_project_at" $oldProjectDisplayHtml $newProjectDisplayHtml $createdStr | Safe}} + {{else if gt .OldProjectID 0}} + {{$.locale.Tr "repo.issues.remove_project_at" $oldProjectDisplayHtml $createdStr | Safe}} + {{else if gt .ProjectID 0}} + {{$.locale.Tr "repo.issues.add_project_at" $newProjectDisplayHtml $createdStr | Safe}} + {{end}} + +
    + {{end}} + {{else if eq .Type 32}} +
    +
    + + + + {{svg "octicon-x" 16}} + + {{template "shared/user/authorlink" .Poster}} + {{$reviewerName := ""}} + {{if eq .Review.OriginalAuthor ""}} + {{$reviewerName = .Review.Reviewer.Name}} + {{else}} + {{$reviewerName = .Review.OriginalAuthor}} + {{end}} + {{$.locale.Tr "repo.issues.review.dismissed" $reviewerName $createdStr | Safe}} + +
    + {{if .Content}} +
    +
    +
    + {{if gt .Poster.ID 0}} + + {{avatar $.Context .Poster 24}} + + {{end}} + + {{$.locale.Tr "action.review_dismissed_reason"}} + +
    +
    +
    + {{if .RenderedContent}} + {{.RenderedContent|Str2html}} + {{else}} + {{$.locale.Tr "repo.issues.no_content"}} + {{end}} +
    +
    +
    +
    + {{end}} +
    + {{else if eq .Type 33}} +
    + {{svg "octicon-git-branch"}} + {{template "shared/user/avatarlink" dict "Context" $.Context "user" .Poster}} + + {{template "shared/user/authorlink" .Poster}} + {{if and .OldRef .NewRef}} + {{$.locale.Tr "repo.issues.change_ref_at" (.OldRef|Escape) (.NewRef|Escape) $createdStr | Safe}} + {{else if .OldRef}} + {{$.locale.Tr "repo.issues.remove_ref_at" (.OldRef|Escape) $createdStr | Safe}} + {{else}} + {{$.locale.Tr "repo.issues.add_ref_at" (.NewRef|Escape) $createdStr | Safe}} + {{end}} + +
    + {{else if or (eq .Type 34) (eq .Type 35)}} +
    + {{svg "octicon-git-merge" 16}} + + {{template "shared/user/authorlink" .Poster}} + {{if eq .Type 34}}{{$.locale.Tr "repo.pulls.auto_merge_newly_scheduled_comment" $createdStr | Safe}} + {{else}}{{$.locale.Tr "repo.pulls.auto_merge_canceled_schedule_comment" $createdStr | Safe}}{{end}} + +
    + {{else if or (eq .Type 36) (eq .Type 37)}} +
    + {{svg "octicon-pin" 16}} + {{template "shared/user/avatarlink" dict "Context" $.Context "user" .Poster}} + + {{template "shared/user/authorlink" .Poster}} + {{if eq .Type 36}}{{$.locale.Tr "repo.issues.pin_comment" $createdStr | Safe}} + {{else}}{{$.locale.Tr "repo.issues.unpin_comment" $createdStr | Safe}}{{end}} + +
    + {{end}} + {{end}} +{{end}} diff --git a/src/templates/repo/issue/view_content/comments_delete_time.tmpl b/src/templates/repo/issue/view_content/comments_delete_time.tmpl new file mode 100644 index 0000000..cbfb114 --- /dev/null +++ b/src/templates/repo/issue/view_content/comments_delete_time.tmpl @@ -0,0 +1,18 @@ +{{if .comment.Time}} {{/* compatibility with time comments made before v1.14 */}} + {{if (not .comment.Time.Deleted)}} + {{if (or .ctxData.IsAdmin (and .ctxData.IsSigned (eq .ctxData.SignedUserID .comment.PosterID)))}} + + + + + {{end}} + {{end}} +{{end}} diff --git a/src/templates/repo/issue/view_content/context_menu.tmpl b/src/templates/repo/issue/view_content/context_menu.tmpl new file mode 100644 index 0000000..296668c --- /dev/null +++ b/src/templates/repo/issue/view_content/context_menu.tmpl @@ -0,0 +1,27 @@ +{{if .ctxData.IsSigned}} + +{{end}} diff --git a/src/templates/repo/issue/view_content/pull.tmpl b/src/templates/repo/issue/view_content/pull.tmpl new file mode 100644 index 0000000..fd395c0 --- /dev/null +++ b/src/templates/repo/issue/view_content/pull.tmpl @@ -0,0 +1,381 @@ +{{if and .Issue.PullRequest.HasMerged (not .IsPullBranchDeletable)}} +{{/* Then the merge box will not be displayed because this page already contains enough information */}} +{{else}} +
    + {{svg "octicon-git-merge" 40}} +
    + {{template "repo/pulls/status" .}} + {{$showGeneralMergeForm := false}} +
    + {{if .Issue.PullRequest.HasMerged}} + {{if .IsPullBranchDeletable}} +
    +
    +

    + {{$.locale.Tr "repo.pulls.merged_success"}} +

    + +
    +
    + +
    +
    + {{end}} + {{else if .Issue.IsClosed}} +
    +
    +

    {{$.locale.Tr "repo.pulls.closed"}}

    + +
    + {{if and .IsPullBranchDeletable (not .IsPullRequestBroken)}} +
    + +
    + {{end}} +
    + {{else if .IsPullFilesConflicted}} +
    + {{svg "octicon-x"}} + {{$.locale.Tr "repo.pulls.files_conflicted"}} +
    +
      + {{range .ConflictedFiles}} +
    • {{.}}
    • + {{end}} +
    + {{else if .IsPullRequestBroken}} +
    + {{svg "octicon-x"}} + {{$.locale.Tr "repo.pulls.data_broken"}} +
    + {{else if .IsPullWorkInProgress}} +
    +
    + {{svg "octicon-x"}} + {{$.locale.Tr "repo.pulls.cannot_merge_work_in_progress"}} +
    + {{if or .HasIssuesOrPullsWritePermission .IsIssuePoster}} + + {{end}} +
    + {{template "repo/issue/view_content/update_branch_by_merge" $}} + {{else if .Issue.PullRequest.IsChecking}} +
    + {{svg "octicon-sync"}} + {{$.locale.Tr "repo.pulls.is_checking"}} +
    + {{else if .Issue.PullRequest.IsAncestor}} +
    + {{svg "octicon-alert"}} + {{$.locale.Tr "repo.pulls.is_ancestor"}} +
    + {{else if or .Issue.PullRequest.CanAutoMerge .Issue.PullRequest.IsEmpty}} + {{if .IsBlockedByApprovals}} +
    + {{svg "octicon-x"}} + {{$.locale.Tr "repo.pulls.blocked_by_approvals" .GrantedApprovals .ProtectedBranch.RequiredApprovals}} +
    + {{else if .IsBlockedByRejection}} +
    + {{svg "octicon-x"}} + {{$.locale.Tr "repo.pulls.blocked_by_rejection"}} +
    + {{else if .IsBlockedByOfficialReviewRequests}} +
    + {{svg "octicon-x"}} + {{$.locale.Tr "repo.pulls.blocked_by_official_review_requests"}} +
    + {{else if .IsBlockedByOutdatedBranch}} +
    + {{svg "octicon-x"}} + {{$.locale.Tr "repo.pulls.blocked_by_outdated_branch"}} +
    + {{else if .IsBlockedByChangedProtectedFiles}} +
    + {{svg "octicon-x"}} + {{$.locale.TrN $.ChangedProtectedFilesNum "repo.pulls.blocked_by_changed_protected_files_1" "repo.pulls.blocked_by_changed_protected_files_n" | Safe}} +
    +
      + {{range .ChangedProtectedFiles}} +
    • {{.}}
    • + {{end}} +
    + {{else if and .EnableStatusCheck (or .RequiredStatusCheckState.IsError .RequiredStatusCheckState.IsFailure)}} +
    + {{svg "octicon-x"}} + {{$.locale.Tr "repo.pulls.required_status_check_failed"}} +
    + {{else if and .EnableStatusCheck (not .RequiredStatusCheckState.IsSuccess)}} +
    + {{svg "octicon-x"}} + {{$.locale.Tr "repo.pulls.required_status_check_missing"}} +
    + {{else if and .AllowMerge .RequireSigned (not .WillSign)}} +
    + {{svg "octicon-x"}} + {{$.locale.Tr "repo.pulls.require_signed_wont_sign"}} +
    +
    + {{svg "octicon-unlock"}} + {{$.locale.Tr (printf "repo.signing.wont_sign.%s" .WontSignReason)}} +
    + {{end}} + + {{$notAllOverridableChecksOk := or .IsBlockedByApprovals .IsBlockedByRejection .IsBlockedByOfficialReviewRequests .IsBlockedByOutdatedBranch .IsBlockedByChangedProtectedFiles (and .EnableStatusCheck (not .RequiredStatusCheckState.IsSuccess))}} + + {{/* admin can merge without checks, writer can merge when checks succeed */}} + {{$canMergeNow := and (or $.IsRepoAdmin (not $notAllOverridableChecksOk)) (or (not .AllowMerge) (not .RequireSigned) .WillSign)}} + {{/* admin and writer both can make an auto merge schedule */}} + + {{if $canMergeNow}} + {{if $notAllOverridableChecksOk}} +
    + {{svg "octicon-dot-fill"}} + {{$.locale.Tr "repo.pulls.required_status_check_administrator"}} +
    + {{else}} +
    + {{svg "octicon-check"}} + {{$.locale.Tr "repo.pulls.can_auto_merge_desc"}} +
    + {{end}} + {{if .WillSign}} +
    + {{svg "octicon-lock" 16 "text green"}} + {{$.locale.Tr "repo.signing.will_sign" .SigningKey}} +
    + {{else if .IsSigned}} +
    + {{svg "octicon-unlock"}} + {{$.locale.Tr (printf "repo.signing.wont_sign.%s" .WontSignReason)}} +
    + {{end}} + {{end}} + {{template "repo/issue/view_content/update_branch_by_merge" $}} + {{if .Issue.PullRequest.IsEmpty}} +
    + +
    + {{svg "octicon-alert"}} + {{$.locale.Tr "repo.pulls.is_empty"}} +
    + {{end}} + + {{if .AllowMerge}} {{/* user is allowed to merge */}} + {{$prUnit := .Repository.MustGetUnit $.Context $.UnitTypePullRequests}} + {{$approvers := .Issue.PullRequest.GetApprovers}} + {{if or $prUnit.PullRequestsConfig.AllowMerge $prUnit.PullRequestsConfig.AllowRebase $prUnit.PullRequestsConfig.AllowRebaseMerge $prUnit.PullRequestsConfig.AllowSquash}} + {{$hasPendingPullRequestMergeTip := ""}} + {{if .HasPendingPullRequestMerge}} + {{$createdPRMergeStr := TimeSinceUnix .PendingPullRequestMerge.CreatedUnix $.locale}} + {{$hasPendingPullRequestMergeTip = $.locale.Tr "repo.pulls.auto_merge_has_pending_schedule" .PendingPullRequestMerge.Doer.Name $createdPRMergeStr}} + {{end}} +
    + + + {{$showGeneralMergeForm = true}} +
    + {{else}} + {{/* no merge style was set in repo setting: not or ($prUnit.PullRequestsConfig.AllowMerge ...) */}} +
    +
    + {{svg "octicon-x"}} + {{$.locale.Tr "repo.pulls.no_merge_desc"}} +
    +
    + {{svg "octicon-info"}} + {{$.locale.Tr "repo.pulls.no_merge_helper"}} +
    + {{end}} {{/* end if the repo was set to use any merge style */}} + {{else}} + {{/* user is not allowed to merge */}} +
    +
    + {{svg "octicon-info"}} + {{$.locale.Tr "repo.pulls.no_merge_access"}} +
    + {{end}} {{/* end if user is allowed to merge or not */}} + {{else}} + {{/* Merge conflict without specific file. Suggest manual merge, only if all reviews and status checks OK. */}} + {{if .IsBlockedByApprovals}} +
    + {{svg "octicon-x"}} + {{$.locale.Tr "repo.pulls.blocked_by_approvals" .GrantedApprovals .ProtectedBranch.RequiredApprovals}} +
    + {{else if .IsBlockedByRejection}} +
    + {{svg "octicon-x"}} + {{$.locale.Tr "repo.pulls.blocked_by_rejection"}} +
    + {{else if .IsBlockedByOfficialReviewRequests}} +
    + {{svg "octicon-x"}} + {{$.locale.Tr "repo.pulls.blocked_by_official_review_requests"}} +
    + {{else if .IsBlockedByOutdatedBranch}} +
    + {{svg "octicon-x"}} + {{$.locale.Tr "repo.pulls.blocked_by_outdated_branch"}} +
    + {{else if .IsBlockedByChangedProtectedFiles}} +
    + {{svg "octicon-x"}} + {{$.locale.TrN $.ChangedProtectedFilesNum "repo.pulls.blocked_by_changed_protected_files_1" "repo.pulls.blocked_by_changed_protected_files_n" | Safe}} +
    +
      + {{range .ChangedProtectedFiles}} +
    • {{.}}
    • + {{end}} +
    + {{else if and .EnableStatusCheck (not .RequiredStatusCheckState.IsSuccess)}} +
    + {{svg "octicon-x"}} + {{$.locale.Tr "repo.pulls.required_status_check_failed"}} +
    + {{else if and .RequireSigned (not .WillSign)}} +
    + {{svg "octicon-x"}} + {{$.locale.Tr "repo.pulls.require_signed_wont_sign"}} +
    + {{else}} +
    + {{svg "octicon-x"}} + {{$.locale.Tr "repo.pulls.cannot_auto_merge_desc"}} +
    +
    + {{svg "octicon-info"}} + {{$.locale.Tr "repo.pulls.cannot_auto_merge_helper"}} +
    + {{end}} + {{end}}{{/* end if: pull request status */}} + + {{/* + Manually Merged is not a well-known feature, it helps repo admins to mark a non-mergeable PR (already merged, conflicted) as merged + To test it: + * Enable "Manually Merged" feature in the Repository Settings + * Create a pull request, either: + * - Merge the pull request branch locally and push the merged commit to Gitea + * - Make some conflicts between the base branch and the pull request branch + * Then the Manually Merged form will be shown to repo admin users + */}} + {{if and $.StillCanManualMerge (not $showGeneralMergeForm)}} +
    +
    +
    + {{.CsrfTokenHtml}} +
    + +
    + +
    +
    + {{end}} + + {{if and .ShowMergeInstructions .Issue.PullRequest.HeadRepo (not .Issue.PullRequest.HasMerged) (not .Issue.IsClosed)}} + {{template "repo/issue/view_content/pull_merge_instruction" (dict "locale" .locale "Issue" .Issue)}} + {{end}} +
    +
    +
    +{{end}} diff --git a/src/templates/repo/issue/view_content/pull_merge_instruction.tmpl b/src/templates/repo/issue/view_content/pull_merge_instruction.tmpl new file mode 100644 index 0000000..78deed9 --- /dev/null +++ b/src/templates/repo/issue/view_content/pull_merge_instruction.tmpl @@ -0,0 +1,19 @@ +
    +
    {{$.locale.Tr "repo.pulls.merge_instruction_hint" | Safe}}
    +
    +

    {{$.locale.Tr "step1"}}

    {{$.locale.Tr "repo.pulls.merge_instruction_step1_desc"}}
    +
    + {{if eq $.Issue.PullRequest.Flow 0}} +
    git checkout -b {{if ne $.Issue.PullRequest.HeadRepo.ID $.Issue.PullRequest.BaseRepo.ID}}{{$.Issue.PullRequest.HeadRepo.OwnerName}}-{{end}}{{$.Issue.PullRequest.HeadBranch}} {{$.Issue.PullRequest.BaseBranch}}
    +
    git pull {{if ne $.Issue.PullRequest.HeadRepo.ID $.Issue.PullRequest.BaseRepo.ID}}{{else}}origin{{end}} {{$.Issue.PullRequest.HeadBranch}}
    + {{else}} +
    git fetch origin {{$.Issue.PullRequest.GetGitRefName}}:{{$.Issue.PullRequest.HeadBranch}}
    + {{end}} +
    +

    {{$.locale.Tr "step2"}}

    {{$.locale.Tr "repo.pulls.merge_instruction_step2_desc"}}
    +
    +
    git checkout {{$.Issue.PullRequest.BaseBranch}}
    +
    git merge --no-ff {{if ne $.Issue.PullRequest.HeadRepo.ID $.Issue.PullRequest.BaseRepo.ID}}{{$.Issue.PullRequest.HeadRepo.OwnerName}}-{{end}}{{$.Issue.PullRequest.HeadBranch}}
    +
    git push origin {{$.Issue.PullRequest.BaseBranch}}
    +
    +
    diff --git a/src/templates/repo/issue/view_content/reactions.tmpl b/src/templates/repo/issue/view_content/reactions.tmpl new file mode 100644 index 0000000..0220278 --- /dev/null +++ b/src/templates/repo/issue/view_content/reactions.tmpl @@ -0,0 +1,15 @@ +
    +{{range $key, $value := .Reactions}} + {{$hasReacted := $value.HasUser $.ctxData.SignedUserID}} + + {{ReactionToEmoji $key}} + {{len $value}} + +{{end}} +{{if AllowedReactions}} + {{template "repo/issue/view_content/add_reaction" dict "ctxData" $.ctxData "ActionURL" .ActionURL}} +{{end}} +
    diff --git a/src/templates/repo/issue/view_content/reference_issue_dialog.tmpl b/src/templates/repo/issue/view_content/reference_issue_dialog.tmpl new file mode 100644 index 0000000..1bb6366 --- /dev/null +++ b/src/templates/repo/issue/view_content/reference_issue_dialog.tmpl @@ -0,0 +1,30 @@ + diff --git a/src/templates/repo/issue/view_content/sidebar.tmpl b/src/templates/repo/issue/view_content/sidebar.tmpl new file mode 100644 index 0000000..2f32639 --- /dev/null +++ b/src/templates/repo/issue/view_content/sidebar.tmpl @@ -0,0 +1,689 @@ +
    + {{template "repo/issue/branch_selector_field" .}} + {{if .Issue.IsPull}} + + + +
    + {{.locale.Tr "repo.issues.new.no_reviewers"}} +
    + {{range .PullReviewers}} +
    +
    + {{if .User}} + {{avatar $.Context .User 20 "gt-mr-3"}}{{.User.GetDisplayName}} + {{else if .Team}} + {{svg "octicon-people" 20 "gt-mr-3"}}{{$.Issue.Repo.OwnerName}}/{{.Team.Name}} + {{end}} +
    +
    + {{if (and $.Permission.IsAdmin (or (eq .Review.Type 1) (eq .Review.Type 3)) (not $.Issue.IsClosed))}} + + {{svg "octicon-x" 20}} + + + {{end}} + {{if .Review.Stale}} + + {{svg "octicon-hourglass" 16}} + + {{end}} + {{if .CanChange}} + {{if .Checked}}{{svg "octicon-trash"}}{{else}}{{svg "octicon-sync"}}{{end}} + {{end}} + {{svg (printf "octicon-%s" .Review.Type.Icon) 16 (printf "text %s" (.Review.HTMLTypeColorName))}} +
    +
    + {{end}} + {{range .OriginalReviews}} +
    + +
    + {{svg (printf "octicon-%s" .Type.Icon) 16 (printf "text %s" (.HTMLTypeColorName))}} +
    +
    + {{end}} +
    +
    + {{if and (or .HasIssuesOrPullsWritePermission .IsIssuePoster) (not .HasMerged) (not .Issue.IsClosed) (not .IsPullWorkInProgress)}} + + {{end}} +
    + {{end}} + + {{template "repo/issue/labels/labels_selector_field" .}} + {{template "repo/issue/labels/labels_sidebar" dict "root" $}} + +
    + + +
    + {{.locale.Tr "repo.issues.new.no_milestone"}} + +
    + + {{if .IsProjectsEnabled}} +
    + + +
    + {{.locale.Tr "repo.issues.new.no_projects"}} + +
    + {{end}} + +
    + + + +
    + {{.locale.Tr "repo.issues.new.no_assignees"}} +
    + {{range .Issue.Assignees}} + + {{end}} +
    +
    + +
    + + {{if .Participants}} + {{.locale.Tr "repo.issues.num_participants" .NumParticipants}} +
    + {{range .Participants}} + + {{avatar $.Context . 28 "gt-my-1 gt-mr-2"}} + + {{end}} +
    + {{end}} + + {{if and $.IssueWatch (not .Repository.IsArchived)}} +
    + +
    + {{.locale.Tr "notification.notifications"}} +
    +
    + + {{$.CsrfTokenHtml}} + +
    +
    +
    + {{end}} + {{if .Repository.IsTimetrackerEnabled $.Context}} + {{if and .CanUseTimetracker (not .Repository.IsArchived)}} +
    +
    + {{.locale.Tr "repo.issues.tracker"}} +
    +
    + {{$.CsrfTokenHtml}} +
    +
    + {{$.CsrfTokenHtml}} +
    + {{if $.IsStopwatchRunning}} + + + {{else}} + {{if .HasUserStopwatch}} +
    + {{.locale.Tr "repo.issues.tracking_already_started" (.OtherStopwatchURL|Escape) | Safe}} +
    + {{end}} + + + + {{end}} +
    +
    + {{end}} + {{if gt (len .WorkingUsers) 0}} +
    +
    + {{.locale.Tr "repo.issues.time_spent_from_all_authors" ($.Issue.TotalTrackedTime | Sec2Time) | Safe}} +
    + {{range $user, $trackedtime := .WorkingUsers}} +
    + + {{avatar $.Context $user}} + +
    + {{template "shared/user/authorlink" $user}} +
    + {{$trackedtime}} +
    +
    +
    + {{end}} +
    +
    + {{end}} + {{end}} + +
    + {{.locale.Tr "repo.issues.due_date"}} +
    +
    + {{svg "octicon-x" 16 "close icon"}} + {{.locale.Tr "repo.issues.due_date_invalid"}} +
    + {{if ne .Issue.DeadlineUnix 0}} +

    +

    +
    + {{svg "octicon-calendar" 16 "gt-mr-3"}} + {{DateTime "long" .Issue.DeadlineUnix}} +
    +
    + {{if and .HasIssuesOrPullsWritePermission (not .Repository.IsArchived)}} + {{svg "octicon-pencil" 16 "gt-mr-2"}} + {{svg "octicon-trash"}} + {{end}} +
    +
    +

    + {{else}} +

    {{.locale.Tr "repo.issues.due_date_not_set"}}

    + {{end}} + + {{if and .HasIssuesOrPullsWritePermission (not .Repository.IsArchived)}} +
    +
    + {{$.CsrfTokenHtml}} + + +
    +
    + {{end}} +
    + + {{if .Repository.IsDependenciesEnabled $.Context}} +
    + +
    + {{if (and (not .BlockedByDependencies) (not .BlockedByDependenciesNotPermitted) (not .BlockingDependencies) (not .BlockingDependenciesNotPermitted))}} + {{.locale.Tr "repo.issues.dependency.title"}} +
    +

    + {{if .Issue.IsPull}} + {{.locale.Tr "repo.issues.dependency.pr_no_dependencies"}} + {{else}} + {{.locale.Tr "repo.issues.dependency.issue_no_dependencies"}} + {{end}} +

    + {{end}} + + {{if or .BlockingDependencies .BlockingDependenciesNotPermitted}} + + {{.locale.Tr "repo.issues.dependency.blocks_short"}} + +
    + {{range .BlockingDependencies}} +
    +
    + + #{{.Issue.Index}} {{.Issue.Title | RenderEmoji $.Context}} + +
    + {{.Repository.OwnerName}}/{{.Repository.Name}} +
    +
    +
    + {{if and $.CanCreateIssueDependencies (not $.Repository.IsArchived)}} + + {{svg "octicon-trash" 16}} + + {{end}} +
    +
    + {{end}} + {{if .BlockingDependenciesNotPermitted}} +
    + {{$.locale.TrN (len .BlockingDependenciesNotPermitted) "repo.issues.dependency.no_permission_1" "repo.issues.dependency.no_permission_n" (len .BlockingDependenciesNotPermitted)}} +
    + {{end}} +
    + {{end}} + + {{if or .BlockedByDependencies .BlockedByDependenciesNotPermitted}} + + {{.locale.Tr "repo.issues.dependency.blocked_by_short"}} + +
    + {{range .BlockedByDependencies}} +
    +
    + + #{{.Issue.Index}} {{.Issue.Title | RenderEmoji $.Context}} + +
    + {{.Repository.OwnerName}}/{{.Repository.Name}} +
    +
    +
    + {{if and $.CanCreateIssueDependencies (not $.Repository.IsArchived)}} + + {{svg "octicon-trash" 16}} + + {{end}} +
    +
    + {{end}} + {{if $.CanCreateIssueDependencies}} + {{range .BlockedByDependenciesNotPermitted}} +
    +
    +
    + {{svg "octicon-lock" 16}} + + #{{.Issue.Index}} {{.Issue.Title | RenderEmoji $.Context}} + +
    +
    + {{.Repository.OwnerName}}/{{.Repository.Name}} +
    +
    +
    + {{if and $.CanCreateIssueDependencies (not $.Repository.IsArchived)}} + + {{svg "octicon-trash" 16}} + + {{end}} +
    +
    + {{end}} + {{else if .BlockedByDependenciesNotPermitted}} +
    + {{$.locale.TrN (len .BlockedByDependenciesNotPermitted) "repo.issues.dependency.no_permission_1" "repo.issues.dependency.no_permission_n" (len .BlockedByDependenciesNotPermitted)}} +
    + {{end}} +
    + {{end}} + + {{if and .CanCreateIssueDependencies (not .Repository.IsArchived)}} +
    +
    + {{$.CsrfTokenHtml}} +
    + + +
    +
    +
    + {{end}} +
    + + {{if and .CanCreateIssueDependencies (not .Repository.IsArchived)}} + + + + {{end}} + {{end}} + +
    +
    + {{$issueReferenceLink := printf "%s#%d" .Issue.Repo.FullName .Issue.Index}} +
    + {{.locale.Tr "repo.issues.reference_link" $issueReferenceLink}} + +
    +
    + + {{if and .IsRepoAdmin (not .Repository.IsArchived)}} +
    + + {{if or .PinEnabled .Issue.IsPinned}} +
    + {{$.CsrfTokenHtml}} + +
    + {{end}} + + + + + + {{end}} + + {{if and .Issue.IsPull .IsIssuePoster (not .Issue.IsClosed) .Issue.PullRequest.HeadRepo}} + {{if and (not (eq .Issue.PullRequest.HeadRepo.FullName .Issue.PullRequest.BaseRepo.FullName)) .CanWriteToHeadRepo}} +
    +
    +
    + + +
    +
    + {{end}} + {{end}} +
    diff --git a/src/templates/repo/issue/view_content/update_branch_by_merge.tmpl b/src/templates/repo/issue/view_content/update_branch_by_merge.tmpl new file mode 100644 index 0000000..d539ece --- /dev/null +++ b/src/templates/repo/issue/view_content/update_branch_by_merge.tmpl @@ -0,0 +1,37 @@ +{{if and (gt $.Issue.PullRequest.CommitsBehind 0) (not $.Issue.IsClosed) (not $.Issue.PullRequest.IsChecking) (not $.IsPullFilesConflicted) (not $.IsPullRequestBroken)}} +
    +
    +
    + {{svg "octicon-alert"}} + {{$.locale.Tr "repo.pulls.outdated_with_base_branch"}} +
    +
    + {{if and $.UpdateAllowed $.UpdateByRebaseAllowed}} +
    +
    + + +
    +
    + {{end}} + {{if and $.UpdateAllowed (not $.UpdateByRebaseAllowed)}} +
    + {{$.CsrfTokenHtml}} + +
    + {{end}} +
    +
    +{{end}} diff --git a/src/templates/repo/issue/view_title.tmpl b/src/templates/repo/issue/view_title.tmpl new file mode 100644 index 0000000..895eaee --- /dev/null +++ b/src/templates/repo/issue/view_title.tmpl @@ -0,0 +1,119 @@ +{{if .Flash}} +
    + {{template "base/alert" .}} +
    +{{end}} +
    +
    +

    + {{RenderIssueTitle $.Context .Issue.Title $.RepoLink $.Repository.ComposeMetas | RenderCodeBlock}} #{{.Issue.Index}} + +
    + +
    +

    +
    + {{if and (or .HasIssuesOrPullsWritePermission .IsIssuePoster) (not .Repository.IsArchived)}} + + {{end}} + {{if not .Issue.IsPull}} + {{.locale.Tr "repo.issues.new"}} + {{end}} +
    + {{if and (or .HasIssuesOrPullsWritePermission .IsIssuePoster) (not .Repository.IsArchived)}} +
    + + +
    + {{end}} +
    +
    + {{if .HasMerged}} +
    {{svg "octicon-git-merge" 16 "gt-mr-2"}} {{if eq .Issue.PullRequest.Status 3}}{{.locale.Tr "repo.pulls.manually_merged"}}{{else}}{{.locale.Tr "repo.pulls.merged"}}{{end}}
    + {{else if .Issue.IsClosed}} +
    {{if .Issue.IsPull}}{{svg "octicon-git-pull-request"}}{{else}}{{svg "octicon-issue-closed"}}{{end}} {{.locale.Tr "repo.issues.closed_title"}}
    + {{else if .Issue.IsPull}} + {{if .IsPullWorkInProgress}} +
    {{svg "octicon-git-pull-request-draft"}} {{.locale.Tr "repo.issues.draft_title"}}
    + {{else}} +
    {{svg "octicon-git-pull-request"}} {{.locale.Tr "repo.issues.open_title"}}
    + {{end}} + {{else}} +
    {{svg "octicon-issue-opened"}} {{.locale.Tr "repo.issues.open_title"}}
    + {{end}} +
    + {{if .Issue.IsPull}} + {{$headHref := .HeadTarget|Escape}} + {{if .HeadBranchLink}} + {{$headHref = printf `%s` (.HeadBranchLink | Escape) $headHref}} + {{end}} + {{$headHref = printf `%s ` $headHref (.locale.Tr "copy_branch") (.HeadTarget | Escape) (svg "octicon-copy" 14)}} + {{$baseHref := .BaseTarget|Escape}} + {{if .BaseBranchLink}} + {{$baseHref = printf `%s` (.BaseBranchLink | Escape) $baseHref}} + {{end}} + {{if .Issue.PullRequest.HasMerged}} + {{$mergedStr:= TimeSinceUnix .Issue.PullRequest.MergedUnix $.locale}} + {{if .Issue.OriginalAuthor}} + {{.Issue.OriginalAuthor}} + {{$.locale.Tr "repo.pulls.merged_title_desc" .NumCommits $headHref $baseHref $mergedStr | Safe}} + {{else}} + {{.Issue.PullRequest.Merger.GetDisplayName}} + {{$.locale.Tr "repo.pulls.merged_title_desc" .NumCommits $headHref $baseHref $mergedStr | Safe}} + {{end}} + {{else}} + {{if .Issue.OriginalAuthor}} + {{.Issue.OriginalAuthor}} {{$.locale.Tr "repo.pulls.title_desc" .NumCommits $headHref $baseHref | Safe}} + {{else}} + + {{.Issue.Poster.GetDisplayName}} + {{$.locale.Tr "repo.pulls.title_desc" .NumCommits $headHref $baseHref | Safe}} + + {{end}} + + + {{svg "octicon-arrow-right"}} + + + {{end}} + {{else}} + {{$createdStr:= TimeSinceUnix .Issue.CreatedUnix $.locale}} + + {{if .Issue.OriginalAuthor}} + {{$.locale.Tr "repo.issues.opened_by_fake" $createdStr (.Issue.OriginalAuthor|Escape) | Safe}} + {{else if gt .Issue.Poster.ID 0}} + {{$.locale.Tr "repo.issues.opened_by" $createdStr (.Issue.Poster.HomeLink|Escape) (.Issue.Poster.GetDisplayName|Escape) | Safe}} + {{else}} + {{$.locale.Tr "repo.issues.opened_by_fake" $createdStr (.Issue.Poster.GetDisplayName|Escape) | Safe}} + {{end}} + · + {{$.locale.Tr "repo.issues.num_comments" .Issue.NumComments}} + + {{end}} +
    +
    +
    diff --git a/src/templates/repo/migrate/codebase.tmpl b/src/templates/repo/migrate/codebase.tmpl new file mode 100644 index 0000000..41e9c27 --- /dev/null +++ b/src/templates/repo/migrate/codebase.tmpl @@ -0,0 +1,116 @@ +{{template "base/head" .}} +
    +
    +
    +
    + {{template "base/disable_form_autofill"}} + {{.CsrfTokenHtml}} +

    + {{.locale.Tr "repo.migrate.migrate" .service.Title}} + +

    +
    + {{template "base/alert" .}} +
    + + + + {{.locale.Tr "repo.migrate.clone_address_desc"}}{{if .ContextUser.CanImportLocal}} {{.locale.Tr "repo.migrate.clone_local_path"}}{{end}} + +
    + +
    + + +
    +
    + + +
    + + {{template "repo/migrate/options" .}} + +
    +
    + +
    + + +
    +
    + + +
    +
    +
    + +
    + + +
    +
    + + +
    +
    +
    + +
    + +
    + + +
    + +
    + + +
    +
    + +
    + {{if .IsForcedPrivate}} + + + {{else}} + + + {{end}} +
    +
    +
    + + +
    + +
    + + +
    +
    +
    +
    +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/repo/migrate/git.tmpl b/src/templates/repo/migrate/git.tmpl new file mode 100644 index 0000000..ba092a3 --- /dev/null +++ b/src/templates/repo/migrate/git.tmpl @@ -0,0 +1,90 @@ +{{template "base/head" .}} +
    +
    +
    +
    + {{template "base/disable_form_autofill"}} + {{.CsrfTokenHtml}} +

    + {{.locale.Tr "repo.migrate.migrate" .service.Title}} + +

    +
    + {{template "base/alert" .}} +
    + + + + {{.locale.Tr "repo.migrate.clone_address_desc"}}{{if .ContextUser.CanImportLocal}} {{.locale.Tr "repo.migrate.clone_local_path"}}{{end}} + +
    +
    + + +
    +
    + + +
    + + {{template "repo/migrate/options" .}} + +
    + +
    + + +
    + +
    + + +
    +
    + +
    + {{if .IsForcedPrivate}} + + + {{else}} + + + {{end}} +
    +
    +
    + + +
    + +
    + + +
    +
    +
    +
    +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/repo/migrate/gitbucket.tmpl b/src/templates/repo/migrate/gitbucket.tmpl new file mode 100644 index 0000000..da14d56 --- /dev/null +++ b/src/templates/repo/migrate/gitbucket.tmpl @@ -0,0 +1,132 @@ +{{template "base/head" .}} +
    +
    +
    +
    + {{template "base/disable_form_autofill"}} + {{.CsrfTokenHtml}} +

    + {{.locale.Tr "repo.migrate.migrate" .service.Title}} + +

    +
    + {{template "base/alert" .}} +
    + + + + {{.locale.Tr "repo.migrate.clone_address_desc"}}{{if .ContextUser.CanImportLocal}} {{.locale.Tr "repo.migrate.clone_local_path"}}{{end}} + +
    + +
    + + +
    +
    + + +
    + + {{template "repo/migrate/options" .}} + +
    + +
    + + +
    +
    + +
    + {{.locale.Tr "repo.migrate.migrate_items_options"}} +
    + +
    + + +
    +
    + + +
    +
    +
    + +
    + + +
    +
    + + +
    +
    +
    + +
    + + +
    +
    +
    + +
    + +
    + + +
    + +
    + + +
    +
    + +
    + {{if .IsForcedPrivate}} + + + {{else}} + + + {{end}} +
    +
    +
    + + +
    + +
    + + +
    +
    +
    +
    +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/repo/migrate/gitea.tmpl b/src/templates/repo/migrate/gitea.tmpl new file mode 100644 index 0000000..daa1205 --- /dev/null +++ b/src/templates/repo/migrate/gitea.tmpl @@ -0,0 +1,128 @@ +{{template "base/head" .}} +
    +
    +
    +
    + {{.CsrfTokenHtml}} +

    + {{.locale.Tr "repo.migrate.migrate" .service.Title}} + +

    +
    + {{template "base/alert" .}} +
    + + + + {{.locale.Tr "repo.migrate.clone_address_desc"}}{{if .ContextUser.CanImportLocal}} {{.locale.Tr "repo.migrate.clone_local_path"}}{{end}} + +
    + +
    + + + {{svg "octicon-question"}} +
    + + {{template "repo/migrate/options" .}} + +
    + +
    + + +
    +
    + +
    + {{.locale.Tr "repo.migrate.migrate_items_options"}} +
    + +
    + + +
    +
    + + +
    +
    +
    + +
    + + +
    +
    + + +
    +
    +
    + +
    + + +
    +
    +
    + +
    + +
    + + +
    + +
    + + +
    +
    + +
    + {{if .IsForcedPrivate}} + + + {{else}} + + + {{end}} +
    +
    +
    + + +
    + +
    + + +
    +
    +
    +
    +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/repo/migrate/github.tmpl b/src/templates/repo/migrate/github.tmpl new file mode 100644 index 0000000..e9f2b11 --- /dev/null +++ b/src/templates/repo/migrate/github.tmpl @@ -0,0 +1,130 @@ +{{template "base/head" .}} +
    +
    +
    +
    + {{.CsrfTokenHtml}} +

    + {{.locale.Tr "repo.migrate.migrate" .service.Title}} + +

    +
    + {{template "base/alert" .}} +
    + + + + {{.locale.Tr "repo.migrate.clone_address_desc"}} + +
    + +
    + + + {{svg "octicon-question"}} + + {{.locale.Tr "repo.migrate.github_token_desc"}} + +
    + + {{template "repo/migrate/options" .}} + +
    + +
    + + +
    +
    +
    + {{.locale.Tr "repo.migrate.migrate_items_options"}} +
    + +
    + + +
    +
    + + +
    +
    +
    + +
    + + +
    +
    + + +
    +
    +
    + +
    + + +
    +
    +
    + +
    + +
    + + +
    + +
    + + +
    +
    + +
    + {{if .IsForcedPrivate}} + + + {{else}} + + + {{end}} +
    +
    +
    + + +
    + +
    + + +
    +
    +
    +
    +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/repo/migrate/gitlab.tmpl b/src/templates/repo/migrate/gitlab.tmpl new file mode 100644 index 0000000..656b5c5 --- /dev/null +++ b/src/templates/repo/migrate/gitlab.tmpl @@ -0,0 +1,127 @@ +{{template "base/head" .}} +
    +
    +
    +
    + {{.CsrfTokenHtml}} +

    + {{.locale.Tr "repo.migrate.migrate" .service.Title}} + +

    +
    + {{template "base/alert" .}} +
    + + + + {{.locale.Tr "repo.migrate.clone_address_desc"}}{{if .ContextUser.CanImportLocal}} {{.locale.Tr "repo.migrate.clone_local_path"}}{{end}} + +
    + +
    + + + {{svg "octicon-question"}} +
    + + {{template "repo/migrate/options" .}} + +
    + +
    + + +
    +
    +
    + {{.locale.Tr "repo.migrate.migrate_items_options"}} +
    + +
    + + +
    +
    + + +
    +
    +
    + +
    + + +
    +
    + + +
    +
    +
    + +
    + + +
    +
    +
    + +
    + +
    + + +
    + +
    + + +
    +
    + +
    + {{if .IsForcedPrivate}} + + + {{else}} + + + {{end}} +
    +
    +
    + + +
    + +
    + + +
    +
    +
    +
    +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/repo/migrate/gogs.tmpl b/src/templates/repo/migrate/gogs.tmpl new file mode 100644 index 0000000..78700a7 --- /dev/null +++ b/src/templates/repo/migrate/gogs.tmpl @@ -0,0 +1,130 @@ +{{template "base/head" .}} +
    +
    +
    +
    + {{.CsrfTokenHtml}} +

    + {{.locale.Tr "repo.migrate.migrate" .service.Title}} + +

    +
    + {{template "base/alert" .}} +
    + + + + {{.locale.Tr "repo.migrate.clone_address_desc"}}{{if .ContextUser.CanImportLocal}} {{.locale.Tr "repo.migrate.clone_local_path"}}{{end}} + +
    + +
    + + + +
    + + {{template "repo/migrate/options" .}} + +
    + +
    + + +
    +
    + +
    + {{.locale.Tr "repo.migrate.migrate_items_options"}} +
    + +
    + + +
    +
    + + +
    +
    +
    + +
    + + +
    +
    + +
    + +
    + +
    + + +
    + +
    + + +
    +
    + +
    + {{if .IsForcedPrivate}} + + + {{else}} + + + {{end}} +
    +
    +
    + + +
    + +
    + + +
    +
    +
    +
    +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/repo/migrate/helper.tmpl b/src/templates/repo/migrate/helper.tmpl new file mode 100644 index 0000000..e69de29 diff --git a/src/templates/repo/migrate/migrate.tmpl b/src/templates/repo/migrate/migrate.tmpl new file mode 100644 index 0000000..0124532 --- /dev/null +++ b/src/templates/repo/migrate/migrate.tmpl @@ -0,0 +1,32 @@ +{{template "base/head" .}} + +{{template "base/footer" .}} diff --git a/src/templates/repo/migrate/migrating.tmpl b/src/templates/repo/migrate/migrating.tmpl new file mode 100644 index 0000000..58c453f --- /dev/null +++ b/src/templates/repo/migrate/migrating.tmpl @@ -0,0 +1,100 @@ +{{template "base/head" .}} +
    + {{template "repo/header" .}} +
    +
    +
    + {{template "base/alert" .}} +
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +

    {{.locale.Tr "repo.migrate.migrating" .CloneAddr | Safe}}

    +

    +
    +
    + {{if .CloneAddr}} +

    {{.locale.Tr "repo.migrate.migrating_failed" .CloneAddr | Safe}}

    + {{else}} +

    {{.locale.Tr "repo.migrate.migrating_failed_no_addr" | Safe}}

    + {{end}} +

    +
    + {{if .Permission.IsAdmin}} +
    +
    + {{if .Failed}} + + {{else}} + + {{end}} +
    + {{end}} +
    +
    +
    +
    +
    +
    +
    + + + + + +{{template "base/footer" .}} diff --git a/src/templates/repo/migrate/onedev.tmpl b/src/templates/repo/migrate/onedev.tmpl new file mode 100644 index 0000000..50858ed --- /dev/null +++ b/src/templates/repo/migrate/onedev.tmpl @@ -0,0 +1,116 @@ +{{template "base/head" .}} +
    +
    +
    +
    + {{template "base/disable_form_autofill"}} + {{.CsrfTokenHtml}} +

    + {{.locale.Tr "repo.migrate.migrate" .service.Title}} + +

    +
    + {{template "base/alert" .}} +
    + + + + {{.locale.Tr "repo.migrate.clone_address_desc"}}{{if .ContextUser.CanImportLocal}} {{.locale.Tr "repo.migrate.clone_local_path"}}{{end}} + +
    + +
    + + +
    +
    + + +
    + + {{template "repo/migrate/options" .}} + +
    +
    + +
    + + +
    +
    + + +
    +
    +
    + +
    + + +
    +
    + + +
    +
    +
    + +
    + +
    + + +
    + +
    + + +
    +
    + +
    + {{if .IsForcedPrivate}} + + + {{else}} + + + {{end}} +
    +
    +
    + + +
    + +
    + + +
    +
    +
    +
    +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/repo/migrate/options.tmpl b/src/templates/repo/migrate/options.tmpl new file mode 100644 index 0000000..d39caf0 --- /dev/null +++ b/src/templates/repo/migrate/options.tmpl @@ -0,0 +1,26 @@ +{{if not .DisableNewPullMirrors}} +
    + +
    + + +
    +
    +{{end}} +{{if .LFSActive}} +
    + +
    + + +
    + ({{.locale.Tr "repo.settings.advanced_settings"}}) +
    +
    + {{.locale.Tr "repo.migrate_options_lfs_endpoint.description" "https://github.com/git-lfs/git-lfs/blob/main/docs/api/server-discovery.md#server-discovery" | Str2html}}{{if .ContextUser.CanImportLocal}} {{.locale.Tr "repo.migrate_options_lfs_endpoint.description.local"}}{{end}} +
    + + +
    +
    +{{end}} diff --git a/src/templates/repo/packages.tmpl b/src/templates/repo/packages.tmpl new file mode 100644 index 0000000..47fa338 --- /dev/null +++ b/src/templates/repo/packages.tmpl @@ -0,0 +1,6 @@ +{{template "base/head" .}} +
    + {{template "repo/header" .}} + {{template "package/shared/list" .}} +
    +{{template "base/footer" .}} diff --git a/src/templates/repo/projects/list.tmpl b/src/templates/repo/projects/list.tmpl new file mode 100644 index 0000000..674c6bf --- /dev/null +++ b/src/templates/repo/projects/list.tmpl @@ -0,0 +1,93 @@ +{{template "base/head" .}} +
    + {{template "repo/header" .}} +
    + + {{template "base/alert" .}} + +
    + {{range .Projects}} +
  • +

    + {{svg .IconName 16}} + {{.Title}} +

    +
    +
    +
    + {{svg "octicon-issue-opened" 14}} + {{$.locale.PrettyNumber .NumOpenIssues}} {{$.locale.Tr "repo.issues.open_title"}} +
    +
    + {{svg "octicon-check" 14}} + {{$.locale.PrettyNumber .NumClosedIssues}} {{$.locale.Tr "repo.issues.closed_title"}} +
    +
    + {{if and $.CanWriteProjects (not $.Repository.IsArchived)}} + + {{end}} +
    + {{if .Description}} +
    + {{.RenderedContent|Str2html}} +
    + {{end}} +
  • + {{end}} + + {{template "base/paginate" .}} +
    +
    +
    + +{{if .CanWriteProjects}} + +{{end}} +{{template "base/footer" .}} diff --git a/src/templates/repo/projects/new.tmpl b/src/templates/repo/projects/new.tmpl new file mode 100644 index 0000000..531cae8 --- /dev/null +++ b/src/templates/repo/projects/new.tmpl @@ -0,0 +1,6 @@ +{{template "base/head" .}} +
    + {{template "repo/header" .}} + {{template "projects/new" .}} +
    +{{template "base/footer" .}} diff --git a/src/templates/repo/projects/view.tmpl b/src/templates/repo/projects/view.tmpl new file mode 100644 index 0000000..2d98c70 --- /dev/null +++ b/src/templates/repo/projects/view.tmpl @@ -0,0 +1,277 @@ +{{template "base/head" .}} +
    + {{template "repo/header" .}} +
    +
    +
    + {{template "repo/issue/navbar" .}} +
    +
    + {{if and .CanWriteProjects (not .Repository.IsArchived)}} + {{.locale.Tr "repo.issues.new"}} + {{.locale.Tr "new_project_column"}} + {{end}} + +
    +
    +
    +
    +
    +

    {{$.Project.Title}}

    +
    {{$.Project.RenderedContent|Str2html}}
    +
    + {{if and $.CanWriteProjects (not $.Repository.IsArchived)}} + + {{end}} +
    +
    +
    +
    + +
    + {{range $board := .Boards}} + +
    +
    +
    +
    + {{.NumIssues}} +
    + {{.Title}} +
    + {{if and $.CanWriteProjects (not $.Repository.IsArchived) (ne .ID 0)}} + + {{end}} +
    +
    + +
    + + {{range (index $.IssuesMap .ID)}} + + +
    + {{if eq $.Project.CardType 1}}{{/* Images and Text*/}} +
    + {{range (index $.issuesAttachmentMap .ID)}} + {{.Name}} + {{end}} +
    + {{end}} +
    +
    + + {{template "shared/issueicon" .}} + + + {{.Title}} + +
    +
    + + #{{.Index}} + {{$timeStr := TimeSinceUnix .GetLastEventTimestamp $.locale}} + {{if .OriginalAuthor}} + {{$.locale.Tr .GetLastEventLabelFake $timeStr (.OriginalAuthor|Escape) | Safe}} + {{else if gt .Poster.ID 0}} + {{$.locale.Tr .GetLastEventLabel $timeStr (.Poster.HomeLink|Escape) (.Poster.GetDisplayName | Escape) | Safe}} + {{else}} + {{$.locale.Tr .GetLastEventLabelFake $timeStr (.Poster.GetDisplayName | Escape) | Safe}} + {{end}} + +
    + {{- if .MilestoneID}} + + {{- end}} + {{- range index $.LinkedPRs .ID}} + + {{- end}} +
    + + {{if or .Labels .Assignees}} +
    + {{range .Labels}} + {{RenderLabel $.Context .}} + {{end}} +
    + {{range .Assignees}} + {{avatar $.Context . 28 "mini gt-mr-3"}} + {{end}} +
    +
    + {{end}} +
    + + + {{end}} +
    +
    + {{end}} +
    + +
    + +
    + +{{if .CanWriteProjects}} + +{{end}} + +{{template "base/footer" .}} diff --git a/src/templates/repo/pulls/commits.tmpl b/src/templates/repo/pulls/commits.tmpl new file mode 100644 index 0000000..bf6e812 --- /dev/null +++ b/src/templates/repo/pulls/commits.tmpl @@ -0,0 +1,10 @@ +{{template "base/head" .}} +
    + {{template "repo/header" .}} +
    + {{template "repo/issue/view_title" .}} + {{template "repo/pulls/tab_menu" .}} + {{template "repo/commits_table" .}} +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/repo/pulls/files.tmpl b/src/templates/repo/pulls/files.tmpl new file mode 100644 index 0000000..402bec8 --- /dev/null +++ b/src/templates/repo/pulls/files.tmpl @@ -0,0 +1,14 @@ +{{template "base/head" .}} + + + + +
    + {{template "repo/header" .}} +
    + {{template "repo/issue/view_title" .}} + {{template "repo/pulls/tab_menu" .}} + {{template "repo/diff/box" .}} +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/repo/pulls/fork.tmpl b/src/templates/repo/pulls/fork.tmpl new file mode 100644 index 0000000..34adc7b --- /dev/null +++ b/src/templates/repo/pulls/fork.tmpl @@ -0,0 +1,70 @@ +{{template "base/head" .}} +
    +
    +
    +
    + {{.CsrfTokenHtml}} +

    + {{.locale.Tr "new_fork"}} +

    +
    + {{template "base/alert" .}} +
    + + +
    + +
    + + {{.ForkRepo.FullName}} +
    +
    + + +
    +
    + +
    + + +
    + {{.locale.Tr "repo.fork_visibility_helper"}} +
    +
    + + +
    + +
    + + +
    +
    +
    +
    +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/repo/pulls/status.tmpl b/src/templates/repo/pulls/status.tmpl new file mode 100644 index 0000000..25d8954 --- /dev/null +++ b/src/templates/repo/pulls/status.tmpl @@ -0,0 +1,34 @@ +{{if $.LatestCommitStatus}} + {{if not $.Issue.PullRequest.HasMerged}} +
    + {{if eq .LatestCommitStatus.State "pending"}} + {{$.locale.Tr "repo.pulls.status_checking"}} + {{else if eq .LatestCommitStatus.State "success"}} + {{$.locale.Tr "repo.pulls.status_checks_success"}} + {{else if eq .LatestCommitStatus.State "warning"}} + {{$.locale.Tr "repo.pulls.status_checks_warning"}} + {{else if eq .LatestCommitStatus.State "failure"}} + {{$.locale.Tr "repo.pulls.status_checks_failure"}} + {{else if eq .LatestCommitStatus.State "error"}} + {{$.locale.Tr "repo.pulls.status_checks_error"}} + {{else}} + {{$.locale.Tr "repo.pulls.status_checking"}} + {{end}} +
    + {{end}} + + {{range $.LatestCommitStatuses}} +
    + {{template "repo/commit_status" .}} +
    + {{.Context}} {{.Description}} +
    + {{if $.is_context_required}} + {{if (call $.is_context_required .Context)}}
    {{$.locale.Tr "repo.pulls.status_checks_requested"}}
    {{end}} + {{end}} + {{if .TargetURL}}{{$.locale.Tr "repo.pulls.status_checks_details"}}{{end}} +
    +
    +
    + {{end}} +{{end}} diff --git a/src/templates/repo/pulls/tab_menu.tmpl b/src/templates/repo/pulls/tab_menu.tmpl new file mode 100644 index 0000000..f44968c --- /dev/null +++ b/src/templates/repo/pulls/tab_menu.tmpl @@ -0,0 +1,17 @@ + diff --git a/src/templates/repo/release/list.tmpl b/src/templates/repo/release/list.tmpl new file mode 100644 index 0000000..fb8534f --- /dev/null +++ b/src/templates/repo/release/list.tmpl @@ -0,0 +1,133 @@ +{{template "base/head" .}} +
    + {{template "repo/header" .}} +
    + {{template "base/alert" .}} + {{template "repo/release_tag_header" .}} + + + {{template "base/paginate" .}} +
    +
    + +{{if (and ($.Permission.CanWrite $.UnitTypeCode) .PageIsTagList)}} + +{{end}} + +{{template "base/footer" .}} diff --git a/src/templates/repo/release/new.tmpl b/src/templates/repo/release/new.tmpl new file mode 100644 index 0000000..c7de004 --- /dev/null +++ b/src/templates/repo/release/new.tmpl @@ -0,0 +1,152 @@ +{{template "base/head" .}} +
    + {{template "repo/header" .}} +
    +

    + {{if .PageIsEditRelease}} + {{.locale.Tr "repo.release.edit_release"}} +
    {{.locale.Tr "repo.release.edit_subheader"}}
    + {{else}} + {{.locale.Tr "repo.release.new_release"}} +
    {{.locale.Tr "repo.release.new_subheader"}}
    + {{end}} +

    + {{template "base/alert" .}} +
    + {{.CsrfTokenHtml}} +
    +
    + {{if .PageIsEditRelease}} + {{.tag_name}}@{{.tag_target}} + {{else}} + + +
    + @ + +
    +
    + {{.locale.Tr "repo.release.tag_helper"}} +
    + {{end}} +
    +
    +
    +
    + +
    +
    + {{template "shared/combomarkdowneditor" (dict + "locale" $.locale + "MarkdownPreviewUrl" (print .Repository.Link "/markup") + "MarkdownPreviewContext" .RepoLink + "TextareaName" "content" + "TextareaContent" .content + "TextareaPlaceholder" (.locale.Tr "repo.release.message") + "TextareaAriaLabel" (.locale.Tr "repo.release.message") + "DropzoneParentContainer" "form" + )}} +
    + {{range .attachments}} +
    + +
    + + + {{.Size | FileSize}} + + {{svg "octicon-info"}} + +
    +
    + {{end}} + {{if .IsAttachmentEnabled}} +
    + {{template "repo/upload" .}} +
    + {{end}} +
    +
    +
    +
    + {{if not .PageIsEditRelease}} +
    +
    + + +
    +
    + {{else}} + + {{end}} +
    +
    + + +
    +
    + {{.locale.Tr "repo.release.prerelease_helper"}} +
    + {{if .PageIsEditRelease}} + + {{.locale.Tr "repo.release.cancel"}} + + + {{$.locale.Tr "repo.release.delete_release"}} + + {{if .IsDraft}} + + + {{else}} + + {{end}} + {{else}} + {{if not .tag_name}} + + {{end}} + + + {{end}} +
    +
    +
    +
    +
    +
    + +{{if .PageIsEditRelease}} + +{{end}} +{{template "base/footer" .}} diff --git a/src/templates/repo/release_tag_header.tmpl b/src/templates/repo/release_tag_header.tmpl new file mode 100644 index 0000000..0af9ba8 --- /dev/null +++ b/src/templates/repo/release_tag_header.tmpl @@ -0,0 +1,27 @@ +{{$canReadReleases := $.Permission.CanRead $.UnitTypeReleases}} +{{$canReadCode := $.Permission.CanRead $.UnitTypeCode}} + +{{if $canReadReleases}} +
    +
    + + {{if .EnableFeed}} + {{svg "octicon-rss" 18}} + {{end}} +
    + {{if and (not .PageIsTagList) .CanCreateRelease}} + + {{.locale.Tr "repo.release.new_release"}} + + {{end}} +
    +
    +{{else if $canReadCode}} + {{/* if the "repo.releases" unit is disabled, only show the "commits / branches / tags" sub menu */}} + {{template "repo/sub_menu" .}} +{{end}} diff --git a/src/templates/repo/search.tmpl b/src/templates/repo/search.tmpl new file mode 100644 index 0000000..816be9d --- /dev/null +++ b/src/templates/repo/search.tmpl @@ -0,0 +1,73 @@ +{{template "base/head" .}} +
    + {{template "repo/header" .}} +
    + + {{if .CodeIndexerUnavailable}} +
    +

    {{$.locale.Tr "repo.search.code_search_unavailable"}}

    +
    + {{else if .Keyword}} +

    + {{.locale.Tr "repo.search.results" (.Keyword|Escape) (.RepoLink|Escape) (.RepoName|Escape) | Str2html}} +

    + {{if .SearchResults}} +
    + {{range $term := .SearchResultLanguages}} + + + {{$term.Language}} +
    {{$term.Count}}
    +
    + {{end}} +
    + + {{template "base/paginate" .}} + {{else}} +
    {{$.locale.Tr "repo.search.code_no_results"}}
    + {{end}} + {{end}} +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/repo/search_name.tmpl b/src/templates/repo/search_name.tmpl new file mode 100644 index 0000000..951f168 --- /dev/null +++ b/src/templates/repo/search_name.tmpl @@ -0,0 +1 @@ +{{.Name}}{{if DefaultShowFullName}} {{.FullName}}{{end}} diff --git a/src/templates/repo/settings/actions.tmpl b/src/templates/repo/settings/actions.tmpl new file mode 100644 index 0000000..7294423 --- /dev/null +++ b/src/templates/repo/settings/actions.tmpl @@ -0,0 +1,9 @@ +{{template "repo/settings/layout_head" (dict "ctxData" . "pageClass" "repository settings actions")}} +
    + {{if eq .PageType "runners"}} + {{template "shared/actions/runner_list" .}} + {{else if eq .PageType "secrets"}} + {{template "shared/secrets/add_list" .}} + {{end}} +
    +{{template "repo/settings/layout_footer" .}} diff --git a/src/templates/repo/settings/branches.tmpl b/src/templates/repo/settings/branches.tmpl new file mode 100644 index 0000000..9a8c588 --- /dev/null +++ b/src/templates/repo/settings/branches.tmpl @@ -0,0 +1,77 @@ +{{template "repo/settings/layout_head" (dict "ctxData" . "pageClass" "repository settings edit")}} +
    + {{if .Repository.IsArchived}} +
    + {{.locale.Tr "repo.settings.archive.branchsettings_unavailable"}} +
    + {{else}} +

    + {{.locale.Tr "repo.default_branch"}} +

    +
    +

    + {{.locale.Tr "repo.settings.default_branch_desc"}} +

    +
    + {{.CsrfTokenHtml}} + + {{if not .Repository.IsEmpty}} + + + {{end}} +
    +
    + +

    + {{.locale.Tr "repo.settings.protected_branch"}} + +

    + +
    +
    +
    + + + {{range .ProtectedBranches}} + + + + + {{else}} + + {{end}} + +
    {{.RuleName}}
    + {{$.locale.Tr "repo.settings.edit_protected_branch"}} + +
    {{.locale.Tr "repo.settings.no_protected_branch"}}
    +
    +
    +
    + {{end}} +
    + + + +{{template "repo/settings/layout_footer" .}} diff --git a/src/templates/repo/settings/collaboration.tmpl b/src/templates/repo/settings/collaboration.tmpl new file mode 100644 index 0000000..84f23ee --- /dev/null +++ b/src/templates/repo/settings/collaboration.tmpl @@ -0,0 +1,121 @@ +{{template "repo/settings/layout_head" (dict "ctxData" . "pageClass" "repository settings collaboration")}} +
    +

    + {{.locale.Tr "repo.settings.collaboration"}} +

    + {{if .Collaborators}} +
    + {{range .Collaborators}} +
    + +
    + {{svg "octicon-shield-lock"}} + +
    +
    + +
    +
    + {{end}} +
    + {{end}} +
    +
    + {{.CsrfTokenHtml}} +
    + +
    + +
    +
    + + {{if .RepoOwnerIsOrganization}} +

    + {{$.locale.Tr "repo.settings.teams"}} +

    + {{$allowedToChangeTeams := (or (.Org.RepoAdminChangeTeamAccess) (.Permission.IsOwner))}} + {{if .Teams}} +
    + {{range $t, $team := .Teams}} +
    + +
    + {{svg "octicon-shield-lock"}} + + {{if or (eq .AccessMode 1) (eq .AccessMode 2)}} + {{$first := true}} +
    + Sections: {{range $u, $unit := $.Units}}{{if and ($.Repo.UnitEnabled $.Context $unit.Type) ($team.UnitEnabled $.Context $unit.Type)}}{{if $first}}{{$first = false}}{{else}}, {{end}}{{$.locale.Tr $unit.NameKey}}{{end}}{{end}} {{if $first}}None{{end}} +
    + {{end}} +
    + {{if $allowedToChangeTeams}} +
    + +
    + {{end}} +
    + {{end}} +
    + {{end}} +
    + {{if $allowedToChangeTeams}} +
    + {{.CsrfTokenHtml}} +
    + +
    + +
    + {{else}} +
    + {{$.locale.Tr "repo.settings.change_team_access_not_allowed"}} +
    + {{end}} +
    + {{end}} +
    + + + +{{template "repo/settings/layout_footer" .}} diff --git a/src/templates/repo/settings/deploy_keys.tmpl b/src/templates/repo/settings/deploy_keys.tmpl new file mode 100644 index 0000000..621e1fa --- /dev/null +++ b/src/templates/repo/settings/deploy_keys.tmpl @@ -0,0 +1,86 @@ +{{template "repo/settings/layout_head" (dict "ctxData" . "pageClass" "repository settings")}} +
    +

    + {{.locale.Tr "repo.settings.deploy_keys"}} +
    + {{if not .DisableSSH}} + + {{else}} + + {{end}} +
    +

    +
    +
    +
    + {{.CsrfTokenHtml}} +
    + {{.locale.Tr "repo.settings.deploy_key_desc"}} +
    +
    + + +
    +
    + + +
    +
    +
    + + + {{$.locale.Tr "repo.settings.is_writable_info" | Str2html}} +
    +
    + + +
    +
    + {{if .Deploykeys}} +
    + {{range .Deploykeys}} +
    +
    + +
    +
    + {{svg "octicon-key" 32}} +
    +
    + {{.Name}} +
    + {{.Fingerprint}} +
    +
    + {{$.locale.Tr "settings.added_on" (DateTime "short" .CreatedUnix) | Safe}} — {{svg "octicon-info"}} {{if .HasUsed}}{{$.locale.Tr "settings.last_used"}} {{DateTime "short" .UpdatedUnix}}{{else}}{{$.locale.Tr "settings.no_activity"}}{{end}} - {{$.locale.Tr "settings.can_read_info"}}{{if not .IsReadOnly}} / {{$.locale.Tr "settings.can_write_info"}} {{end}} +
    +
    +
    + {{end}} +
    + {{else}} + {{.locale.Tr "repo.settings.no_deploy_keys"}} + {{end}} +
    +
    + + + +{{template "repo/settings/layout_footer" .}} diff --git a/src/templates/repo/settings/githook_edit.tmpl b/src/templates/repo/settings/githook_edit.tmpl new file mode 100644 index 0000000..3d212b5 --- /dev/null +++ b/src/templates/repo/settings/githook_edit.tmpl @@ -0,0 +1,27 @@ +{{template "repo/settings/layout_head" (dict "ctxData" . "pageClass" "repository settings edit githook")}} +
    +

    + {{.locale.Tr "repo.settings.githooks"}} +

    +
    +

    {{.locale.Tr "repo.settings.githook_edit_desc"}}

    +
    + {{.CsrfTokenHtml}} + {{with .Hook}} +
    + + {{.Name}} +
    +
    + + +
    +
    +
    + +
    + {{end}} +
    +
    +
    +{{template "repo/settings/layout_footer" .}} diff --git a/src/templates/repo/settings/githooks.tmpl b/src/templates/repo/settings/githooks.tmpl new file mode 100644 index 0000000..c0bf91f --- /dev/null +++ b/src/templates/repo/settings/githooks.tmpl @@ -0,0 +1,23 @@ +{{template "repo/settings/layout_head" (dict "ctxData" . "pageClass" "repository settings githooks")}} +
    +

    + {{.locale.Tr "repo.settings.githooks"}} +

    +
    +
    +
    + {{.locale.Tr "repo.settings.githooks_desc" | Str2html}} +
    + {{range .Hooks}} +
    + {{svg "octicon-dot-fill" 22}} + {{.Name}} + + {{svg "octicon-pencil"}} + +
    + {{end}} +
    +
    +
    +{{template "repo/settings/layout_footer" .}} diff --git a/src/templates/repo/settings/layout_footer.tmpl b/src/templates/repo/settings/layout_footer.tmpl new file mode 100644 index 0000000..60cad3f --- /dev/null +++ b/src/templates/repo/settings/layout_footer.tmpl @@ -0,0 +1,11 @@ +{{if false}}{{/* to make html structure "likely" complete to prevent IDE warnings */}} +
    +
    +
    + {{/* block: repo-setting-content */}} +{{end}} + +
    +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/repo/settings/layout_head.tmpl b/src/templates/repo/settings/layout_head.tmpl new file mode 100644 index 0000000..3117309 --- /dev/null +++ b/src/templates/repo/settings/layout_head.tmpl @@ -0,0 +1,14 @@ +{{template "base/head" .ctxData}} +
    + {{template "repo/header" .ctxData}} +
    + {{template "repo/settings/navbar" .ctxData}} +
    + {{template "base/alert" .ctxData}} + {{/* block: repo-setting-content */}} + +{{if false}}{{/* to make html structure "likely" complete to prevent IDE warnings */}} +
    +
    +
    +{{end}} diff --git a/src/templates/repo/settings/lfs.tmpl b/src/templates/repo/settings/lfs.tmpl new file mode 100644 index 0000000..4d469a3 --- /dev/null +++ b/src/templates/repo/settings/lfs.tmpl @@ -0,0 +1,55 @@ +{{template "repo/settings/layout_head" (dict "ctxData" . "pageClass" "repository settings lfs")}} +
    +

    + {{.locale.Tr "repo.settings.lfs_filelist"}} ({{.locale.Tr "admin.total" .Total}}) + +

    + + + {{range .LFSFiles}} + + + + + + + {{else}} + + + + {{end}} + +
    + + + {{ShortSha .Oid}} + + + {{FileSize .Size}}{{TimeSince .CreatedUnix.AsTime $.locale}} + {{$.locale.Tr "repo.settings.lfs_findcommits"}} + +
    {{.locale.Tr "repo.settings.lfs_no_lfs_files"}}
    + {{template "base/paginate" .}} + {{range .LFSFiles}} + + {{end}} +
    +{{template "repo/settings/layout_footer" .}} diff --git a/src/templates/repo/settings/lfs_file.tmpl b/src/templates/repo/settings/lfs_file.tmpl new file mode 100644 index 0000000..de6f010 --- /dev/null +++ b/src/templates/repo/settings/lfs_file.tmpl @@ -0,0 +1,57 @@ +{{template "repo/settings/layout_head" (dict "ctxData" . "pageClass" "repository settings lfs")}} +
    +
    +

    + {{.locale.Tr "repo.settings.lfs"}} / {{.LFSFile.Oid}} + +

    +
    + {{template "repo/unicode_escape_prompt" dict "EscapeStatus" .EscapeStatus "root" $}} +
    + {{if .IsMarkup}} + {{if .FileContent}}{{.FileContent | Safe}}{{end}} + {{else if .IsPlainText}} +
    {{if .FileContent}}{{.FileContent | Safe}}{{end}}
    + {{else if not .IsTextFile}} +
    + {{if .IsImageFile}} + + {{else if .IsVideoFile}} + + {{else if .IsAudioFile}} + + {{else if .IsPDFFile}} +
    + {{else}} + {{.locale.Tr "repo.file_view_raw"}} + {{end}} +
    + {{else if .FileSize}} + + + + {{if .IsFileTooLarge}} + + {{else}} + + + {{end}} + + +
    {{.locale.Tr "repo.file_too_large"}}{{.LineNums}}
      {{.FileContent}}
    + {{end}} +
    +
    +
    +
    +{{template "repo/settings/layout_footer" .}} diff --git a/src/templates/repo/settings/lfs_file_find.tmpl b/src/templates/repo/settings/lfs_file_find.tmpl new file mode 100644 index 0000000..b85f67f --- /dev/null +++ b/src/templates/repo/settings/lfs_file_find.tmpl @@ -0,0 +1,46 @@ +{{template "repo/settings/layout_head" (dict "ctxData" . "pageClass" "repository settings lfs")}} +
    +
    +

    + {{.locale.Tr "repo.settings.lfs"}} / {{.Oid}} +

    + + + {{range .Results}} + + + + + + + + {{else}} + + + + {{end}} + +
    + {{svg "octicon-file"}} + {{.Name}} + + + + {{.Summary | RenderEmoji $.Context}} + + + + {{svg "octicon-git-branch"}}{{.BranchName}} + + {{if .ParentHashes}} + {{$.locale.Tr "repo.diff.parent"}} + {{range .ParentHashes}} + {{ShortSha .String}} + {{end}} + {{end}} + {{$.locale.Tr "repo.diff.commit"}} + {{ShortSha .SHA}} + {{TimeSince .When $.locale}}
    {{.locale.Tr "repo.settings.lfs_lfs_file_no_commits"}}
    +
    +
    +{{template "repo/settings/layout_footer" .}} diff --git a/src/templates/repo/settings/lfs_locks.tmpl b/src/templates/repo/settings/lfs_locks.tmpl new file mode 100644 index 0000000..8fa3dfd --- /dev/null +++ b/src/templates/repo/settings/lfs_locks.tmpl @@ -0,0 +1,56 @@ +{{template "repo/settings/layout_head" (dict "ctxData" . "pageClass" "repository settings lfs")}} +
    +
    +

    + {{.locale.Tr "repo.settings.lfs"}} / {{.locale.Tr "repo.settings.lfs_locks"}} ({{.locale.Tr "admin.total" .Total}}) +

    +
    +
    + {{$.CsrfTokenHtml}} +
    + + +
    +
    +
    + + + {{range $index, $lock := .LFSLocks}} + + + + + + + {{else}} + + + + {{end}} + +
    + {{if index $.Linkable $index}} + {{svg "octicon-file"}} + {{$lock.Path}} + {{else}} + {{svg "octicon-diff"}} + {{$lock.Path}} + {{end}} + {{if not (index $.Lockables $index)}} + {{svg "octicon-alert"}} + {{end}} + + + {{avatar $.Context $.Owner}} + {{$.Owner.DisplayName}} + + {{TimeSince .Created $.locale}} +
    + {{$.CsrfTokenHtml}} + +
    +
    {{.locale.Tr "repo.settings.lfs_locks_no_locks"}}
    + {{template "base/paginate" .}} +
    +
    +{{template "repo/settings/layout_footer" .}} diff --git a/src/templates/repo/settings/lfs_pointers.tmpl b/src/templates/repo/settings/lfs_pointers.tmpl new file mode 100644 index 0000000..5f0cf31 --- /dev/null +++ b/src/templates/repo/settings/lfs_pointers.tmpl @@ -0,0 +1,66 @@ +{{template "repo/settings/layout_head" (dict "ctxData" . "pageClass" "repository settings lfs")}} +
    +

    + {{.locale.Tr "repo.settings.lfs_pointers.found" .NumPointers .NumAssociated .NumNotAssociated .NumNoExist}} + {{if gt .NumAssociatable 0}} +
    +
    + {{.CsrfTokenHtml}} + {{range .Pointers}} + {{if .Associatable}} + + {{end}} + {{end}} + +
    +
    + {{end}} +

    +
    + + + + + + + + + + + + + {{range .Pointers}} + + + + + + + + + {{end}} + +
    {{.locale.Tr "repo.settings.lfs_pointers.sha"}}{{.locale.Tr "repo.settings.lfs_pointers.oid"}}{{.locale.Tr "repo.settings.lfs_pointers.inRepo"}}{{.locale.Tr "repo.settings.lfs_pointers.exists"}}{{.locale.Tr "repo.settings.lfs_pointers.accessible"}}
    + + + {{ShortSha .SHA}} + + + + + {{if and .Exists .InRepo}} + + {{ShortSha .Oid}} + + {{else}} + + {{end}} + + + {{$.locale.Tr "repo.settings.lfs_findcommits"}} + {{if .InRepo}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}{{if .Exists}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}{{if .Accessible}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}
    +
    +
    +{{template "repo/settings/layout_footer" .}} diff --git a/src/templates/repo/settings/nav.tmpl b/src/templates/repo/settings/nav.tmpl new file mode 100644 index 0000000..4a88d69 --- /dev/null +++ b/src/templates/repo/settings/nav.tmpl @@ -0,0 +1,19 @@ + diff --git a/src/templates/repo/settings/navbar.tmpl b/src/templates/repo/settings/navbar.tmpl new file mode 100644 index 0000000..e21f23f --- /dev/null +++ b/src/templates/repo/settings/navbar.tmpl @@ -0,0 +1,50 @@ +
    + +
    diff --git a/src/templates/repo/settings/options.tmpl b/src/templates/repo/settings/options.tmpl new file mode 100644 index 0000000..1e940c5 --- /dev/null +++ b/src/templates/repo/settings/options.tmpl @@ -0,0 +1,1030 @@ +{{template "repo/settings/layout_head" (dict "ctxData" . "pageClass" "repository settings options")}} +
    +

    + {{.locale.Tr "repo.settings.basic_settings"}} +

    +
    +
    + {{template "base/disable_form_autofill"}} + {{.CsrfTokenHtml}} + +
    + + +
    +
    + + {{FileSize .Repository.Size}} +
    +
    + +
    + + +
    +
    + {{if not .Repository.IsFork}} +
    + +
    + {{if .IsAdmin}} + + {{else}} + + {{end}} + +
    +
    + {{end}} +
    + + +
    +
    + + +
    + +
    + +
    +
    + +
    + +
    + {{.CsrfTokenHtml}} +
    + + +
    + +
    + + {{$.locale.Tr "settings.delete_current_avatar"}} +
    +
    + +
    + + + {{/* These variables exist to make the logic in the Settings window easier to comprehend and are not used later on. */}} + {{$newMirrorsPartiallyEnabled := or (not .DisableNewPullMirrors) (not .DisableNewPushMirrors)}} + {{/* .Repository.IsMirror is not always reliable if the repository is not actively acting as a mirror because of errors. */}} + {{$showMirrorSettings := or $newMirrorsPartiallyEnabled .Repository.IsMirror .PullMirror .PushMirrors}} + {{$newMirrorsEntirelyEnabled := and (not .DisableNewPullMirrors) (not .DisableNewPushMirrors)}} + {{$onlyNewPushMirrorsEnabled := and (not .DisableNewPushMirrors) .DisableNewPullMirrors}} + {{$onlyNewPullMirrorsEnabled := and .DisableNewPushMirrors (not .DisableNewPullMirrors)}} + {{$existingPushMirror := or .Repository.IsMirror .PushMirrors}} + {{$modifyBrokenPullMirror := and .Repository.IsMirror (not .PullMirror)}} + {{$isWorkingPullMirror := .PullMirror}} + + {{if $showMirrorSettings}} +

    + {{.locale.Tr "repo.settings.mirror_settings"}} +

    +
    + {{if $newMirrorsEntirelyEnabled}} + {{$.locale.Tr "repo.settings.mirror_settings.docs"}} + {{$.locale.Tr "repo.settings.mirror_settings.docs.doc_link_title"}}

    + {{$.locale.Tr "repo.settings.mirror_settings.docs.pull_mirror_instructions"}} + {{$.locale.Tr "repo.settings.mirror_settings.docs.doc_link_title"}}
    + {{else if $onlyNewPushMirrorsEnabled}} + {{$.locale.Tr "repo.settings.mirror_settings.docs.disabled_pull_mirror.instructions"}} + {{$.locale.Tr "repo.settings.mirror_settings.docs.doc_link_title"}}
    + {{else if $onlyNewPullMirrorsEnabled}} + {{$.locale.Tr "repo.settings.mirror_settings.docs.disabled_push_mirror.instructions"}} + {{$.locale.Tr "repo.settings.mirror_settings.docs.disabled_push_mirror.pull_mirror_warning"}} + {{$.locale.Tr "repo.settings.mirror_settings.docs.doc_link_title"}}

    + {{$.locale.Tr "repo.settings.mirror_settings.docs.disabled_push_mirror.info"}} + {{if $existingPushMirror}} + {{$.locale.Tr "repo.settings.mirror_settings.docs.can_still_use"}} + {{end}} + {{else}} + {{$.locale.Tr "repo.settings.mirror_settings.docs.no_new_mirrors"}} {{$.locale.Tr "repo.settings.mirror_settings.docs.can_still_use"}}
    + {{end}} + + {{if $existingPushMirror}} + + + + + + + + + {{end}} + {{if $modifyBrokenPullMirror}} + {{/* even if a repo is a pull mirror (IsMirror=true), the PullMirror might still be nil if the mirror migration is broken */}} + + + + + + {{else if $isWorkingPullMirror}} + + + + + + + + + + + + + {{end}}{{/* end if: IsMirror */}} + + {{range .PushMirrors}} + + {{$address := MirrorRemoteAddress $.Context $.Repository .GetRemoteName true}} + + + + + + {{else}} + + + + {{end}} + {{if (not .DisableNewPushMirrors)}} + + + + {{end}} + +
    {{$.locale.Tr "repo.settings.mirror_settings.mirrored_repository"}}{{$.locale.Tr "repo.settings.mirror_settings.direction"}}{{$.locale.Tr "repo.settings.mirror_settings.last_update"}}
    + {{$.locale.Tr "repo.settings.mirror_settings.direction.pull"}}: {{$.locale.Tr "error.occurred"}} +
    {{(MirrorRemoteAddress $.Context .Repository .PullMirror.GetRemoteName false).Address}}{{$.locale.Tr "repo.settings.mirror_settings.direction.pull"}}{{DateTime "full" .PullMirror.UpdatedUnix}} +
    + {{.CsrfTokenHtml}} + + +
    +
    +
    + {{template "base/disable_form_autofill"}} + {{.CsrfTokenHtml}} + +
    + +
    + + +
    +
    +
    + + +
    + {{$address := MirrorRemoteAddress $.Context .Repository .PullMirror.GetRemoteName false}} +
    + + +

    {{.locale.Tr "repo.mirror_address_desc"}}

    +
    +
    + + {{.locale.Tr "repo.need_auth"}} + +
    +
    + + +
    +
    + + +
    +

    {{.locale.Tr "repo.mirror_password_help"}}

    +
    +
    + + {{if .LFSStartServer}} +
    + +
    + + +
    +
    +
    + + +

    {{.locale.Tr "repo.mirror_lfs_endpoint_desc" "https://github.com/git-lfs/git-lfs/blob/main/docs/api/server-discovery.md#server-discovery" | Str2html}}

    +
    + {{end}} +
    + +
    +
    +
    {{$address.Address}}{{$.locale.Tr "repo.settings.mirror_settings.direction.push"}}{{if .LastUpdateUnix}}{{DateTime "full" .LastUpdateUnix}}{{else}}{{$.locale.Tr "never"}}{{end}} {{if .LastError}}
    {{$.locale.Tr "error"}}
    {{end}}
    +
    + {{$.CsrfTokenHtml}} + + + +
    +
    + {{$.CsrfTokenHtml}} + + + +
    +
    {{$.locale.Tr "repo.settings.mirror_settings.push_mirror.none"}}
    +
    + {{template "base/disable_form_autofill"}} + {{.CsrfTokenHtml}} + +
    + + +

    {{.locale.Tr "repo.mirror_address_desc"}}

    +
    +
    + + {{.locale.Tr "repo.need_auth"}} + +
    +
    + + +
    +
    + + +
    +
    +
    +
    +
    + + +
    +
    +
    + + +
    +
    + +
    +
    +
    +
    + {{end}} + +

    + {{.locale.Tr "repo.settings.advanced_settings"}} +

    +
    +
    + {{.CsrfTokenHtml}} + + + {{$isCodeEnabled := .Repository.UnitEnabled $.Context $.UnitTypeCode}} +
    + + {{if .UnitTypeCode.UnitGlobalDisabled}} +
    + {{else}} +
    + {{end}} + + +
    +
    + + {{$isWikiEnabled := or (.Repository.UnitEnabled $.Context $.UnitTypeWiki) (.Repository.UnitEnabled $.Context $.UnitTypeExternalWiki)}} +
    + + {{if and (.UnitTypeWiki.UnitGlobalDisabled) (.UnitTypeExternalWiki.UnitGlobalDisabled)}} +
    + {{else}} +
    + {{end}} + + +
    +
    +
    +
    + {{if .UnitTypeWiki.UnitGlobalDisabled}} +
    + {{else}} +
    + {{end}} + + +
    +
    +
    + {{if .UnitTypeExternalWiki.UnitGlobalDisabled}} +
    + {{else}} +
    + {{end}} + + +
    +
    +
    + + +

    {{.locale.Tr "repo.settings.external_wiki_url_desc"}}

    +
    +
    + +
    + + {{$isIssuesEnabled := or (.Repository.UnitEnabled $.Context $.UnitTypeIssues) (.Repository.UnitEnabled $.Context $.UnitTypeExternalTracker)}} +
    + + {{if and (.UnitTypeIssues.UnitGlobalDisabled) (.UnitTypeExternalTracker.UnitGlobalDisabled)}} +
    + {{else}} +
    + {{end}} + + +
    +
    +
    +
    + {{if .UnitTypeIssues.UnitGlobalDisabled}} +
    + {{else}} +
    + {{end}} + + +
    +
    +
    + {{if .Repository.CanEnableTimetracker}} +
    +
    + + +
    +
    +
    +
    + + +
    +
    + {{end}} +
    +
    + + +
    +
    +
    + + +
    +
    +
    + {{if .UnitTypeExternalTracker.UnitGlobalDisabled}} +
    + {{else}} +
    + {{end}} + + +
    +
    +
    +
    + + +

    {{.locale.Tr "repo.settings.external_tracker_url_desc"}}

    +
    +
    + + +

    {{.locale.Tr "repo.settings.tracker_url_format_desc" | Str2html}}

    +
    +
    + +
    +
    + {{$externalTracker := (.Repository.MustGetUnit $.Context $.UnitTypeExternalTracker)}} + {{$externalTrackerStyle := $externalTracker.ExternalTrackerConfig.ExternalTrackerStyle}} + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +

    {{.locale.Tr "repo.settings.tracker_issue_style.regexp_pattern_desc" | Str2html}}

    +
    +
    +
    + +
    + + {{$isProjectsEnabled := .Repository.UnitEnabled $.Context $.UnitTypeProjects}} +
    + + {{if .UnitTypeProjects.UnitGlobalDisabled}} +
    + {{else}} +
    + {{end}} + + +
    +
    + + {{$isReleasesEnabled := .Repository.UnitEnabled $.Context $.UnitTypeReleases}} +
    + + {{if .UnitTypeReleases.UnitGlobalDisabled}} +
    + {{else}} +
    + {{end}} + + +
    +
    + + {{$isPackagesEnabled := .Repository.UnitEnabled $.Context $.UnitTypePackages}} +
    + + {{if .UnitTypePackages.UnitGlobalDisabled}} +
    + {{else}} +
    + {{end}} + + +
    +
    + + {{if .EnableActions}} + {{$isActionsEnabled := .Repository.UnitEnabled $.Context $.UnitTypeActions}} +
    + + {{if .UnitTypeActions.UnitGlobalDisabled}} +
    + {{else}} +
    + {{end}} + + +
    +
    + {{end}} + + {{if not .IsMirror}} +
    + {{$pullRequestEnabled := .Repository.UnitEnabled $.Context $.UnitTypePullRequests}} + {{$prUnit := .Repository.MustGetUnit $.Context $.UnitTypePullRequests}} +
    + + {{if .UnitTypePullRequests.UnitGlobalDisabled}} +
    + {{else}} +
    + {{end}} + + +
    +
    +
    +
    +

    + {{.locale.Tr "repo.settings.merge_style_desc"}} +

    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    + +
    +

    + {{.locale.Tr "repo.settings.default_merge_style_desc"}} +

    + +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    + {{end}} + +
    +
    + +
    + +
    + +

    + {{.locale.Tr "repo.settings.signing_settings"}} +

    +
    +
    + {{.CsrfTokenHtml}} + +
    +
    +
    +
    + + +

    {{.locale.Tr "repo.settings.trust_model.default.desc"}}

    +
    +
    +
    +
    + + +

    {{.locale.Tr "repo.settings.trust_model.collaborator.desc"}}

    +
    +
    +
    +
    + + +

    {{.locale.Tr "repo.settings.trust_model.committer.desc"}}

    +
    +
    +
    +
    + + +

    {{.locale.Tr "repo.settings.trust_model.collaboratorcommitter.desc"}}

    +
    +
    +
    + +
    +
    + +
    +
    +
    + + {{if .IsAdmin}} +

    + {{.locale.Tr "repo.settings.admin_settings"}} +

    +
    +
    + {{.CsrfTokenHtml}} + +
    +
    + + +
    +
    + +
    + +
    +
    + +
    +
    + {{.CsrfTokenHtml}} + + {{if .CodeIndexerEnabled}} +

    {{.locale.Tr "repo.settings.admin_code_indexer"}}

    +
    + + + {{if .CodeIndexerStatus}} + + {{ShortSha .CodeIndexerStatus.CommitSha}} + + {{else}} + {{.locale.Tr "repo.settings.admin_indexer_unindexed"}} + {{end}} + +
    + +
    +
    + {{end}} +

    {{.locale.Tr "repo.settings.admin_stats_indexer"}}

    +
    + + + {{if .StatsIndexerStatus}} + + {{ShortSha .StatsIndexerStatus.CommitSha}} + + {{else}} + {{.locale.Tr "repo.settings.admin_indexer_unindexed"}} + {{end}} + +
    + +
    +
    +
    +
    + {{end}} + + {{if .Permission.IsOwner}} +

    + {{.locale.Tr "repo.settings.danger_zone"}} +

    +
    + {{if .Repository.IsMirror}} +
    +
    + +
    +
    +
    {{.locale.Tr "repo.settings.convert"}}
    +

    {{.locale.Tr "repo.settings.convert_desc"}}

    +
    +
    +
    + {{end}} + {{if and .Repository.IsFork .Repository.Owner.CanCreateRepo}} +
    +
    + +
    +
    +
    {{.locale.Tr "repo.settings.convert_fork"}}
    +

    {{.locale.Tr "repo.settings.convert_fork_desc"}}

    +
    +
    +
    + {{end}} +
    +
    + {{if .RepoTransfer}} +
    + {{.CsrfTokenHtml}} + + +
    + {{else}} + + {{end}} +
    +
    +
    {{.locale.Tr "repo.settings.transfer"}}
    + {{if .RepoTransfer}} +

    {{.locale.Tr "repo.settings.transfer_started" .RepoTransfer.Recipient.DisplayName}}

    + {{else}} +

    {{.locale.Tr "repo.settings.transfer_desc"}}

    + {{end}} +
    +
    + + {{if .Permission.CanRead $.UnitTypeWiki}} +
    + +
    +
    + +
    +
    +
    {{.locale.Tr "repo.settings.wiki_delete"}}
    +

    {{.locale.Tr "repo.settings.wiki_delete_desc"}}

    +
    +
    + {{end}} + +
    + +
    +
    + +
    +
    +
    {{.locale.Tr "repo.settings.delete"}}
    +

    {{.locale.Tr "repo.settings.delete_desc"}}

    +
    +
    + + {{if not .Repository.IsMirror}} +
    + +
    +
    + +
    +
    + {{if .Repository.IsArchived}} +
    {{.locale.Tr "repo.settings.unarchive.header"}}
    +

    {{.locale.Tr "repo.settings.unarchive.text"}}

    + {{else}} +
    {{.locale.Tr "repo.settings.archive.header"}}
    +

    {{.locale.Tr "repo.settings.archive.text"}}

    + {{end}} +
    +
    + {{end}} +
    + {{end}} +
    +{{template "repo/settings/layout_footer" .}} + +{{if .Permission.IsOwner}} + {{if .Repository.IsMirror}} + + {{end}} + {{if and .Repository.IsFork .Repository.Owner.CanCreateRepo}} + + {{end}} + + + + + {{if .Repository.UnitEnabled $.Context $.UnitTypeWiki}} + + {{end}} + + {{if not .Repository.IsMirror}} + + {{end}} +{{end}} diff --git a/src/templates/repo/settings/protected_branch.tmpl b/src/templates/repo/settings/protected_branch.tmpl new file mode 100644 index 0000000..42c7819 --- /dev/null +++ b/src/templates/repo/settings/protected_branch.tmpl @@ -0,0 +1,263 @@ +{{template "repo/settings/layout_head" (dict "ctxData" . "pageClass" "repository settings branches")}} +
    +
    +

    + {{.locale.Tr "repo.settings.branch_protection" (.Rule.RuleName|Escape) | Str2html}} +

    +
    +
    {{.locale.Tr "repo.settings.protect_patterns"}}
    +
    + + + +
    +
    + + +

    {{.locale.Tr "repo.settings.protect_protected_file_patterns_desc" | Safe}}

    +
    +
    + + +

    {{.locale.Tr "repo.settings.protect_unprotected_file_patterns_desc" | Safe}}

    +
    + + {{.CsrfTokenHtml}} +
    {{.locale.Tr "repo.settings.event_push"}}
    +
    +
    + + +

    {{.locale.Tr "repo.settings.protect_disable_push_desc"}}

    +
    +
    +
    +
    + + +

    {{.locale.Tr "repo.settings.protect_enable_push_desc"}}

    +
    +
    +
    +
    +
    + + +

    {{.locale.Tr "repo.settings.protect_whitelist_committers_desc"}}

    +
    +
    +
    +
    + + +
    + {{if .Owner.IsOrganization}} +
    + + +
    + {{end}} +
    +
    + + +
    +
    +
    +
    +
    +
    + + +

    {{.locale.Tr "repo.settings.require_signed_commits_desc"}}

    +
    +
    +
    {{.locale.Tr "repo.settings.event_pull_request_approvals"}}
    +
    + + +

    {{.locale.Tr "repo.settings.protect_required_approvals_desc"}}

    +
    +
    +
    +
    + + +

    {{.locale.Tr "repo.settings.protect_approvals_whitelist_enabled_desc"}}

    +
    +
    +
    +
    + + +
    + {{if .Owner.IsOrganization}} +
    + + +
    + {{end}} +
    +
    +
    +
    + + +

    {{.locale.Tr "repo.settings.dismiss_stale_approvals_desc"}}

    +
    +
    +
    +
    +
    + + +

    {{.locale.Tr "repo.settings.protect_check_status_contexts_desc"}}

    +
    +
    +
    + + +

    {{.locale.Tr "repo.settings.protect_status_check_patterns_desc"}}

    + + + + + + + + {{range $.recent_status_checks}} + + + + {{else}} + + {{end}} + +
    {{.locale.Tr "repo.settings.protect_check_status_contexts_list"}}
    + {{.}} + {{$.locale.Tr "repo.settings.protect_status_check_matched"}} +
    -
    +
    +
    +
    {{.locale.Tr "repo.settings.event_pull_request_merge"}}
    +
    +
    +
    + + +

    {{.locale.Tr "repo.settings.protect_enable_merge_desc"}}

    +
    +
    +
    +
    + + +

    {{.locale.Tr "repo.settings.protect_merge_whitelist_committers_desc"}}

    +
    +
    +
    +
    + + +
    + {{if .Owner.IsOrganization}} +
    + + +
    + {{end}} +
    +
    +
    +
    + + +

    {{.locale.Tr "repo.settings.block_rejected_reviews_desc"}}

    +
    +
    +
    +
    + + +

    {{.locale.Tr "repo.settings.block_on_official_review_requests_desc"}}

    +
    +
    +
    +
    + + +

    {{.locale.Tr "repo.settings.block_outdated_branch_desc"}}

    +
    +
    +
    + +
    + +
    +
    +
    +
    +{{template "repo/settings/layout_footer" .}} diff --git a/src/templates/repo/settings/runner_edit.tmpl b/src/templates/repo/settings/runner_edit.tmpl new file mode 100644 index 0000000..8b76aea --- /dev/null +++ b/src/templates/repo/settings/runner_edit.tmpl @@ -0,0 +1,5 @@ +{{template "repo/settings/layout_head" (dict "ctxData" . "pageClass" "repository settings runners")}} +
    + {{template "shared/actions/runner_edit" .}} +
    +{{template "repo/settings/layout_footer" .}} diff --git a/src/templates/repo/settings/secrets.tmpl b/src/templates/repo/settings/secrets.tmpl new file mode 100644 index 0000000..0b89639 --- /dev/null +++ b/src/templates/repo/settings/secrets.tmpl @@ -0,0 +1,5 @@ +{{template "repo/settings/layout_head" (dict "ctxData" . "pageClass" "repository settings")}} +
    + {{template "shared/secrets/add_list" .}} +
    +{{template "repo/settings/layout_footer" .}} diff --git a/src/templates/repo/settings/tags.tmpl b/src/templates/repo/settings/tags.tmpl new file mode 100644 index 0000000..e618c3f --- /dev/null +++ b/src/templates/repo/settings/tags.tmpl @@ -0,0 +1,126 @@ +{{template "repo/settings/layout_head" (dict "ctxData" . "pageClass" "repository settings edit")}} +
    + {{if .Repository.IsArchived}} +
    + {{.locale.Tr "repo.settings.archive.tagsettings_unavailable"}} +
    + {{else}} +

    + {{.locale.Tr "repo.settings.tags.protection"}} +

    + +
    +
    +
    +
    +
    + {{.CsrfTokenHtml}} +
    + + +
    +
    + + +
    + {{if .Owner.IsOrganization}} +
    + + +
    + {{end}} +
    + {{if .PageIsEditProtectedTag}} + + + {{$.locale.Tr "cancel"}} + + {{else}} + + {{end}} +
    +
    +
    +
    + +
    + + + + + + + + {{range .ProtectedTags}} + + + + + + {{else}} + + {{end}} + +
    {{.locale.Tr "repo.settings.tags.protection.pattern"}}{{.locale.Tr "repo.settings.tags.protection.allowed"}}
    {{.NamePattern}}
    + {{if or .AllowlistUserIDs (and $.Owner.IsOrganization .AllowlistTeamIDs)}} + {{$userIDs := .AllowlistUserIDs}} + {{range $.Users}} + {{if SliceUtils.Contains $userIDs .ID}} + {{avatar $.Context . 26}} {{.GetDisplayName}} + {{end}} + {{end}} + {{if $.Owner.IsOrganization}} + {{$teamIDs := .AllowlistTeamIDs}} + {{range $.Teams}} + {{if SliceUtils.Contains $teamIDs .ID}} + {{.Name}} + {{end}} + {{end}} + {{end}} + {{else}} + {{$.locale.Tr "repo.settings.tags.protection.allowed.noone"}} + {{end}} + + {{$.locale.Tr "edit"}} +
    + {{$.CsrfTokenHtml}} + + +
    +
    {{.locale.Tr "repo.settings.tags.protection.none"}}
    +
    +
    +
    + {{end}} +
    +{{template "repo/settings/layout_footer" .}} diff --git a/src/templates/repo/settings/webhook/base.tmpl b/src/templates/repo/settings/webhook/base.tmpl new file mode 100644 index 0000000..d524722 --- /dev/null +++ b/src/templates/repo/settings/webhook/base.tmpl @@ -0,0 +1,5 @@ +{{template "repo/settings/layout_head" (dict "ctxData" . "pageClass" "repository settings webhooks")}} +
    + {{template "repo/settings/webhook/list" .}} +
    +{{template "repo/settings/layout_footer" .}} diff --git a/src/templates/repo/settings/webhook/base_list.tmpl b/src/templates/repo/settings/webhook/base_list.tmpl new file mode 100644 index 0000000..663fde1 --- /dev/null +++ b/src/templates/repo/settings/webhook/base_list.tmpl @@ -0,0 +1,58 @@ +

    + {{.Title}} + +

    +
    +
    +
    + {{.Description | Str2html}} +
    + {{range .Webhooks}} +
    + {{svg "octicon-dot-fill" 22}} + {{.URL}} + {{svg "octicon-pencil"}} + {{svg "octicon-trash"}} +
    + {{end}} +
    +
    diff --git a/src/templates/repo/settings/webhook/delete_modal.tmpl b/src/templates/repo/settings/webhook/delete_modal.tmpl new file mode 100644 index 0000000..b78e69e --- /dev/null +++ b/src/templates/repo/settings/webhook/delete_modal.tmpl @@ -0,0 +1,10 @@ + diff --git a/src/templates/repo/settings/webhook/dingtalk.tmpl b/src/templates/repo/settings/webhook/dingtalk.tmpl new file mode 100644 index 0000000..25d5adf --- /dev/null +++ b/src/templates/repo/settings/webhook/dingtalk.tmpl @@ -0,0 +1,11 @@ +{{if eq .HookType "dingtalk"}} +

    {{.locale.Tr "repo.settings.add_web_hook_desc" "https://dingtalk.com" (.locale.Tr "repo.settings.web_hook_name_dingtalk") | Str2html}}

    +
    + {{.CsrfTokenHtml}} +
    + + +
    + {{template "repo/settings/webhook/settings" .}} +
    +{{end}} diff --git a/src/templates/repo/settings/webhook/discord.tmpl b/src/templates/repo/settings/webhook/discord.tmpl new file mode 100644 index 0000000..76c7c6b --- /dev/null +++ b/src/templates/repo/settings/webhook/discord.tmpl @@ -0,0 +1,19 @@ +{{if eq .HookType "discord"}} +

    {{.locale.Tr "repo.settings.add_web_hook_desc" "https://discord.com" (.locale.Tr "repo.settings.web_hook_name_discord") | Str2html}}

    +
    + {{.CsrfTokenHtml}} +
    + + +
    +
    + + +
    +
    + + +
    + {{template "repo/settings/webhook/settings" .}} +
    +{{end}} diff --git a/src/templates/repo/settings/webhook/feishu.tmpl b/src/templates/repo/settings/webhook/feishu.tmpl new file mode 100644 index 0000000..7de4430 --- /dev/null +++ b/src/templates/repo/settings/webhook/feishu.tmpl @@ -0,0 +1,12 @@ +{{if eq .HookType "feishu"}} +

    {{.locale.Tr "repo.settings.add_web_hook_desc" "https://feishu.cn" (.locale.Tr "repo.settings.web_hook_name_feishu") | Str2html}}

    +

    {{.locale.Tr "repo.settings.add_web_hook_desc" "https://larksuite.com" (.locale.Tr "repo.settings.web_hook_name_larksuite") | Str2html}}

    +
    + {{.CsrfTokenHtml}} +
    + + +
    + {{template "repo/settings/webhook/settings" .}} +
    +{{end}} diff --git a/src/templates/repo/settings/webhook/gitea.tmpl b/src/templates/repo/settings/webhook/gitea.tmpl new file mode 100644 index 0000000..062948b --- /dev/null +++ b/src/templates/repo/settings/webhook/gitea.tmpl @@ -0,0 +1,40 @@ +{{if eq .HookType "gitea"}} +

    {{.locale.Tr "repo.settings.add_web_hook_desc" "https://docs.gitea.io/en-us/webhooks/" (.locale.Tr "repo.settings.web_hook_name_gitea") | Str2html}}

    +
    + {{template "base/disable_form_autofill"}} + {{.CsrfTokenHtml}} +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    + {{template "repo/settings/webhook/settings" .}} +
    +{{end}} diff --git a/src/templates/repo/settings/webhook/gogs.tmpl b/src/templates/repo/settings/webhook/gogs.tmpl new file mode 100644 index 0000000..f4353fc --- /dev/null +++ b/src/templates/repo/settings/webhook/gogs.tmpl @@ -0,0 +1,28 @@ +{{if eq .HookType "gogs"}} +

    {{.locale.Tr "repo.settings.add_web_hook_desc" "https://docs.gitea.io/en-us/webhooks/" (.locale.Tr "repo.settings.web_hook_name_gogs") | Str2html}}

    +
    + {{template "base/disable_form_autofill"}} + {{.CsrfTokenHtml}} +
    + + +
    +
    + + +
    +
    + + +
    + {{template "repo/settings/webhook/settings" .}} +
    +{{end}} diff --git a/src/templates/repo/settings/webhook/history.tmpl b/src/templates/repo/settings/webhook/history.tmpl new file mode 100644 index 0000000..7020bf0 --- /dev/null +++ b/src/templates/repo/settings/webhook/history.tmpl @@ -0,0 +1,81 @@ +{{if .PageIsSettingsHooksEdit}} +

    + {{.locale.Tr "repo.settings.recent_deliveries"}} + {{if .Permission.IsAdmin}} +
    + +
    + {{end}} +

    +
    +
    + {{range .History}} +
    +
    + {{if .IsSucceed}} + {{svg "octicon-check"}} + {{else}} + {{svg "octicon-alert"}} + {{end}} + {{.UUID}} +
    + + {{TimeSince .Delivered.AsTime $.locale}} + +
    +
    +
    + +
    + {{if .RequestInfo}} +
    {{$.locale.Tr "repo.settings.webhook.headers"}}
    +
    Request URL: {{.RequestInfo.URL}}
    +Request method: {{if .RequestInfo.HTTPMethod}}{{.RequestInfo.HTTPMethod}}{{else}}POST{{end}}
    +{{range $key, $val := .RequestInfo.Headers}}{{$key}}: {{$val}}
    +{{end}}
    +
    {{$.locale.Tr "repo.settings.webhook.payload"}}
    +
    {{.PayloadContent}}
    + {{else}} + - + {{end}} +
    +
    + {{if .ResponseInfo}} +
    {{$.locale.Tr "repo.settings.webhook.headers"}}
    +
    {{range $key, $val := .ResponseInfo.Headers}}{{$key}}: {{$val}}
    +{{end}}
    +
    {{$.locale.Tr "repo.settings.webhook.body"}}
    +
    {{.ResponseInfo.Body}}
    + {{else}} + - + {{end}} +
    +
    +
    + {{end}} +
    +
    +{{end}} diff --git a/src/templates/repo/settings/webhook/list.tmpl b/src/templates/repo/settings/webhook/list.tmpl new file mode 100644 index 0000000..b24159f --- /dev/null +++ b/src/templates/repo/settings/webhook/list.tmpl @@ -0,0 +1,4 @@ + +{{template "repo/settings/webhook/base_list" .}} + +{{template "repo/settings/webhook/delete_modal" .}} diff --git a/src/templates/repo/settings/webhook/matrix.tmpl b/src/templates/repo/settings/webhook/matrix.tmpl new file mode 100644 index 0000000..d3ab558 --- /dev/null +++ b/src/templates/repo/settings/webhook/matrix.tmpl @@ -0,0 +1,27 @@ +{{if eq .HookType "matrix"}} +

    {{.locale.Tr "repo.settings.add_web_hook_desc" "https://matrix.org/" (.locale.Tr "repo.settings.web_hook_name_matrix") | Str2html}}

    +
    + {{.CsrfTokenHtml}} +
    + + +
    +
    + + +
    +
    + + +
    + {{template "repo/settings/webhook/settings" .}} +
    +{{end}} diff --git a/src/templates/repo/settings/webhook/msteams.tmpl b/src/templates/repo/settings/webhook/msteams.tmpl new file mode 100644 index 0000000..fecb4d9 --- /dev/null +++ b/src/templates/repo/settings/webhook/msteams.tmpl @@ -0,0 +1,11 @@ +{{if eq .HookType "msteams"}} +

    {{.locale.Tr "repo.settings.add_web_hook_desc" "https://teams.microsoft.com" (.locale.Tr "repo.settings.web_hook_name_msteams") | Str2html}}

    +
    + {{.CsrfTokenHtml}} +
    + + +
    + {{template "repo/settings/webhook/settings" .}} +
    +{{end}} diff --git a/src/templates/repo/settings/webhook/new.tmpl b/src/templates/repo/settings/webhook/new.tmpl new file mode 100644 index 0000000..73d6726 --- /dev/null +++ b/src/templates/repo/settings/webhook/new.tmpl @@ -0,0 +1,47 @@ +{{template "repo/settings/layout_head" (dict "ctxData" . "pageClass" "repository settings new webhook")}} +
    +

    + {{if .PageIsSettingsHooksNew}}{{.locale.Tr "repo.settings.add_webhook"}}{{else}}{{.locale.Tr "repo.settings.update_webhook"}}{{end}} +
    + {{if eq .HookType "gitea"}} + + {{else if eq .HookType "gogs"}} + + {{else if eq .HookType "slack"}} + + {{else if eq .HookType "discord"}} + + {{else if eq .HookType "dingtalk"}} + + {{else if eq .HookType "telegram"}} + + {{else if eq .HookType "msteams"}} + + {{else if eq .HookType "feishu"}} + + {{else if eq .HookType "matrix"}} + {{svg "gitea-matrix" 26}} + {{else if eq .HookType "wechatwork"}} + + {{else if eq .HookType "packagist"}} + + {{end}} +
    +

    +
    + {{template "repo/settings/webhook/gitea" .}} + {{template "repo/settings/webhook/gogs" .}} + {{template "repo/settings/webhook/slack" .}} + {{template "repo/settings/webhook/discord" .}} + {{template "repo/settings/webhook/dingtalk" .}} + {{template "repo/settings/webhook/telegram" .}} + {{template "repo/settings/webhook/msteams" .}} + {{template "repo/settings/webhook/feishu" .}} + {{template "repo/settings/webhook/matrix" .}} + {{template "repo/settings/webhook/wechatwork" .}} + {{template "repo/settings/webhook/packagist" .}} +
    + + {{template "repo/settings/webhook/history" .}} +
    +{{template "repo/settings/layout_footer" .}} diff --git a/src/templates/repo/settings/webhook/packagist.tmpl b/src/templates/repo/settings/webhook/packagist.tmpl new file mode 100644 index 0000000..43c1f17 --- /dev/null +++ b/src/templates/repo/settings/webhook/packagist.tmpl @@ -0,0 +1,19 @@ +{{if eq .HookType "packagist"}} +

    {{.locale.Tr "repo.settings.add_web_hook_desc" "https://packagist.org" (.locale.Tr "repo.settings.web_hook_name_packagist") | Str2html}}

    +
    + {{.CsrfTokenHtml}} +
    + + +
    +
    + + +
    +
    + + +
    + {{template "repo/settings/webhook/settings" .}} +
    +{{end}} diff --git a/src/templates/repo/settings/webhook/settings.tmpl b/src/templates/repo/settings/webhook/settings.tmpl new file mode 100644 index 0000000..8b03a3c --- /dev/null +++ b/src/templates/repo/settings/webhook/settings.tmpl @@ -0,0 +1,288 @@ +{{$isNew:=or .PageIsSettingsHooksNew .PageIsAdminDefaultHooksNew .PageIsAdminSystemHooksNew}} +
    +

    {{.locale.Tr "repo.settings.event_desc"}}

    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    + +
    + +
    + +
    + +
    +
    +
    + + + {{.locale.Tr "repo.settings.event_create_desc"}} +
    +
    +
    + +
    +
    +
    + + + {{.locale.Tr "repo.settings.event_delete_desc"}} +
    +
    +
    + +
    +
    +
    + + + {{.locale.Tr "repo.settings.event_fork_desc"}} +
    +
    +
    + +
    +
    +
    + + + {{.locale.Tr "repo.settings.event_push_desc"}} +
    +
    +
    + +
    +
    +
    + + + {{.locale.Tr "repo.settings.event_repository_desc"}} +
    +
    +
    + +
    +
    +
    + + + {{.locale.Tr "repo.settings.event_release_desc"}} +
    +
    +
    + +
    +
    +
    + + + {{.locale.Tr "repo.settings.event_package_desc"}} +
    +
    +
    + + +
    +
    +
    + + + {{.locale.Tr "repo.settings.event_wiki_desc"}} +
    +
    +
    + + +
    + +
    + +
    +
    +
    + + + {{.locale.Tr "repo.settings.event_issues_desc"}} +
    +
    +
    + +
    +
    +
    + + + {{.locale.Tr "repo.settings.event_issue_assign_desc"}} +
    +
    +
    + +
    +
    +
    + + + {{.locale.Tr "repo.settings.event_issue_label_desc"}} +
    +
    +
    + +
    +
    +
    + + + {{.locale.Tr "repo.settings.event_issue_milestone_desc"}} +
    +
    +
    + +
    +
    +
    + + + {{.locale.Tr "repo.settings.event_issue_comment_desc"}} +
    +
    +
    + + +
    + +
    + +
    +
    +
    + + + {{.locale.Tr "repo.settings.event_pull_request_desc"}} +
    +
    +
    + +
    +
    +
    + + + {{.locale.Tr "repo.settings.event_pull_request_assign_desc"}} +
    +
    +
    + +
    +
    +
    + + + {{.locale.Tr "repo.settings.event_pull_request_label_desc"}} +
    +
    +
    + +
    +
    +
    + + + {{.locale.Tr "repo.settings.event_pull_request_milestone_desc"}} +
    +
    +
    + +
    +
    +
    + + + {{.locale.Tr "repo.settings.event_pull_request_comment_desc"}} +
    +
    +
    + +
    +
    +
    + + + {{.locale.Tr "repo.settings.event_pull_request_review_desc"}} +
    +
    +
    + +
    +
    +
    + + + {{.locale.Tr "repo.settings.event_pull_request_sync_desc"}} +
    +
    +
    + +
    +
    +
    + + + {{.locale.Tr "repo.settings.event_pull_request_review_request_desc"}} +
    +
    +
    +
    +
    + + +
    + + + {{.locale.Tr "repo.settings.branch_filter_desc" | Str2html}} +
    + + +
    + + + {{if ne .HookType "matrix"}}{{/* Matrix doesn't make the authorization optional but it is implied by the help string, should be changed.*/}} + {{.locale.Tr "repo.settings.authorization_header_desc" "Bearer token123456, Basic YWxhZGRpbjpvcGVuc2VzYW1l" | Str2html}} + {{end}} +
    + +
    + +
    +
    + + + {{.locale.Tr "repo.settings.active_helper"}} +
    +
    +
    + {{if $isNew}} + + {{else}} + + {{.locale.Tr "repo.settings.delete_webhook"}} + {{end}} +
    + +{{template "repo/settings/webhook/delete_modal" .}} diff --git a/src/templates/repo/settings/webhook/slack.tmpl b/src/templates/repo/settings/webhook/slack.tmpl new file mode 100644 index 0000000..762cfb3 --- /dev/null +++ b/src/templates/repo/settings/webhook/slack.tmpl @@ -0,0 +1,28 @@ +{{if eq .HookType "slack"}} +

    {{.locale.Tr "repo.settings.add_web_hook_desc" "https://slack.com" (.locale.Tr "repo.settings.web_hook_name_slack") | Str2html}}

    +
    + {{.CsrfTokenHtml}} +
    + + +
    +
    + + +
    + +
    + + +
    +
    + + +
    +
    + + +
    + {{template "repo/settings/webhook/settings" .}} +
    +{{end}} diff --git a/src/templates/repo/settings/webhook/telegram.tmpl b/src/templates/repo/settings/webhook/telegram.tmpl new file mode 100644 index 0000000..4313980 --- /dev/null +++ b/src/templates/repo/settings/webhook/telegram.tmpl @@ -0,0 +1,15 @@ +{{if eq .HookType "telegram"}} +

    {{.locale.Tr "repo.settings.add_web_hook_desc" "https://core.telegram.org/bots" (.locale.Tr "repo.settings.web_hook_name_telegram") | Str2html}}

    +
    + {{.CsrfTokenHtml}} +
    + + +
    +
    + + +
    + {{template "repo/settings/webhook/settings" .}} +
    +{{end}} diff --git a/src/templates/repo/settings/webhook/wechatwork.tmpl b/src/templates/repo/settings/webhook/wechatwork.tmpl new file mode 100644 index 0000000..a84bbfa --- /dev/null +++ b/src/templates/repo/settings/webhook/wechatwork.tmpl @@ -0,0 +1,11 @@ +{{if eq .HookType "wechatwork"}} +

    {{.locale.Tr "repo.settings.add_web_hook_desc" "https://work.weixin.qq.com" (.locale.Tr "repo.settings.web_hook_name_wechatwork") | Str2html}}

    +
    + {{.CsrfTokenHtml}} +
    + + +
    + {{template "repo/settings/webhook/settings" .}} +
    +{{end}} diff --git a/src/templates/repo/shabox_badge.tmpl b/src/templates/repo/shabox_badge.tmpl new file mode 100644 index 0000000..2418d95 --- /dev/null +++ b/src/templates/repo/shabox_badge.tmpl @@ -0,0 +1,15 @@ +
    + {{if .verification.Verified}} +
    + {{if ne .verification.SigningUser.ID 0}} + {{svg "gitea-lock"}} + {{avatar $.root.Context .verification.SigningUser 28 "signature"}} + {{else}} + {{svg "gitea-lock-cog"}} + {{avatarByEmail $.root.Context .verification.SigningEmail "" 28 "signature"}} + {{end}} +
    + {{else}} + {{svg "gitea-unlock"}} + {{end}} +
    diff --git a/src/templates/repo/sub_menu.tmpl b/src/templates/repo/sub_menu.tmpl new file mode 100644 index 0000000..bfe5a20 --- /dev/null +++ b/src/templates/repo/sub_menu.tmpl @@ -0,0 +1,50 @@ +{{if and (not .HideRepoInfo) (not .IsBlame)}} +
    + + {{if and (.Permission.CanRead $.UnitTypeCode) (not .IsEmptyRepo) .LanguageStats}} + + + {{range .LanguageStats}} +
     
    + {{end}} +
    + {{end}} +
    +{{end}} diff --git a/src/templates/repo/tag/list.tmpl b/src/templates/repo/tag/list.tmpl new file mode 100644 index 0000000..8651bfe --- /dev/null +++ b/src/templates/repo/tag/list.tmpl @@ -0,0 +1,79 @@ +{{template "base/head" .}} +
    + {{template "repo/header" .}} +
    + {{template "base/alert" .}} + {{template "repo/release_tag_header" .}} +

    +
    + {{svg "octicon-tag" 16 "gt-mr-2"}}{{.locale.Tr "repo.release.tags"}} +
    +

    + {{$canReadReleases := $.Permission.CanRead $.UnitTypeReleases}} +
    + + + {{range $idx, $release := .Releases}} + + + + {{end}} + +
    +

    + {{if $canReadReleases}} + {{.TagName}} + {{else}} + {{.TagName}} + {{end}} +

    +
    + {{if $.Permission.CanRead $.UnitTypeCode}} + {{if .CreatedUnix}} + {{svg "octicon-clock" 16 "gt-mr-2"}}{{TimeSinceUnix .CreatedUnix $.locale}} + {{end}} + + {{svg "octicon-git-commit" 16 "gt-mr-2"}}{{ShortSha .Sha1}} + + {{if not $.DisableDownloadSourceArchives}} + {{svg "octicon-file-zip" 16 "gt-mr-2"}}ZIP + {{svg "octicon-file-zip" 16 "gt-mr-2"}}TAR.GZ + {{end}} + + {{if (and $canReadReleases $.CanCreateRelease $release.IsTag)}} + {{svg "octicon-tag" 16 "gt-mr-2"}}{{$.locale.Tr "repo.release.new_release"}} + {{end}} + + {{if (and ($.Permission.CanWrite $.UnitTypeCode) $release.IsTag)}} + + {{svg "octicon-trash" 16 "gt-mr-2"}}{{$.locale.Tr "repo.release.delete_tag"}} + + {{end}} + + {{if and $canReadReleases (not $release.IsTag)}} + {{svg "octicon-tag" 16 "gt-mr-2"}}{{$.locale.Tr "repo.release.detail"}} + {{end}} + {{end}} +
    +
    +
    + + {{template "base/paginate" .}} +
    +
    + +{{if $.Permission.CanWrite $.UnitTypeCode}} + +{{end}} + + +{{template "base/footer" .}} diff --git a/src/templates/repo/unicode_escape_prompt.tmpl b/src/templates/repo/unicode_escape_prompt.tmpl new file mode 100644 index 0000000..12eff6a --- /dev/null +++ b/src/templates/repo/unicode_escape_prompt.tmpl @@ -0,0 +1,22 @@ +{{if .EscapeStatus}} + {{if .EscapeStatus.HasInvisible}} +
    + +
    + {{$.root.locale.Tr "repo.invisible_runes_header"}} +
    +

    {{$.root.locale.Tr "repo.invisible_runes_description" | Str2html}}

    + {{if .EscapeStatus.HasAmbiguous}} +

    {{$.root.locale.Tr "repo.ambiguous_runes_description" | Str2html}}

    + {{end}} +
    + {{else if .EscapeStatus.HasAmbiguous}} +
    + +
    + {{$.root.locale.Tr "repo.ambiguous_runes_header"}} +
    +

    {{$.root.locale.Tr "repo.ambiguous_runes_description" | Str2html}}

    +
    + {{end}} +{{end}} diff --git a/src/templates/repo/upload.tmpl b/src/templates/repo/upload.tmpl new file mode 100644 index 0000000..6ab4451 --- /dev/null +++ b/src/templates/repo/upload.tmpl @@ -0,0 +1,15 @@ +
    +
    +
    diff --git a/src/templates/repo/user_cards.tmpl b/src/templates/repo/user_cards.tmpl new file mode 100644 index 0000000..e956f65 --- /dev/null +++ b/src/templates/repo/user_cards.tmpl @@ -0,0 +1,29 @@ +
    + {{if .CardsTitle}} +

    + {{.CardsTitle}} +

    + {{end}} +
      + {{range .Cards}} +
    • + + {{avatar $.Context .}} + +

      {{.DisplayName}}

      + +
      + {{if .Website}} + {{svg "octicon-link"}} {{.Website}} + {{else if .Location}} + {{svg "octicon-location"}} {{.Location}} + {{else}} + {{svg "octicon-clock"}} {{$.locale.Tr "user.joined_on" (DateTime "short" .CreatedUnix) | Safe}} + {{end}} +
      +
    • + {{end}} +
    + + {{template "base/paginate" .}} +
    diff --git a/src/templates/repo/view_file.tmpl b/src/templates/repo/view_file.tmpl new file mode 100644 index 0000000..96339c9 --- /dev/null +++ b/src/templates/repo/view_file.tmpl @@ -0,0 +1,128 @@ +
    + {{- if .FileError}} +
    +
    {{.FileError}}
    +
    + {{end}} + {{- if .FileWarning}} +
    +
    {{.FileWarning}}
    +
    + {{end}} +

    +
    + {{if .ReadmeInList}} + {{svg "octicon-book" 16 "gt-mr-3"}} + {{.FileName}} + {{else}} + {{template "repo/file_info" .}} + {{end}} +
    +
    + {{if .HasSourceRenderedToggle}} + + {{end}} + {{if not .ReadmeInList}} +
    + {{.locale.Tr "repo.file_raw"}} + {{if not .IsViewCommit}} + {{.locale.Tr "repo.file_permalink"}} + {{end}} + {{if .IsRepresentableAsText}} + {{.locale.Tr "repo.blame"}} + {{end}} + {{.locale.Tr "repo.file_history"}} + {{if .EscapeStatus.Escaped}} + + + {{end}} +
    + {{svg "octicon-download"}} + {{svg "octicon-copy" 14}} + {{if .EnableFeed}} + {{svg "octicon-rss" 14}} + {{end}} + {{if .Repository.CanEnableEditor}} + {{if .CanEditFile}} + {{svg "octicon-pencil"}} + {{else}} + {{svg "octicon-pencil"}} + {{end}} + {{if .CanDeleteFile}} + {{svg "octicon-trash"}} + {{else}} + {{svg "octicon-trash"}} + {{end}} + {{end}} + {{else if .EscapeStatus.Escaped}} + + + {{end}} +
    +

    +
    + {{if not (or .IsMarkup .IsRenderedHTML)}} + {{template "repo/unicode_escape_prompt" dict "EscapeStatus" .EscapeStatus "root" $}} + {{end}} +
    + {{if .IsMarkup}} + {{if .FileContent}}{{.FileContent | Safe}}{{end}} + {{else if .IsPlainText}} +
    {{if .FileContent}}{{.FileContent | Safe}}{{end}}
    + {{else if not .IsTextSource}} +
    + {{if .IsImageFile}} + + {{else if .IsVideoFile}} + + {{else if .IsAudioFile}} + + {{else if .IsPDFFile}} +
    + {{else}} + {{.locale.Tr "repo.file_view_raw"}} + {{end}} +
    + {{else if .FileSize}} + {{if .IsFileTooLarge}} + + + + + + +
    {{.locale.Tr "repo.file_too_large"}}
    + {{else}} + + + {{range $idx, $code := .FileContent}} + {{$line := Eval $idx "+" 1}} + + + {{if $.EscapeStatus.Escaped}} + + {{end}} + + + {{end}} + +
    {{if (index $.LineEscapeStatus $idx).Escaped}}{{end}}{{$code | Safe}}
    + + {{end}} + {{end}} +
    +
    +
    diff --git a/src/templates/repo/view_list.tmpl b/src/templates/repo/view_list.tmpl new file mode 100644 index 0000000..13b4d3d --- /dev/null +++ b/src/templates/repo/view_list.tmpl @@ -0,0 +1,99 @@ + + + + + + + + + {{if .HasParentPath}} + + + + {{end}} + {{range $item := .Files}} + {{$entry := $item.Entry}} + {{$commit := $item.Commit}} + {{$subModuleFile := $item.SubModuleFile}} + + + + + + {{end}} + +
    + {{if not .LatestCommit}} +
    + {{else}} + {{if .LatestCommitUser}} + {{avatar $.Context .LatestCommitUser 24}} + {{if .LatestCommitUser.FullName}} + {{.LatestCommitUser.FullName}} + {{else}} + {{if .LatestCommit.Author}}{{.LatestCommit.Author.Name}}{{else}}{{.LatestCommitUser.Name}}{{end}} + {{end}} + {{else}} + {{if .LatestCommit.Author}} + {{avatarByEmail $.Context .LatestCommit.Author.Email .LatestCommit.Author.Name 24}} + {{.LatestCommit.Author.Name}} + {{end}} + {{end}} + + {{ShortSha .LatestCommit.ID.String}} + {{if .LatestCommit.Signature}} + {{template "repo/shabox_badge" dict "root" $ "verification" .LatestCommitVerification}} + {{end}} + + {{template "repo/commit_statuses" dict "Status" .LatestCommitStatus "Statuses" .LatestCommitStatuses "root" $}} + {{$commitLink:= printf "%s/commit/%s" .RepoLink (PathEscape .LatestCommit.ID.String)}} + {{RenderCommitMessageLinkSubject $.Context .LatestCommit.Message $.RepoLink $commitLink $.Repository.ComposeMetas}} + {{if IsMultilineCommitMessage .LatestCommit.Message}} + +
    {{RenderCommitBody $.Context .LatestCommit.Message $.RepoLink $.Repository.ComposeMetas}}
    + {{end}} +
    + {{end}} +
    {{if .LatestCommit}}{{if .LatestCommit.Committer}}{{TimeSince .LatestCommit.Committer.When $.locale}}{{end}}{{end}}
    {{svg "octicon-reply"}}..
    + + {{if $entry.IsSubModule}} + {{svg "octicon-file-submodule"}} + {{$refURL := $subModuleFile.RefURL AppUrl $.Repository.FullName $.SSHDomain}} {{/* FIXME: the usage of AppUrl seems incorrect, it would be fixed in the future, use AppSubUrl instead */}} + {{if $refURL}} + {{$entry.Name}}@{{ShortSha $subModuleFile.RefID}} + {{else}} + {{$entry.Name}}@{{ShortSha $subModuleFile.RefID}} + {{end}} + {{else}} + {{if $entry.IsDir}} + {{$subJumpablePathName := $entry.GetSubJumpablePathName}} + {{svg "octicon-file-directory-fill"}} + + {{$subJumpablePathFields := StringUtils.Split $subJumpablePathName "/"}} + {{$subJumpablePathFieldLast := (Eval (len $subJumpablePathFields) "-" 1)}} + {{if eq $subJumpablePathFieldLast 0}} + {{$subJumpablePathName}} + {{else}} + {{$subJumpablePathPrefixes := slice $subJumpablePathFields 0 $subJumpablePathFieldLast}} + {{StringUtils.Join $subJumpablePathPrefixes "/"}}/{{index $subJumpablePathFields $subJumpablePathFieldLast}} + {{end}} + + {{else}} + {{svg (printf "octicon-%s" (EntryIcon $entry))}} + {{$entry.Name}} + {{end}} + {{end}} + + + + {{if $commit}} + {{$commitLink := printf "%s/commit/%s" $.RepoLink (PathEscape $commit.ID.String)}} + {{RenderCommitMessageLinkSubject $.Context $commit.Message $.RepoLink $commitLink $.Repository.ComposeMetas}} + {{else}} +
    + {{end}} +
    +
    {{if $commit}}{{TimeSince $commit.Committer.When $.locale}}{{end}}
    +{{if .ReadmeExist}} + {{template "repo/view_file" .}} +{{end}} diff --git a/src/templates/repo/watchers.tmpl b/src/templates/repo/watchers.tmpl new file mode 100644 index 0000000..1828544 --- /dev/null +++ b/src/templates/repo/watchers.tmpl @@ -0,0 +1,8 @@ +{{template "base/head" .}} +
    + {{template "repo/header" .}} +
    + {{template "repo/user_cards" .}} +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/repo/wiki/new.tmpl b/src/templates/repo/wiki/new.tmpl new file mode 100644 index 0000000..0765cb2 --- /dev/null +++ b/src/templates/repo/wiki/new.tmpl @@ -0,0 +1,48 @@ +{{template "base/head" .}} +
    + {{template "repo/header" .}} +
    + {{template "base/alert" .}} +
    + {{.locale.Tr "repo.wiki.new_page"}} + {{if .PageIsWikiEdit}} + + {{end}} +
    +
    + {{.CsrfTokenHtml}} +
    + +
    +
    + {{.locale.Tr "repo.wiki.page_name_desc"}} +
    + + {{$content := .content}} + {{if not .PageIsWikiEdit}} + {{$content = .locale.Tr "repo.wiki.welcome"}} + {{end}} + {{template "shared/combomarkdowneditor" (dict + "locale" $.locale + "MarkdownPreviewUrl" (print .Repository.Link "/markup") + "MarkdownPreviewContext" .RepoLink + "TextareaName" "content" + "TextareaPlaceholder" (.locale.Tr "repo.wiki.page_content") + "TextareaAriaLabel" (.locale.Tr "repo.wiki.page_content") + "TextareaContent" $content + )}} + +
    + +
    +
    + +
    +
    +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/repo/wiki/pages.tmpl b/src/templates/repo/wiki/pages.tmpl new file mode 100644 index 0000000..6169109 --- /dev/null +++ b/src/templates/repo/wiki/pages.tmpl @@ -0,0 +1,30 @@ +{{template "base/head" .}} +
    + {{template "repo/header" .}} +
    +

    + {{.locale.Tr "repo.wiki.pages"}} + + {{if and .CanWriteWiki (not .Repository.IsMirror)}} + {{.locale.Tr "repo.wiki.new_page_button"}} + {{end}} + +

    + + + {{range .Pages}} + + + {{$timeSince := TimeSinceUnix .UpdatedUnix $.locale}} + + + {{end}} + +
    + {{svg "octicon-file"}} + {{.Name}} + {{svg "octicon-chevron-right"}} + {{$.locale.Tr "repo.wiki.last_updated" $timeSince | Safe}}
    +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/repo/wiki/revision.tmpl b/src/templates/repo/wiki/revision.tmpl new file mode 100644 index 0000000..b2d6e63 --- /dev/null +++ b/src/templates/repo/wiki/revision.tmpl @@ -0,0 +1,45 @@ +{{template "base/head" .}} +
    + {{template "repo/header" .}} + {{$title := .title}} +
    +
    +
    +
    + {{.revision}} {{svg "octicon-home"}} + {{$title}} +
    + {{$timeSince := TimeSince .Author.When $.locale}} + {{.locale.Tr "repo.wiki.last_commit_info" .Author.Name $timeSince | Safe}} +
    +
    +
    +
    +
    + {{template "repo/clone_buttons" .}} + {{template "repo/clone_script" .}} +
    +
    +
    +

    {{.locale.Tr "repo.wiki.wiki_page_revisions"}}

    +
    +

    +
    +
    + {{.CommitCount}} {{.locale.Tr "repo.commits.commits"}} +
    +
    +

    + + {{if and .Commits (gt .CommitCount 0)}} + {{template "repo/commits_list" .}} + {{end}} + + {{template "base/paginate" .}} + +
    +
    +
    + + +{{template "base/footer" .}} diff --git a/src/templates/repo/wiki/start.tmpl b/src/templates/repo/wiki/start.tmpl new file mode 100644 index 0000000..4885042 --- /dev/null +++ b/src/templates/repo/wiki/start.tmpl @@ -0,0 +1,15 @@ +{{template "base/head" .}} +
    + {{template "repo/header" .}} +
    +
    + {{svg "octicon-book" 48}} +

    {{.locale.Tr "repo.wiki.welcome"}}

    +

    {{.locale.Tr "repo.wiki.welcome_desc"}}

    + {{if and .CanWriteWiki (not .Repository.IsMirror)}} + {{.locale.Tr "repo.wiki.create_first_page"}} + {{end}} +
    +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/repo/wiki/view.tmpl b/src/templates/repo/wiki/view.tmpl new file mode 100644 index 0000000..c294af3 --- /dev/null +++ b/src/templates/repo/wiki/view.tmpl @@ -0,0 +1,115 @@ +{{template "base/head" .}} +
    + {{template "repo/header" .}} + {{$title := .title}} +
    +
    +
    + +
    +
    + {{template "repo/clone_buttons" .}} + {{template "repo/clone_script" .}} +
    +
    +
    +
    +
    + {{.CommitCount}} {{svg "octicon-history"}} + {{$title}} +
    + {{$timeSince := TimeSince .Author.When $.locale}} + {{.locale.Tr "repo.wiki.last_commit_info" .Author.Name $timeSince | Safe}} +
    +
    + +
    +
    + {{if .FormatWarning}} +
    +

    {{.FormatWarning}}

    +
    + {{end}} + +
    + {{if .sidebarTocContent}} + + {{end}} + +
    + {{template "repo/unicode_escape_prompt" dict "EscapeStatus" .EscapeStatus "root" $}} + {{.content | Safe}} +
    + + {{if .sidebarPresent}} + + {{end}} + +
    + + {{if .footerPresent}} + + {{end}} +
    +
    +
    + + + +{{template "base/footer" .}} diff --git a/src/templates/shared/actions/runner_edit.tmpl b/src/templates/shared/actions/runner_edit.tmpl new file mode 100644 index 0000000..0985bc6 --- /dev/null +++ b/src/templates/shared/actions/runner_edit.tmpl @@ -0,0 +1,101 @@ +
    +

    + {{.locale.Tr "actions.runners.runner_title"}} {{.Runner.ID}} {{.Runner.Name}} +

    +
    +
    + {{template "base/disable_form_autofill"}} + {{.CsrfTokenHtml}} +
    +
    + + {{.Runner.StatusLocaleName $.locale}} +
    +
    + + {{if .Runner.LastOnline}}{{TimeSinceUnix .Runner.LastOnline $.locale}}{{else}}{{$.locale.Tr "never"}}{{end}} +
    +
    + + + {{range .Runner.AgentLabels}} + {{.}} + {{end}} + +
    +
    + + {{.Runner.BelongsToOwnerType.LocaleString $.locale}} +
    +
    + +
    + +
    + + +
    +
    + + +

    {{.locale.Tr "actions.runners.custom_labels_helper"}}

    +
    + +
    + +
    + + +
    +
    +
    + +

    + {{.locale.Tr "actions.runners.task_list"}} +

    +
    + + + + + + + + + + + + {{range .Tasks}} + + + + + + + + {{end}} + {{if not .Tasks}} + + + + {{end}} + +
    {{.locale.Tr "actions.runners.task_list.run"}}{{.locale.Tr "actions.runners.task_list.status"}}{{.locale.Tr "actions.runners.task_list.repository"}}{{.locale.Tr "actions.runners.task_list.commit"}}{{.locale.Tr "actions.runners.task_list.done_at"}}
    {{.ID}}{{.Status.LocaleString $.locale}}{{.GetRepoName}} + {{ShortSha .CommitSHA}} + {{if .IsStopped}} + {{TimeSinceUnix .Stopped $.locale}} + {{else}}-{{end}}
    {{.locale.Tr "runners.task_list.no_tasks"}}
    + {{template "base/paginate" .}} +
    + +
    diff --git a/src/templates/shared/actions/runner_list.tmpl b/src/templates/shared/actions/runner_list.tmpl new file mode 100644 index 0000000..7c786d8 --- /dev/null +++ b/src/templates/shared/actions/runner_list.tmpl @@ -0,0 +1,91 @@ +
    + +

    + {{.locale.Tr "actions.runners.runner_manage_panel"}} ({{.locale.Tr "admin.total" .Total}}) +
    + + +
    +

    +
    +
    + +
    + + +
    +
    +
    +
    + + + + + + + + + + + + + + + {{if .Runners}} + {{range .Runners}} + + + + + + + + + + + {{end}} + {{else}} + + + + {{end}} + +
    {{.locale.Tr "actions.runners.status"}}{{.locale.Tr "actions.runners.id"}}{{.locale.Tr "actions.runners.name"}}{{.locale.Tr "actions.runners.version"}}{{.locale.Tr "actions.runners.owner_type"}}{{.locale.Tr "actions.runners.labels"}}{{.locale.Tr "actions.runners.last_online"}}{{.locale.Tr "edit"}}
    + {{.StatusLocaleName $.locale}} + {{.ID}}

    {{.Name}}

    {{if .Version}}{{.Version}}{{else}}{{$.locale.Tr "unknown"}}{{end}}{{.BelongsToOwnerType.LocaleString $.locale}} + {{range .AllLabels}}{{.}}{{end}} + {{if .LastOnline}}{{TimeSinceUnix .LastOnline $.locale}}{{else}}{{$.locale.Tr "never"}}{{end}} + {{if .Editable $.RunnerOnwerID $.RunnerRepoID}} + {{svg "octicon-pencil"}} + {{end}} +
    {{.locale.Tr "actions.runners.none"}}
    +
    + + {{template "base/paginate" .}} + +
    diff --git a/src/templates/shared/combomarkdowneditor.tmpl b/src/templates/shared/combomarkdowneditor.tmpl new file mode 100644 index 0000000..26a51b3 --- /dev/null +++ b/src/templates/shared/combomarkdowneditor.tmpl @@ -0,0 +1,59 @@ +{{/* +Template Attributes: +* locale: passed through for localization +* ContainerId: id attribute for the container element +* ContainerClasses: additional classes for the container element +* MarkdownPreviewUrl: preview url for the preview tab +* MarkdownPreviewContext: preview context for the preview tab +* TextareaName: name attribute for the textarea +* TextareaContent: content for the textarea +* TextareaPlaceholder: placeholder attribute for the textarea +* TextareaAriaLabel: aria-label attribute for the textarea +* DropzoneParentContainer: container for file upload (leave it empty if no upload) +*/}} +
    + {{if .MarkdownPreviewUrl}} + + {{end}} +
    + +
    + {{svg "octicon-heading"}} + {{svg "octicon-bold"}} + {{svg "octicon-italic"}} +
    +
    + {{svg "octicon-quote"}} + {{svg "octicon-code"}} + {{svg "octicon-link"}} +
    +
    + {{svg "octicon-list-unordered"}} + {{svg "octicon-list-ordered"}} + {{svg "octicon-tasklist"}} +
    +
    + {{svg "octicon-mention"}} + {{svg "octicon-cross-reference"}} +
    +
    + + +
    +
    + + + + +
    +
    + {{.locale.Tr "loading"}} +
    +
    diff --git a/src/templates/shared/issueicon.tmpl b/src/templates/shared/issueicon.tmpl new file mode 100644 index 0000000..2a2e700 --- /dev/null +++ b/src/templates/shared/issueicon.tmpl @@ -0,0 +1,25 @@ +{{if .IsPull}} + {{if and .PullRequest .PullRequest.HasMerged}} + {{svg "octicon-git-merge" 16 "text purple"}} + {{else if and .GetPullRequest .GetPullRequest.HasMerged}} + {{svg "octicon-git-merge" 16 "text purple"}} + {{else}} + {{if .IsClosed}} + {{svg "octicon-git-pull-request" 16 "text red"}} + {{else}} + {{if and .PullRequest .PullRequest.IsWorkInProgress}} + {{svg "octicon-git-pull-request-draft" 16 "text grey"}} + {{else if and .GetPullRequest .GetPullRequest.IsWorkInProgress}} + {{svg "octicon-git-pull-request-draft" 16 "text grey"}} + {{else}} + {{svg "octicon-git-pull-request" 16 "text green"}} + {{end}} + {{end}} + {{end}} +{{else}} + {{if .IsClosed}} + {{svg "octicon-issue-closed" 16 "text red"}} + {{else}} + {{svg "octicon-issue-opened" 16 "text green"}} + {{end}} +{{end}} diff --git a/src/templates/shared/issuelist.tmpl b/src/templates/shared/issuelist.tmpl new file mode 100644 index 0000000..192911d --- /dev/null +++ b/src/templates/shared/issuelist.tmpl @@ -0,0 +1,158 @@ +
    + {{$approvalCounts := .ApprovalCounts}} + {{range .Issues}} +
  • +
    + {{if $.CanWriteIssuesOrPulls}} + + {{end}} +
    + {{template "shared/issueicon" .}} +
    +
    +
    +
    + {{RenderEmoji $.Context .Title | RenderCodeBlock}} + {{if .IsPull}} + {{if (index $.CommitStatuses .PullRequest.ID)}} + {{template "repo/commit_statuses" dict "Status" (index $.CommitLastStatus .PullRequest.ID) "Statuses" (index $.CommitStatuses .PullRequest.ID) "root" $}} + {{end}} + {{end}} + + {{range .Labels}} + {{RenderLabel $.Context .}} + {{end}} + +
    +
    + + {{if eq $.listType "dashboard"}} + {{.Repo.FullName}}#{{.Index}} + {{else}} + #{{.Index}} + {{end}} + + {{$timeStr := TimeSinceUnix .GetLastEventTimestamp $.locale}} + {{if .OriginalAuthor}} + {{$.locale.Tr .GetLastEventLabelFake $timeStr (.OriginalAuthor|Escape) | Safe}} + {{else if gt .Poster.ID 0}} + {{$.locale.Tr .GetLastEventLabel $timeStr (.Poster.HomeLink|Escape) (.Poster.GetDisplayName | Escape) | Safe}} + {{else}} + {{$.locale.Tr .GetLastEventLabelFake $timeStr (.Poster.GetDisplayName | Escape) | Safe}} + {{end}} + {{if .IsPull}} + + {{end}} + {{if and .Milestone (ne $.listType "milestone")}} + + {{svg "octicon-milestone" 14 "gt-mr-2"}}{{.Milestone.Name}} + + {{end}} + {{if .Project}} + + {{svg .Project.IconName 14 "gt-mr-2"}}{{.Project.Title}} + + {{end}} + {{if .Ref}} + + {{svg "octicon-git-branch" 14 "gt-mr-2"}}{{index $.IssueRefEndNames .ID}} + + {{end}} + {{$tasks := .GetTasks}} + {{if gt $tasks 0}} + {{$tasksDone := .GetTasksDone}} + + {{svg "octicon-checklist" 14 "gt-mr-2"}}{{$tasksDone}} / {{$tasks}} + + + {{end}} + {{if ne .DeadlineUnix 0}} + + + {{svg "octicon-calendar" 14 "gt-mr-2"}} + {{DateTime "short" .DeadlineUnix}} + + + {{end}} + {{if .IsPull}} + {{$approveOfficial := call $approvalCounts .ID "approve"}} + {{$rejectOfficial := call $approvalCounts .ID "reject"}} + {{$waitingOfficial := call $approvalCounts .ID "waiting"}} + {{if gt $approveOfficial 0}} + + {{svg "octicon-check" 14 "gt-mr-1"}} + {{$.locale.TrN $approveOfficial "repo.pulls.approve_count_1" "repo.pulls.approve_count_n" $approveOfficial}} + + {{end}} + {{if gt $rejectOfficial 0}} + + {{svg "octicon-diff" 14 "gt-mr-2"}} + {{$.locale.TrN $rejectOfficial "repo.pulls.reject_count_1" "repo.pulls.reject_count_n" $rejectOfficial}} + + {{end}} + {{if gt $waitingOfficial 0}} + + {{svg "octicon-eye" 14 "gt-mr-2"}} + {{$.locale.TrN $waitingOfficial "repo.pulls.waiting_count_1" "repo.pulls.waiting_count_n" $waitingOfficial}} + + {{end}} + {{if and (not .PullRequest.HasMerged) (gt (len .PullRequest.ConflictedFiles) 0)}} + + {{svg "octicon-x" 14}} + {{$.locale.TrN (len .PullRequest.ConflictedFiles) "repo.pulls.num_conflicting_files_1" "repo.pulls.num_conflicting_files_n" (len .PullRequest.ConflictedFiles)}} + + {{end}} + {{end}} +
    +
    + {{if or .TotalTrackedTime .Assignees .NumComments}} +
    + {{if .TotalTrackedTime}} +
    + {{svg "octicon-clock" 16 "gt-mr-2"}} + {{.TotalTrackedTime | Sec2Time}} +
    + {{end}} + {{if .Assignees}} +
    + {{range .Assignees}} + + {{avatar $.Context . 20}} + + {{end}} +
    + {{end}} + {{if .NumComments}} + + {{end}} +
    + {{end}} +
  • + {{end}} + {{if .IssueIndexerUnavailable}} +
    +

    {{$.locale.Tr "repo.issues.keyword_search_unavailable"}}

    +
    + {{end}} +
    +{{template "base/paginate" .}} diff --git a/src/templates/shared/searchbottom.tmpl b/src/templates/shared/searchbottom.tmpl new file mode 100644 index 0000000..cce8272 --- /dev/null +++ b/src/templates/shared/searchbottom.tmpl @@ -0,0 +1,12 @@ +
    +
    + {{if .result.Language}} + {{.result.Language}} + {{end}} +
    +
    + {{if not .result.UpdatedUnix.IsZero}} + {{.root.locale.Tr "explore.code_last_indexed_at" (TimeSinceUnix .result.UpdatedUnix .root.locale) | Safe}} + {{end}} +
    +
    diff --git a/src/templates/shared/secrets/add_list.tmpl b/src/templates/shared/secrets/add_list.tmpl new file mode 100644 index 0000000..8a6b7db --- /dev/null +++ b/src/templates/shared/secrets/add_list.tmpl @@ -0,0 +1,67 @@ +

    + {{.locale.Tr "secrets.management"}} +
    + +
    +

    +
    +
    +
    + {{.CsrfTokenHtml}} +
    + {{.locale.Tr "secrets.description"}} +
    +
    + + +
    +
    + + +
    + + +
    +
    + {{if .Secrets}} +
    + {{range .Secrets}} +
    +
    + +
    +
    + {{svg "octicon-key" 32}} +
    +
    + {{.Name}} +
    ******
    +
    + + {{$.locale.Tr "settings.added_on" (DateTime "short" .CreatedUnix) | Safe}} + +
    +
    +
    + {{end}} +
    + {{else}} + {{.locale.Tr "secrets.none"}} + {{end}} +
    + diff --git a/src/templates/shared/user/authorlink.tmpl b/src/templates/shared/user/authorlink.tmpl new file mode 100644 index 0000000..64ccc62 --- /dev/null +++ b/src/templates/shared/user/authorlink.tmpl @@ -0,0 +1 @@ +{{.GetDisplayName}}{{if .IsBot}}bot{{end}} diff --git a/src/templates/shared/user/avatarlink.tmpl b/src/templates/shared/user/avatarlink.tmpl new file mode 100644 index 0000000..c99f0aa --- /dev/null +++ b/src/templates/shared/user/avatarlink.tmpl @@ -0,0 +1 @@ +{{avatar $.Context .user}} diff --git a/src/templates/shared/user/namelink.tmpl b/src/templates/shared/user/namelink.tmpl new file mode 100644 index 0000000..a122f4f --- /dev/null +++ b/src/templates/shared/user/namelink.tmpl @@ -0,0 +1 @@ +{{.GetDisplayName}} diff --git a/src/templates/status/404.tmpl b/src/templates/status/404.tmpl new file mode 100644 index 0000000..a55e2fb --- /dev/null +++ b/src/templates/status/404.tmpl @@ -0,0 +1,12 @@ +{{template "base/head" .}} +
    + {{if .IsRepo}}{{template "repo/header" .}}{{end}} +
    +

    404

    +
    +
    +

    {{.locale.Tr "error404" | Safe}} + {{if .ShowFooterVersion}}

    {{.locale.Tr "admin.config.app_ver"}}: {{AppVer}}

    {{end}} +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/status/500.tmpl b/src/templates/status/500.tmpl new file mode 100644 index 0000000..1ceeadb --- /dev/null +++ b/src/templates/status/500.tmpl @@ -0,0 +1,67 @@ +{{/* This page should only depend the minimal template functions/variables, to avoid triggering new panics. +* base template functions: AppName, AssetUrlPrefix, AssetVersion, AppSubUrl, DefaultTheme, Str2html +* locale +* Flash +* ErrorMsg +* SignedUser (optional) +*/}} + + + + + Internal Server Error - {{AppName}} + + + {{template "base/head_style" .}} + + +
    + +
    +
    + + {{template "base/alert" .}} +
    +

    Internal Server Error

    +
    +
    + {{if .ErrorMsg}} +

    {{.locale.Tr "error.occurred"}}:

    +
    {{.ErrorMsg}}
    + {{end}} +
    + {{if or .SignedUser.IsAdmin .ShowFooterVersion}}

    {{.locale.Tr "admin.config.app_ver"}}: {{AppVer}}

    {{end}} + {{if .SignedUser.IsAdmin}}

    {{.locale.Tr "error.report_message" | Str2html}}

    {{end}} +
    +
    +
    +
    + + {{/* When a sub-template triggers an 500 error, its parent template has been partially rendered, then the 500 page + will be rendered after that partially rendered page, the HTML/JS are totally broken. Use this inline script to try to move it to main viewport. + And this page shouldn't include any other JS file, avoid duplicate JS execution (still due to the partial rendering).*/}} + + + diff --git a/src/templates/swagger/ui.tmpl b/src/templates/swagger/ui.tmpl new file mode 100644 index 0000000..e2324f9 --- /dev/null +++ b/src/templates/swagger/ui.tmpl @@ -0,0 +1,12 @@ + + + + Gitea API + + + + {{svg "octicon-reply"}}{{.locale.Tr "return_to_gitea"}} +
    + + + diff --git a/src/templates/swagger/v1_json.tmpl b/src/templates/swagger/v1_json.tmpl new file mode 100644 index 0000000..11abeac --- /dev/null +++ b/src/templates/swagger/v1_json.tmpl @@ -0,0 +1,22926 @@ +{ + "consumes": [ + "application/json", + "text/plain" + ], + "produces": [ + "application/json", + "text/html" + ], + "schemes": [ + "http", + "https" + ], + "swagger": "2.0", + "info": { + "description": "This documentation describes the Gitea API.", + "title": "Gitea API.", + "license": { + "name": "MIT", + "url": "http://opensource.org/licenses/MIT" + }, + "version": "{{AppVer | JSEscape | Safe}}" + }, + "basePath": "{{AppSubUrl | JSEscape | Safe}}/api/v1", + "paths": { + "/activitypub/user-id/{user-id}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "activitypub" + ], + "summary": "Returns the Person actor for a user", + "operationId": "activitypubPerson", + "parameters": [ + { + "type": "integer", + "description": "user ID of the user", + "name": "user-id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/ActivityPub" + } + } + } + }, + "/activitypub/user-id/{user-id}/inbox": { + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "activitypub" + ], + "summary": "Send to the inbox", + "operationId": "activitypubPersonInbox", + "parameters": [ + { + "type": "integer", + "description": "user ID of the user", + "name": "user-id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + } + } + } + }, + "/admin/cron": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "admin" + ], + "summary": "List cron tasks", + "operationId": "adminCronList", + "parameters": [ + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/CronList" + }, + "403": { + "$ref": "#/responses/forbidden" + } + } + } + }, + "/admin/cron/{task}": { + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "admin" + ], + "summary": "Run cron task", + "operationId": "adminCronRun", + "parameters": [ + { + "type": "string", + "description": "task to run", + "name": "task", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/admin/emails": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "admin" + ], + "summary": "List all emails", + "operationId": "adminGetAllEmails", + "parameters": [ + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/EmailList" + }, + "403": { + "$ref": "#/responses/forbidden" + } + } + } + }, + "/admin/emails/search": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "admin" + ], + "summary": "Search all emails", + "operationId": "adminSearchEmails", + "parameters": [ + { + "type": "string", + "description": "keyword", + "name": "q", + "in": "query" + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/EmailList" + }, + "403": { + "$ref": "#/responses/forbidden" + } + } + } + }, + "/admin/hooks": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "admin" + ], + "summary": "List system's webhooks", + "operationId": "adminListHooks", + "parameters": [ + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/HookList" + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "admin" + ], + "summary": "Create a hook", + "operationId": "adminCreateHook", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/CreateHookOption" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/Hook" + } + } + } + }, + "/admin/hooks/{id}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "admin" + ], + "summary": "Get a hook", + "operationId": "adminGetHook", + "parameters": [ + { + "type": "integer", + "format": "int64", + "description": "id of the hook to get", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/Hook" + } + } + }, + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "admin" + ], + "summary": "Delete a hook", + "operationId": "adminDeleteHook", + "parameters": [ + { + "type": "integer", + "format": "int64", + "description": "id of the hook to delete", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + } + } + }, + "patch": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "admin" + ], + "summary": "Update a hook", + "operationId": "adminEditHook", + "parameters": [ + { + "type": "integer", + "format": "int64", + "description": "id of the hook to update", + "name": "id", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/EditHookOption" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/Hook" + } + } + } + }, + "/admin/orgs": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "admin" + ], + "summary": "List all organizations", + "operationId": "adminGetAllOrgs", + "parameters": [ + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/OrganizationList" + }, + "403": { + "$ref": "#/responses/forbidden" + } + } + } + }, + "/admin/unadopted": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "admin" + ], + "summary": "List unadopted repositories", + "operationId": "adminUnadoptedList", + "parameters": [ + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + }, + { + "type": "string", + "description": "pattern of repositories to search for", + "name": "pattern", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/StringSlice" + }, + "403": { + "$ref": "#/responses/forbidden" + } + } + } + }, + "/admin/unadopted/{owner}/{repo}": { + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "admin" + ], + "summary": "Adopt unadopted files as a repository", + "operationId": "adminAdoptRepository", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + }, + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "admin" + ], + "summary": "Delete unadopted files", + "operationId": "adminDeleteUnadoptedRepository", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "403": { + "$ref": "#/responses/forbidden" + } + } + } + }, + "/admin/users": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "admin" + ], + "summary": "Search users according filter conditions", + "operationId": "adminSearchUsers", + "parameters": [ + { + "type": "integer", + "format": "int64", + "description": "ID of the user's login source to search for", + "name": "source_id", + "in": "query" + }, + { + "type": "string", + "description": "user's login name to search for", + "name": "login_name", + "in": "query" + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/UserList" + }, + "403": { + "$ref": "#/responses/forbidden" + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "admin" + ], + "summary": "Create a user", + "operationId": "adminCreateUser", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/CreateUserOption" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/User" + }, + "400": { + "$ref": "#/responses/error" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, + "/admin/users/{username}": { + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "admin" + ], + "summary": "Delete a user", + "operationId": "adminDeleteUser", + "parameters": [ + { + "type": "string", + "description": "username of user to delete", + "name": "username", + "in": "path", + "required": true + }, + { + "type": "boolean", + "description": "purge the user from the system completely", + "name": "purge", + "in": "query" + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + }, + "patch": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "admin" + ], + "summary": "Edit an existing user", + "operationId": "adminEditUser", + "parameters": [ + { + "type": "string", + "description": "username of user to edit", + "name": "username", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/EditUserOption" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/User" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, + "/admin/users/{username}/keys": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "admin" + ], + "summary": "Add a public key on behalf of a user", + "operationId": "adminCreatePublicKey", + "parameters": [ + { + "type": "string", + "description": "username of the user", + "name": "username", + "in": "path", + "required": true + }, + { + "name": "key", + "in": "body", + "schema": { + "$ref": "#/definitions/CreateKeyOption" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/PublicKey" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, + "/admin/users/{username}/keys/{id}": { + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "admin" + ], + "summary": "Delete a user's public key", + "operationId": "adminDeleteUserPublicKey", + "parameters": [ + { + "type": "string", + "description": "username of user", + "name": "username", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of the key to delete", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/admin/users/{username}/orgs": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "admin" + ], + "summary": "Create an organization", + "operationId": "adminCreateOrg", + "parameters": [ + { + "type": "string", + "description": "username of the user that will own the created organization", + "name": "username", + "in": "path", + "required": true + }, + { + "name": "organization", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/CreateOrgOption" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/Organization" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, + "/admin/users/{username}/rename": { + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "admin" + ], + "summary": "Rename a user", + "operationId": "adminRenameUser", + "parameters": [ + { + "type": "string", + "description": "existing username of user", + "name": "username", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/RenameUserOption" + } + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, + "/admin/users/{username}/repos": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "admin" + ], + "summary": "Create a repository on behalf of a user", + "operationId": "adminCreateRepo", + "parameters": [ + { + "type": "string", + "description": "username of the user. This user will own the created repository", + "name": "username", + "in": "path", + "required": true + }, + { + "name": "repository", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/CreateRepoOption" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/Repository" + }, + "400": { + "$ref": "#/responses/error" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "404": { + "$ref": "#/responses/notFound" + }, + "409": { + "$ref": "#/responses/error" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, + "/gitignore/templates": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "miscellaneous" + ], + "summary": "Returns a list of all gitignore templates", + "operationId": "listGitignoresTemplates", + "responses": { + "200": { + "$ref": "#/responses/GitignoreTemplateList" + } + } + } + }, + "/gitignore/templates/{name}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "miscellaneous" + ], + "summary": "Returns information about a gitignore template", + "operationId": "getGitignoreTemplateInfo", + "parameters": [ + { + "type": "string", + "description": "name of the template", + "name": "name", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/GitignoreTemplateInfo" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/label/templates": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "miscellaneous" + ], + "summary": "Returns a list of all label templates", + "operationId": "listLabelTemplates", + "responses": { + "200": { + "$ref": "#/responses/LabelTemplateList" + } + } + } + }, + "/label/templates/{name}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "miscellaneous" + ], + "summary": "Returns all labels in a template", + "operationId": "getLabelTemplateInfo", + "parameters": [ + { + "type": "string", + "description": "name of the template", + "name": "name", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/LabelTemplateInfo" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/licenses": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "miscellaneous" + ], + "summary": "Returns a list of all license templates", + "operationId": "listLicenseTemplates", + "responses": { + "200": { + "$ref": "#/responses/LicenseTemplateList" + } + } + } + }, + "/licenses/{name}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "miscellaneous" + ], + "summary": "Returns information about a license template", + "operationId": "getLicenseTemplateInfo", + "parameters": [ + { + "type": "string", + "description": "name of the license", + "name": "name", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/LicenseTemplateInfo" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/markdown": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "text/html" + ], + "tags": [ + "miscellaneous" + ], + "summary": "Render a markdown document as HTML", + "operationId": "renderMarkdown", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/MarkdownOption" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/MarkdownRender" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, + "/markdown/raw": { + "post": { + "consumes": [ + "text/plain" + ], + "produces": [ + "text/html" + ], + "tags": [ + "miscellaneous" + ], + "summary": "Render raw markdown as HTML", + "operationId": "renderMarkdownRaw", + "parameters": [ + { + "description": "Request body to render", + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/MarkdownRender" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, + "/markup": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "text/html" + ], + "tags": [ + "miscellaneous" + ], + "summary": "Render a markup document as HTML", + "operationId": "renderMarkup", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/MarkupOption" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/MarkupRender" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, + "/nodeinfo": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "miscellaneous" + ], + "summary": "Returns the nodeinfo of the Gitea application", + "operationId": "getNodeInfo", + "responses": { + "200": { + "$ref": "#/responses/NodeInfo" + } + } + } + }, + "/notifications": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "notification" + ], + "summary": "List users's notification threads", + "operationId": "notifyGetList", + "parameters": [ + { + "type": "boolean", + "description": "If true, show notifications marked as read. Default value is false", + "name": "all", + "in": "query" + }, + { + "type": "array", + "items": { + "type": "string" + }, + "collectionFormat": "multi", + "description": "Show notifications with the provided status types. Options are: unread, read and/or pinned. Defaults to unread \u0026 pinned.", + "name": "status-types", + "in": "query" + }, + { + "type": "array", + "items": { + "enum": [ + "issue", + "pull", + "commit", + "repository" + ], + "type": "string" + }, + "collectionFormat": "multi", + "description": "filter notifications by subject type", + "name": "subject-type", + "in": "query" + }, + { + "type": "string", + "format": "date-time", + "description": "Only show notifications updated after the given time. This is a timestamp in RFC 3339 format", + "name": "since", + "in": "query" + }, + { + "type": "string", + "format": "date-time", + "description": "Only show notifications updated before the given time. This is a timestamp in RFC 3339 format", + "name": "before", + "in": "query" + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/NotificationThreadList" + } + } + }, + "put": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "notification" + ], + "summary": "Mark notification threads as read, pinned or unread", + "operationId": "notifyReadList", + "parameters": [ + { + "type": "string", + "format": "date-time", + "description": "Describes the last point that notifications were checked. Anything updated since this time will not be updated.", + "name": "last_read_at", + "in": "query" + }, + { + "type": "string", + "description": "If true, mark all notifications on this repo. Default value is false", + "name": "all", + "in": "query" + }, + { + "type": "array", + "items": { + "type": "string" + }, + "collectionFormat": "multi", + "description": "Mark notifications with the provided status types. Options are: unread, read and/or pinned. Defaults to unread.", + "name": "status-types", + "in": "query" + }, + { + "type": "string", + "description": "Status to mark notifications as, Defaults to read.", + "name": "to-status", + "in": "query" + } + ], + "responses": { + "205": { + "$ref": "#/responses/NotificationThreadList" + } + } + } + }, + "/notifications/new": { + "get": { + "tags": [ + "notification" + ], + "summary": "Check if unread notifications exist", + "operationId": "notifyNewAvailable", + "responses": { + "200": { + "$ref": "#/responses/NotificationCount" + } + } + } + }, + "/notifications/threads/{id}": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "notification" + ], + "summary": "Get notification thread by ID", + "operationId": "notifyGetThread", + "parameters": [ + { + "type": "string", + "description": "id of notification thread", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/NotificationThread" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + }, + "patch": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "notification" + ], + "summary": "Mark notification thread as read by ID", + "operationId": "notifyReadThread", + "parameters": [ + { + "type": "string", + "description": "id of notification thread", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "default": "read", + "description": "Status to mark notifications as", + "name": "to-status", + "in": "query" + } + ], + "responses": { + "205": { + "$ref": "#/responses/NotificationThread" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/org/{org}/repos": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "Create a repository in an organization", + "operationId": "createOrgRepoDeprecated", + "deprecated": true, + "parameters": [ + { + "type": "string", + "description": "name of organization", + "name": "org", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/CreateRepoOption" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/Repository" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, + "/orgs": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "Get list of organizations", + "operationId": "orgGetAll", + "parameters": [ + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/OrganizationList" + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "Create an organization", + "operationId": "orgCreate", + "parameters": [ + { + "name": "organization", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/CreateOrgOption" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/Organization" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, + "/orgs/{org}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "Get an organization", + "operationId": "orgGet", + "parameters": [ + { + "type": "string", + "description": "name of the organization to get", + "name": "org", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/Organization" + } + } + }, + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "Delete an organization", + "operationId": "orgDelete", + "parameters": [ + { + "type": "string", + "description": "organization that is to be deleted", + "name": "org", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + } + } + }, + "patch": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "Edit an organization", + "operationId": "orgEdit", + "parameters": [ + { + "type": "string", + "description": "name of the organization to edit", + "name": "org", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/EditOrgOption" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/Organization" + } + } + } + }, + "/orgs/{org}/activities/feeds": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "List an organization's activity feeds", + "operationId": "orgListActivityFeeds", + "parameters": [ + { + "type": "string", + "description": "name of the org", + "name": "org", + "in": "path", + "required": true + }, + { + "type": "string", + "format": "date", + "description": "the date of the activities to be found", + "name": "date", + "in": "query" + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/ActivityFeedsList" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/orgs/{org}/hooks": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "List an organization's webhooks", + "operationId": "orgListHooks", + "parameters": [ + { + "type": "string", + "description": "name of the organization", + "name": "org", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/HookList" + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "Create a hook", + "operationId": "orgCreateHook", + "parameters": [ + { + "type": "string", + "description": "name of the organization", + "name": "org", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/CreateHookOption" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/Hook" + } + } + } + }, + "/orgs/{org}/hooks/{id}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "Get a hook", + "operationId": "orgGetHook", + "parameters": [ + { + "type": "string", + "description": "name of the organization", + "name": "org", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of the hook to get", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/Hook" + } + } + }, + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "Delete a hook", + "operationId": "orgDeleteHook", + "parameters": [ + { + "type": "string", + "description": "name of the organization", + "name": "org", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of the hook to delete", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + } + } + }, + "patch": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "Update a hook", + "operationId": "orgEditHook", + "parameters": [ + { + "type": "string", + "description": "name of the organization", + "name": "org", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of the hook to update", + "name": "id", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/EditHookOption" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/Hook" + } + } + } + }, + "/orgs/{org}/labels": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "List an organization's labels", + "operationId": "orgListLabels", + "parameters": [ + { + "type": "string", + "description": "name of the organization", + "name": "org", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/LabelList" + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "Create a label for an organization", + "operationId": "orgCreateLabel", + "parameters": [ + { + "type": "string", + "description": "name of the organization", + "name": "org", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/CreateLabelOption" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/Label" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, + "/orgs/{org}/labels/{id}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "Get a single label", + "operationId": "orgGetLabel", + "parameters": [ + { + "type": "string", + "description": "name of the organization", + "name": "org", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of the label to get", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/Label" + } + } + }, + "delete": { + "tags": [ + "organization" + ], + "summary": "Delete a label", + "operationId": "orgDeleteLabel", + "parameters": [ + { + "type": "string", + "description": "name of the organization", + "name": "org", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of the label to delete", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + } + } + }, + "patch": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "Update a label", + "operationId": "orgEditLabel", + "parameters": [ + { + "type": "string", + "description": "name of the organization", + "name": "org", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of the label to edit", + "name": "id", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/EditLabelOption" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/Label" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, + "/orgs/{org}/members": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "List an organization's members", + "operationId": "orgListMembers", + "parameters": [ + { + "type": "string", + "description": "name of the organization", + "name": "org", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/UserList" + } + } + } + }, + "/orgs/{org}/members/{username}": { + "get": { + "tags": [ + "organization" + ], + "summary": "Check if a user is a member of an organization", + "operationId": "orgIsMember", + "parameters": [ + { + "type": "string", + "description": "name of the organization", + "name": "org", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "username of the user", + "name": "username", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "user is a member" + }, + "303": { + "description": "redirection to /orgs/{org}/public_members/{username}" + }, + "404": { + "description": "user is not a member" + } + } + }, + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "Remove a member from an organization", + "operationId": "orgDeleteMember", + "parameters": [ + { + "type": "string", + "description": "name of the organization", + "name": "org", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "username of the user", + "name": "username", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "member removed" + } + } + } + }, + "/orgs/{org}/public_members": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "List an organization's public members", + "operationId": "orgListPublicMembers", + "parameters": [ + { + "type": "string", + "description": "name of the organization", + "name": "org", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/UserList" + } + } + } + }, + "/orgs/{org}/public_members/{username}": { + "get": { + "tags": [ + "organization" + ], + "summary": "Check if a user is a public member of an organization", + "operationId": "orgIsPublicMember", + "parameters": [ + { + "type": "string", + "description": "name of the organization", + "name": "org", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "username of the user", + "name": "username", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "user is a public member" + }, + "404": { + "description": "user is not a public member" + } + } + }, + "put": { + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "Publicize a user's membership", + "operationId": "orgPublicizeMember", + "parameters": [ + { + "type": "string", + "description": "name of the organization", + "name": "org", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "username of the user", + "name": "username", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "membership publicized" + }, + "403": { + "$ref": "#/responses/forbidden" + } + } + }, + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "Conceal a user's membership", + "operationId": "orgConcealMember", + "parameters": [ + { + "type": "string", + "description": "name of the organization", + "name": "org", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "username of the user", + "name": "username", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "403": { + "$ref": "#/responses/forbidden" + } + } + } + }, + "/orgs/{org}/repos": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "List an organization's repos", + "operationId": "orgListRepos", + "parameters": [ + { + "type": "string", + "description": "name of the organization", + "name": "org", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/RepositoryList" + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "Create a repository in an organization", + "operationId": "createOrgRepo", + "parameters": [ + { + "type": "string", + "description": "name of organization", + "name": "org", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/CreateRepoOption" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/Repository" + }, + "400": { + "$ref": "#/responses/error" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/orgs/{org}/teams": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "List an organization's teams", + "operationId": "orgListTeams", + "parameters": [ + { + "type": "string", + "description": "name of the organization", + "name": "org", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/TeamList" + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "Create a team", + "operationId": "orgCreateTeam", + "parameters": [ + { + "type": "string", + "description": "name of the organization", + "name": "org", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/CreateTeamOption" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/Team" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, + "/orgs/{org}/teams/search": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "Search for teams within an organization", + "operationId": "teamSearch", + "parameters": [ + { + "type": "string", + "description": "name of the organization", + "name": "org", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "keywords to search", + "name": "q", + "in": "query" + }, + { + "type": "boolean", + "description": "include search within team description (defaults to true)", + "name": "include_desc", + "in": "query" + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "description": "SearchResults of a successful search", + "schema": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/definitions/Team" + } + }, + "ok": { + "type": "boolean" + } + } + } + } + } + } + }, + "/packages/{owner}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "package" + ], + "summary": "Gets all packages of an owner", + "operationId": "listPackages", + "parameters": [ + { + "type": "string", + "description": "owner of the packages", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + }, + { + "enum": [ + "alpine", + "cargo", + "chef", + "composer", + "conan", + "conda", + "container", + "cran", + "debian", + "generic", + "go", + "helm", + "maven", + "npm", + "nuget", + "pub", + "pypi", + "rpm", + "rubygems", + "swift", + "vagrant" + ], + "type": "string", + "description": "package type filter", + "name": "type", + "in": "query" + }, + { + "type": "string", + "description": "name filter", + "name": "q", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/PackageList" + } + } + } + }, + "/packages/{owner}/{type}/{name}/{version}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "package" + ], + "summary": "Gets a package", + "operationId": "getPackage", + "parameters": [ + { + "type": "string", + "description": "owner of the package", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "type of the package", + "name": "type", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the package", + "name": "name", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "version of the package", + "name": "version", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/Package" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + }, + "delete": { + "tags": [ + "package" + ], + "summary": "Delete a package", + "operationId": "deletePackage", + "parameters": [ + { + "type": "string", + "description": "owner of the package", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "type of the package", + "name": "type", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the package", + "name": "name", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "version of the package", + "name": "version", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/packages/{owner}/{type}/{name}/{version}/files": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "package" + ], + "summary": "Gets all files of a package", + "operationId": "listPackageFiles", + "parameters": [ + { + "type": "string", + "description": "owner of the package", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "type of the package", + "name": "type", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the package", + "name": "name", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "version of the package", + "name": "version", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/PackageFileList" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/repos/issues/search": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Search for issues across the repositories that the user has access to", + "operationId": "issueSearchIssues", + "parameters": [ + { + "type": "string", + "description": "whether issue is open or closed", + "name": "state", + "in": "query" + }, + { + "type": "string", + "description": "comma separated list of labels. Fetch only issues that have any of this labels. Non existent labels are discarded", + "name": "labels", + "in": "query" + }, + { + "type": "string", + "description": "comma separated list of milestone names. Fetch only issues that have any of this milestones. Non existent are discarded", + "name": "milestones", + "in": "query" + }, + { + "type": "string", + "description": "search string", + "name": "q", + "in": "query" + }, + { + "type": "integer", + "format": "int64", + "description": "repository to prioritize in the results", + "name": "priority_repo_id", + "in": "query" + }, + { + "type": "string", + "description": "filter by type (issues / pulls) if set", + "name": "type", + "in": "query" + }, + { + "type": "string", + "format": "date-time", + "description": "Only show notifications updated after the given time. This is a timestamp in RFC 3339 format", + "name": "since", + "in": "query" + }, + { + "type": "string", + "format": "date-time", + "description": "Only show notifications updated before the given time. This is a timestamp in RFC 3339 format", + "name": "before", + "in": "query" + }, + { + "type": "boolean", + "description": "filter (issues / pulls) assigned to you, default is false", + "name": "assigned", + "in": "query" + }, + { + "type": "boolean", + "description": "filter (issues / pulls) created by you, default is false", + "name": "created", + "in": "query" + }, + { + "type": "boolean", + "description": "filter (issues / pulls) mentioning you, default is false", + "name": "mentioned", + "in": "query" + }, + { + "type": "boolean", + "description": "filter pulls requesting your review, default is false", + "name": "review_requested", + "in": "query" + }, + { + "type": "boolean", + "description": "filter pulls reviewed by you, default is false", + "name": "reviewed", + "in": "query" + }, + { + "type": "string", + "description": "filter by owner", + "name": "owner", + "in": "query" + }, + { + "type": "string", + "description": "filter by team (requires organization owner parameter to be provided)", + "name": "team", + "in": "query" + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/IssueList" + } + } + } + }, + "/repos/migrate": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Migrate a remote git repository", + "operationId": "repoMigrate", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/MigrateRepoOptions" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/Repository" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "409": { + "description": "The repository with the same name already exists." + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, + "/repos/search": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Search for repositories", + "operationId": "repoSearch", + "parameters": [ + { + "type": "string", + "description": "keyword", + "name": "q", + "in": "query" + }, + { + "type": "boolean", + "description": "Limit search to repositories with keyword as topic", + "name": "topic", + "in": "query" + }, + { + "type": "boolean", + "description": "include search of keyword within repository description", + "name": "includeDesc", + "in": "query" + }, + { + "type": "integer", + "format": "int64", + "description": "search only for repos that the user with the given id owns or contributes to", + "name": "uid", + "in": "query" + }, + { + "type": "integer", + "format": "int64", + "description": "repo owner to prioritize in the results", + "name": "priority_owner_id", + "in": "query" + }, + { + "type": "integer", + "format": "int64", + "description": "search only for repos that belong to the given team id", + "name": "team_id", + "in": "query" + }, + { + "type": "integer", + "format": "int64", + "description": "search only for repos that the user with the given id has starred", + "name": "starredBy", + "in": "query" + }, + { + "type": "boolean", + "description": "include private repositories this user has access to (defaults to true)", + "name": "private", + "in": "query" + }, + { + "type": "boolean", + "description": "show only pubic, private or all repositories (defaults to all)", + "name": "is_private", + "in": "query" + }, + { + "type": "boolean", + "description": "include template repositories this user has access to (defaults to true)", + "name": "template", + "in": "query" + }, + { + "type": "boolean", + "description": "show only archived, non-archived or all repositories (defaults to all)", + "name": "archived", + "in": "query" + }, + { + "type": "string", + "description": "type of repository to search for. Supported values are \"fork\", \"source\", \"mirror\" and \"collaborative\"", + "name": "mode", + "in": "query" + }, + { + "type": "boolean", + "description": "if `uid` is given, search only for repos that the user owns", + "name": "exclusive", + "in": "query" + }, + { + "type": "string", + "description": "sort repos by attribute. Supported values are \"alpha\", \"created\", \"updated\", \"size\", and \"id\". Default is \"alpha\"", + "name": "sort", + "in": "query" + }, + { + "type": "string", + "description": "sort order, either \"asc\" (ascending) or \"desc\" (descending). Default is \"asc\", ignored if \"sort\" is not specified.", + "name": "order", + "in": "query" + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/SearchResults" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, + "/repos/{owner}/{repo}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Get a repository", + "operationId": "repoGet", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/Repository" + } + } + }, + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Delete a repository", + "operationId": "repoDelete", + "parameters": [ + { + "type": "string", + "description": "owner of the repo to delete", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo to delete", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "403": { + "$ref": "#/responses/forbidden" + } + } + }, + "patch": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Edit a repository's properties. Only fields that are set will be changed.", + "operationId": "repoEdit", + "parameters": [ + { + "type": "string", + "description": "owner of the repo to edit", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo to edit", + "name": "repo", + "in": "path", + "required": true + }, + { + "description": "Properties of a repo that you can edit", + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/EditRepoOption" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/Repository" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, + "/repos/{owner}/{repo}/activities/feeds": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "List a repository's activity feeds", + "operationId": "repoListActivityFeeds", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "format": "date", + "description": "the date of the activities to be found", + "name": "date", + "in": "query" + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/ActivityFeedsList" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/repos/{owner}/{repo}/archive/{archive}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Get an archive of a repository", + "operationId": "repoGetArchive", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the git reference for download with attached archive format (e.g. master.zip)", + "name": "archive", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "success" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/repos/{owner}/{repo}/assignees": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Return all users that have write access and can be assigned to issues", + "operationId": "repoGetAssignees", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/UserList" + } + } + } + }, + "/repos/{owner}/{repo}/branch_protections": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "List branch protections for a repository", + "operationId": "repoListBranchProtection", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/BranchProtectionList" + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Create a branch protections for a repository", + "operationId": "repoCreateBranchProtection", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/CreateBranchProtectionOption" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/BranchProtection" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "404": { + "$ref": "#/responses/notFound" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, + "/repos/{owner}/{repo}/branch_protections/{name}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Get a specific branch protection for the repository", + "operationId": "repoGetBranchProtection", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of protected branch", + "name": "name", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/BranchProtection" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + }, + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Delete a specific branch protection for the repository", + "operationId": "repoDeleteBranchProtection", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of protected branch", + "name": "name", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + }, + "patch": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Edit a branch protections for a repository. Only fields that are set will be changed", + "operationId": "repoEditBranchProtection", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of protected branch", + "name": "name", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/EditBranchProtectionOption" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/BranchProtection" + }, + "404": { + "$ref": "#/responses/notFound" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, + "/repos/{owner}/{repo}/branches": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "List a repository's branches", + "operationId": "repoListBranches", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/BranchList" + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Create a branch", + "operationId": "repoCreateBranch", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/CreateBranchRepoOption" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/Branch" + }, + "404": { + "description": "The old branch does not exist." + }, + "409": { + "description": "The branch with the same name already exists." + } + } + } + }, + "/repos/{owner}/{repo}/branches/{branch}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Retrieve a specific branch from a repository, including its effective branch protection", + "operationId": "repoGetBranch", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "branch to get", + "name": "branch", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/Branch" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + }, + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Delete a specific branch from a repository", + "operationId": "repoDeleteBranch", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "branch to delete", + "name": "branch", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "403": { + "$ref": "#/responses/error" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/repos/{owner}/{repo}/collaborators": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "List a repository's collaborators", + "operationId": "repoListCollaborators", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/UserList" + } + } + } + }, + "/repos/{owner}/{repo}/collaborators/{collaborator}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Check if a user is a collaborator of a repository", + "operationId": "repoCheckCollaborator", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "username of the collaborator", + "name": "collaborator", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "404": { + "$ref": "#/responses/notFound" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + }, + "put": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Add a collaborator to a repository", + "operationId": "repoAddCollaborator", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "username of the collaborator to add", + "name": "collaborator", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/AddCollaboratorOption" + } + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + }, + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Delete a collaborator from a repository", + "operationId": "repoDeleteCollaborator", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "username of the collaborator to delete", + "name": "collaborator", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, + "/repos/{owner}/{repo}/collaborators/{collaborator}/permission": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Get repository permissions for a user", + "operationId": "repoGetRepoPermissions", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "username of the collaborator", + "name": "collaborator", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/RepoCollaboratorPermission" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/repos/{owner}/{repo}/commits": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Get a list of all commits from a repository", + "operationId": "repoGetAllCommits", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "SHA or branch to start listing commits from (usually 'master')", + "name": "sha", + "in": "query" + }, + { + "type": "string", + "description": "filepath of a file/dir", + "name": "path", + "in": "query" + }, + { + "type": "boolean", + "description": "include diff stats for every commit (disable for speedup, default 'true')", + "name": "stat", + "in": "query" + }, + { + "type": "boolean", + "description": "include verification for every commit (disable for speedup, default 'true')", + "name": "verification", + "in": "query" + }, + { + "type": "boolean", + "description": "include a list of affected files for every commit (disable for speedup, default 'true')", + "name": "files", + "in": "query" + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results (ignored if used with 'path')", + "name": "limit", + "in": "query" + }, + { + "type": "string", + "description": "commits that match the given specifier will not be listed.", + "name": "not", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/CommitList" + }, + "404": { + "$ref": "#/responses/notFound" + }, + "409": { + "$ref": "#/responses/EmptyRepository" + } + } + } + }, + "/repos/{owner}/{repo}/commits/{ref}/status": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Get a commit's combined status, by branch/tag/commit reference", + "operationId": "repoGetCombinedStatusByRef", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of branch/tag/commit", + "name": "ref", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/CombinedStatus" + }, + "400": { + "$ref": "#/responses/error" + } + } + } + }, + "/repos/{owner}/{repo}/commits/{ref}/statuses": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Get a commit's statuses, by branch/tag/commit reference", + "operationId": "repoListStatusesByRef", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of branch/tag/commit", + "name": "ref", + "in": "path", + "required": true + }, + { + "enum": [ + "oldest", + "recentupdate", + "leastupdate", + "leastindex", + "highestindex" + ], + "type": "string", + "description": "type of sort", + "name": "sort", + "in": "query" + }, + { + "enum": [ + "pending", + "success", + "error", + "failure", + "warning" + ], + "type": "string", + "description": "type of state", + "name": "state", + "in": "query" + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/CommitStatusList" + }, + "400": { + "$ref": "#/responses/error" + } + } + } + }, + "/repos/{owner}/{repo}/contents": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Gets the metadata of all the entries of the root dir", + "operationId": "repoGetContentsList", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "The name of the commit/branch/tag. Default the repository’s default branch (usually master)", + "name": "ref", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/ContentsListResponse" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Modify multiple files in a repository", + "operationId": "repoChangeFiles", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/ChangeFilesOptions" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/FilesResponse" + }, + "403": { + "$ref": "#/responses/error" + }, + "404": { + "$ref": "#/responses/notFound" + }, + "422": { + "$ref": "#/responses/error" + } + } + } + }, + "/repos/{owner}/{repo}/contents/{filepath}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Gets the metadata and contents (if a file) of an entry in a repository, or a list of entries if a dir", + "operationId": "repoGetContents", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "path of the dir, file, symlink or submodule in the repo", + "name": "filepath", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "The name of the commit/branch/tag. Default the repository’s default branch (usually master)", + "name": "ref", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/ContentsResponse" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + }, + "put": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Update a file in a repository", + "operationId": "repoUpdateFile", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "path of the file to update", + "name": "filepath", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/UpdateFileOptions" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/FileResponse" + }, + "403": { + "$ref": "#/responses/error" + }, + "404": { + "$ref": "#/responses/notFound" + }, + "422": { + "$ref": "#/responses/error" + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Create a file in a repository", + "operationId": "repoCreateFile", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "path of the file to create", + "name": "filepath", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/CreateFileOptions" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/FileResponse" + }, + "403": { + "$ref": "#/responses/error" + }, + "404": { + "$ref": "#/responses/notFound" + }, + "422": { + "$ref": "#/responses/error" + } + } + }, + "delete": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Delete a file in a repository", + "operationId": "repoDeleteFile", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "path of the file to delete", + "name": "filepath", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/DeleteFileOptions" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/FileDeleteResponse" + }, + "400": { + "$ref": "#/responses/error" + }, + "403": { + "$ref": "#/responses/error" + }, + "404": { + "$ref": "#/responses/error" + } + } + } + }, + "/repos/{owner}/{repo}/diffpatch": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Apply diff patch to repository", + "operationId": "repoApplyDiffPatch", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/UpdateFileOptions" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/FileResponse" + } + } + } + }, + "/repos/{owner}/{repo}/editorconfig/{filepath}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Get the EditorConfig definitions of a file in a repository", + "operationId": "repoGetEditorConfig", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "filepath of file to get", + "name": "filepath", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "The name of the commit/branch/tag. Default the repository’s default branch (usually master)", + "name": "ref", + "in": "query" + } + ], + "responses": { + "200": { + "description": "success" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/repos/{owner}/{repo}/forks": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "List a repository's forks", + "operationId": "listForks", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/RepositoryList" + } + } + }, + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Fork a repository", + "operationId": "createFork", + "parameters": [ + { + "type": "string", + "description": "owner of the repo to fork", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo to fork", + "name": "repo", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/CreateForkOption" + } + } + ], + "responses": { + "202": { + "$ref": "#/responses/Repository" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "409": { + "description": "The repository with the same name already exists." + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, + "/repos/{owner}/{repo}/git/blobs/{sha}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Gets the blob of a repository.", + "operationId": "GetBlob", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "sha of the commit", + "name": "sha", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/GitBlobResponse" + }, + "400": { + "$ref": "#/responses/error" + } + } + } + }, + "/repos/{owner}/{repo}/git/commits/{sha}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Get a single commit from a repository", + "operationId": "repoGetSingleCommit", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "a git ref or commit sha", + "name": "sha", + "in": "path", + "required": true + }, + { + "type": "boolean", + "description": "include diff stats for every commit (disable for speedup, default 'true')", + "name": "stat", + "in": "query" + }, + { + "type": "boolean", + "description": "include verification for every commit (disable for speedup, default 'true')", + "name": "verification", + "in": "query" + }, + { + "type": "boolean", + "description": "include a list of affected files for every commit (disable for speedup, default 'true')", + "name": "files", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/Commit" + }, + "404": { + "$ref": "#/responses/notFound" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, + "/repos/{owner}/{repo}/git/commits/{sha}.{diffType}": { + "get": { + "produces": [ + "text/plain" + ], + "tags": [ + "repository" + ], + "summary": "Get a commit's diff or patch", + "operationId": "repoDownloadCommitDiffOrPatch", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "SHA of the commit to get", + "name": "sha", + "in": "path", + "required": true + }, + { + "enum": [ + "diff", + "patch" + ], + "type": "string", + "description": "whether the output is diff or patch", + "name": "diffType", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/string" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/repos/{owner}/{repo}/git/notes/{sha}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Get a note corresponding to a single commit from a repository", + "operationId": "repoGetNote", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "a git ref or commit sha", + "name": "sha", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/Note" + }, + "404": { + "$ref": "#/responses/notFound" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, + "/repos/{owner}/{repo}/git/refs": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Get specified ref or filtered repository's refs", + "operationId": "repoListAllGitRefs", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/ReferenceList" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/repos/{owner}/{repo}/git/refs/{ref}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Get specified ref or filtered repository's refs", + "operationId": "repoListGitRefs", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "part or full name of the ref", + "name": "ref", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/ReferenceList" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/repos/{owner}/{repo}/git/tags/{sha}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Gets the tag object of an annotated tag (not lightweight tags)", + "operationId": "GetAnnotatedTag", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "sha of the tag. The Git tags API only supports annotated tag objects, not lightweight tags.", + "name": "sha", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/AnnotatedTag" + }, + "400": { + "$ref": "#/responses/error" + } + } + } + }, + "/repos/{owner}/{repo}/git/trees/{sha}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Gets the tree of a repository.", + "operationId": "GetTree", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "sha of the commit", + "name": "sha", + "in": "path", + "required": true + }, + { + "type": "boolean", + "description": "show all directories and files", + "name": "recursive", + "in": "query" + }, + { + "type": "integer", + "description": "page number; the 'truncated' field in the response will be true if there are still more items after this page, false if the last page", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "number of items per page", + "name": "per_page", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/GitTreeResponse" + }, + "400": { + "$ref": "#/responses/error" + } + } + } + }, + "/repos/{owner}/{repo}/hooks": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "List the hooks in a repository", + "operationId": "repoListHooks", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/HookList" + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Create a hook", + "operationId": "repoCreateHook", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/CreateHookOption" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/Hook" + } + } + } + }, + "/repos/{owner}/{repo}/hooks/git": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "List the Git hooks in a repository", + "operationId": "repoListGitHooks", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/GitHookList" + } + } + } + }, + "/repos/{owner}/{repo}/hooks/git/{id}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Get a Git hook", + "operationId": "repoGetGitHook", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "id of the hook to get", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/GitHook" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + }, + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Delete a Git hook in a repository", + "operationId": "repoDeleteGitHook", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "id of the hook to get", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + }, + "patch": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Edit a Git hook in a repository", + "operationId": "repoEditGitHook", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "id of the hook to get", + "name": "id", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/EditGitHookOption" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/GitHook" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/repos/{owner}/{repo}/hooks/{id}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Get a hook", + "operationId": "repoGetHook", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of the hook to get", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/Hook" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + }, + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Delete a hook in a repository", + "operationId": "repoDeleteHook", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of the hook to delete", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + }, + "patch": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Edit a hook in a repository", + "operationId": "repoEditHook", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of the hook", + "name": "id", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/EditHookOption" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/Hook" + } + } + } + }, + "/repos/{owner}/{repo}/hooks/{id}/tests": { + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Test a push webhook", + "operationId": "repoTestHook", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of the hook to test", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "The name of the commit/branch/tag, indicates which commit will be loaded to the webhook payload.", + "name": "ref", + "in": "query" + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + } + } + } + }, + "/repos/{owner}/{repo}/issue_config": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Returns the issue config for a repo", + "operationId": "repoGetIssueConfig", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/RepoIssueConfig" + } + } + } + }, + "/repos/{owner}/{repo}/issue_config/validate": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Returns the validation information for a issue config", + "operationId": "repoValidateIssueConfig", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/RepoIssueConfigValidation" + } + } + } + }, + "/repos/{owner}/{repo}/issue_templates": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Get available issue templates for a repository", + "operationId": "repoGetIssueTemplates", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/IssueTemplates" + } + } + } + }, + "/repos/{owner}/{repo}/issues": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "List a repository's issues", + "operationId": "issueListIssues", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "enum": [ + "closed", + "open", + "all" + ], + "type": "string", + "description": "whether issue is open or closed", + "name": "state", + "in": "query" + }, + { + "type": "string", + "description": "comma separated list of labels. Fetch only issues that have any of this labels. Non existent labels are discarded", + "name": "labels", + "in": "query" + }, + { + "type": "string", + "description": "search string", + "name": "q", + "in": "query" + }, + { + "enum": [ + "issues", + "pulls" + ], + "type": "string", + "description": "filter by type (issues / pulls) if set", + "name": "type", + "in": "query" + }, + { + "type": "string", + "description": "comma separated list of milestone names or ids. It uses names and fall back to ids. Fetch only issues that have any of this milestones. Non existent milestones are discarded", + "name": "milestones", + "in": "query" + }, + { + "type": "string", + "format": "date-time", + "description": "Only show items updated after the given time. This is a timestamp in RFC 3339 format", + "name": "since", + "in": "query" + }, + { + "type": "string", + "format": "date-time", + "description": "Only show items updated before the given time. This is a timestamp in RFC 3339 format", + "name": "before", + "in": "query" + }, + { + "type": "string", + "description": "Only show items which were created by the the given user", + "name": "created_by", + "in": "query" + }, + { + "type": "string", + "description": "Only show items for which the given user is assigned", + "name": "assigned_by", + "in": "query" + }, + { + "type": "string", + "description": "Only show items in which the given user was mentioned", + "name": "mentioned_by", + "in": "query" + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/IssueList" + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Create an issue. If using deadline only the date will be taken into account, and time of day ignored.", + "operationId": "issueCreateIssue", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/CreateIssueOption" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/Issue" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "412": { + "$ref": "#/responses/error" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, + "/repos/{owner}/{repo}/issues/comments": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "List all comments in a repository", + "operationId": "issueGetRepoComments", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "format": "date-time", + "description": "if provided, only comments updated since the provided time are returned.", + "name": "since", + "in": "query" + }, + { + "type": "string", + "format": "date-time", + "description": "if provided, only comments updated before the provided time are returned.", + "name": "before", + "in": "query" + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/CommentList" + } + } + } + }, + "/repos/{owner}/{repo}/issues/comments/{id}": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Get a comment", + "operationId": "issueGetComment", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of the comment", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/Comment" + }, + "204": { + "$ref": "#/responses/empty" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + }, + "delete": { + "tags": [ + "issue" + ], + "summary": "Delete a comment", + "operationId": "issueDeleteComment", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of comment to delete", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + }, + "patch": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Edit a comment", + "operationId": "issueEditComment", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of the comment to edit", + "name": "id", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/EditIssueCommentOption" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/Comment" + }, + "204": { + "$ref": "#/responses/empty" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/repos/{owner}/{repo}/issues/comments/{id}/assets": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "List comment's attachments", + "operationId": "issueListIssueCommentAttachments", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of the comment", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/AttachmentList" + }, + "404": { + "$ref": "#/responses/error" + } + } + }, + "post": { + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Create a comment attachment", + "operationId": "issueCreateIssueCommentAttachment", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of the comment", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the attachment", + "name": "name", + "in": "query" + }, + { + "type": "file", + "description": "attachment to upload", + "name": "attachment", + "in": "formData", + "required": true + } + ], + "responses": { + "201": { + "$ref": "#/responses/Attachment" + }, + "400": { + "$ref": "#/responses/error" + }, + "404": { + "$ref": "#/responses/error" + } + } + } + }, + "/repos/{owner}/{repo}/issues/comments/{id}/assets/{attachment_id}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Get a comment attachment", + "operationId": "issueGetIssueCommentAttachment", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of the comment", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of the attachment to get", + "name": "attachment_id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/Attachment" + }, + "404": { + "$ref": "#/responses/error" + } + } + }, + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Delete a comment attachment", + "operationId": "issueDeleteIssueCommentAttachment", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of the comment", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of the attachment to delete", + "name": "attachment_id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "404": { + "$ref": "#/responses/error" + } + } + }, + "patch": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Edit a comment attachment", + "operationId": "issueEditIssueCommentAttachment", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of the comment", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of the attachment to edit", + "name": "attachment_id", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/EditAttachmentOptions" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/Attachment" + }, + "404": { + "$ref": "#/responses/error" + } + } + } + }, + "/repos/{owner}/{repo}/issues/comments/{id}/reactions": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Get a list of reactions from a comment of an issue", + "operationId": "issueGetCommentReactions", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of the comment to edit", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/ReactionList" + }, + "403": { + "$ref": "#/responses/forbidden" + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Add a reaction to a comment of an issue", + "operationId": "issuePostCommentReaction", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of the comment to edit", + "name": "id", + "in": "path", + "required": true + }, + { + "name": "content", + "in": "body", + "schema": { + "$ref": "#/definitions/EditReactionOption" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/Reaction" + }, + "201": { + "$ref": "#/responses/Reaction" + }, + "403": { + "$ref": "#/responses/forbidden" + } + } + }, + "delete": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Remove a reaction from a comment of an issue", + "operationId": "issueDeleteCommentReaction", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of the comment to edit", + "name": "id", + "in": "path", + "required": true + }, + { + "name": "content", + "in": "body", + "schema": { + "$ref": "#/definitions/EditReactionOption" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/empty" + }, + "403": { + "$ref": "#/responses/forbidden" + } + } + } + }, + "/repos/{owner}/{repo}/issues/pinned": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "List a repo's pinned issues", + "operationId": "repoListPinnedIssues", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/IssueList" + } + } + } + }, + "/repos/{owner}/{repo}/issues/{index}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Get an issue", + "operationId": "issueGetIssue", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of the issue to get", + "name": "index", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/Issue" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + }, + "delete": { + "tags": [ + "issue" + ], + "summary": "Delete an issue", + "operationId": "issueDelete", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of issue to delete", + "name": "index", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + }, + "patch": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Edit an issue. If using deadline only the date will be taken into account, and time of day ignored.", + "operationId": "issueEditIssue", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of the issue to edit", + "name": "index", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/EditIssueOption" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/Issue" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "404": { + "$ref": "#/responses/notFound" + }, + "412": { + "$ref": "#/responses/error" + } + } + } + }, + "/repos/{owner}/{repo}/issues/{index}/assets": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "List issue's attachments", + "operationId": "issueListIssueAttachments", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of the issue", + "name": "index", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/AttachmentList" + }, + "404": { + "$ref": "#/responses/error" + } + } + }, + "post": { + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Create an issue attachment", + "operationId": "issueCreateIssueAttachment", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of the issue", + "name": "index", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the attachment", + "name": "name", + "in": "query" + }, + { + "type": "file", + "description": "attachment to upload", + "name": "attachment", + "in": "formData", + "required": true + } + ], + "responses": { + "201": { + "$ref": "#/responses/Attachment" + }, + "400": { + "$ref": "#/responses/error" + }, + "404": { + "$ref": "#/responses/error" + } + } + } + }, + "/repos/{owner}/{repo}/issues/{index}/assets/{attachment_id}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Get an issue attachment", + "operationId": "issueGetIssueAttachment", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of the issue", + "name": "index", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of the attachment to get", + "name": "attachment_id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/Attachment" + }, + "404": { + "$ref": "#/responses/error" + } + } + }, + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Delete an issue attachment", + "operationId": "issueDeleteIssueAttachment", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of the issue", + "name": "index", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of the attachment to delete", + "name": "attachment_id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "404": { + "$ref": "#/responses/error" + } + } + }, + "patch": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Edit an issue attachment", + "operationId": "issueEditIssueAttachment", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of the issue", + "name": "index", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of the attachment to edit", + "name": "attachment_id", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/EditAttachmentOptions" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/Attachment" + }, + "404": { + "$ref": "#/responses/error" + } + } + } + }, + "/repos/{owner}/{repo}/issues/{index}/blocks": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "List issues that are blocked by this issue", + "operationId": "issueListBlocks", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "index of the issue", + "name": "index", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/IssueList" + } + } + }, + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Block the issue given in the body by the issue in path", + "operationId": "issueCreateIssueBlocking", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "index of the issue", + "name": "index", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/IssueMeta" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/Issue" + }, + "404": { + "description": "the issue does not exist" + } + } + }, + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Unblock the issue given in the body by the issue in path", + "operationId": "issueRemoveIssueBlocking", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "index of the issue", + "name": "index", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/IssueMeta" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/Issue" + } + } + } + }, + "/repos/{owner}/{repo}/issues/{index}/comments": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "List all comments on an issue", + "operationId": "issueGetComments", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of the issue", + "name": "index", + "in": "path", + "required": true + }, + { + "type": "string", + "format": "date-time", + "description": "if provided, only comments updated since the specified time are returned.", + "name": "since", + "in": "query" + }, + { + "type": "string", + "format": "date-time", + "description": "if provided, only comments updated before the provided time are returned.", + "name": "before", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/CommentList" + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Add a comment to an issue", + "operationId": "issueCreateComment", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of the issue", + "name": "index", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/CreateIssueCommentOption" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/Comment" + }, + "403": { + "$ref": "#/responses/forbidden" + } + } + } + }, + "/repos/{owner}/{repo}/issues/{index}/comments/{id}": { + "delete": { + "tags": [ + "issue" + ], + "summary": "Delete a comment", + "operationId": "issueDeleteCommentDeprecated", + "deprecated": true, + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "this parameter is ignored", + "name": "index", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of comment to delete", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + }, + "patch": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Edit a comment", + "operationId": "issueEditCommentDeprecated", + "deprecated": true, + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "this parameter is ignored", + "name": "index", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of the comment to edit", + "name": "id", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/EditIssueCommentOption" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/Comment" + }, + "204": { + "$ref": "#/responses/empty" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/repos/{owner}/{repo}/issues/{index}/deadline": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Set an issue deadline. If set to null, the deadline is deleted. If using deadline only the date will be taken into account, and time of day ignored.", + "operationId": "issueEditIssueDeadline", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of the issue to create or update a deadline on", + "name": "index", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/EditDeadlineOption" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/IssueDeadline" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/repos/{owner}/{repo}/issues/{index}/dependencies": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "List an issue's dependencies, i.e all issues that block this issue.", + "operationId": "issueListIssueDependencies", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "index of the issue", + "name": "index", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/IssueList" + } + } + }, + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Make the issue in the url depend on the issue in the form.", + "operationId": "issueCreateIssueDependencies", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "index of the issue", + "name": "index", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/IssueMeta" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/Issue" + }, + "404": { + "description": "the issue does not exist" + } + } + }, + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Remove an issue dependency", + "operationId": "issueRemoveIssueDependencies", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "index of the issue", + "name": "index", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/IssueMeta" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/Issue" + } + } + } + }, + "/repos/{owner}/{repo}/issues/{index}/labels": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Get an issue's labels", + "operationId": "issueGetLabels", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of the issue", + "name": "index", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/LabelList" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + }, + "put": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Replace an issue's labels", + "operationId": "issueReplaceLabels", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of the issue", + "name": "index", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/IssueLabelsOption" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/LabelList" + }, + "403": { + "$ref": "#/responses/forbidden" + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Add a label to an issue", + "operationId": "issueAddLabel", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of the issue", + "name": "index", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/IssueLabelsOption" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/LabelList" + }, + "403": { + "$ref": "#/responses/forbidden" + } + } + }, + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Remove all labels from an issue", + "operationId": "issueClearLabels", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of the issue", + "name": "index", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "403": { + "$ref": "#/responses/forbidden" + } + } + } + }, + "/repos/{owner}/{repo}/issues/{index}/labels/{id}": { + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Remove a label from an issue", + "operationId": "issueRemoveLabel", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of the issue", + "name": "index", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of the label to remove", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, + "/repos/{owner}/{repo}/issues/{index}/pin": { + "post": { + "tags": [ + "issue" + ], + "summary": "Pin an Issue", + "operationId": "pinIssue", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of issue to pin", + "name": "index", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + }, + "delete": { + "tags": [ + "issue" + ], + "summary": "Unpin an Issue", + "operationId": "unpinIssue", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of issue to unpin", + "name": "index", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/repos/{owner}/{repo}/issues/{index}/pin/{position}": { + "patch": { + "tags": [ + "issue" + ], + "summary": "Moves the Pin to the given Position", + "operationId": "moveIssuePin", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of issue", + "name": "index", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "the new position", + "name": "position", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/repos/{owner}/{repo}/issues/{index}/reactions": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Get a list reactions of an issue", + "operationId": "issueGetIssueReactions", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of the issue", + "name": "index", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/ReactionList" + }, + "403": { + "$ref": "#/responses/forbidden" + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Add a reaction to an issue", + "operationId": "issuePostIssueReaction", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of the issue", + "name": "index", + "in": "path", + "required": true + }, + { + "name": "content", + "in": "body", + "schema": { + "$ref": "#/definitions/EditReactionOption" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/Reaction" + }, + "201": { + "$ref": "#/responses/Reaction" + }, + "403": { + "$ref": "#/responses/forbidden" + } + } + }, + "delete": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Remove a reaction from an issue", + "operationId": "issueDeleteIssueReaction", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of the issue", + "name": "index", + "in": "path", + "required": true + }, + { + "name": "content", + "in": "body", + "schema": { + "$ref": "#/definitions/EditReactionOption" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/empty" + }, + "403": { + "$ref": "#/responses/forbidden" + } + } + } + }, + "/repos/{owner}/{repo}/issues/{index}/stopwatch/delete": { + "delete": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Delete an issue's existing stopwatch.", + "operationId": "issueDeleteStopWatch", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of the issue to stop the stopwatch on", + "name": "index", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "403": { + "description": "Not repo writer, user does not have rights to toggle stopwatch" + }, + "404": { + "$ref": "#/responses/notFound" + }, + "409": { + "description": "Cannot cancel a non existent stopwatch" + } + } + } + }, + "/repos/{owner}/{repo}/issues/{index}/stopwatch/start": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Start stopwatch on an issue.", + "operationId": "issueStartStopWatch", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of the issue to create the stopwatch on", + "name": "index", + "in": "path", + "required": true + } + ], + "responses": { + "201": { + "$ref": "#/responses/empty" + }, + "403": { + "description": "Not repo writer, user does not have rights to toggle stopwatch" + }, + "404": { + "$ref": "#/responses/notFound" + }, + "409": { + "description": "Cannot start a stopwatch again if it already exists" + } + } + } + }, + "/repos/{owner}/{repo}/issues/{index}/stopwatch/stop": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Stop an issue's existing stopwatch.", + "operationId": "issueStopStopWatch", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of the issue to stop the stopwatch on", + "name": "index", + "in": "path", + "required": true + } + ], + "responses": { + "201": { + "$ref": "#/responses/empty" + }, + "403": { + "description": "Not repo writer, user does not have rights to toggle stopwatch" + }, + "404": { + "$ref": "#/responses/notFound" + }, + "409": { + "description": "Cannot stop a non existent stopwatch" + } + } + } + }, + "/repos/{owner}/{repo}/issues/{index}/subscriptions": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Get users who subscribed on an issue.", + "operationId": "issueSubscriptions", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of the issue", + "name": "index", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/UserList" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/repos/{owner}/{repo}/issues/{index}/subscriptions/check": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Check if user is subscribed to an issue", + "operationId": "issueCheckSubscription", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of the issue", + "name": "index", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/WatchInfo" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/repos/{owner}/{repo}/issues/{index}/subscriptions/{user}": { + "put": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Subscribe user to issue", + "operationId": "issueAddSubscription", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of the issue", + "name": "index", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "user to subscribe", + "name": "user", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "Already subscribed" + }, + "201": { + "description": "Successfully Subscribed" + }, + "304": { + "description": "User can only subscribe itself if he is no admin" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + }, + "delete": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Unsubscribe user from issue", + "operationId": "issueDeleteSubscription", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of the issue", + "name": "index", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "user witch unsubscribe", + "name": "user", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "Already unsubscribed" + }, + "201": { + "description": "Successfully Unsubscribed" + }, + "304": { + "description": "User can only subscribe itself if he is no admin" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/repos/{owner}/{repo}/issues/{index}/timeline": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "List all comments and events on an issue", + "operationId": "issueGetCommentsAndTimeline", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of the issue", + "name": "index", + "in": "path", + "required": true + }, + { + "type": "string", + "format": "date-time", + "description": "if provided, only comments updated since the specified time are returned.", + "name": "since", + "in": "query" + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + }, + { + "type": "string", + "format": "date-time", + "description": "if provided, only comments updated before the provided time are returned.", + "name": "before", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/TimelineList" + } + } + } + }, + "/repos/{owner}/{repo}/issues/{index}/times": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "List an issue's tracked times", + "operationId": "issueTrackedTimes", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of the issue", + "name": "index", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "optional filter by user (available for issue managers)", + "name": "user", + "in": "query" + }, + { + "type": "string", + "format": "date-time", + "description": "Only show times updated after the given time. This is a timestamp in RFC 3339 format", + "name": "since", + "in": "query" + }, + { + "type": "string", + "format": "date-time", + "description": "Only show times updated before the given time. This is a timestamp in RFC 3339 format", + "name": "before", + "in": "query" + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/TrackedTimeList" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Add tracked time to a issue", + "operationId": "issueAddTime", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of the issue", + "name": "index", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/AddTimeOption" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/TrackedTime" + }, + "400": { + "$ref": "#/responses/error" + }, + "403": { + "$ref": "#/responses/forbidden" + } + } + }, + "delete": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Reset a tracked time of an issue", + "operationId": "issueResetTime", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of the issue to add tracked time to", + "name": "index", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "400": { + "$ref": "#/responses/error" + }, + "403": { + "$ref": "#/responses/forbidden" + } + } + } + }, + "/repos/{owner}/{repo}/issues/{index}/times/{id}": { + "delete": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Delete specific tracked time", + "operationId": "issueDeleteTime", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of the issue", + "name": "index", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of time to delete", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "400": { + "$ref": "#/responses/error" + }, + "403": { + "$ref": "#/responses/forbidden" + } + } + } + }, + "/repos/{owner}/{repo}/keys": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "List a repository's keys", + "operationId": "repoListKeys", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "the key_id to search for", + "name": "key_id", + "in": "query" + }, + { + "type": "string", + "description": "fingerprint of the key", + "name": "fingerprint", + "in": "query" + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/DeployKeyList" + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Add a key to a repository", + "operationId": "repoCreateKey", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/CreateKeyOption" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/DeployKey" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, + "/repos/{owner}/{repo}/keys/{id}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Get a repository's key by id", + "operationId": "repoGetKey", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of the key to get", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/DeployKey" + } + } + }, + "delete": { + "tags": [ + "repository" + ], + "summary": "Delete a key from a repository", + "operationId": "repoDeleteKey", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of the key to delete", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "403": { + "$ref": "#/responses/forbidden" + } + } + } + }, + "/repos/{owner}/{repo}/labels": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Get all of a repository's labels", + "operationId": "issueListLabels", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/LabelList" + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Create a label", + "operationId": "issueCreateLabel", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/CreateLabelOption" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/Label" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, + "/repos/{owner}/{repo}/labels/{id}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Get a single label", + "operationId": "issueGetLabel", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of the label to get", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/Label" + } + } + }, + "delete": { + "tags": [ + "issue" + ], + "summary": "Delete a label", + "operationId": "issueDeleteLabel", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of the label to delete", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + } + } + }, + "patch": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Update a label", + "operationId": "issueEditLabel", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of the label to edit", + "name": "id", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/EditLabelOption" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/Label" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, + "/repos/{owner}/{repo}/languages": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Get languages and number of bytes of code written", + "operationId": "repoGetLanguages", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/LanguageStatistics" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/repos/{owner}/{repo}/media/{filepath}": { + "get": { + "tags": [ + "repository" + ], + "summary": "Get a file or it's LFS object from a repository", + "operationId": "repoGetRawFileOrLFS", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "filepath of the file to get", + "name": "filepath", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "The name of the commit/branch/tag. Default the repository’s default branch (usually master)", + "name": "ref", + "in": "query" + } + ], + "responses": { + "200": { + "description": "Returns raw file content." + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/repos/{owner}/{repo}/milestones": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Get all of a repository's opened milestones", + "operationId": "issueGetMilestonesList", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Milestone state, Recognized values are open, closed and all. Defaults to \"open\"", + "name": "state", + "in": "query" + }, + { + "type": "string", + "description": "filter by milestone name", + "name": "name", + "in": "query" + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/MilestoneList" + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Create a milestone", + "operationId": "issueCreateMilestone", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/CreateMilestoneOption" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/Milestone" + } + } + } + }, + "/repos/{owner}/{repo}/milestones/{id}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Get a milestone", + "operationId": "issueGetMilestone", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the milestone to get, identified by ID and if not available by name", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/Milestone" + } + } + }, + "delete": { + "tags": [ + "issue" + ], + "summary": "Delete a milestone", + "operationId": "issueDeleteMilestone", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the milestone to delete, identified by ID and if not available by name", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + } + } + }, + "patch": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Update a milestone", + "operationId": "issueEditMilestone", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "the milestone to edit, identified by ID and if not available by name", + "name": "id", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/EditMilestoneOption" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/Milestone" + } + } + } + }, + "/repos/{owner}/{repo}/mirror-sync": { + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Sync a mirrored repository", + "operationId": "repoMirrorSync", + "parameters": [ + { + "type": "string", + "description": "owner of the repo to sync", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo to sync", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/empty" + }, + "403": { + "$ref": "#/responses/forbidden" + } + } + } + }, + "/repos/{owner}/{repo}/new_pin_allowed": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Returns if new Issue Pins are allowed", + "operationId": "repoNewPinAllowed", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/RepoNewIssuePinsAllowed" + } + } + } + }, + "/repos/{owner}/{repo}/notifications": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "notification" + ], + "summary": "List users's notification threads on a specific repo", + "operationId": "notifyGetRepoList", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "boolean", + "description": "If true, show notifications marked as read. Default value is false", + "name": "all", + "in": "query" + }, + { + "type": "array", + "items": { + "type": "string" + }, + "collectionFormat": "multi", + "description": "Show notifications with the provided status types. Options are: unread, read and/or pinned. Defaults to unread \u0026 pinned", + "name": "status-types", + "in": "query" + }, + { + "type": "array", + "items": { + "enum": [ + "issue", + "pull", + "commit", + "repository" + ], + "type": "string" + }, + "collectionFormat": "multi", + "description": "filter notifications by subject type", + "name": "subject-type", + "in": "query" + }, + { + "type": "string", + "format": "date-time", + "description": "Only show notifications updated after the given time. This is a timestamp in RFC 3339 format", + "name": "since", + "in": "query" + }, + { + "type": "string", + "format": "date-time", + "description": "Only show notifications updated before the given time. This is a timestamp in RFC 3339 format", + "name": "before", + "in": "query" + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/NotificationThreadList" + } + } + }, + "put": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "notification" + ], + "summary": "Mark notification threads as read, pinned or unread on a specific repo", + "operationId": "notifyReadRepoList", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "If true, mark all notifications on this repo. Default value is false", + "name": "all", + "in": "query" + }, + { + "type": "array", + "items": { + "type": "string" + }, + "collectionFormat": "multi", + "description": "Mark notifications with the provided status types. Options are: unread, read and/or pinned. Defaults to unread.", + "name": "status-types", + "in": "query" + }, + { + "type": "string", + "description": "Status to mark notifications as. Defaults to read.", + "name": "to-status", + "in": "query" + }, + { + "type": "string", + "format": "date-time", + "description": "Describes the last point that notifications were checked. Anything updated since this time will not be updated.", + "name": "last_read_at", + "in": "query" + } + ], + "responses": { + "205": { + "$ref": "#/responses/NotificationThreadList" + } + } + } + }, + "/repos/{owner}/{repo}/pulls": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "List a repo's pull requests", + "operationId": "repoListPullRequests", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "enum": [ + "closed", + "open", + "all" + ], + "type": "string", + "description": "State of pull request: open or closed (optional)", + "name": "state", + "in": "query" + }, + { + "enum": [ + "oldest", + "recentupdate", + "leastupdate", + "mostcomment", + "leastcomment", + "priority" + ], + "type": "string", + "description": "Type of sort", + "name": "sort", + "in": "query" + }, + { + "type": "integer", + "format": "int64", + "description": "ID of the milestone", + "name": "milestone", + "in": "query" + }, + { + "type": "array", + "items": { + "type": "integer", + "format": "int64" + }, + "collectionFormat": "multi", + "description": "Label IDs", + "name": "labels", + "in": "query" + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/PullRequestList" + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Create a pull request", + "operationId": "repoCreatePullRequest", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/CreatePullRequestOption" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/PullRequest" + }, + "409": { + "$ref": "#/responses/error" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, + "/repos/{owner}/{repo}/pulls/pinned": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "List a repo's pinned pull requests", + "operationId": "repoListPinnedPullRequests", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/PullRequestList" + } + } + } + }, + "/repos/{owner}/{repo}/pulls/{index}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Get a pull request", + "operationId": "repoGetPullRequest", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of the pull request to get", + "name": "index", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/PullRequest" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + }, + "patch": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Update a pull request. If using deadline only the date will be taken into account, and time of day ignored.", + "operationId": "repoEditPullRequest", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of the pull request to edit", + "name": "index", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/EditPullRequestOption" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/PullRequest" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "409": { + "$ref": "#/responses/error" + }, + "412": { + "$ref": "#/responses/error" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, + "/repos/{owner}/{repo}/pulls/{index}.{diffType}": { + "get": { + "produces": [ + "text/plain" + ], + "tags": [ + "repository" + ], + "summary": "Get a pull request diff or patch", + "operationId": "repoDownloadPullDiffOrPatch", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of the pull request to get", + "name": "index", + "in": "path", + "required": true + }, + { + "enum": [ + "diff", + "patch" + ], + "type": "string", + "description": "whether the output is diff or patch", + "name": "diffType", + "in": "path", + "required": true + }, + { + "type": "boolean", + "description": "whether to include binary file changes. if true, the diff is applicable with `git apply`", + "name": "binary", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/string" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/repos/{owner}/{repo}/pulls/{index}/commits": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Get commits for a pull request", + "operationId": "repoGetPullRequestCommits", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of the pull request to get", + "name": "index", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/CommitList" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/repos/{owner}/{repo}/pulls/{index}/files": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Get changed files for a pull request", + "operationId": "repoGetPullRequestFiles", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of the pull request to get", + "name": "index", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "skip to given file", + "name": "skip-to", + "in": "query" + }, + { + "enum": [ + "ignore-all", + "ignore-change", + "ignore-eol", + "show-all" + ], + "type": "string", + "description": "whitespace behavior", + "name": "whitespace", + "in": "query" + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/ChangedFileList" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/repos/{owner}/{repo}/pulls/{index}/merge": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Check if a pull request has been merged", + "operationId": "repoPullRequestIsMerged", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of the pull request", + "name": "index", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "pull request has been merged" + }, + "404": { + "description": "pull request has not been merged" + } + } + }, + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Merge a pull request", + "operationId": "repoMergePullRequest", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of the pull request to merge", + "name": "index", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/MergePullRequestOption" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/empty" + }, + "405": { + "$ref": "#/responses/empty" + }, + "409": { + "$ref": "#/responses/error" + } + } + }, + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Cancel the scheduled auto merge for the given pull request", + "operationId": "repoCancelScheduledAutoMerge", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of the pull request to merge", + "name": "index", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/repos/{owner}/{repo}/pulls/{index}/requested_reviewers": { + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "create review requests for a pull request", + "operationId": "repoCreatePullReviewRequests", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of the pull request", + "name": "index", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/PullReviewRequestOptions" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/PullReviewList" + }, + "404": { + "$ref": "#/responses/notFound" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + }, + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "cancel review requests for a pull request", + "operationId": "repoDeletePullReviewRequests", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of the pull request", + "name": "index", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/PullReviewRequestOptions" + } + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "404": { + "$ref": "#/responses/notFound" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, + "/repos/{owner}/{repo}/pulls/{index}/reviews": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "List all reviews for a pull request", + "operationId": "repoListPullReviews", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of the pull request", + "name": "index", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/PullReviewList" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + }, + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Create a review to an pull request", + "operationId": "repoCreatePullReview", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of the pull request", + "name": "index", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/CreatePullReviewOptions" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/PullReview" + }, + "404": { + "$ref": "#/responses/notFound" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, + "/repos/{owner}/{repo}/pulls/{index}/reviews/{id}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Get a specific review for a pull request", + "operationId": "repoGetPullReview", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of the pull request", + "name": "index", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of the review", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/PullReview" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + }, + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Submit a pending review to an pull request", + "operationId": "repoSubmitPullReview", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of the pull request", + "name": "index", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of the review", + "name": "id", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/SubmitPullReviewOptions" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/PullReview" + }, + "404": { + "$ref": "#/responses/notFound" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + }, + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Delete a specific review from a pull request", + "operationId": "repoDeletePullReview", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of the pull request", + "name": "index", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of the review", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/repos/{owner}/{repo}/pulls/{index}/reviews/{id}/comments": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Get a specific review for a pull request", + "operationId": "repoGetPullReviewComments", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of the pull request", + "name": "index", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of the review", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/PullReviewCommentList" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/repos/{owner}/{repo}/pulls/{index}/reviews/{id}/dismissals": { + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Dismiss a review for a pull request", + "operationId": "repoDismissPullReview", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of the pull request", + "name": "index", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of the review", + "name": "id", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/DismissPullReviewOptions" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/PullReview" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, + "/repos/{owner}/{repo}/pulls/{index}/reviews/{id}/undismissals": { + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Cancel to dismiss a review for a pull request", + "operationId": "repoUnDismissPullReview", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of the pull request", + "name": "index", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of the review", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/PullReview" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, + "/repos/{owner}/{repo}/pulls/{index}/update": { + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Merge PR's baseBranch into headBranch", + "operationId": "repoUpdatePullRequest", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "index of the pull request to get", + "name": "index", + "in": "path", + "required": true + }, + { + "enum": [ + "merge", + "rebase" + ], + "type": "string", + "description": "how to update pull request", + "name": "style", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/empty" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "404": { + "$ref": "#/responses/notFound" + }, + "409": { + "$ref": "#/responses/error" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, + "/repos/{owner}/{repo}/push_mirrors": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Get all push mirrors of the repository", + "operationId": "repoListPushMirrors", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/PushMirrorList" + }, + "400": { + "$ref": "#/responses/error" + }, + "403": { + "$ref": "#/responses/forbidden" + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "add a push mirror to the repository", + "operationId": "repoAddPushMirror", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/CreatePushMirrorOption" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/PushMirror" + }, + "400": { + "$ref": "#/responses/error" + }, + "403": { + "$ref": "#/responses/forbidden" + } + } + } + }, + "/repos/{owner}/{repo}/push_mirrors-sync": { + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Sync all push mirrored repository", + "operationId": "repoPushMirrorSync", + "parameters": [ + { + "type": "string", + "description": "owner of the repo to sync", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo to sync", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/empty" + }, + "400": { + "$ref": "#/responses/error" + }, + "403": { + "$ref": "#/responses/forbidden" + } + } + } + }, + "/repos/{owner}/{repo}/push_mirrors/{name}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Get push mirror of the repository by remoteName", + "operationId": "repoGetPushMirrorByRemoteName", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "remote name of push mirror", + "name": "name", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/PushMirror" + }, + "400": { + "$ref": "#/responses/error" + }, + "403": { + "$ref": "#/responses/forbidden" + } + } + }, + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "deletes a push mirror from a repository by remoteName", + "operationId": "repoDeletePushMirror", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "remote name of the pushMirror", + "name": "name", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "400": { + "$ref": "#/responses/error" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/repos/{owner}/{repo}/raw/{filepath}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Get a file from a repository", + "operationId": "repoGetRawFile", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "filepath of the file to get", + "name": "filepath", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "The name of the commit/branch/tag. Default the repository’s default branch (usually master)", + "name": "ref", + "in": "query" + } + ], + "responses": { + "200": { + "description": "Returns raw file content." + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/repos/{owner}/{repo}/releases": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "List a repo's releases", + "operationId": "repoListReleases", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "boolean", + "description": "filter (exclude / include) drafts, if you dont have repo write access none will show", + "name": "draft", + "in": "query" + }, + { + "type": "boolean", + "description": "filter (exclude / include) pre-releases", + "name": "pre-release", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results, deprecated - use limit", + "name": "per_page", + "in": "query" + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/ReleaseList" + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Create a release", + "operationId": "repoCreateRelease", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/CreateReleaseOption" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/Release" + }, + "404": { + "$ref": "#/responses/notFound" + }, + "409": { + "$ref": "#/responses/error" + } + } + } + }, + "/repos/{owner}/{repo}/releases/latest": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Gets the most recent non-prerelease, non-draft release of a repository, sorted by created_at", + "operationId": "repoGetLatestRelease", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/Release" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/repos/{owner}/{repo}/releases/tags/{tag}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Get a release by tag name", + "operationId": "repoGetReleaseByTag", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "tag name of the release to get", + "name": "tag", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/Release" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + }, + "delete": { + "tags": [ + "repository" + ], + "summary": "Delete a release by tag name", + "operationId": "repoDeleteReleaseByTag", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "tag name of the release to delete", + "name": "tag", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "404": { + "$ref": "#/responses/notFound" + }, + "405": { + "$ref": "#/responses/empty" + } + } + } + }, + "/repos/{owner}/{repo}/releases/{id}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Get a release", + "operationId": "repoGetRelease", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of the release to get", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/Release" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + }, + "delete": { + "tags": [ + "repository" + ], + "summary": "Delete a release", + "operationId": "repoDeleteRelease", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of the release to delete", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "404": { + "$ref": "#/responses/notFound" + }, + "405": { + "$ref": "#/responses/empty" + } + } + }, + "patch": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Update a release", + "operationId": "repoEditRelease", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of the release to edit", + "name": "id", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/EditReleaseOption" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/Release" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/repos/{owner}/{repo}/releases/{id}/assets": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "List release's attachments", + "operationId": "repoListReleaseAttachments", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of the release", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/AttachmentList" + } + } + }, + "post": { + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Create a release attachment", + "operationId": "repoCreateReleaseAttachment", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of the release", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the attachment", + "name": "name", + "in": "query" + }, + { + "type": "file", + "description": "attachment to upload", + "name": "attachment", + "in": "formData", + "required": true + } + ], + "responses": { + "201": { + "$ref": "#/responses/Attachment" + }, + "400": { + "$ref": "#/responses/error" + } + } + } + }, + "/repos/{owner}/{repo}/releases/{id}/assets/{attachment_id}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Get a release attachment", + "operationId": "repoGetReleaseAttachment", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of the release", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of the attachment to get", + "name": "attachment_id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/Attachment" + } + } + }, + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Delete a release attachment", + "operationId": "repoDeleteReleaseAttachment", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of the release", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of the attachment to delete", + "name": "attachment_id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + } + } + }, + "patch": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Edit a release attachment", + "operationId": "repoEditReleaseAttachment", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of the release", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "integer", + "format": "int64", + "description": "id of the attachment to edit", + "name": "attachment_id", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/EditAttachmentOptions" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/Attachment" + } + } + } + }, + "/repos/{owner}/{repo}/reviewers": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Return all users that can be requested to review in this repo", + "operationId": "repoGetReviewers", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/UserList" + } + } + } + }, + "/repos/{owner}/{repo}/signing-key.gpg": { + "get": { + "produces": [ + "text/plain" + ], + "tags": [ + "repository" + ], + "summary": "Get signing-key.gpg for given repository", + "operationId": "repoSigningKey", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "GPG armored public key", + "schema": { + "type": "string" + } + } + } + } + }, + "/repos/{owner}/{repo}/stargazers": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "List a repo's stargazers", + "operationId": "repoListStargazers", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/UserList" + } + } + } + }, + "/repos/{owner}/{repo}/statuses/{sha}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Get a commit's statuses", + "operationId": "repoListStatuses", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "sha of the commit", + "name": "sha", + "in": "path", + "required": true + }, + { + "enum": [ + "oldest", + "recentupdate", + "leastupdate", + "leastindex", + "highestindex" + ], + "type": "string", + "description": "type of sort", + "name": "sort", + "in": "query" + }, + { + "enum": [ + "pending", + "success", + "error", + "failure", + "warning" + ], + "type": "string", + "description": "type of state", + "name": "state", + "in": "query" + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/CommitStatusList" + }, + "400": { + "$ref": "#/responses/error" + } + } + }, + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Create a commit status", + "operationId": "repoCreateStatus", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "sha of the commit", + "name": "sha", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/CreateStatusOption" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/CommitStatus" + }, + "400": { + "$ref": "#/responses/error" + } + } + } + }, + "/repos/{owner}/{repo}/subscribers": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "List a repo's watchers", + "operationId": "repoListSubscribers", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/UserList" + } + } + } + }, + "/repos/{owner}/{repo}/subscription": { + "get": { + "tags": [ + "repository" + ], + "summary": "Check if the current user is watching a repo", + "operationId": "userCurrentCheckSubscription", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/WatchInfo" + }, + "404": { + "description": "User is not watching this repo or repo do not exist" + } + } + }, + "put": { + "tags": [ + "repository" + ], + "summary": "Watch a repo", + "operationId": "userCurrentPutSubscription", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/WatchInfo" + } + } + }, + "delete": { + "tags": [ + "repository" + ], + "summary": "Unwatch a repo", + "operationId": "userCurrentDeleteSubscription", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + } + } + } + }, + "/repos/{owner}/{repo}/tags": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "List a repository's tags", + "operationId": "repoListTags", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results, default maximum page size is 50", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/TagList" + } + } + }, + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Create a new git tag in a repository", + "operationId": "repoCreateTag", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/CreateTagOption" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/Tag" + }, + "404": { + "$ref": "#/responses/notFound" + }, + "405": { + "$ref": "#/responses/empty" + }, + "409": { + "$ref": "#/responses/conflict" + } + } + } + }, + "/repos/{owner}/{repo}/tags/{tag}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Get the tag of a repository by tag name", + "operationId": "repoGetTag", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of tag", + "name": "tag", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/Tag" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + }, + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Delete a repository's tag by name", + "operationId": "repoDeleteTag", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of tag to delete", + "name": "tag", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "404": { + "$ref": "#/responses/notFound" + }, + "405": { + "$ref": "#/responses/empty" + }, + "409": { + "$ref": "#/responses/conflict" + } + } + } + }, + "/repos/{owner}/{repo}/teams": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "List a repository's teams", + "operationId": "repoListTeams", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/TeamList" + } + } + } + }, + "/repos/{owner}/{repo}/teams/{team}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Check if a team is assigned to a repository", + "operationId": "repoCheckTeam", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "team name", + "name": "team", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/Team" + }, + "404": { + "$ref": "#/responses/notFound" + }, + "405": { + "$ref": "#/responses/error" + } + } + }, + "put": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Add a team to a repository", + "operationId": "repoAddTeam", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "team name", + "name": "team", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "405": { + "$ref": "#/responses/error" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + }, + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Delete a team from a repository", + "operationId": "repoDeleteTeam", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "team name", + "name": "team", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "405": { + "$ref": "#/responses/error" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, + "/repos/{owner}/{repo}/times": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "List a repo's tracked times", + "operationId": "repoTrackedTimes", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "optional filter by user (available for issue managers)", + "name": "user", + "in": "query" + }, + { + "type": "string", + "format": "date-time", + "description": "Only show times updated after the given time. This is a timestamp in RFC 3339 format", + "name": "since", + "in": "query" + }, + { + "type": "string", + "format": "date-time", + "description": "Only show times updated before the given time. This is a timestamp in RFC 3339 format", + "name": "before", + "in": "query" + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/TrackedTimeList" + }, + "400": { + "$ref": "#/responses/error" + }, + "403": { + "$ref": "#/responses/forbidden" + } + } + } + }, + "/repos/{owner}/{repo}/times/{user}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "List a user's tracked times in a repo", + "operationId": "userTrackedTimes", + "deprecated": true, + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "username of user", + "name": "user", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/TrackedTimeList" + }, + "400": { + "$ref": "#/responses/error" + }, + "403": { + "$ref": "#/responses/forbidden" + } + } + } + }, + "/repos/{owner}/{repo}/topics": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Get list of topics that a repository has", + "operationId": "repoListTopics", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/TopicNames" + } + } + }, + "put": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Replace list of topics for a repository", + "operationId": "repoUpdateTopics", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/RepoTopicOptions" + } + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "422": { + "$ref": "#/responses/invalidTopicsError" + } + } + } + }, + "/repos/{owner}/{repo}/topics/{topic}": { + "put": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Add a topic to a repository", + "operationId": "repoAddTopic", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the topic to add", + "name": "topic", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "422": { + "$ref": "#/responses/invalidTopicsError" + } + } + }, + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Delete a topic from a repository", + "operationId": "repoDeleteTopic", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the topic to delete", + "name": "topic", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "422": { + "$ref": "#/responses/invalidTopicsError" + } + } + } + }, + "/repos/{owner}/{repo}/transfer": { + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Transfer a repo ownership", + "operationId": "repoTransfer", + "parameters": [ + { + "type": "string", + "description": "owner of the repo to transfer", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo to transfer", + "name": "repo", + "in": "path", + "required": true + }, + { + "description": "Transfer Options", + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/TransferRepoOption" + } + } + ], + "responses": { + "202": { + "$ref": "#/responses/Repository" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "404": { + "$ref": "#/responses/notFound" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, + "/repos/{owner}/{repo}/transfer/accept": { + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Accept a repo transfer", + "operationId": "acceptRepoTransfer", + "parameters": [ + { + "type": "string", + "description": "owner of the repo to transfer", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo to transfer", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "202": { + "$ref": "#/responses/Repository" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/repos/{owner}/{repo}/transfer/reject": { + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Reject a repo transfer", + "operationId": "rejectRepoTransfer", + "parameters": [ + { + "type": "string", + "description": "owner of the repo to transfer", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo to transfer", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/Repository" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/repos/{owner}/{repo}/wiki/new": { + "post": { + "consumes": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Create a wiki page", + "operationId": "repoCreateWikiPage", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/CreateWikiPageOptions" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/WikiPage" + }, + "400": { + "$ref": "#/responses/error" + }, + "403": { + "$ref": "#/responses/forbidden" + } + } + } + }, + "/repos/{owner}/{repo}/wiki/page/{pageName}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Get a wiki page", + "operationId": "repoGetWikiPage", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the page", + "name": "pageName", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/WikiPage" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + }, + "delete": { + "tags": [ + "repository" + ], + "summary": "Delete a wiki page", + "operationId": "repoDeleteWikiPage", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the page", + "name": "pageName", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + }, + "patch": { + "consumes": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Edit a wiki page", + "operationId": "repoEditWikiPage", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the page", + "name": "pageName", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/CreateWikiPageOptions" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/WikiPage" + }, + "400": { + "$ref": "#/responses/error" + }, + "403": { + "$ref": "#/responses/forbidden" + } + } + } + }, + "/repos/{owner}/{repo}/wiki/pages": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Get all wiki pages", + "operationId": "repoGetWikiPages", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/WikiPageList" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/repos/{owner}/{repo}/wiki/revisions/{pageName}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Get revisions of a wiki page", + "operationId": "repoGetWikiPageRevisions", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the page", + "name": "pageName", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/WikiCommitList" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/repos/{template_owner}/{template_repo}/generate": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Create a repository using a template", + "operationId": "generateRepo", + "parameters": [ + { + "type": "string", + "description": "name of the template repository owner", + "name": "template_owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the template repository", + "name": "template_repo", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/GenerateRepoOption" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/Repository" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "404": { + "$ref": "#/responses/notFound" + }, + "409": { + "description": "The repository with the same name already exists." + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, + "/repositories/{id}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Get a repository by id", + "operationId": "repoGetByID", + "parameters": [ + { + "type": "integer", + "format": "int64", + "description": "id of the repo to get", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/Repository" + } + } + } + }, + "/settings/api": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "settings" + ], + "summary": "Get instance's global settings for api", + "operationId": "getGeneralAPISettings", + "responses": { + "200": { + "$ref": "#/responses/GeneralAPISettings" + } + } + } + }, + "/settings/attachment": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "settings" + ], + "summary": "Get instance's global settings for Attachment", + "operationId": "getGeneralAttachmentSettings", + "responses": { + "200": { + "$ref": "#/responses/GeneralAttachmentSettings" + } + } + } + }, + "/settings/repository": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "settings" + ], + "summary": "Get instance's global settings for repositories", + "operationId": "getGeneralRepositorySettings", + "responses": { + "200": { + "$ref": "#/responses/GeneralRepoSettings" + } + } + } + }, + "/settings/ui": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "settings" + ], + "summary": "Get instance's global settings for ui", + "operationId": "getGeneralUISettings", + "responses": { + "200": { + "$ref": "#/responses/GeneralUISettings" + } + } + } + }, + "/signing-key.gpg": { + "get": { + "produces": [ + "text/plain" + ], + "tags": [ + "miscellaneous" + ], + "summary": "Get default signing-key.gpg", + "operationId": "getSigningKey", + "responses": { + "200": { + "description": "GPG armored public key", + "schema": { + "type": "string" + } + } + } + } + }, + "/teams/{id}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "Get a team", + "operationId": "orgGetTeam", + "parameters": [ + { + "type": "integer", + "format": "int64", + "description": "id of the team to get", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/Team" + } + } + }, + "delete": { + "tags": [ + "organization" + ], + "summary": "Delete a team", + "operationId": "orgDeleteTeam", + "parameters": [ + { + "type": "integer", + "format": "int64", + "description": "id of the team to delete", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "team deleted" + } + } + }, + "patch": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "Edit a team", + "operationId": "orgEditTeam", + "parameters": [ + { + "type": "integer", + "description": "id of the team to edit", + "name": "id", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/EditTeamOption" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/Team" + } + } + } + }, + "/teams/{id}/activities/feeds": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "List a team's activity feeds", + "operationId": "orgListTeamActivityFeeds", + "parameters": [ + { + "type": "integer", + "format": "int64", + "description": "id of the team", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "format": "date", + "description": "the date of the activities to be found", + "name": "date", + "in": "query" + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/ActivityFeedsList" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/teams/{id}/members": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "List a team's members", + "operationId": "orgListTeamMembers", + "parameters": [ + { + "type": "integer", + "format": "int64", + "description": "id of the team", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/UserList" + } + } + } + }, + "/teams/{id}/members/{username}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "List a particular member of team", + "operationId": "orgListTeamMember", + "parameters": [ + { + "type": "integer", + "format": "int64", + "description": "id of the team", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "username of the member to list", + "name": "username", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/User" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + }, + "put": { + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "Add a team member", + "operationId": "orgAddTeamMember", + "parameters": [ + { + "type": "integer", + "format": "int64", + "description": "id of the team", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "username of the user to add", + "name": "username", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + }, + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "Remove a team member", + "operationId": "orgRemoveTeamMember", + "parameters": [ + { + "type": "integer", + "format": "int64", + "description": "id of the team", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "username of the user to remove", + "name": "username", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/teams/{id}/repos": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "List a team's repos", + "operationId": "orgListTeamRepos", + "parameters": [ + { + "type": "integer", + "format": "int64", + "description": "id of the team", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/RepositoryList" + } + } + } + }, + "/teams/{id}/repos/{org}/{repo}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "List a particular repo of team", + "operationId": "orgListTeamRepo", + "parameters": [ + { + "type": "integer", + "format": "int64", + "description": "id of the team", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "organization that owns the repo to list", + "name": "org", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo to list", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/Repository" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + }, + "put": { + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "Add a repository to a team", + "operationId": "orgAddTeamRepository", + "parameters": [ + { + "type": "integer", + "format": "int64", + "description": "id of the team", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "organization that owns the repo to add", + "name": "org", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo to add", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "403": { + "$ref": "#/responses/forbidden" + } + } + }, + "delete": { + "description": "This does not delete the repository, it only removes the repository from the team.", + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "Remove a repository from a team", + "operationId": "orgRemoveTeamRepository", + "parameters": [ + { + "type": "integer", + "format": "int64", + "description": "id of the team", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "organization that owns the repo to remove", + "name": "org", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo to remove", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "403": { + "$ref": "#/responses/forbidden" + } + } + } + }, + "/topics/search": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "search topics via keyword", + "operationId": "topicSearch", + "parameters": [ + { + "type": "string", + "description": "keywords to search", + "name": "q", + "in": "query", + "required": true + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/TopicListResponse" + }, + "403": { + "$ref": "#/responses/forbidden" + } + } + } + }, + "/user": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "Get the authenticated user", + "operationId": "userGetCurrent", + "responses": { + "200": { + "$ref": "#/responses/User" + } + } + } + }, + "/user/applications/oauth2": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "List the authenticated user's oauth2 applications", + "operationId": "userGetOauth2Application", + "parameters": [ + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/OAuth2ApplicationList" + } + } + }, + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "creates a new OAuth2 application", + "operationId": "userCreateOAuth2Application", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/CreateOAuth2ApplicationOptions" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/OAuth2Application" + }, + "400": { + "$ref": "#/responses/error" + } + } + } + }, + "/user/applications/oauth2/{id}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "get an OAuth2 Application", + "operationId": "userGetOAuth2Application", + "parameters": [ + { + "type": "integer", + "format": "int64", + "description": "Application ID to be found", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/OAuth2Application" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + }, + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "delete an OAuth2 Application", + "operationId": "userDeleteOAuth2Application", + "parameters": [ + { + "type": "integer", + "format": "int64", + "description": "token to be deleted", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + }, + "patch": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "update an OAuth2 Application, this includes regenerating the client secret", + "operationId": "userUpdateOAuth2Application", + "parameters": [ + { + "type": "integer", + "format": "int64", + "description": "application to be updated", + "name": "id", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/CreateOAuth2ApplicationOptions" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/OAuth2Application" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/user/emails": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "List the authenticated user's email addresses", + "operationId": "userListEmails", + "responses": { + "200": { + "$ref": "#/responses/EmailList" + } + } + }, + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "Add email addresses", + "operationId": "userAddEmail", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/CreateEmailOption" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/EmailList" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + }, + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "Delete email addresses", + "operationId": "userDeleteEmail", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/DeleteEmailOption" + } + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/user/followers": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "List the authenticated user's followers", + "operationId": "userCurrentListFollowers", + "parameters": [ + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/UserList" + } + } + } + }, + "/user/following": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "List the users that the authenticated user is following", + "operationId": "userCurrentListFollowing", + "parameters": [ + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/UserList" + } + } + } + }, + "/user/following/{username}": { + "get": { + "tags": [ + "user" + ], + "summary": "Check whether a user is followed by the authenticated user", + "operationId": "userCurrentCheckFollowing", + "parameters": [ + { + "type": "string", + "description": "username of followed user", + "name": "username", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + }, + "put": { + "tags": [ + "user" + ], + "summary": "Follow a user", + "operationId": "userCurrentPutFollow", + "parameters": [ + { + "type": "string", + "description": "username of user to follow", + "name": "username", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + } + } + }, + "delete": { + "tags": [ + "user" + ], + "summary": "Unfollow a user", + "operationId": "userCurrentDeleteFollow", + "parameters": [ + { + "type": "string", + "description": "username of user to unfollow", + "name": "username", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + } + } + } + }, + "/user/gpg_key_token": { + "get": { + "produces": [ + "text/plain" + ], + "tags": [ + "user" + ], + "summary": "Get a Token to verify", + "operationId": "getVerificationToken", + "responses": { + "200": { + "$ref": "#/responses/string" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/user/gpg_key_verify": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "Verify a GPG key", + "operationId": "userVerifyGPGKey", + "responses": { + "201": { + "$ref": "#/responses/GPGKey" + }, + "404": { + "$ref": "#/responses/notFound" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, + "/user/gpg_keys": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "List the authenticated user's GPG keys", + "operationId": "userCurrentListGPGKeys", + "parameters": [ + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/GPGKeyList" + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "Create a GPG key", + "operationId": "userCurrentPostGPGKey", + "parameters": [ + { + "name": "Form", + "in": "body", + "schema": { + "$ref": "#/definitions/CreateGPGKeyOption" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/GPGKey" + }, + "404": { + "$ref": "#/responses/notFound" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, + "/user/gpg_keys/{id}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "Get a GPG key", + "operationId": "userCurrentGetGPGKey", + "parameters": [ + { + "type": "integer", + "format": "int64", + "description": "id of key to get", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/GPGKey" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + }, + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "Remove a GPG key", + "operationId": "userCurrentDeleteGPGKey", + "parameters": [ + { + "type": "integer", + "format": "int64", + "description": "id of key to delete", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/user/hooks": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "List the authenticated user's webhooks", + "operationId": "userListHooks", + "parameters": [ + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/HookList" + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "Create a hook", + "operationId": "userCreateHook", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/CreateHookOption" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/Hook" + } + } + } + }, + "/user/hooks/{id}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "Get a hook", + "operationId": "userGetHook", + "parameters": [ + { + "type": "integer", + "format": "int64", + "description": "id of the hook to get", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/Hook" + } + } + }, + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "Delete a hook", + "operationId": "userDeleteHook", + "parameters": [ + { + "type": "integer", + "format": "int64", + "description": "id of the hook to delete", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + } + } + }, + "patch": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "Update a hook", + "operationId": "userEditHook", + "parameters": [ + { + "type": "integer", + "format": "int64", + "description": "id of the hook to update", + "name": "id", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/EditHookOption" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/Hook" + } + } + } + }, + "/user/keys": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "List the authenticated user's public keys", + "operationId": "userCurrentListKeys", + "parameters": [ + { + "type": "string", + "description": "fingerprint of the key", + "name": "fingerprint", + "in": "query" + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/PublicKeyList" + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "Create a public key", + "operationId": "userCurrentPostKey", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/CreateKeyOption" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/PublicKey" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, + "/user/keys/{id}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "Get a public key", + "operationId": "userCurrentGetKey", + "parameters": [ + { + "type": "integer", + "format": "int64", + "description": "id of key to get", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/PublicKey" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + }, + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "Delete a public key", + "operationId": "userCurrentDeleteKey", + "parameters": [ + { + "type": "integer", + "format": "int64", + "description": "id of key to delete", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/user/orgs": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "List the current user's organizations", + "operationId": "orgListCurrentUserOrgs", + "parameters": [ + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/OrganizationList" + } + } + } + }, + "/user/repos": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "List the repos that the authenticated user owns", + "operationId": "userCurrentListRepos", + "parameters": [ + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/RepositoryList" + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repository", + "user" + ], + "summary": "Create a repository", + "operationId": "createCurrentUserRepo", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/CreateRepoOption" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/Repository" + }, + "400": { + "$ref": "#/responses/error" + }, + "409": { + "description": "The repository with the same name already exists." + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, + "/user/settings": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "Get user settings", + "operationId": "getUserSettings", + "responses": { + "200": { + "$ref": "#/responses/UserSettings" + } + } + }, + "patch": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "Update user settings", + "operationId": "updateUserSettings", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/UserSettingsOptions" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/UserSettings" + } + } + } + }, + "/user/starred": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "The repos that the authenticated user has starred", + "operationId": "userCurrentListStarred", + "parameters": [ + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/RepositoryList" + } + } + } + }, + "/user/starred/{owner}/{repo}": { + "get": { + "tags": [ + "user" + ], + "summary": "Whether the authenticated is starring the repo", + "operationId": "userCurrentCheckStarring", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + }, + "put": { + "tags": [ + "user" + ], + "summary": "Star the given repo", + "operationId": "userCurrentPutStar", + "parameters": [ + { + "type": "string", + "description": "owner of the repo to star", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo to star", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + } + } + }, + "delete": { + "tags": [ + "user" + ], + "summary": "Unstar the given repo", + "operationId": "userCurrentDeleteStar", + "parameters": [ + { + "type": "string", + "description": "owner of the repo to unstar", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo to unstar", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + } + } + } + }, + "/user/stopwatches": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "Get list of all existing stopwatches", + "operationId": "userGetStopWatches", + "parameters": [ + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/StopWatchList" + } + } + } + }, + "/user/subscriptions": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "List repositories watched by the authenticated user", + "operationId": "userCurrentListSubscriptions", + "parameters": [ + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/RepositoryList" + } + } + } + }, + "/user/teams": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "List all the teams a user belongs to", + "operationId": "userListTeams", + "parameters": [ + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/TeamList" + } + } + } + }, + "/user/times": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "List the current user's tracked times", + "operationId": "userCurrentTrackedTimes", + "parameters": [ + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + }, + { + "type": "string", + "format": "date-time", + "description": "Only show times updated after the given time. This is a timestamp in RFC 3339 format", + "name": "since", + "in": "query" + }, + { + "type": "string", + "format": "date-time", + "description": "Only show times updated before the given time. This is a timestamp in RFC 3339 format", + "name": "before", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/TrackedTimeList" + } + } + } + }, + "/users/search": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "Search for users", + "operationId": "userSearch", + "parameters": [ + { + "type": "string", + "description": "keyword", + "name": "q", + "in": "query" + }, + { + "type": "integer", + "format": "int64", + "description": "ID of the user to search for", + "name": "uid", + "in": "query" + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "description": "SearchResults of a successful search", + "schema": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/definitions/User" + } + }, + "ok": { + "type": "boolean" + } + } + } + } + } + } + }, + "/users/{username}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "Get a user", + "operationId": "userGet", + "parameters": [ + { + "type": "string", + "description": "username of user to get", + "name": "username", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/User" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/users/{username}/activities/feeds": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "List a user's activity feeds", + "operationId": "userListActivityFeeds", + "parameters": [ + { + "type": "string", + "description": "username of user", + "name": "username", + "in": "path", + "required": true + }, + { + "type": "boolean", + "description": "if true, only show actions performed by the requested user", + "name": "only-performed-by", + "in": "query" + }, + { + "type": "string", + "format": "date", + "description": "the date of the activities to be found", + "name": "date", + "in": "query" + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/ActivityFeedsList" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/users/{username}/followers": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "List the given user's followers", + "operationId": "userListFollowers", + "parameters": [ + { + "type": "string", + "description": "username of user", + "name": "username", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/UserList" + } + } + } + }, + "/users/{username}/following": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "List the users that the given user is following", + "operationId": "userListFollowing", + "parameters": [ + { + "type": "string", + "description": "username of user", + "name": "username", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/UserList" + } + } + } + }, + "/users/{username}/following/{target}": { + "get": { + "tags": [ + "user" + ], + "summary": "Check if one user is following another user", + "operationId": "userCheckFollowing", + "parameters": [ + { + "type": "string", + "description": "username of following user", + "name": "username", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "username of followed user", + "name": "target", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/users/{username}/gpg_keys": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "List the given user's GPG keys", + "operationId": "userListGPGKeys", + "parameters": [ + { + "type": "string", + "description": "username of user", + "name": "username", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/GPGKeyList" + } + } + } + }, + "/users/{username}/heatmap": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "Get a user's heatmap", + "operationId": "userGetHeatmapData", + "parameters": [ + { + "type": "string", + "description": "username of user to get", + "name": "username", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/UserHeatmapData" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/users/{username}/keys": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "List the given user's public keys", + "operationId": "userListKeys", + "parameters": [ + { + "type": "string", + "description": "username of user", + "name": "username", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "fingerprint of the key", + "name": "fingerprint", + "in": "query" + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/PublicKeyList" + } + } + } + }, + "/users/{username}/orgs": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "List a user's organizations", + "operationId": "orgListUserOrgs", + "parameters": [ + { + "type": "string", + "description": "username of user", + "name": "username", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/OrganizationList" + } + } + } + }, + "/users/{username}/orgs/{org}/permissions": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "Get user permissions in organization", + "operationId": "orgGetUserPermissions", + "parameters": [ + { + "type": "string", + "description": "username of user", + "name": "username", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the organization", + "name": "org", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/OrganizationPermissions" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, + "/users/{username}/repos": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "List the repos owned by the given user", + "operationId": "userListRepos", + "parameters": [ + { + "type": "string", + "description": "username of user", + "name": "username", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/RepositoryList" + } + } + } + }, + "/users/{username}/starred": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "The repos that the given user has starred", + "operationId": "userListStarred", + "parameters": [ + { + "type": "string", + "description": "username of user", + "name": "username", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/RepositoryList" + } + } + } + }, + "/users/{username}/subscriptions": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "List the repositories watched by a user", + "operationId": "userListSubscriptions", + "parameters": [ + { + "type": "string", + "description": "username of the user", + "name": "username", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/RepositoryList" + } + } + } + }, + "/users/{username}/tokens": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "List the authenticated user's access tokens", + "operationId": "userGetTokens", + "parameters": [ + { + "type": "string", + "description": "username of user", + "name": "username", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/AccessTokenList" + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "Create an access token", + "operationId": "userCreateToken", + "parameters": [ + { + "type": "string", + "description": "username of user", + "name": "username", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/CreateAccessTokenOption" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/AccessToken" + }, + "400": { + "$ref": "#/responses/error" + } + } + } + }, + "/users/{username}/tokens/{token}": { + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "delete an access token", + "operationId": "userDeleteAccessToken", + "parameters": [ + { + "type": "string", + "description": "username of user", + "name": "username", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "token to be deleted, identified by ID and if not available by name", + "name": "token", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "404": { + "$ref": "#/responses/notFound" + }, + "422": { + "$ref": "#/responses/error" + } + } + } + }, + "/version": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "miscellaneous" + ], + "summary": "Returns the version of the Gitea application", + "operationId": "getVersion", + "responses": { + "200": { + "$ref": "#/responses/ServerVersion" + } + } + } + } + }, + "definitions": { + "APIError": { + "description": "APIError is an api error with a message", + "type": "object", + "properties": { + "message": { + "type": "string", + "x-go-name": "Message" + }, + "url": { + "type": "string", + "x-go-name": "URL" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "AccessToken": { + "type": "object", + "title": "AccessToken represents an API access token.", + "properties": { + "id": { + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "name": { + "type": "string", + "x-go-name": "Name" + }, + "scopes": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "Scopes" + }, + "sha1": { + "type": "string", + "x-go-name": "Token" + }, + "token_last_eight": { + "type": "string", + "x-go-name": "TokenLastEight" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "Activity": { + "type": "object", + "properties": { + "act_user": { + "$ref": "#/definitions/User" + }, + "act_user_id": { + "type": "integer", + "format": "int64", + "x-go-name": "ActUserID" + }, + "comment": { + "$ref": "#/definitions/Comment" + }, + "comment_id": { + "type": "integer", + "format": "int64", + "x-go-name": "CommentID" + }, + "content": { + "type": "string", + "x-go-name": "Content" + }, + "created": { + "type": "string", + "format": "date-time", + "x-go-name": "Created" + }, + "id": { + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "is_private": { + "type": "boolean", + "x-go-name": "IsPrivate" + }, + "op_type": { + "type": "string", + "x-go-name": "OpType" + }, + "ref_name": { + "type": "string", + "x-go-name": "RefName" + }, + "repo": { + "$ref": "#/definitions/Repository" + }, + "repo_id": { + "type": "integer", + "format": "int64", + "x-go-name": "RepoID" + }, + "user_id": { + "type": "integer", + "format": "int64", + "x-go-name": "UserID" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "ActivityPub": { + "description": "ActivityPub type", + "type": "object", + "properties": { + "@context": { + "type": "string", + "x-go-name": "Context" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "AddCollaboratorOption": { + "description": "AddCollaboratorOption options when adding a user as a collaborator of a repository", + "type": "object", + "properties": { + "permission": { + "type": "string", + "x-go-name": "Permission" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "AddTimeOption": { + "description": "AddTimeOption options for adding time to an issue", + "type": "object", + "required": [ + "time" + ], + "properties": { + "created": { + "type": "string", + "format": "date-time", + "x-go-name": "Created" + }, + "time": { + "description": "time in seconds", + "type": "integer", + "format": "int64", + "x-go-name": "Time" + }, + "user_name": { + "description": "User who spent the time (optional)", + "type": "string", + "x-go-name": "User" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "AnnotatedTag": { + "description": "AnnotatedTag represents an annotated tag", + "type": "object", + "properties": { + "message": { + "type": "string", + "x-go-name": "Message" + }, + "object": { + "$ref": "#/definitions/AnnotatedTagObject" + }, + "sha": { + "type": "string", + "x-go-name": "SHA" + }, + "tag": { + "type": "string", + "x-go-name": "Tag" + }, + "tagger": { + "$ref": "#/definitions/CommitUser" + }, + "url": { + "type": "string", + "x-go-name": "URL" + }, + "verification": { + "$ref": "#/definitions/PayloadCommitVerification" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "AnnotatedTagObject": { + "description": "AnnotatedTagObject contains meta information of the tag object", + "type": "object", + "properties": { + "sha": { + "type": "string", + "x-go-name": "SHA" + }, + "type": { + "type": "string", + "x-go-name": "Type" + }, + "url": { + "type": "string", + "x-go-name": "URL" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "Attachment": { + "description": "Attachment a generic attachment", + "type": "object", + "properties": { + "browser_download_url": { + "type": "string", + "x-go-name": "DownloadURL" + }, + "created_at": { + "type": "string", + "format": "date-time", + "x-go-name": "Created" + }, + "download_count": { + "type": "integer", + "format": "int64", + "x-go-name": "DownloadCount" + }, + "id": { + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "name": { + "type": "string", + "x-go-name": "Name" + }, + "size": { + "type": "integer", + "format": "int64", + "x-go-name": "Size" + }, + "uuid": { + "type": "string", + "x-go-name": "UUID" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "Branch": { + "description": "Branch represents a repository branch", + "type": "object", + "properties": { + "commit": { + "$ref": "#/definitions/PayloadCommit" + }, + "effective_branch_protection_name": { + "type": "string", + "x-go-name": "EffectiveBranchProtectionName" + }, + "enable_status_check": { + "type": "boolean", + "x-go-name": "EnableStatusCheck" + }, + "name": { + "type": "string", + "x-go-name": "Name" + }, + "protected": { + "type": "boolean", + "x-go-name": "Protected" + }, + "required_approvals": { + "type": "integer", + "format": "int64", + "x-go-name": "RequiredApprovals" + }, + "status_check_contexts": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "StatusCheckContexts" + }, + "user_can_merge": { + "type": "boolean", + "x-go-name": "UserCanMerge" + }, + "user_can_push": { + "type": "boolean", + "x-go-name": "UserCanPush" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "BranchProtection": { + "description": "BranchProtection represents a branch protection for a repository", + "type": "object", + "properties": { + "approvals_whitelist_teams": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "ApprovalsWhitelistTeams" + }, + "approvals_whitelist_username": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "ApprovalsWhitelistUsernames" + }, + "block_on_official_review_requests": { + "type": "boolean", + "x-go-name": "BlockOnOfficialReviewRequests" + }, + "block_on_outdated_branch": { + "type": "boolean", + "x-go-name": "BlockOnOutdatedBranch" + }, + "block_on_rejected_reviews": { + "type": "boolean", + "x-go-name": "BlockOnRejectedReviews" + }, + "branch_name": { + "description": "Deprecated: true", + "type": "string", + "x-go-name": "BranchName" + }, + "created_at": { + "type": "string", + "format": "date-time", + "x-go-name": "Created" + }, + "dismiss_stale_approvals": { + "type": "boolean", + "x-go-name": "DismissStaleApprovals" + }, + "enable_approvals_whitelist": { + "type": "boolean", + "x-go-name": "EnableApprovalsWhitelist" + }, + "enable_merge_whitelist": { + "type": "boolean", + "x-go-name": "EnableMergeWhitelist" + }, + "enable_push": { + "type": "boolean", + "x-go-name": "EnablePush" + }, + "enable_push_whitelist": { + "type": "boolean", + "x-go-name": "EnablePushWhitelist" + }, + "enable_status_check": { + "type": "boolean", + "x-go-name": "EnableStatusCheck" + }, + "merge_whitelist_teams": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "MergeWhitelistTeams" + }, + "merge_whitelist_usernames": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "MergeWhitelistUsernames" + }, + "protected_file_patterns": { + "type": "string", + "x-go-name": "ProtectedFilePatterns" + }, + "push_whitelist_deploy_keys": { + "type": "boolean", + "x-go-name": "PushWhitelistDeployKeys" + }, + "push_whitelist_teams": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "PushWhitelistTeams" + }, + "push_whitelist_usernames": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "PushWhitelistUsernames" + }, + "require_signed_commits": { + "type": "boolean", + "x-go-name": "RequireSignedCommits" + }, + "required_approvals": { + "type": "integer", + "format": "int64", + "x-go-name": "RequiredApprovals" + }, + "rule_name": { + "type": "string", + "x-go-name": "RuleName" + }, + "status_check_contexts": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "StatusCheckContexts" + }, + "unprotected_file_patterns": { + "type": "string", + "x-go-name": "UnprotectedFilePatterns" + }, + "updated_at": { + "type": "string", + "format": "date-time", + "x-go-name": "Updated" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "ChangeFileOperation": { + "description": "ChangeFileOperation for creating, updating or deleting a file", + "type": "object", + "required": [ + "operation", + "path" + ], + "properties": { + "content": { + "description": "new or updated file content, must be base64 encoded", + "type": "string", + "x-go-name": "Content" + }, + "from_path": { + "description": "old path of the file to move", + "type": "string", + "x-go-name": "FromPath" + }, + "operation": { + "description": "indicates what to do with the file", + "type": "string", + "enum": [ + "create", + "update", + "delete" + ], + "x-go-name": "Operation" + }, + "path": { + "description": "path to the existing or new file", + "type": "string", + "x-go-name": "Path" + }, + "sha": { + "description": "sha is the SHA for the file that already exists, required for update or delete", + "type": "string", + "x-go-name": "SHA" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "ChangeFilesOptions": { + "description": "ChangeFilesOptions options for creating, updating or deleting multiple files\nNote: `author` and `committer` are optional (if only one is given, it will be used for the other, otherwise the authenticated user will be used)", + "type": "object", + "required": [ + "files" + ], + "properties": { + "author": { + "$ref": "#/definitions/Identity" + }, + "branch": { + "description": "branch (optional) to base this file from. if not given, the default branch is used", + "type": "string", + "x-go-name": "BranchName" + }, + "committer": { + "$ref": "#/definitions/Identity" + }, + "dates": { + "$ref": "#/definitions/CommitDateOptions" + }, + "files": { + "description": "list of file operations", + "type": "array", + "items": { + "$ref": "#/definitions/ChangeFileOperation" + }, + "x-go-name": "Files" + }, + "message": { + "description": "message (optional) for the commit of this file. if not supplied, a default message will be used", + "type": "string", + "x-go-name": "Message" + }, + "new_branch": { + "description": "new_branch (optional) will make a new branch from `branch` before creating the file", + "type": "string", + "x-go-name": "NewBranchName" + }, + "signoff": { + "description": "Add a Signed-off-by trailer by the committer at the end of the commit log message.", + "type": "boolean", + "x-go-name": "Signoff" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "ChangedFile": { + "description": "ChangedFile store information about files affected by the pull request", + "type": "object", + "properties": { + "additions": { + "type": "integer", + "format": "int64", + "x-go-name": "Additions" + }, + "changes": { + "type": "integer", + "format": "int64", + "x-go-name": "Changes" + }, + "contents_url": { + "type": "string", + "x-go-name": "ContentsURL" + }, + "deletions": { + "type": "integer", + "format": "int64", + "x-go-name": "Deletions" + }, + "filename": { + "type": "string", + "x-go-name": "Filename" + }, + "html_url": { + "type": "string", + "x-go-name": "HTMLURL" + }, + "previous_filename": { + "type": "string", + "x-go-name": "PreviousFilename" + }, + "raw_url": { + "type": "string", + "x-go-name": "RawURL" + }, + "status": { + "type": "string", + "x-go-name": "Status" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "CombinedStatus": { + "description": "CombinedStatus holds the combined state of several statuses for a single commit", + "type": "object", + "properties": { + "commit_url": { + "type": "string", + "x-go-name": "CommitURL" + }, + "repository": { + "$ref": "#/definitions/Repository" + }, + "sha": { + "type": "string", + "x-go-name": "SHA" + }, + "state": { + "$ref": "#/definitions/CommitStatusState" + }, + "statuses": { + "type": "array", + "items": { + "$ref": "#/definitions/CommitStatus" + }, + "x-go-name": "Statuses" + }, + "total_count": { + "type": "integer", + "format": "int64", + "x-go-name": "TotalCount" + }, + "url": { + "type": "string", + "x-go-name": "URL" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "Comment": { + "description": "Comment represents a comment on a commit or issue", + "type": "object", + "properties": { + "assets": { + "type": "array", + "items": { + "$ref": "#/definitions/Attachment" + }, + "x-go-name": "Attachments" + }, + "body": { + "type": "string", + "x-go-name": "Body" + }, + "created_at": { + "type": "string", + "format": "date-time", + "x-go-name": "Created" + }, + "html_url": { + "type": "string", + "x-go-name": "HTMLURL" + }, + "id": { + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "issue_url": { + "type": "string", + "x-go-name": "IssueURL" + }, + "original_author": { + "type": "string", + "x-go-name": "OriginalAuthor" + }, + "original_author_id": { + "type": "integer", + "format": "int64", + "x-go-name": "OriginalAuthorID" + }, + "pull_request_url": { + "type": "string", + "x-go-name": "PRURL" + }, + "updated_at": { + "type": "string", + "format": "date-time", + "x-go-name": "Updated" + }, + "user": { + "$ref": "#/definitions/User" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "Commit": { + "type": "object", + "title": "Commit contains information generated from a Git commit.", + "properties": { + "author": { + "$ref": "#/definitions/User" + }, + "commit": { + "$ref": "#/definitions/RepoCommit" + }, + "committer": { + "$ref": "#/definitions/User" + }, + "created": { + "type": "string", + "format": "date-time", + "x-go-name": "Created" + }, + "files": { + "type": "array", + "items": { + "$ref": "#/definitions/CommitAffectedFiles" + }, + "x-go-name": "Files" + }, + "html_url": { + "type": "string", + "x-go-name": "HTMLURL" + }, + "parents": { + "type": "array", + "items": { + "$ref": "#/definitions/CommitMeta" + }, + "x-go-name": "Parents" + }, + "sha": { + "type": "string", + "x-go-name": "SHA" + }, + "stats": { + "$ref": "#/definitions/CommitStats" + }, + "url": { + "type": "string", + "x-go-name": "URL" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "CommitAffectedFiles": { + "description": "CommitAffectedFiles store information about files affected by the commit", + "type": "object", + "properties": { + "filename": { + "type": "string", + "x-go-name": "Filename" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "CommitDateOptions": { + "description": "CommitDateOptions store dates for GIT_AUTHOR_DATE and GIT_COMMITTER_DATE", + "type": "object", + "properties": { + "author": { + "type": "string", + "format": "date-time", + "x-go-name": "Author" + }, + "committer": { + "type": "string", + "format": "date-time", + "x-go-name": "Committer" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "CommitMeta": { + "type": "object", + "title": "CommitMeta contains meta information of a commit in terms of API.", + "properties": { + "created": { + "type": "string", + "format": "date-time", + "x-go-name": "Created" + }, + "sha": { + "type": "string", + "x-go-name": "SHA" + }, + "url": { + "type": "string", + "x-go-name": "URL" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "CommitStats": { + "description": "CommitStats is statistics for a RepoCommit", + "type": "object", + "properties": { + "additions": { + "type": "integer", + "format": "int64", + "x-go-name": "Additions" + }, + "deletions": { + "type": "integer", + "format": "int64", + "x-go-name": "Deletions" + }, + "total": { + "type": "integer", + "format": "int64", + "x-go-name": "Total" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "CommitStatus": { + "description": "CommitStatus holds a single status of a single Commit", + "type": "object", + "properties": { + "context": { + "type": "string", + "x-go-name": "Context" + }, + "created_at": { + "type": "string", + "format": "date-time", + "x-go-name": "Created" + }, + "creator": { + "$ref": "#/definitions/User" + }, + "description": { + "type": "string", + "x-go-name": "Description" + }, + "id": { + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "status": { + "$ref": "#/definitions/CommitStatusState" + }, + "target_url": { + "type": "string", + "x-go-name": "TargetURL" + }, + "updated_at": { + "type": "string", + "format": "date-time", + "x-go-name": "Updated" + }, + "url": { + "type": "string", + "x-go-name": "URL" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "CommitStatusState": { + "description": "CommitStatusState holds the state of a CommitStatus\nIt can be \"pending\", \"success\", \"error\", \"failure\", and \"warning\"", + "type": "string", + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "CommitUser": { + "type": "object", + "title": "CommitUser contains information of a user in the context of a commit.", + "properties": { + "date": { + "type": "string", + "x-go-name": "Date" + }, + "email": { + "type": "string", + "format": "email", + "x-go-name": "Email" + }, + "name": { + "type": "string", + "x-go-name": "Name" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "ContentsResponse": { + "description": "ContentsResponse contains information about a repo's entry's (dir, file, symlink, submodule) metadata and content", + "type": "object", + "properties": { + "_links": { + "$ref": "#/definitions/FileLinksResponse" + }, + "content": { + "description": "`content` is populated when `type` is `file`, otherwise null", + "type": "string", + "x-go-name": "Content" + }, + "download_url": { + "type": "string", + "x-go-name": "DownloadURL" + }, + "encoding": { + "description": "`encoding` is populated when `type` is `file`, otherwise null", + "type": "string", + "x-go-name": "Encoding" + }, + "git_url": { + "type": "string", + "x-go-name": "GitURL" + }, + "html_url": { + "type": "string", + "x-go-name": "HTMLURL" + }, + "last_commit_sha": { + "type": "string", + "x-go-name": "LastCommitSHA" + }, + "name": { + "type": "string", + "x-go-name": "Name" + }, + "path": { + "type": "string", + "x-go-name": "Path" + }, + "sha": { + "type": "string", + "x-go-name": "SHA" + }, + "size": { + "type": "integer", + "format": "int64", + "x-go-name": "Size" + }, + "submodule_git_url": { + "description": "`submodule_git_url` is populated when `type` is `submodule`, otherwise null", + "type": "string", + "x-go-name": "SubmoduleGitURL" + }, + "target": { + "description": "`target` is populated when `type` is `symlink`, otherwise null", + "type": "string", + "x-go-name": "Target" + }, + "type": { + "description": "`type` will be `file`, `dir`, `symlink`, or `submodule`", + "type": "string", + "x-go-name": "Type" + }, + "url": { + "type": "string", + "x-go-name": "URL" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "CreateAccessTokenOption": { + "description": "CreateAccessTokenOption options when create access token", + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string", + "x-go-name": "Name" + }, + "scopes": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "Scopes" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "CreateBranchProtectionOption": { + "description": "CreateBranchProtectionOption options for creating a branch protection", + "type": "object", + "properties": { + "approvals_whitelist_teams": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "ApprovalsWhitelistTeams" + }, + "approvals_whitelist_username": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "ApprovalsWhitelistUsernames" + }, + "block_on_official_review_requests": { + "type": "boolean", + "x-go-name": "BlockOnOfficialReviewRequests" + }, + "block_on_outdated_branch": { + "type": "boolean", + "x-go-name": "BlockOnOutdatedBranch" + }, + "block_on_rejected_reviews": { + "type": "boolean", + "x-go-name": "BlockOnRejectedReviews" + }, + "branch_name": { + "description": "Deprecated: true", + "type": "string", + "x-go-name": "BranchName" + }, + "dismiss_stale_approvals": { + "type": "boolean", + "x-go-name": "DismissStaleApprovals" + }, + "enable_approvals_whitelist": { + "type": "boolean", + "x-go-name": "EnableApprovalsWhitelist" + }, + "enable_merge_whitelist": { + "type": "boolean", + "x-go-name": "EnableMergeWhitelist" + }, + "enable_push": { + "type": "boolean", + "x-go-name": "EnablePush" + }, + "enable_push_whitelist": { + "type": "boolean", + "x-go-name": "EnablePushWhitelist" + }, + "enable_status_check": { + "type": "boolean", + "x-go-name": "EnableStatusCheck" + }, + "merge_whitelist_teams": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "MergeWhitelistTeams" + }, + "merge_whitelist_usernames": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "MergeWhitelistUsernames" + }, + "protected_file_patterns": { + "type": "string", + "x-go-name": "ProtectedFilePatterns" + }, + "push_whitelist_deploy_keys": { + "type": "boolean", + "x-go-name": "PushWhitelistDeployKeys" + }, + "push_whitelist_teams": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "PushWhitelistTeams" + }, + "push_whitelist_usernames": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "PushWhitelistUsernames" + }, + "require_signed_commits": { + "type": "boolean", + "x-go-name": "RequireSignedCommits" + }, + "required_approvals": { + "type": "integer", + "format": "int64", + "x-go-name": "RequiredApprovals" + }, + "rule_name": { + "type": "string", + "x-go-name": "RuleName" + }, + "status_check_contexts": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "StatusCheckContexts" + }, + "unprotected_file_patterns": { + "type": "string", + "x-go-name": "UnprotectedFilePatterns" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "CreateBranchRepoOption": { + "description": "CreateBranchRepoOption options when creating a branch in a repository", + "type": "object", + "required": [ + "new_branch_name" + ], + "properties": { + "new_branch_name": { + "description": "Name of the branch to create", + "type": "string", + "uniqueItems": true, + "x-go-name": "BranchName" + }, + "old_branch_name": { + "description": "Deprecated: true\nName of the old branch to create from", + "type": "string", + "uniqueItems": true, + "x-go-name": "OldBranchName" + }, + "old_ref_name": { + "description": "Name of the old branch/tag/commit to create from", + "type": "string", + "uniqueItems": true, + "x-go-name": "OldRefName" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "CreateEmailOption": { + "description": "CreateEmailOption options when creating email addresses", + "type": "object", + "properties": { + "emails": { + "description": "email addresses to add", + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "Emails" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "CreateFileOptions": { + "description": "CreateFileOptions options for creating files\nNote: `author` and `committer` are optional (if only one is given, it will be used for the other, otherwise the authenticated user will be used)", + "type": "object", + "required": [ + "content" + ], + "properties": { + "author": { + "$ref": "#/definitions/Identity" + }, + "branch": { + "description": "branch (optional) to base this file from. if not given, the default branch is used", + "type": "string", + "x-go-name": "BranchName" + }, + "committer": { + "$ref": "#/definitions/Identity" + }, + "content": { + "description": "content must be base64 encoded", + "type": "string", + "x-go-name": "Content" + }, + "dates": { + "$ref": "#/definitions/CommitDateOptions" + }, + "message": { + "description": "message (optional) for the commit of this file. if not supplied, a default message will be used", + "type": "string", + "x-go-name": "Message" + }, + "new_branch": { + "description": "new_branch (optional) will make a new branch from `branch` before creating the file", + "type": "string", + "x-go-name": "NewBranchName" + }, + "signoff": { + "description": "Add a Signed-off-by trailer by the committer at the end of the commit log message.", + "type": "boolean", + "x-go-name": "Signoff" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "CreateForkOption": { + "description": "CreateForkOption options for creating a fork", + "type": "object", + "properties": { + "name": { + "description": "name of the forked repository", + "type": "string", + "x-go-name": "Name" + }, + "organization": { + "description": "organization name, if forking into an organization", + "type": "string", + "x-go-name": "Organization" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "CreateGPGKeyOption": { + "description": "CreateGPGKeyOption options create user GPG key", + "type": "object", + "required": [ + "armored_public_key" + ], + "properties": { + "armored_public_key": { + "description": "An armored GPG key to add", + "type": "string", + "uniqueItems": true, + "x-go-name": "ArmoredKey" + }, + "armored_signature": { + "type": "string", + "x-go-name": "Signature" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "CreateHookOption": { + "description": "CreateHookOption options when create a hook", + "type": "object", + "required": [ + "type", + "config" + ], + "properties": { + "active": { + "type": "boolean", + "default": false, + "x-go-name": "Active" + }, + "authorization_header": { + "type": "string", + "x-go-name": "AuthorizationHeader" + }, + "branch_filter": { + "type": "string", + "x-go-name": "BranchFilter" + }, + "config": { + "$ref": "#/definitions/CreateHookOptionConfig" + }, + "events": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "Events" + }, + "type": { + "type": "string", + "enum": [ + "dingtalk", + "discord", + "gitea", + "gogs", + "msteams", + "slack", + "telegram", + "feishu", + "wechatwork", + "packagist" + ], + "x-go-name": "Type" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "CreateHookOptionConfig": { + "description": "CreateHookOptionConfig has all config options in it\nrequired are \"content_type\" and \"url\" Required", + "type": "object", + "additionalProperties": { + "type": "string" + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "CreateIssueCommentOption": { + "description": "CreateIssueCommentOption options for creating a comment on an issue", + "type": "object", + "required": [ + "body" + ], + "properties": { + "body": { + "type": "string", + "x-go-name": "Body" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "CreateIssueOption": { + "description": "CreateIssueOption options to create one issue", + "type": "object", + "required": [ + "title" + ], + "properties": { + "assignee": { + "description": "deprecated", + "type": "string", + "x-go-name": "Assignee" + }, + "assignees": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "Assignees" + }, + "body": { + "type": "string", + "x-go-name": "Body" + }, + "closed": { + "type": "boolean", + "x-go-name": "Closed" + }, + "due_date": { + "type": "string", + "format": "date-time", + "x-go-name": "Deadline" + }, + "labels": { + "description": "list of label ids", + "type": "array", + "items": { + "type": "integer", + "format": "int64" + }, + "x-go-name": "Labels" + }, + "milestone": { + "description": "milestone id", + "type": "integer", + "format": "int64", + "x-go-name": "Milestone" + }, + "ref": { + "type": "string", + "x-go-name": "Ref" + }, + "title": { + "type": "string", + "x-go-name": "Title" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "CreateKeyOption": { + "description": "CreateKeyOption options when creating a key", + "type": "object", + "required": [ + "title", + "key" + ], + "properties": { + "key": { + "description": "An armored SSH key to add", + "type": "string", + "uniqueItems": true, + "x-go-name": "Key" + }, + "read_only": { + "description": "Describe if the key has only read access or read/write", + "type": "boolean", + "x-go-name": "ReadOnly" + }, + "title": { + "description": "Title of the key to add", + "type": "string", + "uniqueItems": true, + "x-go-name": "Title" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "CreateLabelOption": { + "description": "CreateLabelOption options for creating a label", + "type": "object", + "required": [ + "name", + "color" + ], + "properties": { + "color": { + "type": "string", + "x-go-name": "Color", + "example": "#00aabb" + }, + "description": { + "type": "string", + "x-go-name": "Description" + }, + "exclusive": { + "type": "boolean", + "x-go-name": "Exclusive", + "example": false + }, + "name": { + "type": "string", + "x-go-name": "Name" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "CreateMilestoneOption": { + "description": "CreateMilestoneOption options for creating a milestone", + "type": "object", + "properties": { + "description": { + "type": "string", + "x-go-name": "Description" + }, + "due_on": { + "type": "string", + "format": "date-time", + "x-go-name": "Deadline" + }, + "state": { + "type": "string", + "enum": [ + "open", + "closed" + ], + "x-go-name": "State" + }, + "title": { + "type": "string", + "x-go-name": "Title" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "CreateOAuth2ApplicationOptions": { + "description": "CreateOAuth2ApplicationOptions holds options to create an oauth2 application", + "type": "object", + "properties": { + "confidential_client": { + "type": "boolean", + "x-go-name": "ConfidentialClient" + }, + "name": { + "type": "string", + "x-go-name": "Name" + }, + "redirect_uris": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "RedirectURIs" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "CreateOrgOption": { + "description": "CreateOrgOption options for creating an organization", + "type": "object", + "required": [ + "username" + ], + "properties": { + "description": { + "type": "string", + "x-go-name": "Description" + }, + "full_name": { + "type": "string", + "x-go-name": "FullName" + }, + "location": { + "type": "string", + "x-go-name": "Location" + }, + "repo_admin_change_team_access": { + "type": "boolean", + "x-go-name": "RepoAdminChangeTeamAccess" + }, + "username": { + "type": "string", + "x-go-name": "UserName" + }, + "visibility": { + "description": "possible values are `public` (default), `limited` or `private`", + "type": "string", + "enum": [ + "public", + "limited", + "private" + ], + "x-go-name": "Visibility" + }, + "website": { + "type": "string", + "x-go-name": "Website" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "CreatePullRequestOption": { + "description": "CreatePullRequestOption options when creating a pull request", + "type": "object", + "properties": { + "assignee": { + "type": "string", + "x-go-name": "Assignee" + }, + "assignees": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "Assignees" + }, + "base": { + "type": "string", + "x-go-name": "Base" + }, + "body": { + "type": "string", + "x-go-name": "Body" + }, + "due_date": { + "type": "string", + "format": "date-time", + "x-go-name": "Deadline" + }, + "head": { + "type": "string", + "x-go-name": "Head" + }, + "labels": { + "type": "array", + "items": { + "type": "integer", + "format": "int64" + }, + "x-go-name": "Labels" + }, + "milestone": { + "type": "integer", + "format": "int64", + "x-go-name": "Milestone" + }, + "title": { + "type": "string", + "x-go-name": "Title" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "CreatePullReviewComment": { + "description": "CreatePullReviewComment represent a review comment for creation api", + "type": "object", + "properties": { + "body": { + "type": "string", + "x-go-name": "Body" + }, + "new_position": { + "description": "if comment to new file line or 0", + "type": "integer", + "format": "int64", + "x-go-name": "NewLineNum" + }, + "old_position": { + "description": "if comment to old file line or 0", + "type": "integer", + "format": "int64", + "x-go-name": "OldLineNum" + }, + "path": { + "description": "the tree path", + "type": "string", + "x-go-name": "Path" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "CreatePullReviewOptions": { + "description": "CreatePullReviewOptions are options to create a pull review", + "type": "object", + "properties": { + "body": { + "type": "string", + "x-go-name": "Body" + }, + "comments": { + "type": "array", + "items": { + "$ref": "#/definitions/CreatePullReviewComment" + }, + "x-go-name": "Comments" + }, + "commit_id": { + "type": "string", + "x-go-name": "CommitID" + }, + "event": { + "$ref": "#/definitions/ReviewStateType" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "CreatePushMirrorOption": { + "type": "object", + "title": "CreatePushMirrorOption represents need information to create a push mirror of a repository.", + "properties": { + "interval": { + "type": "string", + "x-go-name": "Interval" + }, + "remote_address": { + "type": "string", + "x-go-name": "RemoteAddress" + }, + "remote_password": { + "type": "string", + "x-go-name": "RemotePassword" + }, + "remote_username": { + "type": "string", + "x-go-name": "RemoteUsername" + }, + "sync_on_commit": { + "type": "boolean", + "x-go-name": "SyncOnCommit" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "CreateReleaseOption": { + "description": "CreateReleaseOption options when creating a release", + "type": "object", + "required": [ + "tag_name" + ], + "properties": { + "body": { + "type": "string", + "x-go-name": "Note" + }, + "draft": { + "type": "boolean", + "x-go-name": "IsDraft" + }, + "name": { + "type": "string", + "x-go-name": "Title" + }, + "prerelease": { + "type": "boolean", + "x-go-name": "IsPrerelease" + }, + "tag_name": { + "type": "string", + "x-go-name": "TagName" + }, + "target_commitish": { + "type": "string", + "x-go-name": "Target" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "CreateRepoOption": { + "description": "CreateRepoOption options when creating repository", + "type": "object", + "required": [ + "name" + ], + "properties": { + "auto_init": { + "description": "Whether the repository should be auto-initialized?", + "type": "boolean", + "x-go-name": "AutoInit" + }, + "default_branch": { + "description": "DefaultBranch of the repository (used when initializes and in template)", + "type": "string", + "x-go-name": "DefaultBranch" + }, + "description": { + "description": "Description of the repository to create", + "type": "string", + "x-go-name": "Description" + }, + "gitignores": { + "description": "Gitignores to use", + "type": "string", + "x-go-name": "Gitignores" + }, + "issue_labels": { + "description": "Label-Set to use", + "type": "string", + "x-go-name": "IssueLabels" + }, + "license": { + "description": "License to use", + "type": "string", + "x-go-name": "License" + }, + "name": { + "description": "Name of the repository to create", + "type": "string", + "uniqueItems": true, + "x-go-name": "Name" + }, + "private": { + "description": "Whether the repository is private", + "type": "boolean", + "x-go-name": "Private" + }, + "readme": { + "description": "Readme of the repository to create", + "type": "string", + "x-go-name": "Readme" + }, + "template": { + "description": "Whether the repository is template", + "type": "boolean", + "x-go-name": "Template" + }, + "trust_model": { + "description": "TrustModel of the repository", + "type": "string", + "enum": [ + "default", + "collaborator", + "committer", + "collaboratorcommitter" + ], + "x-go-name": "TrustModel" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "CreateStatusOption": { + "description": "CreateStatusOption holds the information needed to create a new CommitStatus for a Commit", + "type": "object", + "properties": { + "context": { + "type": "string", + "x-go-name": "Context" + }, + "description": { + "type": "string", + "x-go-name": "Description" + }, + "state": { + "$ref": "#/definitions/CommitStatusState" + }, + "target_url": { + "type": "string", + "x-go-name": "TargetURL" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "CreateTagOption": { + "description": "CreateTagOption options when creating a tag", + "type": "object", + "required": [ + "tag_name" + ], + "properties": { + "message": { + "type": "string", + "x-go-name": "Message" + }, + "tag_name": { + "type": "string", + "x-go-name": "TagName" + }, + "target": { + "type": "string", + "x-go-name": "Target" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "CreateTeamOption": { + "description": "CreateTeamOption options for creating a team", + "type": "object", + "required": [ + "name" + ], + "properties": { + "can_create_org_repo": { + "type": "boolean", + "x-go-name": "CanCreateOrgRepo" + }, + "description": { + "type": "string", + "x-go-name": "Description" + }, + "includes_all_repositories": { + "type": "boolean", + "x-go-name": "IncludesAllRepositories" + }, + "name": { + "type": "string", + "x-go-name": "Name" + }, + "permission": { + "type": "string", + "enum": [ + "read", + "write", + "admin" + ], + "x-go-name": "Permission" + }, + "units": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "Units", + "example": [ + "repo.code", + "repo.issues", + "repo.ext_issues", + "repo.wiki", + "repo.pulls", + "repo.releases", + "repo.projects", + "repo.ext_wiki" + ] + }, + "units_map": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "x-go-name": "UnitsMap", + "example": { + "repo.code": "read", + "repo.ext_issues": "none", + "repo.ext_wiki": "none", + "repo.issues": "write", + "repo.projects": "none", + "repo.pulls": "owner", + "repo.releases": "none", + "repo.wiki": "admin" + } + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "CreateUserOption": { + "description": "CreateUserOption create user options", + "type": "object", + "required": [ + "username", + "email", + "password" + ], + "properties": { + "created_at": { + "description": "For explicitly setting the user creation timestamp. Useful when users are\nmigrated from other systems. When omitted, the user's creation timestamp\nwill be set to \"now\".", + "type": "string", + "format": "date-time", + "x-go-name": "Created" + }, + "email": { + "type": "string", + "format": "email", + "x-go-name": "Email" + }, + "full_name": { + "type": "string", + "x-go-name": "FullName" + }, + "login_name": { + "type": "string", + "x-go-name": "LoginName" + }, + "must_change_password": { + "type": "boolean", + "x-go-name": "MustChangePassword" + }, + "password": { + "type": "string", + "x-go-name": "Password" + }, + "restricted": { + "type": "boolean", + "x-go-name": "Restricted" + }, + "send_notify": { + "type": "boolean", + "x-go-name": "SendNotify" + }, + "source_id": { + "type": "integer", + "format": "int64", + "x-go-name": "SourceID" + }, + "username": { + "type": "string", + "x-go-name": "Username" + }, + "visibility": { + "type": "string", + "x-go-name": "Visibility" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "CreateWikiPageOptions": { + "description": "CreateWikiPageOptions form for creating wiki", + "type": "object", + "properties": { + "content_base64": { + "description": "content must be base64 encoded", + "type": "string", + "x-go-name": "ContentBase64" + }, + "message": { + "description": "optional commit message summarizing the change", + "type": "string", + "x-go-name": "Message" + }, + "title": { + "description": "page title. leave empty to keep unchanged", + "type": "string", + "x-go-name": "Title" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "Cron": { + "description": "Cron represents a Cron task", + "type": "object", + "properties": { + "exec_times": { + "type": "integer", + "format": "int64", + "x-go-name": "ExecTimes" + }, + "name": { + "type": "string", + "x-go-name": "Name" + }, + "next": { + "type": "string", + "format": "date-time", + "x-go-name": "Next" + }, + "prev": { + "type": "string", + "format": "date-time", + "x-go-name": "Prev" + }, + "schedule": { + "type": "string", + "x-go-name": "Schedule" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "DeleteEmailOption": { + "description": "DeleteEmailOption options when deleting email addresses", + "type": "object", + "properties": { + "emails": { + "description": "email addresses to delete", + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "Emails" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "DeleteFileOptions": { + "description": "DeleteFileOptions options for deleting files (used for other File structs below)\nNote: `author` and `committer` are optional (if only one is given, it will be used for the other, otherwise the authenticated user will be used)", + "type": "object", + "required": [ + "sha" + ], + "properties": { + "author": { + "$ref": "#/definitions/Identity" + }, + "branch": { + "description": "branch (optional) to base this file from. if not given, the default branch is used", + "type": "string", + "x-go-name": "BranchName" + }, + "committer": { + "$ref": "#/definitions/Identity" + }, + "dates": { + "$ref": "#/definitions/CommitDateOptions" + }, + "message": { + "description": "message (optional) for the commit of this file. if not supplied, a default message will be used", + "type": "string", + "x-go-name": "Message" + }, + "new_branch": { + "description": "new_branch (optional) will make a new branch from `branch` before creating the file", + "type": "string", + "x-go-name": "NewBranchName" + }, + "sha": { + "description": "sha is the SHA for the file that already exists", + "type": "string", + "x-go-name": "SHA" + }, + "signoff": { + "description": "Add a Signed-off-by trailer by the committer at the end of the commit log message.", + "type": "boolean", + "x-go-name": "Signoff" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "DeployKey": { + "description": "DeployKey a deploy key", + "type": "object", + "properties": { + "created_at": { + "type": "string", + "format": "date-time", + "x-go-name": "Created" + }, + "fingerprint": { + "type": "string", + "x-go-name": "Fingerprint" + }, + "id": { + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "key": { + "type": "string", + "x-go-name": "Key" + }, + "key_id": { + "type": "integer", + "format": "int64", + "x-go-name": "KeyID" + }, + "read_only": { + "type": "boolean", + "x-go-name": "ReadOnly" + }, + "repository": { + "$ref": "#/definitions/Repository" + }, + "title": { + "type": "string", + "x-go-name": "Title" + }, + "url": { + "type": "string", + "x-go-name": "URL" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "DismissPullReviewOptions": { + "description": "DismissPullReviewOptions are options to dismiss a pull review", + "type": "object", + "properties": { + "message": { + "type": "string", + "x-go-name": "Message" + }, + "priors": { + "type": "boolean", + "x-go-name": "Priors" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "EditAttachmentOptions": { + "description": "EditAttachmentOptions options for editing attachments", + "type": "object", + "properties": { + "name": { + "type": "string", + "x-go-name": "Name" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "EditBranchProtectionOption": { + "description": "EditBranchProtectionOption options for editing a branch protection", + "type": "object", + "properties": { + "approvals_whitelist_teams": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "ApprovalsWhitelistTeams" + }, + "approvals_whitelist_username": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "ApprovalsWhitelistUsernames" + }, + "block_on_official_review_requests": { + "type": "boolean", + "x-go-name": "BlockOnOfficialReviewRequests" + }, + "block_on_outdated_branch": { + "type": "boolean", + "x-go-name": "BlockOnOutdatedBranch" + }, + "block_on_rejected_reviews": { + "type": "boolean", + "x-go-name": "BlockOnRejectedReviews" + }, + "dismiss_stale_approvals": { + "type": "boolean", + "x-go-name": "DismissStaleApprovals" + }, + "enable_approvals_whitelist": { + "type": "boolean", + "x-go-name": "EnableApprovalsWhitelist" + }, + "enable_merge_whitelist": { + "type": "boolean", + "x-go-name": "EnableMergeWhitelist" + }, + "enable_push": { + "type": "boolean", + "x-go-name": "EnablePush" + }, + "enable_push_whitelist": { + "type": "boolean", + "x-go-name": "EnablePushWhitelist" + }, + "enable_status_check": { + "type": "boolean", + "x-go-name": "EnableStatusCheck" + }, + "merge_whitelist_teams": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "MergeWhitelistTeams" + }, + "merge_whitelist_usernames": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "MergeWhitelistUsernames" + }, + "protected_file_patterns": { + "type": "string", + "x-go-name": "ProtectedFilePatterns" + }, + "push_whitelist_deploy_keys": { + "type": "boolean", + "x-go-name": "PushWhitelistDeployKeys" + }, + "push_whitelist_teams": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "PushWhitelistTeams" + }, + "push_whitelist_usernames": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "PushWhitelistUsernames" + }, + "require_signed_commits": { + "type": "boolean", + "x-go-name": "RequireSignedCommits" + }, + "required_approvals": { + "type": "integer", + "format": "int64", + "x-go-name": "RequiredApprovals" + }, + "status_check_contexts": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "StatusCheckContexts" + }, + "unprotected_file_patterns": { + "type": "string", + "x-go-name": "UnprotectedFilePatterns" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "EditDeadlineOption": { + "description": "EditDeadlineOption options for creating a deadline", + "type": "object", + "required": [ + "due_date" + ], + "properties": { + "due_date": { + "type": "string", + "format": "date-time", + "x-go-name": "Deadline" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "EditGitHookOption": { + "description": "EditGitHookOption options when modifying one Git hook", + "type": "object", + "properties": { + "content": { + "type": "string", + "x-go-name": "Content" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "EditHookOption": { + "description": "EditHookOption options when modify one hook", + "type": "object", + "properties": { + "active": { + "type": "boolean", + "x-go-name": "Active" + }, + "authorization_header": { + "type": "string", + "x-go-name": "AuthorizationHeader" + }, + "branch_filter": { + "type": "string", + "x-go-name": "BranchFilter" + }, + "config": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "x-go-name": "Config" + }, + "events": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "Events" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "EditIssueCommentOption": { + "description": "EditIssueCommentOption options for editing a comment", + "type": "object", + "required": [ + "body" + ], + "properties": { + "body": { + "type": "string", + "x-go-name": "Body" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "EditIssueOption": { + "description": "EditIssueOption options for editing an issue", + "type": "object", + "properties": { + "assignee": { + "description": "deprecated", + "type": "string", + "x-go-name": "Assignee" + }, + "assignees": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "Assignees" + }, + "body": { + "type": "string", + "x-go-name": "Body" + }, + "due_date": { + "type": "string", + "format": "date-time", + "x-go-name": "Deadline" + }, + "milestone": { + "type": "integer", + "format": "int64", + "x-go-name": "Milestone" + }, + "ref": { + "type": "string", + "x-go-name": "Ref" + }, + "state": { + "type": "string", + "x-go-name": "State" + }, + "title": { + "type": "string", + "x-go-name": "Title" + }, + "unset_due_date": { + "type": "boolean", + "x-go-name": "RemoveDeadline" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "EditLabelOption": { + "description": "EditLabelOption options for editing a label", + "type": "object", + "properties": { + "color": { + "type": "string", + "x-go-name": "Color", + "example": "#00aabb" + }, + "description": { + "type": "string", + "x-go-name": "Description" + }, + "exclusive": { + "type": "boolean", + "x-go-name": "Exclusive", + "example": false + }, + "name": { + "type": "string", + "x-go-name": "Name" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "EditMilestoneOption": { + "description": "EditMilestoneOption options for editing a milestone", + "type": "object", + "properties": { + "description": { + "type": "string", + "x-go-name": "Description" + }, + "due_on": { + "type": "string", + "format": "date-time", + "x-go-name": "Deadline" + }, + "state": { + "type": "string", + "x-go-name": "State" + }, + "title": { + "type": "string", + "x-go-name": "Title" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "EditOrgOption": { + "description": "EditOrgOption options for editing an organization", + "type": "object", + "properties": { + "description": { + "type": "string", + "x-go-name": "Description" + }, + "full_name": { + "type": "string", + "x-go-name": "FullName" + }, + "location": { + "type": "string", + "x-go-name": "Location" + }, + "repo_admin_change_team_access": { + "type": "boolean", + "x-go-name": "RepoAdminChangeTeamAccess" + }, + "visibility": { + "description": "possible values are `public`, `limited` or `private`", + "type": "string", + "enum": [ + "public", + "limited", + "private" + ], + "x-go-name": "Visibility" + }, + "website": { + "type": "string", + "x-go-name": "Website" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "EditPullRequestOption": { + "description": "EditPullRequestOption options when modify pull request", + "type": "object", + "properties": { + "allow_maintainer_edit": { + "type": "boolean", + "x-go-name": "AllowMaintainerEdit" + }, + "assignee": { + "type": "string", + "x-go-name": "Assignee" + }, + "assignees": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "Assignees" + }, + "base": { + "type": "string", + "x-go-name": "Base" + }, + "body": { + "type": "string", + "x-go-name": "Body" + }, + "due_date": { + "type": "string", + "format": "date-time", + "x-go-name": "Deadline" + }, + "labels": { + "type": "array", + "items": { + "type": "integer", + "format": "int64" + }, + "x-go-name": "Labels" + }, + "milestone": { + "type": "integer", + "format": "int64", + "x-go-name": "Milestone" + }, + "state": { + "type": "string", + "x-go-name": "State" + }, + "title": { + "type": "string", + "x-go-name": "Title" + }, + "unset_due_date": { + "type": "boolean", + "x-go-name": "RemoveDeadline" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "EditReactionOption": { + "description": "EditReactionOption contain the reaction type", + "type": "object", + "properties": { + "content": { + "type": "string", + "x-go-name": "Reaction" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "EditReleaseOption": { + "description": "EditReleaseOption options when editing a release", + "type": "object", + "properties": { + "body": { + "type": "string", + "x-go-name": "Note" + }, + "draft": { + "type": "boolean", + "x-go-name": "IsDraft" + }, + "name": { + "type": "string", + "x-go-name": "Title" + }, + "prerelease": { + "type": "boolean", + "x-go-name": "IsPrerelease" + }, + "tag_name": { + "type": "string", + "x-go-name": "TagName" + }, + "target_commitish": { + "type": "string", + "x-go-name": "Target" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "EditRepoOption": { + "description": "EditRepoOption options when editing a repository's properties", + "type": "object", + "properties": { + "allow_manual_merge": { + "description": "either `true` to allow mark pr as merged manually, or `false` to prevent it.", + "type": "boolean", + "x-go-name": "AllowManualMerge" + }, + "allow_merge_commits": { + "description": "either `true` to allow merging pull requests with a merge commit, or `false` to prevent merging pull requests with merge commits.", + "type": "boolean", + "x-go-name": "AllowMerge" + }, + "allow_rebase": { + "description": "either `true` to allow rebase-merging pull requests, or `false` to prevent rebase-merging.", + "type": "boolean", + "x-go-name": "AllowRebase" + }, + "allow_rebase_explicit": { + "description": "either `true` to allow rebase with explicit merge commits (--no-ff), or `false` to prevent rebase with explicit merge commits.", + "type": "boolean", + "x-go-name": "AllowRebaseMerge" + }, + "allow_rebase_update": { + "description": "either `true` to allow updating pull request branch by rebase, or `false` to prevent it.", + "type": "boolean", + "x-go-name": "AllowRebaseUpdate" + }, + "allow_squash_merge": { + "description": "either `true` to allow squash-merging pull requests, or `false` to prevent squash-merging.", + "type": "boolean", + "x-go-name": "AllowSquash" + }, + "archived": { + "description": "set to `true` to archive this repository.", + "type": "boolean", + "x-go-name": "Archived" + }, + "autodetect_manual_merge": { + "description": "either `true` to enable AutodetectManualMerge, or `false` to prevent it. Note: In some special cases, misjudgments can occur.", + "type": "boolean", + "x-go-name": "AutodetectManualMerge" + }, + "default_allow_maintainer_edit": { + "description": "set to `true` to allow edits from maintainers by default", + "type": "boolean", + "x-go-name": "DefaultAllowMaintainerEdit" + }, + "default_branch": { + "description": "sets the default branch for this repository.", + "type": "string", + "x-go-name": "DefaultBranch" + }, + "default_delete_branch_after_merge": { + "description": "set to `true` to delete pr branch after merge by default", + "type": "boolean", + "x-go-name": "DefaultDeleteBranchAfterMerge" + }, + "default_merge_style": { + "description": "set to a merge style to be used by this repository: \"merge\", \"rebase\", \"rebase-merge\", or \"squash\".", + "type": "string", + "x-go-name": "DefaultMergeStyle" + }, + "description": { + "description": "a short description of the repository.", + "type": "string", + "x-go-name": "Description" + }, + "enable_prune": { + "description": "enable prune - remove obsolete remote-tracking references", + "type": "boolean", + "x-go-name": "EnablePrune" + }, + "external_tracker": { + "$ref": "#/definitions/ExternalTracker" + }, + "external_wiki": { + "$ref": "#/definitions/ExternalWiki" + }, + "has_actions": { + "description": "either `true` to enable actions unit, or `false` to disable them.", + "type": "boolean", + "x-go-name": "HasActions" + }, + "has_issues": { + "description": "either `true` to enable issues for this repository or `false` to disable them.", + "type": "boolean", + "x-go-name": "HasIssues" + }, + "has_packages": { + "description": "either `true` to enable packages unit, or `false` to disable them.", + "type": "boolean", + "x-go-name": "HasPackages" + }, + "has_projects": { + "description": "either `true` to enable project unit, or `false` to disable them.", + "type": "boolean", + "x-go-name": "HasProjects" + }, + "has_pull_requests": { + "description": "either `true` to allow pull requests, or `false` to prevent pull request.", + "type": "boolean", + "x-go-name": "HasPullRequests" + }, + "has_releases": { + "description": "either `true` to enable releases unit, or `false` to disable them.", + "type": "boolean", + "x-go-name": "HasReleases" + }, + "has_wiki": { + "description": "either `true` to enable the wiki for this repository or `false` to disable it.", + "type": "boolean", + "x-go-name": "HasWiki" + }, + "ignore_whitespace_conflicts": { + "description": "either `true` to ignore whitespace for conflicts, or `false` to not ignore whitespace.", + "type": "boolean", + "x-go-name": "IgnoreWhitespaceConflicts" + }, + "internal_tracker": { + "$ref": "#/definitions/InternalTracker" + }, + "mirror_interval": { + "description": "set to a string like `8h30m0s` to set the mirror interval time", + "type": "string", + "x-go-name": "MirrorInterval" + }, + "name": { + "description": "name of the repository", + "type": "string", + "uniqueItems": true, + "x-go-name": "Name" + }, + "private": { + "description": "either `true` to make the repository private or `false` to make it public.\nNote: you will get a 422 error if the organization restricts changing repository visibility to organization\nowners and a non-owner tries to change the value of private.", + "type": "boolean", + "x-go-name": "Private" + }, + "template": { + "description": "either `true` to make this repository a template or `false` to make it a normal repository", + "type": "boolean", + "x-go-name": "Template" + }, + "website": { + "description": "a URL with more information about the repository.", + "type": "string", + "x-go-name": "Website" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "EditTeamOption": { + "description": "EditTeamOption options for editing a team", + "type": "object", + "required": [ + "name" + ], + "properties": { + "can_create_org_repo": { + "type": "boolean", + "x-go-name": "CanCreateOrgRepo" + }, + "description": { + "type": "string", + "x-go-name": "Description" + }, + "includes_all_repositories": { + "type": "boolean", + "x-go-name": "IncludesAllRepositories" + }, + "name": { + "type": "string", + "x-go-name": "Name" + }, + "permission": { + "type": "string", + "enum": [ + "read", + "write", + "admin" + ], + "x-go-name": "Permission" + }, + "units": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "Units", + "example": [ + "repo.code", + "repo.issues", + "repo.ext_issues", + "repo.wiki", + "repo.pulls", + "repo.releases", + "repo.projects", + "repo.ext_wiki" + ] + }, + "units_map": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "x-go-name": "UnitsMap", + "example": { + "repo.code": "read", + "repo.ext_issues": "none", + "repo.ext_wiki": "none", + "repo.issues": "write", + "repo.projects": "none", + "repo.pulls": "owner", + "repo.releases": "none", + "repo.wiki": "admin" + } + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "EditUserOption": { + "description": "EditUserOption edit user options", + "type": "object", + "required": [ + "source_id", + "login_name" + ], + "properties": { + "active": { + "type": "boolean", + "x-go-name": "Active" + }, + "admin": { + "type": "boolean", + "x-go-name": "Admin" + }, + "allow_create_organization": { + "type": "boolean", + "x-go-name": "AllowCreateOrganization" + }, + "allow_git_hook": { + "type": "boolean", + "x-go-name": "AllowGitHook" + }, + "allow_import_local": { + "type": "boolean", + "x-go-name": "AllowImportLocal" + }, + "description": { + "type": "string", + "x-go-name": "Description" + }, + "email": { + "type": "string", + "format": "email", + "x-go-name": "Email" + }, + "full_name": { + "type": "string", + "x-go-name": "FullName" + }, + "location": { + "type": "string", + "x-go-name": "Location" + }, + "login_name": { + "type": "string", + "x-go-name": "LoginName" + }, + "max_repo_creation": { + "type": "integer", + "format": "int64", + "x-go-name": "MaxRepoCreation" + }, + "must_change_password": { + "type": "boolean", + "x-go-name": "MustChangePassword" + }, + "password": { + "type": "string", + "x-go-name": "Password" + }, + "prohibit_login": { + "type": "boolean", + "x-go-name": "ProhibitLogin" + }, + "restricted": { + "type": "boolean", + "x-go-name": "Restricted" + }, + "source_id": { + "type": "integer", + "format": "int64", + "x-go-name": "SourceID" + }, + "visibility": { + "type": "string", + "x-go-name": "Visibility" + }, + "website": { + "type": "string", + "x-go-name": "Website" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "Email": { + "description": "Email an email address belonging to a user", + "type": "object", + "properties": { + "email": { + "type": "string", + "format": "email", + "x-go-name": "Email" + }, + "primary": { + "type": "boolean", + "x-go-name": "Primary" + }, + "user_id": { + "type": "integer", + "format": "int64", + "x-go-name": "UserID" + }, + "username": { + "type": "string", + "x-go-name": "UserName" + }, + "verified": { + "type": "boolean", + "x-go-name": "Verified" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "ExternalTracker": { + "description": "ExternalTracker represents settings for external tracker", + "type": "object", + "properties": { + "external_tracker_format": { + "description": "External Issue Tracker URL Format. Use the placeholders {user}, {repo} and {index} for the username, repository name and issue index.", + "type": "string", + "x-go-name": "ExternalTrackerFormat" + }, + "external_tracker_regexp_pattern": { + "description": "External Issue Tracker issue regular expression", + "type": "string", + "x-go-name": "ExternalTrackerRegexpPattern" + }, + "external_tracker_style": { + "description": "External Issue Tracker Number Format, either `numeric`, `alphanumeric`, or `regexp`", + "type": "string", + "x-go-name": "ExternalTrackerStyle" + }, + "external_tracker_url": { + "description": "URL of external issue tracker.", + "type": "string", + "x-go-name": "ExternalTrackerURL" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "ExternalWiki": { + "description": "ExternalWiki represents setting for external wiki", + "type": "object", + "properties": { + "external_wiki_url": { + "description": "URL of external wiki.", + "type": "string", + "x-go-name": "ExternalWikiURL" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "FileCommitResponse": { + "type": "object", + "title": "FileCommitResponse contains information generated from a Git commit for a repo's file.", + "properties": { + "author": { + "$ref": "#/definitions/CommitUser" + }, + "committer": { + "$ref": "#/definitions/CommitUser" + }, + "created": { + "type": "string", + "format": "date-time", + "x-go-name": "Created" + }, + "html_url": { + "type": "string", + "x-go-name": "HTMLURL" + }, + "message": { + "type": "string", + "x-go-name": "Message" + }, + "parents": { + "type": "array", + "items": { + "$ref": "#/definitions/CommitMeta" + }, + "x-go-name": "Parents" + }, + "sha": { + "type": "string", + "x-go-name": "SHA" + }, + "tree": { + "$ref": "#/definitions/CommitMeta" + }, + "url": { + "type": "string", + "x-go-name": "URL" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "FileDeleteResponse": { + "description": "FileDeleteResponse contains information about a repo's file that was deleted", + "type": "object", + "properties": { + "commit": { + "$ref": "#/definitions/FileCommitResponse" + }, + "content": { + "x-go-name": "Content" + }, + "verification": { + "$ref": "#/definitions/PayloadCommitVerification" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "FileLinksResponse": { + "description": "FileLinksResponse contains the links for a repo's file", + "type": "object", + "properties": { + "git": { + "type": "string", + "x-go-name": "GitURL" + }, + "html": { + "type": "string", + "x-go-name": "HTMLURL" + }, + "self": { + "type": "string", + "x-go-name": "Self" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "FileResponse": { + "description": "FileResponse contains information about a repo's file", + "type": "object", + "properties": { + "commit": { + "$ref": "#/definitions/FileCommitResponse" + }, + "content": { + "$ref": "#/definitions/ContentsResponse" + }, + "verification": { + "$ref": "#/definitions/PayloadCommitVerification" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "FilesResponse": { + "description": "FilesResponse contains information about multiple files from a repo", + "type": "object", + "properties": { + "commit": { + "$ref": "#/definitions/FileCommitResponse" + }, + "files": { + "type": "array", + "items": { + "$ref": "#/definitions/ContentsResponse" + }, + "x-go-name": "Files" + }, + "verification": { + "$ref": "#/definitions/PayloadCommitVerification" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "GPGKey": { + "description": "GPGKey a user GPG key to sign commit and tag in repository", + "type": "object", + "properties": { + "can_certify": { + "type": "boolean", + "x-go-name": "CanCertify" + }, + "can_encrypt_comms": { + "type": "boolean", + "x-go-name": "CanEncryptComms" + }, + "can_encrypt_storage": { + "type": "boolean", + "x-go-name": "CanEncryptStorage" + }, + "can_sign": { + "type": "boolean", + "x-go-name": "CanSign" + }, + "created_at": { + "type": "string", + "format": "date-time", + "x-go-name": "Created" + }, + "emails": { + "type": "array", + "items": { + "$ref": "#/definitions/GPGKeyEmail" + }, + "x-go-name": "Emails" + }, + "expires_at": { + "type": "string", + "format": "date-time", + "x-go-name": "Expires" + }, + "id": { + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "key_id": { + "type": "string", + "x-go-name": "KeyID" + }, + "primary_key_id": { + "type": "string", + "x-go-name": "PrimaryKeyID" + }, + "public_key": { + "type": "string", + "x-go-name": "PublicKey" + }, + "subkeys": { + "type": "array", + "items": { + "$ref": "#/definitions/GPGKey" + }, + "x-go-name": "SubsKey" + }, + "verified": { + "type": "boolean", + "x-go-name": "Verified" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "GPGKeyEmail": { + "description": "GPGKeyEmail an email attached to a GPGKey", + "type": "object", + "properties": { + "email": { + "type": "string", + "x-go-name": "Email" + }, + "verified": { + "type": "boolean", + "x-go-name": "Verified" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "GeneralAPISettings": { + "description": "GeneralAPISettings contains global api settings exposed by it", + "type": "object", + "properties": { + "default_git_trees_per_page": { + "type": "integer", + "format": "int64", + "x-go-name": "DefaultGitTreesPerPage" + }, + "default_max_blob_size": { + "type": "integer", + "format": "int64", + "x-go-name": "DefaultMaxBlobSize" + }, + "default_paging_num": { + "type": "integer", + "format": "int64", + "x-go-name": "DefaultPagingNum" + }, + "max_response_items": { + "type": "integer", + "format": "int64", + "x-go-name": "MaxResponseItems" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "GeneralAttachmentSettings": { + "description": "GeneralAttachmentSettings contains global Attachment settings exposed by API", + "type": "object", + "properties": { + "allowed_types": { + "type": "string", + "x-go-name": "AllowedTypes" + }, + "enabled": { + "type": "boolean", + "x-go-name": "Enabled" + }, + "max_files": { + "type": "integer", + "format": "int64", + "x-go-name": "MaxFiles" + }, + "max_size": { + "type": "integer", + "format": "int64", + "x-go-name": "MaxSize" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "GeneralRepoSettings": { + "description": "GeneralRepoSettings contains global repository settings exposed by API", + "type": "object", + "properties": { + "http_git_disabled": { + "type": "boolean", + "x-go-name": "HTTPGitDisabled" + }, + "lfs_disabled": { + "type": "boolean", + "x-go-name": "LFSDisabled" + }, + "migrations_disabled": { + "type": "boolean", + "x-go-name": "MigrationsDisabled" + }, + "mirrors_disabled": { + "type": "boolean", + "x-go-name": "MirrorsDisabled" + }, + "stars_disabled": { + "type": "boolean", + "x-go-name": "StarsDisabled" + }, + "time_tracking_disabled": { + "type": "boolean", + "x-go-name": "TimeTrackingDisabled" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "GeneralUISettings": { + "description": "GeneralUISettings contains global ui settings exposed by API", + "type": "object", + "properties": { + "allowed_reactions": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "AllowedReactions" + }, + "custom_emojis": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "CustomEmojis" + }, + "default_theme": { + "type": "string", + "x-go-name": "DefaultTheme" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "GenerateRepoOption": { + "description": "GenerateRepoOption options when creating repository using a template", + "type": "object", + "required": [ + "owner", + "name" + ], + "properties": { + "avatar": { + "description": "include avatar of the template repo", + "type": "boolean", + "x-go-name": "Avatar" + }, + "default_branch": { + "description": "Default branch of the new repository", + "type": "string", + "x-go-name": "DefaultBranch" + }, + "description": { + "description": "Description of the repository to create", + "type": "string", + "x-go-name": "Description" + }, + "git_content": { + "description": "include git content of default branch in template repo", + "type": "boolean", + "x-go-name": "GitContent" + }, + "git_hooks": { + "description": "include git hooks in template repo", + "type": "boolean", + "x-go-name": "GitHooks" + }, + "labels": { + "description": "include labels in template repo", + "type": "boolean", + "x-go-name": "Labels" + }, + "name": { + "description": "Name of the repository to create", + "type": "string", + "uniqueItems": true, + "x-go-name": "Name" + }, + "owner": { + "description": "The organization or person who will own the new repository", + "type": "string", + "x-go-name": "Owner" + }, + "private": { + "description": "Whether the repository is private", + "type": "boolean", + "x-go-name": "Private" + }, + "topics": { + "description": "include topics in template repo", + "type": "boolean", + "x-go-name": "Topics" + }, + "webhooks": { + "description": "include webhooks in template repo", + "type": "boolean", + "x-go-name": "Webhooks" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "GitBlobResponse": { + "description": "GitBlobResponse represents a git blob", + "type": "object", + "properties": { + "content": { + "type": "string", + "x-go-name": "Content" + }, + "encoding": { + "type": "string", + "x-go-name": "Encoding" + }, + "sha": { + "type": "string", + "x-go-name": "SHA" + }, + "size": { + "type": "integer", + "format": "int64", + "x-go-name": "Size" + }, + "url": { + "type": "string", + "x-go-name": "URL" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "GitEntry": { + "description": "GitEntry represents a git tree", + "type": "object", + "properties": { + "mode": { + "type": "string", + "x-go-name": "Mode" + }, + "path": { + "type": "string", + "x-go-name": "Path" + }, + "sha": { + "type": "string", + "x-go-name": "SHA" + }, + "size": { + "type": "integer", + "format": "int64", + "x-go-name": "Size" + }, + "type": { + "type": "string", + "x-go-name": "Type" + }, + "url": { + "type": "string", + "x-go-name": "URL" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "GitHook": { + "description": "GitHook represents a Git repository hook", + "type": "object", + "properties": { + "content": { + "type": "string", + "x-go-name": "Content" + }, + "is_active": { + "type": "boolean", + "x-go-name": "IsActive" + }, + "name": { + "type": "string", + "x-go-name": "Name" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "GitObject": { + "type": "object", + "title": "GitObject represents a Git object.", + "properties": { + "sha": { + "type": "string", + "x-go-name": "SHA" + }, + "type": { + "type": "string", + "x-go-name": "Type" + }, + "url": { + "type": "string", + "x-go-name": "URL" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "GitTreeResponse": { + "description": "GitTreeResponse returns a git tree", + "type": "object", + "properties": { + "page": { + "type": "integer", + "format": "int64", + "x-go-name": "Page" + }, + "sha": { + "type": "string", + "x-go-name": "SHA" + }, + "total_count": { + "type": "integer", + "format": "int64", + "x-go-name": "TotalCount" + }, + "tree": { + "type": "array", + "items": { + "$ref": "#/definitions/GitEntry" + }, + "x-go-name": "Entries" + }, + "truncated": { + "type": "boolean", + "x-go-name": "Truncated" + }, + "url": { + "type": "string", + "x-go-name": "URL" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "GitignoreTemplateInfo": { + "description": "GitignoreTemplateInfo name and text of a gitignore template", + "type": "object", + "properties": { + "name": { + "type": "string", + "x-go-name": "Name" + }, + "source": { + "type": "string", + "x-go-name": "Source" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "Hook": { + "description": "Hook a hook is a web hook when one repository changed", + "type": "object", + "properties": { + "active": { + "type": "boolean", + "x-go-name": "Active" + }, + "authorization_header": { + "type": "string", + "x-go-name": "AuthorizationHeader" + }, + "config": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "x-go-name": "Config" + }, + "created_at": { + "type": "string", + "format": "date-time", + "x-go-name": "Created" + }, + "events": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "Events" + }, + "id": { + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "type": { + "type": "string", + "x-go-name": "Type" + }, + "updated_at": { + "type": "string", + "format": "date-time", + "x-go-name": "Updated" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "Identity": { + "description": "Identity for a person's identity like an author or committer", + "type": "object", + "properties": { + "email": { + "type": "string", + "format": "email", + "x-go-name": "Email" + }, + "name": { + "type": "string", + "x-go-name": "Name" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "InternalTracker": { + "description": "InternalTracker represents settings for internal tracker", + "type": "object", + "properties": { + "allow_only_contributors_to_track_time": { + "description": "Let only contributors track time (Built-in issue tracker)", + "type": "boolean", + "x-go-name": "AllowOnlyContributorsToTrackTime" + }, + "enable_issue_dependencies": { + "description": "Enable dependencies for issues and pull requests (Built-in issue tracker)", + "type": "boolean", + "x-go-name": "EnableIssueDependencies" + }, + "enable_time_tracker": { + "description": "Enable time tracking (Built-in issue tracker)", + "type": "boolean", + "x-go-name": "EnableTimeTracker" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "Issue": { + "description": "Issue represents an issue in a repository", + "type": "object", + "properties": { + "assets": { + "type": "array", + "items": { + "$ref": "#/definitions/Attachment" + }, + "x-go-name": "Attachments" + }, + "assignee": { + "$ref": "#/definitions/User" + }, + "assignees": { + "type": "array", + "items": { + "$ref": "#/definitions/User" + }, + "x-go-name": "Assignees" + }, + "body": { + "type": "string", + "x-go-name": "Body" + }, + "closed_at": { + "type": "string", + "format": "date-time", + "x-go-name": "Closed" + }, + "comments": { + "type": "integer", + "format": "int64", + "x-go-name": "Comments" + }, + "created_at": { + "type": "string", + "format": "date-time", + "x-go-name": "Created" + }, + "due_date": { + "type": "string", + "format": "date-time", + "x-go-name": "Deadline" + }, + "html_url": { + "type": "string", + "x-go-name": "HTMLURL" + }, + "id": { + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "is_locked": { + "type": "boolean", + "x-go-name": "IsLocked" + }, + "labels": { + "type": "array", + "items": { + "$ref": "#/definitions/Label" + }, + "x-go-name": "Labels" + }, + "milestone": { + "$ref": "#/definitions/Milestone" + }, + "number": { + "type": "integer", + "format": "int64", + "x-go-name": "Index" + }, + "original_author": { + "type": "string", + "x-go-name": "OriginalAuthor" + }, + "original_author_id": { + "type": "integer", + "format": "int64", + "x-go-name": "OriginalAuthorID" + }, + "pin_order": { + "type": "integer", + "format": "int64", + "x-go-name": "PinOrder" + }, + "pull_request": { + "$ref": "#/definitions/PullRequestMeta" + }, + "ref": { + "type": "string", + "x-go-name": "Ref" + }, + "repository": { + "$ref": "#/definitions/RepositoryMeta" + }, + "state": { + "$ref": "#/definitions/StateType" + }, + "title": { + "type": "string", + "x-go-name": "Title" + }, + "updated_at": { + "type": "string", + "format": "date-time", + "x-go-name": "Updated" + }, + "url": { + "type": "string", + "x-go-name": "URL" + }, + "user": { + "$ref": "#/definitions/User" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "IssueConfig": { + "type": "object", + "properties": { + "blank_issues_enabled": { + "type": "boolean", + "x-go-name": "BlankIssuesEnabled" + }, + "contact_links": { + "type": "array", + "items": { + "$ref": "#/definitions/IssueConfigContactLink" + }, + "x-go-name": "ContactLinks" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "IssueConfigContactLink": { + "type": "object", + "properties": { + "about": { + "type": "string", + "x-go-name": "About" + }, + "name": { + "type": "string", + "x-go-name": "Name" + }, + "url": { + "type": "string", + "x-go-name": "URL" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "IssueConfigValidation": { + "type": "object", + "properties": { + "message": { + "type": "string", + "x-go-name": "Message" + }, + "valid": { + "type": "boolean", + "x-go-name": "Valid" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "IssueDeadline": { + "description": "IssueDeadline represents an issue deadline", + "type": "object", + "properties": { + "due_date": { + "type": "string", + "format": "date-time", + "x-go-name": "Deadline" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "IssueFormField": { + "description": "IssueFormField represents a form field", + "type": "object", + "properties": { + "attributes": { + "type": "object", + "additionalProperties": {}, + "x-go-name": "Attributes" + }, + "id": { + "type": "string", + "x-go-name": "ID" + }, + "type": { + "$ref": "#/definitions/IssueFormFieldType" + }, + "validations": { + "type": "object", + "additionalProperties": {}, + "x-go-name": "Validations" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "IssueFormFieldType": { + "type": "string", + "title": "IssueFormFieldType defines issue form field type, can be \"markdown\", \"textarea\", \"input\", \"dropdown\" or \"checkboxes\"", + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "IssueLabelsOption": { + "description": "IssueLabelsOption a collection of labels", + "type": "object", + "properties": { + "labels": { + "description": "list of label IDs", + "type": "array", + "items": { + "type": "integer", + "format": "int64" + }, + "x-go-name": "Labels" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "IssueMeta": { + "description": "IssueMeta basic issue information", + "type": "object", + "properties": { + "index": { + "type": "integer", + "format": "int64", + "x-go-name": "Index" + }, + "owner": { + "type": "string", + "x-go-name": "Owner" + }, + "repo": { + "type": "string", + "x-go-name": "Name" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "IssueTemplate": { + "description": "IssueTemplate represents an issue template for a repository", + "type": "object", + "properties": { + "about": { + "type": "string", + "x-go-name": "About" + }, + "body": { + "type": "array", + "items": { + "$ref": "#/definitions/IssueFormField" + }, + "x-go-name": "Fields" + }, + "content": { + "type": "string", + "x-go-name": "Content" + }, + "file_name": { + "type": "string", + "x-go-name": "FileName" + }, + "labels": { + "$ref": "#/definitions/IssueTemplateLabels" + }, + "name": { + "type": "string", + "x-go-name": "Name" + }, + "ref": { + "type": "string", + "x-go-name": "Ref" + }, + "title": { + "type": "string", + "x-go-name": "Title" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "IssueTemplateLabels": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "Label": { + "description": "Label a label to an issue or a pr", + "type": "object", + "properties": { + "color": { + "type": "string", + "x-go-name": "Color", + "example": "00aabb" + }, + "description": { + "type": "string", + "x-go-name": "Description" + }, + "exclusive": { + "type": "boolean", + "x-go-name": "Exclusive", + "example": false + }, + "id": { + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "name": { + "type": "string", + "x-go-name": "Name" + }, + "url": { + "type": "string", + "x-go-name": "URL" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "LabelTemplate": { + "description": "LabelTemplate info of a Label template", + "type": "object", + "properties": { + "color": { + "type": "string", + "x-go-name": "Color", + "example": "00aabb" + }, + "description": { + "type": "string", + "x-go-name": "Description" + }, + "exclusive": { + "type": "boolean", + "x-go-name": "Exclusive", + "example": false + }, + "name": { + "type": "string", + "x-go-name": "Name" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "LicenseTemplateInfo": { + "description": "LicensesInfo contains information about a License", + "type": "object", + "properties": { + "body": { + "type": "string", + "x-go-name": "Body" + }, + "implementation": { + "type": "string", + "x-go-name": "Implementation" + }, + "key": { + "type": "string", + "x-go-name": "Key" + }, + "name": { + "type": "string", + "x-go-name": "Name" + }, + "url": { + "type": "string", + "x-go-name": "URL" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "LicensesTemplateListEntry": { + "description": "LicensesListEntry is used for the API", + "type": "object", + "properties": { + "key": { + "type": "string", + "x-go-name": "Key" + }, + "name": { + "type": "string", + "x-go-name": "Name" + }, + "url": { + "type": "string", + "x-go-name": "URL" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "MarkdownOption": { + "description": "MarkdownOption markdown options", + "type": "object", + "properties": { + "Context": { + "description": "Context to render\n\nin: body", + "type": "string" + }, + "Mode": { + "description": "Mode to render (comment, gfm, markdown)\n\nin: body", + "type": "string" + }, + "Text": { + "description": "Text markdown to render\n\nin: body", + "type": "string" + }, + "Wiki": { + "description": "Is it a wiki page ?\n\nin: body", + "type": "boolean" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "MarkupOption": { + "description": "MarkupOption markup options", + "type": "object", + "properties": { + "Context": { + "description": "Context to render\n\nin: body", + "type": "string" + }, + "FilePath": { + "description": "File path for detecting extension in file mode\n\nin: body", + "type": "string" + }, + "Mode": { + "description": "Mode to render (comment, gfm, markdown, file)\n\nin: body", + "type": "string" + }, + "Text": { + "description": "Text markup to render\n\nin: body", + "type": "string" + }, + "Wiki": { + "description": "Is it a wiki page ?\n\nin: body", + "type": "boolean" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "MergePullRequestOption": { + "description": "MergePullRequestForm form for merging Pull Request", + "type": "object", + "required": [ + "Do" + ], + "properties": { + "Do": { + "type": "string", + "enum": [ + "merge", + "rebase", + "rebase-merge", + "squash", + "manually-merged" + ] + }, + "MergeCommitID": { + "type": "string" + }, + "MergeMessageField": { + "type": "string" + }, + "MergeTitleField": { + "type": "string" + }, + "delete_branch_after_merge": { + "type": "boolean", + "x-go-name": "DeleteBranchAfterMerge" + }, + "force_merge": { + "type": "boolean", + "x-go-name": "ForceMerge" + }, + "head_commit_id": { + "type": "string", + "x-go-name": "HeadCommitID" + }, + "merge_when_checks_succeed": { + "type": "boolean", + "x-go-name": "MergeWhenChecksSucceed" + } + }, + "x-go-name": "MergePullRequestForm", + "x-go-package": "code.gitea.io/gitea/services/forms" + }, + "MigrateRepoOptions": { + "description": "MigrateRepoOptions options for migrating repository's\nthis is used to interact with api v1", + "type": "object", + "required": [ + "clone_addr", + "repo_name" + ], + "properties": { + "auth_password": { + "type": "string", + "x-go-name": "AuthPassword" + }, + "auth_token": { + "type": "string", + "x-go-name": "AuthToken" + }, + "auth_username": { + "type": "string", + "x-go-name": "AuthUsername" + }, + "clone_addr": { + "type": "string", + "x-go-name": "CloneAddr" + }, + "description": { + "type": "string", + "x-go-name": "Description" + }, + "issues": { + "type": "boolean", + "x-go-name": "Issues" + }, + "labels": { + "type": "boolean", + "x-go-name": "Labels" + }, + "lfs": { + "type": "boolean", + "x-go-name": "LFS" + }, + "lfs_endpoint": { + "type": "string", + "x-go-name": "LFSEndpoint" + }, + "milestones": { + "type": "boolean", + "x-go-name": "Milestones" + }, + "mirror": { + "type": "boolean", + "x-go-name": "Mirror" + }, + "mirror_interval": { + "type": "string", + "x-go-name": "MirrorInterval" + }, + "private": { + "type": "boolean", + "x-go-name": "Private" + }, + "pull_requests": { + "type": "boolean", + "x-go-name": "PullRequests" + }, + "releases": { + "type": "boolean", + "x-go-name": "Releases" + }, + "repo_name": { + "type": "string", + "x-go-name": "RepoName" + }, + "repo_owner": { + "description": "Name of User or Organisation who will own Repo after migration", + "type": "string", + "x-go-name": "RepoOwner" + }, + "service": { + "type": "string", + "enum": [ + "git", + "github", + "gitea", + "gitlab" + ], + "x-go-name": "Service" + }, + "uid": { + "description": "deprecated (only for backwards compatibility)", + "type": "integer", + "format": "int64", + "x-go-name": "RepoOwnerID" + }, + "wiki": { + "type": "boolean", + "x-go-name": "Wiki" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "Milestone": { + "description": "Milestone milestone is a collection of issues on one repository", + "type": "object", + "properties": { + "closed_at": { + "type": "string", + "format": "date-time", + "x-go-name": "Closed" + }, + "closed_issues": { + "type": "integer", + "format": "int64", + "x-go-name": "ClosedIssues" + }, + "created_at": { + "type": "string", + "format": "date-time", + "x-go-name": "Created" + }, + "description": { + "type": "string", + "x-go-name": "Description" + }, + "due_on": { + "type": "string", + "format": "date-time", + "x-go-name": "Deadline" + }, + "id": { + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "open_issues": { + "type": "integer", + "format": "int64", + "x-go-name": "OpenIssues" + }, + "state": { + "$ref": "#/definitions/StateType" + }, + "title": { + "type": "string", + "x-go-name": "Title" + }, + "updated_at": { + "type": "string", + "format": "date-time", + "x-go-name": "Updated" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "NewIssuePinsAllowed": { + "description": "NewIssuePinsAllowed represents an API response that says if new Issue Pins are allowed", + "type": "object", + "properties": { + "issues": { + "type": "boolean", + "x-go-name": "Issues" + }, + "pull_requests": { + "type": "boolean", + "x-go-name": "PullRequests" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "NodeInfo": { + "description": "NodeInfo contains standardized way of exposing metadata about a server running one of the distributed social networks", + "type": "object", + "properties": { + "metadata": { + "type": "object", + "x-go-name": "Metadata" + }, + "openRegistrations": { + "type": "boolean", + "x-go-name": "OpenRegistrations" + }, + "protocols": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "Protocols" + }, + "services": { + "$ref": "#/definitions/NodeInfoServices" + }, + "software": { + "$ref": "#/definitions/NodeInfoSoftware" + }, + "usage": { + "$ref": "#/definitions/NodeInfoUsage" + }, + "version": { + "type": "string", + "x-go-name": "Version" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "NodeInfoServices": { + "description": "NodeInfoServices contains the third party sites this server can connect to via their application API", + "type": "object", + "properties": { + "inbound": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "Inbound" + }, + "outbound": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "Outbound" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "NodeInfoSoftware": { + "description": "NodeInfoSoftware contains Metadata about server software in use", + "type": "object", + "properties": { + "homepage": { + "type": "string", + "x-go-name": "Homepage" + }, + "name": { + "type": "string", + "x-go-name": "Name" + }, + "repository": { + "type": "string", + "x-go-name": "Repository" + }, + "version": { + "type": "string", + "x-go-name": "Version" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "NodeInfoUsage": { + "description": "NodeInfoUsage contains usage statistics for this server", + "type": "object", + "properties": { + "localComments": { + "type": "integer", + "format": "int64", + "x-go-name": "LocalComments" + }, + "localPosts": { + "type": "integer", + "format": "int64", + "x-go-name": "LocalPosts" + }, + "users": { + "$ref": "#/definitions/NodeInfoUsageUsers" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "NodeInfoUsageUsers": { + "description": "NodeInfoUsageUsers contains statistics about the users of this server", + "type": "object", + "properties": { + "activeHalfyear": { + "type": "integer", + "format": "int64", + "x-go-name": "ActiveHalfyear" + }, + "activeMonth": { + "type": "integer", + "format": "int64", + "x-go-name": "ActiveMonth" + }, + "total": { + "type": "integer", + "format": "int64", + "x-go-name": "Total" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "Note": { + "description": "Note contains information related to a git note", + "type": "object", + "properties": { + "commit": { + "$ref": "#/definitions/Commit" + }, + "message": { + "type": "string", + "x-go-name": "Message" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "NotificationCount": { + "description": "NotificationCount number of unread notifications", + "type": "object", + "properties": { + "new": { + "type": "integer", + "format": "int64", + "x-go-name": "New" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "NotificationSubject": { + "description": "NotificationSubject contains the notification subject (Issue/Pull/Commit)", + "type": "object", + "properties": { + "html_url": { + "type": "string", + "x-go-name": "HTMLURL" + }, + "latest_comment_html_url": { + "type": "string", + "x-go-name": "LatestCommentHTMLURL" + }, + "latest_comment_url": { + "type": "string", + "x-go-name": "LatestCommentURL" + }, + "state": { + "$ref": "#/definitions/StateType" + }, + "title": { + "type": "string", + "x-go-name": "Title" + }, + "type": { + "$ref": "#/definitions/NotifySubjectType" + }, + "url": { + "type": "string", + "x-go-name": "URL" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "NotificationThread": { + "description": "NotificationThread expose Notification on API", + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "pinned": { + "type": "boolean", + "x-go-name": "Pinned" + }, + "repository": { + "$ref": "#/definitions/Repository" + }, + "subject": { + "$ref": "#/definitions/NotificationSubject" + }, + "unread": { + "type": "boolean", + "x-go-name": "Unread" + }, + "updated_at": { + "type": "string", + "format": "date-time", + "x-go-name": "UpdatedAt" + }, + "url": { + "type": "string", + "x-go-name": "URL" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "NotifySubjectType": { + "description": "NotifySubjectType represent type of notification subject", + "type": "string", + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "OAuth2Application": { + "type": "object", + "title": "OAuth2Application represents an OAuth2 application.", + "properties": { + "client_id": { + "type": "string", + "x-go-name": "ClientID" + }, + "client_secret": { + "type": "string", + "x-go-name": "ClientSecret" + }, + "confidential_client": { + "type": "boolean", + "x-go-name": "ConfidentialClient" + }, + "created": { + "type": "string", + "format": "date-time", + "x-go-name": "Created" + }, + "id": { + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "name": { + "type": "string", + "x-go-name": "Name" + }, + "redirect_uris": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "RedirectURIs" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "Organization": { + "description": "Organization represents an organization", + "type": "object", + "properties": { + "avatar_url": { + "type": "string", + "x-go-name": "AvatarURL" + }, + "description": { + "type": "string", + "x-go-name": "Description" + }, + "full_name": { + "type": "string", + "x-go-name": "FullName" + }, + "id": { + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "location": { + "type": "string", + "x-go-name": "Location" + }, + "name": { + "type": "string", + "x-go-name": "Name" + }, + "repo_admin_change_team_access": { + "type": "boolean", + "x-go-name": "RepoAdminChangeTeamAccess" + }, + "username": { + "description": "deprecated", + "type": "string", + "x-go-name": "UserName" + }, + "visibility": { + "type": "string", + "x-go-name": "Visibility" + }, + "website": { + "type": "string", + "x-go-name": "Website" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "OrganizationPermissions": { + "description": "OrganizationPermissions list different users permissions on an organization", + "type": "object", + "properties": { + "can_create_repository": { + "type": "boolean", + "x-go-name": "CanCreateRepository" + }, + "can_read": { + "type": "boolean", + "x-go-name": "CanRead" + }, + "can_write": { + "type": "boolean", + "x-go-name": "CanWrite" + }, + "is_admin": { + "type": "boolean", + "x-go-name": "IsAdmin" + }, + "is_owner": { + "type": "boolean", + "x-go-name": "IsOwner" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "PRBranchInfo": { + "description": "PRBranchInfo information about a branch", + "type": "object", + "properties": { + "label": { + "type": "string", + "x-go-name": "Name" + }, + "ref": { + "type": "string", + "x-go-name": "Ref" + }, + "repo": { + "$ref": "#/definitions/Repository" + }, + "repo_id": { + "type": "integer", + "format": "int64", + "x-go-name": "RepoID" + }, + "sha": { + "type": "string", + "x-go-name": "Sha" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "Package": { + "description": "Package represents a package", + "type": "object", + "properties": { + "created_at": { + "type": "string", + "format": "date-time", + "x-go-name": "CreatedAt" + }, + "creator": { + "$ref": "#/definitions/User" + }, + "id": { + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "name": { + "type": "string", + "x-go-name": "Name" + }, + "owner": { + "$ref": "#/definitions/User" + }, + "repository": { + "$ref": "#/definitions/Repository" + }, + "type": { + "type": "string", + "x-go-name": "Type" + }, + "version": { + "type": "string", + "x-go-name": "Version" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "PackageFile": { + "description": "PackageFile represents a package file", + "type": "object", + "properties": { + "Size": { + "type": "integer", + "format": "int64" + }, + "id": { + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "md5": { + "type": "string", + "x-go-name": "HashMD5" + }, + "name": { + "type": "string", + "x-go-name": "Name" + }, + "sha1": { + "type": "string", + "x-go-name": "HashSHA1" + }, + "sha256": { + "type": "string", + "x-go-name": "HashSHA256" + }, + "sha512": { + "type": "string", + "x-go-name": "HashSHA512" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "PayloadCommit": { + "description": "PayloadCommit represents a commit", + "type": "object", + "properties": { + "added": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "Added" + }, + "author": { + "$ref": "#/definitions/PayloadUser" + }, + "committer": { + "$ref": "#/definitions/PayloadUser" + }, + "id": { + "description": "sha1 hash of the commit", + "type": "string", + "x-go-name": "ID" + }, + "message": { + "type": "string", + "x-go-name": "Message" + }, + "modified": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "Modified" + }, + "removed": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "Removed" + }, + "timestamp": { + "type": "string", + "format": "date-time", + "x-go-name": "Timestamp" + }, + "url": { + "type": "string", + "x-go-name": "URL" + }, + "verification": { + "$ref": "#/definitions/PayloadCommitVerification" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "PayloadCommitVerification": { + "description": "PayloadCommitVerification represents the GPG verification of a commit", + "type": "object", + "properties": { + "payload": { + "type": "string", + "x-go-name": "Payload" + }, + "reason": { + "type": "string", + "x-go-name": "Reason" + }, + "signature": { + "type": "string", + "x-go-name": "Signature" + }, + "signer": { + "$ref": "#/definitions/PayloadUser" + }, + "verified": { + "type": "boolean", + "x-go-name": "Verified" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "PayloadUser": { + "description": "PayloadUser represents the author or committer of a commit", + "type": "object", + "properties": { + "email": { + "type": "string", + "format": "email", + "x-go-name": "Email" + }, + "name": { + "description": "Full name of the commit author", + "type": "string", + "x-go-name": "Name" + }, + "username": { + "type": "string", + "x-go-name": "UserName" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "Permission": { + "description": "Permission represents a set of permissions", + "type": "object", + "properties": { + "admin": { + "type": "boolean", + "x-go-name": "Admin" + }, + "pull": { + "type": "boolean", + "x-go-name": "Pull" + }, + "push": { + "type": "boolean", + "x-go-name": "Push" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "PublicKey": { + "description": "PublicKey publickey is a user key to push code to repository", + "type": "object", + "properties": { + "created_at": { + "type": "string", + "format": "date-time", + "x-go-name": "Created" + }, + "fingerprint": { + "type": "string", + "x-go-name": "Fingerprint" + }, + "id": { + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "key": { + "type": "string", + "x-go-name": "Key" + }, + "key_type": { + "type": "string", + "x-go-name": "KeyType" + }, + "read_only": { + "type": "boolean", + "x-go-name": "ReadOnly" + }, + "title": { + "type": "string", + "x-go-name": "Title" + }, + "url": { + "type": "string", + "x-go-name": "URL" + }, + "user": { + "$ref": "#/definitions/User" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "PullRequest": { + "description": "PullRequest represents a pull request", + "type": "object", + "properties": { + "allow_maintainer_edit": { + "type": "boolean", + "x-go-name": "AllowMaintainerEdit" + }, + "assignee": { + "$ref": "#/definitions/User" + }, + "assignees": { + "type": "array", + "items": { + "$ref": "#/definitions/User" + }, + "x-go-name": "Assignees" + }, + "base": { + "$ref": "#/definitions/PRBranchInfo" + }, + "body": { + "type": "string", + "x-go-name": "Body" + }, + "closed_at": { + "type": "string", + "format": "date-time", + "x-go-name": "Closed" + }, + "comments": { + "type": "integer", + "format": "int64", + "x-go-name": "Comments" + }, + "created_at": { + "type": "string", + "format": "date-time", + "x-go-name": "Created" + }, + "diff_url": { + "type": "string", + "x-go-name": "DiffURL" + }, + "due_date": { + "type": "string", + "format": "date-time", + "x-go-name": "Deadline" + }, + "head": { + "$ref": "#/definitions/PRBranchInfo" + }, + "html_url": { + "type": "string", + "x-go-name": "HTMLURL" + }, + "id": { + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "is_locked": { + "type": "boolean", + "x-go-name": "IsLocked" + }, + "labels": { + "type": "array", + "items": { + "$ref": "#/definitions/Label" + }, + "x-go-name": "Labels" + }, + "merge_base": { + "type": "string", + "x-go-name": "MergeBase" + }, + "merge_commit_sha": { + "type": "string", + "x-go-name": "MergedCommitID" + }, + "mergeable": { + "type": "boolean", + "x-go-name": "Mergeable" + }, + "merged": { + "type": "boolean", + "x-go-name": "HasMerged" + }, + "merged_at": { + "type": "string", + "format": "date-time", + "x-go-name": "Merged" + }, + "merged_by": { + "$ref": "#/definitions/User" + }, + "milestone": { + "$ref": "#/definitions/Milestone" + }, + "number": { + "type": "integer", + "format": "int64", + "x-go-name": "Index" + }, + "patch_url": { + "type": "string", + "x-go-name": "PatchURL" + }, + "pin_order": { + "type": "integer", + "format": "int64", + "x-go-name": "PinOrder" + }, + "requested_reviewers": { + "type": "array", + "items": { + "$ref": "#/definitions/User" + }, + "x-go-name": "RequestedReviewers" + }, + "state": { + "$ref": "#/definitions/StateType" + }, + "title": { + "type": "string", + "x-go-name": "Title" + }, + "updated_at": { + "type": "string", + "format": "date-time", + "x-go-name": "Updated" + }, + "url": { + "type": "string", + "x-go-name": "URL" + }, + "user": { + "$ref": "#/definitions/User" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "PullRequestMeta": { + "description": "PullRequestMeta PR info if an issue is a PR", + "type": "object", + "properties": { + "merged": { + "type": "boolean", + "x-go-name": "HasMerged" + }, + "merged_at": { + "type": "string", + "format": "date-time", + "x-go-name": "Merged" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "PullReview": { + "description": "PullReview represents a pull request review", + "type": "object", + "properties": { + "body": { + "type": "string", + "x-go-name": "Body" + }, + "comments_count": { + "type": "integer", + "format": "int64", + "x-go-name": "CodeCommentsCount" + }, + "commit_id": { + "type": "string", + "x-go-name": "CommitID" + }, + "dismissed": { + "type": "boolean", + "x-go-name": "Dismissed" + }, + "html_url": { + "type": "string", + "x-go-name": "HTMLURL" + }, + "id": { + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "official": { + "type": "boolean", + "x-go-name": "Official" + }, + "pull_request_url": { + "type": "string", + "x-go-name": "HTMLPullURL" + }, + "stale": { + "type": "boolean", + "x-go-name": "Stale" + }, + "state": { + "$ref": "#/definitions/ReviewStateType" + }, + "submitted_at": { + "type": "string", + "format": "date-time", + "x-go-name": "Submitted" + }, + "team": { + "$ref": "#/definitions/Team" + }, + "updated_at": { + "type": "string", + "format": "date-time", + "x-go-name": "Updated" + }, + "user": { + "$ref": "#/definitions/User" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "PullReviewComment": { + "description": "PullReviewComment represents a comment on a pull request review", + "type": "object", + "properties": { + "body": { + "type": "string", + "x-go-name": "Body" + }, + "commit_id": { + "type": "string", + "x-go-name": "CommitID" + }, + "created_at": { + "type": "string", + "format": "date-time", + "x-go-name": "Created" + }, + "diff_hunk": { + "type": "string", + "x-go-name": "DiffHunk" + }, + "html_url": { + "type": "string", + "x-go-name": "HTMLURL" + }, + "id": { + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "original_commit_id": { + "type": "string", + "x-go-name": "OrigCommitID" + }, + "original_position": { + "type": "integer", + "format": "uint64", + "x-go-name": "OldLineNum" + }, + "path": { + "type": "string", + "x-go-name": "Path" + }, + "position": { + "type": "integer", + "format": "uint64", + "x-go-name": "LineNum" + }, + "pull_request_review_id": { + "type": "integer", + "format": "int64", + "x-go-name": "ReviewID" + }, + "pull_request_url": { + "type": "string", + "x-go-name": "HTMLPullURL" + }, + "resolver": { + "$ref": "#/definitions/User" + }, + "updated_at": { + "type": "string", + "format": "date-time", + "x-go-name": "Updated" + }, + "user": { + "$ref": "#/definitions/User" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "PullReviewRequestOptions": { + "description": "PullReviewRequestOptions are options to add or remove pull review requests", + "type": "object", + "properties": { + "reviewers": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "Reviewers" + }, + "team_reviewers": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "TeamReviewers" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "PushMirror": { + "description": "PushMirror represents information of a push mirror", + "type": "object", + "properties": { + "created": { + "type": "string", + "x-go-name": "CreatedUnix" + }, + "interval": { + "type": "string", + "x-go-name": "Interval" + }, + "last_error": { + "type": "string", + "x-go-name": "LastError" + }, + "last_update": { + "type": "string", + "x-go-name": "LastUpdateUnix" + }, + "remote_address": { + "type": "string", + "x-go-name": "RemoteAddress" + }, + "remote_name": { + "type": "string", + "x-go-name": "RemoteName" + }, + "repo_name": { + "type": "string", + "x-go-name": "RepoName" + }, + "sync_on_commit": { + "type": "boolean", + "x-go-name": "SyncOnCommit" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "Reaction": { + "description": "Reaction contain one reaction", + "type": "object", + "properties": { + "content": { + "type": "string", + "x-go-name": "Reaction" + }, + "created_at": { + "type": "string", + "format": "date-time", + "x-go-name": "Created" + }, + "user": { + "$ref": "#/definitions/User" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "Reference": { + "type": "object", + "title": "Reference represents a Git reference.", + "properties": { + "object": { + "$ref": "#/definitions/GitObject" + }, + "ref": { + "type": "string", + "x-go-name": "Ref" + }, + "url": { + "type": "string", + "x-go-name": "URL" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "Release": { + "description": "Release represents a repository release", + "type": "object", + "properties": { + "assets": { + "type": "array", + "items": { + "$ref": "#/definitions/Attachment" + }, + "x-go-name": "Attachments" + }, + "author": { + "$ref": "#/definitions/User" + }, + "body": { + "type": "string", + "x-go-name": "Note" + }, + "created_at": { + "type": "string", + "format": "date-time", + "x-go-name": "CreatedAt" + }, + "draft": { + "type": "boolean", + "x-go-name": "IsDraft" + }, + "html_url": { + "type": "string", + "x-go-name": "HTMLURL" + }, + "id": { + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "name": { + "type": "string", + "x-go-name": "Title" + }, + "prerelease": { + "type": "boolean", + "x-go-name": "IsPrerelease" + }, + "published_at": { + "type": "string", + "format": "date-time", + "x-go-name": "PublishedAt" + }, + "tag_name": { + "type": "string", + "x-go-name": "TagName" + }, + "tarball_url": { + "type": "string", + "x-go-name": "TarURL" + }, + "target_commitish": { + "type": "string", + "x-go-name": "Target" + }, + "url": { + "type": "string", + "x-go-name": "URL" + }, + "zipball_url": { + "type": "string", + "x-go-name": "ZipURL" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "RenameUserOption": { + "description": "RenameUserOption options when renaming a user", + "type": "object", + "required": [ + "new_username" + ], + "properties": { + "new_username": { + "description": "New username for this user. This name cannot be in use yet by any other user.", + "type": "string", + "uniqueItems": true, + "x-go-name": "NewName" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "RepoCollaboratorPermission": { + "description": "RepoCollaboratorPermission to get repository permission for a collaborator", + "type": "object", + "properties": { + "permission": { + "type": "string", + "x-go-name": "Permission" + }, + "role_name": { + "type": "string", + "x-go-name": "RoleName" + }, + "user": { + "$ref": "#/definitions/User" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "RepoCommit": { + "type": "object", + "title": "RepoCommit contains information of a commit in the context of a repository.", + "properties": { + "author": { + "$ref": "#/definitions/CommitUser" + }, + "committer": { + "$ref": "#/definitions/CommitUser" + }, + "message": { + "type": "string", + "x-go-name": "Message" + }, + "tree": { + "$ref": "#/definitions/CommitMeta" + }, + "url": { + "type": "string", + "x-go-name": "URL" + }, + "verification": { + "$ref": "#/definitions/PayloadCommitVerification" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "RepoTopicOptions": { + "description": "RepoTopicOptions a collection of repo topic names", + "type": "object", + "properties": { + "topics": { + "description": "list of topic names", + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "Topics" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "RepoTransfer": { + "description": "RepoTransfer represents a pending repo transfer", + "type": "object", + "properties": { + "doer": { + "$ref": "#/definitions/User" + }, + "recipient": { + "$ref": "#/definitions/User" + }, + "teams": { + "type": "array", + "items": { + "$ref": "#/definitions/Team" + }, + "x-go-name": "Teams" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "Repository": { + "description": "Repository represents a repository", + "type": "object", + "properties": { + "allow_merge_commits": { + "type": "boolean", + "x-go-name": "AllowMerge" + }, + "allow_rebase": { + "type": "boolean", + "x-go-name": "AllowRebase" + }, + "allow_rebase_explicit": { + "type": "boolean", + "x-go-name": "AllowRebaseMerge" + }, + "allow_rebase_update": { + "type": "boolean", + "x-go-name": "AllowRebaseUpdate" + }, + "allow_squash_merge": { + "type": "boolean", + "x-go-name": "AllowSquash" + }, + "archived": { + "type": "boolean", + "x-go-name": "Archived" + }, + "archived_at": { + "type": "string", + "format": "date-time", + "x-go-name": "ArchivedAt" + }, + "avatar_url": { + "type": "string", + "x-go-name": "AvatarURL" + }, + "clone_url": { + "type": "string", + "x-go-name": "CloneURL" + }, + "created_at": { + "type": "string", + "format": "date-time", + "x-go-name": "Created" + }, + "default_allow_maintainer_edit": { + "type": "boolean", + "x-go-name": "DefaultAllowMaintainerEdit" + }, + "default_branch": { + "type": "string", + "x-go-name": "DefaultBranch" + }, + "default_delete_branch_after_merge": { + "type": "boolean", + "x-go-name": "DefaultDeleteBranchAfterMerge" + }, + "default_merge_style": { + "type": "string", + "x-go-name": "DefaultMergeStyle" + }, + "description": { + "type": "string", + "x-go-name": "Description" + }, + "empty": { + "type": "boolean", + "x-go-name": "Empty" + }, + "external_tracker": { + "$ref": "#/definitions/ExternalTracker" + }, + "external_wiki": { + "$ref": "#/definitions/ExternalWiki" + }, + "fork": { + "type": "boolean", + "x-go-name": "Fork" + }, + "forks_count": { + "type": "integer", + "format": "int64", + "x-go-name": "Forks" + }, + "full_name": { + "type": "string", + "x-go-name": "FullName" + }, + "has_actions": { + "type": "boolean", + "x-go-name": "HasActions" + }, + "has_issues": { + "type": "boolean", + "x-go-name": "HasIssues" + }, + "has_packages": { + "type": "boolean", + "x-go-name": "HasPackages" + }, + "has_projects": { + "type": "boolean", + "x-go-name": "HasProjects" + }, + "has_pull_requests": { + "type": "boolean", + "x-go-name": "HasPullRequests" + }, + "has_releases": { + "type": "boolean", + "x-go-name": "HasReleases" + }, + "has_wiki": { + "type": "boolean", + "x-go-name": "HasWiki" + }, + "html_url": { + "type": "string", + "x-go-name": "HTMLURL" + }, + "id": { + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "ignore_whitespace_conflicts": { + "type": "boolean", + "x-go-name": "IgnoreWhitespaceConflicts" + }, + "internal": { + "type": "boolean", + "x-go-name": "Internal" + }, + "internal_tracker": { + "$ref": "#/definitions/InternalTracker" + }, + "language": { + "type": "string", + "x-go-name": "Language" + }, + "languages_url": { + "type": "string", + "x-go-name": "LanguagesURL" + }, + "link": { + "type": "string", + "x-go-name": "Link" + }, + "mirror": { + "type": "boolean", + "x-go-name": "Mirror" + }, + "mirror_interval": { + "type": "string", + "x-go-name": "MirrorInterval" + }, + "mirror_updated": { + "type": "string", + "format": "date-time", + "x-go-name": "MirrorUpdated" + }, + "name": { + "type": "string", + "x-go-name": "Name" + }, + "open_issues_count": { + "type": "integer", + "format": "int64", + "x-go-name": "OpenIssues" + }, + "open_pr_counter": { + "type": "integer", + "format": "int64", + "x-go-name": "OpenPulls" + }, + "original_url": { + "type": "string", + "x-go-name": "OriginalURL" + }, + "owner": { + "$ref": "#/definitions/User" + }, + "parent": { + "$ref": "#/definitions/Repository" + }, + "permissions": { + "$ref": "#/definitions/Permission" + }, + "private": { + "type": "boolean", + "x-go-name": "Private" + }, + "release_counter": { + "type": "integer", + "format": "int64", + "x-go-name": "Releases" + }, + "repo_transfer": { + "$ref": "#/definitions/RepoTransfer" + }, + "size": { + "type": "integer", + "format": "int64", + "x-go-name": "Size" + }, + "ssh_url": { + "type": "string", + "x-go-name": "SSHURL" + }, + "stars_count": { + "type": "integer", + "format": "int64", + "x-go-name": "Stars" + }, + "template": { + "type": "boolean", + "x-go-name": "Template" + }, + "updated_at": { + "type": "string", + "format": "date-time", + "x-go-name": "Updated" + }, + "watchers_count": { + "type": "integer", + "format": "int64", + "x-go-name": "Watchers" + }, + "website": { + "type": "string", + "x-go-name": "Website" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "RepositoryMeta": { + "description": "RepositoryMeta basic repository information", + "type": "object", + "properties": { + "full_name": { + "type": "string", + "x-go-name": "FullName" + }, + "id": { + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "name": { + "type": "string", + "x-go-name": "Name" + }, + "owner": { + "type": "string", + "x-go-name": "Owner" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "ReviewStateType": { + "description": "ReviewStateType review state type", + "type": "string", + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "SearchResults": { + "description": "SearchResults results of a successful search", + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/definitions/Repository" + }, + "x-go-name": "Data" + }, + "ok": { + "type": "boolean", + "x-go-name": "OK" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "ServerVersion": { + "description": "ServerVersion wraps the version of the server", + "type": "object", + "properties": { + "version": { + "type": "string", + "x-go-name": "Version" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "StateType": { + "description": "StateType issue state type", + "type": "string", + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "StopWatch": { + "description": "StopWatch represent a running stopwatch", + "type": "object", + "properties": { + "created": { + "type": "string", + "format": "date-time", + "x-go-name": "Created" + }, + "duration": { + "type": "string", + "x-go-name": "Duration" + }, + "issue_index": { + "type": "integer", + "format": "int64", + "x-go-name": "IssueIndex" + }, + "issue_title": { + "type": "string", + "x-go-name": "IssueTitle" + }, + "repo_name": { + "type": "string", + "x-go-name": "RepoName" + }, + "repo_owner_name": { + "type": "string", + "x-go-name": "RepoOwnerName" + }, + "seconds": { + "type": "integer", + "format": "int64", + "x-go-name": "Seconds" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "SubmitPullReviewOptions": { + "description": "SubmitPullReviewOptions are options to submit a pending pull review", + "type": "object", + "properties": { + "body": { + "type": "string", + "x-go-name": "Body" + }, + "event": { + "$ref": "#/definitions/ReviewStateType" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "Tag": { + "description": "Tag represents a repository tag", + "type": "object", + "properties": { + "commit": { + "$ref": "#/definitions/CommitMeta" + }, + "id": { + "type": "string", + "x-go-name": "ID" + }, + "message": { + "type": "string", + "x-go-name": "Message" + }, + "name": { + "type": "string", + "x-go-name": "Name" + }, + "tarball_url": { + "type": "string", + "x-go-name": "TarballURL" + }, + "zipball_url": { + "type": "string", + "x-go-name": "ZipballURL" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "Team": { + "description": "Team represents a team in an organization", + "type": "object", + "properties": { + "can_create_org_repo": { + "type": "boolean", + "x-go-name": "CanCreateOrgRepo" + }, + "description": { + "type": "string", + "x-go-name": "Description" + }, + "id": { + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "includes_all_repositories": { + "type": "boolean", + "x-go-name": "IncludesAllRepositories" + }, + "name": { + "type": "string", + "x-go-name": "Name" + }, + "organization": { + "$ref": "#/definitions/Organization" + }, + "permission": { + "type": "string", + "enum": [ + "none", + "read", + "write", + "admin", + "owner" + ], + "x-go-name": "Permission" + }, + "units": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "Units", + "example": [ + "repo.code", + "repo.issues", + "repo.ext_issues", + "repo.wiki", + "repo.pulls", + "repo.releases", + "repo.projects", + "repo.ext_wiki" + ] + }, + "units_map": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "x-go-name": "UnitsMap", + "example": { + "repo.code": "read", + "repo.ext_issues": "none", + "repo.ext_wiki": "none", + "repo.issues": "write", + "repo.projects": "none", + "repo.pulls": "owner", + "repo.releases": "none", + "repo.wiki": "admin" + } + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "TimeStamp": { + "description": "TimeStamp defines a timestamp", + "type": "integer", + "format": "int64", + "x-go-package": "code.gitea.io/gitea/modules/timeutil" + }, + "TimelineComment": { + "description": "TimelineComment represents a timeline comment (comment of any type) on a commit or issue", + "type": "object", + "properties": { + "assignee": { + "$ref": "#/definitions/User" + }, + "assignee_team": { + "$ref": "#/definitions/Team" + }, + "body": { + "type": "string", + "x-go-name": "Body" + }, + "created_at": { + "type": "string", + "format": "date-time", + "x-go-name": "Created" + }, + "dependent_issue": { + "$ref": "#/definitions/Issue" + }, + "html_url": { + "type": "string", + "x-go-name": "HTMLURL" + }, + "id": { + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "issue_url": { + "type": "string", + "x-go-name": "IssueURL" + }, + "label": { + "$ref": "#/definitions/Label" + }, + "milestone": { + "$ref": "#/definitions/Milestone" + }, + "new_ref": { + "type": "string", + "x-go-name": "NewRef" + }, + "new_title": { + "type": "string", + "x-go-name": "NewTitle" + }, + "old_milestone": { + "$ref": "#/definitions/Milestone" + }, + "old_project_id": { + "type": "integer", + "format": "int64", + "x-go-name": "OldProjectID" + }, + "old_ref": { + "type": "string", + "x-go-name": "OldRef" + }, + "old_title": { + "type": "string", + "x-go-name": "OldTitle" + }, + "project_id": { + "type": "integer", + "format": "int64", + "x-go-name": "ProjectID" + }, + "pull_request_url": { + "type": "string", + "x-go-name": "PRURL" + }, + "ref_action": { + "type": "string", + "x-go-name": "RefAction" + }, + "ref_comment": { + "$ref": "#/definitions/Comment" + }, + "ref_commit_sha": { + "description": "commit SHA where issue/PR was referenced", + "type": "string", + "x-go-name": "RefCommitSHA" + }, + "ref_issue": { + "$ref": "#/definitions/Issue" + }, + "removed_assignee": { + "description": "whether the assignees were removed or added", + "type": "boolean", + "x-go-name": "RemovedAssignee" + }, + "resolve_doer": { + "$ref": "#/definitions/User" + }, + "review_id": { + "type": "integer", + "format": "int64", + "x-go-name": "ReviewID" + }, + "tracked_time": { + "$ref": "#/definitions/TrackedTime" + }, + "type": { + "type": "string", + "x-go-name": "Type" + }, + "updated_at": { + "type": "string", + "format": "date-time", + "x-go-name": "Updated" + }, + "user": { + "$ref": "#/definitions/User" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "TopicName": { + "description": "TopicName a list of repo topic names", + "type": "object", + "properties": { + "topics": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "TopicNames" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "TopicResponse": { + "description": "TopicResponse for returning topics", + "type": "object", + "properties": { + "created": { + "type": "string", + "format": "date-time", + "x-go-name": "Created" + }, + "id": { + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "repo_count": { + "type": "integer", + "format": "int64", + "x-go-name": "RepoCount" + }, + "topic_name": { + "type": "string", + "x-go-name": "Name" + }, + "updated": { + "type": "string", + "format": "date-time", + "x-go-name": "Updated" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "TrackedTime": { + "description": "TrackedTime worked time for an issue / pr", + "type": "object", + "properties": { + "created": { + "type": "string", + "format": "date-time", + "x-go-name": "Created" + }, + "id": { + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "issue": { + "$ref": "#/definitions/Issue" + }, + "issue_id": { + "description": "deprecated (only for backwards compatibility)", + "type": "integer", + "format": "int64", + "x-go-name": "IssueID" + }, + "time": { + "description": "Time in seconds", + "type": "integer", + "format": "int64", + "x-go-name": "Time" + }, + "user_id": { + "description": "deprecated (only for backwards compatibility)", + "type": "integer", + "format": "int64", + "x-go-name": "UserID" + }, + "user_name": { + "type": "string", + "x-go-name": "UserName" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "TransferRepoOption": { + "description": "TransferRepoOption options when transfer a repository's ownership", + "type": "object", + "required": [ + "new_owner" + ], + "properties": { + "new_owner": { + "type": "string", + "x-go-name": "NewOwner" + }, + "team_ids": { + "description": "ID of the team or teams to add to the repository. Teams can only be added to organization-owned repositories.", + "type": "array", + "items": { + "type": "integer", + "format": "int64" + }, + "x-go-name": "TeamIDs" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "UpdateFileOptions": { + "description": "UpdateFileOptions options for updating files\nNote: `author` and `committer` are optional (if only one is given, it will be used for the other, otherwise the authenticated user will be used)", + "type": "object", + "required": [ + "sha", + "content" + ], + "properties": { + "author": { + "$ref": "#/definitions/Identity" + }, + "branch": { + "description": "branch (optional) to base this file from. if not given, the default branch is used", + "type": "string", + "x-go-name": "BranchName" + }, + "committer": { + "$ref": "#/definitions/Identity" + }, + "content": { + "description": "content must be base64 encoded", + "type": "string", + "x-go-name": "Content" + }, + "dates": { + "$ref": "#/definitions/CommitDateOptions" + }, + "from_path": { + "description": "from_path (optional) is the path of the original file which will be moved/renamed to the path in the URL", + "type": "string", + "x-go-name": "FromPath" + }, + "message": { + "description": "message (optional) for the commit of this file. if not supplied, a default message will be used", + "type": "string", + "x-go-name": "Message" + }, + "new_branch": { + "description": "new_branch (optional) will make a new branch from `branch` before creating the file", + "type": "string", + "x-go-name": "NewBranchName" + }, + "sha": { + "description": "sha is the SHA for the file that already exists", + "type": "string", + "x-go-name": "SHA" + }, + "signoff": { + "description": "Add a Signed-off-by trailer by the committer at the end of the commit log message.", + "type": "boolean", + "x-go-name": "Signoff" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "User": { + "description": "User represents a user", + "type": "object", + "properties": { + "active": { + "description": "Is user active", + "type": "boolean", + "x-go-name": "IsActive" + }, + "avatar_url": { + "description": "URL to the user's avatar", + "type": "string", + "x-go-name": "AvatarURL" + }, + "created": { + "type": "string", + "format": "date-time", + "x-go-name": "Created" + }, + "description": { + "description": "the user's description", + "type": "string", + "x-go-name": "Description" + }, + "email": { + "type": "string", + "format": "email", + "x-go-name": "Email" + }, + "followers_count": { + "description": "user counts", + "type": "integer", + "format": "int64", + "x-go-name": "Followers" + }, + "following_count": { + "type": "integer", + "format": "int64", + "x-go-name": "Following" + }, + "full_name": { + "description": "the user's full name", + "type": "string", + "x-go-name": "FullName" + }, + "id": { + "description": "the user's id", + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "is_admin": { + "description": "Is the user an administrator", + "type": "boolean", + "x-go-name": "IsAdmin" + }, + "language": { + "description": "User locale", + "type": "string", + "x-go-name": "Language" + }, + "last_login": { + "type": "string", + "format": "date-time", + "x-go-name": "LastLogin" + }, + "location": { + "description": "the user's location", + "type": "string", + "x-go-name": "Location" + }, + "login": { + "description": "the user's username", + "type": "string", + "x-go-name": "UserName" + }, + "login_name": { + "description": "the user's authentication sign-in name.", + "type": "string", + "default": "empty", + "x-go-name": "LoginName" + }, + "prohibit_login": { + "description": "Is user login prohibited", + "type": "boolean", + "x-go-name": "ProhibitLogin" + }, + "restricted": { + "description": "Is user restricted", + "type": "boolean", + "x-go-name": "Restricted" + }, + "starred_repos_count": { + "type": "integer", + "format": "int64", + "x-go-name": "StarredRepos" + }, + "visibility": { + "description": "User visibility level option: public, limited, private", + "type": "string", + "x-go-name": "Visibility" + }, + "website": { + "description": "the user's website", + "type": "string", + "x-go-name": "Website" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "UserHeatmapData": { + "description": "UserHeatmapData represents the data needed to create a heatmap", + "type": "object", + "properties": { + "contributions": { + "type": "integer", + "format": "int64", + "x-go-name": "Contributions" + }, + "timestamp": { + "$ref": "#/definitions/TimeStamp" + } + }, + "x-go-package": "code.gitea.io/gitea/models/activities" + }, + "UserSettings": { + "description": "UserSettings represents user settings", + "type": "object", + "properties": { + "description": { + "type": "string", + "x-go-name": "Description" + }, + "diff_view_style": { + "type": "string", + "x-go-name": "DiffViewStyle" + }, + "full_name": { + "type": "string", + "x-go-name": "FullName" + }, + "hide_activity": { + "type": "boolean", + "x-go-name": "HideActivity" + }, + "hide_email": { + "description": "Privacy", + "type": "boolean", + "x-go-name": "HideEmail" + }, + "language": { + "type": "string", + "x-go-name": "Language" + }, + "location": { + "type": "string", + "x-go-name": "Location" + }, + "theme": { + "type": "string", + "x-go-name": "Theme" + }, + "website": { + "type": "string", + "x-go-name": "Website" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "UserSettingsOptions": { + "description": "UserSettingsOptions represents options to change user settings", + "type": "object", + "properties": { + "description": { + "type": "string", + "x-go-name": "Description" + }, + "diff_view_style": { + "type": "string", + "x-go-name": "DiffViewStyle" + }, + "full_name": { + "type": "string", + "x-go-name": "FullName" + }, + "hide_activity": { + "type": "boolean", + "x-go-name": "HideActivity" + }, + "hide_email": { + "description": "Privacy", + "type": "boolean", + "x-go-name": "HideEmail" + }, + "language": { + "type": "string", + "x-go-name": "Language" + }, + "location": { + "type": "string", + "x-go-name": "Location" + }, + "theme": { + "type": "string", + "x-go-name": "Theme" + }, + "website": { + "type": "string", + "x-go-name": "Website" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "WatchInfo": { + "description": "WatchInfo represents an API watch status of one repository", + "type": "object", + "properties": { + "created_at": { + "type": "string", + "format": "date-time", + "x-go-name": "CreatedAt" + }, + "ignored": { + "type": "boolean", + "x-go-name": "Ignored" + }, + "reason": { + "x-go-name": "Reason" + }, + "repository_url": { + "type": "string", + "x-go-name": "RepositoryURL" + }, + "subscribed": { + "type": "boolean", + "x-go-name": "Subscribed" + }, + "url": { + "type": "string", + "x-go-name": "URL" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "WikiCommit": { + "description": "WikiCommit page commit/revision", + "type": "object", + "properties": { + "author": { + "$ref": "#/definitions/CommitUser" + }, + "commiter": { + "$ref": "#/definitions/CommitUser" + }, + "message": { + "type": "string", + "x-go-name": "Message" + }, + "sha": { + "type": "string", + "x-go-name": "ID" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "WikiCommitList": { + "description": "WikiCommitList commit/revision list", + "type": "object", + "properties": { + "commits": { + "type": "array", + "items": { + "$ref": "#/definitions/WikiCommit" + }, + "x-go-name": "WikiCommits" + }, + "count": { + "type": "integer", + "format": "int64", + "x-go-name": "Count" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "WikiPage": { + "description": "WikiPage a wiki page", + "type": "object", + "properties": { + "commit_count": { + "type": "integer", + "format": "int64", + "x-go-name": "CommitCount" + }, + "content_base64": { + "description": "Page content, base64 encoded", + "type": "string", + "x-go-name": "ContentBase64" + }, + "footer": { + "type": "string", + "x-go-name": "Footer" + }, + "html_url": { + "type": "string", + "x-go-name": "HTMLURL" + }, + "last_commit": { + "$ref": "#/definitions/WikiCommit" + }, + "sidebar": { + "type": "string", + "x-go-name": "Sidebar" + }, + "sub_url": { + "type": "string", + "x-go-name": "SubURL" + }, + "title": { + "type": "string", + "x-go-name": "Title" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, + "WikiPageMetaData": { + "description": "WikiPageMetaData wiki page meta information", + "type": "object", + "properties": { + "html_url": { + "type": "string", + "x-go-name": "HTMLURL" + }, + "last_commit": { + "$ref": "#/definitions/WikiCommit" + }, + "sub_url": { + "type": "string", + "x-go-name": "SubURL" + }, + "title": { + "type": "string", + "x-go-name": "Title" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + } + }, + "responses": { + "AccessToken": { + "description": "AccessToken represents an API access token.", + "schema": { + "$ref": "#/definitions/AccessToken" + } + }, + "AccessTokenList": { + "description": "AccessTokenList represents a list of API access token.", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/AccessToken" + } + } + }, + "ActivityFeedsList": { + "description": "ActivityFeedsList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Activity" + } + } + }, + "ActivityPub": { + "description": "ActivityPub", + "schema": { + "$ref": "#/definitions/ActivityPub" + } + }, + "AnnotatedTag": { + "description": "AnnotatedTag", + "schema": { + "$ref": "#/definitions/AnnotatedTag" + } + }, + "Attachment": { + "description": "Attachment", + "schema": { + "$ref": "#/definitions/Attachment" + } + }, + "AttachmentList": { + "description": "AttachmentList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Attachment" + } + } + }, + "Branch": { + "description": "Branch", + "schema": { + "$ref": "#/definitions/Branch" + } + }, + "BranchList": { + "description": "BranchList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Branch" + } + } + }, + "BranchProtection": { + "description": "BranchProtection", + "schema": { + "$ref": "#/definitions/BranchProtection" + } + }, + "BranchProtectionList": { + "description": "BranchProtectionList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/BranchProtection" + } + } + }, + "ChangedFileList": { + "description": "ChangedFileList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/ChangedFile" + } + }, + "headers": { + "X-HasMore": { + "type": "boolean", + "description": "True if there is another page" + }, + "X-Page": { + "type": "integer", + "format": "int64", + "description": "The current page" + }, + "X-PageCount": { + "type": "integer", + "format": "int64", + "description": "Total number of pages" + }, + "X-PerPage": { + "type": "integer", + "format": "int64", + "description": "Commits per page" + }, + "X-Total": { + "type": "integer", + "format": "int64", + "description": "Total commit count" + } + } + }, + "CombinedStatus": { + "description": "CombinedStatus", + "schema": { + "$ref": "#/definitions/CombinedStatus" + } + }, + "Comment": { + "description": "Comment", + "schema": { + "$ref": "#/definitions/Comment" + } + }, + "CommentList": { + "description": "CommentList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Comment" + } + } + }, + "Commit": { + "description": "Commit", + "schema": { + "$ref": "#/definitions/Commit" + } + }, + "CommitList": { + "description": "CommitList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Commit" + } + }, + "headers": { + "X-HasMore": { + "type": "boolean", + "description": "True if there is another page" + }, + "X-Page": { + "type": "integer", + "format": "int64", + "description": "The current page" + }, + "X-PageCount": { + "type": "integer", + "format": "int64", + "description": "Total number of pages" + }, + "X-PerPage": { + "type": "integer", + "format": "int64", + "description": "Commits per page" + }, + "X-Total": { + "type": "integer", + "format": "int64", + "description": "Total commit count" + } + } + }, + "CommitStatus": { + "description": "CommitStatus", + "schema": { + "$ref": "#/definitions/CommitStatus" + } + }, + "CommitStatusList": { + "description": "CommitStatusList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/CommitStatus" + } + } + }, + "ContentsListResponse": { + "description": "ContentsListResponse", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/ContentsResponse" + } + } + }, + "ContentsResponse": { + "description": "ContentsResponse", + "schema": { + "$ref": "#/definitions/ContentsResponse" + } + }, + "CronList": { + "description": "CronList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Cron" + } + } + }, + "DeployKey": { + "description": "DeployKey", + "schema": { + "$ref": "#/definitions/DeployKey" + } + }, + "DeployKeyList": { + "description": "DeployKeyList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/DeployKey" + } + } + }, + "EmailList": { + "description": "EmailList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Email" + } + } + }, + "EmptyRepository": { + "description": "EmptyRepository", + "schema": { + "$ref": "#/definitions/APIError" + } + }, + "FileDeleteResponse": { + "description": "FileDeleteResponse", + "schema": { + "$ref": "#/definitions/FileDeleteResponse" + } + }, + "FileResponse": { + "description": "FileResponse", + "schema": { + "$ref": "#/definitions/FileResponse" + } + }, + "FilesResponse": { + "description": "FilesResponse", + "schema": { + "$ref": "#/definitions/FilesResponse" + } + }, + "GPGKey": { + "description": "GPGKey", + "schema": { + "$ref": "#/definitions/GPGKey" + } + }, + "GPGKeyList": { + "description": "GPGKeyList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/GPGKey" + } + } + }, + "GeneralAPISettings": { + "description": "GeneralAPISettings", + "schema": { + "$ref": "#/definitions/GeneralAPISettings" + } + }, + "GeneralAttachmentSettings": { + "description": "GeneralAttachmentSettings", + "schema": { + "$ref": "#/definitions/GeneralAttachmentSettings" + } + }, + "GeneralRepoSettings": { + "description": "GeneralRepoSettings", + "schema": { + "$ref": "#/definitions/GeneralRepoSettings" + } + }, + "GeneralUISettings": { + "description": "GeneralUISettings", + "schema": { + "$ref": "#/definitions/GeneralUISettings" + } + }, + "GitBlobResponse": { + "description": "GitBlobResponse", + "schema": { + "$ref": "#/definitions/GitBlobResponse" + } + }, + "GitHook": { + "description": "GitHook", + "schema": { + "$ref": "#/definitions/GitHook" + } + }, + "GitHookList": { + "description": "GitHookList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/GitHook" + } + } + }, + "GitTreeResponse": { + "description": "GitTreeResponse", + "schema": { + "$ref": "#/definitions/GitTreeResponse" + } + }, + "GitignoreTemplateInfo": { + "description": "GitignoreTemplateInfo", + "schema": { + "$ref": "#/definitions/GitignoreTemplateInfo" + } + }, + "GitignoreTemplateList": { + "description": "GitignoreTemplateList", + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "Hook": { + "description": "Hook", + "schema": { + "$ref": "#/definitions/Hook" + } + }, + "HookList": { + "description": "HookList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Hook" + } + } + }, + "Issue": { + "description": "Issue", + "schema": { + "$ref": "#/definitions/Issue" + } + }, + "IssueDeadline": { + "description": "IssueDeadline", + "schema": { + "$ref": "#/definitions/IssueDeadline" + } + }, + "IssueList": { + "description": "IssueList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Issue" + } + } + }, + "IssueTemplates": { + "description": "IssueTemplates", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/IssueTemplate" + } + } + }, + "Label": { + "description": "Label", + "schema": { + "$ref": "#/definitions/Label" + } + }, + "LabelList": { + "description": "LabelList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Label" + } + } + }, + "LabelTemplateInfo": { + "description": "LabelTemplateInfo", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/LabelTemplate" + } + } + }, + "LabelTemplateList": { + "description": "LabelTemplateList", + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "LanguageStatistics": { + "description": "LanguageStatistics", + "schema": { + "type": "object", + "additionalProperties": { + "type": "integer", + "format": "int64" + } + } + }, + "LicenseTemplateInfo": { + "description": "LicenseTemplateInfo", + "schema": { + "$ref": "#/definitions/LicenseTemplateInfo" + } + }, + "LicenseTemplateList": { + "description": "LicenseTemplateList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/LicensesTemplateListEntry" + } + } + }, + "MarkdownRender": { + "description": "MarkdownRender is a rendered markdown document", + "schema": { + "type": "string" + } + }, + "MarkupRender": { + "description": "MarkupRender is a rendered markup document", + "schema": { + "type": "string" + } + }, + "Milestone": { + "description": "Milestone", + "schema": { + "$ref": "#/definitions/Milestone" + } + }, + "MilestoneList": { + "description": "MilestoneList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Milestone" + } + } + }, + "NodeInfo": { + "description": "NodeInfo", + "schema": { + "$ref": "#/definitions/NodeInfo" + } + }, + "Note": { + "description": "Note", + "schema": { + "$ref": "#/definitions/Note" + } + }, + "NotificationCount": { + "description": "Number of unread notifications", + "schema": { + "$ref": "#/definitions/NotificationCount" + } + }, + "NotificationThread": { + "description": "NotificationThread", + "schema": { + "$ref": "#/definitions/NotificationThread" + } + }, + "NotificationThreadList": { + "description": "NotificationThreadList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/NotificationThread" + } + } + }, + "OAuth2Application": { + "description": "OAuth2Application", + "schema": { + "$ref": "#/definitions/OAuth2Application" + } + }, + "OAuth2ApplicationList": { + "description": "OAuth2ApplicationList represents a list of OAuth2 applications.", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/OAuth2Application" + } + } + }, + "Organization": { + "description": "Organization", + "schema": { + "$ref": "#/definitions/Organization" + } + }, + "OrganizationList": { + "description": "OrganizationList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Organization" + } + } + }, + "OrganizationPermissions": { + "description": "OrganizationPermissions", + "schema": { + "$ref": "#/definitions/OrganizationPermissions" + } + }, + "Package": { + "description": "Package", + "schema": { + "$ref": "#/definitions/Package" + } + }, + "PackageFileList": { + "description": "PackageFileList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/PackageFile" + } + } + }, + "PackageList": { + "description": "PackageList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Package" + } + } + }, + "PublicKey": { + "description": "PublicKey", + "schema": { + "$ref": "#/definitions/PublicKey" + } + }, + "PublicKeyList": { + "description": "PublicKeyList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/PublicKey" + } + } + }, + "PullRequest": { + "description": "PullRequest", + "schema": { + "$ref": "#/definitions/PullRequest" + } + }, + "PullRequestList": { + "description": "PullRequestList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/PullRequest" + } + } + }, + "PullReview": { + "description": "PullReview", + "schema": { + "$ref": "#/definitions/PullReview" + } + }, + "PullReviewComment": { + "description": "PullComment", + "schema": { + "$ref": "#/definitions/PullReviewComment" + } + }, + "PullReviewCommentList": { + "description": "PullCommentList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/PullReviewComment" + } + } + }, + "PullReviewList": { + "description": "PullReviewList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/PullReview" + } + } + }, + "PushMirror": { + "description": "PushMirror", + "schema": { + "$ref": "#/definitions/PushMirror" + } + }, + "PushMirrorList": { + "description": "PushMirrorList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/PushMirror" + } + } + }, + "Reaction": { + "description": "Reaction", + "schema": { + "$ref": "#/definitions/Reaction" + } + }, + "ReactionList": { + "description": "ReactionList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Reaction" + } + } + }, + "Reference": { + "description": "Reference", + "schema": { + "$ref": "#/definitions/Reference" + } + }, + "ReferenceList": { + "description": "ReferenceList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Reference" + } + } + }, + "Release": { + "description": "Release", + "schema": { + "$ref": "#/definitions/Release" + } + }, + "ReleaseList": { + "description": "ReleaseList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Release" + } + } + }, + "RepoCollaboratorPermission": { + "description": "RepoCollaboratorPermission", + "schema": { + "$ref": "#/definitions/RepoCollaboratorPermission" + } + }, + "RepoIssueConfig": { + "description": "RepoIssueConfig", + "schema": { + "$ref": "#/definitions/IssueConfig" + } + }, + "RepoIssueConfigValidation": { + "description": "RepoIssueConfigValidation", + "schema": { + "$ref": "#/definitions/IssueConfigValidation" + } + }, + "RepoNewIssuePinsAllowed": { + "description": "RepoNewIssuePinsAllowed", + "schema": { + "$ref": "#/definitions/NewIssuePinsAllowed" + } + }, + "Repository": { + "description": "Repository", + "schema": { + "$ref": "#/definitions/Repository" + } + }, + "RepositoryList": { + "description": "RepositoryList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Repository" + } + } + }, + "SearchResults": { + "description": "SearchResults", + "schema": { + "$ref": "#/definitions/SearchResults" + } + }, + "ServerVersion": { + "description": "ServerVersion", + "schema": { + "$ref": "#/definitions/ServerVersion" + } + }, + "StopWatch": { + "description": "StopWatch", + "schema": { + "$ref": "#/definitions/StopWatch" + } + }, + "StopWatchList": { + "description": "StopWatchList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/StopWatch" + } + } + }, + "StringSlice": { + "description": "StringSlice", + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "Tag": { + "description": "Tag", + "schema": { + "$ref": "#/definitions/Tag" + } + }, + "TagList": { + "description": "TagList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Tag" + } + } + }, + "Team": { + "description": "Team", + "schema": { + "$ref": "#/definitions/Team" + } + }, + "TeamList": { + "description": "TeamList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Team" + } + } + }, + "TimelineList": { + "description": "TimelineList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/TimelineComment" + } + } + }, + "TopicListResponse": { + "description": "TopicListResponse", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/TopicResponse" + } + } + }, + "TopicNames": { + "description": "TopicNames", + "schema": { + "$ref": "#/definitions/TopicName" + } + }, + "TrackedTime": { + "description": "TrackedTime", + "schema": { + "$ref": "#/definitions/TrackedTime" + } + }, + "TrackedTimeList": { + "description": "TrackedTimeList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/TrackedTime" + } + } + }, + "User": { + "description": "User", + "schema": { + "$ref": "#/definitions/User" + } + }, + "UserHeatmapData": { + "description": "UserHeatmapData", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/UserHeatmapData" + } + } + }, + "UserList": { + "description": "UserList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/User" + } + } + }, + "UserSettings": { + "description": "UserSettings", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/UserSettings" + } + } + }, + "WatchInfo": { + "description": "WatchInfo", + "schema": { + "$ref": "#/definitions/WatchInfo" + } + }, + "WikiCommitList": { + "description": "WikiCommitList", + "schema": { + "$ref": "#/definitions/WikiCommitList" + } + }, + "WikiPage": { + "description": "WikiPage", + "schema": { + "$ref": "#/definitions/WikiPage" + } + }, + "WikiPageList": { + "description": "WikiPageList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/WikiPageMetaData" + } + } + }, + "conflict": { + "description": "APIConflict is a conflict empty response" + }, + "empty": { + "description": "APIEmpty is an empty response" + }, + "error": { + "description": "APIError is error format response", + "headers": { + "message": { + "type": "string" + }, + "url": { + "type": "string" + } + } + }, + "forbidden": { + "description": "APIForbiddenError is a forbidden error response", + "headers": { + "message": { + "type": "string" + }, + "url": { + "type": "string" + } + } + }, + "invalidTopicsError": { + "description": "APIInvalidTopicsError is error format response to invalid topics", + "headers": { + "invalidTopics": { + "type": "array", + "items": { + "type": "string" + } + }, + "message": { + "type": "string" + } + } + }, + "notFound": { + "description": "APINotFound is a not found empty response" + }, + "parameterBodies": { + "description": "parameterBodies", + "schema": { + "$ref": "#/definitions/CreatePushMirrorOption" + } + }, + "redirect": { + "description": "APIRedirect is a redirect response" + }, + "string": { + "description": "APIString is a string response", + "schema": { + "type": "string" + } + }, + "validationError": { + "description": "APIValidationError is error format response related to input validation", + "headers": { + "message": { + "type": "string" + }, + "url": { + "type": "string" + } + } + } + }, + "securityDefinitions": { + "AccessToken": { + "type": "apiKey", + "name": "access_token", + "in": "query" + }, + "AuthorizationHeaderToken": { + "description": "API tokens must be prepended with \"token\" followed by a space.", + "type": "apiKey", + "name": "Authorization", + "in": "header" + }, + "BasicAuth": { + "type": "basic" + }, + "SudoHeader": { + "description": "Sudo API request as the user provided as the key. Admin privileges are required.", + "type": "apiKey", + "name": "Sudo", + "in": "header" + }, + "SudoParam": { + "description": "Sudo API request as the user provided as the key. Admin privileges are required.", + "type": "apiKey", + "name": "sudo", + "in": "query" + }, + "TOTPHeader": { + "description": "Must be used in combination with BasicAuth if two-factor authentication is enabled.", + "type": "apiKey", + "name": "X-GITEA-OTP", + "in": "header" + }, + "Token": { + "type": "apiKey", + "name": "token", + "in": "query" + } + }, + "security": [ + { + "BasicAuth": [] + }, + { + "Token": [] + }, + { + "AccessToken": [] + }, + { + "AuthorizationHeaderToken": [] + }, + { + "SudoParam": [] + }, + { + "SudoHeader": [] + }, + { + "TOTPHeader": [] + } + ] +} diff --git a/src/templates/user/auth/activate.tmpl b/src/templates/user/auth/activate.tmpl new file mode 100644 index 0000000..5a44529 --- /dev/null +++ b/src/templates/user/auth/activate.tmpl @@ -0,0 +1,52 @@ +{{template "base/head" .}} +
    +
    +
    +
    + {{.CsrfTokenHtml}} +

    + {{.locale.Tr "auth.active_your_account"}} +

    +
    + {{template "base/alert" .}} + {{if .IsActivatePage}} + {{if .ServiceNotEnabled}} +

    {{.locale.Tr "auth.disable_register_mail"}}

    + {{else if .ResendLimited}} +

    {{.locale.Tr "auth.resent_limit_prompt"}}

    + {{else}} +

    {{.locale.Tr "auth.confirmation_mail_sent_prompt" (.SignedUser.Email|Escape) .ActiveCodeLives | Str2html}}

    + {{end}} + {{else}} + {{if .NeedsPassword}} +
    + + +
    +
    + + +
    + + {{else if .IsSendRegisterMail}} +

    {{.locale.Tr "auth.confirmation_mail_sent_prompt" (.Email|Escape) .ActiveCodeLives | Str2html}}

    + {{else if .IsCodeInvalid}} +

    {{.locale.Tr "auth.invalid_code"}}

    + {{else if .IsPasswordInvalid}} +

    {{.locale.Tr "auth.invalid_password"}}

    + {{else if .ManualActivationOnly}} +

    {{.locale.Tr "auth.manual_activation_only"}}

    + {{else}} +

    {{.locale.Tr "auth.has_unconfirmed_mail" (.SignedUser.Name|Escape) (.SignedUser.Email|Escape) | Str2html}}

    +
    +
    + +
    + {{end}} + {{end}} +
    +
    +
    +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/user/auth/captcha.tmpl b/src/templates/user/auth/captcha.tmpl new file mode 100644 index 0000000..62a3779 --- /dev/null +++ b/src/templates/user/auth/captcha.tmpl @@ -0,0 +1,28 @@ +{{if .EnableCaptcha}}{{if eq .CaptchaType "image"}} +
    + + {{.Captcha.CreateHTML}} +
    +
    + + +
    +{{else if eq .CaptchaType "recaptcha"}} +
    +
    +
    +{{else if eq .CaptchaType "hcaptcha"}} +
    +
    +
    +{{else if eq .CaptchaType "mcaptcha"}} +
    + {{.locale.Tr "captcha"}} +
    +
    +
    +{{else if eq .CaptchaType "cfturnstile"}} +
    +
    +
    +{{end}}{{end}} diff --git a/src/templates/user/auth/change_passwd.tmpl b/src/templates/user/auth/change_passwd.tmpl new file mode 100644 index 0000000..e05f46f --- /dev/null +++ b/src/templates/user/auth/change_passwd.tmpl @@ -0,0 +1,7 @@ +{{template "base/head" .}} +
    +
    + {{template "user/auth/change_passwd_inner" .}} +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/user/auth/change_passwd_inner.tmpl b/src/templates/user/auth/change_passwd_inner.tmpl new file mode 100644 index 0000000..4b18ac9 --- /dev/null +++ b/src/templates/user/auth/change_passwd_inner.tmpl @@ -0,0 +1,26 @@ + {{if or (not .LinkAccountMode) (and .LinkAccountMode .LinkAccountModeSignIn)}} + {{template "base/alert" .}} + {{end}} +

    + {{.locale.Tr "settings.change_password"}} +

    +
    +
    + {{.CsrfTokenHtml}} +
    + + +
    + + +
    + + +
    + +
    + + +
    +
    +
    diff --git a/src/templates/user/auth/finalize_openid.tmpl b/src/templates/user/auth/finalize_openid.tmpl new file mode 100644 index 0000000..2b833d9 --- /dev/null +++ b/src/templates/user/auth/finalize_openid.tmpl @@ -0,0 +1,47 @@ +{{template "base/head" .}} + +{{template "base/footer" .}} diff --git a/src/templates/user/auth/forgot_passwd.tmpl b/src/templates/user/auth/forgot_passwd.tmpl new file mode 100644 index 0000000..f80e289 --- /dev/null +++ b/src/templates/user/auth/forgot_passwd.tmpl @@ -0,0 +1,40 @@ +{{template "base/head" .}} +
    +
    +
    +
    + {{.CsrfTokenHtml}} +

    + {{.locale.Tr "auth.forgot_password_title"}} +

    +
    + {{template "base/alert" .}} + {{if .IsResetSent}} +

    {{.locale.Tr "auth.reset_password_mail_sent_prompt" (Escape .Email) .ResetPwdCodeLives | Str2html}}

    + {{else if .IsResetRequest}} +
    + + +
    +
    +
    + + +
    + {{else if .IsResetDisable}} +

    + {{if $.IsAdmin}} + {{.locale.Tr "auth.disable_forgot_password_mail_admin"}} + {{else}} + {{.locale.Tr "auth.disable_forgot_password_mail"}} + {{end}} +

    + {{else if .ResendLimited}} +

    {{.locale.Tr "auth.resent_limit_prompt"}}

    + {{end}} +
    +
    +
    +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/user/auth/grant.tmpl b/src/templates/user/auth/grant.tmpl new file mode 100644 index 0000000..28c5740 --- /dev/null +++ b/src/templates/user/auth/grant.tmpl @@ -0,0 +1,33 @@ +{{template "base/head" .}} +
    +
    +
    +

    + {{.locale.Tr "auth.authorize_title" .Application.Name}} +

    +
    + {{template "base/alert" .}} +

    + {{.locale.Tr "auth.authorize_application_description"}}
    + {{.locale.Tr "auth.authorize_application_created_by" .ApplicationCreatorLinkHTML | Str2html}} +

    +
    +
    +

    {{.locale.Tr "auth.authorize_redirect_notice" .ApplicationRedirectDomainHTML | Str2html}}

    +
    +
    +
    + {{.CsrfTokenHtml}} + + + + + + + Cancel +
    +
    +
    +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/user/auth/grant_error.tmpl b/src/templates/user/auth/grant_error.tmpl new file mode 100644 index 0000000..cfb7e86 --- /dev/null +++ b/src/templates/user/auth/grant_error.tmpl @@ -0,0 +1,16 @@ +{{template "base/head" .}} +
    + {{if .IsRepo}}{{template "repo/header" .}}{{end}} +
    +
    +

    + {{.locale.Tr "auth.authorization_failed"}} +

    +

    {{.Error.ErrorDescription}}

    +
    +

    {{.locale.Tr "auth.authorization_failed_desc"}}

    +
    +
    +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/user/auth/link_account.tmpl b/src/templates/user/auth/link_account.tmpl new file mode 100644 index 0000000..1e059f6 --- /dev/null +++ b/src/templates/user/auth/link_account.tmpl @@ -0,0 +1,34 @@ +{{template "base/head" .}} + + +{{template "base/footer" .}} diff --git a/src/templates/user/auth/oidc_wellknown.tmpl b/src/templates/user/auth/oidc_wellknown.tmpl new file mode 100644 index 0000000..38e6900 --- /dev/null +++ b/src/templates/user/auth/oidc_wellknown.tmpl @@ -0,0 +1,49 @@ +{ + "issuer": "{{AppUrl | JSEscape | Safe}}", + "authorization_endpoint": "{{AppUrl | JSEscape | Safe}}login/oauth/authorize", + "token_endpoint": "{{AppUrl | JSEscape | Safe}}login/oauth/access_token", + "jwks_uri": "{{AppUrl | JSEscape | Safe}}login/oauth/keys", + "userinfo_endpoint": "{{AppUrl | JSEscape | Safe}}login/oauth/userinfo", + "introspection_endpoint": "{{AppUrl | JSEscape | Safe}}login/oauth/introspect", + "response_types_supported": [ + "code", + "id_token" + ], + "id_token_signing_alg_values_supported": [ + "{{.SigningKey.SigningMethod.Alg | JSEscape | Safe}}" + ], + "subject_types_supported": [ + "public" + ], + "scopes_supported": [ + "openid", + "profile", + "email", + "groups" + ], + "claims_supported": [ + "aud", + "exp", + "iat", + "iss", + "sub", + "name", + "preferred_username", + "profile", + "picture", + "website", + "locale", + "updated_at", + "email", + "email_verified", + "groups" + ], + "code_challenge_methods_supported": [ + "plain", + "S256" + ], + "grant_types_supported": [ + "authorization_code", + "refresh_token" + ] +} diff --git a/src/templates/user/auth/prohibit_login.tmpl b/src/templates/user/auth/prohibit_login.tmpl new file mode 100644 index 0000000..ddb16a7 --- /dev/null +++ b/src/templates/user/auth/prohibit_login.tmpl @@ -0,0 +1,16 @@ +{{template "base/head" .}} +
    +
    +
    +
    +

    + {{.locale.Tr "auth.prohibit_login"}} +

    +
    +

    {{.locale.Tr "auth.prohibit_login_desc"}}

    +
    +
    +
    +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/user/auth/reset_passwd.tmpl b/src/templates/user/auth/reset_passwd.tmpl new file mode 100644 index 0000000..4493778 --- /dev/null +++ b/src/templates/user/auth/reset_passwd.tmpl @@ -0,0 +1,67 @@ +{{template "base/head" .}} +
    +
    +
    +
    + {{.CsrfTokenHtml}} + +

    + {{.locale.Tr "auth.reset_password"}} +

    +
    + {{template "base/alert" .}} + {{if .user_email}} +
    + + +
    + {{end}} + {{if .IsResetForm}} +
    + + +
    + {{if not .user_signed_in}} +
    + +
    + + +
    +
    + {{end}} + {{if .has_two_factor}} +

    + {{.locale.Tr "twofa"}} +

    +
    {{.locale.Tr "settings.twofa_is_enrolled" | Str2html}}
    + {{if .scratch_code}} +
    + + +
    + + {{else}} +
    + + +
    + {{end}} + {{end}} +
    +
    + + + {{if and .has_two_factor (not .scratch_code)}} + {{.locale.Tr "auth.use_scratch_code" | Str2html}} + {{end}} +
    + {{else}} +

    {{.locale.Tr "auth.invalid_code"}}

    + {{end}} +
    +
    +
    +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/user/auth/signin.tmpl b/src/templates/user/auth/signin.tmpl new file mode 100644 index 0000000..b0e9ce8 --- /dev/null +++ b/src/templates/user/auth/signin.tmpl @@ -0,0 +1,10 @@ +{{template "base/head" .}} +
    + {{template "user/auth/signin_navbar" .}} +
    +
    + {{template "user/auth/signin_inner" .}} +
    +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/user/auth/signin_inner.tmpl b/src/templates/user/auth/signin_inner.tmpl new file mode 100644 index 0000000..504457f --- /dev/null +++ b/src/templates/user/auth/signin_inner.tmpl @@ -0,0 +1,74 @@ +{{if or (not .LinkAccountMode) (and .LinkAccountMode .LinkAccountModeSignIn)}} +{{template "base/alert" .}} +{{end}} +

    + {{if .LinkAccountMode}} + {{.locale.Tr "auth.oauth_signin_title"}} + {{else}} + {{.locale.Tr "auth.login_userpass"}} + {{end}} +

    +
    +
    + {{.CsrfTokenHtml}} +
    + + +
    + {{if or (not .DisablePassword) .LinkAccountMode}} +
    + + +
    + {{end}} + {{if not .LinkAccountMode}} +
    + +
    + + +
    +
    + {{end}} + + {{template "user/auth/captcha" .}} + +
    + + + {{.locale.Tr "auth.forgot_password"}} +
    + + {{if .ShowRegistrationButton}} + + {{end}} + + {{if and .OrderedOAuth2Names .OAuth2Providers}} +
    + {{.locale.Tr "sign_in_or"}} +
    +
    +
    +
    + {{range $key := .OrderedOAuth2Names}} + {{$provider := index $.OAuth2Providers $key}} + + {{end}} +
    +
    +
    + {{end}} +
    +
    diff --git a/src/templates/user/auth/signin_navbar.tmpl b/src/templates/user/auth/signin_navbar.tmpl new file mode 100644 index 0000000..40f34cc --- /dev/null +++ b/src/templates/user/auth/signin_navbar.tmpl @@ -0,0 +1,21 @@ +{{if or .EnableOpenIDSignIn .EnableSSPI}} + +{{end}} diff --git a/src/templates/user/auth/signin_openid.tmpl b/src/templates/user/auth/signin_openid.tmpl new file mode 100644 index 0000000..7a54589 --- /dev/null +++ b/src/templates/user/auth/signin_openid.tmpl @@ -0,0 +1,38 @@ +{{template "base/head" .}} + +{{template "base/footer" .}} diff --git a/src/templates/user/auth/signup.tmpl b/src/templates/user/auth/signup.tmpl new file mode 100644 index 0000000..1d03f61 --- /dev/null +++ b/src/templates/user/auth/signup.tmpl @@ -0,0 +1,7 @@ +{{template "base/head" .}} +
    +
    + {{template "user/auth/signup_inner" .}} +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/user/auth/signup_inner.tmpl b/src/templates/user/auth/signup_inner.tmpl new file mode 100644 index 0000000..8dfcb7b --- /dev/null +++ b/src/templates/user/auth/signup_inner.tmpl @@ -0,0 +1,60 @@ +
    +

    + {{if .LinkAccountMode}} + {{.locale.Tr "auth.oauth_signup_title"}} + {{else}} + {{.locale.Tr "sign_up"}} + {{end}} +

    +
    +
    + {{.CsrfTokenHtml}} + {{if or (not .LinkAccountMode) (and .LinkAccountMode .LinkAccountModeRegister)}} + {{template "base/alert" .}} + {{end}} + {{if .DisableRegistration}} +

    {{.locale.Tr "auth.disable_register_prompt"}}

    + {{else}} +
    + + +
    +
    + + +
    + + {{if not .DisablePassword}} +
    + + +
    +
    + + +
    + {{end}} + + {{template "user/auth/captcha" .}} + +
    + + +
    + + {{if not .LinkAccountMode}} + + {{end}} + {{end}} +
    +
    +
    diff --git a/src/templates/user/auth/signup_openid_connect.tmpl b/src/templates/user/auth/signup_openid_connect.tmpl new file mode 100644 index 0000000..89a2e41 --- /dev/null +++ b/src/templates/user/auth/signup_openid_connect.tmpl @@ -0,0 +1,36 @@ +{{template "base/head" .}} + +{{template "base/footer" .}} diff --git a/src/templates/user/auth/signup_openid_navbar.tmpl b/src/templates/user/auth/signup_openid_navbar.tmpl new file mode 100644 index 0000000..f52c3ed --- /dev/null +++ b/src/templates/user/auth/signup_openid_navbar.tmpl @@ -0,0 +1,12 @@ + diff --git a/src/templates/user/auth/signup_openid_register.tmpl b/src/templates/user/auth/signup_openid_register.tmpl new file mode 100644 index 0000000..a490ea5 --- /dev/null +++ b/src/templates/user/auth/signup_openid_register.tmpl @@ -0,0 +1,38 @@ +{{template "base/head" .}} + +{{template "base/footer" .}} diff --git a/src/templates/user/auth/twofa.tmpl b/src/templates/user/auth/twofa.tmpl new file mode 100644 index 0000000..4002266 --- /dev/null +++ b/src/templates/user/auth/twofa.tmpl @@ -0,0 +1,27 @@ +{{template "base/head" .}} + +{{template "base/footer" .}} diff --git a/src/templates/user/auth/twofa_scratch.tmpl b/src/templates/user/auth/twofa_scratch.tmpl new file mode 100644 index 0000000..4ed7fce --- /dev/null +++ b/src/templates/user/auth/twofa_scratch.tmpl @@ -0,0 +1,26 @@ +{{template "base/head" .}} + +{{template "base/footer" .}} diff --git a/src/templates/user/auth/webauthn.tmpl b/src/templates/user/auth/webauthn.tmpl new file mode 100644 index 0000000..ef04886 --- /dev/null +++ b/src/templates/user/auth/webauthn.tmpl @@ -0,0 +1,23 @@ +{{template "base/head" .}} + +{{template "base/footer" .}} diff --git a/src/templates/user/auth/webauthn_error.tmpl b/src/templates/user/auth/webauthn_error.tmpl new file mode 100644 index 0000000..59029bb --- /dev/null +++ b/src/templates/user/auth/webauthn_error.tmpl @@ -0,0 +1,13 @@ +
    +
    {{.locale.Tr "webauthn_error"}}
    +
    +
    +
    {{.locale.Tr "webauthn_unsupported_browser"}}
    +
    {{.locale.Tr "webauthn_error_unknown"}}
    +
    {{.locale.Tr "webauthn_error_insecure"}}
    +
    {{.locale.Tr "webauthn_error_unable_to_process"}}
    +
    {{.locale.Tr "webauthn_error_duplicated"}}
    +
    {{.locale.Tr "webauthn_error_empty"}}
    +
    {{.locale.Tr "webauthn_error_timeout"}}
    +
    +
    diff --git a/src/templates/user/code.tmpl b/src/templates/user/code.tmpl new file mode 100644 index 0000000..338aae2 --- /dev/null +++ b/src/templates/user/code.tmpl @@ -0,0 +1,25 @@ +{{template "base/head" .}} + +{{template "base/footer" .}} diff --git a/src/templates/user/dashboard/dashboard.tmpl b/src/templates/user/dashboard/dashboard.tmpl new file mode 100644 index 0000000..d4553ea --- /dev/null +++ b/src/templates/user/dashboard/dashboard.tmpl @@ -0,0 +1,15 @@ +{{template "base/head" .}} +
    + {{template "user/dashboard/navbar" .}} +
    + {{template "base/alert" .}} +
    +
    + {{template "user/heatmap" .}} + {{template "user/dashboard/feeds" .}} +
    + {{template "user/dashboard/repolist" .}} +
    +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/user/dashboard/feeds.tmpl b/src/templates/user/dashboard/feeds.tmpl new file mode 100644 index 0000000..64daf4b --- /dev/null +++ b/src/templates/user/dashboard/feeds.tmpl @@ -0,0 +1,128 @@ +{{range .Feeds}} +
    +
    + {{avatarByAction $.Context .}} +
    +
    +
    +
    +

    + {{if gt .ActUser.ID 0}} + {{.GetDisplayName}} + {{else}} + {{.ShortActUserName}} + {{end}} + {{if eq .GetOpType 1}} + {{$.locale.Tr "action.create_repo" (.GetRepoLink|Escape) (.ShortRepoPath|Escape) | Str2html}} + {{else if eq .GetOpType 2}} + {{$.locale.Tr "action.rename_repo" (.GetContent|Escape) (.GetRepoLink|Escape) (.ShortRepoPath|Escape) | Str2html}} + {{else if eq .GetOpType 5}} + {{if .Content}} + {{$.locale.Tr "action.commit_repo" (.GetRepoLink|Escape) (.GetRefLink|Escape) (Escape .GetBranch) (.ShortRepoPath|Escape) | Str2html}} + {{else}} + {{$.locale.Tr "action.create_branch" (.GetRepoLink|Escape) (.GetRefLink|Escape) (Escape .GetBranch) (.ShortRepoPath|Escape) | Str2html}} + {{end}} + {{else if eq .GetOpType 6}} + {{$index := index .GetIssueInfos 0}} + {{$.locale.Tr "action.create_issue" ((printf "%s/issues/%s" .GetRepoLink $index) |Escape) $index (.ShortRepoPath|Escape) | Str2html}} + {{else if eq .GetOpType 7}} + {{$index := index .GetIssueInfos 0}} + {{$.locale.Tr "action.create_pull_request" ((printf "%s/pulls/%s" .GetRepoLink $index) |Escape) $index (.ShortRepoPath|Escape) | Str2html}} + {{else if eq .GetOpType 8}} + {{$.locale.Tr "action.transfer_repo" .GetContent (.GetRepoLink|Escape) (.ShortRepoPath|Escape) | Str2html}} + {{else if eq .GetOpType 9}} + {{$.locale.Tr "action.push_tag" (.GetRepoLink|Escape) (.GetRefLink|Escape) (.GetTag|Escape) (.ShortRepoPath|Escape) | Str2html}} + {{else if eq .GetOpType 10}} + {{$index := index .GetIssueInfos 0}} + {{$.locale.Tr "action.comment_issue" ((printf "%s/issues/%s" .GetRepoLink $index) |Escape) $index (.ShortRepoPath|Escape) | Str2html}} + {{else if eq .GetOpType 11}} + {{$index := index .GetIssueInfos 0}} + {{$.locale.Tr "action.merge_pull_request" ((printf "%s/pulls/%s" .GetRepoLink $index) |Escape) $index (.ShortRepoPath|Escape) | Str2html}} + {{else if eq .GetOpType 12}} + {{$index := index .GetIssueInfos 0}} + {{$.locale.Tr "action.close_issue" ((printf "%s/issues/%s" .GetRepoLink $index) |Escape) $index (.ShortRepoPath|Escape) | Str2html}} + {{else if eq .GetOpType 13}} + {{$index := index .GetIssueInfos 0}} + {{$.locale.Tr "action.reopen_issue" ((printf "%s/issues/%s" .GetRepoLink $index) |Escape) $index (.ShortRepoPath|Escape) | Str2html}} + {{else if eq .GetOpType 14}} + {{$index := index .GetIssueInfos 0}} + {{$.locale.Tr "action.close_pull_request" ((printf "%s/pulls/%s" .GetRepoLink $index) |Escape) $index (.ShortRepoPath|Escape) | Str2html}} + {{else if eq .GetOpType 15}} + {{$index := index .GetIssueInfos 0}} + {{$.locale.Tr "action.reopen_pull_request" ((printf "%s/pulls/%s" .GetRepoLink $index) |Escape) $index (.ShortRepoPath|Escape) | Str2html}} + {{else if eq .GetOpType 16}} + {{$index := index .GetIssueInfos 0}} + {{$.locale.Tr "action.delete_tag" (.GetRepoLink|Escape) (.GetTag|Escape) (.ShortRepoPath|Escape) | Str2html}} + {{else if eq .GetOpType 17}} + {{$index := index .GetIssueInfos 0}} + {{$.locale.Tr "action.delete_branch" (.GetRepoLink|Escape) (.GetBranch|Escape) (.ShortRepoPath|Escape) | Str2html}} + {{else if eq .GetOpType 18}} + {{$.locale.Tr "action.mirror_sync_push" (.GetRepoLink|Escape) (.GetRefLink|Escape) (.GetBranch|Escape) (.ShortRepoPath|Escape) | Str2html}} + {{else if eq .GetOpType 19}} + {{$.locale.Tr "action.mirror_sync_create" (.GetRepoLink|Escape) (.GetRefLink|Escape) (.GetBranch|Escape) (.ShortRepoPath|Escape) | Str2html}} + {{else if eq .GetOpType 20}} + {{$.locale.Tr "action.mirror_sync_delete" (.GetRepoLink|Escape) (.GetBranch|Escape) (.ShortRepoPath|Escape) | Str2html}} + {{else if eq .GetOpType 21}} + {{$index := index .GetIssueInfos 0}} + {{$.locale.Tr "action.approve_pull_request" ((printf "%s/pulls/%s" .GetRepoLink $index) |Escape) $index (.ShortRepoPath|Escape) | Str2html}} + {{else if eq .GetOpType 22}} + {{$index := index .GetIssueInfos 0}} + {{$.locale.Tr "action.reject_pull_request" ((printf "%s/pulls/%s" .GetRepoLink $index) |Escape) $index (.ShortRepoPath|Escape) | Str2html}} + {{else if eq .GetOpType 23}} + {{$index := index .GetIssueInfos 0}} + {{$.locale.Tr "action.comment_pull" ((printf "%s/pulls/%s" .GetRepoLink $index) |Escape) $index (.ShortRepoPath|Escape) | Str2html}} + {{else if eq .GetOpType 24}} + {{$linkText := .Content | RenderEmoji $.Context}} + {{$.locale.Tr "action.publish_release" (.GetRepoLink|Escape) ((printf "%s/releases/tag/%s" .GetRepoLink .GetTag)|Escape) (.ShortRepoPath|Escape) $linkText | Str2html}} + {{else if eq .GetOpType 25}} + {{$index := index .GetIssueInfos 0}} + {{$reviewer := index .GetIssueInfos 1}} + {{$.locale.Tr "action.review_dismissed" ((printf "%s/pulls/%s" .GetRepoLink $index) |Escape) $index (.ShortRepoPath|Escape) $reviewer | Str2html}} + {{end}} +

    + {{if or (eq .GetOpType 5) (eq .GetOpType 18)}} +
    +
      + {{$push := ActionContent2Commits .}} + {{$repoLink := .GetRepoLink}} + {{range $push.Commits}} + {{$commitLink := printf "%s/commit/%s" $repoLink .Sha1}} +
    • + {{avatarHTML ($push.AvatarLink $.Context .AuthorEmail) 16 "gt-mr-2" .AuthorName}} + {{ShortSha .Sha1}} + + {{RenderCommitMessage $.Context .Message $repoLink $.ComposeMetas}} + +
    • + {{end}} + {{if and (gt $push.Len 1) $push.CompareURL}}
    • {{$.locale.Tr "action.compare_commits" $push.Len}} »
    • {{end}} +
    +
    + {{else if eq .GetOpType 6}} + {{index .GetIssueInfos 1 | RenderEmoji $.Context | RenderCodeBlock}} + {{else if eq .GetOpType 7}} + {{index .GetIssueInfos 1 | RenderEmoji $.Context | RenderCodeBlock}} + {{else if or (eq .GetOpType 10) (eq .GetOpType 21) (eq .GetOpType 22) (eq .GetOpType 23)}} + {{.GetIssueTitle | RenderEmoji $.Context | RenderCodeBlock}} + {{$comment := index .GetIssueInfos 1}} + {{if gt (len $comment) 0}}

    {{$comment | RenderEmoji $.Context}}

    {{end}} + {{else if eq .GetOpType 11}} +

    {{index .GetIssueInfos 1}}

    + {{else if or (eq .GetOpType 12) (eq .GetOpType 13) (eq .GetOpType 14) (eq .GetOpType 15)}} + {{.GetIssueTitle | RenderEmoji $.Context | RenderCodeBlock}} + {{else if eq .GetOpType 25}} +

    {{$.locale.Tr "action.review_dismissed_reason"}}

    +

    {{index .GetIssueInfos 2 | RenderEmoji $.Context}}

    + {{end}} +

    {{TimeSince .GetCreate $.locale}}

    +
    +
    +
    + {{svg (printf "octicon-%s" (ActionIcon .GetOpType)) 32}} +
    +
    +
    +
    +{{end}} + +{{template "base/paginate" .}} diff --git a/src/templates/user/dashboard/issues.tmpl b/src/templates/user/dashboard/issues.tmpl new file mode 100644 index 0000000..e7762c5 --- /dev/null +++ b/src/templates/user/dashboard/issues.tmpl @@ -0,0 +1,115 @@ +{{template "base/head" .}} +
    + {{template "user/dashboard/navbar" .}} +
    +
    + + +
    +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/user/dashboard/milestones.tmpl b/src/templates/user/dashboard/milestones.tmpl new file mode 100644 index 0000000..ab5f02e --- /dev/null +++ b/src/templates/user/dashboard/milestones.tmpl @@ -0,0 +1,157 @@ +{{template "base/head" .}} +
    + {{template "user/dashboard/navbar" .}} +
    +
    +
    + +
    +
    + +
    + {{range .Milestones}} +
  • +
    +

    + + {{.Repo.FullName}} + + {{svg "octicon-milestone" 16}} + {{.Name}} +

    +
    + {{.Completeness}}% + +
    +
    +
    +
    +
    + {{svg "octicon-issue-opened" 14}} + {{$.locale.PrettyNumber .NumOpenIssues}} {{$.locale.Tr "repo.issues.open_title"}} +
    +
    + {{svg "octicon-check" 14}} + {{$.locale.PrettyNumber .NumClosedIssues}} {{$.locale.Tr "repo.issues.closed_title"}} +
    + {{if .TotalTrackedTime}} +
    + {{svg "octicon-clock"}} + {{.TotalTrackedTime|Sec2Time}} +
    + {{end}} + {{if .UpdatedUnix}} +
    + {{svg "octicon-clock"}} + {{$.locale.Tr "repo.milestones.update_ago" (TimeSinceUnix .UpdatedUnix $.locale) | Safe}} +
    + {{end}} +
    + {{if .IsClosed}} + {{$closedDate:= TimeSinceUnix .ClosedDateUnix $.locale}} + {{svg "octicon-clock" 14}} + {{$.locale.Tr "repo.milestones.closed" $closedDate | Safe}} + {{else}} + {{if .DeadlineString}} + + {{svg "octicon-calendar" 14}} + {{DateTime "short" .DeadlineString}} + + {{else}} + {{svg "octicon-calendar" 14}} + {{$.locale.Tr "repo.milestones.no_due_date"}} + {{end}} + {{end}} +
    +
    + {{if and (or $.CanWriteIssues $.CanWritePulls) (not $.Repository.IsArchived)}} + + {{end}} +
    + {{if .Content}} +
    + {{.RenderedContent|Str2html}} +
    + {{end}} +
  • + {{end}} + + {{template "base/paginate" .}} +
    + +
    +
    +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/user/dashboard/navbar.tmpl b/src/templates/user/dashboard/navbar.tmpl new file mode 100644 index 0000000..79212d8 --- /dev/null +++ b/src/templates/user/dashboard/navbar.tmpl @@ -0,0 +1,108 @@ +
    + +
    +
    diff --git a/src/templates/user/dashboard/repolist.tmpl b/src/templates/user/dashboard/repolist.tmpl new file mode 100644 index 0000000..44542d5 --- /dev/null +++ b/src/templates/user/dashboard/repolist.tmpl @@ -0,0 +1,59 @@ + + +
    diff --git a/src/templates/user/heatmap.tmpl b/src/templates/user/heatmap.tmpl new file mode 100644 index 0000000..b0ee0ee --- /dev/null +++ b/src/templates/user/heatmap.tmpl @@ -0,0 +1,14 @@ +{{if .HeatmapData}} +
    +
    +
    {{.locale.Tr "user.heatmap.loading"}}
    +
    +
    +
    +{{end}} diff --git a/src/templates/user/notification/notification.tmpl b/src/templates/user/notification/notification.tmpl new file mode 100644 index 0000000..b483c15 --- /dev/null +++ b/src/templates/user/notification/notification.tmpl @@ -0,0 +1,3 @@ +{{template "base/head" .}} +{{template "user/notification/notification_div" .}} +{{template "base/footer" .}} diff --git a/src/templates/user/notification/notification_div.tmpl b/src/templates/user/notification/notification_div.tmpl new file mode 100644 index 0000000..0b46e43 --- /dev/null +++ b/src/templates/user/notification/notification_div.tmpl @@ -0,0 +1,126 @@ +
    +
    + {{$notificationUnreadCount := call .NotificationUnreadCount}} +
    + + {{if and (eq .Status 1)}} +
    + {{$.CsrfTokenHtml}} +
    + +
    +
    + {{end}} +
    +
    +
    + {{if eq (len .Notifications) 0}} +
    + {{svg "octicon-inbox" 56 "gt-mb-4"}} + {{if eq .Status 1}} + {{.locale.Tr "notification.no_unread"}} + {{else}} + {{.locale.Tr "notification.no_read"}} + {{end}} +
    + {{else}} + {{$locale := .locale}} + {{range $notification := .Notifications}} +
    +
    + {{if .Issue}} + {{template "shared/issueicon" .Issue}} + {{else}} + {{svg "octicon-repo" 16 "text grey"}} + {{end}} +
    + +
    + {{.Repository.FullName}} {{if .Issue}}#{{.Issue.Index}}{{end}} + {{if eq .Status 3}} + {{svg "octicon-pin" 13 "text blue gt-mt-1 gt-ml-2"}} + {{end}} +
    +
    + + {{if .Issue}} + {{.Issue.Title | RenderEmoji $.Context | RenderCodeBlock}} + {{else}} + {{.Repository.FullName}} + {{end}} + +
    +
    +
    + {{if .Issue}} + {{TimeSinceUnix .Issue.UpdatedUnix $locale}} + {{else}} + {{TimeSinceUnix .UpdatedUnix $locale}} + {{end}} +
    +
    + {{if ne .Status 3}} +
    + {{$.CsrfTokenHtml}} + + + +
    + {{end}} + {{if or (eq .Status 1) (eq .Status 3)}} +
    + {{$.CsrfTokenHtml}} + + + + +
    + {{else if eq .Status 2}} +
    + {{$.CsrfTokenHtml}} + + + + +
    + {{end}} +
    +
    + {{end}} + {{end}} +
    +
    + {{template "base/paginate" .}} +
    +
    diff --git a/src/templates/user/notification/notification_subscriptions.tmpl b/src/templates/user/notification/notification_subscriptions.tmpl new file mode 100644 index 0000000..df69a4d --- /dev/null +++ b/src/templates/user/notification/notification_subscriptions.tmpl @@ -0,0 +1,79 @@ +{{template "base/head" .}} +
    +
    + +
    + {{if eq .Status 1}} + + {{if eq (len .Issues) 0}} +
    + {{.locale.Tr "notification.no_subscriptions"}} + {{else}} + {{template "shared/issuelist" dict "." . "listType" "dashboard"}} + {{end}} + {{else}} + {{template "explore/repo_search" .}} + {{template "explore/repo_list" .}} + {{template "base/paginate" .}} + {{end}} +
    +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/user/overview/header.tmpl b/src/templates/user/overview/header.tmpl new file mode 100644 index 0000000..6016aca --- /dev/null +++ b/src/templates/user/overview/header.tmpl @@ -0,0 +1,92 @@ + +{{if or (.IsPackagesPage) (.PageIsViewProjects)}} + {{with .ContextUser}} +
    +
    +
    +
    + {{avatar $.Context . 100}} + {{.DisplayName}} + + {{if .Visibility.IsLimited}}
    {{$.locale.Tr "org.settings.visibility.limited_shortname"}}
    {{end}} + {{if .Visibility.IsPrivate}}
    {{$.locale.Tr "org.settings.visibility.private_shortname"}}
    {{end}} +
    +
    +
    +
    +
    + {{end}} +{{end}} + +
    + +
    diff --git a/src/templates/user/overview/package_versions.tmpl b/src/templates/user/overview/package_versions.tmpl new file mode 100644 index 0000000..0bab740 --- /dev/null +++ b/src/templates/user/overview/package_versions.tmpl @@ -0,0 +1,6 @@ +{{template "base/head" .}} +
    + {{template "user/overview/header" .}} + {{template "package/shared/versionlist" .}} +
    +{{template "base/footer" .}} diff --git a/src/templates/user/overview/packages.tmpl b/src/templates/user/overview/packages.tmpl new file mode 100644 index 0000000..8f8597c --- /dev/null +++ b/src/templates/user/overview/packages.tmpl @@ -0,0 +1,6 @@ +{{template "base/head" .}} +
    + {{template "user/overview/header" .}} + {{template "package/shared/list" .}} +
    +{{template "base/footer" .}} diff --git a/src/templates/user/profile.tmpl b/src/templates/user/profile.tmpl new file mode 100644 index 0000000..51d4a46 --- /dev/null +++ b/src/templates/user/profile.tmpl @@ -0,0 +1,159 @@ +{{template "base/head" .}} +
    +
    +
    +
    +
    + +
    + {{if .ContextUser.FullName}}{{.ContextUser.FullName}}{{end}} + {{.ContextUser.Name}} + {{if .EnableFeed}} + {{svg "octicon-rss" 18}} + {{end}} + +
    +
    +
      + {{if .ContextUser.Location}} +
    • {{svg "octicon-location"}} {{.ContextUser.Location}}
    • + {{end}} + {{if (eq .SignedUserID .ContextUser.ID)}} +
    • + {{svg "octicon-mail"}} + {{.ContextUser.Email}} + + {{if .ShowUserEmail}} + + {{svg "octicon-unlock"}} + + {{else}} + + {{svg "octicon-lock"}} + + {{end}} + +
    • + {{else}} + {{if .ShowUserEmail}} +
    • + {{svg "octicon-mail"}} + {{.ContextUser.Email}} +
    • + {{end}} + {{end}} + {{if .ContextUser.Website}} +
    • + {{svg "octicon-link"}} + {{.ContextUser.Website}} +
    • + {{end}} + {{if $.RenderedDescription}} +
    • +
      {{$.RenderedDescription|Str2html}}
      +
    • + {{end}} + {{range .OpenIDs}} + {{if .Show}} +
    • + {{svg "fontawesome-openid"}} + {{.URI}} +
    • + {{end}} + {{end}} +
    • {{svg "octicon-clock"}} {{.locale.Tr "user.joined_on" (DateTime "short" .ContextUser.CreatedUnix) | Safe}}
    • + {{if and .Orgs .HasOrgsVisible}} +
    • +
        + {{range .Orgs}} + {{if (or .Visibility.IsPublic (and ($.SignedUser) (or .Visibility.IsLimited (and (.HasMemberWithUserID $.SignedUserID) .Visibility.IsPrivate) ($.IsAdmin))))}} +
      • + + {{avatar $.Context .}} + +
      • + {{end}} + {{end}} +
      +
    • + {{end}} + {{if .Badges}} +
    • +
        + {{range .Badges}} +
      • + {{.Description}} +
      • + {{end}} +
      +
    • + {{end}} + {{if and .IsSigned (ne .SignedUserID .ContextUser.ID)}} + + {{end}} +
    +
    +
    +
    +
    +
    + {{template "user/overview/header" .}} +
    + + {{if eq .TabName "activity"}} + {{if .ContextUser.KeepActivityPrivate}} +
    +

    {{.locale.Tr "user.disabled_public_activity"}}

    +
    + {{end}} + {{template "user/heatmap" .}} +
    + {{template "user/dashboard/feeds" .}} +
    + {{else if eq .TabName "stars"}} +
    + {{template "explore/repo_search" .}} + {{template "explore/repo_list" .}} + {{template "base/paginate" .}} +
    + {{else if eq .TabName "following"}} + {{template "repo/user_cards" .}} + {{else if eq .TabName "followers"}} + {{template "repo/user_cards" .}} + {{else if or (eq .TabName "repositories") (not .ProfileReadme)}} + {{template "explore/repo_search" .}} + {{template "explore/repo_list" .}} + {{template "base/paginate" .}} + {{else if .ProfileReadme}} +
    {{$.ProfileReadme|Str2html}}
    + {{end}} +
    +
    +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/user/settings/account.tmpl b/src/templates/user/settings/account.tmpl new file mode 100644 index 0000000..01f70e4 --- /dev/null +++ b/src/templates/user/settings/account.tmpl @@ -0,0 +1,186 @@ +{{template "user/settings/layout_head" (dict "ctxData" . "pageClass" "user settings account")}} +
    +

    + {{.locale.Tr "settings.password"}} +

    +
    + {{if or (.SignedUser.IsLocal) (.SignedUser.IsOAuth2)}} +
    + {{template "base/disable_form_autofill"}} + {{.CsrfTokenHtml}} + {{if .SignedUser.IsPasswordSet}} +
    + + +
    + {{end}} +
    + + +
    +
    + + +
    + +
    + + {{.locale.Tr "auth.forgot_password"}} +
    +
    + {{else}} +
    +

    {{$.locale.Tr "settings.password_change_disabled"}}

    +
    + {{end}} +
    + +

    + {{.locale.Tr "settings.manage_emails"}} +

    +
    + +
    +
    +
    + {{.CsrfTokenHtml}} +
    + + +
    + +
    + {{/* if ActivationsPending is false, then CanAddEmails must be true, so if CanAddEmails is false, ActivationsPending must be true */}} + {{if not .CanAddEmails}} +
    {{.locale.Tr "settings.can_not_add_email_activations_pending"}}
    + {{end}} +
    + +

    + {{.locale.Tr "settings.delete_account"}} +

    +
    +
    +

    {{svg "octicon-alert"}} {{.locale.Tr "settings.delete_prompt" | Str2html}}

    + {{if .UserDeleteWithComments}} +

    {{.locale.Tr "settings.delete_with_all_comments" .UserDeleteWithCommentsMaxTime | Str2html}}

    + {{end}} +
    +
    + {{template "base/disable_form_autofill"}} + {{.CsrfTokenHtml}} +
    + + +
    +
    + + {{.locale.Tr "auth.forgot_password"}} +
    +
    +
    +
    + + + + + +{{template "user/settings/layout_footer" .}} diff --git a/src/templates/user/settings/actions.tmpl b/src/templates/user/settings/actions.tmpl new file mode 100644 index 0000000..57cdae4 --- /dev/null +++ b/src/templates/user/settings/actions.tmpl @@ -0,0 +1,10 @@ +{{template "user/settings/layout_head" (dict "ctxData" . "pageClass" "user settings actions")}} +
    + {{if eq .PageType "secrets"}} + {{template "shared/secrets/add_list" .}} + {{else if eq .PageType "runners"}} + {{template "shared/actions/runner_list" .}} + {{end}} +
    + +{{template "user/settings/layout_footer" .}} diff --git a/src/templates/user/settings/appearance.tmpl b/src/templates/user/settings/appearance.tmpl new file mode 100644 index 0000000..129fca2 --- /dev/null +++ b/src/templates/user/settings/appearance.tmpl @@ -0,0 +1,170 @@ +{{template "user/settings/layout_head" (dict "ctxData" . "pageClass" "user settings sshkeys")}} +
    + + +

    + {{.locale.Tr "settings.manage_themes"}} +

    +
    + +
    + + +

    + {{.locale.Tr "settings.language"}} +

    +
    +
    + {{.CsrfTokenHtml}} +
    + +
    +
    + +
    +
    +
    + + +

    + {{.locale.Tr "settings.hidden_comment_types"}} +

    +
    +

    + {{.locale.Tr "settings.hidden_comment_types_description"}} +

    +
    + {{.CsrfTokenHtml}} +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    + +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    + +
    +
    +
    +
    +{{template "user/settings/layout_footer" .}} diff --git a/src/templates/user/settings/applications.tmpl b/src/templates/user/settings/applications.tmpl new file mode 100644 index 0000000..b889f9c --- /dev/null +++ b/src/templates/user/settings/applications.tmpl @@ -0,0 +1,110 @@ +{{template "user/settings/layout_head" (dict "ctxData" . "pageClass" "user settings applications")}} +
    +

    + {{.locale.Tr "settings.manage_access_token"}} +

    +
    +
    +
    + {{.locale.Tr "settings.tokens_desc"}} +
    + {{range .Tokens}} +
    +
    + +
    + {{svg "fontawesome-send" 36}} +
    +
    {{.Name}} +

    + {{$.locale.Tr "settings.repo_and_org_access"}}: + {{if .DisplayPublicOnly}} + {{$.locale.Tr "settings.permissions_public_only"}} + {{else}} + {{$.locale.Tr "settings.permissions_access_all"}} + {{end}} +

    +

    {{$.locale.Tr "settings.permissions_list"}}

    +
      + {{range .Scope.StringSlice}} + {{if (ne . $.AccessTokenScopePublicOnly)}} +
    • {{.}}
    • + {{end}} + {{end}} +
    +
    +
    + {{$.locale.Tr "settings.added_on" (DateTime "short" .CreatedUnix) | Safe}} — {{svg "octicon-info"}} {{if .HasUsed}}{{$.locale.Tr "settings.last_used"}} {{DateTime "short" .UpdatedUnix}}{{else}}{{$.locale.Tr "settings.no_activity"}}{{end}} +
    +
    +
    + {{end}} +
    +
    +
    +
    + {{.locale.Tr "settings.generate_new_token"}} +
    +
    + {{.CsrfTokenHtml}} +
    + + +
    +
    + + + +
    +
    + + {{.locale.Tr "settings.select_permissions"}} + +

    + {{$.locale.Tr "settings.access_token_desc" (printf `href="/api/swagger" target="_blank"`) (printf `href="https://docs.gitea.com/development/oauth2-provider#scopes" target="_blank"`) | Str2html}} +

    +
    + +
    +
    +
    + {{.locale.Tr "settings.at_least_one_permission"}} +
    + +
    +
    + + {{if .EnableOAuth2}} + {{template "user/settings/grants_oauth2" .}} + {{template "user/settings/applications_oauth2" .}} + {{end}} +
    + + + +{{template "user/settings/layout_footer" .}} diff --git a/src/templates/user/settings/applications_oauth2.tmpl b/src/templates/user/settings/applications_oauth2.tmpl new file mode 100644 index 0000000..47d8dfc --- /dev/null +++ b/src/templates/user/settings/applications_oauth2.tmpl @@ -0,0 +1,6 @@ +

    + {{.locale.Tr "settings.manage_oauth2_applications"}} +

    + +{{template "user/settings/applications_oauth2_list" .}} + diff --git a/src/templates/user/settings/applications_oauth2_edit.tmpl b/src/templates/user/settings/applications_oauth2_edit.tmpl new file mode 100644 index 0000000..2858ecd --- /dev/null +++ b/src/templates/user/settings/applications_oauth2_edit.tmpl @@ -0,0 +1,6 @@ +{{template "user/settings/layout_head" (dict "ctxData" . "pageClass" "user settings applications")}} +
    + + {{template "user/settings/applications_oauth2_edit_form" .}} +
    +{{template "user/settings/layout_footer" .}} diff --git a/src/templates/user/settings/applications_oauth2_edit_form.tmpl b/src/templates/user/settings/applications_oauth2_edit_form.tmpl new file mode 100644 index 0000000..74a0e13 --- /dev/null +++ b/src/templates/user/settings/applications_oauth2_edit_form.tmpl @@ -0,0 +1,52 @@ +

    + {{.locale.Tr "settings.edit_oauth2_application"}} +

    +
    +

    {{.locale.Tr "settings.oauth2_application_create_description"}}

    +
    +
    + {{.CsrfTokenHtml}} +
    + + +
    + {{if .ClientSecret}} +
    + + +
    + {{else}} +
    + + +
    + {{end}} +
    + +
    + {{.CsrfTokenHtml}} + {{.locale.Tr "settings.oauth2_regenerate_secret_hint"}} + +
    +
    +
    +
    +
    + {{.CsrfTokenHtml}} +
    + + +
    +
    + + +
    +
    + + +
    + +
    +
    diff --git a/src/templates/user/settings/applications_oauth2_list.tmpl b/src/templates/user/settings/applications_oauth2_list.tmpl new file mode 100644 index 0000000..e18c7f5 --- /dev/null +++ b/src/templates/user/settings/applications_oauth2_list.tmpl @@ -0,0 +1,59 @@ +
    +
    +
    + {{.locale.Tr "settings.oauth2_application_create_description"}} +
    + {{range $app := .Applications}} +
    +
    + + {{svg "octicon-pencil" 16 "gt-mr-2"}} + {{$.locale.Tr "settings.oauth2_application_edit"}} + + +
    +
    + {{$app.Name}} +
    +
    + {{end}} +
    +
    +
    +
    + {{.locale.Tr "settings.create_oauth2_application"}} +
    +
    + {{.CsrfTokenHtml}} +
    + + +
    +
    + + +
    +
    + + +
    + +
    +
    + + diff --git a/src/templates/user/settings/grants_oauth2.tmpl b/src/templates/user/settings/grants_oauth2.tmpl new file mode 100644 index 0000000..8dd9ca2 --- /dev/null +++ b/src/templates/user/settings/grants_oauth2.tmpl @@ -0,0 +1,40 @@ +

    + {{.locale.Tr "settings.authorized_oauth2_applications"}} +

    +
    +
    +
    + {{.locale.Tr "settings.authorized_oauth2_applications_description"}} +
    + {{range $grant := .Grants}} +
    +
    + +
    +
    + {{svg "octicon-key"}} +
    +
    + {{$grant.Application.Name}} +
    + {{$.locale.Tr "settings.added_on" (DateTime "short" $grant.CreatedUnix) | Safe}} +
    +
    +
    + {{end}} +
    +
    + + diff --git a/src/templates/user/settings/hook_new.tmpl b/src/templates/user/settings/hook_new.tmpl new file mode 100644 index 0000000..ac32cdd --- /dev/null +++ b/src/templates/user/settings/hook_new.tmpl @@ -0,0 +1,49 @@ +{{template "user/settings/layout_head" (dict "ctxData" . "pageClass" "user settings new webhook")}} +
    +
    +

    + {{if .PageIsSettingsHooksNew}}{{.locale.Tr "repo.settings.add_webhook"}}{{else}}{{.locale.Tr "repo.settings.update_webhook"}}{{end}} +
    + {{if eq .HookType "gitea"}} + + {{else if eq .HookType "gogs"}} + + {{else if eq .HookType "slack"}} + + {{else if eq .HookType "discord"}} + + {{else if eq .HookType "dingtalk"}} + + {{else if eq .HookType "telegram"}} + + {{else if eq .HookType "msteams"}} + + {{else if eq .HookType "feishu"}} + + {{else if eq .HookType "matrix"}} + + {{else if eq .HookType "wechatwork"}} + + {{else if eq .HookType "packagist"}} + + {{end}} +
    +

    +
    + {{template "repo/settings/webhook/gitea" .}} + {{template "repo/settings/webhook/gogs" .}} + {{template "repo/settings/webhook/slack" .}} + {{template "repo/settings/webhook/discord" .}} + {{template "repo/settings/webhook/dingtalk" .}} + {{template "repo/settings/webhook/telegram" .}} + {{template "repo/settings/webhook/msteams" .}} + {{template "repo/settings/webhook/feishu" .}} + {{template "repo/settings/webhook/matrix" .}} + {{template "repo/settings/webhook/wechatwork" .}} + {{template "repo/settings/webhook/packagist" .}} +
    + + {{template "repo/settings/webhook/history" .}} +
    +
    +{{template "user/settings/layout_footer" .}} diff --git a/src/templates/user/settings/hooks.tmpl b/src/templates/user/settings/hooks.tmpl new file mode 100644 index 0000000..477c333 --- /dev/null +++ b/src/templates/user/settings/hooks.tmpl @@ -0,0 +1,5 @@ +{{template "user/settings/layout_head" (dict "ctxData" . "pageClass" "user settings webhooks")}} +
    + {{template "repo/settings/webhook/list" .}} +
    +{{template "user/settings/layout_footer" .}} diff --git a/src/templates/user/settings/keys.tmpl b/src/templates/user/settings/keys.tmpl new file mode 100644 index 0000000..93037e7 --- /dev/null +++ b/src/templates/user/settings/keys.tmpl @@ -0,0 +1,7 @@ +{{template "user/settings/layout_head" (dict "ctxData" . "pageClass" "user settings sshkeys")}} +
    + {{template "user/settings/keys_ssh" .}} + {{template "user/settings/keys_principal" .}} + {{template "user/settings/keys_gpg" .}} +
    +{{template "user/settings/layout_footer" .}} diff --git a/src/templates/user/settings/keys_gpg.tmpl b/src/templates/user/settings/keys_gpg.tmpl new file mode 100644 index 0000000..f442e8b --- /dev/null +++ b/src/templates/user/settings/keys_gpg.tmpl @@ -0,0 +1,123 @@ +

    + {{.locale.Tr "settings.manage_gpg_keys"}} +
    + +
    +

    +
    +
    +
    + {{.CsrfTokenHtml}} + +
    + + +
    + {{if .Err_Signature}} +
    +

    {{.locale.Tr "settings.gpg_token_required"}}

    +
    +
    +
    +
    + + +
    + {{end}} + + + +
    +
    +
    +
    + {{.locale.Tr "settings.gpg_desc"}} +
    + {{range .GPGKeys}} +
    +
    + + {{if and (not .Verified) (ne $.VerifyingID .KeyID)}} + {{$.locale.Tr "settings.gpg_key_verify"}} + {{end}} +
    +
    + {{svg "octicon-key" 32}} +
    +
    + {{if .Verified}} + {{svg "octicon-verified"}} {{$.locale.Tr "settings.gpg_key_verified"}} + {{end}} + {{if gt (len .Emails) 0}} + {{svg "octicon-mail"}} {{$.locale.Tr "settings.gpg_key_matched_identities"}} {{range .Emails}}{{.Email}} {{end}} + {{end}} +
    + {{$.locale.Tr "settings.key_id"}}: {{.PaddedKeyID}} + {{$.locale.Tr "settings.subkeys"}}: {{range .SubsKey}} {{.PaddedKeyID}} {{end}} +
    +
    + {{$.locale.Tr "settings.added_on" (DateTime "short" .AddedUnix) | Safe}} + - + {{if not .ExpiredUnix.IsZero}}{{$.locale.Tr "settings.valid_until_date" (DateTime "short" .ExpiredUnix) | Safe}}{{else}}{{$.locale.Tr "settings.valid_forever"}}{{end}} +
    +
    +
    + {{if and (not .Verified) (eq $.VerifyingID .KeyID)}} +
    +

    {{$.locale.Tr "settings.gpg_token_required"}}

    +
    + {{$.CsrfTokenHtml}} + + + +
    + + +
    +

    {{$.locale.Tr "settings.gpg_token_help"}}

    +

    {{$.locale.Tr "settings.gpg_token_code" $.TokenToSign .PaddedKeyID}}

    +
    +
    +
    +
    + + +
    + + + + {{$.locale.Tr "settings.cancel"}} + +
    +
    + {{end}} + {{end}} +
    +
    +
    +

    {{.locale.Tr "settings.gpg_helper" "https://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/about-commit-signature-verification#gpg-commit-signature-verification" | Str2html}}

    + + diff --git a/src/templates/user/settings/keys_principal.tmpl b/src/templates/user/settings/keys_principal.tmpl new file mode 100644 index 0000000..7dda666 --- /dev/null +++ b/src/templates/user/settings/keys_principal.tmpl @@ -0,0 +1,67 @@ +{{if .AllowPrincipals}} +

    + {{.locale.Tr "settings.manage_ssh_principals"}} +
    + {{if not .DisableSSH}} + + {{else}} + + {{end}} +
    +

    +
    +
    +
    + {{.locale.Tr "settings.principal_desc"}} +
    + {{range .Principals}} +
    +
    + +
    + {{svg "octicon-key" 36}} +
    + {{.Name}} +
    + {{$.locale.Tr "settings.added_on" (DateTime "short" .CreatedUnix) | Safe}} — {{svg "octicon-info" 16}} {{if .HasUsed}}{{$.locale.Tr "settings.last_used"}} {{DateTime "short" .UpdatedUnix}}{{else}}{{$.locale.Tr "settings.no_activity"}}{{end}} +
    +
    +
    + {{end}} +
    +
    +
    + +
    +

    + {{.locale.Tr "settings.add_new_principal"}} +

    +
    +
    + {{.CsrfTokenHtml}} +
    + + +
    + + + +
    +
    +
    + + +{{end}} diff --git a/src/templates/user/settings/keys_ssh.tmpl b/src/templates/user/settings/keys_ssh.tmpl new file mode 100644 index 0000000..0a47c44 --- /dev/null +++ b/src/templates/user/settings/keys_ssh.tmpl @@ -0,0 +1,112 @@ +

    + {{.locale.Tr "settings.manage_ssh_keys"}} +
    + +
    +

    +
    +
    +
    + {{.CsrfTokenHtml}} +
    + + +
    +
    + + +
    + + + +
    +
    +
    +
    + {{.locale.Tr "settings.ssh_desc"}} +
    + {{if .DisableSSH}} +
    + {{.locale.Tr "settings.ssh_signonly"}} +
    + {{end}} + {{range $index, $key := .Keys}} +
    +
    + + {{if and (not .Verified) (ne $.VerifyingFingerprint .Fingerprint)}} + {{$.locale.Tr "settings.ssh_key_verify"}} + {{end}} + +
    +
    + {{svg "octicon-key" 32}} +
    +
    + {{if .Verified}} + {{svg "octicon-verified"}} {{$.locale.Tr "settings.ssh_key_verified"}} + {{end}} + {{.Name}} +
    + {{.Fingerprint}} +
    +
    + {{$.locale.Tr "settings.added_on" (DateTime "short" .CreatedUnix) | Safe}} — {{svg "octicon-info"}} {{if .HasUsed}}{{$.locale.Tr "settings.last_used"}} {{DateTime "short" .UpdatedUnix}}{{else}}{{$.locale.Tr "settings.no_activity"}}{{end}} +
    +
    +
    + {{if and (not .Verified) (eq $.VerifyingFingerprint .Fingerprint)}} +
    +

    {{$.locale.Tr "settings.ssh_token_required"}}

    +
    + {{$.CsrfTokenHtml}} + + + +
    + + +
    +

    {{$.locale.Tr "settings.ssh_token_help"}}

    +

    {{printf "echo -n '%s' | ssh-keygen -Y sign -n gitea -f /path_to_your_privkey" $.TokenToSign}}

    +
    +
    +
    +
    + + +
    + + + + {{$.locale.Tr "settings.cancel"}} + +
    +
    + {{end}} + {{end}} +
    +
    +
    +

    {{.locale.Tr "settings.ssh_helper" "https://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/connecting-to-github-with-ssh" "https://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/troubleshooting-ssh" | Str2html}}

    + + diff --git a/src/templates/user/settings/layout_footer.tmpl b/src/templates/user/settings/layout_footer.tmpl new file mode 100644 index 0000000..46120d5 --- /dev/null +++ b/src/templates/user/settings/layout_footer.tmpl @@ -0,0 +1,11 @@ +{{if false}}{{/* to make html structure "likely" complete to prevent IDE warnings */}} +
    +
    +
    + {{/* block: user-setting-content */}} +{{end}} + +
    +
    +
    +{{template "base/footer" .}} diff --git a/src/templates/user/settings/layout_head.tmpl b/src/templates/user/settings/layout_head.tmpl new file mode 100644 index 0000000..26d1653 --- /dev/null +++ b/src/templates/user/settings/layout_head.tmpl @@ -0,0 +1,13 @@ +{{template "base/head" .ctxData}} +
    +
    + {{template "user/settings/navbar" .ctxData}} +
    + {{template "base/alert" .ctxData}} + {{/* block: user-setting-content */}} + +{{if false}}{{/* to make html structure "likely" complete to prevent IDE warnings */}} +
    +
    +
    +{{end}} diff --git a/src/templates/user/settings/navbar.tmpl b/src/templates/user/settings/navbar.tmpl new file mode 100644 index 0000000..4ef2abe --- /dev/null +++ b/src/templates/user/settings/navbar.tmpl @@ -0,0 +1,52 @@ + diff --git a/src/templates/user/settings/organization.tmpl b/src/templates/user/settings/organization.tmpl new file mode 100644 index 0000000..9b6d0f6 --- /dev/null +++ b/src/templates/user/settings/organization.tmpl @@ -0,0 +1,50 @@ +{{template "user/settings/layout_head" (dict "ctxData" . "pageClass" "user settings organization")}} +
    +

    + {{.locale.Tr "settings.orgs"}} + {{if .SignedUser.CanCreateOrganization}} + + {{end}} +

    +
    + {{if .Orgs}} +
    + {{range .Orgs}} +
    +
    +
    + {{$.CsrfTokenHtml}} + +
    +
    +
    + {{avatar $.Context . 28 "mini"}} + {{.Name}} +
    +
    + {{end}} +
    + {{template "base/paginate" .}} + {{else}} + {{.locale.Tr "settings.orgs_none"}} + {{end}} +
    +
    + + + +{{template "user/settings/layout_footer" .}} diff --git a/src/templates/user/settings/packages.tmpl b/src/templates/user/settings/packages.tmpl new file mode 100644 index 0000000..4f70b9e --- /dev/null +++ b/src/templates/user/settings/packages.tmpl @@ -0,0 +1,25 @@ +{{template "user/settings/layout_head" (dict "ctxData" . "pageClass" "user settings packages")}} +
    + {{template "package/shared/cleanup_rules/list" .}} + {{template "package/shared/cargo" .}} + +

    + {{.locale.Tr "packages.owner.settings.chef.title"}} +

    +
    +
    +
    + +
    +
    + {{.CsrfTokenHtml}} + +
    +
    + +
    +
    +
    +
    +
    +{{template "user/settings/layout_footer" .}} diff --git a/src/templates/user/settings/packages_cleanup_rules_edit.tmpl b/src/templates/user/settings/packages_cleanup_rules_edit.tmpl new file mode 100644 index 0000000..522b524 --- /dev/null +++ b/src/templates/user/settings/packages_cleanup_rules_edit.tmpl @@ -0,0 +1,5 @@ +{{template "user/settings/layout_head" (dict "ctxData" . "pageClass" "user settings packages")}} +
    + {{template "package/shared/cleanup_rules/edit" .}} +
    +{{template "user/settings/layout_footer" .}} diff --git a/src/templates/user/settings/packages_cleanup_rules_preview.tmpl b/src/templates/user/settings/packages_cleanup_rules_preview.tmpl new file mode 100644 index 0000000..d99aee4 --- /dev/null +++ b/src/templates/user/settings/packages_cleanup_rules_preview.tmpl @@ -0,0 +1,5 @@ +{{template "user/settings/layout_head" (dict "ctxData" . "pageClass" "user packages admin")}} +
    + {{template "package/shared/cleanup_rules/preview" .}} +
    +{{template "user/settings/layout_footer" .}} diff --git a/src/templates/user/settings/profile.tmpl b/src/templates/user/settings/profile.tmpl new file mode 100644 index 0000000..a581b13 --- /dev/null +++ b/src/templates/user/settings/profile.tmpl @@ -0,0 +1,133 @@ +{{template "user/settings/layout_head" (dict "ctxData" . "pageClass" "user settings profile")}} +
    +

    + {{.locale.Tr "settings.public_profile"}} +

    +
    +

    {{.locale.Tr "settings.profile_desc"}}

    +
    + {{.CsrfTokenHtml}} +
    + + + {{if or (not .SignedUser.IsLocal) .IsReverseProxy}} +

    {{$.locale.Tr "settings.password_username_disabled"}}

    + {{end}} +
    +
    + + +
    +
    + +

    {{.SignedUser.Email}}

    +
    +
    +
    + + +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    + +
    + + +
    + +
    + +
    + + +
    + +
    +
    + + +
    +
    + +
    + +
    + +
    +
    +
    + +

    + {{.locale.Tr "settings.avatar"}} +

    +
    +
    + {{.CsrfTokenHtml}} + {{if not (DisableGravatar $.Context)}} +
    +
    + + +
    +
    +
    + + +
    + {{end}} + +
    +
    + + +
    +
    + +
    + + +
    + +
    + + +
    +
    +
    +
    +{{template "user/settings/layout_footer" .}} diff --git a/src/templates/user/settings/repos.tmpl b/src/templates/user/settings/repos.tmpl new file mode 100644 index 0000000..4738f5b --- /dev/null +++ b/src/templates/user/settings/repos.tmpl @@ -0,0 +1,130 @@ +{{template "user/settings/layout_head" (dict "ctxData" . "pageClass" "user settings repos")}} +
    +

    + {{.locale.Tr "settings.repos"}} +

    +
    + {{if or .allowAdopt .allowDelete}} + {{if .Dirs}} +
    + {{range $dirI, $dir := .Dirs}} + {{$repo := index $.ReposMap $dir}} +
    {{/* if not repo, then there are "adapt" buttons, so the padding shouldn't be that default large*/}} +
    + {{if $repo}} + {{if $repo.IsPrivate}} + {{svg "octicon-lock"}} + {{else if $repo.IsFork}} + {{svg "octicon-repo-forked"}} + {{else if $repo.IsMirror}} + {{svg "octicon-mirror"}} + {{else if $repo.IsTemplate}} + {{svg "octicon-repo-template"}} + {{else}} + {{svg "octicon-repo"}} + {{end}} + {{$repo.OwnerName}}/{{$repo.Name}} + {{FileSize $repo.Size}} + {{if $repo.IsFork}} + {{$.locale.Tr "repo.forked_from"}} + {{$repo.BaseRepo.OwnerName}}/{{$repo.BaseRepo.Name}} + {{end}} + {{else}} + {{svg "octicon-file-directory-fill"}} + {{$.ContextUser.Name}}/{{$dir}} +
    + {{if $.allowAdopt}} + + + {{end}} + {{if $.allowDelete}} + + + {{end}} +
    + {{end}} +
    +
    + {{end}} +
    + {{template "base/paginate" .}} + {{else}} +
    + {{.locale.Tr "settings.repos_none"}} +
    + {{end}} + {{else}} + {{if .Repos}} +
    + {{range .Repos}} +
    +
    + {{if .IsPrivate}} + {{svg "octicon-lock" 16 "gt-mr-2 iconFloat text gold"}} + {{else if .IsFork}} + {{svg "octicon-repo-forked" 16 "gt-mr-2 iconFloat"}} + {{else if .IsMirror}} + {{svg "octicon-mirror" 16 "gt-mr-2 iconFloat"}} + {{else if .IsTemplate}} + {{svg "octicon-repo-template" 16 "gt-mr-2 iconFloat"}} + {{else}} + {{svg "octicon-repo" 16 "gt-mr-2 iconFloat"}} + {{end}} + {{.OwnerName}}/{{.Name}} + {{FileSize .Size}} + {{if .IsFork}} + {{$.locale.Tr "repo.forked_from"}} + {{.BaseRepo.OwnerName}}/{{.BaseRepo.Name}} + {{end}} +
    +
    + {{end}} +
    + {{template "base/paginate" .}} + {{else}} +
    + {{.locale.Tr "settings.repos_none"}} +
    + {{end}} + {{end}} +
    +
    + + + +{{template "user/settings/layout_footer" .}} diff --git a/src/templates/user/settings/runner_edit.tmpl b/src/templates/user/settings/runner_edit.tmpl new file mode 100644 index 0000000..90c58c1 --- /dev/null +++ b/src/templates/user/settings/runner_edit.tmpl @@ -0,0 +1,5 @@ +{{template "user/settings/layout_head" (dict "ctxData" . "pageClass" "user settings runners")}} +
    + {{template "shared/actions/runner_edit" .}} +
    +{{template "user/settings/layout_footer" .}} diff --git a/src/templates/user/settings/security/accountlinks.tmpl b/src/templates/user/settings/security/accountlinks.tmpl new file mode 100644 index 0000000..bcf432f --- /dev/null +++ b/src/templates/user/settings/security/accountlinks.tmpl @@ -0,0 +1,53 @@ +

    + {{.locale.Tr "settings.manage_account_links"}} + {{if .OrderedOAuth2Names}} +
    + +
    + {{end}} +

    + +
    +
    +
    + {{.locale.Tr "settings.manage_account_links_desc"}} +
    + {{if .AccountLinks}} + {{range $loginSource, $provider := .AccountLinks}} +
    +
    + + {{$loginSource.Name}} + {{if $loginSource.IsActive}}{{$.locale.Tr "repo.settings.active"}}{{end}} + +
    + +
    + {{end}} + {{end}} +
    +
    + + diff --git a/src/templates/user/settings/security/openid.tmpl b/src/templates/user/settings/security/openid.tmpl new file mode 100644 index 0000000..2719b3b --- /dev/null +++ b/src/templates/user/settings/security/openid.tmpl @@ -0,0 +1,63 @@ +

    + {{.locale.Tr "settings.manage_openid"}} +

    +
    +
    +
    + {{.locale.Tr "settings.openid_desc"}} +
    + {{range .OpenIDs}} +
    +
    + +
    +
    +
    + {{$.CsrfTokenHtml}} + + {{if .Show}} + + {{else}} + + {{end}} + +
    +
    +
    + {{.URI}} +
    +
    + {{end}} +
    +
    +
    +
    + {{.CsrfTokenHtml}} +
    + + +
    + +
    +
    + + diff --git a/src/templates/user/settings/security/security.tmpl b/src/templates/user/settings/security/security.tmpl new file mode 100644 index 0000000..aee0456 --- /dev/null +++ b/src/templates/user/settings/security/security.tmpl @@ -0,0 +1,11 @@ +{{template "user/settings/layout_head" (dict "ctxData" . "pageClass" "user settings security")}} +
    + {{template "user/settings/security/twofa" .}} + {{template "user/settings/security/webauthn" .}} + {{template "user/settings/security/accountlinks" .}} + {{if .EnableOpenIDSignIn}} + {{template "user/settings/security/openid" .}} + {{end}} +
    + +{{template "user/settings/layout_footer" .}} diff --git a/src/templates/user/settings/security/twofa.tmpl b/src/templates/user/settings/security/twofa.tmpl new file mode 100644 index 0000000..43f324f --- /dev/null +++ b/src/templates/user/settings/security/twofa.tmpl @@ -0,0 +1,35 @@ +

    + {{.locale.Tr "settings.twofa"}} +

    +
    +

    {{.locale.Tr "settings.twofa_desc"}}

    + {{if .TOTPEnrolled}} +

    {{$.locale.Tr "settings.twofa_is_enrolled" | Str2html}}

    +
    + {{.CsrfTokenHtml}} +

    {{.locale.Tr "settings.regenerate_scratch_token_desc"}}

    + +
    +
    + {{.CsrfTokenHtml}} +

    {{.locale.Tr "settings.twofa_disable_note"}}

    + +
    + {{else}} +

    {{.locale.Tr "settings.twofa_not_enrolled"}}

    + + {{end}} +
    + + diff --git a/src/templates/user/settings/security/twofa_enroll.tmpl b/src/templates/user/settings/security/twofa_enroll.tmpl new file mode 100644 index 0000000..0ff0beb --- /dev/null +++ b/src/templates/user/settings/security/twofa_enroll.tmpl @@ -0,0 +1,25 @@ +{{template "user/settings/layout_head" (dict "ctxData" . "pageClass" "user settings twofa")}} +
    +

    + {{.locale.Tr "settings.twofa_enroll"}} +

    +
    +

    {{.locale.Tr "settings.scan_this_image"}}

    + {{.TwofaSecret}} +

    {{.locale.Tr "settings.or_enter_secret" .TwofaSecret}} +

    {{.locale.Tr "settings.then_enter_passcode"}} +

    + {{.CsrfTokenHtml}} +
    + + +
    +
    + + +
    +
    +
    +
    + +{{template "user/settings/layout_footer" .}} diff --git a/src/templates/user/settings/security/webauthn.tmpl b/src/templates/user/settings/security/webauthn.tmpl new file mode 100644 index 0000000..ec1df7c --- /dev/null +++ b/src/templates/user/settings/security/webauthn.tmpl @@ -0,0 +1,38 @@ +

    {{.locale.Tr "settings.webauthn"}}

    +
    +

    {{.locale.Tr "settings.webauthn_desc" | Str2html}}

    + {{template "user/auth/webauthn_error" .}} +
    + {{range .WebAuthnCredentials}} +
    +
    + +
    +
    + {{.Name}} +
    + {{TimeSinceUnix .CreatedUnix $.locale}} +
    + {{end}} +
    +
    +
    + + +
    + +
    +
    + + diff --git a/src/themes/fonts/KaTeX_AMS-Regular.73ea273a.woff2 b/src/themes/fonts/KaTeX_AMS-Regular.73ea273a.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..0acaaff03d4bb7606de02a827aeee338e5a86910 GIT binary patch literal 28076 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 G2<`xUL{2yW literal 0 HcmV?d00001 diff --git a/src/themes/fonts/KaTeX_Caligraphic-Regular.d6484fce.woff2 b/src/themes/fonts/KaTeX_Caligraphic-Regular.d6484fce.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..75344a1f98e37e2c631e178065854c3a81fb842f GIT binary patch literal 6908 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 CFgb+) literal 0 HcmV?d00001 diff --git a/src/themes/fonts/KaTeX_Fraktur-Bold.931d67ea.woff2 b/src/themes/fonts/KaTeX_Fraktur-Bold.931d67ea.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..395f28beac23c7b0f7f3a1e714bd8dac253dd3bc GIT binary patch literal 11348 zcmV-aEUVLZPew8T0RR9104!7h4gdfE08HQj04x0f0RR9100000000000000000000 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 literal 0 HcmV?d00001 diff --git a/src/themes/fonts/KaTeX_Main-Italic.fe2176f7.woff2 b/src/themes/fonts/KaTeX_Main-Italic.fe2176f7.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..b50920e138807f385d0b0359f4f0f09891f18406 GIT binary patch literal 16988 zcmV(>K-j-`Pew8T0RR91076^<4gdfE0E4su073x(0RR9100000000000000000000 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 literal 0 HcmV?d00001 diff --git a/src/themes/fonts/KaTeX_Main-Regular.f650f111.woff2 b/src/themes/fonts/KaTeX_Main-Regular.f650f111.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..eb24a7ba282b03d830fa6c63ee897d92a5188736 GIT binary patch literal 26272 zcmV)0K+eB+Pew8T0RR910A`>74gdfE0Mb|h0A@!30RR9100000000000000000000 z00006U;u_x2wDl83=s$lg4ZO1h%W&)0we>7bPI$&00bZfh>~Lg>lfqq!H9{pqisKVY-r;FZ|J_}3x%f#O2oVCoLIe_|K;jSrB#_|6tcF#nQYuiY zRK(X+)^(Nr)_--CzcH|L6YOKIgtS zV^e?n{KWzdGz>Uvr3ogO(O4za|Gv{cJ82%+Gi-Qo5zvVr0DLZxboS5QW$DVXQ;r?L zmIH039WJ0HEy6d@pqu?CAy_CO;Dwq|QLaaOJrjSrzwPh3%zqSH-@JXOXu3ou^maSn zD6Y9G97Z4w7UP0&7>6YQ{`#g?zwBT4E;k4aiG}91V;Mr|0QXGWtJ_n;Rp(_G-LZ7X zBgu&ZY&pQNp#j4J@h#fb%-g|!nDK9Z{#y17F$vj|Ow$cw^7Zx5lyr?)4bguwH}XpQ zh^e)Sc&Uh2jvmQxaQ?x06H|Yz6Aq_$_jY?{Yg@O_mO4~aKnjeqsU9vsh70XIBy6)b zDEZG{)L+!>A4obA0Y9^&d{=I z1rQNW-S`)HK@33?1Q_TF+)dX^5`^^cPky~Ft6Q`9TUr!UZBCSJl$f=3h(YRSXRjSf z|1Z&uk0Zv)$I=m0ewE+k>r|MjE&PC~R_Rj!|nOT6qEFfVQj7#Ym zT#(NMmbwG?5(z-e(xsRnh)SU3rz4djk$ndW^Y3v+-m1yqPKC2`3yQvS0RN8Pob@ zd;8b!bXHN=2_&HZ8t7F$c?Gy^Nih!q&MrSe2jI^R0kDYQI<#j9%){aPfS)?x`Q=&T ze;vONSt<60DE_GxGmtaG3@m-&0D!*R0D!`{Qih;{g+tkB+RXlPxk(?CPmP(j+F`GQ zj(Fb(uJ9QTdCD7m7S|H|w>SDl@6XB!CYp(vn%POFc7rMk#lR-EFj=&{{lr&x)zesW zo%Ggj?bnAoubcV=pc+-I%2cJQ&y*#GBe3Jl9S1IQ$j46|O^jh0a~NO=>)6F!u5gu~ z_(jcDPuwRQ3n#;e;bQnHHpB_(`}9-#Gv@EO>}~ZQzI_W&s53_1v-aUppUVH2i=Oh8 zUh8N5YF50z;;G)iid@mRvCYk9@@waPI-_&)9l3J4dyfH&BTol!q@AhsGk^3j+vQ90 z%O}UwV^UsNR`u6KTZH&&GeE;Z?ohz3NPHDm~^WFB$G|bQc{%3#t zH$VCDj~eXRv1#=-x$atBdbrr%&&ypOiNWIh<`>T%eDmOxlRj|5aql|hpab^VYmYTn zT5i}<3oX!VvTjXkj8-ZnUmm?$81vtj|1v0$zr1pCBzfUmiYZV@#p@p#Ym?$XdCBE4^S-Ac8B(w}LdoqS zW{SNqT+QhZn;21I>&bWg=z=wGxLwj{noRNmp)%vbIlS`JibX7HBJo@N->MG@^Rsy1pre=gd~{zgdtpy zn2n_Z+Sm>>R52!1rK&`UBA$BF7r=;I6;&lbvI-NX#p-VGC!c$0vW0^JY!88O1>p%H zDGt6c0`W*mKw2U)l8}|W*nrUgC57b6b`VsA56Kdl`^~*g$Dez)niYTfv>cY$x|!>Q z>G3*Y7tCXxITjL*q7X{rP!>i-JgO2XO&mKpn8??2YsiG;$qkT$&t(L+zLq z40TcUyY+XHJEaF;3U6AHmgU5rzW{T_OMSAk3Ts#3Q{}fUIH7`~80902Nxl5E?yOGI?4JPi3SJD(HQ~V!qEX=>C!sDHfKlD)RXhnK;z_jrBbge7wwh!-@4pFm_VvjVzjHy%f1I zr46__VjuTY9Z2x%YPmJ+3}kD28wJ42B&V_3;nbrKcK-s-hM>YE7bSIMO(_WI=rNA> zsQ3^VMNNd>0niYKOcAoO5(c{ipd;>e@gpFT=o#U60St^op_o9CC>A9$l&U1HEXk2~ z04&6zQiPnUgrV*L*oea|T%@ec)*)qGwjNubZNN6-7A`OX5%8%5oj6dP@hY_{ic7gA-L&R?^ME=QQtoyyBdiN-P$&opG?g=KBml07vkd* zUTfQfs%iHeN@>zlRDVFPtw=6=#zGKmEnltGSDw0CL*K1B!#q8-j^-x4YUAEYp65S^H&E4vkORn<)pBD;FR^%>Kd zRDt-5P{wP{7;-*i0IA&@F{6mG^AKYAxd+Si>-;U4})pIlVQG zF@uXIkQ*_YVfrFqqU?8*PRBGd>H_8v0dOZW;^kbUX(1JRfZ;^x|B)`UU~%cisy;j8` z9Mq=7g)VqrMa)i`jv|a6WoyK5m8vGIEj;L!kzzW4TBhy<%oB+Ggee0!2k_0bA)ELN z25&eu&w0+Psylo-vv~-ISRrnMl8SW+1P9F|{i8+`woj}t=L6PXmL%)x(w&6-lMWom zZ9O8Qq67y(gfVKf0^3Zyn>m$hn+0PrLLJ^h!wPYb9hrQd6fie(w|u2QiJKHBb(s-o znW8u7iL6WUY(DD6PAX?JNlxb=j+IKnZKW1Ma6jG65ys-J$dL|4`V2+>7{dP(lK8Az zHAiH(brn_HU8@J!7dj)P%>SgN`d#R_4t*jgJidVmxc zj}otq)`2S4#+h<4F)=pSXK@*vD9}`vB&SdsN54)ail`KuH z$E{0(c+#09wUL9k7-0Dven`ECk(qi|FPt{Ce;r>fiS@R8n#OZ>dSTsnBBB*?keR3A zTVYWDj+Up5*4+EFS)8RWaE1OS{(HJzGX_n57cq~@)>Bg%Am(ZOqYMw$)pjZyc~Bg~ zYXiHiY17y1@vYkK@t*jnsz zr`UQ=i6j#3U=TS}sfyzK5T%RU@aT>H6I>l@tMw+Cg{?i-vi|;nZJILrhPDXckS^{3 zy`Wv{B8(nPy11x+%cx)fC~R!354^)Jx9rvx5lb38GUyaBnGB25B_732qnFy3+LOW^ zB`9RsX2M=^+smS$K_bn`Q8mDmreayLj2T8A5>iVQf5sk<@mb~@JHj82N|svW!kL_4 z$`sM&BCAYAL7|V>8#4A>h9}jc+mkCXU_+rY!iJs}BGdb~Z4Zi;SFlFkPs6Z@uJ7R} zD%(p{%YxqC7KZhp;;LIa8Hj{xV)jtw&R#kKo&5UBmCH8m3nzHJ{RjIGui9$mp?!^8 zYcvzm1&?#YTCSM*e&SuZ-5@DY0_Sd-R9My4Ma#f^8l?<0a=<~Y^R}C&Bf8*s*HcHi zLw8wY{e~DC-~95jxoFw=lkx9#L~g@w+vLC#Y(@W%_d&$*k=qaxlW}e@g&<+{VnS3- zmttqEOTy_~nM{Jlup|r@>0sBY?)P-c5~ybEe}DyR4Nq zA4V*rw|CGu#H{A~NQLMPanLp~3-o=<9^=jNDd41-fV6DV+v4N?Mz&pr^Z6ukF+jSQ z`CIfUxhi2gP`7zZQ9s;!1jl|uNs8a2bQ%U)$F+pI)abWQzSVQVn0u|Lt>v@t=xrQX z*hRNxI%+xMpYlu%RZk*I38b(}bt0x6u2oan1AV>unzadQyX$e~90~A=9{V|mXlB{C za&|FH_++zvnnbtOeN@IbHuNeD&A7uf~*FDSy3;WfpSsD zw}^*&btbEnHcA3>YB?&C3sfUDhN!#((oH;40r=WRn+Q?1)S|IJCSg^%ByBdnHKcJ> zjZzF(=X4@S@Sua^3y+1Zf+nLxu*8I#XB^BuBLS~dzY3r_H5=4fPNU#1HRcW-VC!kL z{Ix76G)Pin%=$oDR#el;5Y;#+5R$;i21*JAV+3bE5NVkUdQdVpvKwYaz0uSaOb*EU z(2`!WzrPE46M(LWEOx$Tv?>E>c4JH;FCV_e(o25Dq&BP2>l9QdI%<9EkFj^71cN;Zg~_`Xs&ATcc$3?RsJ(YF)OoL3-jy(L zXluqq>#qSkoSczTNO2RLIsVi2=) zizn^4xjUrGUCpx}u#{L5{p)bcJ0y->C_MSpJ~q>26w(bu%2^MF zf|o1+P5u2qni@7?bva zAJrx^;k%Hmfh4hSvWkLbw`N!h^Q4jt;GCgB54RPFYmb!HVfeVFnO;R7Hzr z?VCdyR<)4fE#lW|?FSJ(Ax1TS6n=(QO|-iof5oYvfE_8e6gu#}@dFi7APpiOC7PBl z+q3ROzl*$g6sJzJQj4^F#1lw`NT_WS(`CtscsC;x(+2_zwbQMF1XZ>+qG?PHkaD_V zJP$cI_}eVD$^cNwB6c58yY7eHaEZ4#=p^yuewOsjU>@<1_T(J4`fLlL5?5nEz_D`8 z&j9lf$wmQzI;pn(W5yg33_RR~Iczu(8LJUvsey8iF4SNL6?K42V9x~3Uf zEEt&X{@|0x&6m?sM9DT!2#@0CF^VY!Q5{qJ>Tx4pv#ab1j>@{5&5C=8Oxd<)v>n{h zSM9P7fBjX-jgxDMqIgd|(=%KJ;%fX*Hj?aUW<%^xW%+VrJ!5I7Pd8nq&d`DOq1&!* zQd2T5X7NNTVvU2TYzcH@*UUFmJtr8X^`z?_UJa(L&1b`OOUUkdo>Xk&BaZ`>2@4M5 zQUCldPjNCn+Vo3bxCB{hD#4%?x|hY@$}VC%geoD`8?pJgH}-1SK?H*sBy<>9e$()r zZ83R%7lC6tdkMaYX&%XgvCEu+Tq9;F?0F z&4h1lhzZrqI%Kb4BgK`K+{*BjuG5=4Q|}$A9QE3=S@9qOQxL>MBpfM8bT=$j?8}BS zr8#Awi)9|7La~HYRo_+-KZno{P7Og`-w~2Z(M^2utY;EoS7z-`3DLBA(QWSE(hF(P z553&cgp7{M^1J=+bHeZ_i69Ay)<`z?qaiCE_QGBjS8PvL`Wrh2es17acd;lbypvn# zEqNZeRL>}N={gCB3e!ZfO+ML438Q%WvV-4PC`Eck3gI~$4f(3`nio2uNX=aXe1c+q)R+RGsKc| zwJ5y<2>D=Sl3t%%HKcgSgWg zB5KwlsBMe-P>ad+Y4HK3BQYQMJB=gwL|x(S5kL2<$wU1t1ZOC;NI}gXjjj=|qrFGS zUK?^-&EE_N1Lm6*ERNC?| z*%)mwO?OL9Sr3U0rB@g?ujr-xiuIBzBoIqd7 z-D~b$LM5ggZyx6FicZAd7gO| zi^gD+ZXhM;q_3mp?4ahM7F>FY&*0iOS}=$tHVDQ|qD6Zt^T(E5?Yg-454z>Ok94yh zakth*Es;?u2I9gD2bvRvTCX1FIZhD8a{42{?Da;qW`Z*;n+$Ksks{KT2_a@v8^NO$ z;-edNnrJ4VO4njA2t=n%J*Ddn!wy+ZEjWf;V*9B--~@JTrW4dNsezalN?#x_hcyRw zKbR@z;*}h8wY+2%5qv4!C6cArQCTu-;B5j$=(+gU^d&AP>&%RotKUSssXc3mV*w$x z59~tZeYSw7hDS5x9NxzPQ#O&|uKNp$GJGEJF&Ci*;uwd$xb$gwPD#Thwn|+PzoJ&L zB}O$}m4u?4z=kBKDlbz_KG?2Om)h3o>3dN*$_3b<_DtQ9gZf}v%&crEfE*W(BJoNz zpx$A~Y6#t!DyNex2-Bz47$r%}%JAo}V_q*RA$EC>_{b4po|p{WqhbFd6Kla)?gV0J zi8uN-`Q%!T^h=rJ)Q8-w7SeGwdPY~b1q7}u8VR{_F?96gNoJrZ02JR$jNgzEJ%U^V zJXzsor_7`Fl0lA>*kL33pRlf4VmJv4e+*Ek6Oms#QeJqOH0SON2CR}>4m|=s6FS@G z6NDD<1F6ZA(ugdECDdh!-t(E&O*Ofr@w8mpLI=VF^GbH(KO!tAbThH5 z78-kQ>g=)Q@@#efpCuMmZr|dRgLrP_*1AHsuwZu-O3nu2VW?rTWqWU>^fo_o^>XD% z;ha$IQDpZJ@>xgW&`c)e98{;-Y3ht|7VsKo)qxC9rk#)vPEpAT6+RN?G*|BWBanqY zg>R$w6%)Efhu_rN^dEeftuSuaSx~7PH0m$D7}=UW2@GDcH0jaOCIHv6c94wC@H@g% zad8lzRSTIuGzyu<^oUfm{>i536nt9RLr*Yps;HGdi*EucbH*3ieWz*_V&jaXE~?je zEvpe_69B(d9EI4Svv(Cu$qSw)RR{#6(@GgMy3hj*^ZqRWfk`EO8bI%3Lgu>SX^jKq zJ&&(i2OQ8OEkccb5ZsL zY|P?LMF&ks4I(g$q+;fJDmMtTVst}>BtY2=Y*ZB`kJ7Vg5M!4XUw%51{sG*NC1QHL zWCrqu{k`KimViHuLi!Tn1kf*{-?jm{G>bbR=-1QLD&qVp!tg*JsVQ~od$G`O05*oT znDs}*T|L$;Fo+aj3-dB87LJQXx~&Wjt)c| z^8?1NRva9C8K7(|(==;ZP*Xn&J3hYXeZ$jspRl&N9X)*5%fj_zdH}?Qb9m27QS)$& zPM%yk^cvqo3|w&A#rKlw#qO51gQ1mc{wQp^N38ooP^bap4!&X@hm0+ZEzYQW4%razh!{`nq z3Yoz|-nFzhZtzWTQ4+VSYg@gv(1~Z2XB4t(Ro;KIr2sIak#6Z#vs_L{C6YL!y*@|; zsr#EcQfI9L5Cl%~_;bDBbyne!TA z{acJn&8rC?J;UiDGjjcEUC*v8oBJ~)M$-=_i!)ZxO**NU<)JU+m(wjzfUv_vfJKGl zzCQvSr@}J2$&aXR$*$H=CdUw*eZY4Q3^i?le^x~t#;oxTmXgNl)&nGSxnwS#6Gu}8VDpAza%6LOQefAp}3xW5f$Pb zT`1(|m4Ay=Vv7!Krym7%UJ^(9ZWy^!sAA;&-JSi$X_DBZJsx{lXEyE`i$<>=Wq1|D|ZCeVe>LXoHc)0bU z*a!mI*+R~-Pt9lM>1JO6-s*}>$A*k%LL1?#%Y)v z8WRg+?OZZXi86$Pb-vl@s6M?Hq6RHDSGq|n@M~dIhha+en5{koVMvO~Q2DTR>eH!) zdA-Fv-3+GK)>a3*RmN1aNO((kGK!WDXE| z30Cl8z>>!6B_L-=6Dxq&V5Lv5q<#A40w+ zUu5}QPVdGUMb9(0ESb&d0XAwtg_cw(Jz4rft6n2KZD{1avCE%_hd}Z@LENdRoR z`xXZcugNpUNacXF5M0M06fzP@bQ^FJeeKup(GywScqA|z>bSG4*~(T7qwxvID5Kwi zChNRb`C2y$(W)?dQo{;oC3TLh2TF}DbXTIk7Qy{m?64bACK7y2x&URhw4(x(IMj33 zG&NF>4pmu>I$!iNOliB#;FvS}y6bugal5}_g)0SK>q-_P3I`TX*E^ zTZ}LE2nIRUcE-MXLz{~UKv;jrvY*^G!pq2q?mx+dVio6q7Cs`&xouPZ0a24ZV1u$H zVSh<#;m$%0GkvOa`t;Q4J3OwZun+h5CnDlrYWHeb(ZT?#`yvw2qyHK}||8xP1*G?TAIW21E>k)$yjWXqP5 z3g(|w@}tJ$5?%oKMItuNa-ij+l36;3RU5ohPx?6%sTpVrOWzCkiP@^a6SzB!CevAb zvAcXXqyV%*EH8Ty1j8lCM8Pq<7K#yi1=@9$Mt~9ZaMEzpYTfap47_d)d;kvTAbUgc zw8L0Tl5PO!AJaWpoXP#{aQgGuMld`8Y1~2CnCN}pZv@eNt%9DW-D;{3&k>A5>t$t} zLk9tzx6)b4&bdO|$yP#Og~jL?f)A%QkLi9|gzbup7;pqo643xoNJosB^V-7J%aWCH zs&E2^wdl4WE|6rhCa#`qe`LxIYES%$Z#AuD-#v92PppbNhId%)Gw|RU+836DzB@{j zxQ!5$+(`1+KiE5mh!a8q|6cXBbo^wB@47Q={eb(4-mCjxaJKtTo?TF@co<v)1EjY6M*LB+h&!)K&x{4T}LtAPQB z{^=2fP1}=}Lh;_Gb@@@TGA7JzH$c3m&N!2o!^ysFGRA8U^vXp(t#r|c&=|3~`WJYk zyUwvseBm$@4~GB)Q_^3fi4o!=kFpvAnKah&J8qLq_SR2;0|@e}ogBDwD6R-~+xP_d zd3-LnXvyudVs}daRln~}E#wICvPHurY+_}E8nHN5l{CcuU zD{WLRWPcOtl#UDM(3X1-P)T;(oUO%-9+Nb?JzKQl<4{3+uWY5&Oe4!Bjs$#|EdbYDl<8{6+jt793g!I>RxGOT1Q>8{&fB+S5XU(u;Qz-={*xd^u18@? zmoO&?y?&EJoOFt?xi>uq|Hae>Q1}hoS*?oTm|9bS*M3-L#z5_)hH8V}E^B1&*~lfA z<+4ejs^McfaTrhy%8Ou2`fP?>jJDtY3H&?nW3(*{aqsG!RX(^pB;1Wj8(u;_{ozyV zpQJxqu*{N&EjWK~R<&O!0DH1f2yPEXg^fTC<3S~rbRWn1sx=fV=%7XBAUZR86xl6B zSsKK+9NNUO3jT{89l{W!Vp9jWfJ9b?#z)(>3E!?`qT@D|O0{sL6LndY!xL2jT?%*m z)Cf@_biAyTEE?6?JNSmSR^F;+BC2eRlw&1elM4${+|Z1JHV&oNF?*QPB2l^~fdkyK zG7?kKq6;7l>s7Dj+PsO^KA73kN9=6~1AIb<4?0aIp1aOBV=?@XIHaz`RO8lLZ3v3| zgkIGgd(PdhJnFMdGx%2mW&r%e_XTUmQ2c<0EJtzGg68oX8GMUnmZinT@pegCN(vu< z=dEvh&}Yh46uibBsR@^X&Knf^vjDy`Ux0ITL$=@G8}<{zZ3-sgN>4e?mDGrTDc+iW z*zl>$sPY^&tR^Dae=+l+wnMrF0XIN8`7f)B0b$%>4qw-W2 zi*L~!cJ1NEPKs=t;I^Y3_2y+`i>% zHD4>Qv=AbYzn6;`n?aXFv*I{Hruz-t)(>Q~{U3oSdZ~6 z?ygr~(4oWe>)$lkwo{^qVidV@_o7~?hitPIrBrNjT6|V!k)d)OLta?<4>=x;-%&i z9zw0KBFqn&3KPA@#J~<Vv%n*=4@AN?XFJc7NgKP6b0r>>Zh??`I~-ZL%G^EZx-b#>9=SHBE9AmlHy0``7R2SifUGn()1FR%>&LmSre-F)6&ZMS)DmTCO9w#l@rfDkCC`PBKuD+_HD?(~!4n+JOi33Jzqy%#)$4qq(eHbfHWw5xtvy z@qeam0+|tA{dF$4<1|Va9y^^|&caS%EaAlu(V85Kzb?0KUu;y-@P@d+$?}!)-N~(S zfeoW2Q$W`3;KLHW4f3PFCaM)8uD?U?#Kpc7`WtZxYem3@LVmst+X^pP1aowxyR$4S-9(wAV7l~ci4;a>eiZgNEUnzPo1gvKrr^X9 z897xAHY?tFuDB{AIXN`Y<+3+fQNCME0?sZSO$J9k`UD0WQl8uON_0zS_aDpO3H>-42rdY0X z5{S?pxmWOoZ!EytKal{bI8w-n`swpH&yP`+EjyM)7sNQs^=v{&9gu?nI~65hp;hYi zSi`#M7|He5PLG^7d~oq7Drm=p6ALS6&KaG3H2&l9nc;8Ip0ZGv`$wI10Wy7|Tc-+T zly-$hl48dx>Y(>G3H79s2);LOY~D6ULMS`kooSZd(%+CK!q1K+Xqv&e@*|u6P?~mq z(`&);v|h}74dS=++hKu##=7rC=Jdums=g`8AWeSeKq_$aI83Jg87Vmz!B6AO&mYLn zE_*Qg&^$v!aXJnmTJ%5xKiQQQ|94f;Y;iWYPtZw`m}kpN!W$rbBH_&_4@~MRpO#iW z$0Qc>^86{qGyZ!te%j<(S&C`CB0kl*a}}5ws$gg`LcX+EyOPC>h*wPZ>OZ5+>pA{i zdN1o>jW7?^L!ar}R8-wxP|Fa*qjh-w7UxBYBRO538!~xN10n466N$mNl7)*hYGdlN z%-O#5jui2Y#@EAS^nTY(uhZk=MMu0l>7c5h(>D$qN(uH}#M@c-KaYb{GAy%ohMTzl znn5&@LJt0SGhH1Csr2F4aS~m^(=1rxSn6zKv3o`lJjN0fYXX62#o&&7@xM*zIb+dg zJms=K%>-Gmj`3ej2aT#|8u#gp5v&;S7NLycilvSvg$0d-axiiLB}lp^Iqc>C6DK4O zSihGfqjMnLb8*hmwo5Qhr_GBgcrMRw8*Qg5J<;J|1_c|Bf)dz2rIz0&H%D<3cj!~| zR0{o2tT=P`S?`VPZj~N$3mw0yUBdtY;Plv7<&E9BWAh6fi8&>>pDHsKX(Uoyk8yjJ z`npK|>hk%us@$aN^7u2Eqt5s=)vH@fw?swLr-b+>W#-aIv_4~9ur*gUC4OeULz$;( z8fMormCKJ@naS=Td^LZw)(DfgZ0EBSU!=4-ij`Cn`)DSk{AM`=drQ`pA7$wH9@q@G zBsUvD49?W2fU{|0x5l(jFV``jbj*Ij(sA7+EcS@q->0Xebahp&h^|{x5nfW0Zdhep z4K+1m{o~fD`;@wCSHbx*YFYiMa8n>?<1cqH8uM?^NwN5PU9ppS{u3~wQ}(IXO}m(s z>{tUyYolsq@VRL9j2XqnU|3NX7-w)w1!)NrCBvWxONXQ4O1zZc<;Ks6GX2m_%I?F&fx@ajO;W)euNQ{gj69G7RaC66&=~? zaupQp>D9P?=yG^+$F#EDITRy=&enRk`$0#rPB3>DcO0doxZ@XZ9YdVI3a;tu!m?m7 zkOPsP!<5Ki$#7?>%}b5Sw;pYZpFZ&nHme=tO^?#ByLAw-M7(KHgtRT)4#T_^ET zX9Yg|uALuTS)-2+st{=QtmI|I$WB6t^C~2EBE`#+`@pQpuMTh3gy}fT7tKqIfzk9tV4i1ZxY z9wXARiw#BM9~#iI!(m3bvy2jDMq$~J#0T_)6F@S{fpJ#(s^t;2LORP%2Bj_1@_j1_Rk(8i_gD@>=$IFpTQ6Wb z!hyWdpj(BbXv?$0bhlOb{y&4$kGh>|JIvk-Mm98GV4}f6kAfJj(!}GdLQC^JGyr$@ z%7NYuuDSTXAz4EkzIH3wkrOu%X#2Xxn^}YP5#!1|{(H6nubcQ+Iy+ix%XPLhy?JT> zYYt%9BEN&1Z7bcAmM2(?rQpZf>2tL{`lND>T`UrcKd32s9&7~FQzn!5b)r#gqScERd-DBuy4jYSbODn)nVRpI3rXgDGdn-@$x`Nx6CKsm!%Q>}NTNPJmE8TRdJ=95q zVK_RNEj&aCHwcyc_9Cq9*{lJ)vb=i|s1(CjRn3JT`ey~rgz{;M480B4!H8Izo+T#=4@vEZ1io8b0sLatL-P%IvdsTt^-DLF< z{Cs~ABH1Yld`7XhFgn?8PfoRM-FdT)^1C4;>pz#2*((qiIX7# ziK;pp@#kgWNZFWRLA`_G+7f}XQ+uMoCFz7Z1@h;j4}&A3b-~|UB2~y(S(jU z9Gdi)t>fzczZ|9I{os9`b-{WQ7UqQ3-wD@Y_u6~yEFITFuKsNC5dlp7)z8+UybC?` zM=>2y2LGP2`8NnYB2>xEJb{k+WWw|!wvJA$7a)^P!BERqsN&|MCzy_TKt=#2RjyWB zv)<>;Y}J(GwUK4h>LqkZ7>K7cCr3qWdRp|<)&K(r?{xsvq3ExDGvi_=Tc<{~wl^Pa zc}I0$FBFW4UpxBxWkCL{gM&*$OY&yr_d_Hz;(tsXb6dU3z|irFkb|IlOXa%OHY(=c zlO&N2b)I6fZiIaj;_?C69U#Kf%0QnLb6BocpgBw}2JvYK_RG&e8O7yMXA(}vK+DeM z(Y!8}$0C3Q=)^z1TcE95Tc<@WUr-dg+$_BKA%l4mOJsEt6<*dZXz^Da`r-7wlV?wZ zOImIjYVyZl-_tyixP5D#3C+^{ra_1Fx`!fO=k@%ERC{g4Px)|NJ;)i&!OmHo8=C98=WUo)hrWg99VUPXvMa42*C$2jc12c^^aP+ zv|oe?_tRFeU}Vi&NU0iEL_TqItEZGvksN>5_)va(^DsF!2g=b4;t~Je@kBdl)P z>=N&?=GMi_qBr=F(@?wscV$gj`zT5MT9JZne#K~(@x3YP+_L!Frg!5)Tmg%wRTtSu zQFDjN1F^?6RbyrrF!ij;>h^#Q8*3HS-$~|YmoYxV2y$Hgy>~k)?jNJ=+dMjt9oVJ6 z2OL)*Kv({u5}($c7L!8S?DO5Nn~H(gK0!Bj>vqV}xngUi4$WD6I!*dOhMRCjeuNu> zAicFay9XvnOdq>j=d9Jo?;zF7=7C4Wpr-?;s>Kv3yf-7gpy;FfcZB@d=Pwz%vQl(c zPFv!37vyP@Oef!+W)|xd9o{6T;*33FSzgk2qpMp?5su5LO+vPI(j+&fR8XGz%>u59 zCEHJ5!GaJ^rnhJsy91ru2hE6M<2vlZl?#{-$5L=;5X@&xc&ni z20c5B86FKx8DW}YV6!M78=n{L-}p&0g6x=rkk zW5Bi)DtJL($AV}u_>vc|U|>{gqC*!ezOQ>JmUe%Pa{4zja>6#!P3v)iSR8;a)Mwz^ zKq@~ljpZkFH8FqZPTirfxo={^L*DvalrbmW$QKQ}xTAYZsYs^P zH~Pxw3TMWoP$|^wzzivrkeDJ-dDB4zwEh|!9_}$&f6{t9ae~qYS7zHDJ=UW?ou68s zvGD&xt}(eQqUE)A&iqp7_un;g1>h1vm2fbk%)v$u!$-9Cb8fq({Xl@=`<;A6Eo)cSA%>r69uf|49?+r7>tYH-b*0^aKttlOJ2BoUN|*h|&2=O>~B? z+fZfWQUmXOwjl2X;iQwEpvO1r*rdTwa39796Ix!=U)LZ{r>5ED z?;z~%MO=eH`{3F9>+_f+J2w;_LKl_twI2-V29|;8pn61|z;rXB)mpXAvBwr~{?m>w zUQnoE+BZIQxV(Cyj)N0)FA){4-N5uid_#f(=c`VS(WCE;mGbbf57+XxXqDBaTY-Yv zU@X(K#mE+m(ZC^Fd{kN|UB~VcQ2hZxj)2Np*h))#cBDh1LzkD zAY%)LufS|wi_-wVC zq%5<$+FxxI>Co+g3c#1n03V8<6+Z(xL@ZP_`4^}Mae)q9?yb7V(4p6!1ijl)9nVbz zrWaqP<){0JK@zI-hp;P9$Uh#83aHH(`zIDG7NbeFxHCfDA3F?&1}^`TFD)vT z=Y8*~@rg{njUqC;omiyGKP7e>VDuZ^u+x@mOn& z7>z|?=6VdgLiLMEb@WFN?qep#qep1L!}FgjjY+7GlRb68@9H1QWraXjaeZG8C>w1tAVs zMe@3QSw+5qemXOMoNBxV^V0hVd>b6<**sE(u6ZLH_Y{0PT{^7msPzkO3XAD)OSz{7 zJjM!_DFJv2G0ymRd@Rrd7Q7avxRZ^!x$G3o;Evrw1A}0IC~690VYTO^G14nY-{RI9 zuoQH0(rB^p{5FYtWAm3^Ko(RxLWs8=S^hWwF8X&Kc}$H90%Spc;^gKimMAqNZ&aH# znv^^a_!&*PahZ;X(TVTDP(nfoMwS58XsXD%CM!6h(&B}BR-O8Bgy8GvpIw&j;7c%A zEE!##DditJKlZ+rGn-0!o`)gQIbNfY4B~ni!ewoOpfzNEC6W@j@QH3O=2T_mmroXJ zt+D@Hmrs{^g zM?Yl0hUFw?I99HO;_b%353G(Su{J|lZXB+_A*{MV1WP5bNDNEo{d`_2*s6v)V6jpx zQHn)Ln8hv|0dFRd+2Pgq{&JJSS_In1yhc~dpKgxwt*#=es@0yD&FAIM~0I0 z)*I}d2F3Pu=4I#b_+salw2Lj}q(*x&A@E$A+PfyIZ7{kZU-`Y1u3Ix^vDiw}FH9PM zV22Z%7>=E0(j$GomX_AmwicxU!ERu%P}AJp;?Nn=P&d*UBcN=nBWUaMMbeq4F`8vT ziy~eq7Bp!QuRZL07dlE{E(`yR{8>gqIf?Ev3*a=**eH#!7q{ zW)CK@&-QZ9SnH|oKh%!;Y@f})FC-oFeAC~X|3QL>Qw@3TP{tbw`TfdgDW)p@d#rxA z@+jhaRV~mJAskR z!iq5=NNEb=EU41{7_P{CUusgxR6+my3o_P7Dzn`!D{A60Lg%MPrSHAgj&;i+p_)-R z^GcmK%uoN-?*~8y{VNt7M1-!4XyVr~VG!KXg387Fu(@56+<8hRWb1?-&hhb8rrfrlYf{X*enk|7V5uCkup$qE#?K&{Im{!YX)to*Cg|HH^2%C5*;A{?9hjY(I58ggy=YtC zWpG(_mx2a~*a)kRH~GtKiC4cY7Mj*O$__z|pW&?GqsFiHKz3-0Id=siC2tk*hfVo|2J+J%5cghjX?~lXjB1lHxS= z!u*tu6)v=9gf$hC@%A!nabuRf$c(o!ByuU&*W6mb;1n!sIO~Q?DcJ>;MP(Cq#MqOx zM=ou3+R5B&+<3j|_PFs;CUoq_`p4wQuknHq4{mK?r5u9B`Nf3K`ObPjG(HP%?0W+x zf2*r@gojK}LIuJ4JxDEg?=3{QXePYAXaFlk>lL zMlD|pz|V)MmWs{nH_=7VF@e-LJqf}$wr5ZPN>Zi zv0JUn@WBt$ZL2Gg*RL%dj-jc4y$0ANxHX#;e^f*}47*v46Zu7(UA9RaUw-@izZ9m* z)Vunkd3CZpZ+Y;|;1;dwFO~LY$ynJJJtPA2>NG@sR)Z}i+1P1d`*B*B4tvr*1v6LN z910o!1QNNPh&x4{2vt=lq1SeT>jT@-LG83>;A}Ih`x{0Vqfi3$Iy@~*O{xF*=*RU_ zC|Fzh|C3r%vPqi{y$?aqwG4p(P8<^-T6T2k=(14!m_%40*d1V5jh~)C>Pg2~1dnUAFn+vN{ajMI^3-Ixtm4~v4<4uI0RJ%|f8BNyDtQ-c9J&e1d zBs`Z+k@OQK{=50{9|O2NXg~JoQ8#M)nY@}@e%HsG>gxMZq57dOpfq~7T-EpM2_d&5 z*U6-t5LU{JWY??DoGiP?xVx5w3lZE z82J>US5zd>wlmk9)Yc^=n3U3qX#Jk6aNK_rX0H&RPvjWb-jLVviciDPC-Buhs1M?W z_(1~J(&(9EXC^Bz`4f<#*&{czn_sU~$fpXui^o0*Vzed$PPbvUYV_*y3i>in!*K;G+Un@#@H0dG+Kz zIk))~`erf-eM!&e@A3&LC5?9fn@B~l^R8|R6z^Y0L;g5$6aEy)2=t!>_4GSNb^l|3 zo+LwWJd2XORPFDo|Ff*J2j|#-v{oQdEYB7W9Uj;qBIidl_ zhhjf%PFrr}*%=7EhBz-=l9)`1HthX{#@WL1L^@yIdL_h%G8-Xp-bmb&gs&?~ia6Dh){m-7Ra(ob z!%3s6Mf>Ysu>UXgcTeS?cUhN{WW{2-6g~JZVVbm-#u$G-_aRz8b)pcv!E-taR(`#k z%?$0@^#-_bHLRq;*hwb!?7)6-mBqLT%8krF0yCH_!C_$tQP?qP2@B$|nBoe!s_Ges z^~ZUHDkSrun?8#zC0VTNPn>~^xV`Lf&b_!|u7H<%O7H$zD~*wB@C~{t9EVPvVIVv0 zTw`FYa(?9Oyz7yi2^@AdJ#xBYI;@JqzX9eyi>7o33%sUay7$-5*^!U{>*Bx=6SZnk z&e)~33Ee9!&WwY(l5q3JH2XAEn6pG`WxClMH_JDrjPKMp?Bq7EC65$b!@pK(bgQ4W zuSUqa9_6m$_hpV64#r`N=J)=}3b6?r#;9fS{Lsajd$@ZyUTa2p0|dDYdn|UpD9hZDWO%!snv6 z))G(#?t^*)RPJR4s1L6)h4I z9#y9=2WwG1xM9jkn}#6@8kfKqv0#L74&|6()-@p-N!R{1>1P#!&Qu8~DCAQDp80k4 zl}I{{BD4m2J!4!t2+qT+5JDUO^gGDVxo-*$qtj?68kTthR=&J^i38=v2mIhwsfK}! z>Kgg<$cvb@p!hh8tIwFqj5Ni_-v_Mu%9p>1vKQKW=n2z2<%6oP97*dQ2*{L#r#6O* zg>2mhqgYtjUYvrkw~If!8lHqsK{2jALp5RQ{N)>*$hGk}Qu6f^F&=T0X0^mUq986? zMdHMl6j?VxHBBuT{b5q^Ht6mDe;-fdMP#i684xOY_P46JAaZI5VGB8pQjwI%Y3y`| zeH+E4++mHKL=GH=#27nKAsY!rOlmDs{S9QBSQL$pkgyG|!+q3*DI7nm=!y=ai(ou| zOqZ9$>tGv9B6OO7h4yzxT5H=LjFXLf(3a@R*NDLXn?~jzcXG6M=}Z`b*aA+YMBO8_ zH?=xM{dm7a)YK}pHyWjloIdYWK7CB#Kj5>_{Nut)j_JblVG$kDUGZ}`{s~ij)XXtq z0#(61ygqq>=6AsQIkuQ%g1x!DFmk%V6Q_C-He2VibRhdtw*kg?bMuuZ6^$vi$Kx2= zol9u{qUu|0)Z0h(8QnnSiK0r+9XWdTb6J_S- zt58gWr0;cAClxG4O$cMFxui`dF|*MC8v0BP4H*J3b_SzCf}x>*|6RBUYSiF{B9=3b z1!}%Td!4nW5n8zT-+zV{QV@c@gQ3dTLJ-5t3JQvg9T1Q+NzKOO^LBGk%MAnh(=tBp9{qf?)Vtd*VGQaO_c`Q=x zSw2h(WNE;xZ4BDeqylnycPEDaYDxo{--Z}i%IX1s#&QVG(D%`Cq1vC+-%_aJK9f8H z=C_PcL$v0(&L5id^3}C|wGihN=Vz^$Tevy}9Q}$!qWsg z$NAE*XhSoDw__-nG3*O+U=!m59U9)y(OYq*r!DJmgfqZ8?$d^K8kIATh6&j9sky^T zTr0m^9%KcVH%T}4CstP2xHuEZQ#m#38vagI+yipfppFP*pvAIg*?+2D{=nBqL5j*~ zL$HIuU^o?c`Ck-n=5kVYmB#gNmDNK+gu?YOW|h_VZ!L}6mBQgR!{~qC$|;~XF5>X4 zix&DLY?NSa;X>d6mJ05OKC{lHv4xC!(p|WDr}LlpX*dlJJ14OswTL6YXz=IV%EdR+ zU;GLzJI+~T1o~6@w>o5&#rJItYqH|jFBGARulJX`mw{6TU{E(Vyoy%m0QVwmgq0Gk z^)FmJ9>o3aE9Md$h9%6JY=d6Eg4Cu@!|Zu9mZ&z6lImDB*9E8Sz;~p;LwT7?Q&R%9 zA{H%A^fA7AU9kdRQE)+CLi~V5b#c|ILU}L->7}AblwGn~2^8$+Z2`*V@ zML)NufK>@#)z^Qa);f|)ynl7v+{fW#>+rg<;Tx|lIngdds|78cZVP`OwTNU3E->r}9THk&f%Ha_t4cVu13*2gW_eKc9p@I6T zR&ebvYA(qd^=(d0!dwPN=`Z5d54B_n1E%-N1AcFPiYsbwO}!*cQ7UToIvklcj#?}? z+eEk{jw&*D7pV4!NBVx3cv)Nht>9pp_vr;_Ov$dzno!(*zbi_93>sCq ztJsJ(#U`K1C_nEvFN-LWx|d0;@xM$%mLDaJg`M2K4k4F;%>&f1y9#28ur>Z{5_zhJH?# zG(6?9uC{>jV5OIAt0kPJT=>j0$+I&sx0G#Fal6T?b+a27was-;x$LX0H?K6j=q;3_D7E*o(@ zlRR?)%e_RNp~n#utOKr?M018PP6f4URs1w--{7ypeS#n8S1+)Ps-y5d3*sMGbp=@nIWz&i|DvF8|>JAQebr|Z`tIZOv`2k zPQM9scN7E{mihx769S^q5Jv97Ug*}okKT9SUb>2i@L1E7~dm~GHd)7$W= z&2HiEGM7Dj)0UU>}uMf2&lKtY5YIYH<~xJOb8H+^5dpxv;R!GE{`qnb$Ei z8Mq1uH(7JJ$xOh$3VsDy3NZI!KF+G3u2U5pECdW-+JwiK808$Mv)u4Bg)ljP6K4!mw zpR9R|AL7izJH*=r)nRjUcvfb@*qafpp7(Dg`)Bi4i~rXDLX?a48)Hs`i{p7p($tw; zV0#dbg_l0evscep8lG;Uy>$-ix=F5BJgF79hnT)x)3VDYR+z{T4)7v+{mOC=z z8RyT-1a$77@FLSP{YiVnl=(ln5~Du9I;EB}w(`{B2EnXT7A`$#A>hNbcriZR_rak5 z>4WgA5UY#veYgV8K2efumD=Fsz|4T{@$r9p>j&^7Qt{pScrq6!@dFq_Qxna2xo5Q8 zBg)G5XhCVQy@I}57N;;h$0b~U6rMA&1Nh0_`uX@>vGm9gF{$preu6({pEiHp<$^e{ zoF<`(`}@>a=T3&_n!$aC-ea%r4Is>e_@BPL|JzPz=p=!LQp!Q1k;6LP9gk+eV1MU0 zL~^}7idxY{3@mCeVi5fC`�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 bkH82T%!~T~dOL3iZSfI!+IWoKhyte*`46Vs literal 0 HcmV?d00001 diff --git a/src/themes/fonts/KaTeX_Math-BoldItalic.dcbcbd93.woff2 b/src/themes/fonts/KaTeX_Math-BoldItalic.dcbcbd93.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..29657023adc09956249f6295746c8ce4469b50d3 GIT binary patch literal 16400 zcmV+rK<~eIPew8T0RR9106-7`4gdfE0D43K06(+<0RR9100000000000000000000 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 literal 0 HcmV?d00001 diff --git a/src/themes/fonts/KaTeX_Math-Italic.6d3d25f4.woff2 b/src/themes/fonts/KaTeX_Math-Italic.6d3d25f4.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..215c143fd7805a5c2b222bd7892a1a2b09610020 GIT binary patch literal 16440 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 G>;nKVNojrn literal 0 HcmV?d00001 diff --git a/src/themes/fonts/KaTeX_SansSerif-Italic.7d393d38.woff2 b/src/themes/fonts/KaTeX_SansSerif-Italic.7d393d38.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..349c06dc609f896392fd5bc8b364d3bc3efc9330 GIT binary patch literal 12028 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 GG{*pT{>~Tx literal 0 HcmV?d00001 diff --git a/src/themes/fonts/KaTeX_Script-Regular.c81d1b2a.woff2 b/src/themes/fonts/KaTeX_Script-Regular.c81d1b2a.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..b3048fc115681ee6c1bc86b0aa158cfbbf59daa3 GIT binary patch literal 9644 zcmV;dB~#jWPew8T0RR91041yd4gdfE06`=G03}%f0RR9100000000000000000000 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 literal 0 HcmV?d00001 diff --git a/src/themes/fonts/KaTeX_Size1-Regular.6eec866c.woff2 b/src/themes/fonts/KaTeX_Size1-Regular.6eec866c.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..c5a8462fbfe2c39a7c1857b9e296e62500a8a8a5 GIT binary patch literal 5468 zcmV-i6{G5RPew8T0RR9102N#S4gdfE059|a02KrP0RR9100000000000000000000 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 literal 0 HcmV?d00001 diff --git a/src/themes/fonts/KaTeX_Size4-Regular.e418bf25.woff2 b/src/themes/fonts/KaTeX_Size4-Regular.e418bf25.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..680c13085076a2f6c5a7e695935ec3f21cddb65f GIT binary patch literal 4928 zcmV-G6Tj?tPew8T0RR91024p}4gdfE04S^g021l|0RR9100000000000000000000 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 literal 0 HcmV?d00001 diff --git a/src/themes/fonts/KaTeX_Typewriter-Regular.c295e7f7.woff2 b/src/themes/fonts/KaTeX_Typewriter-Regular.c295e7f7.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..771f1af705f5cef5f578b3a1e7d8eff66f9b76b0 GIT binary patch literal 13568 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

    Qk$}yZX}A^V81s#cQV5+`Q((p3u{-by?gDm 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 literal 0 HcmV?d00001 diff --git a/src/themes/img/favicon.svg b/src/themes/img/favicon.svg new file mode 100644 index 0000000..d791256 --- /dev/null +++ b/src/themes/img/favicon.svg @@ -0,0 +1,10 @@ + + + + + + diff --git a/src/themes/img/loading.svg b/src/themes/img/loading.svg new file mode 100644 index 0000000..52bfa69 --- /dev/null +++ b/src/themes/img/loading.svg @@ -0,0 +1,15 @@ + + + + + + + diff --git a/src/themes/img/logo.svg b/src/themes/img/logo.svg new file mode 100644 index 0000000..bb8b597 --- /dev/null +++ b/src/themes/img/logo.svg @@ -0,0 +1,10 @@ + + + + + + diff --git a/src/themes/scss/dark.scss b/src/themes/scss/dark.scss new file mode 100644 index 0000000..e8e1439 --- /dev/null +++ b/src/themes/scss/dark.scss @@ -0,0 +1,66 @@ +@use '@lucas-labs/lui-micro' as lui; +@use './utils/color-utils' as c; +@use './gitea'; + +$is-dark: true; + +$colors: ( + theme: ( + 'rosewater': c.variants(#f5e0dc, $is-dark, $dark: false), + 'flamingo': c.variants(#f2cdcd, $is-dark, $dark: false), + 'pink': c.variants(#f5c2e7, $is-dark, $dark: false), + 'mauve': c.variants(#cba6f7, $is-dark, $dark: false), + 'red': c.variants(#f38ba8, $is-dark, $dark: false), + 'maroon': c.variants(#eba0ac, $is-dark, $dark: false), + 'peach': c.variants(#fab387, $is-dark, $dark: false), + 'yellow': c.variants(#f9e2af, $is-dark, $dark: false), + 'green': c.variants(#a6e3a1, $is-dark, $dark: false), + 'teal': c.variants(#94e2d5, $is-dark, $dark: false), + 'sky': c.variants(#89dceb, $is-dark, $dark: false), + 'sapphire': c.variants(#74c7ec, $is-dark, $dark: false), + 'blue': c.variants(#89b4fa, $is-dark, $dark: false), + 'lavender': c.variants(#b4befe, $is-dark, $dark: false), + 'black': c.variants(#181825, $is-dark, $dark: false), + 'white': c.variants(#cdd6f4, $is-dark, $dark: false), + ), + text: #cdd6f4, + primary: c.variants(#cba6f7, $is-dark), + secondary: c.variants(#313244, $is-dark), + elevation: ( + '1': #11111b, // crust + '2': #181825, // mantle + '3': #1e1e2e, // base + '4': #313244, // surface0 + '5': #45475a, // surface1 + '6': #585b70, // surface2 + '7': #6c7086, // overlay0 + '8': #7f849c, // overlay1 + '9': #9399b2, // overlay2 + '10': #a6adc8, // subtext0 + '11': #bac2de, // subtext1 + '12': #cdd6f4, // text + ) +); + +// init lui-micro, css-vars only (no reboot, no basic) +@include lui.init( + $theme: ( + colors: $colors, + variables: ( + 'base-font-size': 16px, + 'font-family': 'Inter, Roboto, sans-serif', + 'code-font-family': '"Source Code Pro", "Roboto Mono", Consolas, monospace', + ), + ), + + $options: ( + reboot: false, + basic: false, + fg-var-name: 'text', + bg-var-name: 'elevation/1', + ), +); + +@include gitea.make-theme( + $is-dark: $is-dark, +); \ No newline at end of file diff --git a/src/themes/scss/gitea/index.scss b/src/themes/scss/gitea/index.scss new file mode 100644 index 0000000..51bbc68 --- /dev/null +++ b/src/themes/scss/gitea/index.scss @@ -0,0 +1,295 @@ +@use '@lucas-labs/lui-micro/color' as color; +@use './modules/chroma' as chroma; +@use './modules/codemirror' as codemirror; + +@use '@lucas-labs/lui-micro/var' as var; + +@mixin make-theme($is-dark: true) { + $lvl1: if($is-dark, #{color.get('elevation/1')}, #{color.get('elevation/3')}); + $lvl1-rgb: if($is-dark, #{color.get('elevation/1', 'rgb')}, #{color.get('elevation/3', 'rgb')}); + $lvl2: #{color.get('elevation/2')}; + $lvl2-rgb: #{color.get('elevation/2', 'rgb')}; + $lvl3: if($is-dark, #{color.get('elevation/3')}, #{color.get('elevation/1')}); + $lvl3-rgb: if($is-dark, #{color.get('elevation/3', 'rgb')}, #{color.get('elevation/1', 'rgb')}); + + :root { + * { + --fonts-regular: #{var.get('font-family')}; + --fonts-monospace: #{var.get('code-font-family')}; + } + + @if $is-dark { + color-scheme: dark; + --is-dark-theme: true; + } @else { + color-scheme: light; + --is-dark-theme: false; + } + + accent-color: #{color.get('primary/base')}; + + --color-primary: #{color.get('primary/base')}; + --color-primary-contrast: #{color.get('primary/base', 'contrast')}; + + --color-primary-dark-1: #{color.get('primary/dark/3%')}; + --color-primary-dark-2: #{color.get('primary/dark/6%')}; + --color-primary-dark-3: #{color.get('primary/dark/9%')}; + --color-primary-dark-4: #{color.get('primary/dark/12%')}; + --color-primary-dark-5: #{color.get('primary/dark/15%')}; + --color-primary-dark-6: #{color.get('primary/dark/18%')}; + --color-primary-dark-7: #{color.get('primary/dark/21%')}; + + --color-primary-light-1: #{color.get('primary/light/3%')}; + --color-primary-light-2: #{color.get('primary/light/6%')}; + --color-primary-light-3: #{color.get('primary/light/9%')}; + --color-primary-light-4: #{color.get('primary/light/12%')}; + --color-primary-light-5: #{color.get('primary/light/15%')}; + --color-primary-light-6: #{color.get('primary/light/18%')}; + --color-primary-light-7: #{color.get('primary/light/21%')}; + + --color-primary-alpha-10: rgba(#{color.get('primary/base', 'rgb')}, 0.1); + --color-primary-alpha-20: rgba(#{color.get('primary/base', 'rgb')}, 0.2); + --color-primary-alpha-30: rgba(#{color.get('primary/base', 'rgb')}, 0.3); + --color-primary-alpha-40: rgba(#{color.get('primary/base', 'rgb')}, 0.4); + --color-primary-alpha-50: rgba(#{color.get('primary/base', 'rgb')}, 0.5); + --color-primary-alpha-60: rgba(#{color.get('primary/base', 'rgb')}, 0.6); + --color-primary-alpha-70: rgba(#{color.get('primary/base', 'rgb')}, 0.7); + --color-primary-alpha-80: rgba(#{color.get('primary/base', 'rgb')}, 0.8); + --color-primary-alpha-90: rgba(#{color.get('primary/base', 'rgb')}, 0.9); + + --color-secondary: #{color.get('elevation/5')}; + + --color-secondary-dark-1: #{color.get('secondary/light/3%')}; + --color-secondary-dark-2: #{color.get('secondary/light/6%')}; + --color-secondary-dark-3: #{color.get('secondary/light/9%')}; + --color-secondary-dark-4: #{color.get('secondary/light/12%')}; + --color-secondary-dark-5: #{color.get('secondary/light/15%')}; + --color-secondary-dark-6: #{color.get('secondary/light/18%')}; + --color-secondary-dark-7: #{color.get('secondary/light/21%')}; + --color-secondary-dark-8: #{color.get('secondary/light/24%')}; + --color-secondary-dark-9: #{color.get('secondary/light/27%')}; + --color-secondary-dark-10: #{color.get('secondary/light/30%')}; + --color-secondary-dark-11: #{color.get('secondary/light/33%')}; + --color-secondary-dark-12: #{color.get('secondary/light/36%')}; + --color-secondary-dark-13: #{color.get('secondary/light/39%')}; + + --color-secondary-light-1: #{color.get('secondary/dark/3%')}; + --color-secondary-light-2: #{color.get('secondary/dark/6%')}; + --color-secondary-light-3: #{color.get('secondary/dark/9%')}; + --color-secondary-light-4: #{color.get('secondary/dark/12%')}; + + --color-secondary-alpha-10: rgba(#{color.get('secondary/base', 'rgb')}, 0.1); + --color-secondary-alpha-20: rgba(#{color.get('secondary/base', 'rgb')}, 0.2); + --color-secondary-alpha-30: rgba(#{color.get('secondary/base', 'rgb')}, 0.3); + --color-secondary-alpha-40: rgba(#{color.get('secondary/base', 'rgb')}, 0.4); + --color-secondary-alpha-50: rgba(#{color.get('secondary/base', 'rgb')}, 0.5); + --color-secondary-alpha-60: rgba(#{color.get('secondary/base', 'rgb')}, 0.6); + --color-secondary-alpha-70: rgba(#{color.get('secondary/base', 'rgb')}, 0.7); + --color-secondary-alpha-80: rgba(#{color.get('secondary/base', 'rgb')}, 0.8); + --color-secondary-alpha-90: rgba(#{color.get('secondary/base', 'rgb')}, 0.9); + + /* colors */ + --color-red: #{color.get('theme/red/base')}; + --color-orange: #{color.get('theme/peach/base')}; + --color-yellow: #{color.get('theme/yellow/base')}; + --color-olive: #{color.get('theme/green/base')}; + --color-green: #{color.get('theme/green/base')}; + --color-teal: #{color.get('theme/teal/base')}; + --color-blue: #{color.get('theme/blue/base')}; + --color-violet: #{color.get('theme/lavender/base')}; + --color-purple: #{color.get('theme/mauve/base')}; + --color-pink: #{color.get('theme/pink/base')}; + --color-brown: #{color.get('theme/flamingo/base')}; + --color-grey: #{color.get('elevation/9')}; + --color-black: #{color.get('elevation/1')}; + + /* light variants */ + --color-red-light: #{color.get('theme/red/light/12%')}; + --color-orange-light: #{color.get('theme/peach/light/12%')}; + --color-yellow-light: #{color.get('theme/yellow/light/12%')}; + --color-olive-light: #{color.get('theme/green/light/12%')}; + --color-green-light: #{color.get('theme/green/light/12%')}; + --color-teal-light: #{color.get('theme/teal/light/12%')}; + --color-blue-light: #{color.get('theme/blue/light/12%')}; + --color-violet-light: #{color.get('theme/lavender/light/12%')}; + --color-purple-light: #{color.get('theme/mauve/light/12%')}; + --color-pink-light: #{color.get('theme/pink/light/12%')}; + --color-brown-light: #{color.get('theme/flamingo/light/12%')}; + --color-grey-light: #{color.get('elevation/11')}; + --color-black-light: #{if( + is-dark, + color.get('theme/black/light/12%'), + color.get('theme/white/light/12%') + )}; + + /* other colors */ + --color-gold: #{color.get('theme/rosewater/base')}; + --color-white: #{color.get('text')}; + --color-diff-removed-word-bg: rgba(#{color.get('theme/red/base', 'rgb')}, 0.15); + --color-diff-added-word-bg: rgba(#{color.get('theme/green/base', 'rgb')}, 0.15); + --color-diff-removed-row-bg: rgba(#{color.get('theme/red/base', 'rgb')}, 0.07); + --color-diff-moved-row-bg: rgba(#{color.get('theme/yellow/base', 'rgb')}, 0.07); + --color-diff-added-row-bg: rgba(#{color.get('theme/green/base', 'rgb')}, 0.07); + --color-diff-removed-row-border: rgba(#{color.get('theme/red/base', 'rgb')}, 0.07); + --color-diff-moved-row-border: rgba(#{color.get('theme/yellow/base', 'rgb')}, 0.07); + --color-diff-added-row-border: rgba(#{color.get('theme/green/base', 'rgb')}, 0.07); + --color-diff-inactive: #{color.get('elevation/9')}; + --color-error-border: #{color.get('theme/red/base')}; + --color-error-bg: #{color.get('theme/red/base')}; + --color-error-bg-active: #{color.get('theme/red/light/6%')}; + --color-error-bg-hover: #{color.get('theme/red/light/12%')}; + --color-error-text: #{$lvl1}; + --color-success-border: #{color.get('theme/green/light/12%')}; + --color-success-bg: #{color.get('theme/green/base')}; + --color-success-text: #{$lvl1}; + --color-warning-border: #{color.get('theme/yellow/light/12%')}; + --color-warning-bg: #{color.get('theme/yellow/base')}; + --color-warning-text: #{$lvl1}; + --color-info-border: #{color.get('theme/blue/light/12%')}; + --color-info-bg: #{$lvl1}; + --color-info-text: #{color.get('text')}; + --color-red-badge: #{color.get('theme/red/light/12%')}; + --color-red-badge-bg: #{$lvl1}; + --color-red-badge-hover-bg: #{color.get('theme/red/light/6%')}; + --color-green-badge: #{color.get('theme/green/base')}; + --color-green-badge-bg: #{$lvl1}; + --color-green-badge-hover-bg: #{color.get('theme/green/light/6%')}; + --color-yellow-badge: #{color.get('theme/yellow/base')}; + --color-yellow-badge-bg: #{$lvl1}; + --color-yellow-badge-hover-bg: #{color.get('theme/yellow/light/6%')}; + --color-orange-badge: #{color.get('theme/peach/base')}; + --color-orange-badge-bg: #{$lvl1}; + --color-orange-badge-hover-bg: #{color.get('theme/peach/light/6%')}; + --color-git: #{color.get('theme/peach/base')}; + + /* target-based colors */ + --color-body: #{$lvl1}; + --color-box-header: #{$lvl2}; + --color-box-body: #{$lvl2}; + --color-box-body-highlight: #{color.get('elevation/4')}; + --color-text-dark: #{color.get('elevation/10')}; + --color-text: #{color.get('text')}; + --color-text-light: #{color.get('elevation/11')}; + --color-text-light-1: #{color.get('elevation/11')}; + --color-text-light-2: #{color.get('elevation/11')}; + --color-text-light-3: #{color.get('elevation/11')}; + --color-footer: #{$lvl2}; + --color-timeline: #{color.get('elevation/4')}; + --color-input-text: #{color.get('text')}; + --color-input-background: #{color.get('elevation/4')}; + --color-input-toggle-background: #{color.get('elevation/4')}; + --color-input-border: #{color.get('elevation/5')}; + --color-input-border-hover: #{color.get('elevation/6')}; + --color-header-wrapper: #{$lvl2}; + --color-header-wrapper-transparent: #00000000; + --color-light: #{color.get('elevation/6')}; + --color-light-mimic-enabled: rgba( + 0, + 0, + 0, + calc(40 / 255 * 222 / 255 / var(--opacity-disabled)) + ); + --color-light-border: #{color.get('elevation/6')}; + --color-hover: rgba(#{color.get('elevation/6', 'rgb')}, 0.1); + --color-active: rgba(#{color.get('text', 'rgb')}, 0.1); + --color-menu: #{color.get('elevation/4')}; + --color-card: #{color.get('elevation/4')}; + --color-markup-table-row: rgba(#{color.get('text', 'rgb')}, 0.02); + --color-markup-code-block: rgba(#{color.get('text', 'rgb')}, 0.05); + --color-button: #{color.get('elevation/4')}; + --color-code-bg: #{color.get('elevation/3')}; + --color-code-sidebar-bg: #{color.get('elevation/4')}; + --color-shadow: rgba(#{$lvl1-rgb}, 0.1); + --color-secondary-bg: #{color.get('elevation/4')}; + --color-text-focus: #{color.get('text')}; + --color-expand-button: #{color.get('elevation/6')}; + --color-placeholder-text: #{color.get('elevation/6')}; + --color-editor-line-highlight: var(--color-primary-light-5); + --color-project-board-bg: var(--color-secondary-light-2); + --color-caret: var(--color-text); + --color-reaction-bg: rgba(#{color.get('text', 'rgb')}, 0.07); + --color-reaction-active-bg: var(--color-primary-alpha-40); + --color-nav-bg: #{$lvl2}; + --color-nav-hover-bg: #{color.get('elevation/6')}; + --color-label-active-bg: #{color.get('elevation/6')}; + --color-accent: var(--color-primary-light-1); + --color-small-accent: var(--color-primary-light-5); + --color-active-line: #{color.get('elevation/5')}; + } + + @if $is-dark { + /* invert emojis that are hard to read otherwise */ + .emoji[aria-label='check mark'], + .emoji[aria-label='currency exchange'], + .emoji[aria-label='TOP arrow'], + .emoji[aria-label='END arrow'], + .emoji[aria-label='ON! arrow'], + .emoji[aria-label='SOON arrow'], + .emoji[aria-label='heavy dollar sign'], + .emoji[aria-label='copyright'], + .emoji[aria-label='registered'], + .emoji[aria-label='trade mark'], + .emoji[aria-label='multiply'], + .emoji[aria-label='plus'], + .emoji[aria-label='minus'], + .emoji[aria-label='divide'], + .emoji[aria-label='curly loop'], + .emoji[aria-label='double curly loop'], + .emoji[aria-label='wavy dash'], + .emoji[aria-label='paw prints'], + .emoji[aria-label='musical note'], + .emoji[aria-label='musical notes'] { + filter: invert(100%) hue-rotate(180deg); + } + } + + .ui.ui.ui.button:not(.inverted, .basic), + .ui.ui.ui.label:not(.inverted, .basic) { + &.primary, + &.green, + &.red, + &.teal { + color: $lvl1; + &:hover { + color: $lvl3; + } + } + } + + .ui.basic.modal { + background-color: $lvl3; + } + + // link color for signed commits + .ui.commit-header-row .svg.gitea-lock ~ a { + color: $lvl1; + } + + // most recent commit hover when signed + .ui.sha.isSigned.isVerified:hover { + .shortsha { + color: $lvl1; + } + svg.gitea-lock { + fill: $lvl1; + } + } + + // modal text color for the "Remove GPG Key" modal + .ui.basic.modal, + .ui.basic.modal > .header, + .ui.inverted.button { + color: color.get('text') !important; + } + + ::selection { + background: rgba(#{color.get('theme/rosewater/base', 'rgb')}, 0.3) !important; + } + + body { + font-size: var.get('base-font-size'); + } + + @include chroma.make-chroma-styles; + @include codemirror.make-code-mirror-styles; +} diff --git a/src/themes/scss/gitea/modules/_chroma.scss b/src/themes/scss/gitea/modules/_chroma.scss new file mode 100644 index 0000000..a496bc1 --- /dev/null +++ b/src/themes/scss/gitea/modules/_chroma.scss @@ -0,0 +1,310 @@ +@use '@lucas-labs/lui-micro/color' as color; +@use '@lucas-labs/lui-micro/var' as var; + + +// variables: ( +// 'base-font-size': 16px, +// 'font-family': 'Roboto, sans-serif', +// 'code-font-family': '"Source Code Pro", "Roboto Mono", Consolas, monospace', +// ), + +@mixin make-chroma-styles { + .chroma .code-inner{ + font: 14px var.get('code-font-family'); + } + + /* NameBuiltinPseudo */ + .chroma .bp { + color: color.get('theme/peach/base'); + } + /* Comment */ + .chroma .c { + color: color.get('elevated/7'); + } + /* CommentSingle */ + .chroma .c1 { + color: color.get('elevated/7'); + } + /* CommentHashbang */ + .chroma .ch { + color: color.get('elevated/7'); + } + /* CommentMultiline */ + .chroma .cm { + color: color.get('elevated/7'); + } + /* CommentPreproc */ + .chroma .cp { + color: color.get('theme/blue/base'); + } + /* CommentPreprocFile */ + .chroma .cpf { + color: color.get('theme/blue/base'); + } + /* CommentSpecial */ + .chroma .cs { + color: color.get('elevated/7'); + } + /* LiteralStringDelimiter */ + .chroma .dl { + color: color.get('theme/blue/base'); + } + /* NameFunctionMagic */ + .chroma .fm { + } + /* Generic */ + .chroma .g { + } + /* GenericDeleted */ + .chroma .gd { + color: color.get('theme'); + background-color: rgba(#{color.get('theme/red/base', 'rgb')}, 0.15); + } + /* GenericEmph */ + .chroma .ge { + font-style: italic; + } + /* GenericHeading */ + .chroma .gh { + color: color.get('theme/sky/base'); + } + /* GenericInserted */ + .chroma .gi { + color: color.get('theme'); + background-color: rgba(#{color.get('theme/green/base', 'rgb')}, 0.15); + } + /* GenericUnderline */ + .chroma .gl { + } + /* GenericOutput */ + .chroma .go { + color: color.get('theme/peach/base'); + } + /* GenericPrompt */ + .chroma .gp { + color: color.get('elevated/7'); + font-weight: bold; + } + /* GenericError */ + .chroma .gr { + color: color.get('theme/maroon/base'); + } + /* GenericStrong */ + .chroma .gs { + font-weight: bold; + } + /* GenericTraceback */ + .chroma .gt { + color: color.get('theme/maroon/base'); + } + /* GenericSubheading */ + .chroma .gu { + color: color.get('theme/sky/base'); + } + /* LiteralNumberIntegerLong */ + .chroma .il { + color: color.get('theme/peach/base'); + } + /* Keyword */ + .chroma .k { + color: color.get('theme/mauve/base'); + } + /* KeywordConstant */ + .chroma .kc { + color: color.get('theme/yellow/base'); + } + /* KeywordDeclaration */ + .chroma .kd { + color: color.get('theme/mauve/base'); + } + /* KeywordNamespace */ + .chroma .kn { + color: color.get('theme/yellow/base'); + } + /* KeywordPseudo */ + .chroma .kp { + color: color.get('theme/mauve/base'); + font-weight: bold; + } + /* KeywordReserved */ + .chroma .kr { + color: color.get('theme/mauve/base'); + } + /* KeywordType */ + .chroma .kt { + color: color.get('theme/yellow/base'); + } + /* Literal */ + .chroma .l { + } + /* LiteralDate */ + .chroma .ld { + } + /* LiteralNumber */ + .chroma .m { + color: color.get('theme/peach/base'); + } + /* LiteralNumberBin */ + .chroma .mb { + color: color.get('theme/peach/base'); + } + /* LiteralNumberFloat */ + .chroma .mf { + color: color.get('theme/peach/base'); + } + /* LiteralNumberHex */ + .chroma .mh { + color: color.get('theme/peach/base'); + } + /* LiteralNumberInteger */ + .chroma .mi { + color: color.get('theme/peach/base'); + } + /* LiteralNumberOct */ + .chroma .mo { + color: color.get('theme/peach/base'); + } + /* Name */ + .chroma .n { + color: color.get('theme/lavender/base'); + } + /* NameAttribute */ + .chroma .na { + color: color.get('theme/yellow/base'); + } + /* NameBuiltin */ + .chroma .nb { + color: color.get('theme/peach/base'); + } + /* NameClass */ + .chroma .nc { + color: color.get('theme/yellow/base'); + } + /* NameDecorator */ + .chroma .nd { + color: color.get('theme/pink/base'); + } + /* NameException */ + .chroma .ne { + color: color.get('theme/maroon/base'); + } + /* NameFunction */ + .chroma .nf { + color: color.get('theme/blue/base'); + } + /* NameEntity */ + .chroma .ni { + color: color.get('theme/pink/base'); + } + /* NameLabel */ + .chroma .nl { + color: color.get('theme/yellow/base'); + } + /* NameNamespace */ + .chroma .nn { + color: color.get('theme/yellow/base'); + } + /* NameConstant */ + .chroma .no { + color: color.get('theme/yellow/base'); + } + /* NameTag */ + .chroma .nt { + color: color.get('theme/mauve/base'); + } + /* NameVariable */ + .chroma .nv { + color: color.get('theme/peach/base'); + } + /* NameOther */ + .chroma .nx { + color: color.get('theme/peach/base'); + } + /* Operator */ + .chroma .o { + color: color.get('theme/sky/base'); + } + /* OperatorWord */ + .chroma .ow { + color: color.get('theme/sky/base'); + font-weight: bold; + } + /* Punctuation */ + .chroma .p { + color: color.get('elevated/9'); + } + /* NameProperty */ + .chroma .py { + } + /* LiteralString */ + .chroma .s { + color: color.get('theme/green/base'); + } + /* LiteralStringSingle */ + .chroma .s1 { + color: color.get('theme/green/base'); + } + /* LiteralStringDouble */ + .chroma .s2 { + color: color.get('theme/green/base'); + } + /* LiteralStringAffix */ + .chroma .sa { + color: color.get('theme/green/base'); + } + /* LiteralStringBacktick */ + .chroma .sb { + color: color.get('theme/green/base'); + } + /* LiteralStringChar */ + .chroma .sc { + color: color.get('theme/green/base'); + } + /* LiteralStringDoc */ + .chroma .sd { + color: color.get('theme/green/base'); + } + /* LiteralStringEscape */ + .chroma .se { + color: color.get('theme/blue/base'); + } + /* LiteralStringHeredoc */ + .chroma .sh { + color: color.get('theme/green/base'); + } + /* LiteralStringInterpol */ + .chroma .si { + color: color.get('theme/green/base'); + } + /* LiteralStringRegex */ + .chroma .sr { + color: color.get('theme/blue/base'); + } + /* LiteralStringSymbol */ + .chroma .ss { + color: color.get('theme/green/base'); + } + /* LiteralStringOther */ + .chroma .sx { + color: color.get('theme/green/base'); + } + /* NameVariableClass */ + .chroma .vc { + color: color.get('theme/yellow/base'); + } + /* NameVariableGlobal */ + .chroma .vg { + color: color.get('theme/peach/base'); + } + /* NameVariableInstance */ + .chroma .vi { + color: color.get('theme/yellow/base'); + } + /* NameVariableMagic */ + .chroma .vm { + } + /* TextWhitespace */ + .chroma .w { + color: color.get('elevated/4'); + } +} diff --git a/src/themes/scss/gitea/modules/_codemirror.scss b/src/themes/scss/gitea/modules/_codemirror.scss new file mode 100644 index 0000000..ae47773 --- /dev/null +++ b/src/themes/scss/gitea/modules/_codemirror.scss @@ -0,0 +1,95 @@ +@use '@lucas-labs/lui-micro/color' as color; + +@mixin make-code-mirror-styles { + .CodeMirror, + .CodeMirror.cm-s-default, + .CodeMirror.cm-s-paper { + .cm-property { + color: color.get('text') + } + + .cm-header { + color: color.get('text') + } + + .cm-quote { + color: color.get('theme/green/base') + } + + .cm-keyword { + color: color.get('theme/mauve/base'); + } + + .cm-atom { + color: color.get('theme/red/base'); + } + + .cm-number { + color: color.get('theme/peach/base'); + } + + .cm-def { + color: color.get('text') + } + + .cm-variable-2 { + color: color.get('theme/sky/base'); + } + + .cm-variable-3 { + color: color.get('theme/teal/base'); + } + + .cm-comment { + color: color.get('elevation/6') + } + + .cm-string { + color: color.get('theme/green') + } + + .cm-string-2 { + color: color.get('theme/green') + } + + .cm-meta { + color: color.get('theme/peach/base'); + } + + .cm-qualifier { + color: color.get('theme/peach/base'); + } + + .cm-builtin { + color: color.get('theme/peach/base'); + } + + .cm-bracket { + color: color.get('text') + } + + .cm-tag { + color: color.get('theme/yellow/base'); + } + + .cm-attribute { + color: color.get('theme/yellow/base'); + } + + .cm-hr { + color: color.get('elevation/9'); + } + + .cm-url { + color: color.get('theme/blue/base'); + } + + .cm-link { + color: color.get('theme/blue/base'); + } + + .cm-error { + color: color.get('theme/red/base'); + } + } +} diff --git a/src/themes/scss/utils/_color-utils.scss b/src/themes/scss/utils/_color-utils.scss new file mode 100644 index 0000000..c8ade23 --- /dev/null +++ b/src/themes/scss/utils/_color-utils.scss @@ -0,0 +1,85 @@ +@use 'sass:color'; +@use 'sass:map'; + +@function light-change($color, $amount, $isDark) { + $multiplier: if($isDark, -1, 1); + @return color.adjust($color, $lightness: $amount * $multiplier); +} + +@function alpha-change($color, $alpha) { + @return color.change($color, $alpha: $alpha); +} + +@function color-variants-light($color, $is-dark, $with-base: false) { + $set: ( + '3%': light-change($color, -3%, $is-dark), + '6%': light-change($color, -6%, $is-dark), + '9%': light-change($color, -9%, $is-dark), + '12%': light-change($color, -12%, $is-dark), + '15%': light-change($color, -15%, $is-dark), + '18%': light-change($color, -18%, $is-dark), + '21%': light-change($color, -21%, $is-dark), + '24%': light-change($color, -24%, $is-dark), + '27%': light-change($color, -27%, $is-dark), + '30%': light-change($color, -30%, $is-dark), + '33%': light-change($color, -33%, $is-dark), + '36%': light-change($color, -36%, $is-dark), + '39%': light-change($color, -39%, $is-dark) + ); + + @if $with-base { + $set: map.merge((base: $color), $set); + } + + @return $set; +} + +@function color-variants-dark($color, $is-dark, $with-base: false) { + $set: ( + '3%': light-change($color, 3%, $is-dark), + '6%': light-change($color, 6%, $is-dark), + '9%': light-change($color, 9%, $is-dark), + '12%': light-change($color, 12%, $is-dark), + '15%': light-change($color, 15%, $is-dark), + '18%': light-change($color, 18%, $is-dark), + '21%': light-change($color, 21%, $is-dark), + '24%': light-change($color, 24%, $is-dark), + '27%': light-change($color, 27%, $is-dark), + '30%': light-change($color, 30%, $is-dark), + '33%': light-change($color, 33%, $is-dark), + '36%': light-change($color, 36%, $is-dark), + '39%': light-change($color, 39%, $is-dark), + ); + + @if $with-base { + $set: map.merge((base: $color), $set); + } + + @return $set; +} + +@function variants($color, $is-dark, $light: true, $dark: true, $base: true, $override-base-with: null) { + $set: (); + + // base: $color, + // light: color-variants-light($color, $is-dark), + // dark: color-variants-dark($color, $is-dark), + + @if $light { + $set: map.merge($set, (light: color-variants-light($color, $is-dark))); + } + + @if $dark { + $set: map.merge($set, (dark: color-variants-dark($color, $is-dark))); + } + + @if $base { + @if $override-base-with { + $set: map.merge($set, (base: $override-base-with)); + } @else { + $set: map.merge($set, (base: $color)); + } + } + + @return $set; +} \ No newline at end of file diff --git a/tools/build.js b/tools/build.js new file mode 100644 index 0000000..91c3702 --- /dev/null +++ b/tools/build.js @@ -0,0 +1,43 @@ +import { join } from 'path'; +import { cwd } from 'process'; +import { mkdirSync, rmSync, existsSync } from 'fs'; +import { buildScss } from './tasks/scss.js'; +import { buildImg } from './tasks/img.js'; +import { buildTemplates } from './tasks/templates.js'; +import { Logger } from './utils/logger.js'; +import { buildFonts } from './tasks/fonts.js'; +const srcPath = join(cwd(), 'src'); +const distPath = join(cwd(), 'dist'); + +const logger = new Logger('build', 'info', 'brightMagenta'); + +function exit(err) { + if (err) { + console.error(err); + } else { + console.log('') + logger.info('Build completed successfully'); + } + + process.exit(err ? 1 : 0); +} + +async function build() { + // cleaning, remove dist folder + if (existsSync(distPath)) { + rmSync(distPath, { recursive: true }); + } + + // recreate dist folder + mkdirSync(distPath, { recursive: true }); + + // start building tasks + await Promise.all([ + buildScss(srcPath, distPath), + buildImg(srcPath, distPath), + buildFonts(srcPath, distPath), + buildTemplates(srcPath, distPath), + ]); +} + +build().then(exit).catch(exit); diff --git a/tools/deploy.js b/tools/deploy.js new file mode 100644 index 0000000..71e4c92 --- /dev/null +++ b/tools/deploy.js @@ -0,0 +1,34 @@ +import { Logger } from './utils/logger.js'; +import { getArg } from './utils/funcs.js'; +import { resolve } from 'path'; +import { cwd } from 'process'; +import { deploy } from './tasks/deploy.js'; + +const logger = new Logger('deploy', 'info', 'brightMagenta'); + +const src = './src'; +const dist = './dist'; +const serviceName = getArg('--service', 'gitea'); +const srcPath = resolve(cwd(), src); +const distPath = resolve(cwd(), dist); +const serverPath = resolve( + cwd(), + getArg('--sever', 'D:/users/lucas/Desktop/dev/server/gitea') +); + +logger.info('Deploy started!'); +logger.info(`Service name: '${serviceName}'`); +logger.info(`Src path: ${srcPath}`); +logger.info(`Dist path: ${distPath}`); +logger.info(`Server path: ${serverPath}`); + +function exit(err) { + err && logger.error(err); + process.exit(err ? 1 : 0); +} + +async function executeDeployTask() { + await deploy(srcPath, distPath, serverPath, serviceName); +} + +executeDeployTask().then(exit).catch(exit); diff --git a/tools/restart.js b/tools/restart.js new file mode 100644 index 0000000..ad9f34b --- /dev/null +++ b/tools/restart.js @@ -0,0 +1,19 @@ +import { getArg } from './utils/funcs.js'; +import { restartService } from './tasks/restart-service.js'; +import { Logger } from './utils/logger.js'; + +const logger = new Logger('restart', 'info', 'brightMagenta'); +const serviceName = getArg('--service', 'gitea'); + +function exit(err) { + if (err) { + console.error(err); + } else { + console.log(''); + logger.info('Build completed successfully'); + } + + process.exit(err ? 1 : 0); +} + +restartService(serviceName).then(exit).catch(exit); diff --git a/tools/serve.js b/tools/serve.js new file mode 100644 index 0000000..a327f50 --- /dev/null +++ b/tools/serve.js @@ -0,0 +1,40 @@ +import { watch } from 'chokidar'; +import { TaskDebouncer } from './utils/task-debouncer.js'; +import { Logger } from './utils/logger.js'; +import { getArg } from './utils/funcs.js'; +import { resolve } from 'path'; +import { cwd } from 'process'; +import { deploy } from './tasks/deploy.js'; + +const src = './src'; +const dist = './dist'; +const serviceName = getArg('--service', 'gitea'); +const srcPath = resolve(cwd(), src); +const distPath = resolve(cwd(), dist); +const serverPath = resolve( + cwd(), + getArg('--sever', 'D:/users/lucas/Desktop/dev/server/gitea') +); +const debouncer = new TaskDebouncer(300); +const logger = new Logger('serve', 'info', 'brightMagenta'); + +logger.info('Serve task started!'); +logger.info('Watching for changes...'); +logger.info(`Service name: '${serviceName}'`); +logger.info(`Src path: ${srcPath}`); +logger.info(`Dist path: ${distPath}`); +logger.info(`Server path: ${serverPath}`); + +const watcher = watch([`${src}/**/*`], { + persistent: true, + ignoreInitial: true, +}); + +watcher.on('change', (file) => debouncer.add( + deploy, + srcPath, + distPath, + serverPath, + serviceName, + file, +)); diff --git a/tools/tasks/copy-to.js b/tools/tasks/copy-to.js new file mode 100644 index 0000000..1cbbf50 --- /dev/null +++ b/tools/tasks/copy-to.js @@ -0,0 +1,34 @@ +import fs from 'fs'; +import path from 'path'; +import { Logger } from '../utils/logger.js'; + +const logger = new Logger(copyTo.name, 'info', 'brightYellow'); + +export async function copyTo(sourcePath, targetPath) { + logger.info(`Copying ${sourcePath} to ${targetPath}`); + await recursiveCopy(sourcePath, targetPath); + logger.info(`Copy has finished!`); +} + +async function recursiveCopy(sourcePath, targetPath) { + // Create the target directory if it doesn't exist + if (!fs.existsSync(targetPath)) { + fs.mkdirSync(targetPath, { recursive: true }); + } + + // Get all files and directories in the source path + const files = fs.readdirSync(sourcePath, { withFileTypes: true }); + + for (const file of files) { + const sourceFile = path.join(sourcePath, file.name); + const targetFile = path.join(targetPath, file.name); + + if (file.isDirectory()) { + // Recursively copy directories + await recursiveCopy(sourceFile, targetFile); + } else { + // Copy files + fs.copyFileSync(sourceFile, targetFile); + } + } +} diff --git a/tools/tasks/deploy.js b/tools/tasks/deploy.js new file mode 100644 index 0000000..dc2ce13 --- /dev/null +++ b/tools/tasks/deploy.js @@ -0,0 +1,33 @@ +import { Logger } from '../utils/logger.js'; +import { buildScss } from './scss.js'; +import { buildFonts } from './fonts.js'; +import { buildTemplates } from './templates.js'; +import { copyTo } from './copy-to.js'; +import { restartService } from './restart-service.js'; +import { extname } from 'path'; + +const logger = new Logger('deploy', 'info', 'brightMagenta'); + +export async function deploy(srcPath, distPath, serverPath, serviceName, file = null) { + logger.info('Deploying...'); + + let shouldRestart = true; + + // check if it's an scss + if (file !== null && file !== undefined && extname(file) === '.scss') { + shouldRestart = false; + } + + + try { + await buildScss(srcPath, distPath); + await buildFonts(srcPath, distPath); + await buildTemplates(srcPath, distPath); + await copyTo(distPath, serverPath); + shouldRestart && await restartService(serviceName); + + logger.info('Deployment successful!'); + } catch (error) { + logger.error(`Deployment failed: ${error}`); + } +} diff --git a/tools/tasks/fonts.js b/tools/tasks/fonts.js new file mode 100644 index 0000000..d95ee16 --- /dev/null +++ b/tools/tasks/fonts.js @@ -0,0 +1,32 @@ +import { copyFileSync, mkdirSync } from 'fs'; +import { join } from 'path'; +import { readFiles } from '../utils/funcs.js'; +import { Logger } from '../utils/logger.js'; + +const logger = new Logger(buildFonts.name, 'info', 'brightCyan'); +const imgSrc = 'themes/fonts'; +const imgDest = '/public/fonts'; + +export async function buildFonts(srcHome, distHome) { + logger.info('Fonts build has started'); + const fontsSrcPath = join(srcHome, imgSrc); + const fontsDestPath = join(distHome, imgDest); + + mkdirSync(fontsDestPath, { recursive: true }); + + const files = readFiles(fontsSrcPath, [ + '.woff', + '.woff2', + '.ttf', + '.eot', + '.svg', + '.otf', + ]); + + for (const file of files) { + // just copy the file + copyFileSync(join(fontsSrcPath, file), join(fontsDestPath, file)); + } + + logger.info('Fonts build has finished'); +} diff --git a/tools/tasks/img.js b/tools/tasks/img.js new file mode 100644 index 0000000..92f7165 --- /dev/null +++ b/tools/tasks/img.js @@ -0,0 +1,129 @@ +import { fabric } from 'fabric'; +import imageminZopfli from 'imagemin-zopfli'; +import { readFile, writeFile } from 'node:fs/promises'; +import { join, basename } from 'path'; +import { optimize } from 'svgo'; +import { readFiles } from '../utils/funcs.js'; +import { Logger } from '../utils/logger.js'; +import { mkdirSync, copyFileSync } from 'fs'; + +const logger = new Logger(buildImg.name, 'info', 'brightGreen'); +const imgSrc = 'themes/img'; +const imgDest = '/public/img'; + +export async function buildImg(srcHome, distHome) { + logger.info('Images build has started'); + const imgSrcPath = join(srcHome, imgSrc); + const imgDestPath = join(distHome, imgDest); + const images = { logos: { logo: undefined, favicon: undefined }, others: [] }; + mkdirSync(imgDestPath, { recursive: true }); + + const files = readFiles(imgSrcPath, ['.svg', '.png', '.jpg', '.webp', '.gif']); + + // Separate logo.svg and favicon.svg from the rest + files.forEach((file) => { + if (file === 'logo.svg') { + images.logos.logo = join(imgSrcPath, file); + } else if (file === 'favicon.svg') { + images.logos.favicon = join(imgSrcPath, file); + } else { + images.others.push(join(imgSrcPath, file)); + } + }); + + await Promise.all([ + processLogos(images.logos, imgDestPath), + processOthers(images.others, imgDestPath), + ]) + + logger.info('Images build has finished'); +} + +async function processLogos(logos, distHome) { + const promises = []; + + if (logos.logo) { + const svg = await readFile(logos.logo, 'utf8'); + promises.push(generate(svg, join(distHome, 'logo.svg'), { size: 32 })); + promises.push(generate(svg, join(distHome, 'logo.png'), { size: 512 })); + } + + if (logos.favicon) { + const svg = await readFile(logos.favicon, 'utf8'); + promises.push( + generate(svg, join(distHome, 'favicon.svg'), { size: 32 }), + generate(svg, join(distHome, 'favicon.png'), { size: 180 }), + generate(svg, join(distHome, 'apple-touch-icon.png'), { size: 180, bg: true }), + generate(svg, join(distHome, 'avatar_default.png'), { size: 200, bg: true }) + ); + } + + await Promise.all(promises); +} + +function loadSvg(svg) { + return new Promise((resolve) => { + fabric.loadSVGFromString(svg, (objects, options) => { + resolve({ objects, options }); + }); + }); +} + +async function generate(svg, path, { size, bg }) { + if (String(path).endsWith('.svg')) { + const { data } = optimize(svg, { + plugins: [ + 'preset-default', + 'removeDimensions', + { + name: 'addAttributesToSVGElement', + params: { attributes: [{ height: size }] }, + }, + ], + }); + await writeFile(path, data); + return; + } + + const { objects, options } = await loadSvg(svg); + const canvas = new fabric.Canvas(); + + + const newWidth = size * options.width / options.height; + canvas.setDimensions({ width: newWidth, height: size }); + const ctx = canvas.getContext('2d'); + ctx.scale( + options.width ? newWidth / options.width : 1, + options.height ? size / options.height : 1 + ); + + if (bg) { + canvas.add( + new fabric.Rect({ + left: 0, + top: 0, + height: size * (1 / (size / options.height)), + width: size * (1 / (size / options.width)), + fill: 'black', + }) + ); + } + + canvas.add(fabric.util.groupSVGElements(objects, options)); + canvas.renderAll(); + + let png = Buffer.from([]); + for await (const chunk of canvas.createPNGStream()) { + png = Buffer.concat([png, chunk]); + } + + png = await imageminZopfli({ more: true })(png); + await writeFile(path, png); +} + +async function processOthers(others, distHome) { + // just copy the rest of the images to dist + for (const img of others) { + copyFileSync(img, join(distHome, basename(img))); + } +} \ No newline at end of file diff --git a/tools/tasks/restart-service.js b/tools/tasks/restart-service.js new file mode 100644 index 0000000..6967657 --- /dev/null +++ b/tools/tasks/restart-service.js @@ -0,0 +1,31 @@ +import { exec } from 'child_process'; + +import { Logger } from '../utils/logger.js'; +const logger = new Logger(restartService.name, 'info', 'brightRed'); + +export async function restartService(serviceName) { + return new Promise((resolve, reject) => { + logger.info(`Restarting '${serviceName}' service...`); + + let command; + let args; + + if (process.platform === 'win32') { + command = 'cmd.exe'; + args = ['/c', 'net', 'stop', serviceName, '&&', 'net', 'start', serviceName]; + } else { + command = 'sudo'; + args = ['systemctl', 'restart', serviceName]; + } + + exec(`${command} ${args.join(' ')}`, (error, stdout) => { + if (error) { + logger.error(`Failed to restart '${serviceName}' service: ${error}`); + reject(error); + } else { + logger.info(`'${serviceName}' service restarted!`); + resolve(stdout); + } + }); + }); +} diff --git a/tools/tasks/scss.js b/tools/tasks/scss.js new file mode 100644 index 0000000..98d5185 --- /dev/null +++ b/tools/tasks/scss.js @@ -0,0 +1,64 @@ +import { mkdirSync, readdirSync, writeFileSync } from 'fs'; +import { join } from 'path'; +import { Logger } from '../utils/logger.js'; +import { compile } from 'sass'; + +const logger = new Logger(buildScss.name, 'debug', 'pink'); +const scss_home = 'themes/scss'; +const css_home = '/public/css'; + +export async function buildScss(src_home, dist_home) { + logger.info('SCSS build has started'); + const themes = get_themes(src_home); + mkdirSync(join(dist_home, css_home), { recursive: true }); + + for (const theme of themes) { + logger.debug(`Building ${theme.name} theme`); + + const result = compile(theme.path, { + loadPaths: [join(src_home, scss_home), join(src_home, '../node_modules')], + quietDeps: true, + logger: { + debug: logger.simpleDebug.bind(logger), + info: logger.simpleInfo.bind(logger), + warn: logger.simpleWarn.bind(logger), + error: logger.simpleError.bind(logger), + } + }); + + logger.debug(`Writing ${theme.name} theme to disk`); + + writeFileSync( + join(dist_home, css_home, `theme-${theme.name}.css`), + result.css + ); + } + + logger.info('SCSS build has finished'); +} + + +function get_themes(src_home) { + return readdirSync(join(src_home, scss_home)).filter( + (fn) => fn.endsWith('.scss') && !fn.startsWith('_') + ).map((file) => ({ + name: file.replace('.scss', ''), + path: join(src_home, scss_home, file), + })) +} + + +// for (const flavor of Object.keys(variants)) { +// for (const accent of accents) { +// const input = builder(flavor, accent); +// const result = compileString(input, { +// loadPaths: [join(__dirname, 'src'), join(__dirname, 'node_modules')], +// }); + +// mkdirSync(join(__dirname, 'dist'), { recursive: true }); +// writeFileSync( +// join(__dirname, 'dist', `theme-catppuccin-${flavor}-${accent}.css`), +// result.css +// ); +// } +// } diff --git a/tools/tasks/templates.js b/tools/tasks/templates.js new file mode 100644 index 0000000..e1f4575 --- /dev/null +++ b/tools/tasks/templates.js @@ -0,0 +1,17 @@ +import { join } from 'path'; +import { copyFolderRecursiveSync } from '../utils/funcs.js'; +import { Logger } from '../utils/logger.js'; + +const logger = new Logger(buildTemplates.name, 'info', 'blue'); +const imgSrc = 'templates'; +const imgDest = '/'; + +export async function buildTemplates(srcHome, distHome) { + logger.info('Fonts build has started'); + const tmplSrcPath = join(srcHome, imgSrc); + const tmplDestPath = join(distHome, imgDest); + + // just copy the entire tmplSrcPath to tmplDestPath + copyFolderRecursiveSync(tmplSrcPath, tmplDestPath); + logger.info('Templates build has finished'); +} diff --git a/tools/utils/funcs.js b/tools/utils/funcs.js new file mode 100644 index 0000000..8403d45 --- /dev/null +++ b/tools/utils/funcs.js @@ -0,0 +1,162 @@ +import { + existsSync, + lstatSync, + mkdirSync, + readFileSync, + readdirSync, + writeFileSync, +} from 'fs'; +import { basename, join } from 'path'; + +export function readFiles(path, extensions) { + return readdirSync(path).filter((file) => + extensions.some((ext) => file.endsWith(ext)) + ); +} + +function copyFileSync(source, target) { + var targetFile = target; + + // If target is a directory, a new file with the same name will be created + if (existsSync(target)) { + if (lstatSync(target).isDirectory()) { + targetFile = join(target, basename(source)); + } + } + + writeFileSync(targetFile, readFileSync(source)); +} + +export function copyFolderRecursiveSync(source, target) { + var files = []; + + var targetFolder = join(target, basename(source)); + if (!existsSync(targetFolder)) { + mkdirSync(targetFolder); + } + + // Copy + if (lstatSync(source).isDirectory()) { + files = readdirSync(source); + files.forEach(function (file) { + var curSource = join(source, file); + if (lstatSync(curSource).isDirectory()) { + copyFolderRecursiveSync(curSource, targetFolder); + } else { + copyFileSync(curSource, targetFolder); + } + }); + } +} + +// https://github.com/bjoerge/debounce-promise/blob/master/index.js +export function debounce(fn, wait = 0, options = {}) { + let lastCallAt; + let deferred; + let timer; + let pendingArgs = []; + return function debounced(...args) { + const currentWait = getWait(wait); + const currentTime = new Date().getTime(); + + const isCold = !lastCallAt || currentTime - lastCallAt > currentWait; + + lastCallAt = currentTime; + + if (isCold && options.leading) { + return options.accumulate + ? Promise.resolve(fn.call(this, [args])).then((result) => result[0]) + : Promise.resolve(fn.call(this, ...args)); + } + + if (deferred) { + clearTimeout(timer); + } else { + deferred = defer(); + } + + pendingArgs.push(args); + timer = setTimeout(flush.bind(this), currentWait); + + if (options.accumulate) { + const argsIndex = pendingArgs.length - 1; + return deferred.promise.then((results) => results[argsIndex]); + } + + return deferred.promise; + }; + + function flush() { + const thisDeferred = deferred; + clearTimeout(timer); + + Promise.resolve( + options.accumulate + ? fn.call(this, pendingArgs) + : fn.apply(this, pendingArgs[pendingArgs.length - 1]) + ).then(thisDeferred.resolve, thisDeferred.reject); + + pendingArgs = []; + deferred = null; + } +} + +function getWait(wait) { + return typeof wait === 'function' ? wait() : wait; +} + +function defer() { + const deferred = {}; + deferred.promise = new Promise((resolve, reject) => { + deferred.resolve = resolve; + deferred.reject = reject; + }); + return deferred; +} + +export async function sequence(tasks) { + const results = []; + for (const task of tasks) { + results.push(await task()); + } + return results; +} + + +async function tasksRunner(tasks, abort) { + let result = null; + for (const task of tasks) { + if (abort.signal.aborted) { + break; + } + + result = await task(result); + } +} + +// each task should return a promise +// each task takes the result of the previous task as an argument +// the output of the last task is the output of the sequence +export async function sequenceStream(tasks) { + const abort = new AbortController(); + + abort.signal.addEventListener('abort', () => { + console.log('sequenceStream aborted'); + }); + + return [ + tasksRunner(tasks, abort), + abort, + ] +} + +export const getArg = (flag, def) => { + const args = process.argv.slice(2); + const flagIndex = args.findIndex(arg => arg === flag); + + if (flagIndex !== -1 && flagIndex + 1 < args.length) { + return args[flagIndex + 1]; + } + + return def || null; +}; \ No newline at end of file diff --git a/tools/utils/logger.js b/tools/utils/logger.js new file mode 100644 index 0000000..95daa45 --- /dev/null +++ b/tools/utils/logger.js @@ -0,0 +1,105 @@ +const LOG_LEVEL_MAP = { + debug: 0, + info: 1, + warn: 2, + error: 3, +}; + +const ANSI_COLORS = { + reset: '\x1b[0m', + black: '\x1b[30m', + red: '\x1b[31m', + green: '\x1b[32m', + yellow: '\x1b[33m', + blue: '\x1b[34m', + magenta: '\x1b[35m', + cyan: '\x1b[36m', + white: '\x1b[37m', + gray: '\x1b[90m', + brightRed: '\x1b[91m', + brightGreen: '\x1b[92m', + brightYellow: '\x1b[93m', + brightBlue: '\x1b[94m', + brightMagenta: '\x1b[95m', + brightCyan: '\x1b[96m', + pink: '\x1b[38;2;255;182;193m' +}; + +export class Logger { + /** + * @param {string} ctx + * @param {'debug'|'info'|'warn'|'error'} log_level - default: 'debug' + * @param {'red'|'green'|'yellow'|'blue'|'magenta'|'cyan'|'white'|'gray'|'brightRed'| + * 'brightGreen'|'brightYellow'|'brightBlue'|'brightMagenta'|'brightCyan'|'pink'} color - default: 'magenta' + */ + constructor(ctx, log_level, color = 'magenta') { + this.ctx = ctx; + this.log_level = LOG_LEVEL_MAP[log_level || 'debug']; + this.color = ANSI_COLORS[color] || ANSI_COLORS.reset; + + if (this.log_level === undefined) { + throw new Error(`Invalid log level: ${log_level}`); + } + } + + debug(...args) { + if (!this.#canLog('debug')) return; + this.log('DEBUG', false, ...args); + } + + info(...args) { + if (!this.#canLog('info')) return; + this.log('INFO', false, ...args); + } + + warn(...args) { + if (!this.#canLog('warn')) return; + this.log('WARN', false, ...args); + + } + + error(...args) { + if (!this.#canLog('error')) return; + this.log('ERROR', false, ...args); + } + + log(level, simple, ...args) { + if (simple) { + args = [args[0]]; + } + + if (level === 'ERROR') { + console.error( + `${this.color}[${level}] [${this.ctx}]${ANSI_COLORS.reset}`, + ...args + ); + } else { + console.log('🍵', `${this.color}[${this.ctx}]${ANSI_COLORS.reset}`, ...args); + } + } + + simpleDebug(...args) { + if (!this.#canLog('debug')) return; + this.log('DEBUG', true, ...args); + } + + simpleInfo(...args) { + if (!this.#canLog('info')) return; + this.log('INFO', true, ...args); + } + + simpleWarn(...args) { + if (!this.#canLog('warn')) return; + this.log('WARN', true, ...args); + + } + + simpleError(...args) { + if (!this.#canLog('error')) return; + this.log('ERROR', true, ...args); + } + + #canLog(level) { + return this.log_level <= LOG_LEVEL_MAP[level]; + } +} diff --git a/tools/utils/task-debouncer.js b/tools/utils/task-debouncer.js new file mode 100644 index 0000000..ec939c7 --- /dev/null +++ b/tools/utils/task-debouncer.js @@ -0,0 +1,67 @@ +/** + * #### TaskDebouncer + * + * Executes a task after a certain delay, but cancels the execution if + * a new task is sent before the delay expires. Also, if a task is + * already being executed, the new task is queued and executed after + * the current one finishes. It will only execute the task that was + * sent last. + */ +export class TaskDebouncer { + constructor(debounceDelay) { + this.debounceDelay = debounceDelay; + this.queued = undefined; + this.isProcessing = false; + this.timerId = null; + } + + #clearQueue() { + this.queued = undefined; + } + + #enqueue(executor, args) { + this.queued = { executor, args }; + this.#processQueue(); + } + + #setProcessing(value) { + this.isProcessing = value; + } + + async #processQueue() { + if (this.isProcessing || !this.queued) { + return; + } + const { executor, args } = this.queued; + this.#clearQueue(); + + // execute the task + this.#setProcessing(true); + await executor(...args); + this.#setProcessing(false); + + // continue with the next task + this.#continue(); + } + + #continue() { + if (this.queued) { + this.#processQueue(); + } + } + + /** + * Adds a task to the queue. If a task is already being executed, + * the new task is queued and executed after the current one finishes. + * It will only execute the task if no other task is sent before the + * delay expires or before the current task finishes. + * + * IOW, it will only execute the task that was sent last. + */ + add(executor, ...args) { + clearTimeout(this.timerId); + this.timerId = setTimeout(() => { + this.#enqueue(executor, args); + }, this.debounceDelay); + } +} diff --git a/🍵 lugit-theme.code-workspace b/🍵 lugit-theme.code-workspace new file mode 100644 index 0000000..4f76887 --- /dev/null +++ b/🍵 lugit-theme.code-workspace @@ -0,0 +1,10 @@ +{ + "folders": [ + { + "path": "." + } + ], + "settings": { + + } +} \ No newline at end of file