From 0e200d4e2f5b80209ae450a4625d713092969051 Mon Sep 17 00:00:00 2001 From: Daniel M Brasil Date: Sat, 10 Jun 2023 13:30:43 -0300 Subject: [PATCH 001/118] Migrate to request specs in `/api/v1/admin/reports` (#25355) --- .../api/v1/admin/reports_controller_spec.rb | 111 ------- spec/requests/api/v1/admin/reports_spec.rb | 292 ++++++++++++++++++ 2 files changed, 292 insertions(+), 111 deletions(-) delete mode 100644 spec/controllers/api/v1/admin/reports_controller_spec.rb create mode 100644 spec/requests/api/v1/admin/reports_spec.rb diff --git a/spec/controllers/api/v1/admin/reports_controller_spec.rb b/spec/controllers/api/v1/admin/reports_controller_spec.rb deleted file mode 100644 index 4f0c484e59..0000000000 --- a/spec/controllers/api/v1/admin/reports_controller_spec.rb +++ /dev/null @@ -1,111 +0,0 @@ -# frozen_string_literal: true - -require 'rails_helper' - -RSpec.describe Api::V1::Admin::ReportsController do - render_views - - let(:role) { UserRole.find_by(name: 'Moderator') } - let(:user) { Fabricate(:user, role: role) } - let(:scopes) { 'admin:read admin:write' } - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } - let(:report) { Fabricate(:report) } - - before do - allow(controller).to receive(:doorkeeper_token) { token } - end - - shared_examples 'forbidden for wrong scope' do |wrong_scope| - let(:scopes) { wrong_scope } - - it 'returns http forbidden' do - expect(response).to have_http_status(403) - end - end - - shared_examples 'forbidden for wrong role' do |wrong_role| - let(:role) { UserRole.find_by(name: wrong_role) } - - it 'returns http forbidden' do - expect(response).to have_http_status(403) - end - end - - describe 'GET #index' do - before do - get :index - end - - it_behaves_like 'forbidden for wrong scope', 'write:statuses' - it_behaves_like 'forbidden for wrong role', '' - - it 'returns http success' do - expect(response).to have_http_status(200) - end - end - - describe 'GET #show' do - before do - get :show, params: { id: report.id } - end - - it_behaves_like 'forbidden for wrong scope', 'write:statuses' - it_behaves_like 'forbidden for wrong role', '' - - it 'returns http success' do - expect(response).to have_http_status(200) - end - end - - describe 'POST #resolve' do - before do - post :resolve, params: { id: report.id } - end - - it_behaves_like 'forbidden for wrong scope', 'write:statuses' - it_behaves_like 'forbidden for wrong role', '' - - it 'returns http success' do - expect(response).to have_http_status(200) - end - end - - describe 'POST #reopen' do - before do - post :reopen, params: { id: report.id } - end - - it_behaves_like 'forbidden for wrong scope', 'write:statuses' - it_behaves_like 'forbidden for wrong role', '' - - it 'returns http success' do - expect(response).to have_http_status(200) - end - end - - describe 'POST #assign_to_self' do - before do - post :assign_to_self, params: { id: report.id } - end - - it_behaves_like 'forbidden for wrong scope', 'write:statuses' - it_behaves_like 'forbidden for wrong role', '' - - it 'returns http success' do - expect(response).to have_http_status(200) - end - end - - describe 'POST #unassign' do - before do - post :unassign, params: { id: report.id } - end - - it_behaves_like 'forbidden for wrong scope', 'write:statuses' - it_behaves_like 'forbidden for wrong role', '' - - it 'returns http success' do - expect(response).to have_http_status(200) - end - end -end diff --git a/spec/requests/api/v1/admin/reports_spec.rb b/spec/requests/api/v1/admin/reports_spec.rb new file mode 100644 index 0000000000..cd9fc100e7 --- /dev/null +++ b/spec/requests/api/v1/admin/reports_spec.rb @@ -0,0 +1,292 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe 'Reports' do + let(:role) { UserRole.find_by(name: 'Admin') } + let(:user) { Fabricate(:user, role: role) } + let(:scopes) { 'admin:read:reports admin:write:reports' } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } + let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } + + shared_examples 'forbidden for wrong scope' do |wrong_scope| + let(:scopes) { wrong_scope } + + it 'returns http forbidden' do + subject + + expect(response).to have_http_status(403) + end + end + + shared_examples 'forbidden for wrong role' do |wrong_role| + let(:role) { UserRole.find_by(name: wrong_role) } + + it 'returns http forbidden' do + subject + + expect(response).to have_http_status(403) + end + end + + describe 'GET /api/v1/admin/reports' do + subject do + get '/api/v1/admin/reports', headers: headers, params: params + end + + let(:params) { {} } + + it_behaves_like 'forbidden for wrong scope', 'write:statuses' + it_behaves_like 'forbidden for wrong role', '' + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + + context 'when there are no reports' do + it 'returns an empty list' do + subject + + expect(body_as_json).to be_empty + end + end + + context 'when there are reports' do + let!(:reporter) { Fabricate(:account) } + let!(:spammer) { Fabricate(:account) } + let(:expected_response) do + scope.map do |report| + hash_including({ + id: report.id.to_s, + action_taken: report.action_taken?, + category: report.category, + comment: report.comment, + account: hash_including(id: report.account.id.to_s), + target_account: hash_including(id: report.target_account.id.to_s), + statuses: report.statuses, + rules: report.rules, + forwarded: report.forwarded, + }) + end + end + let(:scope) { Report.unresolved } + + before do + Fabricate(:report) + Fabricate(:report, target_account: spammer) + Fabricate(:report, account: reporter, target_account: spammer) + Fabricate(:report, action_taken_at: 4.days.ago, account: reporter) + Fabricate(:report, action_taken_at: 20.days.ago) + end + + it 'returns all unresolved reports' do + subject + + expect(body_as_json).to match_array(expected_response) + end + + context 'with resolved param' do + let(:params) { { resolved: true } } + let(:scope) { Report.resolved } + + it 'returns only the resolved reports' do + subject + + expect(body_as_json).to match_array(expected_response) + end + end + + context 'with account_id param' do + let(:params) { { account_id: reporter.id } } + let(:scope) { Report.unresolved.where(account: reporter) } + + it 'returns all unresolved reports filed by the specified account' do + subject + + expect(body_as_json).to match_array(expected_response) + end + end + + context 'with target_account_id param' do + let(:params) { { target_account_id: spammer.id } } + let(:scope) { Report.unresolved.where(target_account: spammer) } + + it 'returns all unresolved reports targeting the specified account' do + subject + + expect(body_as_json).to match_array(expected_response) + end + end + + context 'with limit param' do + let(:params) { { limit: 1 } } + + it 'returns only the requested number of reports' do + subject + + expect(body_as_json.size).to eq(1) + end + end + end + end + + describe 'GET /api/v1/admin/reports/:id' do + subject do + get "/api/v1/admin/reports/#{report.id}", headers: headers + end + + let(:report) { Fabricate(:report) } + + it_behaves_like 'forbidden for wrong scope', 'write:statuses' + it_behaves_like 'forbidden for wrong role', '' + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + + it 'returns the requested report content' do + subject + + expect(body_as_json).to include( + { + id: report.id.to_s, + action_taken: report.action_taken?, + category: report.category, + comment: report.comment, + account: a_hash_including(id: report.account.id.to_s), + target_account: a_hash_including(id: report.target_account.id.to_s), + statuses: report.statuses, + rules: report.rules, + forwarded: report.forwarded, + } + ) + end + end + + describe 'PUT /api/v1/admin/reports/:id' do + subject do + put "/api/v1/admin/reports/#{report.id}", headers: headers, params: params + end + + let!(:report) { Fabricate(:report, category: :other) } + let(:params) { { category: 'spam' } } + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + + it 'updates the report category' do + expect { subject }.to change { report.reload.category }.from('other').to('spam') + end + + it 'returns the updated report content' do + subject + + report.reload + + expect(body_as_json).to include( + { + id: report.id.to_s, + action_taken: report.action_taken?, + category: report.category, + comment: report.comment, + account: a_hash_including(id: report.account.id.to_s), + target_account: a_hash_including(id: report.target_account.id.to_s), + statuses: report.statuses, + rules: report.rules, + forwarded: report.forwarded, + } + ) + end + end + + describe 'POST #resolve' do + subject do + post "/api/v1/admin/reports/#{report.id}/resolve", headers: headers + end + + let(:report) { Fabricate(:report, action_taken_at: nil) } + + it_behaves_like 'forbidden for wrong scope', 'write:statuses' + it_behaves_like 'forbidden for wrong role', '' + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + + it 'marks report as resolved' do + expect { subject }.to change { report.reload.unresolved? }.from(true).to(false) + end + end + + describe 'POST #reopen' do + subject do + post "/api/v1/admin/reports/#{report.id}/reopen", headers: headers + end + + let(:report) { Fabricate(:report, action_taken_at: 10.days.ago) } + + it_behaves_like 'forbidden for wrong scope', 'write:statuses' + it_behaves_like 'forbidden for wrong role', '' + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + + it 'marks report as unresolved' do + expect { subject }.to change { report.reload.unresolved? }.from(false).to(true) + end + end + + describe 'POST #assign_to_self' do + subject do + post "/api/v1/admin/reports/#{report.id}/assign_to_self", headers: headers + end + + let(:report) { Fabricate(:report) } + + it_behaves_like 'forbidden for wrong scope', 'write:statuses' + it_behaves_like 'forbidden for wrong role', '' + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + + it 'assigns report to the requesting user' do + expect { subject }.to change { report.reload.assigned_account_id }.from(nil).to(user.account.id) + end + end + + describe 'POST #unassign' do + subject do + post "/api/v1/admin/reports/#{report.id}/unassign", headers: headers + end + + let(:report) { Fabricate(:report, assigned_account_id: user.account.id) } + + it_behaves_like 'forbidden for wrong scope', 'write:statuses' + it_behaves_like 'forbidden for wrong role', '' + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + + it 'unassigns report from assignee' do + expect { subject }.to change { report.reload.assigned_account_id }.from(user.account.id).to(nil) + end + end +end From 841c220c4008e5391bbba1248b105a229fca1865 Mon Sep 17 00:00:00 2001 From: Daniel M Brasil Date: Sat, 10 Jun 2023 13:32:07 -0300 Subject: [PATCH 002/118] Migrate to request specs in `/api/v1/admin/domain_blocks` (#25335) --- .../v1/admin/domain_blocks_controller_spec.rb | 180 ----------- .../api/v1/admin/domain_blocks_spec.rb | 284 ++++++++++++++++++ 2 files changed, 284 insertions(+), 180 deletions(-) delete mode 100644 spec/controllers/api/v1/admin/domain_blocks_controller_spec.rb create mode 100644 spec/requests/api/v1/admin/domain_blocks_spec.rb diff --git a/spec/controllers/api/v1/admin/domain_blocks_controller_spec.rb b/spec/controllers/api/v1/admin/domain_blocks_controller_spec.rb deleted file mode 100644 index 5659843f7a..0000000000 --- a/spec/controllers/api/v1/admin/domain_blocks_controller_spec.rb +++ /dev/null @@ -1,180 +0,0 @@ -# frozen_string_literal: true - -require 'rails_helper' - -RSpec.describe Api::V1::Admin::DomainBlocksController do - render_views - - let(:role) { UserRole.find_by(name: 'Admin') } - let(:user) { Fabricate(:user, role: role) } - let(:scopes) { 'admin:read admin:write' } - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } - - before do - allow(controller).to receive(:doorkeeper_token) { token } - end - - shared_examples 'forbidden for wrong scope' do |wrong_scope| - let(:scopes) { wrong_scope } - - it 'returns http forbidden' do - expect(response).to have_http_status(403) - end - end - - shared_examples 'forbidden for wrong role' do |wrong_role| - let(:role) { UserRole.find_by(name: wrong_role) } - - it 'returns http forbidden' do - expect(response).to have_http_status(403) - end - end - - describe 'GET #index' do - let!(:block) { Fabricate(:domain_block) } - - before do - get :index - end - - it_behaves_like 'forbidden for wrong scope', 'write:statuses' - it_behaves_like 'forbidden for wrong role', '' - it_behaves_like 'forbidden for wrong role', 'Moderator' - - it 'returns http success' do - expect(response).to have_http_status(200) - end - - it 'returns the expected domain blocks' do - json = body_as_json - expect(json.length).to eq 1 - expect(json[0][:id].to_i).to eq block.id - end - end - - describe 'GET #show' do - let!(:block) { Fabricate(:domain_block) } - - before do - get :show, params: { id: block.id } - end - - it_behaves_like 'forbidden for wrong scope', 'write:statuses' - it_behaves_like 'forbidden for wrong role', '' - it_behaves_like 'forbidden for wrong role', 'Moderator' - - it 'returns http success' do - expect(response).to have_http_status(200) - end - - it 'returns expected domain name' do - json = body_as_json - expect(json[:domain]).to eq block.domain - end - end - - describe 'PUT #update' do - let!(:remote_account) { Fabricate(:account, domain: 'example.com') } - let(:subject) do - post :update, params: { id: domain_block.id, domain: 'example.com', severity: new_severity } - end - let(:domain_block) { Fabricate(:domain_block, domain: 'example.com', severity: original_severity) } - - before do - BlockDomainService.new.call(domain_block) - end - - context 'when downgrading a domain suspension to silence' do - let(:original_severity) { 'suspend' } - let(:new_severity) { 'silence' } - - it 'changes the block severity' do - expect { subject }.to change { domain_block.reload.severity }.from('suspend').to('silence') - end - - it 'undoes individual suspensions' do - expect { subject }.to change { remote_account.reload.suspended? }.from(true).to(false) - end - - it 'performs individual silences' do - expect { subject }.to change { remote_account.reload.silenced? }.from(false).to(true) - end - end - - context 'when upgrading a domain silence to suspend' do - let(:original_severity) { 'silence' } - let(:new_severity) { 'suspend' } - - it 'changes the block severity' do - expect { subject }.to change { domain_block.reload.severity }.from('silence').to('suspend') - end - - it 'undoes individual silences' do - expect { subject }.to change { remote_account.reload.silenced? }.from(true).to(false) - end - - it 'performs individual suspends' do - expect { subject }.to change { remote_account.reload.suspended? }.from(false).to(true) - end - end - end - - describe 'DELETE #destroy' do - let!(:block) { Fabricate(:domain_block) } - - before do - delete :destroy, params: { id: block.id } - end - - it_behaves_like 'forbidden for wrong scope', 'write:statuses' - it_behaves_like 'forbidden for wrong role', '' - it_behaves_like 'forbidden for wrong role', 'Moderator' - - it 'returns http success' do - expect(response).to have_http_status(200) - end - - it 'deletes the block' do - expect(DomainBlock.find_by(id: block.id)).to be_nil - end - end - - describe 'POST #create' do - let(:existing_block_domain) { 'example.com' } - let!(:block) { Fabricate(:domain_block, domain: existing_block_domain, severity: :suspend) } - - before do - post :create, params: { domain: 'foo.bar.com', severity: :silence } - end - - it_behaves_like 'forbidden for wrong scope', 'write:statuses' - it_behaves_like 'forbidden for wrong role', '' - it_behaves_like 'forbidden for wrong role', 'Moderator' - - it 'returns http success' do - expect(response).to have_http_status(200) - end - - it 'returns expected domain name' do - json = body_as_json - expect(json[:domain]).to eq 'foo.bar.com' - end - - it 'creates a domain block' do - expect(DomainBlock.find_by(domain: 'foo.bar.com')).to_not be_nil - end - - context 'when a stricter domain block already exists' do - let(:existing_block_domain) { 'bar.com' } - - it 'returns http unprocessable entity' do - expect(response).to have_http_status(422) - end - - it 'renders existing domain block in error' do - json = body_as_json - expect(json[:existing_domain_block][:domain]).to eq existing_block_domain - end - end - end -end diff --git a/spec/requests/api/v1/admin/domain_blocks_spec.rb b/spec/requests/api/v1/admin/domain_blocks_spec.rb new file mode 100644 index 0000000000..b3d52311b3 --- /dev/null +++ b/spec/requests/api/v1/admin/domain_blocks_spec.rb @@ -0,0 +1,284 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe 'Domain Blocks' do + let(:role) { UserRole.find_by(name: 'Admin') } + let(:user) { Fabricate(:user, role: role) } + let(:scopes) { 'admin:read:domain_blocks admin:write:domain_blocks' } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } + let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } + + shared_examples 'forbidden for wrong scope' do |wrong_scope| + let(:scopes) { wrong_scope } + + it 'returns http forbidden' do + subject + + expect(response).to have_http_status(403) + end + end + + shared_examples 'forbidden for wrong role' do |wrong_role| + let(:role) { UserRole.find_by(name: wrong_role) } + + it 'returns http forbidden' do + subject + + expect(response).to have_http_status(403) + end + end + + describe 'GET /api/v1/admin/domain_blocks' do + subject do + get '/api/v1/admin/domain_blocks', headers: headers, params: params + end + + let(:params) { {} } + + it_behaves_like 'forbidden for wrong scope', 'write:statuses' + it_behaves_like 'forbidden for wrong role', '' + it_behaves_like 'forbidden for wrong role', 'Moderator' + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + + context 'when there are no domain blocks' do + it 'returns an empty list' do + subject + + expect(body_as_json).to be_empty + end + end + + context 'when there are domain blocks' do + let!(:domain_blocks) do + [ + Fabricate(:domain_block, severity: :silence, reject_media: true), + Fabricate(:domain_block, severity: :suspend, obfuscate: true), + Fabricate(:domain_block, severity: :noop, reject_reports: true), + Fabricate(:domain_block, public_comment: 'Spam'), + Fabricate(:domain_block, private_comment: 'Spam'), + ] + end + let(:expected_responde) do + domain_blocks.map do |domain_block| + { + id: domain_block.id.to_s, + domain: domain_block.domain, + created_at: domain_block.created_at.strftime('%Y-%m-%dT%H:%M:%S.%LZ'), + severity: domain_block.severity.to_s, + reject_media: domain_block.reject_media, + reject_reports: domain_block.reject_reports, + private_comment: domain_block.private_comment, + public_comment: domain_block.public_comment, + obfuscate: domain_block.obfuscate, + } + end + end + + it 'returns the expected domain blocks' do + subject + + expect(body_as_json).to match_array(expected_responde) + end + + context 'with limit param' do + let(:params) { { limit: 2 } } + + it 'returns only the requested number of domain blocks' do + subject + + expect(body_as_json.size).to eq(params[:limit]) + end + end + end + end + + describe 'GET /api/v1/admin/domain_blocks/:id' do + subject do + get "/api/v1/admin/domain_blocks/#{domain_block.id}", headers: headers + end + + let!(:domain_block) { Fabricate(:domain_block) } + + it_behaves_like 'forbidden for wrong scope', 'write:statuses' + it_behaves_like 'forbidden for wrong role', '' + it_behaves_like 'forbidden for wrong role', 'Moderator' + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + + it 'returns the expected domain block content' do + subject + + expect(body_as_json).to eq( + { + id: domain_block.id.to_s, + domain: domain_block.domain, + created_at: domain_block.created_at.strftime('%Y-%m-%dT%H:%M:%S.%LZ'), + severity: domain_block.severity.to_s, + reject_media: domain_block.reject_media, + reject_reports: domain_block.reject_reports, + private_comment: domain_block.private_comment, + public_comment: domain_block.public_comment, + obfuscate: domain_block.obfuscate, + } + ) + end + + context 'when the requested domain block does not exist' do + it 'returns http not found' do + get '/api/v1/admin/domain_blocks/-1', headers: headers + + expect(response).to have_http_status(404) + end + end + end + + describe 'POST /api/v1/admin/domain_blocks' do + subject do + post '/api/v1/admin/domain_blocks', headers: headers, params: params + end + + let(:params) { { domain: 'foo.bar.com', severity: :silence } } + + it_behaves_like 'forbidden for wrong scope', 'write:statuses' + it_behaves_like 'forbidden for wrong role', '' + it_behaves_like 'forbidden for wrong role', 'Moderator' + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + + it 'returns expected domain name and severity' do + subject + + body = body_as_json + + expect(body).to match a_hash_including( + { + domain: 'foo.bar.com', + severity: 'silence', + } + ) + end + + it 'creates a domain block' do + subject + + expect(DomainBlock.find_by(domain: 'foo.bar.com')).to be_present + end + + context 'when a stricter domain block already exists' do + before do + Fabricate(:domain_block, domain: 'bar.com', severity: :suspend) + end + + it 'returns http unprocessable entity' do + subject + + expect(response).to have_http_status(422) + end + + it 'returns existing domain block in error' do + subject + + expect(body_as_json[:existing_domain_block][:domain]).to eq('bar.com') + end + end + + context 'when given domain name is invalid' do + let(:params) { { domain: 'foo bar', severity: :silence } } + + it 'returns http unprocessable entity' do + subject + + expect(response).to have_http_status(422) + end + end + end + + describe 'PUT /api/v1/admin/domain_blocks/:id' do + subject do + put "/api/v1/admin/domain_blocks/#{domain_block.id}", headers: headers, params: params + end + + let!(:domain_block) { Fabricate(:domain_block, domain: 'example.com', severity: :silence) } + let(:params) { { domain: 'example.com', severity: 'suspend' } } + + it_behaves_like 'forbidden for wrong scope', 'write:statuses' + it_behaves_like 'forbidden for wrong role', '' + it_behaves_like 'forbidden for wrong role', 'Moderator' + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + + it 'returns the updated domain block' do + subject + + expect(body_as_json).to match a_hash_including( + { + id: domain_block.id.to_s, + domain: domain_block.domain, + severity: 'suspend', + } + ) + end + + it 'updates the block severity' do + expect { subject }.to change { domain_block.reload.severity }.from('silence').to('suspend') + end + + context 'when domain block does not exist' do + it 'returns http not found' do + put '/api/v1/admin/domain_blocks/-1', headers: headers + + expect(response).to have_http_status(404) + end + end + end + + describe 'DELETE /api/v1/admin/domain_blocks/:id' do + subject do + delete "/api/v1/admin/domain_blocks/#{domain_block.id}", headers: headers + end + + let!(:domain_block) { Fabricate(:domain_block) } + + it_behaves_like 'forbidden for wrong scope', 'write:statuses' + it_behaves_like 'forbidden for wrong role', '' + it_behaves_like 'forbidden for wrong role', 'Moderator' + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + + it 'deletes the domain block' do + subject + + expect(DomainBlock.find_by(id: domain_block.id)).to be_nil + end + + context 'when domain block does not exist' do + it 'returns http not found' do + delete '/api/v1/admin/domain_blocks/-1', headers: headers + + expect(response).to have_http_status(404) + end + end + end +end From 4301d8cbb3d62b9c04cf01bfffab3ed8564ae2a0 Mon Sep 17 00:00:00 2001 From: Daniel M Brasil Date: Sat, 10 Jun 2023 13:32:26 -0300 Subject: [PATCH 003/118] Migrate to request specs in `/api/v1/admin/domain_allows` (#25333) --- .../v1/admin/domain_allows_controller_spec.rb | 140 ------------ spec/fabricators/domain_allow_fabricator.rb | 2 +- .../api/v1/admin/domain_allows_spec.rb | 214 ++++++++++++++++++ 3 files changed, 215 insertions(+), 141 deletions(-) delete mode 100644 spec/controllers/api/v1/admin/domain_allows_controller_spec.rb create mode 100644 spec/requests/api/v1/admin/domain_allows_spec.rb diff --git a/spec/controllers/api/v1/admin/domain_allows_controller_spec.rb b/spec/controllers/api/v1/admin/domain_allows_controller_spec.rb deleted file mode 100644 index 69aeb6451a..0000000000 --- a/spec/controllers/api/v1/admin/domain_allows_controller_spec.rb +++ /dev/null @@ -1,140 +0,0 @@ -# frozen_string_literal: true - -require 'rails_helper' - -RSpec.describe Api::V1::Admin::DomainAllowsController do - render_views - - let(:role) { UserRole.find_by(name: 'Admin') } - let(:user) { Fabricate(:user, role: role) } - let(:scopes) { 'admin:read admin:write' } - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } - - before do - allow(controller).to receive(:doorkeeper_token) { token } - end - - shared_examples 'forbidden for wrong scope' do |wrong_scope| - let(:scopes) { wrong_scope } - - it 'returns http forbidden' do - expect(response).to have_http_status(403) - end - end - - shared_examples 'forbidden for wrong role' do |wrong_role| - let(:role) { UserRole.find_by(name: wrong_role) } - - it 'returns http forbidden' do - expect(response).to have_http_status(403) - end - end - - describe 'GET #index' do - let!(:domain_allow) { Fabricate(:domain_allow) } - - before do - get :index - end - - it_behaves_like 'forbidden for wrong scope', 'write:statuses' - it_behaves_like 'forbidden for wrong role', '' - it_behaves_like 'forbidden for wrong role', 'Moderator' - - it 'returns http success' do - expect(response).to have_http_status(200) - end - - it 'returns the expected domain allows' do - json = body_as_json - expect(json.length).to eq 1 - expect(json[0][:id].to_i).to eq domain_allow.id - end - end - - describe 'GET #show' do - let!(:domain_allow) { Fabricate(:domain_allow) } - - before do - get :show, params: { id: domain_allow.id } - end - - it_behaves_like 'forbidden for wrong scope', 'write:statuses' - it_behaves_like 'forbidden for wrong role', '' - it_behaves_like 'forbidden for wrong role', 'Moderator' - - it 'returns http success' do - expect(response).to have_http_status(200) - end - - it 'returns expected domain name' do - json = body_as_json - expect(json[:domain]).to eq domain_allow.domain - end - end - - describe 'DELETE #destroy' do - let!(:domain_allow) { Fabricate(:domain_allow) } - - before do - delete :destroy, params: { id: domain_allow.id } - end - - it_behaves_like 'forbidden for wrong scope', 'write:statuses' - it_behaves_like 'forbidden for wrong role', '' - it_behaves_like 'forbidden for wrong role', 'Moderator' - - it 'returns http success' do - expect(response).to have_http_status(200) - end - - it 'deletes the block' do - expect(DomainAllow.find_by(id: domain_allow.id)).to be_nil - end - end - - describe 'POST #create' do - let!(:domain_allow) { Fabricate(:domain_allow, domain: 'example.com') } - - context 'with a valid domain' do - before do - post :create, params: { domain: 'foo.bar.com' } - end - - it_behaves_like 'forbidden for wrong scope', 'write:statuses' - it_behaves_like 'forbidden for wrong role', '' - it_behaves_like 'forbidden for wrong role', 'Moderator' - - it 'returns http success' do - expect(response).to have_http_status(200) - end - - it 'returns expected domain name' do - json = body_as_json - expect(json[:domain]).to eq 'foo.bar.com' - end - - it 'creates a domain block' do - expect(DomainAllow.find_by(domain: 'foo.bar.com')).to_not be_nil - end - end - - context 'with invalid domain name' do - before do - post :create, params: { domain: 'foo bar' } - end - - it 'returns http unprocessable entity' do - expect(response).to have_http_status(422) - end - end - - context 'when domain name is not specified' do - it 'returns http unprocessable entity' do - post :create - - expect(response).to have_http_status(422) - end - end - end -end diff --git a/spec/fabricators/domain_allow_fabricator.rb b/spec/fabricators/domain_allow_fabricator.rb index b32af129bc..12fdaaea1a 100644 --- a/spec/fabricators/domain_allow_fabricator.rb +++ b/spec/fabricators/domain_allow_fabricator.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true Fabricator(:domain_allow) do - domain 'MyString' + domain { sequence(:domain) { |i| "example#{i}.com" } } end diff --git a/spec/requests/api/v1/admin/domain_allows_spec.rb b/spec/requests/api/v1/admin/domain_allows_spec.rb new file mode 100644 index 0000000000..eb7915e77a --- /dev/null +++ b/spec/requests/api/v1/admin/domain_allows_spec.rb @@ -0,0 +1,214 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe 'Domain Allows' do + let(:role) { UserRole.find_by(name: 'Admin') } + let(:user) { Fabricate(:user, role: role) } + let(:scopes) { 'admin:read admin:write' } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } + let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } + + shared_examples 'forbidden for wrong scope' do |wrong_scope| + let(:scopes) { wrong_scope } + + it 'returns http forbidden' do + subject + + expect(response).to have_http_status(403) + end + end + + shared_examples 'forbidden for wrong role' do |wrong_role| + let(:role) { UserRole.find_by(name: wrong_role) } + + it 'returns http forbidden' do + subject + + expect(response).to have_http_status(403) + end + end + + describe 'GET /api/v1/admin/domain_allows' do + subject do + get '/api/v1/admin/domain_allows', headers: headers, params: params + end + + let(:params) { {} } + + it_behaves_like 'forbidden for wrong scope', 'write:statuses' + it_behaves_like 'forbidden for wrong role', '' + it_behaves_like 'forbidden for wrong role', 'Moderator' + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + + context 'when there is no allowed domains' do + it 'returns an empty body' do + subject + + expect(body_as_json).to be_empty + end + end + + context 'when there are allowed domains' do + let!(:domain_allows) { Fabricate.times(5, :domain_allow) } + let(:expected_response) do + domain_allows.map do |domain_allow| + { + id: domain_allow.id.to_s, + domain: domain_allow.domain, + created_at: domain_allow.created_at.strftime('%Y-%m-%dT%H:%M:%S.%LZ'), + } + end + end + + it 'returns the correct allowed domains' do + subject + + expect(body_as_json).to match_array(expected_response) + end + + context 'with limit param' do + let(:params) { { limit: 2 } } + + it 'returns only the requested number of allowed domains' do + subject + + expect(body_as_json.size).to eq(params[:limit]) + end + end + end + end + + describe 'GET /api/v1/admin/domain_allows/:id' do + subject do + get "/api/v1/admin/domain_allows/#{domain_allow.id}", headers: headers + end + + let!(:domain_allow) { Fabricate(:domain_allow) } + + it_behaves_like 'forbidden for wrong scope', 'write:statuses' + it_behaves_like 'forbidden for wrong role', '' + it_behaves_like 'forbidden for wrong role', 'Moderator' + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + + it 'returns the expected allowed domain name' do + subject + + expect(body_as_json[:domain]).to eq domain_allow.domain + end + + context 'when the requested allowed domain does not exist' do + it 'returns http not found' do + get '/api/v1/admin/domain_allows/-1', headers: headers + + expect(response).to have_http_status(404) + end + end + end + + describe 'POST /api/v1/admin/domain_allows' do + subject do + post '/api/v1/admin/domain_allows', headers: headers, params: params + end + + let(:params) { { domain: 'foo.bar.com' } } + + it_behaves_like 'forbidden for wrong scope', 'write:statuses' + it_behaves_like 'forbidden for wrong role', '' + it_behaves_like 'forbidden for wrong role', 'Moderator' + + context 'with a valid domain name' do + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + + it 'returns the expected domain name' do + subject + + expect(body_as_json[:domain]).to eq 'foo.bar.com' + end + + it 'creates a domain allow' do + subject + + expect(DomainAllow.find_by(domain: 'foo.bar.com')).to be_present + end + end + + context 'with invalid domain name' do + let(:params) { 'foo bar' } + + it 'returns http unprocessable entity' do + subject + + expect(response).to have_http_status(422) + end + end + + context 'when domain name is not specified' do + let(:params) { {} } + + it 'returns http unprocessable entity' do + subject + + expect(response).to have_http_status(422) + end + end + + context 'when the domain is already allowed' do + before do + DomainAllow.create(params) + end + + it 'returns the existing allowed domain name' do + subject + + expect(body_as_json[:domain]).to eq(params[:domain]) + end + end + end + + describe 'DELETE /api/v1/admin/domain_allows/:id' do + subject do + delete "/api/v1/admin/domain_allows/#{domain_allow.id}", headers: headers + end + + let!(:domain_allow) { Fabricate(:domain_allow) } + + it_behaves_like 'forbidden for wrong scope', 'write:statuses' + it_behaves_like 'forbidden for wrong role', '' + it_behaves_like 'forbidden for wrong role', 'Moderator' + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + + it 'deletes the allowed domain' do + subject + + expect(DomainAllow.find_by(id: domain_allow.id)).to be_nil + end + + context 'when the allowed domain does not exist' do + it 'returns http not found' do + delete '/api/v1/admin/domain_allows/-1', headers: headers + + expect(response).to have_http_status(404) + end + end + end +end From b4e19f9610e97066b6f5881324d440d49c3fb31d Mon Sep 17 00:00:00 2001 From: Daniel M Brasil Date: Sat, 10 Jun 2023 13:32:46 -0300 Subject: [PATCH 004/118] Migrate to request specs in `/api/v1/admin/ip_blocks` (#25331) --- .../api/v1/admin/ip_blocks_controller_spec.rb | 309 ------------------ spec/requests/api/v1/admin/ip_blocks_spec.rb | 275 ++++++++++++++++ 2 files changed, 275 insertions(+), 309 deletions(-) delete mode 100644 spec/controllers/api/v1/admin/ip_blocks_controller_spec.rb create mode 100644 spec/requests/api/v1/admin/ip_blocks_spec.rb diff --git a/spec/controllers/api/v1/admin/ip_blocks_controller_spec.rb b/spec/controllers/api/v1/admin/ip_blocks_controller_spec.rb deleted file mode 100644 index a5787883ee..0000000000 --- a/spec/controllers/api/v1/admin/ip_blocks_controller_spec.rb +++ /dev/null @@ -1,309 +0,0 @@ -# frozen_string_literal: true - -require 'rails_helper' - -describe Api::V1::Admin::IpBlocksController do - render_views - - let(:role) { UserRole.find_by(name: 'Admin') } - let(:user) { Fabricate(:user, role: role) } - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } - let(:scopes) { 'admin:read:ip_blocks admin:write:ip_blocks' } - - before do - allow(controller).to receive(:doorkeeper_token) { token } - end - - shared_examples 'forbidden for wrong scope' do |wrong_scope| - let(:scopes) { wrong_scope } - - it 'returns http forbidden' do - expect(response).to have_http_status(403) - end - end - - shared_examples 'forbidden for wrong role' do |wrong_role| - let(:role) { UserRole.find_by(name: wrong_role) } - - it 'returns http forbidden' do - expect(response).to have_http_status(403) - end - end - - describe 'GET #index' do - context 'with wrong scope' do - before do - get :index - end - - it_behaves_like 'forbidden for wrong scope', 'admin:write:ip_blocks' - end - - context 'with wrong role' do - before do - get :index - end - - it_behaves_like 'forbidden for wrong role', '' - it_behaves_like 'forbidden for wrong role', 'Moderator' - end - - it 'returns http success' do - get :index - - expect(response).to have_http_status(200) - end - - context 'when there is no ip block' do - it 'returns an empty body' do - get :index - - json = body_as_json - - expect(json).to be_empty - end - end - - context 'when there are ip blocks' do - let!(:ip_blocks) do - [ - IpBlock.create(ip: '192.0.2.0/24', severity: :no_access), - IpBlock.create(ip: '172.16.0.1', severity: :sign_up_requires_approval, comment: 'Spam'), - IpBlock.create(ip: '2001:0db8::/32', severity: :sign_up_block, expires_in: 10.days), - ] - end - let(:expected_response) do - ip_blocks.map do |ip_block| - { - id: ip_block.id.to_s, - ip: ip_block.ip, - severity: ip_block.severity.to_s, - comment: ip_block.comment, - created_at: ip_block.created_at.strftime('%Y-%m-%dT%H:%M:%S.%LZ'), - expires_at: ip_block.expires_at&.strftime('%Y-%m-%dT%H:%M:%S.%LZ'), - } - end - end - - it 'returns the correct blocked ips' do - get :index - - json = body_as_json - - expect(json).to match_array(expected_response) - end - - context 'with limit param' do - let(:params) { { limit: 2 } } - - it 'returns only the requested number of ip blocks' do - get :index, params: params - - json = body_as_json - - expect(json.size).to eq(params[:limit]) - end - end - end - end - - describe 'GET #show' do - let!(:ip_block) { IpBlock.create(ip: '192.0.2.0/24', severity: :no_access) } - let(:params) { { id: ip_block.id } } - - context 'with wrong scope' do - before do - get :show, params: params - end - - it_behaves_like 'forbidden for wrong scope', 'admin:write:ip_blocks' - end - - context 'with wrong role' do - before do - get :show, params: params - end - - it_behaves_like 'forbidden for wrong role', '' - it_behaves_like 'forbidden for wrong role', 'Moderator' - end - - it 'returns http success' do - get :show, params: params - - expect(response).to have_http_status(200) - end - - it 'returns the correct ip block' do - get :show, params: params - - json = body_as_json - - expect(json[:ip]).to eq("#{ip_block.ip}/#{ip_block.ip.prefix}") - expect(json[:severity]).to eq(ip_block.severity.to_s) - end - - context 'when ip block does not exist' do - it 'returns http not found' do - get :show, params: { id: 0 } - - expect(response).to have_http_status(404) - end - end - end - - describe 'POST #create' do - let(:params) { { ip: '151.0.32.55', severity: 'no_access', comment: 'Spam' } } - - context 'with wrong scope' do - before do - post :create, params: params - end - - it_behaves_like 'forbidden for wrong scope', 'admin:read:ip_blocks' - end - - context 'with wrong role' do - before do - post :create, params: params - end - - it_behaves_like 'forbidden for wrong role', '' - it_behaves_like 'forbidden for wrong role', 'Moderator' - end - - it 'returns http success' do - post :create, params: params - - expect(response).to have_http_status(200) - end - - it 'returns the correct ip block' do - post :create, params: params - - json = body_as_json - - expect(json[:ip]).to eq("#{params[:ip]}/32") - expect(json[:severity]).to eq(params[:severity]) - expect(json[:comment]).to eq(params[:comment]) - end - - context 'when ip is not provided' do - let(:params) { { ip: '', severity: 'no_access' } } - - it 'returns http unprocessable entity' do - post :create, params: params - - expect(response).to have_http_status(422) - end - end - - context 'when severity is not provided' do - let(:params) { { ip: '173.65.23.1', severity: '' } } - - it 'returns http unprocessable entity' do - post :create, params: params - - expect(response).to have_http_status(422) - end - end - - context 'when provided ip is already blocked' do - before do - IpBlock.create(params) - end - - it 'returns http unprocessable entity' do - post :create, params: params - - expect(response).to have_http_status(422) - end - end - - context 'when provided ip address is invalid' do - let(:params) { { ip: '520.13.54.120', severity: 'no_access' } } - - it 'returns http unprocessable entity' do - post :create, params: params - - expect(response).to have_http_status(422) - end - end - end - - describe 'PUT #update' do - context 'when ip block exists' do - let!(:ip_block) { IpBlock.create(ip: '185.200.13.3', severity: 'no_access', comment: 'Spam', expires_in: 48.hours) } - let(:params) { { id: ip_block.id, severity: 'sign_up_requires_approval', comment: 'Decreasing severity' } } - - it 'returns http success' do - put :update, params: params - - expect(response).to have_http_status(200) - end - - it 'returns the correct ip block' do - put :update, params: params - - json = body_as_json - - expect(json).to match(hash_including({ - ip: "#{ip_block.ip}/#{ip_block.ip.prefix}", - severity: 'sign_up_requires_approval', - comment: 'Decreasing severity', - })) - end - - it 'updates the severity correctly' do - expect { put :update, params: params }.to change { ip_block.reload.severity }.from('no_access').to('sign_up_requires_approval') - end - - it 'updates the comment correctly' do - expect { put :update, params: params }.to change { ip_block.reload.comment }.from('Spam').to('Decreasing severity') - end - end - - context 'when ip block does not exist' do - it 'returns http not found' do - put :update, params: { id: 0 } - - expect(response).to have_http_status(404) - end - end - end - - describe 'DELETE #destroy' do - context 'when ip block exists' do - let!(:ip_block) { IpBlock.create(ip: '185.200.13.3', severity: 'no_access') } - let(:params) { { id: ip_block.id } } - - it 'returns http success' do - delete :destroy, params: params - - expect(response).to have_http_status(200) - end - - it 'returns an empty body' do - delete :destroy, params: params - - json = body_as_json - - expect(json).to be_empty - end - - it 'deletes the ip block' do - delete :destroy, params: params - - expect(IpBlock.find_by(id: ip_block.id)).to be_nil - end - end - - context 'when ip block does not exist' do - it 'returns http not found' do - delete :destroy, params: { id: 0 } - - expect(response).to have_http_status(404) - end - end - end -end diff --git a/spec/requests/api/v1/admin/ip_blocks_spec.rb b/spec/requests/api/v1/admin/ip_blocks_spec.rb new file mode 100644 index 0000000000..2091ef3dc6 --- /dev/null +++ b/spec/requests/api/v1/admin/ip_blocks_spec.rb @@ -0,0 +1,275 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe 'IP Blocks' do + let(:role) { UserRole.find_by(name: 'Admin') } + let(:user) { Fabricate(:user, role: role) } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } + let(:scopes) { 'admin:read:ip_blocks admin:write:ip_blocks' } + let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } + + shared_examples 'forbidden for wrong scope' do |wrong_scope| + let(:scopes) { wrong_scope } + + it 'returns http forbidden' do + subject + + expect(response).to have_http_status(403) + end + end + + shared_examples 'forbidden for wrong role' do |wrong_role| + let(:role) { UserRole.find_by(name: wrong_role) } + + it 'returns http forbidden' do + subject + + expect(response).to have_http_status(403) + end + end + + describe 'GET /api/v1/admin/ip_blocks' do + subject do + get '/api/v1/admin/ip_blocks', headers: headers, params: params + end + + let(:params) { {} } + + it_behaves_like 'forbidden for wrong scope', 'admin:write:ip_blocks' + it_behaves_like 'forbidden for wrong role', '' + it_behaves_like 'forbidden for wrong role', 'Moderator' + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + + context 'when there is no ip block' do + it 'returns an empty body' do + subject + + expect(body_as_json).to be_empty + end + end + + context 'when there are ip blocks' do + let!(:ip_blocks) do + [ + IpBlock.create(ip: '192.0.2.0/24', severity: :no_access), + IpBlock.create(ip: '172.16.0.1', severity: :sign_up_requires_approval, comment: 'Spam'), + IpBlock.create(ip: '2001:0db8::/32', severity: :sign_up_block, expires_in: 10.days), + ] + end + let(:expected_response) do + ip_blocks.map do |ip_block| + { + id: ip_block.id.to_s, + ip: ip_block.ip, + severity: ip_block.severity.to_s, + comment: ip_block.comment, + created_at: ip_block.created_at.strftime('%Y-%m-%dT%H:%M:%S.%LZ'), + expires_at: ip_block.expires_at&.strftime('%Y-%m-%dT%H:%M:%S.%LZ'), + } + end + end + + it 'returns the correct blocked ips' do + subject + + expect(body_as_json).to match_array(expected_response) + end + + context 'with limit param' do + let(:params) { { limit: 2 } } + + it 'returns only the requested number of ip blocks' do + subject + + expect(body_as_json.size).to eq(params[:limit]) + end + end + end + end + + describe 'GET /api/v1/admin/ip_blocks/:id' do + subject do + get "/api/v1/admin/ip_blocks/#{ip_block.id}", headers: headers + end + + let!(:ip_block) { IpBlock.create(ip: '192.0.2.0/24', severity: :no_access) } + + it_behaves_like 'forbidden for wrong scope', 'admin:write:ip_blocks' + it_behaves_like 'forbidden for wrong role', '' + it_behaves_like 'forbidden for wrong role', 'Moderator' + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + + it 'returns the correct ip block' do + subject + + json = body_as_json + + expect(json[:ip]).to eq("#{ip_block.ip}/#{ip_block.ip.prefix}") + expect(json[:severity]).to eq(ip_block.severity.to_s) + end + + context 'when ip block does not exist' do + it 'returns http not found' do + get '/api/v1/admin/ip_blocks/-1', headers: headers + + expect(response).to have_http_status(404) + end + end + end + + describe 'POST /api/v1/admin/ip_blocks' do + subject do + post '/api/v1/admin/ip_blocks', headers: headers, params: params + end + + let(:params) { { ip: '151.0.32.55', severity: 'no_access', comment: 'Spam' } } + + it_behaves_like 'forbidden for wrong scope', 'admin:read:ip_blocks' + it_behaves_like 'forbidden for wrong role', '' + it_behaves_like 'forbidden for wrong role', 'Moderator' + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + + it 'returns the correct ip block' do + subject + + json = body_as_json + + expect(json[:ip]).to eq("#{params[:ip]}/32") + expect(json[:severity]).to eq(params[:severity]) + expect(json[:comment]).to eq(params[:comment]) + end + + context 'when the required ip param is not provided' do + let(:params) { { ip: '', severity: 'no_access' } } + + it 'returns http unprocessable entity' do + subject + + expect(response).to have_http_status(422) + end + end + + context 'when the required severity param is not provided' do + let(:params) { { ip: '173.65.23.1', severity: '' } } + + it 'returns http unprocessable entity' do + subject + + expect(response).to have_http_status(422) + end + end + + context 'when the given ip address is already blocked' do + before do + IpBlock.create(params) + end + + it 'returns http unprocessable entity' do + subject + + expect(response).to have_http_status(422) + end + end + + context 'when the given ip address is invalid' do + let(:params) { { ip: '520.13.54.120', severity: 'no_access' } } + + it 'returns http unprocessable entity' do + subject + + expect(response).to have_http_status(422) + end + end + end + + describe 'PUT /api/v1/admin/ip_blocks/:id' do + subject do + put "/api/v1/admin/ip_blocks/#{ip_block.id}", headers: headers, params: params + end + + let!(:ip_block) { IpBlock.create(ip: '185.200.13.3', severity: 'no_access', comment: 'Spam', expires_in: 48.hours) } + let(:params) { { severity: 'sign_up_requires_approval', comment: 'Decreasing severity' } } + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + + it 'returns the correct ip block' do + subject + + expect(body_as_json).to match(hash_including({ + ip: "#{ip_block.ip}/#{ip_block.ip.prefix}", + severity: 'sign_up_requires_approval', + comment: 'Decreasing severity', + })) + end + + it 'updates the severity correctly' do + expect { subject }.to change { ip_block.reload.severity }.from('no_access').to('sign_up_requires_approval') + end + + it 'updates the comment correctly' do + expect { subject }.to change { ip_block.reload.comment }.from('Spam').to('Decreasing severity') + end + + context 'when ip block does not exist' do + it 'returns http not found' do + put '/api/v1/admin/ip_blocks/-1', headers: headers, params: params + + expect(response).to have_http_status(404) + end + end + end + + describe 'DELETE /api/v1/admin/ip_blocks/:id' do + subject do + delete "/api/v1/admin/ip_blocks/#{ip_block.id}", headers: headers + end + + let!(:ip_block) { IpBlock.create(ip: '185.200.13.3', severity: 'no_access') } + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + + it 'returns an empty body' do + subject + + expect(body_as_json).to be_empty + end + + it 'deletes the ip block' do + subject + + expect(IpBlock.find_by(id: ip_block.id)).to be_nil + end + + context 'when ip block does not exist' do + it 'returns http not found' do + delete '/api/v1/admin/ip_blocks/-1', headers: headers + + expect(response).to have_http_status(404) + end + end + end +end From 99216e34e5a309e51de1035a3ddccef82ef5d696 Mon Sep 17 00:00:00 2001 From: Daniel M Brasil Date: Sat, 10 Jun 2023 13:33:02 -0300 Subject: [PATCH 005/118] Migrate to request specs in `/api/v1/admin/canonical_email_blocks` (#25330) --- .../canonical_email_blocks_controller_spec.rb | 358 ------------------ .../v1/admin/canonical_email_blocks_spec.rb | 305 +++++++++++++++ 2 files changed, 305 insertions(+), 358 deletions(-) delete mode 100644 spec/controllers/api/v1/admin/canonical_email_blocks_controller_spec.rb create mode 100644 spec/requests/api/v1/admin/canonical_email_blocks_spec.rb diff --git a/spec/controllers/api/v1/admin/canonical_email_blocks_controller_spec.rb b/spec/controllers/api/v1/admin/canonical_email_blocks_controller_spec.rb deleted file mode 100644 index fe39596dfd..0000000000 --- a/spec/controllers/api/v1/admin/canonical_email_blocks_controller_spec.rb +++ /dev/null @@ -1,358 +0,0 @@ -# frozen_string_literal: true - -require 'rails_helper' - -describe Api::V1::Admin::CanonicalEmailBlocksController do - render_views - - let(:role) { UserRole.find_by(name: 'Admin') } - let(:user) { Fabricate(:user, role: role) } - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } - let(:scopes) { 'admin:read:canonical_email_blocks admin:write:canonical_email_blocks' } - - before do - allow(controller).to receive(:doorkeeper_token) { token } - end - - shared_examples 'forbidden for wrong scope' do |wrong_scope| - let(:scopes) { wrong_scope } - - it 'returns http forbidden' do - expect(response).to have_http_status(403) - end - end - - shared_examples 'forbidden for wrong role' do |wrong_role| - let(:role) { UserRole.find_by(name: wrong_role) } - - it 'returns http forbidden' do - expect(response).to have_http_status(403) - end - end - - describe 'GET #index' do - context 'with wrong scope' do - before do - get :index - end - - it_behaves_like 'forbidden for wrong scope', 'read:statuses' - end - - context 'with wrong role' do - before do - get :index - end - - it_behaves_like 'forbidden for wrong role', '' - it_behaves_like 'forbidden for wrong role', 'Moderator' - end - - it 'returns http success' do - get :index - - expect(response).to have_http_status(200) - end - - context 'when there is no canonical email block' do - it 'returns an empty list' do - get :index - - body = body_as_json - - expect(body).to be_empty - end - end - - context 'when there are canonical email blocks' do - let!(:canonical_email_blocks) { Fabricate.times(5, :canonical_email_block) } - let(:expected_email_hashes) { canonical_email_blocks.pluck(:canonical_email_hash) } - - it 'returns the correct canonical email hashes' do - get :index - - json = body_as_json - - expect(json.pluck(:canonical_email_hash)).to match_array(expected_email_hashes) - end - - context 'with limit param' do - let(:params) { { limit: 2 } } - - it 'returns only the requested number of canonical email blocks' do - get :index, params: params - - json = body_as_json - - expect(json.size).to eq(params[:limit]) - end - end - - context 'with since_id param' do - let(:params) { { since_id: canonical_email_blocks[1].id } } - - it 'returns only the canonical email blocks after since_id' do - get :index, params: params - - canonical_email_blocks_ids = canonical_email_blocks.pluck(:id).map(&:to_s) - json = body_as_json - - expect(json.pluck(:id)).to match_array(canonical_email_blocks_ids[2..]) - end - end - - context 'with max_id param' do - let(:params) { { max_id: canonical_email_blocks[3].id } } - - it 'returns only the canonical email blocks before max_id' do - get :index, params: params - - canonical_email_blocks_ids = canonical_email_blocks.pluck(:id).map(&:to_s) - json = body_as_json - - expect(json.pluck(:id)).to match_array(canonical_email_blocks_ids[..2]) - end - end - end - end - - describe 'GET #show' do - let!(:canonical_email_block) { Fabricate(:canonical_email_block) } - let(:params) { { id: canonical_email_block.id } } - - context 'with wrong scope' do - before do - get :show, params: params - end - - it_behaves_like 'forbidden for wrong scope', 'read:statuses' - end - - context 'with wrong role' do - before do - get :show, params: params - end - - it_behaves_like 'forbidden for wrong role', '' - it_behaves_like 'forbidden for wrong role', 'Moderator' - end - - context 'when canonical email block exists' do - it 'returns http success' do - get :show, params: params - - expect(response).to have_http_status(200) - end - - it 'returns canonical email block data correctly' do - get :show, params: params - - json = body_as_json - - expect(json[:id]).to eq(canonical_email_block.id.to_s) - expect(json[:canonical_email_hash]).to eq(canonical_email_block.canonical_email_hash) - end - end - - context 'when canonical block does not exist' do - it 'returns http not found' do - get :show, params: { id: 0 } - - expect(response).to have_http_status(404) - end - end - end - - describe 'POST #test' do - context 'with wrong scope' do - before do - post :test - end - - it_behaves_like 'forbidden for wrong scope', 'read:statuses' - end - - context 'with wrong role' do - before do - post :test, params: { email: 'whatever@email.com' } - end - - it_behaves_like 'forbidden for wrong role', '' - it_behaves_like 'forbidden for wrong role', 'Moderator' - end - - context 'when required email is not provided' do - it 'returns http bad request' do - post :test - - expect(response).to have_http_status(400) - end - end - - context 'when required email is provided' do - let(:params) { { email: 'example@email.com' } } - - context 'when there is a matching canonical email block' do - let!(:canonical_email_block) { CanonicalEmailBlock.create(params) } - - it 'returns http success' do - post :test, params: params - - expect(response).to have_http_status(200) - end - - it 'returns expected canonical email hash' do - post :test, params: params - - json = body_as_json - - expect(json[0][:canonical_email_hash]).to eq(canonical_email_block.canonical_email_hash) - end - end - - context 'when there is no matching canonical email block' do - it 'returns http success' do - post :test, params: params - - expect(response).to have_http_status(200) - end - - it 'returns an empty list' do - post :test, params: params - - json = body_as_json - - expect(json).to be_empty - end - end - end - end - - describe 'POST #create' do - let(:params) { { email: 'example@email.com' } } - let(:canonical_email_block) { CanonicalEmailBlock.new(email: params[:email]) } - - context 'with wrong scope' do - before do - post :create, params: params - end - - it_behaves_like 'forbidden for wrong scope', 'read:statuses' - end - - context 'with wrong role' do - before do - post :create, params: params - end - - it_behaves_like 'forbidden for wrong role', '' - it_behaves_like 'forbidden for wrong role', 'Moderator' - end - - it 'returns http success' do - post :create, params: params - - expect(response).to have_http_status(200) - end - - it 'returns canonical_email_hash correctly' do - post :create, params: params - - json = body_as_json - - expect(json[:canonical_email_hash]).to eq(canonical_email_block.canonical_email_hash) - end - - context 'when required email param is not provided' do - it 'returns http unprocessable entity' do - post :create - - expect(response).to have_http_status(422) - end - end - - context 'when canonical_email_hash param is provided instead of email' do - let(:params) { { canonical_email_hash: 'dd501ce4e6b08698f19df96f2f15737e48a75660b1fa79b6ff58ea25ee4851a4' } } - - it 'returns http success' do - post :create, params: params - - expect(response).to have_http_status(200) - end - - it 'returns correct canonical_email_hash' do - post :create, params: params - - json = body_as_json - - expect(json[:canonical_email_hash]).to eq(params[:canonical_email_hash]) - end - end - - context 'when both email and canonical_email_hash params are provided' do - let(:params) { { email: 'example@email.com', canonical_email_hash: 'dd501ce4e6b08698f19df96f2f15737e48a75660b1fa79b6ff58ea25ee4851a4' } } - - it 'returns http success' do - post :create, params: params - - expect(response).to have_http_status(200) - end - - it 'ignores canonical_email_hash param' do - post :create, params: params - - json = body_as_json - - expect(json[:canonical_email_hash]).to eq(canonical_email_block.canonical_email_hash) - end - end - - context 'when canonical email was already blocked' do - before do - canonical_email_block.save - end - - it 'returns http unprocessable entity' do - post :create, params: params - - expect(response).to have_http_status(422) - end - end - end - - describe 'DELETE #destroy' do - let!(:canonical_email_block) { Fabricate(:canonical_email_block) } - let(:params) { { id: canonical_email_block.id } } - - context 'with wrong scope' do - before do - delete :destroy, params: params - end - - it_behaves_like 'forbidden for wrong scope', 'read:statuses' - end - - context 'with wrong role' do - before do - delete :destroy, params: params - end - - it_behaves_like 'forbidden for wrong role', '' - it_behaves_like 'forbidden for wrong role', 'Moderator' - end - - it 'returns http success' do - delete :destroy, params: params - - expect(response).to have_http_status(200) - end - - context 'when canonical email block is not found' do - it 'returns http not found' do - delete :destroy, params: { id: 0 } - - expect(response).to have_http_status(404) - end - end - end -end diff --git a/spec/requests/api/v1/admin/canonical_email_blocks_spec.rb b/spec/requests/api/v1/admin/canonical_email_blocks_spec.rb new file mode 100644 index 0000000000..d70e6fc8a1 --- /dev/null +++ b/spec/requests/api/v1/admin/canonical_email_blocks_spec.rb @@ -0,0 +1,305 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe 'Canonical Email Blocks' do + let(:role) { UserRole.find_by(name: 'Admin') } + let(:user) { Fabricate(:user, role: role) } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } + let(:scopes) { 'admin:read:canonical_email_blocks admin:write:canonical_email_blocks' } + let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } + + shared_examples 'forbidden for wrong scope' do |wrong_scope| + let(:scopes) { wrong_scope } + + it 'returns http forbidden' do + subject + + expect(response).to have_http_status(403) + end + end + + shared_examples 'forbidden for wrong role' do |wrong_role| + let(:role) { UserRole.find_by(name: wrong_role) } + + it 'returns http forbidden' do + subject + + expect(response).to have_http_status(403) + end + end + + describe 'GET /api/v1/admin/canonical_email_blocks' do + subject do + get '/api/v1/admin/canonical_email_blocks', headers: headers, params: params + end + + let(:params) { {} } + + it_behaves_like 'forbidden for wrong scope', 'read:statuses' + it_behaves_like 'forbidden for wrong role', '' + it_behaves_like 'forbidden for wrong role', 'Moderator' + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + + context 'when there is no canonical email block' do + it 'returns an empty list' do + subject + + expect(body_as_json).to be_empty + end + end + + context 'when there are canonical email blocks' do + let!(:canonical_email_blocks) { Fabricate.times(5, :canonical_email_block) } + let(:expected_email_hashes) { canonical_email_blocks.pluck(:canonical_email_hash) } + + it 'returns the correct canonical email hashes' do + subject + + expect(body_as_json.pluck(:canonical_email_hash)).to match_array(expected_email_hashes) + end + + context 'with limit param' do + let(:params) { { limit: 2 } } + + it 'returns only the requested number of canonical email blocks' do + subject + + expect(body_as_json.size).to eq(params[:limit]) + end + end + + context 'with since_id param' do + let(:params) { { since_id: canonical_email_blocks[1].id } } + + it 'returns only the canonical email blocks after since_id' do + subject + + canonical_email_blocks_ids = canonical_email_blocks.pluck(:id).map(&:to_s) + + expect(body_as_json.pluck(:id)).to match_array(canonical_email_blocks_ids[2..]) + end + end + + context 'with max_id param' do + let(:params) { { max_id: canonical_email_blocks[3].id } } + + it 'returns only the canonical email blocks before max_id' do + subject + + canonical_email_blocks_ids = canonical_email_blocks.pluck(:id).map(&:to_s) + + expect(body_as_json.pluck(:id)).to match_array(canonical_email_blocks_ids[..2]) + end + end + end + end + + describe 'GET /api/v1/admin/canonical_email_blocks/:id' do + subject do + get "/api/v1/admin/canonical_email_blocks/#{canonical_email_block.id}", headers: headers + end + + let!(:canonical_email_block) { Fabricate(:canonical_email_block) } + + it_behaves_like 'forbidden for wrong scope', 'read:statuses' + it_behaves_like 'forbidden for wrong role', '' + it_behaves_like 'forbidden for wrong role', 'Moderator' + + context 'when the requested canonical email block exists' do + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + + it 'returns the requested canonical email block data correctly' do + subject + + json = body_as_json + + expect(json[:id]).to eq(canonical_email_block.id.to_s) + expect(json[:canonical_email_hash]).to eq(canonical_email_block.canonical_email_hash) + end + end + + context 'when the requested canonical block does not exist' do + it 'returns http not found' do + get '/api/v1/admin/canonical_email_blocks/-1', headers: headers + + expect(response).to have_http_status(404) + end + end + end + + describe 'POST /api/v1/admin/canonical_email_blocks/test' do + subject do + post '/api/v1/admin/canonical_email_blocks/test', headers: headers, params: params + end + + let(:params) { { email: 'email@example.com' } } + + it_behaves_like 'forbidden for wrong scope', 'read:statuses' + it_behaves_like 'forbidden for wrong role', '' + it_behaves_like 'forbidden for wrong role', 'Moderator' + + context 'when the required email param is not provided' do + let(:params) { {} } + + it 'returns http bad request' do + subject + + expect(response).to have_http_status(400) + end + end + + context 'when the required email param is provided' do + context 'when there is a matching canonical email block' do + let!(:canonical_email_block) { CanonicalEmailBlock.create(params) } + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + + it 'returns the expected canonical email hash' do + subject + + expect(body_as_json[0][:canonical_email_hash]).to eq(canonical_email_block.canonical_email_hash) + end + end + + context 'when there is no matching canonical email block' do + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + + it 'returns an empty list' do + subject + + expect(body_as_json).to be_empty + end + end + end + end + + describe 'POST /api/v1/admin/canonical_email_blocks' do + subject do + post '/api/v1/admin/canonical_email_blocks', headers: headers, params: params + end + + let(:params) { { email: 'example@email.com' } } + let(:canonical_email_block) { CanonicalEmailBlock.new(email: params[:email]) } + + it_behaves_like 'forbidden for wrong scope', 'read:statuses' + it_behaves_like 'forbidden for wrong role', '' + it_behaves_like 'forbidden for wrong role', 'Moderator' + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + + it 'returns the canonical_email_hash correctly' do + subject + + expect(body_as_json[:canonical_email_hash]).to eq(canonical_email_block.canonical_email_hash) + end + + context 'when the required email param is not provided' do + let(:params) { {} } + + it 'returns http unprocessable entity' do + subject + + expect(response).to have_http_status(422) + end + end + + context 'when the canonical_email_hash param is provided instead of email' do + let(:params) { { canonical_email_hash: 'dd501ce4e6b08698f19df96f2f15737e48a75660b1fa79b6ff58ea25ee4851a4' } } + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + + it 'returns the correct canonical_email_hash' do + subject + + expect(body_as_json[:canonical_email_hash]).to eq(params[:canonical_email_hash]) + end + end + + context 'when both email and canonical_email_hash params are provided' do + let(:params) { { email: 'example@email.com', canonical_email_hash: 'dd501ce4e6b08698f19df96f2f15737e48a75660b1fa79b6ff58ea25ee4851a4' } } + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + + it 'ignores the canonical_email_hash param' do + subject + + expect(body_as_json[:canonical_email_hash]).to eq(canonical_email_block.canonical_email_hash) + end + end + + context 'when the given canonical email was already blocked' do + before do + canonical_email_block.save + end + + it 'returns http unprocessable entity' do + subject + + expect(response).to have_http_status(422) + end + end + end + + describe 'DELETE /api/v1/admin/canonical_email_blocks/:id' do + subject do + delete "/api/v1/admin/canonical_email_blocks/#{canonical_email_block.id}", headers: headers + end + + let!(:canonical_email_block) { Fabricate(:canonical_email_block) } + + it_behaves_like 'forbidden for wrong scope', 'read:statuses' + + it_behaves_like 'forbidden for wrong role', '' + it_behaves_like 'forbidden for wrong role', 'Moderator' + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + + it 'deletes the canonical email block' do + subject + + expect(CanonicalEmailBlock.find_by(id: canonical_email_block.id)).to be_nil + end + + context 'when the canonical email block is not found' do + it 'returns http not found' do + delete '/api/v1/admin/canonical_email_blocks/0', headers: headers + + expect(response).to have_http_status(404) + end + end + end +end From b19a69560829eaeca1e17c542b33b9f29807d94c Mon Sep 17 00:00:00 2001 From: fusagiko / takayamaki <24884114+takayamaki@users.noreply.github.com> Date: Sun, 11 Jun 2023 01:33:24 +0900 Subject: [PATCH 006/118] migrate test for `GET /api/v1/accounts/{account_id}` to request spec (#25322) --- .../api/v1/accounts_controller_spec.rb | 14 ----- spec/requests/api/v1/accounts_show_spec.rb | 53 +++++++++++++++++++ 2 files changed, 53 insertions(+), 14 deletions(-) create mode 100644 spec/requests/api/v1/accounts_show_spec.rb diff --git a/spec/controllers/api/v1/accounts_controller_spec.rb b/spec/controllers/api/v1/accounts_controller_spec.rb index 992fb0e893..49d2867745 100644 --- a/spec/controllers/api/v1/accounts_controller_spec.rb +++ b/spec/controllers/api/v1/accounts_controller_spec.rb @@ -55,20 +55,6 @@ RSpec.describe Api::V1::AccountsController do end end - describe 'GET #show' do - let(:scopes) { 'read:accounts' } - - before do - get :show, params: { id: user.account.id } - end - - it 'returns http success' do - expect(response).to have_http_status(200) - end - - it_behaves_like 'forbidden for wrong scope', 'write:statuses' - end - describe 'POST #follow' do let(:scopes) { 'write:follows' } let(:other_account) { Fabricate(:account, username: 'bob', locked: locked) } diff --git a/spec/requests/api/v1/accounts_show_spec.rb b/spec/requests/api/v1/accounts_show_spec.rb new file mode 100644 index 0000000000..ee6e925aa9 --- /dev/null +++ b/spec/requests/api/v1/accounts_show_spec.rb @@ -0,0 +1,53 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe 'GET /api/v1/accounts/{account_id}' do + it 'returns account entity as 200 OK' do + account = Fabricate(:account) + + get "/api/v1/accounts/#{account.id}" + + aggregate_failures do + expect(response).to have_http_status(200) + expect(body_as_json[:id]).to eq(account.id.to_s) + end + end + + it 'returns 404 if account not found' do + get '/api/v1/accounts/1' + + aggregate_failures do + expect(response).to have_http_status(404) + expect(body_as_json[:error]).to eq('Record not found') + end + end + + context 'when with token' do + it 'returns account entity as 200 OK if token is valid' do + account = Fabricate(:account) + user = Fabricate(:user, account: account) + token = Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:accounts').token + + get "/api/v1/accounts/#{account.id}", headers: { Authorization: "Bearer #{token}" } + + aggregate_failures do + expect(response).to have_http_status(200) + expect(body_as_json[:id]).to eq(account.id.to_s) + end + end + + it 'returns 403 if scope of token is invalid' do + account = Fabricate(:account) + user = Fabricate(:user, account: account) + token = Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'write:statuses').token + + get "/api/v1/accounts/#{account.id}", headers: { Authorization: "Bearer #{token}" } + + aggregate_failures do + expect(response).to have_http_status(403) + expect(body_as_json[:error]).to eq('This action is outside the authorized scopes') + end + end + end +end From 215081240f367ee39f785443a9200dfff4dfff57 Mon Sep 17 00:00:00 2001 From: Emelia Smith Date: Sat, 10 Jun 2023 18:35:57 +0200 Subject: [PATCH 007/118] Add logging of websocket send errors (#25280) --- streaming/index.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/streaming/index.js b/streaming/index.js index 9b43112d22..aabd2f8559 100644 --- a/streaming/index.js +++ b/streaming/index.js @@ -828,7 +828,11 @@ const startServer = async () => { return; } - ws.send(JSON.stringify({ stream: streamName, event, payload })); + ws.send(JSON.stringify({ stream: streamName, event, payload }), (err) => { + if (err) { + log.error(req.requestId, `Failed to send to websocket: ${err}`); + } + }); }; /** From 07933db7881843f7378b6a02692e1750dd522f69 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Sat, 10 Jun 2023 12:36:09 -0400 Subject: [PATCH 008/118] Add coverage for `CLI::Cache` command (#25238) --- lib/mastodon/cli/cache.rb | 48 +++++++++++++----- spec/fabricators/status_stat_fabricator.rb | 8 +++ spec/lib/mastodon/cli/cache_spec.rb | 59 ++++++++++++++++++++++ spec/rails_helper.rb | 12 +++++ 4 files changed, 113 insertions(+), 14 deletions(-) create mode 100644 spec/fabricators/status_stat_fabricator.rb diff --git a/lib/mastodon/cli/cache.rb b/lib/mastodon/cli/cache.rb index 105d4b3c32..e8a2ac1610 100644 --- a/lib/mastodon/cli/cache.rb +++ b/lib/mastodon/cli/cache.rb @@ -23,22 +23,12 @@ module Mastodon::CLI def recount(type) case type when 'accounts' - processed, = parallelize_with_progress(Account.local.includes(:account_stat)) do |account| - account_stat = account.account_stat - account_stat.following_count = account.active_relationships.count - account_stat.followers_count = account.passive_relationships.count - account_stat.statuses_count = account.statuses.where.not(visibility: :direct).count - - account_stat.save if account_stat.changed? + processed, = parallelize_with_progress(accounts_with_stats) do |account| + recount_account_stats(account) end when 'statuses' - processed, = parallelize_with_progress(Status.includes(:status_stat)) do |status| - status_stat = status.status_stat - status_stat.replies_count = status.replies.where.not(visibility: :direct).count - status_stat.reblogs_count = status.reblogs.count - status_stat.favourites_count = status.favourites.count - - status_stat.save if status_stat.changed? + processed, = parallelize_with_progress(statuses_with_stats) do |status| + recount_status_stats(status) end else say("Unknown type: #{type}", :red) @@ -48,5 +38,35 @@ module Mastodon::CLI say say("OK, recounted #{processed} records", :green) end + + private + + def accounts_with_stats + Account.local.includes(:account_stat) + end + + def statuses_with_stats + Status.includes(:status_stat) + end + + def recount_account_stats(account) + account.account_stat.tap do |account_stat| + account_stat.following_count = account.active_relationships.count + account_stat.followers_count = account.passive_relationships.count + account_stat.statuses_count = account.statuses.where.not(visibility: :direct).count + + account_stat.save if account_stat.changed? + end + end + + def recount_status_stats(status) + status.status_stat.tap do |status_stat| + status_stat.replies_count = status.replies.where.not(visibility: :direct).count + status_stat.reblogs_count = status.reblogs.count + status_stat.favourites_count = status.favourites.count + + status_stat.save if status_stat.changed? + end + end end end diff --git a/spec/fabricators/status_stat_fabricator.rb b/spec/fabricators/status_stat_fabricator.rb new file mode 100644 index 0000000000..715e6d4ab2 --- /dev/null +++ b/spec/fabricators/status_stat_fabricator.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +Fabricator(:status_stat) do + status + replies_count '123' + reblogs_count '456' + favourites_count '789' +end diff --git a/spec/lib/mastodon/cli/cache_spec.rb b/spec/lib/mastodon/cli/cache_spec.rb index f101bc200f..3ab42dc8ce 100644 --- a/spec/lib/mastodon/cli/cache_spec.rb +++ b/spec/lib/mastodon/cli/cache_spec.rb @@ -4,9 +4,68 @@ require 'rails_helper' require 'mastodon/cli/cache' describe Mastodon::CLI::Cache do + let(:cli) { described_class.new } + describe '.exit_on_failure?' do it 'returns true' do expect(described_class.exit_on_failure?).to be true end end + + describe '#clear' do + before { allow(Rails.cache).to receive(:clear) } + + it 'clears the Rails cache' do + expect { cli.invoke(:clear) }.to output( + a_string_including('OK') + ).to_stdout + expect(Rails.cache).to have_received(:clear) + end + end + + describe '#recount' do + context 'with the `accounts` argument' do + let(:arguments) { ['accounts'] } + let(:account_stat) { Fabricate(:account_stat) } + + before do + account_stat.update(statuses_count: 123) + end + + it 're-calculates account records in the cache' do + expect { cli.invoke(:recount, arguments) }.to output( + a_string_including('OK') + ).to_stdout + + expect(account_stat.reload.statuses_count).to be_zero + end + end + + context 'with the `statuses` argument' do + let(:arguments) { ['statuses'] } + let(:status_stat) { Fabricate(:status_stat) } + + before do + status_stat.update(replies_count: 123) + end + + it 're-calculates account records in the cache' do + expect { cli.invoke(:recount, arguments) }.to output( + a_string_including('OK') + ).to_stdout + + expect(status_stat.reload.replies_count).to be_zero + end + end + + context 'with an unknown type' do + let(:arguments) { ['other-type'] } + + it 'Exits with an error message' do + expect { cli.invoke(:recount, arguments) }.to output( + a_string_including('Unknown') + ).to_stdout.and raise_error(SystemExit) + end + end + end end diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb index f4113d565f..2645f74e40 100644 --- a/spec/rails_helper.rb +++ b/spec/rails_helper.rb @@ -79,6 +79,7 @@ RSpec.configure do |config| config.before :each, type: :cli do stub_stdout + stub_reset_connection_pools end config.before :each, type: :feature do @@ -121,9 +122,20 @@ def attachment_fixture(name) end def stub_stdout + # TODO: Is there a bettery way to: + # - Avoid CLI command output being printed out + # - Allow rspec to assert things against STDOUT + # - Avoid disabling stdout for other desirable output (deprecation warnings, for example) allow($stdout).to receive(:write) end +def stub_reset_connection_pools + # TODO: Is there a better way to correctly run specs without stubbing this? + # (Avoids reset_connection_pools! in test env) + allow(ActiveRecord::Base).to receive(:establish_connection) + allow(RedisConfiguration).to receive(:establish_pool) +end + def stub_jsonld_contexts! stub_request(:get, 'https://www.w3.org/ns/activitystreams').to_return(request_fixture('json-ld.activitystreams.txt')) stub_request(:get, 'https://w3id.org/identity/v1').to_return(request_fixture('json-ld.identity.txt')) From b5675e265e95e043018140cb3b23fe19b1608eff Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Sat, 10 Jun 2023 12:37:36 -0400 Subject: [PATCH 009/118] Add coverage for `CLI::Feeds` command (#25319) --- lib/mastodon/cli/feeds.rb | 8 ++++- spec/lib/mastodon/cli/feeds_spec.rb | 56 +++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/lib/mastodon/cli/feeds.rb b/lib/mastodon/cli/feeds.rb index 34617e7538..3467dd427c 100644 --- a/lib/mastodon/cli/feeds.rb +++ b/lib/mastodon/cli/feeds.rb @@ -19,7 +19,7 @@ module Mastodon::CLI LONG_DESC def build(username = nil) if options[:all] || username.nil? - processed, = parallelize_with_progress(Account.joins(:user).merge(User.active)) do |account| + processed, = parallelize_with_progress(active_user_accounts) do |account| PrecomputeFeedService.new.call(account) unless dry_run? end @@ -47,5 +47,11 @@ module Mastodon::CLI redis.del(keys) say('OK', :green) end + + private + + def active_user_accounts + Account.joins(:user).merge(User.active) + end end end diff --git a/spec/lib/mastodon/cli/feeds_spec.rb b/spec/lib/mastodon/cli/feeds_spec.rb index 4e1e214eff..030f087212 100644 --- a/spec/lib/mastodon/cli/feeds_spec.rb +++ b/spec/lib/mastodon/cli/feeds_spec.rb @@ -4,9 +4,65 @@ require 'rails_helper' require 'mastodon/cli/feeds' describe Mastodon::CLI::Feeds do + let(:cli) { described_class.new } + describe '.exit_on_failure?' do it 'returns true' do expect(described_class.exit_on_failure?).to be true end end + + describe '#build' do + before { Fabricate(:account) } + + context 'with --all option' do + let(:options) { { all: true } } + + it 'regenerates feeds for all accounts' do + expect { cli.invoke(:build, [], options) }.to output( + a_string_including('Regenerated feeds') + ).to_stdout + end + end + + context 'with a username' do + before { Fabricate(:account, username: 'alice') } + + let(:arguments) { ['alice'] } + + it 'regenerates feeds for the account' do + expect { cli.invoke(:build, arguments) }.to output( + a_string_including('OK') + ).to_stdout + end + end + + context 'with invalid username' do + let(:arguments) { ['invalid-username'] } + + it 'displays an error and exits' do + expect { cli.invoke(:build, arguments) }.to output( + a_string_including('No such account') + ).to_stdout.and raise_error(SystemExit) + end + end + end + + describe '#clear' do + before do + allow(redis).to receive(:del).with(key_namespace) + end + + it 'clears the redis `feed:*` namespace' do + expect { cli.invoke(:clear) }.to output( + a_string_including('OK') + ).to_stdout + + expect(redis).to have_received(:del).with(key_namespace).once + end + + def key_namespace + redis.keys('feed:*') + end + end end From 62c996b52d4dc50e5713b8e7657fc5eaa52f39c8 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Sat, 10 Jun 2023 12:38:22 -0400 Subject: [PATCH 010/118] Reduce `RSpec/MultipleExpectations` cop max to 8 (#25313) --- .rubocop_todo.yml | 2 +- .../accounts/relationships_controller_spec.rb | 41 +++--- .../confirmations_controller_spec.rb | 31 +++-- spec/models/form/import_spec.rb | 49 +++++-- spec/models/notification_spec.rb | 120 ++++++++++-------- .../services/translate_status_service_spec.rb | 35 +++-- 6 files changed, 172 insertions(+), 106 deletions(-) diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index d1996ca74d..45593104dd 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -394,7 +394,7 @@ RSpec/MessageSpies: - 'spec/validators/status_length_validator_spec.rb' RSpec/MultipleExpectations: - Max: 19 + Max: 8 # Configuration parameters: AllowSubject. RSpec/MultipleMemoizedHelpers: diff --git a/spec/controllers/api/v1/accounts/relationships_controller_spec.rb b/spec/controllers/api/v1/accounts/relationships_controller_spec.rb index 6bc07fa9e0..993ead636a 100644 --- a/spec/controllers/api/v1/accounts/relationships_controller_spec.rb +++ b/spec/controllers/api/v1/accounts/relationships_controller_spec.rb @@ -48,25 +48,32 @@ describe Api::V1::Accounts::RelationshipsController do expect(response).to have_http_status(200) end - it 'returns JSON with correct data' do - json = body_as_json + context 'when there is returned JSON data' do + let(:json) { body_as_json } - expect(json).to be_a Enumerable - expect(json.first[:id]).to eq simon.id.to_s - expect(json.first[:following]).to be true - expect(json.first[:showing_reblogs]).to be true - expect(json.first[:followed_by]).to be false - expect(json.first[:muting]).to be false - expect(json.first[:requested]).to be false - expect(json.first[:domain_blocking]).to be false + it 'returns an enumerable json' do + expect(json).to be_a Enumerable + end - expect(json.second[:id]).to eq lewis.id.to_s - expect(json.second[:following]).to be false - expect(json.second[:showing_reblogs]).to be false - expect(json.second[:followed_by]).to be true - expect(json.second[:muting]).to be false - expect(json.second[:requested]).to be false - expect(json.second[:domain_blocking]).to be false + it 'returns a correct first element' do + expect(json.first[:id]).to eq simon.id.to_s + expect(json.first[:following]).to be true + expect(json.first[:showing_reblogs]).to be true + expect(json.first[:followed_by]).to be false + expect(json.first[:muting]).to be false + expect(json.first[:requested]).to be false + expect(json.first[:domain_blocking]).to be false + end + + it 'returns a correct second element' do + expect(json.second[:id]).to eq lewis.id.to_s + expect(json.second[:following]).to be false + expect(json.second[:showing_reblogs]).to be false + expect(json.second[:followed_by]).to be true + expect(json.second[:muting]).to be false + expect(json.second[:requested]).to be false + expect(json.second[:domain_blocking]).to be false + end end it 'returns JSON with correct data on cached requests too' do diff --git a/spec/controllers/settings/two_factor_authentication/confirmations_controller_spec.rb b/spec/controllers/settings/two_factor_authentication/confirmations_controller_spec.rb index 0b807b280f..84dfd60b38 100644 --- a/spec/controllers/settings/two_factor_authentication/confirmations_controller_spec.rb +++ b/spec/controllers/settings/two_factor_authentication/confirmations_controller_spec.rb @@ -56,18 +56,11 @@ describe Settings::TwoFactorAuthentication::ConfirmationsController do end describe 'when creation succeeds' do + let!(:otp_backup_codes) { user.generate_otp_backup_codes! } + it 'renders page with success' do - otp_backup_codes = user.generate_otp_backup_codes! - expect_any_instance_of(User).to receive(:generate_otp_backup_codes!) do |value| - expect(value).to eq user - otp_backup_codes - end - expect_any_instance_of(User).to receive(:validate_and_consume_otp!) do |value, code, options| - expect(value).to eq user - expect(code).to eq '123456' - expect(options).to eq({ otp_secret: 'thisisasecretforthespecofnewview' }) - true - end + prepare_user_otp_generation + prepare_user_otp_consumption expect do post :create, @@ -80,6 +73,22 @@ describe Settings::TwoFactorAuthentication::ConfirmationsController do expect(response).to have_http_status(200) expect(response).to render_template('settings/two_factor_authentication/recovery_codes/index') end + + def prepare_user_otp_generation + expect_any_instance_of(User).to receive(:generate_otp_backup_codes!) do |value| + expect(value).to eq user + otp_backup_codes + end + end + + def prepare_user_otp_consumption + expect_any_instance_of(User).to receive(:validate_and_consume_otp!) do |value, code, options| + expect(value).to eq user + expect(code).to eq '123456' + expect(options).to eq({ otp_secret: 'thisisasecretforthespecofnewview' }) + true + end + end end describe 'when creation fails' do diff --git a/spec/models/form/import_spec.rb b/spec/models/form/import_spec.rb index 52cf1c96ed..2b70e396b9 100644 --- a/spec/models/form/import_spec.rb +++ b/spec/models/form/import_spec.rb @@ -245,17 +245,44 @@ RSpec.describe Form::Import do expect(account.bulk_imports.first.rows.pluck(:data)).to match_array(expected_rows) end - it 'creates a BulkImport with expected attributes' do - bulk_import = account.bulk_imports.first - expect(bulk_import).to_not be_nil - expect(bulk_import.type.to_sym).to eq subject.type.to_sym - expect(bulk_import.original_filename).to eq subject.data.original_filename - expect(bulk_import.likely_mismatched?).to eq subject.likely_mismatched? - expect(bulk_import.overwrite?).to eq !!subject.overwrite # rubocop:disable Style/DoubleNegation - expect(bulk_import.processed_items).to eq 0 - expect(bulk_import.imported_items).to eq 0 - expect(bulk_import.total_items).to eq bulk_import.rows.count - expect(bulk_import.unconfirmed?).to be true + context 'with a BulkImport' do + let(:bulk_import) { account.bulk_imports.first } + + it 'creates a non-nil bulk import' do + expect(bulk_import).to_not be_nil + end + + it 'matches the subjects type' do + expect(bulk_import.type.to_sym).to eq subject.type.to_sym + end + + it 'matches the subjects original filename' do + expect(bulk_import.original_filename).to eq subject.data.original_filename + end + + it 'matches the subjects likely_mismatched? value' do + expect(bulk_import.likely_mismatched?).to eq subject.likely_mismatched? + end + + it 'matches the subject overwrite value' do + expect(bulk_import.overwrite?).to eq !!subject.overwrite # rubocop:disable Style/DoubleNegation + end + + it 'has zero processed items' do + expect(bulk_import.processed_items).to eq 0 + end + + it 'has zero imported items' do + expect(bulk_import.imported_items).to eq 0 + end + + it 'has a correct total_items value' do + expect(bulk_import.total_items).to eq bulk_import.rows.count + end + + it 'defaults to unconfirmed true' do + expect(bulk_import.unconfirmed?).to be true + end end end diff --git a/spec/models/notification_spec.rb b/spec/models/notification_spec.rb index 0dd9264e00..d6e2282022 100644 --- a/spec/models/notification_spec.rb +++ b/spec/models/notification_spec.rb @@ -99,73 +99,87 @@ RSpec.describe Notification do ] end - it 'preloads target status' do - # mention - expect(subject[0].type).to eq :mention - expect(subject[0].association(:mention)).to be_loaded - expect(subject[0].mention.association(:status)).to be_loaded + context 'with a preloaded target status' do + it 'preloads mention' do + expect(subject[0].type).to eq :mention + expect(subject[0].association(:mention)).to be_loaded + expect(subject[0].mention.association(:status)).to be_loaded + end - # status - expect(subject[1].type).to eq :status - expect(subject[1].association(:status)).to be_loaded + it 'preloads status' do + expect(subject[1].type).to eq :status + expect(subject[1].association(:status)).to be_loaded + end - # reblog - expect(subject[2].type).to eq :reblog - expect(subject[2].association(:status)).to be_loaded - expect(subject[2].status.association(:reblog)).to be_loaded + it 'preloads reblog' do + expect(subject[2].type).to eq :reblog + expect(subject[2].association(:status)).to be_loaded + expect(subject[2].status.association(:reblog)).to be_loaded + end - # follow: nothing - expect(subject[3].type).to eq :follow - expect(subject[3].target_status).to be_nil + it 'preloads follow as nil' do + expect(subject[3].type).to eq :follow + expect(subject[3].target_status).to be_nil + end - # follow_request: nothing - expect(subject[4].type).to eq :follow_request - expect(subject[4].target_status).to be_nil + it 'preloads follow_request as nill' do + expect(subject[4].type).to eq :follow_request + expect(subject[4].target_status).to be_nil + end - # favourite - expect(subject[5].type).to eq :favourite - expect(subject[5].association(:favourite)).to be_loaded - expect(subject[5].favourite.association(:status)).to be_loaded + it 'preloads favourite' do + expect(subject[5].type).to eq :favourite + expect(subject[5].association(:favourite)).to be_loaded + expect(subject[5].favourite.association(:status)).to be_loaded + end - # poll - expect(subject[6].type).to eq :poll - expect(subject[6].association(:poll)).to be_loaded - expect(subject[6].poll.association(:status)).to be_loaded + it 'preloads poll' do + expect(subject[6].type).to eq :poll + expect(subject[6].association(:poll)).to be_loaded + expect(subject[6].poll.association(:status)).to be_loaded + end end - it 'replaces to cached status' do - # mention - expect(subject[0].type).to eq :mention - expect(subject[0].target_status.association(:account)).to be_loaded - expect(subject[0].target_status).to eq mention.status + context 'with a cached status' do + it 'replaces mention' do + expect(subject[0].type).to eq :mention + expect(subject[0].target_status.association(:account)).to be_loaded + expect(subject[0].target_status).to eq mention.status + end - # status - expect(subject[1].type).to eq :status - expect(subject[1].target_status.association(:account)).to be_loaded - expect(subject[1].target_status).to eq status + it 'replaces status' do + expect(subject[1].type).to eq :status + expect(subject[1].target_status.association(:account)).to be_loaded + expect(subject[1].target_status).to eq status + end - # reblog - expect(subject[2].type).to eq :reblog - expect(subject[2].target_status.association(:account)).to be_loaded - expect(subject[2].target_status).to eq reblog.reblog + it 'replaces reblog' do + expect(subject[2].type).to eq :reblog + expect(subject[2].target_status.association(:account)).to be_loaded + expect(subject[2].target_status).to eq reblog.reblog + end - # follow: nothing - expect(subject[3].type).to eq :follow - expect(subject[3].target_status).to be_nil + it 'replaces follow' do + expect(subject[3].type).to eq :follow + expect(subject[3].target_status).to be_nil + end - # follow_request: nothing - expect(subject[4].type).to eq :follow_request - expect(subject[4].target_status).to be_nil + it 'replaces follow_request' do + expect(subject[4].type).to eq :follow_request + expect(subject[4].target_status).to be_nil + end - # favourite - expect(subject[5].type).to eq :favourite - expect(subject[5].target_status.association(:account)).to be_loaded - expect(subject[5].target_status).to eq favourite.status + it 'replaces favourite' do + expect(subject[5].type).to eq :favourite + expect(subject[5].target_status.association(:account)).to be_loaded + expect(subject[5].target_status).to eq favourite.status + end - # poll - expect(subject[6].type).to eq :poll - expect(subject[6].target_status.association(:account)).to be_loaded - expect(subject[6].target_status).to eq poll.status + it 'replaces poll' do + expect(subject[6].type).to eq :poll + expect(subject[6].target_status.association(:account)).to be_loaded + expect(subject[6].target_status).to eq poll.status + end end end end diff --git a/spec/services/translate_status_service_spec.rb b/spec/services/translate_status_service_spec.rb index 074f55544a..515dd1a997 100644 --- a/spec/services/translate_status_service_spec.rb +++ b/spec/services/translate_status_service_spec.rb @@ -152,22 +152,31 @@ RSpec.describe TranslateStatusService, type: :service do describe 'status has poll' do let(:poll) { Fabricate(:poll, options: %w(Blue Green)) } - it 'returns formatted poll options' do - source_texts = service.send(:source_texts) - expect(source_texts.size).to eq 3 - expect(source_texts.values).to eq %w(

Hello

Blue Green) + context 'with source texts from the service' do + let!(:source_texts) { service.send(:source_texts) } - expect(source_texts.keys.first).to eq :content + it 'returns formatted poll options' do + expect(source_texts.size).to eq 3 + expect(source_texts.values).to eq %w(

Hello

Blue Green) + end - option1 = source_texts.keys.second - expect(option1).to be_a Poll::Option - expect(option1.id).to eq '0' - expect(option1.title).to eq 'Blue' + it 'has a first key with content' do + expect(source_texts.keys.first).to eq :content + end - option2 = source_texts.keys.third - expect(option2).to be_a Poll::Option - expect(option2.id).to eq '1' - expect(option2.title).to eq 'Green' + it 'has the first option in the second key with correct options' do + option1 = source_texts.keys.second + expect(option1).to be_a Poll::Option + expect(option1.id).to eq '0' + expect(option1.title).to eq 'Blue' + end + + it 'has the second option in the third key with correct options' do + option2 = source_texts.keys.third + expect(option2).to be_a Poll::Option + expect(option2.id).to eq '1' + expect(option2.title).to eq 'Green' + end end end From 432a5d2d4bc307d9a9c7b484de96d3eb7926fa93 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sun, 11 Jun 2023 04:47:07 +0200 Subject: [PATCH 011/118] Change "bot" label to "automated" (#25356) --- app/javascript/mastodon/features/account/components/header.jsx | 2 +- app/javascript/mastodon/locales/en.json | 2 +- config/locales/simple_form.en.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/javascript/mastodon/features/account/components/header.jsx b/app/javascript/mastodon/features/account/components/header.jsx index a206bcc3ba..5eea1abf04 100644 --- a/app/javascript/mastodon/features/account/components/header.jsx +++ b/app/javascript/mastodon/features/account/components/header.jsx @@ -374,7 +374,7 @@ class Header extends ImmutablePureComponent { let badge; if (account.get('bot')) { - badge = (
); + badge = (
); } else if (account.get('group')) { badge = (
); } else { diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index ef0964b192..6589d46746 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -13,7 +13,7 @@ "about.rules": "Server rules", "account.account_note_header": "Note", "account.add_or_remove_from_list": "Add or Remove from lists", - "account.badges.bot": "Bot", + "account.badges.bot": "Automated", "account.badges.group": "Group", "account.block": "Block @{name}", "account.block_domain": "Block domain {domain}", diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index 330c8732ff..a99a50e993 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -168,7 +168,7 @@ en: defaults: autofollow: Invite to follow your account avatar: Avatar - bot: This is a bot account + bot: This is an automated account chosen_languages: Filter languages confirm_new_password: Confirm new password confirm_password: Confirm password From dfaf59d99a2aa1f913608faee978bc3e1586a3ce Mon Sep 17 00:00:00 2001 From: alfe Date: Sun, 11 Jun 2023 11:47:18 +0900 Subject: [PATCH 012/118] Rewrite as FC and TS (#25363) --- .../mastodon/components/load_pending.jsx | 23 ------------------- .../mastodon/components/load_pending.tsx | 18 +++++++++++++++ .../mastodon/components/scrollable_list.jsx | 2 +- 3 files changed, 19 insertions(+), 24 deletions(-) delete mode 100644 app/javascript/mastodon/components/load_pending.jsx create mode 100644 app/javascript/mastodon/components/load_pending.tsx diff --git a/app/javascript/mastodon/components/load_pending.jsx b/app/javascript/mastodon/components/load_pending.jsx deleted file mode 100644 index e9c1a97836..0000000000 --- a/app/javascript/mastodon/components/load_pending.jsx +++ /dev/null @@ -1,23 +0,0 @@ -import PropTypes from 'prop-types'; -import { PureComponent } from 'react'; - -import { FormattedMessage } from 'react-intl'; - -export default class LoadPending extends PureComponent { - - static propTypes = { - onClick: PropTypes.func, - count: PropTypes.number, - }; - - render() { - const { count } = this.props; - - return ( - - ); - } - -} diff --git a/app/javascript/mastodon/components/load_pending.tsx b/app/javascript/mastodon/components/load_pending.tsx new file mode 100644 index 0000000000..f7589622ed --- /dev/null +++ b/app/javascript/mastodon/components/load_pending.tsx @@ -0,0 +1,18 @@ +import { FormattedMessage } from 'react-intl'; + +interface Props { + onClick: (event: React.MouseEvent) => void; + count: number; +} + +export const LoadPending: React.FC = ({ onClick, count }) => { + return ( + + ); +}; diff --git a/app/javascript/mastodon/components/scrollable_list.jsx b/app/javascript/mastodon/components/scrollable_list.jsx index 53a84ecb53..5c990d6dca 100644 --- a/app/javascript/mastodon/components/scrollable_list.jsx +++ b/app/javascript/mastodon/components/scrollable_list.jsx @@ -16,7 +16,7 @@ import { attachFullscreenListener, detachFullscreenListener, isFullscreen } from import IntersectionObserverWrapper from '../features/ui/util/intersection_observer_wrapper'; import { LoadMore } from './load_more'; -import LoadPending from './load_pending'; +import { LoadPending } from './load_pending'; import LoadingIndicator from './loading_indicator'; const MOUSE_IDLE_DELAY = 300; From 6637ef7852fb5cb341b971807a76a5b013300d22 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 12 Jun 2023 14:22:46 +0200 Subject: [PATCH 013/118] Add unsubscribe link to e-mails (#25378) --- .../mail_subscriptions_controller.rb | 41 +++++++++++++++++++ app/mailers/notification_mailer.rb | 30 +++++++++----- app/views/layouts/mailer.html.haml | 6 ++- app/views/mail_subscriptions/create.html.haml | 9 ++++ app/views/mail_subscriptions/show.html.haml | 12 ++++++ config/i18n-tasks.yml | 1 + config/locales/en.yml | 16 ++++++++ config/routes.rb | 2 + 8 files changed, 106 insertions(+), 11 deletions(-) create mode 100644 app/controllers/mail_subscriptions_controller.rb create mode 100644 app/views/mail_subscriptions/create.html.haml create mode 100644 app/views/mail_subscriptions/show.html.haml diff --git a/app/controllers/mail_subscriptions_controller.rb b/app/controllers/mail_subscriptions_controller.rb new file mode 100644 index 0000000000..b071a80605 --- /dev/null +++ b/app/controllers/mail_subscriptions_controller.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true + +class MailSubscriptionsController < ApplicationController + layout 'auth' + + skip_before_action :require_functional! + + before_action :set_body_classes + before_action :set_user + before_action :set_type + + def show; end + + def create + @user.settings[email_type_from_param] = false + @user.save! + end + + private + + def set_user + @user = GlobalID::Locator.locate_signed(params[:token], for: 'unsubscribe') + end + + def set_body_classes + @body_classes = 'lighter' + end + + def set_type + @type = email_type_from_param + end + + def email_type_from_param + case params[:type] + when 'follow', 'reblog', 'favourite', 'mention', 'follow_request' + "notification_emails.#{params[:type]}" + else + raise ArgumentError + end + end +end diff --git a/app/mailers/notification_mailer.rb b/app/mailers/notification_mailer.rb index c428fd30d6..7cd3bab1af 100644 --- a/app/mailers/notification_mailer.rb +++ b/app/mailers/notification_mailer.rb @@ -8,61 +8,71 @@ class NotificationMailer < ApplicationMailer def mention(recipient, notification) @me = recipient + @user = recipient.user + @type = 'mention' @status = notification.target_status - return unless @me.user.functional? && @status.present? + return unless @user.functional? && @status.present? locale_for_account(@me) do thread_by_conversation(@status.conversation) - mail to: email_address_with_name(@me.user.email, @me.user.account.username), subject: I18n.t('notification_mailer.mention.subject', name: @status.account.acct) + mail to: email_address_with_name(@user.email, @me.username), subject: I18n.t('notification_mailer.mention.subject', name: @status.account.acct) end end def follow(recipient, notification) @me = recipient + @user = recipient.user + @type = 'follow' @account = notification.from_account - return unless @me.user.functional? + return unless @user.functional? locale_for_account(@me) do - mail to: email_address_with_name(@me.user.email, @me.user.account.username), subject: I18n.t('notification_mailer.follow.subject', name: @account.acct) + mail to: email_address_with_name(@user.email, @me.username), subject: I18n.t('notification_mailer.follow.subject', name: @account.acct) end end def favourite(recipient, notification) @me = recipient + @user = recipient.user + @type = 'favourite' @account = notification.from_account @status = notification.target_status - return unless @me.user.functional? && @status.present? + return unless @user.functional? && @status.present? locale_for_account(@me) do thread_by_conversation(@status.conversation) - mail to: email_address_with_name(@me.user.email, @me.user.account.username), subject: I18n.t('notification_mailer.favourite.subject', name: @account.acct) + mail to: email_address_with_name(@user.email, @me.username), subject: I18n.t('notification_mailer.favourite.subject', name: @account.acct) end end def reblog(recipient, notification) @me = recipient + @user = recipient.user + @type = 'reblog' @account = notification.from_account @status = notification.target_status - return unless @me.user.functional? && @status.present? + return unless @user.functional? && @status.present? locale_for_account(@me) do thread_by_conversation(@status.conversation) - mail to: email_address_with_name(@me.user.email, @me.user.account.username), subject: I18n.t('notification_mailer.reblog.subject', name: @account.acct) + mail to: email_address_with_name(@user.email, @me.username), subject: I18n.t('notification_mailer.reblog.subject', name: @account.acct) end end def follow_request(recipient, notification) @me = recipient + @user = recipient.user + @type = 'follow_request' @account = notification.from_account - return unless @me.user.functional? + return unless @user.functional? locale_for_account(@me) do - mail to: email_address_with_name(@me.user.email, @me.user.account.username), subject: I18n.t('notification_mailer.follow_request.subject', name: @account.acct) + mail to: email_address_with_name(@user.email, @me.username), subject: I18n.t('notification_mailer.follow_request.subject', name: @account.acct) end end diff --git a/app/views/layouts/mailer.html.haml b/app/views/layouts/mailer.html.haml index 43c8559270..e39a09780e 100644 --- a/app/views/layouts/mailer.html.haml +++ b/app/views/layouts/mailer.html.haml @@ -44,7 +44,11 @@ %tbody %td.column-cell %p= t 'about.hosted_on', domain: site_hostname - %p= link_to t('application_mailer.notification_preferences'), settings_preferences_notifications_url + %p + = link_to t('application_mailer.notification_preferences'), settings_preferences_notifications_url + - if defined?(@type) + · + = link_to t('application_mailer.unsubscribe'), unsubscribe_url(token: @user.to_sgid(for: 'unsubscribe').to_s, type: @type) %td.column-cell.text-right = link_to root_url do = image_tag full_pack_url('media/images/mailer/logo.png'), alt: 'Mastodon', height: 24 diff --git a/app/views/mail_subscriptions/create.html.haml b/app/views/mail_subscriptions/create.html.haml new file mode 100644 index 0000000000..16ee486b00 --- /dev/null +++ b/app/views/mail_subscriptions/create.html.haml @@ -0,0 +1,9 @@ +- content_for :page_title do + = t('mail_subscriptions.unsubscribe.title') + +.simple_form + %h1.title= t('mail_subscriptions.unsubscribe.complete') + %p.lead + = t('mail_subscriptions.unsubscribe.success_html', domain: content_tag(:strong, site_hostname), type: content_tag(:strong, I18n.t(@type, scope: 'mail_subscriptions.unsubscribe.emails')), email: content_tag(:strong, @user.email)) + %p.lead + = t('mail_subscriptions.unsubscribe.resubscribe_html', settings_path: settings_preferences_notifications_path) diff --git a/app/views/mail_subscriptions/show.html.haml b/app/views/mail_subscriptions/show.html.haml new file mode 100644 index 0000000000..afa2ab6ed7 --- /dev/null +++ b/app/views/mail_subscriptions/show.html.haml @@ -0,0 +1,12 @@ +- content_for :page_title do + = t('mail_subscriptions.unsubscribe.title') + +.simple_form + %h1.title= t('mail_subscriptions.unsubscribe.title') + %p.lead + = t('mail_subscriptions.unsubscribe.confirmation_html', domain: content_tag(:strong, site_hostname), type: content_tag(:strong, I18n.t(@type, scope: 'mail_subscriptions.unsubscribe.emails')), email: content_tag(:strong, @user.email), settings_path: settings_preferences_notifications_path) + + = form_tag unsubscribe_path, method: :post do + = hidden_field_tag :token, params[:token] + = hidden_field_tag :type, params[:type] + = button_tag t('mail_subscriptions.unsubscribe.action'), type: :submit diff --git a/config/i18n-tasks.yml b/config/i18n-tasks.yml index ddf503197c..035a0e999d 100644 --- a/config/i18n-tasks.yml +++ b/config/i18n-tasks.yml @@ -66,6 +66,7 @@ ignore_unused: - 'notification_mailer.*' - 'imports.overwrite_preambles.{following,blocking,muting,domain_blocking,bookmarks}_html' - 'imports.preambles.{following,blocking,muting,domain_blocking,bookmarks}_html' + - 'mail_subscriptions.unsubscribe.emails.*' ignore_inconsistent_interpolations: - '*.one' diff --git a/config/locales/en.yml b/config/locales/en.yml index 2c292c42d4..10eac9aeac 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -978,6 +978,7 @@ en: notification_preferences: Change e-mail preferences salutation: "%{name}," settings: 'Change e-mail preferences: %{link}' + unsubscribe: Unsubscribe view: 'View:' view_profile: View profile view_status: View post @@ -1342,6 +1343,21 @@ en: failed_sign_in_html: Failed sign-in attempt with %{method} from %{ip} (%{browser}) successful_sign_in_html: Successful sign-in with %{method} from %{ip} (%{browser}) title: Authentication history + mail_subscriptions: + unsubscribe: + action: Yes, unsubscribe + complete: Unsubscribed + confirmation_html: Are you sure you want to unsubscribe from receiving %{type} for Mastodon on %{domain} to your e-mail at %{email}? You can always re-subscribe from your e-mail notification settings. + emails: + notification_emails: + favourite: favorite notification e-mails + follow: follow notification e-mails + follow_request: follow request e-mails + mention: mention notification e-mails + reblog: boost notification e-mails + resubscribe_html: If you've unsubscribed by mistake, you can re-subscribe from your e-mail notification settings. + success_html: You'll no longer receive %{type} for Mastodon on %{domain} to your e-mail at %{email}. + title: Unsubscribe media_attachments: validations: images_and_video: Cannot attach a video to a post that already contains images diff --git a/config/routes.rb b/config/routes.rb index 55e5cf36a0..f11fcdc237 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -67,6 +67,8 @@ Rails.application.routes.draw do devise_scope :user do get '/invite/:invite_code', to: 'auth/registrations#new', as: :public_invite + resource :unsubscribe, only: [:show, :create], controller: :mail_subscriptions + namespace :auth do resource :setup, only: [:show, :update], controller: :setup resource :challenge, only: [:create], controller: :challenges From 25c66fa640962a4d54d59a3f53516ab6dcb1dae6 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Mon, 12 Jun 2023 11:37:43 -0400 Subject: [PATCH 014/118] Enable paperclip for account attachment examples (#25381) --- spec/support/examples/models/concerns/account_avatar.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/support/examples/models/concerns/account_avatar.rb b/spec/support/examples/models/concerns/account_avatar.rb index 8f5b81f3a5..16ebda5641 100644 --- a/spec/support/examples/models/concerns/account_avatar.rb +++ b/spec/support/examples/models/concerns/account_avatar.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true shared_examples 'AccountAvatar' do |fabricator| - describe 'static avatars' do + describe 'static avatars', paperclip_processing: true do describe 'when GIF' do it 'creates a png static style' do account = Fabricate(fabricator, avatar: attachment_fixture('avatar.gif')) From 10746af82f5ca2581e497181950ee84884b80117 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 13 Jun 2023 08:59:04 -0400 Subject: [PATCH 015/118] Remove unused shared examples for scoped settings (#25389) --- .../examples/lib/settings/scoped_settings.rb | 74 ------------------- .../lib/settings/settings_extended.rb | 15 ---- 2 files changed, 89 deletions(-) delete mode 100644 spec/support/examples/lib/settings/scoped_settings.rb delete mode 100644 spec/support/examples/lib/settings/settings_extended.rb diff --git a/spec/support/examples/lib/settings/scoped_settings.rb b/spec/support/examples/lib/settings/scoped_settings.rb deleted file mode 100644 index 106adb4fac..0000000000 --- a/spec/support/examples/lib/settings/scoped_settings.rb +++ /dev/null @@ -1,74 +0,0 @@ -# frozen_string_literal: true - -shared_examples 'ScopedSettings' do - describe '[]' do - it 'inherits default settings' do - expect(Setting.boost_modal).to be false - expect(Setting.interactions['must_be_follower']).to be false - - settings = create! - - expect(settings['boost_modal']).to be false - expect(settings['interactions']['must_be_follower']).to be false - end - end - - describe 'all_as_records' do - # expecting [] and []= works - - it 'returns records merged with default values except hashes' do - expect(Setting.boost_modal).to be false - expect(Setting.delete_modal).to be true - - settings = create! - settings['boost_modal'] = true - - records = settings.all_as_records - - expect(records['boost_modal'].value).to be true - expect(records['delete_modal'].value).to be true - end - end - - describe 'missing methods' do - # expecting [] and []= works. - - it 'reads settings' do - expect(Setting.boost_modal).to be false - settings = create! - expect(settings.boost_modal).to be false - end - - it 'updates settings' do - settings = fabricate - settings.boost_modal = true - expect(settings['boost_modal']).to be true - end - end - - it 'can update settings with [] and can read with []=' do - settings = fabricate - - settings['boost_modal'] = true - settings['interactions'] = settings['interactions'].merge('must_be_follower' => true) - - Setting.save! - - expect(settings['boost_modal']).to be true - expect(settings['interactions']['must_be_follower']).to be true - - Rails.cache.clear - - expect(settings['boost_modal']).to be true - expect(settings['interactions']['must_be_follower']).to be true - end - - xit 'does not mutate defaults via the cache' do - fabricate['interactions']['must_be_follower'] = true - # TODO - # This mutates the global settings default such that future - # instances will inherit the incorrect starting values - - expect(fabricate.settings['interactions']['must_be_follower']).to be false - end -end diff --git a/spec/support/examples/lib/settings/settings_extended.rb b/spec/support/examples/lib/settings/settings_extended.rb deleted file mode 100644 index 5a9d34bb04..0000000000 --- a/spec/support/examples/lib/settings/settings_extended.rb +++ /dev/null @@ -1,15 +0,0 @@ -# frozen_string_literal: true - -shared_examples 'Settings-extended' do - describe 'settings' do - def fabricate - super.settings - end - - def create! - super.settings - end - - it_behaves_like 'ScopedSettings' - end -end From 1cb4514d0e0ed349acbfe72ec87f3187a0cf613a Mon Sep 17 00:00:00 2001 From: Renaud Chaput Date: Tue, 13 Jun 2023 15:05:40 +0200 Subject: [PATCH 016/118] Add missing report category translation (#25400) --- .../mastodon/features/notifications/components/report.jsx | 2 ++ app/javascript/mastodon/locales/en.json | 1 + app/models/report.rb | 1 + 3 files changed, 4 insertions(+) diff --git a/app/javascript/mastodon/features/notifications/components/report.jsx b/app/javascript/mastodon/features/notifications/components/report.jsx index 90412aa3bb..cb50b62cdc 100644 --- a/app/javascript/mastodon/features/notifications/components/report.jsx +++ b/app/javascript/mastodon/features/notifications/components/report.jsx @@ -8,10 +8,12 @@ import ImmutablePureComponent from 'react-immutable-pure-component'; import { AvatarOverlay } from 'mastodon/components/avatar_overlay'; import { RelativeTimestamp } from 'mastodon/components/relative_timestamp'; +// This needs to be kept in sync with app/models/report.rb const messages = defineMessages({ openReport: { id: 'report_notification.open', defaultMessage: 'Open report' }, other: { id: 'report_notification.categories.other', defaultMessage: 'Other' }, spam: { id: 'report_notification.categories.spam', defaultMessage: 'Spam' }, + legal: { id: 'report_notification.categories.legal', defaultMessage: 'Legal' }, violation: { id: 'report_notification.categories.violation', defaultMessage: 'Rule violation' }, }); diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 6589d46746..9f7ffad66c 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -553,6 +553,7 @@ "report.unfollow": "Unfollow @{name}", "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", + "report_notification.categories.legal": "Legal", "report_notification.categories.other": "Other", "report_notification.categories.spam": "Spam", "report_notification.categories.violation": "Rule violation", diff --git a/app/models/report.rb b/app/models/report.rb index 674cc9a279..533e3f72ab 100644 --- a/app/models/report.rb +++ b/app/models/report.rb @@ -48,6 +48,7 @@ class Report < ApplicationRecord validate :validate_rule_ids + # entries here needs to be kept in sync with app/javascript/mastodon/features/notifications/components/report.jsx enum category: { other: 0, spam: 1_000, From 72590e601a351d1c4b02eb756a07b02e05054ead Mon Sep 17 00:00:00 2001 From: Nick Schonning Date: Tue, 13 Jun 2023 12:42:51 -0400 Subject: [PATCH 017/118] Update Rubocop 1.52.1 (#25376) --- .rubocop_todo.yml | 19 +++++++------------ Gemfile.lock | 13 +++++++------ 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index 45593104dd..c82cc2a4b7 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -1,6 +1,6 @@ # This configuration was generated by # `rubocop --auto-gen-config --auto-gen-only-exclude --no-exclude-limit --no-offense-counts --no-auto-gen-timestamp` -# using RuboCop version 1.50.2. +# using RuboCop version 1.52.1. # The point is for the user to remove these configuration records # one by one as the offenses are removed from the code base. # Note that changes in the inspected code, or installation of new @@ -48,17 +48,14 @@ Layout/SpaceInLambdaLiteral: - 'config/environments/production.rb' - 'config/initializers/content_security_policy.rb' +# This cop supports safe autocorrection (--autocorrect). # Configuration parameters: AllowedMethods, AllowedPatterns. Lint/AmbiguousBlockAssociation: Exclude: - - 'spec/controllers/admin/account_moderation_notes_controller_spec.rb' - 'spec/controllers/settings/two_factor_authentication/confirmations_controller_spec.rb' - 'spec/controllers/settings/two_factor_authentication/otp_authentication_controller_spec.rb' - - 'spec/controllers/settings/two_factor_authentication/webauthn_credentials_controller_spec.rb' - 'spec/services/activitypub/process_status_update_service_spec.rb' - 'spec/services/post_status_service_spec.rb' - - 'spec/services/suspend_account_service_spec.rb' - - 'spec/services/unsuspend_account_service_spec.rb' - 'spec/workers/scheduler/accounts_statuses_cleanup_scheduler_spec.rb' # Configuration parameters: AllowComments, AllowEmptyLambdas. @@ -124,6 +121,7 @@ Lint/UnusedBlockArgument: - 'config/initializers/paperclip.rb' - 'config/initializers/simple_form.rb' +# This cop supports unsafe autocorrection (--autocorrect-all). Lint/UselessAssignment: Exclude: - 'app/services/activitypub/process_status_update_service.rb' @@ -145,6 +143,7 @@ Lint/UselessAssignment: - 'spec/services/resolve_url_service_spec.rb' - 'spec/views/statuses/show.html.haml_spec.rb' +# This cop supports safe autocorrection (--autocorrect). # Configuration parameters: CheckForMethodsWithNoSideEffects. Lint/Void: Exclude: @@ -165,7 +164,7 @@ Metrics/CyclomaticComplexity: # Configuration parameters: AllowedMethods, AllowedPatterns. Metrics/PerceivedComplexity: - Max: 28 + Max: 27 Naming/AccessorMethodName: Exclude: @@ -178,6 +177,7 @@ Naming/FileName: Exclude: - 'config/locales/sr-Latn.rb' +# This cop supports unsafe autocorrection (--autocorrect-all). # Configuration parameters: EnforcedStyleForLeadingUnderscores. # SupportedStylesForLeadingUnderscores: disallowed, required, optional Naming/MemoizedInstanceVariableName: @@ -320,8 +320,6 @@ RSpec/LetSetup: - 'spec/controllers/admin/statuses_controller_spec.rb' - 'spec/controllers/api/v1/accounts/statuses_controller_spec.rb' - 'spec/controllers/api/v1/admin/accounts_controller_spec.rb' - - 'spec/controllers/api/v1/admin/domain_allows_controller_spec.rb' - - 'spec/controllers/api/v1/admin/domain_blocks_controller_spec.rb' - 'spec/controllers/api/v1/filters_controller_spec.rb' - 'spec/controllers/api/v1/followed_tags_controller_spec.rb' - 'spec/controllers/api/v1/tags_controller_spec.rb' @@ -422,7 +420,6 @@ RSpec/StubbedMock: RSpec/SubjectDeclaration: Exclude: - 'spec/controllers/admin/domain_blocks_controller_spec.rb' - - 'spec/controllers/api/v1/admin/domain_blocks_controller_spec.rb' - 'spec/models/account_migration_spec.rb' - 'spec/models/account_spec.rb' - 'spec/models/relationship_filter_spec.rb' @@ -597,7 +594,6 @@ Rails/NegateInclude: - 'app/models/concerns/attachmentable.rb' - 'app/models/concerns/remotable.rb' - 'app/models/custom_filter.rb' - - 'app/models/webhook.rb' - 'app/services/activitypub/process_status_update_service.rb' - 'app/services/fetch_link_card_service.rb' - 'app/services/search_service.rb' @@ -767,11 +763,9 @@ Rails/WhereExists: - 'app/workers/move_worker.rb' - 'db/migrate/20190529143559_preserve_old_layout_for_existing_users.rb' - 'lib/tasks/tests.rake' - - 'spec/controllers/api/v1/accounts/notes_controller_spec.rb' - 'spec/controllers/api/v1/tags_controller_spec.rb' - 'spec/models/account_spec.rb' - 'spec/services/activitypub/process_collection_service_spec.rb' - - 'spec/services/post_status_service_spec.rb' - 'spec/services/purge_domain_service_spec.rb' - 'spec/services/unallow_domain_service_spec.rb' @@ -793,6 +787,7 @@ Style/ClassVars: Exclude: - 'config/initializers/devise.rb' +# This cop supports unsafe autocorrection (--autocorrect-all). Style/CombinableLoops: Exclude: - 'app/models/form/custom_emoji_batch.rb' diff --git a/Gemfile.lock b/Gemfile.lock index c4fa1822ea..ad789db1e2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -470,8 +470,9 @@ GEM orm_adapter (0.5.0) ox (2.14.16) parallel (1.23.0) - parser (3.2.2.1) + parser (3.2.2.3) ast (~> 2.4.1) + racc parslet (2.0.0) pastel (0.8.0) tty-color (~> 0.5) @@ -495,7 +496,7 @@ GEM pundit (2.3.0) activesupport (>= 3.0.0) raabro (1.4.0) - racc (1.6.2) + racc (1.7.0) rack (2.2.7) rack-attack (6.6.1) rack (>= 1.0, < 3) @@ -557,7 +558,7 @@ GEM redis (>= 4) redlock (1.3.2) redis (>= 3.0.0, < 6.0) - regexp_parser (2.8.0) + regexp_parser (2.8.1) request_store (1.5.1) rack (>= 1.4) responders (3.1.0) @@ -591,17 +592,17 @@ GEM sidekiq (>= 2.4.0) rspec-support (3.12.0) rspec_chunked (0.6) - rubocop (1.51.0) + rubocop (1.52.1) json (~> 2.3) parallel (~> 1.10) - parser (>= 3.2.0.0) + parser (>= 3.2.2.3) rainbow (>= 2.2.2, < 4.0) regexp_parser (>= 1.8, < 3.0) rexml (>= 3.2.5, < 4.0) rubocop-ast (>= 1.28.0, < 2.0) ruby-progressbar (~> 1.7) unicode-display_width (>= 2.4.0, < 3.0) - rubocop-ast (1.28.1) + rubocop-ast (1.29.0) parser (>= 3.2.1.0) rubocop-capybara (2.18.0) rubocop (~> 1.41) From a86886b1fdc927ed51810fb6b43a0458bedf1cbb Mon Sep 17 00:00:00 2001 From: alfe Date: Wed, 14 Jun 2023 02:26:25 +0900 Subject: [PATCH 018/118] Rewrite `` as FC and TS (#25364) --- .../mastodon/components/circular_progress.tsx | 27 ++++++++++++++++ .../mastodon/components/dropdown_menu.jsx | 3 +- .../mastodon/components/loading_indicator.jsx | 31 ------------------- .../mastodon/components/loading_indicator.tsx | 7 +++++ .../mastodon/components/scrollable_list.jsx | 2 +- .../features/account_gallery/index.jsx | 2 +- .../features/account_timeline/index.jsx | 2 +- .../mastodon/features/blocks/index.jsx | 2 +- .../mastodon/features/directory/index.jsx | 2 +- .../mastodon/features/domain_blocks/index.jsx | 2 +- .../mastodon/features/explore/links.jsx | 2 +- .../mastodon/features/explore/results.jsx | 2 +- .../mastodon/features/explore/suggestions.jsx | 2 +- .../mastodon/features/explore/tags.jsx | 2 +- .../mastodon/features/favourites/index.jsx | 2 +- .../mastodon/features/followers/index.jsx | 2 +- .../mastodon/features/following/index.jsx | 2 +- .../mastodon/features/list_timeline/index.jsx | 2 +- .../mastodon/features/lists/index.jsx | 2 +- .../mastodon/features/mutes/index.jsx | 2 +- .../mastodon/features/reblogs/index.jsx | 2 +- .../mastodon/features/report/statuses.jsx | 2 +- .../mastodon/features/status/index.jsx | 2 +- .../features/ui/components/modal_loading.jsx | 2 +- 24 files changed, 55 insertions(+), 53 deletions(-) create mode 100644 app/javascript/mastodon/components/circular_progress.tsx delete mode 100644 app/javascript/mastodon/components/loading_indicator.jsx create mode 100644 app/javascript/mastodon/components/loading_indicator.tsx diff --git a/app/javascript/mastodon/components/circular_progress.tsx b/app/javascript/mastodon/components/circular_progress.tsx new file mode 100644 index 0000000000..850eb93e48 --- /dev/null +++ b/app/javascript/mastodon/components/circular_progress.tsx @@ -0,0 +1,27 @@ +interface Props { + size: number; + strokeWidth: number; +} + +export const CircularProgress: React.FC = ({ size, strokeWidth }) => { + const viewBox = `0 0 ${size} ${size}`; + const radius = (size - strokeWidth) / 2; + + return ( + + + + ); +}; diff --git a/app/javascript/mastodon/components/dropdown_menu.jsx b/app/javascript/mastodon/components/dropdown_menu.jsx index 3cfa0ee125..0416df5d45 100644 --- a/app/javascript/mastodon/components/dropdown_menu.jsx +++ b/app/javascript/mastodon/components/dropdown_menu.jsx @@ -8,8 +8,7 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import { supportsPassiveEvents } from 'detect-passive-events'; import Overlay from 'react-overlays/Overlay'; -import { CircularProgress } from 'mastodon/components/loading_indicator'; - +import { CircularProgress } from "./circular_progress"; import { IconButton } from './icon_button'; const listenerOptions = supportsPassiveEvents ? { passive: true, capture: true } : true; diff --git a/app/javascript/mastodon/components/loading_indicator.jsx b/app/javascript/mastodon/components/loading_indicator.jsx deleted file mode 100644 index c3f7a4e9ef..0000000000 --- a/app/javascript/mastodon/components/loading_indicator.jsx +++ /dev/null @@ -1,31 +0,0 @@ -import PropTypes from 'prop-types'; - -export const CircularProgress = ({ size, strokeWidth }) => { - const viewBox = `0 0 ${size} ${size}`; - const radius = (size - strokeWidth) / 2; - - return ( - - - - ); -}; - -CircularProgress.propTypes = { - size: PropTypes.number.isRequired, - strokeWidth: PropTypes.number.isRequired, -}; - -const LoadingIndicator = () => ( -
- -
-); - -export default LoadingIndicator; diff --git a/app/javascript/mastodon/components/loading_indicator.tsx b/app/javascript/mastodon/components/loading_indicator.tsx new file mode 100644 index 0000000000..6bc24a0d61 --- /dev/null +++ b/app/javascript/mastodon/components/loading_indicator.tsx @@ -0,0 +1,7 @@ +import { CircularProgress } from './circular_progress'; + +export const LoadingIndicator: React.FC = () => ( +
+ +
+); diff --git a/app/javascript/mastodon/components/scrollable_list.jsx b/app/javascript/mastodon/components/scrollable_list.jsx index 5c990d6dca..ce0b579f50 100644 --- a/app/javascript/mastodon/components/scrollable_list.jsx +++ b/app/javascript/mastodon/components/scrollable_list.jsx @@ -17,7 +17,7 @@ import IntersectionObserverWrapper from '../features/ui/util/intersection_observ import { LoadMore } from './load_more'; import { LoadPending } from './load_pending'; -import LoadingIndicator from './loading_indicator'; +import { LoadingIndicator } from './loading_indicator'; const MOUSE_IDLE_DELAY = 300; diff --git a/app/javascript/mastodon/features/account_gallery/index.jsx b/app/javascript/mastodon/features/account_gallery/index.jsx index 653a258667..19c10fa9f8 100644 --- a/app/javascript/mastodon/features/account_gallery/index.jsx +++ b/app/javascript/mastodon/features/account_gallery/index.jsx @@ -10,7 +10,7 @@ import { lookupAccount, fetchAccount } from 'mastodon/actions/accounts'; import { openModal } from 'mastodon/actions/modal'; import ColumnBackButton from 'mastodon/components/column_back_button'; import { LoadMore } from 'mastodon/components/load_more'; -import LoadingIndicator from 'mastodon/components/loading_indicator'; +import { LoadingIndicator } from 'mastodon/components/loading_indicator'; import ScrollContainer from 'mastodon/containers/scroll_container'; import BundleColumnError from 'mastodon/features/ui/components/bundle_column_error'; import { normalizeForLookup } from 'mastodon/reducers/accounts_map'; diff --git a/app/javascript/mastodon/features/account_timeline/index.jsx b/app/javascript/mastodon/features/account_timeline/index.jsx index 7bb0152ced..0f18c043b8 100644 --- a/app/javascript/mastodon/features/account_timeline/index.jsx +++ b/app/javascript/mastodon/features/account_timeline/index.jsx @@ -17,7 +17,7 @@ import { lookupAccount, fetchAccount } from '../../actions/accounts'; import { fetchFeaturedTags } from '../../actions/featured_tags'; import { expandAccountFeaturedTimeline, expandAccountTimeline, connectTimeline, disconnectTimeline } from '../../actions/timelines'; import ColumnBackButton from '../../components/column_back_button'; -import LoadingIndicator from '../../components/loading_indicator'; +import { LoadingIndicator } from '../../components/loading_indicator'; import StatusList from '../../components/status_list'; import Column from '../ui/components/column'; diff --git a/app/javascript/mastodon/features/blocks/index.jsx b/app/javascript/mastodon/features/blocks/index.jsx index 66e42dc41c..d976174ce0 100644 --- a/app/javascript/mastodon/features/blocks/index.jsx +++ b/app/javascript/mastodon/features/blocks/index.jsx @@ -10,7 +10,7 @@ import { debounce } from 'lodash'; import { fetchBlocks, expandBlocks } from '../../actions/blocks'; import ColumnBackButtonSlim from '../../components/column_back_button_slim'; -import LoadingIndicator from '../../components/loading_indicator'; +import { LoadingIndicator } from '../../components/loading_indicator'; import ScrollableList from '../../components/scrollable_list'; import AccountContainer from '../../containers/account_container'; import Column from '../ui/components/column'; diff --git a/app/javascript/mastodon/features/directory/index.jsx b/app/javascript/mastodon/features/directory/index.jsx index 635b6f4113..df25331966 100644 --- a/app/javascript/mastodon/features/directory/index.jsx +++ b/app/javascript/mastodon/features/directory/index.jsx @@ -14,7 +14,7 @@ import { fetchDirectory, expandDirectory } from 'mastodon/actions/directory'; import Column from 'mastodon/components/column'; import ColumnHeader from 'mastodon/components/column_header'; import { LoadMore } from 'mastodon/components/load_more'; -import LoadingIndicator from 'mastodon/components/loading_indicator'; +import { LoadingIndicator } from 'mastodon/components/loading_indicator'; import { RadioButton } from 'mastodon/components/radio_button'; import ScrollContainer from 'mastodon/containers/scroll_container'; diff --git a/app/javascript/mastodon/features/domain_blocks/index.jsx b/app/javascript/mastodon/features/domain_blocks/index.jsx index 34f0afa2b7..9e63b2f817 100644 --- a/app/javascript/mastodon/features/domain_blocks/index.jsx +++ b/app/javascript/mastodon/features/domain_blocks/index.jsx @@ -12,7 +12,7 @@ import { debounce } from 'lodash'; import { fetchDomainBlocks, expandDomainBlocks } from '../../actions/domain_blocks'; import ColumnBackButtonSlim from '../../components/column_back_button_slim'; -import LoadingIndicator from '../../components/loading_indicator'; +import { LoadingIndicator } from '../../components/loading_indicator'; import ScrollableList from '../../components/scrollable_list'; import DomainContainer from '../../containers/domain_container'; import Column from '../ui/components/column'; diff --git a/app/javascript/mastodon/features/explore/links.jsx b/app/javascript/mastodon/features/explore/links.jsx index fba9589931..df91337fdd 100644 --- a/app/javascript/mastodon/features/explore/links.jsx +++ b/app/javascript/mastodon/features/explore/links.jsx @@ -8,7 +8,7 @@ import { connect } from 'react-redux'; import { fetchTrendingLinks } from 'mastodon/actions/trends'; import DismissableBanner from 'mastodon/components/dismissable_banner'; -import LoadingIndicator from 'mastodon/components/loading_indicator'; +import { LoadingIndicator } from 'mastodon/components/loading_indicator'; import Story from './components/story'; diff --git a/app/javascript/mastodon/features/explore/results.jsx b/app/javascript/mastodon/features/explore/results.jsx index dc1f720220..bf2f0b95ad 100644 --- a/app/javascript/mastodon/features/explore/results.jsx +++ b/app/javascript/mastodon/features/explore/results.jsx @@ -12,7 +12,7 @@ import { connect } from 'react-redux'; import { expandSearch } from 'mastodon/actions/search'; import { ImmutableHashtag as Hashtag } from 'mastodon/components/hashtag'; import { LoadMore } from 'mastodon/components/load_more'; -import LoadingIndicator from 'mastodon/components/loading_indicator'; +import { LoadingIndicator } from 'mastodon/components/loading_indicator'; import Account from 'mastodon/containers/account_container'; import Status from 'mastodon/containers/status_container'; diff --git a/app/javascript/mastodon/features/explore/suggestions.jsx b/app/javascript/mastodon/features/explore/suggestions.jsx index bcb710f3ea..f2907cdb22 100644 --- a/app/javascript/mastodon/features/explore/suggestions.jsx +++ b/app/javascript/mastodon/features/explore/suggestions.jsx @@ -7,7 +7,7 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import { connect } from 'react-redux'; import { fetchSuggestions } from 'mastodon/actions/suggestions'; -import LoadingIndicator from 'mastodon/components/loading_indicator'; +import { LoadingIndicator } from 'mastodon/components/loading_indicator'; import AccountCard from 'mastodon/features/directory/components/account_card'; const mapStateToProps = state => ({ diff --git a/app/javascript/mastodon/features/explore/tags.jsx b/app/javascript/mastodon/features/explore/tags.jsx index 1859c62795..ba6f31cd0a 100644 --- a/app/javascript/mastodon/features/explore/tags.jsx +++ b/app/javascript/mastodon/features/explore/tags.jsx @@ -9,7 +9,7 @@ import { connect } from 'react-redux'; import { fetchTrendingHashtags } from 'mastodon/actions/trends'; import DismissableBanner from 'mastodon/components/dismissable_banner'; import { ImmutableHashtag as Hashtag } from 'mastodon/components/hashtag'; -import LoadingIndicator from 'mastodon/components/loading_indicator'; +import { LoadingIndicator } from 'mastodon/components/loading_indicator'; const mapStateToProps = state => ({ hashtags: state.getIn(['trends', 'tags', 'items']), diff --git a/app/javascript/mastodon/features/favourites/index.jsx b/app/javascript/mastodon/features/favourites/index.jsx index 8ea137fd20..57911c3a14 100644 --- a/app/javascript/mastodon/features/favourites/index.jsx +++ b/app/javascript/mastodon/features/favourites/index.jsx @@ -11,7 +11,7 @@ import { connect } from 'react-redux'; import { fetchFavourites } from 'mastodon/actions/interactions'; import ColumnHeader from 'mastodon/components/column_header'; import { Icon } from 'mastodon/components/icon'; -import LoadingIndicator from 'mastodon/components/loading_indicator'; +import { LoadingIndicator } from 'mastodon/components/loading_indicator'; import ScrollableList from 'mastodon/components/scrollable_list'; import AccountContainer from 'mastodon/containers/account_container'; import Column from 'mastodon/features/ui/components/column'; diff --git a/app/javascript/mastodon/features/followers/index.jsx b/app/javascript/mastodon/features/followers/index.jsx index c9a474ea2d..ec39395518 100644 --- a/app/javascript/mastodon/features/followers/index.jsx +++ b/app/javascript/mastodon/features/followers/index.jsx @@ -20,7 +20,7 @@ import { expandFollowers, } from '../../actions/accounts'; import ColumnBackButton from '../../components/column_back_button'; -import LoadingIndicator from '../../components/loading_indicator'; +import { LoadingIndicator } from '../../components/loading_indicator'; import ScrollableList from '../../components/scrollable_list'; import AccountContainer from '../../containers/account_container'; import LimitedAccountHint from '../account_timeline/components/limited_account_hint'; diff --git a/app/javascript/mastodon/features/following/index.jsx b/app/javascript/mastodon/features/following/index.jsx index 7b203341ed..c28c3a3b25 100644 --- a/app/javascript/mastodon/features/following/index.jsx +++ b/app/javascript/mastodon/features/following/index.jsx @@ -20,7 +20,7 @@ import { expandFollowing, } from '../../actions/accounts'; import ColumnBackButton from '../../components/column_back_button'; -import LoadingIndicator from '../../components/loading_indicator'; +import { LoadingIndicator } from '../../components/loading_indicator'; import ScrollableList from '../../components/scrollable_list'; import AccountContainer from '../../containers/account_container'; import LimitedAccountHint from '../account_timeline/components/limited_account_hint'; diff --git a/app/javascript/mastodon/features/list_timeline/index.jsx b/app/javascript/mastodon/features/list_timeline/index.jsx index f9f3a7c315..a5acc416e0 100644 --- a/app/javascript/mastodon/features/list_timeline/index.jsx +++ b/app/javascript/mastodon/features/list_timeline/index.jsx @@ -18,7 +18,7 @@ import { expandListTimeline } from 'mastodon/actions/timelines'; import Column from 'mastodon/components/column'; import ColumnHeader from 'mastodon/components/column_header'; import { Icon } from 'mastodon/components/icon'; -import LoadingIndicator from 'mastodon/components/loading_indicator'; +import { LoadingIndicator } from 'mastodon/components/loading_indicator'; import { RadioButton } from 'mastodon/components/radio_button'; import BundleColumnError from 'mastodon/features/ui/components/bundle_column_error'; import StatusListContainer from 'mastodon/features/ui/containers/status_list_container'; diff --git a/app/javascript/mastodon/features/lists/index.jsx b/app/javascript/mastodon/features/lists/index.jsx index 3bc2cd3a91..ecec4b68df 100644 --- a/app/javascript/mastodon/features/lists/index.jsx +++ b/app/javascript/mastodon/features/lists/index.jsx @@ -12,7 +12,7 @@ import { createSelector } from 'reselect'; import { fetchLists } from 'mastodon/actions/lists'; import Column from 'mastodon/components/column'; import ColumnHeader from 'mastodon/components/column_header'; -import LoadingIndicator from 'mastodon/components/loading_indicator'; +import { LoadingIndicator } from 'mastodon/components/loading_indicator'; import ScrollableList from 'mastodon/components/scrollable_list'; import ColumnLink from 'mastodon/features/ui/components/column_link'; import ColumnSubheading from 'mastodon/features/ui/components/column_subheading'; diff --git a/app/javascript/mastodon/features/mutes/index.jsx b/app/javascript/mastodon/features/mutes/index.jsx index 1c74f34ead..947fe4c9b2 100644 --- a/app/javascript/mastodon/features/mutes/index.jsx +++ b/app/javascript/mastodon/features/mutes/index.jsx @@ -12,7 +12,7 @@ import { debounce } from 'lodash'; import { fetchMutes, expandMutes } from '../../actions/mutes'; import ColumnBackButtonSlim from '../../components/column_back_button_slim'; -import LoadingIndicator from '../../components/loading_indicator'; +import { LoadingIndicator } from '../../components/loading_indicator'; import ScrollableList from '../../components/scrollable_list'; import AccountContainer from '../../containers/account_container'; import Column from '../ui/components/column'; diff --git a/app/javascript/mastodon/features/reblogs/index.jsx b/app/javascript/mastodon/features/reblogs/index.jsx index 31048eba0f..8bcef863f2 100644 --- a/app/javascript/mastodon/features/reblogs/index.jsx +++ b/app/javascript/mastodon/features/reblogs/index.jsx @@ -12,7 +12,7 @@ import { Icon } from 'mastodon/components/icon'; import { fetchReblogs } from '../../actions/interactions'; import ColumnHeader from '../../components/column_header'; -import LoadingIndicator from '../../components/loading_indicator'; +import { LoadingIndicator } from '../../components/loading_indicator'; import ScrollableList from '../../components/scrollable_list'; import AccountContainer from '../../containers/account_container'; import Column from '../ui/components/column'; diff --git a/app/javascript/mastodon/features/report/statuses.jsx b/app/javascript/mastodon/features/report/statuses.jsx index 78408c96bd..4ba8d6065f 100644 --- a/app/javascript/mastodon/features/report/statuses.jsx +++ b/app/javascript/mastodon/features/report/statuses.jsx @@ -8,7 +8,7 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import { connect } from 'react-redux'; import Button from 'mastodon/components/button'; -import LoadingIndicator from 'mastodon/components/loading_indicator'; +import { LoadingIndicator } from 'mastodon/components/loading_indicator'; import StatusCheckBox from 'mastodon/features/report/containers/status_check_box_container'; const mapStateToProps = (state, { accountId }) => ({ diff --git a/app/javascript/mastodon/features/status/index.jsx b/app/javascript/mastodon/features/status/index.jsx index c31607c8eb..892cfbb7b3 100644 --- a/app/javascript/mastodon/features/status/index.jsx +++ b/app/javascript/mastodon/features/status/index.jsx @@ -14,7 +14,7 @@ import { createSelector } from 'reselect'; import { HotKeys } from 'react-hotkeys'; import { Icon } from 'mastodon/components/icon'; -import LoadingIndicator from 'mastodon/components/loading_indicator'; +import { LoadingIndicator } from 'mastodon/components/loading_indicator'; import ScrollContainer from 'mastodon/containers/scroll_container'; import BundleColumnError from 'mastodon/features/ui/components/bundle_column_error'; diff --git a/app/javascript/mastodon/features/ui/components/modal_loading.jsx b/app/javascript/mastodon/features/ui/components/modal_loading.jsx index 7a6bbf5fa2..7d19e73513 100644 --- a/app/javascript/mastodon/features/ui/components/modal_loading.jsx +++ b/app/javascript/mastodon/features/ui/components/modal_loading.jsx @@ -1,4 +1,4 @@ -import LoadingIndicator from '../../../components/loading_indicator'; +import { LoadingIndicator } from '../../../components/loading_indicator'; // Keep the markup in sync with // (make sure they have the same dimensions) From 3b5e302f7fc1e62cbd075e154ad9415f20fde2ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=9F=E3=81=84=E3=81=A1=20=E3=81=B2?= Date: Wed, 14 Jun 2023 02:28:31 +0900 Subject: [PATCH 019/118] Rewrite `emoji_mart_data_light` as TS (#25138) --- .../features/emoji/emoji_compressed.d.ts | 51 ++++++++++++++++++ .../features/emoji/emoji_compressed.js | 10 ++++ .../features/emoji/emoji_mart_data_light.js | 43 --------------- .../features/emoji/emoji_mart_data_light.ts | 52 +++++++++++++++++++ 4 files changed, 113 insertions(+), 43 deletions(-) create mode 100644 app/javascript/mastodon/features/emoji/emoji_compressed.d.ts delete mode 100644 app/javascript/mastodon/features/emoji/emoji_mart_data_light.js create mode 100644 app/javascript/mastodon/features/emoji/emoji_mart_data_light.ts diff --git a/app/javascript/mastodon/features/emoji/emoji_compressed.d.ts b/app/javascript/mastodon/features/emoji/emoji_compressed.d.ts new file mode 100644 index 0000000000..2408942ed6 --- /dev/null +++ b/app/javascript/mastodon/features/emoji/emoji_compressed.d.ts @@ -0,0 +1,51 @@ +import type { BaseEmoji, EmojiData, NimbleEmojiIndex } from 'emoji-mart'; +import type { Category, Data, Emoji } from 'emoji-mart/dist-es/utils/data'; + +/* + * The 'search' property, although not defined in the [`Emoji`]{@link node_modules/@types/emoji-mart/dist-es/utils/data.d.ts#Emoji} type, + * is used in the application. + * This could be due to an oversight by the library maintainer. + * The `search` property is defined and used [here]{@link node_modules/emoji-mart/dist/utils/data.js#uncompress}. + */ +export type Search = string; +/* + * The 'skins' property does not exist in the application data. + * This could be a potential area of refactoring or error handling. + * The non-existence of 'skins' property is evident at [this location]{@link app/javascript/mastodon/features/emoji/emoji_compressed.js:121}. + */ +export type Skins = null; + +export type FilenameData = string[] | string[][]; +export type ShortCodesToEmojiDataKey = + | EmojiData['id'] + | BaseEmoji['native'] + | keyof NimbleEmojiIndex['emojis']; + +export type SearchData = [ + BaseEmoji['native'], + Emoji['short_names'], + Search, + Emoji['unified'] +]; + +export interface ShortCodesToEmojiData { + [key: ShortCodesToEmojiDataKey]: [FilenameData, SearchData]; +} +export type EmojisWithoutShortCodes = FilenameData[]; + +export type EmojiCompressed = [ + ShortCodesToEmojiData, + Skins, + Category[], + Data['aliases'], + EmojisWithoutShortCodes +]; + +/* + * `emoji_compressed.js` uses `babel-plugin-preval`, which makes it difficult to convert to TypeScript. + * As a temporary solution, we are allowing a default export here to apply the TypeScript type `EmojiCompressed` to the JS file export. + * - {@link app/javascript/mastodon/features/emoji/emoji_compressed.js} + */ +declare const emojiCompressed: EmojiCompressed; + +export default emojiCompressed; // eslint-disable-line import/no-default-export diff --git a/app/javascript/mastodon/features/emoji/emoji_compressed.js b/app/javascript/mastodon/features/emoji/emoji_compressed.js index 3d577e50f2..883bf21a4a 100644 --- a/app/javascript/mastodon/features/emoji/emoji_compressed.js +++ b/app/javascript/mastodon/features/emoji/emoji_compressed.js @@ -118,6 +118,16 @@ Object.keys(emojiIndex.emojis).forEach(key => { // inconsistent behavior in dev mode module.exports = JSON.parse(JSON.stringify([ shortCodesToEmojiData, + /* + * The property `skins` is not found in the current context. + * This could potentially lead to issues when interacting with modules or data structures + * that expect the presence of `skins` property. + * Currently, no definitions or references to `skins` property can be found in: + * - {@link node_modules/emoji-mart/dist/utils/data.js} + * - {@link node_modules/emoji-mart/data/all.json} + * - {@link app/javascript/mastodon/features/emoji/emoji_compressed.d.ts#Skins} + * Future refactorings or updates should consider adding definitions or handling for `skins` property. + */ emojiMartData.skins, emojiMartData.categories, emojiMartData.aliases, diff --git a/app/javascript/mastodon/features/emoji/emoji_mart_data_light.js b/app/javascript/mastodon/features/emoji/emoji_mart_data_light.js deleted file mode 100644 index 11698937c0..0000000000 --- a/app/javascript/mastodon/features/emoji/emoji_mart_data_light.js +++ /dev/null @@ -1,43 +0,0 @@ -// The output of this module is designed to mimic emoji-mart's -// "data" object, such that we can use it for a light version of emoji-mart's -// emojiIndex.search functionality. -import emojiCompressed from './emoji_compressed'; -import { unicodeToUnifiedName } from './unicode_to_unified_name'; - -const [ shortCodesToEmojiData, skins, categories, short_names ] = emojiCompressed; - -const emojis = {}; - -// decompress -Object.keys(shortCodesToEmojiData).forEach((shortCode) => { - let [ - filenameData, // eslint-disable-line @typescript-eslint/no-unused-vars - searchData, - ] = shortCodesToEmojiData[shortCode]; - let [ - native, - short_names, - search, - unified, - ] = searchData; - - if (!unified) { - // unified name can be derived from unicodeToUnifiedName - unified = unicodeToUnifiedName(native); - } - - short_names = [shortCode].concat(short_names); - emojis[shortCode] = { - native, - search, - short_names, - unified, - }; -}); - -export { - emojis, - skins, - categories, - short_names, -}; diff --git a/app/javascript/mastodon/features/emoji/emoji_mart_data_light.ts b/app/javascript/mastodon/features/emoji/emoji_mart_data_light.ts new file mode 100644 index 0000000000..62cb84baf8 --- /dev/null +++ b/app/javascript/mastodon/features/emoji/emoji_mart_data_light.ts @@ -0,0 +1,52 @@ +// The output of this module is designed to mimic emoji-mart's +// "data" object, such that we can use it for a light version of emoji-mart's +// emojiIndex.search functionality. +import type { BaseEmoji } from 'emoji-mart'; +import type { Emoji } from 'emoji-mart/dist-es/utils/data'; + +import type { Search, ShortCodesToEmojiData } from './emoji_compressed'; +import emojiCompressed from './emoji_compressed'; +import { unicodeToUnifiedName } from './unicode_to_unified_name'; + +type Emojis = { + [key in keyof ShortCodesToEmojiData]: { + native: BaseEmoji['native']; + search: Search; + short_names: Emoji['short_names']; + unified: Emoji['unified']; + }; +}; + +const [ + shortCodesToEmojiData, + skins, + categories, + short_names, + _emojisWithoutShortCodes, +] = emojiCompressed; + +const emojis: Emojis = {}; + +// decompress +Object.keys(shortCodesToEmojiData).forEach((shortCode) => { + const [_filenameData, searchData] = shortCodesToEmojiData[shortCode]; + const native = searchData[0]; + let short_names = searchData[1]; + const search = searchData[2]; + let unified = searchData[3]; + + if (!unified) { + // unified name can be derived from unicodeToUnifiedName + unified = unicodeToUnifiedName(native); + } + + if (short_names) short_names = [shortCode].concat(short_names); + emojis[shortCode] = { + native, + search, + short_names, + unified, + }; +}); + +export { emojis, skins, categories, short_names }; From 39110d1d0af5e3d9cf452ae47496a52797249fd0 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Tue, 13 Jun 2023 22:30:40 +0200 Subject: [PATCH 020/118] Fix CAPTCHA page not following design pattern of sign-up flow (#25395) --- app/controllers/concerns/captcha_concern.rb | 5 +++++ app/javascript/styles/mastodon/forms.scss | 4 +++- app/views/auth/confirmations/captcha.html.haml | 8 +++++--- config/locales/en.yml | 5 +++-- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/app/controllers/concerns/captcha_concern.rb b/app/controllers/concerns/captcha_concern.rb index 538c1ffb14..576304d1ca 100644 --- a/app/controllers/concerns/captcha_concern.rb +++ b/app/controllers/concerns/captcha_concern.rb @@ -2,6 +2,7 @@ module CaptchaConcern extend ActiveSupport::Concern + include Hcaptcha::Adapters::ViewMethods included do @@ -35,18 +36,22 @@ module CaptchaConcern flash.delete(:hcaptcha_error) yield message end + false end end def extend_csp_for_captcha! policy = request.content_security_policy + return unless captcha_required? && policy.present? %w(script_src frame_src style_src connect_src).each do |directive| values = policy.send(directive) + values << 'https://hcaptcha.com' unless values.include?('https://hcaptcha.com') || values.include?('https:') values << 'https://*.hcaptcha.com' unless values.include?('https://*.hcaptcha.com') || values.include?('https:') + policy.send(directive, *values) end end diff --git a/app/javascript/styles/mastodon/forms.scss b/app/javascript/styles/mastodon/forms.scss index d63a42557f..81a656a602 100644 --- a/app/javascript/styles/mastodon/forms.scss +++ b/app/javascript/styles/mastodon/forms.scss @@ -1048,7 +1048,9 @@ code { } .simple_form .h-captcha { - text-align: center; + display: flex; + justify-content: center; + margin-bottom: 30px; } .permissions-list { diff --git a/app/views/auth/confirmations/captcha.html.haml b/app/views/auth/confirmations/captcha.html.haml index 77f4b35b4f..964d0e63e7 100644 --- a/app/views/auth/confirmations/captcha.html.haml +++ b/app/views/auth/confirmations/captcha.html.haml @@ -7,10 +7,12 @@ = hidden_field_tag :confirmation_token, params[:confirmation_token] = hidden_field_tag :redirect_to_app, params[:redirect_to_app] + %h1.title= t('auth.captcha_confirmation.title') %p.lead= t('auth.captcha_confirmation.hint_html') - .field-group - = render_captcha + = render_captcha + + %p.lead= t('auth.captcha_confirmation.help_html', email: mail_to(Setting.site_contact_email, nil)) .actions - %button.button= t('challenge.confirm') + = button_tag t('challenge.confirm'), class: 'button', type: :submit diff --git a/config/locales/en.yml b/config/locales/en.yml index 10eac9aeac..f4944cca28 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -993,8 +993,9 @@ en: auth: apply_for_account: Request an account captcha_confirmation: - hint_html: Just one more step! To confirm your account, this server requires you to solve a CAPTCHA. You can contact the server administrator if you have questions or need assistance with confirming your account. - title: User verification + help_html: If you have issues solving the CAPTCHA, you can get in touch with us through %{email} and we can assist you. + hint_html: Just one more thing! We need to confirm you're a human (this is so we can keep the spam out!). Solve the CAPTCHA below and click "Continue". + title: Security check change_password: Password confirmations: wrong_email_hint: If that e-mail address is not correct, you can change it in account settings. From bca649ba79ee4fcb33e04084dbd7aa5d275adbf7 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Wed, 14 Jun 2023 04:38:07 +0200 Subject: [PATCH 021/118] Change edit profile page (#25413) --- .../settings/verifications_controller.rb | 15 +++ .../settings/featured_tags/index.html.haml | 8 +- app/views/settings/profiles/show.html.haml | 102 +++++++++--------- app/views/settings/shared/_links.html.haml | 10 -- .../shared/_profile_navigation.html.haml | 6 ++ .../settings/verifications/show.html.haml | 30 ++++++ config/locales/an.yml | 1 - config/locales/ar.yml | 1 - config/locales/ast.yml | 1 - config/locales/be.yml | 2 - config/locales/bg.yml | 2 - config/locales/br.yml | 1 - config/locales/ca.yml | 2 - config/locales/ckb.yml | 1 - config/locales/co.yml | 1 - config/locales/cs.yml | 2 - config/locales/cy.yml | 2 - config/locales/da.yml | 2 - config/locales/de.yml | 2 - config/locales/el.yml | 2 - config/locales/en-GB.yml | 2 - config/locales/en.yml | 16 ++- config/locales/eo.yml | 2 - config/locales/es-AR.yml | 2 - config/locales/es-MX.yml | 2 - config/locales/es.yml | 2 - config/locales/et.yml | 2 - config/locales/eu.yml | 2 - config/locales/fa.yml | 2 - config/locales/fi.yml | 2 - config/locales/fo.yml | 2 - config/locales/fr-QC.yml | 2 - config/locales/fr.yml | 2 - config/locales/fy.yml | 2 - config/locales/ga.yml | 1 - config/locales/gd.yml | 2 - config/locales/gl.yml | 2 - config/locales/he.yml | 2 - config/locales/hi.yml | 2 - config/locales/hu.yml | 2 - config/locales/hy.yml | 1 - config/locales/id.yml | 1 - config/locales/io.yml | 1 - config/locales/is.yml | 2 - config/locales/it.yml | 2 - config/locales/ja.yml | 2 - config/locales/ka.yml | 1 - config/locales/kab.yml | 1 - config/locales/kk.yml | 1 - config/locales/ko.yml | 2 - config/locales/ku.yml | 1 - config/locales/lt.yml | 1 - config/locales/lv.yml | 2 - config/locales/ms.yml | 1 - config/locales/my.yml | 2 - config/locales/nl.yml | 2 - config/locales/nn.yml | 1 - config/locales/no.yml | 2 - config/locales/oc.yml | 1 - config/locales/pl.yml | 2 - config/locales/pt-BR.yml | 2 - config/locales/pt-PT.yml | 2 - config/locales/ro.yml | 1 - config/locales/ru.yml | 2 - config/locales/sc.yml | 1 - config/locales/sco.yml | 1 - config/locales/si.yml | 1 - config/locales/simple_form.an.yml | 1 - config/locales/simple_form.ar.yml | 1 - config/locales/simple_form.ast.yml | 1 - config/locales/simple_form.be.yml | 1 - config/locales/simple_form.bg.yml | 1 - config/locales/simple_form.ca.yml | 1 - config/locales/simple_form.ckb.yml | 1 - config/locales/simple_form.co.yml | 1 - config/locales/simple_form.cs.yml | 1 - config/locales/simple_form.cy.yml | 1 - config/locales/simple_form.da.yml | 1 - config/locales/simple_form.de.yml | 1 - config/locales/simple_form.el.yml | 1 - config/locales/simple_form.en-GB.yml | 1 - config/locales/simple_form.en.yml | 11 +- config/locales/simple_form.eo.yml | 1 - config/locales/simple_form.es-AR.yml | 1 - config/locales/simple_form.es-MX.yml | 1 - config/locales/simple_form.es.yml | 1 - config/locales/simple_form.et.yml | 1 - config/locales/simple_form.eu.yml | 1 - config/locales/simple_form.fa.yml | 1 - config/locales/simple_form.fi.yml | 1 - config/locales/simple_form.fo.yml | 1 - config/locales/simple_form.fr-QC.yml | 1 - config/locales/simple_form.fr.yml | 1 - config/locales/simple_form.fy.yml | 1 - config/locales/simple_form.gd.yml | 1 - config/locales/simple_form.gl.yml | 1 - config/locales/simple_form.he.yml | 1 - config/locales/simple_form.hu.yml | 1 - config/locales/simple_form.hy.yml | 1 - config/locales/simple_form.id.yml | 1 - config/locales/simple_form.io.yml | 1 - config/locales/simple_form.is.yml | 1 - config/locales/simple_form.it.yml | 1 - config/locales/simple_form.ja.yml | 1 - config/locales/simple_form.ka.yml | 1 - config/locales/simple_form.ko.yml | 1 - config/locales/simple_form.ku.yml | 1 - config/locales/simple_form.lv.yml | 1 - config/locales/simple_form.my.yml | 1 - config/locales/simple_form.nl.yml | 1 - config/locales/simple_form.nn.yml | 1 - config/locales/simple_form.no.yml | 1 - config/locales/simple_form.oc.yml | 1 - config/locales/simple_form.pl.yml | 1 - config/locales/simple_form.pt-BR.yml | 1 - config/locales/simple_form.pt-PT.yml | 1 - config/locales/simple_form.ro.yml | 1 - config/locales/simple_form.ru.yml | 1 - config/locales/simple_form.sc.yml | 1 - config/locales/simple_form.sco.yml | 1 - config/locales/simple_form.si.yml | 1 - config/locales/simple_form.sk.yml | 1 - config/locales/simple_form.sl.yml | 1 - config/locales/simple_form.sq.yml | 1 - config/locales/simple_form.sr-Latn.yml | 1 - config/locales/simple_form.sr.yml | 1 - config/locales/simple_form.sv.yml | 1 - config/locales/simple_form.th.yml | 1 - config/locales/simple_form.tr.yml | 1 - config/locales/simple_form.uk.yml | 1 - config/locales/simple_form.vi.yml | 1 - config/locales/simple_form.zh-CN.yml | 1 - config/locales/simple_form.zh-HK.yml | 1 - config/locales/simple_form.zh-TW.yml | 1 - config/locales/sk.yml | 1 - config/locales/sl.yml | 2 - config/locales/sq.yml | 2 - config/locales/sr-Latn.yml | 1 - config/locales/sr.yml | 2 - config/locales/sv.yml | 2 - config/locales/th.yml | 2 - config/locales/tr.yml | 2 - config/locales/tt.yml | 1 - config/locales/uk.yml | 2 - config/locales/vi.yml | 2 - config/locales/zgh.yml | 1 - config/locales/zh-CN.yml | 2 - config/locales/zh-HK.yml | 2 - config/locales/zh-TW.yml | 2 - config/navigation.rb | 6 +- config/routes/settings.rb | 1 + 151 files changed, 128 insertions(+), 267 deletions(-) create mode 100644 app/controllers/settings/verifications_controller.rb delete mode 100644 app/views/settings/shared/_links.html.haml create mode 100644 app/views/settings/shared/_profile_navigation.html.haml create mode 100644 app/views/settings/verifications/show.html.haml diff --git a/app/controllers/settings/verifications_controller.rb b/app/controllers/settings/verifications_controller.rb new file mode 100644 index 0000000000..fc4f23bb18 --- /dev/null +++ b/app/controllers/settings/verifications_controller.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +class Settings::VerificationsController < Settings::BaseController + before_action :set_account + + def show + @verified_links = @account.fields.select(&:verified?) + end + + private + + def set_account + @account = current_account + end +end diff --git a/app/views/settings/featured_tags/index.html.haml b/app/views/settings/featured_tags/index.html.haml index 3ead9d2e2a..387eb290e3 100644 --- a/app/views/settings/featured_tags/index.html.haml +++ b/app/views/settings/featured_tags/index.html.haml @@ -1,13 +1,15 @@ - content_for :page_title do = t('settings.featured_tags') -%p= t('featured_tags.hint_html') - -%hr.spacer/ +- content_for :heading do + %h2= t('settings.profile') + = render partial: 'settings/shared/profile_navigation' = simple_form_for @featured_tag, url: settings_featured_tags_path do |f| = render 'shared/error_messages', object: @featured_tag + %p.lead= t('featured_tags.hint_html') + .fields-group = f.input :name, wrapper: :with_block_label, hint: safe_join([t('simple_form.hints.featured_tag.name'), safe_join(@recently_used_tags.map { |tag| link_to("##{tag.display_name}", settings_featured_tags_path(featured_tag: { name: tag.name }), method: :post) }, ', ')], ' ') diff --git a/app/views/settings/profiles/show.html.haml b/app/views/settings/profiles/show.html.haml index 3067b37370..ac3070f162 100644 --- a/app/views/settings/profiles/show.html.haml +++ b/app/views/settings/profiles/show.html.haml @@ -1,76 +1,76 @@ - content_for :page_title do = t('settings.edit_profile') -- content_for :heading_actions do - = button_tag t('generic.save_changes'), class: 'button', form: 'edit_profile' +- content_for :heading do + %h2= t('settings.profile') + = render partial: 'settings/shared/profile_navigation' = simple_form_for @account, url: settings_profile_path, html: { method: :put, id: 'edit_profile' } do |f| = render 'shared/error_messages', object: @account - .fields-row - .fields-row__column.fields-group.fields-row__column-6 - = f.input :display_name, wrapper: :with_label, input_html: { maxlength: 30, data: { default: @account.username } }, hint: false - = f.input :note, wrapper: :with_label, input_html: { maxlength: 500 }, hint: false + %p.lead= t('edit_profile.hint_html') + + %h4= t('edit_profile.basic_information') .fields-row .fields-row__column.fields-row__column-6 - = render 'application/card', account: @account + .fields-group + = f.input :display_name, wrapper: :with_block_label, input_html: { maxlength: 30, data: { default: @account.username } } - .fields-row__column.fields-group.fields-row__column-6 - = f.input :header, wrapper: :with_label, input_html: { accept: AccountHeader::IMAGE_MIME_TYPES.join(',') }, hint: picture_hint(t('simple_form.hints.defaults.header', dimensions: '1500x500', size: number_to_human_size(AccountHeader::LIMIT)), @account.header) + .fields-group + = f.input :note, wrapper: :with_block_label, input_html: { maxlength: 500 } - = f.input :avatar, wrapper: :with_label, input_html: { accept: AccountAvatar::IMAGE_MIME_TYPES.join(',') }, hint: picture_hint(t('simple_form.hints.defaults.avatar', dimensions: '400x400', size: number_to_human_size(AccountAvatar::LIMIT)), @account.avatar) - - %hr.spacer/ - - .fields-group - = f.input :locked, as: :boolean, wrapper: :with_label, hint: t('simple_form.hints.defaults.locked') - - .fields-group - = f.input :bot, as: :boolean, wrapper: :with_label, hint: t('simple_form.hints.defaults.bot') - - .fields-group - = f.input :discoverable, as: :boolean, wrapper: :with_label, hint: t('simple_form.hints.defaults.discoverable'), recommended: true - - .fields-group - = f.input :hide_collections, as: :boolean, wrapper: :with_label, label: t('simple_form.labels.defaults.setting_hide_network'), hint: t('simple_form.hints.defaults.setting_hide_network') - - %hr.spacer/ - - .fields-row .fields-row__column.fields-group.fields-row__column-6 .input.with_block_label %label= t('simple_form.labels.defaults.fields') - %span.hint= t('simple_form.hints.defaults.fields') + %span.hint= t('simple_form.hints.account.fields') = f.simple_fields_for :fields do |fields_f| .row = fields_f.input :name, placeholder: t('simple_form.labels.account.fields.name'), input_html: { maxlength: 255 } = fields_f.input :value, placeholder: t('simple_form.labels.account.fields.value'), input_html: { maxlength: 255 } - .fields-row__column.fields-group.fields-row__column-6 - %h6= t('verification.verification') - %p.hint= t('verification.explanation_html') + .fields-row + .fields-row__column.fields-row__column-6 + .fields-group + = f.input :avatar, wrapper: :with_block_label, input_html: { accept: AccountAvatar::IMAGE_MIME_TYPES.join(',') }, hint: t('simple_form.hints.defaults.avatar', dimensions: '400x400', size: number_to_human_size(AccountAvatar::LIMIT)) - .input-copy - .input-copy__wrapper - %input{ type: :text, maxlength: '999', spellcheck: 'false', readonly: 'true', value: link_to('Mastodon', ActivityPub::TagManager.instance.url_for(@account), rel: 'me').to_str } - %button{ type: :button }= t('generic.copy') + - if @account.avatar.present? + .fields-row__column.fields-row__column-6 + .fields-group + = image_tag @account.avatar.url, class: 'fields-group__thumbnail', width: 90, height: 90 + = link_to settings_profile_picture_path('avatar'), data: { method: :delete }, class: 'link-button link-button--destructive' do + = fa_icon 'trash fw' + = t('generic.delete') + + .fields-row + .fields-row__column.fields-row__column-6 + .fields-group + = f.input :header, wrapper: :with_block_label, input_html: { accept: AccountHeader::IMAGE_MIME_TYPES.join(',') }, hint: t('simple_form.hints.defaults.header', dimensions: '1500x500', size: number_to_human_size(AccountHeader::LIMIT)) + + - if @account.header.present? + .fields-row__column.fields-row__column-6 + .fields-group + = image_tag @account.header.url, class: 'fields-group__thumbnail' + = link_to settings_profile_picture_path('header'), data: { method: :delete }, class: 'link-button link-button--destructive' do + = fa_icon 'trash fw' + = t('generic.delete') + + %h4= t('edit_profile.safety_and_privacy') + + .fields-group + = f.input :discoverable, as: :boolean, wrapper: :with_label, hint: t('simple_form.hints.defaults.discoverable'), recommended: true + + .fields-group + = f.input :locked, as: :boolean, wrapper: :with_label, hint: t('simple_form.hints.defaults.locked') + + .fields-group + = f.input :hide_collections, as: :boolean, wrapper: :with_label, label: t('simple_form.labels.defaults.setting_hide_network'), hint: t('simple_form.hints.defaults.setting_hide_network') + + %h4= t('edit_profile.other') + + .fields-group + = f.input :bot, as: :boolean, wrapper: :with_label, hint: t('simple_form.hints.defaults.bot') .actions = f.button :button, t('generic.save_changes'), type: :submit - -%hr/ - -%h6= t('auth.migrate_account') -%p.muted-hint= t('auth.migrate_account_html', path: settings_migration_path) - -%hr.spacer/ - -%h6= t 'migrations.incoming_migrations' -%p.muted-hint= t('migrations.incoming_migrations_html', path: settings_aliases_path) - -%hr.spacer/ - -%h6= t('auth.delete_account') -%p.muted-hint= t('auth.delete_account_html', path: settings_delete_path) diff --git a/app/views/settings/shared/_links.html.haml b/app/views/settings/shared/_links.html.haml deleted file mode 100644 index 0abb5a7abb..0000000000 --- a/app/views/settings/shared/_links.html.haml +++ /dev/null @@ -1,10 +0,0 @@ -%ul.no-list - - if controller_name != 'profiles' - %li= link_to t('settings.edit_profile'), settings_profile_path - - if controller_name != 'preferences' - %li= link_to t('settings.preferences'), settings_preferences_path - - if controller_name != 'registrations' - %li= link_to t('auth.change_password'), edit_user_registration_path - - if controller_name != 'two_factor_authentications' - %li= link_to t('settings.two_factor_authentication'), settings_two_factor_authentication_path - %li= link_to t('settings.back'), root_path diff --git a/app/views/settings/shared/_profile_navigation.html.haml b/app/views/settings/shared/_profile_navigation.html.haml new file mode 100644 index 0000000000..54425c27b3 --- /dev/null +++ b/app/views/settings/shared/_profile_navigation.html.haml @@ -0,0 +1,6 @@ +.content__heading__tabs + = render_navigation renderer: :links do |primary| + :ruby + primary.item :profile, safe_join([fa_icon('user fw'), t('settings.edit_profile')]), settings_profile_path + primary.item :verification, safe_join([fa_icon('check fw'), t('verification.verification')]), settings_verification_path + primary.item :featured_tags, safe_join([fa_icon('hashtag fw'), t('settings.featured_tags')]), settings_featured_tags_path diff --git a/app/views/settings/verifications/show.html.haml b/app/views/settings/verifications/show.html.haml new file mode 100644 index 0000000000..94283d2050 --- /dev/null +++ b/app/views/settings/verifications/show.html.haml @@ -0,0 +1,30 @@ +- content_for :page_title do + = t('verification.verification') + +- content_for :heading do + %h2= t('settings.profile') + = render partial: 'settings/shared/profile_navigation' + +.simple_form + %p.lead= t('verification.hint_html') + + %h4= t('verification.here_is_how') + + %p.lead= t('verification.instructions_html') + + .input-copy.lead + .input-copy__wrapper + %input{ type: :text, maxlength: '999', spellcheck: 'false', readonly: 'true', value: link_to('Mastodon', ActivityPub::TagManager.instance.url_for(@account), rel: 'me').to_str } + %button{ type: :button }= t('generic.copy') + + %p.lead= t('verification.extra_instructions_html') + + - if @verified_links.any? + %h4= t('verification.verified_links') + + %ul.lead + - @verified_links.each do |field| + %li + %span.verified-badge + = fa_icon 'check', class: 'verified-badge__mark' + %span= field.value diff --git a/config/locales/an.yml b/config/locales/an.yml index b9b71e48ae..c07eefdeb0 100644 --- a/config/locales/an.yml +++ b/config/locales/an.yml @@ -940,7 +940,6 @@ an: your_token: Lo tuyo token d'acceso auth: apply_for_account: Solicitar una cuenta - change_password: Clau delete_account: Borrar cuenta delete_account_html: Si deseya eliminar la suya cuenta, puede proceder aquí. Será pediu d'una confirmación. description: diff --git a/config/locales/ar.yml b/config/locales/ar.yml index 3ac539a6f0..b0aa3277f0 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -990,7 +990,6 @@ ar: your_token: رمز نفاذك auth: apply_for_account: اطلُب حسابًا - change_password: الكلمة السرية confirmations: wrong_email_hint: إذا كان عنوان البريد الإلكتروني هذا غير صحيح، يمكنك تغييره في إعدادات الحساب. delete_account: حذف الحساب diff --git a/config/locales/ast.yml b/config/locales/ast.yml index 1f0e739098..bb0d49994d 100644 --- a/config/locales/ast.yml +++ b/config/locales/ast.yml @@ -449,7 +449,6 @@ ast: warning: Ten munchu curiáu con estos datos, ¡enxamás nun los compartas con naide! your_token: El pase d'accesu auth: - change_password: Contraseña confirmations: wrong_email_hint: Si la direición de corréu electrónicu nun ye correuta, pues camudala na configuración de la cuenta. delete_account: Desaniciu de la cuenta diff --git a/config/locales/be.yml b/config/locales/be.yml index bafd7d6f88..5145281f26 100644 --- a/config/locales/be.yml +++ b/config/locales/be.yml @@ -1015,7 +1015,6 @@ be: your_token: Ваш токен доступу auth: apply_for_account: Пакінуць заяўку - change_password: Пароль confirmations: wrong_email_hint: Калі гэты адрас электроннай пошты памылковы, вы можаце змяніць яго ў наладах уліковага запісу. delete_account: Выдаліць уліковы запіс @@ -1768,7 +1767,6 @@ be: seamless_external_login: Вы ўвайшлі праз знешні сэрвіс, таму налады пароля і эл. пошты недаступныя. signed_in_as: 'Увайшлі як:' verification: - explanation_html: 'Вы можаце пацвердзіць сябе як уладальніка спасылак у метададзеных вашага профілю. Для гэтага спасылка на вэб-сайт павінна ўтрымліваць спасылку на ваш профіль Mastodon. Пасля дадавання спасылка, вам спатрэбіцца вярнуцца і перазахаваць свой профіль, каб усё адбыдося. Зваротная спасылка павінна мець атрыбут rel="me". Тэкставы змест спасылкі не мае значэння. Вось прыклад:' verification: Верыфікацыя webauthn_credentials: add: Дадаць новы ключ бяспекі diff --git a/config/locales/bg.yml b/config/locales/bg.yml index c8ddbcc077..e2fbc26dfc 100644 --- a/config/locales/bg.yml +++ b/config/locales/bg.yml @@ -979,7 +979,6 @@ bg: your_token: Вашият код за достъп auth: apply_for_account: Заявка за акаунт - change_password: Парола confirmations: wrong_email_hint: Ако този адрес на е-поща не е правилен, то може да го промените в настройки на акаунта. delete_account: Изтриване на акаунта @@ -1704,7 +1703,6 @@ bg: seamless_external_login: Влезли сте чрез външна услуга, така че настройките за парола и имейл не са налични. signed_in_as: 'Влезли като:' verification: - explanation_html: 'Може да потвърдите себе си като собственик на връзките в метаданните на профила си. За целта свързаният уебсайт трябва да съдържа обратна връзка към профилa ви в Mastodon. След добавянето на връзката, може да се наложи да се върнете тук и да запазите пак профила си, за да влезе в сила потвърждаването. Връзката обратно трябва да има атрибут rel="me". Текстовото съдържание на връзката няма значение. Ето пример:' verification: Проверка webauthn_credentials: add: Добавяне на нов ключ за сигурност diff --git a/config/locales/br.yml b/config/locales/br.yml index 3ab23a4a1e..9e0a9026f9 100644 --- a/config/locales/br.yml +++ b/config/locales/br.yml @@ -288,7 +288,6 @@ br: view: 'Sellet :' view_status: Gwelet ar c'hannad auth: - change_password: Ger-tremen delete_account: Dilemel ar gont login: Mont tre logout: Digennaskañ diff --git a/config/locales/ca.yml b/config/locales/ca.yml index e45fbfbb6c..f68bde6921 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -979,7 +979,6 @@ ca: your_token: El teu identificador d'accés auth: apply_for_account: Sol·licitar un compte - change_password: Contrasenya confirmations: wrong_email_hint: Si aquesta adreça de correu electrònic no és correcte, pots canviar-la en els ajustos del compte. delete_account: Elimina el compte @@ -1704,7 +1703,6 @@ ca: seamless_external_login: Has iniciat sessió via un servei extern per tant els ajustos de contrasenya i correu electrònic no estan disponibles. signed_in_as: 'Sessió iniciada com a:' verification: - explanation_html: 'Pots verificar-te com a propietari dels enllaços a les metadades del teu perfil. Per això, el lloc web enllaçat ha de contenir un enllaç al teu perfil de Mastodon. Després d''afegir l''enllaç, podries necessitar tornar aquí a desar el teu perfil per a fer efectiva la verificació. El vincle ha de tenir l''atribut rel="me". El contingut del text de l''enllaç no importa. Aquí tens un exemple:' verification: Verificació webauthn_credentials: add: Afegir nova clau de seguretat diff --git a/config/locales/ckb.yml b/config/locales/ckb.yml index 106ab5421a..f52ea312e0 100644 --- a/config/locales/ckb.yml +++ b/config/locales/ckb.yml @@ -587,7 +587,6 @@ ckb: warning: زۆر ئاگاداربە لەم داتایە. هەرگیز لەگەڵ کەس دا هاوبەشی مەکە! your_token: کۆدی دەستپێگەیشتنی ئێوە auth: - change_password: تێپەڕوشە delete_account: سڕینەوەی هەژمارە delete_account_html: گەر هەرەکتە هەژمارەکەت بسڕیتەوە، لە لەم قوناغانە بڕۆیتە پێشەوە. داوای پەسەند کردنتان لێدەگیرێت. description: diff --git a/config/locales/co.yml b/config/locales/co.yml index 1f6328faac..d4197debd4 100644 --- a/config/locales/co.yml +++ b/config/locales/co.yml @@ -553,7 +553,6 @@ co: warning: Abbadate à quessi dati. Ùn i date à nisunu! your_token: Rigenerà a fiscia d’accessu auth: - change_password: Chjave d’accessu delete_account: Sguassà u contu delete_account_html: S’è voi vulete toglie u vostru contu ghjè quì. Duverete cunfirmà a vostra scelta. description: diff --git a/config/locales/cs.yml b/config/locales/cs.yml index ff41188a1d..7d2c4f5cd0 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -1015,7 +1015,6 @@ cs: your_token: Váš přístupový token auth: apply_for_account: Požádat o účet - change_password: Heslo confirmations: wrong_email_hint: Pokud není e-mail správný, můžete si ho změnit v nastavení účtu. delete_account: Odstranit účet @@ -1768,7 +1767,6 @@ cs: seamless_external_login: Jste přihlášeni přes externí službu, nastavení hesla a e-mailu proto nejsou dostupná. signed_in_as: 'Přihlášeni jako:' verification: - explanation_html: 'Můžete se ověřit jako vlastník odkazů v metadatech profilu. Pro tento účel musí stránka v odkazu obsahovat odkaz zpět na váš profil na Mastodonu. Po přidání odkazu budete potřebovat vrátit se sem a znovu uložit profil, aby se ověření provedlo. Odkaz zpět musí mít atribut rel="me". Na textu odkazu nezáleží. Zde je příklad:' verification: Ověření webauthn_credentials: add: Přidat nový bezpečnostní klíč diff --git a/config/locales/cy.yml b/config/locales/cy.yml index 362b3ed002..d628b167ff 100644 --- a/config/locales/cy.yml +++ b/config/locales/cy.yml @@ -1051,7 +1051,6 @@ cy: your_token: Eich tocyn mynediad auth: apply_for_account: Gofyn am gyfrif - change_password: Cyfrinair confirmations: wrong_email_hint: Os nad yw'r cyfeiriad e-bost hwnnw'n gywir, gallwch ei newid yng ngosodiadau'r cyfrif. delete_account: Dileu cyfrif @@ -1832,7 +1831,6 @@ cy: seamless_external_login: Yr ydych wedi'ch mewngofnodi drwy wasanaeth allanol, felly nid yw gosodiadau cyfrinair ac e-bost ar gael. signed_in_as: 'Wedi mewngofnodi fel:' verification: - explanation_html: 'Gallwch wirio eich hun fel perchennog y dolenni ym metadata eich proffil . Ar gyfer gwneud hynny, rhaid i''r wefan gysylltiedig gynnwys dolen yn ôl i''ch proffil Mastodon. Ar ôl ychwanegu''r ddolen efallai y bydd angen i chi ddod yn ôl yma ac ail-gadw''ch proffil er mwyn i''r dilysiad ddod i rym. Rhaid i''r ddolen yn ôl gael priodoledd rêl="me". Nid yw cynnwys testun y ddolen o bwys. Dyma enghraifft:' verification: Dilysu webauthn_credentials: add: Ychwanegu allwedd ddiogelwch newydd diff --git a/config/locales/da.yml b/config/locales/da.yml index 10300274ee..d90f6efe84 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -979,7 +979,6 @@ da: your_token: Dit adgangstoken auth: apply_for_account: Anmod om en konto - change_password: Adgangskode confirmations: wrong_email_hint: Er denne e-mailadresse ikke korrekt, kan den ændres i kontoindstillinger. delete_account: Slet konto @@ -1704,7 +1703,6 @@ da: seamless_external_login: Du er logget ind via en ekstern tjeneste, så adgangskode- og e-mailindstillinger er utilgængelige. signed_in_as: 'Logget ind som:' verification: - explanation_html: 'Man kan bekræfte sig selv som ejer af linkene i profilmetadataene. For at gøre dette, skal det linkede websted indeholde et link tilbage til Mastodon-profilen. Efter tilføjelse af linket, skal man muligvis returnere hertil og gemme sin profil igen, før bekræftelsen effektueres. Returlinket skal have en rel="me"-attribut. Linkets tekstindhold er ligegyldigt. Her er et eksempel:' verification: Bekræftelse webauthn_credentials: add: Tilføj ny sikkerhedsnøgle diff --git a/config/locales/de.yml b/config/locales/de.yml index 5b8f7effe5..9cd804abc1 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -979,7 +979,6 @@ de: your_token: Dein Zugangs-Token auth: apply_for_account: Konto beantragen - change_password: Passwort confirmations: wrong_email_hint: Sollte diese E-Mail-Adresse nicht korrekt sein, kannst du sie in den Kontoeinstellungen ändern. delete_account: Konto löschen @@ -1704,7 +1703,6 @@ de: seamless_external_login: Du bist über einen externen Dienst angemeldet, daher sind Passwort- und E-Mail-Einstellungen nicht verfügbar. signed_in_as: 'Angemeldet als:' verification: - explanation_html: "Du kannst bestätigen, dass die Links in deinen Profil-Metadaten dir gehören. Dafür muss die verlinkte Website einen Link zurück auf dein Mastodon-Profil enthalten. \nNach dem Hinzufügen des Links musst du möglicherweise hierhin zurückkommen und dein Profil erneut speichern, um dass die Verifikation wirksam wird. Der Link zurück muss ein rel=\"me\"-Attribut enthalten. Der Linktext ist dabei egal. Hier ist ein Beispiel:" verification: Verifizierung webauthn_credentials: add: Sicherheitsschlüssel hinzufügen diff --git a/config/locales/el.yml b/config/locales/el.yml index 6842284df5..52e441ee24 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -979,7 +979,6 @@ el: your_token: Το διακριτικό πρόσβασής σου auth: apply_for_account: Ζήτα έναν λογαριασμό - change_password: Συνθηματικό confirmations: wrong_email_hint: Εάν αυτή η διεύθυνση email δεν είναι σωστή, μπορείς να την αλλάξεις στις ρυθμίσεις λογαριασμού. delete_account: Διαγραφή λογαριασμού @@ -1704,7 +1703,6 @@ el: seamless_external_login: Επειδή έχεις συνδεθεί μέσω τρίτης υπηρεσίας, οι ρυθμίσεις συνθηματικού και email δεν είναι διαθέσιμες. signed_in_as: 'Έχεις συνδεθεί ως:' verification: - explanation_html: 'Μπορείς να επαληθεύσεις τον εαυτό σου ως ιδιοκτήτη των συνδέσμων που εμφανίζεις στα μεταδεδομένα του προφίλ σου. Για να συμβεί αυτό, ο συνδεδεμένος ιστότοπος πρέπει να περιέχει ένα σύνδεσμο που να επιστρέφει προς το προφίλ σου στο Mastodon. Ο σύνδεσμος επιστροφής πρέπει να περιέχει την ιδιότητα rel="me". Το περιεχόμενο του κειμένου δεν έχει σημασία. Για παράδειγμα:' verification: Πιστοποίηση webauthn_credentials: add: Προσθήκη νέου κλειδιού ασφαλείας diff --git a/config/locales/en-GB.yml b/config/locales/en-GB.yml index 83e441d9f1..1ce73534c1 100644 --- a/config/locales/en-GB.yml +++ b/config/locales/en-GB.yml @@ -979,7 +979,6 @@ en-GB: your_token: Your access token auth: apply_for_account: Request an account - change_password: Password confirmations: wrong_email_hint: If that e-mail address is not correct, you can change it in account settings. delete_account: Delete account @@ -1704,7 +1703,6 @@ en-GB: seamless_external_login: You are logged in via an external service, so password and e-mail settings are not available. signed_in_as: 'Signed in as:' verification: - explanation_html: 'You can verify yourself as the owner of the links in your profile metadata. For that, the linked website must contain a link back to your Mastodon profile. After adding the link you may need to come back here and re-save your profile for the verification to take effect. The link back must have a rel="me" attribute. The text content of the link does not matter. Here is an example:' verification: Verification webauthn_credentials: add: Add new security key diff --git a/config/locales/en.yml b/config/locales/en.yml index f4944cca28..83ba4b0408 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -996,7 +996,6 @@ en: help_html: If you have issues solving the CAPTCHA, you can get in touch with us through %{email} and we can assist you. hint_html: Just one more thing! We need to confirm you're a human (this is so we can keep the spam out!). Solve the CAPTCHA below and click "Continue". title: Security check - change_password: Password confirmations: wrong_email_hint: If that e-mail address is not correct, you can change it in account settings. delete_account: Delete account @@ -1150,6 +1149,11 @@ en: your_appeal_rejected: Your appeal has been rejected domain_validator: invalid_domain: is not a valid domain name + edit_profile: + basic_information: Basic information + hint_html: "Customize what people see on your public profile and next to your posts. Other people are more likely to follow you back and interact with you when you have a filled out profile and a profile picture." + other: Other + safety_and_privacy: Safety and privacy errors: '400': The request you submitted was invalid or malformed. '403': You don't have permission to view this page. @@ -1187,7 +1191,7 @@ en: add_new: Add new errors: limit: You have already featured the maximum number of hashtags - hint_html: "What are featured hashtags? They are displayed prominently on your public profile and allow people to browse your public posts specifically under those hashtags. They are a great tool for keeping track of creative works or long-term projects." + hint_html: "Feature your most important hashtags on your profile. A great tool for keeping track of your creative works and long-term projects, featured hashtags are displayed prominently on your profile and allow quick access to your own posts." filters: contexts: account: Profiles @@ -1585,7 +1589,7 @@ en: migrate: Account migration notifications: Notifications preferences: Preferences - profile: Profile + profile: Public profile relationships: Follows and followers statuses_cleanup: Automated post deletion strikes: Moderation strikes @@ -1779,8 +1783,12 @@ en: seamless_external_login: You are logged in via an external service, so password and e-mail settings are not available. signed_in_as: 'Signed in as:' verification: - explanation_html: 'You can verify yourself as the owner of the links in your profile metadata. For that, the linked website must contain a link back to your Mastodon profile. After adding the link you may need to come back here and re-save your profile for the verification to take effect. The link back must have a rel="me" attribute. The text content of the link does not matter. Here is an example:' + extra_instructions_html: Tip: The link on your website can be invisible. The important part is rel="me" which prevents impersonation on websites with user-generated content. You can even use a link tag in the header of the page instead of a, but the HTML must be accessible without executing JavaScript. + here_is_how: Here's how + hint_html: "Verifying your identity on Mastodon is for everyone. Based on open web standards, now and forever free. All you need is a personal website that people recognize you by. When you link to this website from your profile, we will check that the website links back to your profile and show a visual indicator on it." + instructions_html: Copy and paste the code below into the HTML of your website. Then add the address of your website into one of the extra fields on your profile from the "Edit profile" tab and save changes. verification: Verification + verified_links: Your verified links webauthn_credentials: add: Add new security key create: diff --git a/config/locales/eo.yml b/config/locales/eo.yml index 076d81759e..57b24b0c05 100644 --- a/config/locales/eo.yml +++ b/config/locales/eo.yml @@ -971,7 +971,6 @@ eo: your_token: Via alira ĵetono auth: apply_for_account: Peti konton - change_password: Pasvorto confirmations: wrong_email_hint: Se tiu retpoŝtadreso ne estas ĝusta, vi povas ŝanĝi ĝin en la agordoj pri la konto. delete_account: Forigi konton @@ -1683,7 +1682,6 @@ eo: seamless_external_login: Vi estas ensalutinta per ekstera servo, do pasvortaj kaj retadresaj agordoj ne estas disponeblaj. signed_in_as: 'Salutinta kiel:' verification: - explanation_html: 'Vi povas pruvi, ke vi estas la posedanto de la ligiloj en viaj profilaj metadatumoj. Por fari tion, la alligita retejo devas enhavi ligilon reen al via Mastodon-profilo. La religilo devas havi la atributon rel="me". Ne gravas la teksta enhavo de la religilo. Jen ekzemplo:' verification: Kontrolo webauthn_credentials: add: Aldoni novan sekurecan ŝlosilon diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml index 66220791a4..0a9b80fbc4 100644 --- a/config/locales/es-AR.yml +++ b/config/locales/es-AR.yml @@ -979,7 +979,6 @@ es-AR: your_token: Tu clave de acceso auth: apply_for_account: Solicitar una cuenta - change_password: Contraseña confirmations: wrong_email_hint: Si esa dirección de correo electrónico no es correcta, podés cambiarla en la configuración de la cuenta. delete_account: Eliminar cuenta @@ -1704,7 +1703,6 @@ es-AR: seamless_external_login: Iniciaste sesión desde un servicio externo, así que la configuración de contraseña y correo electrónico no están disponibles. signed_in_as: 'Iniciaste sesión como:' verification: - explanation_html: 'Podés verificarte a vos mismo como el propietario de los enlaces en los metadatos de tu perfil. Para eso, el sitio web del enlace debe contener un enlace de vuelta a tu perfil de Mastodon. Después de agregar el enlace, puede que tengás que volver acá y volver a guardar los cambios en tu perfil para que la verificación surta efecto. El enlace en tu sitio debe tener un atributo rel="me". El contenido del texto del enlace no importa. Acá tenés un ejemplo:' verification: Verificación webauthn_credentials: add: Agregar nueva llave de seguridad diff --git a/config/locales/es-MX.yml b/config/locales/es-MX.yml index dbacd73435..87eaa8c7f2 100644 --- a/config/locales/es-MX.yml +++ b/config/locales/es-MX.yml @@ -979,7 +979,6 @@ es-MX: your_token: Tu token de acceso auth: apply_for_account: Solicitar una cuenta - change_password: Contraseña confirmations: wrong_email_hint: Si esa dirección de correo electrónico no es correcta, puedes cambiarla en la configuración de la cuenta. delete_account: Borrar cuenta @@ -1704,7 +1703,6 @@ es-MX: seamless_external_login: Has iniciado sesión desde un servicio externo, así que los ajustes de contraseña y correo no están disponibles. signed_in_as: 'Sesión iniciada como:' verification: - explanation_html: 'Puedes verificarte a ti mismo como el dueño de los links en los metadatos de tu perfil. Para eso, el sitio enlazado debe contener un enlace a tu perfil de Mastodon. Después de añadir el enlace, necesitarás regresar aquí y volver a guardar tu perfil para que la verificación tenga efecto. El enlace en tu sitio debe tener un atributo rel="me". El texto del contenido del enlace no importa. Aquí un ejemplo:' verification: Verificación webauthn_credentials: add: Agregar nueva clave de seguridad diff --git a/config/locales/es.yml b/config/locales/es.yml index a0e6bea844..767fdb9ab3 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -979,7 +979,6 @@ es: your_token: Tu token de acceso auth: apply_for_account: Solicitar una cuenta - change_password: Contraseña confirmations: wrong_email_hint: Si esa dirección de correo electrónico no es correcta, puedes cambiarla en la configuración de la cuenta. delete_account: Borrar cuenta @@ -1704,7 +1703,6 @@ es: seamless_external_login: Has iniciado sesión desde un servicio externo, así que los ajustes de contraseña y correo no están disponibles. signed_in_as: 'Sesión iniciada como:' verification: - explanation_html: 'Puedes verificarte a ti mismo como propietario de los enlaces en los metadatos de tu perfil. Para ello, el sitio web vinculado debe contener un enlace a tu perfil de Mastodon. Después de añadir el enlace, es posible que debas volver aquí y volver a guardar tu perfil para que la verificación surta efecto. El enlace de tu sitio debe tener un atributo rel="me". El contenido textual del enlace no tiene relevancia. Aquí un ejemplo:' verification: Verificación webauthn_credentials: add: Agregar nueva clave de seguridad diff --git a/config/locales/et.yml b/config/locales/et.yml index 2c911f6453..f2a5d28b5f 100644 --- a/config/locales/et.yml +++ b/config/locales/et.yml @@ -979,7 +979,6 @@ et: your_token: Su juurdepääsutunnus auth: apply_for_account: Konto taotluse esitamine - change_password: Salasõna confirmations: wrong_email_hint: Kui see e-postiaadress pole korrektne, saad seda kontosätetes muuta. delete_account: Konto kustutamine @@ -1709,7 +1708,6 @@ et: seamless_external_login: Välise teenuse kaudu sisse logides pole salasõna ja e-posti sätted saadaval. signed_in_as: 'Sisse logitud kasutajana:' verification: - explanation_html: 'Saad kinnitada ennast oma profiili metaandmete veebiviidete omanikuna. Selleks peab lingitud veebilehel olema viide tagasi sinu Mastodoni profiilile. Pärast lingi lisamist pead võib-olla siia tagasi tulema ja oma profiili uuesti salvestama, et kinnitus jõustuks. Tagasiviide peab sisaldama rel="me" atribuuti. Lingi tekstiline sisu ei ole oluline. Siin on näide:' verification: Kinnitamine webauthn_credentials: add: Uue turvavõtme lisamine diff --git a/config/locales/eu.yml b/config/locales/eu.yml index 6a237365b0..c1b4e2654c 100644 --- a/config/locales/eu.yml +++ b/config/locales/eu.yml @@ -981,7 +981,6 @@ eu: your_token: Zure sarbide token-a auth: apply_for_account: Kontu bat eskatu - change_password: Pasahitza confirmations: wrong_email_hint: Helbide-elektroniko hori zuzena ez bada, kontuaren ezarpenetan alda dezakezu. delete_account: Ezabatu kontua @@ -1706,7 +1705,6 @@ eu: seamless_external_login: Kanpo zerbitzu baten bidez hasi duzu saioa, beraz pasahitza eta e-mail ezarpenak ez daude eskuragarri. signed_in_as: 'Saioa honela hasita:' verification: - explanation_html: 'Zure profileko metadatuetako esteken jabe zarela egiazta dezakezu. Horretarako, webguneak zure Mastodoneko profilaren esteka eduki behar du. Esteka webgunean erantsi ondoren, aldaketak berriro gorde beharko dituzu egiaztapena burutu ahal izateko. Estekak rel="me" atributua eduki behar du. Estekaren testu-edukia ez da aintzat hartzen. Hemen duzu adibide bat:' verification: Egiaztaketa webauthn_credentials: add: Gehitu segurtasun gako berria diff --git a/config/locales/fa.yml b/config/locales/fa.yml index 3dd6d6d775..47e362b4ac 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -819,7 +819,6 @@ fa: your_token: کد دسترسی شما auth: apply_for_account: درخواست یک حساب - change_password: گذرواژه delete_account: پاک‌کردن حساب delete_account_html: اگر می‌خواهید حساب خود را پاک کنید، از این‌جا پیش بروید. از شما درخواست تأیید خواهد شد. description: @@ -1474,7 +1473,6 @@ fa: seamless_external_login: شما با یک سرویس خارج از مجموعه وارد شده‌اید، به همین دلیل تنظیمات ایمیل و گذرواژه برای شما در دسترس نیست. signed_in_as: 'واردشده به نام:' verification: - explanation_html: 'می‌توانید خودتان را به عنوان مالک پیوندهای درون فراداده‌های نمایه‌تان تأیید کنید. برای این کار پایگاه وب پیوند شده باید پیوند بازگشتی به حساب ماستودونتان داشته باشد. شاید لازم باشد پس از افزودن پیوند برای اعمال تآیید به این‌جا بازگشته و نمایه‌تان را دوباره ذخیره کنید. پیوند بازگشتی باید مقدار rel="me" را داشته باشد. محتوای متنی پیوند مهم نیست. یک نمونه در این‌جا آورده شده:' verification: تأیید webauthn_credentials: add: افزودن کلید امنیتی diff --git a/config/locales/fi.yml b/config/locales/fi.yml index a42e669ec4..f72bfe6f68 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -979,7 +979,6 @@ fi: your_token: Pääsytunnus auth: apply_for_account: Pyydä tiliä - change_password: Salasana confirmations: wrong_email_hint: Jos sähköpostiosoite ei ole oikein, voit muuttaa sen tilin asetuksista. delete_account: Poista tili @@ -1704,7 +1703,6 @@ fi: seamless_external_login: Olet kirjautunut ulkoisen palvelun kautta, joten salasana- ja sähköpostiasetukset eivät ole käytettävissä. signed_in_as: 'Kirjautunut tilillä:' verification: - explanation_html: 'Voit vahvistaa olevasi profiilisi metatietojen sisältämien linkkien omistaja. Tätä varten linkitetyn verkkosivuston täytyy sisältää paluulinkki Mastodon-profiiliisi. Paluulinkillä täytyy olla määre rel="me". Linkin tekstisisällöllä ei ole merkitystä. Tässä esimerkki:' verification: Vahvistus webauthn_credentials: add: Lisää uusi suojausavain diff --git a/config/locales/fo.yml b/config/locales/fo.yml index c81a3b4505..0eebec7832 100644 --- a/config/locales/fo.yml +++ b/config/locales/fo.yml @@ -979,7 +979,6 @@ fo: your_token: Títt atgongdstekn auth: apply_for_account: Bið um eina kontu - change_password: Loyniorð confirmations: wrong_email_hint: Um hesin teldupoststaðurin ikki er rættur, so kanst tú broyta hann í kontustillingunum. delete_account: Strika kontu @@ -1704,7 +1703,6 @@ fo: seamless_external_login: Tú er ritað/ur inn umvegis eina uttanhýsis tænastu, so loyniorð og teldupoststillingar eru ikki tøkar. signed_in_as: 'Ritað/ur inn sum:' verification: - explanation_html: 'Tú kanst vátta teg sjálva/n sum eigara av leinkjunum í metadátunum á vanganum hjá tær. Til tess má leinkjaða vevstaðið innihalda eitt leinki aftur til Mastodon vangan hjá tær. Eftir at tú hevur lagt leinkið afturat, so er møguliga neyðugt at koma aftur her og goyma vangan hjá tær av nýggjum fyri at fáa góðkenningina at rigga. Leinkið hava eina rel="me" viðseting. Tekstinnihaldið í leikinum er óviðkomandi. Her er eitt dømi:' verification: Váttan webauthn_credentials: add: Legg nýggjan trygdarlykil afturat diff --git a/config/locales/fr-QC.yml b/config/locales/fr-QC.yml index 90c3a56684..c095604772 100644 --- a/config/locales/fr-QC.yml +++ b/config/locales/fr-QC.yml @@ -977,7 +977,6 @@ fr-QC: your_token: Votre jeton d’accès auth: apply_for_account: Demander un compte - change_password: Mot de passe confirmations: wrong_email_hint: Si cette adresse de courriel est incorrecte, vous pouvez la modifier dans vos paramètres de compte. delete_account: Supprimer le compte @@ -1688,7 +1687,6 @@ fr-QC: seamless_external_login: Vous êtes connecté via un service externe, donc les paramètres concernant le mot de passe et le courriel ne sont pas disponibles. signed_in_as: 'Connecté·e en tant que :' verification: - explanation_html: 'Vous pouvez vous vérifier en tant que propriétaire des liens dans les métadonnées de votre profil. Pour cela, le site web lié doit contenir un lien vers votre profil Mastodon. Le lien de retour doit avoir un attribut rel="me" . Le texte du lien n’a pas d’importance. Voici un exemple :' verification: Vérification webauthn_credentials: add: Ajouter une nouvelle clé de sécurité diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 5efc1e585b..5d805f875b 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -977,7 +977,6 @@ fr: your_token: Votre jeton d’accès auth: apply_for_account: Demander un compte - change_password: Mot de passe confirmations: wrong_email_hint: Si cette adresse de courriel est incorrecte, vous pouvez la modifier dans vos paramètres de compte. delete_account: Supprimer le compte @@ -1688,7 +1687,6 @@ fr: seamless_external_login: Vous êtes connecté via un service externe, donc les paramètres concernant le mot de passe et le courriel ne sont pas disponibles. signed_in_as: 'Connecté·e en tant que :' verification: - explanation_html: 'Vous pouvez vous vérifier en tant que propriétaire des liens dans les métadonnées de votre profil. Pour cela, le site web lié doit contenir un lien vers votre profil Mastodon. Le lien de retour doit avoir un attribut rel="me" . Le texte du lien n’a pas d’importance. Voici un exemple :' verification: Vérification webauthn_credentials: add: Ajouter une nouvelle clé de sécurité diff --git a/config/locales/fy.yml b/config/locales/fy.yml index 53c7bf050a..139b23ae07 100644 --- a/config/locales/fy.yml +++ b/config/locales/fy.yml @@ -979,7 +979,6 @@ fy: your_token: Jo tagongskoade auth: apply_for_account: Account oanfreegje - change_password: Wachtwurd confirmations: wrong_email_hint: As it e-mailadres net korrekt is, kinne jo dat wizigje yn de accountynstellingen. delete_account: Account fuortsmite @@ -1704,7 +1703,6 @@ fy: seamless_external_login: Jo binne oanmeld fia in eksterne tsjinst, dêrom binne wachtwurden en e-mailynstellingen net beskikber. signed_in_as: 'Oanmeld as:' verification: - explanation_html: 'Jo kinne josels ferifiearje as de eigener fan de keppelingen yn de metadata fan jo profyl. Hjirfoar moat op de keppele website in keppeling werom nei jo Mastodon-profyl stean. Nei it tafoegjen fan de keppeling moatte jo miskien hjir werom komme en jo profyl opnij bewarje om de ferifikaasje te befêstigjen. Dizze keppeling moat it rel="me"-attribút befetsje. De omskriuwing fan de keppeling makket net út. Hjir is in foarbyld:' verification: Ferifikaasje webauthn_credentials: add: Nije befeiligingskaai tafoegje diff --git a/config/locales/ga.yml b/config/locales/ga.yml index 65da86372b..3673f06b5a 100644 --- a/config/locales/ga.yml +++ b/config/locales/ga.yml @@ -322,7 +322,6 @@ ga: delete_statuses: a gcuid postálacha a scrios none: rabhadh auth: - change_password: Pasfhocal delete_account: Scrios cuntas login: Logáil isteach logout: Logáil Amach diff --git a/config/locales/gd.yml b/config/locales/gd.yml index f2f745cea0..85ee47a3c8 100644 --- a/config/locales/gd.yml +++ b/config/locales/gd.yml @@ -1013,7 +1013,6 @@ gd: your_token: An tòcan inntrigidh agad auth: apply_for_account: Iarr cunntas - change_password: Facal-faire confirmations: wrong_email_hint: Mur eil an seòladh puist-d seo mar bu chòir, ’s urrainn dhut atharrachadh ann an roghainnean a’ chunntais. delete_account: Sguab às an cunntas @@ -1752,7 +1751,6 @@ gd: seamless_external_login: Rinn thu clàradh a-steach le seirbheis on taobh a-muigh, mar sin chan eil roghainnean an fhacail-fhaire ’s a’ phuist-d ri làimh dhut. signed_in_as: 'Chlàraich thu a-steach mar:' verification: - explanation_html: '’S urrainn dhut dearbhadh gur e seilbheadair nan ceanglaichean ann am meata-dàta na pròifil agad a th’ annad. Airson sin a dhèanamh, feumaidh ceangal air ais dhan phròifil Mastodon a bhith aig an làrach-lìn cheangailte. Nuair a bhios tu air a’ cheangal a chur ris, dh’fhaoidte gum bi agad ri tilleadh an-seo agus a’ phròifil agad a shàbhaladh a-rithist mus obraich an dearbhadh. Feumaidh buadh rel="me" a bhith aig a’ cheangal air ais. Chan eil e gu diofar dè an t-susbaint a tha ann an teacsa a’ cheangail. Seo ball-eisimpleir dhut:' verification: Dearbhadh webauthn_credentials: add: Cuir iuchair tèarainteachd ùr ris diff --git a/config/locales/gl.yml b/config/locales/gl.yml index 8ab93aee1f..30a08e9435 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -979,7 +979,6 @@ gl: your_token: O seu testemuño de acceso auth: apply_for_account: Solicita unha conta - change_password: Contrasinal confirmations: wrong_email_hint: Se o enderezo de email non é correcto, podes cambialo nos axustes da conta. delete_account: Eliminar conta @@ -1704,7 +1703,6 @@ gl: seamless_external_login: Accedeches a través dun servizo externo, polo que os axustes de contrasinal e email non están dispoñibles. signed_in_as: 'Rexistrada como:' verification: - explanation_html: 'Podes validarte a ti mesma como a dona das ligazóns nos metadatos do perfil. Para isto, o sitio web ligado debe conter unha ligazón de retorno ao perfil de Mastodon. Despois de engadir a ligazón tes que volver aquí e volver a gardar o teu perfil para que a verificación tome efecto. A ligazón de retorno ten que ter un atributo rel="me". O texto da ligazón non ten importancia. Aquí tes un exemplo:' verification: Validación webauthn_credentials: add: Engadir nova chave de seguridade diff --git a/config/locales/he.yml b/config/locales/he.yml index 59064fb325..cdcc9cd690 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -1015,7 +1015,6 @@ he: your_token: אסימון הגישה שלך auth: apply_for_account: הגשת בקשה לחשבון - change_password: סיסמה confirmations: wrong_email_hint: אם כתובת הדואל הזו איננה נכונה, ניתן לשנות אותה בעמוד ההגדרות. delete_account: מחיקת חשבון @@ -1768,7 +1767,6 @@ he: seamless_external_login: את.ה מחובר דרך שירות חיצוני, לכן אפשרויות הסיסמא והדוא"ל לא מאופשרות. signed_in_as: 'מחובר בתור:' verification: - explanation_html: 'תוכל/י לאמת את עצמך כבעל/ת הקישורים שבפרופיל שלך. לשם כך, על האתר המקושר להכיל קישור חוזר לפרופיל המסטודון שלך. אחרי הוספת הקישור ניתן לשוב לפה ולשמור מחדש את הפרופיל כדי להפעיל את אימות הקישור. הקישור החוזר חייב להכיל בקוד ה-HTML שלו את התכונה rel="me". התוכן הטקסטואלי של הקישור לא משנה. הנה דוגמא:' verification: אימות webauthn_credentials: add: הוספת מפתח אבטחה חדש diff --git a/config/locales/hi.yml b/config/locales/hi.yml index 8870fb8f92..ac0648eb82 100644 --- a/config/locales/hi.yml +++ b/config/locales/hi.yml @@ -16,5 +16,3 @@ hi: platforms: kai_os: काइ ओएस unknown_platform: अनजान प्लेटफॉर्म - verification: - explanation_html: 'आप अपने प्रोफाइल में इस्तेमाल किए गए लिंक वेरिफाई कर सकते हैं। इसके लिए आपके वेबसाइट पर आपके मॅस्टोडॉन प्रोफाइल का लिंक होना चाहिए। वेरिफिकेशन पूरा करने के लिए लिंक जोड़ने के बाद यहाँ वापस आकर अपना प्रोफाइल पुनः सेव करें। लिंक बैक में rel="me" अट्रीब्यूट ज़रूर होना चाहिए। लिंक पर लिखे टेक्स्ट से कोई मतलब नहीं। ये रहा उदाहरण:' diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 0c29890f7a..da4d10cb4a 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -979,7 +979,6 @@ hu: your_token: Hozzáférési kulcsod auth: apply_for_account: Fiók kérése - change_password: Jelszó confirmations: wrong_email_hint: Ha az emailcím nem helyes, a fiókbeállításokban megváltoztathatod. delete_account: Felhasználói fiók törlése @@ -1704,7 +1703,6 @@ hu: seamless_external_login: Külső szolgáltatáson keresztül jelentkeztél be, így a jelszó és e-mail beállítások nem elérhetőek. signed_in_as: Bejelentkezve mint verification: - explanation_html: 'A profilodon hitelesítheted magad, mint az itt található hivatkozások tulajdonosa. Ehhez a hivatkozott weboldalnak tartalmaznia kell egy visszahivatkozást a Mastodon-profilodra. A hivatkozás hozzáadása után lehet, hogy vissza kell ide térned, és újra mentened kell a profilodat, hogy az ellenőrzés életbe lépjen. A visszahivatkozásnak tartalmaznia kell a rel="me" attribútumot. A hivatkozás szövege bármi lehet. Itt egy példa:' verification: Hitelesítés webauthn_credentials: add: Biztonsági kulcs hozzáadása diff --git a/config/locales/hy.yml b/config/locales/hy.yml index 658b982f08..9aa7b32f78 100644 --- a/config/locales/hy.yml +++ b/config/locales/hy.yml @@ -462,7 +462,6 @@ hy: regenerate_token: Ստեղծել նոր հասանելիութեան կտրոն your_token: Քո մուտքի բանալին auth: - change_password: Գաղտնաբառ delete_account: Ջնջել հաշիվը description: prefix_sign_up: Գրանցուի՛ր Մաստոդոնում հենց այսօր diff --git a/config/locales/id.yml b/config/locales/id.yml index 3b794ec948..437d150c3e 100644 --- a/config/locales/id.yml +++ b/config/locales/id.yml @@ -918,7 +918,6 @@ id: your_token: Token akses Anda auth: apply_for_account: Permintaan akun - change_password: Kata sandi delete_account: Hapus akun delete_account_html: Jika Anda ingin menghapus akun Anda, Anda dapat memproses ini. Anda akan dikonfirmasi. description: diff --git a/config/locales/io.yml b/config/locales/io.yml index 663787f6d0..11cb5e1590 100644 --- a/config/locales/io.yml +++ b/config/locales/io.yml @@ -896,7 +896,6 @@ io: warning: Sorgemez per ca informi. Ne partigez kun irgu! your_token: Vua acesficho auth: - change_password: Pasvorto delete_account: Efacez konto delete_account_html: Se vu volas efacar vua konto, vu povas irar hike. Vu demandesos konfirmar. description: diff --git a/config/locales/is.yml b/config/locales/is.yml index 2d23e0cc80..0af090d7d7 100644 --- a/config/locales/is.yml +++ b/config/locales/is.yml @@ -979,7 +979,6 @@ is: your_token: Aðgangsteiknið þitt auth: apply_for_account: Biðja um notandaaðgang - change_password: Lykilorð confirmations: wrong_email_hint: Ef það tölvupóstfang er ekki rétt geturðu breytt því í stillingum notandaaðgangsins. delete_account: Eyða notandaaðgangi @@ -1704,7 +1703,6 @@ is: seamless_external_login: Innskráning þín er í gegnum utanaðkomandi þjónustu, þannig að stillingar fyrir lykilorð og tölvupóst eru ekki aðgengilegar. signed_in_as: 'Skráð inn sem:' verification: - explanation_html: 'Þú getur sannvottað sjálfa/n þig sem eiganda tenglanna í notandasniðinu þinu. Til að það virki, þarf tilvísaða vefsvæðið að innihalda tengil til baka á notandasnið þitt á Mastodon. Eftir að tenglinum hefur verið bætt inn, gætirðu þurft að koma aftur hingað og vista aftur notandasniðið þitt áður en sannvottunin fer að virka. Tengillinn til baka verður að innihalda rel="me" eigindi. Efni textans í tenglinum skiptir ekki máli. Hér er dæmi:' verification: Sannprófun webauthn_credentials: add: Bæta við nýjum öryggislykli diff --git a/config/locales/it.yml b/config/locales/it.yml index dce4cfac07..11428251ed 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -981,7 +981,6 @@ it: your_token: Il tuo token di accesso auth: apply_for_account: Richiedi un account - change_password: Password confirmations: wrong_email_hint: Se l'indirizzo e-mail non è corretto, puoi modificarlo nelle impostazioni dell'account. delete_account: Elimina account @@ -1706,7 +1705,6 @@ it: seamless_external_login: Hai effettuato l'accesso tramite un servizio esterno, quindi le impostazioni di password e e-mail non sono disponibili. signed_in_as: 'Hai effettuato l''accesso come:' verification: - explanation_html: 'Puoi verificarti come proprietario dei link nei metadati del tuo profilo. Per questo, il sito web collegato deve contenere un collegamento al tuo profilo Mastodon. Dopo aver aggiunto il collegamento, potrebbe essere necessario tornare qui e salvare nuovamente il profilo affinché la verifica abbia effetto. Il link di ritorno deve avere un attributo rel="me". Il contenuto del testo del collegamento non ha importanza. Ecco un esempio:' verification: Verifica webauthn_credentials: add: Aggiungi una nuova chiave di sicurezza diff --git a/config/locales/ja.yml b/config/locales/ja.yml index dddce85671..34796a15a0 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -961,7 +961,6 @@ ja: your_token: アクセストークン auth: apply_for_account: アカウントのリクエスト - change_password: パスワード confirmations: wrong_email_hint: メールアドレスが正しくない場合は、アカウント設定で変更できます。 delete_account: アカウントの削除 @@ -1674,7 +1673,6 @@ ja: seamless_external_login: あなたは外部サービスを介してログインしているため、パスワードとメールアドレスの設定は利用できません。 signed_in_as: '下記でログイン中:' verification: - explanation_html: プロフィール補足情報のリンクの所有者であることを認証できます。認証するには、リンク先のウェブサイトにMastodonプロフィールへのリンクを追加してください。リンクを追加後、このページで変更の保存を再実行すると認証が反映されます。プロフィールへのリンクにはrel="me"属性をかならず付与してください。リンク内のテキストは自由に記述できます。以下は一例です: verification: 認証 webauthn_credentials: add: セキュリティキーを追加 diff --git a/config/locales/ka.yml b/config/locales/ka.yml index a232623667..7136ca4ac1 100644 --- a/config/locales/ka.yml +++ b/config/locales/ka.yml @@ -216,7 +216,6 @@ ka: warning: იყავით ძალიან ფრთხილად ამ მონაცემთან. არასდროს გააზიაროთ ეს! your_token: თქვენი წვდომის ტოკენი auth: - change_password: პაროლი delete_account: ანგარიშის გაუქმება delete_account_html: თუ გსურთ გააუქმოთ თქვენი ანგარიში, შეგიძლიათ გააგრძელოთ აქ. საჭირო იქნება დამოწმება. forgot_password: დაგავიწყდათ პაროლი? diff --git a/config/locales/kab.yml b/config/locales/kab.yml index fc6687db14..06d5ab3f43 100644 --- a/config/locales/kab.yml +++ b/config/locales/kab.yml @@ -441,7 +441,6 @@ kab: token_regenerated: Ajuṭu n unekcum yettusirew i tikkelt-nniḍen akken iwata your_token: Ajiṭun-ik·im n unekcum auth: - change_password: Awal uffir delete_account: Kkes amiḍan description: prefix_invited_by_user: "@%{name} inced-ik·ikem ad ternuḍ ɣer uqeddac-a n Mastodon!" diff --git a/config/locales/kk.yml b/config/locales/kk.yml index a67e4dd7ed..fdd284d607 100644 --- a/config/locales/kk.yml +++ b/config/locales/kk.yml @@ -335,7 +335,6 @@ kk: warning: Be very carеful with this data. Never share it with anyone! your_token: Your access tokеn auth: - change_password: Құпиясөз delete_account: Аккаунт өшіру delete_account_html: Аккаунтыңызды жойғыңыз келсе, мына жерді басыңыз. Сізден растау сұралатын болады. description: diff --git a/config/locales/ko.yml b/config/locales/ko.yml index 196f9617a3..5c9f5238e4 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -963,7 +963,6 @@ ko: your_token: 액세스 토큰 auth: apply_for_account: 가입 요청하기 - change_password: 암호 confirmations: wrong_email_hint: 만약 이메일 주소가 올바르지 않다면, 계정 설정에서 수정할 수 있습니다. delete_account: 계정 삭제 @@ -1674,7 +1673,6 @@ ko: seamless_external_login: 외부 서비스를 이용해 로그인했으므로 이메일과 암호는 설정할 수 없습니다. signed_in_as: '다음과 같이 로그인 중:' verification: - explanation_html: '내 프로필 메타데이터에 담긴 링크의 소유 여부를 검증할 수 있습니다. 이를 위해서 반드시 링크한 웹사이트에 Mastodon 프로필에 대한 역링크가 포함되어야 합니다. 링크를 추가한 후 이곳으로 돌아와서 프로필을 다시 저장해야 인증을 적용할 수 있습니다. 돌아오는 링크에는 반드시 rel="me" 속성이 있어야 합니다. 링크의 텍스트 콘텐트는 중요하지 않습니다. 다음 예제를 참고하세요:' verification: 검증 webauthn_credentials: add: 보안 키 추가 diff --git a/config/locales/ku.yml b/config/locales/ku.yml index 753618e96e..cb80611d79 100644 --- a/config/locales/ku.yml +++ b/config/locales/ku.yml @@ -937,7 +937,6 @@ ku: your_token: Nîşana gihîştinê te auth: apply_for_account: Ajimêrekê bixwaze - change_password: Borînpeyv delete_account: Ajimêr jê bibe delete_account_html: Ku tu dixwazî ajimêra xwe jê bibe, tu dikarî li vir bidomîne. Ji te tê xwestin ku were pejirandin. description: diff --git a/config/locales/lt.yml b/config/locales/lt.yml index ab31b3989e..aa0e99c9e7 100644 --- a/config/locales/lt.yml +++ b/config/locales/lt.yml @@ -254,7 +254,6 @@ lt: warning: Būkite atsargūs su šia informacija. Niekada jos nesidalinkite! your_token: Jūsų prieigos žetonas auth: - change_password: Slaptažodis delete_account: Ištrinti paskyrą delete_account_html: Jeigu norite ištrinti savo paskyrą, galite eiti čia. Jūsų prašys patvirtinti pasirinkimą. forgot_password: Pamiršote slaptažodį? diff --git a/config/locales/lv.yml b/config/locales/lv.yml index 556572ca20..67eff736e4 100644 --- a/config/locales/lv.yml +++ b/config/locales/lv.yml @@ -997,7 +997,6 @@ lv: your_token: Tavs piekļuves marķieris auth: apply_for_account: Pieprasīt kontu - change_password: Parole confirmations: wrong_email_hint: Ja šī e-pasta adrese nav pareiza, varat to mainīt konta iestatījumos. delete_account: Dzēst kontu @@ -1736,7 +1735,6 @@ lv: seamless_external_login: Tu esi pieteicies, izmantojot ārēju pakalpojumu, tāpēc paroles un e-pasta iestatījumi nav pieejami. signed_in_as: 'Pierakstījies kā:' verification: - explanation_html: 'Tu vari apstiprināt sevi kā sava profila metadatos esošo saišu īpašnieku. Lai to izdarītu, saistītajā vietnē ir jābūt saitei uz tavu Mastodon profilu. Pēc saites pievienošanas tev, iespējams, vajadzēs atgriezties šeit un atkārtoti saglabāt savu profilu, lai pārbaude stātos spēkā. Atpakaļsaitē jābūt atribūtam rel="me". Saites teksta saturam nav nozīmes. Šeit ir piemērs:' verification: Pārbaude webauthn_credentials: add: Pievienot jaunu drošības atslēgu diff --git a/config/locales/ms.yml b/config/locales/ms.yml index 4c4b1a51bb..81b2ef3185 100644 --- a/config/locales/ms.yml +++ b/config/locales/ms.yml @@ -752,7 +752,6 @@ ms: view_profile: Lihat profil view_status: Lihat hantaran auth: - change_password: Kata laluan delete_account: Padam akaun description: prefix_sign_up: Daftar pada Mastodon hari ini! diff --git a/config/locales/my.yml b/config/locales/my.yml index 3a78b6b9b7..d157af22fc 100644 --- a/config/locales/my.yml +++ b/config/locales/my.yml @@ -965,7 +965,6 @@ my: your_token: သင့် အသုံးပြုခွင့်တိုကင် auth: apply_for_account: အကောင့်တစ်ခုတောင်းဆိုပါ - change_password: စကားဝှက် confirmations: wrong_email_hint: ထိုအီးမေးလ်လိပ်စာ မမှန်ပါက အကောင့်သတ်မှတ်ချက်များတွင် ပြောင်းလဲနိုင်သည်။ delete_account: အကောင့်ဖျက်ပါ @@ -1678,7 +1677,6 @@ my: seamless_external_login: ပြင်ပဝန်ဆောင်မှုမှတစ်ဆင့် အကောင့်ဝင်ထားသောကြောင့် စကားဝှက်နှင့် အီးမေးလ်သတ်မှတ်ချက်များကို မရနိုင်ပါ။ signed_in_as: အဖြစ် အကောင့်ဝင်ခဲ့သည် - verification: - explanation_html: သင်သည် သင့်ပရိုဖိုင်မက်တာဒေတာရှိ လင့်ခ်များ၏ ပိုင်ရှင်အဖြစ် သင်ကိုယ်တိုင် အတည်ပြုနိုင်သည်။ ယင်းအတွက် လင့်ခ်ချိတ်ထားသော ဝဘ်ဆိုက်တွင် သင်၏ Mastodon ပရိုဖိုင်သို့ ပြန်သွားရန် လင့်ခ်တစ်ခု ပါရှိရပါမည်။ လင့်ခ်ထည့်သွင်းပြီးနောက် ဤနေရာသို့ပြန်လာရန်နှင့် အတည်ပြုနိုင်ရန်အတွက် သင့်ပရိုဖိုင်ကို ပြန်လည်သိမ်းဆည်းရန် လိုအပ်နိုင်ပါသည်။ နောက်ပြန်လင့်ခ်တွင် rel="me" ရည်ညွှန်းချက် ပါရှိရပါမည်။ လင့်ခ် စာသားအကြောင်းအရာမှာ အရေးမကြီးပါ။ ဤတွင် ဥပမာတစ်ခုရှိပါသည် - verification: စိစစ်ခြင်း webauthn_credentials: add: လုံခြုံရေးကီးအသစ်ထည့်ပါ diff --git a/config/locales/nl.yml b/config/locales/nl.yml index a71a4f2043..15a8a31ce3 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -979,7 +979,6 @@ nl: your_token: Jouw toegangscode auth: apply_for_account: Account aanvragen - change_password: Wachtwoord confirmations: wrong_email_hint: Als dat e-mailadres niet correct is, kun je het wijzigen in je accountinstellingen. delete_account: Account verwijderen @@ -1704,7 +1703,6 @@ nl: seamless_external_login: Je bent ingelogd via een externe dienst, daarom zijn wachtwoorden en e-mailinstellingen niet beschikbaar. signed_in_as: 'Ingelogd als:' verification: - explanation_html: 'Je kunt jezelf verifiëren als de eigenaar van de links in de metadata van jouw profiel. Hiervoor moet op de gelinkte website een link terug naar jouw Mastodonprofiel staan. Na het toevoegen van de link moet je hier mogelijk terugkomen en je profiel opnieuw bewaren om de verificatie te bevestigen. Deze link moet het rel="me"-attribuut bevatten. De omschrijving van de link maakt niet uit. Hier is een voorbeeld:' verification: Verificatie webauthn_credentials: add: Nieuwe beveiligingssleutel toevoegen diff --git a/config/locales/nn.yml b/config/locales/nn.yml index fb8fbf050b..bef7d4ace0 100644 --- a/config/locales/nn.yml +++ b/config/locales/nn.yml @@ -965,7 +965,6 @@ nn: your_token: Tilgangsnykelen din auth: apply_for_account: Søk om ein konto - change_password: Passord confirmations: wrong_email_hint: Viss epostadressa er feil, kan du endra ho i kontoinnstillingane. delete_account: Slett konto diff --git a/config/locales/no.yml b/config/locales/no.yml index 691e5d1d5c..8c8911ab9c 100644 --- a/config/locales/no.yml +++ b/config/locales/no.yml @@ -928,7 +928,6 @@ your_token: Din tilgangsnøkkel auth: apply_for_account: Be om en konto - change_password: Passord delete_account: Slett konto delete_account_html: Hvis du ønsker å slette kontoen din, kan du gå hit. Du vil bli spurt om bekreftelse. description: @@ -1636,7 +1635,6 @@ seamless_external_login: Du er logget inn via en ekstern tjeneste, så passord og e-post innstillinger er ikke tilgjengelige. signed_in_as: 'Innlogget som:' verification: - explanation_html: 'Du kan bekrefte at du selv eier lenkene i din profilmetadata. For å gjøre det, må det tillenkede nettstedet inneholde en lenke som fører tilbake til Mastodon-profilen din. Etter å ha laget den lenken må du kanskje komme tilbake hit og lagre profilen på ny, for at verifisering skal kunne gjennomføres. Lenken tilbake ha en rel="me"-attributt. Tekstinnholdet til lenken er irrelevant. Her er et eksempel:' verification: Bekreftelse webauthn_credentials: add: Legg til ny sikkerhetsnøkkel diff --git a/config/locales/oc.yml b/config/locales/oc.yml index 8affb7745d..dfa91df7fb 100644 --- a/config/locales/oc.yml +++ b/config/locales/oc.yml @@ -475,7 +475,6 @@ oc: warning: Mèfi ! Agachatz de partejar aquela donada amb degun ! your_token: Vòstre geton d’accès auth: - change_password: Senhal delete_account: Suprimir lo compte delete_account_html: Se volètz suprimir vòstre compte, podètz o far aquí. Vos demandarem que confirmetz. description: diff --git a/config/locales/pl.yml b/config/locales/pl.yml index 31a1236b83..511b078ad3 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -1015,7 +1015,6 @@ pl: your_token: Twój token dostępu auth: apply_for_account: Poproś o założenie konta - change_password: Hasło confirmations: wrong_email_hint: Jeśli ten adres e-mail nie jest poprawny, możesz go zmienić w ustawieniach konta. delete_account: Usunięcie konta @@ -1768,7 +1767,6 @@ pl: seamless_external_login: Zalogowano z użyciem zewnętrznej usługi, więc ustawienia hasła i adresu e-mail nie są dostępne. signed_in_as: 'Zalogowano jako:' verification: - explanation_html: 'Możesz zweryfikować siebie jako właściciela stron, do których odnośniki znajdują się w metadanych. Aby to zrobić, strona musi zawierać odnośnik do Twojego profilu na Mastodonie. Odnośnik musi zawierać atrybut rel="me". Jego zawartość nie ma znaczenia. Przykład:' verification: Weryfikacja webauthn_credentials: add: Dodaj nowy klucz bezpieczeństwa diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index fab31fc0c2..dec9aad3c2 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -979,7 +979,6 @@ pt-BR: your_token: Seu código de acesso auth: apply_for_account: Solicitar uma conta - change_password: Senha confirmations: wrong_email_hint: Se esse endereço de e-mail não estiver correto, você pode alterá-lo nas configurações da conta. delete_account: Excluir conta @@ -1704,7 +1703,6 @@ pt-BR: seamless_external_login: Você entrou usando um serviço externo, então configurações de e-mail e senha não estão disponíveis. signed_in_as: 'Entrou como:' verification: - explanation_html: 'Você pode se verificar como proprietário dos links nos metadados do seu perfil. Para isso, o site vinculado deve conter um link de volta para o seu perfil de Mastodon. Depois de adicionar o link, talvez você precise voltar aqui e salvar novamente o seu perfil para que a verificação tenha efeito. O link de volta deve ter um atributo rel="me". O conteúdo do texto do link não importa. Aqui está um exemplo:' verification: Verificação webauthn_credentials: add: Adicionar nova chave de segurança diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml index bf5a292a0d..f60dd5ce5a 100644 --- a/config/locales/pt-PT.yml +++ b/config/locales/pt-PT.yml @@ -979,7 +979,6 @@ pt-PT: your_token: O teu token de acesso auth: apply_for_account: Solicitar uma conta - change_password: Palavra-passe confirmations: wrong_email_hint: Se esse endereço de e-mail não estiver correto, você pode alterá-lo nas configurações da conta. delete_account: Eliminar conta @@ -1704,7 +1703,6 @@ pt-PT: seamless_external_login: Tu estás ligado via um serviço externo. Por isso, as configurações da palavra-passe e do e-mail não estão disponíveis. signed_in_as: 'Registado como:' verification: - explanation_html: 'Pode comprovar que é o dono das hiperligações nos metadados do seu perfil. Para isso, a página para a qual a hiperligação aponta tem de conter uma outra para o seu perfil do Mastodon. Após adicionar a hiperligação, poderá ter de voltar aqui e voltar a guardar o seu perfil para que a verificação produza efeito. Essa hiperligação tem de ter um atributo rel="me". O conteúdo do texto não é importante. Eis um exemplo:' verification: Verificação webauthn_credentials: add: Adicionar nova chave de segurança diff --git a/config/locales/ro.yml b/config/locales/ro.yml index a751669ca0..b581e11eac 100644 --- a/config/locales/ro.yml +++ b/config/locales/ro.yml @@ -423,7 +423,6 @@ ro: warning: Fiți foarte atent cu aceste date. Nu le împărtășiți niciodată cu cineva! your_token: Token-ul tău de acces auth: - change_password: Parolă delete_account: Șterge contul delete_account_html: Dacă vrei să ștergi acest cont poți începe aici. Va trebui să confirmi această acțiune. description: diff --git a/config/locales/ru.yml b/config/locales/ru.yml index 394d41d3b6..fb46541dc2 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -1015,7 +1015,6 @@ ru: your_token: Ваш токен доступа auth: apply_for_account: Запросить аккаунт - change_password: Пароль confirmations: wrong_email_hint: Если этот адрес электронной почты неверен, вы можете изменить его в настройках аккаунта. delete_account: Удалить учётную запись @@ -1768,7 +1767,6 @@ ru: seamless_external_login: Вы залогинены через сторонний сервис, поэтому настройки e-mail и пароля недоступны. signed_in_as: 'Выполнен вход под именем:' verification: - explanation_html: 'Вы можете подтвердить владение любой из ссылок в таблице. Для этого страница по ссылке должна содержать обратную ссылку на ваш профиль Mastodon, а у самой ссылки должен атрибут rel="me". Текст ссылки значения не имеет. Вот пример:' verification: Верификация ссылок webauthn_credentials: add: Добавить новый ключ безопасности diff --git a/config/locales/sc.yml b/config/locales/sc.yml index 47d192bd76..00142f0c4c 100644 --- a/config/locales/sc.yml +++ b/config/locales/sc.yml @@ -507,7 +507,6 @@ sc: warning: Dae cara a custos datos. Non ddos cumpartzas mai cun nemos! your_token: S'identificadore tuo de atzessu auth: - change_password: Crae delete_account: Cantzella su contu delete_account_html: Si boles cantzellare su contu, ddu podes fàghere inoghe. T'amus a dimandare una cunfirmatzione. description: diff --git a/config/locales/sco.yml b/config/locales/sco.yml index 924d502cf7..09ef5c0dfd 100644 --- a/config/locales/sco.yml +++ b/config/locales/sco.yml @@ -930,7 +930,6 @@ sco: your_token: Yer access token auth: apply_for_account: Request a accoont - change_password: Passwird delete_account: Delete accoont delete_account_html: If ye'r wantin tae delete yer accoont, ye kin dae it here. Ye'll get asked fir confirmation. description: diff --git a/config/locales/si.yml b/config/locales/si.yml index ecffbe9c2e..a8b5c44a11 100644 --- a/config/locales/si.yml +++ b/config/locales/si.yml @@ -773,7 +773,6 @@ si: warning: මෙම දත්ත සමඟ ඉතා ප්රවේශම් වන්න. එය කිසි විටෙක කිසිවෙකු සමඟ බෙදා නොගන්න! your_token: ඔබේ ප්‍රවේශ ටෝකනය auth: - change_password: මුර පදය delete_account: ගිණුම මකන්න delete_account_html: ඔබට ඔබගේ ගිණුම මකා දැමීමට අවශ්‍ය නම්, ඔබට මෙතැනින් ඉදිරියට යා හැක. තහවුරු කිරීම සඳහා ඔබෙන් අසනු ඇත. description: diff --git a/config/locales/simple_form.an.yml b/config/locales/simple_form.an.yml index 4d008fa42a..53e99b9e06 100644 --- a/config/locales/simple_form.an.yml +++ b/config/locales/simple_form.an.yml @@ -39,7 +39,6 @@ an: digest: Solo ninviau dimpués d'un largo periodo d'inactividat y nomás si has recibiu mensaches personals entre la tuya ausencia discoverable: Permite que la tuya cuenta sía descubierta per extranyos a traviés de recomendacions, tendencias y atras caracteristicas email: Se le ninviará un correu de confirmación - fields: Puetz tener dica 4 elementos amostrando-se como una tabla en o tuyo perfil header: PNG, GIF u JPG. Maximo %{size}. Será escalau a %{dimensions}px inbox_url: Copia la URL d'a pachina prencipal d'o relés que quiers utilizar irreversible: Las publicacions filtradas desapareixerán irreversiblement, mesmo si este filtro ye eliminau mas abance diff --git a/config/locales/simple_form.ar.yml b/config/locales/simple_form.ar.yml index 449af0f0a6..3c1cadd1ea 100644 --- a/config/locales/simple_form.ar.yml +++ b/config/locales/simple_form.ar.yml @@ -39,7 +39,6 @@ ar: digest: تُرسَل إليك بعد مُضيّ مدة مِن خمول نشاطك و فقط إذا ما تلقيت رسائل شخصية مباشِرة أثناء فترة غيابك مِن الشبكة discoverable: السماح للغرباء اكتشاف حسابك من خلال التوصيات والمتداولة وغيرها من الميزات email: سوف تتلقى رسالة إلكترونية للتأكيد - fields: يُمكنك عرض 4 عناصر على شكل جدول في صفحتك التعريفية header: ملف PNG أو GIF أو JPG. حجمه على أقصى تصدير %{size}. سيتم تصغيره إلى %{dimensions}px inbox_url: نسخ العنوان الذي تريد استخدامه مِن صفحة الاستقبال للمُرحَّل irreversible: المنشورات التي تم تصفيتها ستختفي لا محالة حتى و إن تمت إزالة عامِل التصفية لاحقًا diff --git a/config/locales/simple_form.ast.yml b/config/locales/simple_form.ast.yml index 1b159e2dc4..b076ec1943 100644 --- a/config/locales/simple_form.ast.yml +++ b/config/locales/simple_form.ast.yml @@ -19,7 +19,6 @@ ast: bot: Avisa a otres persones de qu'esta cuenta fai principalmente aiciones automatizaes ya de que ye posible que nun tean supervisaes digest: Namás s'unvia dempués d'un periodu llongu d'inactividá ya namás si recibiesti dalgún mensaxe personal demientres la to ausencia discoverable: Permite que persones desconocíes descubran la to cuenta pente recomendaciones, tendencies ya otres funciones - fields: Pues tener hasta 4 elementos qu'apaecen nuna tabla dientro del to perfil header: Ficheros PNG, GIF o JPG de %{size} como muncho. La semeya va redimensionase a %{dimensions} px irreversible: Los artículos peñeraos desapaecen de forma irreversible, magar que la peñera se quite dempués locale: La llingua de la interfaz, los mensaxes per corréu electrónicu ya los avisos push diff --git a/config/locales/simple_form.be.yml b/config/locales/simple_form.be.yml index 918a192a42..d325b10137 100644 --- a/config/locales/simple_form.be.yml +++ b/config/locales/simple_form.be.yml @@ -39,7 +39,6 @@ be: digest: Будзе даслана толькі пасля доўгага перыяду неактыўнасці і толькі калі вы атрымалі асабістыя паведамленні падчас вашай адсутнасці discoverable: Дазволіць незнаёмым людзям знаходзіць ваш уліковы запіс праз рэкамендацыі, трэнды і іншыя функцыі email: Пацвярджэнне будзе выслана па электроннай пошце - fields: У вашаму профілі можа быць паказана да 4 элементаў у выглядзе табліцы header: PNG, GIF ці JPG. Не больш за %{size}. Будзе сціснуты да памеру %{dimensions}} пікселяў inbox_url: Капіраваць URL са старонкі рэтранслятара, якім вы хочаце карыстацца irreversible: Адфільтраваныя пасты прападуць незваротна, нават калі фільтр потым будзе выдалены diff --git a/config/locales/simple_form.bg.yml b/config/locales/simple_form.bg.yml index 6de57bb000..f09e524506 100644 --- a/config/locales/simple_form.bg.yml +++ b/config/locales/simple_form.bg.yml @@ -39,7 +39,6 @@ bg: digest: Изпраща се само след дълъг период на бездействие и само ако сте получили лични съобщения във ваше отсъствие discoverable: Позволяване на странници да откриват вашия акаунт чрез препоръки, нашумели и други неща email: Ще ви се изпрати имейл за потвърждение - fields: Може да добавите до 4 елемента в таблицата към профила си header: PNG, GIF или JPG. До най-много %{size}. Ще се смали до %{dimensions} пиксела inbox_url: Копирайте URL адреса на заглавната страница на предаващия сървър, който искат да използвате irreversible: Филтрираните публикации ще изчезнат безвъзвратно, дори филтърът да бъде премахнат по-късно diff --git a/config/locales/simple_form.ca.yml b/config/locales/simple_form.ca.yml index 54fa4272dd..e3127b2dbb 100644 --- a/config/locales/simple_form.ca.yml +++ b/config/locales/simple_form.ca.yml @@ -39,7 +39,6 @@ ca: digest: Només s'envia després d'un llarg període d'inactivitat i només si has rebut algun missatge personal durant la teva absència discoverable: Permet que el teu compte sigui descobert per desconeguts a través de recomanacions, etiquetes i altres característiques email: Se t'enviarà un correu electrònic de confirmació - fields: Pots tenir fins a 4 elements que es mostren com a taula al teu perfil header: PNG, GIF o JPG de com a màxim %{size}. S'escalarà a %{dimensions}px inbox_url: Copia l'URL de la pàgina principal del relay que vols usar irreversible: Els tuts filtrats desapareixeran de manera irreversible, fins i tot si el filtre es retira més tard diff --git a/config/locales/simple_form.ckb.yml b/config/locales/simple_form.ckb.yml index e523450201..b649541f4f 100644 --- a/config/locales/simple_form.ckb.yml +++ b/config/locales/simple_form.ckb.yml @@ -32,7 +32,6 @@ ckb: current_username: بۆ دڵنیابوون، تکایە ناوی بەکارهێنەری ئەم هەژمارەیە بنووسە digest: تەنیا دوای ماوەیەکی زۆر لە بێ چالاکیدەنێردرێت و تەنیا ئەگەر نامەیەکی کەسیت بۆ نووسرابێت email: ئیمەیڵێکی پشتڕاستکردنەوەت بۆ دەنێردرێت - fields: دەتوانیت تا ٤بڕگەت هەبێت کە وەک خشتەیەک لەسەر پرۆفایلەکەت پیشان بدرێت header: PNG, GIF یان JPG. لە زۆربەی %{size}. دەبێتە ئەندازەیەکی کەمکراوە بۆ %{dimensions}پیکسێڵ inbox_url: نیشانەی پەڕەی سەرەکی ئەو رێڵە کە هەرەکتە بەکاریببەیت ڕوونووس دەکات irreversible: توتە فلتەرکراوەکە بە شێوەیەکی نەگەڕاو فرەدەدرێن، تەنانەت ئەگەر فلتەردواتر لاببرێت diff --git a/config/locales/simple_form.co.yml b/config/locales/simple_form.co.yml index b03ff4a092..9ad1751a90 100644 --- a/config/locales/simple_form.co.yml +++ b/config/locales/simple_form.co.yml @@ -30,7 +30,6 @@ co: current_username: Per cunfirmà, entrate u cugnome di questu contu digest: Solu mandatu dopu à una longa perioda d’inattività, è solu s’elli ci sò novi missaghji diretti email: Avete da riceve un'e-mail di cunfirmazione - fields: Pudete avè fin’à 4 elementi mustrati cum’un tavulone nant’à u vostru prufile header: Furmatu PNG, GIF o JPG. %{size} o menu. Sarà ridottu à %{dimensions}px inbox_url: Cupiate l'URL di a pagina d'accolta di u ripetitore chì vulete utilizà irreversible: I statuti filtrati saranu sguassati di manera irreversibile, ancu s'ellu hè toltu u filtru diff --git a/config/locales/simple_form.cs.yml b/config/locales/simple_form.cs.yml index 54640766ea..0148911867 100644 --- a/config/locales/simple_form.cs.yml +++ b/config/locales/simple_form.cs.yml @@ -39,7 +39,6 @@ cs: digest: Odesíláno pouze po dlouhé době nečinnosti a pouze, pokud jste během své nepřítomnosti obdrželi osobní zprávy discoverable: Umožnit, aby mohli váš účet objevit neznámí lidé pomocí doporučení, trendů a dalších funkcí email: Bude vám poslán potvrzovací e-mail - fields: Na svém profilu můžete mít zobrazeny až 4 položky jako tabulku header: PNG, GIF či JPG. Maximálně %{size}. Bude zmenšen na %{dimensions} px inbox_url: Zkopírujte URL z hlavní stránky mostu, který chcete použít irreversible: Filtrované příspěvky nenávratně zmizí, i pokud bude filtr později odstraněn diff --git a/config/locales/simple_form.cy.yml b/config/locales/simple_form.cy.yml index ca8350d49e..85077d2899 100644 --- a/config/locales/simple_form.cy.yml +++ b/config/locales/simple_form.cy.yml @@ -39,7 +39,6 @@ cy: digest: Ond yn cael eu hanfon ar ôl cyfnod hir o anweithgarwch ac ond os ydych wedi derbyn unrhyw negeseuon personol yn eich absenoldeb discoverable: Caniatáu i'ch cyfrif gael ei ddarganfod gan ddieithriaid trwy argymhellion, pynciau llosg a nodweddion eraill email: Byddwch yn derbyn e-bost cadarnhau - fields: Mae modd i chi ddangos hyd at 4 eitem fel tabl ar eich proffil header: PNG, GIF neu JPG. %{size} ar y mwyaf. Bydd yn cael ei israddio i %{dimensions}px inbox_url: Copïwch yr URL o dudalen flaen y relái yr ydych am ei ddefnyddio irreversible: Bydd postiadau wedi'u hidlo'n diflannu'n ddiwrthdro, hyd yn oed os caiff yr hidlydd ei dynnu'n ddiweddarach diff --git a/config/locales/simple_form.da.yml b/config/locales/simple_form.da.yml index 2466f28849..44c59231f6 100644 --- a/config/locales/simple_form.da.yml +++ b/config/locales/simple_form.da.yml @@ -39,7 +39,6 @@ da: digest: Sendes kun efter en lang inaktivitetsperiode, og kun hvis du har modtaget personlige beskeder under fraværet discoverable: Tillad kontoen at blive fundet af fremmede via anbefalinger og øvrige funktioner email: En bekræftelses-e-mail fremsendes - fields: Profilen kan have op til 4 elementer vist som en tabel header: PNG, GIF eller JPG. Maks. %{size}. Auto-nedskaleres til %{dimensions}px inbox_url: Kopiér URL'en fra forsiden af den videreformidler, der skal anvendes irreversible: Filtrerede indlæg forsvinder permanent, selv hvis filteret senere fjernes diff --git a/config/locales/simple_form.de.yml b/config/locales/simple_form.de.yml index d471b3a896..6f9187b5d1 100644 --- a/config/locales/simple_form.de.yml +++ b/config/locales/simple_form.de.yml @@ -39,7 +39,6 @@ de: digest: Wenn du eine längere Zeit inaktiv bist oder du in deiner Abwesenheit eine Direktnachricht erhalten hast discoverable: Erlaube deinem Konto, durch Empfehlungen, Trends und andere Funktionen von Fremden entdeckt zu werden email: Du wirst eine E-Mail zur Verifizierung dieser E-Mail-Adresse erhalten - fields: Du kannst bis zu vier Metadaten auf deinem Profil anzeigen lassen, die als Tabelle dargestellt werden header: PNG, GIF oder JPG. Höchstens %{size} groß. Wird auf %{dimensions} px verkleinert inbox_url: Kopiere die URL von der Startseite des gewünschten Relays irreversible: Bereinigte Beiträge verschwinden unwiderruflich für dich, auch dann, wenn dieser Filter zu einem späteren wieder entfernt wird diff --git a/config/locales/simple_form.el.yml b/config/locales/simple_form.el.yml index 41401a1d7f..b9e8ce3b5a 100644 --- a/config/locales/simple_form.el.yml +++ b/config/locales/simple_form.el.yml @@ -39,7 +39,6 @@ el: digest: Αποστέλλεται μόνο μετά από μακρά περίοδο αδράνειας και μόνο αν έχεις λάβει προσωπικά μηνύματα κατά την απουσία σου discoverable: Επέτρεψε στον λογαριασμό σου να ανακαλυφθεί από αγνώστους μέσω συστάσεων, τάσεων και άλλων χαρακτηριστικών email: Θα σου σταλεί email επιβεβαίωσης - fields: Μπορείς να έχεις έως 4 σημειώσεις σε μορφή πίνακα στο προφίλ σου header: PNG, GIF ή JPG. Έως %{size}. Θα περιοριστεί σε διάσταση %{dimensions}px inbox_url: Αντέγραψε το URL της αρχικής σελίδας του ανταποκριτή που θέλεις να χρησιμοποιήσεις irreversible: Οι φιλτραρισμένες αναρτήσεις θα εξαφανιστούν αμετάκλητα, ακόμα και αν το φίλτρο αργότερα αφαιρεθεί diff --git a/config/locales/simple_form.en-GB.yml b/config/locales/simple_form.en-GB.yml index e16e3de227..9e47284055 100644 --- a/config/locales/simple_form.en-GB.yml +++ b/config/locales/simple_form.en-GB.yml @@ -39,7 +39,6 @@ en-GB: digest: Only sent after a long period of inactivity and only if you have received any personal messages in your absence discoverable: Allow your account to be discovered by strangers through recommendations, trends and other features email: You will be sent a confirmation e-mail - fields: You can have up to 4 items displayed as a table on your profile header: PNG, GIF or JPG. At most %{size}. Will be downscaled to %{dimensions}px inbox_url: Copy the URL from the frontpage of the relay you want to use irreversible: Filtered posts will disappear irreversibly, even if filter is later removed diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index a99a50e993..a81b6627a0 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -2,6 +2,10 @@ en: simple_form: hints: + account: + display_name: Your full name or your fun name. + fields: Your homepage, pronouns, age, anything you want. + note: 'You can @mention other people or #hashtags.' account_alias: acct: Specify the username@domain of the account you want to move from account_migration: @@ -39,7 +43,6 @@ en: digest: Only sent after a long period of inactivity and only if you have received any personal messages in your absence discoverable: Allow your account to be discovered by strangers through recommendations, trends and other features email: You will be sent a confirmation e-mail - fields: You can have up to 4 items displayed as a table on your profile header: PNG, GIF or JPG. At most %{size}. Will be downscaled to %{dimensions}px inbox_url: Copy the URL from the frontpage of the relay you want to use irreversible: Filtered posts will disappear irreversibly, even if filter is later removed @@ -167,7 +170,7 @@ en: text: Explain why this decision should be reversed defaults: autofollow: Invite to follow your account - avatar: Avatar + avatar: Profile picture bot: This is an automated account chosen_languages: Filter languages confirm_new_password: Confirm new password @@ -179,8 +182,8 @@ en: display_name: Display name email: E-mail address expires_in: Expire after - fields: Profile metadata - header: Header + fields: Extra fields + header: Header picture honeypot: "%{label} (do not fill in)" inbox_url: URL of the relay inbox irreversible: Drop instead of hide diff --git a/config/locales/simple_form.eo.yml b/config/locales/simple_form.eo.yml index 0e0123af7b..c0735d6c41 100644 --- a/config/locales/simple_form.eo.yml +++ b/config/locales/simple_form.eo.yml @@ -39,7 +39,6 @@ eo: digest: Sendita nur post longa tempo de neaktiveco, kaj nur se vi ricevis personan mesaĝon en via foresto discoverable: Permesi vian konton esti malkovrita de fremduloj per rekomendoj, tendencoj kaj aliaj funkcioj email: Vi ricevos konfirman retpoŝton - fields: Vi povas havi ĝis 4 tabelajn elementojn en via profilo header: Formato PNG, GIF aŭ JPG. Ĝis %{size}. Estos malgrandigita al %{dimensions}px inbox_url: Kopiu la URL de la ĉefpaĝo de la ripetilo, kiun vi volas uzi irreversible: La filtritaj mesaĝoj malaperos por eterne, eĉ se la filtrilo poste estas forigita diff --git a/config/locales/simple_form.es-AR.yml b/config/locales/simple_form.es-AR.yml index 0d29d66127..10f9447add 100644 --- a/config/locales/simple_form.es-AR.yml +++ b/config/locales/simple_form.es-AR.yml @@ -39,7 +39,6 @@ es-AR: digest: Sólo enviado tras un largo periodo de inactividad, y sólo si recibiste mensajes personales en tu ausencia discoverable: Permití que tu cuenta sea descubierta por extraños a través de recomendaciones, tendencias y otras funciones email: Se te enviará un correo electrónico de confirmación - fields: Podés tener hasta 4 elementos mostrados en una tabla en tu perfil header: 'PNG, GIF o JPG. Máximo: %{size}. Será subescalado a %{dimensions} píxeles.' inbox_url: Copiá la dirección web desde la página principal del relé que querés usar irreversible: Los mensajes filtrados desaparecerán irreversiblemente, incluso si este filtro es eliminado después diff --git a/config/locales/simple_form.es-MX.yml b/config/locales/simple_form.es-MX.yml index ba179aeadf..2f5df86b81 100644 --- a/config/locales/simple_form.es-MX.yml +++ b/config/locales/simple_form.es-MX.yml @@ -39,7 +39,6 @@ es-MX: digest: Solo enviado tras un largo periodo de inactividad y solo si has recibido mensajes personales durante tu ausencia discoverable: Permite que tu cuenta sea descubierta por extraños a través de recomendaciones, tendencias y otras características email: Se le enviará un correo de confirmación - fields: Puedes tener hasta 4 elementos mostrándose como una tabla en tu perfil header: PNG, GIF o JPG. Máximo %{size}. Será escalado a %{dimensions}px inbox_url: Copia la URL de la página principal del relés que quieres utilizar irreversible: Los toots filtrados desaparecerán irreversiblemente, incluso si este filtro es eliminado más adelante diff --git a/config/locales/simple_form.es.yml b/config/locales/simple_form.es.yml index b969c4b0eb..3c04121467 100644 --- a/config/locales/simple_form.es.yml +++ b/config/locales/simple_form.es.yml @@ -39,7 +39,6 @@ es: digest: Solo enviado tras un largo periodo de inactividad y solo si has recibido mensajes personales durante tu ausencia discoverable: Permite que tu cuenta sea descubierta por extraños a través de recomendaciones, tendencias y otras características email: Se le enviará un correo de confirmación - fields: Puedes tener hasta 4 elementos mostrándose como una tabla en tu perfil header: PNG, GIF o JPG. Máximo %{size}. Será escalado a %{dimensions}px inbox_url: Copia la URL de la página principal del relés que quieres utilizar irreversible: Las publicaciones filtradas desaparecerán irreversiblemente, incluso si este filtro es eliminado más adelante diff --git a/config/locales/simple_form.et.yml b/config/locales/simple_form.et.yml index 618aa6a2f7..a90a17dc1f 100644 --- a/config/locales/simple_form.et.yml +++ b/config/locales/simple_form.et.yml @@ -39,7 +39,6 @@ et: digest: Saadetakse ainult pärast pikka tegevusetuse perioodi ja ainult siis, kui on saadetud otsesõnumeid discoverable: Konto on leitav võhivõõraste jaoks soovituste ja trendide sirvimise teel vm sarnaste vahenditega email: Sulle saadetakse e-posti teel kinnituskiri - fields: Saad oma profiilil tabelina kuvada kuni 4 asja header: PNG, GIF või JPG. Kõige rohkem %{size}. Vähendatakse %{dimensions} pikslini inbox_url: Kopeeri soovitud vahendaja avalehe URL irreversible: Filtreeritud postitused kaovad taastamatult, isegi kui filter on hiljem eemaldatud diff --git a/config/locales/simple_form.eu.yml b/config/locales/simple_form.eu.yml index d3f079e40e..281780107e 100644 --- a/config/locales/simple_form.eu.yml +++ b/config/locales/simple_form.eu.yml @@ -39,7 +39,6 @@ eu: digest: Jarduerarik gabeko epe luze bat eta gero mezu pertsonalen bat jaso baduzu, besterik ez discoverable: Baimendu zure kontua ezezagunek aurkitu ahal izatea gomendio, joera eta beste ezaugarrien bidez email: Baieztapen e-mail bat bidaliko zaizu - fields: 4 elementu bistaratu ditzakezu taula batean zure profilean header: PNG, GIF edo JPG. Gehienez %{size}. %{dimensions}px eskalara txikituko da inbox_url: Kopiatu erabili nahi duzun errelearen hasiera orriaren URLa irreversible: Iragazitako tootak betirako galduko dira, geroago iragazkia kentzen baduzu ere diff --git a/config/locales/simple_form.fa.yml b/config/locales/simple_form.fa.yml index 369ba68cd4..8bfed2eafa 100644 --- a/config/locales/simple_form.fa.yml +++ b/config/locales/simple_form.fa.yml @@ -39,7 +39,6 @@ fa: digest: تنها وقتی فرستاده می‌شود که مدتی طولانی فعالیتی نداشته باشید و در این مدت برای شما پیغام خصوصی‌ای نوشته شده باشد discoverable: اجازه دهید حساب‌تان از طریق پیشنهادها، پرطرفدارها و سایر قابلیت‌ها، توسط افراد غریبه قابل کشف باشد email: به شما ایمیل تأییدی فرستاده خواهد شد - fields: شما می‌توانید تا چهار مورد را در یک جدول در نمایهٔ خود نمایش دهید header: یکی از قالب‌های PNG یا GIF یا JPG. بیشترین اندازه %{size}. تصویر به اندازهٔ %{dimensions} پیکسل تبدیل خواهد شد inbox_url: نشانی صفحهٔ اصلی رله‌ای را که می‌خواهید به کار ببرید کپی کنید irreversible: فرسته‌های پالوده به طور برگشت‌ناپذیری ناپدید می‌شوند، حتا اگر بعدها پالایه برداشته شود diff --git a/config/locales/simple_form.fi.yml b/config/locales/simple_form.fi.yml index 5ddfbaf78d..f6610b2eac 100644 --- a/config/locales/simple_form.fi.yml +++ b/config/locales/simple_form.fi.yml @@ -39,7 +39,6 @@ fi: digest: Lähetetään vain pitkän poissaolon jälkeen ja vain, jos olet saanut suoria viestejä poissaolosi aikana discoverable: Salli tuntemattomien löytää tilisi suositusten, trendien ja muiden ominaisuuksien kautta email: Sinulle lähetetään vahvistussähköposti - fields: Sinulla voi olla korkeintaan 4 asiaa profiilissasi taulukossa header: PNG, GIF tai JPG. Enintään %{size}. Skaalataan kokoon %{dimensions} px inbox_url: Kopioi URL-osoite haluamasi välittäjän etusivulta irreversible: Suodatetut julkaisut katoavat lopullisesti, vaikka suodatin poistettaisiin myöhemmin diff --git a/config/locales/simple_form.fo.yml b/config/locales/simple_form.fo.yml index 2ec4e637b3..7665fe0264 100644 --- a/config/locales/simple_form.fo.yml +++ b/config/locales/simple_form.fo.yml @@ -39,7 +39,6 @@ fo: digest: Einans sent eftir eitt langt tíðarskeið við óvirkni og einans um tú hevur móttikið persónlig boð meðan tú var burtur discoverable: Loyv kontu tíni at verða funnin av fremmandum gjøgnum viðmæli, rák og aðrar hentleikar email: Tú fær sendandi ein váttanarteldupost - fields: Tú kanst hava upp til 4 lutir vístar sum eina talvu á vanga tínum header: PNG, GIF ella JPG. Ikki størri enn %{size}. Verður minkað til %{dimensions}px inbox_url: Avrita URL'in frá forsíðuni hjá reiðlagnum, sum tú vilt brúka irreversible: Filtreraðir postar blíva burtur med alla, eisini sjálvt um filtrið seinni verður strikað diff --git a/config/locales/simple_form.fr-QC.yml b/config/locales/simple_form.fr-QC.yml index 6517d3d8d4..88325b05a2 100644 --- a/config/locales/simple_form.fr-QC.yml +++ b/config/locales/simple_form.fr-QC.yml @@ -39,7 +39,6 @@ fr-QC: digest: Uniquement envoyé après une longue période d’inactivité en cas de messages personnels reçus pendant votre absence discoverable: Permet à votre compte d’être découvert par des inconnus par le biais de recommandations, de tendances et autres fonctionnalités email: Vous recevrez un courriel de confirmation - fields: Vous pouvez avoir jusqu’à 4 éléments affichés en tant que tableau sur votre profil header: Au format PNG, GIF ou JPG. %{size} maximum. Sera réduit à %{dimensions}px inbox_url: Copiez l’URL depuis la page d’accueil du relai que vous souhaitez utiliser irreversible: Les messages filtrés disparaîtront irrévocablement, même si le filtre est supprimé plus tard diff --git a/config/locales/simple_form.fr.yml b/config/locales/simple_form.fr.yml index d4697fa1e9..3fd3b4b350 100644 --- a/config/locales/simple_form.fr.yml +++ b/config/locales/simple_form.fr.yml @@ -39,7 +39,6 @@ fr: digest: Uniquement envoyé après une longue période d’inactivité en cas de messages personnels reçus pendant votre absence discoverable: Permet à votre compte d’être découvert par des inconnus par le biais de recommandations, de tendances et autres fonctionnalités email: Vous recevrez un courriel de confirmation - fields: Vous pouvez avoir jusqu’à 4 éléments affichés en tant que tableau sur votre profil header: Au format PNG, GIF ou JPG. %{size} maximum. Sera réduit à %{dimensions}px inbox_url: Copiez l’URL depuis la page d’accueil du relais que vous souhaitez utiliser irreversible: Les messages filtrés disparaîtront irrévocablement, même si le filtre est supprimé plus tard diff --git a/config/locales/simple_form.fy.yml b/config/locales/simple_form.fy.yml index d3bbd1f6fb..a6ff804890 100644 --- a/config/locales/simple_form.fy.yml +++ b/config/locales/simple_form.fy.yml @@ -39,7 +39,6 @@ fy: digest: Wurdt allinnich nei in lange perioade fan ynaktiviteit ferstjoerd en allinnich wannear’t jo wylst jo ôfwêzigens persoanlike berjochten ûntfongen hawwe discoverable: Tastean dat jo account te finen is foar ûnbekenden, fia oanrekommandaasjes, trends en op oare manieren email: Jo krije in befêstigings-e-mailberjocht - fields: Jo kinne maksimaal 4 items as in tabel op jo profyl werjaan header: PNG, GIF of JPG. Maksimaal %{size}. Wurdt weromskeald nei %{dimensions}px inbox_url: Kopiearje de URL fan de foarside fan de relayserver dy’t jo brûke wolle irreversible: Filtere berjochten ferdwine definityf, sels as it filter letter fuortsmiten wurdt diff --git a/config/locales/simple_form.gd.yml b/config/locales/simple_form.gd.yml index a34865ff71..248ccb1afc 100644 --- a/config/locales/simple_form.gd.yml +++ b/config/locales/simple_form.gd.yml @@ -39,7 +39,6 @@ gd: digest: Cha dèid seo a chur ach nuair a bhios tu air ùine mhòr gun ghnìomh a ghabhail agus ma fhuair thu teachdaireachd phearsanta fhad ’s a bha thu air falbh discoverable: Ceadaich gun rùraich coigrich an cunntas agad le taic o mholaidhean, treandaichean is gleusan eile email: Thèid post-d dearbhaidh a chur thugad - fields: Faodaidh tu suas ri 4 nithean a shealltainn mar chlàr air a’ phròifil agad header: PNG, GIF or JPG. %{size} air a char as motha. Thèid a sgèileadh sìos gu %{dimensions}px inbox_url: Dèan lethbhreac dhen URL o phrìomh-dhuilleag an ath-sheachadain a bu mhiann leat cleachdadh irreversible: Thèid postaichean criathraichte à sealladh gu buan fiù ’s ma bheir thu a’ chriathrag air falbh às dèidh làimhe diff --git a/config/locales/simple_form.gl.yml b/config/locales/simple_form.gl.yml index e28c0e0a96..e2027a4734 100644 --- a/config/locales/simple_form.gl.yml +++ b/config/locales/simple_form.gl.yml @@ -39,7 +39,6 @@ gl: digest: Enviar só tras un longo período de inactividade e só se recibiches algunha mensaxe directa na tua ausencia discoverable: Permite que a túa conta poida ser descuberta por persoas descoñecidas a través de recomendacións, tendencias e outras ferramentas email: Ímosche enviar un correo de confirmación - fields: Podes ter ate 4 elementos no teu perfil mostrados como unha táboa header: PNG, GIF ou JPG. Máximo %{size}. Será reducida a %{dimensions}px inbox_url: Copiar o URL desde a páxina de inicio do repetidor que queres utilizar irreversible: As publicacións filtradas desaparecerán de xeito irreversible, incluso se despois se elimina o filtro diff --git a/config/locales/simple_form.he.yml b/config/locales/simple_form.he.yml index 4402ed6a71..02cdc773e8 100644 --- a/config/locales/simple_form.he.yml +++ b/config/locales/simple_form.he.yml @@ -39,7 +39,6 @@ he: digest: נשלח לאחר תקופה ארוכה של אי-פעילות עם סיכום איזכורים שקיבלת בהעדרך discoverable: אשר/י לחשבונך להתגלות לזרים על ידי המלצות, נושאים חמים ושאר דרכים email: דוא"ל אישור יישלח אליך - fields: ניתן להציג עד ארבעה פריטים כטבלה בפרופילך header: PNG, GIF או JPG. מקסימום %{size}. גודל התמונה יוקטן %{dimensions}px inbox_url: נא להעתיק את הקישורית מדף הבית של הממסר בו תרצה/י להשתמש irreversible: הודעות מסוננות יעלמו באופן בלתי הפיך, אפילו אם מאוחר יותר יוסר המסנן diff --git a/config/locales/simple_form.hu.yml b/config/locales/simple_form.hu.yml index ea7c87f461..7ae7ba3363 100644 --- a/config/locales/simple_form.hu.yml +++ b/config/locales/simple_form.hu.yml @@ -39,7 +39,6 @@ hu: digest: Csak hosszú távollét esetén küldődik és csak ha személyes üzenetet kaptál távollétedben discoverable: Engedélyezés, hogy a fiókod idegenek által megtalálható legyen javaslatokon, trendeken és más funkciókon keresztül email: Kapsz egy megerősítő e-mailt - fields: A profilodon legfeljebb 4 bejegyzés szerepelhet táblázatos formában header: PNG, GIF vagy JPG. Maximum %{size}. Átméretezzük %{dimensions} pixelre inbox_url: Másold ki a használandó relé szerver kezdőoldalának URL-jét irreversible: A kiszűrt bejegyzések visszafordíthatatlanul eltűnnek, a szűrő későbbi törlése esetén is diff --git a/config/locales/simple_form.hy.yml b/config/locales/simple_form.hy.yml index 2bc72ecdb3..e8eb741183 100644 --- a/config/locales/simple_form.hy.yml +++ b/config/locales/simple_form.hy.yml @@ -30,7 +30,6 @@ hy: current_username: Հաստատելու համար խնդրում ենք մուտքագրել տուել հաշուի օգտանունը digest: Ուղարկուում է պասիւութեան երկար շրջանից յետոյ եւ միայն այն դէպքում, երբ բացակայութեանդ ժամանակ որեւէ անձնական հաղորդագրութիւն ես ստացել email: Քեզ ուղարկուել է հաստատման իմակ - fields: Կարող ես ունենալ մինչեւ 4 կէտ հաշուիդ աղիւսակում ցուցադրելու header: PNG, GIF կամ JPG։ Առաւելագոյնը՝ %{size}։ Կը փոքրացուի մինչեւ %{dimensions} inbox_url: Պատճէնիր URL այն շերտի դիմերեսից, որը ցանկանում ես օգտագործել irreversible: Զտուած գրառումները կորչելու են անդառնալիօրէն, նոյնիսկ եթէ զտիչը յետոյ հեռացնես diff --git a/config/locales/simple_form.id.yml b/config/locales/simple_form.id.yml index 2892b13629..4e20b6d964 100644 --- a/config/locales/simple_form.id.yml +++ b/config/locales/simple_form.id.yml @@ -37,7 +37,6 @@ id: digest: Hanya kirim setelah lama tidak aktif dan hanya jika Anda menerima pesan personal atas absensi Anda discoverable: Izinkan akun Anda ditemukan orang lain lewat rekomendasi, tren, dan fitur lain email: Anda akan dikirimi email konfirmasi - fields: Anda bisa memiliki hingga 4 item utk ditampilkan sebagai tabel di profil Anda header: PNG, GIF atau JPG. Maksimal %{size}. Ukuran dikecilkan menjadi %{dimensions}px inbox_url: Salin URL dari halaman depan relai yang ingin Anda pakai irreversible: Toot tersaring akan hilang permanen bahkan jika saringan dihapus kemudian diff --git a/config/locales/simple_form.io.yml b/config/locales/simple_form.io.yml index d1f4ccf974..913fc3b2f1 100644 --- a/config/locales/simple_form.io.yml +++ b/config/locales/simple_form.io.yml @@ -37,7 +37,6 @@ io: digest: Nur sendesas pos longa neaktiveso e nur se vu ganis irga mesaji dum ke vu esas neprezenta discoverable: Permisez vua konto deskovresar da nekonociti tra rekomendi, tendenci e altra traiti email: Vu sendesos konfirmretposto - fields: On povas havar maxime 4 kozi quo montresas quale tabelo che ona profilo header: En la formato PNG, GIF o JPG. Til %{size}. Esos mikrigita a %{dimensions}px inbox_url: Kopiez URL de frontpagino de relayo quon vu volas uzar irreversible: Filtrita posti neinversigeble desaparos, mem se filtro efacesas pose diff --git a/config/locales/simple_form.is.yml b/config/locales/simple_form.is.yml index c130997e9b..acbc3c3738 100644 --- a/config/locales/simple_form.is.yml +++ b/config/locales/simple_form.is.yml @@ -39,7 +39,6 @@ is: digest: Er aðeins sent eftir lengri tímabil án virkni og þá aðeins ef þú hefur fengið persónuleg skilaboð á meðan þú hefur ekki verið á línunni discoverable: Gerðu öðrum kleift að finna aðganginn þinn í gegnum meðmæli, vinsældir og annað slíkt email: Þú munt fá sendan staðfestingarpóst - fields: Þú getur birt allt að 4 atriði sem töflu á notandasniðinu þínu header: PNG, GIF eða JPG. Mest %{size}. Verður smækkað í %{dimensions}px inbox_url: Afritaðu slóðina af forsíðu endurvarpans sem þú vilt nota irreversible: Síaðar færslur munu hverfa óendurkræft, jafnvel þó sían sé seinna fjarlægð diff --git a/config/locales/simple_form.it.yml b/config/locales/simple_form.it.yml index 23dd182da5..79b6b03aa9 100644 --- a/config/locales/simple_form.it.yml +++ b/config/locales/simple_form.it.yml @@ -39,7 +39,6 @@ it: digest: Inviata solo dopo un lungo periodo di inattività e solo se hai ricevuto qualche messaggio personale in tua assenza discoverable: Consenti al tuo account di essere scoperto da sconosciuti tramite consigli, tendenze e altre funzionalità email: Ti manderemo una email di conferma - fields: Puoi avere fino a 4 voci visualizzate come una tabella sul tuo profilo header: PNG, GIF o JPG. Al massimo %{size}. Verranno scalate a %{dimensions}px inbox_url: Copia la URL dalla pagina iniziale del ripetitore che vuoi usare irreversible: I post filtrati scompariranno in modo irreversibile, anche se il filtro viene eliminato diff --git a/config/locales/simple_form.ja.yml b/config/locales/simple_form.ja.yml index e12dcfe74e..9716b6c656 100644 --- a/config/locales/simple_form.ja.yml +++ b/config/locales/simple_form.ja.yml @@ -39,7 +39,6 @@ ja: digest: 長期間使用していない場合と不在時に返信を受けた場合のみ送信されます discoverable: レコメンド、トレンド、その他の機能により、あなたのアカウントを他の人から見つけられるようにします email: 確認のメールが送信されます - fields: プロフィールに表として4つまでの項目を表示することができます header: "%{size}までのPNG、GIF、JPGが利用可能です。 %{dimensions}pxまで縮小されます" inbox_url: 使用したいリレーサーバーのトップページからURLをコピーします irreversible: フィルターが後で削除されても、除外された投稿は元に戻せなくなります diff --git a/config/locales/simple_form.ka.yml b/config/locales/simple_form.ka.yml index 2df3db45bf..574a2b07c7 100644 --- a/config/locales/simple_form.ka.yml +++ b/config/locales/simple_form.ka.yml @@ -8,7 +8,6 @@ ka: bot: ეს ანგარიში უმთავრესად ასრულებს ავტომატურ მოქმედებებს და შესაძლოა არ იყოს მონიტორინგის ქვეშ context: ერთ ან მრავალი კონტექსტი სადაც ფილტრი უნდა შესრულდეს digest: იგზავნება მხოლოდ ხანგრძლივი უაქტივობის პერიოდის შემდეგ და არყოფნისას თუ მიიღეთ ერთი წერილი მაინც - fields: პროფილზე ტაბულის სახით შესაძლოა საჩვენებლად გაგაჩნდეთ მაქს. 4 პუნქტი header: პნგ, გიფ ან ჯპგ. მაქს. %{size}. ზომა დაპატარავდება %{dimensions}პიქს.-ზე inbox_url: ურლ დააკოირეთ გამოყენებისთვის სასურველი რილეის წინა გვერდიდან irreversible: გაფილტრული ტუტები გაუქმდება აღუდგენლად, იმ შემთხვევაშიც კი თუ ფილტრი სამომავლოდ გაუქმდება diff --git a/config/locales/simple_form.ko.yml b/config/locales/simple_form.ko.yml index a56bf4a2e6..ef08bc6845 100644 --- a/config/locales/simple_form.ko.yml +++ b/config/locales/simple_form.ko.yml @@ -39,7 +39,6 @@ ko: digest: 오랫동안 활동하지 않았을 때 받은 멘션들에 대한 요약 받기 discoverable: 추천, 트렌드 및 기타 기능을 통해 낯선 사람이 내 계정을 발견할 수 있도록 허용합니다 email: 당신은 확인 메일을 받게 됩니다 - fields: 프로필에 최대 4개의 항목을 표 형식으로 표시할 수 있습니다. header: PNG, GIF 혹은 JPG. 최대 %{size}. %{dimensions}px로 축소 됨 inbox_url: 사용 할 릴레이 서버의 프론트페이지에서 URL을 복사합니다 irreversible: 필터링 된 게시물은 나중에 필터가 사라지더라도 돌아오지 않게 됩니다 diff --git a/config/locales/simple_form.ku.yml b/config/locales/simple_form.ku.yml index bd0529772b..295de7aff9 100644 --- a/config/locales/simple_form.ku.yml +++ b/config/locales/simple_form.ku.yml @@ -37,7 +37,6 @@ ku: digest: Tenê piştî demek dirêj neçalakiyê de û tenê di nebûna te da peyamên teybetî standî be tê şandin discoverable: Mafê biden ku ajimêra te bi pêşniyar û taybetmendiyên din ji aliyê biyaniyan ve bê vedîtin email: Ji te re e-name ya pejirandinê were - fields: Tu dikarî heya 4 hêmanan wekî tabloyek li ser profîla xwe nîşan bidî header: PNG, GIF an jî JPG. Herî zêde %{size} ber bi %{dimensions}px ve were kêmkirin inbox_url: Girêdanê ji rûpela pêşîn a guhêrkera ku tu dixwazî bi kar bînî jê bigire irreversible: Şandiyên parzûnkirî êdî bê veger wenda bibe, heger parzûn paşê were rakirin jî nabe diff --git a/config/locales/simple_form.lv.yml b/config/locales/simple_form.lv.yml index 33d82d5ba4..746e4bab80 100644 --- a/config/locales/simple_form.lv.yml +++ b/config/locales/simple_form.lv.yml @@ -39,7 +39,6 @@ lv: digest: Sūta tikai pēc ilgstošas neaktivitātes un tikai tad, ja savas prombūtnes laikā neesi saņēmis personiskas ziņas discoverable: Ļauj svešiniekiem atklāt savu kontu caur ieteikumiem, tendencēm un citām iespējām email: Tev tiks nosūtīts apstiprinājuma e-pasts - fields: Savā profilā kā tabulu vari parādīt līdz 4 vienumiem header: PNG, GIF vai JPG. Ne vairāk kā %{size}. Tiks samazināts līdz %{dimensions}px inbox_url: Nokopē URL no tā releja sākumlapas, kuru vēlies izmantot irreversible: Filtrētās ziņas neatgriezeniski pazudīs, pat ja filtrs vēlāk tiks noņemts diff --git a/config/locales/simple_form.my.yml b/config/locales/simple_form.my.yml index e2efa8c068..abc18ce75d 100644 --- a/config/locales/simple_form.my.yml +++ b/config/locales/simple_form.my.yml @@ -39,7 +39,6 @@ my: digest: အချိန်အတော်ကြာ အသုံးမပြုသည့်သည့်နောက်တွင်သာ ပေးပို့ပြီး အသုံးမပြုသည့်ကာလအတွင်း ကိုယ်ရေးကိုယ်တာစာများသာ လက်ခံရန် discoverable: အကြံပြုချက်များ၊ လက်ရှိခေတ်စားနေသောပို့စ်များနှင့် အခြားအကြောင်းအရာများမှတစ်ဆင့် သင့်အကောင့်ကို တခြားသူများက တွေ့ရှိနိုင်စေရန် ခွင့်ပြုပါ။ email: သင့်ထံ အတည်ပြုချက်အီးမေးလ်တစ်စောင် ပေးပို့ပါမည် - fields: သင့်ပရိုဖိုင်တွင် ၄ ခုအထိ ပြသထားနိုင်သည် header: PNG၊ GIF သို့မဟုတ် JPG။ အများဆုံး %{size}။ %{dimensions}px သို့ လျှော့ချပါမည် inbox_url: သင်အသုံးပြုလိုသော relay ၏ ရှေ့စာမျက်နှာမှ URL ကို ကူးယူပါ irreversible: စစ်ထုတ်ခြင်းကိုဖယ်ရှားလိုက်ပါက စစ်ထုတ်ထားသော ပို့စ်များမှာ ပျောက်ကွယ်သွားပါမည် diff --git a/config/locales/simple_form.nl.yml b/config/locales/simple_form.nl.yml index 0a0ae92fc5..9b9d6d6da8 100644 --- a/config/locales/simple_form.nl.yml +++ b/config/locales/simple_form.nl.yml @@ -39,7 +39,6 @@ nl: digest: Wordt alleen na een lange periode van inactiviteit verzonden en alleen wanneer je tijdens jouw afwezigheid persoonlijke berichten hebt ontvangen discoverable: Toestaan dat jouw account vindbaar is voor onbekenden, via aanbevelingen, trends en op andere manieren email: Je krijgt een bevestigingsmail - fields: Je kunt maximaal 4 items als een tabel op je profiel weergeven header: PNG, GIF of JPG. Maximaal %{size}. Wordt teruggeschaald naar %{dimensions}px inbox_url: Kopieer de URL van de voorpagina van de relayserver die je wil gebruiken irreversible: Gefilterde berichten verdwijnen onomkeerbaar, zelfs als de filter later wordt verwijderd diff --git a/config/locales/simple_form.nn.yml b/config/locales/simple_form.nn.yml index e3b8fa3fcd..5eda406942 100644 --- a/config/locales/simple_form.nn.yml +++ b/config/locales/simple_form.nn.yml @@ -37,7 +37,6 @@ nn: digest: Kun sendt etter en lang periode med inaktivitet og bare dersom du har mottatt noen personlige meldinger mens du var borte discoverable: La kontoen din bli oppdaga av ukjende gjennom anbefalingar, trendar og andre funksjonar email: Du får snart ein stadfestings-e-post - fields: Du kan ha opptil 4 gjenstander vist som en tabell på profilsiden din header: PNG, GIF eller JPG. Maksimalt %{size}. Minkast til %{dimensions}px inbox_url: Kopier URLen fra forsiden til overgangen du vil bruke irreversible: Filtrerte tut vil verta borte for evig, sjølv om filteret vert fjerna seinare diff --git a/config/locales/simple_form.no.yml b/config/locales/simple_form.no.yml index c8c76517d7..296f41a456 100644 --- a/config/locales/simple_form.no.yml +++ b/config/locales/simple_form.no.yml @@ -37,7 +37,6 @@ digest: Kun sendt etter en lang periode med inaktivitet og bare dersom du har mottatt noen personlige meldinger mens du var borte discoverable: La kontoen din bli oppdaget av ukjente gjennom anbefalinger, trender og andre funksjoner email: Du vil bli tilsendt en bekreftelses-E-post - fields: Du kan ha opptil 4 gjenstander vist som en tabell på profilsiden din header: PNG, GIF eller JPG. Maksimalt %{size}. Vil bli nedskalert til %{dimensions}px inbox_url: Kopier URLen fra forsiden til overgangen du vil bruke irreversible: Filtrerte innlegg vil ugjenkallelig forsvinne, selv om filteret senere blir fjernet diff --git a/config/locales/simple_form.oc.yml b/config/locales/simple_form.oc.yml index a3ae020b6b..6b5f2e2ddd 100644 --- a/config/locales/simple_form.oc.yml +++ b/config/locales/simple_form.oc.yml @@ -32,7 +32,6 @@ oc: current_username: Per confirmar, volgatz picar lo nom d’utilizaire del compte actual digest: Solament enviat aprèp un long moment d’inactivitat e solament s’avètz recebut de messatges personals pendent vòstra abséncia email: Vos mandarem un corrièl de confirmacion - fields: Podètz far veire cap a 4 elements sus vòstre perfil header: PNG, GIF o JPG. Maximum %{size}. Serà retalhada en %{dimensions}px inbox_url: Copiatz l’URL de la pagina màger del relai que volètz utilizar irreversible: Los tuts filtrats desapareisseràn irreversiblament, encara que lo filtre siá suprimit mai tard diff --git a/config/locales/simple_form.pl.yml b/config/locales/simple_form.pl.yml index 0347a24e63..765e27d6ab 100644 --- a/config/locales/simple_form.pl.yml +++ b/config/locales/simple_form.pl.yml @@ -39,7 +39,6 @@ pl: digest: Wysyłane tylko po długiej nieaktywności, jeżeli w tym czasie otrzymaleś jakąś wiadomość bezpośrednią discoverable: Pozwala na odkrywanie twojego konta przez nieznajomych poprzez rekomendacje, popularne wpisy i inne funkcje email: Otrzymasz e-mail potwierdzający - fields: Możesz ustawić maksymalnie 4 niestandardowe pola wyświetlane jako tabela na Twoim profilu header: PNG, GIF lub JPG. Maksymalnie %{size}. Zostanie zmniejszony do %{dimensions}px inbox_url: Skopiuj adres ze strony głównej przekaźnika, którego chcesz użyć irreversible: Filtrowane wpisy znikną bezpowrotnie, nawet gdy filtr zostanie usunięty diff --git a/config/locales/simple_form.pt-BR.yml b/config/locales/simple_form.pt-BR.yml index a8fa1fd012..44099aa000 100644 --- a/config/locales/simple_form.pt-BR.yml +++ b/config/locales/simple_form.pt-BR.yml @@ -39,7 +39,6 @@ pt-BR: digest: Enviado apenas após um longo período de inatividade com um resumo das menções recebidas durante ausência discoverable: Permita que a sua conta seja descoberta por estranhos através de recomendações, tendências e outros recursos email: Você receberá um e-mail de confirmação - fields: Você pode ter até 4 itens mostrados em forma de tabela no seu perfil header: PNG, GIF ou JPG de até %{size}. Serão redimensionados para %{dimensions}px inbox_url: Copie o link da página inicial do repetidor que você deseja usar irreversible: As publicações filtradas desaparecerão irreversivelmente, mesmo se o filtro for removido depois diff --git a/config/locales/simple_form.pt-PT.yml b/config/locales/simple_form.pt-PT.yml index e36dc3d5d7..e1067dd144 100644 --- a/config/locales/simple_form.pt-PT.yml +++ b/config/locales/simple_form.pt-PT.yml @@ -39,7 +39,6 @@ pt-PT: digest: Enviado após um longo período de inatividade e apenas se foste mencionado na tua ausência discoverable: Permitir que a sua conta seja descoberta por outros através de recomendações, destaques e outras funções email: Será enviado um e-mail de confirmação - fields: Pode ter até 4 elementos expostos, em forma de tabela, no seu perfil header: PNG, GIF ou JPG. Ficheiros no máximo de %{size}. Serão reduzidos para %{dimensions}px inbox_url: Copie o URL da página inicial do repetidor que quer usar irreversible: Publicações filtradas irão desaparecer irremediavelmente, mesmo que o filtro seja removido posteriormente diff --git a/config/locales/simple_form.ro.yml b/config/locales/simple_form.ro.yml index af3e000ac8..c76cf89cf1 100644 --- a/config/locales/simple_form.ro.yml +++ b/config/locales/simple_form.ro.yml @@ -30,7 +30,6 @@ ro: current_username: Pentru a confirma, vă rugăm să introduceţi numele de utilizator al contului curent digest: Este trimis doar după o lungă perioadă de inactivitate și numai dacă primești mesaje personale în perioada de absență email: Vei primi un e-mail de confirmare - fields: Poti afișa pană la maxim 4 adrese sub formă de tabel pe pofilul tău header: PNG, GIF sau JPG. Cel mult %{size}. Vor fi redimensionate la %{dimensions}px inbox_url: Copiază adresa URL de pe prima pagină a reului pe care vrei să îl utilizezi irreversible: Postările sortate vor dispărea ireversibil, chiar dacă filtrul este ulterior șters diff --git a/config/locales/simple_form.ru.yml b/config/locales/simple_form.ru.yml index caa1d83dfd..e23fef979c 100644 --- a/config/locales/simple_form.ru.yml +++ b/config/locales/simple_form.ru.yml @@ -39,7 +39,6 @@ ru: digest: Если вы долго не заглядывали, отправим вам дайджест событий, которые происходили в период вашего отсутствия. discoverable: Разрешить другим людям находить ваш профиль через рекомендации, тренды и другие функции. email: Вам будет отправлено электронное письмо с подтверждением. - fields: В профиле можно отобразить до 4 пунктов в виде таблицы. Например, ваши местоимения, часовой пояс или ссылку на свой сайт. header: Поддерживается PNG, GIF и JPG. Максимальный размер — %{size}. Будет уменьшена до %{dimensions}px. inbox_url: Копировать URL с главной страницы ретранслятора, который вы хотите использовать irreversible: Отфильтрованные посты будут утеряны навсегда, даже если в будущем фильтр будет убран diff --git a/config/locales/simple_form.sc.yml b/config/locales/simple_form.sc.yml index 07110da1dd..ad768a66d8 100644 --- a/config/locales/simple_form.sc.yml +++ b/config/locales/simple_form.sc.yml @@ -34,7 +34,6 @@ sc: current_username: Pro cunfirmare inserta su nòmine utente de su contu atuale digest: Imbiadu isceti a pustis de unu perìodu longu de inatividade, e isceti si as retzidu calicunu messàgiu personale cando non bi fias email: As a retzire unu messàgiu eletrònicu de cunfirma - fields: Podes tènnere finas a 4 elementos ammustrados in una tabella in su profilu tuo header: PNG, GIF o JPG. Màssimu %{size}. Ant a èssere iscaladas a %{dimensions}px inbox_url: Còpia s'URL dae sa pàgina printzipale de su ripetidore chi boles impreare irreversible: Is tuts filtrados ant a isparèssere in manera irreversìbile, fintzas si prus a tardu s'at a bogare su filtru diff --git a/config/locales/simple_form.sco.yml b/config/locales/simple_form.sco.yml index 85f075a15f..b061aa76d7 100644 --- a/config/locales/simple_form.sco.yml +++ b/config/locales/simple_form.sco.yml @@ -37,7 +37,6 @@ sco: digest: Ainly sent efter a lang whilie o inactivity an ainly if ye'v gotten onie personal messages whilst ye wis awa discoverable: Alloo yer accoont fir tae get discovert bi strangers throu recommendations, trends an ither features email: Ye'll be sent a confirmation email - fields: Ye kin hae up tae 4 items displayed as a table on yer profile header: PNG, GIF or JPG. At maist %{size}. Wull get doonscaled tae %{dimensions}px inbox_url: Copy the URL fae the frontpage o the relay thit ye'r wantin tae uise irreversible: Filtert posts wull dizappear irreversibly, even if filter is taen aff efter diff --git a/config/locales/simple_form.si.yml b/config/locales/simple_form.si.yml index d62c5a0eb9..a2571dcb1e 100644 --- a/config/locales/simple_form.si.yml +++ b/config/locales/simple_form.si.yml @@ -37,7 +37,6 @@ si: digest: දිගු කාලයක් අක්‍රියව සිටීමෙන් පසුව පමණක් යවන ලද අතර ඔබ නොමැති විට ඔබට කිසියම් පුද්ගලික පණිවිඩයක් ලැබී ඇත්නම් පමණි discoverable: නිර්දේශ, ප්‍රවණතා සහ වෙනත් විශේෂාංග හරහා ඔබේ ගිණුම ආගන්තුකයන්ට සොයා ගැනීමට ඉඩ දෙන්න email: ඔබට තහවුරු කිරීමේ විද්‍යුත් තැපෑලක් එවනු ලැබේ - fields: ඔබට ඔබගේ පැතිකඩෙහි වගුවක් ලෙස අයිතම 4ක් දක්වා පෙන්විය හැක header: PNG, GIF හෝ JPG. වැඩිම %{size}. %{dimensions}px දක්වා අඩු කරනු ඇත inbox_url: ඔබට භාවිතා කිරීමට අවශ්‍ය රිලේ හි මුල් පිටුවෙන් URL එක පිටපත් කරන්න irreversible: පෙරහන පසුව ඉවත් කළද, පෙරූ පළ කිරීම් ආපසු හැරවිය නොහැකි ලෙස අතුරුදහන් වනු ඇත diff --git a/config/locales/simple_form.sk.yml b/config/locales/simple_form.sk.yml index 35ebca0bba..3cadada4fa 100644 --- a/config/locales/simple_form.sk.yml +++ b/config/locales/simple_form.sk.yml @@ -23,7 +23,6 @@ sk: current_username: Pre potvrdenie prosím zadaj prezývku súčasného účtu digest: Odoslané iba v prípade dlhodobej neprítomnosti, a len ak si obdržal/a nejaké osobné správy kým si bol/a preč email: Bude ti odoslaný potvrdzujúci email - fields: Až štyri položky môžeš mať na svojom profile zobrazené vo forme tabuľky header: PNG, GIF, alebo JPG. Maximálne %{size}. Bude zmenšený na %{dimensions}px inbox_url: Skopíruj adresu z hlavnej stránky mostíka, ktorý chceš používať irreversible: Vytriedené príspevky zmiznú nenávratne, aj keď triedenie neskôr zrušíš diff --git a/config/locales/simple_form.sl.yml b/config/locales/simple_form.sl.yml index c10da4a815..a9c902f900 100644 --- a/config/locales/simple_form.sl.yml +++ b/config/locales/simple_form.sl.yml @@ -39,7 +39,6 @@ sl: digest: Pošlje se le po dolgem obdobju nedejavnosti in samo, če ste prejeli osebna sporočila v vaši odsotnosti discoverable: Dovolite, da vaš račun odkrijejo neznanci prek priporočil, trendov in drugih funkcij email: Poslali vam bomo potrditveno e-pošto - fields: Na svojem profilu lahko imate do 4 predmete prikazane kot tabelo. header: PNG, GIF ali JPG. Največ %{size}. Zmanjšana bo na %{dimensions}px inbox_url: Kopirajte URL naslov s prve strani releja, ki ga želite uporabiti irreversible: Filtrirane objave bodo nepovratno izginile, tudi če je filter kasneje odstranjen diff --git a/config/locales/simple_form.sq.yml b/config/locales/simple_form.sq.yml index d54d43088b..e3e46a1a51 100644 --- a/config/locales/simple_form.sq.yml +++ b/config/locales/simple_form.sq.yml @@ -39,7 +39,6 @@ sq: digest: I dërguar vetëm pas një periudhe të gjatë pasiviteti dhe vetëm nëse keni marrë ndonjë mesazh personal gjatë mungesës tuaj discoverable: Lejoni që llogaria juaj të zbulohet nga të huaj përmes rekomandimesh, gjërash në modë dhe veçorish të tjera email: Do t’ju dërgohet një email ripohimi - fields: Te profili juaj mund të keni deri në 4 objekte të shfaqur si tabelë header: PNG, GIF ose JPG. E shumta %{size}. Do të ripërmasohet në %{dimensions}px inbox_url: Kopjoni URL-në prej faqes ballore të relesë që doni të përdorni irreversible: Mesazhet e filtruar do të zhduken në mënyrë të pakthyeshme, edhe nëse filtri hiqet më vonë diff --git a/config/locales/simple_form.sr-Latn.yml b/config/locales/simple_form.sr-Latn.yml index e268fd20ee..ff40fee88c 100644 --- a/config/locales/simple_form.sr-Latn.yml +++ b/config/locales/simple_form.sr-Latn.yml @@ -39,7 +39,6 @@ sr-Latn: digest: Šalje se samo posle dužeg perioda neaktivnosti i samo u slučaju da ste primili jednu ili više ličnih poruka tokom Vašeg odsustva discoverable: Dozvolite nepoznatim korisnicima da otkriju Vaš nalog putem preporuka, trendova i drugih funkcija email: Biće Vam poslat mejl sa potvrdom - fields: Možete imati do 4 stavke prikazane kao tabela na svom profilu header: PNG, GIF ili JPG. Najviše %{size}. Biće smanjeno na %{dimensions}px inbox_url: Kopirajte URL sa naslovne strane releja koji želite koristiti irreversible: Filtrirane obajve će nestati nepovratno, čak i ako je filter kasnije uklonjen diff --git a/config/locales/simple_form.sr.yml b/config/locales/simple_form.sr.yml index 209f458c66..39318481b5 100644 --- a/config/locales/simple_form.sr.yml +++ b/config/locales/simple_form.sr.yml @@ -39,7 +39,6 @@ sr: digest: Шаље се само после дужег периода неактивности и само у случају да сте примили једну или више личних порука током Вашег одсуства discoverable: Дозволите непознатим корисницима да открију Ваш налог путем препорука, трендова и других функција email: Биће Вам послат мејл са потврдом - fields: Можете имати до 4 ставке приказане као табела на свом профилу header: PNG, GIF или JPG. Највише %{size}. Биће смањено на %{dimensions}px inbox_url: Копирајте URL са насловне стране релеја који желите користити irreversible: Филтриранe обајве ће нестати неповратно, чак и ако је филтер касније уклоњен diff --git a/config/locales/simple_form.sv.yml b/config/locales/simple_form.sv.yml index 4da2e2b290..30cc3c83ed 100644 --- a/config/locales/simple_form.sv.yml +++ b/config/locales/simple_form.sv.yml @@ -39,7 +39,6 @@ sv: digest: Skickas endast efter en lång period av inaktivitet och endast om du har fått några personliga meddelanden i din frånvaro discoverable: Tillåt att ditt konto upptäcks av främlingar genom rekommendationer, trender och andra funktioner email: Du kommer att få ett bekräftelsemeddelande via e-post - fields: Du kan ha upp till 4 objekt visade som en tabell på din profil header: PNG, GIF eller JPG. Högst %{size}. Kommer att skalas ner till %{dimensions}px inbox_url: Kopiera webbadressen från hemsidan av det ombud du vill använda irreversible: Filtrerade inlägg kommer att försvinna oåterkalleligt, även om filter tas bort senare diff --git a/config/locales/simple_form.th.yml b/config/locales/simple_form.th.yml index 249ec3cde9..6dd5c015d6 100644 --- a/config/locales/simple_form.th.yml +++ b/config/locales/simple_form.th.yml @@ -39,7 +39,6 @@ th: digest: ส่งเฉพาะหลังจากไม่มีการใช้งานเป็นเวลานานและในกรณีที่คุณได้รับข้อความส่วนบุคคลใด ๆ เมื่อคุณไม่อยู่เท่านั้น discoverable: อนุญาตให้คนแปลกหน้าค้นพบบัญชีของคุณได้ผ่านคำแนะนำ, แนวโน้ม และคุณลักษณะอื่น ๆ email: คุณจะได้รับอีเมลการยืนยัน - fields: คุณสามารถมีได้มากถึง 4 รายการแสดงเป็นตารางในโปรไฟล์ของคุณ header: PNG, GIF หรือ JPG สูงสุด %{size} จะได้รับการย่อขนาดเป็น %{dimensions}px inbox_url: คัดลอก URL จากหน้าแรกของรีเลย์ที่คุณต้องการใช้ irreversible: โพสต์ที่กรองอยู่จะหายไปอย่างถาวร แม้ว่าจะเอาตัวกรองออกในภายหลังก็ตาม diff --git a/config/locales/simple_form.tr.yml b/config/locales/simple_form.tr.yml index fcb187593d..5b9b07683b 100644 --- a/config/locales/simple_form.tr.yml +++ b/config/locales/simple_form.tr.yml @@ -39,7 +39,6 @@ tr: digest: Sadece uzun bir süre hareketsiz kaldıktan sonra ve yalnızca yokluğunuzda herhangi bir kişisel mesaj aldıysanız gönderilir discoverable: Hesabınızın öneriler, trendler ve diğer özellikler aracılığıyla yabancılar tarafından keşfedilmesine izin verin email: Onay e-postası gönderilir - fields: Profilinizde tablo olarak görüntülenen en fazla 4 ögeye sahip olabilirsiniz header: PNG, GIF ya da JPG. En fazla %{size}. %{dimensions}px boyutuna küçültülecek inbox_url: Kullanmak istediğiniz aktarıcının ön sayfasından URL'yi kopyalayın irreversible: Filtrelenmiş gönderiler, filtre daha sonra kaldırılsa bile, geri dönüşümsüz biçimde kaybolur diff --git a/config/locales/simple_form.uk.yml b/config/locales/simple_form.uk.yml index fa67454d62..767b86e02f 100644 --- a/config/locales/simple_form.uk.yml +++ b/config/locales/simple_form.uk.yml @@ -39,7 +39,6 @@ uk: digest: Буде послано тільки після довгого періоду неактивності, та тільки якщо ви отримаєте персональне повідомлення у цей період discoverable: Дозволити знаходити ваш обліковий запис стороннім людям за допомогою рекомендацій, трендів та інших функцій email: Вам надійде електронний лист з підтвердженням - fields: У вашому профілі може бути показано таблицю з 4 елементів header: PNG, GIF, або JPG. Максимум - %{size}. Буде зменшено до %{dimensions}px inbox_url: Скопіюйте інтернет-адресу з титульної сторінки ретранслятора irreversible: Відфільтровані дописи зникнуть назавжди, навіть якщо фільтр потім буде вилучено diff --git a/config/locales/simple_form.vi.yml b/config/locales/simple_form.vi.yml index cfb4dc5ba3..6001c421bc 100644 --- a/config/locales/simple_form.vi.yml +++ b/config/locales/simple_form.vi.yml @@ -39,7 +39,6 @@ vi: digest: Chỉ gửi sau một thời gian dài không hoạt động hoặc khi bạn nhận được tin nhắn (trong thời gian vắng mặt) discoverable: Cho phép tài khoản của bạn xuất hiện trong gợi ý theo dõi, thịnh hành và những tính năng khác email: Bạn sẽ được gửi một email xác nhận - fields: Được phép thêm tối đa 4 mục trên trang hồ sơ của bạn header: PNG, GIF hoặc JPG, tối đa %{size}. Sẽ bị nén xuống %{dimensions}px inbox_url: Sao chép URL của máy chủ mà bạn muốn dùng irreversible: Các tút đã lọc sẽ không thể phục hồi, kể cả sau khi xóa bộ lọc diff --git a/config/locales/simple_form.zh-CN.yml b/config/locales/simple_form.zh-CN.yml index 6900de04b0..41f6a546fc 100644 --- a/config/locales/simple_form.zh-CN.yml +++ b/config/locales/simple_form.zh-CN.yml @@ -39,7 +39,6 @@ zh-CN: digest: 仅在你长时间未登录,且收到了私信时发送 discoverable: 允许他人通过推荐、热门和其他途径发现你的账户 email: 我们会向你发送一封确认邮件 - fields: 这将会在个人资料页上以表格的形式展示,最多 4 个项目 header: 文件大小限制 %{size},只支持 PNG、GIF 或 JPG 格式。图片分辨率将会压缩至 %{dimensions}px inbox_url: 从你想要使用的中继站的主页上复制 URL irreversible: 已过滤的嘟文会不可逆转地消失,即便移除过滤器之后也一样 diff --git a/config/locales/simple_form.zh-HK.yml b/config/locales/simple_form.zh-HK.yml index d1ccbbe8af..0f18d1fc9d 100644 --- a/config/locales/simple_form.zh-HK.yml +++ b/config/locales/simple_form.zh-HK.yml @@ -39,7 +39,6 @@ zh-HK: digest: 僅在你長時間未登錄,且收到了私信時發送 discoverable: 允許陌生人從推薦、趨勢及其他功能發現你的帳號 email: 你將收到一封確認電郵 - fields: 個人資料頁可顯示多至 4 個項目 header: 支援 PNG, GIF 或 JPG 圖片,檔案最大為 %{size},會縮裁成 %{dimensions}px inbox_url: 在你想要使用的中繼站首頁,複製它的網址 irreversible: 文章過濾是不可還原的,即使日後過濾器被移除,也無法重新看到被它濾走的文章 diff --git a/config/locales/simple_form.zh-TW.yml b/config/locales/simple_form.zh-TW.yml index 61d16068d6..52cd57f776 100644 --- a/config/locales/simple_form.zh-TW.yml +++ b/config/locales/simple_form.zh-TW.yml @@ -39,7 +39,6 @@ zh-TW: digest: 僅在您長時間未登入且在未登入期間收到私訊時傳送 discoverable: 允許陌生人透過推薦、熱門趨勢及其他功能發現您的帳號 email: 您將收到一封確認電子郵件 - fields: 您可在個人檔案上有至多 4 個以表格形式顯示的項目 header: 支援 PNG、GIF 或 JPG 圖片格式,檔案最大為 %{size},會等比例縮減至 %{dimensions} 像素 inbox_url: 從您想要使用的中繼首頁複製網址 irreversible: 已過濾的嘟文將會不可逆地消失,即便之後移除過濾器也一樣 diff --git a/config/locales/sk.yml b/config/locales/sk.yml index 5bc1c0a25a..674c111643 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -680,7 +680,6 @@ sk: warning: Na tieto údaje dávaj ohromný pozor. Nikdy ich s nikým nezďieľaj! your_token: Tvoj prístupový token auth: - change_password: Heslo delete_account: Vymaž účet delete_account_html: Pokiaľ chceš svoj účet odtiaľto vymazať, môžeš tak urobiť tu. Budeš požiadaný/á o potvrdenie tohto kroku. description: diff --git a/config/locales/sl.yml b/config/locales/sl.yml index 4646fb96b4..3891d5a590 100644 --- a/config/locales/sl.yml +++ b/config/locales/sl.yml @@ -1015,7 +1015,6 @@ sl: your_token: Vaš dostopni žeton auth: apply_for_account: Zaprosite za račun - change_password: Geslo confirmations: wrong_email_hint: Če ta e-poštni naslov ni pravilen, ga lahko spremenite v nastavitvah računa. delete_account: Izbriši račun @@ -1768,7 +1767,6 @@ sl: seamless_external_login: Prijavljeni ste prek zunanje storitve, tako da nastavitve gesla in e-pošte niso na voljo. signed_in_as: 'Vpisani kot:' verification: - explanation_html: 'V metapodatkih svojega profila se lahko potrdite kot lastnik povezav. Za to mora povezano spletno mesto vsebovati povezavo do vašega profila Mastodon. Po dodajanju povezave se boste morda morali vrniti sem in ponovno shraniti svoj profil, da bo overjanje učinkovalo. Povezava mora imeti atribut el="me". Vsebina besedila povezave ni pomembna. Tukaj je primer:' verification: Potrditev webauthn_credentials: add: Dodaj nov varnostni ključ diff --git a/config/locales/sq.yml b/config/locales/sq.yml index 2d2dfa2d52..215f8d738a 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -973,7 +973,6 @@ sq: your_token: Token-i juaj për hyrje auth: apply_for_account: Kërkoni një llogari - change_password: Fjalëkalim confirmations: wrong_email_hint: Nëse ajo adresë email s’është e saktë, mund ta ndryshoni te rregullimet e llogarisë. delete_account: Fshije llogarinë @@ -1697,7 +1696,6 @@ sq: seamless_external_login: Jeni futur përmes një shërbimi të jashtëm, ndaj s’ka rregullime fjalëkalimi dhe email. signed_in_as: 'I futur si:' verification: - explanation_html: 'Mundeni të verifikoni veten si i zoti i lidhjeve që nga tejtëdhëna të profilit tuaj. Për këtë, sajti i lidhur duhet të përmbajë një lidhje që shpie te profili juaj Mastodon. Pas shtimit të lidhjes mund t’ju duhet të ktheheni këtu dhe të riruani profilin tuaj, që verifikimi të ketë efekt. Lidhja e kthimit duhet të përmbajë një atribut rel="me". Teksi i lidhjes s’ka rëndësi. Ja një shembull:' verification: Verifikim webauthn_credentials: add: Shtoni kyç të ri sigurie diff --git a/config/locales/sr-Latn.yml b/config/locales/sr-Latn.yml index 2a69dee3b2..45be415e2f 100644 --- a/config/locales/sr-Latn.yml +++ b/config/locales/sr-Latn.yml @@ -995,7 +995,6 @@ sr-Latn: your_token: Vaš pristupni token auth: apply_for_account: Zatražite nalog - change_password: Lozinka confirmations: wrong_email_hint: Ako ta imejl adresa nije ispravna, možete je promeniti u podešavanjima naloga. delete_account: Brisanje naloga diff --git a/config/locales/sr.yml b/config/locales/sr.yml index 1fd785abd5..e0c1a06adc 100644 --- a/config/locales/sr.yml +++ b/config/locales/sr.yml @@ -997,7 +997,6 @@ sr: your_token: Ваш приступни токен auth: apply_for_account: Затражите налог - change_password: Лозинка confirmations: wrong_email_hint: Ако та имејл адреса није исправна, можете је променити у подешавањима налога. delete_account: Брисање налога @@ -1736,7 +1735,6 @@ sr: seamless_external_login: Пријављени сте путем спољашње услуге, тако да лозинка и подешавања Е-поште нису доступни. signed_in_as: 'Пријављен/а као:' verification: - explanation_html: 'Можете да се верификујете као власник веза у метаподацима профила. За то је потребно да повезани веб сајт мора садржати везу до вашег Mastodon профила. Након што додате везу, можда ћете морати да се вратите овде и поново сачувате свој профил да би верификација ступила на снагу. Повратна веза мора имати атрибут rel="me". Текстуални садржај везе није битан. Ево примера:' verification: Провера webauthn_credentials: add: Додајте нови сигурносни кључ diff --git a/config/locales/sv.yml b/config/locales/sv.yml index 4e93e6390f..eabd2b566d 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -979,7 +979,6 @@ sv: your_token: Din access token auth: apply_for_account: Ansök om konto - change_password: Lösenord confirmations: wrong_email_hint: Om e-postadressen inte är rätt, kan du ändra den i kontoinställningarna. delete_account: Radera konto @@ -1697,7 +1696,6 @@ sv: seamless_external_login: Du är inloggad via en extern tjänst, inställningar för lösenord och e-post är därför inte tillgängliga. signed_in_as: 'Inloggad som:' verification: - explanation_html: 'Du kan bekräfta att du är ägare till länkarna i dina profilmetadata. För detta krävs att den länkade webbplatsen innehåller en länk tillbaka till din Mastodon-profil. När du har lagt till länken kan du behöva komma tillbaka hit och spara din profil på nytt för att verifieringen ska träda i kraft. Tillbakalänken måste ha attributet rel="me". Länkens textinnehåll spelar ingen roll. Här är ett exempel:' verification: Bekräftelse webauthn_credentials: add: Lägg till ny säkerhetsnyckel diff --git a/config/locales/th.yml b/config/locales/th.yml index 1bf1357630..5517cd4b15 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -961,7 +961,6 @@ th: your_token: โทเคนการเข้าถึงของคุณ auth: apply_for_account: ขอบัญชี - change_password: รหัสผ่าน confirmations: wrong_email_hint: หากที่อยู่อีเมลนั้นไม่ถูกต้อง คุณสามารถเปลี่ยนที่อยู่อีเมลได้ในการตั้งค่าบัญชี delete_account: ลบบัญชี @@ -1672,7 +1671,6 @@ th: seamless_external_login: คุณได้เข้าสู่ระบบผ่านบริการภายนอก ดังนั้นจึงไม่มีการตั้งค่ารหัสผ่านและอีเมล signed_in_as: 'ลงชื่อเข้าเป็น:' verification: - explanation_html: 'คุณสามารถ ยืนยันตัวคุณเองว่าเป็นเจ้าของของลิงก์ในข้อมูลอภิพันธุ์โปรไฟล์ของคุณ สำหรับสิ่งนั้น เว็บไซต์ที่เชื่อมโยงต้องมีลิงก์ย้อนกลับไปยังโปรไฟล์ Mastodon ของคุณ หลังจากการเพิ่มลิงก์คุณอาจจำเป็นต้องกลับมาที่นี่และบันทึกโปรไฟล์ของคุณใหม่เพื่อให้การตรวจสอบมีผล ลิงก์ย้อนกลับ ต้อง มีแอตทริบิวต์ rel="me" เนื้อหาข้อความของลิงก์ไม่สำคัญ นี่คือตัวอย่าง:' verification: การตรวจสอบ webauthn_credentials: add: เพิ่มกุญแจความปลอดภัยใหม่ diff --git a/config/locales/tr.yml b/config/locales/tr.yml index d3c035a91c..4ad36c1d43 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -979,7 +979,6 @@ tr: your_token: Erişim belirteciniz auth: apply_for_account: Bir hesap talep et - change_password: Parola confirmations: wrong_email_hint: Eğer bu e-posta adresi doğru değilse, hesap ayarlarında değiştirebilirsiniz. delete_account: Hesabı sil @@ -1704,7 +1703,6 @@ tr: seamless_external_login: Harici bir servis aracılığıyla oturum açtınız, bu nedenle parola ve e-posta ayarları mevcut değildir. signed_in_as: 'Oturum açtı:' verification: - explanation_html: 'Profil meta verisindeki bağlantıların sahibi olarak kendinizi doğrulayabilirsiniz. Bunun için, bağlantısı verilen web sitesi Mastodon profilinize bir bağlantı içermelidir. Doğrulamanın gerçekleşmesi için bağlantıyı ekledikten sonra buraya gelip profilinizi tekrar kaydetmelisiniz. Geri bağlantı bir rel="me" özelliğine sahip olmalıdır. Bağlantının metin içeriği önemli değildir. İşte bir örnek:' verification: Doğrulama webauthn_credentials: add: Yeni güvenlik anahtarı ekle diff --git a/config/locales/tt.yml b/config/locales/tt.yml index 642ef8233c..3e012b3315 100644 --- a/config/locales/tt.yml +++ b/config/locales/tt.yml @@ -111,7 +111,6 @@ tt: application_mailer: salutation: "%{name}," auth: - change_password: Серсүз login: Керү providers: cas: САS diff --git a/config/locales/uk.yml b/config/locales/uk.yml index 004c7565f9..a7a5db3a77 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -1015,7 +1015,6 @@ uk: your_token: Ваш токен доступу auth: apply_for_account: Запит облікового запису - change_password: Пароль confirmations: wrong_email_hint: Якщо ця адреса електронної пошти неправильна, можна змінити її в налаштуваннях облікового запису. delete_account: Видалити обліковий запис @@ -1768,7 +1767,6 @@ uk: seamless_external_login: Ви увійшли за допомогою зовнішнього сервісу, тому налаштування паролю та електронної пошти недоступні. signed_in_as: 'Ви увійшли як:' verification: - explanation_html: 'Ви можете підтвердити володіння посиланнями в метаданих вашого профілю. Для цього на зазначеному сайті повинен міститися посилання на ваш профіль Mastodon. Посилання повинне мати атрибут rel="me". Текстовий вміст посилання не має значення. Ось приклад:' verification: Підтвердження webauthn_credentials: add: Додати новий ключ безпеки diff --git a/config/locales/vi.yml b/config/locales/vi.yml index 92a90e52c1..fa46e1c100 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -961,7 +961,6 @@ vi: your_token: Mã truy cập của bạn auth: apply_for_account: Xin đăng ký - change_password: Mật khẩu confirmations: wrong_email_hint: Nếu địa chỉ email đó không chính xác, bạn có thể thay đổi nó trong cài đặt tài khoản. delete_account: Xóa tài khoản @@ -1672,7 +1671,6 @@ vi: seamless_external_login: Bạn đã đăng nhập thông qua một dịch vụ bên ngoài, vì vậy mật khẩu và email không khả dụng. signed_in_as: 'Đăng nhập với tư cách là:' verification: - explanation_html: 'Bạn có thể xác minh mình là chủ sở hữu của các trang web ở đầu trang hồ sơ của bạn. Để xác minh, trang web phải chèn mã rel="me". Văn bản thay thế cho liên kết không quan trọng. Đây là một ví dụ:' verification: Xác minh webauthn_credentials: add: Thêm khóa bảo mật mới diff --git a/config/locales/zgh.yml b/config/locales/zgh.yml index 3cbd31de59..e75da3429c 100644 --- a/config/locales/zgh.yml +++ b/config/locales/zgh.yml @@ -70,7 +70,6 @@ zgh: application_mailer: view_profile: ⵙⴽⵏ ⵉⴼⵔⵙ auth: - change_password: ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ forgot_password: ⵜⴻⵜⵜⵓⴷ ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵏⵏⴽ? login: ⴽⵛⵎ logout: ⴼⴼⵖ diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index 3ace89be35..39f1ed1ced 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -961,7 +961,6 @@ zh-CN: your_token: 你的访问令牌 auth: apply_for_account: 申请账号 - change_password: 密码 confirmations: wrong_email_hint: 如果该电子邮件地址不正确,您可以在帐户设置中进行更改。 delete_account: 删除帐户 @@ -1672,7 +1671,6 @@ zh-CN: seamless_external_login: 因为你是通过外部服务登录的,所以密码和电子邮件地址设置都不可用。 signed_in_as: 当前登录的账户: verification: - explanation_html: 您可以 验证自己是个人资料元数据中的链接的所有者 。为此,链接的网站必须包含返回到您的 Mastodon 个人资料的链接。添加链接后,您可能需要回到这里并重新保存个人资料以使验证生效。 必须 在返回链接上使用 rel="me" 属性。 链接的文本内容无关紧要。以下是一个示例: verification: 验证 webauthn_credentials: add: 添加新的安全密钥 diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml index da654947b0..354b20e027 100644 --- a/config/locales/zh-HK.yml +++ b/config/locales/zh-HK.yml @@ -959,7 +959,6 @@ zh-HK: your_token: token auth: apply_for_account: 申請帳號 - change_password: 密碼 confirmations: wrong_email_hint: 如果該電郵地址不正確,你可以在帳號設定中修改。 delete_account: 刪除帳號 @@ -1656,7 +1655,6 @@ zh-HK: seamless_external_login: 因為你正在使用第三方服務登入,所以不能設定密碼和電郵。 signed_in_as: 目前登入的帳戶: verification: - explanation_html: 你可以在你的個人檔案元數據中驗證自己是連結的擁有者。為此,連接的網站必須包含一條回到你 Mastodon 個人檔案的連結。加入連結後,你可能需要回到這裏,再次儲存你的個人檔案以便驗證生效。返回的連結必須有一個rel="me"的屬性。當中的文字內容並不重要。以下有一個例子: verification: 驗證 webauthn_credentials: add: 新增安全密鑰裝置 diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index 51e43e3f84..d0f9fd8e02 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -963,7 +963,6 @@ zh-TW: your_token: 您的 access token auth: apply_for_account: 申請帳號 - change_password: 密碼 confirmations: wrong_email_hint: 若電子郵件地址不正確,您可以於帳號設定中更改。 delete_account: 刪除帳號 @@ -1674,7 +1673,6 @@ zh-TW: seamless_external_login: 由於您是由外部系統登入,所以不能設定密碼與電子郵件。 signed_in_as: 目前登入的帳號: verification: - explanation_html: 您可以透過以個人檔案頁上列出連結的方式,驗證您確實掌控該連結網頁的內容。為此,您可以在連結的網頁中加入一個連回 Mastodon 個人檔案頁面的連結。新增此連結之後,您可能要回到這裡並重新儲存您的個人檔案以使該驗證生效。該連結的原始碼 必須包含rel="me"屬性。連結的顯示文字則可自由發揮,以下為範例: verification: 驗證連結 webauthn_credentials: add: 新增安全金鑰 diff --git a/config/navigation.rb b/config/navigation.rb index 4b829c151a..c4914cd995 100644 --- a/config/navigation.rb +++ b/config/navigation.rb @@ -3,11 +3,7 @@ SimpleNavigation::Configuration.run do |navigation| navigation.items do |n| n.item :web, safe_join([fa_icon('chevron-left fw'), t('settings.back')]), root_path - - n.item :profile, safe_join([fa_icon('user fw'), t('settings.profile')]), settings_profile_path, if: -> { current_user.functional? } do |s| - s.item :profile, safe_join([fa_icon('pencil fw'), t('settings.appearance')]), settings_profile_path - s.item :featured_tags, safe_join([fa_icon('hashtag fw'), t('settings.featured_tags')]), settings_featured_tags_path - end + n.item :profile, safe_join([fa_icon('user fw'), t('settings.profile')]), settings_profile_path, if: -> { current_user.functional? }, highlights_on: %r{/settings/profile|/settings/featured_tags|/settings/verification} n.item :preferences, safe_join([fa_icon('cog fw'), t('settings.preferences')]), settings_preferences_path, if: -> { current_user.functional? } do |s| s.item :appearance, safe_join([fa_icon('desktop fw'), t('settings.appearance')]), settings_preferences_appearance_path diff --git a/config/routes/settings.rb b/config/routes/settings.rb index 875cf2cad0..194fe9280d 100644 --- a/config/routes/settings.rb +++ b/config/routes/settings.rb @@ -60,6 +60,7 @@ namespace :settings do resource :delete, only: [:show, :destroy] resource :migration, only: [:show, :create] + resource :verification, only: :show namespace :migration do resource :redirect, only: [:new, :create, :destroy] From ec59166844b04ec416bdbc2612fd8a4364f9dd67 Mon Sep 17 00:00:00 2001 From: Claire Date: Wed, 14 Jun 2023 08:54:52 +0200 Subject: [PATCH 022/118] Fix ArgumentError when loading newer Private Mentions (#25399) --- .../api/v1/conversations_controller.rb | 2 +- app/models/account_conversation.rb | 19 +++++++++---------- .../api/v1/conversations_controller_spec.rb | 18 ++++++++++++++++++ 3 files changed, 28 insertions(+), 11 deletions(-) diff --git a/app/controllers/api/v1/conversations_controller.rb b/app/controllers/api/v1/conversations_controller.rb index c55500f761..63644f85e2 100644 --- a/app/controllers/api/v1/conversations_controller.rb +++ b/app/controllers/api/v1/conversations_controller.rb @@ -45,7 +45,7 @@ class Api::V1::ConversationsController < Api::BaseController }, ] ) - .to_a_paginated_by_id(limit_param(LIMIT), **params_slice(:max_id, :since_id, :min_id)) + .to_a_paginated_by_id(limit_param(LIMIT), params_slice(:max_id, :since_id, :min_id)) end def insert_pagination_headers diff --git a/app/models/account_conversation.rb b/app/models/account_conversation.rb index 95faece1b9..32fe79ccf7 100644 --- a/app/models/account_conversation.rb +++ b/app/models/account_conversation.rb @@ -43,22 +43,21 @@ class AccountConversation < ApplicationRecord end class << self - def to_a_paginated_by_id(limit, min_id: nil, max_id: nil, since_id: nil, preload_participants: true) + def to_a_paginated_by_id(limit, options = {}) array = begin - if min_id - paginate_by_min_id(limit, min_id, max_id).reverse + if options[:min_id] + paginate_by_min_id(limit, options[:min_id], options[:max_id]).reverse else - paginate_by_max_id(limit, max_id, since_id).to_a + paginate_by_max_id(limit, options[:max_id], options[:since_id]).to_a end end - if preload_participants - participant_ids = array.flat_map(&:participant_account_ids) - accounts_by_id = Account.where(id: participant_ids).index_by(&:id) + # Preload participants + participant_ids = array.flat_map(&:participant_account_ids) + accounts_by_id = Account.where(id: participant_ids).index_by(&:id) - array.each do |conversation| - conversation.participant_accounts = conversation.participant_account_ids.filter_map { |id| accounts_by_id[id] } - end + array.each do |conversation| + conversation.participant_accounts = conversation.participant_account_ids.filter_map { |id| accounts_by_id[id] } end array diff --git a/spec/controllers/api/v1/conversations_controller_spec.rb b/spec/controllers/api/v1/conversations_controller_spec.rb index f888517154..f8a5985634 100644 --- a/spec/controllers/api/v1/conversations_controller_spec.rb +++ b/spec/controllers/api/v1/conversations_controller_spec.rb @@ -35,5 +35,23 @@ RSpec.describe Api::V1::ConversationsController do json = body_as_json expect(json.size).to eq 1 end + + context 'with since_id' do + context 'when requesting old posts' do + it 'returns conversations' do + get :index, params: { since_id: Mastodon::Snowflake.id_at(1.hour.ago, with_random: false) } + json = body_as_json + expect(json.size).to eq 1 + end + end + + context 'when requesting posts in the future' do + it 'returns no conversation' do + get :index, params: { since_id: Mastodon::Snowflake.id_at(1.hour.from_now, with_random: false) } + json = body_as_json + expect(json.size).to eq 0 + end + end + end end end From f20698000f77e05634c49d1632051f172b4845a8 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Wed, 14 Jun 2023 09:05:03 +0200 Subject: [PATCH 023/118] Fix always redirecting to onboarding in web UI (#25396) --- app/controllers/auth/confirmations_controller.rb | 4 +++- app/javascript/mastodon/features/ui/index.jsx | 5 ----- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/app/controllers/auth/confirmations_controller.rb b/app/controllers/auth/confirmations_controller.rb index c57eb946e1..632b624a37 100644 --- a/app/controllers/auth/confirmations_controller.rb +++ b/app/controllers/auth/confirmations_controller.rb @@ -83,8 +83,10 @@ class Auth::ConfirmationsController < Devise::ConfirmationsController def after_confirmation_path_for(_resource_name, user) if user.created_by_application && truthy_param?(:redirect_to_app) user.created_by_application.confirmation_redirect_uri + elsif user_signed_in? + web_url('start') else - super + new_user_session_path end end end diff --git a/app/javascript/mastodon/features/ui/index.jsx b/app/javascript/mastodon/features/ui/index.jsx index fb43ba9e5e..d40fefb39f 100644 --- a/app/javascript/mastodon/features/ui/index.jsx +++ b/app/javascript/mastodon/features/ui/index.jsx @@ -393,11 +393,6 @@ class UI extends PureComponent { navigator.serviceWorker.addEventListener('message', this.handleServiceWorkerPostMessage); } - // On first launch, redirect to the follow recommendations page - if (signedIn && this.props.firstLaunch) { - this.context.router.history.replace('/start'); - } - if (signedIn) { this.props.dispatch(fetchMarkers()); this.props.dispatch(expandHomeTimeline()); From 780d54e5c397b292b3f1779c760af729987fce9b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 14 Jun 2023 09:05:30 +0200 Subject: [PATCH 024/118] Update dependency aws-sdk-s3 to v1.124.0 (#25297) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index ad789db1e2..4476ae90e2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -97,16 +97,16 @@ GEM attr_required (1.0.1) awrence (1.2.1) aws-eventstream (1.2.0) - aws-partitions (1.772.0) + aws-partitions (1.779.0) aws-sdk-core (3.174.0) aws-eventstream (~> 1, >= 1.0.2) aws-partitions (~> 1, >= 1.651.0) aws-sigv4 (~> 1.5) jmespath (~> 1, >= 1.6.1) - aws-sdk-kms (1.65.0) + aws-sdk-kms (1.66.0) aws-sdk-core (~> 3, >= 3.174.0) aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.123.0) + aws-sdk-s3 (1.124.0) aws-sdk-core (~> 3, >= 3.174.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.4) From a99201c735a667ff3f8e14de604828dbd4188d75 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 14 Jun 2023 09:21:30 +0200 Subject: [PATCH 025/118] Update dependency capybara to v3.39.2 (#25407) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 4476ae90e2..3e9ec14914 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -154,7 +154,7 @@ GEM sshkit (~> 1.3) capistrano-yarn (2.0.2) capistrano (~> 3.0) - capybara (3.39.1) + capybara (3.39.2) addressable matrix mini_mime (>= 0.1.3) From ae2790d84fcaa38fd205705157743ecb963ce8ae Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 14 Jun 2023 09:22:54 +0200 Subject: [PATCH 026/118] Update babel monorepo to v7.22.5 (#25405) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Renaud Chaput --- babel.config.js | 5 +- yarn.lock | 1493 ++++++++++++++++++++++++----------------------- 2 files changed, 780 insertions(+), 718 deletions(-) diff --git a/babel.config.js b/babel.config.js index 0eb877cc32..f53e5918cb 100644 --- a/babel.config.js +++ b/babel.config.js @@ -12,6 +12,9 @@ module.exports = (api) => { debug: false, include: [ 'transform-numeric-separator', + 'transform-optional-chaining', + 'transform-nullish-coalescing-operator', + 'transform-class-properties', ], }; @@ -24,8 +27,6 @@ module.exports = (api) => { plugins: [ ['formatjs'], 'preval', - '@babel/plugin-transform-optional-chaining', - '@babel/plugin-transform-nullish-coalescing-operator', ], overrides: [ { diff --git a/yarn.lock b/yarn.lock index 22be8dd1cf..1dbb6edfdc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8,11 +8,11 @@ integrity sha512-+u76oB43nOHrF4DDWRLWDCtci7f3QJoEBigemIdIeTi1ODqjx6Tad9NCVnPRwewWlKkVab5PlK8DCtPTyX7S8g== "@ampproject/remapping@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" - integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== + version "2.2.1" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== dependencies: - "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" "@apideck/better-ajv-errors@^0.3.1": @@ -31,10 +31,17 @@ dependencies: "@babel/highlight" "^7.18.6" -"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.22.0", "@babel/compat-data@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.3.tgz#cd502a6a0b6e37d7ad72ce7e71a7160a3ae36f7e" - integrity sha512-aNtko9OPOwVESUFp3MZfD8Uzxl7JzSeJpd7npIoxCasU37PFbAQRpKglkaKwlHOyeJdrREpo8TW8ldrkYWwvIQ== +"@babel/code-frame@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.5.tgz#234d98e1551960604f1246e6475891a570ad5658" + integrity sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ== + dependencies: + "@babel/highlight" "^7.22.5" + +"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.22.0", "@babel/compat-data@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.5.tgz#b1f6c86a02d85d2dd3368a2b67c09add8cd0c255" + integrity sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA== "@babel/core@^7.10.4", "@babel/core@^7.11.1", "@babel/core@^7.11.6", "@babel/core@^7.12.3": version "7.21.8" @@ -58,27 +65,27 @@ semver "^6.3.0" "@babel/core@^7.22.1": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.1.tgz#5de51c5206f4c6f5533562838337a603c1033cfd" - integrity sha512-Hkqu7J4ynysSXxmAahpN1jjRwVJ+NdpraFLIWflgjpVob3KNyK3/tIUc7Q7szed8WMp0JNa7Qtd1E9Oo22F9gA== + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.5.tgz#d67d9747ecf26ee7ecd3ebae1ee22225fe902a89" + integrity sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.21.4" - "@babel/generator" "^7.22.0" - "@babel/helper-compilation-targets" "^7.22.1" - "@babel/helper-module-transforms" "^7.22.1" - "@babel/helpers" "^7.22.0" - "@babel/parser" "^7.22.0" - "@babel/template" "^7.21.9" - "@babel/traverse" "^7.22.1" - "@babel/types" "^7.22.0" + "@babel/code-frame" "^7.22.5" + "@babel/generator" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helpers" "^7.22.5" + "@babel/parser" "^7.22.5" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.5" + "@babel/types" "^7.22.5" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.2" semver "^6.3.0" -"@babel/generator@^7.21.5", "@babel/generator@^7.22.0", "@babel/generator@^7.22.3", "@babel/generator@^7.7.2": +"@babel/generator@^7.21.5", "@babel/generator@^7.22.3", "@babel/generator@^7.7.2": version "7.22.3" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.3.tgz#0ff675d2edb93d7596c5f6728b52615cfc0df01e" integrity sha512-C17MW4wlk//ES/CJDL51kPNwl+qiBQyN7b9SKyVp11BLGFeSPoVaHrv+MNt8jwQFhQWowW88z1eeBx3pFz9v8A== @@ -88,30 +95,50 @@ "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/helper-annotate-as-pure@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" - integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== +"@babel/generator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.5.tgz#1e7bf768688acfb05cf30b2369ef855e82d984f7" + integrity sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA== dependencies: - "@babel/types" "^7.18.6" + "@babel/types" "^7.22.5" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.6.tgz#f14d640ed1ee9246fb33b8255f08353acfe70e6a" - integrity sha512-KT10c1oWEpmrIRYnthbzHgoOf6B+Xd6a5yhdbNtdhtG7aO1or5HViuf1TQR36xY/QprXA5nvxO6nAjhJ4y38jw== +"@babel/helper-annotate-as-pure@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" + integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== dependencies: - "@babel/helper-explode-assignable-expression" "^7.18.6" - "@babel/types" "^7.18.6" + "@babel/types" "^7.22.5" -"@babel/helper-builder-react-jsx@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.19.0.tgz#a1f4fef805388eda4b3c1bd8994dc585b0afa351" - integrity sha512-xvrbORmJ13lWrqyMErk4vczhXNNWdOSg1BZ+R/7D34SjDjToR5g3M5UpD6MyUekstI50qAHLWA1j7w5o1WK2Pw== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.5.tgz#a3f4758efdd0190d8927fcffd261755937c71878" + integrity sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/types" "^7.19.0" + "@babel/types" "^7.22.5" -"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.21.5", "@babel/helper-compilation-targets@^7.22.1": +"@babel/helper-builder-react-jsx@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.22.5.tgz#9b325d4558fb51b0bb51e4837a2bf8f707029e97" + integrity sha512-GYZBuAC9Vl4jnPun18TeNGyqkKWQ+3AtZHbgnrdT//0yCV+qcFyXj0X+9DJyD2jYi0C+55gRcUAhE35sk2Mm9g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz#fc7319fc54c5e2fa14b2909cf3c5fd3046813e02" + integrity sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw== + dependencies: + "@babel/compat-data" "^7.22.5" + "@babel/helper-validator-option" "^7.22.5" + browserslist "^4.21.3" + lru-cache "^5.1.1" + semver "^6.3.0" + +"@babel/helper-compilation-targets@^7.21.5": version "7.22.1" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.1.tgz#bfcd6b7321ffebe33290d68550e2c9d7eb7c7a58" integrity sha512-Rqx13UM3yVB5q0D/KwQ8+SPfX/+Rnsy1Lw1k/UwOC4KC6qrzIQoY3lYnBu5EHKBlEHHcj0M0W8ltPSkD8rqfsQ== @@ -122,49 +149,27 @@ lru-cache "^5.1.1" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.21.0": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.4.tgz#3a017163dc3c2ba7deb9a7950849a9586ea24c18" - integrity sha512-46QrX2CQlaFRF4TkwfTt6nJD7IHq8539cCL7SDpqWSDeJKY1xylKKY5F/33mJhLZ3mFvKv2gGrVS6NkyF6qs+Q== +"@babel/helper-create-class-features-plugin@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.5.tgz#2192a1970ece4685fbff85b48da2c32fcb130b7c" + integrity sha512-xkb58MyOYIslxu3gKmVXmjTtUPvBU4odYzbiIQbWwLKIHCsx6UGZGX6F1IznMFVnDdirseUZopzN+ZRt8Xb33Q== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-member-expression-to-functions" "^7.21.0" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-replace-supers" "^7.20.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/helper-split-export-declaration" "^7.18.6" - -"@babel/helper-create-class-features-plugin@^7.22.1": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.1.tgz#ae3de70586cc757082ae3eba57240d42f468c41b" - integrity sha512-SowrZ9BWzYFgzUMwUmowbPSGu6CXL5MSuuCkG3bejahSpSymioPmuLdhPxNOc9MjuNGjy7M/HaXvJ8G82Lywlw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.22.1" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-member-expression-to-functions" "^7.22.0" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-replace-supers" "^7.22.1" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-member-expression-to-functions" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.5" semver "^6.3.0" -"@babel/helper-create-regexp-features-plugin@^7.18.6": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz#7976aca61c0984202baca73d84e2337a5424a41b" - integrity sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw== +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.5.tgz#bb2bf0debfe39b831986a4efbf4066586819c6e4" + integrity sha512-1VpEFOIbMRaXyDeUwUfmTIxExLwQ+zkW+Bh5zXpApA3oQedBx9v/updixWxnx/bZpKw7u8VxWjb/qWpIcmPq8A== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - regexpu-core "^5.1.0" - -"@babel/helper-create-regexp-features-plugin@^7.22.1": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.1.tgz#a7ed9a8488b45b467fca353cd1a44dc5f0cf5c70" - integrity sha512-WWjdnfR3LPIe+0EY8td7WmjhytxXtjKAEpnAxun/hkNiyOaPlvGK+NZaBFIdi9ndYV3Gav7BpFvtUwnaJlwi1w== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-annotate-as-pure" "^7.22.5" regexpu-core "^5.3.1" semver "^6.3.0" @@ -180,30 +185,15 @@ resolve "^1.14.2" semver "^6.1.2" -"@babel/helper-environment-visitor@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" - integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== - "@babel/helper-environment-visitor@^7.21.5", "@babel/helper-environment-visitor@^7.22.1": version "7.22.1" resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.1.tgz#ac3a56dbada59ed969d712cf527bd8271fe3eba8" integrity sha512-Z2tgopurB/kTbidvzeBrc2To3PUP/9i5MUe+fU6QJCQDyPwSH2oRapkLw3KGECDYSjhQZCNxEvNvZlLw8JjGwA== -"@babel/helper-explode-assignable-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096" - integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-function-name@^7.18.9": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c" - integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== - dependencies: - "@babel/template" "^7.18.10" - "@babel/types" "^7.19.0" +"@babel/helper-environment-visitor@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98" + integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== "@babel/helper-function-name@^7.21.0": version "7.21.0" @@ -213,6 +203,14 @@ "@babel/template" "^7.20.7" "@babel/types" "^7.21.0" +"@babel/helper-function-name@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz#ede300828905bb15e582c037162f99d5183af1be" + integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== + dependencies: + "@babel/template" "^7.22.5" + "@babel/types" "^7.22.5" + "@babel/helper-hoist-variables@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" @@ -220,35 +218,35 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-member-expression-to-functions@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz#a6f26e919582275a93c3aa6594756d71b0bb7f05" - integrity sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw== +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== dependencies: - "@babel/types" "^7.20.7" + "@babel/types" "^7.22.5" -"@babel/helper-member-expression-to-functions@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz#319c6a940431a133897148515877d2f3269c3ba5" - integrity sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q== +"@babel/helper-member-expression-to-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz#0a7c56117cad3372fbf8d2fb4bf8f8d64a1e76b2" + integrity sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ== dependencies: - "@babel/types" "^7.21.0" + "@babel/types" "^7.22.5" -"@babel/helper-member-expression-to-functions@^7.22.0": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.3.tgz#4b77a12c1b4b8e9e28736ed47d8b91f00976911f" - integrity sha512-Gl7sK04b/2WOb6OPVeNy9eFKeD3L6++CzL3ykPOWqTn08xgYYK0wz4TUh2feIImDXxcVW3/9WQ1NMKY66/jfZA== - dependencies: - "@babel/types" "^7.22.3" - -"@babel/helper-module-imports@^7.0.0-beta.49", "@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.18.6", "@babel/helper-module-imports@^7.21.4": +"@babel/helper-module-imports@^7.0.0-beta.49", "@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.21.4": version "7.21.4" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz#ac88b2f76093637489e718a90cec6cf8a9b029af" integrity sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg== dependencies: "@babel/types" "^7.21.4" -"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.21.5", "@babel/helper-module-transforms@^7.22.1": +"@babel/helper-module-imports@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz#1a8f4c9f4027d23f520bd76b364d44434a72660c" + integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-module-transforms@^7.21.5": version "7.22.1" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.1.tgz#e0cad47fedcf3cae83c11021696376e2d5a50c63" integrity sha512-dxAe9E7ySDGbQdCVOY/4+UcD8M9ZFqZcZhSPsPacvCG4M+9lwtDDQfI2EoaSvmf7W/8yCBkGU0m7Pvt1ru3UZw== @@ -262,51 +260,58 @@ "@babel/traverse" "^7.22.1" "@babel/types" "^7.22.0" -"@babel/helper-optimise-call-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" - integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== +"@babel/helper-module-transforms@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz#0f65daa0716961b6e96b164034e737f60a80d2ef" + integrity sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw== dependencies: - "@babel/types" "^7.18.6" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.5" + "@babel/types" "^7.22.5" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.21.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": +"@babel/helper-optimise-call-expression@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" + integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + +"@babel/helper-plugin-utils@^7.20.2": version "7.21.5" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz#345f2377d05a720a4e5ecfa39cbf4474a4daed56" integrity sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg== -"@babel/helper-remap-async-to-generator@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" - integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== +"@babel/helper-remap-async-to-generator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.5.tgz#14a38141a7bf2165ad38da61d61cf27b43015da2" + integrity sha512-cU0Sq1Rf4Z55fgz7haOakIyM7+x/uCFwXpLPaeRzfoUtAEAuUZjZvFPjL/rk5rW693dIgn2hng1W7xbT7lWT4g== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-wrap-function" "^7.18.9" - "@babel/types" "^7.18.9" + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-wrap-function" "^7.22.5" + "@babel/types" "^7.22.5" -"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz#243ecd2724d2071532b2c8ad2f0f9f083bcae331" - integrity sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A== +"@babel/helper-replace-supers@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.5.tgz#71bc5fb348856dea9fdc4eafd7e2e49f585145dc" + integrity sha512-aLdNM5I3kdI/V9xGNyKSF3X/gTyMUBohTZ+/3QdQKAA9vxIiy12E+8E2HoOP1/DjeqU+g6as35QHJNMDDYpuCg== dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-member-expression-to-functions" "^7.20.7" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.7" - "@babel/types" "^7.20.7" - -"@babel/helper-replace-supers@^7.22.1": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.1.tgz#38cf6e56f7dc614af63a21b45565dd623f0fdc95" - integrity sha512-ut4qrkE4AuSfrwHSps51ekR1ZY/ygrP1tp0WFm8oVq6nzc/hvfV/22JylndIbsf2U2M9LOMwiSddr6y+78j+OQ== - dependencies: - "@babel/helper-environment-visitor" "^7.22.1" - "@babel/helper-member-expression-to-functions" "^7.22.0" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/template" "^7.21.9" - "@babel/traverse" "^7.22.1" - "@babel/types" "^7.22.0" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-member-expression-to-functions" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.5" + "@babel/types" "^7.22.5" "@babel/helper-simple-access@^7.21.5": version "7.21.5" @@ -315,12 +320,19 @@ dependencies: "@babel/types" "^7.21.5" -"@babel/helper-skip-transparent-expression-wrappers@^7.20.0": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz#fbe4c52f60518cab8140d77101f0e63a8a230684" - integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== +"@babel/helper-simple-access@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== dependencies: - "@babel/types" "^7.20.0" + "@babel/types" "^7.22.5" + +"@babel/helper-skip-transparent-expression-wrappers@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" + integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== + dependencies: + "@babel/types" "^7.22.5" "@babel/helper-split-export-declaration@^7.18.6": version "7.18.6" @@ -329,32 +341,44 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-string-parser@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz#2b3eea65443c6bdc31c22d037c65f6d323b6b2bd" - integrity sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w== +"@babel/helper-split-export-declaration@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz#88cf11050edb95ed08d596f7a044462189127a08" + integrity sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ== + dependencies: + "@babel/types" "^7.22.5" -"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": +"@babel/helper-string-parser@^7.21.5", "@babel/helper-string-parser@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" + integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== + +"@babel/helper-validator-identifier@^7.18.6": version "7.19.1" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== -"@babel/helper-validator-option@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180" - integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== +"@babel/helper-validator-identifier@^7.19.1", "@babel/helper-validator-identifier@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" + integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== -"@babel/helper-wrap-function@^7.18.9": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.18.10.tgz#a7fcd3ab9b1be4c9b52cf7d7fdc1e88c2ce93396" - integrity sha512-95NLBP59VWdfK2lyLKe6eTMq9xg+yWKzxzxbJ1wcYNi1Auz200+83fMDADjRxBvc2QQor5zja2yTQzXGhk2GtQ== +"@babel/helper-validator-option@^7.21.0", "@babel/helper-validator-option@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz#de52000a15a177413c8234fa3a8af4ee8102d0ac" + integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw== + +"@babel/helper-wrap-function@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.5.tgz#44d205af19ed8d872b4eefb0d2fa65f45eb34f06" + integrity sha512-bYqLIBSEshYcYQyfks8ewYA8S30yaGSeRslcvKMvoUk6HHPySbxHq9YRi6ghhzEU+yhQv9bP/jXnygkStOcqZw== dependencies: - "@babel/helper-function-name" "^7.18.9" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.18.10" - "@babel/types" "^7.18.10" + "@babel/helper-function-name" "^7.22.5" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.5" + "@babel/types" "^7.22.5" -"@babel/helpers@^7.21.5", "@babel/helpers@^7.22.0": +"@babel/helpers@^7.21.5": version "7.22.3" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.3.tgz#53b74351da9684ea2f694bf0877998da26dd830e" integrity sha512-jBJ7jWblbgr7r6wYZHMdIqKc73ycaTcCaWRq4/2LpuPHcx7xMlZvpGQkOYc9HeSjn6rcx15CPlgVcBtZ4WZJ2w== @@ -363,6 +387,15 @@ "@babel/traverse" "^7.22.1" "@babel/types" "^7.22.3" +"@babel/helpers@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.5.tgz#74bb4373eb390d1ceed74a15ef97767e63120820" + integrity sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q== + dependencies: + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.5" + "@babel/types" "^7.22.5" + "@babel/highlight@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" @@ -372,36 +405,45 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.21.5", "@babel/parser@^7.21.8", "@babel/parser@^7.21.9", "@babel/parser@^7.22.0", "@babel/parser@^7.22.4": +"@babel/highlight@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.5.tgz#aa6c05c5407a67ebce408162b7ede789b4d22031" + integrity sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw== + dependencies: + "@babel/helper-validator-identifier" "^7.22.5" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.21.5", "@babel/parser@^7.21.8", "@babel/parser@^7.21.9", "@babel/parser@^7.22.4": version "7.22.4" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.4.tgz#a770e98fd785c231af9d93f6459d36770993fb32" integrity sha512-VLLsx06XkEYqBtE5YGPwfSGwfrjnyPP5oiGty3S8pQLFDFLaS8VwWSIxkTXpcvr5zeYLE6+MBNl2npl/YnfofA== -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" - integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" +"@babel/parser@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.5.tgz#721fd042f3ce1896238cf1b341c77eb7dee7dbea" + integrity sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q== -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.3.tgz#a75be1365c0c3188c51399a662168c1c98108659" - integrity sha512-6r4yRwEnorYByILoDRnEqxtojYKuiIv9FojW2E8GUKo9eWBwbKcd9IiZOZpdyXc64RmyGGyPu3/uAcrz/dq2kQ== +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz#87245a21cd69a73b0b81bcda98d443d6df08f05e" + integrity sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/plugin-transform-optional-chaining" "^7.22.3" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-proposal-private-property-in-object@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz#19496bd9883dd83c23c7d7fc45dcd9ad02dfa1dc" - integrity sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz#fef09f9499b1f1c930da8a0c419db42167d792ca" + integrity sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.21.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.22.5" + +"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": + version "7.21.0-placeholder-for-preset-env.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" + integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== "@babel/plugin-proposal-unicode-property-regex@^7.4.4": version "7.18.6" @@ -453,19 +495,19 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-import-assertions@^7.20.0": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz#bb50e0d4bea0957235390641209394e87bdb9cc4" - integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== +"@babel/plugin-syntax-import-assertions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz#07d252e2aa0bc6125567f742cd58619cb14dce98" + integrity sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg== dependencies: - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-syntax-import-attributes@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.3.tgz#d7168f22b9b49a6cc1792cec78e06a18ad2e7b4b" - integrity sha512-i35jZJv6aO7hxEbIWQ41adVfOzjm9dcYDNeWlBMd8p0ZQRtNUCBrmGwZt+H5lb+oOC9a3svp956KP0oWGA1YsA== +"@babel/plugin-syntax-import-attributes@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz#ab840248d834410b829f569f5262b9e517555ecb" + integrity sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-import-meta@^7.10.4", "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" @@ -481,13 +523,20 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@7", "@babel/plugin-syntax-jsx@^7.12.13", "@babel/plugin-syntax-jsx@^7.21.4", "@babel/plugin-syntax-jsx@^7.7.2": +"@babel/plugin-syntax-jsx@7", "@babel/plugin-syntax-jsx@^7.12.13", "@babel/plugin-syntax-jsx@^7.7.2": version "7.21.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz#f264ed7bf40ffc9ec239edabc17a50c4f5b6fea2" integrity sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ== dependencies: "@babel/helper-plugin-utils" "^7.20.2" +"@babel/plugin-syntax-jsx@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz#a6b68e84fb76e759fc3b93e901876ffabbe1d918" + integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" @@ -544,12 +593,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-typescript@^7.20.0": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz#4e9a0cfc769c85689b77a2e642d24e9f697fc8c7" - integrity sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ== +"@babel/plugin-syntax-typescript@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz#aac8d383b062c5072c647a31ef990c1d0af90272" + integrity sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ== dependencies: - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-typescript@^7.7.2": version "7.14.5" @@ -566,476 +615,476 @@ "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-arrow-functions@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz#9bb42a53de447936a57ba256fbf537fc312b6929" - integrity sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA== +"@babel/plugin-transform-arrow-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz#e5ba566d0c58a5b2ba2a8b795450641950b71958" + integrity sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-async-generator-functions@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.3.tgz#3ed99924c354fb9e80dabb2cc8d002c702e94527" - integrity sha512-36A4Aq48t66btydbZd5Fk0/xJqbpg/v4QWI4AH4cYHBXy9Mu42UOupZpebKFiCFNT9S9rJFcsld0gsv0ayLjtA== +"@babel/plugin-transform-async-generator-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.5.tgz#7336356d23380eda9a56314974f053a020dab0c3" + integrity sha512-gGOEvFzm3fWoyD5uZq7vVTD57pPJ3PczPUD/xCFGjzBpUosnklmXyKnGQbbbGs1NPNPskFex0j93yKbHt0cHyg== dependencies: - "@babel/helper-environment-visitor" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-remap-async-to-generator" "^7.18.9" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.5" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-transform-async-to-generator@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz#dfee18623c8cb31deb796aa3ca84dda9cea94354" - integrity sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q== +"@babel/plugin-transform-async-to-generator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz#c7a85f44e46f8952f6d27fe57c2ed3cc084c3775" + integrity sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ== dependencies: - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-remap-async-to-generator" "^7.18.9" + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.5" -"@babel/plugin-transform-block-scoped-functions@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz#9187bf4ba302635b9d70d986ad70f038726216a8" - integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== +"@babel/plugin-transform-block-scoped-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz#27978075bfaeb9fa586d3cb63a3d30c1de580024" + integrity sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-block-scoping@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz#e737b91037e5186ee16b76e7ae093358a5634f02" - integrity sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ== +"@babel/plugin-transform-block-scoping@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.5.tgz#8bfc793b3a4b2742c0983fadc1480d843ecea31b" + integrity sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-class-properties@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.3.tgz#3407145e513830df77f0cef828b8b231c166fe4c" - integrity sha512-mASLsd6rhOrLZ5F3WbCxkzl67mmOnqik0zrg5W6D/X0QMW7HtvnoL1dRARLKIbMP3vXwkwziuLesPqWVGIl6Bw== +"@babel/plugin-transform-class-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz#97a56e31ad8c9dc06a0b3710ce7803d5a48cca77" + integrity sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ== dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-class-static-block@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.3.tgz#e352cf33567385c731a8f21192efeba760358773" - integrity sha512-5BirgNWNOx7cwbTJCOmKFJ1pZjwk5MUfMIwiBBvsirCJMZeQgs5pk6i1OlkVg+1Vef5LfBahFOrdCnAWvkVKMw== +"@babel/plugin-transform-class-static-block@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz#3e40c46f048403472d6f4183116d5e46b1bff5ba" + integrity sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA== dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-class-static-block" "^7.14.5" -"@babel/plugin-transform-classes@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz#f469d0b07a4c5a7dbb21afad9e27e57b47031665" - integrity sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ== +"@babel/plugin-transform-classes@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.5.tgz#635d4e98da741fad814984639f4c0149eb0135e1" + integrity sha512-2edQhLfibpWpsVBx2n/GKOz6JdGQvLruZQfGr9l1qes2KQaWswjBzhQF7UDUZMNaMMQeYnQzxwOMPsbYF7wqPQ== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-replace-supers" "^7.20.7" - "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.5" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.21.5.tgz#3a2d8bb771cd2ef1cd736435f6552fe502e11b44" - integrity sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q== +"@babel/plugin-transform-computed-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz#cd1e994bf9f316bd1c2dafcd02063ec261bb3869" + integrity sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/template" "^7.20.7" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/template" "^7.22.5" -"@babel/plugin-transform-destructuring@^7.21.3": - version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz#73b46d0fd11cd6ef57dea8a381b1215f4959d401" - integrity sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA== +"@babel/plugin-transform-destructuring@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.5.tgz#d3aca7438f6c26c78cdd0b0ba920a336001b27cc" + integrity sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz#b286b3e7aae6c7b861e45bed0a2fafd6b1a4fef8" - integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== +"@babel/plugin-transform-dotall-regex@^7.22.5", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz#dbb4f0e45766eb544e193fb00e65a1dd3b2a4165" + integrity sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-duplicate-keys@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz#687f15ee3cdad6d85191eb2a372c4528eaa0ae0e" - integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== +"@babel/plugin-transform-duplicate-keys@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz#b6e6428d9416f5f0bba19c70d1e6e7e0b88ab285" + integrity sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-dynamic-import@^7.22.1": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.1.tgz#6c56afaf896a07026330cf39714532abed8d9ed1" - integrity sha512-rlhWtONnVBPdmt+jeewS0qSnMz/3yLFrqAP8hHC6EDcrYRSyuz9f9yQhHvVn2Ad6+yO9fHXac5piudeYrInxwQ== +"@babel/plugin-transform-dynamic-import@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz#d6908a8916a810468c4edff73b5b75bda6ad393e" + integrity sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-transform-exponentiation-operator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz#421c705f4521888c65e91fdd1af951bfefd4dacd" - integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== +"@babel/plugin-transform-exponentiation-operator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz#402432ad544a1f9a480da865fda26be653e48f6a" + integrity sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-export-namespace-from@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.3.tgz#9b8700aa495007d3bebac8358d1c562434b680b9" - integrity sha512-5Ti1cHLTDnt3vX61P9KZ5IG09bFXp4cDVFJIAeCZuxu9OXXJJZp5iP0n/rzM2+iAutJY+KWEyyHcRaHlpQ/P5g== +"@babel/plugin-transform-export-namespace-from@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz#57c41cb1d0613d22f548fddd8b288eedb9973a5b" + integrity sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-transform-for-of@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.5.tgz#e890032b535f5a2e237a18535f56a9fdaa7b83fc" - integrity sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ== +"@babel/plugin-transform-for-of@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz#ab1b8a200a8f990137aff9a084f8de4099ab173f" + integrity sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-function-name@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz#cc354f8234e62968946c61a46d6365440fc764e0" - integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== +"@babel/plugin-transform-function-name@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz#935189af68b01898e0d6d99658db6b164205c143" + integrity sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg== dependencies: - "@babel/helper-compilation-targets" "^7.18.9" - "@babel/helper-function-name" "^7.18.9" - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-json-strings@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.3.tgz#a181b8679cf7c93e9d0e3baa5b1776d65be601a9" - integrity sha512-IuvOMdeOOY2X4hRNAT6kwbePtK21BUyrAEgLKviL8pL6AEEVUVcqtRdN/HJXBLGIbt9T3ETmXRnFedRRmQNTYw== +"@babel/plugin-transform-json-strings@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz#14b64352fdf7e1f737eed68de1a1468bd2a77ec0" + integrity sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-transform-literals@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz#72796fdbef80e56fba3c6a699d54f0de557444bc" - integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== +"@babel/plugin-transform-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz#e9341f4b5a167952576e23db8d435849b1dd7920" + integrity sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-logical-assignment-operators@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.3.tgz#9e021455810f33b0baccb82fb759b194f5dc36f0" - integrity sha512-CbayIfOw4av2v/HYZEsH+Klks3NC2/MFIR3QR8gnpGNNPEaq2fdlVCRYG/paKs7/5hvBLQ+H70pGWOHtlNEWNA== +"@babel/plugin-transform-logical-assignment-operators@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz#66ae5f068fd5a9a5dc570df16f56c2a8462a9d6c" + integrity sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-transform-member-expression-literals@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz#ac9fdc1a118620ac49b7e7a5d2dc177a1bfee88e" - integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== +"@babel/plugin-transform-member-expression-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz#4fcc9050eded981a468347dd374539ed3e058def" + integrity sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-modules-amd@^7.20.11": - version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz#3daccca8e4cc309f03c3a0c4b41dc4b26f55214a" - integrity sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g== +"@babel/plugin-transform-modules-amd@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz#4e045f55dcf98afd00f85691a68fc0780704f526" + integrity sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ== dependencies: - "@babel/helper-module-transforms" "^7.20.11" - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-modules-commonjs@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz#d69fb947eed51af91de82e4708f676864e5e47bc" - integrity sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ== +"@babel/plugin-transform-modules-commonjs@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz#7d9875908d19b8c0536085af7b053fd5bd651bfa" + integrity sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA== dependencies: - "@babel/helper-module-transforms" "^7.21.5" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-simple-access" "^7.21.5" + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" -"@babel/plugin-transform-modules-systemjs@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.3.tgz#cc507e03e88d87b016feaeb5dae941e6ef50d91e" - integrity sha512-V21W3bKLxO3ZjcBJZ8biSvo5gQ85uIXW2vJfh7JSWf/4SLUSr1tOoHX3ruN4+Oqa2m+BKfsxTR1I+PsvkIWvNw== +"@babel/plugin-transform-modules-systemjs@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz#18c31410b5e579a0092638f95c896c2a98a5d496" + integrity sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ== dependencies: - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-module-transforms" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-validator-identifier" "^7.19.1" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" -"@babel/plugin-transform-modules-umd@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz#81d3832d6034b75b54e62821ba58f28ed0aab4b9" - integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== +"@babel/plugin-transform-modules-umd@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz#4694ae40a87b1745e3775b6a7fe96400315d4f98" + integrity sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ== dependencies: - "@babel/helper-module-transforms" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-named-capturing-groups-regex@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.3.tgz#db6fb77e6b3b53ec3b8d370246f0b7cf67d35ab4" - integrity sha512-c6HrD/LpUdNNJsISQZpds3TXvfYIAbo+efE9aWmY/PmSRD0agrJ9cPMt4BmArwUQ7ZymEWTFjTyp+yReLJZh0Q== +"@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz#67fe18ee8ce02d57c855185e27e3dc959b2e991f" + integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-new-target@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.3.tgz#deb0377d741cbee2f45305868b9026dcd6dd96e2" - integrity sha512-5RuJdSo89wKdkRTqtM9RVVJzHum9c2s0te9rB7vZC1zKKxcioWIy+xcu4OoIAjyFZhb/bp5KkunuLin1q7Ct+w== +"@babel/plugin-transform-new-target@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz#1b248acea54ce44ea06dfd37247ba089fcf9758d" + integrity sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-nullish-coalescing-operator@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.3.tgz#8c519f8bf5af94a9ca6f65cf422a9d3396e542b9" - integrity sha512-CpaoNp16nX7ROtLONNuCyenYdY/l7ZsR6aoVa7rW7nMWisoNoQNIH5Iay/4LDyRjKMuElMqXiBoOQCDLTMGZiw== +"@babel/plugin-transform-nullish-coalescing-operator@^7.22.3", "@babel/plugin-transform-nullish-coalescing-operator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz#f8872c65776e0b552e0849d7596cddd416c3e381" + integrity sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-transform-numeric-separator@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.3.tgz#02493070ca6685884b0eee705363ee4da2132ab0" - integrity sha512-+AF88fPDJrnseMh5vD9+SH6wq4ZMvpiTMHh58uLs+giMEyASFVhcT3NkoyO+NebFCNnpHJEq5AXO2txV4AGPDQ== +"@babel/plugin-transform-numeric-separator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz#57226a2ed9e512b9b446517ab6fa2d17abb83f58" + integrity sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-transform-object-rest-spread@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.3.tgz#da6fba693effb8c203d8c3bdf7bf4e2567e802e9" - integrity sha512-38bzTsqMMCI46/TQnJwPPpy33EjLCc1Gsm2hRTF6zTMWnKsN61vdrpuzIEGQyKEhDSYDKyZHrrd5FMj4gcUHhw== +"@babel/plugin-transform-object-rest-spread@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz#9686dc3447df4753b0b2a2fae7e8bc33cdc1f2e1" + integrity sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ== dependencies: - "@babel/compat-data" "^7.22.3" - "@babel/helper-compilation-targets" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/compat-data" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.22.3" + "@babel/plugin-transform-parameters" "^7.22.5" -"@babel/plugin-transform-object-super@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz#fb3c6ccdd15939b6ff7939944b51971ddc35912c" - integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== +"@babel/plugin-transform-object-super@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz#794a8d2fcb5d0835af722173c1a9d704f44e218c" + integrity sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-replace-supers" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.5" -"@babel/plugin-transform-optional-catch-binding@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.3.tgz#e971a083fc7d209d9cd18253853af1db6d8dc42f" - integrity sha512-bnDFWXFzWY0BsOyqaoSXvMQ2F35zutQipugog/rqotL2S4ciFOKlRYUu9djt4iq09oh2/34hqfRR2k1dIvuu4g== +"@babel/plugin-transform-optional-catch-binding@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz#842080be3076703be0eaf32ead6ac8174edee333" + integrity sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-transform-optional-chaining@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.3.tgz#5fd24a4a7843b76da6aeec23c7f551da5d365290" - integrity sha512-63v3/UFFxhPKT8j8u1jTTGVyITxl7/7AfOqK8C5gz1rHURPUGe3y5mvIf68eYKGoBNahtJnTxBKug4BQOnzeJg== +"@babel/plugin-transform-optional-chaining@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.5.tgz#1003762b9c14295501beb41be72426736bedd1e0" + integrity sha512-AconbMKOMkyG+xCng2JogMCDcqW8wedQAqpVIL4cOSescZ7+iW8utC6YDZLMCSUIReEA733gzRSaOSXMAt/4WQ== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-transform-parameters@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.3.tgz#24477acfd2fd2bc901df906c9bf17fbcfeee900d" - integrity sha512-x7QHQJHPuD9VmfpzboyGJ5aHEr9r7DsAsdxdhJiTB3J3j8dyl+NFZ+rX5Q2RWFDCs61c06qBfS4ys2QYn8UkMw== +"@babel/plugin-transform-parameters@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz#c3542dd3c39b42c8069936e48717a8d179d63a18" + integrity sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-private-methods@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.3.tgz#adac38020bab5047482d3297107c1f58e9c574f6" - integrity sha512-fC7jtjBPFqhqpPAE+O4LKwnLq7gGkD3ZmC2E3i4qWH34mH3gOg2Xrq5YMHUq6DM30xhqM1DNftiRaSqVjEG+ug== +"@babel/plugin-transform-private-methods@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz#21c8af791f76674420a147ae62e9935d790f8722" + integrity sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA== dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-private-property-in-object@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.3.tgz#031621b02c7b7d95389de1a3dba2fe9e8c548e56" - integrity sha512-C7MMl4qWLpgVCbXfj3UW8rR1xeCnisQ0cU7YJHV//8oNBS0aCIVg1vFnZXxOckHhEpQyqNNkWmvSEWnMLlc+Vw== +"@babel/plugin-transform-private-property-in-object@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz#07a77f28cbb251546a43d175a1dda4cf3ef83e32" + integrity sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" -"@babel/plugin-transform-property-literals@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz#e22498903a483448e94e032e9bbb9c5ccbfc93a3" - integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== +"@babel/plugin-transform-property-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz#b5ddabd73a4f7f26cd0e20f5db48290b88732766" + integrity sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-react-display-name@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz#8b1125f919ef36ebdfff061d664e266c666b9415" - integrity sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA== +"@babel/plugin-transform-react-display-name@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz#3c4326f9fce31c7968d6cb9debcaf32d9e279a2b" + integrity sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-react-inline-elements@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-inline-elements/-/plugin-transform-react-inline-elements-7.21.0.tgz#921fe634c422987677b133b335ae3f3aecddda2a" - integrity sha512-lOSFD/67qxOwQ7q6KpkAbBFeGI5xy1Oya2zipYxPSmG2C210CRJyQdzOl1A368J1nv2gOFTgRXdsRjb83jioLw== + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-inline-elements/-/plugin-transform-react-inline-elements-7.22.5.tgz#f158486764de87f84706f5e9c98506df3015d9a4" + integrity sha512-m+OHS1E33wsWyv37bQXNzY/AB7vMTR1BYGG/KW+HGHdKeQS03sUAweNdGaDh8wKmAqh6ZbRRtFjPbhyYFToSbQ== dependencies: - "@babel/helper-builder-react-jsx" "^7.19.0" - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-builder-react-jsx" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-react-jsx-development@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz#dbe5c972811e49c7405b630e4d0d2e1380c0ddc5" - integrity sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA== +"@babel/plugin-transform-react-jsx-development@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz#e716b6edbef972a92165cd69d92f1255f7e73e87" + integrity sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A== dependencies: - "@babel/plugin-transform-react-jsx" "^7.18.6" + "@babel/plugin-transform-react-jsx" "^7.22.5" -"@babel/plugin-transform-react-jsx@^7.18.6", "@babel/plugin-transform-react-jsx@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.3.tgz#5a1f380df3703ba92eb1a930a539c6d88836f690" - integrity sha512-JEulRWG2f04a7L8VWaOngWiK6p+JOSpB+DAtwfJgOaej1qdbNxqtK7MwTBHjUA10NeFcszlFNqCdbRcirzh2uQ== +"@babel/plugin-transform-react-jsx@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.5.tgz#932c291eb6dd1153359e2a90cb5e557dcf068416" + integrity sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-module-imports" "^7.21.4" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/plugin-syntax-jsx" "^7.21.4" - "@babel/types" "^7.22.3" + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-jsx" "^7.22.5" + "@babel/types" "^7.22.5" -"@babel/plugin-transform-react-pure-annotations@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz#561af267f19f3e5d59291f9950fd7b9663d0d844" - integrity sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ== +"@babel/plugin-transform-react-pure-annotations@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.22.5.tgz#1f58363eef6626d6fa517b95ac66fe94685e32c0" + integrity sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-regenerator@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.21.5.tgz#576c62f9923f94bcb1c855adc53561fd7913724e" - integrity sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w== +"@babel/plugin-transform-regenerator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.5.tgz#cd8a68b228a5f75fa01420e8cc2fc400f0fc32aa" + integrity sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-plugin-utils" "^7.22.5" regenerator-transform "^0.15.1" -"@babel/plugin-transform-reserved-words@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz#b1abd8ebf8edaa5f7fe6bbb8d2133d23b6a6f76a" - integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== +"@babel/plugin-transform-reserved-words@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz#832cd35b81c287c4bcd09ce03e22199641f964fb" + integrity sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-runtime@^7.22.4": - version "7.22.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.4.tgz#f8353f313f18c3ce1315688631ec48657b97af42" - integrity sha512-Urkiz1m4zqiRo17klj+l3nXgiRTFQng91Bc1eiLF7BMQu1e7wE5Gcq9xSv062IF068NHjcutSbIMev60gXxAvA== + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.5.tgz#ca975fb5e260044473c8142e1b18b567d33c2a3b" + integrity sha512-bg4Wxd1FWeFx3daHFTWk1pkSWK/AyQuiyAoeZAOkAOUBjnZPH6KT7eMxouV47tQ6hl6ax2zyAWBdWZXbrvXlaw== dependencies: - "@babel/helper-module-imports" "^7.21.4" - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" babel-plugin-polyfill-corejs2 "^0.4.3" babel-plugin-polyfill-corejs3 "^0.8.1" babel-plugin-polyfill-regenerator "^0.5.0" semver "^6.3.0" -"@babel/plugin-transform-shorthand-properties@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz#6d6df7983d67b195289be24909e3f12a8f664dc9" - integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== +"@babel/plugin-transform-shorthand-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz#6e277654be82b5559fc4b9f58088507c24f0c624" + integrity sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-spread@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz#c2d83e0b99d3bf83e07b11995ee24bf7ca09401e" - integrity sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw== +"@babel/plugin-transform-spread@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz#6487fd29f229c95e284ba6c98d65eafb893fea6b" + integrity sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" -"@babel/plugin-transform-sticky-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz#c6706eb2b1524028e317720339583ad0f444adcc" - integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== +"@babel/plugin-transform-sticky-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz#295aba1595bfc8197abd02eae5fc288c0deb26aa" + integrity sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-template-literals@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz#04ec6f10acdaa81846689d63fae117dd9c243a5e" - integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== +"@babel/plugin-transform-template-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz#8f38cf291e5f7a8e60e9f733193f0bcc10909bff" + integrity sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-typeof-symbol@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz#c8cea68263e45addcd6afc9091429f80925762c0" - integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== +"@babel/plugin-transform-typeof-symbol@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz#5e2ba478da4b603af8673ff7c54f75a97b716b34" + integrity sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-typescript@^7.21.3": - version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.3.tgz#316c5be579856ea890a57ebc5116c5d064658f2b" - integrity sha512-RQxPz6Iqt8T0uw/WsJNReuBpWpBqs/n7mNo18sKLoTbMp+UrEekhH+pKSVC7gWz+DNjo9gryfV8YzCiT45RgMw== +"@babel/plugin-transform-typescript@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.5.tgz#5c0f7adfc1b5f38c4dbc8f79b1f0f8074134bd7d" + integrity sha512-SMubA9S7Cb5sGSFFUlqxyClTA9zWJ8qGQrppNUm05LtFuN1ELRFNndkix4zUJrC9F+YivWwa1dHMSyo0e0N9dA== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.21.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-typescript" "^7.20.0" + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-typescript" "^7.22.5" -"@babel/plugin-transform-unicode-escapes@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.21.5.tgz#1e55ed6195259b0e9061d81f5ef45a9b009fb7f2" - integrity sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg== +"@babel/plugin-transform-unicode-escapes@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.5.tgz#ce0c248522b1cb22c7c992d88301a5ead70e806c" + integrity sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-unicode-property-regex@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.3.tgz#597b6a614dc93eaae605ee293e674d79d32eb380" - integrity sha512-5ScJ+OmdX+O6HRuMGW4kv7RL9vIKdtdAj9wuWUKy1wbHY3jaM/UlyIiC1G7J6UJiiyMukjjK0QwL3P0vBd0yYg== +"@babel/plugin-transform-unicode-property-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz#098898f74d5c1e86660dc112057b2d11227f1c81" + integrity sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-unicode-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz#194317225d8c201bbae103364ffe9e2cea36cdca" - integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== +"@babel/plugin-transform-unicode-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz#ce7e7bb3ef208c4ff67e02a22816656256d7a183" + integrity sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-unicode-sets-regex@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.3.tgz#7c14ee33fa69782b0101d0f7143d3fc73ce00700" - integrity sha512-hNufLdkF8vqywRp+P55j4FHXqAX2LRUccoZHH7AFn1pq5ZOO2ISKW9w13bFZVjBoTqeve2HOgoJCcaziJVhGNw== +"@babel/plugin-transform-unicode-sets-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz#77788060e511b708ffc7d42fdfbc5b37c3004e91" + integrity sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/preset-env@^7.11.0", "@babel/preset-env@^7.22.4": - version "7.22.4" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.22.4.tgz#c86a82630f0e8c61d9bb9327b7b896732028cbed" - integrity sha512-c3lHOjbwBv0TkhYCr+XCR6wKcSZ1QbQTVdSkZUaVpLv8CVWotBMArWUi5UAJrcrQaEnleVkkvaV8F/pmc/STZQ== + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.22.5.tgz#3da66078b181f3d62512c51cf7014392c511504e" + integrity sha512-fj06hw89dpiZzGZtxn+QybifF07nNiZjZ7sazs2aVDcysAZVGjW7+7iFYxg6GLNM47R/thYfLdrXc+2f11Vi9A== dependencies: - "@babel/compat-data" "^7.22.3" - "@babel/helper-compilation-targets" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-validator-option" "^7.21.0" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.3" - "@babel/plugin-proposal-private-property-in-object" "^7.21.0" + "@babel/compat-data" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.5" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.22.5" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.5" + "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.20.0" - "@babel/plugin-syntax-import-attributes" "^7.22.3" + "@babel/plugin-syntax-import-assertions" "^7.22.5" + "@babel/plugin-syntax-import-attributes" "^7.22.5" "@babel/plugin-syntax-import-meta" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" @@ -1047,56 +1096,56 @@ "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-syntax-top-level-await" "^7.14.5" "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" - "@babel/plugin-transform-arrow-functions" "^7.21.5" - "@babel/plugin-transform-async-generator-functions" "^7.22.3" - "@babel/plugin-transform-async-to-generator" "^7.20.7" - "@babel/plugin-transform-block-scoped-functions" "^7.18.6" - "@babel/plugin-transform-block-scoping" "^7.21.0" - "@babel/plugin-transform-class-properties" "^7.22.3" - "@babel/plugin-transform-class-static-block" "^7.22.3" - "@babel/plugin-transform-classes" "^7.21.0" - "@babel/plugin-transform-computed-properties" "^7.21.5" - "@babel/plugin-transform-destructuring" "^7.21.3" - "@babel/plugin-transform-dotall-regex" "^7.18.6" - "@babel/plugin-transform-duplicate-keys" "^7.18.9" - "@babel/plugin-transform-dynamic-import" "^7.22.1" - "@babel/plugin-transform-exponentiation-operator" "^7.18.6" - "@babel/plugin-transform-export-namespace-from" "^7.22.3" - "@babel/plugin-transform-for-of" "^7.21.5" - "@babel/plugin-transform-function-name" "^7.18.9" - "@babel/plugin-transform-json-strings" "^7.22.3" - "@babel/plugin-transform-literals" "^7.18.9" - "@babel/plugin-transform-logical-assignment-operators" "^7.22.3" - "@babel/plugin-transform-member-expression-literals" "^7.18.6" - "@babel/plugin-transform-modules-amd" "^7.20.11" - "@babel/plugin-transform-modules-commonjs" "^7.21.5" - "@babel/plugin-transform-modules-systemjs" "^7.22.3" - "@babel/plugin-transform-modules-umd" "^7.18.6" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.3" - "@babel/plugin-transform-new-target" "^7.22.3" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.3" - "@babel/plugin-transform-numeric-separator" "^7.22.3" - "@babel/plugin-transform-object-rest-spread" "^7.22.3" - "@babel/plugin-transform-object-super" "^7.18.6" - "@babel/plugin-transform-optional-catch-binding" "^7.22.3" - "@babel/plugin-transform-optional-chaining" "^7.22.3" - "@babel/plugin-transform-parameters" "^7.22.3" - "@babel/plugin-transform-private-methods" "^7.22.3" - "@babel/plugin-transform-private-property-in-object" "^7.22.3" - "@babel/plugin-transform-property-literals" "^7.18.6" - "@babel/plugin-transform-regenerator" "^7.21.5" - "@babel/plugin-transform-reserved-words" "^7.18.6" - "@babel/plugin-transform-shorthand-properties" "^7.18.6" - "@babel/plugin-transform-spread" "^7.20.7" - "@babel/plugin-transform-sticky-regex" "^7.18.6" - "@babel/plugin-transform-template-literals" "^7.18.9" - "@babel/plugin-transform-typeof-symbol" "^7.18.9" - "@babel/plugin-transform-unicode-escapes" "^7.21.5" - "@babel/plugin-transform-unicode-property-regex" "^7.22.3" - "@babel/plugin-transform-unicode-regex" "^7.18.6" - "@babel/plugin-transform-unicode-sets-regex" "^7.22.3" + "@babel/plugin-transform-arrow-functions" "^7.22.5" + "@babel/plugin-transform-async-generator-functions" "^7.22.5" + "@babel/plugin-transform-async-to-generator" "^7.22.5" + "@babel/plugin-transform-block-scoped-functions" "^7.22.5" + "@babel/plugin-transform-block-scoping" "^7.22.5" + "@babel/plugin-transform-class-properties" "^7.22.5" + "@babel/plugin-transform-class-static-block" "^7.22.5" + "@babel/plugin-transform-classes" "^7.22.5" + "@babel/plugin-transform-computed-properties" "^7.22.5" + "@babel/plugin-transform-destructuring" "^7.22.5" + "@babel/plugin-transform-dotall-regex" "^7.22.5" + "@babel/plugin-transform-duplicate-keys" "^7.22.5" + "@babel/plugin-transform-dynamic-import" "^7.22.5" + "@babel/plugin-transform-exponentiation-operator" "^7.22.5" + "@babel/plugin-transform-export-namespace-from" "^7.22.5" + "@babel/plugin-transform-for-of" "^7.22.5" + "@babel/plugin-transform-function-name" "^7.22.5" + "@babel/plugin-transform-json-strings" "^7.22.5" + "@babel/plugin-transform-literals" "^7.22.5" + "@babel/plugin-transform-logical-assignment-operators" "^7.22.5" + "@babel/plugin-transform-member-expression-literals" "^7.22.5" + "@babel/plugin-transform-modules-amd" "^7.22.5" + "@babel/plugin-transform-modules-commonjs" "^7.22.5" + "@babel/plugin-transform-modules-systemjs" "^7.22.5" + "@babel/plugin-transform-modules-umd" "^7.22.5" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" + "@babel/plugin-transform-new-target" "^7.22.5" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.5" + "@babel/plugin-transform-numeric-separator" "^7.22.5" + "@babel/plugin-transform-object-rest-spread" "^7.22.5" + "@babel/plugin-transform-object-super" "^7.22.5" + "@babel/plugin-transform-optional-catch-binding" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.22.5" + "@babel/plugin-transform-parameters" "^7.22.5" + "@babel/plugin-transform-private-methods" "^7.22.5" + "@babel/plugin-transform-private-property-in-object" "^7.22.5" + "@babel/plugin-transform-property-literals" "^7.22.5" + "@babel/plugin-transform-regenerator" "^7.22.5" + "@babel/plugin-transform-reserved-words" "^7.22.5" + "@babel/plugin-transform-shorthand-properties" "^7.22.5" + "@babel/plugin-transform-spread" "^7.22.5" + "@babel/plugin-transform-sticky-regex" "^7.22.5" + "@babel/plugin-transform-template-literals" "^7.22.5" + "@babel/plugin-transform-typeof-symbol" "^7.22.5" + "@babel/plugin-transform-unicode-escapes" "^7.22.5" + "@babel/plugin-transform-unicode-property-regex" "^7.22.5" + "@babel/plugin-transform-unicode-regex" "^7.22.5" + "@babel/plugin-transform-unicode-sets-regex" "^7.22.5" "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.22.4" + "@babel/types" "^7.22.5" babel-plugin-polyfill-corejs2 "^0.4.3" babel-plugin-polyfill-corejs3 "^0.8.1" babel-plugin-polyfill-regenerator "^0.5.0" @@ -1115,27 +1164,27 @@ esutils "^2.0.2" "@babel/preset-react@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.22.3.tgz#2ec7f91d0c924fa2ea0c7cfbbf690bc62b79cd84" - integrity sha512-lxDz1mnZ9polqClBCVBjIVUypoB4qV3/tZUDb/IlYbW1kiiLaXaX+bInbRjl+lNQ/iUZraQ3+S8daEmoELMWug== + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.22.5.tgz#c4d6058fbf80bccad02dd8c313a9aaa67e3c3dd6" + integrity sha512-M+Is3WikOpEJHgR385HbuCITPTaPRaNkibTEa9oiofmJvIsrceb4yp9RL9Kb+TE8LznmeyZqpP+Lopwcx59xPQ== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-validator-option" "^7.21.0" - "@babel/plugin-transform-react-display-name" "^7.18.6" - "@babel/plugin-transform-react-jsx" "^7.22.3" - "@babel/plugin-transform-react-jsx-development" "^7.18.6" - "@babel/plugin-transform-react-pure-annotations" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.5" + "@babel/plugin-transform-react-display-name" "^7.22.5" + "@babel/plugin-transform-react-jsx" "^7.22.5" + "@babel/plugin-transform-react-jsx-development" "^7.22.5" + "@babel/plugin-transform-react-pure-annotations" "^7.22.5" "@babel/preset-typescript@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.21.5.tgz#68292c884b0e26070b4d66b202072d391358395f" - integrity sha512-iqe3sETat5EOrORXiQ6rWfoOg2y68Cs75B9wNxdPW4kixJxh7aXQE1KPdWLDniC24T/6dSnguF33W9j/ZZQcmA== + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.22.5.tgz#16367d8b01d640e9a507577ed4ee54e0101e51c8" + integrity sha512-YbPaal9LxztSGhmndR46FmAbkJ/1fAsw293tSU+I5E5h+cnJ3d4GTwyUgGYmOXJYdGA+uNePle4qbaRzj2NISQ== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-validator-option" "^7.21.0" - "@babel/plugin-syntax-jsx" "^7.21.4" - "@babel/plugin-transform-modules-commonjs" "^7.21.5" - "@babel/plugin-transform-typescript" "^7.21.3" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.5" + "@babel/plugin-syntax-jsx" "^7.22.5" + "@babel/plugin-transform-modules-commonjs" "^7.22.5" + "@babel/plugin-transform-typescript" "^7.22.5" "@babel/regjsgen@^0.8.0": version "0.8.0" @@ -1150,13 +1199,13 @@ regenerator-runtime "^0.12.0" "@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.13.8", "@babel/runtime@^7.2.0", "@babel/runtime@^7.20.13", "@babel/runtime@^7.20.7", "@babel/runtime@^7.22.3", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.3.tgz#0a7fce51d43adbf0f7b517a71f4c3aaca92ebcbb" - integrity sha512-XsDuspWKLUsxwCp6r7EhsExHtYfbe5oAGQ19kqngTdCPUoPQzOPdUbD/pB9PJiwb2ptYKQDjSJT3R6dC+EPqfQ== + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.5.tgz#8564dd588182ce0047d55d7a75e93921107b57ec" + integrity sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA== dependencies: regenerator-runtime "^0.13.11" -"@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.3.3": +"@babel/template@^7.20.7", "@babel/template@^7.3.3": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== @@ -1174,6 +1223,15 @@ "@babel/parser" "^7.21.9" "@babel/types" "^7.21.5" +"@babel/template@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec" + integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== + dependencies: + "@babel/code-frame" "^7.22.5" + "@babel/parser" "^7.22.5" + "@babel/types" "^7.22.5" + "@babel/traverse@7": version "7.21.5" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.5.tgz#ad22361d352a5154b498299d523cf72998a4b133" @@ -1190,7 +1248,7 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/traverse@^7.18.10", "@babel/traverse@^7.20.7", "@babel/traverse@^7.21.5", "@babel/traverse@^7.22.1", "@babel/traverse@^7.7.2": +"@babel/traverse@^7.21.5", "@babel/traverse@^7.22.1", "@babel/traverse@^7.7.2": version "7.22.4" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.4.tgz#c3cf96c5c290bd13b55e29d025274057727664c0" integrity sha512-Tn1pDsjIcI+JcLKq1AVlZEr4226gpuAQTsLMorsYg9tuS/kG7nuwwJ4AB8jfQuEgb/COBwR/DqJxmoiYFu5/rQ== @@ -1206,7 +1264,23 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.12.11", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.4", "@babel/types@^7.21.5", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": +"@babel/traverse@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.5.tgz#44bd276690db6f4940fdb84e1cb4abd2f729ccd1" + integrity sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ== + dependencies: + "@babel/code-frame" "^7.22.5" + "@babel/generator" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.5" + "@babel/parser" "^7.22.5" + "@babel/types" "^7.22.5" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.12.11", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.4", "@babel/types@^7.21.5", "@babel/types@^7.3.0", "@babel/types@^7.3.3": version "7.21.5" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.5.tgz#18dfbd47c39d3904d5db3d3dc2cc80bedb60e5b6" integrity sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q== @@ -1215,6 +1289,15 @@ "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" +"@babel/types@^7.18.6", "@babel/types@^7.22.5", "@babel/types@^7.4.4": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.5.tgz#cd93eeaab025880a3a47ec881f4b096a5b786fbe" + integrity sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA== + dependencies: + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" + to-fast-properties "^2.0.0" + "@babel/types@^7.22.0", "@babel/types@^7.22.3", "@babel/types@^7.22.4": version "7.22.4" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.4.tgz#56a2653ae7e7591365dabf20b76295410684c071" @@ -1735,15 +1818,7 @@ "@types/yargs" "^17.0.8" chalk "^4.0.0" -"@jridgewell/gen-mapping@^0.1.0": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" - integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== - dependencies: - "@jridgewell/set-array" "^1.0.0" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/gen-mapping@^0.3.0": +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": version "0.3.3" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== @@ -1752,26 +1827,17 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/gen-mapping@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" - integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - "@jridgewell/resolve-uri@3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== "@jridgewell/resolve-uri@^3.0.3": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.4.tgz#b876e3feefb9c8d3aa84014da28b5e52a0640d72" - integrity sha512-cz8HFjOFfUBtvN+NXYSFMHYRdxZMaEl0XypVrhzxBgadKIXhIkRd8aMeHhmF56Sl7SuS8OnUpQ73/k9LE4VnLg== + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== -"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": +"@jridgewell/set-array@^1.0.1": version "1.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== @@ -1789,17 +1855,12 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== -"@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.10" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.10.tgz#baf57b4e2a690d4f38560171f91783656b7f8186" - integrity sha512-Ht8wIW5v165atIX1p+JvKR5ONzUyF4Ac8DZIQ5kZs9zrb6M8SJNXpx1zn04rn65VjBMygRoMXcyYwNK0fT7bEg== - -"@jridgewell/sourcemap-codec@^1.4.13": +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.13": version "1.4.15" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.15", "@jridgewell/trace-mapping@^0.3.9": +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.15": version "0.3.15" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz#aba35c48a38d3fd84b37e66c9c0423f9744f9774" integrity sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g== @@ -1807,10 +1868,10 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@jridgewell/trace-mapping@^0.3.17": - version "0.3.17" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" - integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.18" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" + integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== dependencies: "@jridgewell/resolve-uri" "3.1.0" "@jridgewell/sourcemap-codec" "1.4.14" @@ -3736,7 +3797,7 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@^4.0.0, browserslist@^4.21.3, browserslist@^4.21.4, browserslist@^4.21.5: +browserslist@^4.0.0, browserslist@^4.21.4: version "4.21.5" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== @@ -3746,6 +3807,16 @@ browserslist@^4.0.0, browserslist@^4.21.3, browserslist@^4.21.4, browserslist@^4 node-releases "^2.0.8" update-browserslist-db "^1.0.10" +browserslist@^4.21.3, browserslist@^4.21.5: + version "4.21.8" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.8.tgz#db2498e1f4b80ed199c076248a094935860b6017" + integrity sha512-j+7xYe+v+q2Id9qbBeCI8WX5NmZSRe8es1+0xntD/+gaWXznP8tFEkv5IgSaHf5dS1YwVMbX/4W6m937mj+wQw== + dependencies: + caniuse-lite "^1.0.30001502" + electron-to-chromium "^1.4.428" + node-releases "^2.0.12" + update-browserslist-db "^1.0.11" + bser@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" @@ -3904,11 +3975,16 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001449, caniuse-lite@^1.0.30001464: +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001464: version "1.0.30001466" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001466.tgz#c1e6197c540392e09709ecaa9e3e403428c53375" integrity sha512-ewtFBSfWjEmxUgNBSZItFSmVtvk9zkwkl1OfRZlKA8slltRN+/C/tuGVrF9styXkN36Yu3+SeJ1qkXxDEyNZ5w== +caniuse-lite@^1.0.30001449, caniuse-lite@^1.0.30001502: + version "1.0.30001502" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001502.tgz#f7e4a76eb1d2d585340f773767be1fefc118dca8" + integrity sha512-AZ+9tFXw1sS0o0jcpJQIXvFTOB/xGiQ4OQ2t98QX3NDn2EZTSRBC801gxrsGgViuq2ak/NLkNgSNEPtCr5lfKg== + chalk@5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.2.0.tgz#249623b7d66869c673699fb66d65723e54dfcfb3" @@ -4137,7 +4213,7 @@ color-convert@^2.0.1: color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== color-name@~1.1.4: version "1.1.4" @@ -4274,13 +4350,18 @@ content-type@~1.0.4: resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== -convert-source-map@^1.5.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: +convert-source-map@^1.5.0, convert-source-map@^1.6.0: version "1.8.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== dependencies: safe-buffer "~5.1.1" +convert-source-map@^1.7.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + convert-source-map@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" @@ -4302,9 +4383,9 @@ copy-descriptor@^0.1.0: integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= core-js-compat@^3.30.1, core-js-compat@^3.30.2: - version "3.30.2" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.30.2.tgz#83f136e375babdb8c80ad3c22d67c69098c1dd8b" - integrity sha512-nriW1nuJjUgvkEjIot1Spwakz52V9YkYHZAQG6A1eCgC8AA1p0zngrQEP9R0+V6hji5XilWKG1Bd0YRppmGimA== + version "3.31.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.31.0.tgz#4030847c0766cc0e803dcdfb30055d7ef2064bf1" + integrity sha512-hM7YCu1cU6Opx7MXNu0NuumM0ezNeAeRKadixyiQELWY3vT3De9S4J5ZBMraWV2vZnrE1Cirl0GtFtDtMUXzPw== dependencies: browserslist "^4.21.5" @@ -5005,10 +5086,10 @@ ejs@^3.1.6: dependencies: jake "^10.8.5" -electron-to-chromium@^1.4.284: - version "1.4.330" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.330.tgz#4740378db7160d7210afb29800c74048cdf10a99" - integrity sha512-PqyefhybrVdjAJ45HaPLtuVaehiSw7C3ya0aad+rvmV53IVyXmYRk3pwIOb2TxTDTnmgQdn46NjMMaysx79/6Q== +electron-to-chromium@^1.4.284, electron-to-chromium@^1.4.428: + version "1.4.428" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.428.tgz#c31fc88e854f49d8305cdabf6ec934ff1588a902" + integrity sha512-L7uUknyY286of0AYC8CKfgWstD0Smk2DvHDi9F0GWQhSH90Bzi7iDrmCbZKz75tYJxeGSAc7TYeKpmbjMDoh1w== elliptic@^6.5.3: version "6.5.4" @@ -5191,7 +5272,7 @@ escape-html@^1.0.3, escape-html@~1.0.3: escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== escape-string-regexp@^2.0.0: version "2.0.0" @@ -6226,7 +6307,7 @@ has-bigints@^1.0.2: has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-flag@^4.0.0: version "4.0.0" @@ -6769,13 +6850,20 @@ is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-core-module@^2.11.0, is-core-module@^2.5.0, is-core-module@^2.9.0: +is-core-module@^2.11.0, is-core-module@^2.5.0: version "2.11.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== dependencies: has "^1.0.3" +is-core-module@^2.9.0: + version "2.12.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" + integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== + dependencies: + has "^1.0.3" + is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" @@ -7670,7 +7758,7 @@ jsesc@^2.5.1: jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== json-parse-better-errors@^1.0.2: version "1.0.2" @@ -7914,7 +8002,7 @@ lockfile@^1.0: lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== lodash.get@^4.0: version "4.4.2" @@ -8503,10 +8591,10 @@ node-libs-browser@^2.2.1: util "^0.11.0" vm-browserify "^1.0.1" -node-releases@^2.0.8: - version "2.0.10" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" - integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== +node-releases@^2.0.12, node-releases@^2.0.8: + version "2.0.12" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.12.tgz#35627cc224a23bfb06fb3380f2b3afaaa7eb1039" + integrity sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ== normalize-package-data@^2.5.0: version "2.5.0" @@ -10039,13 +10127,6 @@ redux@^4.0.0, redux@^4.2.1: dependencies: "@babel/runtime" "^7.9.2" -regenerate-unicode-properties@^10.0.1: - version "10.0.1" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz#7f442732aa7934a3740c779bb9b3340dccc1fb56" - integrity sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw== - dependencies: - regenerate "^1.4.2" - regenerate-unicode-properties@^10.1.0: version "10.1.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" @@ -10092,18 +10173,6 @@ regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.4.3: define-properties "^1.1.3" functions-have-names "^1.2.2" -regexpu-core@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.1.0.tgz#2f8504c3fd0ebe11215783a41541e21c79942c6d" - integrity sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA== - dependencies: - regenerate "^1.4.2" - regenerate-unicode-properties "^10.0.1" - regjsgen "^0.6.0" - regjsparser "^0.8.2" - unicode-match-property-ecmascript "^2.0.0" - unicode-match-property-value-ecmascript "^2.0.0" - regexpu-core@^5.3.1: version "5.3.2" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" @@ -10116,18 +10185,6 @@ regexpu-core@^5.3.1: unicode-match-property-ecmascript "^2.0.0" unicode-match-property-value-ecmascript "^2.1.0" -regjsgen@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.6.0.tgz#83414c5354afd7d6627b16af5f10f41c4e71808d" - integrity sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA== - -regjsparser@^0.8.2: - version "0.8.4" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.8.4.tgz#8a14285ffcc5de78c5b95d62bbf413b6bc132d5f" - integrity sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA== - dependencies: - jsesc "~0.5.0" - regjsparser@^0.9.1: version "0.9.1" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" @@ -10237,7 +10294,7 @@ resolve.exports@^2.0.0: resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.0.tgz#c1a0028c2d166ec2fbf7d0644584927e76e7400e" integrity sha512-6K/gDlqgQscOlg9fSRpWstA8sYe8rbELsSTNpx+3kTrsVCzvSl0zIvRErM7fdl9ERWDsKnrLnwB+Ne89918XOg== -resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.1: +resolve@^1.10.0, resolve@^1.12.0, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.1: version "1.22.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== @@ -10246,6 +10303,15 @@ resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.2 path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +resolve@^1.14.2: + version "1.22.2" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" + integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== + dependencies: + is-core-module "^2.11.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + resolve@^2.0.0-next.4: version "2.0.0-next.4" resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660" @@ -11479,7 +11545,7 @@ to-arraybuffer@^1.0.0: to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== to-object-path@^0.3.0: version "0.3.0" @@ -11718,20 +11784,15 @@ unicode-match-property-ecmascript@^2.0.0: unicode-canonical-property-names-ecmascript "^2.0.0" unicode-property-aliases-ecmascript "^2.0.0" -unicode-match-property-value-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714" - integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw== - unicode-match-property-value-ecmascript@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== unicode-property-aliases-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8" - integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ== + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" + integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== union-value@^1.0.0: version "1.0.1" @@ -11797,10 +11858,10 @@ upath@^1.1.1, upath@^1.2.0: resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== -update-browserslist-db@^1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" - integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== +update-browserslist-db@^1.0.10, update-browserslist-db@^1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" + integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== dependencies: escalade "^3.1.1" picocolors "^1.0.0" From 4c5f62de9976b59e59f01c6be571073703e24640 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 14 Jun 2023 03:34:01 -0400 Subject: [PATCH 027/118] Extract shared examples from api specs (#25387) --- .../api/v1/accounts_controller_spec.rb | 8 ------- .../admin/account_actions_controller_spec.rb | 16 ------------- .../api/v1/admin/accounts_controller_spec.rb | 16 ------------- .../preview_card_providers_controller_spec.rb | 16 ------------- .../v1/admin/trends/links_controller_spec.rb | 16 ------------- .../admin/trends/statuses_controller_spec.rb | 16 ------------- .../v1/admin/trends/tags_controller_spec.rb | 16 ------------- .../api/v1/domain_blocks_controller_spec.rb | 8 ------- .../api/v2/admin/accounts_controller_spec.rb | 16 ------------- .../v1/admin/canonical_email_blocks_spec.rb | 20 ---------------- .../api/v1/admin/domain_allows_spec.rb | 20 ---------------- .../api/v1/admin/domain_blocks_spec.rb | 20 ---------------- .../api/v1/admin/email_domain_blocks_spec.rb | 20 ---------------- spec/requests/api/v1/admin/ip_blocks_spec.rb | 20 ---------------- spec/requests/api/v1/admin/reports_spec.rb | 20 ---------------- spec/requests/api/v1/featured_tags_spec.rb | 8 ------- spec/support/examples/api.rb | 23 +++++++++++++++++++ 17 files changed, 23 insertions(+), 256 deletions(-) create mode 100644 spec/support/examples/api.rb diff --git a/spec/controllers/api/v1/accounts_controller_spec.rb b/spec/controllers/api/v1/accounts_controller_spec.rb index 49d2867745..0daec691a5 100644 --- a/spec/controllers/api/v1/accounts_controller_spec.rb +++ b/spec/controllers/api/v1/accounts_controller_spec.rb @@ -13,14 +13,6 @@ RSpec.describe Api::V1::AccountsController do allow(controller).to receive(:doorkeeper_token) { token } end - shared_examples 'forbidden for wrong scope' do |wrong_scope| - let(:scopes) { wrong_scope } - - it 'returns http forbidden' do - expect(response).to have_http_status(403) - end - end - describe 'POST #create' do let(:app) { Fabricate(:application) } let(:token) { Doorkeeper::AccessToken.find_or_create_for(application: app, resource_owner: nil, scopes: 'read write', use_refresh_token: false) } diff --git a/spec/controllers/api/v1/admin/account_actions_controller_spec.rb b/spec/controllers/api/v1/admin/account_actions_controller_spec.rb index 0f39a80b12..523350e123 100644 --- a/spec/controllers/api/v1/admin/account_actions_controller_spec.rb +++ b/spec/controllers/api/v1/admin/account_actions_controller_spec.rb @@ -15,22 +15,6 @@ RSpec.describe Api::V1::Admin::AccountActionsController do allow(controller).to receive(:doorkeeper_token) { token } end - shared_examples 'forbidden for wrong scope' do |wrong_scope| - let(:scopes) { wrong_scope } - - it 'returns http forbidden' do - expect(response).to have_http_status(403) - end - end - - shared_examples 'forbidden for wrong role' do |wrong_role| - let(:role) { UserRole.find_by(name: wrong_role) } - - it 'returns http forbidden' do - expect(response).to have_http_status(403) - end - end - describe 'POST #create' do context 'with type of disable' do before do diff --git a/spec/controllers/api/v1/admin/accounts_controller_spec.rb b/spec/controllers/api/v1/admin/accounts_controller_spec.rb index 852a521021..36f6e398cb 100644 --- a/spec/controllers/api/v1/admin/accounts_controller_spec.rb +++ b/spec/controllers/api/v1/admin/accounts_controller_spec.rb @@ -15,22 +15,6 @@ RSpec.describe Api::V1::Admin::AccountsController do allow(controller).to receive(:doorkeeper_token) { token } end - shared_examples 'forbidden for wrong scope' do |wrong_scope| - let(:scopes) { wrong_scope } - - it 'returns http forbidden' do - expect(response).to have_http_status(403) - end - end - - shared_examples 'forbidden for wrong role' do |wrong_role| - let(:role) { UserRole.find_by(name: wrong_role) } - - it 'returns http forbidden' do - expect(response).to have_http_status(403) - end - end - describe 'GET #index' do let!(:remote_account) { Fabricate(:account, domain: 'example.org') } let!(:other_remote_account) { Fabricate(:account, domain: 'foo.bar') } diff --git a/spec/controllers/api/v1/admin/trends/links/preview_card_providers_controller_spec.rb b/spec/controllers/api/v1/admin/trends/links/preview_card_providers_controller_spec.rb index 883a55b7b6..76e215440d 100644 --- a/spec/controllers/api/v1/admin/trends/links/preview_card_providers_controller_spec.rb +++ b/spec/controllers/api/v1/admin/trends/links/preview_card_providers_controller_spec.rb @@ -16,22 +16,6 @@ describe Api::V1::Admin::Trends::Links::PreviewCardProvidersController do allow(controller).to receive(:doorkeeper_token) { token } end - shared_examples 'forbidden for wrong scope' do |wrong_scope| - let(:scopes) { wrong_scope } - - it 'returns http forbidden' do - expect(response).to have_http_status(403) - end - end - - shared_examples 'forbidden for wrong role' do |wrong_role| - let(:role) { UserRole.find_by(name: wrong_role) } - - it 'returns http forbidden' do - expect(response).to have_http_status(403) - end - end - describe 'GET #index' do it 'returns http success' do get :index, params: { account_id: account.id, limit: 2 } diff --git a/spec/controllers/api/v1/admin/trends/links_controller_spec.rb b/spec/controllers/api/v1/admin/trends/links_controller_spec.rb index 9c144d3faf..d9aa06824d 100644 --- a/spec/controllers/api/v1/admin/trends/links_controller_spec.rb +++ b/spec/controllers/api/v1/admin/trends/links_controller_spec.rb @@ -16,22 +16,6 @@ describe Api::V1::Admin::Trends::LinksController do allow(controller).to receive(:doorkeeper_token) { token } end - shared_examples 'forbidden for wrong scope' do |wrong_scope| - let(:scopes) { wrong_scope } - - it 'returns http forbidden' do - expect(response).to have_http_status(403) - end - end - - shared_examples 'forbidden for wrong role' do |wrong_role| - let(:role) { UserRole.find_by(name: wrong_role) } - - it 'returns http forbidden' do - expect(response).to have_http_status(403) - end - end - describe 'GET #index' do it 'returns http success' do get :index, params: { account_id: account.id, limit: 2 } diff --git a/spec/controllers/api/v1/admin/trends/statuses_controller_spec.rb b/spec/controllers/api/v1/admin/trends/statuses_controller_spec.rb index d25186b376..4d80055ac0 100644 --- a/spec/controllers/api/v1/admin/trends/statuses_controller_spec.rb +++ b/spec/controllers/api/v1/admin/trends/statuses_controller_spec.rb @@ -16,22 +16,6 @@ describe Api::V1::Admin::Trends::StatusesController do allow(controller).to receive(:doorkeeper_token) { token } end - shared_examples 'forbidden for wrong scope' do |wrong_scope| - let(:scopes) { wrong_scope } - - it 'returns http forbidden' do - expect(response).to have_http_status(403) - end - end - - shared_examples 'forbidden for wrong role' do |wrong_role| - let(:role) { UserRole.find_by(name: wrong_role) } - - it 'returns http forbidden' do - expect(response).to have_http_status(403) - end - end - describe 'GET #index' do it 'returns http success' do get :index, params: { account_id: account.id, limit: 2 } diff --git a/spec/controllers/api/v1/admin/trends/tags_controller_spec.rb b/spec/controllers/api/v1/admin/trends/tags_controller_spec.rb index 5ee443d575..0b8eb8c3b8 100644 --- a/spec/controllers/api/v1/admin/trends/tags_controller_spec.rb +++ b/spec/controllers/api/v1/admin/trends/tags_controller_spec.rb @@ -16,22 +16,6 @@ describe Api::V1::Admin::Trends::TagsController do allow(controller).to receive(:doorkeeper_token) { token } end - shared_examples 'forbidden for wrong scope' do |wrong_scope| - let(:scopes) { wrong_scope } - - it 'returns http forbidden' do - expect(response).to have_http_status(403) - end - end - - shared_examples 'forbidden for wrong role' do |wrong_role| - let(:role) { UserRole.find_by(name: wrong_role) } - - it 'returns http forbidden' do - expect(response).to have_http_status(403) - end - end - describe 'GET #index' do it 'returns http success' do get :index, params: { account_id: account.id, limit: 2 } diff --git a/spec/controllers/api/v1/domain_blocks_controller_spec.rb b/spec/controllers/api/v1/domain_blocks_controller_spec.rb index aa98ec4c32..20b2909e63 100644 --- a/spec/controllers/api/v1/domain_blocks_controller_spec.rb +++ b/spec/controllers/api/v1/domain_blocks_controller_spec.rb @@ -13,14 +13,6 @@ RSpec.describe Api::V1::DomainBlocksController do allow(controller).to receive(:doorkeeper_token) { token } end - shared_examples 'forbidden for wrong scope' do |wrong_scope| - let(:scopes) { wrong_scope } - - it 'returns http forbidden' do - expect(response).to have_http_status(403) - end - end - describe 'GET #show' do let(:scopes) { 'read:blocks' } diff --git a/spec/controllers/api/v2/admin/accounts_controller_spec.rb b/spec/controllers/api/v2/admin/accounts_controller_spec.rb index 762c84af94..a775be1709 100644 --- a/spec/controllers/api/v2/admin/accounts_controller_spec.rb +++ b/spec/controllers/api/v2/admin/accounts_controller_spec.rb @@ -15,22 +15,6 @@ RSpec.describe Api::V2::Admin::AccountsController do allow(controller).to receive(:doorkeeper_token) { token } end - shared_examples 'forbidden for wrong scope' do |wrong_scope| - let(:scopes) { wrong_scope } - - it 'returns http forbidden' do - expect(response).to have_http_status(403) - end - end - - shared_examples 'forbidden for wrong role' do |wrong_role| - let(:role) { UserRole.find_by(name: wrong_role) } - - it 'returns http forbidden' do - expect(response).to have_http_status(403) - end - end - describe 'GET #index' do let!(:remote_account) { Fabricate(:account, domain: 'example.org') } let!(:other_remote_account) { Fabricate(:account, domain: 'foo.bar') } diff --git a/spec/requests/api/v1/admin/canonical_email_blocks_spec.rb b/spec/requests/api/v1/admin/canonical_email_blocks_spec.rb index d70e6fc8a1..4382cb84e5 100644 --- a/spec/requests/api/v1/admin/canonical_email_blocks_spec.rb +++ b/spec/requests/api/v1/admin/canonical_email_blocks_spec.rb @@ -9,26 +9,6 @@ RSpec.describe 'Canonical Email Blocks' do let(:scopes) { 'admin:read:canonical_email_blocks admin:write:canonical_email_blocks' } let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } - shared_examples 'forbidden for wrong scope' do |wrong_scope| - let(:scopes) { wrong_scope } - - it 'returns http forbidden' do - subject - - expect(response).to have_http_status(403) - end - end - - shared_examples 'forbidden for wrong role' do |wrong_role| - let(:role) { UserRole.find_by(name: wrong_role) } - - it 'returns http forbidden' do - subject - - expect(response).to have_http_status(403) - end - end - describe 'GET /api/v1/admin/canonical_email_blocks' do subject do get '/api/v1/admin/canonical_email_blocks', headers: headers, params: params diff --git a/spec/requests/api/v1/admin/domain_allows_spec.rb b/spec/requests/api/v1/admin/domain_allows_spec.rb index eb7915e77a..96000e3ef4 100644 --- a/spec/requests/api/v1/admin/domain_allows_spec.rb +++ b/spec/requests/api/v1/admin/domain_allows_spec.rb @@ -9,26 +9,6 @@ RSpec.describe 'Domain Allows' do let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } - shared_examples 'forbidden for wrong scope' do |wrong_scope| - let(:scopes) { wrong_scope } - - it 'returns http forbidden' do - subject - - expect(response).to have_http_status(403) - end - end - - shared_examples 'forbidden for wrong role' do |wrong_role| - let(:role) { UserRole.find_by(name: wrong_role) } - - it 'returns http forbidden' do - subject - - expect(response).to have_http_status(403) - end - end - describe 'GET /api/v1/admin/domain_allows' do subject do get '/api/v1/admin/domain_allows', headers: headers, params: params diff --git a/spec/requests/api/v1/admin/domain_blocks_spec.rb b/spec/requests/api/v1/admin/domain_blocks_spec.rb index b3d52311b3..7a5ac28c56 100644 --- a/spec/requests/api/v1/admin/domain_blocks_spec.rb +++ b/spec/requests/api/v1/admin/domain_blocks_spec.rb @@ -9,26 +9,6 @@ RSpec.describe 'Domain Blocks' do let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } - shared_examples 'forbidden for wrong scope' do |wrong_scope| - let(:scopes) { wrong_scope } - - it 'returns http forbidden' do - subject - - expect(response).to have_http_status(403) - end - end - - shared_examples 'forbidden for wrong role' do |wrong_role| - let(:role) { UserRole.find_by(name: wrong_role) } - - it 'returns http forbidden' do - subject - - expect(response).to have_http_status(403) - end - end - describe 'GET /api/v1/admin/domain_blocks' do subject do get '/api/v1/admin/domain_blocks', headers: headers, params: params diff --git a/spec/requests/api/v1/admin/email_domain_blocks_spec.rb b/spec/requests/api/v1/admin/email_domain_blocks_spec.rb index a24f22be21..d512def866 100644 --- a/spec/requests/api/v1/admin/email_domain_blocks_spec.rb +++ b/spec/requests/api/v1/admin/email_domain_blocks_spec.rb @@ -10,26 +10,6 @@ RSpec.describe 'Email Domain Blocks' do let(:scopes) { 'admin:read:email_domain_blocks admin:write:email_domain_blocks' } let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } - shared_examples 'forbidden for wrong scope' do |wrong_scope| - let(:scopes) { wrong_scope } - - it 'returns http forbidden' do - subject - - expect(response).to have_http_status(403) - end - end - - shared_examples 'forbidden for wrong role' do |wrong_role| - let(:role) { UserRole.find_by(name: wrong_role) } - - it 'returns http forbidden' do - subject - - expect(response).to have_http_status(403) - end - end - describe 'GET /api/v1/admin/email_domain_blocks' do subject do get '/api/v1/admin/email_domain_blocks', headers: headers, params: params diff --git a/spec/requests/api/v1/admin/ip_blocks_spec.rb b/spec/requests/api/v1/admin/ip_blocks_spec.rb index 2091ef3dc6..d03886c51b 100644 --- a/spec/requests/api/v1/admin/ip_blocks_spec.rb +++ b/spec/requests/api/v1/admin/ip_blocks_spec.rb @@ -9,26 +9,6 @@ RSpec.describe 'IP Blocks' do let(:scopes) { 'admin:read:ip_blocks admin:write:ip_blocks' } let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } - shared_examples 'forbidden for wrong scope' do |wrong_scope| - let(:scopes) { wrong_scope } - - it 'returns http forbidden' do - subject - - expect(response).to have_http_status(403) - end - end - - shared_examples 'forbidden for wrong role' do |wrong_role| - let(:role) { UserRole.find_by(name: wrong_role) } - - it 'returns http forbidden' do - subject - - expect(response).to have_http_status(403) - end - end - describe 'GET /api/v1/admin/ip_blocks' do subject do get '/api/v1/admin/ip_blocks', headers: headers, params: params diff --git a/spec/requests/api/v1/admin/reports_spec.rb b/spec/requests/api/v1/admin/reports_spec.rb index cd9fc100e7..91c3c11f5d 100644 --- a/spec/requests/api/v1/admin/reports_spec.rb +++ b/spec/requests/api/v1/admin/reports_spec.rb @@ -9,26 +9,6 @@ RSpec.describe 'Reports' do let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } - shared_examples 'forbidden for wrong scope' do |wrong_scope| - let(:scopes) { wrong_scope } - - it 'returns http forbidden' do - subject - - expect(response).to have_http_status(403) - end - end - - shared_examples 'forbidden for wrong role' do |wrong_role| - let(:role) { UserRole.find_by(name: wrong_role) } - - it 'returns http forbidden' do - subject - - expect(response).to have_http_status(403) - end - end - describe 'GET /api/v1/admin/reports' do subject do get '/api/v1/admin/reports', headers: headers, params: params diff --git a/spec/requests/api/v1/featured_tags_spec.rb b/spec/requests/api/v1/featured_tags_spec.rb index 8a552c1d4b..6c171f6e47 100644 --- a/spec/requests/api/v1/featured_tags_spec.rb +++ b/spec/requests/api/v1/featured_tags_spec.rb @@ -8,14 +8,6 @@ RSpec.describe 'FeaturedTags' do let(:scopes) { 'read:accounts write:accounts' } let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } - shared_examples 'forbidden for wrong scope' do |wrong_scope| - let(:scopes) { wrong_scope } - - it 'returns http forbidden' do - expect(response).to have_http_status(403) - end - end - describe 'GET /api/v1/featured_tags' do context 'with wrong scope' do before do diff --git a/spec/support/examples/api.rb b/spec/support/examples/api.rb new file mode 100644 index 0000000000..d531860abf --- /dev/null +++ b/spec/support/examples/api.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +shared_examples 'forbidden for wrong scope' do |wrong_scope| + let(:scopes) { wrong_scope } + + it 'returns http forbidden' do + # Some examples have a subject which needs to be called to make a request + subject if request.nil? + + expect(response).to have_http_status(403) + end +end + +shared_examples 'forbidden for wrong role' do |wrong_role| + let(:role) { UserRole.find_by(name: wrong_role) } + + it 'returns http forbidden' do + # Some examples have a subject which needs to be called to make a request + subject if request.nil? + + expect(response).to have_http_status(403) + end +end From a6407aa6629b9224ca4f357d99f387bd76a6fecc Mon Sep 17 00:00:00 2001 From: Daniel M Brasil Date: Wed, 14 Jun 2023 04:48:48 -0300 Subject: [PATCH 028/118] Migrate to request specs in `/api/v1/apps` (#25401) --- .../api/v1/apps_spec.rb} | 57 ++++++++++++++----- 1 file changed, 42 insertions(+), 15 deletions(-) rename spec/{controllers/api/v1/apps_controller_spec.rb => requests/api/v1/apps_spec.rb} (69%) diff --git a/spec/controllers/api/v1/apps_controller_spec.rb b/spec/requests/api/v1/apps_spec.rb similarity index 69% rename from spec/controllers/api/v1/apps_controller_spec.rb rename to spec/requests/api/v1/apps_spec.rb index de2a07f20a..88f9eee360 100644 --- a/spec/controllers/api/v1/apps_controller_spec.rb +++ b/spec/requests/api/v1/apps_spec.rb @@ -2,16 +2,18 @@ require 'rails_helper' -RSpec.describe Api::V1::AppsController do - render_views +RSpec.describe 'Apps' do + describe 'POST /api/v1/apps' do + subject do + post '/api/v1/apps', params: params + end - describe 'POST #create' do - let(:client_name) { 'Test app' } - let(:scopes) { nil } + let(:client_name) { 'Test app' } + let(:scopes) { nil } let(:redirect_uris) { 'urn:ietf:wg:oauth:2.0:oob' } - let(:website) { nil } + let(:website) { nil } - let(:app_params) do + let(:params) do { client_name: client_name, redirect_uris: redirect_uris, @@ -20,24 +22,26 @@ RSpec.describe Api::V1::AppsController do } end - before do - post :create, params: app_params - end - context 'with valid params' do it 'returns http success' do + subject + expect(response).to have_http_status(200) end it 'creates an OAuth app' do - expect(Doorkeeper::Application.find_by(name: client_name)).to_not be_nil + subject + + expect(Doorkeeper::Application.find_by(name: client_name)).to be_present end it 'returns client ID and client secret' do - json = body_as_json + subject - expect(json[:client_id]).to_not be_blank - expect(json[:client_secret]).to_not be_blank + body = body_as_json + + expect(body[:client_id]).to be_present + expect(body[:client_secret]).to be_present end end @@ -45,6 +49,8 @@ RSpec.describe Api::V1::AppsController do let(:scopes) { 'hoge' } it 'returns http unprocessable entity' do + subject + expect(response).to have_http_status(422) end end @@ -53,10 +59,14 @@ RSpec.describe Api::V1::AppsController do let(:scopes) { (%w(read) * 40).join(' ') } it 'returns http success' do + subject + expect(response).to have_http_status(200) end it 'only saves the scope once' do + subject + expect(Doorkeeper::Application.find_by(name: client_name).scopes.to_s).to eq 'read' end end @@ -65,6 +75,8 @@ RSpec.describe Api::V1::AppsController do let(:client_name) { 'hoge' * 20 } it 'returns http unprocessable entity' do + subject + expect(response).to have_http_status(422) end end @@ -73,6 +85,8 @@ RSpec.describe Api::V1::AppsController do let(:website) { "https://foo.bar/#{'hoge' * 2_000}" } it 'returns http unprocessable entity' do + subject + expect(response).to have_http_status(422) end end @@ -81,6 +95,19 @@ RSpec.describe Api::V1::AppsController do let(:redirect_uris) { "https://foo.bar/#{'hoge' * 2_000}" } it 'returns http unprocessable entity' do + subject + + expect(response).to have_http_status(422) + end + end + + context 'without required params' do + let(:client_name) { '' } + let(:redirect_uris) { '' } + + it 'returns http unprocessable entity' do + subject + expect(response).to have_http_status(422) end end From a5b62e56d02cf7bbe43f30396475c41ff0628513 Mon Sep 17 00:00:00 2001 From: Daniel M Brasil Date: Wed, 14 Jun 2023 04:48:57 -0300 Subject: [PATCH 029/118] Migrate to request specs in `/api/v1/apps/verify_credentials` (#25404) --- .../v1/apps/credentials_controller_spec.rb | 45 ------------------- spec/requests/api/v1/apps/credentials_spec.rb | 44 ++++++++++++++++++ 2 files changed, 44 insertions(+), 45 deletions(-) delete mode 100644 spec/controllers/api/v1/apps/credentials_controller_spec.rb create mode 100644 spec/requests/api/v1/apps/credentials_spec.rb diff --git a/spec/controllers/api/v1/apps/credentials_controller_spec.rb b/spec/controllers/api/v1/apps/credentials_controller_spec.rb deleted file mode 100644 index 350e0c7a02..0000000000 --- a/spec/controllers/api/v1/apps/credentials_controller_spec.rb +++ /dev/null @@ -1,45 +0,0 @@ -# frozen_string_literal: true - -require 'rails_helper' - -describe Api::V1::Apps::CredentialsController do - render_views - - let(:token) { Fabricate(:accessible_access_token, scopes: 'read', application: Fabricate(:application)) } - - context 'with an oauth token' do - before do - allow(controller).to receive(:doorkeeper_token) { token } - end - - describe 'GET #show' do - before do - get :show - end - - it 'returns http success' do - expect(response).to have_http_status(200) - end - - it 'does not contain client credentials' do - json = body_as_json - - expect(json).to_not have_key(:client_secret) - expect(json).to_not have_key(:client_id) - end - end - end - - context 'without an oauth token' do - before do - allow(controller).to receive(:doorkeeper_token).and_return(nil) - end - - describe 'GET #show' do - it 'returns http unauthorized' do - get :show - expect(response).to have_http_status(401) - end - end - end -end diff --git a/spec/requests/api/v1/apps/credentials_spec.rb b/spec/requests/api/v1/apps/credentials_spec.rb new file mode 100644 index 0000000000..dafe168c56 --- /dev/null +++ b/spec/requests/api/v1/apps/credentials_spec.rb @@ -0,0 +1,44 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe 'Credentials' do + describe 'GET /api/v1/apps/verify_credentials' do + subject do + get '/api/v1/apps/verify_credentials', headers: headers + end + + context 'with an oauth token' do + let(:token) { Fabricate(:accessible_access_token, scopes: 'read', application: Fabricate(:application)) } + let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + + it 'returns the app information correctly' do + subject + + expect(body_as_json).to match( + a_hash_including( + name: token.application.name, + website: token.application.website, + vapid_key: Rails.configuration.x.vapid_public_key + ) + ) + end + end + + context 'without an oauth token' do + let(:headers) { {} } + + it 'returns http unauthorized' do + subject + + expect(response).to have_http_status(401) + end + end + end +end From 31d5bc89d12cd2c5c9b148e4abaa37b2f553a8d5 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 14 Jun 2023 03:56:11 -0400 Subject: [PATCH 030/118] Speed improvement for `AccountsStatusesCleanupScheduler` spec (#25406) --- .rubocop_todo.yml | 2 - ...ccounts_statuses_cleanup_scheduler_spec.rb | 83 ++++++++++--------- 2 files changed, 43 insertions(+), 42 deletions(-) diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index c82cc2a4b7..4cf238595b 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -56,7 +56,6 @@ Lint/AmbiguousBlockAssociation: - 'spec/controllers/settings/two_factor_authentication/otp_authentication_controller_spec.rb' - 'spec/services/activitypub/process_status_update_service_spec.rb' - 'spec/services/post_status_service_spec.rb' - - 'spec/workers/scheduler/accounts_statuses_cleanup_scheduler_spec.rb' # Configuration parameters: AllowComments, AllowEmptyLambdas. Lint/EmptyBlock: @@ -359,7 +358,6 @@ RSpec/LetSetup: - 'spec/services/suspend_account_service_spec.rb' - 'spec/services/unallow_domain_service_spec.rb' - 'spec/services/unsuspend_account_service_spec.rb' - - 'spec/workers/scheduler/accounts_statuses_cleanup_scheduler_spec.rb' - 'spec/workers/scheduler/user_cleanup_scheduler_spec.rb' RSpec/MessageChain: diff --git a/spec/workers/scheduler/accounts_statuses_cleanup_scheduler_spec.rb b/spec/workers/scheduler/accounts_statuses_cleanup_scheduler_spec.rb index fb626596fe..62c353bfe1 100644 --- a/spec/workers/scheduler/accounts_statuses_cleanup_scheduler_spec.rb +++ b/spec/workers/scheduler/accounts_statuses_cleanup_scheduler_spec.rb @@ -12,11 +12,6 @@ describe Scheduler::AccountsStatusesCleanupScheduler do let!(:account5) { Fabricate(:account, domain: nil) } let!(:remote) { Fabricate(:account) } - let!(:policy1) { Fabricate(:account_statuses_cleanup_policy, account: account1) } - let!(:policy2) { Fabricate(:account_statuses_cleanup_policy, account: account3) } - let!(:policy3) { Fabricate(:account_statuses_cleanup_policy, account: account4, enabled: false) } - let!(:policy4) { Fabricate(:account_statuses_cleanup_policy, account: account5) } - let(:queue_size) { 0 } let(:queue_latency) { 0 } let(:process_set_stub) do @@ -29,33 +24,12 @@ describe Scheduler::AccountsStatusesCleanupScheduler do end before do - queue_stub = double - allow(queue_stub).to receive(:size).and_return(queue_size) - allow(queue_stub).to receive(:latency).and_return(queue_latency) + queue_stub = instance_double(Sidekiq::Queue, size: queue_size, latency: queue_latency) allow(Sidekiq::Queue).to receive(:new).and_return(queue_stub) allow(Sidekiq::ProcessSet).to receive(:new).and_return(process_set_stub) - sidekiq_stats_stub = double + sidekiq_stats_stub = instance_double(Sidekiq::Stats) allow(Sidekiq::Stats).to receive(:new).and_return(sidekiq_stats_stub) - - # Create a bunch of old statuses - 10.times do - Fabricate(:status, account: account1, created_at: 3.years.ago) - Fabricate(:status, account: account2, created_at: 3.years.ago) - Fabricate(:status, account: account3, created_at: 3.years.ago) - Fabricate(:status, account: account4, created_at: 3.years.ago) - Fabricate(:status, account: account5, created_at: 3.years.ago) - Fabricate(:status, account: remote, created_at: 3.years.ago) - end - - # Create a bunch of newer statuses - 5.times do - Fabricate(:status, account: account1, created_at: 3.minutes.ago) - Fabricate(:status, account: account2, created_at: 3.minutes.ago) - Fabricate(:status, account: account3, created_at: 3.minutes.ago) - Fabricate(:status, account: account4, created_at: 3.minutes.ago) - Fabricate(:status, account: remote, created_at: 3.minutes.ago) - end end describe '#under_load?' do @@ -101,23 +75,45 @@ describe Scheduler::AccountsStatusesCleanupScheduler do end describe '#perform' do + before do + # Policies for the accounts + Fabricate(:account_statuses_cleanup_policy, account: account1) + Fabricate(:account_statuses_cleanup_policy, account: account3) + Fabricate(:account_statuses_cleanup_policy, account: account4, enabled: false) + Fabricate(:account_statuses_cleanup_policy, account: account5) + + # Create a bunch of old statuses + 4.times do + Fabricate(:status, account: account1, created_at: 3.years.ago) + Fabricate(:status, account: account2, created_at: 3.years.ago) + Fabricate(:status, account: account3, created_at: 3.years.ago) + Fabricate(:status, account: account4, created_at: 3.years.ago) + Fabricate(:status, account: account5, created_at: 3.years.ago) + Fabricate(:status, account: remote, created_at: 3.years.ago) + end + + # Create a bunch of newer statuses + Fabricate(:status, account: account1, created_at: 3.minutes.ago) + Fabricate(:status, account: account2, created_at: 3.minutes.ago) + Fabricate(:status, account: account3, created_at: 3.minutes.ago) + Fabricate(:status, account: account4, created_at: 3.minutes.ago) + Fabricate(:status, account: remote, created_at: 3.minutes.ago) + end + context 'when the budget is lower than the number of toots to delete' do - it 'deletes as many statuses as the given budget' do - expect { subject.perform }.to change(Status, :count).by(-subject.compute_budget) - end + it 'deletes the appropriate statuses' do + expect(Status.count).to be > (subject.compute_budget) # Data check - it 'does not delete from accounts with no cleanup policy' do - expect { subject.perform }.to_not change { account2.statuses.count } - end - - it 'does not delete from accounts with disabled cleanup policies' do - expect { subject.perform }.to_not change { account4.statuses.count } + expect { subject.perform } + .to change(Status, :count).by(-subject.compute_budget) # Cleanable statuses + .and (not_change { account2.statuses.count }) # No cleanup policy for account + .and(not_change { account4.statuses.count }) # Disabled cleanup policy end it 'eventually deletes every deletable toot given enough runs' do stub_const 'Scheduler::AccountsStatusesCleanupScheduler::MAX_BUDGET', 4 - expect { 10.times { subject.perform } }.to change(Status, :count).by(-30) + expect { 3.times { subject.perform } }.to change(Status, :count).by(-cleanable_statuses_count) end it 'correctly round-trips between users across several runs' do @@ -128,7 +124,7 @@ describe Scheduler::AccountsStatusesCleanupScheduler do .to change(Status, :count).by(-3 * 3) .and change { account1.statuses.count } .and change { account3.statuses.count } - .and change { account5.statuses.count } + .and(change { account5.statuses.count }) end context 'when given a big budget' do @@ -140,7 +136,7 @@ describe Scheduler::AccountsStatusesCleanupScheduler do it 'correctly handles looping in a single run' do expect(subject.compute_budget).to eq(400) - expect { subject.perform }.to change(Status, :count).by(-30) + expect { subject.perform }.to change(Status, :count).by(-cleanable_statuses_count) end end @@ -157,6 +153,13 @@ describe Scheduler::AccountsStatusesCleanupScheduler do expect { subject.perform }.to_not change(Status, :count) end end + + def cleanable_statuses_count + Status + .where(account_id: [account1, account3, account5]) # Accounts with enabled policies + .where('created_at < ?', 2.weeks.ago) # Policy defaults is 2.weeks + .count + end end end end From ae9f5379d15d8fe965b6bf8ce007f4c02f64257c Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 14 Jun 2023 03:57:06 -0400 Subject: [PATCH 031/118] Reduce factory data created in spec/models/trends/statuses spec (#25410) --- spec/models/trends/statuses_spec.rb | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/spec/models/trends/statuses_spec.rb b/spec/models/trends/statuses_spec.rb index cea5dc5e0f..e30722f585 100644 --- a/spec/models/trends/statuses_spec.rb +++ b/spec/models/trends/statuses_spec.rb @@ -15,8 +15,8 @@ RSpec.describe Trends::Statuses do let!(:status2) { Fabricate(:status, text: 'Bar', language: 'en', trendable: true, created_at: today) } before do - 15.times { reblog(status1, today) } - 12.times { reblog(status2, today) } + default_threshold_value.times { reblog(status1, today) } + default_threshold_value.times { reblog(status2, today) } subject.refresh(today) end @@ -76,9 +76,9 @@ RSpec.describe Trends::Statuses do let!(:status3) { Fabricate(:status, text: 'Baz', language: 'en', trendable: true, created_at: today) } before do - 13.times { reblog(status1, today) } - 13.times { reblog(status2, today) } - 4.times { reblog(status3, today) } + default_threshold_value.times { reblog(status1, today) } + default_threshold_value.times { reblog(status2, today) } + (default_threshold_value - 1).times { reblog(status3, today) } end context 'when status trends are refreshed' do @@ -86,12 +86,11 @@ RSpec.describe Trends::Statuses do subject.refresh(today) end - it 'calculates and re-calculates scores' do - expect(subject.query.limit(10).to_a).to eq [status2, status1] - end + it 'returns correct statuses from query' do + results = subject.query.limit(10).to_a - it 'omits statuses below threshold' do - expect(subject.query.limit(10).to_a).to_not include(status3) + expect(results).to eq [status2, status1] + expect(results).to_not include(status3) end end @@ -109,4 +108,8 @@ RSpec.describe Trends::Statuses do reblog = Fabricate(:status, reblog: status, created_at: at_time) subject.add(status, reblog.account_id, at_time) end + + def default_threshold_value + described_class.default_options[:threshold] + end end From f10f4f2359c6041349f36393c550db5088b3dc16 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 14 Jun 2023 10:56:22 +0200 Subject: [PATCH 032/118] Update dependency glob to v10.2.7 (#25417) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 130 ++++++++++++++++++++++++++---------------------------- 1 file changed, 62 insertions(+), 68 deletions(-) diff --git a/yarn.lock b/yarn.lock index 1dbb6edfdc..85b0ca5abd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1599,6 +1599,18 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" @@ -2183,11 +2195,6 @@ "@types/connect" "*" "@types/node" "*" -"@types/color-name@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" - integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== - "@types/connect@*": version "3.4.35" resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" @@ -3111,15 +3118,7 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -ansi-styles@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" - integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== - dependencies: - "@types/color-name" "^1.1.1" - color-convert "^2.0.1" - -ansi-styles@^4.1.0: +ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== @@ -3131,7 +3130,7 @@ ansi-styles@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== -ansi-styles@^6.0.0: +ansi-styles@^6.0.0, ansi-styles@^6.1.0: version "6.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== @@ -3567,9 +3566,9 @@ babel-preset-jest@^29.5.0: babel-preset-current-node-syntax "^1.0.0" balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== balanced-match@^2.0.0: version "2.0.0" @@ -4136,15 +4135,6 @@ cliui@^5.0.0: strip-ansi "^5.2.0" wrap-ansi "^5.1.0" -cliui@^7.0.4: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - cliui@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" @@ -6146,9 +6136,9 @@ glob-parent@^6.0.2: is-glob "^4.0.3" glob@^10.2.5, glob@^10.2.6: - version "10.2.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.2.6.tgz#1e27edbb3bbac055cb97113e27a066c100a4e5e1" - integrity sha512-U/rnDpXJGF414QQQZv5uVsabTVxMSwzS5CH0p3DRCIV6ownl4f7PzGnkGmvlum2wB+9RlJWJZ6ACU1INnBqiPA== + version "10.2.7" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.2.7.tgz#9dd2828cd5bc7bd861e7738d91e7113dda41d7d8" + integrity sha512-jTKehsravOJo8IJxUGfZILnkvVJM/MOfHRs8QcXolVef2zNI9Tqyy5+SeuOAZd3upViEZQLyFpQhYiHLrMUNmA== dependencies: foreground-child "^3.1.0" jackspeak "^2.0.3" @@ -7189,7 +7179,7 @@ isarray@^2.0.5: isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== isobject@^2.0.0: version "2.1.0" @@ -7246,11 +7236,11 @@ istanbul-reports@^3.1.3: istanbul-lib-report "^3.0.0" jackspeak@^2.0.3: - version "2.1.0" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.1.0.tgz#69831fe5346532888f279102f39fc4452ebbe6c2" - integrity sha512-DiEwVPqsieUzZBNxQ2cxznmFzfg/AMgJUjYw5xl6rSmCxAQXECcbSdwcLM6Ds6T09+SBfSNCGPhYUoQ96P4h7A== + version "2.2.1" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.2.1.tgz#655e8cf025d872c9c03d3eb63e8f0c024fef16a6" + integrity sha512-MXbxovZ/Pm42f6cDIDkl3xpwv1AGwObKwfmjs2nQePiy85tP3fatofl3FC1aBsOtP/6fq5SbtgHwWcMsLP+bDw== dependencies: - cliui "^7.0.4" + "@isaacs/cliui" "^8.0.2" optionalDependencies: "@pkgjs/parseargs" "^0.11.0" @@ -8095,10 +8085,10 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -lru-cache@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-9.0.1.tgz#ac061ed291f8b9adaca2b085534bb1d3b61bef83" - integrity sha512-C8QsKIN1UIXeOs3iWmiZ1lQY+EnKDojWd37fXy1aSbJvH4iSma1uy2OWuoB3m4SYRli5+CUjDv3Dij5DVoetmg== +lru-cache@^9.1.1: + version "9.1.2" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-9.1.2.tgz#255fdbc14b75589d6d0e73644ca167a8db506835" + integrity sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ== lz-string@^1.5.0: version "1.5.0" @@ -8407,11 +8397,6 @@ minipass@^3.0.0, minipass@^3.1.1: dependencies: yallist "^4.0.0" -minipass@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" - integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== - "minipass@^5.0.0 || ^6.0.2": version "6.0.2" resolved "https://registry.yarnpkg.com/minipass/-/minipass-6.0.2.tgz#542844b6c4ce95b202c0995b0a471f1229de4c81" @@ -9056,12 +9041,12 @@ path-parse@^1.0.7: integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-scurry@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.7.0.tgz#99c741a2cfbce782294a39994d63748b5a24f6db" - integrity sha512-UkZUeDjczjYRE495+9thsgcVgsaCPkaw80slmfVFgllxY+IO8ubTsOpFVjDPROBqJdHfVPUFRHPBV/WciOVfWg== + version "1.9.2" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.9.2.tgz#90f9d296ac5e37e608028e28a447b11d385b3f63" + integrity sha512-qSDLy2aGFPm8i4rsbHd4MNyTcrzHFsLQykrtbuGRknZZCBBVXSv2tSCDN2Cg6Rt/GFRw8GoW9y9Ecw5rIPG1sg== dependencies: - lru-cache "^9.0.0" - minipass "^5.0.0" + lru-cache "^9.1.1" + minipass "^5.0.0 || ^6.0.2" path-to-regexp@0.1.7: version "0.1.7" @@ -10704,9 +10689,9 @@ signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== signal-exit@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.0.1.tgz#96a61033896120ec9335d96851d902cc98f0ba2a" - integrity sha512-uUWsN4aOxJAS8KOuf3QMyFtgm1pkb6I+KRZbRF/ghdf5T7sM+B1lLLzPDxswUjkmHyxQAVzEgG35E3NzDM9GVw== + version "4.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.0.2.tgz#ff55bb1d9ff2114c13b400688fa544ac63c36967" + integrity sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q== sirv@^1.0.7: version "1.0.19" @@ -11051,7 +11036,7 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -11069,7 +11054,7 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string-width@^5.0.0: +string-width@^5.0.0, string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== @@ -11133,6 +11118,13 @@ stringz@^2.1.0: dependencies: char-regex "^1.0.2" +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" @@ -11147,13 +11139,6 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - strip-ansi@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" @@ -12520,6 +12505,15 @@ workbox-window@7.0.0, workbox-window@^7.0.0: "@types/trusted-types" "^2.0.2" workbox-core "7.0.0" +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" @@ -12538,14 +12532,14 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" wrappy@1: version "1.0.2" From 360759df7b8da150bf236a16ec40ab85e5ee6ddd Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 14 Jun 2023 11:16:36 +0200 Subject: [PATCH 033/118] Update formatjs monorepo (#25418) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 518 ++++++++++++++++++++++++------------------------------ 1 file changed, 234 insertions(+), 284 deletions(-) diff --git a/yarn.lock b/yarn.lock index 85b0ca5abd..b24fa8c677 100644 --- a/yarn.lock +++ b/yarn.lock @@ -24,47 +24,26 @@ jsonpointer "^5.0.0" leven "^3.1.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.21.4": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13": version "7.21.4" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.21.4.tgz#d0fa9e4413aca81f2b23b9442797bda1826edb39" integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g== dependencies: "@babel/highlight" "^7.18.6" -"@babel/code-frame@^7.22.5": +"@babel/code-frame@^7.18.6", "@babel/code-frame@^7.21.4", "@babel/code-frame@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.5.tgz#234d98e1551960604f1246e6475891a570ad5658" integrity sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ== dependencies: "@babel/highlight" "^7.22.5" -"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.22.0", "@babel/compat-data@^7.22.5": +"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.5.tgz#b1f6c86a02d85d2dd3368a2b67c09add8cd0c255" integrity sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA== -"@babel/core@^7.10.4", "@babel/core@^7.11.1", "@babel/core@^7.11.6", "@babel/core@^7.12.3": - version "7.21.8" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.8.tgz#2a8c7f0f53d60100ba4c32470ba0281c92aa9aa4" - integrity sha512-YeM22Sondbo523Sz0+CirSPnbj9bG3P0CdHcBZdqUuaeOaYEFbOLoGU7lebvGP6P5J/WE9wOn7u7C4J9HvS1xQ== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.21.4" - "@babel/generator" "^7.21.5" - "@babel/helper-compilation-targets" "^7.21.5" - "@babel/helper-module-transforms" "^7.21.5" - "@babel/helpers" "^7.21.5" - "@babel/parser" "^7.21.8" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.5" - "@babel/types" "^7.21.5" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.2" - semver "^6.3.0" - -"@babel/core@^7.22.1": +"@babel/core@^7.10.4", "@babel/core@^7.22.1": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.5.tgz#d67d9747ecf26ee7ecd3ebae1ee22225fe902a89" integrity sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg== @@ -85,17 +64,28 @@ json5 "^2.2.2" semver "^6.3.0" -"@babel/generator@^7.21.5", "@babel/generator@^7.22.3", "@babel/generator@^7.7.2": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.3.tgz#0ff675d2edb93d7596c5f6728b52615cfc0df01e" - integrity sha512-C17MW4wlk//ES/CJDL51kPNwl+qiBQyN7b9SKyVp11BLGFeSPoVaHrv+MNt8jwQFhQWowW88z1eeBx3pFz9v8A== +"@babel/core@^7.11.1", "@babel/core@^7.11.6", "@babel/core@^7.12.3": + version "7.21.8" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.8.tgz#2a8c7f0f53d60100ba4c32470ba0281c92aa9aa4" + integrity sha512-YeM22Sondbo523Sz0+CirSPnbj9bG3P0CdHcBZdqUuaeOaYEFbOLoGU7lebvGP6P5J/WE9wOn7u7C4J9HvS1xQ== dependencies: - "@babel/types" "^7.22.3" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.21.4" + "@babel/generator" "^7.21.5" + "@babel/helper-compilation-targets" "^7.21.5" + "@babel/helper-module-transforms" "^7.21.5" + "@babel/helpers" "^7.21.5" + "@babel/parser" "^7.21.8" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.5" + "@babel/types" "^7.21.5" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.2" + semver "^6.3.0" -"@babel/generator@^7.22.5": +"@babel/generator@^7.21.5", "@babel/generator@^7.22.3", "@babel/generator@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.5.tgz#1e7bf768688acfb05cf30b2369ef855e82d984f7" integrity sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA== @@ -105,6 +95,16 @@ "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" +"@babel/generator@^7.7.2": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.3.tgz#0ff675d2edb93d7596c5f6728b52615cfc0df01e" + integrity sha512-C17MW4wlk//ES/CJDL51kPNwl+qiBQyN7b9SKyVp11BLGFeSPoVaHrv+MNt8jwQFhQWowW88z1eeBx3pFz9v8A== + dependencies: + "@babel/types" "^7.22.3" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + "@babel/helper-annotate-as-pure@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" @@ -127,7 +127,7 @@ "@babel/helper-annotate-as-pure" "^7.22.5" "@babel/types" "^7.22.5" -"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.22.5": +"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.21.5", "@babel/helper-compilation-targets@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz#fc7319fc54c5e2fa14b2909cf3c5fd3046813e02" integrity sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw== @@ -138,17 +138,6 @@ lru-cache "^5.1.1" semver "^6.3.0" -"@babel/helper-compilation-targets@^7.21.5": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.1.tgz#bfcd6b7321ffebe33290d68550e2c9d7eb7c7a58" - integrity sha512-Rqx13UM3yVB5q0D/KwQ8+SPfX/+Rnsy1Lw1k/UwOC4KC6qrzIQoY3lYnBu5EHKBlEHHcj0M0W8ltPSkD8rqfsQ== - dependencies: - "@babel/compat-data" "^7.22.0" - "@babel/helper-validator-option" "^7.21.0" - browserslist "^4.21.3" - lru-cache "^5.1.1" - semver "^6.3.0" - "@babel/helper-create-class-features-plugin@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.5.tgz#2192a1970ece4685fbff85b48da2c32fcb130b7c" @@ -185,25 +174,12 @@ resolve "^1.14.2" semver "^6.1.2" -"@babel/helper-environment-visitor@^7.21.5", "@babel/helper-environment-visitor@^7.22.1": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.1.tgz#ac3a56dbada59ed969d712cf527bd8271fe3eba8" - integrity sha512-Z2tgopurB/kTbidvzeBrc2To3PUP/9i5MUe+fU6QJCQDyPwSH2oRapkLw3KGECDYSjhQZCNxEvNvZlLw8JjGwA== - -"@babel/helper-environment-visitor@^7.22.5": +"@babel/helper-environment-visitor@^7.22.1", "@babel/helper-environment-visitor@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98" integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== -"@babel/helper-function-name@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" - integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== - dependencies: - "@babel/template" "^7.20.7" - "@babel/types" "^7.21.0" - -"@babel/helper-function-name@^7.22.5": +"@babel/helper-function-name@^7.21.0", "@babel/helper-function-name@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz#ede300828905bb15e582c037162f99d5183af1be" integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== @@ -211,14 +187,7 @@ "@babel/template" "^7.22.5" "@babel/types" "^7.22.5" -"@babel/helper-hoist-variables@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" - integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-hoist-variables@^7.22.5": +"@babel/helper-hoist-variables@^7.18.6", "@babel/helper-hoist-variables@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== @@ -232,7 +201,7 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-module-imports@^7.0.0-beta.49", "@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.21.4": +"@babel/helper-module-imports@^7.0.0-beta.49", "@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.12.13": version "7.21.4" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz#ac88b2f76093637489e718a90cec6cf8a9b029af" integrity sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg== @@ -246,21 +215,7 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-module-transforms@^7.21.5": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.1.tgz#e0cad47fedcf3cae83c11021696376e2d5a50c63" - integrity sha512-dxAe9E7ySDGbQdCVOY/4+UcD8M9ZFqZcZhSPsPacvCG4M+9lwtDDQfI2EoaSvmf7W/8yCBkGU0m7Pvt1ru3UZw== - dependencies: - "@babel/helper-environment-visitor" "^7.22.1" - "@babel/helper-module-imports" "^7.21.4" - "@babel/helper-simple-access" "^7.21.5" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.19.1" - "@babel/template" "^7.21.9" - "@babel/traverse" "^7.22.1" - "@babel/types" "^7.22.0" - -"@babel/helper-module-transforms@^7.22.5": +"@babel/helper-module-transforms@^7.21.5", "@babel/helper-module-transforms@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz#0f65daa0716961b6e96b164034e737f60a80d2ef" integrity sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw== @@ -281,16 +236,11 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== -"@babel/helper-plugin-utils@^7.20.2": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz#345f2377d05a720a4e5ecfa39cbf4474a4daed56" - integrity sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg== - "@babel/helper-remap-async-to-generator@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.5.tgz#14a38141a7bf2165ad38da61d61cf27b43015da2" @@ -313,13 +263,6 @@ "@babel/traverse" "^7.22.5" "@babel/types" "^7.22.5" -"@babel/helper-simple-access@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz#d697a7971a5c39eac32c7e63c0921c06c8a249ee" - integrity sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg== - dependencies: - "@babel/types" "^7.21.5" - "@babel/helper-simple-access@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" @@ -334,14 +277,7 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-split-export-declaration@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" - integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-split-export-declaration@^7.22.5": +"@babel/helper-split-export-declaration@^7.18.6", "@babel/helper-split-export-declaration@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz#88cf11050edb95ed08d596f7a044462189127a08" integrity sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ== @@ -353,17 +289,12 @@ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== -"@babel/helper-validator-identifier@^7.18.6": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" - integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== - "@babel/helper-validator-identifier@^7.19.1", "@babel/helper-validator-identifier@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== -"@babel/helper-validator-option@^7.21.0", "@babel/helper-validator-option@^7.22.5": +"@babel/helper-validator-option@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz#de52000a15a177413c8234fa3a8af4ee8102d0ac" integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw== @@ -378,16 +309,7 @@ "@babel/traverse" "^7.22.5" "@babel/types" "^7.22.5" -"@babel/helpers@^7.21.5": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.3.tgz#53b74351da9684ea2f694bf0877998da26dd830e" - integrity sha512-jBJ7jWblbgr7r6wYZHMdIqKc73ycaTcCaWRq4/2LpuPHcx7xMlZvpGQkOYc9HeSjn6rcx15CPlgVcBtZ4WZJ2w== - dependencies: - "@babel/template" "^7.21.9" - "@babel/traverse" "^7.22.1" - "@babel/types" "^7.22.3" - -"@babel/helpers@^7.22.5": +"@babel/helpers@^7.21.5", "@babel/helpers@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.5.tgz#74bb4373eb390d1ceed74a15ef97767e63120820" integrity sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q== @@ -396,16 +318,7 @@ "@babel/traverse" "^7.22.5" "@babel/types" "^7.22.5" -"@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== - dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/highlight@^7.22.5": +"@babel/highlight@^7.18.6", "@babel/highlight@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.5.tgz#aa6c05c5407a67ebce408162b7ede789b4d22031" integrity sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw== @@ -414,16 +327,16 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.21.5", "@babel/parser@^7.21.8", "@babel/parser@^7.21.9", "@babel/parser@^7.22.4": - version "7.22.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.4.tgz#a770e98fd785c231af9d93f6459d36770993fb32" - integrity sha512-VLLsx06XkEYqBtE5YGPwfSGwfrjnyPP5oiGty3S8pQLFDFLaS8VwWSIxkTXpcvr5zeYLE6+MBNl2npl/YnfofA== - -"@babel/parser@^7.22.5": +"@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.21.8", "@babel/parser@^7.22.4", "@babel/parser@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.5.tgz#721fd042f3ce1896238cf1b341c77eb7dee7dbea" integrity sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q== +"@babel/parser@^7.14.7": + version "7.22.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.4.tgz#a770e98fd785c231af9d93f6459d36770993fb32" + integrity sha512-VLLsx06XkEYqBtE5YGPwfSGwfrjnyPP5oiGty3S8pQLFDFLaS8VwWSIxkTXpcvr5zeYLE6+MBNl2npl/YnfofA== + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz#87245a21cd69a73b0b81bcda98d443d6df08f05e" @@ -523,20 +436,20 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@7", "@babel/plugin-syntax-jsx@^7.12.13", "@babel/plugin-syntax-jsx@^7.7.2": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz#f264ed7bf40ffc9ec239edabc17a50c4f5b6fea2" - integrity sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-syntax-jsx@^7.22.5": +"@babel/plugin-syntax-jsx@7", "@babel/plugin-syntax-jsx@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz#a6b68e84fb76e759fc3b93e901876ffabbe1d918" integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" +"@babel/plugin-syntax-jsx@^7.12.13", "@babel/plugin-syntax-jsx@^7.7.2": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz#f264ed7bf40ffc9ec239edabc17a50c4f5b6fea2" + integrity sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" @@ -1205,25 +1118,7 @@ dependencies: regenerator-runtime "^0.13.11" -"@babel/template@^7.20.7", "@babel/template@^7.3.3": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" - integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - -"@babel/template@^7.21.9": - version "7.21.9" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.21.9.tgz#bf8dad2859130ae46088a99c1f265394877446fb" - integrity sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ== - dependencies: - "@babel/code-frame" "^7.21.4" - "@babel/parser" "^7.21.9" - "@babel/types" "^7.21.5" - -"@babel/template@^7.22.5": +"@babel/template@^7.20.7", "@babel/template@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec" integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== @@ -1232,39 +1127,16 @@ "@babel/parser" "^7.22.5" "@babel/types" "^7.22.5" -"@babel/traverse@7": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.5.tgz#ad22361d352a5154b498299d523cf72998a4b133" - integrity sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw== +"@babel/template@^7.3.3": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" + integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== dependencies: - "@babel/code-frame" "^7.21.4" - "@babel/generator" "^7.21.5" - "@babel/helper-environment-visitor" "^7.21.5" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.21.5" - "@babel/types" "^7.21.5" - debug "^4.1.0" - globals "^11.1.0" + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" -"@babel/traverse@^7.21.5", "@babel/traverse@^7.22.1", "@babel/traverse@^7.7.2": - version "7.22.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.4.tgz#c3cf96c5c290bd13b55e29d025274057727664c0" - integrity sha512-Tn1pDsjIcI+JcLKq1AVlZEr4226gpuAQTsLMorsYg9tuS/kG7nuwwJ4AB8jfQuEgb/COBwR/DqJxmoiYFu5/rQ== - dependencies: - "@babel/code-frame" "^7.21.4" - "@babel/generator" "^7.22.3" - "@babel/helper-environment-visitor" "^7.22.1" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.22.4" - "@babel/types" "^7.22.4" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/traverse@^7.22.5": +"@babel/traverse@7", "@babel/traverse@^7.21.5", "@babel/traverse@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.5.tgz#44bd276690db6f4940fdb84e1cb4abd2f729ccd1" integrity sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ== @@ -1280,16 +1152,23 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.12.11", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.4", "@babel/types@^7.21.5", "@babel/types@^7.3.0", "@babel/types@^7.3.3": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.5.tgz#18dfbd47c39d3904d5db3d3dc2cc80bedb60e5b6" - integrity sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q== +"@babel/traverse@^7.7.2": + version "7.22.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.4.tgz#c3cf96c5c290bd13b55e29d025274057727664c0" + integrity sha512-Tn1pDsjIcI+JcLKq1AVlZEr4226gpuAQTsLMorsYg9tuS/kG7nuwwJ4AB8jfQuEgb/COBwR/DqJxmoiYFu5/rQ== dependencies: - "@babel/helper-string-parser" "^7.21.5" - "@babel/helper-validator-identifier" "^7.19.1" - to-fast-properties "^2.0.0" + "@babel/code-frame" "^7.21.4" + "@babel/generator" "^7.22.3" + "@babel/helper-environment-visitor" "^7.22.1" + "@babel/helper-function-name" "^7.21.0" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.22.4" + "@babel/types" "^7.22.4" + debug "^4.1.0" + globals "^11.1.0" -"@babel/types@^7.18.6", "@babel/types@^7.22.5", "@babel/types@^7.4.4": +"@babel/types@^7.0.0", "@babel/types@^7.12.11", "@babel/types@^7.20.7", "@babel/types@^7.21.4", "@babel/types@^7.21.5", "@babel/types@^7.22.3", "@babel/types@^7.22.4", "@babel/types@^7.22.5", "@babel/types@^7.3.0", "@babel/types@^7.4.4": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.5.tgz#cd93eeaab025880a3a47ec881f4b096a5b786fbe" integrity sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA== @@ -1298,10 +1177,10 @@ "@babel/helper-validator-identifier" "^7.22.5" to-fast-properties "^2.0.0" -"@babel/types@^7.22.0", "@babel/types@^7.22.3", "@babel/types@^7.22.4": - version "7.22.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.4.tgz#56a2653ae7e7591365dabf20b76295410684c071" - integrity sha512-Tx9x3UBHTTsMSW85WB2kphxYQVvrZ/t1FxD88IpSgIjiUJlCm9z+xWIDwyo1vffTwSqteqyznB8ZE9vYYk16zA== +"@babel/types@^7.0.0-beta.49", "@babel/types@^7.3.3": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.5.tgz#18dfbd47c39d3904d5db3d3dc2cc80bedb60e5b6" + integrity sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q== dependencies: "@babel/helper-string-parser" "^7.21.5" "@babel/helper-validator-identifier" "^7.19.1" @@ -1486,6 +1365,14 @@ "@formatjs/intl-localematcher" "0.2.32" tslib "^2.4.0" +"@formatjs/ecma402-abstract@1.17.0": + version "1.17.0" + resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-1.17.0.tgz#2ce191a3bde4c65c6684e03fa247062a4a294b9e" + integrity sha512-6ueQTeJZtwKjmh23bdkq/DMqH4l4bmfvtQH98blOSbiXv/OUiyijSW6jU22IT8BNM1ujCaEvJfTtyCYVH38EMQ== + dependencies: + "@formatjs/intl-localematcher" "0.4.0" + tslib "^2.4.0" + "@formatjs/fast-memoize@2.0.1": version "2.0.1" resolved "https://registry.yarnpkg.com/@formatjs/fast-memoize/-/fast-memoize-2.0.1.tgz#f15aaa73caad5562899c69bdcad8db82adcd3b0b" @@ -1493,6 +1380,13 @@ dependencies: tslib "^2.4.0" +"@formatjs/fast-memoize@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@formatjs/fast-memoize/-/fast-memoize-2.2.0.tgz#33bd616d2e486c3e8ef4e68c99648c196887802b" + integrity sha512-hnk/nY8FyrL5YxwP9e4r9dqeM6cAbo8PeU9UjyXojZMNvVad2Z06FAVHyR3Ecw6fza+0GH7vdJgiKIVXTMbSBA== + dependencies: + tslib "^2.4.0" + "@formatjs/icu-messageformat-parser@2.4.0": version "2.4.0" resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.4.0.tgz#e165f3594c68416ce15f63793768251de2a85f88" @@ -1502,6 +1396,15 @@ "@formatjs/icu-skeleton-parser" "1.4.0" tslib "^2.4.0" +"@formatjs/icu-messageformat-parser@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.6.0.tgz#b0d58ce8c8f472969c96b5cd0b3ad5522d3a02b7" + integrity sha512-yT6at0qc0DANw9qM/TU8RZaCtfDXtj4pZM/IC2WnVU80yAcliS3KVDiuUt4jSQAeFL9JS5bc2hARnFmjPdA6qw== + dependencies: + "@formatjs/ecma402-abstract" "1.17.0" + "@formatjs/icu-skeleton-parser" "1.6.0" + tslib "^2.4.0" + "@formatjs/icu-skeleton-parser@1.4.0": version "1.4.0" resolved "https://registry.yarnpkg.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.4.0.tgz#96342eca7c4eef7a309875569e5da973db3465e6" @@ -1510,22 +1413,30 @@ "@formatjs/ecma402-abstract" "1.15.0" tslib "^2.4.0" -"@formatjs/intl-displaynames@6.3.2": - version "6.3.2" - resolved "https://registry.yarnpkg.com/@formatjs/intl-displaynames/-/intl-displaynames-6.3.2.tgz#be169393a132eed9ca9c10ccb9d22ab150e24c90" - integrity sha512-kBOh0O7QYKLUqaZujLSEF2+au017plPp63R6Hrokl+oDtLyTt9y9pEuCTbOKh/P8CC9THnDLKRKgeVWZw5Ek8A== +"@formatjs/icu-skeleton-parser@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.6.0.tgz#0728be8b6b3656f1a4b8e6e5b0e02dffffc23c6c" + integrity sha512-eMmxNpoX/J1IPUjPGSZwo0Wh+7CEvdEMddP2Jxg1gQJXfGfht/FdW2D5XDFj3VMbOTUQlDIdZJY7uC6O6gjPoA== dependencies: - "@formatjs/ecma402-abstract" "1.15.0" - "@formatjs/intl-localematcher" "0.2.32" + "@formatjs/ecma402-abstract" "1.17.0" tslib "^2.4.0" -"@formatjs/intl-listformat@7.2.2": - version "7.2.2" - resolved "https://registry.yarnpkg.com/@formatjs/intl-listformat/-/intl-listformat-7.2.2.tgz#d787932b5d6f1f936c73c5fec531692ab7069c7a" - integrity sha512-YIruRGwUrmgVOXjWi6VbwPcRNBkEfgK2DFjyyqopCmpfJ+39vnl46oLpVchErnuXs6kkARy5GcGaGV7xRsH4lw== +"@formatjs/intl-displaynames@6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@formatjs/intl-displaynames/-/intl-displaynames-6.5.0.tgz#32737088e7d943fb3e22140e64bb634e0ba05fcf" + integrity sha512-sg/nR8ILEdUl+2sWu6jc1nQ5s04yucGlH1RVfatW8TSJ5uG3Yy3vgigi8NNC/BuhcncUNPWqSpTCSI1hA+rhiw== dependencies: - "@formatjs/ecma402-abstract" "1.15.0" - "@formatjs/intl-localematcher" "0.2.32" + "@formatjs/ecma402-abstract" "1.17.0" + "@formatjs/intl-localematcher" "0.4.0" + tslib "^2.4.0" + +"@formatjs/intl-listformat@7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@formatjs/intl-listformat/-/intl-listformat-7.4.0.tgz#fa8ac535d82fc716f052f2fd60eeaa7331362357" + integrity sha512-ifupb+balZUAF/Oh3QyGRqPRWGSKwWoMPR0cYZEG7r61SimD+m38oFQqVx/3Fp7LfQFF11m7IS+MlxOo2sKINA== + dependencies: + "@formatjs/ecma402-abstract" "1.17.0" + "@formatjs/intl-localematcher" "0.4.0" tslib "^2.4.0" "@formatjs/intl-localematcher@0.2.32": @@ -1535,26 +1446,33 @@ dependencies: tslib "^2.4.0" -"@formatjs/intl-pluralrules@^5.2.2": - version "5.2.2" - resolved "https://registry.yarnpkg.com/@formatjs/intl-pluralrules/-/intl-pluralrules-5.2.2.tgz#6322d20a6d0172459e4faf4b0f06603c931673aa" - integrity sha512-mEbnbRzsSCIYqaBmrmUlOsPu5MG6KfMcnzekPzUrUucX2dNiI1KWBGHK6IoXl5c8zx60L1NXJ6cSQ7akoc15SQ== +"@formatjs/intl-localematcher@0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@formatjs/intl-localematcher/-/intl-localematcher-0.4.0.tgz#63bbc37a7c3545a1bf1686072e51d9a3aed98d6b" + integrity sha512-bRTd+rKomvfdS4QDlVJ6TA/Jx1F2h/TBVO5LjvhQ7QPPHp19oPNMIum7W2CMEReq/zPxpmCeB31F9+5gl/qtvw== dependencies: - "@formatjs/ecma402-abstract" "1.15.0" - "@formatjs/intl-localematcher" "0.2.32" tslib "^2.4.0" -"@formatjs/intl@2.7.2": - version "2.7.2" - resolved "https://registry.yarnpkg.com/@formatjs/intl/-/intl-2.7.2.tgz#83dc77080a984d4883195bed39eedd947ebfd3d7" - integrity sha512-ziiQfnXwY0/rXhtohSAmYMqDjRsihoMKdl8H2aA+FvxG9638E0XrvfBFCb+1HhimNiuqRz5fTY7F/bZtsJxsjA== +"@formatjs/intl-pluralrules@^5.2.2": + version "5.2.4" + resolved "https://registry.yarnpkg.com/@formatjs/intl-pluralrules/-/intl-pluralrules-5.2.4.tgz#b417aa503186c2cbb4715f47114ed65211b4ada9" + integrity sha512-6meo376d8I4zikRFSUxATLnqzGwezmc57SmToP4z1/NQwTHXGe0yIG/ABPbO3QMx7IUkofH/ROP3A4DhtPTpnA== dependencies: - "@formatjs/ecma402-abstract" "1.15.0" - "@formatjs/fast-memoize" "2.0.1" - "@formatjs/icu-messageformat-parser" "2.4.0" - "@formatjs/intl-displaynames" "6.3.2" - "@formatjs/intl-listformat" "7.2.2" - intl-messageformat "10.3.5" + "@formatjs/ecma402-abstract" "1.17.0" + "@formatjs/intl-localematcher" "0.4.0" + tslib "^2.4.0" + +"@formatjs/intl@2.9.0": + version "2.9.0" + resolved "https://registry.yarnpkg.com/@formatjs/intl/-/intl-2.9.0.tgz#e1335572af3ca8a53e136a78e866f1851a9718c2" + integrity sha512-Ym0trUoC/VO6wQu4YHa0H1VR2tEixFRmwZgADkDLm7nD+vv1Ob+/88mUAoT0pwvirFqYKgUKEwp1tFepqyqvVA== + dependencies: + "@formatjs/ecma402-abstract" "1.17.0" + "@formatjs/fast-memoize" "2.2.0" + "@formatjs/icu-messageformat-parser" "2.6.0" + "@formatjs/intl-displaynames" "6.5.0" + "@formatjs/intl-listformat" "7.4.0" + intl-messageformat "10.5.0" tslib "^2.4.0" "@formatjs/ts-transformer@3.13.1": @@ -1570,6 +1488,19 @@ tslib "^2.4.0" typescript "^4.7 || 5" +"@formatjs/ts-transformer@3.13.3": + version "3.13.3" + resolved "https://registry.yarnpkg.com/@formatjs/ts-transformer/-/ts-transformer-3.13.3.tgz#249f5b5df70c51e651280732536d5504078297ff" + integrity sha512-W6+huH4dLYx8eZfZue6fcreNzLZHoPboreqJSkickYCKIOicI35zC0Txb4xCT6kau/DXAKTpNEln3V2NgX6Igg== + dependencies: + "@formatjs/icu-messageformat-parser" "2.6.0" + "@types/json-stable-stringify" "^1.0.32" + "@types/node" "14 || 16 || 17" + chalk "^4.0.0" + json-stable-stringify "^1.0.1" + tslib "^2.4.0" + typescript "^4.7 || 5" + "@gamestdio/websocket@^0.3.2": version "0.3.2" resolved "https://registry.yarnpkg.com/@gamestdio/websocket/-/websocket-0.3.2.tgz#321ba0976ee30fd14e51dbf8faa85ce7b325f76a" @@ -2118,10 +2049,10 @@ resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.1.tgz#3286741fb8f1e1580ac28784add4c7a1d49bdfbc" integrity sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q== -"@types/babel__core@*", "@types/babel__core@^7.1.7": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.0.tgz#61bc5a4cae505ce98e1e36c5445e4bee060d8891" - integrity sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ== +"@types/babel__core@*", "@types/babel__core@^7.1.7", "@types/babel__core@^7.20.1": + version "7.20.1" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.1.tgz#916ecea274b0c776fec721e333e55762d3a9614b" + integrity sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw== dependencies: "@babel/parser" "^7.20.7" "@babel/types" "^7.20.7" @@ -2140,21 +2071,10 @@ "@types/babel__template" "*" "@types/babel__traverse" "*" -"@types/babel__core@^7.20.1": - version "7.20.1" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.1.tgz#916ecea274b0c776fec721e333e55762d3a9614b" - integrity sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw== - dependencies: - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - "@types/babel__generator@*": - version "7.6.1" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.1.tgz#4901767b397e8711aeb99df8d396d7ba7b7f0e04" - integrity sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew== + version "7.6.4" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" + integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== dependencies: "@babel/types" "^7.0.0" @@ -2166,27 +2086,27 @@ "@types/babel__core" "*" "@types/babel__template@*": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.2.tgz#4ff63d6b52eddac1de7b975a5223ed32ecea9307" - integrity sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg== + version "7.4.1" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" + integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": +"@types/babel__traverse@*", "@types/babel__traverse@^7.1.7": + version "7.20.1" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.1.tgz#dd6f1d2411ae677dcb2db008c962598be31d6acf" + integrity sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg== + dependencies: + "@babel/types" "^7.20.7" + +"@types/babel__traverse@^7.0.6": version "7.0.13" resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.13.tgz#1874914be974a492e1b4cb00585cabb274e8ba18" integrity sha512-i+zS7t6/s9cdQvbqKDARrcbrPvtJGlbYsMkazo03nTAK3RX9FNrLllXys22uiTGJapPOTZTQ35nHh4ISph4SLQ== dependencies: "@babel/types" "^7.3.0" -"@types/babel__traverse@^7.1.7": - version "7.18.5" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.18.5.tgz#c107216842905afafd3b6e774f6f935da6f5db80" - integrity sha512-enCvTL8m/EHS/zIvJno9nE+ndYPh1/oNFzRYRmtUqJICG2VnCSBzMLW5VN2KCQU91f23tsNKR8v7VJJQMatl7Q== - dependencies: - "@babel/types" "^7.3.0" - "@types/body-parser@*": version "1.19.2" resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" @@ -3434,17 +3354,17 @@ babel-loader@^8.3.0: schema-utils "^2.6.5" babel-plugin-formatjs@^10.5.1: - version "10.5.1" - resolved "https://registry.yarnpkg.com/babel-plugin-formatjs/-/babel-plugin-formatjs-10.5.1.tgz#9baeccb590538fb1915ef85fb7dfd13aedd8b1fa" - integrity sha512-IkwrKjl2Zg6br2wuayPIsaPF92RzGgh5WdQj+A/9zokpYeIF7sscZGwwHmeTSoPnIAAENvjRMm/escMQkp+eKg== + version "10.5.3" + resolved "https://registry.yarnpkg.com/babel-plugin-formatjs/-/babel-plugin-formatjs-10.5.3.tgz#718e47f4f3aad663ad4f901274aedd7be0a86380" + integrity sha512-PBeryWyN2HY2VUGNFPQS6+DPNQ/I9zDZ97y38i1+LzIpIyTHBePECq/ehEABE73PvvF2irFiN7TCYBrQQw5+lA== dependencies: "@babel/core" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-jsx" "7" "@babel/traverse" "7" "@babel/types" "^7.12.11" - "@formatjs/icu-messageformat-parser" "2.4.0" - "@formatjs/ts-transformer" "3.13.1" + "@formatjs/icu-messageformat-parser" "2.6.0" + "@formatjs/ts-transformer" "3.13.3" "@types/babel__core" "^7.1.7" "@types/babel__helper-plugin-utils" "^7.10.0" "@types/babel__traverse" "^7.1.7" @@ -3979,11 +3899,16 @@ caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001464: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001466.tgz#c1e6197c540392e09709ecaa9e3e403428c53375" integrity sha512-ewtFBSfWjEmxUgNBSZItFSmVtvk9zkwkl1OfRZlKA8slltRN+/C/tuGVrF9styXkN36Yu3+SeJ1qkXxDEyNZ5w== -caniuse-lite@^1.0.30001449, caniuse-lite@^1.0.30001502: +caniuse-lite@^1.0.30001449: version "1.0.30001502" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001502.tgz#f7e4a76eb1d2d585340f773767be1fefc118dca8" integrity sha512-AZ+9tFXw1sS0o0jcpJQIXvFTOB/xGiQ4OQ2t98QX3NDn2EZTSRBC801gxrsGgViuq2ak/NLkNgSNEPtCr5lfKg== +caniuse-lite@^1.0.30001502: + version "1.0.30001503" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001503.tgz#88b6ff1b2cf735f1f3361dc1a15b59f0561aa398" + integrity sha512-Sf9NiF+wZxPfzv8Z3iS0rXM1Do+iOy2Lxvib38glFX+08TCYYYGR5fRJXk4d77C4AYwhUjgYgMsMudbh2TqCKw== + chalk@5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.2.0.tgz#249623b7d66869c673699fb66d65723e54dfcfb3" @@ -5076,11 +5001,16 @@ ejs@^3.1.6: dependencies: jake "^10.8.5" -electron-to-chromium@^1.4.284, electron-to-chromium@^1.4.428: +electron-to-chromium@^1.4.284: version "1.4.428" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.428.tgz#c31fc88e854f49d8305cdabf6ec934ff1588a902" integrity sha512-L7uUknyY286of0AYC8CKfgWstD0Smk2DvHDi9F0GWQhSH90Bzi7iDrmCbZKz75tYJxeGSAc7TYeKpmbjMDoh1w== +electron-to-chromium@^1.4.428: + version "1.4.430" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.430.tgz#52693c812a81800fafb5b312c1a850142e2fc9eb" + integrity sha512-FytjTbGwz///F+ToZ5XSeXbbSaXalsVRXsz2mHityI5gfxft7ieW3HqFLkU5V1aIrY42aflICqbmFoDxW10etg== + elliptic@^6.5.3: version "6.5.4" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" @@ -6731,7 +6661,17 @@ intersection-observer@^0.12.0: resolved "https://registry.yarnpkg.com/intersection-observer/-/intersection-observer-0.12.2.tgz#4a45349cc0cd91916682b1f44c28d7ec737dc375" integrity sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg== -intl-messageformat@10.3.5, intl-messageformat@^10.3.5: +intl-messageformat@10.5.0: + version "10.5.0" + resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-10.5.0.tgz#86d11b15913ac954075b25253f5e669359f89538" + integrity sha512-AvojYuOaRb6r2veOKfTVpxH9TrmjSdc5iR9R5RgBwrDZYSmAAFVT+QLbW3C4V7Qsg0OguMp67Q/EoUkxZzXRGw== + dependencies: + "@formatjs/ecma402-abstract" "1.17.0" + "@formatjs/fast-memoize" "2.2.0" + "@formatjs/icu-messageformat-parser" "2.6.0" + tslib "^2.4.0" + +intl-messageformat@^10.3.5: version "10.3.5" resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-10.3.5.tgz#f55684fc663e62616ad59d3a504ea0cac3f267b7" integrity sha512-6kPkftF8Jg3XJCkGKa5OD+nYQ+qcSxF4ZkuDdXZ6KGG0VXn+iblJqRFyDdm9VvKcMyC0Km2+JlVQffFM52D0YA== @@ -9782,19 +9722,19 @@ react-immutable-pure-component@^2.2.2: integrity sha512-vkgoMJUDqHZfXXnjVlG3keCxSO/U6WeDQ5/Sl0GK2cH8TOxEzQ5jXqDXHEL/jqk6fsNxV05oH5kD7VNMUE2k+A== react-intl@^6.4.2: - version "6.4.2" - resolved "https://registry.yarnpkg.com/react-intl/-/react-intl-6.4.2.tgz#cf4f49f5f89e66e0975927783d0d270e708314fd" - integrity sha512-q8QyLZfbyqV3Ifa7vtjRrgfSQPGTR6Fi+u9tP/CuzhUPl9DJEPIrvUFhlBryKtRW2qNASqchaP/79Obip+h6oA== + version "6.4.4" + resolved "https://registry.yarnpkg.com/react-intl/-/react-intl-6.4.4.tgz#14b45ce046bfbb60c0e6d392d8ddc30e9ead5a4f" + integrity sha512-/C9Sl/5//ohfkNG6AWlJuf4BhTXsbzyk93K62A4zRhSPANyOGpKZ+fWhN+TLfFd5YjDUHy+exU/09y0w1bO4Xw== dependencies: - "@formatjs/ecma402-abstract" "1.15.0" - "@formatjs/icu-messageformat-parser" "2.4.0" - "@formatjs/intl" "2.7.2" - "@formatjs/intl-displaynames" "6.3.2" - "@formatjs/intl-listformat" "7.2.2" + "@formatjs/ecma402-abstract" "1.17.0" + "@formatjs/icu-messageformat-parser" "2.6.0" + "@formatjs/intl" "2.9.0" + "@formatjs/intl-displaynames" "6.5.0" + "@formatjs/intl-listformat" "7.4.0" "@types/hoist-non-react-statics" "^3.3.1" "@types/react" "16 || 17 || 18" hoist-non-react-statics "^3.3.2" - intl-messageformat "10.3.5" + intl-messageformat "10.5.0" tslib "^2.4.0" "react-is@^16.12.0 || ^17.0.0 || ^18.0.0", react-is@^18.0.0, react-is@^18.2.0: @@ -11625,7 +11565,7 @@ tsconfig-paths@^3.14.1: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@2.5.0, tslib@^2.1.0, tslib@^2.4.0, tslib@^2.5.0: +tslib@2.5.0, tslib@^2.1.0, tslib@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== @@ -11635,6 +11575,11 @@ tslib@^1.8.1, tslib@^1.9.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== +tslib@^2.4.0: + version "2.5.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.3.tgz#24944ba2d990940e6e982c4bea147aba80209913" + integrity sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w== + tsutils@^3.21.0: version "3.21.0" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" @@ -11724,7 +11669,12 @@ type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" -"typescript@^4.7 || 5", typescript@^5.0.4: +"typescript@^4.7 || 5": + version "5.1.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.3.tgz#8d84219244a6b40b6fb2b33cc1c062f715b9e826" + integrity sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw== + +typescript@^5.0.4: version "5.0.4" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.0.4.tgz#b217fd20119bd61a94d4011274e0ab369058da3b" integrity sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw== From 95b84874f3d49f874679989eeabf56aa07c456cc Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 14 Jun 2023 11:18:37 +0200 Subject: [PATCH 034/118] Update dependency redis-namespace to v1.11.0 (#25421) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 3e9ec14914..98a7b2ef91 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -554,7 +554,7 @@ GEM rdf (~> 3.2) redcarpet (3.6.0) redis (4.8.1) - redis-namespace (1.10.0) + redis-namespace (1.11.0) redis (>= 4) redlock (1.3.2) redis (>= 3.0.0, < 6.0) From b9e8d2b35276b59da81fd6d59cdd2baea35164f7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 14 Jun 2023 11:23:54 +0200 Subject: [PATCH 035/118] Update dependency sass to v1.63.3 (#25422) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 59 +++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 42 insertions(+), 17 deletions(-) diff --git a/yarn.lock b/yarn.lock index b24fa8c677..56fcd0de06 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3063,7 +3063,7 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" -anymatch@^3.0.0: +anymatch@^3.0.0, anymatch@~3.1.1, anymatch@~3.1.2: version "3.1.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== @@ -3071,7 +3071,7 @@ anymatch@^3.0.0: normalize-path "^3.0.0" picomatch "^2.0.4" -anymatch@^3.0.3, anymatch@~3.1.1: +anymatch@^3.0.3: version "3.1.1" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== @@ -3534,9 +3534,9 @@ binary-extensions@^1.0.0: integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== binary-extensions@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" - integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ== + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== bindings@^1.5.0: version "1.5.0" @@ -3944,20 +3944,20 @@ char-regex@^1.0.2: resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== -"chokidar@>=3.0.0 <4.0.0", chokidar@^3.4.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" - integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== +"chokidar@>=3.0.0 <4.0.0": + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== dependencies: - anymatch "~3.1.1" + anymatch "~3.1.2" braces "~3.0.2" - glob-parent "~5.1.0" + glob-parent "~5.1.2" is-binary-path "~2.1.0" is-glob "~4.0.1" normalize-path "~3.0.0" - readdirp "~3.5.0" + readdirp "~3.6.0" optionalDependencies: - fsevents "~2.3.1" + fsevents "~2.3.2" chokidar@^2.1.8: version "2.1.8" @@ -3978,6 +3978,21 @@ chokidar@^2.1.8: optionalDependencies: fsevents "^1.2.7" +chokidar@^3.4.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" + integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.5.0" + optionalDependencies: + fsevents "~2.3.1" + chownr@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" @@ -6051,7 +6066,7 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob-parent@^5.1.2, glob-parent@~5.1.0: +glob-parent@^5.1.2, glob-parent@~5.1.0, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== @@ -10015,6 +10030,13 @@ readdirp@~3.5.0: dependencies: picomatch "^2.2.1" +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + redent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" @@ -10389,9 +10411,9 @@ sass-loader@^10.2.0: semver "^7.3.2" sass@^1.62.1: - version "1.62.1" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.62.1.tgz#caa8d6bf098935bc92fc73fa169fb3790cacd029" - integrity sha512-NHpxIzN29MXvWiuswfc1W3I0N8SXBd8UR26WntmDlRYf0bSADnwnOjsyMZ3lMezSlArD33Vs3YFhp7dWvL770A== + version "1.63.4" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.63.4.tgz#caf60643321044c61f6a0fe638a07abbd31cfb5d" + integrity sha512-Sx/+weUmK+oiIlI+9sdD0wZHsqpbgQg8wSwSnGBjwb5GwqFhYNwwnI+UWZtLjKvKyFlKkatRK235qQ3mokyPoQ== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -10977,6 +10999,7 @@ string-length@^4.0.1: strip-ansi "^6.0.0" "string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + name string-width-cjs version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -11059,6 +11082,7 @@ stringz@^2.1.0: char-regex "^1.0.2" "strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: + name strip-ansi-cjs version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -12456,6 +12480,7 @@ workbox-window@7.0.0, workbox-window@^7.0.0: workbox-core "7.0.0" "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: + name wrap-ansi-cjs version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== From d9c6f70cc6063a7f49f3d2e17042e03ac11f1fa1 Mon Sep 17 00:00:00 2001 From: Daniel M Brasil Date: Wed, 14 Jun 2023 10:21:36 -0300 Subject: [PATCH 036/118] Fix `ArgumentError` in `/api/v1/admin/accounts/:id/action` (#25386) --- app/models/admin/account_action.rb | 5 +++++ spec/models/admin/account_action_spec.rb | 16 ++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/app/models/admin/account_action.rb b/app/models/admin/account_action.rb index 1ce28f5c82..2b5560e2eb 100644 --- a/app/models/admin/account_action.rb +++ b/app/models/admin/account_action.rb @@ -26,6 +26,7 @@ class Admin::AccountAction alias include_statuses? include_statuses validates :type, :target_account, :current_account, presence: true + validates :type, inclusion: { in: TYPES } def initialize(attributes = {}) @send_email_notification = true @@ -71,6 +72,10 @@ class Admin::AccountAction TYPES - %w(none disable) end end + + def i18n_scope + :activerecord + end end private diff --git a/spec/models/admin/account_action_spec.rb b/spec/models/admin/account_action_spec.rb index df79d9f287..b47561dd48 100644 --- a/spec/models/admin/account_action_spec.rb +++ b/spec/models/admin/account_action_spec.rb @@ -55,6 +55,22 @@ RSpec.describe Admin::AccountAction do end end + context 'when type is invalid' do + let(:type) { 'whatever' } + + it 'raises an invalid record error' do + expect { subject }.to raise_error(ActiveRecord::RecordInvalid) + end + end + + context 'when type is not given' do + let(:type) { '' } + + it 'raises an invalid record error' do + expect { subject }.to raise_error(ActiveRecord::RecordInvalid) + end + end + it 'creates Admin::ActionLog' do expect do subject From 87aff5aad82358fd2ae3bed1826b0d9a5454ca6d Mon Sep 17 00:00:00 2001 From: Daniel M Brasil Date: Wed, 14 Jun 2023 10:43:50 -0300 Subject: [PATCH 037/118] Migrate to request specs in `/api/v1/follow_requests` (#25411) --- .../api/v1/follow_requests_controller_spec.rb | 72 ----------- spec/requests/api/v1/follow_requests_spec.rb | 119 ++++++++++++++++++ 2 files changed, 119 insertions(+), 72 deletions(-) delete mode 100644 spec/controllers/api/v1/follow_requests_controller_spec.rb create mode 100644 spec/requests/api/v1/follow_requests_spec.rb diff --git a/spec/controllers/api/v1/follow_requests_controller_spec.rb b/spec/controllers/api/v1/follow_requests_controller_spec.rb deleted file mode 100644 index 0a2c27d9ed..0000000000 --- a/spec/controllers/api/v1/follow_requests_controller_spec.rb +++ /dev/null @@ -1,72 +0,0 @@ -# frozen_string_literal: true - -require 'rails_helper' - -RSpec.describe Api::V1::FollowRequestsController do - render_views - - let(:user) { Fabricate(:user, account_attributes: { locked: true }) } - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } - let(:follower) { Fabricate(:account) } - - before do - FollowService.new.call(follower, user.account) - allow(controller).to receive(:doorkeeper_token) { token } - end - - describe 'GET #index' do - let(:scopes) { 'read:follows' } - - before do - get :index, params: { limit: 1 } - end - - it 'returns http success' do - expect(response).to have_http_status(200) - end - end - - describe 'POST #authorize' do - let(:scopes) { 'write:follows' } - - before do - post :authorize, params: { id: follower.id } - end - - it 'returns http success' do - expect(response).to have_http_status(200) - end - - it 'allows follower to follow' do - expect(follower.following?(user.account)).to be true - end - - it 'returns JSON with followed_by=true' do - json = body_as_json - - expect(json[:followed_by]).to be true - end - end - - describe 'POST #reject' do - let(:scopes) { 'write:follows' } - - before do - post :reject, params: { id: follower.id } - end - - it 'returns http success' do - expect(response).to have_http_status(200) - end - - it 'removes follow request' do - expect(FollowRequest.where(target_account: user.account, account: follower).count).to eq 0 - end - - it 'returns JSON with followed_by=false' do - json = body_as_json - - expect(json[:followed_by]).to be false - end - end -end diff --git a/spec/requests/api/v1/follow_requests_spec.rb b/spec/requests/api/v1/follow_requests_spec.rb new file mode 100644 index 0000000000..9d4ef8cd55 --- /dev/null +++ b/spec/requests/api/v1/follow_requests_spec.rb @@ -0,0 +1,119 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe 'Follow requests' do + let(:user) { Fabricate(:user, account_attributes: { locked: true }) } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } + let(:scopes) { 'read:follows write:follows' } + let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } + + describe 'GET /api/v1/follow_requests' do + subject do + get '/api/v1/follow_requests', headers: headers, params: params + end + + let(:accounts) { Fabricate.times(5, :account) } + let(:params) { {} } + + let(:expected_response) do + accounts.map do |account| + a_hash_including( + id: account.id.to_s, + username: account.username, + acct: account.acct + ) + end + end + + before do + accounts.each { |account| FollowService.new.call(account, user.account) } + end + + it_behaves_like 'forbidden for wrong scope', 'write write:follows' + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + + it 'returns the expected content from accounts requesting to follow' do + subject + + expect(body_as_json).to match_array(expected_response) + end + + context 'with limit param' do + let(:params) { { limit: 2 } } + + it 'returns only the requested number of follow requests' do + subject + + expect(body_as_json.size).to eq(params[:limit]) + end + end + end + + describe 'POST /api/v1/follow_requests/:account_id/authorize' do + subject do + post "/api/v1/follow_requests/#{follower.id}/authorize", headers: headers + end + + let(:follower) { Fabricate(:account) } + + before do + FollowService.new.call(follower, user.account) + end + + it_behaves_like 'forbidden for wrong scope', 'read read:follows' + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + + it 'allows the requesting follower to follow' do + expect { subject }.to change { follower.following?(user.account) }.from(false).to(true) + end + + it 'returns JSON with followed_by set to true' do + subject + + expect(body_as_json[:followed_by]).to be true + end + end + + describe 'POST /api/v1/follow_requests/:account_id/reject' do + subject do + post "/api/v1/follow_requests/#{follower.id}/reject", headers: headers + end + + let(:follower) { Fabricate(:account) } + + before do + FollowService.new.call(follower, user.account) + end + + it_behaves_like 'forbidden for wrong scope', 'read read:follows' + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + + it 'removes the follow request' do + subject + + expect(FollowRequest.where(target_account: user.account, account: follower)).to_not exist + end + + it 'returns JSON with followed_by set to false' do + subject + + expect(body_as_json[:followed_by]).to be false + end + end +end From 24015ef0cc84e7caffc4c02b9b7d5cdbdeb80002 Mon Sep 17 00:00:00 2001 From: Daniel M Brasil Date: Wed, 14 Jun 2023 11:08:53 -0300 Subject: [PATCH 038/118] Migrate to request specs in `/api/v1/domain_blocks` (#25414) --- .../api/v1/domain_blocks_controller_spec.rb | 69 ---------- spec/requests/api/v1/domain_blocks_spec.rb | 125 ++++++++++++++++++ 2 files changed, 125 insertions(+), 69 deletions(-) delete mode 100644 spec/controllers/api/v1/domain_blocks_controller_spec.rb create mode 100644 spec/requests/api/v1/domain_blocks_spec.rb diff --git a/spec/controllers/api/v1/domain_blocks_controller_spec.rb b/spec/controllers/api/v1/domain_blocks_controller_spec.rb deleted file mode 100644 index 20b2909e63..0000000000 --- a/spec/controllers/api/v1/domain_blocks_controller_spec.rb +++ /dev/null @@ -1,69 +0,0 @@ -# frozen_string_literal: true - -require 'rails_helper' - -RSpec.describe Api::V1::DomainBlocksController do - render_views - - let(:user) { Fabricate(:user) } - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } - - before do - user.account.block_domain!('example.com') - allow(controller).to receive(:doorkeeper_token) { token } - end - - describe 'GET #show' do - let(:scopes) { 'read:blocks' } - - before do - get :show, params: { limit: 1 } - end - - it 'returns http success' do - expect(response).to have_http_status(200) - end - - it 'returns blocked domains' do - expect(body_as_json.first).to eq 'example.com' - end - - it_behaves_like 'forbidden for wrong scope', 'write:statuses' - end - - describe 'POST #create' do - let(:scopes) { 'write:blocks' } - - before do - post :create, params: { domain: 'example.org' } - end - - it 'returns http success' do - expect(response).to have_http_status(200) - end - - it 'creates a domain block' do - expect(user.account.domain_blocking?('example.org')).to be true - end - - it_behaves_like 'forbidden for wrong scope', 'write:statuses' - end - - describe 'DELETE #destroy' do - let(:scopes) { 'write:blocks' } - - before do - delete :destroy, params: { domain: 'example.com' } - end - - it 'returns http success' do - expect(response).to have_http_status(200) - end - - it 'deletes a domain block' do - expect(user.account.domain_blocking?('example.com')).to be false - end - - it_behaves_like 'forbidden for wrong scope', 'write:statuses' - end -end diff --git a/spec/requests/api/v1/domain_blocks_spec.rb b/spec/requests/api/v1/domain_blocks_spec.rb new file mode 100644 index 0000000000..0f4fd4e90e --- /dev/null +++ b/spec/requests/api/v1/domain_blocks_spec.rb @@ -0,0 +1,125 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe 'Domain blocks' do + let(:user) { Fabricate(:user) } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } + let(:scopes) { 'read:blocks write:blocks' } + let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } + + describe 'GET /api/v1/domain_blocks' do + subject do + get '/api/v1/domain_blocks', headers: headers, params: params + end + + let(:blocked_domains) { ['example.com', 'example.net', 'example.org', 'example.com.br'] } + let(:params) { {} } + + before do + blocked_domains.each { |domain| user.account.block_domain!(domain) } + end + + it_behaves_like 'forbidden for wrong scope', 'write:blocks' + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + + it 'returns the domains blocked by the requesting user' do + subject + + expect(body_as_json).to match_array(blocked_domains) + end + + context 'with limit param' do + let(:params) { { limit: 2 } } + + it 'returns only the requested number of blocked domains' do + subject + + expect(body_as_json.size).to eq(params[:limit]) + end + end + end + + describe 'POST /api/v1/domain_blocks' do + subject do + post '/api/v1/domain_blocks', headers: headers, params: params + end + + let(:params) { { domain: 'example.com' } } + + it_behaves_like 'forbidden for wrong scope', 'read read:blocks' + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + + it 'creates a domain block' do + subject + + expect(user.account.domain_blocking?(params[:domain])).to be(true) + end + + context 'when no domain name is given' do + let(:params) { { domain: '' } } + + it 'returns http unprocessable entity' do + subject + + expect(response).to have_http_status(422) + end + end + + context 'when the given domain name is invalid' do + let(:params) { { domain: 'example com' } } + + it 'returns unprocessable entity' do + subject + + expect(response).to have_http_status(422) + end + end + end + + describe 'DELETE /api/v1/domain_blocks' do + subject do + delete '/api/v1/domain_blocks/', headers: headers, params: params + end + + let(:params) { { domain: 'example.com' } } + + before do + user.account.block_domain!('example.com') + end + + it_behaves_like 'forbidden for wrong scope', 'read read:blocks' + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + + it 'deletes the specified domain block' do + subject + + expect(user.account.domain_blocking?('example.com')).to be(false) + end + + context 'when the given domain name is not blocked' do + let(:params) { { domain: 'example.org' } } + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + end + end +end From 4c5aa0e470fb92f8f9a5521357f2cf59263a49b5 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 14 Jun 2023 10:44:37 -0400 Subject: [PATCH 039/118] Update rubocop-rspec to version 2.22.0, fix `RSpec/IndexedLet` cop (#24698) --- .rubocop_todo.yml | 5 -- Gemfile.lock | 5 +- ...lowers_synchronizations_controller_spec.rb | 24 +++--- .../admin/instances_controller_spec.rb | 6 +- .../follower_accounts_controller_spec.rb | 10 +-- .../following_accounts_controller_spec.rb | 10 +-- spec/lib/account_reach_finder_spec.rb | 30 +++---- spec/lib/feed_manager_spec.rb | 28 ++++--- spec/lib/mastodon/cli/ip_blocks_spec.rb | 26 +++--- .../account_statuses_cleanup_policy_spec.rb | 40 ++++----- .../concerns/account_interactions_spec.rb | 40 ++++----- .../concerns/status_threading_concern_spec.rb | 42 +++++----- spec/models/custom_emoji_filter_spec.rb | 16 ++-- spec/models/status_spec.rb | 84 +++++++++---------- spec/models/tag_feed_spec.rb | 58 ++++++------- spec/models/trends/statuses_spec.rb | 40 ++++----- spec/models/trends/tags_spec.rb | 22 ++--- .../activitypub/note_serializer_spec.rb | 20 ++--- .../fetch_featured_collection_service_spec.rb | 34 ++++---- .../batched_remove_status_service_spec.rb | 18 ++-- spec/services/block_domain_service_spec.rb | 14 ++-- .../clear_domain_media_service_spec.rb | 10 +-- spec/services/purge_domain_service_spec.rb | 10 +-- spec/services/unallow_domain_service_spec.rb | 14 ++-- ...ccounts_statuses_cleanup_scheduler_spec.rb | 50 +++++------ 25 files changed, 334 insertions(+), 322 deletions(-) diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index 4cf238595b..aba4415fcb 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -199,14 +199,9 @@ Naming/VariableNumber: - 'db/migrate/20190820003045_update_statuses_index.rb' - 'db/migrate/20190823221802_add_local_index_to_statuses.rb' - 'db/migrate/20200119112504_add_public_index_to_statuses.rb' - - 'spec/controllers/activitypub/followers_synchronizations_controller_spec.rb' - - 'spec/lib/feed_manager_spec.rb' - 'spec/models/account_spec.rb' - - 'spec/models/concerns/account_interactions_spec.rb' - - 'spec/models/custom_emoji_filter_spec.rb' - 'spec/models/domain_block_spec.rb' - 'spec/models/user_spec.rb' - - 'spec/services/activitypub/fetch_featured_collection_service_spec.rb' # This cop supports unsafe autocorrection (--autocorrect-all). Performance/UnfreezeString: diff --git a/Gemfile.lock b/Gemfile.lock index 98a7b2ef91..d3f2b13a63 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -606,6 +606,8 @@ GEM parser (>= 3.2.1.0) rubocop-capybara (2.18.0) rubocop (~> 1.41) + rubocop-factory_bot (2.23.1) + rubocop (~> 1.33) rubocop-performance (1.18.0) rubocop (>= 1.7.0, < 2.0) rubocop-ast (>= 0.4.0) @@ -613,9 +615,10 @@ GEM activesupport (>= 4.2.0) rack (>= 1.1) rubocop (>= 1.33.0, < 2.0) - rubocop-rspec (2.19.0) + rubocop-rspec (2.22.0) rubocop (~> 1.33) rubocop-capybara (~> 2.17) + rubocop-factory_bot (~> 2.22) ruby-progressbar (1.13.0) ruby-saml (1.13.0) nokogiri (>= 1.10.5) diff --git a/spec/controllers/activitypub/followers_synchronizations_controller_spec.rb b/spec/controllers/activitypub/followers_synchronizations_controller_spec.rb index e544585ec1..b50c7b9cdc 100644 --- a/spec/controllers/activitypub/followers_synchronizations_controller_spec.rb +++ b/spec/controllers/activitypub/followers_synchronizations_controller_spec.rb @@ -3,17 +3,17 @@ require 'rails_helper' RSpec.describe ActivityPub::FollowersSynchronizationsController do - let!(:account) { Fabricate(:account) } - let!(:follower_1) { Fabricate(:account, domain: 'example.com', uri: 'https://example.com/users/a') } - let!(:follower_2) { Fabricate(:account, domain: 'example.com', uri: 'https://example.com/users/b') } - let!(:follower_3) { Fabricate(:account, domain: 'foo.com', uri: 'https://foo.com/users/a') } - let!(:follower_4) { Fabricate(:account, username: 'instance-actor', domain: 'example.com', uri: 'https://example.com') } + let!(:account) { Fabricate(:account) } + let!(:follower_example_com_user_a) { Fabricate(:account, domain: 'example.com', uri: 'https://example.com/users/a') } + let!(:follower_example_com_user_b) { Fabricate(:account, domain: 'example.com', uri: 'https://example.com/users/b') } + let!(:follower_foo_com_user_a) { Fabricate(:account, domain: 'foo.com', uri: 'https://foo.com/users/a') } + let!(:follower_example_com_instance_actor) { Fabricate(:account, username: 'instance-actor', domain: 'example.com', uri: 'https://example.com') } before do - follower_1.follow!(account) - follower_2.follow!(account) - follower_3.follow!(account) - follower_4.follow!(account) + follower_example_com_user_a.follow!(account) + follower_example_com_user_b.follow!(account) + follower_foo_com_user_a.follow!(account) + follower_example_com_instance_actor.follow!(account) allow(controller).to receive(:signed_request_actor).and_return(remote_account) end @@ -47,7 +47,11 @@ RSpec.describe ActivityPub::FollowersSynchronizationsController do it 'returns orderedItems with followers from example.com' do expect(body[:orderedItems]).to be_an Array - expect(body[:orderedItems]).to contain_exactly(follower_4.uri, follower_1.uri, follower_2.uri) + expect(body[:orderedItems]).to contain_exactly( + follower_example_com_instance_actor.uri, + follower_example_com_user_a.uri, + follower_example_com_user_b.uri + ) end it 'returns private Cache-Control header' do diff --git a/spec/controllers/admin/instances_controller_spec.rb b/spec/controllers/admin/instances_controller_spec.rb index ce062085f4..dd772d1036 100644 --- a/spec/controllers/admin/instances_controller_spec.rb +++ b/spec/controllers/admin/instances_controller_spec.rb @@ -7,9 +7,9 @@ RSpec.describe Admin::InstancesController do let(:current_user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) } - let!(:account) { Fabricate(:account, domain: 'popular') } - let!(:account2) { Fabricate(:account, domain: 'popular') } - let!(:account3) { Fabricate(:account, domain: 'less.popular') } + let!(:account_popular_main) { Fabricate(:account, domain: 'popular') } + let!(:account_popular_other) { Fabricate(:account, domain: 'popular') } + let!(:account_less_popular) { Fabricate(:account, domain: 'less.popular') } before do sign_in current_user, scope: :user diff --git a/spec/controllers/follower_accounts_controller_spec.rb b/spec/controllers/follower_accounts_controller_spec.rb index b5b8ff9cb4..cb8c2a0e5b 100644 --- a/spec/controllers/follower_accounts_controller_spec.rb +++ b/spec/controllers/follower_accounts_controller_spec.rb @@ -5,13 +5,13 @@ require 'rails_helper' describe FollowerAccountsController do render_views - let(:alice) { Fabricate(:account) } - let(:follower0) { Fabricate(:account) } - let(:follower1) { Fabricate(:account) } + let(:alice) { Fabricate(:account, username: 'alice') } + let(:follower_bob) { Fabricate(:account, username: 'bob') } + let(:follower_chris) { Fabricate(:account, username: 'curt') } describe 'GET #index' do - let!(:follow0) { follower0.follow!(alice) } - let!(:follow1) { follower1.follow!(alice) } + let!(:follow_from_bob) { follower_bob.follow!(alice) } + let!(:follow_from_chris) { follower_chris.follow!(alice) } context 'when format is html' do subject(:response) { get :index, params: { account_username: alice.username, format: :html } } diff --git a/spec/controllers/following_accounts_controller_spec.rb b/spec/controllers/following_accounts_controller_spec.rb index d1efeec251..095528ed07 100644 --- a/spec/controllers/following_accounts_controller_spec.rb +++ b/spec/controllers/following_accounts_controller_spec.rb @@ -5,13 +5,13 @@ require 'rails_helper' describe FollowingAccountsController do render_views - let(:alice) { Fabricate(:account) } - let(:followee0) { Fabricate(:account) } - let(:followee1) { Fabricate(:account) } + let(:alice) { Fabricate(:account, username: 'alice') } + let(:followee_bob) { Fabricate(:account, username: 'bob') } + let(:followee_chris) { Fabricate(:account, username: 'chris') } describe 'GET #index' do - let!(:follow0) { alice.follow!(followee0) } - let!(:follow1) { alice.follow!(followee1) } + let!(:follow_of_bob) { alice.follow!(followee_bob) } + let!(:follow_of_chris) { alice.follow!(followee_chris) } context 'when format is html' do subject(:response) { get :index, params: { account_username: alice.username, format: :html } } diff --git a/spec/lib/account_reach_finder_spec.rb b/spec/lib/account_reach_finder_spec.rb index 1da95ba6b3..7c6c20968f 100644 --- a/spec/lib/account_reach_finder_spec.rb +++ b/spec/lib/account_reach_finder_spec.rb @@ -5,31 +5,31 @@ require 'rails_helper' RSpec.describe AccountReachFinder do let(:account) { Fabricate(:account) } - let(:follower1) { Fabricate(:account, protocol: :activitypub, inbox_url: 'https://example.com/inbox-1') } - let(:follower2) { Fabricate(:account, protocol: :activitypub, inbox_url: 'https://example.com/inbox-2') } - let(:follower3) { Fabricate(:account, protocol: :activitypub, inbox_url: 'https://foo.bar/users/a/inbox', shared_inbox_url: 'https://foo.bar/inbox') } + let(:ap_follower_example_com) { Fabricate(:account, protocol: :activitypub, inbox_url: 'https://example.com/inbox-1') } + let(:ap_follower_example_org) { Fabricate(:account, protocol: :activitypub, inbox_url: 'https://example.org/inbox-2') } + let(:ap_follower_with_shared) { Fabricate(:account, protocol: :activitypub, inbox_url: 'https://foo.bar/users/a/inbox', shared_inbox_url: 'https://foo.bar/inbox') } - let(:mentioned1) { Fabricate(:account, protocol: :activitypub, inbox_url: 'https://foo.bar/users/b/inbox', shared_inbox_url: 'https://foo.bar/inbox') } - let(:mentioned2) { Fabricate(:account, protocol: :activitypub, inbox_url: 'https://example.com/inbox-3') } - let(:mentioned3) { Fabricate(:account, protocol: :activitypub, inbox_url: 'https://example.com/inbox-4') } + let(:ap_mentioned_with_shared) { Fabricate(:account, protocol: :activitypub, inbox_url: 'https://foo.bar/users/b/inbox', shared_inbox_url: 'https://foo.bar/inbox') } + let(:ap_mentioned_example_com) { Fabricate(:account, protocol: :activitypub, inbox_url: 'https://example.com/inbox-3') } + let(:ap_mentioned_example_org) { Fabricate(:account, protocol: :activitypub, inbox_url: 'https://example.org/inbox-4') } let(:unrelated_account) { Fabricate(:account, protocol: :activitypub, inbox_url: 'https://example.com/unrelated-inbox') } before do - follower1.follow!(account) - follower2.follow!(account) - follower3.follow!(account) + ap_follower_example_com.follow!(account) + ap_follower_example_org.follow!(account) + ap_follower_with_shared.follow!(account) Fabricate(:status, account: account).tap do |status| - status.mentions << Mention.new(account: follower1) - status.mentions << Mention.new(account: mentioned1) + status.mentions << Mention.new(account: ap_follower_example_com) + status.mentions << Mention.new(account: ap_mentioned_with_shared) end Fabricate(:status, account: account) Fabricate(:status, account: account).tap do |status| - status.mentions << Mention.new(account: mentioned2) - status.mentions << Mention.new(account: mentioned3) + status.mentions << Mention.new(account: ap_mentioned_example_com) + status.mentions << Mention.new(account: ap_mentioned_example_org) end Fabricate(:status).tap do |status| @@ -39,11 +39,11 @@ RSpec.describe AccountReachFinder do describe '#inboxes' do it 'includes the preferred inbox URL of followers' do - expect(described_class.new(account).inboxes).to include(*[follower1, follower2, follower3].map(&:preferred_inbox_url)) + expect(described_class.new(account).inboxes).to include(*[ap_follower_example_com, ap_follower_example_org, ap_follower_with_shared].map(&:preferred_inbox_url)) end it 'includes the preferred inbox URL of recently-mentioned accounts' do - expect(described_class.new(account).inboxes).to include(*[mentioned1, mentioned2, mentioned3].map(&:preferred_inbox_url)) + expect(described_class.new(account).inboxes).to include(*[ap_mentioned_with_shared, ap_mentioned_example_com, ap_mentioned_example_org].map(&:preferred_inbox_url)) end it 'does not include the inbox of unrelated users' do diff --git a/spec/lib/feed_manager_spec.rb b/spec/lib/feed_manager_spec.rb index dcb180dc9d..25edaada64 100644 --- a/spec/lib/feed_manager_spec.rb +++ b/spec/lib/feed_manager_spec.rb @@ -526,19 +526,25 @@ RSpec.describe FeedManager do end describe '#clear_from_home' do - let(:account) { Fabricate(:account) } + let(:account) { Fabricate(:account) } let(:followed_account) { Fabricate(:account) } - let(:target_account) { Fabricate(:account) } - let(:status_1) { Fabricate(:status, account: followed_account) } - let(:status_2) { Fabricate(:status, account: target_account) } - let(:status_3) { Fabricate(:status, account: followed_account, mentions: [Fabricate(:mention, account: target_account)]) } - let(:status_4) { Fabricate(:status, mentions: [Fabricate(:mention, account: target_account)]) } - let(:status_5) { Fabricate(:status, account: followed_account, reblog: status_4) } - let(:status_6) { Fabricate(:status, account: followed_account, reblog: status_2) } - let(:status_7) { Fabricate(:status, account: followed_account) } + let(:target_account) { Fabricate(:account) } + let(:status_from_followed_account_first) { Fabricate(:status, account: followed_account) } + let(:status_from_target_account) { Fabricate(:status, account: target_account) } + let(:status_from_followed_account_mentions_target_account) { Fabricate(:status, account: followed_account, mentions: [Fabricate(:mention, account: target_account)]) } + let(:status_mentions_target_account) { Fabricate(:status, mentions: [Fabricate(:mention, account: target_account)]) } + let(:status_from_followed_account_reblogs_status_mentions_target_account) { Fabricate(:status, account: followed_account, reblog: status_mentions_target_account) } + let(:status_from_followed_account_reblogs_status_from_target_account) { Fabricate(:status, account: followed_account, reblog: status_from_target_account) } + let(:status_from_followed_account_next) { Fabricate(:status, account: followed_account) } before do - [status_1, status_3, status_5, status_6, status_7].each do |status| + [ + status_from_followed_account_first, + status_from_followed_account_mentions_target_account, + status_from_followed_account_reblogs_status_mentions_target_account, + status_from_followed_account_reblogs_status_from_target_account, + status_from_followed_account_next, + ].each do |status| redis.zadd("feed:home:#{account.id}", status.id, status.id) end end @@ -546,7 +552,7 @@ RSpec.describe FeedManager do it 'correctly cleans the home timeline' do described_class.instance.clear_from_home(account, target_account) - expect(redis.zrange("feed:home:#{account.id}", 0, -1)).to eq [status_1.id.to_s, status_7.id.to_s] + expect(redis.zrange("feed:home:#{account.id}", 0, -1)).to eq [status_from_followed_account_first.id.to_s, status_from_followed_account_next.id.to_s] end end end diff --git a/spec/lib/mastodon/cli/ip_blocks_spec.rb b/spec/lib/mastodon/cli/ip_blocks_spec.rb index e192679a59..030d9fcb19 100644 --- a/spec/lib/mastodon/cli/ip_blocks_spec.rb +++ b/spec/lib/mastodon/cli/ip_blocks_spec.rb @@ -189,22 +189,22 @@ describe Mastodon::CLI::IpBlocks do end context 'with --force option' do - let!(:block1) { IpBlock.create(ip: '192.168.0.0/24', severity: :no_access) } - let!(:block2) { IpBlock.create(ip: '10.0.0.0/16', severity: :no_access) } - let!(:block3) { IpBlock.create(ip: '172.16.0.0/20', severity: :no_access) } + let!(:first_ip_range_block) { IpBlock.create(ip: '192.168.0.0/24', severity: :no_access) } + let!(:second_ip_range_block) { IpBlock.create(ip: '10.0.0.0/16', severity: :no_access) } + let!(:third_ip_range_block) { IpBlock.create(ip: '172.16.0.0/20', severity: :no_access) } let(:arguments) { ['192.168.0.5', '10.0.1.50'] } let(:options) { { force: true } } it 'removes blocks for IP ranges that cover given IP(s)' do cli.invoke(:remove, arguments, options) - expect(IpBlock.where(id: [block1.id, block2.id])).to_not exist + expect(IpBlock.where(id: [first_ip_range_block.id, second_ip_range_block.id])).to_not exist end it 'does not remove other IP ranges' do cli.invoke(:remove, arguments, options) - expect(IpBlock.where(id: block3.id)).to exist + expect(IpBlock.where(id: third_ip_range_block.id)).to exist end end @@ -251,22 +251,22 @@ describe Mastodon::CLI::IpBlocks do end describe '#export' do - let(:block1) { IpBlock.create(ip: '192.168.0.0/24', severity: :no_access) } - let(:block2) { IpBlock.create(ip: '10.0.0.0/16', severity: :no_access) } - let(:block3) { IpBlock.create(ip: '127.0.0.1', severity: :sign_up_block) } + let(:first_ip_range_block) { IpBlock.create(ip: '192.168.0.0/24', severity: :no_access) } + let(:second_ip_range_block) { IpBlock.create(ip: '10.0.0.0/16', severity: :no_access) } + let(:third_ip_range_block) { IpBlock.create(ip: '127.0.0.1', severity: :sign_up_block) } context 'when --format option is set to "plain"' do let(:options) { { format: 'plain' } } it 'exports blocked IPs with "no_access" severity in plain format' do expect { cli.invoke(:export, nil, options) }.to output( - a_string_including("#{block1.ip}/#{block1.ip.prefix}\n#{block2.ip}/#{block2.ip.prefix}") + a_string_including("#{first_ip_range_block.ip}/#{first_ip_range_block.ip.prefix}\n#{second_ip_range_block.ip}/#{second_ip_range_block.ip.prefix}") ).to_stdout end it 'does not export bloked IPs with different severities' do expect { cli.invoke(:export, nil, options) }.to_not output( - a_string_including("#{block3.ip}/#{block1.ip.prefix}") + a_string_including("#{third_ip_range_block.ip}/#{first_ip_range_block.ip.prefix}") ).to_stdout end end @@ -276,13 +276,13 @@ describe Mastodon::CLI::IpBlocks do it 'exports blocked IPs with "no_access" severity in plain format' do expect { cli.invoke(:export, nil, options) }.to output( - a_string_including("deny #{block1.ip}/#{block1.ip.prefix};\ndeny #{block2.ip}/#{block2.ip.prefix};") + a_string_including("deny #{first_ip_range_block.ip}/#{first_ip_range_block.ip.prefix};\ndeny #{second_ip_range_block.ip}/#{second_ip_range_block.ip.prefix};") ).to_stdout end it 'does not export bloked IPs with different severities' do expect { cli.invoke(:export, nil, options) }.to_not output( - a_string_including("deny #{block3.ip}/#{block1.ip.prefix};") + a_string_including("deny #{third_ip_range_block.ip}/#{first_ip_range_block.ip.prefix};") ).to_stdout end end @@ -290,7 +290,7 @@ describe Mastodon::CLI::IpBlocks do context 'when --format option is not provided' do it 'exports blocked IPs in plain format by default' do expect { cli.export }.to output( - a_string_including("#{block1.ip}/#{block1.ip.prefix}\n#{block2.ip}/#{block2.ip.prefix}") + a_string_including("#{first_ip_range_block.ip}/#{first_ip_range_block.ip.prefix}\n#{second_ip_range_block.ip}/#{second_ip_range_block.ip.prefix}") ).to_stdout end end diff --git a/spec/models/account_statuses_cleanup_policy_spec.rb b/spec/models/account_statuses_cleanup_policy_spec.rb index 391b99ff47..7405bdfa2d 100644 --- a/spec/models/account_statuses_cleanup_policy_spec.rb +++ b/spec/models/account_statuses_cleanup_policy_spec.rb @@ -266,10 +266,10 @@ RSpec.describe AccountStatusesCleanupPolicy do let!(:self_bookmarked) { Fabricate(:status, created_at: 1.year.ago, account: account) } let!(:status_with_poll) { Fabricate(:status, created_at: 1.year.ago, account: account, poll_attributes: { account: account, voters_count: 0, options: %w(a b), expires_in: 2.days }) } let!(:status_with_media) { Fabricate(:status, created_at: 1.year.ago, account: account) } - let!(:faved4) { Fabricate(:status, created_at: 1.year.ago, account: account) } - let!(:faved5) { Fabricate(:status, created_at: 1.year.ago, account: account) } - let!(:reblogged4) { Fabricate(:status, created_at: 1.year.ago, account: account) } - let!(:reblogged5) { Fabricate(:status, created_at: 1.year.ago, account: account) } + let!(:faved_primary) { Fabricate(:status, created_at: 1.year.ago, account: account) } + let!(:faved_secondary) { Fabricate(:status, created_at: 1.year.ago, account: account) } + let!(:reblogged_primary) { Fabricate(:status, created_at: 1.year.ago, account: account) } + let!(:reblogged_secondary) { Fabricate(:status, created_at: 1.year.ago, account: account) } let!(:recent_status) { Fabricate(:status, created_at: 2.days.ago, account: account) } let!(:media_attachment) { Fabricate(:media_attachment, account: account, status: status_with_media) } @@ -280,10 +280,10 @@ RSpec.describe AccountStatusesCleanupPolicy do let(:account_statuses_cleanup_policy) { Fabricate(:account_statuses_cleanup_policy, account: account) } before do - 4.times { faved4.increment_count!(:favourites_count) } - 5.times { faved5.increment_count!(:favourites_count) } - 4.times { reblogged4.increment_count!(:reblogs_count) } - 5.times { reblogged5.increment_count!(:reblogs_count) } + 4.times { faved_primary.increment_count!(:favourites_count) } + 5.times { faved_secondary.increment_count!(:favourites_count) } + 4.times { reblogged_primary.increment_count!(:reblogs_count) } + 5.times { reblogged_secondary.increment_count!(:reblogs_count) } end context 'when passed a max_id' do @@ -359,7 +359,7 @@ RSpec.describe AccountStatusesCleanupPolicy do end it 'returns every other old status for deletion' do - expect(subject.pluck(:id)).to include(very_old_status.id, pinned_status.id, self_faved.id, self_bookmarked.id, status_with_poll.id, status_with_media.id, faved4.id, faved5.id, reblogged4.id, reblogged5.id) + expect(subject.pluck(:id)).to include(very_old_status.id, pinned_status.id, self_faved.id, self_bookmarked.id, status_with_poll.id, status_with_media.id, faved_primary.id, faved_secondary.id, reblogged_primary.id, reblogged_secondary.id) end end @@ -378,7 +378,7 @@ RSpec.describe AccountStatusesCleanupPolicy do end it 'returns every other old status for deletion' do - expect(subject.pluck(:id)).to include(direct_message.id, very_old_status.id, pinned_status.id, self_faved.id, status_with_poll.id, status_with_media.id, faved4.id, faved5.id, reblogged4.id, reblogged5.id) + expect(subject.pluck(:id)).to include(direct_message.id, very_old_status.id, pinned_status.id, self_faved.id, status_with_poll.id, status_with_media.id, faved_primary.id, faved_secondary.id, reblogged_primary.id, reblogged_secondary.id) end end @@ -397,7 +397,7 @@ RSpec.describe AccountStatusesCleanupPolicy do end it 'returns every other old status for deletion' do - expect(subject.pluck(:id)).to include(direct_message.id, very_old_status.id, pinned_status.id, self_bookmarked.id, status_with_poll.id, status_with_media.id, faved4.id, faved5.id, reblogged4.id, reblogged5.id) + expect(subject.pluck(:id)).to include(direct_message.id, very_old_status.id, pinned_status.id, self_bookmarked.id, status_with_poll.id, status_with_media.id, faved_primary.id, faved_secondary.id, reblogged_primary.id, reblogged_secondary.id) end end @@ -416,7 +416,7 @@ RSpec.describe AccountStatusesCleanupPolicy do end it 'returns every other old status for deletion' do - expect(subject.pluck(:id)).to include(direct_message.id, very_old_status.id, pinned_status.id, self_faved.id, self_bookmarked.id, status_with_poll.id, faved4.id, faved5.id, reblogged4.id, reblogged5.id) + expect(subject.pluck(:id)).to include(direct_message.id, very_old_status.id, pinned_status.id, self_faved.id, self_bookmarked.id, status_with_poll.id, faved_primary.id, faved_secondary.id, reblogged_primary.id, reblogged_secondary.id) end end @@ -435,7 +435,7 @@ RSpec.describe AccountStatusesCleanupPolicy do end it 'returns every other old status for deletion' do - expect(subject.pluck(:id)).to include(direct_message.id, very_old_status.id, pinned_status.id, self_faved.id, self_bookmarked.id, status_with_media.id, faved4.id, faved5.id, reblogged4.id, reblogged5.id) + expect(subject.pluck(:id)).to include(direct_message.id, very_old_status.id, pinned_status.id, self_faved.id, self_bookmarked.id, status_with_media.id, faved_primary.id, faved_secondary.id, reblogged_primary.id, reblogged_secondary.id) end end @@ -454,7 +454,7 @@ RSpec.describe AccountStatusesCleanupPolicy do end it 'returns every other old status for deletion' do - expect(subject.pluck(:id)).to include(direct_message.id, very_old_status.id, self_faved.id, self_bookmarked.id, status_with_poll.id, status_with_media.id, faved4.id, faved5.id, reblogged4.id, reblogged5.id) + expect(subject.pluck(:id)).to include(direct_message.id, very_old_status.id, self_faved.id, self_bookmarked.id, status_with_poll.id, status_with_media.id, faved_primary.id, faved_secondary.id, reblogged_primary.id, reblogged_secondary.id) end end @@ -477,7 +477,7 @@ RSpec.describe AccountStatusesCleanupPolicy do end it 'returns every other old status for deletion' do - expect(subject.pluck(:id)).to include(direct_message.id, very_old_status.id, pinned_status.id, self_faved.id, self_bookmarked.id, status_with_poll.id, status_with_media.id, faved4.id, faved5.id, reblogged4.id, reblogged5.id) + expect(subject.pluck(:id)).to include(direct_message.id, very_old_status.id, pinned_status.id, self_faved.id, self_bookmarked.id, status_with_poll.id, status_with_media.id, faved_primary.id, faved_secondary.id, reblogged_primary.id, reblogged_secondary.id) end end @@ -496,7 +496,7 @@ RSpec.describe AccountStatusesCleanupPolicy do end it 'returns only normal statuses for deletion' do - expect(subject.pluck(:id)).to contain_exactly(very_old_status.id, faved4.id, faved5.id, reblogged4.id, reblogged5.id) + expect(subject.pluck(:id)).to contain_exactly(very_old_status.id, faved_primary.id, faved_secondary.id, reblogged_primary.id, reblogged_secondary.id) end end @@ -510,7 +510,7 @@ RSpec.describe AccountStatusesCleanupPolicy do end it 'does not return the toot reblogged 5 times' do - expect(subject.pluck(:id)).to_not include(reblogged5.id) + expect(subject.pluck(:id)).to_not include(reblogged_secondary.id) end it 'does not return the unrelated toot' do @@ -518,7 +518,7 @@ RSpec.describe AccountStatusesCleanupPolicy do end it 'returns old statuses not reblogged as much' do - expect(subject.pluck(:id)).to include(very_old_status.id, faved4.id, faved5.id, reblogged4.id) + expect(subject.pluck(:id)).to include(very_old_status.id, faved_primary.id, faved_secondary.id, reblogged_primary.id) end end @@ -532,7 +532,7 @@ RSpec.describe AccountStatusesCleanupPolicy do end it 'does not return the toot faved 5 times' do - expect(subject.pluck(:id)).to_not include(faved5.id) + expect(subject.pluck(:id)).to_not include(faved_secondary.id) end it 'does not return the unrelated toot' do @@ -540,7 +540,7 @@ RSpec.describe AccountStatusesCleanupPolicy do end it 'returns old statuses not faved as much' do - expect(subject.pluck(:id)).to include(very_old_status.id, faved4.id, reblogged4.id, reblogged5.id) + expect(subject.pluck(:id)).to include(very_old_status.id, faved_primary.id, reblogged_primary.id, reblogged_secondary.id) end end end diff --git a/spec/models/concerns/account_interactions_spec.rb b/spec/models/concerns/account_interactions_spec.rb index dc03aad7d4..84e2c91a85 100644 --- a/spec/models/concerns/account_interactions_spec.rb +++ b/spec/models/concerns/account_interactions_spec.rb @@ -560,17 +560,17 @@ describe AccountInteractions do describe '#remote_followers_hash' do let(:me) { Fabricate(:account, username: 'Me') } - let(:remote_1) { Fabricate(:account, username: 'alice', domain: 'example.org', uri: 'https://example.org/users/alice') } - let(:remote_2) { Fabricate(:account, username: 'bob', domain: 'example.org', uri: 'https://example.org/users/bob') } - let(:remote_3) { Fabricate(:account, username: 'instance-actor', domain: 'example.org', uri: 'https://example.org') } - let(:remote_4) { Fabricate(:account, username: 'eve', domain: 'foo.org', uri: 'https://foo.org/users/eve') } + let(:remote_alice) { Fabricate(:account, username: 'alice', domain: 'example.org', uri: 'https://example.org/users/alice') } + let(:remote_bob) { Fabricate(:account, username: 'bob', domain: 'example.org', uri: 'https://example.org/users/bob') } + let(:remote_instance_actor) { Fabricate(:account, username: 'instance-actor', domain: 'example.org', uri: 'https://example.org') } + let(:remote_eve) { Fabricate(:account, username: 'eve', domain: 'foo.org', uri: 'https://foo.org/users/eve') } before do - remote_1.follow!(me) - remote_2.follow!(me) - remote_3.follow!(me) - remote_4.follow!(me) - me.follow!(remote_1) + remote_alice.follow!(me) + remote_bob.follow!(me) + remote_instance_actor.follow!(me) + remote_eve.follow!(me) + me.follow!(remote_alice) end it 'returns correct hash for remote domains' do @@ -582,33 +582,33 @@ describe AccountInteractions do it 'invalidates cache as needed when removing or adding followers' do expect(me.remote_followers_hash('https://example.org/')).to eq '20aecbe774b3d61c25094370baf370012b9271c5b172ecedb05caff8d79ef0c7' - remote_3.unfollow!(me) + remote_instance_actor.unfollow!(me) expect(me.remote_followers_hash('https://example.org/')).to eq '707962e297b7bd94468a21bc8e506a1bcea607a9142cd64e27c9b106b2a5f6ec' - remote_1.unfollow!(me) + remote_alice.unfollow!(me) expect(me.remote_followers_hash('https://example.org/')).to eq '241b00794ce9b46aa864f3220afadef128318da2659782985bac5ed5bd436bff' - remote_1.follow!(me) + remote_alice.follow!(me) expect(me.remote_followers_hash('https://example.org/')).to eq '707962e297b7bd94468a21bc8e506a1bcea607a9142cd64e27c9b106b2a5f6ec' end end describe '#local_followers_hash' do let(:me) { Fabricate(:account, username: 'Me') } - let(:remote_1) { Fabricate(:account, username: 'alice', domain: 'example.org', uri: 'https://example.org/users/alice') } + let(:remote_alice) { Fabricate(:account, username: 'alice', domain: 'example.org', uri: 'https://example.org/users/alice') } before do - me.follow!(remote_1) + me.follow!(remote_alice) end it 'returns correct hash for local users' do - expect(remote_1.local_followers_hash).to eq Digest::SHA256.hexdigest(ActivityPub::TagManager.instance.uri_for(me)) + expect(remote_alice.local_followers_hash).to eq Digest::SHA256.hexdigest(ActivityPub::TagManager.instance.uri_for(me)) end it 'invalidates cache as needed when removing or adding followers' do - expect(remote_1.local_followers_hash).to eq Digest::SHA256.hexdigest(ActivityPub::TagManager.instance.uri_for(me)) - me.unfollow!(remote_1) - expect(remote_1.local_followers_hash).to eq '0000000000000000000000000000000000000000000000000000000000000000' - me.follow!(remote_1) - expect(remote_1.local_followers_hash).to eq Digest::SHA256.hexdigest(ActivityPub::TagManager.instance.uri_for(me)) + expect(remote_alice.local_followers_hash).to eq Digest::SHA256.hexdigest(ActivityPub::TagManager.instance.uri_for(me)) + me.unfollow!(remote_alice) + expect(remote_alice.local_followers_hash).to eq '0000000000000000000000000000000000000000000000000000000000000000' + me.follow!(remote_alice) + expect(remote_alice.local_followers_hash).to eq Digest::SHA256.hexdigest(ActivityPub::TagManager.instance.uri_for(me)) end end diff --git a/spec/models/concerns/status_threading_concern_spec.rb b/spec/models/concerns/status_threading_concern_spec.rb index 50286ef77b..2eac1ca6e5 100644 --- a/spec/models/concerns/status_threading_concern_spec.rb +++ b/spec/models/concerns/status_threading_concern_spec.rb @@ -8,40 +8,40 @@ describe StatusThreadingConcern do let!(:bob) { Fabricate(:account, username: 'bob', domain: 'example.com') } let!(:jeff) { Fabricate(:account, username: 'jeff') } let!(:status) { Fabricate(:status, account: alice) } - let!(:reply1) { Fabricate(:status, thread: status, account: jeff) } - let!(:reply2) { Fabricate(:status, thread: reply1, account: bob) } - let!(:reply3) { Fabricate(:status, thread: reply2, account: alice) } + let!(:reply_to_status) { Fabricate(:status, thread: status, account: jeff) } + let!(:reply_to_first_reply) { Fabricate(:status, thread: reply_to_status, account: bob) } + let!(:reply_to_second_reply) { Fabricate(:status, thread: reply_to_first_reply, account: alice) } let!(:viewer) { Fabricate(:account, username: 'viewer') } it 'returns conversation history' do - expect(reply3.ancestors(4)).to include(status, reply1, reply2) + expect(reply_to_second_reply.ancestors(4)).to include(status, reply_to_status, reply_to_first_reply) end it 'does not return conversation history user is not allowed to see' do - reply1.update(visibility: :private) + reply_to_status.update(visibility: :private) status.update(visibility: :direct) - expect(reply3.ancestors(4, viewer)).to_not include(reply1, status) + expect(reply_to_second_reply.ancestors(4, viewer)).to_not include(reply_to_status, status) end it 'does not return conversation history from blocked users' do viewer.block!(jeff) - expect(reply3.ancestors(4, viewer)).to_not include(reply1) + expect(reply_to_second_reply.ancestors(4, viewer)).to_not include(reply_to_status) end it 'does not return conversation history from muted users' do viewer.mute!(jeff) - expect(reply3.ancestors(4, viewer)).to_not include(reply1) + expect(reply_to_second_reply.ancestors(4, viewer)).to_not include(reply_to_status) end it 'does not return conversation history from silenced and not followed users' do jeff.silence! - expect(reply3.ancestors(4, viewer)).to_not include(reply1) + expect(reply_to_second_reply.ancestors(4, viewer)).to_not include(reply_to_status) end it 'does not return conversation history from blocked domains' do viewer.block_domain!('example.com') - expect(reply3.ancestors(4, viewer)).to_not include(reply2) + expect(reply_to_second_reply.ancestors(4, viewer)).to_not include(reply_to_first_reply) end it 'ignores deleted records' do @@ -83,40 +83,40 @@ describe StatusThreadingConcern do let!(:bob) { Fabricate(:account, username: 'bob', domain: 'example.com') } let!(:jeff) { Fabricate(:account, username: 'jeff') } let!(:status) { Fabricate(:status, account: alice) } - let!(:reply1) { Fabricate(:status, thread: status, account: alice) } - let!(:reply2) { Fabricate(:status, thread: status, account: bob) } - let!(:reply3) { Fabricate(:status, thread: reply1, account: jeff) } + let!(:reply_to_status_from_alice) { Fabricate(:status, thread: status, account: alice) } + let!(:reply_to_status_from_bob) { Fabricate(:status, thread: status, account: bob) } + let!(:reply_to_alice_reply_from_jeff) { Fabricate(:status, thread: reply_to_status_from_alice, account: jeff) } let!(:viewer) { Fabricate(:account, username: 'viewer') } it 'returns replies' do - expect(status.descendants(4)).to include(reply1, reply2, reply3) + expect(status.descendants(4)).to include(reply_to_status_from_alice, reply_to_status_from_bob, reply_to_alice_reply_from_jeff) end it 'does not return replies user is not allowed to see' do - reply1.update(visibility: :private) - reply3.update(visibility: :direct) + reply_to_status_from_alice.update(visibility: :private) + reply_to_alice_reply_from_jeff.update(visibility: :direct) - expect(status.descendants(4, viewer)).to_not include(reply1, reply3) + expect(status.descendants(4, viewer)).to_not include(reply_to_status_from_alice, reply_to_alice_reply_from_jeff) end it 'does not return replies from blocked users' do viewer.block!(jeff) - expect(status.descendants(4, viewer)).to_not include(reply3) + expect(status.descendants(4, viewer)).to_not include(reply_to_alice_reply_from_jeff) end it 'does not return replies from muted users' do viewer.mute!(jeff) - expect(status.descendants(4, viewer)).to_not include(reply3) + expect(status.descendants(4, viewer)).to_not include(reply_to_alice_reply_from_jeff) end it 'does not return replies from silenced and not followed users' do jeff.silence! - expect(status.descendants(4, viewer)).to_not include(reply3) + expect(status.descendants(4, viewer)).to_not include(reply_to_alice_reply_from_jeff) end it 'does not return replies from blocked domains' do viewer.block_domain!('example.com') - expect(status.descendants(4, viewer)).to_not include(reply2) + expect(status.descendants(4, viewer)).to_not include(reply_to_status_from_bob) end it 'promotes self-replies to the top while leaving the rest in order' do diff --git a/spec/models/custom_emoji_filter_spec.rb b/spec/models/custom_emoji_filter_spec.rb index d8a2bea6b8..c36fecd60d 100644 --- a/spec/models/custom_emoji_filter_spec.rb +++ b/spec/models/custom_emoji_filter_spec.rb @@ -6,9 +6,9 @@ RSpec.describe CustomEmojiFilter do describe '#results' do subject { described_class.new(params).results } - let!(:custom_emoji_0) { Fabricate(:custom_emoji, domain: 'a') } - let!(:custom_emoji_1) { Fabricate(:custom_emoji, domain: 'b') } - let!(:custom_emoji_2) { Fabricate(:custom_emoji, domain: nil, shortcode: 'hoge') } + let!(:custom_emoji_domain_a) { Fabricate(:custom_emoji, domain: 'a') } + let!(:custom_emoji_domain_b) { Fabricate(:custom_emoji, domain: 'b') } + let!(:custom_emoji_domain_nil) { Fabricate(:custom_emoji, domain: nil, shortcode: 'hoge') } context 'when params have values' do context 'when local' do @@ -16,7 +16,7 @@ RSpec.describe CustomEmojiFilter do it 'returns ActiveRecord::Relation' do expect(subject).to be_a(ActiveRecord::Relation) - expect(subject).to contain_exactly(custom_emoji_2) + expect(subject).to contain_exactly(custom_emoji_domain_nil) end end @@ -25,7 +25,7 @@ RSpec.describe CustomEmojiFilter do it 'returns ActiveRecord::Relation' do expect(subject).to be_a(ActiveRecord::Relation) - expect(subject).to contain_exactly(custom_emoji_0, custom_emoji_1) + expect(subject).to contain_exactly(custom_emoji_domain_a, custom_emoji_domain_b) end end @@ -34,7 +34,7 @@ RSpec.describe CustomEmojiFilter do it 'returns ActiveRecord::Relation' do expect(subject).to be_a(ActiveRecord::Relation) - expect(subject).to contain_exactly(custom_emoji_0) + expect(subject).to contain_exactly(custom_emoji_domain_a) end end @@ -43,7 +43,7 @@ RSpec.describe CustomEmojiFilter do it 'returns ActiveRecord::Relation' do expect(subject).to be_a(ActiveRecord::Relation) - expect(subject).to contain_exactly(custom_emoji_2) + expect(subject).to contain_exactly(custom_emoji_domain_nil) end end @@ -63,7 +63,7 @@ RSpec.describe CustomEmojiFilter do it 'returns ActiveRecord::Relation' do expect(subject).to be_a(ActiveRecord::Relation) - expect(subject).to contain_exactly(custom_emoji_0, custom_emoji_1, custom_emoji_2) + expect(subject).to contain_exactly(custom_emoji_domain_a, custom_emoji_domain_b, custom_emoji_domain_nil) end end end diff --git a/spec/models/status_spec.rb b/spec/models/status_spec.rb index 3141c52c05..8c37b1accc 100644 --- a/spec/models/status_spec.rb +++ b/spec/models/status_spec.rb @@ -254,82 +254,82 @@ RSpec.describe Status do end describe '.tagged_with' do - let(:tag1) { Fabricate(:tag) } - let(:tag2) { Fabricate(:tag) } - let(:tag3) { Fabricate(:tag) } - let!(:status1) { Fabricate(:status, tags: [tag1]) } - let!(:status2) { Fabricate(:status, tags: [tag2]) } - let!(:status3) { Fabricate(:status, tags: [tag3]) } - let!(:status4) { Fabricate(:status, tags: []) } - let!(:status5) { Fabricate(:status, tags: [tag1, tag2, tag3]) } + let(:tag_cats) { Fabricate(:tag, name: 'cats') } + let(:tag_dogs) { Fabricate(:tag, name: 'dogs') } + let(:tag_zebras) { Fabricate(:tag, name: 'zebras') } + let!(:status_with_tag_cats) { Fabricate(:status, tags: [tag_cats]) } + let!(:status_with_tag_dogs) { Fabricate(:status, tags: [tag_dogs]) } + let!(:status_tagged_with_zebras) { Fabricate(:status, tags: [tag_zebras]) } + let!(:status_without_tags) { Fabricate(:status, tags: []) } + let!(:status_with_all_tags) { Fabricate(:status, tags: [tag_cats, tag_dogs, tag_zebras]) } context 'when given one tag' do it 'returns the expected statuses' do - expect(described_class.tagged_with([tag1.id]).reorder(:id).pluck(:id).uniq).to contain_exactly(status1.id, status5.id) - expect(described_class.tagged_with([tag2.id]).reorder(:id).pluck(:id).uniq).to contain_exactly(status2.id, status5.id) - expect(described_class.tagged_with([tag3.id]).reorder(:id).pluck(:id).uniq).to contain_exactly(status3.id, status5.id) + expect(described_class.tagged_with([tag_cats.id]).reorder(:id).pluck(:id).uniq).to contain_exactly(status_with_tag_cats.id, status_with_all_tags.id) + expect(described_class.tagged_with([tag_dogs.id]).reorder(:id).pluck(:id).uniq).to contain_exactly(status_with_tag_dogs.id, status_with_all_tags.id) + expect(described_class.tagged_with([tag_zebras.id]).reorder(:id).pluck(:id).uniq).to contain_exactly(status_tagged_with_zebras.id, status_with_all_tags.id) end end context 'when given multiple tags' do it 'returns the expected statuses' do - expect(described_class.tagged_with([tag1.id, tag2.id]).reorder(:id).pluck(:id).uniq).to contain_exactly(status1.id, status2.id, status5.id) - expect(described_class.tagged_with([tag1.id, tag3.id]).reorder(:id).pluck(:id).uniq).to contain_exactly(status1.id, status3.id, status5.id) - expect(described_class.tagged_with([tag2.id, tag3.id]).reorder(:id).pluck(:id).uniq).to contain_exactly(status2.id, status3.id, status5.id) + expect(described_class.tagged_with([tag_cats.id, tag_dogs.id]).reorder(:id).pluck(:id).uniq).to contain_exactly(status_with_tag_cats.id, status_with_tag_dogs.id, status_with_all_tags.id) + expect(described_class.tagged_with([tag_cats.id, tag_zebras.id]).reorder(:id).pluck(:id).uniq).to contain_exactly(status_with_tag_cats.id, status_tagged_with_zebras.id, status_with_all_tags.id) + expect(described_class.tagged_with([tag_dogs.id, tag_zebras.id]).reorder(:id).pluck(:id).uniq).to contain_exactly(status_with_tag_dogs.id, status_tagged_with_zebras.id, status_with_all_tags.id) end end end describe '.tagged_with_all' do - let(:tag1) { Fabricate(:tag) } - let(:tag2) { Fabricate(:tag) } - let(:tag3) { Fabricate(:tag) } - let!(:status1) { Fabricate(:status, tags: [tag1]) } - let!(:status2) { Fabricate(:status, tags: [tag2]) } - let!(:status3) { Fabricate(:status, tags: [tag3]) } - let!(:status4) { Fabricate(:status, tags: []) } - let!(:status5) { Fabricate(:status, tags: [tag1, tag2]) } + let(:tag_cats) { Fabricate(:tag, name: 'cats') } + let(:tag_dogs) { Fabricate(:tag, name: 'dogs') } + let(:tag_zebras) { Fabricate(:tag, name: 'zebras') } + let!(:status_with_tag_cats) { Fabricate(:status, tags: [tag_cats]) } + let!(:status_with_tag_dogs) { Fabricate(:status, tags: [tag_dogs]) } + let!(:status_tagged_with_zebras) { Fabricate(:status, tags: [tag_zebras]) } + let!(:status_without_tags) { Fabricate(:status, tags: []) } + let!(:status_with_all_tags) { Fabricate(:status, tags: [tag_cats, tag_dogs]) } context 'when given one tag' do it 'returns the expected statuses' do - expect(described_class.tagged_with_all([tag1.id]).reorder(:id).pluck(:id).uniq).to contain_exactly(status1.id, status5.id) - expect(described_class.tagged_with_all([tag2.id]).reorder(:id).pluck(:id).uniq).to contain_exactly(status2.id, status5.id) - expect(described_class.tagged_with_all([tag3.id]).reorder(:id).pluck(:id).uniq).to contain_exactly(status3.id) + expect(described_class.tagged_with_all([tag_cats.id]).reorder(:id).pluck(:id).uniq).to contain_exactly(status_with_tag_cats.id, status_with_all_tags.id) + expect(described_class.tagged_with_all([tag_dogs.id]).reorder(:id).pluck(:id).uniq).to contain_exactly(status_with_tag_dogs.id, status_with_all_tags.id) + expect(described_class.tagged_with_all([tag_zebras.id]).reorder(:id).pluck(:id).uniq).to contain_exactly(status_tagged_with_zebras.id) end end context 'when given multiple tags' do it 'returns the expected statuses' do - expect(described_class.tagged_with_all([tag1.id, tag2.id]).reorder(:id).pluck(:id).uniq).to contain_exactly(status5.id) - expect(described_class.tagged_with_all([tag1.id, tag3.id]).reorder(:id).pluck(:id).uniq).to eq [] - expect(described_class.tagged_with_all([tag2.id, tag3.id]).reorder(:id).pluck(:id).uniq).to eq [] + expect(described_class.tagged_with_all([tag_cats.id, tag_dogs.id]).reorder(:id).pluck(:id).uniq).to contain_exactly(status_with_all_tags.id) + expect(described_class.tagged_with_all([tag_cats.id, tag_zebras.id]).reorder(:id).pluck(:id).uniq).to eq [] + expect(described_class.tagged_with_all([tag_dogs.id, tag_zebras.id]).reorder(:id).pluck(:id).uniq).to eq [] end end end describe '.tagged_with_none' do - let(:tag1) { Fabricate(:tag) } - let(:tag2) { Fabricate(:tag) } - let(:tag3) { Fabricate(:tag) } - let!(:status1) { Fabricate(:status, tags: [tag1]) } - let!(:status2) { Fabricate(:status, tags: [tag2]) } - let!(:status3) { Fabricate(:status, tags: [tag3]) } - let!(:status4) { Fabricate(:status, tags: []) } - let!(:status5) { Fabricate(:status, tags: [tag1, tag2, tag3]) } + let(:tag_cats) { Fabricate(:tag, name: 'cats') } + let(:tag_dogs) { Fabricate(:tag, name: 'dogs') } + let(:tag_zebras) { Fabricate(:tag, name: 'zebras') } + let!(:status_with_tag_cats) { Fabricate(:status, tags: [tag_cats]) } + let!(:status_with_tag_dogs) { Fabricate(:status, tags: [tag_dogs]) } + let!(:status_tagged_with_zebras) { Fabricate(:status, tags: [tag_zebras]) } + let!(:status_without_tags) { Fabricate(:status, tags: []) } + let!(:status_with_all_tags) { Fabricate(:status, tags: [tag_cats, tag_dogs, tag_zebras]) } context 'when given one tag' do it 'returns the expected statuses' do - expect(described_class.tagged_with_none([tag1.id]).reorder(:id).pluck(:id).uniq).to contain_exactly(status2.id, status3.id, status4.id) - expect(described_class.tagged_with_none([tag2.id]).reorder(:id).pluck(:id).uniq).to contain_exactly(status1.id, status3.id, status4.id) - expect(described_class.tagged_with_none([tag3.id]).reorder(:id).pluck(:id).uniq).to contain_exactly(status1.id, status2.id, status4.id) + expect(described_class.tagged_with_none([tag_cats.id]).reorder(:id).pluck(:id).uniq).to contain_exactly(status_with_tag_dogs.id, status_tagged_with_zebras.id, status_without_tags.id) + expect(described_class.tagged_with_none([tag_dogs.id]).reorder(:id).pluck(:id).uniq).to contain_exactly(status_with_tag_cats.id, status_tagged_with_zebras.id, status_without_tags.id) + expect(described_class.tagged_with_none([tag_zebras.id]).reorder(:id).pluck(:id).uniq).to contain_exactly(status_with_tag_cats.id, status_with_tag_dogs.id, status_without_tags.id) end end context 'when given multiple tags' do it 'returns the expected statuses' do - expect(described_class.tagged_with_none([tag1.id, tag2.id]).reorder(:id).pluck(:id).uniq).to contain_exactly(status3.id, status4.id) - expect(described_class.tagged_with_none([tag1.id, tag3.id]).reorder(:id).pluck(:id).uniq).to contain_exactly(status2.id, status4.id) - expect(described_class.tagged_with_none([tag2.id, tag3.id]).reorder(:id).pluck(:id).uniq).to contain_exactly(status1.id, status4.id) + expect(described_class.tagged_with_none([tag_cats.id, tag_dogs.id]).reorder(:id).pluck(:id).uniq).to contain_exactly(status_tagged_with_zebras.id, status_without_tags.id) + expect(described_class.tagged_with_none([tag_cats.id, tag_zebras.id]).reorder(:id).pluck(:id).uniq).to contain_exactly(status_with_tag_dogs.id, status_without_tags.id) + expect(described_class.tagged_with_none([tag_dogs.id, tag_zebras.id]).reorder(:id).pluck(:id).uniq).to contain_exactly(status_with_tag_cats.id, status_without_tags.id) end end end diff --git a/spec/models/tag_feed_spec.rb b/spec/models/tag_feed_spec.rb index a498bcf46f..6f5e1eb307 100644 --- a/spec/models/tag_feed_spec.rb +++ b/spec/models/tag_feed_spec.rb @@ -5,65 +5,65 @@ require 'rails_helper' describe TagFeed, type: :service do describe '#get' do let(:account) { Fabricate(:account) } - let(:tag1) { Fabricate(:tag) } - let(:tag2) { Fabricate(:tag) } - let!(:status1) { Fabricate(:status, tags: [tag1]) } - let!(:status2) { Fabricate(:status, tags: [tag2]) } - let!(:both) { Fabricate(:status, tags: [tag1, tag2]) } + let(:tag_cats) { Fabricate(:tag, name: 'cats') } + let(:tag_dogs) { Fabricate(:tag, name: 'dogs') } + let!(:status_tagged_with_cats) { Fabricate(:status, tags: [tag_cats]) } + let!(:status_tagged_with_dogs) { Fabricate(:status, tags: [tag_dogs]) } + let!(:both) { Fabricate(:status, tags: [tag_cats, tag_dogs]) } it 'can add tags in "any" mode' do - results = described_class.new(tag1, nil, any: [tag2.name]).get(20) - expect(results).to include status1 - expect(results).to include status2 + results = described_class.new(tag_cats, nil, any: [tag_dogs.name]).get(20) + expect(results).to include status_tagged_with_cats + expect(results).to include status_tagged_with_dogs expect(results).to include both end it 'can remove tags in "all" mode' do - results = described_class.new(tag1, nil, all: [tag2.name]).get(20) - expect(results).to_not include status1 - expect(results).to_not include status2 + results = described_class.new(tag_cats, nil, all: [tag_dogs.name]).get(20) + expect(results).to_not include status_tagged_with_cats + expect(results).to_not include status_tagged_with_dogs expect(results).to include both end it 'can remove tags in "none" mode' do - results = described_class.new(tag1, nil, none: [tag2.name]).get(20) - expect(results).to include status1 - expect(results).to_not include status2 + results = described_class.new(tag_cats, nil, none: [tag_dogs.name]).get(20) + expect(results).to include status_tagged_with_cats + expect(results).to_not include status_tagged_with_dogs expect(results).to_not include both end it 'ignores an invalid mode' do - results = described_class.new(tag1, nil, wark: [tag2.name]).get(20) - expect(results).to include status1 - expect(results).to_not include status2 + results = described_class.new(tag_cats, nil, wark: [tag_dogs.name]).get(20) + expect(results).to include status_tagged_with_cats + expect(results).to_not include status_tagged_with_dogs expect(results).to include both end it 'handles being passed non existent tag names' do - results = described_class.new(tag1, nil, any: ['wark']).get(20) - expect(results).to include status1 - expect(results).to_not include status2 + results = described_class.new(tag_cats, nil, any: ['wark']).get(20) + expect(results).to include status_tagged_with_cats + expect(results).to_not include status_tagged_with_dogs expect(results).to include both end it 'can restrict to an account' do - BlockService.new.call(account, status1.account) - results = described_class.new(tag1, account, none: [tag2.name]).get(20) - expect(results).to_not include status1 + BlockService.new.call(account, status_tagged_with_cats.account) + results = described_class.new(tag_cats, account, none: [tag_dogs.name]).get(20) + expect(results).to_not include status_tagged_with_cats end it 'can restrict to local' do - status1.account.update(domain: 'example.com') - status1.update(local: false, uri: 'example.com/toot') - results = described_class.new(tag1, nil, any: [tag2.name], local: true).get(20) - expect(results).to_not include status1 + status_tagged_with_cats.account.update(domain: 'example.com') + status_tagged_with_cats.update(local: false, uri: 'example.com/toot') + results = described_class.new(tag_cats, nil, any: [tag_dogs.name], local: true).get(20) + expect(results).to_not include status_tagged_with_cats end it 'allows replies to be included' do original = Fabricate(:status) - status = Fabricate(:status, tags: [tag1], in_reply_to_id: original.id) + status = Fabricate(:status, tags: [tag_cats], in_reply_to_id: original.id) - results = described_class.new(tag1, nil).get(20) + results = described_class.new(tag_cats, nil).get(20) expect(results).to include(status) end end diff --git a/spec/models/trends/statuses_spec.rb b/spec/models/trends/statuses_spec.rb index e30722f585..7c30b5b997 100644 --- a/spec/models/trends/statuses_spec.rb +++ b/spec/models/trends/statuses_spec.rb @@ -11,12 +11,12 @@ RSpec.describe Trends::Statuses do let!(:query) { subject.query } let!(:today) { at_time } - let!(:status1) { Fabricate(:status, text: 'Foo', language: 'en', trendable: true, created_at: today) } - let!(:status2) { Fabricate(:status, text: 'Bar', language: 'en', trendable: true, created_at: today) } + let!(:status_foo) { Fabricate(:status, text: 'Foo', language: 'en', trendable: true, created_at: today) } + let!(:status_bar) { Fabricate(:status, text: 'Bar', language: 'en', trendable: true, created_at: today) } before do - default_threshold_value.times { reblog(status1, today) } - default_threshold_value.times { reblog(status2, today) } + default_threshold_value.times { reblog(status_foo, today) } + default_threshold_value.times { reblog(status_bar, today) } subject.refresh(today) end @@ -29,18 +29,18 @@ RSpec.describe Trends::Statuses do end it 'filters out blocked accounts' do - account.block!(status1.account) - expect(query.filtered_for(account).to_a).to eq [status2] + account.block!(status_foo.account) + expect(query.filtered_for(account).to_a).to eq [status_bar] end it 'filters out muted accounts' do - account.mute!(status2.account) - expect(query.filtered_for(account).to_a).to eq [status1] + account.mute!(status_bar.account) + expect(query.filtered_for(account).to_a).to eq [status_foo] end it 'filters out blocked-by accounts' do - status1.account.block!(account) - expect(query.filtered_for(account).to_a).to eq [status2] + status_foo.account.block!(account) + expect(query.filtered_for(account).to_a).to eq [status_bar] end end end @@ -71,14 +71,14 @@ RSpec.describe Trends::Statuses do let!(:today) { at_time } let!(:yesterday) { today - 1.day } - let!(:status1) { Fabricate(:status, text: 'Foo', language: 'en', trendable: true, created_at: yesterday) } - let!(:status2) { Fabricate(:status, text: 'Bar', language: 'en', trendable: true, created_at: today) } - let!(:status3) { Fabricate(:status, text: 'Baz', language: 'en', trendable: true, created_at: today) } + let!(:status_foo) { Fabricate(:status, text: 'Foo', language: 'en', trendable: true, created_at: yesterday) } + let!(:status_bar) { Fabricate(:status, text: 'Bar', language: 'en', trendable: true, created_at: today) } + let!(:status_baz) { Fabricate(:status, text: 'Baz', language: 'en', trendable: true, created_at: today) } before do - default_threshold_value.times { reblog(status1, today) } - default_threshold_value.times { reblog(status2, today) } - (default_threshold_value - 1).times { reblog(status3, today) } + default_threshold_value.times { reblog(status_foo, today) } + default_threshold_value.times { reblog(status_bar, today) } + (default_threshold_value - 1).times { reblog(status_baz, today) } end context 'when status trends are refreshed' do @@ -89,17 +89,17 @@ RSpec.describe Trends::Statuses do it 'returns correct statuses from query' do results = subject.query.limit(10).to_a - expect(results).to eq [status2, status1] - expect(results).to_not include(status3) + expect(results).to eq [status_bar, status_foo] + expect(results).to_not include(status_baz) end end it 'decays scores' do subject.refresh(today) - original_score = status2.trend.score + original_score = status_bar.trend.score expect(original_score).to be_a Float subject.refresh(today + subject.options[:score_halflife]) - decayed_score = status2.trend.reload.score + decayed_score = status_bar.trend.reload.score expect(decayed_score).to be <= original_score / 2 end end diff --git a/spec/models/trends/tags_spec.rb b/spec/models/trends/tags_spec.rb index 79cdee3461..f2818fca87 100644 --- a/spec/models/trends/tags_spec.rb +++ b/spec/models/trends/tags_spec.rb @@ -33,15 +33,15 @@ RSpec.describe Trends::Tags do let!(:today) { at_time } let!(:yesterday) { today - 1.day } - let!(:tag1) { Fabricate(:tag, name: 'Catstodon', trendable: true) } - let!(:tag2) { Fabricate(:tag, name: 'DogsOfMastodon', trendable: true) } - let!(:tag3) { Fabricate(:tag, name: 'OCs', trendable: true) } + let!(:tag_cats) { Fabricate(:tag, name: 'Catstodon', trendable: true) } + let!(:tag_dogs) { Fabricate(:tag, name: 'DogsOfMastodon', trendable: true) } + let!(:tag_ocs) { Fabricate(:tag, name: 'OCs', trendable: true) } before do - 2.times { |i| subject.add(tag1, i, yesterday) } - 13.times { |i| subject.add(tag3, i, yesterday) } - 16.times { |i| subject.add(tag1, i, today) } - 4.times { |i| subject.add(tag2, i, today) } + 2.times { |i| subject.add(tag_cats, i, yesterday) } + 13.times { |i| subject.add(tag_ocs, i, yesterday) } + 16.times { |i| subject.add(tag_cats, i, today) } + 4.times { |i| subject.add(tag_dogs, i, today) } end context 'when tag trends are refreshed' do @@ -51,20 +51,20 @@ RSpec.describe Trends::Tags do end it 'calculates and re-calculates scores' do - expect(subject.query.limit(10).to_a).to eq [tag1, tag3] + expect(subject.query.limit(10).to_a).to eq [tag_cats, tag_ocs] end it 'omits hashtags below threshold' do - expect(subject.query.limit(10).to_a).to_not include(tag2) + expect(subject.query.limit(10).to_a).to_not include(tag_dogs) end end it 'decays scores' do subject.refresh(yesterday + 12.hours) - original_score = subject.score(tag3.id) + original_score = subject.score(tag_ocs.id) expect(original_score).to eq 144.0 subject.refresh(yesterday + 12.hours + subject.options[:max_score_halflife]) - decayed_score = subject.score(tag3.id) + decayed_score = subject.score(tag_ocs.id) expect(decayed_score).to be <= original_score / 2 end end diff --git a/spec/serializers/activitypub/note_serializer_spec.rb b/spec/serializers/activitypub/note_serializer_spec.rb index 68f5378918..4b2b8ec875 100644 --- a/spec/serializers/activitypub/note_serializer_spec.rb +++ b/spec/serializers/activitypub/note_serializer_spec.rb @@ -6,13 +6,13 @@ describe ActivityPub::NoteSerializer do subject { JSON.parse(@serialization.to_json) } let!(:account) { Fabricate(:account) } - let!(:other) { Fabricate(:account) } - let!(:parent) { Fabricate(:status, account: account, visibility: :public) } - let!(:reply1) { Fabricate(:status, account: account, thread: parent, visibility: :public) } - let!(:reply2) { Fabricate(:status, account: account, thread: parent, visibility: :public) } - let!(:reply3) { Fabricate(:status, account: other, thread: parent, visibility: :public) } - let!(:reply4) { Fabricate(:status, account: account, thread: parent, visibility: :public) } - let!(:reply5) { Fabricate(:status, account: account, thread: parent, visibility: :direct) } + let!(:other) { Fabricate(:account) } + let!(:parent) { Fabricate(:status, account: account, visibility: :public) } + let!(:reply_by_account_first) { Fabricate(:status, account: account, thread: parent, visibility: :public) } + let!(:reply_by_account_next) { Fabricate(:status, account: account, thread: parent, visibility: :public) } + let!(:reply_by_other_first) { Fabricate(:status, account: other, thread: parent, visibility: :public) } + let!(:reply_by_account_third) { Fabricate(:status, account: account, thread: parent, visibility: :public) } + let!(:reply_by_account_visibility_direct) { Fabricate(:status, account: account, thread: parent, visibility: :direct) } before(:each) do @serialization = ActiveModelSerializers::SerializableResource.new(parent, serializer: described_class, adapter: ActivityPub::Adapter) @@ -31,14 +31,14 @@ describe ActivityPub::NoteSerializer do end it 'includes public self-replies in its replies collection' do - expect(subject['replies']['first']['items']).to include(reply1.uri, reply2.uri, reply4.uri) + expect(subject['replies']['first']['items']).to include(reply_by_account_first.uri, reply_by_account_next.uri, reply_by_account_third.uri) end it 'does not include replies from others in its replies collection' do - expect(subject['replies']['first']['items']).to_not include(reply3.uri) + expect(subject['replies']['first']['items']).to_not include(reply_by_other_first.uri) end it 'does not include replies with direct visibility in its replies collection' do - expect(subject['replies']['first']['items']).to_not include(reply5.uri) + expect(subject['replies']['first']['items']).to_not include(reply_by_account_visibility_direct.uri) end end diff --git a/spec/services/activitypub/fetch_featured_collection_service_spec.rb b/spec/services/activitypub/fetch_featured_collection_service_spec.rb index 0af0f4c075..5975c81a10 100644 --- a/spec/services/activitypub/fetch_featured_collection_service_spec.rb +++ b/spec/services/activitypub/fetch_featured_collection_service_spec.rb @@ -9,33 +9,33 @@ RSpec.describe ActivityPub::FetchFeaturedCollectionService, type: :service do let!(:known_status) { Fabricate(:status, account: actor, uri: 'https://example.com/account/pinned/1') } - let(:status_json_1) do + let(:status_json_pinned_known) do { '@context': 'https://www.w3.org/ns/activitystreams', type: 'Note', - id: 'https://example.com/account/pinned/1', + id: 'https://example.com/account/pinned/known', content: 'foo', attributedTo: actor.uri, to: 'https://www.w3.org/ns/activitystreams#Public', } end - let(:status_json_2) do + let(:status_json_pinned_unknown_inlined) do { '@context': 'https://www.w3.org/ns/activitystreams', type: 'Note', - id: 'https://example.com/account/pinned/2', + id: 'https://example.com/account/pinned/unknown-inlined', content: 'foo', attributedTo: actor.uri, to: 'https://www.w3.org/ns/activitystreams#Public', } end - let(:status_json_4) do + let(:status_json_pinned_unknown_unreachable) do { '@context': 'https://www.w3.org/ns/activitystreams', type: 'Note', - id: 'https://example.com/account/pinned/4', + id: 'https://example.com/account/pinned/unknown-reachable', content: 'foo', attributedTo: actor.uri, to: 'https://www.w3.org/ns/activitystreams#Public', @@ -44,10 +44,10 @@ RSpec.describe ActivityPub::FetchFeaturedCollectionService, type: :service do let(:items) do [ - 'https://example.com/account/pinned/1', # known - status_json_2, # unknown inlined - 'https://example.com/account/pinned/3', # unknown unreachable - 'https://example.com/account/pinned/4', # unknown reachable + 'https://example.com/account/pinned/known', # known + status_json_pinned_unknown_inlined, # unknown inlined + 'https://example.com/account/pinned/unknown-unreachable', # unknown unreachable + 'https://example.com/account/pinned/unknown-reachable', # unknown reachable ] end @@ -62,16 +62,20 @@ RSpec.describe ActivityPub::FetchFeaturedCollectionService, type: :service do shared_examples 'sets pinned posts' do before do - stub_request(:get, 'https://example.com/account/pinned/1').to_return(status: 200, body: Oj.dump(status_json_1)) - stub_request(:get, 'https://example.com/account/pinned/2').to_return(status: 200, body: Oj.dump(status_json_2)) - stub_request(:get, 'https://example.com/account/pinned/3').to_return(status: 404) - stub_request(:get, 'https://example.com/account/pinned/4').to_return(status: 200, body: Oj.dump(status_json_4)) + stub_request(:get, 'https://example.com/account/pinned/known').to_return(status: 200, body: Oj.dump(status_json_pinned_known)) + stub_request(:get, 'https://example.com/account/pinned/unknown-inlined').to_return(status: 200, body: Oj.dump(status_json_pinned_unknown_inlined)) + stub_request(:get, 'https://example.com/account/pinned/unknown-unreachable').to_return(status: 404) + stub_request(:get, 'https://example.com/account/pinned/unknown-reachable').to_return(status: 200, body: Oj.dump(status_json_pinned_unknown_unreachable)) subject.call(actor, note: true, hashtag: false) end it 'sets expected posts as pinned posts' do - expect(actor.pinned_statuses.pluck(:uri)).to contain_exactly('https://example.com/account/pinned/1', 'https://example.com/account/pinned/2', 'https://example.com/account/pinned/4') + expect(actor.pinned_statuses.pluck(:uri)).to contain_exactly( + 'https://example.com/account/pinned/known', + 'https://example.com/account/pinned/unknown-inlined', + 'https://example.com/account/pinned/unknown-reachable' + ) end end diff --git a/spec/services/batched_remove_status_service_spec.rb b/spec/services/batched_remove_status_service_spec.rb index c0cd01315f..1363c81d05 100644 --- a/spec/services/batched_remove_status_service_spec.rb +++ b/spec/services/batched_remove_status_service_spec.rb @@ -10,8 +10,8 @@ RSpec.describe BatchedRemoveStatusService, type: :service do let!(:jeff) { Fabricate(:account) } let!(:hank) { Fabricate(:account, username: 'hank', protocol: :activitypub, domain: 'example.com', inbox_url: 'http://example.com/inbox') } - let(:status1) { PostStatusService.new.call(alice, text: 'Hello @bob@example.com') } - let(:status2) { PostStatusService.new.call(alice, text: 'Another status') } + let(:status_alice_hello) { PostStatusService.new.call(alice, text: 'Hello @bob@example.com') } + let(:status_alice_other) { PostStatusService.new.call(alice, text: 'Another status') } before do allow(redis).to receive_messages(publish: nil) @@ -22,23 +22,23 @@ RSpec.describe BatchedRemoveStatusService, type: :service do jeff.follow!(alice) hank.follow!(alice) - status1 - status2 + status_alice_hello + status_alice_other - subject.call([status1, status2]) + subject.call([status_alice_hello, status_alice_other]) end it 'removes statuses' do - expect { Status.find(status1.id) }.to raise_error ActiveRecord::RecordNotFound - expect { Status.find(status2.id) }.to raise_error ActiveRecord::RecordNotFound + expect { Status.find(status_alice_hello.id) }.to raise_error ActiveRecord::RecordNotFound + expect { Status.find(status_alice_other.id) }.to raise_error ActiveRecord::RecordNotFound end it 'removes statuses from author\'s home feed' do - expect(HomeFeed.new(alice).get(10)).to_not include([status1.id, status2.id]) + expect(HomeFeed.new(alice).get(10)).to_not include([status_alice_hello.id, status_alice_other.id]) end it 'removes statuses from local follower\'s home feed' do - expect(HomeFeed.new(jeff).get(10)).to_not include([status1.id, status2.id]) + expect(HomeFeed.new(jeff).get(10)).to_not include([status_alice_hello.id, status_alice_other.id]) end it 'notifies streaming API of followers' do diff --git a/spec/services/block_domain_service_spec.rb b/spec/services/block_domain_service_spec.rb index 93722a15bc..36dce9d196 100644 --- a/spec/services/block_domain_service_spec.rb +++ b/spec/services/block_domain_service_spec.rb @@ -6,9 +6,9 @@ RSpec.describe BlockDomainService, type: :service do subject { described_class.new } let!(:bad_account) { Fabricate(:account, username: 'badguy666', domain: 'evil.org') } - let!(:bad_status1) { Fabricate(:status, account: bad_account, text: 'You suck') } - let!(:bad_status2) { Fabricate(:status, account: bad_account, text: 'Hahaha') } - let!(:bad_attachment) { Fabricate(:media_attachment, account: bad_account, status: bad_status2, file: attachment_fixture('attachment.jpg')) } + let!(:bad_status_plain) { Fabricate(:status, account: bad_account, text: 'You suck') } + let!(:bad_status_with_attachment) { Fabricate(:status, account: bad_account, text: 'Hahaha') } + let!(:bad_attachment) { Fabricate(:media_attachment, account: bad_account, status: bad_status_with_attachment, file: attachment_fixture('attachment.jpg')) } let!(:already_banned_account) { Fabricate(:account, username: 'badguy', domain: 'evil.org', suspended: true, silenced: true) } describe 'for a suspension' do @@ -37,8 +37,8 @@ RSpec.describe BlockDomainService, type: :service do end it 'removes the remote accounts\'s statuses and media attachments' do - expect { bad_status1.reload }.to raise_exception ActiveRecord::RecordNotFound - expect { bad_status2.reload }.to raise_exception ActiveRecord::RecordNotFound + expect { bad_status_plain.reload }.to raise_exception ActiveRecord::RecordNotFound + expect { bad_status_with_attachment.reload }.to raise_exception ActiveRecord::RecordNotFound expect { bad_attachment.reload }.to raise_exception ActiveRecord::RecordNotFound end end @@ -69,8 +69,8 @@ RSpec.describe BlockDomainService, type: :service do end it 'leaves the domains status and attachments, but clears media' do - expect { bad_status1.reload }.to_not raise_error - expect { bad_status2.reload }.to_not raise_error + expect { bad_status_plain.reload }.to_not raise_error + expect { bad_status_with_attachment.reload }.to_not raise_error expect { bad_attachment.reload }.to_not raise_error expect(bad_attachment.file.exists?).to be false end diff --git a/spec/services/clear_domain_media_service_spec.rb b/spec/services/clear_domain_media_service_spec.rb index 2a00409a41..9766e62de8 100644 --- a/spec/services/clear_domain_media_service_spec.rb +++ b/spec/services/clear_domain_media_service_spec.rb @@ -6,9 +6,9 @@ RSpec.describe ClearDomainMediaService, type: :service do subject { described_class.new } let!(:bad_account) { Fabricate(:account, username: 'badguy666', domain: 'evil.org') } - let!(:bad_status1) { Fabricate(:status, account: bad_account, text: 'You suck') } - let!(:bad_status2) { Fabricate(:status, account: bad_account, text: 'Hahaha') } - let!(:bad_attachment) { Fabricate(:media_attachment, account: bad_account, status: bad_status2, file: attachment_fixture('attachment.jpg')) } + let!(:bad_status_plain) { Fabricate(:status, account: bad_account, text: 'You suck') } + let!(:bad_status_with_attachment) { Fabricate(:status, account: bad_account, text: 'Hahaha') } + let!(:bad_attachment) { Fabricate(:media_attachment, account: bad_account, status: bad_status_with_attachment, file: attachment_fixture('attachment.jpg')) } describe 'for a silence with reject media' do before do @@ -16,8 +16,8 @@ RSpec.describe ClearDomainMediaService, type: :service do end it 'leaves the domains status and attachments, but clears media' do - expect { bad_status1.reload }.to_not raise_error - expect { bad_status2.reload }.to_not raise_error + expect { bad_status_plain.reload }.to_not raise_error + expect { bad_status_with_attachment.reload }.to_not raise_error expect { bad_attachment.reload }.to_not raise_error expect(bad_attachment.file.exists?).to be false end diff --git a/spec/services/purge_domain_service_spec.rb b/spec/services/purge_domain_service_spec.rb index 89ab4d8d9f..e96618310b 100644 --- a/spec/services/purge_domain_service_spec.rb +++ b/spec/services/purge_domain_service_spec.rb @@ -6,9 +6,9 @@ RSpec.describe PurgeDomainService, type: :service do subject { described_class.new } let!(:old_account) { Fabricate(:account, domain: 'obsolete.org') } - let!(:old_status1) { Fabricate(:status, account: old_account) } - let!(:old_status2) { Fabricate(:status, account: old_account) } - let!(:old_attachment) { Fabricate(:media_attachment, account: old_account, status: old_status2, file: attachment_fixture('attachment.jpg')) } + let!(:old_status_plain) { Fabricate(:status, account: old_account) } + let!(:old_status_with_attachment) { Fabricate(:status, account: old_account) } + let!(:old_attachment) { Fabricate(:media_attachment, account: old_account, status: old_status_with_attachment, file: attachment_fixture('attachment.jpg')) } describe 'for a suspension' do before do @@ -17,8 +17,8 @@ RSpec.describe PurgeDomainService, type: :service do it 'removes the remote accounts\'s statuses and media attachments' do expect { old_account.reload }.to raise_exception ActiveRecord::RecordNotFound - expect { old_status1.reload }.to raise_exception ActiveRecord::RecordNotFound - expect { old_status2.reload }.to raise_exception ActiveRecord::RecordNotFound + expect { old_status_plain.reload }.to raise_exception ActiveRecord::RecordNotFound + expect { old_status_with_attachment.reload }.to raise_exception ActiveRecord::RecordNotFound expect { old_attachment.reload }.to raise_exception ActiveRecord::RecordNotFound end diff --git a/spec/services/unallow_domain_service_spec.rb b/spec/services/unallow_domain_service_spec.rb index 4db718d074..e583a22de3 100644 --- a/spec/services/unallow_domain_service_spec.rb +++ b/spec/services/unallow_domain_service_spec.rb @@ -6,9 +6,9 @@ RSpec.describe UnallowDomainService, type: :service do subject { described_class.new } let!(:bad_account) { Fabricate(:account, username: 'badguy666', domain: 'evil.org') } - let!(:bad_status1) { Fabricate(:status, account: bad_account, text: 'You suck') } - let!(:bad_status2) { Fabricate(:status, account: bad_account, text: 'Hahaha') } - let!(:bad_attachment) { Fabricate(:media_attachment, account: bad_account, status: bad_status2, file: attachment_fixture('attachment.jpg')) } + let!(:bad_status_harassment) { Fabricate(:status, account: bad_account, text: 'You suck') } + let!(:bad_status_mean) { Fabricate(:status, account: bad_account, text: 'Hahaha') } + let!(:bad_attachment) { Fabricate(:media_attachment, account: bad_account, status: bad_status_mean, file: attachment_fixture('attachment.jpg')) } let!(:already_banned_account) { Fabricate(:account, username: 'badguy', domain: 'evil.org', suspended: true, silenced: true) } let!(:domain_allow) { Fabricate(:domain_allow, domain: 'evil.org') } @@ -31,8 +31,8 @@ RSpec.describe UnallowDomainService, type: :service do end it 'removes the remote accounts\'s statuses and media attachments' do - expect { bad_status1.reload }.to raise_exception ActiveRecord::RecordNotFound - expect { bad_status2.reload }.to raise_exception ActiveRecord::RecordNotFound + expect { bad_status_harassment.reload }.to raise_exception ActiveRecord::RecordNotFound + expect { bad_status_mean.reload }.to raise_exception ActiveRecord::RecordNotFound expect { bad_attachment.reload }.to raise_exception ActiveRecord::RecordNotFound end end @@ -57,8 +57,8 @@ RSpec.describe UnallowDomainService, type: :service do end it 'removes the remote accounts\'s statuses and media attachments' do - expect { bad_status1.reload }.to_not raise_error - expect { bad_status2.reload }.to_not raise_error + expect { bad_status_harassment.reload }.to_not raise_error + expect { bad_status_mean.reload }.to_not raise_error expect { bad_attachment.reload }.to_not raise_error end end diff --git a/spec/workers/scheduler/accounts_statuses_cleanup_scheduler_spec.rb b/spec/workers/scheduler/accounts_statuses_cleanup_scheduler_spec.rb index 62c353bfe1..5565636d57 100644 --- a/spec/workers/scheduler/accounts_statuses_cleanup_scheduler_spec.rb +++ b/spec/workers/scheduler/accounts_statuses_cleanup_scheduler_spec.rb @@ -5,12 +5,12 @@ require 'rails_helper' describe Scheduler::AccountsStatusesCleanupScheduler do subject { described_class.new } - let!(:account1) { Fabricate(:account, domain: nil) } - let!(:account2) { Fabricate(:account, domain: nil) } - let!(:account3) { Fabricate(:account, domain: nil) } - let!(:account4) { Fabricate(:account, domain: nil) } - let!(:account5) { Fabricate(:account, domain: nil) } - let!(:remote) { Fabricate(:account) } + let!(:account_alice) { Fabricate(:account, domain: nil, username: 'alice') } + let!(:account_bob) { Fabricate(:account, domain: nil, username: 'bob') } + let!(:account_chris) { Fabricate(:account, domain: nil, username: 'chris') } + let!(:account_dave) { Fabricate(:account, domain: nil, username: 'dave') } + let!(:account_erin) { Fabricate(:account, domain: nil, username: 'erin') } + let!(:remote) { Fabricate(:account) } let(:queue_size) { 0 } let(:queue_latency) { 0 } @@ -77,26 +77,26 @@ describe Scheduler::AccountsStatusesCleanupScheduler do describe '#perform' do before do # Policies for the accounts - Fabricate(:account_statuses_cleanup_policy, account: account1) - Fabricate(:account_statuses_cleanup_policy, account: account3) - Fabricate(:account_statuses_cleanup_policy, account: account4, enabled: false) - Fabricate(:account_statuses_cleanup_policy, account: account5) + Fabricate(:account_statuses_cleanup_policy, account: account_alice) + Fabricate(:account_statuses_cleanup_policy, account: account_chris) + Fabricate(:account_statuses_cleanup_policy, account: account_dave, enabled: false) + Fabricate(:account_statuses_cleanup_policy, account: account_erin) # Create a bunch of old statuses 4.times do - Fabricate(:status, account: account1, created_at: 3.years.ago) - Fabricate(:status, account: account2, created_at: 3.years.ago) - Fabricate(:status, account: account3, created_at: 3.years.ago) - Fabricate(:status, account: account4, created_at: 3.years.ago) - Fabricate(:status, account: account5, created_at: 3.years.ago) + Fabricate(:status, account: account_alice, created_at: 3.years.ago) + Fabricate(:status, account: account_bob, created_at: 3.years.ago) + Fabricate(:status, account: account_chris, created_at: 3.years.ago) + Fabricate(:status, account: account_dave, created_at: 3.years.ago) + Fabricate(:status, account: account_erin, created_at: 3.years.ago) Fabricate(:status, account: remote, created_at: 3.years.ago) end # Create a bunch of newer statuses - Fabricate(:status, account: account1, created_at: 3.minutes.ago) - Fabricate(:status, account: account2, created_at: 3.minutes.ago) - Fabricate(:status, account: account3, created_at: 3.minutes.ago) - Fabricate(:status, account: account4, created_at: 3.minutes.ago) + Fabricate(:status, account: account_alice, created_at: 3.minutes.ago) + Fabricate(:status, account: account_bob, created_at: 3.minutes.ago) + Fabricate(:status, account: account_chris, created_at: 3.minutes.ago) + Fabricate(:status, account: account_dave, created_at: 3.minutes.ago) Fabricate(:status, account: remote, created_at: 3.minutes.ago) end @@ -106,8 +106,8 @@ describe Scheduler::AccountsStatusesCleanupScheduler do expect { subject.perform } .to change(Status, :count).by(-subject.compute_budget) # Cleanable statuses - .and (not_change { account2.statuses.count }) # No cleanup policy for account - .and(not_change { account4.statuses.count }) # Disabled cleanup policy + .and (not_change { account_bob.statuses.count }) # No cleanup policy for account + .and(not_change { account_dave.statuses.count }) # Disabled cleanup policy end it 'eventually deletes every deletable toot given enough runs' do @@ -122,9 +122,9 @@ describe Scheduler::AccountsStatusesCleanupScheduler do expect { 3.times { subject.perform } } .to change(Status, :count).by(-3 * 3) - .and change { account1.statuses.count } - .and change { account3.statuses.count } - .and(change { account5.statuses.count }) + .and change { account_alice.statuses.count } + .and change { account_chris.statuses.count } + .and(change { account_erin.statuses.count }) end context 'when given a big budget' do @@ -156,7 +156,7 @@ describe Scheduler::AccountsStatusesCleanupScheduler do def cleanable_statuses_count Status - .where(account_id: [account1, account3, account5]) # Accounts with enabled policies + .where(account_id: [account_alice, account_chris, account_erin]) # Accounts with enabled policies .where('created_at < ?', 2.weeks.ago) # Policy defaults is 2.weeks .count end From 841e35e291eb9dd8695f6e210727417bc26ae395 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 14 Jun 2023 18:12:33 +0200 Subject: [PATCH 040/118] Update devDependencies (non-major) (#25427) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 395 +++++++++++++++++++++++++++++------------------------- 1 file changed, 212 insertions(+), 183 deletions(-) diff --git a/yarn.lock b/yarn.lock index 56fcd0de06..016ed515b1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -24,20 +24,20 @@ jsonpointer "^5.0.0" leven "^3.1.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.21.4.tgz#d0fa9e4413aca81f2b23b9442797bda1826edb39" - integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g== - dependencies: - "@babel/highlight" "^7.18.6" - -"@babel/code-frame@^7.18.6", "@babel/code-frame@^7.21.4", "@babel/code-frame@^7.22.5": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.21.4", "@babel/code-frame@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.5.tgz#234d98e1551960604f1246e6475891a570ad5658" integrity sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ== dependencies: "@babel/highlight" "^7.22.5" +"@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.21.4.tgz#d0fa9e4413aca81f2b23b9442797bda1826edb39" + integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g== + dependencies: + "@babel/highlight" "^7.18.6" + "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.5.tgz#b1f6c86a02d85d2dd3368a2b67c09add8cd0c255" @@ -1191,20 +1191,20 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@csstools/css-parser-algorithms@^2.1.1": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.1.1.tgz#7b62e6412a468a2d1096ed267edd1e4a7fd4a119" - integrity sha512-viRnRh02AgO4mwIQb2xQNJju0i+Fh9roNgmbR5xEuG7J3TGgxjnE95HnBLgsFJOJOksvcfxOUCgODcft6Y07cA== +"@csstools/css-parser-algorithms@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.2.0.tgz#1268b07196d1118296443aeff41bca27d94b0981" + integrity sha512-9BoQ/jSrPq4vv3b9jjLW+PNNv56KlDH5JMx5yASSNrCtvq70FCNZUjXRvbCeR9hYj9ZyhURtqpU/RFIgg6kiOw== "@csstools/css-tokenizer@^2.1.1": version "2.1.1" resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-2.1.1.tgz#07ae11a0a06365d7ec686549db7b729bc036528e" integrity sha512-GbrTj2Z8MCTUv+52GE0RbFGM527xuXZ0Xa5g0Z+YN573uveS4G0qi6WNOMyz3yrFM/jaILTTwJ0+umx81EzqfA== -"@csstools/media-query-list-parser@^2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@csstools/media-query-list-parser/-/media-query-list-parser-2.0.4.tgz#466bd254041530dfd1e88bcb1921e8ca4af75b6a" - integrity sha512-GyYot6jHgcSDZZ+tLSnrzkR7aJhF2ZW6d+CXH66mjy5WpAQhZD4HDke2OQ36SivGRWlZJpAz7TzbW6OKlEpxAA== +"@csstools/media-query-list-parser@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.0.tgz#6e1a5e12e0d103cd13b94bddb88b878bd6866103" + integrity sha512-MXkR+TeaS2q9IkpyO6jVCdtA/bfpABJxIrfkLswThFN8EZZgI2RfAHhm6sDNDuYV25d5+b8Lj1fpTccIcSLPsQ== "@csstools/selector-specificity@^2.2.0": version "2.2.0" @@ -1309,16 +1309,16 @@ jsdoc-type-pratt-parser "~4.0.0" "@eslint-community/eslint-utils@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.2.0.tgz#a831e6e468b4b2b5ae42bf658bea015bf10bc518" - integrity sha512-gB8T4H4DEfX2IV9zGDJPOBgP1e/DbfCPDTtEqUMckpvzS1OYtva8JdFYBqMwYk7xAQ429WGF/UPqn8uQ//h2vQ== + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== dependencies: eslint-visitor-keys "^3.3.0" "@eslint-community/regexpp@^4.4.0": - version "4.4.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.4.0.tgz#3e61c564fcd6b921cb789838631c5ee44df09403" - integrity sha512-A9983Q0LnDGdLPjxyXQ00sbV+K+O+ko2Dr+CZigbHWtX9pNfxlaBkMR8X1CztI73zuEyEBXTVjx7CE+/VSwDiQ== + version "4.5.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.5.1.tgz#cdd35dce4fa1a89a4fd42b1599eb35b3af408884" + integrity sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ== "@eslint/eslintrc@^2.0.3": version "2.0.3" @@ -1335,10 +1335,10 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.41.0": - version "8.41.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.41.0.tgz#080321c3b68253522f7646b55b577dd99d2950b3" - integrity sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA== +"@eslint/js@8.42.0": + version "8.42.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.42.0.tgz#484a1d638de2911e6f5a30c12f49c7e4a3270fb6" + integrity sha512-6SWlXpWU5AvId8Ac7zjzmIOqMOba/JWY8XZ4A7q7Gn1Vlfg/SFFIlrtHXt9nPn4op9ZPAkl91Jao+QQv3r/ukw== "@floating-ui/core@^1.0.1": version "1.0.1" @@ -1353,9 +1353,9 @@ "@floating-ui/core" "^1.0.1" "@formatjs/cli@^6.1.1": - version "6.1.1" - resolved "https://registry.yarnpkg.com/@formatjs/cli/-/cli-6.1.1.tgz#089d6d25fe96490f8d1401a53705b3cdfefd7afb" - integrity sha512-prUblUQRJwFQqfmBtRWXZFKX+QmhXQkBKRl54hWTCwenskorK6+LTlm9TFbUDhfib2Xt3iDsjk7o9LpeU/AQCw== + version "6.1.3" + resolved "https://registry.yarnpkg.com/@formatjs/cli/-/cli-6.1.3.tgz#b4b95259398e222ec6c06cf5f23f76d987f53e96" + integrity sha512-PdTXZTY8LqxwmvFqdifn89gjXnPUpGtGyFs0BnoeLuOuxZFSnBfIs5WQCVMaJnr1+0vNNlXyT0VAIAwjRpf6BA== "@formatjs/ecma402-abstract@1.15.0": version "1.15.0" @@ -1475,19 +1475,6 @@ intl-messageformat "10.5.0" tslib "^2.4.0" -"@formatjs/ts-transformer@3.13.1": - version "3.13.1" - resolved "https://registry.yarnpkg.com/@formatjs/ts-transformer/-/ts-transformer-3.13.1.tgz#37aa4992aa50740f808f1f888f112b8addb617c7" - integrity sha512-U5BuLqFx5wre5Q0NrZhBh7itMJZISYuZGoj8HdN/UO1EKaTL2HQjE1G040GjTpY0k+AAyaHK3b8WPqgHLvIaIQ== - dependencies: - "@formatjs/icu-messageformat-parser" "2.4.0" - "@types/json-stable-stringify" "^1.0.32" - "@types/node" "14 || 16 || 17" - chalk "^4.0.0" - json-stable-stringify "^1.0.1" - tslib "^2.4.0" - typescript "^4.7 || 5" - "@formatjs/ts-transformer@3.13.3": version "3.13.3" resolved "https://registry.yarnpkg.com/@formatjs/ts-transformer/-/ts-transformer-3.13.3.tgz#249f5b5df70c51e651280732536d5504078297ff" @@ -1511,10 +1498,10 @@ resolved "https://registry.yarnpkg.com/@github/webauthn-json/-/webauthn-json-2.1.1.tgz#648e63fc28050917d2882cc2b27817a88cb420fc" integrity sha512-XrftRn4z75SnaJOmZQbt7Mk+IIjqVHw+glDGOxuHwXkZBZh/MBoRS7MHjSZMDaLhT4RjN2VqiEU7EOYleuJWSQ== -"@humanwhocodes/config-array@^0.11.8": - version "0.11.8" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.8.tgz#03595ac2075a4dc0f191cc2131de14fbd7d410b9" - integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g== +"@humanwhocodes/config-array@^0.11.10": + version "0.11.10" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.10.tgz#5a3ffe32cc9306365fb3fd572596cd602d5e12d2" + integrity sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ== dependencies: "@humanwhocodes/object-schema" "^1.2.1" debug "^4.1.1" @@ -2135,9 +2122,9 @@ integrity sha512-gaBLT8pdcexFztLSPRtriHeXY/Kn4907uOCZ4Q3lncFBkheAWOuNt53ypsF8szgxbEJ513UeBzcf4utN0EzEwA== "@types/eslint@7 || 8": - version "8.37.0" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.37.0.tgz#29cebc6c2a3ac7fea7113207bf5a828fdf4d7ef1" - integrity sha512-Piet7dG2JBuDIfohBngQ3rCt7MgO9xCO4xIMKxBThCq5PNRB91IjlJ10eJVwfoNtvTErmxLzwBZ7rHZtbOMmFQ== + version "8.40.2" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.40.2.tgz#2833bc112d809677864a4b0e7d1de4f04d7dac2d" + integrity sha512-PRVjQ4Eh9z9pmmtaq8nTjZjQwKFk7YIHIud3lRoKRBgUQjgjRmoGxxGEPXQkF+lH7QkHJRNr5F4aBgYCW0lqpQ== dependencies: "@types/estree" "*" "@types/json-schema" "*" @@ -2258,21 +2245,16 @@ "@types/tough-cookie" "*" parse5 "^7.0.0" -"@types/json-schema@*", "@types/json-schema@^7.0.9": - version "7.0.11" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" - integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== +"@types/json-schema@*", "@types/json-schema@^7.0.6", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.12" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" + integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== "@types/json-schema@^7.0.5": version "7.0.6" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.6.tgz#f4c7ec43e81b319a9815115031709f26987891f0" integrity sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw== -"@types/json-schema@^7.0.6", "@types/json-schema@^7.0.8": - version "7.0.12" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" - integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== - "@types/json-stable-stringify@^1.0.32": version "1.0.34" resolved "https://registry.yarnpkg.com/@types/json-stable-stringify/-/json-stable-stringify-1.0.34.tgz#c0fb25e4d957e0ee2e497c1f553d7f8bb668fd75" @@ -2518,9 +2500,9 @@ integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== "@types/semver@^7.3.12": - version "7.3.13" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91" - integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw== + version "7.5.0" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.0.tgz#591c1ce3a702c45ee15f47a42ade72c2fd78978a" + integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw== "@types/serve-static@*": version "1.15.1" @@ -2625,14 +2607,14 @@ "@types/yargs-parser" "*" "@typescript-eslint/eslint-plugin@^5.59.8": - version "5.59.8" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.8.tgz#1e7a3e5318ece22251dfbc5c9c6feeb4793cc509" - integrity sha512-JDMOmhXteJ4WVKOiHXGCoB96ADWg9q7efPWHRViT/f09bA8XOMLAVHHju3l0MkZnG1izaWXYmgvQcUjTRcpShQ== + version "5.59.11" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.11.tgz#8d466aa21abea4c3f37129997b198d141f09e76f" + integrity sha512-XxuOfTkCUiOSyBWIvHlUraLw/JT/6Io1365RO6ZuI88STKMavJZPNMU0lFcUTeQXEhHiv64CbxYxBNoDVSmghg== dependencies: "@eslint-community/regexpp" "^4.4.0" - "@typescript-eslint/scope-manager" "5.59.8" - "@typescript-eslint/type-utils" "5.59.8" - "@typescript-eslint/utils" "5.59.8" + "@typescript-eslint/scope-manager" "5.59.11" + "@typescript-eslint/type-utils" "5.59.11" + "@typescript-eslint/utils" "5.59.11" debug "^4.3.4" grapheme-splitter "^1.0.4" ignore "^5.2.0" @@ -2641,30 +2623,30 @@ tsutils "^3.21.0" "@typescript-eslint/parser@^5.59.8": - version "5.59.8" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.59.8.tgz#60cbb00671d86cf746044ab797900b1448188567" - integrity sha512-AnR19RjJcpjoeGojmwZtCwBX/RidqDZtzcbG3xHrmz0aHHoOcbWnpDllenRDmDvsV0RQ6+tbb09/kyc+UT9Orw== + version "5.59.11" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.59.11.tgz#af7d4b7110e3068ce0b97550736de455e4250103" + integrity sha512-s9ZF3M+Nym6CAZEkJJeO2TFHHDsKAM3ecNkLuH4i4s8/RCPnF5JRip2GyviYkeEAcwGMJxkqG9h2dAsnA1nZpA== dependencies: - "@typescript-eslint/scope-manager" "5.59.8" - "@typescript-eslint/types" "5.59.8" - "@typescript-eslint/typescript-estree" "5.59.8" + "@typescript-eslint/scope-manager" "5.59.11" + "@typescript-eslint/types" "5.59.11" + "@typescript-eslint/typescript-estree" "5.59.11" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.59.8": - version "5.59.8" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.59.8.tgz#ff4ad4fec6433647b817c4a7d4b4165d18ea2fa8" - integrity sha512-/w08ndCYI8gxGf+9zKf1vtx/16y8MHrZs5/tnjHhMLNSixuNcJavSX4wAiPf4aS5x41Es9YPCn44MIe4cxIlig== +"@typescript-eslint/scope-manager@5.59.11": + version "5.59.11" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.59.11.tgz#5d131a67a19189c42598af9fb2ea1165252001ce" + integrity sha512-dHFOsxoLFtrIcSj5h0QoBT/89hxQONwmn3FOQ0GOQcLOOXm+MIrS8zEAhs4tWl5MraxCY3ZJpaXQQdFMc2Tu+Q== dependencies: - "@typescript-eslint/types" "5.59.8" - "@typescript-eslint/visitor-keys" "5.59.8" + "@typescript-eslint/types" "5.59.11" + "@typescript-eslint/visitor-keys" "5.59.11" -"@typescript-eslint/type-utils@5.59.8": - version "5.59.8" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.59.8.tgz#aa6c029a9d7706d26bbd25eb4666398781df6ea2" - integrity sha512-+5M518uEIHFBy3FnyqZUF3BMP+AXnYn4oyH8RF012+e7/msMY98FhGL5SrN29NQ9xDgvqCgYnsOiKp1VjZ/fpA== +"@typescript-eslint/type-utils@5.59.11": + version "5.59.11" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.59.11.tgz#5eb67121808a84cb57d65a15f48f5bdda25f2346" + integrity sha512-LZqVY8hMiVRF2a7/swmkStMYSoXMFlzL6sXV6U/2gL5cwnLWQgLEG8tjWPpaE4rMIdZ6VKWwcffPlo1jPfk43g== dependencies: - "@typescript-eslint/typescript-estree" "5.59.8" - "@typescript-eslint/utils" "5.59.8" + "@typescript-eslint/typescript-estree" "5.59.11" + "@typescript-eslint/utils" "5.59.11" debug "^4.3.4" tsutils "^3.21.0" @@ -2673,10 +2655,10 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.59.0.tgz#3fcdac7dbf923ec5251545acdd9f1d42d7c4fe32" integrity sha512-yR2h1NotF23xFFYKHZs17QJnB51J/s+ud4PYU4MqdZbzeNxpgUr05+dNeCN/bb6raslHvGdd6BFCkVhpPk/ZeA== -"@typescript-eslint/types@5.59.8": - version "5.59.8" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.59.8.tgz#212e54414733618f5d0fd50b2da2717f630aebf8" - integrity sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w== +"@typescript-eslint/types@5.59.11": + version "5.59.11" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.59.11.tgz#1a9018fe3c565ba6969561f2a49f330cf1fe8db1" + integrity sha512-epoN6R6tkvBYSc+cllrz+c2sOFWkbisJZWkOE+y3xHtvYaOE6Wk6B8e114McRJwFRjGvYdJwLXQH5c9osME/AA== "@typescript-eslint/typescript-estree@5.59.0": version "5.59.0" @@ -2691,30 +2673,30 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/typescript-estree@5.59.8": - version "5.59.8" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz#801a7b1766481629481b3b0878148bd7a1f345d7" - integrity sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg== +"@typescript-eslint/typescript-estree@5.59.11": + version "5.59.11" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.11.tgz#b2caaa31725e17c33970c1197bcd54e3c5f42b9f" + integrity sha512-YupOpot5hJO0maupJXixi6l5ETdrITxeo5eBOeuV7RSKgYdU3G5cxO49/9WRnJq9EMrB7AuTSLH/bqOsXi7wPA== dependencies: - "@typescript-eslint/types" "5.59.8" - "@typescript-eslint/visitor-keys" "5.59.8" + "@typescript-eslint/types" "5.59.11" + "@typescript-eslint/visitor-keys" "5.59.11" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/utils@5.59.8": - version "5.59.8" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.59.8.tgz#34d129f35a2134c67fdaf024941e8f96050dca2b" - integrity sha512-Tr65630KysnNn9f9G7ROF3w1b5/7f6QVCJ+WK9nhIocWmx9F+TmCAcglF26Vm7z8KCTwoKcNEBZrhlklla3CKg== +"@typescript-eslint/utils@5.59.11": + version "5.59.11" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.59.11.tgz#9dbff49dc80bfdd9289f9f33548f2e8db3c59ba1" + integrity sha512-didu2rHSOMUdJThLk4aZ1Or8IcO3HzCw/ZvEjTTIfjIrcdd5cvSIwwDy2AOlE7htSNp7QIZ10fLMyRCveesMLg== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@types/json-schema" "^7.0.9" "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.59.8" - "@typescript-eslint/types" "5.59.8" - "@typescript-eslint/typescript-estree" "5.59.8" + "@typescript-eslint/scope-manager" "5.59.11" + "@typescript-eslint/types" "5.59.11" + "@typescript-eslint/typescript-estree" "5.59.11" eslint-scope "^5.1.1" semver "^7.3.7" @@ -2726,12 +2708,12 @@ "@typescript-eslint/types" "5.59.0" eslint-visitor-keys "^3.3.0" -"@typescript-eslint/visitor-keys@5.59.8": - version "5.59.8" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz#aa6a7ef862add919401470c09e1609392ef3cc40" - integrity sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ== +"@typescript-eslint/visitor-keys@5.59.11": + version "5.59.11" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.11.tgz#dca561ddad169dc27d62396d64f45b2d2c3ecc56" + integrity sha512-KGYniTGG3AMTuKF9QBD7EIrvufkB6O6uX3knP73xbKLMpH+QRPcgnCxjWXSHjMRuOxFLovljqQgQpR0c7GvjoA== dependencies: - "@typescript-eslint/types" "5.59.8" + "@typescript-eslint/types" "5.59.11" eslint-visitor-keys "^3.3.0" "@webassemblyjs/ast@1.9.0": @@ -2977,7 +2959,17 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.4, ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.1, ajv@^8.6.0: +ajv@^8.0.1: + version "8.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ajv@^8.6.0: version "8.11.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== @@ -3787,7 +3779,7 @@ bufferutil@^4.0.7: dependencies: node-gyp-build "^4.3.0" -builtin-modules@^3.1.0: +builtin-modules@^3.1.0, builtin-modules@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== @@ -4246,7 +4238,7 @@ compression@^1.7.4: concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== connect-history-api-fallback@^1.6.0: version "1.6.0" @@ -4356,10 +4348,10 @@ cosmiconfig@^7.0.0: path-type "^4.0.0" yaml "^1.10.0" -cosmiconfig@^8.1.3: - version "8.1.3" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.1.3.tgz#0e614a118fcc2d9e5afc2f87d53cd09931015689" - integrity sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw== +cosmiconfig@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.2.0.tgz#f7d17c56a590856cd1e7cee98734dca272b0d8fd" + integrity sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ== dependencies: import-fresh "^3.2.1" js-yaml "^4.1.0" @@ -4648,9 +4640,9 @@ debug@^3.1.1, debug@^3.2.6, debug@^3.2.7: ms "^2.1.1" decamelize-keys@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" - integrity sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg== + version "1.1.1" + resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" + integrity sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg== dependencies: decamelize "^1.1.0" map-obj "^1.0.0" @@ -4658,7 +4650,7 @@ decamelize-keys@^1.1.0: decamelize@^1.1.0, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== decimal.js@^10.4.2, decimal.js@^10.4.3: version "10.4.3" @@ -4710,7 +4702,12 @@ deep-equal@^2.0.5: which-collection "^1.0.1" which-typed-array "^1.1.9" -deep-is@^0.1.3, deep-is@~0.1.3: +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= @@ -5267,12 +5264,12 @@ eslint-module-utils@^2.7.4: debug "^3.2.7" eslint-plugin-formatjs@^4.10.1: - version "4.10.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-formatjs/-/eslint-plugin-formatjs-4.10.1.tgz#c67184ac54188dcad84d6541e6b5467248ab6550" - integrity sha512-sD3GGdfDQqiaW8TgbUD4lrUR+raIgusPzW+0v+iN36QzkHvpg5L0UZGFQE9GWtgnWfXAndb57UpgB0i/CF2G7w== + version "4.10.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-formatjs/-/eslint-plugin-formatjs-4.10.3.tgz#65882730aebee3c8b6eec06381a4b0a18c0d33bd" + integrity sha512-EHKuEMCmWhAiMdCc8oZU8qBAvnvHPUiJuhGxPqA+GX2Nb7GBsGm2o616KYnSSffDisK+v0E9TDCrS8oJ0QLgcw== dependencies: - "@formatjs/icu-messageformat-parser" "2.4.0" - "@formatjs/ts-transformer" "3.13.1" + "@formatjs/icu-messageformat-parser" "2.6.0" + "@formatjs/ts-transformer" "3.13.3" "@types/eslint" "7 || 8" "@types/picomatch" "^2.3.0" "@typescript-eslint/typescript-estree" "5.59.0" @@ -5305,9 +5302,9 @@ eslint-plugin-import@~2.27.5: tsconfig-paths "^3.14.1" eslint-plugin-jsdoc@^46.1.0: - version "46.1.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-46.1.0.tgz#3ff932b70bc25f3745049f525a789faed7c948da" - integrity sha512-NpjpSuWR+Wwxzmssji7AVty1Vu0JvI7v+cTj+Rw1nKVjGv2eMvLGM/SI4VpgTXp82JbLtFOsA2QYLHT3YSmASA== + version "46.2.6" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-46.2.6.tgz#f25590d371859f20691d65b5dcd4cbe370d65564" + integrity sha512-zIaK3zbSrKuH12bP+SPybPgcHSM6MFzh3HFeaODzmsF1N8C1l8dzJ22cW1aq4g0+nayU1VMjmNf7hg0dpShLrA== dependencies: "@es-joy/jsdoccomment" "~0.39.4" are-docs-informative "^0.0.2" @@ -5315,6 +5312,7 @@ eslint-plugin-jsdoc@^46.1.0: debug "^4.3.4" escape-string-regexp "^4.0.0" esquery "^1.5.0" + is-builtin-module "^3.2.1" semver "^7.5.1" spdx-expression-parse "^3.0.1" @@ -5408,15 +5406,15 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== eslint@^8.41.0: - version "8.41.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.41.0.tgz#3062ca73363b4714b16dbc1e60f035e6134b6f1c" - integrity sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q== + version "8.42.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.42.0.tgz#7bebdc3a55f9ed7167251fe7259f75219cade291" + integrity sha512-ulg9Ms6E1WPf67PHaEY4/6E2tEn5/f7FXGzr3t9cBMugOmf1INYvuUwwh1aXQN4MfJ6a5K2iNwP3w4AColvI9A== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.4.0" "@eslint/eslintrc" "^2.0.3" - "@eslint/js" "8.41.0" - "@humanwhocodes/config-array" "^0.11.8" + "@eslint/js" "8.42.0" + "@humanwhocodes/config-array" "^0.11.10" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" ajv "^6.10.0" @@ -5855,9 +5853,9 @@ flat-cache@^3.0.4: rimraf "^3.0.2" flatted@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.0.tgz#a5d06b4a8b01e3a63771daa5cb7a1903e2e57067" - integrity sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA== + version "3.2.7" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" + integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== follow-redirects@^1.0.0, follow-redirects@^1.15.0: version "1.15.2" @@ -5940,7 +5938,7 @@ fs-minipass@^2.0.0: fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fsevents@^1.2.7: version "1.2.13" @@ -6091,7 +6089,7 @@ glob@^10.2.5, glob@^10.2.6: minipass "^5.0.0 || ^6.0.2" path-scurry "^1.7.0" -glob@^7.0.3, glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: +glob@^7.0.3, glob@^7.1.1, glob@^7.1.4, glob@^7.1.6: version "7.2.0" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== @@ -6103,6 +6101,18 @@ glob@^7.0.3, glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + global-modules@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" @@ -6600,7 +6610,7 @@ imports-loader@^1.2.0: imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== indent-string@^4.0.0: version "4.0.0" @@ -6615,7 +6625,7 @@ infer-owner@^1.0.4: inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" wrappy "1" @@ -6635,11 +6645,16 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= -ini@^1.3.4, ini@^1.3.5: +ini@^1.3.4: version "1.3.7" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.7.tgz#a09363e1911972ea16d7a8851005d84cf09a9a84" integrity sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ== +ini@^1.3.5: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + internal-ip@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" @@ -6762,7 +6777,7 @@ is-array-buffer@^3.0.1: is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== is-bigint@^1.0.1: version "1.0.2" @@ -6790,19 +6805,26 @@ is-boolean-object@^1.1.0: dependencies: call-bind "^1.0.2" +is-builtin-module@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.2.1.tgz#f03271717d8654cfcaf07ab0463faa3571581169" + integrity sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A== + dependencies: + builtin-modules "^3.3.0" + is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-core-module@^2.11.0, is-core-module@^2.5.0: +is-core-module@^2.11.0: version "2.11.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== dependencies: has "^1.0.3" -is-core-module@^2.9.0: +is-core-module@^2.5.0, is-core-module@^2.9.0: version "2.12.1" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== @@ -7733,7 +7755,7 @@ json-schema@^0.4.0: json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== json-stable-stringify@^1.0.1: version "1.0.2" @@ -7855,9 +7877,9 @@ lilconfig@2.1.0, lilconfig@^2.1.0: integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== lines-and-columns@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" - integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== lint-staged@^13.2.2: version "13.2.2" @@ -7992,7 +8014,7 @@ lodash.sortby@^4.7.0: lodash.truncate@^4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" - integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= + integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== lodash.uniq@^4.5.0: version "4.5.0" @@ -8289,7 +8311,7 @@ minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= -minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.2: +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -8463,7 +8485,7 @@ natural-compare-lite@^1.4.0: natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== negotiator@0.6.3: version "0.6.3" @@ -8735,7 +8757,7 @@ on-headers@~1.0.2: once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" @@ -8968,7 +8990,7 @@ path-exists@^4.0.0: path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-is-inside@^1.0.2: version "1.0.2" @@ -9412,7 +9434,7 @@ postcss-scss@^4.0.6: resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-4.0.6.tgz#5d62a574b950a6ae12f2aa89b60d63d9e4432bfd" integrity sha512-rLDPhJY4z/i4nVFZ27j9GqLxj1pwxE80eAzUNRMXtcpipFYIeowerzBgG3yJhMtObGEXidtIgbUpQ3eLDsf5OQ== -postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.12, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5: +postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5: version "6.0.12" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.12.tgz#2efae5ffab3c8bfb2b7fbf0c426e3bca616c4abb" integrity sha512-NdxGCAZdRrwVI1sy59+Wzrh+pMMHxapGnpfenDVlMEXoOcvt4pGE0JLK9YY2F5dLxcFYA/YbVQKhcGU+FtSYQg== @@ -9420,6 +9442,14 @@ postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.12, postcss-select cssesc "^3.0.0" util-deprecate "^1.0.2" +postcss-selector-parser@^6.0.13: + version "6.0.13" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz#d05d8d76b1e8e173257ef9d60b706a8e5e99bf1b" + integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + postcss-svgo@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-6.0.0.tgz#7b18742d38d4505a0455bbe70d52b49f00eaf69d" @@ -9440,7 +9470,7 @@ postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8.2.15, postcss@^8.4.23, postcss@^8.4.24: +postcss@^8.2.15, postcss@^8.4.24: version "8.4.24" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.24.tgz#f714dba9b2284be3cc07dbd2fc57ee4dc972d2df" integrity sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg== @@ -10241,16 +10271,7 @@ resolve.exports@^2.0.0: resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.0.tgz#c1a0028c2d166ec2fbf7d0644584927e76e7400e" integrity sha512-6K/gDlqgQscOlg9fSRpWstA8sYe8rbELsSTNpx+3kTrsVCzvSl0zIvRErM7fdl9ERWDsKnrLnwB+Ne89918XOg== -resolve@^1.10.0, resolve@^1.12.0, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.1: - version "1.22.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== - dependencies: - is-core-module "^2.9.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -resolve@^1.14.2: +resolve@^1.10.0, resolve@^1.14.2: version "1.22.2" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== @@ -10259,6 +10280,15 @@ resolve@^1.14.2: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +resolve@^1.12.0, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.1: + version "1.22.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + resolve@^2.0.0-next.4: version "2.0.0-next.4" resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660" @@ -10831,9 +10861,9 @@ sourcemap-codec@^1.4.8: integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" - integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + version "3.2.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" + integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== dependencies: spdx-expression-parse "^3.0.0" spdx-license-ids "^3.0.0" @@ -10852,9 +10882,9 @@ spdx-expression-parse@^3.0.0, spdx-expression-parse@^3.0.1: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.11" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95" - integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g== + version "3.0.13" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz#7189a474c46f8d47c7b0da4b987bb45e908bd2d5" + integrity sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w== spdy-transport@^3.0.0: version "3.0.0" @@ -11082,7 +11112,6 @@ stringz@^2.1.0: char-regex "^1.0.2" "strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: - name strip-ansi-cjs version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -11155,7 +11184,7 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: style-search@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/style-search/-/style-search-0.1.0.tgz#7958c793e47e32e07d2b5cafe5c0bf8e12e77902" - integrity sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI= + integrity sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg== stylehacks@^6.0.0: version "6.0.0" @@ -11205,17 +11234,17 @@ stylelint-scss@^4.6.0: postcss-value-parser "^4.2.0" stylelint@^15.6.2: - version "15.6.2" - resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-15.6.2.tgz#06d9005b62a83b72887eed623520e9b472af8c15" - integrity sha512-fjQWwcdUye4DU+0oIxNGwawIPC5DvG5kdObY5Sg4rc87untze3gC/5g/ikePqVjrAsBUZjwMN+pZsAYbDO6ArQ== + version "15.7.0" + resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-15.7.0.tgz#945939a2ce9516998a198580e69b1ceef8a7c5f3" + integrity sha512-fQRwHwWuZsDn4ENyE9AsKkOkV9WlD2CmYiVDbdZPdS3iZh0ceypOn1EuwTNuZ8xTrHF+jVeIEzLtFFSlD/nJHg== dependencies: - "@csstools/css-parser-algorithms" "^2.1.1" + "@csstools/css-parser-algorithms" "^2.2.0" "@csstools/css-tokenizer" "^2.1.1" - "@csstools/media-query-list-parser" "^2.0.4" + "@csstools/media-query-list-parser" "^2.1.0" "@csstools/selector-specificity" "^2.2.0" balanced-match "^2.0.0" colord "^2.9.3" - cosmiconfig "^8.1.3" + cosmiconfig "^8.2.0" css-functions-list "^3.1.0" css-tree "^2.3.1" debug "^4.3.4" @@ -11236,11 +11265,11 @@ stylelint@^15.6.2: micromatch "^4.0.5" normalize-path "^3.0.0" picocolors "^1.0.0" - postcss "^8.4.23" + postcss "^8.4.24" postcss-media-query-parser "^0.2.3" postcss-resolve-nested-selector "^0.1.1" postcss-safe-parser "^6.0.0" - postcss-selector-parser "^6.0.12" + postcss-selector-parser "^6.0.13" postcss-value-parser "^4.2.0" resolve-from "^5.0.0" string-width "^4.2.3" @@ -11306,7 +11335,7 @@ supports-preserve-symlinks-flag@^1.0.0: svg-tags@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764" - integrity sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q= + integrity sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA== svgo@^3.0.2: version "3.0.2" @@ -11442,7 +11471,7 @@ test-exclude@^6.0.0: text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== through@^2.3.8: version "2.3.8" @@ -12519,7 +12548,7 @@ wrap-ansi@^8.1.0: wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== write-file-atomic@^4.0.2: version "4.0.2" From 478687fc49587f0baf3fa65280d61b89766bd0dd Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 14 Jun 2023 18:15:32 +0200 Subject: [PATCH 041/118] Update libretranslate/libretranslate Docker tag to v1.3.11 (#25428) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .devcontainer/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml index 4eebb74d13..a2658ea8ba 100644 --- a/.devcontainer/docker-compose.yml +++ b/.devcontainer/docker-compose.yml @@ -69,7 +69,7 @@ services: hard: -1 libretranslate: - image: libretranslate/libretranslate:v1.3.10 + image: libretranslate/libretranslate:v1.3.11 restart: unless-stopped volumes: - lt-data:/home/libretranslate/.local From 36566e9245a696e2e054496a468d8d6c71115daa Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 14 Jun 2023 18:32:55 +0200 Subject: [PATCH 042/118] Update dependency core-js to v3.31.0 (#25430) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 016ed515b1..5d5237668c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4317,9 +4317,9 @@ core-js@^2.5.0: integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== core-js@^3.30.2: - version "3.30.2" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.30.2.tgz#6528abfda65e5ad728143ea23f7a14f0dcf503fc" - integrity sha512-uBJiDmwqsbJCWHAwjrx3cvjbMXP7xD72Dmsn5LOJpiRmE3WbBbN5rCqQ2Qh6Ek6/eOrjlWngEynBWo4VxerQhg== + version "3.31.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.31.0.tgz#4471dd33e366c79d8c0977ed2d940821719db344" + integrity sha512-NIp2TQSGfR6ba5aalZD+ZQ1fSxGhDo/s1w0nx3RYzf2pnJxt7YynxFlFScP6eV7+GZsKO95NSjGxyJsU3DZgeQ== core-util-is@~1.0.0: version "1.0.2" From a6d7abb29d885cc325d573ff67a9a503ba7ef743 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 15 Jun 2023 09:36:10 +0200 Subject: [PATCH 043/118] Update dependency intl-messageformat to v10.5.0 (#25431) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/yarn.lock b/yarn.lock index 5d5237668c..13ee0459fa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1373,13 +1373,6 @@ "@formatjs/intl-localematcher" "0.4.0" tslib "^2.4.0" -"@formatjs/fast-memoize@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@formatjs/fast-memoize/-/fast-memoize-2.0.1.tgz#f15aaa73caad5562899c69bdcad8db82adcd3b0b" - integrity sha512-M2GgV+qJn5WJQAYewz7q2Cdl6fobQa69S1AzSM2y0P68ZDbK5cWrJIcPCO395Of1ksftGZoOt4LYCO/j9BKBSA== - dependencies: - tslib "^2.4.0" - "@formatjs/fast-memoize@2.2.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@formatjs/fast-memoize/-/fast-memoize-2.2.0.tgz#33bd616d2e486c3e8ef4e68c99648c196887802b" @@ -6691,7 +6684,7 @@ intersection-observer@^0.12.0: resolved "https://registry.yarnpkg.com/intersection-observer/-/intersection-observer-0.12.2.tgz#4a45349cc0cd91916682b1f44c28d7ec737dc375" integrity sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg== -intl-messageformat@10.5.0: +intl-messageformat@10.5.0, intl-messageformat@^10.3.5: version "10.5.0" resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-10.5.0.tgz#86d11b15913ac954075b25253f5e669359f89538" integrity sha512-AvojYuOaRb6r2veOKfTVpxH9TrmjSdc5iR9R5RgBwrDZYSmAAFVT+QLbW3C4V7Qsg0OguMp67Q/EoUkxZzXRGw== @@ -6701,16 +6694,6 @@ intl-messageformat@10.5.0: "@formatjs/icu-messageformat-parser" "2.6.0" tslib "^2.4.0" -intl-messageformat@^10.3.5: - version "10.3.5" - resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-10.3.5.tgz#f55684fc663e62616ad59d3a504ea0cac3f267b7" - integrity sha512-6kPkftF8Jg3XJCkGKa5OD+nYQ+qcSxF4ZkuDdXZ6KGG0VXn+iblJqRFyDdm9VvKcMyC0Km2+JlVQffFM52D0YA== - dependencies: - "@formatjs/ecma402-abstract" "1.15.0" - "@formatjs/fast-memoize" "2.0.1" - "@formatjs/icu-messageformat-parser" "2.4.0" - tslib "^2.4.0" - invariant@^2.2.2, invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" From 8b2048d0c848257e31010a21c76b58d4dc319ea9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 15 Jun 2023 10:13:12 +0200 Subject: [PATCH 044/118] Lock file maintenance (#25434) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 34 +- yarn.lock | 2378 ++++++++++++++++++++++---------------------------- 2 files changed, 1075 insertions(+), 1337 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index d3f2b13a63..646a402a13 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -113,10 +113,10 @@ GEM aws-sigv4 (1.5.2) aws-eventstream (~> 1, >= 1.0.2) bcrypt (3.1.18) - better_errors (2.9.1) - coderay (>= 1.0.0) + better_errors (2.10.0) erubi (>= 1.0.0) rack (>= 0.9.0) + rouge (>= 1.0.0) better_html (2.0.1) actionview (>= 6.0) activesupport (>= 6.0) @@ -174,7 +174,6 @@ GEM chunky_png (1.4.0) climate_control (0.2.0) cocoon (1.2.15) - coderay (1.1.3) color_diff (0.1) concurrent-ruby (1.2.2) connection_pool (2.4.1) @@ -229,7 +228,7 @@ GEM erubi (1.12.0) et-orbi (1.2.7) tzinfo - excon (0.99.0) + excon (0.100.0) fabrication (2.30.0) faker (3.2.0) i18n (>= 1.8.11, < 2) @@ -319,7 +318,7 @@ GEM httplog (1.6.2) rack (>= 2.0) rainbow (>= 2.0.0) - i18n (1.13.0) + i18n (1.14.1) concurrent-ruby (~> 1.0) i18n-tasks (1.0.12) activesupport (>= 4.0.2) @@ -355,7 +354,7 @@ GEM json-schema (4.0.0) addressable (>= 2.8) jsonapi-renderer (0.2.2) - jwt (2.7.0) + jwt (2.7.1) kaminari (1.2.2) activesupport (>= 4.1.0) kaminari-actionview (= 1.2.2) @@ -414,12 +413,12 @@ GEM mini_mime (1.1.2) mini_portile2 (2.8.2) minitest (5.18.0) - msgpack (1.7.0) + msgpack (1.7.1) multi_json (1.15.0) multipart-post (2.3.0) net-http (0.3.2) uri - net-imap (0.3.4) + net-imap (0.3.6) date net-protocol net-ldap (0.18.0) @@ -436,7 +435,7 @@ GEM nokogiri (1.15.2) mini_portile2 (~> 2.8.2) racc (~> 1.4) - oj (3.14.3) + oj (3.15.0) omniauth (1.9.2) hashie (>= 3.4.6) rack (>= 1.6.2, < 3) @@ -496,7 +495,7 @@ GEM pundit (2.3.0) activesupport (>= 3.0.0) raabro (1.4.0) - racc (1.7.0) + racc (1.7.1) rack (2.2.7) rack-attack (6.6.1) rack (>= 1.0, < 3) @@ -548,9 +547,9 @@ GEM thor (~> 1.0) rainbow (3.1.1) rake (13.0.6) - rdf (3.2.10) + rdf (3.2.11) link_header (~> 0.0, >= 0.0.8) - rdf-normalize (0.5.1) + rdf-normalize (0.6.0) rdf (~> 3.2) redcarpet (3.6.0) redis (4.8.1) @@ -566,6 +565,7 @@ GEM railties (>= 5.2) rexml (3.2.5) rotp (6.2.2) + rouge (4.1.2) rpam2 (4.0.2) rqrcode (2.2.0) chunky_png (~> 1.0) @@ -620,12 +620,12 @@ GEM rubocop-capybara (~> 2.17) rubocop-factory_bot (~> 2.22) ruby-progressbar (1.13.0) - ruby-saml (1.13.0) - nokogiri (>= 1.10.5) + ruby-saml (1.15.0) + nokogiri (>= 1.13.10) rexml ruby2_keywords (0.0.5) rubyzip (2.3.2) - rufus-scheduler (3.8.2) + rufus-scheduler (3.9.1) fugit (~> 1.1, >= 1.1.6) safety_net_attestation (0.4.0) jwt (~> 2.0) @@ -684,13 +684,13 @@ GEM attr_required (>= 0.0.5) httpclient (>= 2.4) sysexits (1.2.0) - temple (0.10.0) + temple (0.10.2) terminal-table (3.0.2) unicode-display_width (>= 1.1.1, < 3) terrapin (0.6.0) climate_control (>= 0.0.3, < 1.0) thor (1.2.2) - tilt (2.1.0) + tilt (2.2.0) timeout (0.3.2) tpm-key_attestation (0.12.0) bindata (~> 2.4) diff --git a/yarn.lock b/yarn.lock index 13ee0459fa..1f8b99641f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3,9 +3,9 @@ "@adobe/css-tools@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.0.1.tgz#b38b444ad3aa5fedbb15f2f746dcd934226a12dd" - integrity sha512-+u76oB43nOHrF4DDWRLWDCtci7f3QJoEBigemIdIeTi1ODqjx6Tad9NCVnPRwewWlKkVab5PlK8DCtPTyX7S8g== + version "4.2.0" + resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.2.0.tgz#e1a84fca468f4b337816fcb7f0964beb620ba855" + integrity sha512-E09FiIft46CmH5Qnjb0wsW54/YQd69LsxeKUOWawmws1XWvyFGURnAChH0mlr7YPFR1ofwvUQfcL0J3lMxXqPA== "@ampproject/remapping@^2.2.0": version "2.2.1" @@ -16,34 +16,27 @@ "@jridgewell/trace-mapping" "^0.3.9" "@apideck/better-ajv-errors@^0.3.1": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.3.tgz#ab0b1e981e1749bf59736cf7ebe25cfc9f949c15" - integrity sha512-9o+HO2MbJhJHjDYZaDxJmSDckvDpiuItEsrIShV0DXeCshXWRHhqYyU/PKHMkuClOmFnZhRd6wzv4vpDu/dRKg== + version "0.3.6" + resolved "https://registry.yarnpkg.com/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz#957d4c28e886a64a8141f7522783be65733ff097" + integrity sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA== dependencies: json-schema "^0.4.0" jsonpointer "^5.0.0" leven "^3.1.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.21.4", "@babel/code-frame@^7.22.5": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.5.tgz#234d98e1551960604f1246e6475891a570ad5658" integrity sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ== dependencies: "@babel/highlight" "^7.22.5" -"@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.21.4.tgz#d0fa9e4413aca81f2b23b9442797bda1826edb39" - integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g== - dependencies: - "@babel/highlight" "^7.18.6" - "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.5.tgz#b1f6c86a02d85d2dd3368a2b67c09add8cd0c255" integrity sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA== -"@babel/core@^7.10.4", "@babel/core@^7.22.1": +"@babel/core@^7.10.4", "@babel/core@^7.11.1", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.22.1": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.5.tgz#d67d9747ecf26ee7ecd3ebae1ee22225fe902a89" integrity sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg== @@ -64,28 +57,7 @@ json5 "^2.2.2" semver "^6.3.0" -"@babel/core@^7.11.1", "@babel/core@^7.11.6", "@babel/core@^7.12.3": - version "7.21.8" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.8.tgz#2a8c7f0f53d60100ba4c32470ba0281c92aa9aa4" - integrity sha512-YeM22Sondbo523Sz0+CirSPnbj9bG3P0CdHcBZdqUuaeOaYEFbOLoGU7lebvGP6P5J/WE9wOn7u7C4J9HvS1xQ== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.21.4" - "@babel/generator" "^7.21.5" - "@babel/helper-compilation-targets" "^7.21.5" - "@babel/helper-module-transforms" "^7.21.5" - "@babel/helpers" "^7.21.5" - "@babel/parser" "^7.21.8" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.5" - "@babel/types" "^7.21.5" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.2" - semver "^6.3.0" - -"@babel/generator@^7.21.5", "@babel/generator@^7.22.3", "@babel/generator@^7.22.5": +"@babel/generator@^7.22.5", "@babel/generator@^7.7.2": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.5.tgz#1e7bf768688acfb05cf30b2369ef855e82d984f7" integrity sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA== @@ -95,16 +67,6 @@ "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/generator@^7.7.2": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.3.tgz#0ff675d2edb93d7596c5f6728b52615cfc0df01e" - integrity sha512-C17MW4wlk//ES/CJDL51kPNwl+qiBQyN7b9SKyVp11BLGFeSPoVaHrv+MNt8jwQFhQWowW88z1eeBx3pFz9v8A== - dependencies: - "@babel/types" "^7.22.3" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - "@babel/helper-annotate-as-pure@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" @@ -127,7 +89,7 @@ "@babel/helper-annotate-as-pure" "^7.22.5" "@babel/types" "^7.22.5" -"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.21.5", "@babel/helper-compilation-targets@^7.22.5": +"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz#fc7319fc54c5e2fa14b2909cf3c5fd3046813e02" integrity sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw== @@ -174,12 +136,12 @@ resolve "^1.14.2" semver "^6.1.2" -"@babel/helper-environment-visitor@^7.22.1", "@babel/helper-environment-visitor@^7.22.5": +"@babel/helper-environment-visitor@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98" integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== -"@babel/helper-function-name@^7.21.0", "@babel/helper-function-name@^7.22.5": +"@babel/helper-function-name@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz#ede300828905bb15e582c037162f99d5183af1be" integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== @@ -187,7 +149,7 @@ "@babel/template" "^7.22.5" "@babel/types" "^7.22.5" -"@babel/helper-hoist-variables@^7.18.6", "@babel/helper-hoist-variables@^7.22.5": +"@babel/helper-hoist-variables@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== @@ -201,21 +163,14 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-module-imports@^7.0.0-beta.49", "@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.12.13": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz#ac88b2f76093637489e718a90cec6cf8a9b029af" - integrity sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg== - dependencies: - "@babel/types" "^7.21.4" - -"@babel/helper-module-imports@^7.22.5": +"@babel/helper-module-imports@^7.0.0-beta.49", "@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz#1a8f4c9f4027d23f520bd76b364d44434a72660c" integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg== dependencies: "@babel/types" "^7.22.5" -"@babel/helper-module-transforms@^7.21.5", "@babel/helper-module-transforms@^7.22.5": +"@babel/helper-module-transforms@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz#0f65daa0716961b6e96b164034e737f60a80d2ef" integrity sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw== @@ -236,7 +191,7 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== @@ -277,19 +232,19 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-split-export-declaration@^7.18.6", "@babel/helper-split-export-declaration@^7.22.5": +"@babel/helper-split-export-declaration@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz#88cf11050edb95ed08d596f7a044462189127a08" integrity sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ== dependencies: "@babel/types" "^7.22.5" -"@babel/helper-string-parser@^7.21.5", "@babel/helper-string-parser@^7.22.5": +"@babel/helper-string-parser@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== -"@babel/helper-validator-identifier@^7.19.1", "@babel/helper-validator-identifier@^7.22.5": +"@babel/helper-validator-identifier@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== @@ -309,7 +264,7 @@ "@babel/traverse" "^7.22.5" "@babel/types" "^7.22.5" -"@babel/helpers@^7.21.5", "@babel/helpers@^7.22.5": +"@babel/helpers@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.5.tgz#74bb4373eb390d1ceed74a15ef97767e63120820" integrity sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q== @@ -318,7 +273,7 @@ "@babel/traverse" "^7.22.5" "@babel/types" "^7.22.5" -"@babel/highlight@^7.18.6", "@babel/highlight@^7.22.5": +"@babel/highlight@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.5.tgz#aa6c05c5407a67ebce408162b7ede789b4d22031" integrity sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw== @@ -327,16 +282,11 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.21.8", "@babel/parser@^7.22.4", "@babel/parser@^7.22.5": +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.5.tgz#721fd042f3ce1896238cf1b341c77eb7dee7dbea" integrity sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q== -"@babel/parser@^7.14.7": - version "7.22.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.4.tgz#a770e98fd785c231af9d93f6459d36770993fb32" - integrity sha512-VLLsx06XkEYqBtE5YGPwfSGwfrjnyPP5oiGty3S8pQLFDFLaS8VwWSIxkTXpcvr5zeYLE6+MBNl2npl/YnfofA== - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz#87245a21cd69a73b0b81bcda98d443d6df08f05e" @@ -436,20 +386,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@7", "@babel/plugin-syntax-jsx@^7.22.5": +"@babel/plugin-syntax-jsx@7", "@babel/plugin-syntax-jsx@^7.22.5", "@babel/plugin-syntax-jsx@^7.7.2": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz#a6b68e84fb76e759fc3b93e901876ffabbe1d918" integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-syntax-jsx@^7.12.13", "@babel/plugin-syntax-jsx@^7.7.2": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz#f264ed7bf40ffc9ec239edabc17a50c4f5b6fea2" - integrity sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" @@ -506,20 +449,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-typescript@^7.22.5": +"@babel/plugin-syntax-typescript@^7.22.5", "@babel/plugin-syntax-typescript@^7.7.2": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz#aac8d383b062c5072c647a31ef990c1d0af90272" integrity sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-syntax-typescript@^7.7.2": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz#b82c6ce471b165b5ce420cf92914d6fb46225716" - integrity sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-unicode-sets-regex@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" @@ -1111,14 +1047,14 @@ dependencies: regenerator-runtime "^0.12.0" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.13.8", "@babel/runtime@^7.2.0", "@babel/runtime@^7.20.13", "@babel/runtime@^7.20.7", "@babel/runtime@^7.22.3", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.8", "@babel/runtime@^7.18.3", "@babel/runtime@^7.2.0", "@babel/runtime@^7.20.13", "@babel/runtime@^7.20.7", "@babel/runtime@^7.22.3", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.5.tgz#8564dd588182ce0047d55d7a75e93921107b57ec" integrity sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA== dependencies: regenerator-runtime "^0.13.11" -"@babel/template@^7.20.7", "@babel/template@^7.22.5": +"@babel/template@^7.22.5", "@babel/template@^7.3.3": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec" integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== @@ -1127,16 +1063,7 @@ "@babel/parser" "^7.22.5" "@babel/types" "^7.22.5" -"@babel/template@^7.3.3": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" - integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - -"@babel/traverse@7", "@babel/traverse@^7.21.5", "@babel/traverse@^7.22.5": +"@babel/traverse@7", "@babel/traverse@^7.22.5", "@babel/traverse@^7.7.2": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.5.tgz#44bd276690db6f4940fdb84e1cb4abd2f729ccd1" integrity sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ== @@ -1152,23 +1079,7 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/traverse@^7.7.2": - version "7.22.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.4.tgz#c3cf96c5c290bd13b55e29d025274057727664c0" - integrity sha512-Tn1pDsjIcI+JcLKq1AVlZEr4226gpuAQTsLMorsYg9tuS/kG7nuwwJ4AB8jfQuEgb/COBwR/DqJxmoiYFu5/rQ== - dependencies: - "@babel/code-frame" "^7.21.4" - "@babel/generator" "^7.22.3" - "@babel/helper-environment-visitor" "^7.22.1" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.22.4" - "@babel/types" "^7.22.4" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@^7.0.0", "@babel/types@^7.12.11", "@babel/types@^7.20.7", "@babel/types@^7.21.4", "@babel/types@^7.21.5", "@babel/types@^7.22.3", "@babel/types@^7.22.4", "@babel/types@^7.22.5", "@babel/types@^7.3.0", "@babel/types@^7.4.4": +"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.12.11", "@babel/types@^7.20.7", "@babel/types@^7.22.5", "@babel/types@^7.3.3", "@babel/types@^7.4.4": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.5.tgz#cd93eeaab025880a3a47ec881f4b096a5b786fbe" integrity sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA== @@ -1177,15 +1088,6 @@ "@babel/helper-validator-identifier" "^7.22.5" to-fast-properties "^2.0.0" -"@babel/types@^7.0.0-beta.49", "@babel/types@^7.3.3": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.5.tgz#18dfbd47c39d3904d5db3d3dc2cc80bedb60e5b6" - integrity sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q== - dependencies: - "@babel/helper-string-parser" "^7.21.5" - "@babel/helper-validator-identifier" "^7.19.1" - to-fast-properties "^2.0.0" - "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" @@ -1216,88 +1118,93 @@ resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== -"@emotion/babel-plugin@^11.7.1": - version "11.9.2" - resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.9.2.tgz#723b6d394c89fb2ef782229d92ba95a740576e95" - integrity sha512-Pr/7HGH6H6yKgnVFNEj2MVlreu3ADqftqjqwUvDy/OJzKFgxKeTQ+eeUf20FOTuHVkDON2iNa25rAXVYtWJCjw== +"@emotion/babel-plugin@^11.11.0": + version "11.11.0" + resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz#c2d872b6a7767a9d176d007f5b31f7d504bb5d6c" + integrity sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ== dependencies: - "@babel/helper-module-imports" "^7.12.13" - "@babel/plugin-syntax-jsx" "^7.12.13" - "@babel/runtime" "^7.13.10" - "@emotion/hash" "^0.8.0" - "@emotion/memoize" "^0.7.5" - "@emotion/serialize" "^1.0.2" - babel-plugin-macros "^2.6.1" + "@babel/helper-module-imports" "^7.16.7" + "@babel/runtime" "^7.18.3" + "@emotion/hash" "^0.9.1" + "@emotion/memoize" "^0.8.1" + "@emotion/serialize" "^1.1.2" + babel-plugin-macros "^3.1.0" convert-source-map "^1.5.0" escape-string-regexp "^4.0.0" find-root "^1.1.0" source-map "^0.5.7" - stylis "4.0.13" + stylis "4.2.0" -"@emotion/cache@^11.4.0", "@emotion/cache@^11.7.1": - version "11.7.1" - resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.7.1.tgz#08d080e396a42e0037848214e8aa7bf879065539" - integrity sha512-r65Zy4Iljb8oyjtLeCuBH8Qjiy107dOYC6SJq7g7GV5UCQWMObY4SJDPGFjiiVpPrOJ2hmJOoBiYTC7hwx9E2A== +"@emotion/cache@^11.11.0", "@emotion/cache@^11.4.0": + version "11.11.0" + resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.11.0.tgz#809b33ee6b1cb1a625fef7a45bc568ccd9b8f3ff" + integrity sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ== dependencies: - "@emotion/memoize" "^0.7.4" - "@emotion/sheet" "^1.1.0" - "@emotion/utils" "^1.0.0" - "@emotion/weak-memoize" "^0.2.5" - stylis "4.0.13" + "@emotion/memoize" "^0.8.1" + "@emotion/sheet" "^1.2.2" + "@emotion/utils" "^1.2.1" + "@emotion/weak-memoize" "^0.3.1" + stylis "4.2.0" -"@emotion/hash@^0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413" - integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== +"@emotion/hash@^0.9.1": + version "0.9.1" + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.1.tgz#4ffb0055f7ef676ebc3a5a91fb621393294e2f43" + integrity sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ== -"@emotion/memoize@^0.7.4", "@emotion/memoize@^0.7.5": - version "0.7.5" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.5.tgz#2c40f81449a4e554e9fc6396910ed4843ec2be50" - integrity sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ== +"@emotion/memoize@^0.8.1": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.1.tgz#c1ddb040429c6d21d38cc945fe75c818cfb68e17" + integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA== "@emotion/react@^11.8.1": - version "11.9.0" - resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.9.0.tgz#b6d42b1db3bd7511e7a7c4151dc8bc82e14593b8" - integrity sha512-lBVSF5d0ceKtfKCDQJveNAtkC7ayxpVlgOohLgXqRwqWr9bOf4TZAFFyIcNngnV6xK6X4x2ZeXq7vliHkoVkxQ== + version "11.11.1" + resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.11.1.tgz#b2c36afac95b184f73b08da8c214fdf861fa4157" + integrity sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA== dependencies: - "@babel/runtime" "^7.13.10" - "@emotion/babel-plugin" "^11.7.1" - "@emotion/cache" "^11.7.1" - "@emotion/serialize" "^1.0.3" - "@emotion/utils" "^1.1.0" - "@emotion/weak-memoize" "^0.2.5" + "@babel/runtime" "^7.18.3" + "@emotion/babel-plugin" "^11.11.0" + "@emotion/cache" "^11.11.0" + "@emotion/serialize" "^1.1.2" + "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1" + "@emotion/utils" "^1.2.1" + "@emotion/weak-memoize" "^0.3.1" hoist-non-react-statics "^3.3.1" -"@emotion/serialize@^1.0.2", "@emotion/serialize@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.0.3.tgz#99e2060c26c6292469fb30db41f4690e1c8fea63" - integrity sha512-2mSSvgLfyV3q+iVh3YWgNlUc2a9ZlDU7DjuP5MjK3AXRR0dYigCrP99aeFtaB2L/hjfEZdSThn5dsZ0ufqbvsA== +"@emotion/serialize@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.1.2.tgz#017a6e4c9b8a803bd576ff3d52a0ea6fa5a62b51" + integrity sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA== dependencies: - "@emotion/hash" "^0.8.0" - "@emotion/memoize" "^0.7.4" - "@emotion/unitless" "^0.7.5" - "@emotion/utils" "^1.0.0" + "@emotion/hash" "^0.9.1" + "@emotion/memoize" "^0.8.1" + "@emotion/unitless" "^0.8.1" + "@emotion/utils" "^1.2.1" csstype "^3.0.2" -"@emotion/sheet@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.1.0.tgz#56d99c41f0a1cda2726a05aa6a20afd4c63e58d2" - integrity sha512-u0AX4aSo25sMAygCuQTzS+HsImZFuS8llY8O7b9MDRzbJM0kVJlAz6KNDqcG7pOuQZJmj/8X/rAW+66kMnMW+g== +"@emotion/sheet@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.2.2.tgz#d58e788ee27267a14342303e1abb3d508b6d0fec" + integrity sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA== -"@emotion/unitless@^0.7.5": - version "0.7.5" - resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" - integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== +"@emotion/unitless@^0.8.1": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.1.tgz#182b5a4704ef8ad91bde93f7a860a88fd92c79a3" + integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ== -"@emotion/utils@^1.0.0", "@emotion/utils@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.1.0.tgz#86b0b297f3f1a0f2bdb08eeac9a2f49afd40d0cf" - integrity sha512-iRLa/Y4Rs5H/f2nimczYmS5kFJEbpiVvgN3XVfZ022IYhuNA1IRSHEizcof88LtCTXtl9S2Cxt32KgaXEu72JQ== +"@emotion/use-insertion-effect-with-fallbacks@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz#08de79f54eb3406f9daaf77c76e35313da963963" + integrity sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw== -"@emotion/weak-memoize@^0.2.5": - version "0.2.5" - resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz#8eed982e2ee6f7f4e44c253e12962980791efd46" - integrity sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA== +"@emotion/utils@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.2.1.tgz#bbab58465738d31ae4cb3dbb6fc00a5991f755e4" + integrity sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg== + +"@emotion/weak-memoize@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz#d0fce5d07b0620caa282b5131c297bb60f9d87e6" + integrity sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww== "@es-joy/jsdoccomment@~0.39.4": version "0.39.4" @@ -1340,31 +1247,23 @@ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.42.0.tgz#484a1d638de2911e6f5a30c12f49c7e4a3270fb6" integrity sha512-6SWlXpWU5AvId8Ac7zjzmIOqMOba/JWY8XZ4A7q7Gn1Vlfg/SFFIlrtHXt9nPn4op9ZPAkl91Jao+QQv3r/ukw== -"@floating-ui/core@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.0.1.tgz#00e64d74e911602c8533957af0cce5af6b2e93c8" - integrity sha512-bO37brCPfteXQfFY0DyNDGB3+IMe4j150KFQcgJ5aBP295p9nBGeHEs/p0czrRbtlHq4Px/yoPXO/+dOCcF4uA== +"@floating-ui/core@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.3.0.tgz#113bc85fa102cf890ae801668f43ee265c547a09" + integrity sha512-vX1WVAdPjZg9DkDkC+zEx/tKtnST6/qcNpwcjeBgco3XRNHz5PUA+ivi/yr6G3o0kMR60uKBJcfOdfzOFI7PMQ== "@floating-ui/dom@^1.0.1": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.0.2.tgz#c5184c52c6f50abd11052d71204f4be2d9245237" - integrity sha512-5X9WSvZ8/fjy3gDu8yx9HAA4KG1lazUN2P4/VnaXLxTO9Dz53HI1oYoh1OlhqFNlHgGDiwFX5WhFCc2ljbW3yA== + version "1.3.0" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.3.0.tgz#69456f2164fc3d33eb40837686eaf71537235ac9" + integrity sha512-qIAwejE3r6NeA107u4ELDKkH8+VtgRKdXqtSPaKflL2S2V+doyN+Wt9s5oHKXPDo4E8TaVXaHT3+6BbagH31xw== dependencies: - "@floating-ui/core" "^1.0.1" + "@floating-ui/core" "^1.3.0" "@formatjs/cli@^6.1.1": version "6.1.3" resolved "https://registry.yarnpkg.com/@formatjs/cli/-/cli-6.1.3.tgz#b4b95259398e222ec6c06cf5f23f76d987f53e96" integrity sha512-PdTXZTY8LqxwmvFqdifn89gjXnPUpGtGyFs0BnoeLuOuxZFSnBfIs5WQCVMaJnr1+0vNNlXyT0VAIAwjRpf6BA== -"@formatjs/ecma402-abstract@1.15.0": - version "1.15.0" - resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-1.15.0.tgz#0a285a5dc69889e15d53803bd5036272e23e5a18" - integrity sha512-7bAYAv0w4AIao9DNg0avfOLTCPE9woAgs6SpXuMq11IN3A+l+cq8ghczwqSZBM11myvPSJA7vLn72q0rJ0QK6Q== - dependencies: - "@formatjs/intl-localematcher" "0.2.32" - tslib "^2.4.0" - "@formatjs/ecma402-abstract@1.17.0": version "1.17.0" resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-1.17.0.tgz#2ce191a3bde4c65c6684e03fa247062a4a294b9e" @@ -1380,15 +1279,6 @@ dependencies: tslib "^2.4.0" -"@formatjs/icu-messageformat-parser@2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.4.0.tgz#e165f3594c68416ce15f63793768251de2a85f88" - integrity sha512-6Dh5Z/gp4F/HovXXu/vmd0If5NbYLB5dZrmhWVNb+BOGOEU3wt7Z/83KY1dtd7IDhAnYHasbmKE1RbTE0J+3hw== - dependencies: - "@formatjs/ecma402-abstract" "1.15.0" - "@formatjs/icu-skeleton-parser" "1.4.0" - tslib "^2.4.0" - "@formatjs/icu-messageformat-parser@2.6.0": version "2.6.0" resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.6.0.tgz#b0d58ce8c8f472969c96b5cd0b3ad5522d3a02b7" @@ -1398,14 +1288,6 @@ "@formatjs/icu-skeleton-parser" "1.6.0" tslib "^2.4.0" -"@formatjs/icu-skeleton-parser@1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.4.0.tgz#96342eca7c4eef7a309875569e5da973db3465e6" - integrity sha512-Qq347VM616rVLkvN6QsKJELazRyNlbCiN47LdH0Mc5U7E2xV0vatiVhGqd3KFgbc055BvtnUXR7XX60dCGFuWg== - dependencies: - "@formatjs/ecma402-abstract" "1.15.0" - tslib "^2.4.0" - "@formatjs/icu-skeleton-parser@1.6.0": version "1.6.0" resolved "https://registry.yarnpkg.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.6.0.tgz#0728be8b6b3656f1a4b8e6e5b0e02dffffc23c6c" @@ -1432,13 +1314,6 @@ "@formatjs/intl-localematcher" "0.4.0" tslib "^2.4.0" -"@formatjs/intl-localematcher@0.2.32": - version "0.2.32" - resolved "https://registry.yarnpkg.com/@formatjs/intl-localematcher/-/intl-localematcher-0.2.32.tgz#00d4d307cd7d514b298e15a11a369b86c8933ec1" - integrity sha512-k/MEBstff4sttohyEpXxCmC3MqbUn9VvHGlZ8fauLzkbwXmVrEeyzS+4uhrvAk9DWU9/7otYWxyDox4nT/KVLQ== - dependencies: - tslib "^2.4.0" - "@formatjs/intl-localematcher@0.4.0": version "0.4.0" resolved "https://registry.yarnpkg.com/@formatjs/intl-localematcher/-/intl-localematcher-0.4.0.tgz#63bbc37a7c3545a1bf1686072e51d9a3aed98d6b" @@ -1486,6 +1361,11 @@ resolved "https://registry.yarnpkg.com/@gamestdio/websocket/-/websocket-0.3.2.tgz#321ba0976ee30fd14e51dbf8faa85ce7b325f76a" integrity sha512-J3n5SKim+ZoLbe44hRGI/VYAwSMCeIJuBy+FfP6EZaujEpNchPRFcIsVQLWAwpU1bP2Ji63rC+rEUOd1vjUB6Q== +"@gar/promisify@^1.0.1": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" + integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== + "@github/webauthn-json@^2.1.1": version "2.1.1" resolved "https://registry.yarnpkg.com/@github/webauthn-json/-/webauthn-json-2.1.1.tgz#648e63fc28050917d2882cc2b27817a88cb420fc" @@ -1534,9 +1414,9 @@ resolve-from "^5.0.0" "@istanbuljs/schema@^0.1.2": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd" - integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw== + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== "@jest/console@^29.5.0": version "29.5.0" @@ -1718,17 +1598,6 @@ slash "^3.0.0" write-file-atomic "^4.0.2" -"@jest/types@^27.0.2": - version "27.2.5" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.2.5.tgz#420765c052605e75686982d24b061b4cbba22132" - integrity sha512-nmuM4VuDtCZcY+eTpw+0nvstwReMsjPoj7ZR80/BbixulhLaiX+fbv8oeLW8WZlJMcsGQsTmMKT/iTZu1Uy/lQ== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^16.0.0" - chalk "^4.0.0" - "@jest/types@^29.5.0": version "29.5.0" resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.5.0.tgz#f59ef9b031ced83047c67032700d8c807d6e1593" @@ -1755,17 +1624,12 @@ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== -"@jridgewell/resolve-uri@^3.0.3": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" - integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== - "@jridgewell/set-array@^1.0.1": version "1.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== -"@jridgewell/source-map@^0.3.2": +"@jridgewell/source-map@^0.3.3": version "0.3.3" resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.3.tgz#8108265659d4c33e72ffe14e33d6cc5eb59f2fda" integrity sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg== @@ -1783,15 +1647,7 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.15": - version "0.3.15" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz#aba35c48a38d3fd84b37e66c9c0423f9744f9774" - integrity sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.15", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": version "0.3.18" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== @@ -1820,12 +1676,21 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@npmcli/fs@^1.0.0": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-1.1.1.tgz#72f719fe935e687c56a4faecf3c03d06ba593257" + integrity sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ== + dependencies: + "@gar/promisify" "^1.0.1" + semver "^7.3.5" + "@npmcli/move-file@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.0.1.tgz#de103070dac0f48ce49cf6693c23af59c0f70464" - integrity sha512-Uv6h1sT+0DrblvIrolFtbvM1FgWm+/sy4B3pvLp67Zys+thcukzS5ekn7HsZFGpWP4Q3fYJCljbWQE/XivMRLw== + version "1.1.2" + resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674" + integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== dependencies: mkdirp "^1.0.4" + rimraf "^3.0.2" "@pkgjs/parseargs@^0.11.0": version "0.11.0" @@ -1833,9 +1698,9 @@ integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== "@pkgr/utils@^2.3.1": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@pkgr/utils/-/utils-2.4.0.tgz#b6373d2504aedaf2fc7cdf2d13ab1f48fa5f12d5" - integrity sha512-2OCURAmRtdlL8iUDTypMrrxfwe8frXTeXaxGsVOaYtc/wrUyk8Z/0OBetM7cdlsy7ZFWlMX72VogKeh+A4Xcjw== + version "2.4.1" + resolved "https://registry.yarnpkg.com/@pkgr/utils/-/utils-2.4.1.tgz#adf291d0357834c410ce80af16e711b56c7b1cd3" + integrity sha512-JOqwkgFEyi+OROIyq7l4Jy28h/WwhDnG/cPkXG2Z1iFbubB6jsHW1NDvmyOzTBxHr3yg68YGirmh1JUgMqa+9w== dependencies: cross-spawn "^7.0.3" fast-glob "^3.2.12" @@ -1850,9 +1715,9 @@ integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g== "@popperjs/core@^2.11.6": - version "2.11.6" - resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.6.tgz#cee20bd55e68a1720bdab363ecf0c821ded4cd45" - integrity sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw== + version "2.11.8" + resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" + integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== "@rails/ujs@^6.1.7": version "6.1.7" @@ -1904,9 +1769,9 @@ reselect "^4.1.8" "@restart/hooks@^0.4.7": - version "0.4.7" - resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.4.7.tgz#d79ca6472c01ce04389fc73d4a79af1b5e33cd39" - integrity sha512-ZbjlEHcG+FQtpDPHd7i4FzNNvJf2enAwZfJbpM8CW7BhmOAbsHpZe3tsHwfQUrBuyrxWqPYp2x5UMnilWcY22A== + version "0.4.9" + resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.4.9.tgz#ad858fb39d99e252cccce19416adc18fc3f18fcb" + integrity sha512-3BekqcwB6Umeya+16XPooARn4qEPW6vNvwYnlofIYe6h9qG1/VeD7UvShCWx11eFz5ELYmwIEshz+MkPX3wjcQ== dependencies: dequal "^2.0.2" @@ -1948,23 +1813,23 @@ picomatch "^2.2.2" "@sinclair/typebox@^0.25.16": - version "0.25.21" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.21.tgz#763b05a4b472c93a8db29b2c3e359d55b29ce272" - integrity sha512-gFukHN4t8K4+wVC+ECqeqwzBDeFeTzBXroBTqE6vcWrQGbEUpHO7LYdG0f4xnvYq4VOEwITSlHlp0JBAIFMS/g== + version "0.25.24" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" + integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== -"@sinonjs/commons@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-2.0.0.tgz#fd4ca5b063554307e8327b4564bd56d3b73924a3" - integrity sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg== +"@sinonjs/commons@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.0.tgz#beb434fe875d965265e04722ccfc21df7f755d72" + integrity sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA== dependencies: type-detect "4.0.8" "@sinonjs/fake-timers@^10.0.2": - version "10.0.2" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz#d10549ed1f423d80639c528b6c7f5a1017747d0c" - integrity sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw== + version "10.2.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.2.0.tgz#b3e322a34c5f26e3184e7f6115695f299c1b1194" + integrity sha512-OPwQlEdg40HAj5KNF8WW6q2KG4Z+cBCZb3m4ninfTZKaBmbIJodviQsDBoYMPHkOyJJMHnOJo5j2+LKDOhOACg== dependencies: - "@sinonjs/commons" "^2.0.0" + "@sinonjs/commons" "^3.0.0" "@surma/rollup-plugin-off-main-thread@^2.2.3": version "2.2.3" @@ -1977,14 +1842,14 @@ string.prototype.matchall "^4.0.6" "@testing-library/dom@^9.0.0": - version "9.2.0" - resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-9.2.0.tgz#0e1f45e956f2a16f471559c06edd8827c4832f04" - integrity sha512-xTEnpUKiV/bMyEsE5bT4oYA0x0Z/colMtxzUY8bKyPXBNLn/e0V4ZjBZkEhms0xE4pv9QsPfSRu9AWS4y5wGvA== + version "9.3.1" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-9.3.1.tgz#8094f560e9389fb973fe957af41bf766937a9ee9" + integrity sha512-0DGPd9AR3+iDTjGoMpxIkAsUihHZ3Ai6CneU6bRRrffXMgzCdlNk43jTrD2/5LT6CBb3MWTP8v510JzYtahD2w== dependencies: "@babel/code-frame" "^7.10.4" "@babel/runtime" "^7.12.5" "@types/aria-query" "^5.0.1" - aria-query "^5.0.0" + aria-query "5.1.3" chalk "^4.1.0" dom-accessibility-api "^0.5.9" lz-string "^1.5.0" @@ -2029,7 +1894,7 @@ resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.1.tgz#3286741fb8f1e1580ac28784add4c7a1d49bdfbc" integrity sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q== -"@types/babel__core@*", "@types/babel__core@^7.1.7", "@types/babel__core@^7.20.1": +"@types/babel__core@*", "@types/babel__core@^7.1.12", "@types/babel__core@^7.1.14", "@types/babel__core@^7.1.7", "@types/babel__core@^7.20.1": version "7.20.1" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.1.tgz#916ecea274b0c776fec721e333e55762d3a9614b" integrity sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw== @@ -2040,17 +1905,6 @@ "@types/babel__template" "*" "@types/babel__traverse" "*" -"@types/babel__core@^7.1.12", "@types/babel__core@^7.1.14": - version "7.1.18" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.18.tgz#1a29abcc411a9c05e2094c98f9a1b7da6cdf49f8" - integrity sha512-S7unDjm/C7z2A2R9NzfKCK1I+BAALDtxEmsJBwlB3EzNfb929ykjL++1CK9LO++EIp2fQrC8O+BwjKvz6UeDyQ== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - "@types/babel__generator@*": version "7.6.4" resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" @@ -2073,20 +1927,13 @@ "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" -"@types/babel__traverse@*", "@types/babel__traverse@^7.1.7": +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6", "@types/babel__traverse@^7.1.7": version "7.20.1" resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.1.tgz#dd6f1d2411ae677dcb2db008c962598be31d6acf" integrity sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg== dependencies: "@babel/types" "^7.20.7" -"@types/babel__traverse@^7.0.6": - version "7.0.13" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.13.tgz#1874914be974a492e1b4cb00585cabb274e8ba18" - integrity sha512-i+zS7t6/s9cdQvbqKDARrcbrPvtJGlbYsMkazo03nTAK3RX9FNrLllXys22uiTGJapPOTZTQ35nHh4ISph4SLQ== - dependencies: - "@babel/types" "^7.3.0" - "@types/body-parser@*": version "1.19.2" resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" @@ -2132,19 +1979,15 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== -"@types/events@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" - integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== - "@types/express-serve-static-core@^4.17.33": - version "4.17.33" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz#de35d30a9d637dc1450ad18dd583d75d5733d543" - integrity sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA== + version "4.17.35" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz#c95dd4424f0d32e525d23812aa8ab8e4d3906c4f" + integrity sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg== dependencies: "@types/node" "*" "@types/qs" "*" "@types/range-parser" "*" + "@types/send" "*" "@types/express@^4.17.17": version "4.17.17" @@ -2157,18 +2000,17 @@ "@types/serve-static" "*" "@types/glob@^7.1.1": - version "7.1.1" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" - integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== + version "7.2.0" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" + integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== dependencies: - "@types/events" "*" "@types/minimatch" "*" "@types/node" "*" "@types/graceful-fs@^4.1.3": - version "4.1.5" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" - integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== + version "4.1.6" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.6.tgz#e14b2576a1c25026b7f02ede1de3b84c3a1efeae" + integrity sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw== dependencies: "@types/node" "*" @@ -2198,9 +2040,9 @@ integrity sha512-BP+KwmOvD9AR5aoxnbyyPr3fAtpjEI/bVImHsotmpuC43+z0NAmjJ9cQbX7vPCq8XcvCeAVc8E3KSQPYNaPsUQ== "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762" - integrity sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw== + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" + integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== "@types/istanbul-lib-report@*": version "3.0.0" @@ -2210,9 +2052,9 @@ "@types/istanbul-lib-coverage" "*" "@types/istanbul-reports@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz#508b13aa344fa4976234e75dddcc34925737d821" - integrity sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA== + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" + integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== dependencies: "@types/istanbul-lib-report" "*" @@ -2230,24 +2072,19 @@ integrity sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA== "@types/jsdom@^20.0.0": - version "20.0.0" - resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-20.0.0.tgz#4414fb629465167f8b7b3804b9e067bdd99f1791" - integrity sha512-YfAchFs0yM1QPDrLm2VHe+WHGtqms3NXnXAMolrgrVP6fgBHHXy1ozAbo/dFtPNtZC/m66bPiCTWYmqp1F14gA== + version "20.0.1" + resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-20.0.1.tgz#07c14bc19bd2f918c1929541cdaacae894744808" + integrity sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ== dependencies: "@types/node" "*" "@types/tough-cookie" "*" parse5 "^7.0.0" -"@types/json-schema@*", "@types/json-schema@^7.0.6", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": +"@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.12" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== -"@types/json-schema@^7.0.5": - version "7.0.6" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.6.tgz#f4c7ec43e81b319a9815115031709f26987891f0" - integrity sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw== - "@types/json-stable-stringify@^1.0.32": version "1.0.34" resolved "https://registry.yarnpkg.com/@types/json-stable-stringify/-/json-stable-stringify-1.0.34.tgz#c0fb25e4d957e0ee2e497c1f553d7f8bb668fd75" @@ -2256,7 +2093,7 @@ "@types/json5@^0.0.29": version "0.0.29" resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== "@types/lodash@^4.14.195": version "4.14.195" @@ -2268,10 +2105,15 @@ resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== +"@types/mime@^1": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" + integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== + "@types/minimatch@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" - integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== + version "5.1.2" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" + integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== "@types/minimist@^1.2.0": version "1.2.2" @@ -2279,9 +2121,9 @@ integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== "@types/node@*": - version "14.11.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.11.1.tgz#56af902ad157e763f9ba63d671c39cda3193c835" - integrity sha512-oTQgnd0hblfLsJ6BvJzzSL+Inogp3lq9fGgqRkMB/ziKMgEUaFl801OncOzUmalfzt14N0oPHMK47ipl+wbTIw== + version "20.3.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.3.1.tgz#e8a83f1aa8b649377bb1fb5d7bac5cb90e784dfe" + integrity sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg== "@types/node@14 || 16 || 17": version "17.0.45" @@ -2309,13 +2151,13 @@ integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== "@types/pg@^8.6.6": - version "8.6.6" - resolved "https://registry.yarnpkg.com/@types/pg/-/pg-8.6.6.tgz#21cdf873a3e345a6e78f394677e3b3b1b543cb80" - integrity sha512-O2xNmXebtwVekJDD+02udOncjVcMZQuTEQEMpKJ0ZRf5E7/9JJX3izhKUcUifBkyKpljyUM6BTgy2trmviKlpw== + version "8.10.2" + resolved "https://registry.yarnpkg.com/@types/pg/-/pg-8.10.2.tgz#7814d1ca02c8071f4d0864c1b17c589b061dba43" + integrity sha512-MKFs9P6nJ+LAeHLU3V0cODEOgyThJ3OAnmOlsZsxux6sfQs3HRXR5bBn7xG5DjckEFhTAxsXi7k7cd0pCMxpJw== dependencies: "@types/node" "*" pg-protocol "*" - pg-types "^2.2.0" + pg-types "^4.0.1" "@types/picomatch@^2.3.0": version "2.3.0" @@ -2323,9 +2165,9 @@ integrity sha512-O397rnSS9iQI4OirieAtsDqvCj4+3eY1J+EPdNTKuHuRWIfUoGyzX294o8C4KJYaLqgSrd2o60c5EqCU8Zv02g== "@types/prettier@^2.1.5": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.2.3.tgz#ef65165aea2924c9359205bf748865b8881753c0" - integrity sha512-PijRCG/K3s3w1We6ynUKdxEc5AcuuH3NBmMDP8uvKVp6X43UY7NQlTzczakXP3DJR0F4dfNQIGjU2cUeRYs2AA== + version "2.7.3" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f" + integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== "@types/prop-types@*", "@types/prop-types@^15.7.5": version "15.7.5" @@ -2348,9 +2190,9 @@ integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== "@types/react-dom@^18.0.0", "@types/react-dom@^18.2.4": - version "18.2.4" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.4.tgz#13f25bfbf4e404d26f62ac6e406591451acba9e0" - integrity sha512-G2mHoTMTL4yoydITgOGwWdWMVd8sNgyEP85xVmMKAPUBwQWm9wBPQUmvbeF4V3WBY1P7mmL4BkjQ0SqUpf1snw== + version "18.2.5" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.5.tgz#5c5f13548bda23cd98f50ca4a59107238bfe18f3" + integrity sha512-sRQsOS/sCLnpQhR4DSKGTtWFE3FZjpQa86KPVbhUqdYMRZ9FEFcfAytKhR/vUG2rH1oFbOOej6cuD7MFSobDRQ== dependencies: "@types/react" "*" @@ -2415,9 +2257,9 @@ "@types/react" "*" "@types/react-swipeable-views@^0.13.1": - version "0.13.1" - resolved "https://registry.yarnpkg.com/@types/react-swipeable-views/-/react-swipeable-views-0.13.1.tgz#381c8513deef5426623aa851033ff4f4831ae15c" - integrity sha512-Nuvywkv9CkwcUgItOCBszkc/pc8YSdiKV5E1AzOJ/p32Db50LgwhJFi5b1ANPgyWxB0Q5yn69aMURHyGi3MLyg== + version "0.13.2" + resolved "https://registry.yarnpkg.com/@types/react-swipeable-views/-/react-swipeable-views-0.13.2.tgz#c37cc8978ae60ab0dff209ef3eb1f77185aef330" + integrity sha512-FiszBm9M0JicAgzO/IwDqpfHQRUEjPZA88UexYsVD6qHJBf5LrbGjR5Mw4+yZbf8ZxJneNqOsZbe4WGjOYG7iQ== dependencies: "@types/react" "*" @@ -2443,25 +2285,16 @@ "@types/react" "*" "@types/react-transition-group@^4.4.0": - version "4.4.3" - resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.3.tgz#b0994da0a7023d67dbb4a8910a62112bc00d5688" - integrity sha512-fUx5muOWSYP8Bw2BUQ9M9RK9+W1XBK/7FLJ8PTQpnpTEkn0ccyMffyEQvan4C3h53gHdx7KE5Qrxi/LnUGQtdg== + version "4.4.6" + resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.6.tgz#18187bcda5281f8e10dfc48f0943e2fdf4f75e2e" + integrity sha512-VnCdSxfcm08KjsJVQcfBmhEQAPnLB8G08hAxn39azX1qYBQ/5RVQuoHuKIcfKOdncuaUvEpFKFzEvbtIMsfVew== dependencies: "@types/react" "*" -"@types/react@*", "@types/react@16 || 17 || 18", "@types/react@>=16.9.11", "@types/react@^18.0.26": - version "18.2.6" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.6.tgz#5cd53ee0d30ffc193b159d3516c8c8ad2f19d571" - integrity sha512-wRZClXn//zxCFW+ye/D2qY65UsYP1Fpex2YXorHc8awoNamkMZSvBxwxdYVInsHOZZd2Ppq8isnSzJL5Mpf8OA== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/react@^18.2.7": - version "18.2.7" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.7.tgz#dfb4518042a3117a045b8c222316f83414a783b3" - integrity sha512-ojrXpSH2XFCmHm7Jy3q44nXDyN54+EYKP2lBhJ2bqfyPj6cIUW/FZW/Csdia34NQgq7KYcAlHi5184m4X88+yw== +"@types/react@*", "@types/react@16 || 17 || 18", "@types/react@>=16.9.11", "@types/react@^18.0.26", "@types/react@^18.2.7": + version "18.2.12" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.12.tgz#95d584338610b78bb9ba0415e3180fb03debdf97" + integrity sha512-ndmBMLCgn38v3SntMeoJaIrO6tGHYKMEBohCUmw8HoLLQdRMOIGXfeYaBTLe2lsFaSB3MOK1VXscYFnmLtTSmw== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -2497,6 +2330,14 @@ resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.0.tgz#591c1ce3a702c45ee15f47a42ade72c2fd78978a" integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw== +"@types/send@*": + version "0.17.1" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.1.tgz#ed4932b8a2a805f1fe362a70f4e62d0ac994e301" + integrity sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + "@types/serve-static@*": version "1.15.1" resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.1.tgz#86b1753f0be4f9a1bee68d459fcda5be4ea52b5d" @@ -2511,9 +2352,9 @@ integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA== "@types/stack-utils@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.0.tgz#7036640b4e21cc2f259ae826ce843d277dad8cff" - integrity sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw== + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" + integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== "@types/tapable@^1": version "1.0.8" @@ -2521,9 +2362,9 @@ integrity sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ== "@types/testing-library__jest-dom@^5.9.1": - version "5.9.1" - resolved "https://registry.yarnpkg.com/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.9.1.tgz#aba5ee062b7880f69c212ef769389f30752806e5" - integrity sha512-yYn5EKHO3MPEMSOrcAb1dLWY+68CG29LiXKsWmmpVHqoP5+ZRiAVLyUHvPNrO2dABDdUGZvavMsaGpWNjM6N2g== + version "5.14.6" + resolved "https://registry.yarnpkg.com/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.6.tgz#4887f6e1af11215428ab02777873bcede98a53b0" + integrity sha512-FkHXCb+ikSoUP4Y4rOslzTdX5sqYwMxfefKh1GmZ8ce1GOkEHntSp6b5cGadmNfp5e4BMEWOMx+WSKd5/MqlDA== dependencies: "@types/jest" "*" @@ -2533,9 +2374,9 @@ integrity sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw== "@types/trusted-types@^2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.2.tgz#fc25ad9943bcac11cceb8168db4f275e0e72e756" - integrity sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg== + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.3.tgz#a136f83b0758698df454e328759dbd3d44555311" + integrity sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g== "@types/uglify-js@*": version "3.17.1" @@ -2550,9 +2391,9 @@ integrity sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA== "@types/uuid@^9.0.0": - version "9.0.1" - resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.1.tgz#98586dc36aee8dacc98cc396dbca8d0429647aa6" - integrity sha512-rFT3ak0/2trgvp4yYZo5iKFEPsET7vKydKF+VRCxlQ9bpheehyAJH89dAkaLEq/j/RZXJIqcgsmPJKUP1Z28HA== + version "9.0.2" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.2.tgz#ede1d1b1e451548d44919dc226253e32a6952c4b" + integrity sha512-kNnC1GFBLuhImSnV7w4njQkUiJi0ZXUycu1rUaouPqiKlXkh77JKgdRnTAp1x5eBwcIwbtI+3otwzuIDEuDoxQ== "@types/warning@^3.0.0": version "3.0.0" @@ -2581,16 +2422,9 @@ source-map "^0.6.0" "@types/yargs-parser@*": - version "15.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-15.0.0.tgz#cb3f9f741869e20cce330ffbeb9271590483882d" - integrity sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw== - -"@types/yargs@^16.0.0": - version "16.0.3" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.3.tgz#4b6d35bb8e680510a7dc2308518a80ee1ef27e01" - integrity sha512-YlFfTGS+zqCgXuXNV26rOIeETOkXnGQXP/pjjL9P0gO/EP9jTmc7pUBhx+jVEIxpq41RX33GQ7N3DzOSfZoglQ== - dependencies: - "@types/yargs-parser" "*" + version "21.0.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" + integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== "@types/yargs@^17.0.24", "@types/yargs@^17.0.8": version "17.0.24" @@ -2908,11 +2742,11 @@ acorn-walk@^8.0.0, acorn-walk@^8.0.2: integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== acorn@^6.4.1: - version "6.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" - integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== + version "6.4.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" + integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== -acorn@^8.0.4, acorn@^8.1.0, acorn@^8.5.0, acorn@^8.8.0, acorn@^8.8.1: +acorn@^8.0.4, acorn@^8.1.0, acorn@^8.8.0, acorn@^8.8.1, acorn@^8.8.2: version "8.8.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== @@ -2952,7 +2786,7 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.4, ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.1: +ajv@^8.0.1, ajv@^8.6.0: version "8.12.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== @@ -2962,29 +2796,12 @@ ajv@^8.0.1: require-from-string "^2.0.2" uri-js "^4.2.2" -ajv@^8.6.0: - version "8.11.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" - integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - ansi-colors@^3.0.0: version "3.2.4" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== -ansi-escapes@^4.2.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" - integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== - dependencies: - type-fest "^0.11.0" - -ansi-escapes@^4.3.0: +ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== @@ -2999,14 +2816,14 @@ ansi-html-community@0.0.8: ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== ansi-regex@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== -ansi-regex@^5.0.0, ansi-regex@^5.0.1: +ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== @@ -3048,7 +2865,7 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" -anymatch@^3.0.0, anymatch@~3.1.1, anymatch@~3.1.2: +anymatch@^3.0.0, anymatch@^3.0.3, anymatch@~3.1.2: version "3.1.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== @@ -3056,18 +2873,10 @@ anymatch@^3.0.0, anymatch@~3.1.1, anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" -anymatch@^3.0.3: - version "3.1.1" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" - integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - "aproba@^1.0.3 || ^2.0.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + version "2.0.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" + integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== are-docs-informative@^0.0.2: version "0.0.2" @@ -3094,17 +2903,24 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -aria-query@^5.0.0, aria-query@^5.1.3: +aria-query@5.1.3: version "5.1.3" resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== dependencies: deep-equal "^2.0.5" +aria-query@^5.0.0, aria-query@^5.1.3: + version "5.2.1" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.2.1.tgz#bc285d9d654d1df121bcd0c134880d415ca67c15" + integrity sha512-7uFg4b+lETFgdaJyETnILsXgnnzVnkHcgRbwbPwevm5x/LmUlt3MjczMRe1zg824iBgXZNRPTBftNYyRSKLp2g== + dependencies: + dequal "^2.0.3" + arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== arr-flatten@^1.1.0: version "1.1.0" @@ -3114,12 +2930,20 @@ arr-flatten@^1.1.0: arr-union@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== + +array-buffer-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" + integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== + dependencies: + call-bind "^1.0.2" + is-array-buffer "^3.0.1" array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== array-flatten@^2.1.0: version "2.1.2" @@ -3140,7 +2964,7 @@ array-includes@^3.1.5, array-includes@^3.1.6: array-union@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= + integrity sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng== dependencies: array-uniq "^1.0.1" @@ -3152,12 +2976,12 @@ array-union@^2.1.0: array-uniq@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== array.prototype.flat@^1.3.1: version "1.3.1" @@ -3221,12 +3045,12 @@ assert@^1.1.1: assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== ast-types-flow@^0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" - integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= + integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== astral-regex@^2.0.0: version "2.0.0" @@ -3234,9 +3058,9 @@ astral-regex@^2.0.0: integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== async-each@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" - integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + version "1.0.6" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.6.tgz#52f1d9403818c179b7561e11a5d1b77eb2160e77" + integrity sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg== async-limiter@~1.0.0: version "1.0.1" @@ -3250,7 +3074,7 @@ async-mutex@^0.4.0: dependencies: tslib "^2.4.0" -async@^2.6.2: +async@^2.6.4: version "2.6.4" resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== @@ -3258,14 +3082,14 @@ async@^2.6.2: lodash "^4.17.14" async@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.3.tgz#ac53dafd3f4720ee9e8a160628f18ea91df196c9" - integrity sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g== + version "3.2.4" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" + integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== at-least-node@^1.0.0: version "1.0.0" @@ -3295,9 +3119,9 @@ available-typed-arrays@^1.0.5: integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== axe-core@^4.6.2: - version "4.6.3" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.6.3.tgz#fc0db6fdb65cc7a80ccf85286d91d64ababa3ece" - integrity sha512-/BQzOX780JhsxDnPpH4ZiyrJAzcd8AfzFPkv+89veFSr1rcMjuq2JDCwypKaPeB6ljHp9KjXhPpjgCvQlWYuqg== + version "4.7.2" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.2.tgz#040a7342b20765cb18bb50b628394c21bccc17a0" + integrity sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g== axios@^1.4.0: version "1.4.0" @@ -3309,11 +3133,11 @@ axios@^1.4.0: proxy-from-env "^1.1.0" axobject-query@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.1.1.tgz#3b6e5c6d4e43ca7ba51c5babf99d22a9c68485e1" - integrity sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg== + version "3.2.1" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.2.1.tgz#39c378a6e3b06ca679f29138151e45b2b32da62a" + integrity sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg== dependencies: - deep-equal "^2.0.5" + dequal "^2.0.3" babel-jest@^29.5.0: version "29.5.0" @@ -3387,16 +3211,7 @@ babel-plugin-lodash@^3.3.4: lodash "^4.17.10" require-package-name "^2.0.1" -babel-plugin-macros@^2.6.1: - version "2.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz#0f958a7cc6556b1e65344465d99111a1e5e10138" - integrity sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg== - dependencies: - "@babel/runtime" "^7.7.2" - cosmiconfig "^6.0.0" - resolve "^1.12.0" - -babel-plugin-macros@^3.0.1: +babel-plugin-macros@^3.0.1, babel-plugin-macros@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1" integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== @@ -3445,9 +3260,9 @@ babel-plugin-transform-react-remove-prop-types@^0.4.24: integrity sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA== babel-preset-current-node-syntax@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.0.tgz#cf5feef29551253471cfa82fc8e0f5063df07a77" - integrity sha512-mGkvkpocWJes1CmMKtgGUwCeeq0pOhALyymozzDWYomHTbDLwueDYG6p4TK1YOeYHCzBzYPsWkgTto10JubI1Q== + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" + integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== dependencies: "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-bigint" "^7.8.3" @@ -3501,7 +3316,7 @@ base@^0.11.1: batch@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" - integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= + integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== big-integer@^1.6.44: version "1.6.51" @@ -3543,17 +3358,17 @@ blurhash@^2.0.5: bmp-js@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/bmp-js/-/bmp-js-0.1.0.tgz#e05a63f796a6c1ff25f4771ec7adadc148c07233" - integrity sha1-4Fpj95amwf8l9Hcex62twUjAcjM= + integrity sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw== bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: version "4.12.0" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== -bn.js@^5.1.1: - version "5.1.3" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.3.tgz#beca005408f642ebebea80b042b4d18d2ac0ee6b" - integrity sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ== +bn.js@^5.0.0, bn.js@^5.1.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" + integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== body-parser@1.20.1: version "1.20.1" @@ -3576,7 +3391,7 @@ body-parser@1.20.1: bonjour@^3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" - integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU= + integrity sha512-RaVTblr+OnEli0r/ud8InrU7D+G0y6aJhlxaLa6Pwty4+xoxboF1BsUI45tujvRpbj9dQVoglChqonGAsjEBYg== dependencies: array-flatten "^2.1.0" deep-equal "^1.0.1" @@ -3588,7 +3403,7 @@ bonjour@^3.5.0: boolbase@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" - integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== bplist-parser@^0.2.0: version "0.2.0" @@ -3638,7 +3453,7 @@ braces@^3.0.2, braces@~3.0.2: brorand@^1.0.1, brorand@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== browserify-aes@^1.0.0, browserify-aes@^1.0.4: version "1.2.0" @@ -3672,11 +3487,11 @@ browserify-des@^1.0.0: safe-buffer "^5.1.2" browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" - integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= + version "4.1.0" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" + integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== dependencies: - bn.js "^4.1.0" + bn.js "^5.0.0" randombytes "^2.0.1" browserify-sign@^4.0.0: @@ -3701,17 +3516,7 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@^4.0.0, browserslist@^4.21.4: - version "4.21.5" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" - integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== - dependencies: - caniuse-lite "^1.0.30001449" - electron-to-chromium "^1.4.284" - node-releases "^2.0.8" - update-browserslist-db "^1.0.10" - -browserslist@^4.21.3, browserslist@^4.21.5: +browserslist@^4.0.0, browserslist@^4.21.3, browserslist@^4.21.4, browserslist@^4.21.5: version "4.21.8" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.8.tgz#db2498e1f4b80ed199c076248a094935860b6017" integrity sha512-j+7xYe+v+q2Id9qbBeCI8WX5NmZSRe8es1+0xntD/+gaWXznP8tFEkv5IgSaHf5dS1YwVMbX/4W6m937mj+wQw== @@ -3746,7 +3551,7 @@ buffer-writer@2.0.0: buffer-xor@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== buffer@^4.3.0: version "4.9.2" @@ -3780,7 +3585,7 @@ builtin-modules@^3.1.0, builtin-modules@^3.3.0: builtin-status-codes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" - integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + integrity sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ== bundle-name@^3.0.0: version "3.0.0" @@ -3792,7 +3597,7 @@ bundle-name@^3.0.0: bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== bytes@3.1.2: version "3.1.2" @@ -3800,10 +3605,11 @@ bytes@3.1.2: integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== cacache@^15.0.5: - version "15.0.5" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.0.5.tgz#69162833da29170d6732334643c60e005f5f17d0" - integrity sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A== + version "15.3.0" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb" + integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ== dependencies: + "@npmcli/fs" "^1.0.0" "@npmcli/move-file" "^1.0.1" chownr "^2.0.0" fs-minipass "^2.0.0" @@ -3818,7 +3624,7 @@ cacache@^15.0.5: p-map "^4.0.0" promise-inflight "^1.0.1" rimraf "^3.0.2" - ssri "^8.0.0" + ssri "^8.0.1" tar "^6.0.2" unique-filename "^1.1.1" @@ -3865,9 +3671,9 @@ camelcase@^5.0.0, camelcase@^5.3.1: integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== camelcase@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" - integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-api@^3.0.0: version "3.0.0" @@ -3879,17 +3685,7 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001464: - version "1.0.30001466" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001466.tgz#c1e6197c540392e09709ecaa9e3e403428c53375" - integrity sha512-ewtFBSfWjEmxUgNBSZItFSmVtvk9zkwkl1OfRZlKA8slltRN+/C/tuGVrF9styXkN36Yu3+SeJ1qkXxDEyNZ5w== - -caniuse-lite@^1.0.30001449: - version "1.0.30001502" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001502.tgz#f7e4a76eb1d2d585340f773767be1fefc118dca8" - integrity sha512-AZ+9tFXw1sS0o0jcpJQIXvFTOB/xGiQ4OQ2t98QX3NDn2EZTSRBC801gxrsGgViuq2ak/NLkNgSNEPtCr5lfKg== - -caniuse-lite@^1.0.30001502: +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001464, caniuse-lite@^1.0.30001502: version "1.0.30001503" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001503.tgz#88b6ff1b2cf735f1f3361dc1a15b59f0561aa398" integrity sha512-Sf9NiF+wZxPfzv8Z3iS0rXM1Do+iOy2Lxvib38glFX+08TCYYYGR5fRJXk4d77C4AYwhUjgYgMsMudbh2TqCKw== @@ -3929,7 +3725,7 @@ char-regex@^1.0.2: resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== -"chokidar@>=3.0.0 <4.0.0": +"chokidar@>=3.0.0 <4.0.0", chokidar@^3.4.1: version "3.5.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== @@ -3963,37 +3759,20 @@ chokidar@^2.1.8: optionalDependencies: fsevents "^1.2.7" -chokidar@^3.4.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" - integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== - dependencies: - anymatch "~3.1.1" - braces "~3.0.2" - glob-parent "~5.1.0" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.5.0" - optionalDependencies: - fsevents "~2.3.1" - chownr@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== chrome-trace-event@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" - integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== - dependencies: - tslib "^1.9.0" + version "1.0.3" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== ci-info@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.2.0.tgz#2876cb948a498797b5236f0095bc057d0dca38b6" - integrity sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A== + version "3.8.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" + integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" @@ -4004,9 +3783,9 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: safe-buffer "^5.0.1" cjs-module-lexer@^1.0.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.1.tgz#2fd46d9906a126965aa541345c499aaa18e8cd73" - integrity sha512-jVamGdJPDeuQilKhvVn1h3knuMOZzr8QDnpk+M9aMlCaMkTDd6fBWPhiDqFvFZ07pL0liqabAiuy8SY4jGHeaw== + version "1.2.3" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz#6c370ab19f8a3394e318fe682686ec0ac684d107" + integrity sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== class-utils@^0.3.5: version "0.3.6" @@ -4086,7 +3865,7 @@ cluster-key-slot@1.1.2: co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== cocoon-js-vanilla@^1.3.0: version "1.3.0" @@ -4101,7 +3880,7 @@ collect-v8-coverage@^1.0.0: collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw== dependencies: map-visit "^1.0.0" object-visit "^1.0.0" @@ -4146,9 +3925,9 @@ colord@^2.9.1, colord@^2.9.3: integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== colorette@^2.0.19: - version "2.0.19" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" - integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== colors@^1.4.0: version "1.4.0" @@ -4163,9 +3942,9 @@ combined-stream@^1.0.8: delayed-stream "~1.0.0" commander@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.0.tgz#71797971162cd3cf65f0b9d24eb28f8d303acdf1" - integrity sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA== + version "10.0.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" + integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== commander@^2.20.0: version "2.20.3" @@ -4190,7 +3969,7 @@ common-tags@^1.8.0: commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== component-emitter@^1.2.1: version "1.3.0" @@ -4246,12 +4025,12 @@ console-browserify@^1.1.0: console-control-strings@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== constants-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" - integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= + integrity sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ== content-disposition@0.5.4: version "0.5.4" @@ -4261,18 +4040,11 @@ content-disposition@0.5.4: safe-buffer "5.2.1" content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== -convert-source-map@^1.5.0, convert-source-map@^1.6.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" - integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== - dependencies: - safe-buffer "~5.1.1" - -convert-source-map@^1.7.0: +convert-source-map@^1.5.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: version "1.9.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== @@ -4285,7 +4057,7 @@ convert-source-map@^2.0.0: cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== cookie@0.5.0: version "0.5.0" @@ -4295,7 +4067,7 @@ cookie@0.5.0: copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== core-js-compat@^3.30.1, core-js-compat@^3.30.2: version "3.31.0" @@ -4315,20 +4087,9 @@ core-js@^3.30.2: integrity sha512-NIp2TQSGfR6ba5aalZD+ZQ1fSxGhDo/s1w0nx3RYzf2pnJxt7YynxFlFScP6eV7+GZsKO95NSjGxyJsU3DZgeQ== core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= - -cosmiconfig@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" - integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.1.0" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.7.2" + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== cosmiconfig@^7.0.0: version "7.1.0" @@ -4432,9 +4193,9 @@ crypto-random-string@^2.0.0: integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== css-declaration-sorter@^6.3.1: - version "6.3.1" - resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz#be5e1d71b7a992433fb1c542c7a1b835e45682ec" - integrity sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w== + version "6.4.0" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.4.0.tgz#630618adc21724484b3e9505bce812def44000ad" + integrity sha512-jDfsatwWMWN0MODAFuHszfjphEXfNw9JUAhmY4pLu3TyTU+ohUpsbVtbU+1MZn4a47D9kqh03i4eyOm+74+zew== css-functions-list@^3.1.0: version "3.1.0" @@ -4492,7 +4253,7 @@ css-what@^6.1.0: css.escape@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" - integrity sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s= + integrity sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg== cssesc@^3.0.0: version "3.0.0" @@ -4578,11 +4339,6 @@ cssstyle@^3.0.0: dependencies: rrweb-cssom "^0.6.0" -csstype@^2.6.7: - version "2.6.13" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.13.tgz#a6893015b90e84dd6e85d0e3b442a1e84f2dbe0f" - integrity sha512-ul26pfSQTZW8dcOnD2iiJssfXw0gdNVX9IJDH/X3K5DGPfj+fUYe3kB+swUY6BF3oZDxaID3AJt+9/ojSAE05A== - csstype@^3.0.2: version "3.1.2" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" @@ -4625,7 +4381,7 @@ debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: dependencies: ms "2.1.2" -debug@^3.1.1, debug@^3.2.6, debug@^3.2.7: +debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== @@ -4658,7 +4414,7 @@ decode-uri-component@^0.2.0: dedent@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" - integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= + integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== deep-equal@^1.0.1: version "1.1.1" @@ -4673,15 +4429,16 @@ deep-equal@^1.0.1: regexp.prototype.flags "^1.2.0" deep-equal@^2.0.5: - version "2.2.0" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.0.tgz#5caeace9c781028b9ff459f33b779346637c43e6" - integrity sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw== + version "2.2.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.1.tgz#c72ab22f3a7d3503a4ca87dde976fe9978816739" + integrity sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ== dependencies: + array-buffer-byte-length "^1.0.0" call-bind "^1.0.2" - es-get-iterator "^1.1.2" - get-intrinsic "^1.1.3" + es-get-iterator "^1.1.3" + get-intrinsic "^1.2.0" is-arguments "^1.1.1" - is-array-buffer "^3.0.1" + is-array-buffer "^3.0.2" is-date-object "^1.0.5" is-regex "^1.1.4" is-shared-array-buffer "^1.0.2" @@ -4689,26 +4446,21 @@ deep-equal@^2.0.5: object-is "^1.1.5" object-keys "^1.1.1" object.assign "^4.1.4" - regexp.prototype.flags "^1.4.3" + regexp.prototype.flags "^1.5.0" side-channel "^1.0.4" which-boxed-primitive "^1.0.2" which-collection "^1.0.1" which-typed-array "^1.1.9" -deep-is@^0.1.3: +deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== -deep-is@~0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= - deepmerge@^4.0, deepmerge@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" - integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== default-browser-id@^3.0.0: version "3.0.0" @@ -4741,10 +4493,10 @@ define-lazy-prop@^3.0.0: resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f" integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== -define-properties@^1.1.3, define-properties@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" - integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== +define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" + integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== dependencies: has-property-descriptors "^1.0.0" object-keys "^1.1.1" @@ -4752,14 +4504,14 @@ define-properties@^1.1.3, define-properties@^1.1.4: define-property@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA== dependencies: is-descriptor "^0.1.0" define-property@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA== dependencies: is-descriptor "^1.0.0" @@ -4787,12 +4539,12 @@ del@^4.1.1: delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== depd@2.0.0: version "2.0.0" @@ -4802,17 +4554,17 @@ depd@2.0.0: depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== -dequal@^2.0.2: +dequal@^2.0.2, dequal@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== des.js@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" - integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== + version "1.1.0" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.1.0.tgz#1d37f5766f3bbff4ee9638e871a8768c173b81da" + integrity sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg== dependencies: inherits "^2.0.1" minimalistic-assert "^1.0.0" @@ -4825,7 +4577,7 @@ destroy@1.2.0: detect-file@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" - integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= + integrity sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q== detect-it@^4.0.1: version "4.0.1" @@ -4838,9 +4590,9 @@ detect-newline@^3.0.0: integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== detect-node@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" - integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== detect-passive-events@^2.0.3: version "2.0.3" @@ -4873,7 +4625,7 @@ dir-glob@^3.0.1: dns-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" - integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= + integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== dns-packet@^1.3.1: version "1.3.4" @@ -4886,7 +4638,7 @@ dns-packet@^1.3.1: dns-txt@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" - integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= + integrity sha512-Ix5PrWjphuSoUXV/Zv5gaFHjnaJtb02F2+Si3Ht9dyJ87+Z/lMmy+dpNHtTGraNK958ndXq2i+GLkWsWHcKaBQ== dependencies: buffer-indexof "^1.0.0" @@ -4904,12 +4656,7 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -dom-accessibility-api@^0.5.6: - version "0.5.6" - resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.6.tgz#3f5d43b52c7a3bd68b5fb63fa47b4e4c1fdf65a9" - integrity sha512-DplGLZd8L1lN64jlT27N9TVSESFR5STaEJvX+thCby7fuCHonfPpAlodYc3vuUYbDuDec5w8AMP7oCM5TWFsqw== - -dom-accessibility-api@^0.5.9: +dom-accessibility-api@^0.5.6, dom-accessibility-api@^0.5.9: version "0.5.16" resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz#5a7429e6066eb3664d911e33fb0e45de8eb08453" integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg== @@ -4921,15 +4668,7 @@ dom-helpers@^3.4.0: dependencies: "@babel/runtime" "^7.1.2" -dom-helpers@^5.0.1: - version "5.1.3" - resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.1.3.tgz#7233248eb3a2d1f74aafca31e52c5299cc8ce821" - integrity sha512-nZD1OtwfWGRBWlpANxacBEZrEuLa16o1nh7YopFWeoF68Zt8GGEmzHu6Xv4F3XaFIC+YXtTLrzgqKxFgLEe4jw== - dependencies: - "@babel/runtime" "^7.6.3" - csstype "^2.6.7" - -dom-helpers@^5.2.0: +dom-helpers@^5.0.1, dom-helpers@^5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== @@ -4963,7 +4702,7 @@ domexception@^4.0.0: dependencies: webidl-conversions "^7.0.0" -domhandler@^5.0.1, domhandler@^5.0.2: +domhandler@^5.0.2, domhandler@^5.0.3: version "5.0.3" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== @@ -4971,13 +4710,13 @@ domhandler@^5.0.1, domhandler@^5.0.2: domelementtype "^2.3.0" domutils@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.0.1.tgz#696b3875238338cb186b6c0612bd4901c89a4f1c" - integrity sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q== + version "3.1.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e" + integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== dependencies: dom-serializer "^2.0.0" domelementtype "^2.3.0" - domhandler "^5.0.1" + domhandler "^5.0.3" dotenv@^16.0.3: version "16.1.4" @@ -4997,20 +4736,15 @@ eastasianwidth@^0.2.0: ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== ejs@^3.1.6: - version "3.1.8" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.8.tgz#758d32910c78047585c7ef1f92f9ee041c1c190b" - integrity sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ== + version "3.1.9" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.9.tgz#03c9e8777fe12686a9effcef22303ca3d8eeb361" + integrity sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ== dependencies: jake "^10.8.5" -electron-to-chromium@^1.4.284: - version "1.4.428" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.428.tgz#c31fc88e854f49d8305cdabf6ec934ff1588a902" - integrity sha512-L7uUknyY286of0AYC8CKfgWstD0Smk2DvHDi9F0GWQhSH90Bzi7iDrmCbZKz75tYJxeGSAc7TYeKpmbjMDoh1w== - electron-to-chromium@^1.4.428: version "1.4.430" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.430.tgz#52693c812a81800fafb5b312c1a850142e2fc9eb" @@ -5071,7 +4805,7 @@ emojis-list@^3.0.0: encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== end-of-stream@^1.1.0: version "1.4.4" @@ -5090,22 +4824,22 @@ enhanced-resolve@^4.1.1, enhanced-resolve@^4.5.0: tapable "^1.0.0" enhanced-resolve@^5.12.0: - version "5.13.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.13.0.tgz#26d1ecc448c02de997133217b5c1053f34a0a275" - integrity sha512-eyV8f0y1+bzyfh8xAwW/WTSZpLbjhqc4ne9eGSH4Zo2ejdyiNG9pU6mf9DG8a7+Auk6MFTlNOT4Y2y/9k8GKVg== + version "5.15.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" + integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" entities@^4.2.0, entities@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174" - integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA== + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== errno@^0.1.3: - version "0.1.7" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" - integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== + version "0.1.8" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" + integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== dependencies: prr "~1.0.1" @@ -5117,43 +4851,53 @@ error-ex@^1.3.1: is-arrayish "^0.2.1" error-stack-parser@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.0.6.tgz#5a99a707bd7a4c58a797902d48d82803ede6aad8" - integrity sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ== + version "2.1.4" + resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.1.4.tgz#229cb01cdbfa84440bfa91876285b94680188286" + integrity sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ== dependencies: - stackframe "^1.1.1" + stackframe "^1.3.4" -es-abstract@^1.18.0-next.1, es-abstract@^1.19.0, es-abstract@^1.19.5, es-abstract@^1.20.4: - version "1.20.4" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.4.tgz#1d103f9f8d78d4cf0713edcd6d0ed1a46eed5861" - integrity sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA== +es-abstract@^1.19.0, es-abstract@^1.20.4: + version "1.21.2" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.2.tgz#a56b9695322c8a185dc25975aa3b8ec31d0e7eff" + integrity sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg== dependencies: + array-buffer-byte-length "^1.0.0" + available-typed-arrays "^1.0.5" call-bind "^1.0.2" + es-set-tostringtag "^2.0.1" es-to-primitive "^1.2.1" - function-bind "^1.1.1" function.prototype.name "^1.1.5" - get-intrinsic "^1.1.3" + get-intrinsic "^1.2.0" get-symbol-description "^1.0.0" + globalthis "^1.0.3" + gopd "^1.0.1" has "^1.0.3" has-property-descriptors "^1.0.0" + has-proto "^1.0.1" has-symbols "^1.0.3" - internal-slot "^1.0.3" + internal-slot "^1.0.5" + is-array-buffer "^3.0.2" is-callable "^1.2.7" is-negative-zero "^2.0.2" is-regex "^1.1.4" is-shared-array-buffer "^1.0.2" is-string "^1.0.7" + is-typed-array "^1.1.10" is-weakref "^1.0.2" - object-inspect "^1.12.2" + object-inspect "^1.12.3" object-keys "^1.1.1" object.assign "^4.1.4" regexp.prototype.flags "^1.4.3" safe-regex-test "^1.0.0" - string.prototype.trimend "^1.0.5" - string.prototype.trimstart "^1.0.5" + string.prototype.trim "^1.2.7" + string.prototype.trimend "^1.0.6" + string.prototype.trimstart "^1.0.6" + typed-array-length "^1.0.4" unbox-primitive "^1.0.2" + which-typed-array "^1.1.9" -es-get-iterator@^1.1.2: +es-get-iterator@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== @@ -5168,6 +4912,15 @@ es-get-iterator@^1.1.2: isarray "^2.0.5" stop-iteration-iterator "^1.0.0" +es-set-tostringtag@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" + integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== + dependencies: + get-intrinsic "^1.1.3" + has "^1.0.3" + has-tostringtag "^1.0.0" + es-shim-unscopables@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" @@ -5192,7 +4945,7 @@ escalade@^3.1.1: escape-html@^1.0.3, escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== escape-string-regexp@^1.0.5: version "1.0.5" @@ -5250,9 +5003,9 @@ eslint-import-resolver-typescript@^3.5.5: synckit "^0.8.5" eslint-module-utils@^2.7.4: - version "2.7.4" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz#4f3e41116aaf13a20792261e61d3a2e7e0583974" - integrity sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA== + version "2.8.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" + integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== dependencies: debug "^3.2.7" @@ -5494,7 +5247,7 @@ esutils@^2.0.2: etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== event-target-shim@^5.0.0: version "5.0.1" @@ -5511,12 +5264,10 @@ events@^3.0.0, events@^3.3.0: resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== -eventsource@^1.0.7: - version "1.1.1" - resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.1.1.tgz#4544a35a57d7120fba4fa4c86cb4023b2c09df2f" - integrity sha512-qV5ZC0h7jYIAOhArFJgSfdyz6rALJyb270714o7ZtNnw2WSJ+eexhKtE0O8LYPRsHZHf2osHKZBxGPvm3kPkCA== - dependencies: - original "^1.0.0" +eventsource@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-2.0.2.tgz#76dfcc02930fb2ff339520b6d290da573a9e8508" + integrity sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA== evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: version "1.0.3" @@ -5572,12 +5323,12 @@ execa@^7.0.0, execa@^7.1.1: exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA== dependencies: debug "^2.3.3" define-property "^0.2.5" @@ -5590,7 +5341,7 @@ expand-brackets@^2.1.4: expand-tilde@^2.0.0, expand-tilde@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" - integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= + integrity sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw== dependencies: homedir-polyfill "^1.0.1" @@ -5645,14 +5396,14 @@ express@^4.17.1, express@^4.18.2: extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== dependencies: is-extendable "^0.1.0" extend-shallow@^3.0.0, extend-shallow@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== dependencies: assign-symbols "^1.0.0" is-extendable "^1.0.1" @@ -5677,9 +5428,9 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-diff@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" - integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== + version "1.3.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" + integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== fast-glob@^3.2.11, fast-glob@^3.2.12, fast-glob@^3.2.9: version "3.2.12" @@ -5700,7 +5451,7 @@ fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fastest-levenshtein@^1.0.16: version "1.0.16" @@ -5714,17 +5465,17 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" -faye-websocket@^0.11.3: - version "0.11.3" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.3.tgz#5c0e9a8968e8912c286639fde977a8b209f2508e" - integrity sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA== +faye-websocket@^0.11.3, faye-websocket@^0.11.4: + version "0.11.4" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== dependencies: websocket-driver ">=0.5.1" fb-watchman@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" - integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== + version "2.0.2" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" + integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== dependencies: bser "2.1.1" @@ -5753,7 +5504,7 @@ file-uri-to-path@1.0.0: resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== -filelist@^1.0.1: +filelist@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== @@ -5763,7 +5514,7 @@ filelist@^1.0.1: fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ== dependencies: extend-shallow "^2.0.1" is-number "^3.0.0" @@ -5791,9 +5542,9 @@ finalhandler@1.2.0: unpipe "~1.0.0" find-cache-dir@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" - integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== + version "3.3.2" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== dependencies: commondir "^1.0.1" make-dir "^3.0.2" @@ -5858,7 +5609,7 @@ follow-redirects@^1.0.0, follow-redirects@^1.15.0: font-awesome@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/font-awesome/-/font-awesome-4.7.0.tgz#8fa8cf0411a1a31afd07b06d2902bb9fc815a133" - integrity sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM= + integrity sha512-U6kGnykA/6bFmg1M/oT9EkFeIYv7JlX3bozwQJWiiLz6L0w3F5vBVPxHlwyX/vtNq1ckcpRKOB9f2Qal/VtFpg== for-each@^0.3.3: version "0.3.3" @@ -5870,7 +5621,7 @@ for-each@^0.3.3: for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== foreground-child@^3.1.0: version "3.1.1" @@ -5902,14 +5653,14 @@ fraction.js@^4.2.0: fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA== dependencies: map-cache "^0.2.2" fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== fs-extra@^9.0.1: version "9.1.0" @@ -5941,7 +5692,7 @@ fsevents@^1.2.7: bindings "^1.5.0" nan "^2.12.1" -fsevents@^2.3.2, fsevents@~2.3.1, fsevents@~2.3.2: +fsevents@^2.3.2, fsevents@~2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== @@ -5961,7 +5712,7 @@ function.prototype.name@^1.1.5: es-abstract "^1.19.0" functions-have-names "^1.2.2" -functions-have-names@^1.2.2: +functions-have-names@^1.2.2, functions-have-names@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== @@ -5972,15 +5723,15 @@ fuzzysort@^2.0.4: integrity sha512-Api1mJL+Ad7W7vnDZnWq5pGaXJjyencT+iKGia2PlHUcSsSzWwIQ3S1isiMpwpavjYtGd2FzhUIhnnhOULZgDw== gauge@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-5.0.0.tgz#e270ca9d97dae84abf64e5277ef1ebddc7dd1e2f" - integrity sha512-0s5T5eciEG7Q3ugkxAkFtaDhrrhXsCRivA5y8C9WMHWuI8UlMOJg7+Iwf7Mccii+Dfs3H5jHepU0joPVyQU0Lw== + version "5.0.1" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-5.0.1.tgz#1efc801b8ff076b86ef3e9a7a280a975df572112" + integrity sha512-CmykPMJGuNan/3S4kZOpvvPYSNqSHANiWnh9XcMU2pSjtBfF0XzZ2p1bFAxTbnFxyBuPxQYHhzwaoOmUdqzvxQ== dependencies: aproba "^1.0.3 || ^2.0.0" color-support "^1.1.3" console-control-strings "^1.1.0" has-unicode "^2.0.1" - signal-exit "^3.0.7" + signal-exit "^4.0.1" string-width "^4.2.3" strip-ansi "^6.0.1" wide-align "^1.1.5" @@ -6000,13 +5751,14 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" - integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" + integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== dependencies: function-bind "^1.1.1" has "^1.0.3" + has-proto "^1.0.1" has-symbols "^1.0.3" get-own-enumerable-property-symbols@^3.0.0: @@ -6040,24 +5792,26 @@ get-symbol-description@^1.0.0: get-intrinsic "^1.1.1" get-tsconfig@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.5.0.tgz#6d52d1c7b299bd3ee9cd7638561653399ac77b0f" - integrity sha512-MjhiaIWCJ1sAU4pIQ5i5OfOuHHxVo1oYeNsWTON7jxYkod8pHocXeh+SSbmu5OZZZK73B6cbJ2XADzXehLyovQ== + version "4.6.0" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.6.0.tgz#e977690993a42f3e320e932427502a40f7af6d05" + integrity sha512-lgbo68hHTQnFddybKbbs/RDRJnJT5YyGy2kQzVwbq+g67X73i+5MVTval34QxGkOe9X5Ujf1UYpCaphLyltjEg== + dependencies: + resolve-pkg-maps "^1.0.0" get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== glob-parent@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + integrity sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA== dependencies: is-glob "^3.1.0" path-dirname "^1.0.0" -glob-parent@^5.1.2, glob-parent@~5.1.0, glob-parent@~5.1.2: +glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== @@ -6082,19 +5836,7 @@ glob@^10.2.5, glob@^10.2.6: minipass "^5.0.0 || ^6.0.2" path-scurry "^1.7.0" -glob@^7.0.3, glob@^7.1.1, glob@^7.1.4, glob@^7.1.6: - version "7.2.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" - integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.1.3: +glob@^7.0.3, glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -6125,7 +5867,7 @@ global-modules@^2.0.0: global-prefix@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" - integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= + integrity sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg== dependencies: expand-tilde "^2.0.2" homedir-polyfill "^1.0.1" @@ -6154,6 +5896,13 @@ globals@^13.19.0: dependencies: type-fest "^0.20.2" +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + globby@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" @@ -6180,7 +5929,7 @@ globby@^13.1.3: globby@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" - integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= + integrity sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw== dependencies: array-union "^1.0.1" glob "^7.0.3" @@ -6200,12 +5949,7 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.9: - version "4.2.9" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" - integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== - -graceful-fs@^4.2.4: +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -6237,7 +5981,7 @@ hard-rejection@^2.1.0: resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== -has-bigints@^1.0.2: +has-bigints@^1.0.1, has-bigints@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== @@ -6259,6 +6003,11 @@ has-property-descriptors@^1.0.0: dependencies: get-intrinsic "^1.1.1" +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" @@ -6274,12 +6023,12 @@ has-tostringtag@^1.0.0: has-unicode@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== has-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q== dependencies: get-value "^2.0.3" has-values "^0.1.4" @@ -6288,7 +6037,7 @@ has-value@^0.3.1: has-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw== dependencies: get-value "^2.0.6" has-values "^1.0.0" @@ -6297,12 +6046,12 @@ has-value@^1.0.0: has-values@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ== has-values@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ== dependencies: is-number "^3.0.0" kind-of "^4.0.0" @@ -6346,7 +6095,7 @@ history@^4.10.1, history@^4.7.2: hmac-drbg@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== dependencies: hash.js "^1.0.3" minimalistic-assert "^1.0.0" @@ -6386,7 +6135,7 @@ hosted-git-info@^4.0.1: hpack.js@^2.1.6: version "2.1.6" resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" - integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= + integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== dependencies: inherits "^2.0.1" obuf "^1.0.0" @@ -6401,9 +6150,9 @@ html-encoding-sniffer@^3.0.0: whatwg-encoding "^2.0.0" html-entities@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.3.1.tgz#fb9a1a4b5b14c5daba82d3e34c6ae4fe701a0e44" - integrity sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA== + version "1.4.0" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.4.0.tgz#cfbd1b01d2afaf9adca1b10ae7dffab98c71d2dc" + integrity sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA== html-escaper@^2.0.0: version "2.0.2" @@ -6418,7 +6167,7 @@ html-tags@^3.3.1: http-deceiver@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" - integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= + integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== http-errors@2.0.0: version "2.0.0" @@ -6434,7 +6183,7 @@ http-errors@2.0.0: http-errors@~1.6.2: version "1.6.3" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" - integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== dependencies: depd "~1.1.2" inherits "2.0.3" @@ -6447,9 +6196,9 @@ http-link-header@^1.1.1: integrity sha512-mW3N/rTYpCn99s1do0zx6nzFZSwLH9HGfUM4ZqLWJ16ylmYaC2v5eYGqrNTQlByx8AzUgGI+V/32gXPugs1+Sw== http-parser-js@>=0.5.1: - version "0.5.3" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.3.tgz#01d2709c79d41698bb01d4decc5e9da4e4a033d9" - integrity sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg== + version "0.5.8" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" + integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== http-proxy-agent@^5.0.0: version "5.0.0" @@ -6482,7 +6231,7 @@ http-proxy@^1.17.0: https-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" - integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= + integrity sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg== https-proxy-agent@^5.0.1: version "5.0.1" @@ -6532,9 +6281,9 @@ idb-keyval@^3.2.0: integrity sha512-slx8Q6oywCCSfKgPgL0sEsXtPVnSbTLWpyiDcu6msHOyKOLari1TD1qocXVCft80umnkk3/Qqh3lwoFt8T/BPQ== idb@^7.0.1: - version "7.0.2" - resolved "https://registry.yarnpkg.com/idb/-/idb-7.0.2.tgz#7a067e20dd16539938e456814b7d714ba8db3892" - integrity sha512-jjKrT1EnyZewQ/gCBb/eyiYrhGzws2FeY92Yx8qT9S9GeQAmo4JFVIiWRIfKW/6Ob9A+UDAOW9j9jn58fy2HIg== + version "7.1.1" + resolved "https://registry.yarnpkg.com/idb/-/idb-7.1.1.tgz#d910ded866d32c7ced9befc5bfdf36f572ced72b" + integrity sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ== ieee754@^1.1.4, ieee754@^1.2.1: version "1.2.1" @@ -6561,7 +6310,7 @@ immutable@^4.0.0, immutable@^4.0.0-rc.1, immutable@^4.3.0: resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.0.tgz#eb1738f14ffb39fd068b1dbe1296117484dd34be" integrity sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg== -import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1: +import-fresh@^3.0.0, import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -6583,9 +6332,9 @@ import-local@^2.0.0: resolve-cwd "^2.0.0" import-local@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6" - integrity sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA== + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== dependencies: pkg-dir "^4.2.0" resolve-cwd "^3.0.0" @@ -6631,19 +6380,14 @@ inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, i inherits@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" - integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + integrity sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA== inherits@2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== -ini@^1.3.4: - version "1.3.7" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.7.tgz#a09363e1911972ea16d7a8851005d84cf09a9a84" - integrity sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ== - -ini@^1.3.5: +ini@^1.3.4, ini@^1.3.5: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== @@ -6656,21 +6400,12 @@ internal-ip@^4.3.0: default-gateway "^4.2.0" ipaddr.js "^1.9.0" -internal-slot@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" - integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== +internal-slot@^1.0.3, internal-slot@^1.0.4, internal-slot@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" + integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== dependencies: - get-intrinsic "^1.1.0" - has "^1.0.3" - side-channel "^1.0.4" - -internal-slot@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.4.tgz#8551e7baf74a7a6ba5f749cfb16aa60722f0d6f3" - integrity sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ== - dependencies: - get-intrinsic "^1.1.3" + get-intrinsic "^1.2.0" has "^1.0.3" side-channel "^1.0.4" @@ -6704,12 +6439,12 @@ invariant@^2.2.2, invariant@^2.2.4: ip-regex@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" - integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= + integrity sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw== ip@^1.1.0, ip@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" - integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= + version "1.1.8" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.8.tgz#ae05948f6b075435ed3307acce04629da8cdbf48" + integrity sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg== ipaddr.js@1.9.1, ipaddr.js@^1.9.0: version "1.9.1" @@ -6724,7 +6459,7 @@ is-absolute-url@^3.0.3: is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + integrity sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A== dependencies: kind-of "^3.0.2" @@ -6735,12 +6470,7 @@ is-accessor-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" -is-arguments@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3" - integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA== - -is-arguments@^1.1.1: +is-arguments@^1.0.4, is-arguments@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== @@ -6748,13 +6478,13 @@ is-arguments@^1.1.1: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-array-buffer@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.1.tgz#deb1db4fcae48308d54ef2442706c0393997052a" - integrity sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ== +is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" + integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== dependencies: call-bind "^1.0.2" - get-intrinsic "^1.1.3" + get-intrinsic "^1.2.0" is-typed-array "^1.1.10" is-arrayish@^0.2.1: @@ -6763,14 +6493,16 @@ is-arrayish@^0.2.1: integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== is-bigint@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.2.tgz#ffb381442503235ad245ea89e45b3dbff040ee5a" - integrity sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA== + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + integrity sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q== dependencies: binary-extensions "^1.0.0" @@ -6782,11 +6514,12 @@ is-binary-path@~2.1.0: binary-extensions "^2.0.0" is-boolean-object@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.1.tgz#3c0878f035cb821228d350d2e1e36719716a3de8" - integrity sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng== + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== dependencies: call-bind "^1.0.2" + has-tostringtag "^1.0.0" is-builtin-module@^3.2.1: version "3.2.1" @@ -6800,14 +6533,7 @@ is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-core-module@^2.11.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" - integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== - dependencies: - has "^1.0.3" - -is-core-module@^2.5.0, is-core-module@^2.9.0: +is-core-module@^2.11.0, is-core-module@^2.5.0, is-core-module@^2.9.0: version "2.12.1" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== @@ -6817,7 +6543,7 @@ is-core-module@^2.5.0, is-core-module@^2.9.0: is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + integrity sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg== dependencies: kind-of "^3.0.2" @@ -6828,12 +6554,7 @@ is-data-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" -is-date-object@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" - integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== - -is-date-object@^1.0.5: +is-date-object@^1.0.1, is-date-object@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== @@ -6869,14 +6590,14 @@ is-docker@^3.0.0: integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== is-electron@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-electron/-/is-electron-2.2.0.tgz#8943084f09e8b731b3a7a0298a7b5d56f6b7eef0" - integrity sha512-SpMppC2XR3YdxSzczXReBjqs2zGscWQpBIKqwXYBFic0ERaxNVgwLCHwOLZeESfdJQjX0RDvrJ1lBXX2ij+G1Q== + version "2.2.2" + resolved "https://registry.yarnpkg.com/is-electron/-/is-electron-2.2.2.tgz#3778902a2044d76de98036f5dc58089ac4d80bb9" + integrity sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg== is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== is-extendable@^1.0.1: version "1.0.1" @@ -6893,7 +6614,7 @@ is-extglob@^2.1.0, is-extglob@^2.1.1: is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== is-fullwidth-code-point@^3.0.0: version "3.0.0" @@ -6913,7 +6634,7 @@ is-generator-fn@^2.0.0: is-glob@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + integrity sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw== dependencies: is-extglob "^2.1.0" @@ -6939,7 +6660,7 @@ is-map@^2.0.1, is-map@^2.0.2: is-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" - integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE= + integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== is-negative-zero@^2.0.2: version "2.0.2" @@ -6947,14 +6668,16 @@ is-negative-zero@^2.0.2: integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== is-number-object@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.5.tgz#6edfaeed7950cff19afedce9fbfca9ee6dd289eb" - integrity sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw== + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg== dependencies: kind-of "^3.0.2" @@ -6966,7 +6689,7 @@ is-number@^7.0.0: is-obj@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== is-path-cwd@^2.0.0: version "2.2.0" @@ -7025,7 +6748,7 @@ is-regex@^1.0.4, is-regex@^1.1.4: is-regexp@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" - integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= + integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== is-set@^2.0.1, is-set@^2.0.2: version "2.0.2" @@ -7042,12 +6765,12 @@ is-shared-array-buffer@^1.0.2: is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== is-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" - integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== is-stream@^3.0.0: version "3.0.0" @@ -7068,7 +6791,7 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" -is-typed-array@^1.1.10: +is-typed-array@^1.1.10, is-typed-array@^1.1.9: version "1.1.10" resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== @@ -7112,7 +6835,7 @@ is-windows@^1.0.1, is-windows@^1.0.2: is-wsl@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" - integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + integrity sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw== is-wsl@^2.2.0: version "2.2.0" @@ -7124,12 +6847,12 @@ is-wsl@^2.2.0: isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== isarray@^2.0.5: version "2.0.5" @@ -7144,14 +6867,14 @@ isexe@^2.0.0: isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== dependencies: isarray "1.0.0" isobject@^3.0.0, isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: version "3.2.0" @@ -7159,9 +6882,9 @@ istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz#7b49198b657b27a730b8e9cb601f1e1bff24c59a" - integrity sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q== + version "5.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" + integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== dependencies: "@babel/core" "^7.12.3" "@babel/parser" "^7.14.7" @@ -7179,18 +6902,18 @@ istanbul-lib-report@^3.0.0: supports-color "^7.1.0" istanbul-lib-source-maps@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz#75743ce6d96bb86dc7ee4352cf6366a23f0b1ad9" - integrity sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg== + version "4.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== dependencies: debug "^4.1.1" istanbul-lib-coverage "^3.0.0" source-map "^0.6.1" istanbul-reports@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.3.tgz#4bcae3103b94518117930d51283690960b50d3c2" - integrity sha512-x9LtDVtfm/t1GFiLl3NffC7hz+I1ragvgX1P/Lg1NlIagifZDKUkuuaAxH/qpwj2IuEfD8G2Bs/UKp+sZ/pKkg== + version "3.1.5" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" + integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" @@ -7205,14 +6928,14 @@ jackspeak@^2.0.3: "@pkgjs/parseargs" "^0.11.0" jake@^10.8.5: - version "10.8.5" - resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.5.tgz#f2183d2c59382cb274226034543b9c03b8164c46" - integrity sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw== + version "10.8.7" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.7.tgz#63a32821177940c33f356e0ba44ff9d34e1c7d8f" + integrity sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w== dependencies: async "^3.2.3" chalk "^4.0.2" - filelist "^1.0.1" - minimatch "^3.0.4" + filelist "^1.0.4" + minimatch "^3.1.2" jest-changed-files@^29.5.0: version "29.5.0" @@ -7415,9 +7138,9 @@ jest-mock@^29.5.0: jest-util "^29.5.0" jest-pnp-resolver@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" - integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== + version "1.2.3" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" + integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== jest-regex-util@^29.4.3: version "29.4.3" @@ -7747,12 +7470,7 @@ json-stable-stringify@^1.0.1: dependencies: jsonify "^0.0.1" -json3@^3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" - integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA== - -json5@^1.0.1: +json5@^1.0.1, json5@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== @@ -7779,9 +7497,9 @@ jsonify@^0.0.1: integrity sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg== jsonpointer@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.0.tgz#f802669a524ec4805fa7389eadbc9921d5dc8072" - integrity sha512-PNYZIdMjVIvVgDSYKTT63Y+KZ6IZvGRNNWcxwD+GNnUz1MKPfv30J8ueCjdwcN0nDx2SlshgyB7Oy0epAzVRRg== + version "5.0.1" + resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559" + integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== "jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.3: version "3.3.3" @@ -7792,9 +7510,9 @@ jsonpointer@^5.0.0: object.assign "^4.1.3" keycode@^2.1.7: - version "2.2.0" - resolved "https://registry.yarnpkg.com/keycode/-/keycode-2.2.0.tgz#3d0af56dc7b8b8e5cba8d0a97f107204eec22b04" - integrity sha1-PQr1bce4uOXLqNCpfxByBO7CKwQ= + version "2.2.1" + resolved "https://registry.yarnpkg.com/keycode/-/keycode-2.2.1.tgz#09c23b2be0611d26117ea2501c2c391a01f39eff" + integrity sha512-Rdgz9Hl9Iv4QKi8b0OlCRQEzp4AgVxyCtz5S/+VIHezDmrDhkp2N2TqBWOLz0/gbeREXOOiI9/4b8BY9uw2vFg== killable@^1.0.1: version "1.0.1" @@ -7822,9 +7540,9 @@ known-css-properties@^0.27.0: integrity sha512-uMCj6+hZYDoffuvAJjFAPz56E9uoowFHmTkqRtRq5WyC5Q6Cu/fTZKNQpX/RbzChBYLLl3lo8CjFZBAZXq9qFg== language-subtag-registry@~0.3.2: - version "0.3.20" - resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.20.tgz#a00a37121894f224f763268e431c55556b0c0755" - integrity sha512-KPMwROklF4tEx283Xw0pNKtfTj1gZ4UByp4EsIFWLgBavJltF4TiYPc39k06zSTsLzxTVXXDSpbwaQXaFB4Qeg== + version "0.3.22" + resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" + integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== language-tags@=1.0.5: version "1.0.5" @@ -7849,7 +7567,7 @@ levn@^0.4.1: levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== dependencies: prelude-ls "~1.1.2" type-check "~0.3.2" @@ -7957,32 +7675,32 @@ lodash.debounce@^4.0.8: lodash.get@^4.0: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" - integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= + integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== lodash.has@^4.0: version "4.5.2" resolved "https://registry.yarnpkg.com/lodash.has/-/lodash.has-4.5.2.tgz#d19f4dc1095058cccbe2b0cdf4ee0fe4aa37c862" - integrity sha1-0Z9NwQlQWMzL4rDN9O4P5Ko3yGI= + integrity sha512-rnYUdIo6xRCJnQmbVFEwcxF144erlD+M3YcJUVesflU9paQaE8p+fJDcIQrlMYbxoANFL+AB9hZrzSBBk5PL+g== lodash.isboolean@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" - integrity sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY= + integrity sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg== lodash.isequal@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" - integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= + integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== lodash.isobject@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-3.0.2.tgz#3c8fb8d5b5bf4bf90ae06e14f2a530a4ed935e1d" - integrity sha1-PI+41bW/S/kK4G4U8qUwpO2TXh0= + integrity sha512-3/Qptq2vr7WeJbB4KHUSKlq8Pl7ASXi3UG6CMbBm8WRtXi8+GHm7mKaU3urfpSEzWe2wCIChs6/sdocUsTKJiA== lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== lodash.merge@^4.6.2: version "4.6.2" @@ -7992,7 +7710,7 @@ lodash.merge@^4.6.2: lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" - integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= + integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== lodash.truncate@^4.4.2: version "4.4.2" @@ -8002,7 +7720,7 @@ lodash.truncate@^4.4.2: lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" - integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= + integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21: version "4.17.21" @@ -8020,9 +7738,9 @@ log-update@^4.0.0: wrap-ansi "^6.2.0" loglevel@^1.6.8: - version "1.7.0" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.0.tgz#728166855a740d59d38db01cf46f042caa041bb0" - integrity sha512-i2sY04nal5jDcagM3FMfG++T69GEEM8CYuOfeOIvmXzOIcwE9a/CJPR0MFM97pYMj/u10lzz7/zd7+qwhrBTqQ== + version "1.8.1" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.8.1.tgz#5c621f83d5b48c54ae93b6156353f555963377b4" + integrity sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg== loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: version "1.4.0" @@ -8086,7 +7804,7 @@ makeerror@1.0.12: map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== map-obj@^1.0.0: version "1.0.1" @@ -8101,14 +7819,14 @@ map-obj@^4.0.0: map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w== dependencies: object-visit "^1.0.0" mark-loader@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/mark-loader/-/mark-loader-0.1.6.tgz#0abb477dca7421d70e20128ff6489f5cae8676d5" - integrity sha1-CrtHfcp0IdcOIBKP9kifXK6GdtU= + integrity sha512-eEhrlUX2D44vADzgo2xKTyWTf3vyiGTApvxtOKHx8+CVepdzNXaMZS7cg+LlaigsIACpTEudChSHGE6noDGy/A== marky@^1.2.5: version "1.2.5" @@ -8142,7 +7860,7 @@ mdn-data@2.0.30: media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== memoize-one@^6.0.0: version "6.0.0" @@ -8152,7 +7870,7 @@ memoize-one@^6.0.0: memory-fs@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" - integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= + integrity sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ== dependencies: errno "^0.1.3" readable-stream "^2.0.1" @@ -8186,7 +7904,7 @@ meow@^9.0.0: merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== merge-stream@^2.0.0: version "2.0.0" @@ -8201,7 +7919,7 @@ merge2@^1.3.0, merge2@^1.4.1: methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" @@ -8256,9 +7974,9 @@ mime@1.6.0: integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== mime@^2.4.4: - version "2.4.7" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.7.tgz#962aed9be0ed19c91fd7dc2ece5d7f4e89a90d74" - integrity sha512-dhNd1uA2u397uQk3Nv5LM4lm93WYDUXFn3Fu291FJerns4jyTudqhIWe4W04YLy7Uk1tm1Ore04NpjRvQp/NPA== + version "2.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== mimic-fn@^2.1.0: version "2.1.0" @@ -8292,7 +8010,7 @@ minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: minimalistic-crypto-utils@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" @@ -8302,9 +8020,9 @@ minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: brace-expansion "^1.1.7" minimatch@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" - integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== dependencies: brace-expansion "^2.0.1" @@ -8324,10 +8042,10 @@ minimist-options@4.1.0: is-plain-obj "^1.1.0" kind-of "^6.0.3" -minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: - version "1.2.7" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" - integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== minipass-collect@^1.0.2: version "1.0.2" @@ -8351,12 +8069,17 @@ minipass-pipeline@^1.2.2: minipass "^3.0.0" minipass@^3.0.0, minipass@^3.1.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd" - integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg== + version "3.3.6" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== dependencies: yallist "^4.0.0" +minipass@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" + integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== + "minipass@^5.0.0 || ^6.0.2": version "6.0.2" resolved "https://registry.yarnpkg.com/minipass/-/minipass-6.0.2.tgz#542844b6c4ce95b202c0995b0a471f1229de4c81" @@ -8378,12 +8101,12 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== +mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.6: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== dependencies: - minimist "^1.2.5" + minimist "^1.2.6" mkdirp@^1.0, mkdirp@^1.0.3, mkdirp@^1.0.4: version "1.0.4" @@ -8408,7 +8131,7 @@ mrmime@^1.0.0: ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== ms@2.1.2: version "2.1.2" @@ -8423,7 +8146,7 @@ ms@2.1.3, ms@^2.1.1: multicast-dns-service-types@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" - integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= + integrity sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ== multicast-dns@^6.0.1: version "6.2.3" @@ -8434,9 +8157,9 @@ multicast-dns@^6.0.1: thunky "^1.0.2" nan@^2.12.1: - version "2.14.1" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01" - integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw== + version "2.17.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.17.0.tgz#c0150a2368a182f033e9aa5195ec76ea41a199cb" + integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ== nanoid@^3.3.6: version "3.3.6" @@ -8486,9 +8209,9 @@ nice-try@^1.0.4: integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== node-fetch@^2.6.0: - version "2.6.7" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" - integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + version "2.6.11" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.11.tgz#cde7fc71deef3131ef80a738919f999e6edfff25" + integrity sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w== dependencies: whatwg-url "^5.0.0" @@ -8498,14 +8221,14 @@ node-forge@^0.10.0: integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== node-gyp-build@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.3.0.tgz#9f256b03e5826150be39c764bf51e993946d71a3" - integrity sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q== + version "4.6.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.6.0.tgz#0c52e4cbf54bbd28b709820ef7b6a3c2d6209055" + integrity sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ== node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== node-libs-browser@^2.2.1: version "2.2.1" @@ -8536,7 +8259,7 @@ node-libs-browser@^2.2.1: util "^0.11.0" vm-browserify "^1.0.1" -node-releases@^2.0.12, node-releases@^2.0.8: +node-releases@^2.0.12: version "2.0.12" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.12.tgz#35627cc224a23bfb06fb3380f2b3afaaa7eb1039" integrity sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ== @@ -8564,7 +8287,7 @@ normalize-package-data@^3.0.0: normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + integrity sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w== dependencies: remove-trailing-separator "^1.0.1" @@ -8576,12 +8299,12 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: normalize-range@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" - integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= + integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== dependencies: path-key "^2.0.0" @@ -8617,38 +8340,30 @@ nth-check@^2.0.1: boolbase "^1.0.0" nwsapi@^2.2.2, nwsapi@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.4.tgz#fd59d5e904e8e1f03c25a7d5a15cfa16c714a1e5" - integrity sha512-NHj4rzRo0tQdijE9ZqAx6kYDcoRwYwSYzCA8MY3JzfxlrvEU0jhnhJT9BhqhJs7I/dKcrDm6TyulaRqZPIhN5g== + version "2.2.5" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.5.tgz#a52744c61b3889dd44b0a158687add39b8d935e2" + integrity sha512-6xpotnECFy/og7tKSBVmUNft7J3jyXAka4XvG6AUhFWRz+Q/Ljus7znJAA3bxColfQLdS+XsjoodtJfCgeTEFQ== object-assign@^4.0.1, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== object-copy@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ== dependencies: copy-descriptor "^0.1.0" define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@^1.12.2, object-inspect@^1.12.3, object-inspect@^1.9.0: +object-inspect@^1.12.3, object-inspect@^1.9.0: version "1.12.3" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== -object-is@^1.0.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.3.tgz#2e3b9e65560137455ee3bd62aec4d90a2ea1cc81" - integrity sha512-teyqLvFWzLkq5B9ki8FVWA902UER2qkxmdA4nLf+wjOLAWgxzCWZNCxpDq9MvE8MmhWNr+I8w3BN49Vx36Y6Xg== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" - -object-is@^1.1.5: +object-is@^1.0.1, object-is@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== @@ -8664,7 +8379,7 @@ object-keys@^1.1.1: object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA== dependencies: isobject "^3.0.0" @@ -8707,7 +8422,7 @@ object.hasown@^1.1.2: object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== dependencies: isobject "^3.0.1" @@ -8720,7 +8435,7 @@ object.values@^1.1.6: define-properties "^1.1.4" es-abstract "^1.20.4" -obuf@^1.0.0, obuf@^1.1.2: +obuf@^1.0.0, obuf@^1.1.2, obuf@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== @@ -8809,22 +8524,15 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.3" -original@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" - integrity sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg== - dependencies: - url-parse "^1.4.3" - os-browserify@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" - integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + integrity sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A== p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== p-limit@^2.0.0, p-limit@^2.2.0: version "2.3.0" @@ -8926,7 +8634,7 @@ parse-json@^5.0.0, parse-json@^5.2.0: parse-passwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" - integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= + integrity sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q== parse5@^7.0.0, parse5@^7.1.1, parse5@^7.1.2: version "7.1.2" @@ -8943,7 +8651,7 @@ parseurl@~1.3.2, parseurl@~1.3.3: pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== path-browserify@0.0.1: version "0.0.1" @@ -8958,12 +8666,12 @@ path-complete-extname@^1.0.0: path-dirname@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + integrity sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q== path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== path-exists@^4.0.0: version "4.0.0" @@ -8978,12 +8686,12 @@ path-is-absolute@^1.0.0: path-is-inside@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" @@ -9011,12 +8719,12 @@ path-scurry@^1.7.0: path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== path-to-regexp@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d" - integrity sha1-Wf3g9DW62suhA6hOnTvGTpa5k30= + version "1.8.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" + integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== dependencies: isarray "0.0.1" @@ -9026,9 +8734,9 @@ path-type@^4.0.0: integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== pbkdf2@^3.0.3: - version "3.1.1" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94" - integrity sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg== + version "3.1.2" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== dependencies: create-hash "^1.1.2" create-hmac "^1.1.4" @@ -9039,14 +8747,19 @@ pbkdf2@^3.0.3: performance-now@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" - integrity sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU= + integrity sha512-YHk5ez1hmMR5LOkb9iJkLKqoBlL7WD5M8ljC75ZfzXriuBIVNuecaXuU7e+hOwyqf24Wxhh7Vxgt7Hnw9288Tg== performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== -pg-connection-string@^2.4.0, pg-connection-string@^2.6.0: +pg-cloudflare@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pg-cloudflare/-/pg-cloudflare-1.1.0.tgz#833d70870d610d14bf9df7afb40e1cba310c17a0" + integrity sha512-tGM8/s6frwuAIyRcJ6nWcIvd3+3NmUKIs6OjviIm1HPPFEt5MzQDOTBQyhPWg/m0kCl95M6gA1JaIXtS8KovOA== + +pg-connection-string@^2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.6.0.tgz#12a36cc4627df19c25cc1b9b736cc39ee1f73ae8" integrity sha512-x14ibktcwlHKoHxx9X3uTVW9zIGR41ZB6QNhHb21OPNdCCO3NaRnpJuwKIQSR4u+Yqjx4HCvy7Hh7VSy1U4dGg== @@ -9056,22 +8769,22 @@ pg-int8@1.0.1: resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c" integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw== -pg-pool@^3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.2.2.tgz#a560e433443ed4ad946b84d774b3f22452694dff" - integrity sha512-ORJoFxAlmmros8igi608iVEbQNNZlp89diFVx6yV5v+ehmpMY9sK6QgpmgoXbmkNaBAx8cOOZh9g80kJv1ooyA== +pg-numeric@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pg-numeric/-/pg-numeric-1.0.2.tgz#816d9a44026086ae8ae74839acd6a09b0636aa3a" + integrity sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw== -pg-protocol@*: +pg-pool@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.6.0.tgz#3190df3e4747a0d23e5e9e8045bcd99bda0a712e" + integrity sha512-clFRf2ksqd+F497kWFyM21tMjeikn60oGDmqMT8UBrynEwVEX/5R5xd2sdvdo1cZCFlguORNpVuqxIj+aK4cfQ== + +pg-protocol@*, pg-protocol@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.6.0.tgz#4c91613c0315349363af2084608db843502f8833" integrity sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q== -pg-protocol@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.4.0.tgz#43a71a92f6fe3ac559952555aa3335c8cb4908be" - integrity sha512-El+aXWcwG/8wuFICMQjM5ZSAm6OWiJicFdNYo+VY3QP+8vI4SvLIWVe51PppTzMhikUJR+PsyIFKqfdXPz/yxA== - -pg-types@^2.1.0, pg-types@^2.2.0: +pg-types@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-2.2.0.tgz#2d0250d636454f7cfa3b6ae0382fdfa8063254a3" integrity sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA== @@ -9082,25 +8795,40 @@ pg-types@^2.1.0, pg-types@^2.2.0: postgres-date "~1.0.4" postgres-interval "^1.1.0" +pg-types@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-4.0.1.tgz#31857e89d00a6c66b06a14e907c3deec03889542" + integrity sha512-hRCSDuLII9/LE3smys1hRHcu5QGcLs9ggT7I/TCs0IE+2Eesxi9+9RWAAwZ0yaGjxoWICF/YHLOEjydGujoJ+g== + dependencies: + pg-int8 "1.0.1" + pg-numeric "1.0.2" + postgres-array "~3.0.1" + postgres-bytea "~3.0.0" + postgres-date "~2.0.1" + postgres-interval "^3.0.0" + postgres-range "^1.1.1" + pg@^8.5.0: - version "8.5.1" - resolved "https://registry.yarnpkg.com/pg/-/pg-8.5.1.tgz#34dcb15f6db4a29c702bf5031ef2e1e25a06a120" - integrity sha512-9wm3yX9lCfjvA98ybCyw2pADUivyNWT/yIP4ZcDVpMN0og70BUWYEGXPCTAQdGTAqnytfRADb7NERrY1qxhIqw== + version "8.11.0" + resolved "https://registry.yarnpkg.com/pg/-/pg-8.11.0.tgz#a37e534e94b57a7ed811e926f23a7c56385f55d9" + integrity sha512-meLUVPn2TWgJyLmy7el3fQQVwft4gU5NGyvV0XbD41iU9Jbg8lCH4zexhIkihDzVHJStlt6r088G6/fWeNjhXA== dependencies: buffer-writer "2.0.0" packet-reader "1.0.0" - pg-connection-string "^2.4.0" - pg-pool "^3.2.2" - pg-protocol "^1.4.0" + pg-connection-string "^2.6.0" + pg-pool "^3.6.0" + pg-protocol "^1.6.0" pg-types "^2.1.0" pgpass "1.x" + optionalDependencies: + pg-cloudflare "^1.1.0" pgpass@1.x: - version "1.0.4" - resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.4.tgz#85eb93a83800b20f8057a2b029bf05abaf94ea9c" - integrity sha512-YmuA56alyBq7M59vxVBfPJrGSozru8QAdoNlWuW3cz8l+UX3cWge0vTvjKhsSHSJpo3Bom8/Mm6hf0TR5GY0+w== + version "1.0.5" + resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.5.tgz#9b873e4a564bb10fa7a7dbd55312728d422a223d" + integrity sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug== dependencies: - split2 "^3.1.1" + split2 "^4.1.0" picocolors@^1.0.0: version "1.0.0" @@ -9125,7 +8853,7 @@ piexifjs@^1.0.6: pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== pify@^4.0.1: version "4.0.1" @@ -9135,19 +8863,19 @@ pify@^4.0.1: pinkie-promise@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + integrity sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw== dependencies: pinkie "^2.0.0" pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg== pirates@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.4.tgz#07df81e61028e402735cdd49db701e4885b4e6e6" - integrity sha512-ZIrVPH+A52Dw84R0L3/VS9Op04PuQ2SEoJL6bkshmiTic/HldyW9Tf7oH5mhJZBK7NmDx27vSMrYEXPXclpDKw== + version "4.0.5" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" + integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== pkg-dir@^3.0.0: version "3.0.0" @@ -9164,23 +8892,23 @@ pkg-dir@^4.1.0, pkg-dir@^4.2.0: find-up "^4.0.0" portfinder@^1.0.26: - version "1.0.28" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" - integrity sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA== + version "1.0.32" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.32.tgz#2fe1b9e58389712429dc2bea5beb2146146c7f81" + integrity sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg== dependencies: - async "^2.6.2" - debug "^3.1.1" - mkdirp "^0.5.5" + async "^2.6.4" + debug "^3.2.7" + mkdirp "^0.5.6" posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== postcss-calc@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-9.0.0.tgz#cd9b2b155e57c823687eb67c9afcbe97c98ecaa4" - integrity sha512-B9BNW/SVh4SMJfoCQ6D9h1Wo7Yjqks7UdbiARJ16J5TIsQn5NEqwMF5joSgOYb26oJPUR5Uv3fCQ/4PvmZWeJQ== + version "9.0.1" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-9.0.1.tgz#a744fd592438a93d6de0f1434c572670361eb6c6" + integrity sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ== dependencies: postcss-selector-parser "^6.0.11" postcss-value-parser "^4.2.0" @@ -9295,9 +9023,9 @@ postcss-modules-extract-imports@^3.0.0: integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== postcss-modules-local-by-default@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" - integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz#b08eb4f083050708998ba2c6061b50c2870ca524" + integrity sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA== dependencies: icss-utils "^5.0.0" postcss-selector-parser "^6.0.2" @@ -9417,15 +9145,7 @@ postcss-scss@^4.0.6: resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-4.0.6.tgz#5d62a574b950a6ae12f2aa89b60d63d9e4432bfd" integrity sha512-rLDPhJY4z/i4nVFZ27j9GqLxj1pwxE80eAzUNRMXtcpipFYIeowerzBgG3yJhMtObGEXidtIgbUpQ3eLDsf5OQ== -postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5: - version "6.0.12" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.12.tgz#2efae5ffab3c8bfb2b7fbf0c426e3bca616c4abb" - integrity sha512-NdxGCAZdRrwVI1sy59+Wzrh+pMMHxapGnpfenDVlMEXoOcvt4pGE0JLK9YY2F5dLxcFYA/YbVQKhcGU+FtSYQg== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-selector-parser@^6.0.13: +postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.13, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5: version "6.0.13" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz#d05d8d76b1e8e173257ef9d60b706a8e5e99bf1b" integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== @@ -9467,16 +9187,33 @@ postgres-array@~2.0.0: resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-2.0.0.tgz#48f8fce054fbc69671999329b8834b772652d82e" integrity sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA== +postgres-array@~3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-3.0.2.tgz#68d6182cb0f7f152a7e60dc6a6889ed74b0a5f98" + integrity sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog== + postgres-bytea@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-1.0.0.tgz#027b533c0aa890e26d172d47cf9ccecc521acd35" - integrity sha1-AntTPAqokOJtFy1Hz5zOzFIazTU= + integrity sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w== + +postgres-bytea@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-3.0.0.tgz#9048dc461ac7ba70a6a42d109221619ecd1cb089" + integrity sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw== + dependencies: + obuf "~1.1.2" postgres-date@~1.0.4: version "1.0.7" resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.7.tgz#51bc086006005e5061c591cee727f2531bf641a8" integrity sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q== +postgres-date@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-2.0.1.tgz#638b62e5c33764c292d37b08f5257ecb09231457" + integrity sha512-YtMKdsDt5Ojv1wQRvUhnyDJNSr2dGIC96mQVKz7xufp07nfuFONzdaowrMHjlAzY6GDLd4f+LUHHAAM1h4MdUw== + postgres-interval@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-1.2.0.tgz#b460c82cb1587507788819a06aa0fffdb3544695" @@ -9484,6 +9221,16 @@ postgres-interval@^1.1.0: dependencies: xtend "^4.0.0" +postgres-interval@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-3.0.0.tgz#baf7a8b3ebab19b7f38f07566c7aab0962f0c86a" + integrity sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw== + +postgres-range@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/postgres-range/-/postgres-range-1.1.3.tgz#9ccd7b01ca2789eb3c2e0888b3184225fa859f76" + integrity sha512-VdlZoocy5lCP0c/t66xAfclglEapXPCIVhqqJRncYpvbCgImF0w67aPKfbqUMr72tO2k5q0TdTZwCLjPTI6C9g== + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -9492,7 +9239,7 @@ prelude-ls@^1.2.1: prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== prettier-linter-helpers@^1.0.0: version "1.0.0" @@ -9512,12 +9259,11 @@ pretty-bytes@^5.3.0, pretty-bytes@^5.4.1: integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== pretty-format@^27.0.2: - version "27.0.2" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.0.2.tgz#9283ff8c4f581b186b2d4da461617143dca478a4" - integrity sha512-mXKbbBPnYTG7Yra9qFBtqj+IXcsvxsvOBco3QHxtxTl+hHKq6QdzMZ+q0CtL4ORHZgwGImRr2XZUX2EWzORxig== + version "27.5.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" + integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== dependencies: - "@jest/types" "^27.0.2" - ansi-regex "^5.0.0" + ansi-regex "^5.0.1" ansi-styles "^5.0.0" react-is "^17.0.1" @@ -9538,20 +9284,20 @@ process-nextick-args@~2.0.0: process@^0.11.10: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== promise-inflight@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= + integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== prompts@^2.0.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.3.2.tgz#480572d89ecf39566d2bd3fe2c9fccb7c4c0b068" - integrity sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA== + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== dependencies: kleur "^3.0.3" - sisteransi "^1.0.4" + sisteransi "^1.0.5" prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: version "15.8.1" @@ -9578,12 +9324,12 @@ proxy-from-env@^1.1.0: prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== psl@^1.1.33: - version "1.8.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" - integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== public-encrypt@^4.0.0: version "4.0.3" @@ -9605,15 +9351,10 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= - -punycode@1.4.1, punycode@^1.2.4: +punycode@1.4.1, punycode@^1.2.4, punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== punycode@^2.1.0, punycode@^2.1.1, punycode@^2.3.0: version "2.3.0" @@ -9621,9 +9362,9 @@ punycode@^2.1.0, punycode@^2.1.1, punycode@^2.3.0: integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== pure-rand@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.0.tgz#701996ceefa253507923a0e864c17ab421c04a7c" - integrity sha512-rLSBxJjP+4DQOgcJAx6RZHT2he2pkhQdSnofG5VWyVl6GRq/K02ISOuOLcsMOrtKDIJb8JN2zm3FFzWNbezdPw== + version "6.0.2" + resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.2.tgz#a9c2ddcae9b68d736a8163036f088a2781c8b306" + integrity sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ== qs@6.11.0: version "6.11.0" @@ -9632,15 +9373,17 @@ qs@6.11.0: dependencies: side-channel "^1.0.4" +qs@^6.11.0: + version "6.11.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" + integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== + dependencies: + side-channel "^1.0.4" + querystring-es3@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" - integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= - -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + integrity sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA== querystringify@^2.1.1: version "2.2.0" @@ -9712,9 +9455,9 @@ react-event-listener@^0.6.0: warning "^4.0.1" react-fast-compare@^3.1.1: - version "3.2.0" - resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.0.tgz#641a9da81b6a6320f270e89724fb45a0b39e43bb" - integrity sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA== + version "3.2.2" + resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.2.tgz#929a97a532304ce9fee4bcae44234f1ce2c21d49" + integrity sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ== react-helmet@^6.1.0: version "6.1.0" @@ -9729,7 +9472,7 @@ react-helmet@^6.1.0: react-hotkeys@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/react-hotkeys/-/react-hotkeys-1.1.4.tgz#a0712aa2e0c03a759fd7885808598497a4dace72" - integrity sha1-oHEqouDAOnWf14hYCFmEl6TaznI= + integrity sha512-TI7YEZXl3ChOfq9MO5LohWA809hxs4pbLAPodPdFrvunLa7uk9TlMKpftnChMlAcbiqDrOGAhnGWZCMbNnd65A== dependencies: lodash.isboolean "^3.0.3" lodash.isequal "^4.5.0" @@ -9824,9 +9567,9 @@ react-redux-loading-bar@^5.0.4: react-lifecycles-compat "^3.0.4" react-redux@^8.0.4: - version "8.0.7" - resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-8.0.7.tgz#b74ef2f7ce2076e354540aa3511d3670c2b62571" - integrity sha512-1vRQuCQI5Y2uNmrMXg81RXKiBHY3jBzvCvNmZF437O/Z9/pZ+ba2uYHbemYXb3g8rjsacBGo+/wmfrQKzMhJsg== + version "8.1.0" + resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-8.1.0.tgz#4e147339f00bbaac7196bc42bc99e6fc412846e7" + integrity sha512-CtHZzAOxi7GQvTph4dVLWwZHAWUjV2kMEQtk50OrN8z3gKxpWg3Tz7JfDw32N3Rpd7fh02z73cF6yZkK467gbQ== dependencies: "@babel/runtime" "^7.12.1" "@types/hoist-non-react-statics" "^3.3.1" @@ -9960,9 +9703,9 @@ react-toggle@^4.1.3: classnames "^2.2.5" react-transition-group@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.3.0.tgz#fea832e386cf8796c58b61874a3319704f5ce683" - integrity sha512-1qRV1ZuVSdxPlPf4O8t7inxUGpdyO5zG9IoNfJxSO0ImU2A1YWkEQvFPuIPZmMLkg5hYs7vv5mMOyfgSkvAwvw== + version "4.4.5" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1" + integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== dependencies: "@babel/runtime" "^7.5.5" dom-helpers "^5.0.1" @@ -9996,9 +9739,9 @@ read-pkg@^5.2.0: type-fest "^0.6.0" readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.3.3, readable-stream@^2.3.6: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -10008,19 +9751,19 @@ readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.3.3, readable string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.0.0, readable-stream@^3.0.6, readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== +readable-stream@^3.0.6, readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" string_decoder "^1.1.1" util-deprecate "^1.0.1" readable-stream@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.2.0.tgz#a7ef523d3b39e4962b0db1a1af22777b10eeca46" - integrity sha512-gJrBHsaI3lgBoGMW/jHZsQ/o/TIWiu5ENCJG1BB7fuCKzpFM8GaS2UoBVt9NO+oI+3FcrBNbUkl3ilDe09aY4A== + version "4.4.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.4.0.tgz#55ce132d60a988c460d75c631e9ccf6a7229b468" + integrity sha512-kDMOq0qLtxV9f/SQv522h8cxZBqNZXuXNyjyezmfAAuribMyVXziljpQ/uQhfE1XLg2/TLTW2DsnoE4VAi/krg== dependencies: abort-controller "^3.0.0" buffer "^6.0.3" @@ -10036,13 +9779,6 @@ readdirp@^2.2.1: micromatch "^3.1.10" readable-stream "^2.0.2" -readdirp@~3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" - integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== - dependencies: - picomatch "^2.2.1" - readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -10073,7 +9809,7 @@ redis@^4.6.5: redux-immutable@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/redux-immutable/-/redux-immutable-4.0.0.tgz#3a1a32df66366462b63691f0e1dc35e472bbc9f3" - integrity sha1-Ohoy32Y2ZGK2NpHw4dw15HK7yfM= + integrity sha512-SchSn/DWfGb3oAejd+1hhHx01xUoxY+V7TeK0BKqpkLKiQPVFf7DYzEaKmrEVxsWxielKfSK9/Xq66YyxgR1cg== redux-thunk@^2.4.2: version "2.4.2" @@ -10124,14 +9860,14 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" - integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== +regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.4.3, regexp.prototype.flags@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" + integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - functions-have-names "^1.2.2" + define-properties "^1.2.0" + functions-have-names "^1.2.3" regexpu-core@^5.3.1: version "5.3.2" @@ -10155,27 +9891,27 @@ regjsparser@^0.9.1: remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + integrity sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw== repeat-element@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" - integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + version "1.1.4" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" + integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== requestidlecallback@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/requestidlecallback/-/requestidlecallback-0.3.0.tgz#6fb74e0733f90df3faa4838f9f6a2a5f9b742ac5" - integrity sha1-b7dOBzP5DfP6pIOPn2oqX5t0KsU= + integrity sha512-TWHFkT7S9p7IxLC5A1hYmAYQx2Eb9w1skrXmQ+dS1URyvR8tenMLl4lHbqEOUnpEYxNKpkVMXUgknVpBZWXXfQ== require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== require-from-string@^2.0.2: version "2.0.2" @@ -10190,12 +9926,12 @@ require-main-filename@^2.0.0: require-package-name@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/require-package-name/-/require-package-name-2.0.1.tgz#c11e97276b65b8e2923f75dabf5fb2ef0c3841b9" - integrity sha1-wR6XJ2tluOKSP3Xav1+y7ww4Qbk= + integrity sha512-uuoJ1hU/k6M0779t3VMVIYpb2VMJk05cehCaABFhXaibcbvfgR8wKiozLjVFSzJPmQMRqIcO0HMyTFqfV09V6Q== requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== reselect@^4.1.8: version "4.1.8" @@ -10205,7 +9941,7 @@ reselect@^4.1.8: resolve-cwd@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" - integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= + integrity sha512-ccu8zQTrzVr954472aUVPLEcB3YpKSYR3cg/3lo1okzobPBM+1INXBbBZlDbnI/hbEocnf8j0QVo43hQKrbchg== dependencies: resolve-from "^3.0.0" @@ -10219,7 +9955,7 @@ resolve-cwd@^3.0.0: resolve-dir@^1.0.0, resolve-dir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" - integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= + integrity sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg== dependencies: expand-tilde "^2.0.0" global-modules "^1.0.0" @@ -10227,7 +9963,7 @@ resolve-dir@^1.0.0, resolve-dir@^1.0.1: resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha1-six699nWiBvItuZTM17rywoYh0g= + integrity sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw== resolve-from@^4.0.0: version "4.0.0" @@ -10244,17 +9980,22 @@ resolve-pathname@^3.0.0: resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== +resolve-pkg-maps@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" + integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== + resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== resolve.exports@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.0.tgz#c1a0028c2d166ec2fbf7d0644584927e76e7400e" - integrity sha512-6K/gDlqgQscOlg9fSRpWstA8sYe8rbELsSTNpx+3kTrsVCzvSl0zIvRErM7fdl9ERWDsKnrLnwB+Ne89918XOg== + version "2.0.2" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" + integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== -resolve@^1.10.0, resolve@^1.14.2: +resolve@^1.10.0, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.1: version "1.22.2" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== @@ -10263,15 +10004,6 @@ resolve@^1.10.0, resolve@^1.14.2: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@^1.12.0, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.1: - version "1.22.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== - dependencies: - is-core-module "^2.9.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - resolve@^2.0.0-next.4: version "2.0.0-next.4" resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660" @@ -10297,7 +10029,7 @@ ret@~0.1.10: retry@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" - integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= + integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== reusify@^1.0.4: version "1.0.4" @@ -10349,9 +10081,9 @@ rollup-plugin-terser@^7.0.0: terser "^5.0.0" rollup@^2.43.1: - version "2.72.1" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.72.1.tgz#861c94790537b10008f0ca0fbc60e631aabdd045" - integrity sha512-NTc5UGy/NWFGpSqF1lFY8z9Adri6uhyMLI6LvPAXdBKoPRFhIIiBUpt+Qg2awixqO3xvzSijjhnb4+QEZwJmxA== + version "2.79.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.1.tgz#bedee8faef7c9f93a2647ac0108748f497f081c7" + integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw== optionalDependencies: fsevents "~2.3.2" @@ -10375,9 +10107,9 @@ run-parallel@^1.1.9: queue-microtask "^1.2.2" rxjs@^7.8.0: - version "7.8.0" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.0.tgz#90a938862a82888ff4c7359811a595e14e1e09a4" - integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg== + version "7.8.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== dependencies: tslib "^2.1.0" @@ -10386,7 +10118,7 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0: +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -10403,7 +10135,7 @@ safe-regex-test@^1.0.0: safe-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg== dependencies: ret "~0.1.10" @@ -10464,19 +10196,10 @@ schema-utils@^2.6.5: ajv "^6.12.4" ajv-keywords "^3.5.2" -schema-utils@^3.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.0.0.tgz#67502f6aa2b66a2d4032b4279a2944978a0913ef" - integrity sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA== - dependencies: - "@types/json-schema" "^7.0.6" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - -schema-utils@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.2.tgz#36c10abca6f7577aeae136c804b0c741edeadc99" - integrity sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg== +schema-utils@^3.0, schema-utils@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" + integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== dependencies: "@types/json-schema" "^7.0.8" ajv "^6.12.5" @@ -10493,12 +10216,12 @@ scroll-behavior@^0.9.1: select-hose@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" - integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= + integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== selfsigned@^1.10.8: - version "1.10.8" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.8.tgz#0d17208b7d12c33f8eac85c41835f27fc3d81a30" - integrity sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w== + version "1.10.14" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.14.tgz#ee51d84d9dcecc61e07e4aba34f229ab525c1574" + integrity sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA== dependencies: node-forge "^0.10.0" @@ -10555,7 +10278,7 @@ serialize-javascript@^5.0.1: serve-index@^1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" - integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= + integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== dependencies: accepts "~1.3.4" batch "0.6.1" @@ -10578,7 +10301,7 @@ serve-static@1.15.0: set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== set-value@^2.0.0, set-value@^2.0.1: version "2.0.1" @@ -10593,7 +10316,7 @@ set-value@^2.0.0, set-value@^2.0.1: setimmediate@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== setprototypeof@1.1.0: version "1.1.0" @@ -10628,7 +10351,7 @@ shallow-equal@^1.2.1: shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== dependencies: shebang-regex "^1.0.0" @@ -10642,7 +10365,7 @@ shebang-command@^2.0.0: shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== shebang-regex@^3.0.0: version "3.0.0" @@ -10677,7 +10400,7 @@ sirv@^1.0.7: mrmime "^1.0.0" totalist "^1.0.0" -sisteransi@^1.0.4: +sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== @@ -10749,24 +10472,23 @@ snapdragon@^0.8.1: use "^3.1.0" sockjs-client@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.5.0.tgz#2f8ff5d4b659e0d092f7aba0b7c386bd2aa20add" - integrity sha512-8Dt3BDi4FYNrCFGTL/HtwVzkARrENdwOUf1ZoW/9p3M8lZdFT35jVdrHza+qgxuG9H3/shR4cuX/X9umUrjP8Q== + version "1.6.1" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.6.1.tgz#350b8eda42d6d52ddc030c39943364c11dcad806" + integrity sha512-2g0tjOR+fRs0amxENLi/q5TiJTqY+WXFOzb5UwXndlK6TO3U/mirZznpx6w34HVMoc3g7cY24yC/ZMIYnDlfkw== dependencies: - debug "^3.2.6" - eventsource "^1.0.7" - faye-websocket "^0.11.3" + debug "^3.2.7" + eventsource "^2.0.2" + faye-websocket "^0.11.4" inherits "^2.0.4" - json3 "^3.3.3" - url-parse "^1.4.7" + url-parse "^1.5.10" sockjs@^0.3.21: - version "0.3.21" - resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.21.tgz#b34ffb98e796930b60a0cfa11904d6a339a7d417" - integrity sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw== + version "0.3.24" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" + integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== dependencies: faye-websocket "^0.11.3" - uuid "^3.4.0" + uuid "^8.3.2" websocket-driver "^0.7.4" source-list-map@^2.0.0: @@ -10807,19 +10529,19 @@ source-map-support@~0.5.20: source-map "^0.6.0" source-map-url@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" - integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + version "0.4.1" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" + integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== source-map@0.5.6: version "0.5.6" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" - integrity sha1-dc449SvwczxafwwRjYEzSiu19BI= + integrity sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA== source-map@^0.5.6, source-map@^0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" @@ -10899,19 +10621,17 @@ split-string@^3.0.1, split-string@^3.0.2: dependencies: extend-shallow "^3.0.0" -split2@^3.1.1: - version "3.2.2" - resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" - integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== - dependencies: - readable-stream "^3.0.0" +split2@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" + integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== -ssri@^8.0.0: +ssri@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== @@ -10919,31 +10639,31 @@ ssri@^8.0.0: minipass "^3.1.1" stack-generator@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/stack-generator/-/stack-generator-2.0.5.tgz#fb00e5b4ee97de603e0773ea78ce944d81596c36" - integrity sha512-/t1ebrbHkrLrDuNMdeAcsvynWgoH/i4o8EGGfX7dEYDoTXOYVAkEpFdtshlvabzc6JlJ8Kf9YdFEoz7JkzGN9Q== + version "2.0.10" + resolved "https://registry.yarnpkg.com/stack-generator/-/stack-generator-2.0.10.tgz#8ae171e985ed62287d4f1ed55a1633b3fb53bb4d" + integrity sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ== dependencies: - stackframe "^1.1.1" + stackframe "^1.3.4" stack-utils@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.3.tgz#cd5f030126ff116b78ccb3c027fe302713b61277" - integrity sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw== + version "2.0.6" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== dependencies: escape-string-regexp "^2.0.0" -stackframe@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.2.0.tgz#52429492d63c62eb989804c11552e3d22e779303" - integrity sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA== +stackframe@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310" + integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== stacktrace-gps@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/stacktrace-gps/-/stacktrace-gps-3.0.4.tgz#7688dc2fc09ffb3a13165ebe0dbcaf41bcf0c69a" - integrity sha512-qIr8x41yZVSldqdqe6jciXEaSCKw1U8XTXpjDuy0ki/apyTn/r3w9hDAAQOhZdxvsC93H+WwwEu5cq5VemzYeg== + version "3.1.2" + resolved "https://registry.yarnpkg.com/stacktrace-gps/-/stacktrace-gps-3.1.2.tgz#0c40b24a9b119b20da4525c398795338966a2fb0" + integrity sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ== dependencies: source-map "0.5.6" - stackframe "^1.1.1" + stackframe "^1.3.4" stacktrace-js@^2.0.2: version "2.0.2" @@ -10957,7 +10677,7 @@ stacktrace-js@^2.0.2: static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g== dependencies: define-property "^0.2.5" object-copy "^0.1.0" @@ -10970,7 +10690,7 @@ statuses@2.0.1: "statuses@>= 1.4.0 < 2": version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== stop-iteration-iterator@^1.0.0: version "1.0.0" @@ -10999,20 +10719,19 @@ stream-http@^2.7.2: xtend "^4.0.0" string-argv@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" - integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== + version "0.3.2" + resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" + integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== string-length@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.1.tgz#4a973bf31ef77c4edbceadd6af2611996985f8a1" - integrity sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw== + version "4.0.2" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== dependencies: char-regex "^1.0.2" strip-ansi "^6.0.0" "string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - name string-width-cjs version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -11053,25 +10772,41 @@ string.prototype.matchall@^4.0.6, string.prototype.matchall@^4.0.8: regexp.prototype.flags "^1.4.3" side-channel "^1.0.4" -string.prototype.trimend@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0" - integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog== +string.prototype.trim@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" + integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== dependencies: call-bind "^1.0.2" define-properties "^1.1.4" - es-abstract "^1.19.5" + es-abstract "^1.20.4" -string.prototype.trimstart@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz#5466d93ba58cfa2134839f81d7f42437e8c01fef" - integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg== +string.prototype.trimend@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" + integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== dependencies: call-bind "^1.0.2" define-properties "^1.1.4" - es-abstract "^1.19.5" + es-abstract "^1.20.4" -string_decoder@^1.0.0, string_decoder@^1.1.1, string_decoder@~1.1.1: +string.prototype.trimstart@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" + integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string_decoder@^1.0.0, string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== @@ -11104,7 +10839,7 @@ stringz@^2.1.0: strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== dependencies: ansi-regex "^2.0.0" @@ -11116,16 +10851,16 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: ansi-regex "^4.1.0" strip-ansi@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" - integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== dependencies: ansi-regex "^6.0.1" strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== strip-bom@^4.0.0: version "4.0.0" @@ -11140,7 +10875,7 @@ strip-comments@^2.0.1: strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== strip-final-newline@^2.0.0: version "2.0.0" @@ -11264,15 +10999,15 @@ stylelint@^15.6.2: v8-compile-cache "^2.3.0" write-file-atomic "^5.0.1" -stylis@4.0.13: - version "4.0.13" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.0.13.tgz#f5db332e376d13cc84ecfe5dace9a2a51d954c91" - integrity sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag== +stylis@4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51" + integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw== substring-trie@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/substring-trie/-/substring-trie-1.0.2.tgz#7b42592391628b4f2cb17365c6cce4257c7b7af5" - integrity sha1-e0JZI5Fii08ssXNlxszkJXx7evU= + integrity sha512-klL9Z/pqyq1JZE1kAa9hxI3i0J2f6XQonARUOEO3qwdtI9I46qVFX10gwdfQBCkM2yKIKj29eZFtufTN4D6GLg== supports-color@^5.3.0: version "5.5.0" @@ -11367,13 +11102,13 @@ tapable@^2.2.0: integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== tar@^6.0.2: - version "6.1.11" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" - integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== + version "6.1.15" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.15.tgz#c9738b0b98845a3b344d334b8fa3041aaba53a69" + integrity sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A== dependencies: chownr "^2.0.0" fs-minipass "^2.0.0" - minipass "^3.0.0" + minipass "^5.0.0" minizlib "^2.1.1" mkdirp "^1.0.3" yallist "^4.0.0" @@ -11409,12 +11144,12 @@ terser-webpack-plugin@^1.4.3, terser-webpack-plugin@^4.2.3: webpack-sources "^1.4.3" terser@^5.0.0, terser@^5.3.4: - version "5.17.6" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.17.6.tgz#d810e75e1bb3350c799cd90ebefe19c9412c12de" - integrity sha512-V8QHcs8YuyLkLHsJO5ucyff1ykrLVsR4dNnS//L5Y3NiSXpbK1J+WMVUs67eI0KTxs9JtHhgEQpXQVHlHI92DQ== + version "5.18.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.18.0.tgz#dc811fb8e3481a875d545bda247c8730ee4dc76b" + integrity sha512-pdL757Ig5a0I+owA42l6tIuEycRuM7FPY4n62h44mRLRfnOxJkkOHd6i89dOpwZlpF6JXBwaAHF6yWzFrt+QyA== dependencies: - "@jridgewell/source-map" "^0.3.2" - acorn "^8.5.0" + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" commander "^2.20.0" source-map-support "~0.5.20" @@ -11467,21 +11202,21 @@ thunky@^1.0.2: integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== timers-browserify@^2.0.4: - version "2.0.11" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f" - integrity sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ== + version "2.0.12" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" + integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== dependencies: setimmediate "^1.0.4" tiny-invariant@^1.0.2: - version "1.1.0" - resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.1.0.tgz#634c5f8efdc27714b7f386c35e6760991d230875" - integrity sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw== + version "1.3.1" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" + integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== tiny-queue@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/tiny-queue/-/tiny-queue-0.2.1.tgz#25a67f2c6e253b2ca941977b5ef7442ef97a6046" - integrity sha1-JaZ/LG4lOyypQZd7XvdELvl6YEY= + integrity sha512-EijGsv7kzd9I9g0ByCl6h42BWNGUZrlCSejfrb3AKeHC33SGbASu1VDf5O3rRiiUOhAC9CHdZxFPbZu0HmR70A== tiny-warning@^1.0.0: version "1.0.3" @@ -11501,7 +11236,7 @@ tmpl@1.0.5: to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" - integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= + integrity sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA== to-fast-properties@^2.0.0: version "2.0.0" @@ -11511,14 +11246,14 @@ to-fast-properties@^2.0.0: to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg== dependencies: kind-of "^3.0.2" to-regex-range@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg== dependencies: is-number "^3.0.0" repeat-string "^1.6.1" @@ -11551,9 +11286,9 @@ totalist@^1.0.0: integrity sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g== tough-cookie@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.2.tgz#e53e84b85f24e0b65dd526f46628db6c85f6b874" - integrity sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ== + version "4.1.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" + integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== dependencies: psl "^1.1.33" punycode "^2.1.1" @@ -11563,7 +11298,7 @@ tough-cookie@^4.1.2: tr46@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" - integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= + integrity sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA== dependencies: punycode "^2.1.0" @@ -11584,7 +11319,7 @@ tr46@^4.1.1: tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== trim-newlines@^3.0.0: version "3.0.1" @@ -11592,26 +11327,26 @@ trim-newlines@^3.0.0: integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== tsconfig-paths@^3.14.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" - integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== + version "3.14.2" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" + integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== dependencies: "@types/json5" "^0.0.29" - json5 "^1.0.1" + json5 "^1.0.2" minimist "^1.2.6" strip-bom "^3.0.0" -tslib@2.5.0, tslib@^2.1.0, tslib@^2.5.0: +tslib@2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== -tslib@^1.8.1, tslib@^1.9.0: +tslib@^1.8.1: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.4.0: +tslib@^2.1.0, tslib@^2.4.0, tslib@^2.5.0: version "2.5.3" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.3.tgz#24944ba2d990940e6e982c4bea147aba80209913" integrity sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w== @@ -11626,7 +11361,7 @@ tsutils@^3.21.0: tty-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" - integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= + integrity sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw== twemoji-parser@^11.0.2: version "11.0.2" @@ -11653,7 +11388,7 @@ type-check@^0.4.0, type-check@~0.4.0: type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== dependencies: prelude-ls "~1.1.2" @@ -11662,11 +11397,6 @@ type-detect@4.0.8: resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== -type-fest@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" - integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== - type-fest@^0.16.0: version "0.16.0" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.16.0.tgz#3240b891a78b0deae910dbeb86553e552a148860" @@ -11705,16 +11435,20 @@ type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" -"typescript@^4.7 || 5": +typed-array-length@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" + +"typescript@^4.7 || 5", typescript@^5.0.4: version "5.1.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.3.tgz#8d84219244a6b40b6fb2b33cc1c062f715b9e826" integrity sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw== -typescript@^5.0.4: - version "5.0.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.0.4.tgz#b217fd20119bd61a94d4011274e0ab369058da3b" - integrity sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw== - unbox-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" @@ -11809,12 +11543,12 @@ universalify@^2.0.0: unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ== dependencies: has-value "^0.3.1" isobject "^3.0.0" @@ -11829,7 +11563,7 @@ upath@^1.1.1, upath@^1.2.0: resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== -update-browserslist-db@^1.0.10, update-browserslist-db@^1.0.11: +update-browserslist-db@^1.0.11: version "1.0.11" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== @@ -11847,9 +11581,9 @@ uri-js@^4.2.2: urix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== -url-parse@^1.4.3, url-parse@^1.4.7, url-parse@^1.5.3: +url-parse@^1.5.10, url-parse@^1.5.3: version "1.5.10" resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== @@ -11858,12 +11592,12 @@ url-parse@^1.4.3, url-parse@^1.4.7, url-parse@^1.5.3: requires-port "^1.0.0" url@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + version "0.11.1" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.1.tgz#26f90f615427eca1b9f4d6a28288c147e2302a32" + integrity sha512-rWS3H04/+mzzJkv0eZ7vEDGiQbgquI1fGfOad6zKvgYQi1SzMmhl7c/DdRGxhaWrVH6z0qWITo8rpnxK/RfEhA== dependencies: - punycode "1.3.2" - querystring "0.2.0" + punycode "^1.4.1" + qs "^6.11.0" use-composed-ref@^1.3.0: version "1.3.0" @@ -11907,7 +11641,7 @@ util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: util@0.10.3: version "0.10.3" resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" - integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= + integrity sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ== dependencies: inherits "2.0.1" @@ -11921,13 +11655,18 @@ util@^0.11.0: utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== -uuid@^3.3.2, uuid@^3.4.0: +uuid@^3.3.2: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + uuid@^9.0.0: version "9.0.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" @@ -11939,9 +11678,9 @@ v8-compile-cache@^2.1.1, v8-compile-cache@^2.3.0: integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== v8-to-istanbul@^9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz#b6f994b0b5d4ef255e17a0d17dc444a9f5132fa4" - integrity sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w== + version "9.1.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz#1b83ed4e397f58c85c266a570fc2558b5feb9265" + integrity sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA== dependencies: "@jridgewell/trace-mapping" "^0.3.12" "@types/istanbul-lib-coverage" "^2.0.1" @@ -11963,7 +11702,7 @@ value-equal@^1.0.1: vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== vm-browserify@^1.0.1: version "1.1.2" @@ -11987,7 +11726,7 @@ walker@^1.0.8: warning@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/warning/-/warning-3.0.0.tgz#32e5377cb572de4ab04753bdf8821c01ed605b7c" - integrity sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w= + integrity sha512-jMBt6pUrKn5I+OGgtQ4YZLdhIeJmObddh6CsibPxyQ5yPZm1XExSyzC1LCNX7BzhxWgiHmizBWJTHJIjMjTQYQ== dependencies: loose-envify "^1.0.0" @@ -11998,23 +11737,23 @@ warning@^4.0.1, warning@^4.0.3: dependencies: loose-envify "^1.0.0" -watchpack-chokidar2@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz#9948a1866cbbd6cb824dea13a7ed691f6c8ddff0" - integrity sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA== +watchpack-chokidar2@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957" + integrity sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww== dependencies: chokidar "^2.1.8" watchpack@^1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.4.tgz#6e9da53b3c80bb2d6508188f5b200410866cd30b" - integrity sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg== + version "1.7.5" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.5.tgz#1267e6c55e0b9b5be44c2023aed5437a2c26c453" + integrity sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ== dependencies: graceful-fs "^4.1.2" neo-async "^2.5.0" optionalDependencies: chokidar "^3.4.1" - watchpack-chokidar2 "^2.0.0" + watchpack-chokidar2 "^2.0.1" wbuf@^1.1.0, wbuf@^1.7.3: version "1.7.3" @@ -12026,7 +11765,7 @@ wbuf@^1.1.0, wbuf@^1.7.3: webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== webidl-conversions@^4.0.2: version "4.0.2" @@ -12087,9 +11826,9 @@ webpack-cli@^3.3.12: yargs "^13.3.2" webpack-dev-middleware@^3.7.2: - version "3.7.2" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz#0019c3db716e3fa5cecbf64f2ab88a74bab331f3" - integrity sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw== + version "3.7.3" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz#0639372b143262e2b84ab95d3b91a7597061c2c5" + integrity sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ== dependencies: memory-fs "^0.4.1" mime "^2.4.4" @@ -12234,7 +11973,7 @@ whatwg-url@^12.0.0, whatwg-url@^12.0.1: whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== dependencies: tr46 "~0.0.3" webidl-conversions "^3.0.0" @@ -12270,9 +12009,9 @@ which-collection@^1.0.1: is-weakset "^2.0.1" which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + version "2.0.1" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" + integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== which-typed-array@^1.1.9: version "1.1.9" @@ -12313,9 +12052,9 @@ wide-align@^1.1.5: string-width "^1.0.2 || 2 || 3 || 4" wildcard@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" - integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== + version "2.0.1" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" + integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== word-wrap@^1.2.3, word-wrap@~1.2.3: version "1.2.3" @@ -12492,7 +12231,6 @@ workbox-window@7.0.0, workbox-window@^7.0.0: workbox-core "7.0.0" "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: - name wrap-ansi-cjs version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -12587,9 +12325,9 @@ y18n@^4.0.0: integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== y18n@^5.0.5: - version "5.0.5" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.5.tgz#8769ec08d03b1ea2df2500acef561743bbb9ab18" - integrity sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg== + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== yallist@4.0.0, yallist@^4.0.0: version "4.0.0" @@ -12601,15 +12339,15 @@ yallist@^3.0.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== -yaml@^1.10.0, yaml@^1.7.2: +yaml@^1.10.0: version "1.10.2" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== yaml@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.2.2.tgz#ec551ef37326e6d42872dad1970300f8eb83a073" - integrity sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA== + version "2.3.1" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.1.tgz#02fe0975d23cd441242aa7204e09fc28ac2ac33b" + integrity sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ== yargs-parser@^13.1.2: version "13.1.2" @@ -12666,4 +12404,4 @@ yocto-queue@^0.1.0: zlibjs@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/zlibjs/-/zlibjs-0.3.1.tgz#50197edb28a1c42ca659cc8b4e6a9ddd6d444554" - integrity sha1-UBl+2yihxCymWcyLTmqd3W1ERVQ= + integrity sha512-+J9RrgTKOmlxFSDHo0pI1xM6BLVUv+o0ZT9ANtCxGkjIVCCUdx9alUF8Gm+dGLKbkkkidWIHFDZHDMpfITt4+w== From b10c05e702f9d53a27100d9bb0accf064c8ab02d Mon Sep 17 00:00:00 2001 From: Daniel M Brasil Date: Thu, 15 Jun 2023 05:19:51 -0300 Subject: [PATCH 045/118] Migrate to request specs in `/api/v1/lists` (#25443) --- .../api/v1/lists_controller_spec.rb | 80 ------ spec/requests/api/v1/lists_spec.rb | 247 ++++++++++++++++++ 2 files changed, 247 insertions(+), 80 deletions(-) delete mode 100644 spec/controllers/api/v1/lists_controller_spec.rb create mode 100644 spec/requests/api/v1/lists_spec.rb diff --git a/spec/controllers/api/v1/lists_controller_spec.rb b/spec/controllers/api/v1/lists_controller_spec.rb deleted file mode 100644 index 15b9840ce1..0000000000 --- a/spec/controllers/api/v1/lists_controller_spec.rb +++ /dev/null @@ -1,80 +0,0 @@ -# frozen_string_literal: true - -require 'rails_helper' - -RSpec.describe Api::V1::ListsController do - render_views - - let!(:user) { Fabricate(:user) } - let!(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } - let!(:list) { Fabricate(:list, account: user.account) } - - before { allow(controller).to receive(:doorkeeper_token) { token } } - - describe 'GET #index' do - let(:scopes) { 'read:lists' } - - it 'returns http success' do - get :index - expect(response).to have_http_status(200) - end - end - - describe 'GET #show' do - let(:scopes) { 'read:lists' } - - it 'returns http success' do - get :show, params: { id: list.id } - expect(response).to have_http_status(200) - end - end - - describe 'POST #create' do - let(:scopes) { 'write:lists' } - - before do - post :create, params: { title: 'Foo bar' } - end - - it 'returns http success' do - expect(response).to have_http_status(200) - end - - it 'creates list' do - expect(List.where(account: user.account).count).to eq 2 - expect(List.last.title).to eq 'Foo bar' - end - end - - describe 'PUT #update' do - let(:scopes) { 'write:lists' } - - before do - put :update, params: { id: list.id, title: 'Updated title' } - end - - it 'returns http success' do - expect(response).to have_http_status(200) - end - - it 'updates the list' do - expect(list.reload.title).to eq 'Updated title' - end - end - - describe 'DELETE #destroy' do - let(:scopes) { 'write:lists' } - - before do - delete :destroy, params: { id: list.id } - end - - it 'returns http success' do - expect(response).to have_http_status(200) - end - - it 'deletes the list' do - expect(List.find_by(id: list.id)).to be_nil - end - end -end diff --git a/spec/requests/api/v1/lists_spec.rb b/spec/requests/api/v1/lists_spec.rb new file mode 100644 index 0000000000..383e09d0c3 --- /dev/null +++ b/spec/requests/api/v1/lists_spec.rb @@ -0,0 +1,247 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe 'Lists' do + let(:user) { Fabricate(:user) } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } + let(:scopes) { 'read:lists write:lists' } + let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } + + describe 'GET /api/v1/lists' do + subject do + get '/api/v1/lists', headers: headers + end + + let!(:lists) do + [ + Fabricate(:list, account: user.account, title: 'first list', replies_policy: :followed), + Fabricate(:list, account: user.account, title: 'second list', replies_policy: :list), + Fabricate(:list, account: user.account, title: 'third list', replies_policy: :none), + Fabricate(:list, account: user.account, title: 'fourth list', exclusive: true), + ] + end + + let(:expected_response) do + lists.map do |list| + { + id: list.id.to_s, + title: list.title, + replies_policy: list.replies_policy, + exclusive: list.exclusive, + } + end + end + + before do + Fabricate(:list) + end + + it_behaves_like 'forbidden for wrong scope', 'write write:lists' + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + + it 'returns the expected lists' do + subject + + expect(body_as_json).to match_array(expected_response) + end + end + + describe 'GET /api/v1/lists/:id' do + subject do + get "/api/v1/lists/#{list.id}", headers: headers + end + + let(:list) { Fabricate(:list, account: user.account) } + + it_behaves_like 'forbidden for wrong scope', 'write write:lists' + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + + it 'returns the requested list correctly' do + subject + + expect(body_as_json).to eq({ + id: list.id.to_s, + title: list.title, + replies_policy: list.replies_policy, + exclusive: list.exclusive, + }) + end + + context 'when the list belongs to a different user' do + let(:list) { Fabricate(:list) } + + it 'returns http not found' do + subject + + expect(response).to have_http_status(404) + end + end + + context 'when the list does not exist' do + it 'returns http not found' do + get '/api/v1/lists/-1', headers: headers + + expect(response).to have_http_status(404) + end + end + end + + describe 'POST /api/v1/lists' do + subject do + post '/api/v1/lists', headers: headers, params: params + end + + let(:params) { { title: 'my list', replies_policy: 'none', exclusive: 'true' } } + + it_behaves_like 'forbidden for wrong scope', 'read read:lists' + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + + it 'returns the new list' do + subject + + expect(body_as_json).to match(a_hash_including(title: 'my list', replies_policy: 'none', exclusive: true)) + end + + it 'creates a list' do + subject + + expect(List.where(account: user.account).count).to eq(1) + end + + context 'when a title is not given' do + let(:params) { { title: '' } } + + it 'returns http unprocessable entity' do + subject + + expect(response).to have_http_status(422) + end + end + + context 'when the given replies_policy is invalid' do + let(:params) { { title: 'a list', replies_policy: 'whatever' } } + + it 'returns http unprocessable entity' do + subject + + expect(response).to have_http_status(422) + end + end + end + + describe 'PUT /api/v1/lists/:id' do + subject do + put "/api/v1/lists/#{list.id}", headers: headers, params: params + end + + let(:list) { Fabricate(:list, account: user.account, title: 'my list') } + let(:params) { { title: 'list', replies_policy: 'followed', exclusive: 'true' } } + + it_behaves_like 'forbidden for wrong scope', 'read read:lists' + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + + it 'returns the updated list' do + subject + + list.reload + + expect(body_as_json).to eq({ + id: list.id.to_s, + title: list.title, + replies_policy: list.replies_policy, + exclusive: list.exclusive, + }) + end + + it 'updates the list title' do + expect { subject }.to change { list.reload.title }.from('my list').to('list') + end + + it 'updates the list replies_policy' do + expect { subject }.to change { list.reload.replies_policy }.from('list').to('followed') + end + + it 'updates the list exclusive' do + expect { subject }.to change { list.reload.exclusive }.from(false).to(true) + end + + context 'when the list does not exist' do + it 'returns http not found' do + put '/api/v1/lists/-1', headers: headers, params: params + + expect(response).to have_http_status(404) + end + end + + context 'when the list belongs to another user' do + let(:list) { Fabricate(:list) } + + it 'returns http not found' do + subject + + expect(response).to have_http_status(404) + end + end + end + + describe 'DELETE /api/v1/lists/:id' do + subject do + delete "/api/v1/lists/#{list.id}", headers: headers + end + + let(:list) { Fabricate(:list, account: user.account) } + + it_behaves_like 'forbidden for wrong scope', 'read read:lists' + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + + it 'deletes the list' do + subject + + expect(List.where(id: list.id)).to_not exist + end + + context 'when the list does not exist' do + it 'returns http not found' do + delete '/api/v1/lists/-1', headers: headers + + expect(response).to have_http_status(404) + end + end + + context 'when the list belongs to another user' do + let(:list) { Fabricate(:list) } + + it 'returns http not found' do + subject + + expect(response).to have_http_status(404) + end + end + end +end From e686a54064191f23898e707b2fee68ad2feaa358 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 15 Jun 2023 10:41:04 +0200 Subject: [PATCH 046/118] Update dependency better_errors to v2.10.1 (#25445) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 646a402a13..093771a9b7 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -113,7 +113,7 @@ GEM aws-sigv4 (1.5.2) aws-eventstream (~> 1, >= 1.0.2) bcrypt (3.1.18) - better_errors (2.10.0) + better_errors (2.10.1) erubi (>= 1.0.0) rack (>= 0.9.0) rouge (>= 1.0.0) From b276b3bb83d33c7836bd19a12972c790a77eb04c Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Thu, 15 Jun 2023 17:14:46 -0400 Subject: [PATCH 047/118] Remove Ruby GC config from spec helper (#25455) --- spec/spec_helper.rb | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index dedb9719cd..ed228abebf 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,7 +1,5 @@ # frozen_string_literal: true -GC.disable - if ENV['DISABLE_SIMPLECOV'] != 'true' require 'simplecov' SimpleCov.start 'rails' do @@ -13,8 +11,6 @@ if ENV['DISABLE_SIMPLECOV'] != 'true' end end -gc_counter = -1 - RSpec.configure do |config| config.example_status_persistence_file_path = 'tmp/rspec/examples.txt' config.expect_with :rspec do |expectations| @@ -37,21 +33,8 @@ RSpec.configure do |config| end config.after :suite do - gc_counter = 0 FileUtils.rm_rf(Dir[Rails.root.join('spec', 'test_files')]) end - - config.after :each do - gc_counter += 1 - - if gc_counter > 19 - GC.enable - GC.start - GC.disable - - gc_counter = 0 - end - end end def body_as_json From c9d06d10d4e936ee4f741ec2fecca7f91ca61997 Mon Sep 17 00:00:00 2001 From: Claire Date: Fri, 16 Jun 2023 12:03:06 +0200 Subject: [PATCH 048/118] Fix non-interactive upload container being given a `button` role and tabIndex (#25462) --- app/javascript/mastodon/features/compose/components/upload.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/mastodon/features/compose/components/upload.jsx b/app/javascript/mastodon/features/compose/components/upload.jsx index 9075f20625..a18134b0f0 100644 --- a/app/javascript/mastodon/features/compose/components/upload.jsx +++ b/app/javascript/mastodon/features/compose/components/upload.jsx @@ -46,7 +46,7 @@ export default class Upload extends ImmutablePureComponent { const y = ((focusY / -2) + .5) * 100; return ( -
+
{({ scale }) => (
From 9e245d147bcb2c72cc552ff8c276a1c34e2f686d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 16 Jun 2023 14:23:58 +0200 Subject: [PATCH 049/118] Update dependency aws-sdk-s3 to v1.125.0 (#25458) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 093771a9b7..bdbeb79221 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -97,16 +97,16 @@ GEM attr_required (1.0.1) awrence (1.2.1) aws-eventstream (1.2.0) - aws-partitions (1.779.0) - aws-sdk-core (3.174.0) + aws-partitions (1.780.0) + aws-sdk-core (3.175.0) aws-eventstream (~> 1, >= 1.0.2) aws-partitions (~> 1, >= 1.651.0) aws-sigv4 (~> 1.5) jmespath (~> 1, >= 1.6.1) - aws-sdk-kms (1.66.0) + aws-sdk-kms (1.67.0) aws-sdk-core (~> 3, >= 3.174.0) aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.124.0) + aws-sdk-s3 (1.125.0) aws-sdk-core (~> 3, >= 3.174.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.4) From f815bd5fd9229c88d09aa299b7302987897884e0 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sun, 11 Jun 2023 04:47:07 +0200 Subject: [PATCH 050/118] [Glitch] Change "bot" label to "automated" Port 432a5d2d4bc307d9a9c7b484de96d3eb7926fa93 to glitch-soc Signed-off-by: Claire --- .../flavours/glitch/features/account/components/header.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/flavours/glitch/features/account/components/header.jsx b/app/javascript/flavours/glitch/features/account/components/header.jsx index 5d16dc44d8..ca2eb37eb1 100644 --- a/app/javascript/flavours/glitch/features/account/components/header.jsx +++ b/app/javascript/flavours/glitch/features/account/components/header.jsx @@ -314,7 +314,7 @@ class Header extends ImmutablePureComponent { let badge; if (account.get('bot')) { - badge = (
); + badge = (
); } else if (account.get('group')) { badge = (
); } else { From cdec45eca9ab9008f36f6efc88707aebca4235f5 Mon Sep 17 00:00:00 2001 From: alfe Date: Sun, 11 Jun 2023 11:47:18 +0900 Subject: [PATCH 051/118] [Glitch] Rewrite as FC and TS Port dfaf59d99a2aa1f913608faee978bc3e1586a3ce to glitch-soc Signed-off-by: Claire --- .../glitch/components/load_pending.jsx | 23 ------------------- .../glitch/components/load_pending.tsx | 18 +++++++++++++++ .../glitch/components/scrollable_list.jsx | 2 +- 3 files changed, 19 insertions(+), 24 deletions(-) delete mode 100644 app/javascript/flavours/glitch/components/load_pending.jsx create mode 100644 app/javascript/flavours/glitch/components/load_pending.tsx diff --git a/app/javascript/flavours/glitch/components/load_pending.jsx b/app/javascript/flavours/glitch/components/load_pending.jsx deleted file mode 100644 index e9c1a97836..0000000000 --- a/app/javascript/flavours/glitch/components/load_pending.jsx +++ /dev/null @@ -1,23 +0,0 @@ -import PropTypes from 'prop-types'; -import { PureComponent } from 'react'; - -import { FormattedMessage } from 'react-intl'; - -export default class LoadPending extends PureComponent { - - static propTypes = { - onClick: PropTypes.func, - count: PropTypes.number, - }; - - render() { - const { count } = this.props; - - return ( - - ); - } - -} diff --git a/app/javascript/flavours/glitch/components/load_pending.tsx b/app/javascript/flavours/glitch/components/load_pending.tsx new file mode 100644 index 0000000000..f7589622ed --- /dev/null +++ b/app/javascript/flavours/glitch/components/load_pending.tsx @@ -0,0 +1,18 @@ +import { FormattedMessage } from 'react-intl'; + +interface Props { + onClick: (event: React.MouseEvent) => void; + count: number; +} + +export const LoadPending: React.FC = ({ onClick, count }) => { + return ( + + ); +}; diff --git a/app/javascript/flavours/glitch/components/scrollable_list.jsx b/app/javascript/flavours/glitch/components/scrollable_list.jsx index f8a12c60c1..d6ca7ab25a 100644 --- a/app/javascript/flavours/glitch/components/scrollable_list.jsx +++ b/app/javascript/flavours/glitch/components/scrollable_list.jsx @@ -16,7 +16,7 @@ import IntersectionObserverWrapper from 'flavours/glitch/features/ui/util/inters import { attachFullscreenListener, detachFullscreenListener, isFullscreen } from '../features/ui/util/fullscreen'; import { LoadMore } from './load_more'; -import LoadPending from './load_pending'; +import { LoadPending } from './load_pending'; import LoadingIndicator from './loading_indicator'; const MOUSE_IDLE_DELAY = 300; From 0a212cfa7f9e53cc481cfdcb08ac35b0a35995ac Mon Sep 17 00:00:00 2001 From: Renaud Chaput Date: Tue, 13 Jun 2023 15:05:40 +0200 Subject: [PATCH 052/118] [Glitch] Add missing report category translation Port 1cb4514d0e0ed349acbfe72ec87f3187a0cf613a to glitch-soc Signed-off-by: Claire --- .../glitch/features/notifications/components/report.jsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/javascript/flavours/glitch/features/notifications/components/report.jsx b/app/javascript/flavours/glitch/features/notifications/components/report.jsx index 70293e2100..fee4f87fcf 100644 --- a/app/javascript/flavours/glitch/features/notifications/components/report.jsx +++ b/app/javascript/flavours/glitch/features/notifications/components/report.jsx @@ -8,10 +8,12 @@ import ImmutablePureComponent from 'react-immutable-pure-component'; import AvatarOverlay from 'flavours/glitch/components/avatar_overlay'; import { RelativeTimestamp } from 'flavours/glitch/components/relative_timestamp'; +// This needs to be kept in sync with app/models/report.rb const messages = defineMessages({ openReport: { id: 'report_notification.open', defaultMessage: 'Open report' }, other: { id: 'report_notification.categories.other', defaultMessage: 'Other' }, spam: { id: 'report_notification.categories.spam', defaultMessage: 'Spam' }, + legal: { id: 'report_notification.categories.legal', defaultMessage: 'Legal' }, violation: { id: 'report_notification.categories.violation', defaultMessage: 'Rule violation' }, }); From 9bf63257fbf78b2e5bd2f529400494ec9a572cf5 Mon Sep 17 00:00:00 2001 From: alfe Date: Wed, 14 Jun 2023 02:26:25 +0900 Subject: [PATCH 053/118] [Glitch] Rewrite `` as FC and TS (#25364) Port a86886b1fdc927ed51810fb6b43a0458bedf1cbb to glitch-soc Signed-off-by: Claire --- .../glitch/components/circular_progress.tsx | 27 ++++++++++++++++ .../glitch/components/dropdown_menu.jsx | 3 +- .../glitch/components/loading_indicator.jsx | 31 ------------------- .../glitch/components/loading_indicator.tsx | 7 +++++ .../glitch/components/scrollable_list.jsx | 2 +- .../glitch/features/account_gallery/index.jsx | 2 +- .../features/account_timeline/index.jsx | 2 +- .../flavours/glitch/features/blocks/index.jsx | 2 +- .../glitch/features/directory/index.jsx | 2 +- .../glitch/features/domain_blocks/index.jsx | 2 +- .../glitch/features/explore/links.jsx | 2 +- .../glitch/features/explore/results.jsx | 2 +- .../glitch/features/explore/suggestions.jsx | 2 +- .../flavours/glitch/features/explore/tags.jsx | 2 +- .../glitch/features/favourites/index.jsx | 2 +- .../glitch/features/followers/index.jsx | 2 +- .../glitch/features/following/index.jsx | 2 +- .../glitch/features/list_timeline/index.jsx | 2 +- .../flavours/glitch/features/lists/index.jsx | 2 +- .../flavours/glitch/features/mutes/index.jsx | 2 +- .../glitch/features/reblogs/index.jsx | 2 +- .../glitch/features/report/statuses.jsx | 2 +- .../flavours/glitch/features/status/index.jsx | 2 +- .../features/ui/components/modal_loading.jsx | 2 +- 24 files changed, 55 insertions(+), 53 deletions(-) create mode 100644 app/javascript/flavours/glitch/components/circular_progress.tsx delete mode 100644 app/javascript/flavours/glitch/components/loading_indicator.jsx create mode 100644 app/javascript/flavours/glitch/components/loading_indicator.tsx diff --git a/app/javascript/flavours/glitch/components/circular_progress.tsx b/app/javascript/flavours/glitch/components/circular_progress.tsx new file mode 100644 index 0000000000..850eb93e48 --- /dev/null +++ b/app/javascript/flavours/glitch/components/circular_progress.tsx @@ -0,0 +1,27 @@ +interface Props { + size: number; + strokeWidth: number; +} + +export const CircularProgress: React.FC = ({ size, strokeWidth }) => { + const viewBox = `0 0 ${size} ${size}`; + const radius = (size - strokeWidth) / 2; + + return ( + + + + ); +}; diff --git a/app/javascript/flavours/glitch/components/dropdown_menu.jsx b/app/javascript/flavours/glitch/components/dropdown_menu.jsx index 5294244ece..0416df5d45 100644 --- a/app/javascript/flavours/glitch/components/dropdown_menu.jsx +++ b/app/javascript/flavours/glitch/components/dropdown_menu.jsx @@ -8,8 +8,7 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import { supportsPassiveEvents } from 'detect-passive-events'; import Overlay from 'react-overlays/Overlay'; -import { CircularProgress } from 'flavours/glitch/components/loading_indicator'; - +import { CircularProgress } from "./circular_progress"; import { IconButton } from './icon_button'; const listenerOptions = supportsPassiveEvents ? { passive: true, capture: true } : true; diff --git a/app/javascript/flavours/glitch/components/loading_indicator.jsx b/app/javascript/flavours/glitch/components/loading_indicator.jsx deleted file mode 100644 index 708b71d0f0..0000000000 --- a/app/javascript/flavours/glitch/components/loading_indicator.jsx +++ /dev/null @@ -1,31 +0,0 @@ -import PropTypes from 'prop-types'; - -export const CircularProgress = ({ size, strokeWidth }) => { - const viewBox = `0 0 ${size} ${size}`; - const radius = (size - strokeWidth) / 2; - - return ( - - - - ); -}; - -CircularProgress.propTypes = { - size: PropTypes.number.isRequired, - strokeWidth: PropTypes.number.isRequired, -}; - -const LoadingIndicator = () => ( -
- -
-); - -export default LoadingIndicator; diff --git a/app/javascript/flavours/glitch/components/loading_indicator.tsx b/app/javascript/flavours/glitch/components/loading_indicator.tsx new file mode 100644 index 0000000000..6bc24a0d61 --- /dev/null +++ b/app/javascript/flavours/glitch/components/loading_indicator.tsx @@ -0,0 +1,7 @@ +import { CircularProgress } from './circular_progress'; + +export const LoadingIndicator: React.FC = () => ( +
+ +
+); diff --git a/app/javascript/flavours/glitch/components/scrollable_list.jsx b/app/javascript/flavours/glitch/components/scrollable_list.jsx index d6ca7ab25a..8d18c2081b 100644 --- a/app/javascript/flavours/glitch/components/scrollable_list.jsx +++ b/app/javascript/flavours/glitch/components/scrollable_list.jsx @@ -17,7 +17,7 @@ import { attachFullscreenListener, detachFullscreenListener, isFullscreen } from import { LoadMore } from './load_more'; import { LoadPending } from './load_pending'; -import LoadingIndicator from './loading_indicator'; +import { LoadingIndicator } from './loading_indicator'; const MOUSE_IDLE_DELAY = 300; diff --git a/app/javascript/flavours/glitch/features/account_gallery/index.jsx b/app/javascript/flavours/glitch/features/account_gallery/index.jsx index 5b196ebb37..2da679fc27 100644 --- a/app/javascript/flavours/glitch/features/account_gallery/index.jsx +++ b/app/javascript/flavours/glitch/features/account_gallery/index.jsx @@ -10,7 +10,7 @@ import { lookupAccount, fetchAccount } from 'flavours/glitch/actions/accounts'; import { openModal } from 'flavours/glitch/actions/modal'; import { expandAccountMediaTimeline } from 'flavours/glitch/actions/timelines'; import { LoadMore } from 'flavours/glitch/components/load_more'; -import LoadingIndicator from 'flavours/glitch/components/loading_indicator'; +import { LoadingIndicator } from 'flavours/glitch/components/loading_indicator'; import ScrollContainer from 'flavours/glitch/containers/scroll_container'; import ProfileColumnHeader from 'flavours/glitch/features/account/components/profile_column_header'; import HeaderContainer from 'flavours/glitch/features/account_timeline/containers/header_container'; diff --git a/app/javascript/flavours/glitch/features/account_timeline/index.jsx b/app/javascript/flavours/glitch/features/account_timeline/index.jsx index 1fe63e9957..03c989e969 100644 --- a/app/javascript/flavours/glitch/features/account_timeline/index.jsx +++ b/app/javascript/flavours/glitch/features/account_timeline/index.jsx @@ -16,7 +16,7 @@ import { getAccountHidden } from 'flavours/glitch/selectors'; import { fetchFeaturedTags } from '../../actions/featured_tags'; import { expandAccountFeaturedTimeline, expandAccountTimeline } from '../../actions/timelines'; -import LoadingIndicator from '../../components/loading_indicator'; +import { LoadingIndicator } from '../../components/loading_indicator'; import StatusList from '../../components/status_list'; import Column from '../ui/components/column'; diff --git a/app/javascript/flavours/glitch/features/blocks/index.jsx b/app/javascript/flavours/glitch/features/blocks/index.jsx index 202d38d0ed..aa5479b208 100644 --- a/app/javascript/flavours/glitch/features/blocks/index.jsx +++ b/app/javascript/flavours/glitch/features/blocks/index.jsx @@ -10,7 +10,7 @@ import { debounce } from 'lodash'; import { fetchBlocks, expandBlocks } from 'flavours/glitch/actions/blocks'; import ColumnBackButtonSlim from 'flavours/glitch/components/column_back_button_slim'; -import LoadingIndicator from 'flavours/glitch/components/loading_indicator'; +import { LoadingIndicator } from 'flavours/glitch/components/loading_indicator'; import AccountContainer from 'flavours/glitch/containers/account_container'; import Column from 'flavours/glitch/features/ui/components/column'; diff --git a/app/javascript/flavours/glitch/features/directory/index.jsx b/app/javascript/flavours/glitch/features/directory/index.jsx index c9ab38c8f8..e1db3180fa 100644 --- a/app/javascript/flavours/glitch/features/directory/index.jsx +++ b/app/javascript/flavours/glitch/features/directory/index.jsx @@ -14,7 +14,7 @@ import { fetchDirectory, expandDirectory } from 'flavours/glitch/actions/directo import Column from 'flavours/glitch/components/column'; import ColumnHeader from 'flavours/glitch/components/column_header'; import { LoadMore } from 'flavours/glitch/components/load_more'; -import LoadingIndicator from 'flavours/glitch/components/loading_indicator'; +import { LoadingIndicator } from 'flavours/glitch/components/loading_indicator'; import { RadioButton } from 'flavours/glitch/components/radio_button'; import ScrollContainer from 'flavours/glitch/containers/scroll_container'; diff --git a/app/javascript/flavours/glitch/features/domain_blocks/index.jsx b/app/javascript/flavours/glitch/features/domain_blocks/index.jsx index c7be4d9338..c492552c02 100644 --- a/app/javascript/flavours/glitch/features/domain_blocks/index.jsx +++ b/app/javascript/flavours/glitch/features/domain_blocks/index.jsx @@ -14,7 +14,7 @@ import ScrollableList from 'flavours/glitch/components/scrollable_list'; import { fetchDomainBlocks, expandDomainBlocks } from '../../actions/domain_blocks'; import ColumnBackButtonSlim from '../../components/column_back_button_slim'; -import LoadingIndicator from '../../components/loading_indicator'; +import { LoadingIndicator } from '../../components/loading_indicator'; import DomainContainer from '../../containers/domain_container'; import Column from '../ui/components/column'; diff --git a/app/javascript/flavours/glitch/features/explore/links.jsx b/app/javascript/flavours/glitch/features/explore/links.jsx index fd80ecb93f..ca7d948625 100644 --- a/app/javascript/flavours/glitch/features/explore/links.jsx +++ b/app/javascript/flavours/glitch/features/explore/links.jsx @@ -8,7 +8,7 @@ import { connect } from 'react-redux'; import { fetchTrendingLinks } from 'flavours/glitch/actions/trends'; import DismissableBanner from 'flavours/glitch/components/dismissable_banner'; -import LoadingIndicator from 'flavours/glitch/components/loading_indicator'; +import { LoadingIndicator } from 'flavours/glitch/components/loading_indicator'; import Story from './components/story'; diff --git a/app/javascript/flavours/glitch/features/explore/results.jsx b/app/javascript/flavours/glitch/features/explore/results.jsx index d4523a583f..d764ac93b2 100644 --- a/app/javascript/flavours/glitch/features/explore/results.jsx +++ b/app/javascript/flavours/glitch/features/explore/results.jsx @@ -12,7 +12,7 @@ import { connect } from 'react-redux'; import { expandSearch } from 'flavours/glitch/actions/search'; import { ImmutableHashtag as Hashtag } from 'flavours/glitch/components/hashtag'; import { LoadMore } from 'flavours/glitch/components/load_more'; -import LoadingIndicator from 'flavours/glitch/components/loading_indicator'; +import { LoadingIndicator } from 'flavours/glitch/components/loading_indicator'; import Account from 'flavours/glitch/containers/account_container'; import Status from 'flavours/glitch/containers/status_container'; diff --git a/app/javascript/flavours/glitch/features/explore/suggestions.jsx b/app/javascript/flavours/glitch/features/explore/suggestions.jsx index b6e50eedef..dbe135920d 100644 --- a/app/javascript/flavours/glitch/features/explore/suggestions.jsx +++ b/app/javascript/flavours/glitch/features/explore/suggestions.jsx @@ -7,7 +7,7 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import { connect } from 'react-redux'; import { fetchSuggestions, dismissSuggestion } from 'flavours/glitch/actions/suggestions'; -import LoadingIndicator from 'flavours/glitch/components/loading_indicator'; +import { LoadingIndicator } from 'flavours/glitch/components/loading_indicator'; import AccountCard from 'flavours/glitch/features/directory/components/account_card'; const mapStateToProps = state => ({ diff --git a/app/javascript/flavours/glitch/features/explore/tags.jsx b/app/javascript/flavours/glitch/features/explore/tags.jsx index c79543dd5f..5f672a90d1 100644 --- a/app/javascript/flavours/glitch/features/explore/tags.jsx +++ b/app/javascript/flavours/glitch/features/explore/tags.jsx @@ -9,7 +9,7 @@ import { connect } from 'react-redux'; import { fetchTrendingHashtags } from 'flavours/glitch/actions/trends'; import DismissableBanner from 'flavours/glitch/components/dismissable_banner'; import { ImmutableHashtag as Hashtag } from 'flavours/glitch/components/hashtag'; -import LoadingIndicator from 'flavours/glitch/components/loading_indicator'; +import { LoadingIndicator } from 'flavours/glitch/components/loading_indicator'; diff --git a/app/javascript/flavours/glitch/features/favourites/index.jsx b/app/javascript/flavours/glitch/features/favourites/index.jsx index 86ef9ab142..a5f21e577e 100644 --- a/app/javascript/flavours/glitch/features/favourites/index.jsx +++ b/app/javascript/flavours/glitch/features/favourites/index.jsx @@ -11,7 +11,7 @@ import { connect } from 'react-redux'; import { fetchFavourites } from 'flavours/glitch/actions/interactions'; import ColumnHeader from 'flavours/glitch/components/column_header'; import { Icon } from 'flavours/glitch/components/icon'; -import LoadingIndicator from 'flavours/glitch/components/loading_indicator'; +import { LoadingIndicator } from 'flavours/glitch/components/loading_indicator'; import ScrollableList from 'flavours/glitch/components/scrollable_list'; import AccountContainer from 'flavours/glitch/containers/account_container'; import Column from 'flavours/glitch/features/ui/components/column'; diff --git a/app/javascript/flavours/glitch/features/followers/index.jsx b/app/javascript/flavours/glitch/features/followers/index.jsx index 2f586e143b..935a0223e5 100644 --- a/app/javascript/flavours/glitch/features/followers/index.jsx +++ b/app/javascript/flavours/glitch/features/followers/index.jsx @@ -14,7 +14,7 @@ import { fetchFollowers, expandFollowers, } from 'flavours/glitch/actions/accounts'; -import LoadingIndicator from 'flavours/glitch/components/loading_indicator'; +import { LoadingIndicator } from 'flavours/glitch/components/loading_indicator'; import ScrollableList from 'flavours/glitch/components/scrollable_list'; import { TimelineHint } from 'flavours/glitch/components/timeline_hint'; import AccountContainer from 'flavours/glitch/containers/account_container'; diff --git a/app/javascript/flavours/glitch/features/following/index.jsx b/app/javascript/flavours/glitch/features/following/index.jsx index 45fbbe329e..498aa4fbe5 100644 --- a/app/javascript/flavours/glitch/features/following/index.jsx +++ b/app/javascript/flavours/glitch/features/following/index.jsx @@ -14,7 +14,7 @@ import { fetchFollowing, expandFollowing, } from 'flavours/glitch/actions/accounts'; -import LoadingIndicator from 'flavours/glitch/components/loading_indicator'; +import { LoadingIndicator } from 'flavours/glitch/components/loading_indicator'; import ScrollableList from 'flavours/glitch/components/scrollable_list'; import { TimelineHint } from 'flavours/glitch/components/timeline_hint'; import AccountContainer from 'flavours/glitch/containers/account_container'; diff --git a/app/javascript/flavours/glitch/features/list_timeline/index.jsx b/app/javascript/flavours/glitch/features/list_timeline/index.jsx index 4b002f2b14..d407e8a6ea 100644 --- a/app/javascript/flavours/glitch/features/list_timeline/index.jsx +++ b/app/javascript/flavours/glitch/features/list_timeline/index.jsx @@ -18,7 +18,7 @@ import { expandListTimeline } from 'flavours/glitch/actions/timelines'; import Column from 'flavours/glitch/components/column'; import ColumnHeader from 'flavours/glitch/components/column_header'; import { Icon } from 'flavours/glitch/components/icon'; -import LoadingIndicator from 'flavours/glitch/components/loading_indicator'; +import { LoadingIndicator } from 'flavours/glitch/components/loading_indicator'; import { RadioButton } from 'flavours/glitch/components/radio_button'; import BundleColumnError from 'flavours/glitch/features/ui/components/bundle_column_error'; import StatusListContainer from 'flavours/glitch/features/ui/containers/status_list_container'; diff --git a/app/javascript/flavours/glitch/features/lists/index.jsx b/app/javascript/flavours/glitch/features/lists/index.jsx index 3ab82e2948..e09d517d74 100644 --- a/app/javascript/flavours/glitch/features/lists/index.jsx +++ b/app/javascript/flavours/glitch/features/lists/index.jsx @@ -11,7 +11,7 @@ import { createSelector } from 'reselect'; import { fetchLists } from 'flavours/glitch/actions/lists'; import ColumnBackButtonSlim from 'flavours/glitch/components/column_back_button_slim'; -import LoadingIndicator from 'flavours/glitch/components/loading_indicator'; +import { LoadingIndicator } from 'flavours/glitch/components/loading_indicator'; import ScrollableList from 'flavours/glitch/components/scrollable_list'; import Column from 'flavours/glitch/features/ui/components/column'; import ColumnLink from 'flavours/glitch/features/ui/components/column_link'; diff --git a/app/javascript/flavours/glitch/features/mutes/index.jsx b/app/javascript/flavours/glitch/features/mutes/index.jsx index 3cf67b8b98..b3c2ed38b0 100644 --- a/app/javascript/flavours/glitch/features/mutes/index.jsx +++ b/app/javascript/flavours/glitch/features/mutes/index.jsx @@ -12,7 +12,7 @@ import { debounce } from 'lodash'; import { fetchMutes, expandMutes } from 'flavours/glitch/actions/mutes'; import ColumnBackButtonSlim from 'flavours/glitch/components/column_back_button_slim'; -import LoadingIndicator from 'flavours/glitch/components/loading_indicator'; +import { LoadingIndicator } from 'flavours/glitch/components/loading_indicator'; import ScrollableList from 'flavours/glitch/components/scrollable_list'; import AccountContainer from 'flavours/glitch/containers/account_container'; import Column from 'flavours/glitch/features/ui/components/column'; diff --git a/app/javascript/flavours/glitch/features/reblogs/index.jsx b/app/javascript/flavours/glitch/features/reblogs/index.jsx index 87d6de90ec..90d10db628 100644 --- a/app/javascript/flavours/glitch/features/reblogs/index.jsx +++ b/app/javascript/flavours/glitch/features/reblogs/index.jsx @@ -11,7 +11,7 @@ import { connect } from 'react-redux'; import { fetchReblogs } from 'flavours/glitch/actions/interactions'; import ColumnHeader from 'flavours/glitch/components/column_header'; import { Icon } from 'flavours/glitch/components/icon'; -import LoadingIndicator from 'flavours/glitch/components/loading_indicator'; +import { LoadingIndicator } from 'flavours/glitch/components/loading_indicator'; import ScrollableList from 'flavours/glitch/components/scrollable_list'; import AccountContainer from 'flavours/glitch/containers/account_container'; import Column from 'flavours/glitch/features/ui/components/column'; diff --git a/app/javascript/flavours/glitch/features/report/statuses.jsx b/app/javascript/flavours/glitch/features/report/statuses.jsx index d3d4223497..c1650c8dce 100644 --- a/app/javascript/flavours/glitch/features/report/statuses.jsx +++ b/app/javascript/flavours/glitch/features/report/statuses.jsx @@ -8,7 +8,7 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import { connect } from 'react-redux'; import Button from 'flavours/glitch/components/button'; -import LoadingIndicator from 'flavours/glitch/components/loading_indicator'; +import { LoadingIndicator } from 'flavours/glitch/components/loading_indicator'; import StatusCheckBox from 'flavours/glitch/features/report/containers/status_check_box_container'; diff --git a/app/javascript/flavours/glitch/features/status/index.jsx b/app/javascript/flavours/glitch/features/status/index.jsx index 2b451a3b03..20dc85e264 100644 --- a/app/javascript/flavours/glitch/features/status/index.jsx +++ b/app/javascript/flavours/glitch/features/status/index.jsx @@ -46,7 +46,7 @@ import { undoStatusTranslation, } from 'flavours/glitch/actions/statuses'; import { Icon } from 'flavours/glitch/components/icon'; -import LoadingIndicator from 'flavours/glitch/components/loading_indicator'; +import { LoadingIndicator } from 'flavours/glitch/components/loading_indicator'; import { textForScreenReader, defaultMediaVisibility } from 'flavours/glitch/components/status'; import ScrollContainer from 'flavours/glitch/containers/scroll_container'; import StatusContainer from 'flavours/glitch/containers/status_container'; diff --git a/app/javascript/flavours/glitch/features/ui/components/modal_loading.jsx b/app/javascript/flavours/glitch/features/ui/components/modal_loading.jsx index 46c17d6336..3206e06c6a 100644 --- a/app/javascript/flavours/glitch/features/ui/components/modal_loading.jsx +++ b/app/javascript/flavours/glitch/features/ui/components/modal_loading.jsx @@ -1,4 +1,4 @@ -import LoadingIndicator from 'flavours/glitch/components/loading_indicator'; +import { LoadingIndicator } from 'flavours/glitch/components/loading_indicator'; // Keep the markup in sync with // (make sure they have the same dimensions) From b1b95ddd1f330f865e90fc18896257ea2a9d3e7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=9F=E3=81=84=E3=81=A1=20=E3=81=B2?= Date: Wed, 14 Jun 2023 02:28:31 +0900 Subject: [PATCH 054/118] [Glitch] Rewrite `emoji_mart_data_light` as TS Port 3b5e302f7fc1e62cbd075e154ad9415f20fde2ce to glitch-soc Signed-off-by: Claire --- .../features/emoji/emoji_compressed.d.ts | 51 ++++++++++++++++++ .../glitch/features/emoji/emoji_compressed.js | 10 ++++ .../features/emoji/emoji_mart_data_light.js | 43 --------------- .../features/emoji/emoji_mart_data_light.ts | 52 +++++++++++++++++++ 4 files changed, 113 insertions(+), 43 deletions(-) create mode 100644 app/javascript/flavours/glitch/features/emoji/emoji_compressed.d.ts delete mode 100644 app/javascript/flavours/glitch/features/emoji/emoji_mart_data_light.js create mode 100644 app/javascript/flavours/glitch/features/emoji/emoji_mart_data_light.ts diff --git a/app/javascript/flavours/glitch/features/emoji/emoji_compressed.d.ts b/app/javascript/flavours/glitch/features/emoji/emoji_compressed.d.ts new file mode 100644 index 0000000000..30c1bf2fb9 --- /dev/null +++ b/app/javascript/flavours/glitch/features/emoji/emoji_compressed.d.ts @@ -0,0 +1,51 @@ +import type { BaseEmoji, EmojiData, NimbleEmojiIndex } from 'emoji-mart'; +import type { Category, Data, Emoji } from 'emoji-mart/dist-es/utils/data'; + +/* + * The 'search' property, although not defined in the [`Emoji`]{@link node_modules/@types/emoji-mart/dist-es/utils/data.d.ts#Emoji} type, + * is used in the application. + * This could be due to an oversight by the library maintainer. + * The `search` property is defined and used [here]{@link node_modules/emoji-mart/dist/utils/data.js#uncompress}. + */ +export type Search = string; +/* + * The 'skins' property does not exist in the application data. + * This could be a potential area of refactoring or error handling. + * The non-existence of 'skins' property is evident at [this location]{@link app/javascript/flavours/glitch/features/emoji/emoji_compressed.js:121}. + */ +export type Skins = null; + +export type FilenameData = string[] | string[][]; +export type ShortCodesToEmojiDataKey = + | EmojiData['id'] + | BaseEmoji['native'] + | keyof NimbleEmojiIndex['emojis']; + +export type SearchData = [ + BaseEmoji['native'], + Emoji['short_names'], + Search, + Emoji['unified'] +]; + +export interface ShortCodesToEmojiData { + [key: ShortCodesToEmojiDataKey]: [FilenameData, SearchData]; +} +export type EmojisWithoutShortCodes = FilenameData[]; + +export type EmojiCompressed = [ + ShortCodesToEmojiData, + Skins, + Category[], + Data['aliases'], + EmojisWithoutShortCodes +]; + +/* + * `emoji_compressed.js` uses `babel-plugin-preval`, which makes it difficult to convert to TypeScript. + * As a temporary solution, we are allowing a default export here to apply the TypeScript type `EmojiCompressed` to the JS file export. + * - {@link app/javascript/flavours/glitch/features/emoji/emoji_compressed.js} + */ +declare const emojiCompressed: EmojiCompressed; + +export default emojiCompressed; // eslint-disable-line import/no-default-export diff --git a/app/javascript/flavours/glitch/features/emoji/emoji_compressed.js b/app/javascript/flavours/glitch/features/emoji/emoji_compressed.js index bd3d8937d8..6af8a93e54 100644 --- a/app/javascript/flavours/glitch/features/emoji/emoji_compressed.js +++ b/app/javascript/flavours/glitch/features/emoji/emoji_compressed.js @@ -118,6 +118,16 @@ Object.keys(emojiIndex.emojis).forEach(key => { // inconsistent behavior in dev mode module.exports = JSON.parse(JSON.stringify([ shortCodesToEmojiData, + /* + * The property `skins` is not found in the current context. + * This could potentially lead to issues when interacting with modules or data structures + * that expect the presence of `skins` property. + * Currently, no definitions or references to `skins` property can be found in: + * - {@link node_modules/emoji-mart/dist/utils/data.js} + * - {@link node_modules/emoji-mart/data/all.json} + * - {@link app/javascript/flavours/glitch/features/emoji/emoji_compressed.d.ts#Skins} + * Future refactorings or updates should consider adding definitions or handling for `skins` property. + */ emojiMartData.skins, emojiMartData.categories, emojiMartData.aliases, diff --git a/app/javascript/flavours/glitch/features/emoji/emoji_mart_data_light.js b/app/javascript/flavours/glitch/features/emoji/emoji_mart_data_light.js deleted file mode 100644 index 11698937c0..0000000000 --- a/app/javascript/flavours/glitch/features/emoji/emoji_mart_data_light.js +++ /dev/null @@ -1,43 +0,0 @@ -// The output of this module is designed to mimic emoji-mart's -// "data" object, such that we can use it for a light version of emoji-mart's -// emojiIndex.search functionality. -import emojiCompressed from './emoji_compressed'; -import { unicodeToUnifiedName } from './unicode_to_unified_name'; - -const [ shortCodesToEmojiData, skins, categories, short_names ] = emojiCompressed; - -const emojis = {}; - -// decompress -Object.keys(shortCodesToEmojiData).forEach((shortCode) => { - let [ - filenameData, // eslint-disable-line @typescript-eslint/no-unused-vars - searchData, - ] = shortCodesToEmojiData[shortCode]; - let [ - native, - short_names, - search, - unified, - ] = searchData; - - if (!unified) { - // unified name can be derived from unicodeToUnifiedName - unified = unicodeToUnifiedName(native); - } - - short_names = [shortCode].concat(short_names); - emojis[shortCode] = { - native, - search, - short_names, - unified, - }; -}); - -export { - emojis, - skins, - categories, - short_names, -}; diff --git a/app/javascript/flavours/glitch/features/emoji/emoji_mart_data_light.ts b/app/javascript/flavours/glitch/features/emoji/emoji_mart_data_light.ts new file mode 100644 index 0000000000..62cb84baf8 --- /dev/null +++ b/app/javascript/flavours/glitch/features/emoji/emoji_mart_data_light.ts @@ -0,0 +1,52 @@ +// The output of this module is designed to mimic emoji-mart's +// "data" object, such that we can use it for a light version of emoji-mart's +// emojiIndex.search functionality. +import type { BaseEmoji } from 'emoji-mart'; +import type { Emoji } from 'emoji-mart/dist-es/utils/data'; + +import type { Search, ShortCodesToEmojiData } from './emoji_compressed'; +import emojiCompressed from './emoji_compressed'; +import { unicodeToUnifiedName } from './unicode_to_unified_name'; + +type Emojis = { + [key in keyof ShortCodesToEmojiData]: { + native: BaseEmoji['native']; + search: Search; + short_names: Emoji['short_names']; + unified: Emoji['unified']; + }; +}; + +const [ + shortCodesToEmojiData, + skins, + categories, + short_names, + _emojisWithoutShortCodes, +] = emojiCompressed; + +const emojis: Emojis = {}; + +// decompress +Object.keys(shortCodesToEmojiData).forEach((shortCode) => { + const [_filenameData, searchData] = shortCodesToEmojiData[shortCode]; + const native = searchData[0]; + let short_names = searchData[1]; + const search = searchData[2]; + let unified = searchData[3]; + + if (!unified) { + // unified name can be derived from unicodeToUnifiedName + unified = unicodeToUnifiedName(native); + } + + if (short_names) short_names = [shortCode].concat(short_names); + emojis[shortCode] = { + native, + search, + short_names, + unified, + }; +}); + +export { emojis, skins, categories, short_names }; From d795c2c70c35e7cb734f60f5c9af3172259d0a23 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Tue, 13 Jun 2023 22:30:40 +0200 Subject: [PATCH 055/118] [Glitch] Fix CAPTCHA page not following design pattern of sign-up flow Port 39110d1d0af5e3d9cf452ae47496a52797249fd0 to glitch-soc Signed-off-by: Claire --- app/javascript/flavours/glitch/styles/forms.scss | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/javascript/flavours/glitch/styles/forms.scss b/app/javascript/flavours/glitch/styles/forms.scss index 6c49879ee1..81f42af145 100644 --- a/app/javascript/flavours/glitch/styles/forms.scss +++ b/app/javascript/flavours/glitch/styles/forms.scss @@ -1050,7 +1050,9 @@ code { } .simple_form .h-captcha { - text-align: center; + display: flex; + justify-content: center; + margin-bottom: 30px; } .permissions-list { From e5978184a670f200c85d0ee14143b9dc9ce4c689 Mon Sep 17 00:00:00 2001 From: Claire Date: Sun, 18 Jun 2023 13:59:47 +0200 Subject: [PATCH 056/118] Fix glitch-soc-only test being broken by refactor of the surrounding tests --- spec/models/tag_feed_spec.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spec/models/tag_feed_spec.rb b/spec/models/tag_feed_spec.rb index da26febc76..e836144f04 100644 --- a/spec/models/tag_feed_spec.rb +++ b/spec/models/tag_feed_spec.rb @@ -68,15 +68,15 @@ describe TagFeed, type: :service do end context 'when the feed contains a local-only status' do - let!(:status) { Fabricate(:status, tags: [tag1], local_only: true) } + let!(:status) { Fabricate(:status, tags: [tag_cats], local_only: true) } it 'does not show local-only statuses without a viewer' do - results = described_class.new(tag1, nil).get(20) + results = described_class.new(tag_cats, nil).get(20) expect(results).to_not include(status) end it 'shows local-only statuses given a viewer' do - results = described_class.new(tag1, account).get(20) + results = described_class.new(tag_cats, account).get(20) expect(results).to include(status) end end From 3b04e39534bb0209d81a7ef78cb59fe386b1cdce Mon Sep 17 00:00:00 2001 From: Claire Date: Fri, 16 Jun 2023 12:03:06 +0200 Subject: [PATCH 057/118] [Glitch] Fix non-interactive upload container being given a `button` role and tabIndex Port c9d06d10d4e936ee4f741ec2fecca7f91ca61997 to glitch-soc Signed-off-by: Claire --- .../flavours/glitch/features/compose/components/upload.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/flavours/glitch/features/compose/components/upload.jsx b/app/javascript/flavours/glitch/features/compose/components/upload.jsx index b55657e912..5685759f8d 100644 --- a/app/javascript/flavours/glitch/features/compose/components/upload.jsx +++ b/app/javascript/flavours/glitch/features/compose/components/upload.jsx @@ -46,7 +46,7 @@ export default class Upload extends ImmutablePureComponent { const y = ((focusY / -2) + .5) * 100; return ( -
+
{({ scale }) => (
From 64f7a11658a316f6eb2a25151befb418bd829059 Mon Sep 17 00:00:00 2001 From: Claire Date: Sun, 18 Jun 2023 15:47:04 +0200 Subject: [PATCH 058/118] Fix cross-origin loading of locales (#25498) --- app/views/layouts/application.html.haml | 2 +- app/views/layouts/embedded.html.haml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index 4fe2f18bfb..f2d7af4961 100755 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -29,7 +29,7 @@ = stylesheet_pack_tag 'common', media: 'all', crossorigin: 'anonymous' = stylesheet_pack_tag current_theme, media: 'all', crossorigin: 'anonymous' = javascript_pack_tag 'common', crossorigin: 'anonymous' - = preload_pack_asset "locale/#{I18n.locale}-json.js" + = preload_pack_asset "locale/#{I18n.locale}-json.js", crossorigin: 'anonymous' = csrf_meta_tags unless skip_csrf_meta_tags? %meta{ name: 'style-nonce', content: request.content_security_policy_nonce } diff --git a/app/views/layouts/embedded.html.haml b/app/views/layouts/embedded.html.haml index d8aa522d80..53e1fd7932 100644 --- a/app/views/layouts/embedded.html.haml +++ b/app/views/layouts/embedded.html.haml @@ -14,7 +14,7 @@ = stylesheet_pack_tag 'common', media: 'all', crossorigin: 'anonymous' = stylesheet_pack_tag Setting.default_settings['theme'], media: 'all', crossorigin: 'anonymous' = javascript_pack_tag 'common', integrity: true, crossorigin: 'anonymous' - = preload_pack_asset "locale/#{I18n.locale}-json.js" + = preload_pack_asset "locale/#{I18n.locale}-json.js", crossorigin: 'anonymous' = render_initial_state = javascript_pack_tag 'public', integrity: true, crossorigin: 'anonymous' %body.embed From 0a0a1f1495be69467b03a7597f995b4902698452 Mon Sep 17 00:00:00 2001 From: Daniel M Brasil Date: Mon, 19 Jun 2023 03:51:40 -0300 Subject: [PATCH 059/118] Migrate to request specs in `/api/v1/tags` (#25439) --- .rubocop_todo.yml | 2 - .../api/v1/tags_controller_spec.rb | 88 --------- spec/requests/api/v1/tags_spec.rb | 169 ++++++++++++++++++ 3 files changed, 169 insertions(+), 90 deletions(-) delete mode 100644 spec/controllers/api/v1/tags_controller_spec.rb create mode 100644 spec/requests/api/v1/tags_spec.rb diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index aba4415fcb..f3b24cdbc4 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -316,7 +316,6 @@ RSpec/LetSetup: - 'spec/controllers/api/v1/admin/accounts_controller_spec.rb' - 'spec/controllers/api/v1/filters_controller_spec.rb' - 'spec/controllers/api/v1/followed_tags_controller_spec.rb' - - 'spec/controllers/api/v1/tags_controller_spec.rb' - 'spec/controllers/api/v2/admin/accounts_controller_spec.rb' - 'spec/controllers/api/v2/filters/keywords_controller_spec.rb' - 'spec/controllers/api/v2/filters/statuses_controller_spec.rb' @@ -756,7 +755,6 @@ Rails/WhereExists: - 'app/workers/move_worker.rb' - 'db/migrate/20190529143559_preserve_old_layout_for_existing_users.rb' - 'lib/tasks/tests.rake' - - 'spec/controllers/api/v1/tags_controller_spec.rb' - 'spec/models/account_spec.rb' - 'spec/services/activitypub/process_collection_service_spec.rb' - 'spec/services/purge_domain_service_spec.rb' diff --git a/spec/controllers/api/v1/tags_controller_spec.rb b/spec/controllers/api/v1/tags_controller_spec.rb deleted file mode 100644 index e914f5992d..0000000000 --- a/spec/controllers/api/v1/tags_controller_spec.rb +++ /dev/null @@ -1,88 +0,0 @@ -# frozen_string_literal: true - -require 'rails_helper' - -RSpec.describe Api::V1::TagsController do - render_views - - let(:user) { Fabricate(:user) } - let(:scopes) { 'write:follows' } - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } - - before { allow(controller).to receive(:doorkeeper_token) { token } } - - describe 'GET #show' do - before do - get :show, params: { id: name } - end - - context 'with existing tag' do - let!(:tag) { Fabricate(:tag) } - let(:name) { tag.name } - - it 'returns http success' do - expect(response).to have_http_status(:success) - end - end - - context 'with non-existing tag' do - let(:name) { 'hoge' } - - it 'returns http success' do - expect(response).to have_http_status(:success) - end - end - end - - describe 'POST #follow' do - let!(:unrelated_tag) { Fabricate(:tag) } - - before do - TagFollow.create!(account: user.account, tag: unrelated_tag) - - post :follow, params: { id: name } - end - - context 'with existing tag' do - let!(:tag) { Fabricate(:tag) } - let(:name) { tag.name } - - it 'returns http success' do - expect(response).to have_http_status(:success) - end - - it 'creates follow' do - expect(TagFollow.where(tag: tag, account: user.account).exists?).to be true - end - end - - context 'with non-existing tag' do - let(:name) { 'hoge' } - - it 'returns http success' do - expect(response).to have_http_status(:success) - end - - it 'creates follow' do - expect(TagFollow.where(tag: Tag.find_by!(name: name), account: user.account).exists?).to be true - end - end - end - - describe 'POST #unfollow' do - let!(:tag) { Fabricate(:tag, name: 'foo') } - let!(:tag_follow) { Fabricate(:tag_follow, account: user.account, tag: tag) } - - before do - post :unfollow, params: { id: tag.name } - end - - it 'returns http success' do - expect(response).to have_http_status(:success) - end - - it 'removes the follow' do - expect(TagFollow.where(tag: tag, account: user.account).exists?).to be false - end - end -end diff --git a/spec/requests/api/v1/tags_spec.rb b/spec/requests/api/v1/tags_spec.rb new file mode 100644 index 0000000000..300ddf805c --- /dev/null +++ b/spec/requests/api/v1/tags_spec.rb @@ -0,0 +1,169 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe 'Tags' do + let(:user) { Fabricate(:user) } + let(:scopes) { 'write:follows' } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } + let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } + + describe 'GET /api/v1/tags/:id' do + subject do + get "/api/v1/tags/#{name}" + end + + context 'when the tag exists' do + let!(:tag) { Fabricate(:tag) } + let(:name) { tag.name } + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + + it 'returns the tag' do + subject + + expect(body_as_json[:name]).to eq(name) + end + end + + context 'when the tag does not exist' do + let(:name) { 'hoge' } + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + end + + context 'when the tag name is invalid' do + let(:name) { 'tag-name' } + + it 'returns http not found' do + subject + + expect(response).to have_http_status(404) + end + end + end + + describe 'POST /api/v1/tags/:id/follow' do + subject do + post "/api/v1/tags/#{name}/follow", headers: headers + end + + let!(:tag) { Fabricate(:tag) } + let(:name) { tag.name } + + it_behaves_like 'forbidden for wrong scope', 'read read:follows' + + context 'when the tag exists' do + it 'returns http success' do + subject + + expect(response).to have_http_status(:success) + end + + it 'creates follow' do + subject + + expect(TagFollow.where(tag: tag, account: user.account)).to exist + end + end + + context 'when the tag does not exist' do + let(:name) { 'hoge' } + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + + it 'creates a new tag with the specified name' do + subject + + expect(Tag.where(name: name)).to exist + end + + it 'creates follow' do + subject + + expect(TagFollow.where(tag: Tag.find_by(name: name), account: user.account)).to exist + end + end + + context 'when the tag name is invalid' do + let(:name) { 'tag-name' } + + it 'returns http not found' do + subject + + expect(response).to have_http_status(404) + end + end + + context 'when the Authorization header is missing' do + let(:headers) { {} } + let(:name) { 'unauthorized' } + + it 'returns http unauthorized' do + subject + + expect(response).to have_http_status(401) + end + end + end + + describe 'POST #unfollow' do + subject do + post "/api/v1/tags/#{name}/unfollow", headers: headers + end + + let(:name) { tag.name } + let!(:tag) { Fabricate(:tag, name: 'foo') } + + before do + Fabricate(:tag_follow, account: user.account, tag: tag) + end + + it_behaves_like 'forbidden for wrong scope', 'read read:follows' + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + + it 'removes the follow' do + subject + + expect(TagFollow.where(tag: tag, account: user.account)).to_not exist + end + + context 'when the tag name is invalid' do + let(:name) { 'tag-name' } + + it 'returns http not found' do + subject + + expect(response).to have_http_status(404) + end + end + + context 'when the Authorization header is missing' do + let(:headers) { {} } + let(:name) { 'unauthorized' } + + it 'returns http unauthorized' do + subject + + expect(response).to have_http_status(401) + end + end + end +end From b9bc9d0bdada72c74f52fc933c437e19a2e67f3f Mon Sep 17 00:00:00 2001 From: Daniel M Brasil Date: Mon, 19 Jun 2023 03:53:05 -0300 Subject: [PATCH 060/118] Fix incorrect pagination headers in `/api/v2/admin/accounts` (#25477) --- app/controllers/api/v2/admin/accounts_controller.rb | 8 ++++++++ spec/controllers/api/v2/admin/accounts_controller_spec.rb | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/app/controllers/api/v2/admin/accounts_controller.rb b/app/controllers/api/v2/admin/accounts_controller.rb index 0c451f778c..65cf0c4db4 100644 --- a/app/controllers/api/v2/admin/accounts_controller.rb +++ b/app/controllers/api/v2/admin/accounts_controller.rb @@ -18,6 +18,14 @@ class Api::V2::Admin::AccountsController < Api::V1::Admin::AccountsController private + def next_path + api_v2_admin_accounts_url(pagination_params(max_id: pagination_max_id)) if records_continue? + end + + def prev_path + api_v2_admin_accounts_url(pagination_params(min_id: pagination_since_id)) unless @accounts.empty? + end + def filtered_accounts AccountFilter.new(translated_filter_params).results end diff --git a/spec/controllers/api/v2/admin/accounts_controller_spec.rb b/spec/controllers/api/v2/admin/accounts_controller_spec.rb index a775be1709..635f645915 100644 --- a/spec/controllers/api/v2/admin/accounts_controller_spec.rb +++ b/spec/controllers/api/v2/admin/accounts_controller_spec.rb @@ -55,5 +55,13 @@ RSpec.describe Api::V2::Admin::AccountsController do end end end + + context 'with limit param' do + let(:params) { { limit: 1 } } + + it 'sets the correct pagination headers' do + expect(response.headers['Link'].find_link(%w(rel next)).href).to eq api_v2_admin_accounts_url(limit: 1, max_id: admin_account.id) + end + end end end From a0d7ae257da66fc88732a491a315bc86ea299532 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 19 Jun 2023 09:03:50 +0200 Subject: [PATCH 061/118] Update dependency aws-sdk-s3 to v1.126.0 (#25480) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index bdbeb79221..5f3678fe58 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -106,7 +106,7 @@ GEM aws-sdk-kms (1.67.0) aws-sdk-core (~> 3, >= 3.174.0) aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.125.0) + aws-sdk-s3 (1.126.0) aws-sdk-core (~> 3, >= 3.174.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.4) From 155ec185b2ed96b0c091bdd0c01e1193eda386e4 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Mon, 19 Jun 2023 03:04:15 -0400 Subject: [PATCH 062/118] Remove unused `picture_hint` helper method (#25485) --- app/helpers/settings_helper.rb | 9 --------- 1 file changed, 9 deletions(-) diff --git a/app/helpers/settings_helper.rb b/app/helpers/settings_helper.rb index ae89cec780..889ca7f402 100644 --- a/app/helpers/settings_helper.rb +++ b/app/helpers/settings_helper.rb @@ -24,13 +24,4 @@ module SettingsHelper safe_join([image_tag(account.avatar.url, width: 15, height: 15, alt: display_name(account), class: 'avatar'), content_tag(:span, account.acct, class: 'username')], ' ') end end - - def picture_hint(hint, picture) - if picture.original_filename.nil? - hint - else - link = link_to t('generic.delete'), settings_profile_picture_path(picture.name.to_s), data: { method: :delete } - safe_join([hint, link], '
'.html_safe) - end - end end From e835198b26c9985daf353a6a96886ff61fd62c17 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Mon, 19 Jun 2023 03:05:42 -0400 Subject: [PATCH 063/118] Combine assertions in api/v1/notifications spec (#25486) --- .../api/v1/notifications_controller_spec.rb | 51 ++++++++----------- 1 file changed, 20 insertions(+), 31 deletions(-) diff --git a/spec/controllers/api/v1/notifications_controller_spec.rb b/spec/controllers/api/v1/notifications_controller_spec.rb index 28b8e656ab..6615848b83 100644 --- a/spec/controllers/api/v1/notifications_controller_spec.rb +++ b/spec/controllers/api/v1/notifications_controller_spec.rb @@ -67,24 +67,13 @@ RSpec.describe Api::V1::NotificationsController do get :index end - it 'returns http success' do + it 'returns expected notification types', :aggregate_failures do expect(response).to have_http_status(200) - end - it 'includes reblog' do - expect(body_as_json.pluck(:type)).to include 'reblog' - end - - it 'includes mention' do - expect(body_as_json.pluck(:type)).to include 'mention' - end - - it 'includes favourite' do - expect(body_as_json.pluck(:type)).to include 'favourite' - end - - it 'includes follow' do - expect(body_as_json.pluck(:type)).to include 'follow' + expect(body_json_types).to include 'reblog' + expect(body_json_types).to include 'mention' + expect(body_json_types).to include 'favourite' + expect(body_json_types).to include 'follow' end end @@ -93,12 +82,14 @@ RSpec.describe Api::V1::NotificationsController do get :index, params: { account_id: third.account.id } end - it 'returns http success' do + it 'returns only notifications from specified user', :aggregate_failures do expect(response).to have_http_status(200) + + expect(body_json_account_ids.uniq).to eq [third.account.id.to_s] end - it 'returns only notifications from specified user' do - expect(body_as_json.map { |x| x[:account][:id] }.uniq).to eq [third.account.id.to_s] + def body_json_account_ids + body_as_json.map { |x| x[:account][:id] } end end @@ -107,27 +98,23 @@ RSpec.describe Api::V1::NotificationsController do get :index, params: { account_id: 'foo' } end - it 'returns http success' do + it 'returns nothing', :aggregate_failures do expect(response).to have_http_status(200) - end - it 'returns nothing' do expect(body_as_json.size).to eq 0 end end - describe 'with excluded_types param' do + describe 'with exclude_types param' do before do get :index, params: { exclude_types: %w(mention) } end - it 'returns http success' do + it 'returns everything but excluded type', :aggregate_failures do expect(response).to have_http_status(200) - end - it 'returns everything but excluded type' do expect(body_as_json.size).to_not eq 0 - expect(body_as_json.pluck(:type).uniq).to_not include 'mention' + expect(body_json_types.uniq).to_not include 'mention' end end @@ -136,13 +123,15 @@ RSpec.describe Api::V1::NotificationsController do get :index, params: { types: %w(mention) } end - it 'returns http success' do + it 'returns only requested type', :aggregate_failures do expect(response).to have_http_status(200) - end - it 'returns only requested type' do - expect(body_as_json.pluck(:type).uniq).to eq ['mention'] + expect(body_json_types.uniq).to eq ['mention'] end end + + def body_json_types + body_as_json.pluck(:type) + end end end From 3a65fb044fae4d4d717765b8163e6fbaac4e1795 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Mon, 19 Jun 2023 03:50:35 -0400 Subject: [PATCH 064/118] Add coverage for `UserMailer` methods (#25484) --- spec/mailers/user_mailer_spec.rb | 55 ++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/spec/mailers/user_mailer_spec.rb b/spec/mailers/user_mailer_spec.rb index 702aa1c354..3c42a2bb7a 100644 --- a/spec/mailers/user_mailer_spec.rb +++ b/spec/mailers/user_mailer_spec.rb @@ -142,4 +142,59 @@ describe UserMailer do expect(mail.body.encoded).to include I18n.t('user_mailer.appeal_rejected.title') end end + + describe 'two_factor_enabled' do + let(:mail) { described_class.two_factor_enabled(receiver) } + + it 'renders two_factor_enabled mail' do + expect(mail.subject).to eq I18n.t('devise.mailer.two_factor_enabled.subject') + expect(mail.body.encoded).to include I18n.t('devise.mailer.two_factor_enabled.explanation') + end + end + + describe 'two_factor_disabled' do + let(:mail) { described_class.two_factor_disabled(receiver) } + + it 'renders two_factor_disabled mail' do + expect(mail.subject).to eq I18n.t('devise.mailer.two_factor_disabled.subject') + expect(mail.body.encoded).to include I18n.t('devise.mailer.two_factor_disabled.explanation') + end + end + + describe 'webauthn_enabled' do + let(:mail) { described_class.webauthn_enabled(receiver) } + + it 'renders webauthn_enabled mail' do + expect(mail.subject).to eq I18n.t('devise.mailer.webauthn_enabled.subject') + expect(mail.body.encoded).to include I18n.t('devise.mailer.webauthn_enabled.explanation') + end + end + + describe 'webauthn_disabled' do + let(:mail) { described_class.webauthn_disabled(receiver) } + + it 'renders webauthn_disabled mail' do + expect(mail.subject).to eq I18n.t('devise.mailer.webauthn_disabled.subject') + expect(mail.body.encoded).to include I18n.t('devise.mailer.webauthn_disabled.explanation') + end + end + + describe 'two_factor_recovery_codes_changed' do + let(:mail) { described_class.two_factor_recovery_codes_changed(receiver) } + + it 'renders two_factor_recovery_codes_changed mail' do + expect(mail.subject).to eq I18n.t('devise.mailer.two_factor_recovery_codes_changed.subject') + expect(mail.body.encoded).to include I18n.t('devise.mailer.two_factor_recovery_codes_changed.explanation') + end + end + + describe 'webauthn_credential_added' do + let(:credential) { Fabricate.build(:webauthn_credential) } + let(:mail) { described_class.webauthn_credential_added(receiver, credential) } + + it 'renders webauthn_credential_added mail' do + expect(mail.subject).to eq I18n.t('devise.mailer.webauthn_credential.added.subject') + expect(mail.body.encoded).to include I18n.t('devise.mailer.webauthn_credential.added.explanation') + end + end end From cec4f1d5062943a0fbe867bfe17f62c8c7c3069b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 19 Jun 2023 11:28:59 +0200 Subject: [PATCH 065/118] Update dependency dotenv to v16.2.0 (#25506) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 1f8b99641f..7acecd4e3a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4719,9 +4719,9 @@ domutils@^3.0.1: domhandler "^5.0.3" dotenv@^16.0.3: - version "16.1.4" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.1.4.tgz#67ac1a10cd9c25f5ba604e4e08bc77c0ebe0ca8c" - integrity sha512-m55RtE8AsPeJBpOIFKihEmqUcoVncQIwo7x9U8ZwLEZw9ZpXboz2c+rvog+jUaJvVrZ5kBOeYQBX5+8Aa/OZQw== + version "16.3.1" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.1.tgz#369034de7d7e5b120972693352a3bf112172cc3e" + integrity sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ== duplexer@^0.1.2: version "0.1.2" @@ -10732,6 +10732,7 @@ string-length@^4.0.1: strip-ansi "^6.0.0" "string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + name string-width-cjs version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -10830,6 +10831,7 @@ stringz@^2.1.0: char-regex "^1.0.2" "strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: + name strip-ansi-cjs version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -12231,6 +12233,7 @@ workbox-window@7.0.0, workbox-window@^7.0.0: workbox-core "7.0.0" "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: + name wrap-ansi-cjs version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== From e1c9d52e913b75a69ebb71c33c489c56b57b23af Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Mon, 19 Jun 2023 07:48:25 -0400 Subject: [PATCH 066/118] Reduce `sleep` time in request pool spec (#25470) --- app/lib/request_pool.rb | 5 +++-- spec/lib/request_pool_spec.rb | 25 +++++++++++++++++-------- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/app/lib/request_pool.rb b/app/lib/request_pool.rb index 6be1722860..86c825498d 100644 --- a/app/lib/request_pool.rb +++ b/app/lib/request_pool.rb @@ -28,8 +28,9 @@ class RequestPool end MAX_IDLE_TIME = 30 - WAIT_TIMEOUT = 5 MAX_POOL_SIZE = ENV.fetch('MAX_REQUEST_POOL_SIZE', 512).to_i + REAPER_FREQUENCY = 30 + WAIT_TIMEOUT = 5 class Connection attr_reader :site, :last_used_at, :created_at, :in_use, :dead, :fresh @@ -98,7 +99,7 @@ class RequestPool def initialize @pool = ConnectionPool::SharedConnectionPool.new(size: MAX_POOL_SIZE, timeout: WAIT_TIMEOUT) { |site| Connection.new(site) } - @reaper = Reaper.new(self, 30) + @reaper = Reaper.new(self, REAPER_FREQUENCY) @reaper.run end diff --git a/spec/lib/request_pool_spec.rb b/spec/lib/request_pool_spec.rb index 395268fe43..f179e6ca94 100644 --- a/spec/lib/request_pool_spec.rb +++ b/spec/lib/request_pool_spec.rb @@ -48,16 +48,25 @@ describe RequestPool do expect(subject.size).to be > 1 end - it 'closes idle connections' do - stub_request(:get, 'http://example.com/').to_return(status: 200, body: 'Hello!') - - subject.with('http://example.com') do |http_client| - http_client.get('/').flush + context 'with an idle connection' do + before do + stub_const('RequestPool::MAX_IDLE_TIME', 1) # Lower idle time limit to 1 seconds + stub_const('RequestPool::REAPER_FREQUENCY', 0.1) # Run reaper every 0.1 seconds + stub_request(:get, 'http://example.com/').to_return(status: 200, body: 'Hello!') end - expect(subject.size).to eq 1 - sleep RequestPool::MAX_IDLE_TIME + 30 + 1 - expect(subject.size).to eq 0 + it 'closes the connections' do + subject.with('http://example.com') do |http_client| + http_client.get('/').flush + end + + expect { reaper_observes_idle_timeout }.to change(subject, :size).from(1).to(0) + end + + def reaper_observes_idle_timeout + # One full idle period and 2 reaper cycles more + sleep RequestPool::MAX_IDLE_TIME + (RequestPool::REAPER_FREQUENCY * 2) + end end end end From 804488d38e9942280f7d320af8c7fef7860a4ee5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=9F=E3=81=84=E3=81=A1=20=E3=81=B2?= Date: Mon, 19 Jun 2023 21:11:46 +0900 Subject: [PATCH 067/118] Rewrite `` as FC and TS (#25481) --- .../components/autosuggest_hashtag.jsx | 44 ------------------- .../components/autosuggest_hashtag.tsx | 42 ++++++++++++++++++ .../mastodon/components/autosuggest_input.jsx | 2 +- .../components/autosuggest_textarea.jsx | 2 +- 4 files changed, 44 insertions(+), 46 deletions(-) delete mode 100644 app/javascript/mastodon/components/autosuggest_hashtag.jsx create mode 100644 app/javascript/mastodon/components/autosuggest_hashtag.tsx diff --git a/app/javascript/mastodon/components/autosuggest_hashtag.jsx b/app/javascript/mastodon/components/autosuggest_hashtag.jsx deleted file mode 100644 index b509f48df0..0000000000 --- a/app/javascript/mastodon/components/autosuggest_hashtag.jsx +++ /dev/null @@ -1,44 +0,0 @@ -import PropTypes from 'prop-types'; -import { PureComponent } from 'react'; - -import { FormattedMessage } from 'react-intl'; - -import ShortNumber from 'mastodon/components/short_number'; - -export default class AutosuggestHashtag extends PureComponent { - - static propTypes = { - tag: PropTypes.shape({ - name: PropTypes.string.isRequired, - url: PropTypes.string, - history: PropTypes.array, - }).isRequired, - }; - - render() { - const { tag } = this.props; - const weeklyUses = tag.history && ( - total + day.uses * 1, 0)} - /> - ); - - return ( -
-
- #{tag.name} -
- {tag.history !== undefined && ( -
- -
- )} -
- ); - } - -} diff --git a/app/javascript/mastodon/components/autosuggest_hashtag.tsx b/app/javascript/mastodon/components/autosuggest_hashtag.tsx new file mode 100644 index 0000000000..c6798054db --- /dev/null +++ b/app/javascript/mastodon/components/autosuggest_hashtag.tsx @@ -0,0 +1,42 @@ +import { FormattedMessage } from 'react-intl'; + +import ShortNumber from 'mastodon/components/short_number'; + +interface Props { + tag: { + name: string; + url?: string; + history?: Array<{ + uses: number; + accounts: string; + day: string; + }>; + following?: boolean; + type: 'hashtag'; + }; +} + +export const AutosuggestHashtag: React.FC = ({ tag }) => { + const weeklyUses = tag.history && ( + total + day.uses * 1, 0)} + /> + ); + + return ( +
+
+ #{tag.name} +
+ {tag.history !== undefined && ( +
+ +
+ )} +
+ ); +}; diff --git a/app/javascript/mastodon/components/autosuggest_input.jsx b/app/javascript/mastodon/components/autosuggest_input.jsx index 890f94928b..06cbb5d75b 100644 --- a/app/javascript/mastodon/components/autosuggest_input.jsx +++ b/app/javascript/mastodon/components/autosuggest_input.jsx @@ -8,7 +8,7 @@ import ImmutablePureComponent from 'react-immutable-pure-component'; import AutosuggestAccountContainer from '../features/compose/containers/autosuggest_account_container'; import AutosuggestEmoji from './autosuggest_emoji'; -import AutosuggestHashtag from './autosuggest_hashtag'; +import { AutosuggestHashtag } from './autosuggest_hashtag'; const textAtCursorMatchesToken = (str, caretPosition, searchTokens) => { let word; diff --git a/app/javascript/mastodon/components/autosuggest_textarea.jsx b/app/javascript/mastodon/components/autosuggest_textarea.jsx index 463d2e94c1..230e4f6572 100644 --- a/app/javascript/mastodon/components/autosuggest_textarea.jsx +++ b/app/javascript/mastodon/components/autosuggest_textarea.jsx @@ -10,7 +10,7 @@ import Textarea from 'react-textarea-autosize'; import AutosuggestAccountContainer from '../features/compose/containers/autosuggest_account_container'; import AutosuggestEmoji from './autosuggest_emoji'; -import AutosuggestHashtag from './autosuggest_hashtag'; +import { AutosuggestHashtag } from './autosuggest_hashtag'; const textAtCursorMatchesToken = (str, caretPosition) => { let word; From dd07393e755062d2d656ae7872c949ef7a9ddec7 Mon Sep 17 00:00:00 2001 From: Claire Date: Mon, 19 Jun 2023 15:06:06 +0200 Subject: [PATCH 068/118] Fix user settings not getting validated (#25508) --- app/models/user_settings.rb | 5 ++++- spec/models/user_settings_spec.rb | 10 ++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/app/models/user_settings.rb b/app/models/user_settings.rb index 2c025d6c56..0f77f45f78 100644 --- a/app/models/user_settings.rb +++ b/app/models/user_settings.rb @@ -72,7 +72,10 @@ class UserSettings raise KeyError, "Undefined setting: #{key}" unless self.class.definition_for?(key) - typecast_value = self.class.definition_for(key).type_cast(value) + setting_definition = self.class.definition_for(key) + typecast_value = setting_definition.type_cast(value) + + raise ArgumentError, "Invalid value for setting #{key}: #{typecast_value}" if setting_definition.in.present? && setting_definition.in.exclude?(typecast_value) if typecast_value.nil? @original_hash.delete(key) diff --git a/spec/models/user_settings_spec.rb b/spec/models/user_settings_spec.rb index f0e4272fd9..653597c90d 100644 --- a/spec/models/user_settings_spec.rb +++ b/spec/models/user_settings_spec.rb @@ -49,6 +49,16 @@ RSpec.describe UserSettings do expect(subject[:always_send_emails]).to be true end end + + context 'when the setting has a closed set of values' do + it 'updates the attribute when given a valid value' do + expect { subject[:'web.display_media'] = :show_all }.to change { subject[:'web.display_media'] }.from('default').to('show_all') + end + + it 'raises an error when given an invalid value' do + expect { subject[:'web.display_media'] = 'invalid value' }.to raise_error ArgumentError + end + end end describe '#update' do From eba3411bfa40cbb36205f58a36e34c446fed0ffa Mon Sep 17 00:00:00 2001 From: Plastikmensch Date: Mon, 19 Jun 2023 18:01:35 +0200 Subject: [PATCH 069/118] Re-allow title attribute in (#2254) * Re-allow title attribute in This was accidentally removed in 7623e181247b4d2227b7774143514f6e1ca9253b Signed-off-by: Plastikmensch * Add test Add a new test to check that title attribute on is kept. Signed-off-by: Plastikmensch --------- Signed-off-by: Plastikmensch --- lib/sanitize_ext/sanitize_config.rb | 1 + spec/lib/sanitize_config_spec.rb | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/lib/sanitize_ext/sanitize_config.rb b/lib/sanitize_ext/sanitize_config.rb index 0ee3a519b6..f3eb9c0754 100644 --- a/lib/sanitize_ext/sanitize_config.rb +++ b/lib/sanitize_ext/sanitize_config.rb @@ -74,6 +74,7 @@ class Sanitize attributes: { 'a' => %w(href rel class title), + 'abbr' => %w(title), 'span' => %w(class), 'blockquote' => %w(cite), 'ol' => %w(start reversed), diff --git a/spec/lib/sanitize_config_spec.rb b/spec/lib/sanitize_config_spec.rb index 29344476f6..586a43d594 100644 --- a/spec/lib/sanitize_config_spec.rb +++ b/spec/lib/sanitize_config_spec.rb @@ -43,6 +43,10 @@ describe Sanitize::Config do it 'keeps a with supported scheme and no host' do expect(Sanitize.fragment('Test', subject)).to eq 'Test' end + + it 'keeps title in abbr' do + expect(Sanitize.fragment('HTML', subject)).to eq 'HTML' + end end describe '::MASTODON_OUTGOING' do From 3a91603b1507d3821e8a20734e6ed92ae4d06c3b Mon Sep 17 00:00:00 2001 From: Emelia Smith Date: Tue, 20 Jun 2023 18:04:35 +0200 Subject: [PATCH 070/118] Prevent UserCleanupScheduler from overwhelming streaming (#25519) --- app/services/remove_status_service.rb | 18 +++++++++++++++++- .../scheduler/user_cleanup_scheduler.rb | 2 +- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/app/services/remove_status_service.rb b/app/services/remove_status_service.rb index 25da2c6eb4..4eda5b355b 100644 --- a/app/services/remove_status_service.rb +++ b/app/services/remove_status_service.rb @@ -12,6 +12,7 @@ class RemoveStatusService < BaseService # @option [Boolean] :immediate # @option [Boolean] :preserve # @option [Boolean] :original_removed + # @option [Boolean] :skip_streaming def call(status, **options) @payload = Oj.dump(event: :delete, payload: status.id.to_s) @status = status @@ -52,6 +53,9 @@ class RemoveStatusService < BaseService private + # The following FeedManager calls all do not result in redis publishes for + # streaming, as the `:update` option is false + def remove_from_self FeedManager.instance.unpush_from_home(@account, @status) end @@ -75,6 +79,8 @@ class RemoveStatusService < BaseService # followers. Here we send a delete to actively mentioned accounts # that may not follow the account + return if skip_streaming? + @status.active_mentions.find_each do |mention| redis.publish("timeline:#{mention.account_id}", @payload) end @@ -103,7 +109,7 @@ class RemoveStatusService < BaseService # without us being able to do all the fancy stuff @status.reblogs.rewhere(deleted_at: [nil, @status.deleted_at]).includes(:account).reorder(nil).find_each do |reblog| - RemoveStatusService.new.call(reblog, original_removed: true) + RemoveStatusService.new.call(reblog, original_removed: true, skip_streaming: skip_streaming?) end end @@ -114,6 +120,8 @@ class RemoveStatusService < BaseService return unless @status.public_visibility? + return if skip_streaming? + @status.tags.map(&:name).each do |hashtag| redis.publish("timeline:hashtag:#{hashtag.mb_chars.downcase}", @payload) redis.publish("timeline:hashtag:#{hashtag.mb_chars.downcase}:local", @payload) if @status.local? @@ -123,6 +131,8 @@ class RemoveStatusService < BaseService def remove_from_public return unless @status.public_visibility? + return if skip_streaming? + redis.publish('timeline:public', @payload) redis.publish(@status.local? ? 'timeline:public:local' : 'timeline:public:remote', @payload) end @@ -130,6 +140,8 @@ class RemoveStatusService < BaseService def remove_from_media return unless @status.public_visibility? + return if skip_streaming? + redis.publish('timeline:public:media', @payload) redis.publish(@status.local? ? 'timeline:public:local:media' : 'timeline:public:remote:media', @payload) end @@ -143,4 +155,8 @@ class RemoveStatusService < BaseService def permanently? @options[:immediate] || !(@options[:preserve] || @status.reported?) end + + def skip_streaming? + !!@options[:skip_streaming] + end end diff --git a/app/workers/scheduler/user_cleanup_scheduler.rb b/app/workers/scheduler/user_cleanup_scheduler.rb index 45cfbc62e6..4aee7935a2 100644 --- a/app/workers/scheduler/user_cleanup_scheduler.rb +++ b/app/workers/scheduler/user_cleanup_scheduler.rb @@ -24,7 +24,7 @@ class Scheduler::UserCleanupScheduler def clean_discarded_statuses! Status.unscoped.discarded.where('deleted_at <= ?', 30.days.ago).find_in_batches do |statuses| RemovalWorker.push_bulk(statuses) do |status| - [status.id, { 'immediate' => true }] + [status.id, { 'immediate' => true, 'skip_streaming' => true }] end end end From c78280a8ce4c841dd2a454ba086e95cfa4c37438 Mon Sep 17 00:00:00 2001 From: Claire Date: Tue, 20 Jun 2023 18:10:19 +0200 Subject: [PATCH 071/118] Add translate="no" to outgoing mentions and links (#25524) --- app/lib/text_formatter.rb | 4 ++-- lib/sanitize_ext/sanitize_config.rb | 10 ++++++++-- spec/lib/sanitize_config_spec.rb | 8 ++++++++ 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/app/lib/text_formatter.rb b/app/lib/text_formatter.rb index 243e892891..0404cbaced 100644 --- a/app/lib/text_formatter.rb +++ b/app/lib/text_formatter.rb @@ -79,7 +79,7 @@ class TextFormatter cutoff = url[prefix.length..-1].length > 30 <<~HTML.squish - #{h(display_url)} + #{h(display_url)} HTML rescue Addressable::URI::InvalidURIError, IDN::Idna::IdnaError h(entity[:url]) @@ -122,7 +122,7 @@ class TextFormatter display_username = same_username_hits&.positive? || with_domains? ? account.pretty_acct : account.username <<~HTML.squish - @#{h(display_username)} + @#{h(display_username)} HTML end diff --git a/lib/sanitize_ext/sanitize_config.rb b/lib/sanitize_ext/sanitize_config.rb index 9cc500c36e..bcd89af67a 100644 --- a/lib/sanitize_ext/sanitize_config.rb +++ b/lib/sanitize_ext/sanitize_config.rb @@ -36,6 +36,11 @@ class Sanitize node['class'] = class_list.join(' ') end + TRANSLATE_TRANSFORMER = lambda do |env| + node = env[:node] + node.remove_attribute('translate') unless node['translate'] == 'no' + end + UNSUPPORTED_HREF_TRANSFORMER = lambda do |env| return unless env[:node_name] == 'a' @@ -63,8 +68,8 @@ class Sanitize elements: %w(p br span a del pre blockquote code b strong u i em ul ol li), attributes: { - 'a' => %w(href rel class), - 'span' => %w(class), + 'a' => %w(href rel class translate), + 'span' => %w(class translate), 'ol' => %w(start reversed), 'li' => %w(value), }, @@ -80,6 +85,7 @@ class Sanitize transformers: [ CLASS_WHITELIST_TRANSFORMER, + TRANSLATE_TRANSFORMER, UNSUPPORTED_ELEMENTS_TRANSFORMER, UNSUPPORTED_HREF_TRANSFORMER, ] diff --git a/spec/lib/sanitize_config_spec.rb b/spec/lib/sanitize_config_spec.rb index a01122bed0..550ad1c52b 100644 --- a/spec/lib/sanitize_config_spec.rb +++ b/spec/lib/sanitize_config_spec.rb @@ -38,6 +38,14 @@ describe Sanitize::Config do expect(Sanitize.fragment('Test', subject)).to eq 'Test' end + it 'keeps a with translate="no"' do + expect(Sanitize.fragment('Test', subject)).to eq 'Test' + end + + it 'removes "translate" attribute with invalid value' do + expect(Sanitize.fragment('Test', subject)).to eq 'Test' + end + it 'removes a with unparsable href' do expect(Sanitize.fragment('Test', subject)).to eq 'Test' end From fd23f5024377ee3d31d1a9fd7d2f094036ceb45b Mon Sep 17 00:00:00 2001 From: Claire Date: Tue, 20 Jun 2023 18:15:35 +0200 Subject: [PATCH 072/118] Fix wrong view being displayed when a webhook fails validation (#25464) --- app/controllers/admin/webhooks_controller.rb | 2 +- spec/controllers/admin/webhooks_controller_spec.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/admin/webhooks_controller.rb b/app/controllers/admin/webhooks_controller.rb index 01d9ba8ce2..e087476658 100644 --- a/app/controllers/admin/webhooks_controller.rb +++ b/app/controllers/admin/webhooks_controller.rb @@ -42,7 +42,7 @@ module Admin if @webhook.update(resource_params) redirect_to admin_webhook_path(@webhook) else - render :show + render :edit end end diff --git a/spec/controllers/admin/webhooks_controller_spec.rb b/spec/controllers/admin/webhooks_controller_spec.rb index 5e45c74082..074956c555 100644 --- a/spec/controllers/admin/webhooks_controller_spec.rb +++ b/spec/controllers/admin/webhooks_controller_spec.rb @@ -82,7 +82,7 @@ describe Admin::WebhooksController do end.to_not change(webhook, :url) expect(response).to have_http_status(:success) - expect(response).to render_template(:show) + expect(response).to render_template(:edit) end end From e53eb38a8d1eabe7b1de6852e7114ace1c435d63 Mon Sep 17 00:00:00 2001 From: Daniel M Brasil Date: Tue, 20 Jun 2023 13:16:48 -0300 Subject: [PATCH 073/118] Migrate to request specs in `/api/v1/admin/account_actions` (#25514) --- .../admin/account_actions_controller_spec.rb | 55 ------- .../api/v1/admin/account_actions_spec.rb | 154 ++++++++++++++++++ 2 files changed, 154 insertions(+), 55 deletions(-) delete mode 100644 spec/controllers/api/v1/admin/account_actions_controller_spec.rb create mode 100644 spec/requests/api/v1/admin/account_actions_spec.rb diff --git a/spec/controllers/api/v1/admin/account_actions_controller_spec.rb b/spec/controllers/api/v1/admin/account_actions_controller_spec.rb deleted file mode 100644 index 523350e123..0000000000 --- a/spec/controllers/api/v1/admin/account_actions_controller_spec.rb +++ /dev/null @@ -1,55 +0,0 @@ -# frozen_string_literal: true - -require 'rails_helper' - -RSpec.describe Api::V1::Admin::AccountActionsController do - render_views - - let(:role) { UserRole.find_by(name: 'Moderator') } - let(:user) { Fabricate(:user, role: role) } - let(:scopes) { 'admin:read admin:write' } - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } - let(:account) { Fabricate(:account) } - - before do - allow(controller).to receive(:doorkeeper_token) { token } - end - - describe 'POST #create' do - context 'with type of disable' do - before do - post :create, params: { account_id: account.id, type: 'disable' } - end - - it_behaves_like 'forbidden for wrong scope', 'write:statuses' - it_behaves_like 'forbidden for wrong role', '' - - it 'returns http success' do - expect(response).to have_http_status(200) - end - - it 'performs action against account' do - expect(account.reload.user_disabled?).to be true - end - - it 'logs action' do - log_item = Admin::ActionLog.last - - expect(log_item).to_not be_nil - expect(log_item.action).to eq :disable - expect(log_item.account_id).to eq user.account_id - expect(log_item.target_id).to eq account.user.id - end - end - - context 'with no type' do - before do - post :create, params: { account_id: account.id } - end - - it 'returns http unprocessable entity' do - expect(response).to have_http_status(422) - end - end - end -end diff --git a/spec/requests/api/v1/admin/account_actions_spec.rb b/spec/requests/api/v1/admin/account_actions_spec.rb new file mode 100644 index 0000000000..9295d262d6 --- /dev/null +++ b/spec/requests/api/v1/admin/account_actions_spec.rb @@ -0,0 +1,154 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe 'Account actions' do + let(:role) { UserRole.find_by(name: 'Admin') } + let(:user) { Fabricate(:user, role: role) } + let(:scopes) { 'admin:write admin:write:accounts' } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } + let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } + let(:mailer) { instance_double(ActionMailer::MessageDelivery, deliver_later!: nil) } + + before do + allow(UserMailer).to receive(:warning).with(target_account.user, anything).and_return(mailer) + end + + shared_examples 'a successful notification delivery' do + it 'notifies the user about the action taken' do + subject + + expect(UserMailer).to have_received(:warning).with(target_account.user, anything).once + expect(mailer).to have_received(:deliver_later!).once + end + end + + shared_examples 'a successful logged action' do |action_type, target_type| + it 'logs action' do + subject + + log_item = Admin::ActionLog.last + + expect(log_item).to be_present + expect(log_item.action).to eq(action_type) + expect(log_item.account_id).to eq(user.account_id) + expect(log_item.target_id).to eq(target_type == :user ? target_account.user.id : target_account.id) + end + end + + describe 'POST /api/v1/admin/accounts/:id/action' do + subject do + post "/api/v1/admin/accounts/#{target_account.id}/action", headers: headers, params: params + end + + let(:target_account) { Fabricate(:account) } + + context 'with type of disable' do + let(:params) { { type: 'disable' } } + + it_behaves_like 'forbidden for wrong scope', 'admin:read admin:read:accounts' + it_behaves_like 'forbidden for wrong role', '' + it_behaves_like 'a successful notification delivery' + it_behaves_like 'a successful logged action', :disable, :user + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + + it 'disables the target account' do + expect { subject }.to change { target_account.reload.user_disabled? }.from(false).to(true) + end + end + + context 'with type of sensitive' do + let(:params) { { type: 'sensitive' } } + + it_behaves_like 'forbidden for wrong scope', 'admin:read admin:read:accounts' + it_behaves_like 'forbidden for wrong role', '' + it_behaves_like 'a successful notification delivery' + it_behaves_like 'a successful logged action', :sensitive, :account + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + + it 'marks the target account as sensitive' do + expect { subject }.to change { target_account.reload.sensitized? }.from(false).to(true) + end + end + + context 'with type of silence' do + let(:params) { { type: 'silence' } } + + it_behaves_like 'forbidden for wrong scope', 'admin:read admin:read:accounts' + it_behaves_like 'forbidden for wrong role', '' + it_behaves_like 'a successful notification delivery' + it_behaves_like 'a successful logged action', :silence, :account + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + + it 'marks the target account as silenced' do + expect { subject }.to change { target_account.reload.silenced? }.from(false).to(true) + end + end + + context 'with type of suspend' do + let(:params) { { type: 'suspend' } } + + it_behaves_like 'forbidden for wrong scope', 'admin:read admin:read:accounts' + it_behaves_like 'forbidden for wrong role', '' + it_behaves_like 'a successful notification delivery' + it_behaves_like 'a successful logged action', :suspend, :account + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + + it 'marks the target account as suspended' do + expect { subject }.to change { target_account.reload.suspended? }.from(false).to(true) + end + end + + context 'with type of none' do + let(:params) { { type: 'none' } } + + it_behaves_like 'a successful notification delivery' + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + end + + context 'with no type' do + let(:params) { {} } + + it 'returns http unprocessable entity' do + subject + + expect(response).to have_http_status(422) + end + end + + context 'with invalid type' do + let(:params) { { type: 'invalid' } } + + it 'returns http unprocessable entity' do + subject + + expect(response).to have_http_status(422) + end + end + end +end From ec91ea44575a5d9cb8ce1be5d0448ef5e2d98a6e Mon Sep 17 00:00:00 2001 From: Claire Date: Tue, 20 Jun 2023 18:32:14 +0200 Subject: [PATCH 074/118] Fix missing validation on `default_privacy` setting (#25513) --- app/models/user_settings.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/user_settings.rb b/app/models/user_settings.rb index 0f77f45f78..71af7aaeb0 100644 --- a/app/models/user_settings.rb +++ b/app/models/user_settings.rb @@ -14,7 +14,7 @@ class UserSettings setting :show_application, default: true setting :default_language, default: nil setting :default_sensitive, default: false - setting :default_privacy, default: nil + setting :default_privacy, default: nil, in: %w(public unlisted private) namespace :web do setting :crop_images, default: true From ebfeaebedbc43526116fc5c0abe82f3d8745c927 Mon Sep 17 00:00:00 2001 From: Claire Date: Tue, 20 Jun 2023 18:32:26 +0200 Subject: [PATCH 075/118] Fix /api/v1/conversations sometimes returning empty accounts (#25499) --- app/models/account_conversation.rb | 10 ++-------- .../api/v1/conversations_controller_spec.rb | 6 ++++-- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/app/models/account_conversation.rb b/app/models/account_conversation.rb index 32fe79ccf7..25a75d8a61 100644 --- a/app/models/account_conversation.rb +++ b/app/models/account_conversation.rb @@ -32,14 +32,8 @@ class AccountConversation < ApplicationRecord end def participant_accounts - @participant_accounts ||= begin - if participant_account_ids.empty? - [account] - else - participants = Account.where(id: participant_account_ids).to_a - participants.empty? ? [account] : participants - end - end + @participant_accounts ||= Account.where(id: participant_account_ids).to_a + @participant_accounts.presence || [account] end class << self diff --git a/spec/controllers/api/v1/conversations_controller_spec.rb b/spec/controllers/api/v1/conversations_controller_spec.rb index f8a5985634..28d7c7f3ae 100644 --- a/spec/controllers/api/v1/conversations_controller_spec.rb +++ b/spec/controllers/api/v1/conversations_controller_spec.rb @@ -18,6 +18,7 @@ RSpec.describe Api::V1::ConversationsController do before do PostStatusService.new.call(other.account, text: 'Hey @alice', visibility: 'direct') + PostStatusService.new.call(user.account, text: 'Hey, nobody here', visibility: 'direct') end it 'returns http success' do @@ -33,7 +34,8 @@ RSpec.describe Api::V1::ConversationsController do it 'returns conversations' do get :index json = body_as_json - expect(json.size).to eq 1 + expect(json.size).to eq 2 + expect(json[0][:accounts].size).to eq 1 end context 'with since_id' do @@ -41,7 +43,7 @@ RSpec.describe Api::V1::ConversationsController do it 'returns conversations' do get :index, params: { since_id: Mastodon::Snowflake.id_at(1.hour.ago, with_random: false) } json = body_as_json - expect(json.size).to eq 1 + expect(json.size).to eq 2 end end From 37a9c2258a323eee69274dfb6d710a712201c61d Mon Sep 17 00:00:00 2001 From: Claire Date: Tue, 20 Jun 2023 18:54:05 +0200 Subject: [PATCH 076/118] Add per-test timeouts to AutoStatusesCleanupScheduler tests (#24841) --- .../scheduler/accounts_statuses_cleanup_scheduler_spec.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/spec/workers/scheduler/accounts_statuses_cleanup_scheduler_spec.rb b/spec/workers/scheduler/accounts_statuses_cleanup_scheduler_spec.rb index 5565636d57..4d9185093a 100644 --- a/spec/workers/scheduler/accounts_statuses_cleanup_scheduler_spec.rb +++ b/spec/workers/scheduler/accounts_statuses_cleanup_scheduler_spec.rb @@ -75,6 +75,12 @@ describe Scheduler::AccountsStatusesCleanupScheduler do end describe '#perform' do + around do |example| + Timeout.timeout(30) do + example.run + end + end + before do # Policies for the accounts Fabricate(:account_statuses_cleanup_policy, account: account_alice) From 69db507924d6d9350cca8a7127e773d46f9b8f48 Mon Sep 17 00:00:00 2001 From: Ian Date: Wed, 21 Jun 2023 16:58:00 +0100 Subject: [PATCH 077/118] Change emoji picker icon (#25479) --- .../features/compose/components/emoji_picker_dropdown.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.jsx b/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.jsx index 79551b512f..494b8d8624 100644 --- a/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.jsx +++ b/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.jsx @@ -389,7 +389,7 @@ class EmojiPickerDropdown extends PureComponent { {button || 🙂}
From 6ac271c2a008a1d1d865918ffd5c95daee737b63 Mon Sep 17 00:00:00 2001 From: Daniel M Brasil Date: Thu, 22 Jun 2023 06:49:35 -0300 Subject: [PATCH 078/118] Migrate to request specs in `/api/v1/suggestions` (#25540) --- .../api/v1/suggestions_controller_spec.rb | 37 ------- spec/requests/api/v1/suggestions_spec.rb | 103 ++++++++++++++++++ 2 files changed, 103 insertions(+), 37 deletions(-) delete mode 100644 spec/controllers/api/v1/suggestions_controller_spec.rb create mode 100644 spec/requests/api/v1/suggestions_spec.rb diff --git a/spec/controllers/api/v1/suggestions_controller_spec.rb b/spec/controllers/api/v1/suggestions_controller_spec.rb deleted file mode 100644 index c61ce0ec05..0000000000 --- a/spec/controllers/api/v1/suggestions_controller_spec.rb +++ /dev/null @@ -1,37 +0,0 @@ -# frozen_string_literal: true - -require 'rails_helper' - -RSpec.describe Api::V1::SuggestionsController do - render_views - - let(:user) { Fabricate(:user) } - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read write') } - - before do - allow(controller).to receive(:doorkeeper_token) { token } - end - - describe 'GET #index' do - let(:bob) { Fabricate(:account) } - let(:jeff) { Fabricate(:account) } - - before do - PotentialFriendshipTracker.record(user.account_id, bob.id, :reblog) - PotentialFriendshipTracker.record(user.account_id, jeff.id, :favourite) - - get :index - end - - it 'returns http success' do - expect(response).to have_http_status(200) - end - - it 'returns accounts' do - json = body_as_json - - expect(json.size).to be >= 1 - expect(json.pluck(:id)).to include(*[bob, jeff].map { |i| i.id.to_s }) - end - end -end diff --git a/spec/requests/api/v1/suggestions_spec.rb b/spec/requests/api/v1/suggestions_spec.rb new file mode 100644 index 0000000000..42b7f86629 --- /dev/null +++ b/spec/requests/api/v1/suggestions_spec.rb @@ -0,0 +1,103 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe 'Suggestions' do + let(:user) { Fabricate(:user) } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } + let(:scopes) { 'read' } + let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } + + describe 'GET /api/v1/suggestions' do + subject do + get '/api/v1/suggestions', headers: headers, params: params + end + + let(:bob) { Fabricate(:account) } + let(:jeff) { Fabricate(:account) } + let(:params) { {} } + + before do + PotentialFriendshipTracker.record(user.account_id, bob.id, :reblog) + PotentialFriendshipTracker.record(user.account_id, jeff.id, :favourite) + end + + it_behaves_like 'forbidden for wrong scope', 'write' + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + + it 'returns accounts' do + subject + + body = body_as_json + + expect(body.size).to eq 2 + expect(body.pluck(:id)).to match_array([bob, jeff].map { |i| i.id.to_s }) + end + + context 'with limit param' do + let(:params) { { limit: 1 } } + + it 'returns only the requested number of accounts' do + subject + + expect(body_as_json.size).to eq 1 + end + end + + context 'without an authorization header' do + let(:headers) { {} } + + it 'returns http unauthorized' do + subject + + expect(response).to have_http_status(401) + end + end + end + + describe 'DELETE /api/v1/suggestions/:id' do + subject do + delete "/api/v1/suggestions/#{jeff.id}", headers: headers + end + + let(:suggestions_source) { instance_double(AccountSuggestions::PastInteractionsSource, remove: nil) } + let(:bob) { Fabricate(:account) } + let(:jeff) { Fabricate(:account) } + + before do + PotentialFriendshipTracker.record(user.account_id, bob.id, :reblog) + PotentialFriendshipTracker.record(user.account_id, jeff.id, :favourite) + allow(AccountSuggestions::PastInteractionsSource).to receive(:new).and_return(suggestions_source) + end + + it_behaves_like 'forbidden for wrong scope', 'write' + + it 'returns http success' do + subject + + expect(response).to have_http_status(200) + end + + it 'removes the specified suggestion' do + subject + + expect(suggestions_source).to have_received(:remove).with(user.account, jeff.id.to_s).once + expect(suggestions_source).to_not have_received(:remove).with(user.account, bob.id.to_s) + end + + context 'without an authorization header' do + let(:headers) { {} } + + it 'returns http unauthorized' do + subject + + expect(response).to have_http_status(401) + end + end + end +end From 0b39b9abee65894efb5797b364e7f2af9b12ba5b Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Thu, 22 Jun 2023 05:53:28 -0400 Subject: [PATCH 079/118] Speed-up on `BackupService` spec (#25527) --- spec/services/backup_service_spec.rb | 83 ++++++++++++++++------------ 1 file changed, 48 insertions(+), 35 deletions(-) diff --git a/spec/services/backup_service_spec.rb b/spec/services/backup_service_spec.rb index 73e0b42adb..806ba18323 100644 --- a/spec/services/backup_service_spec.rb +++ b/spec/services/backup_service_spec.rb @@ -30,7 +30,7 @@ RSpec.describe BackupService, type: :service do it 'stores them as expected' do service_call - json = Oj.load(read_zip_file(backup, 'actor.json')) + json = export_json(:actor) avatar_path = json.dig('icon', 'url') header_path = json.dig('image', 'url') @@ -42,47 +42,60 @@ RSpec.describe BackupService, type: :service do end end - it 'marks the backup as processed' do - expect { service_call }.to change(backup, :processed).from(false).to(true) + it 'marks the backup as processed and exports files' do + expect { service_call }.to process_backup + + expect_outbox_export + expect_likes_export + expect_bookmarks_export end - it 'exports outbox.json as expected' do - service_call + def process_backup + change(backup, :processed).from(false).to(true) + end - json = Oj.load(read_zip_file(backup, 'outbox.json')) - expect(json['@context']).to_not be_nil - expect(json['type']).to eq 'OrderedCollection' - expect(json['totalItems']).to eq 2 - expect(json['orderedItems'][0]['@context']).to be_nil - expect(json['orderedItems'][0]).to include({ + def expect_outbox_export + json = export_json(:outbox) + + aggregate_failures do + expect(json['@context']).to_not be_nil + expect(json['type']).to eq 'OrderedCollection' + expect(json['totalItems']).to eq 2 + expect(json['orderedItems'][0]['@context']).to be_nil + expect(json['orderedItems'][0]).to include_create_item(status) + expect(json['orderedItems'][1]).to include_create_item(private_status) + end + end + + def expect_likes_export + json = export_json(:likes) + + aggregate_failures do + expect(json['type']).to eq 'OrderedCollection' + expect(json['orderedItems']).to eq [ActivityPub::TagManager.instance.uri_for(favourite.status)] + end + end + + def expect_bookmarks_export + json = export_json(:bookmarks) + + aggregate_failures do + expect(json['type']).to eq 'OrderedCollection' + expect(json['orderedItems']).to eq [ActivityPub::TagManager.instance.uri_for(bookmark.status)] + end + end + + def export_json(type) + Oj.load(read_zip_file(backup, "#{type}.json")) + end + + def include_create_item(status) + include({ 'type' => 'Create', 'object' => include({ 'id' => ActivityPub::TagManager.instance.uri_for(status), - 'content' => '

Hello

', + 'content' => "

#{status.text}

", }), }) - expect(json['orderedItems'][1]).to include({ - 'type' => 'Create', - 'object' => include({ - 'id' => ActivityPub::TagManager.instance.uri_for(private_status), - 'content' => '

secret

', - }), - }) - end - - it 'exports likes.json as expected' do - service_call - - json = Oj.load(read_zip_file(backup, 'likes.json')) - expect(json['type']).to eq 'OrderedCollection' - expect(json['orderedItems']).to eq [ActivityPub::TagManager.instance.uri_for(favourite.status)] - end - - it 'exports bookmarks.json as expected' do - service_call - - json = Oj.load(read_zip_file(backup, 'bookmarks.json')) - expect(json['type']).to eq 'OrderedCollection' - expect(json['orderedItems']).to eq [ActivityPub::TagManager.instance.uri_for(bookmark.status)] end end From 8d2c26834f7a485e6fd9083b17b025ad5030e471 Mon Sep 17 00:00:00 2001 From: mogaminsk Date: Thu, 22 Jun 2023 19:10:49 +0900 Subject: [PATCH 080/118] Fix custom signup URL may not loaded (#25531) --- .../mastodon/features/ui/components/header.jsx | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/javascript/mastodon/features/ui/components/header.jsx b/app/javascript/mastodon/features/ui/components/header.jsx index bb6747c00c..05abc1ca63 100644 --- a/app/javascript/mastodon/features/ui/components/header.jsx +++ b/app/javascript/mastodon/features/ui/components/header.jsx @@ -8,6 +8,7 @@ import { Link, withRouter } from 'react-router-dom'; import { connect } from 'react-redux'; import { openModal } from 'mastodon/actions/modal'; +import { fetchServer } from 'mastodon/actions/server'; import { Avatar } from 'mastodon/components/avatar'; import { WordmarkLogo, SymbolLogo } from 'mastodon/components/logo'; import { registrationsOpen, me } from 'mastodon/initial_state'; @@ -28,6 +29,9 @@ const mapDispatchToProps = (dispatch) => ({ openClosedRegistrationsModal() { dispatch(openModal({ modalType: 'CLOSED_REGISTRATIONS' })); }, + dispatchServer() { + dispatch(fetchServer()); + } }); class Header extends PureComponent { @@ -40,8 +44,14 @@ class Header extends PureComponent { openClosedRegistrationsModal: PropTypes.func, location: PropTypes.object, signupUrl: PropTypes.string.isRequired, + dispatchServer: PropTypes.func }; + componentDidMount () { + const { dispatchServer } = this.props; + dispatchServer(); + } + render () { const { signedIn } = this.context.identity; const { location, openClosedRegistrationsModal, signupUrl } = this.props; From 63d15d533070a3c1b97f048fbfffa0b1a34381e4 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Thu, 22 Jun 2023 08:51:53 -0400 Subject: [PATCH 081/118] Speed-up on `StatusesController` spec (#25549) --- spec/controllers/statuses_controller_spec.rb | 237 ++----------------- 1 file changed, 21 insertions(+), 216 deletions(-) diff --git a/spec/controllers/statuses_controller_spec.rb b/spec/controllers/statuses_controller_spec.rb index 1885814cda..bd98929c02 100644 --- a/spec/controllers/statuses_controller_spec.rb +++ b/spec/controllers/statuses_controller_spec.rb @@ -75,23 +75,11 @@ describe StatusesController do context 'with HTML' do let(:format) { 'html' } - it 'returns http success' do + it 'renders status successfully', :aggregate_failures do expect(response).to have_http_status(200) - end - - it 'returns Link header' do expect(response.headers['Link'].to_s).to include 'activity+json' - end - - it 'returns Vary header' do expect(response.headers['Vary']).to eq 'Accept, Accept-Language, Cookie' - end - - it 'returns public Cache-Control header' do expect(response.headers['Cache-Control']).to include 'public' - end - - it 'renders status' do expect(response).to render_template(:show) expect(response.body).to include status.text end @@ -100,25 +88,13 @@ describe StatusesController do context 'with JSON' do let(:format) { 'json' } - it 'returns http success' do - expect(response).to have_http_status(200) - end - - it 'returns Link header' do - expect(response.headers['Link'].to_s).to include 'activity+json' - end - - it 'returns Vary header' do - expect(response.headers['Vary']).to eq 'Accept, Accept-Language, Cookie' - end - it_behaves_like 'cacheable response' - it 'returns Content-Type header' do + it 'renders ActivityPub Note object successfully', :aggregate_failures do + expect(response).to have_http_status(200) + expect(response.headers['Link'].to_s).to include 'activity+json' + expect(response.headers['Vary']).to eq 'Accept, Accept-Language, Cookie' expect(response.headers['Content-Type']).to include 'application/activity+json' - end - - it 'renders ActivityPub Note object' do json = body_as_json expect(json[:content]).to include status.text end @@ -199,23 +175,11 @@ describe StatusesController do context 'with HTML' do let(:format) { 'html' } - it 'returns http success' do + it 'renders status successfully', :aggregate_failures do expect(response).to have_http_status(200) - end - - it 'returns Link header' do expect(response.headers['Link'].to_s).to include 'activity+json' - end - - it 'returns Vary header' do expect(response.headers['Vary']).to eq 'Accept, Accept-Language, Cookie' - end - - it 'returns private Cache-Control header' do expect(response.headers['Cache-Control']).to include 'private' - end - - it 'renders status' do expect(response).to render_template(:show) expect(response.body).to include status.text end @@ -224,27 +188,12 @@ describe StatusesController do context 'with JSON' do let(:format) { 'json' } - it 'returns http success' do + it 'renders ActivityPub Note object successfully', :aggregate_failures do expect(response).to have_http_status(200) - end - - it 'returns Link header' do expect(response.headers['Link'].to_s).to include 'activity+json' - end - - it 'returns Vary header' do expect(response.headers['Vary']).to eq 'Accept, Accept-Language, Cookie' - end - - it 'returns private Cache-Control header' do expect(response.headers['Cache-Control']).to include 'private' - end - - it 'returns Content-Type header' do expect(response.headers['Content-Type']).to include 'application/activity+json' - end - - it 'renders ActivityPub Note object' do json = body_as_json expect(json[:content]).to include status.text end @@ -263,23 +212,11 @@ describe StatusesController do context 'with HTML' do let(:format) { 'html' } - it 'returns http success' do + it 'renders status successfully', :aggregate_failures do expect(response).to have_http_status(200) - end - - it 'returns Link header' do expect(response.headers['Link'].to_s).to include 'activity+json' - end - - it 'returns Vary header' do expect(response.headers['Vary']).to eq 'Accept, Accept-Language, Cookie' - end - - it 'returns private Cache-Control header' do expect(response.headers['Cache-Control']).to include 'private' - end - - it 'renders status' do expect(response).to render_template(:show) expect(response.body).to include status.text end @@ -288,27 +225,12 @@ describe StatusesController do context 'with JSON' do let(:format) { 'json' } - it 'returns http success' do + it 'renders ActivityPub Note object successfully', :aggregate_failures do expect(response).to have_http_status(200) - end - - it 'returns Link header' do expect(response.headers['Link'].to_s).to include 'activity+json' - end - - it 'returns Vary header' do expect(response.headers['Vary']).to eq 'Accept, Accept-Language, Cookie' - end - - it 'returns private Cache-Control header' do expect(response.headers['Cache-Control']).to include 'private' - end - - it 'returns Content-Type header' do expect(response.headers['Content-Type']).to include 'application/activity+json' - end - - it 'renders ActivityPub Note object' do json = body_as_json expect(json[:content]).to include status.text end @@ -350,23 +272,11 @@ describe StatusesController do context 'with HTML' do let(:format) { 'html' } - it 'returns http success' do + it 'renders status successfully', :aggregate_failures do expect(response).to have_http_status(200) - end - - it 'returns Link header' do expect(response.headers['Link'].to_s).to include 'activity+json' - end - - it 'returns Vary header' do expect(response.headers['Vary']).to eq 'Accept, Accept-Language, Cookie' - end - - it 'returns private Cache-Control header' do expect(response.headers['Cache-Control']).to include 'private' - end - - it 'renders status' do expect(response).to render_template(:show) expect(response.body).to include status.text end @@ -375,27 +285,12 @@ describe StatusesController do context 'with JSON' do let(:format) { 'json' } - it 'returns http success' do + it 'renders ActivityPub Note object successfully' do expect(response).to have_http_status(200) - end - - it 'returns Link header' do expect(response.headers['Link'].to_s).to include 'activity+json' - end - - it 'returns Vary header' do expect(response.headers['Vary']).to eq 'Accept, Accept-Language, Cookie' - end - - it 'returns private Cache-Control header' do expect(response.headers['Cache-Control']).to include 'private' - end - - it 'returns Content-Type header' do expect(response.headers['Content-Type']).to include 'application/activity+json' - end - - it 'renders ActivityPub Note object' do json = body_as_json expect(json[:content]).to include status.text end @@ -463,23 +358,11 @@ describe StatusesController do context 'with HTML' do let(:format) { 'html' } - it 'returns http success' do + it 'renders status successfully', :aggregate_failures do expect(response).to have_http_status(200) - end - - it 'returns Link header' do expect(response.headers['Link'].to_s).to include 'activity+json' - end - - it 'returns Vary header' do expect(response.headers['Vary']).to eq 'Accept, Accept-Language, Cookie' - end - - it 'returns private Cache-Control header' do expect(response.headers['Cache-Control']).to include 'private' - end - - it 'renders status' do expect(response).to render_template(:show) expect(response.body).to include status.text end @@ -488,25 +371,13 @@ describe StatusesController do context 'with JSON' do let(:format) { 'json' } - it 'returns http success' do - expect(response).to have_http_status(200) - end - - it 'returns Link header' do - expect(response.headers['Link'].to_s).to include 'activity+json' - end - - it 'returns Vary header' do - expect(response.headers['Vary']).to eq 'Accept, Accept-Language, Cookie' - end - it_behaves_like 'cacheable response' - it 'returns Content-Type header' do + it 'renders ActivityPub Note object successfully', :aggregate_failures do + expect(response).to have_http_status(200) + expect(response.headers['Link'].to_s).to include 'activity+json' + expect(response.headers['Vary']).to eq 'Accept, Accept-Language, Cookie' expect(response.headers['Content-Type']).to include 'application/activity+json' - end - - it 'renders ActivityPub Note object' do json = body_as_json expect(json[:content]).to include status.text end @@ -525,23 +396,11 @@ describe StatusesController do context 'with HTML' do let(:format) { 'html' } - it 'returns http success' do + it 'renders status successfully', :aggregate_failures do expect(response).to have_http_status(200) - end - - it 'returns Link header' do expect(response.headers['Link'].to_s).to include 'activity+json' - end - - it 'returns Vary header' do expect(response.headers['Vary']).to eq 'Accept, Accept-Language, Cookie' - end - - it 'returns private Cache-Control header' do expect(response.headers['Cache-Control']).to include 'private' - end - - it 'renders status' do expect(response).to render_template(:show) expect(response.body).to include status.text end @@ -550,27 +409,12 @@ describe StatusesController do context 'with JSON' do let(:format) { 'json' } - it 'returns http success' do + it 'renders ActivityPub Note object successfully' do expect(response).to have_http_status(200) - end - - it 'returns Link header' do expect(response.headers['Link'].to_s).to include 'activity+json' - end - - it 'returns Vary header' do expect(response.headers['Vary']).to eq 'Accept, Accept-Language, Cookie' - end - - it 'returns private Cache-Control header' do expect(response.headers['Cache-Control']).to include 'private' - end - - it 'returns Content-Type header' do expect(response.headers['Content-Type']).to include 'application/activity+json' - end - - it 'renders ActivityPub Note object' do json = body_as_json expect(json[:content]).to include status.text end @@ -612,23 +456,11 @@ describe StatusesController do context 'with HTML' do let(:format) { 'html' } - it 'returns http success' do + it 'renders status successfully', :aggregate_failures do expect(response).to have_http_status(200) - end - - it 'returns Link header' do expect(response.headers['Link'].to_s).to include 'activity+json' - end - - it 'returns Vary header' do expect(response.headers['Vary']).to eq 'Accept, Accept-Language, Cookie' - end - - it 'returns private Cache-Control header' do expect(response.headers['Cache-Control']).to include 'private' - end - - it 'renders status' do expect(response).to render_template(:show) expect(response.body).to include status.text end @@ -637,27 +469,12 @@ describe StatusesController do context 'with JSON' do let(:format) { 'json' } - it 'returns http success' do + it 'renders ActivityPub Note object', :aggregate_failures do expect(response).to have_http_status(200) - end - - it 'returns Link header' do expect(response.headers['Link'].to_s).to include 'activity+json' - end - - it 'returns Vary header' do expect(response.headers['Vary']).to eq 'Accept, Accept-Language, Cookie' - end - - it 'returns private Cache-Control header' do expect(response.headers['Cache-Control']).to include 'private' - end - - it 'returns Content-Type header' do expect(response.headers['Content-Type']).to include 'application/activity+json' - end - - it 'renders ActivityPub Note object' do json = body_as_json expect(json[:content]).to include status.text end @@ -933,23 +750,11 @@ describe StatusesController do get :embed, params: { account_username: status.account.username, id: status.id } end - it 'returns http success' do + it 'renders status successfully', :aggregate_failures do expect(response).to have_http_status(200) - end - - it 'returns Link header' do expect(response.headers['Link'].to_s).to include 'activity+json' - end - - it 'returns Vary header' do expect(response.headers['Vary']).to eq 'Accept, Accept-Language, Cookie' - end - - it 'returns public Cache-Control header' do expect(response.headers['Cache-Control']).to include 'public' - end - - it 'renders status' do expect(response).to render_template(:embed) expect(response.body).to include status.text end From 602c458ab6773e56e512c032c16fe4c7cddc1c44 Mon Sep 17 00:00:00 2001 From: Claire Date: Thu, 22 Jun 2023 14:52:25 +0200 Subject: [PATCH 082/118] Add finer permission requirements for managing webhooks (#25463) --- app/controllers/admin/webhooks_controller.rb | 3 +++ app/models/webhook.rb | 22 +++++++++++++++++++ app/policies/webhook_policy.rb | 4 ++-- app/views/admin/webhooks/_form.html.haml | 2 +- config/locales/activerecord.en.yml | 4 ++++ .../admin/webhooks_controller_spec.rb | 2 +- spec/policies/webhook_policy_spec.rb | 22 ++++++++++++++++--- 7 files changed, 52 insertions(+), 7 deletions(-) diff --git a/app/controllers/admin/webhooks_controller.rb b/app/controllers/admin/webhooks_controller.rb index e087476658..f1aad7c4b5 100644 --- a/app/controllers/admin/webhooks_controller.rb +++ b/app/controllers/admin/webhooks_controller.rb @@ -28,6 +28,7 @@ module Admin authorize :webhook, :create? @webhook = Webhook.new(resource_params) + @webhook.current_account = current_account if @webhook.save redirect_to admin_webhook_path(@webhook) @@ -39,6 +40,8 @@ module Admin def update authorize @webhook, :update? + @webhook.current_account = current_account + if @webhook.update(resource_params) redirect_to admin_webhook_path(@webhook) else diff --git a/app/models/webhook.rb b/app/models/webhook.rb index c46fce743e..14f33c5fc4 100644 --- a/app/models/webhook.rb +++ b/app/models/webhook.rb @@ -24,6 +24,8 @@ class Webhook < ApplicationRecord status.updated ).freeze + attr_writer :current_account + scope :enabled, -> { where(enabled: true) } validates :url, presence: true, url: true @@ -31,6 +33,7 @@ class Webhook < ApplicationRecord validates :events, presence: true validate :validate_events + validate :validate_permissions validate :validate_template before_validation :strip_events @@ -48,12 +51,31 @@ class Webhook < ApplicationRecord update!(enabled: false) end + def required_permissions + events.map { |event| Webhook.permission_for_event(event) } + end + + def self.permission_for_event(event) + case event + when 'account.approved', 'account.created', 'account.updated' + :manage_users + when 'report.created' + :manage_reports + when 'status.created', 'status.updated' + :view_devops + end + end + private def validate_events errors.add(:events, :invalid) if events.any? { |e| EVENTS.exclude?(e) } end + def validate_permissions + errors.add(:events, :invalid_permissions) if defined?(@current_account) && required_permissions.any? { |permission| !@current_account.user_role.can?(permission) } + end + def validate_template return if template.blank? diff --git a/app/policies/webhook_policy.rb b/app/policies/webhook_policy.rb index a2199a333f..577e891b66 100644 --- a/app/policies/webhook_policy.rb +++ b/app/policies/webhook_policy.rb @@ -14,7 +14,7 @@ class WebhookPolicy < ApplicationPolicy end def update? - role.can?(:manage_webhooks) + role.can?(:manage_webhooks) && record.required_permissions.all? { |permission| role.can?(permission) } end def enable? @@ -30,6 +30,6 @@ class WebhookPolicy < ApplicationPolicy end def destroy? - role.can?(:manage_webhooks) + role.can?(:manage_webhooks) && record.required_permissions.all? { |permission| role.can?(permission) } end end diff --git a/app/views/admin/webhooks/_form.html.haml b/app/views/admin/webhooks/_form.html.haml index 8d019ff43b..c870e943f4 100644 --- a/app/views/admin/webhooks/_form.html.haml +++ b/app/views/admin/webhooks/_form.html.haml @@ -5,7 +5,7 @@ = f.input :url, wrapper: :with_block_label, input_html: { placeholder: 'https://' } .fields-group - = f.input :events, collection: Webhook::EVENTS, wrapper: :with_block_label, include_blank: false, as: :check_boxes, collection_wrapper_tag: 'ul', item_wrapper_tag: 'li' + = f.input :events, collection: Webhook::EVENTS, wrapper: :with_block_label, include_blank: false, as: :check_boxes, collection_wrapper_tag: 'ul', item_wrapper_tag: 'li', disabled: Webhook::EVENTS.filter { |event| !current_user.role.can?(Webhook.permission_for_event(event)) } .fields-group = f.input :template, wrapper: :with_block_label, input_html: { placeholder: '{ "content": "Hello {{object.username}}" }' } diff --git a/config/locales/activerecord.en.yml b/config/locales/activerecord.en.yml index 8aee15659f..a53c7c6e9e 100644 --- a/config/locales/activerecord.en.yml +++ b/config/locales/activerecord.en.yml @@ -53,3 +53,7 @@ en: position: elevated: cannot be higher than your current role own_role: cannot be changed with your current role + webhook: + attributes: + events: + invalid_permissions: cannot include events you don't have the rights to diff --git a/spec/controllers/admin/webhooks_controller_spec.rb b/spec/controllers/admin/webhooks_controller_spec.rb index 074956c555..0ccfbbcc6e 100644 --- a/spec/controllers/admin/webhooks_controller_spec.rb +++ b/spec/controllers/admin/webhooks_controller_spec.rb @@ -48,7 +48,7 @@ describe Admin::WebhooksController do end context 'with an existing record' do - let!(:webhook) { Fabricate :webhook } + let!(:webhook) { Fabricate(:webhook, events: ['account.created', 'report.created']) } describe 'GET #show' do it 'returns http success and renders view' do diff --git a/spec/policies/webhook_policy_spec.rb b/spec/policies/webhook_policy_spec.rb index 1eac8932d4..909311461a 100644 --- a/spec/policies/webhook_policy_spec.rb +++ b/spec/policies/webhook_policy_spec.rb @@ -8,16 +8,32 @@ describe WebhookPolicy do let(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')).account } let(:john) { Fabricate(:account) } - permissions :index?, :create?, :show?, :update?, :enable?, :disable?, :rotate_secret?, :destroy? do + permissions :index?, :create? do context 'with an admin' do it 'permits' do - expect(policy).to permit(admin, Tag) + expect(policy).to permit(admin, Webhook) end end context 'with a non-admin' do it 'denies' do - expect(policy).to_not permit(john, Tag) + expect(policy).to_not permit(john, Webhook) + end + end + end + + permissions :show?, :update?, :enable?, :disable?, :rotate_secret?, :destroy? do + let(:webhook) { Fabricate(:webhook, events: ['account.created', 'report.created']) } + + context 'with an admin' do + it 'permits' do + expect(policy).to permit(admin, webhook) + end + end + + context 'with a non-admin' do + it 'denies' do + expect(policy).to_not permit(john, webhook) end end end From 38433ccd0bb9a47c9882e64d4644f7c5b47858b3 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Thu, 22 Jun 2023 08:53:13 -0400 Subject: [PATCH 083/118] Reduce `Admin::Reports::Actions` spec db activity (#25465) --- .../admin/reports/actions_controller_spec.rb | 30 ++++++++----------- 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/spec/controllers/admin/reports/actions_controller_spec.rb b/spec/controllers/admin/reports/actions_controller_spec.rb index 701855f92e..1f3951516d 100644 --- a/spec/controllers/admin/reports/actions_controller_spec.rb +++ b/spec/controllers/admin/reports/actions_controller_spec.rb @@ -62,17 +62,10 @@ describe Admin::Reports::ActionsController do end shared_examples 'common behavior' do - it 'closes the report' do - expect { subject }.to change { report.reload.action_taken? }.from(false).to(true) - end + it 'closes the report and redirects' do + expect { subject }.to mark_report_action_taken.and create_target_account_strike - it 'creates a strike with the expected text' do - expect { subject }.to change { report.target_account.strikes.count }.by(1) expect(report.target_account.strikes.last.text).to eq text - end - - it 'redirects' do - subject expect(response).to redirect_to(admin_reports_path) end @@ -81,20 +74,21 @@ describe Admin::Reports::ActionsController do { report_id: report.id } end - it 'closes the report' do - expect { subject }.to change { report.reload.action_taken? }.from(false).to(true) - end + it 'closes the report and redirects' do + expect { subject }.to mark_report_action_taken.and create_target_account_strike - it 'creates a strike with the expected text' do - expect { subject }.to change { report.target_account.strikes.count }.by(1) expect(report.target_account.strikes.last.text).to eq '' - end - - it 'redirects' do - subject expect(response).to redirect_to(admin_reports_path) end end + + def mark_report_action_taken + change { report.reload.action_taken? }.from(false).to(true) + end + + def create_target_account_strike + change { report.target_account.strikes.count }.by(1) + end end shared_examples 'all action types' do From 05f9e39b32f15d71eb9ec524d1ab871e5c0d03da Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Thu, 22 Jun 2023 08:55:22 -0400 Subject: [PATCH 084/118] Fix `RSpec/VerifiedDoubles` cop (#25469) --- .rubocop_todo.yml | 39 ------------------- .../admin/change_emails_controller_spec.rb | 3 +- .../admin/confirmations_controller_spec.rb | 2 +- .../admin/disputes/appeals_controller_spec.rb | 6 ++- .../admin/domain_allows_controller_spec.rb | 2 +- .../admin/domain_blocks_controller_spec.rb | 2 +- .../api/v1/reports_controller_spec.rb | 3 +- .../api/web/embeds_controller_spec.rb | 2 +- .../auth/sessions_controller_spec.rb | 3 +- .../authorize_interactions_controller_spec.rb | 10 ++--- .../disputes/appeals_controller_spec.rb | 3 +- spec/helpers/statuses_helper_spec.rb | 34 ++++++++-------- spec/lib/activitypub/activity/add_spec.rb | 2 +- spec/lib/activitypub/activity/move_spec.rb | 2 +- spec/lib/request_spec.rb | 4 +- spec/lib/suspicious_sign_in_detector_spec.rb | 2 +- spec/models/account/field_spec.rb | 6 +-- spec/models/account_migration_spec.rb | 4 +- spec/models/session_activation_spec.rb | 4 +- spec/models/setting_spec.rb | 2 +- spec/services/account_search_service_spec.rb | 4 +- .../bootstrap_timeline_service_spec.rb | 2 +- spec/services/bulk_import_service_spec.rb | 16 ++++---- spec/services/fetch_resource_service_spec.rb | 4 +- spec/services/import_service_spec.rb | 2 +- spec/services/post_status_service_spec.rb | 4 +- spec/services/resolve_url_service_spec.rb | 4 +- spec/services/search_service_spec.rb | 8 ++-- .../unsuspend_account_service_spec.rb | 2 +- .../blacklisted_email_validator_spec.rb | 4 +- .../disallowed_hashtags_validator_spec.rb | 4 +- spec/validators/email_mx_validator_spec.rb | 32 ++++++++------- .../validators/follow_limit_validator_spec.rb | 6 +-- spec/validators/note_length_validator_spec.rb | 12 ++++-- spec/validators/poll_validator_spec.rb | 4 +- .../status_length_validator_spec.rb | 26 ++++++++----- spec/validators/status_pin_validator_spec.rb | 10 ++--- .../unique_username_validator_spec.rb | 20 ++++++---- .../unreserved_username_validator_spec.rb | 4 +- spec/validators/url_validator_spec.rb | 4 +- spec/views/statuses/show.html.haml_spec.rb | 2 +- .../activitypub/processing_worker_spec.rb | 3 +- .../workers/admin/domain_purge_worker_spec.rb | 2 +- spec/workers/domain_block_worker_spec.rb | 2 +- .../workers/domain_clear_media_worker_spec.rb | 2 +- spec/workers/feed_insert_worker_spec.rb | 8 ++-- spec/workers/move_worker_spec.rb | 2 +- ...lish_scheduled_announcement_worker_spec.rb | 2 +- spec/workers/refollow_worker_spec.rb | 2 +- spec/workers/regeneration_worker_spec.rb | 2 +- 50 files changed, 162 insertions(+), 172 deletions(-) diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index f3b24cdbc4..975c9d28fb 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -437,45 +437,6 @@ RSpec/SubjectStub: - 'spec/services/unallow_domain_service_spec.rb' - 'spec/validators/blacklisted_email_validator_spec.rb' -# Configuration parameters: IgnoreNameless, IgnoreSymbolicNames. -RSpec/VerifiedDoubles: - Exclude: - - 'spec/controllers/admin/change_emails_controller_spec.rb' - - 'spec/controllers/admin/confirmations_controller_spec.rb' - - 'spec/controllers/admin/disputes/appeals_controller_spec.rb' - - 'spec/controllers/admin/domain_allows_controller_spec.rb' - - 'spec/controllers/admin/domain_blocks_controller_spec.rb' - - 'spec/controllers/api/v1/reports_controller_spec.rb' - - 'spec/controllers/api/web/embeds_controller_spec.rb' - - 'spec/controllers/auth/sessions_controller_spec.rb' - - 'spec/controllers/disputes/appeals_controller_spec.rb' - - 'spec/helpers/statuses_helper_spec.rb' - - 'spec/lib/suspicious_sign_in_detector_spec.rb' - - 'spec/models/account/field_spec.rb' - - 'spec/models/session_activation_spec.rb' - - 'spec/models/setting_spec.rb' - - 'spec/services/account_search_service_spec.rb' - - 'spec/services/post_status_service_spec.rb' - - 'spec/services/search_service_spec.rb' - - 'spec/validators/blacklisted_email_validator_spec.rb' - - 'spec/validators/disallowed_hashtags_validator_spec.rb' - - 'spec/validators/email_mx_validator_spec.rb' - - 'spec/validators/follow_limit_validator_spec.rb' - - 'spec/validators/note_length_validator_spec.rb' - - 'spec/validators/poll_validator_spec.rb' - - 'spec/validators/status_length_validator_spec.rb' - - 'spec/validators/status_pin_validator_spec.rb' - - 'spec/validators/unique_username_validator_spec.rb' - - 'spec/validators/unreserved_username_validator_spec.rb' - - 'spec/validators/url_validator_spec.rb' - - 'spec/views/statuses/show.html.haml_spec.rb' - - 'spec/workers/activitypub/processing_worker_spec.rb' - - 'spec/workers/admin/domain_purge_worker_spec.rb' - - 'spec/workers/domain_block_worker_spec.rb' - - 'spec/workers/domain_clear_media_worker_spec.rb' - - 'spec/workers/feed_insert_worker_spec.rb' - - 'spec/workers/regeneration_worker_spec.rb' - # This cop supports unsafe autocorrection (--autocorrect-all). Rails/ApplicationController: Exclude: diff --git a/spec/controllers/admin/change_emails_controller_spec.rb b/spec/controllers/admin/change_emails_controller_spec.rb index 503862a7b9..dd8a764b64 100644 --- a/spec/controllers/admin/change_emails_controller_spec.rb +++ b/spec/controllers/admin/change_emails_controller_spec.rb @@ -23,7 +23,8 @@ RSpec.describe Admin::ChangeEmailsController do describe 'GET #update' do before do - allow(UserMailer).to receive(:confirmation_instructions).and_return(double('email', deliver_later: nil)) + allow(UserMailer).to receive(:confirmation_instructions) + .and_return(instance_double(ActionMailer::MessageDelivery, deliver_later: nil)) end it 'returns http success' do diff --git a/spec/controllers/admin/confirmations_controller_spec.rb b/spec/controllers/admin/confirmations_controller_spec.rb index 181616a66e..9559160786 100644 --- a/spec/controllers/admin/confirmations_controller_spec.rb +++ b/spec/controllers/admin/confirmations_controller_spec.rb @@ -38,7 +38,7 @@ RSpec.describe Admin::ConfirmationsController do let!(:user) { Fabricate(:user, confirmed_at: confirmed_at) } before do - allow(UserMailer).to receive(:confirmation_instructions) { double(:email, deliver_later: nil) } + allow(UserMailer).to receive(:confirmation_instructions) { instance_double(ActionMailer::MessageDelivery, deliver_later: nil) } end context 'when email is not confirmed' do diff --git a/spec/controllers/admin/disputes/appeals_controller_spec.rb b/spec/controllers/admin/disputes/appeals_controller_spec.rb index 99b19298c6..3c3f23f529 100644 --- a/spec/controllers/admin/disputes/appeals_controller_spec.rb +++ b/spec/controllers/admin/disputes/appeals_controller_spec.rb @@ -19,7 +19,8 @@ RSpec.describe Admin::Disputes::AppealsController do let(:current_user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) } before do - allow(UserMailer).to receive(:appeal_approved).and_return(double('email', deliver_later: nil)) + allow(UserMailer).to receive(:appeal_approved) + .and_return(instance_double(ActionMailer::MessageDelivery, deliver_later: nil)) post :approve, params: { id: appeal.id } end @@ -40,7 +41,8 @@ RSpec.describe Admin::Disputes::AppealsController do let(:current_user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) } before do - allow(UserMailer).to receive(:appeal_rejected).and_return(double('email', deliver_later: nil)) + allow(UserMailer).to receive(:appeal_rejected) + .and_return(instance_double(ActionMailer::MessageDelivery, deliver_later: nil)) post :reject, params: { id: appeal.id } end diff --git a/spec/controllers/admin/domain_allows_controller_spec.rb b/spec/controllers/admin/domain_allows_controller_spec.rb index 6b0453476a..6f82f322b5 100644 --- a/spec/controllers/admin/domain_allows_controller_spec.rb +++ b/spec/controllers/admin/domain_allows_controller_spec.rb @@ -37,7 +37,7 @@ RSpec.describe Admin::DomainAllowsController do describe 'DELETE #destroy' do it 'disallows the domain' do - service = double(call: true) + service = instance_double(UnallowDomainService, call: true) allow(UnallowDomainService).to receive(:new).and_return(service) domain_allow = Fabricate(:domain_allow) delete :destroy, params: { id: domain_allow.id } diff --git a/spec/controllers/admin/domain_blocks_controller_spec.rb b/spec/controllers/admin/domain_blocks_controller_spec.rb index d499aa64ce..fb7fb2957f 100644 --- a/spec/controllers/admin/domain_blocks_controller_spec.rb +++ b/spec/controllers/admin/domain_blocks_controller_spec.rb @@ -213,7 +213,7 @@ RSpec.describe Admin::DomainBlocksController do describe 'DELETE #destroy' do it 'unblocks the domain' do - service = double(call: true) + service = instance_double(UnblockDomainService, call: true) allow(UnblockDomainService).to receive(:new).and_return(service) domain_block = Fabricate(:domain_block) delete :destroy, params: { id: domain_block.id } diff --git a/spec/controllers/api/v1/reports_controller_spec.rb b/spec/controllers/api/v1/reports_controller_spec.rb index 0eb9ce1709..01b7e4a71c 100644 --- a/spec/controllers/api/v1/reports_controller_spec.rb +++ b/spec/controllers/api/v1/reports_controller_spec.rb @@ -23,7 +23,8 @@ RSpec.describe Api::V1::ReportsController do let(:rule_ids) { nil } before do - allow(AdminMailer).to receive(:new_report).and_return(double('email', deliver_later: nil)) + allow(AdminMailer).to receive(:new_report) + .and_return(instance_double(ActionMailer::MessageDelivery, deliver_later: nil)) post :create, params: { status_ids: [status.id], account_id: target_account.id, comment: 'reasons', category: category, rule_ids: rule_ids, forward: forward } end diff --git a/spec/controllers/api/web/embeds_controller_spec.rb b/spec/controllers/api/web/embeds_controller_spec.rb index b0c48a5aed..8c4e1a8f26 100644 --- a/spec/controllers/api/web/embeds_controller_spec.rb +++ b/spec/controllers/api/web/embeds_controller_spec.rb @@ -26,7 +26,7 @@ describe Api::Web::EmbedsController do context 'when fails to find status' do let(:url) { 'https://host.test/oembed.html' } - let(:service_instance) { double('fetch_oembed_service') } + let(:service_instance) { instance_double(FetchOEmbedService) } before do allow(FetchOEmbedService).to receive(:new) { service_instance } diff --git a/spec/controllers/auth/sessions_controller_spec.rb b/spec/controllers/auth/sessions_controller_spec.rb index 5b7d5d5cd4..c727a76333 100644 --- a/spec/controllers/auth/sessions_controller_spec.rb +++ b/spec/controllers/auth/sessions_controller_spec.rb @@ -127,7 +127,8 @@ RSpec.describe Auth::SessionsController do before do allow_any_instance_of(ActionDispatch::Request).to receive(:remote_ip).and_return(current_ip) - allow(UserMailer).to receive(:suspicious_sign_in).and_return(double('email', deliver_later!: nil)) + allow(UserMailer).to receive(:suspicious_sign_in) + .and_return(instance_double(ActionMailer::MessageDelivery, deliver_later!: nil)) user.update(current_sign_in_at: 1.month.ago) post :create, params: { user: { email: user.email, password: user.password } } end diff --git a/spec/controllers/authorize_interactions_controller_spec.rb b/spec/controllers/authorize_interactions_controller_spec.rb index e521039410..098c25ba32 100644 --- a/spec/controllers/authorize_interactions_controller_spec.rb +++ b/spec/controllers/authorize_interactions_controller_spec.rb @@ -28,7 +28,7 @@ describe AuthorizeInteractionsController do end it 'renders error when account cant be found' do - service = double + service = instance_double(ResolveAccountService) allow(ResolveAccountService).to receive(:new).and_return(service) allow(service).to receive(:call).with('missing@hostname').and_return(nil) @@ -40,7 +40,7 @@ describe AuthorizeInteractionsController do it 'sets resource from url' do account = Fabricate(:account) - service = double + service = instance_double(ResolveURLService) allow(ResolveURLService).to receive(:new).and_return(service) allow(service).to receive(:call).with('http://example.com').and_return(account) @@ -52,7 +52,7 @@ describe AuthorizeInteractionsController do it 'sets resource from acct uri' do account = Fabricate(:account) - service = double + service = instance_double(ResolveAccountService) allow(ResolveAccountService).to receive(:new).and_return(service) allow(service).to receive(:call).with('found@hostname').and_return(account) @@ -82,7 +82,7 @@ describe AuthorizeInteractionsController do end it 'shows error when account not found' do - service = double + service = instance_double(ResolveAccountService) allow(ResolveAccountService).to receive(:new).and_return(service) allow(service).to receive(:call).with('user@hostname').and_return(nil) @@ -94,7 +94,7 @@ describe AuthorizeInteractionsController do it 'follows account when found' do target_account = Fabricate(:account) - service = double + service = instance_double(ResolveAccountService) allow(ResolveAccountService).to receive(:new).and_return(service) allow(service).to receive(:call).with('user@hostname').and_return(target_account) diff --git a/spec/controllers/disputes/appeals_controller_spec.rb b/spec/controllers/disputes/appeals_controller_spec.rb index d0e1cd3908..a0f9c7b910 100644 --- a/spec/controllers/disputes/appeals_controller_spec.rb +++ b/spec/controllers/disputes/appeals_controller_spec.rb @@ -14,7 +14,8 @@ RSpec.describe Disputes::AppealsController do let(:strike) { Fabricate(:account_warning, target_account: current_user.account) } before do - allow(AdminMailer).to receive(:new_appeal).and_return(double('email', deliver_later: nil)) + allow(AdminMailer).to receive(:new_appeal) + .and_return(instance_double(ActionMailer::MessageDelivery, deliver_later: nil)) post :create, params: { strike_id: strike.id, appeal: { text: 'Foo' } } end diff --git a/spec/helpers/statuses_helper_spec.rb b/spec/helpers/statuses_helper_spec.rb index 105da7e1b1..b7824ca604 100644 --- a/spec/helpers/statuses_helper_spec.rb +++ b/spec/helpers/statuses_helper_spec.rb @@ -117,42 +117,42 @@ describe StatusesHelper do describe '#style_classes' do it do - status = double(reblog?: false) + status = instance_double(Status, reblog?: false) classes = helper.style_classes(status, false, false, false) expect(classes).to eq 'entry' end it do - status = double(reblog?: true) + status = instance_double(Status, reblog?: true) classes = helper.style_classes(status, false, false, false) expect(classes).to eq 'entry entry-reblog' end it do - status = double(reblog?: false) + status = instance_double(Status, reblog?: false) classes = helper.style_classes(status, true, false, false) expect(classes).to eq 'entry entry-predecessor' end it do - status = double(reblog?: false) + status = instance_double(Status, reblog?: false) classes = helper.style_classes(status, false, true, false) expect(classes).to eq 'entry entry-successor' end it do - status = double(reblog?: false) + status = instance_double(Status, reblog?: false) classes = helper.style_classes(status, false, false, true) expect(classes).to eq 'entry entry-center' end it do - status = double(reblog?: true) + status = instance_double(Status, reblog?: true) classes = helper.style_classes(status, true, true, true) expect(classes).to eq 'entry entry-predecessor entry-reblog entry-successor entry-center' @@ -161,35 +161,35 @@ describe StatusesHelper do describe '#microformats_classes' do it do - status = double(reblog?: false) + status = instance_double(Status, reblog?: false) classes = helper.microformats_classes(status, false, false) expect(classes).to eq '' end it do - status = double(reblog?: false) + status = instance_double(Status, reblog?: false) classes = helper.microformats_classes(status, true, false) expect(classes).to eq 'p-in-reply-to' end it do - status = double(reblog?: false) + status = instance_double(Status, reblog?: false) classes = helper.microformats_classes(status, false, true) expect(classes).to eq 'p-comment' end it do - status = double(reblog?: true) + status = instance_double(Status, reblog?: true) classes = helper.microformats_classes(status, true, false) expect(classes).to eq 'p-in-reply-to p-repost-of' end it do - status = double(reblog?: true) + status = instance_double(Status, reblog?: true) classes = helper.microformats_classes(status, true, true) expect(classes).to eq 'p-in-reply-to p-repost-of p-comment' @@ -198,42 +198,42 @@ describe StatusesHelper do describe '#microformats_h_class' do it do - status = double(reblog?: false) + status = instance_double(Status, reblog?: false) css_class = helper.microformats_h_class(status, false, false, false) expect(css_class).to eq 'h-entry' end it do - status = double(reblog?: true) + status = instance_double(Status, reblog?: true) css_class = helper.microformats_h_class(status, false, false, false) expect(css_class).to eq 'h-cite' end it do - status = double(reblog?: false) + status = instance_double(Status, reblog?: false) css_class = helper.microformats_h_class(status, true, false, false) expect(css_class).to eq 'h-cite' end it do - status = double(reblog?: false) + status = instance_double(Status, reblog?: false) css_class = helper.microformats_h_class(status, false, true, false) expect(css_class).to eq 'h-cite' end it do - status = double(reblog?: false) + status = instance_double(Status, reblog?: false) css_class = helper.microformats_h_class(status, false, false, true) expect(css_class).to eq '' end it do - status = double(reblog?: true) + status = instance_double(Status, reblog?: true) css_class = helper.microformats_h_class(status, true, true, true) expect(css_class).to eq 'h-cite' diff --git a/spec/lib/activitypub/activity/add_spec.rb b/spec/lib/activitypub/activity/add_spec.rb index 9c45e465e4..ec6df01716 100644 --- a/spec/lib/activitypub/activity/add_spec.rb +++ b/spec/lib/activitypub/activity/add_spec.rb @@ -26,7 +26,7 @@ RSpec.describe ActivityPub::Activity::Add do end context 'when status was not known before' do - let(:service_stub) { double } + let(:service_stub) { instance_double(ActivityPub::FetchRemoteStatusService) } let(:json) do { diff --git a/spec/lib/activitypub/activity/move_spec.rb b/spec/lib/activitypub/activity/move_spec.rb index 8bd23aa7bf..f3973c70ce 100644 --- a/spec/lib/activitypub/activity/move_spec.rb +++ b/spec/lib/activitypub/activity/move_spec.rb @@ -26,7 +26,7 @@ RSpec.describe ActivityPub::Activity::Move do stub_request(:post, old_account.inbox_url).to_return(status: 200) stub_request(:post, new_account.inbox_url).to_return(status: 200) - service_stub = double + service_stub = instance_double(ActivityPub::FetchRemoteAccountService) allow(ActivityPub::FetchRemoteAccountService).to receive(:new).and_return(service_stub) allow(service_stub).to receive(:call).and_return(returned_account) end diff --git a/spec/lib/request_spec.rb b/spec/lib/request_spec.rb index e88631e475..f0861376b9 100644 --- a/spec/lib/request_spec.rb +++ b/spec/lib/request_spec.rb @@ -48,7 +48,7 @@ describe Request do end it 'executes a HTTP request when the first address is private' do - resolver = double + resolver = instance_double(Resolv::DNS) allow(resolver).to receive(:getaddresses).with('example.com').and_return(%w(0.0.0.0 2001:4860:4860::8844)) allow(resolver).to receive(:timeouts=).and_return(nil) @@ -83,7 +83,7 @@ describe Request do end it 'raises Mastodon::ValidationError' do - resolver = double + resolver = instance_double(Resolv::DNS) allow(resolver).to receive(:getaddresses).with('example.com').and_return(%w(0.0.0.0 2001:db8::face)) allow(resolver).to receive(:timeouts=).and_return(nil) diff --git a/spec/lib/suspicious_sign_in_detector_spec.rb b/spec/lib/suspicious_sign_in_detector_spec.rb index c61b1ef1e6..9e64aff08a 100644 --- a/spec/lib/suspicious_sign_in_detector_spec.rb +++ b/spec/lib/suspicious_sign_in_detector_spec.rb @@ -7,7 +7,7 @@ RSpec.describe SuspiciousSignInDetector do subject { described_class.new(user).suspicious?(request) } let(:user) { Fabricate(:user, current_sign_in_at: 1.day.ago) } - let(:request) { double(remote_ip: remote_ip) } + let(:request) { instance_double(ActionDispatch::Request, remote_ip: remote_ip) } let(:remote_ip) { nil } context 'when user has 2FA enabled' do diff --git a/spec/models/account/field_spec.rb b/spec/models/account/field_spec.rb index 5715a53791..22593bb218 100644 --- a/spec/models/account/field_spec.rb +++ b/spec/models/account/field_spec.rb @@ -6,7 +6,7 @@ RSpec.describe Account::Field do describe '#verified?' do subject { described_class.new(account, 'name' => 'Foo', 'value' => 'Bar', 'verified_at' => verified_at) } - let(:account) { double('Account', local?: true) } + let(:account) { instance_double(Account, local?: true) } context 'when verified_at is set' do let(:verified_at) { Time.now.utc.iso8601 } @@ -28,7 +28,7 @@ RSpec.describe Account::Field do describe '#mark_verified!' do subject { described_class.new(account, original_hash) } - let(:account) { double('Account', local?: true) } + let(:account) { instance_double(Account, local?: true) } let(:original_hash) { { 'name' => 'Foo', 'value' => 'Bar' } } before do @@ -47,7 +47,7 @@ RSpec.describe Account::Field do describe '#verifiable?' do subject { described_class.new(account, 'name' => 'Foo', 'value' => value) } - let(:account) { double('Account', local?: local) } + let(:account) { instance_double(Account, local?: local) } context 'with local accounts' do let(:local) { true } diff --git a/spec/models/account_migration_spec.rb b/spec/models/account_migration_spec.rb index d76edddd51..f4544740b1 100644 --- a/spec/models/account_migration_spec.rb +++ b/spec/models/account_migration_spec.rb @@ -15,7 +15,7 @@ RSpec.describe AccountMigration do before do target_account.aliases.create!(acct: source_account.acct) - service_double = double + service_double = instance_double(ResolveAccountService) allow(ResolveAccountService).to receive(:new).and_return(service_double) allow(service_double).to receive(:call).with(target_acct, anything).and_return(target_account) end @@ -29,7 +29,7 @@ RSpec.describe AccountMigration do let(:target_acct) { 'target@remote' } before do - service_double = double + service_double = instance_double(ResolveAccountService) allow(ResolveAccountService).to receive(:new).and_return(service_double) allow(service_double).to receive(:call).with(target_acct, anything).and_return(nil) end diff --git a/spec/models/session_activation_spec.rb b/spec/models/session_activation_spec.rb index 052a06e5ca..75842e25ba 100644 --- a/spec/models/session_activation_spec.rb +++ b/spec/models/session_activation_spec.rb @@ -16,7 +16,7 @@ RSpec.describe SessionActivation do allow(session_activation).to receive(:detection).and_return(detection) end - let(:detection) { double(id: 1) } + let(:detection) { instance_double(Browser::Chrome, id: 1) } let(:session_activation) { Fabricate(:session_activation) } it 'returns detection.id' do @@ -30,7 +30,7 @@ RSpec.describe SessionActivation do end let(:session_activation) { Fabricate(:session_activation) } - let(:detection) { double(platform: double(id: 1)) } + let(:detection) { instance_double(Browser::Chrome, platform: instance_double(Browser::Platform, id: 1)) } it 'returns detection.platform.id' do expect(session_activation.platform).to be 1 diff --git a/spec/models/setting_spec.rb b/spec/models/setting_spec.rb index bba585cec6..5ed5c5d766 100644 --- a/spec/models/setting_spec.rb +++ b/spec/models/setting_spec.rb @@ -62,7 +62,7 @@ RSpec.describe Setting do context 'when RailsSettings::Settings.object returns truthy' do let(:object) { db_val } - let(:db_val) { double(value: 'db_val') } + let(:db_val) { instance_double(described_class, value: 'db_val') } context 'when default_value is a Hash' do let(:default_value) { { default_value: 'default_value' } } diff --git a/spec/services/account_search_service_spec.rb b/spec/services/account_search_service_spec.rb index 98264e6e13..1cd036f484 100644 --- a/spec/services/account_search_service_spec.rb +++ b/spec/services/account_search_service_spec.rb @@ -53,7 +53,7 @@ describe AccountSearchService, type: :service do context 'when there is a domain but no exact match' do it 'follows the remote account when resolve is true' do - service = double(call: nil) + service = instance_double(ResolveAccountService, call: nil) allow(ResolveAccountService).to receive(:new).and_return(service) results = subject.call('newuser@remote.com', nil, limit: 10, resolve: true) @@ -61,7 +61,7 @@ describe AccountSearchService, type: :service do end it 'does not follow the remote account when resolve is false' do - service = double(call: nil) + service = instance_double(ResolveAccountService, call: nil) allow(ResolveAccountService).to receive(:new).and_return(service) results = subject.call('newuser@remote.com', nil, limit: 10, resolve: false) diff --git a/spec/services/bootstrap_timeline_service_spec.rb b/spec/services/bootstrap_timeline_service_spec.rb index 5a15ba7418..721a0337fd 100644 --- a/spec/services/bootstrap_timeline_service_spec.rb +++ b/spec/services/bootstrap_timeline_service_spec.rb @@ -6,7 +6,7 @@ RSpec.describe BootstrapTimelineService, type: :service do subject { described_class.new } context 'when the new user has registered from an invite' do - let(:service) { double } + let(:service) { instance_double(FollowService) } let(:autofollow) { false } let(:inviter) { Fabricate(:user, confirmed_at: 2.days.ago) } let(:invite) { Fabricate(:invite, user: inviter, max_uses: nil, expires_at: 1.hour.from_now, autofollow: autofollow) } diff --git a/spec/services/bulk_import_service_spec.rb b/spec/services/bulk_import_service_spec.rb index 09dfb0a0b6..281b642ea4 100644 --- a/spec/services/bulk_import_service_spec.rb +++ b/spec/services/bulk_import_service_spec.rb @@ -47,7 +47,7 @@ RSpec.describe BulkImportService do it 'requests to follow all the listed users once the workers have run' do subject.call(import) - resolve_account_service_double = double + resolve_account_service_double = instance_double(ResolveAccountService) allow(ResolveAccountService).to receive(:new).and_return(resolve_account_service_double) allow(resolve_account_service_double).to receive(:call).with('user@foo.bar', any_args) { Fabricate(:account, username: 'user', domain: 'foo.bar', protocol: :activitypub) } allow(resolve_account_service_double).to receive(:call).with('unknown@unknown.bar', any_args) { Fabricate(:account, username: 'unknown', domain: 'unknown.bar', protocol: :activitypub) } @@ -95,7 +95,7 @@ RSpec.describe BulkImportService do it 'requests to follow all the expected users once the workers have run' do subject.call(import) - resolve_account_service_double = double + resolve_account_service_double = instance_double(ResolveAccountService) allow(ResolveAccountService).to receive(:new).and_return(resolve_account_service_double) allow(resolve_account_service_double).to receive(:call).with('user@foo.bar', any_args) { Fabricate(:account, username: 'user', domain: 'foo.bar', protocol: :activitypub) } allow(resolve_account_service_double).to receive(:call).with('unknown@unknown.bar', any_args) { Fabricate(:account, username: 'unknown', domain: 'unknown.bar', protocol: :activitypub) } @@ -133,7 +133,7 @@ RSpec.describe BulkImportService do it 'blocks all the listed users once the workers have run' do subject.call(import) - resolve_account_service_double = double + resolve_account_service_double = instance_double(ResolveAccountService) allow(ResolveAccountService).to receive(:new).and_return(resolve_account_service_double) allow(resolve_account_service_double).to receive(:call).with('user@foo.bar', any_args) { Fabricate(:account, username: 'user', domain: 'foo.bar', protocol: :activitypub) } allow(resolve_account_service_double).to receive(:call).with('unknown@unknown.bar', any_args) { Fabricate(:account, username: 'unknown', domain: 'unknown.bar', protocol: :activitypub) } @@ -177,7 +177,7 @@ RSpec.describe BulkImportService do it 'requests to follow all the expected users once the workers have run' do subject.call(import) - resolve_account_service_double = double + resolve_account_service_double = instance_double(ResolveAccountService) allow(ResolveAccountService).to receive(:new).and_return(resolve_account_service_double) allow(resolve_account_service_double).to receive(:call).with('user@foo.bar', any_args) { Fabricate(:account, username: 'user', domain: 'foo.bar', protocol: :activitypub) } allow(resolve_account_service_double).to receive(:call).with('unknown@unknown.bar', any_args) { Fabricate(:account, username: 'unknown', domain: 'unknown.bar', protocol: :activitypub) } @@ -215,7 +215,7 @@ RSpec.describe BulkImportService do it 'mutes all the listed users once the workers have run' do subject.call(import) - resolve_account_service_double = double + resolve_account_service_double = instance_double(ResolveAccountService) allow(ResolveAccountService).to receive(:new).and_return(resolve_account_service_double) allow(resolve_account_service_double).to receive(:call).with('user@foo.bar', any_args) { Fabricate(:account, username: 'user', domain: 'foo.bar', protocol: :activitypub) } allow(resolve_account_service_double).to receive(:call).with('unknown@unknown.bar', any_args) { Fabricate(:account, username: 'unknown', domain: 'unknown.bar', protocol: :activitypub) } @@ -263,7 +263,7 @@ RSpec.describe BulkImportService do it 'requests to follow all the expected users once the workers have run' do subject.call(import) - resolve_account_service_double = double + resolve_account_service_double = instance_double(ResolveAccountService) allow(ResolveAccountService).to receive(:new).and_return(resolve_account_service_double) allow(resolve_account_service_double).to receive(:call).with('user@foo.bar', any_args) { Fabricate(:account, username: 'user', domain: 'foo.bar', protocol: :activitypub) } allow(resolve_account_service_double).to receive(:call).with('unknown@unknown.bar', any_args) { Fabricate(:account, username: 'unknown', domain: 'unknown.bar', protocol: :activitypub) } @@ -360,7 +360,7 @@ RSpec.describe BulkImportService do it 'updates the bookmarks as expected once the workers have run' do subject.call(import) - service_double = double + service_double = instance_double(ActivityPub::FetchRemoteStatusService) allow(ActivityPub::FetchRemoteStatusService).to receive(:new).and_return(service_double) allow(service_double).to receive(:call).with('https://domain.unknown/foo') { Fabricate(:status, uri: 'https://domain.unknown/foo') } allow(service_double).to receive(:call).with('https://domain.unknown/private') { Fabricate(:status, uri: 'https://domain.unknown/private', visibility: :direct) } @@ -403,7 +403,7 @@ RSpec.describe BulkImportService do it 'updates the bookmarks as expected once the workers have run' do subject.call(import) - service_double = double + service_double = instance_double(ActivityPub::FetchRemoteStatusService) allow(ActivityPub::FetchRemoteStatusService).to receive(:new).and_return(service_double) allow(service_double).to receive(:call).with('https://domain.unknown/foo') { Fabricate(:status, uri: 'https://domain.unknown/foo') } allow(service_double).to receive(:call).with('https://domain.unknown/private') { Fabricate(:status, uri: 'https://domain.unknown/private', visibility: :direct) } diff --git a/spec/services/fetch_resource_service_spec.rb b/spec/services/fetch_resource_service_spec.rb index da7e423517..0f1068471f 100644 --- a/spec/services/fetch_resource_service_spec.rb +++ b/spec/services/fetch_resource_service_spec.rb @@ -24,7 +24,7 @@ RSpec.describe FetchResourceService, type: :service do context 'when OpenSSL::SSL::SSLError is raised' do before do - request = double + request = instance_double(Request) allow(Request).to receive(:new).and_return(request) allow(request).to receive(:add_headers) allow(request).to receive(:on_behalf_of) @@ -36,7 +36,7 @@ RSpec.describe FetchResourceService, type: :service do context 'when HTTP::ConnectionError is raised' do before do - request = double + request = instance_double(Request) allow(Request).to receive(:new).and_return(request) allow(request).to receive(:add_headers) allow(request).to receive(:on_behalf_of) diff --git a/spec/services/import_service_spec.rb b/spec/services/import_service_spec.rb index 32ba4409c3..1904ac8dc9 100644 --- a/spec/services/import_service_spec.rb +++ b/spec/services/import_service_spec.rb @@ -219,7 +219,7 @@ RSpec.describe ImportService, type: :service do end before do - service = double + service = instance_double(ActivityPub::FetchRemoteStatusService) allow(ActivityPub::FetchRemoteStatusService).to receive(:new).and_return(service) allow(service).to receive(:call).with('https://unknown-remote.com/users/bar/statuses/1') do Fabricate(:status, uri: 'https://unknown-remote.com/users/bar/statuses/1') diff --git a/spec/services/post_status_service_spec.rb b/spec/services/post_status_service_spec.rb index 76ef5391f0..d201292e17 100644 --- a/spec/services/post_status_service_spec.rb +++ b/spec/services/post_status_service_spec.rb @@ -132,7 +132,7 @@ RSpec.describe PostStatusService, type: :service do end it 'processes mentions' do - mention_service = double(:process_mentions_service) + mention_service = instance_double(ProcessMentionsService) allow(mention_service).to receive(:call) allow(ProcessMentionsService).to receive(:new).and_return(mention_service) account = Fabricate(:account) @@ -163,7 +163,7 @@ RSpec.describe PostStatusService, type: :service do end it 'processes hashtags' do - hashtags_service = double(:process_hashtags_service) + hashtags_service = instance_double(ProcessHashtagsService) allow(hashtags_service).to receive(:call) allow(ProcessHashtagsService).to receive(:new).and_return(hashtags_service) account = Fabricate(:account) diff --git a/spec/services/resolve_url_service_spec.rb b/spec/services/resolve_url_service_spec.rb index 8d2af74173..ad5bebb4ed 100644 --- a/spec/services/resolve_url_service_spec.rb +++ b/spec/services/resolve_url_service_spec.rb @@ -9,7 +9,7 @@ describe ResolveURLService, type: :service do it 'returns nil when there is no resource url' do url = 'http://example.com/missing-resource' known_account = Fabricate(:account, uri: url) - service = double + service = instance_double(FetchResourceService) allow(FetchResourceService).to receive(:new).and_return service allow(service).to receive(:response_code).and_return(404) @@ -21,7 +21,7 @@ describe ResolveURLService, type: :service do it 'returns known account on temporary error' do url = 'http://example.com/missing-resource' known_account = Fabricate(:account, uri: url) - service = double + service = instance_double(FetchResourceService) allow(FetchResourceService).to receive(:new).and_return service allow(service).to receive(:response_code).and_return(500) diff --git a/spec/services/search_service_spec.rb b/spec/services/search_service_spec.rb index 00f693dfab..1283a23bf1 100644 --- a/spec/services/search_service_spec.rb +++ b/spec/services/search_service_spec.rb @@ -25,7 +25,7 @@ describe SearchService, type: :service do context 'when it does not find anything' do it 'returns the empty results' do - service = double(call: nil) + service = instance_double(ResolveURLService, call: nil) allow(ResolveURLService).to receive(:new).and_return(service) results = subject.call(@query, nil, 10, resolve: true) @@ -37,7 +37,7 @@ describe SearchService, type: :service do context 'when it finds an account' do it 'includes the account in the results' do account = Account.new - service = double(call: account) + service = instance_double(ResolveURLService, call: account) allow(ResolveURLService).to receive(:new).and_return(service) results = subject.call(@query, nil, 10, resolve: true) @@ -49,7 +49,7 @@ describe SearchService, type: :service do context 'when it finds a status' do it 'includes the status in the results' do status = Status.new - service = double(call: status) + service = instance_double(ResolveURLService, call: status) allow(ResolveURLService).to receive(:new).and_return(service) results = subject.call(@query, nil, 10, resolve: true) @@ -64,7 +64,7 @@ describe SearchService, type: :service do it 'includes the account in the results' do query = 'username' account = Account.new - service = double(call: [account]) + service = instance_double(AccountSearchService, call: [account]) allow(AccountSearchService).to receive(:new).and_return(service) results = subject.call(query, nil, 10) diff --git a/spec/services/unsuspend_account_service_spec.rb b/spec/services/unsuspend_account_service_spec.rb index e02ae41b99..7ef2630aeb 100644 --- a/spec/services/unsuspend_account_service_spec.rb +++ b/spec/services/unsuspend_account_service_spec.rb @@ -63,7 +63,7 @@ RSpec.describe UnsuspendAccountService, type: :service do describe 'unsuspending a remote account' do include_examples 'with common context' do let!(:account) { Fabricate(:account, domain: 'bob.com', uri: 'https://bob.com', inbox_url: 'https://bob.com/inbox', protocol: :activitypub) } - let!(:resolve_account_service) { double } + let!(:resolve_account_service) { instance_double(ResolveAccountService) } before do allow(ResolveAccountService).to receive(:new).and_return(resolve_account_service) diff --git a/spec/validators/blacklisted_email_validator_spec.rb b/spec/validators/blacklisted_email_validator_spec.rb index a642405ae6..3d3d50f659 100644 --- a/spec/validators/blacklisted_email_validator_spec.rb +++ b/spec/validators/blacklisted_email_validator_spec.rb @@ -6,8 +6,8 @@ RSpec.describe BlacklistedEmailValidator, type: :validator do describe '#validate' do subject { described_class.new.validate(user); errors } - let(:user) { double(email: 'info@mail.com', sign_up_ip: '1.2.3.4', errors: errors) } - let(:errors) { double(add: nil) } + let(:user) { instance_double(User, email: 'info@mail.com', sign_up_ip: '1.2.3.4', errors: errors) } + let(:errors) { instance_double(ActiveModel::Errors, add: nil) } before do allow(user).to receive(:valid_invitation?).and_return(false) diff --git a/spec/validators/disallowed_hashtags_validator_spec.rb b/spec/validators/disallowed_hashtags_validator_spec.rb index e98db38792..7144d28918 100644 --- a/spec/validators/disallowed_hashtags_validator_spec.rb +++ b/spec/validators/disallowed_hashtags_validator_spec.rb @@ -11,8 +11,8 @@ RSpec.describe DisallowedHashtagsValidator, type: :validator do described_class.new.validate(status) end - let(:status) { double(errors: errors, local?: local, reblog?: reblog, text: disallowed_tags.map { |x| "##{x}" }.join(' ')) } - let(:errors) { double(add: nil) } + let(:status) { instance_double(Status, errors: errors, local?: local, reblog?: reblog, text: disallowed_tags.map { |x| "##{x}" }.join(' ')) } + let(:errors) { instance_double(ActiveModel::Errors, add: nil) } context 'with a remote reblog' do let(:local) { false } diff --git a/spec/validators/email_mx_validator_spec.rb b/spec/validators/email_mx_validator_spec.rb index d9703d81b1..876d73c184 100644 --- a/spec/validators/email_mx_validator_spec.rb +++ b/spec/validators/email_mx_validator_spec.rb @@ -4,7 +4,7 @@ require 'rails_helper' describe EmailMxValidator do describe '#validate' do - let(:user) { double(email: 'foo@example.com', sign_up_ip: '1.2.3.4', errors: double(add: nil)) } + let(:user) { instance_double(User, email: 'foo@example.com', sign_up_ip: '1.2.3.4', errors: instance_double(ActiveModel::Errors, add: nil)) } context 'with an e-mail domain that is explicitly allowed' do around do |block| @@ -15,7 +15,7 @@ describe EmailMxValidator do end it 'does not add errors if there are no DNS records' do - resolver = double + resolver = instance_double(Resolv::DNS) allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::MX).and_return([]) allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::A).and_return([]) @@ -29,7 +29,7 @@ describe EmailMxValidator do end it 'adds no error if there are DNS records for the e-mail domain' do - resolver = double + resolver = instance_double(Resolv::DNS) allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::MX).and_return([]) allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::A).and_return([Resolv::DNS::Resource::IN::A.new('192.0.2.42')]) @@ -46,19 +46,19 @@ describe EmailMxValidator do allow(TagManager).to receive(:instance).and_return(double) allow(double).to receive(:normalize_domain).with('example.com').and_raise(Addressable::URI::InvalidURIError) - user = double(email: 'foo@example.com', errors: double(add: nil)) + user = instance_double(User, email: 'foo@example.com', errors: instance_double(ActiveModel::Errors, add: nil)) subject.validate(user) expect(user.errors).to have_received(:add) end it 'adds an error if the domain email portion is blank' do - user = double(email: 'foo@', errors: double(add: nil)) + user = instance_double(User, email: 'foo@', errors: instance_double(ActiveModel::Errors, add: nil)) subject.validate(user) expect(user.errors).to have_received(:add) end it 'adds an error if the email domain name contains empty labels' do - resolver = double + resolver = instance_double(Resolv::DNS) allow(resolver).to receive(:getresources).with('example..com', Resolv::DNS::Resource::IN::MX).and_return([]) allow(resolver).to receive(:getresources).with('example..com', Resolv::DNS::Resource::IN::A).and_return([Resolv::DNS::Resource::IN::A.new('192.0.2.42')]) @@ -66,13 +66,13 @@ describe EmailMxValidator do allow(resolver).to receive(:timeouts=).and_return(nil) allow(Resolv::DNS).to receive(:open).and_yield(resolver) - user = double(email: 'foo@example..com', sign_up_ip: '1.2.3.4', errors: double(add: nil)) + user = instance_double(User, email: 'foo@example..com', sign_up_ip: '1.2.3.4', errors: instance_double(ActiveModel::Errors, add: nil)) subject.validate(user) expect(user.errors).to have_received(:add) end it 'adds an error if there are no DNS records for the e-mail domain' do - resolver = double + resolver = instance_double(Resolv::DNS) allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::MX).and_return([]) allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::A).and_return([]) @@ -85,9 +85,11 @@ describe EmailMxValidator do end it 'adds an error if a MX record does not lead to an IP' do - resolver = double + resolver = instance_double(Resolv::DNS) - allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::MX).and_return([double(exchange: 'mail.example.com')]) + allow(resolver).to receive(:getresources) + .with('example.com', Resolv::DNS::Resource::IN::MX) + .and_return([instance_double(Resolv::DNS::Resource::MX, exchange: 'mail.example.com')]) allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::A).and_return([]) allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::AAAA).and_return([]) allow(resolver).to receive(:getresources).with('mail.example.com', Resolv::DNS::Resource::IN::A).and_return([]) @@ -101,13 +103,15 @@ describe EmailMxValidator do it 'adds an error if the MX record is blacklisted' do EmailDomainBlock.create!(domain: 'mail.example.com') - resolver = double + resolver = instance_double(Resolv::DNS) - allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::MX).and_return([double(exchange: 'mail.example.com')]) + allow(resolver).to receive(:getresources) + .with('example.com', Resolv::DNS::Resource::IN::MX) + .and_return([instance_double(Resolv::DNS::Resource::MX, exchange: 'mail.example.com')]) allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::A).and_return([]) allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::AAAA).and_return([]) - allow(resolver).to receive(:getresources).with('mail.example.com', Resolv::DNS::Resource::IN::A).and_return([double(address: '2.3.4.5')]) - allow(resolver).to receive(:getresources).with('mail.example.com', Resolv::DNS::Resource::IN::AAAA).and_return([double(address: 'fd00::2')]) + allow(resolver).to receive(:getresources).with('mail.example.com', Resolv::DNS::Resource::IN::A).and_return([instance_double(Resolv::DNS::Resource::IN::A, address: '2.3.4.5')]) + allow(resolver).to receive(:getresources).with('mail.example.com', Resolv::DNS::Resource::IN::AAAA).and_return([instance_double(Resolv::DNS::Resource::IN::A, address: 'fd00::2')]) allow(resolver).to receive(:timeouts=).and_return(nil) allow(Resolv::DNS).to receive(:open).and_yield(resolver) diff --git a/spec/validators/follow_limit_validator_spec.rb b/spec/validators/follow_limit_validator_spec.rb index 7b9055a27f..86b6511d65 100644 --- a/spec/validators/follow_limit_validator_spec.rb +++ b/spec/validators/follow_limit_validator_spec.rb @@ -12,9 +12,9 @@ RSpec.describe FollowLimitValidator, type: :validator do described_class.new.validate(follow) end - let(:follow) { double(account: account, errors: errors) } - let(:errors) { double(add: nil) } - let(:account) { double(nil?: _nil, local?: local, following_count: 0, followers_count: 0) } + let(:follow) { instance_double(Follow, account: account, errors: errors) } + let(:errors) { instance_double(ActiveModel::Errors, add: nil) } + let(:account) { instance_double(Account, nil?: _nil, local?: local, following_count: 0, followers_count: 0) } let(:_nil) { true } let(:local) { false } diff --git a/spec/validators/note_length_validator_spec.rb b/spec/validators/note_length_validator_spec.rb index e45d221d76..66fccad3ec 100644 --- a/spec/validators/note_length_validator_spec.rb +++ b/spec/validators/note_length_validator_spec.rb @@ -8,7 +8,7 @@ describe NoteLengthValidator do describe '#validate' do it 'adds an error when text is over 500 characters' do text = 'a' * 520 - account = double(note: text, errors: double(add: nil)) + account = instance_double(Account, note: text, errors: activemodel_errors) subject.validate_each(account, 'note', text) expect(account.errors).to have_received(:add) @@ -16,7 +16,7 @@ describe NoteLengthValidator do it 'counts URLs as 23 characters flat' do text = ('a' * 476) + " http://#{'b' * 30}.com/example" - account = double(note: text, errors: double(add: nil)) + account = instance_double(Account, note: text, errors: activemodel_errors) subject.validate_each(account, 'note', text) expect(account.errors).to_not have_received(:add) @@ -24,10 +24,16 @@ describe NoteLengthValidator do it 'does not count non-autolinkable URLs as 23 characters flat' do text = ('a' * 476) + "http://#{'b' * 30}.com/example" - account = double(note: text, errors: double(add: nil)) + account = instance_double(Account, note: text, errors: activemodel_errors) subject.validate_each(account, 'note', text) expect(account.errors).to have_received(:add) end + + private + + def activemodel_errors + instance_double(ActiveModel::Errors, add: nil) + end end end diff --git a/spec/validators/poll_validator_spec.rb b/spec/validators/poll_validator_spec.rb index 069a471619..95feb043db 100644 --- a/spec/validators/poll_validator_spec.rb +++ b/spec/validators/poll_validator_spec.rb @@ -9,8 +9,8 @@ RSpec.describe PollValidator, type: :validator do end let(:validator) { described_class.new } - let(:poll) { double(options: options, expires_at: expires_at, errors: errors) } - let(:errors) { double(add: nil) } + let(:poll) { instance_double(Poll, options: options, expires_at: expires_at, errors: errors) } + let(:errors) { instance_double(ActiveModel::Errors, add: nil) } let(:options) { %w(foo bar) } let(:expires_at) { 1.day.from_now } diff --git a/spec/validators/status_length_validator_spec.rb b/spec/validators/status_length_validator_spec.rb index e132b5618a..98ea15e03b 100644 --- a/spec/validators/status_length_validator_spec.rb +++ b/spec/validators/status_length_validator_spec.rb @@ -5,38 +5,38 @@ require 'rails_helper' describe StatusLengthValidator do describe '#validate' do it 'does not add errors onto remote statuses' do - status = double(local?: false) + status = instance_double(Status, local?: false) subject.validate(status) expect(status).to_not receive(:errors) end it 'does not add errors onto local reblogs' do - status = double(local?: false, reblog?: true) + status = instance_double(Status, local?: false, reblog?: true) subject.validate(status) expect(status).to_not receive(:errors) end it 'adds an error when content warning is over 500 characters' do - status = double(spoiler_text: 'a' * 520, text: '', errors: double(add: nil), local?: true, reblog?: false) + status = instance_double(Status, spoiler_text: 'a' * 520, text: '', errors: activemodel_errors, local?: true, reblog?: false) subject.validate(status) expect(status.errors).to have_received(:add) end it 'adds an error when text is over 500 characters' do - status = double(spoiler_text: '', text: 'a' * 520, errors: double(add: nil), local?: true, reblog?: false) + status = instance_double(Status, spoiler_text: '', text: 'a' * 520, errors: activemodel_errors, local?: true, reblog?: false) subject.validate(status) expect(status.errors).to have_received(:add) end it 'adds an error when text and content warning are over 500 characters total' do - status = double(spoiler_text: 'a' * 250, text: 'b' * 251, errors: double(add: nil), local?: true, reblog?: false) + status = instance_double(Status, spoiler_text: 'a' * 250, text: 'b' * 251, errors: activemodel_errors, local?: true, reblog?: false) subject.validate(status) expect(status.errors).to have_received(:add) end it 'counts URLs as 23 characters flat' do text = ('a' * 476) + " http://#{'b' * 30}.com/example" - status = double(spoiler_text: '', text: text, errors: double(add: nil), local?: true, reblog?: false) + status = instance_double(Status, spoiler_text: '', text: text, errors: activemodel_errors, local?: true, reblog?: false) subject.validate(status) expect(status.errors).to_not have_received(:add) @@ -44,7 +44,7 @@ describe StatusLengthValidator do it 'does not count non-autolinkable URLs as 23 characters flat' do text = ('a' * 476) + "http://#{'b' * 30}.com/example" - status = double(spoiler_text: '', text: text, errors: double(add: nil), local?: true, reblog?: false) + status = instance_double(Status, spoiler_text: '', text: text, errors: activemodel_errors, local?: true, reblog?: false) subject.validate(status) expect(status.errors).to have_received(:add) @@ -52,14 +52,14 @@ describe StatusLengthValidator do it 'does not count overly long URLs as 23 characters flat' do text = "http://example.com/valid?#{'#foo?' * 1000}" - status = double(spoiler_text: '', text: text, errors: double(add: nil), local?: true, reblog?: false) + status = instance_double(Status, spoiler_text: '', text: text, errors: activemodel_errors, local?: true, reblog?: false) subject.validate(status) expect(status.errors).to have_received(:add) end it 'counts only the front part of remote usernames' do text = ('a' * 475) + " @alice@#{'b' * 30}.com" - status = double(spoiler_text: '', text: text, errors: double(add: nil), local?: true, reblog?: false) + status = instance_double(Status, spoiler_text: '', text: text, errors: activemodel_errors, local?: true, reblog?: false) subject.validate(status) expect(status.errors).to_not have_received(:add) @@ -67,10 +67,16 @@ describe StatusLengthValidator do it 'does count both parts of remote usernames for overly long domains' do text = "@alice@#{'b' * 500}.com" - status = double(spoiler_text: '', text: text, errors: double(add: nil), local?: true, reblog?: false) + status = instance_double(Status, spoiler_text: '', text: text, errors: activemodel_errors, local?: true, reblog?: false) subject.validate(status) expect(status.errors).to have_received(:add) end end + + private + + def activemodel_errors + instance_double(ActiveModel::Errors, add: nil) + end end diff --git a/spec/validators/status_pin_validator_spec.rb b/spec/validators/status_pin_validator_spec.rb index 00b89d702f..e8f8a45434 100644 --- a/spec/validators/status_pin_validator_spec.rb +++ b/spec/validators/status_pin_validator_spec.rb @@ -8,11 +8,11 @@ RSpec.describe StatusPinValidator, type: :validator do subject.validate(pin) end - let(:pin) { double(account: account, errors: errors, status: status, account_id: pin_account_id) } - let(:status) { double(reblog?: reblog, account_id: status_account_id, visibility: visibility, direct_visibility?: visibility == 'direct') } - let(:account) { double(status_pins: status_pins, local?: local) } - let(:status_pins) { double(count: count) } - let(:errors) { double(add: nil) } + let(:pin) { instance_double(StatusPin, account: account, errors: errors, status: status, account_id: pin_account_id) } + let(:status) { instance_double(Status, reblog?: reblog, account_id: status_account_id, visibility: visibility, direct_visibility?: visibility == 'direct') } + let(:account) { instance_double(Account, status_pins: status_pins, local?: local) } + let(:status_pins) { instance_double(Array, count: count) } + let(:errors) { instance_double(ActiveModel::Errors, add: nil) } let(:pin_account_id) { 1 } let(:status_account_id) { 1 } let(:visibility) { 'public' } diff --git a/spec/validators/unique_username_validator_spec.rb b/spec/validators/unique_username_validator_spec.rb index 6867cbc6ce..0d172c8408 100644 --- a/spec/validators/unique_username_validator_spec.rb +++ b/spec/validators/unique_username_validator_spec.rb @@ -6,7 +6,7 @@ describe UniqueUsernameValidator do describe '#validate' do context 'when local account' do it 'does not add errors if username is nil' do - account = double(username: nil, domain: nil, persisted?: false, errors: double(add: nil)) + account = instance_double(Account, username: nil, domain: nil, persisted?: false, errors: activemodel_errors) subject.validate(account) expect(account.errors).to_not have_received(:add) end @@ -18,14 +18,14 @@ describe UniqueUsernameValidator do it 'adds an error when the username is already used with ignoring cases' do Fabricate(:account, username: 'ABCdef') - account = double(username: 'abcDEF', domain: nil, persisted?: false, errors: double(add: nil)) + account = instance_double(Account, username: 'abcDEF', domain: nil, persisted?: false, errors: activemodel_errors) subject.validate(account) expect(account.errors).to have_received(:add) end it 'does not add errors when same username remote account exists' do Fabricate(:account, username: 'abcdef', domain: 'example.com') - account = double(username: 'abcdef', domain: nil, persisted?: false, errors: double(add: nil)) + account = instance_double(Account, username: 'abcdef', domain: nil, persisted?: false, errors: activemodel_errors) subject.validate(account) expect(account.errors).to_not have_received(:add) end @@ -34,7 +34,7 @@ describe UniqueUsernameValidator do context 'when remote account' do it 'does not add errors if username is nil' do - account = double(username: nil, domain: 'example.com', persisted?: false, errors: double(add: nil)) + account = instance_double(Account, username: nil, domain: 'example.com', persisted?: false, errors: activemodel_errors) subject.validate(account) expect(account.errors).to_not have_received(:add) end @@ -46,23 +46,29 @@ describe UniqueUsernameValidator do it 'adds an error when the username is already used with ignoring cases' do Fabricate(:account, username: 'ABCdef', domain: 'example.com') - account = double(username: 'abcDEF', domain: 'example.com', persisted?: false, errors: double(add: nil)) + account = instance_double(Account, username: 'abcDEF', domain: 'example.com', persisted?: false, errors: activemodel_errors) subject.validate(account) expect(account.errors).to have_received(:add) end it 'adds an error when the domain is already used with ignoring cases' do Fabricate(:account, username: 'ABCdef', domain: 'example.com') - account = double(username: 'ABCdef', domain: 'EXAMPLE.COM', persisted?: false, errors: double(add: nil)) + account = instance_double(Account, username: 'ABCdef', domain: 'EXAMPLE.COM', persisted?: false, errors: activemodel_errors) subject.validate(account) expect(account.errors).to have_received(:add) end it 'does not add errors when account with the same username and another domain exists' do Fabricate(:account, username: 'abcdef', domain: 'example.com') - account = double(username: 'abcdef', domain: 'example2.com', persisted?: false, errors: double(add: nil)) + account = instance_double(Account, username: 'abcdef', domain: 'example2.com', persisted?: false, errors: activemodel_errors) subject.validate(account) expect(account.errors).to_not have_received(:add) end end + + private + + def activemodel_errors + instance_double(ActiveModel::Errors, add: nil) + end end diff --git a/spec/validators/unreserved_username_validator_spec.rb b/spec/validators/unreserved_username_validator_spec.rb index 85bd7dcb6a..6f353eeafd 100644 --- a/spec/validators/unreserved_username_validator_spec.rb +++ b/spec/validators/unreserved_username_validator_spec.rb @@ -10,8 +10,8 @@ RSpec.describe UnreservedUsernameValidator, type: :validator do end let(:validator) { described_class.new } - let(:account) { double(username: username, errors: errors) } - let(:errors) { double(add: nil) } + let(:account) { instance_double(Account, username: username, errors: errors) } + let(:errors) { instance_double(ActiveModel::Errors, add: nil) } context 'when @username is blank?' do let(:username) { nil } diff --git a/spec/validators/url_validator_spec.rb b/spec/validators/url_validator_spec.rb index a56ccd8e08..f2220e32b0 100644 --- a/spec/validators/url_validator_spec.rb +++ b/spec/validators/url_validator_spec.rb @@ -10,8 +10,8 @@ RSpec.describe URLValidator, type: :validator do end let(:validator) { described_class.new(attributes: [attribute]) } - let(:record) { double(errors: errors) } - let(:errors) { double(add: nil) } + let(:record) { instance_double(Webhook, errors: errors) } + let(:errors) { instance_double(ActiveModel::Errors, add: nil) } let(:value) { '' } let(:attribute) { :foo } diff --git a/spec/views/statuses/show.html.haml_spec.rb b/spec/views/statuses/show.html.haml_spec.rb index 370743dfec..06f5132d9f 100644 --- a/spec/views/statuses/show.html.haml_spec.rb +++ b/spec/views/statuses/show.html.haml_spec.rb @@ -4,7 +4,7 @@ require 'rails_helper' describe 'statuses/show.html.haml', without_verify_partial_doubles: true do before do - double(api_oembed_url: '') + allow(view).to receive(:api_oembed_url).and_return('') allow(view).to receive(:show_landing_strip?).and_return(true) allow(view).to receive(:site_title).and_return('example site') allow(view).to receive(:site_hostname).and_return('example.com') diff --git a/spec/workers/activitypub/processing_worker_spec.rb b/spec/workers/activitypub/processing_worker_spec.rb index 6b57f16a92..66d1cf4890 100644 --- a/spec/workers/activitypub/processing_worker_spec.rb +++ b/spec/workers/activitypub/processing_worker_spec.rb @@ -9,7 +9,8 @@ describe ActivityPub::ProcessingWorker do describe '#perform' do it 'delegates to ActivityPub::ProcessCollectionService' do - allow(ActivityPub::ProcessCollectionService).to receive(:new).and_return(double(:service, call: nil)) + allow(ActivityPub::ProcessCollectionService).to receive(:new) + .and_return(instance_double(ActivityPub::ProcessCollectionService, call: nil)) subject.perform(account.id, '') expect(ActivityPub::ProcessCollectionService).to have_received(:new) end diff --git a/spec/workers/admin/domain_purge_worker_spec.rb b/spec/workers/admin/domain_purge_worker_spec.rb index b67c58b234..861fd71a7f 100644 --- a/spec/workers/admin/domain_purge_worker_spec.rb +++ b/spec/workers/admin/domain_purge_worker_spec.rb @@ -7,7 +7,7 @@ describe Admin::DomainPurgeWorker do describe 'perform' do it 'calls domain purge service for relevant domain block' do - service = double(call: nil) + service = instance_double(PurgeDomainService, call: nil) allow(PurgeDomainService).to receive(:new).and_return(service) result = subject.perform('example.com') diff --git a/spec/workers/domain_block_worker_spec.rb b/spec/workers/domain_block_worker_spec.rb index 8b98443fa7..33c3ca009a 100644 --- a/spec/workers/domain_block_worker_spec.rb +++ b/spec/workers/domain_block_worker_spec.rb @@ -9,7 +9,7 @@ describe DomainBlockWorker do let(:domain_block) { Fabricate(:domain_block) } it 'calls domain block service for relevant domain block' do - service = double(call: nil) + service = instance_double(BlockDomainService, call: nil) allow(BlockDomainService).to receive(:new).and_return(service) result = subject.perform(domain_block.id) diff --git a/spec/workers/domain_clear_media_worker_spec.rb b/spec/workers/domain_clear_media_worker_spec.rb index f21d1fe189..21f8f87b2f 100644 --- a/spec/workers/domain_clear_media_worker_spec.rb +++ b/spec/workers/domain_clear_media_worker_spec.rb @@ -9,7 +9,7 @@ describe DomainClearMediaWorker do let(:domain_block) { Fabricate(:domain_block, severity: :silence, reject_media: true) } it 'calls domain clear media service for relevant domain block' do - service = double(call: nil) + service = instance_double(ClearDomainMediaService, call: nil) allow(ClearDomainMediaService).to receive(:new).and_return(service) result = subject.perform(domain_block.id) diff --git a/spec/workers/feed_insert_worker_spec.rb b/spec/workers/feed_insert_worker_spec.rb index 16f7d73e02..97c73c5999 100644 --- a/spec/workers/feed_insert_worker_spec.rb +++ b/spec/workers/feed_insert_worker_spec.rb @@ -11,7 +11,7 @@ describe FeedInsertWorker do context 'when there are no records' do it 'skips push with missing status' do - instance = double(push_to_home: nil) + instance = instance_double(FeedManager, push_to_home: nil) allow(FeedManager).to receive(:instance).and_return(instance) result = subject.perform(nil, follower.id) @@ -20,7 +20,7 @@ describe FeedInsertWorker do end it 'skips push with missing account' do - instance = double(push_to_home: nil) + instance = instance_double(FeedManager, push_to_home: nil) allow(FeedManager).to receive(:instance).and_return(instance) result = subject.perform(status.id, nil) @@ -31,7 +31,7 @@ describe FeedInsertWorker do context 'when there are real records' do it 'skips the push when there is a filter' do - instance = double(push_to_home: nil, filter?: true) + instance = instance_double(FeedManager, push_to_home: nil, filter?: true) allow(FeedManager).to receive(:instance).and_return(instance) result = subject.perform(status.id, follower.id) @@ -40,7 +40,7 @@ describe FeedInsertWorker do end it 'pushes the status onto the home timeline without filter' do - instance = double(push_to_home: nil, filter?: false) + instance = instance_double(FeedManager, push_to_home: nil, filter?: false) allow(FeedManager).to receive(:instance).and_return(instance) result = subject.perform(status.id, follower.id) diff --git a/spec/workers/move_worker_spec.rb b/spec/workers/move_worker_spec.rb index ac7bd506b6..7577f6e896 100644 --- a/spec/workers/move_worker_spec.rb +++ b/spec/workers/move_worker_spec.rb @@ -15,7 +15,7 @@ describe MoveWorker do let!(:account_note) { Fabricate(:account_note, account: local_user.account, target_account: source_account, comment: comment) } let(:list) { Fabricate(:list, account: local_follower) } - let(:block_service) { double } + let(:block_service) { instance_double(BlockService) } before do stub_request(:post, 'https://example.org/a/inbox').to_return(status: 200) diff --git a/spec/workers/publish_scheduled_announcement_worker_spec.rb b/spec/workers/publish_scheduled_announcement_worker_spec.rb index 0977bba1ee..2e50d4a50d 100644 --- a/spec/workers/publish_scheduled_announcement_worker_spec.rb +++ b/spec/workers/publish_scheduled_announcement_worker_spec.rb @@ -12,7 +12,7 @@ describe PublishScheduledAnnouncementWorker do describe 'perform' do before do - service = double + service = instance_double(FetchRemoteStatusService) allow(FetchRemoteStatusService).to receive(:new).and_return(service) allow(service).to receive(:call).with('https://domain.com/users/foo/12345') { remote_status.reload } diff --git a/spec/workers/refollow_worker_spec.rb b/spec/workers/refollow_worker_spec.rb index 1dac15385b..5718d4db49 100644 --- a/spec/workers/refollow_worker_spec.rb +++ b/spec/workers/refollow_worker_spec.rb @@ -10,7 +10,7 @@ describe RefollowWorker do let(:bob) { Fabricate(:account, domain: nil, username: 'bob') } describe 'perform' do - let(:service) { double } + let(:service) { instance_double(FollowService) } before do allow(FollowService).to receive(:new).and_return(service) diff --git a/spec/workers/regeneration_worker_spec.rb b/spec/workers/regeneration_worker_spec.rb index 147a76be50..37b0a04c49 100644 --- a/spec/workers/regeneration_worker_spec.rb +++ b/spec/workers/regeneration_worker_spec.rb @@ -9,7 +9,7 @@ describe RegenerationWorker do let(:account) { Fabricate(:account) } it 'calls the precompute feed service for the account' do - service = double(call: nil) + service = instance_double(PrecomputeFeedService, call: nil) allow(PrecomputeFeedService).to receive(:new).and_return(service) result = subject.perform(account.id) From a5b6f6da807ee057e3c9747b3b8eebb00f4c4c67 Mon Sep 17 00:00:00 2001 From: Claire Date: Thu, 22 Jun 2023 14:56:14 +0200 Subject: [PATCH 085/118] Change /api/v1/statuses/:id/history to always return at least one item (#25510) --- app/controllers/api/v1/statuses/histories_controller.rb | 6 +++++- .../api/v1/statuses/histories_controller_spec.rb | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/app/controllers/api/v1/statuses/histories_controller.rb b/app/controllers/api/v1/statuses/histories_controller.rb index dff2425d06..2913472b04 100644 --- a/app/controllers/api/v1/statuses/histories_controller.rb +++ b/app/controllers/api/v1/statuses/histories_controller.rb @@ -8,11 +8,15 @@ class Api::V1::Statuses::HistoriesController < Api::BaseController def show cache_if_unauthenticated! - render json: @status.edits.includes(:account, status: [:account]), each_serializer: REST::StatusEditSerializer + render json: status_edits, each_serializer: REST::StatusEditSerializer end private + def status_edits + @status.edits.includes(:account, status: [:account]).to_a.presence || [@status.build_snapshot(at_time: @status.edited_at || @status.created_at)] + end + def set_status @status = Status.find(params[:status_id]) authorize @status, :show? diff --git a/spec/controllers/api/v1/statuses/histories_controller_spec.rb b/spec/controllers/api/v1/statuses/histories_controller_spec.rb index 00677f1d2c..99384c8ed5 100644 --- a/spec/controllers/api/v1/statuses/histories_controller_spec.rb +++ b/spec/controllers/api/v1/statuses/histories_controller_spec.rb @@ -23,6 +23,7 @@ describe Api::V1::Statuses::HistoriesController do it 'returns http success' do expect(response).to have_http_status(200) + expect(body_as_json.size).to_not be 0 end end end From a8c1c8bd377263677bfb654513a4160caeac77bb Mon Sep 17 00:00:00 2001 From: Claire Date: Thu, 22 Jun 2023 17:54:43 +0200 Subject: [PATCH 086/118] Fix j/k keyboard shortcuts on some status lists (#25554) --- .../mastodon/features/bookmarked_statuses/index.jsx | 3 ++- app/javascript/mastodon/features/explore/statuses.jsx | 3 ++- .../mastodon/features/favourited_statuses/index.jsx | 3 ++- app/javascript/mastodon/features/pinned_statuses/index.jsx | 4 +++- app/javascript/mastodon/selectors/index.js | 4 ++++ 5 files changed, 13 insertions(+), 4 deletions(-) diff --git a/app/javascript/mastodon/features/bookmarked_statuses/index.jsx b/app/javascript/mastodon/features/bookmarked_statuses/index.jsx index 795b859ce4..936dee12e3 100644 --- a/app/javascript/mastodon/features/bookmarked_statuses/index.jsx +++ b/app/javascript/mastodon/features/bookmarked_statuses/index.jsx @@ -15,13 +15,14 @@ import { addColumn, removeColumn, moveColumn } from 'mastodon/actions/columns'; import ColumnHeader from 'mastodon/components/column_header'; import StatusList from 'mastodon/components/status_list'; import Column from 'mastodon/features/ui/components/column'; +import { getStatusList } from 'mastodon/selectors'; const messages = defineMessages({ heading: { id: 'column.bookmarks', defaultMessage: 'Bookmarks' }, }); const mapStateToProps = state => ({ - statusIds: state.getIn(['status_lists', 'bookmarks', 'items']), + statusIds: getStatusList(state, 'bookmarks'), isLoading: state.getIn(['status_lists', 'bookmarks', 'isLoading'], true), hasMore: !!state.getIn(['status_lists', 'bookmarks', 'next']), }); diff --git a/app/javascript/mastodon/features/explore/statuses.jsx b/app/javascript/mastodon/features/explore/statuses.jsx index abacf333dd..c90273714a 100644 --- a/app/javascript/mastodon/features/explore/statuses.jsx +++ b/app/javascript/mastodon/features/explore/statuses.jsx @@ -11,9 +11,10 @@ import { debounce } from 'lodash'; import { fetchTrendingStatuses, expandTrendingStatuses } from 'mastodon/actions/trends'; import DismissableBanner from 'mastodon/components/dismissable_banner'; import StatusList from 'mastodon/components/status_list'; +import { getStatusList } from 'mastodon/selectors'; const mapStateToProps = state => ({ - statusIds: state.getIn(['status_lists', 'trending', 'items']), + statusIds: getStatusList(state, 'trending'), isLoading: state.getIn(['status_lists', 'trending', 'isLoading'], true), hasMore: !!state.getIn(['status_lists', 'trending', 'next']), }); diff --git a/app/javascript/mastodon/features/favourited_statuses/index.jsx b/app/javascript/mastodon/features/favourited_statuses/index.jsx index 4902ddc28b..abce7ac053 100644 --- a/app/javascript/mastodon/features/favourited_statuses/index.jsx +++ b/app/javascript/mastodon/features/favourited_statuses/index.jsx @@ -15,13 +15,14 @@ import { fetchFavouritedStatuses, expandFavouritedStatuses } from 'mastodon/acti import ColumnHeader from 'mastodon/components/column_header'; import StatusList from 'mastodon/components/status_list'; import Column from 'mastodon/features/ui/components/column'; +import { getStatusList } from 'mastodon/selectors'; const messages = defineMessages({ heading: { id: 'column.favourites', defaultMessage: 'Favourites' }, }); const mapStateToProps = state => ({ - statusIds: state.getIn(['status_lists', 'favourites', 'items']), + statusIds: getStatusList(state, 'favourites'), isLoading: state.getIn(['status_lists', 'favourites', 'isLoading'], true), hasMore: !!state.getIn(['status_lists', 'favourites', 'next']), }); diff --git a/app/javascript/mastodon/features/pinned_statuses/index.jsx b/app/javascript/mastodon/features/pinned_statuses/index.jsx index a93e82cfae..f09d5471e3 100644 --- a/app/javascript/mastodon/features/pinned_statuses/index.jsx +++ b/app/javascript/mastodon/features/pinned_statuses/index.jsx @@ -8,6 +8,8 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; import { connect } from 'react-redux'; +import { getStatusList } from 'mastodon/selectors'; + import { fetchPinnedStatuses } from '../../actions/pin_statuses'; import ColumnBackButtonSlim from '../../components/column_back_button_slim'; import StatusList from '../../components/status_list'; @@ -18,7 +20,7 @@ const messages = defineMessages({ }); const mapStateToProps = state => ({ - statusIds: state.getIn(['status_lists', 'pins', 'items']), + statusIds: getStatusList(state, 'pins'), hasMore: !!state.getIn(['status_lists', 'pins', 'next']), }); diff --git a/app/javascript/mastodon/selectors/index.js b/app/javascript/mastodon/selectors/index.js index b67734316b..f92e7fe48d 100644 --- a/app/javascript/mastodon/selectors/index.js +++ b/app/javascript/mastodon/selectors/index.js @@ -137,3 +137,7 @@ export const getAccountHidden = createSelector([ ], (hidden, followingOrRequested, isSelf) => { return hidden && !(isSelf || followingOrRequested); }); + +export const getStatusList = createSelector([ + (state, type) => state.getIn(['status_lists', type, 'items']), +], (items) => items.toList()); From c9cd634184e7e983931789598ad0f2c5b9106371 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Thu, 22 Jun 2023 12:46:32 -0400 Subject: [PATCH 087/118] Use default `bootsnap/setup` in boot.rb (#25502) --- config/boot.rb | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/config/boot.rb b/config/boot.rb index 4e379e7db5..3a1d1d6d24 100644 --- a/config/boot.rb +++ b/config/boot.rb @@ -6,12 +6,4 @@ end ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) require 'bundler/setup' # Set up gems listed in the Gemfile. -require 'bootsnap' # Speed up boot time by caching expensive operations. - -Bootsnap.setup( - cache_dir: File.expand_path('../tmp/cache', __dir__), - development_mode: ENV.fetch('RAILS_ENV', 'development') == 'development', - load_path_cache: true, - compile_cache_iseq: false, - compile_cache_yaml: false -) +require 'bootsnap/setup' # Speed up boot time by caching expensive operations. From 1d622c80332916dbfe51b7c41ce12e5761364703 Mon Sep 17 00:00:00 2001 From: Claire Date: Thu, 22 Jun 2023 18:46:43 +0200 Subject: [PATCH 088/118] Add POST /api/v1/conversations/:id/unread (#25509) --- app/controllers/api/v1/conversations_controller.rb | 5 +++++ config/routes/api.rb | 1 + 2 files changed, 6 insertions(+) diff --git a/app/controllers/api/v1/conversations_controller.rb b/app/controllers/api/v1/conversations_controller.rb index 63644f85e2..b3ca2f7903 100644 --- a/app/controllers/api/v1/conversations_controller.rb +++ b/app/controllers/api/v1/conversations_controller.rb @@ -19,6 +19,11 @@ class Api::V1::ConversationsController < Api::BaseController render json: @conversation, serializer: REST::ConversationSerializer end + def unread + @conversation.update!(unread: true) + render json: @conversation, serializer: REST::ConversationSerializer + end + def destroy @conversation.destroy! render_empty diff --git a/config/routes/api.rb b/config/routes/api.rb index 19c583b3e1..a10e8058a5 100644 --- a/config/routes/api.rb +++ b/config/routes/api.rb @@ -81,6 +81,7 @@ namespace :api, format: false do resources :conversations, only: [:index, :destroy] do member do post :read + post :unread end end From 00ec43914aeded13bb369483f795fdb24dfb4b42 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Thu, 22 Jun 2023 22:48:40 +0100 Subject: [PATCH 089/118] Add onboarding prompt when home feed too slow in web UI (#25267) --- app/javascript/images/friends-cropped.png | Bin 0 -> 193366 bytes .../features/community_timeline/index.jsx | 5 +- .../mastodon/features/explore/links.jsx | 2 +- .../mastodon/features/explore/statuses.jsx | 2 +- .../mastodon/features/explore/tags.jsx | 2 +- .../components/explore_prompt.jsx | 23 ++++++ .../mastodon/features/home_timeline/index.jsx | 41 +++++++++- .../features/public_timeline/index.jsx | 5 +- app/javascript/mastodon/locales/en.json | 13 ++-- .../styles/mastodon-light/diff.scss | 5 -- .../styles/mastodon/components.scss | 72 ++++++++++++++---- 11 files changed, 131 insertions(+), 39 deletions(-) create mode 100755 app/javascript/images/friends-cropped.png create mode 100644 app/javascript/mastodon/features/home_timeline/components/explore_prompt.jsx diff --git a/app/javascript/images/friends-cropped.png b/app/javascript/images/friends-cropped.png new file mode 100755 index 0000000000000000000000000000000000000000..b13e16a5809abad8f2ee906025ed99e4ec79d129 GIT binary patch literal 193366 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�LPz1Hnz8r}E#{LsV*LQyaXPy~tX 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
    r`OwBy;Fnh_QNWR? z8hHN|7&1$6FNjzc=6=}!xPLRM1vPyAvKZutMA+@SiXJf7p`u+adg7f7Qr~3FxR2P|^2fiH2&KBekDJ;hPCnCU@Md*? z;$@Q|r=9-ik>~}S-W-;um zc~o}n^|n_&=}ch&Xp zTEHwrr?Ze<%-Rae%wTrWPd669+(M~scI8uCULvD7gTd%+8SkcbI^t5<^IIo=MlG|i z3MWAtyfZ5Sjs~r@^k1^$N0K!*)y>-*Qbv#wL*!(1&^~4zZG-Cu8GmU60bcYlAilxJ z1{Lt(L_=s}l%78)P1jTv(G@Gvd`1$31}k_TBll<{N~=Z)OV7N2h!cSq{+REBrCQ!j zBk~FG_?6IsOGzQP_<+*{z&d|p8SO#Zk~~}fzteMG$6YSSIzs~(9`RyjZ8O$_BLVK4 zkpYpK@x26kdV`o3eG-Q_k-(O%IJnM-4y_Qvu~0^^m<$}Empo4q69g^>{rl&2BmI0c z;i}chno%}JogHdTLT`F5d}92tFNlHUDF>&S{f}HOA>*B7u>a*}X2;*pIl(RMm{T*y!%Qf5-Zc)nIJ;>{`6fD-g>dv_C#nub z^1O#_!`~IhL*Ey#N>U`C@ED>}h{)!Q>Lqh>3oKXne@fEPGdl(cFTUZyE8-z2)&m5> ztlpNAj3e}^+x@v8JMW4&*zNd*zBo?)e&cuHFAs;@GWj6^^e%6&E^h`w#cBn-_bf|E z#UhISc?-(1pbsg6q;2*Yn z)uE6_7lcfA?#*$)7}FKJ(vH_`M%7}X2y2)LuX#dyO^q?^7H-{OQ#h|yC=sq=jn(@! zUguTAO-Lf9O}j;+A132h5i_{cU}lf-i|@CWS}{*9An6hF<{&bmSMNwyi@c%juS5Y9 z-lcsxTJ2!fACYaP+ZIy<`Da>a2>6Kwnt(nczZyg+Y+sDfnp-)@?j zny=kn`2q6Wt-*A5+L$$I%8nXpz?1yxw;Z zg|M8nt=q!1={sH6c3c!N*}#Raoh!ndtFY{551(_?Ggw47Co*jNkf$e0yiLyhep_)C z#TGcdtFrJx?_0w~&2t;rqlB(!krBz{(km69xlo@YJjnbGWWodk`E+~E3)P%gO$@2y zf^D;RTPd_KG}A+xCIPbjS`j7rOLKu=Z|oNxKuXcvPdq>T5K_?c=ZPudol$5Y2}d;T zh`!-{?%Xwc@C~h->t&VF!ZpB9?YsTBp;H#~OT-DpZUFsCX=V=XUyS!PO=%k@RJRQ2 zAAn^%;C-SypjfSG|dy!5B$rX ztnR#w`xtZUOgcaX=t4x|ZBZT*EoAldsS}Sicpskr0IqiswNYviBgt>Nw$c^Bjh?YV?_p};&50N` zA8Y%W711>jtL`RXk{_+RDEU8p`$~%_=Zv_PJbir(M@QVjKldLhTHr*AVPH$3oYP^5f&_&T`BDWWq?xojN7Xf}Yg{i6D%L;iluwo%a zn>U8cZ@8Ku$b@g4iWhxMs{%aU=<<-`)5&t#^*b!CuL3+9b> zSfhM@o0~M+w)nw2dYYO|6vyG=Sft-3R7!XuHPVI#MY!I!v0yxPP<5#A`03Mx3!$#@ zI=cZN4EnG5&9S`P^C^Ia3;s*Ti8&0FrdaXekCI}{!bDFG#X#_Q&rilS_yhPcTvV| z1S?%l#wKfyoMf$bCyimcx(6TiZX;{?eqc6Q8&*U40E;E#mtBQ0SR=Aly~$)s>mwm( zue)Uif@H!tCP7u0oHY}M7b?H$#e6C=Du*4@g&pl?Ox8pJIVAhHhr7-4oi*s zh!aKFdh6ZBpZYQ(3u_A=JK1TXrE{-EC53Wur?1emTR8l!5_(t>Sw&Lq+E|XYkgxfP z-em1yI${PWxnl0CzP0GFBnE#5TtOiQfk!MwFYbf&<|46d^-Khq)chY`wF|>9(5QZo zRtMH$cdQ6EW2`0%oR;JT4{n6Q7e%Y~EAxS#KI3q-uL@ei$Eg8-k~thtGD}~xC$wYA|d^Q24)4^x6dpv=$l)bzcp zTvK8w4}RC(E6x1)y7!i5Yi^xjmT<|O7%Yj^wzO)#=zg(27LLq40l&n=<6r)WlRK1$ zjemp_Ic5N08Q6Y#G83fns=EL_|DDSJbN9_-cWAgBVNOm-b@d0zoV(9h%ptm>tl@SKV5FPVU3Diov*rLVwvRxRus_^ znCSQa@!4BE7d0_+T?P%+YnkV`+fJd60r}~$U<>*GW6HSg$ zf8?SO9H}PQC)@R`>QzGtuZ|q$M~^T(-J?aC_YlydA~MD!?sP$6KbPpCq1R9Q*gikY z=StTs;(2O#^kq+`&XlNEc-pIV@gwWA{A~tCIZ-*88!xVGuEIAAG4A;}S@vR5r-^|R zM<-xEEa*N|(_iR+z8Cy{YfI%M|A3xy0cZ$=eTsxOaQlx!Ukh;eeiBWss=cw$BUB~# zW#O~J?BQ~vbf+Pz=43x<0xOWhV11T0$?Z$(-TT}ZFzaxXL?z}+T+B}Fa5vmgOBdoo z7in?V)rcDq`85Va;>~@afzHiZ5xZN?0gmw>(Mm4=eV~z9c`mP0#62yClS8^rEF&TC zoLXy{ZyjT@ra00K&busjg4?{aqWPtNO=E+W^+)oAv;ST3BjhLVg1Pzdrx&25><%UXPjUv2%1V{D*jFkC6hU1CWt?26S+qSk3L5%s#Nyb9eWH z2kuO=$=p;vgD1=)pul;Zq5u#!upa-X)Gbbg74nhb-=O@wHpKJ-vtHL3m7|CX#Dpc{ zeVD`v&3}{jaSVktWVKXV!k`&DJI{#f2LJ}iSXCraqpB%%61d$z$i9Rk| zpDfk>5PGZxkd}mrKH~W30k)yQldRU}j%uty=o=|`2EwHZz4wPI`mRpTx4y}QzwFe~ za<^U}nOn~Cc6Kwf*%HB)+Favb-jR-p7`61*lW7mU9o>UL`8H@gQ&}?dwOmYde7dNQF~C& zX2koS==g?oDE)e$#6dgLdh~;~xFu#@?MTPS5WgP*A*?_BPN_X4uC1N;pRykKy#Q%G zC3zvkhle(?FO9tO1>gB@Lg4!JDjdq3Jl^s5q2XdvDTC=EWJ^+P#psKbWyrYBc*yFz zo)9cKr8EeBBA@~^b7Ys9Z5tCxshvTD~i5|}k{)H>8~no(*|U}znG zQ-Xkd=wQMqSZ%@1&P`=y?ce;|8x5a}7bYe~b0=0z^7#}(j%B-@!MRtWe;q=1Z*J}k zMgr!~&)G|jR+}<)6J=|d_xmt7^KqkO8OdkCk-({M>O?O9oZI&VCf&7$p;#kRlU|g$ z`u1$fvue`BRF>K{nmi6_ncH# z8l#Tv<$0)Ueq5_BZ{_jyO~9z7;8&4NcVDS_n;9rhzX!hEWgLmwA$c{)DVZp)12hS~ z+&?+vpz~}jTr>eNdthZG0q;IP?*D3i%KwTM*WN6B)RvWxEbvxQpjgewZM~*-hmnzi zxVOw5-D4&Cs1`d)sS3*KHO1nCLz3$2pgc97YQSM+U6qT;X%z+xtIrjkooX16bcH1 zB>MgML?DdeuNsuBbs!v0?SH4`LGuzjB-70=VF@!zzJ{47<)ATN3F~vqVh?$t+OtnZ zuZjHbGGj%qd+hYsi*Zd|V+WF--{XoAl5lmehNp zQKZ2MF|N?xfAFJY#mJ@`Op6$_CpT=+($Udb9Zdfy6?`cyuDhov?XIX~WK?0dfQ$8v zF^-F5xyxx~KXK@f!|!@VWeA>1MkyGTM>Q zfNFb+pnVB+j`-h^P#Lb4VZ@Pcv{ec4(zbB=rYWXj&(<#aAXylBTGgd#r_ZLLMTjQpzU!r$28hz$3 z&78v*CP@;Zjlt{{)_hWEC_f-A3L!|%kK-2X%re(;7BF3;*VHi;WSOO(iLI#$3Pc9-u<_H$WDSL(?XI+6iO#D z?=cPu1jCo<8VCE**MNW$dakG9OGz$qS-br%0g2e`lf@*d4dK)~WoTh@L~*1T4rmCU z{!L}87b4-(FQl&|yzB0NYdqUKBW7k1_=wo*5gZSHccyO7V?s!ZM~jj@Rz)+37n&X6 zu6fj>#BcO%IPooPQy>bLSh&%%FjmKQ0@oX&hThNR9TgJnsdJP2H_^)^#?&QJN>N@( zU^y4RA*JKLysV_Fa5=bqG8)u(yXfrf;PPQL6oHUz4@3g?VsRJ&sryn?Hi>CSY;3=o z2%{p)%v}@|6fa&vvhQSQGr+0XAx+!z^=7D zthAfSe=%A^&i@#S9g6{0eCk{hzFHI>-uFnr-w>&W8KhA{`_MNa?0;i5_?}Xad;geL zuxfAkQ*@P6!@E!gQo(QMeLtfS^7vqB8qG0Nm}s=4rsRuA-IOzb`0b zPTCvWBHeJpex9siVOwqKQOoD+!!s^YUjKMfnB{+oOs#qG&=N#L68m5;bL?|ByW*;u z+Z|x9u4^oO1q+|GHgZo2_9$gzJ`o0 zwaFYi3RBhokwjV*C|wg<#71BUH&beGJ@7simMB-twcphR^;ptw`vrM_SC!(i_J2|i z3ZlZkZmTMWABNV(aR#_>~*cs5I=^iO*BT9ldu(j0SL z&r38jg;Eb)zQJ}Bq=X+XX#LLkZf+vPP?X&Np5XUgK;|{W z;)~`@217ikv>jSP+CG<+(xx<6li!E1>A69)lIRP{+8XG^FqMBV+4jfu{$eO=8YTWR z9DDy(Zu70!yLT-KL5Hn0K-N#1L+gf~UXDXlug!Wuf&I(bqVK=4E>aH7bO}WivMuU* zu6#+;yho3UR_!&)!9hJ8E%iEX{4e}4pw;IeWFYt*x1r>|UNS$y3m?n@W~l*yg(|>c z?7OJSm6;QU`Gg82OU0tx%dBG>r6I7!-;sA1nb7?4o3h9VOu0$aC_>hTelbGuS>)gg z@p9pRL)cQsmc|}BWbGAyE0+Iqlw^mpNAkXE^hDhq-jp1c`HiG>kDVN#5fEl6?5I@? z>?p`_6k*;1JPO}v1D0W8aNtRkvemP}EZ5W1gUN?tMM)1hD}@_?)bVNAVOfzPp!gq+ zVPb>im^hXTq-n{4gqV1&tEU<0p))!E0-mLjjX_z)T7FbC#ug|lYZPaPz8v^3GTdAd zO&!o5a>hI*DI!sQCwe8G_&tM zrj8pG_MPjBDTZd#t;gaDpMLbSIT5nzizYnUc(_}%USI7&%me99rra3c%68rZxzLOX zp^O4?x$;Ki-^^sEwVftX|RnYju0ddaMrK}Rt} zZ@zrT2U3RaFT0So4$7mz{PE4DGnJj-2#vx3tTKDHN=Vbnos?jD5O_QKTojwbEhTx$ zTdZ^zW&>8T`6IPM4W(Sjqj@|1hV#u!LAjR22+o8wBQT7FaSe6O=)Z^s7UJEHQ>DlpF0K|smO(aS^bM>5c}@gQ)vbj(cEbw-(oAv>fAW+EFiOu-Dk<%bAAsdj>hMg&kwjPM#SvuEr1yh( zHl#X)A_h~J5qfOc!)=d6t_Z==7?V>HWrBZ1f_Sa3i$0viIXAmwkR-?~{cPr&9xs0h zpGXa=*{YMTc3~v(dcJx}YMlP^48HvgE8V8GIB3R0yU^w_C#{SK2(Wfj+5KXra_@4) zmOmi^hZn7}S9TH+v}6&3Z!G53POO4sD1qZI3MZ))O)vamVbHuk5`rOdKzx22;+694&X(|of=U~Ksj}>LK2KyP>i0ybQ^yZ_m z`)81H(c?Iio386P@zLP^t?$|SgyQqWO8VA0`gcZflF|WU_ zl%b7`UzGeTZX(3;5Lbovs6_gcU}BT(;25pyVuD6=A`wyHmbl^V#~zZ63SsWeyxffg zZ>@*?sB947NZaq8(S(8)aMo3PaM?@M^sSz($Cm@z1$TIVjz=FiGO_DX;j3##*78m~ z#t~6b6Cm#&oPUyZNH2R%d%#q>P`kV3)IGQqS|14_n`8hWug7V(F&ofAwjt^ey8IBO(KfT8iu;s-}6FKuupp!C)?!fLYETFG|nH*LQO^1f_6Oc-UnqqGD%D6RRTJ~p5eRK%`*ta5XBaA?i(v`lp-C6D;5N_WJCt)QbLb;90E|{cYUw~ zx#qVcl9m(8#4>d9Gl4p{TU>XoM<_-8`y2O<8wvYpMV5sUF=3>JF5qt?H}CNf9ty_W zk;Q8veE3D^ysA=&fBY|0Yb*jSsEEeEV2uUG$^zZcPOfmLK$Lxi7@?rw8aWM&F_L0i zR0YU*0xUsOooN~9(3cUtQvR3JjB=q2{pU5xhZ4zKz z$wr?%8+NaZ^0BP0t<6y^evS5Yg&+3#$iItboUCxD78r%u9Lj7u*4lZx6KHD_YC7n= z%SlXgv~gs^iPvAe`awZ^hte;%X&m7G(0^TH=cUtag6fl;f)u>ErCzAO9RcUgJDQTM zm>H<#URC^dab(`5lH$P@_LEMHuEP1?FCKBS;DaQ{Ty*bMD$}G5ScQH_iobZcCQid- zIyLlDew-CETaYmdkxxT)v2-#tJnT4h_}$AD1fA3E|7-yNr)#7ujZ&QRVU+R4%Odx2 zcD}yk0b(^LnJ#|Fx1HR+{a#=dIPiGtSsDE z!o)C@izK0}dNh>R4~EONGQyYkjbuJQQx(}dZTS`lIa&@{eGv7>{nm5s!V}|7+b?Np z@$iT$?=hQtbAoS&tFgFxx|9_sPa*q>s-Ra7hmb#5R52BD_)S0 zA1r|D^pH=^II5_Wr}F~=_PQgLzd^_>kdqho^^B>|39O0tDSY;*U&h0D%|YkGp5L_>`j*zE-G zD^I4V^QkDK&hAYUON$Wx#Ge;`Ar@cXhE#F&{V6=SW^nB?eu4tNAd6s5oI}tCx6dGf z+ZFKn%>BYL0=`NGe@kwD< zQ4geGqsr2Ys=X%M_cMZxN1&b-TYwBM{0{hj4XscNX0~$HgSD*ne~I556xl7KYYgSJLc^`+CZtKSK`1Rq{O>) zu;j7|hruwgu&`D?*aZgCuY|bJn>bC;#yQj8odl&z31je0Jz;Jy4SjF+)$_oD*gA z=J{uXmCn*dXh*^SE;qMl>&XSpe*-=Vv)ud%2K%2k&v+>RvsppWW^!?JlTt)l2VT$D zuwx}$H$R-z96e`i*mbwiBPPkQ!j+x-+VZQQi4Qu8ZFp#Yb8Lkfm7G87^UBg<8xbmBvGm$vFvj}FOQWZ)b6K`rQw09gRld-tZzkwpjR>C_mFmEU^4nf^k zum16|#J4>hL{H0b{9}O-umS^Gj*055?nfR`$Tw^n=9X1qah#9(Od98;YZ0+e!og3D z@sn6&BEF%ZK$0U-?|gI^ahZi+EKT79Ti5k26$Yw8BgJ-g83D5?{a9Akb>W05plklF zJ!{}LTlq#9IV%jI3Y+^YIiIBE*%)*ws&Oz1<2YL$u^lV1xwH6=!!_=>8o(HP7_Xd& zjQLeW0Z)S{G7#7uQ8Y&m5mgVdlsc#>-%dbNLjOtS+^;?n} zVpz&hh~~T!mCYCbhl5kTEiMDF<6laTZpp~LY?kP~5Zt5?ENy-o)*@vi!HxMI!g(>< ztJz$B@VGDHt8v2PcC%y&$t&YL%8})fZ<4fAo3$gPsJbcGYKj=yGEPK91*R+pW)KNR z#xot`cHSbeF$?WEB=|KE`SnM(-~Y|Y8$WphrS0>nq{P7kZ!qxwdt+li`X3j_91y{%Kf3MhZTB3mLqPW|S?GSn*L{2AImN@Cx zVKd{qE>l#y&}a8cLJn-zI9P0xHCJEu)ge$usvUJz`8FBf$-G4XgZ5F1Vj{9^c!q%S zH;INL7qLGmy|b9^@YdqEMAM0DE|DbokwLk6C zA#0@1-?ftyPo4yHtwk3jXIAiT-CeA05PMzs)rHgY<^AY%Bgo=H9Wjj+722Z&Gm)Qv z)mDLFL$|dZlYm^hfidA-+X!}4k+{lVQE7e>HNqt~vq(QiH2AT3+}p?TE09swZHLRk z!-lo%jO<&d1}7t`Hxa(3m`&S1P;!Y<@mt#oyVaKRTBnSO(I875U>!MiZ+^WcO%U;d zFM2%ekQDB2OIC>%KDWDohQcv)Y!;q8Sm7WF9trz&g%f`H+;mAu>2TE86@h5K$Ibg< zgs4=)gl$@ogrj~0ePr0|9Xr2JUxVVUz9*@7a#{=6h-0A*|0LSY!dE_8L>eV>8oy9< ze{})B9;FMudAag!`_=2iecucYd|*C?CH<(_o3j(h4!p&-1BdNJXgq9$8P9lh{=IMi znVcE$let!33J*AWynl>Pi=|C!B`mb_9~T)PO*Opfm?+)F#5GEuYQuxnU$)DIOmS1{ zsHAjiU!~3>67Npfbj0^xU)1-6k8hlg)VnTSL_aIgaeIbfe-uwjql|o}qM9kcMiR7m z1s&hwwD+Q*jdPNeF<>u4vl?v3)?E8^;C`!O+%^a6MDzbOwTNfS3yZ`6lfUn=pTfZU zOB^|aLoNB3Xz>}{EWzJnx)}XQX6!0_MMQXn(JANg=OglUEFwzc-!sY)6)a~QkHyG7 z9nR(3D1WM6(rhODnit5PeHL-r^@HCM;VM7a#GUv;&VfbS0Ghz`zou0T|BnDpmW#W2t6{rPKQ1;|LWXof4JfN zBs9-iz4D83eWHW~<~LjiBz=TB{UgK98?vWR7tzs4gzvx zXs2v!#T6wr4b4eis(ggM+%m;q?o!IO+TJ+TxILMA2lEqT^- zJx!CdJF`#UiiMwjtUnO1KSNIV=e{F-8h(0e#BZmq#m{8HDw(3p``|mw$TmZ2=vt$Z z93;Yci653!ev1*gqzC?GMFA*_TH^VUMvii(e@u4OXCjs*{!}~h$p!SGWRDcobT7h) zmF`xB=`u9>cwX>8p=nShL<~eZimcLWt-!0gBgx`k?mXFH58ZxtK6@c^J+%&!hvquHdrc`Px4I!HFfbkoAR2NKP9L4)TF2D{0?Y3P$A~NEj zR_f&=$m^zM%nHyQC?XG*GY%Dgg*PvD?BOI*T_EeLWHV40_E>QnKcXYECo+JE&I2>D zm6j=GP3*Z`l=V%`O3(QHsmE&Zz>|cNlRE~ko;zmz7LyDJh>(!*vN!CmN-89jpx2WL z9C|PEErm$QfD#h72^zYkG8eS!Md3<5!b zvA``gPXu)ZBeQ#ZP#DEjjEk)Yx8GM338B5TfL7}fN*8X8&a~NU3x+f~~@s@n$R2Ok6eOomn z@qmp?WkZx&5IL8Za1!LO`{Eg(GQA}P(${aP4?Au`iHL}lbN*Q3(JBr*HeBw~JkW>T zTR+HJ#BLmNdkh?JG%F`Y&Hl=(u7PS<1OA3vw(C07nMa$y8d^BEQ=F0XjIQ3JxMlPm zSF14JA>2&7b-Sl_d_SqzpoVl11HF!V>;*3}dQm9vWDbk>uV};z+agxF;*pVe1=?%F z*;OqY-(|@X`+yz%b8IVfQVH^8b-?ni@sT#SG9%q=uf`!G?S~s*!S*=Uem8<&Ggwi7 z;7FDk1RqucbI<;Vh>9In0l|LcSJxsv7+&;#C0AW%IrBb^;&yWavNvsl1v>BMvkFFs z?}&$m=bW+*zCA%IMI5{5BONNS`dRl+-E0JNBMpDj zS4f4CmgUBtti)*57NfNJZ$lwqP~QH-9SNojx|TB1@aij8{_!yi*vna5hf+@+ZQY*L{d|})liu@>Sdh|Vlfp6LrPsfpXb8a5N`RNn+S8+Q2&tL4E9Wloh9v%Zm z_rNAnMW0f*A4R*z$H);CE`r-D43Qu*7~FC=Yzv|=-#+f`Wv}?eo#T`_A|dys&L>Dx zClO&x`u)o*DFsgmP3>}gybH^~Lq^P-cKl|1=?4}|q>$e#S+U_6XvJa~gjSRKCJKnhzu z^yJCb*Olyv+l3=5Ldh{0N1fz#I#;?dYHyK#GOJ)Vn&!ECY@)_tJFh`vBl2l3d~8T zRyCF2D$FMBOizoBbKV@md%~apLL&k$%ek@)W%N@S1iY2WCLbkbwwH51`Nnt@`|3v^ z`4#$(E&oYO?oS(m(LGHrs`->y`1}ro;(Qzn+7ZJhEp5WX(5?__b72dJcb-6S4X&1X zQ8=u^#qPrk*7IL61mrV@GAWLXU4 zcpWi7teF!E9d;HN{+ad0uX+dtesa^yR&Lanm}{tW)nymTf#7TV-y$y7#1zgm=M|o$ zP&9vtWKLQ9hkS+?;VqLK{DkzowA6(}h>5KscGLv18mS#oyeg@#pY`^fUFl4TTeSNc<>lwgi>MDO+aRvHG=;eL!c1rSHWb&6A&CZc%CKlAicwTwO%uj=g^9p&9ZI9!38RLMDt> z#KGxcc=HuZDp99L={Ozp*s*Ohq;`+MhPq+dd9A+r>nT^QZWkiWmkF@fMLInvF;Hve z!;xA_f>|WfOefkBc|XbUl&}5atGaRaf|{;lXuJOaQ>lA8;@}39U+_Wa z#^U$((p0rUNf>sXo%|^{CNJONuTz(doVk;c2QKy{ zJWj1{kJ5`<*LZSfBX{!8Nd%I*I&rc9(Iq;MQmFE!*kY`zssd6+k)vz^BQYDMNL`BD zQG!W+ZBt!Awzosjx7xh|)G#xysI8uQ9sgRwxxcG2B%>DO%6R_4Sgmg1Lh)ppS&_mZ zHEqQlhgYmj2_;a*cs5s6vUpNkIGpliO<(mRf|hQ9aG2-*Q0Re)Ys zQ%qv|(4!kL_$7{1^w-!Cr}}rTSwQ%bvJA;5)t{-Zz!>`Z{lO~qr=#3#B;wn6s{^3z zV#R1-oI2Vpj;8yHNBGG?r(`0Qjc56B3i{#;s~CL*qcQ92$uiMqLNKRM|6pv&M$eR? z|J6(t^n-E)fj02-2!Z|36au}?WDj(YH#vbg}zSMYBYtd$yU4g zb^hAEi^A9x+ANNtOIdUZ9}-XV60ubNhr$>g;yB&fgwW&l(k6%JAhXp zhE>-fHn_<|`whjskI>WM0d_03j_Hqnd*0s$Sab!`{bv~iM0t7!uMe@HGoL?+2gEqg zbWLxa$1Nl{q%2Q}v@$*o4Y}OV_KZIXS(m7PG59d%H{P8Yvu7Ok-l{KDSn~`Dc=?nW zJHL=`K{9Im2-J)zNl6o-6{e@p%YdcLR)c-E{5Yf?biV+UC>Ae&w1Qc_gLfGf6<{>SdP z|D+s^KlcA683@I`(3S(E zIw(;4n5|Ih7>aEYy?ZF|dR#XzEPIWz$I<*Y#4W+#&!Z#4?$R8x#8Q&aR0WFX4Z&lY zF=R6GHN_5}FK6?Y$yZDQvpHk3SBdL!yF1EWEs@45nC(Vj&-p9mT7Ay%aI8g ziZQ2SC03#<#n+~mLMFlJxgWPRr#3nfN_;0XpR(Uwd z;y&`$US4;p(V=8h7tIH$D%O9S4d2?tV+6!vuo2V%%_L(dsPEctk(l-^b%e?BGWa#F zLF-kxUN7{B*qgS3^-SfqR|tG12c%g4%5(8G3%#K~A)c{pW;^eyYv(OQBDCzdJXDxu^OJc9DnVbCd*m6X8Ff#J90 zCqXhab8-<+aqV^FHm{GbLWa=3#{7H#bkj`J@rO{9cDeAg19!J1SrR;xPM(b4cR!IH zt3b3t6SkX$`!guK$C;dlxXW}m=$zV<=^xjADZ8b%53KWx{9Zf4EO?{(H#Z7 zIdJ#u>veyPI{dBkEmnZA4{srudB$g_QAL>vPuBG`D`c~+X9}H>PWN2Nsr3znvu-L4 zG4MHx_*|^POFpO~n8b+=4DLkdmIJcA^d>tpLks|NNzxg?mJbDbPVxEwqKn5El3v925^?hlk zeWeAy#(6Udc=L5%nEM=2Ey=CL6$yXLi+58c5GK%UiMa6$HvQcnB z>3~JGHcyWa@K_b&R;^S%x$wUN-QQ*TyDpbEBtyh|D@oi(NV=(NN58f-ntpsgz_Eu1 zh}DT$4(Df_kdp(`DX0R4JCnFLnbf`2()VZtjp^;S> zuUulCM~(Vv=Cz@<4&L4>Aof8uAFNL1u+ zGMg+C`?$^a=YIv$H-d2pX<*Arq1NE{O&10Rs1HSBVWcL7{Pf3bX+gGy|(Col|?srZ*aomml;H#W{YJ*y&&z)C;7mus{UwQ1ahxXTG6i{M?n_J634>A$sDBs6X6^Yh@3UD5D{e{=f<;->noa#S%}PT(wS0GwWbft%)3f`n!?1ucG>Ao_Gt0krkgc7 z(3Ogi-F!}9K9d8?3hKNQTw^i&(02K!d%YniGsE{rCgE_YnZ7efpnP)w75TFO>>!c2 z2L_`1v6Fk6vGHq$?xK;;^MH8eYj{2dz;0mc>VppJW}5L}%F{){lf>i2^Lv`dUnk|G z5_@%7TG(KL=(mE&qEw0&)Jh7faK_)6^?)R`V$I;mHJy%gJh!Q9QXQw_gweQ!ssj1> zVoVCJ1AzdW{YnNM`XXA)m-VjI8uNiW+Lv(8b|uMgyFJEuQ4!m2zilkqGyyy-atHY z+sq^&J9c37us;lSg>PN_rrks(LE^j!|IJjr&^RlIpUTHO23O7Ye11bH2UmsS4M#Gn z3YJgBu}$23G+Fn@e%;^k-X3}W8JULr{XWSXNAjb5pFVV zg`R^2e)81LBK!I+rhe8;1`Rb3U#gzL?kTa$#i&;f96G77QWRr&+O^X`Edv|z0|ms| z>J78iozh&MPm?J#-E0FBHEm^wLRu1g| zdHLg6xiTl2qIhSluPdfJLkM9K6XJtAzx$f7*3%~b{np8&_~XsS6J1%v7T$a#O(M0t z#g7yUDn)~5GA8_ReazIhv1PodVOc#aP-D3hE|rUPLP_!H*%|Qaah(C2K~a(FE*~77 z5K~RRdqgHWf%+bKHXlTc=z8`M_p>$>o#gvook9t-e+qxR4zke>J=WJQhGx z3Cw1Xs_%?owBc8ryVME&&A)#}6pQ6ME6!UDh3F+A^Oy=fwQT7OBa!xRUw~8F8X}#k zA?ylK5DeY2NXVON_FPfX>r5UJULil~*8aaZDB*}{NzkF7DEX{k7{=~gCtU4_S?zc5 z#}1PTDjd4;t5M=c;+L;%U6@>A&atema=hAfWlVxJrDS>_AP#h!e?lLA(UtnuM28h{ ztPfBMHpu+e>E`)IjYk*D%V$j(Q?DaPKk_2*2g4Wtvd#KM>@PF?)kfgOS#~)yAMf*c zbQ_e3!qRyI%-95sl>%e;f&Qnawl2>=WqsK1!_M~mO;jy?EqvNoaT2%+ztBO>5>aiA z?kf}7oJJ~8mue5(D^r@KM_@N~AC@Up=xbEEx(> zF!T*N@cwf?cjEgbH2z~?=Yb)Ub=~AFn+XLcBMBjEFs6M;&_r@9OIavRS5q?wFE9RdUwPD1W(cntY*Si%%gx`v4SqDaxgp;r%HU%pBsHD zUSoX>O{E7L37NFIRx4qKU_q+RXWra?#)boP`4!^rCtM4{Cn`wf(0+|#_Mjm_Sh9xo zm0hfU0suNR@zSxy5q>Z+I7pXwaRZkqm%d5>Spg-rQ6MD3eoJp~`zp#iuq@@`fSud2 zKh`t+km}~M&&<|AXJaNKc7xgKa?9}0Qo&#~9*&;T1i5eA{BQtXYGAEg9Sc7$CNHFC z3h|M~2z4+1P_Hq5eJJIKBcQ<+CATP(7j0f}N5XHvub@nU)N~b-ol6 z>OvR2`#x?<1!|*;@Ys5`42<2EhBskhQ|S`oFRBftzzy1rAjoTb(=a6L_t?ySCYX@m+>qa<#k` zDYs|@ibrp9G_2-VetQ`1>@M2$`Jc0o%qcT2{repocs(Y@Lz7)A%9kh#=3LXkeCfTW zinh;jb57-WS!C+TQ%D6eU9PaH)XpSC+oMUAOe-l?kR%#qDZdxpKD&vRizNgwK;Nii)Pnw)4_F`5SuRerGKfdBUA%#QDU!$~awyAj6oL zUR*710S?JM2(h9(ed=54_~^r#(kR)OWN;E(1Fs5IBf9x!y`9!ZaSz)w*dOep4*3$D zR@sJ~m&yC#>LbE&Da?m7KSE@gtBKm3Y+-nG{as4bd7&|Cw{OY0+@CQIw6W|Z#%`!J14qCoP zuZ8by8r)@v2os$^0*u>-j*X2{n3Ac|yE%Dn@1slJY(69^(H9H*zUQ>_3dDO4)!3b0 zouo+rA8&I%RX+Ya^awZ!hZC@m`$H z@oz+3zFY^x@U%J$%>DSz{K;^Q|E|E~dddWJ$Fs z$>OFA{dZo{7X%l%91|)|SV=BY&*n&_*rA*LF*0q2GAK=P02!Y9Ppt1om|gm>Yh~fT z3BhN?9O#;oPU7t)Kyy|mWDAE`!w94bBV zY@-(KdGmk|rNG8iOYCYdbbiM{7^zqI8?c__z^WWyq1bV>ocwdtTS|1n#bWS1P*zm# z1s*hO)ubW+9$zgJHQL4L6X95fv2YpqTTnsB#NK(2{}JVj&@If+OAf1{QFU@z@MgMl z(*J7#P-5py#`=00#^Su_Tr%8$i5e?e^6$`DKo)%;1g&B>&FL&SyxP_dh7y0#5fxv0 zzYgd*0&A}*Cs$Q~aV8Y%sSE_2d0A1zf{ua_KrNmJ#*I3EGjb^{ClCi3s7K{PaL}+$ z(NX%NxyQ#up~+RS7{r#MbdR5>opWToP`*4`?#uV$ZNCDhua+^NsZ=j(#EIN~_|#UE zMsF3017wuNA{E6i#OrQ^FnW|Mx>kQj!E4q;_ZQ?Q!wNm6_%huFQCu-HKny^P9!3{1 z#A%QqFRA@&fdE%UZ#k^3U4m(A(n^2p}bz3WQpJjj>?f{1-Sm}C!a zLxX$K8zA|tym+cJEPL@;UW`l8&CnswPR8Tub=H(#YC{5HHp3D6rw^Nz5~#%8sHy_x z&&4s-;Pta4eTvWv6Gi*2v{5LfF*+7Xx(_c570KXm5^$4MP{G7&Bs1+@8%h?(dlQV@ zfP1xr7(Ufm@+uM0>MsK>fF1sCI~8(R-MIJQsz{xGLb+kmr<^Qr>~izS+2f^({|p^9E&^O5jZL2(Et+4v)fo{ zIxXogwSAf0cePc;I%3gdz>H%*vF}(_p;Jk(ft*z>WY;kO^Ffv$&^T6TFY=A)3$3sNxe4F}51Di3|5SO3vyyh%26{!caSk0=6K=p|vWo zlu3*U(z0yuTtYSaYYDvvE2G;vgPzeT%?O0dJSCp{S1W4~jaYLd%quJ~iS)S1sU`jj zHh7-{?E;%@2_xJxD!BAVPe4!VnykE4WjTT47ipu7OZVLyD9N+H?W7DFXD_t(oStRm z*iojO*4ADq>?c5hsZfLYth@YFKmcbE%#DZ%GNhU%)0l)jPEp^o#hpj&flcA%V$HWxP z5)r+MRV0Dt$*_XRX_6g@1O(bqt@6fad3$BU-`YK62$Ls@ij(}TVmf~i9jXoav6`S% zvHWzP@wB%My#7bue;Pn&NSRbC^r?`lVHGs?2G)VR8Cy};1EE(PZe(wmXK1~x)pPk( zGG&HlHP7+%XkueyE1`w}-u<8}j4!@rr)2q9?{dGu$xNeaPmAyn1pi50y6jL_FjTL6 zwO3cg1ee5!EqF(!ZS5D5Z(~i2XnMojHhO7e?bqmSYtD@HKxL`26lr#OuuMfuV4|;8({Z6Al-M+4 z5aZ*N`&674ZzBHTVtc%#n<;=#0yCaJqIfc*iR^wcVmg%VLeA{19sAJe zDCYh5y+>M&sb(ZRq(Y@K4M8UxKyCE^S+aQ<4K931!xn(00quE6(6ZUjveUt9{uE$} znqQaJjNh0*%RfHR7kg73E{EZP0{RDs%D_tV&qOB}<5vm+sElbPz z@I&Xgh}omQ6t^HmjiQDYvn+PSIR!<%gV5I(c6rKdMu`B+SQ|Jb4kcB_tc0bzG2~2b zBI8nSZqH|SzB!c*UDh9FIy`G=Si)C$55dI$?{&Y(N#>W7$uJJZxJxI<;EWI{)uJ!H zgfjvfDirQrQN~;y0`~Wan-u`X1I>)XUXR;GKDk&av8-WL{=IDW%jr0gFG)gBISQM7 z!7sobx}E?YE;HKeTBiiwLHkN)QX(NvUZXn{7zUQ8rT1taTeE}}Et0i?$p7k78Xc9}L31IX zGy6Ly$;-L{fpy33GN2o`;VLsIW4%DwrfIYYMRVWjcio&JpXe-(#!L(!MmnDC2rxEf z!(I-L@Y}!M9H#xpORq$c&FO&-0s`YgX)xp&bcFC@frlU$hoEOOkHZl|^Y5`W@#Gv` z4G|>1%U~$v15$SWwQ`ozf1B~g@-ULIG823hnRhO!yu*%Iq9>JL9v@i~`=UhxR}eUo zW4B&u865h1wa*a|6NUpicL4<($oVQ@2furN$*x4l8fEuEXUuliwvxFZ1JGL)(<`vx z)tkVY6oXTb9^w0l7|I@$#g9)!5c28J#qh~Q4x?I8czAX|o*$E(KHfX@-~Uyg*z=yf z6^Rs4xie=Y@y}ZH*zOlpb^rXOO zNrl*oy$7%VwYOOgZ;xUq?lP${y;WeFLZ`B9lyDoMnoAO*U`!^&*2S@vIqggO9U5IH zU{`4M*IJ@cMd3?)l&i8qtc><+%4Li=!_{U!cn_6Ewe-kZ63UbfW`xGpdj*-9q%#yp zWJB=?oOP9^2u(T*th(>9uG9&$w1#Ci;7+aeG;>mh*2TYu=n31cX_p^lWa0BXeS=fwoSHvj>4y^ z=FnBV+oUtS|4F`hnD*)M@*|>r7WpNYeYP3^!D^zpAclC;TL)n>4m^tt7X4SbL-9C^ zJz>*{pW_aN!#GQyhrEkK@!6aGrD7q=8`e_+ZY=lsSDMwfPh0RDR^+Q^$z3pp0E=nrHdOhO$OAgf7U7G?8xD9SeEjE^54^T;^-)=~%c z{>;FMP@KNxPzNJOu-MggkT~`OVtMp7B4P985jVhD= z5&P#EZUFKUjZu7#NU4xWrxf?v-!_Q$+{g%G>;DeTvOJ;TZ~oBha>udK*jVXk=r=j{wC|eM(wn4L}gE{z&HLbz|cn&ixU_1aR^~V zmR@Rv`LgfRb!Eg$5MV9L2Z#<>V~AU`pf4Jzc!jo-`?ob`Q(F-InljRx3!@F~4PG}6 z@!?fM1$qo^MdqTeb~kqWvellKbuwdedK&R~hV8}=DN@~dj%x`(uRCSZknY-^=>6O}Lv6KXP@Wzt`MJAa0 zqQVUp>;e|W;pxO1@D5Ekj{M�D&5p+=!u4iqz`q8xp_-w@G5!+u0pG!It9*C=4| z*t9?77{+P`PEdc&uB%3;3N}+b#CfVqrU266{n%2Kq{sWEGR>+*?g*3VS$_ zl(oJM+NtP}+Gm98l{EcLQXAB^f%u!GY}XsedKzp0uuX+_NW}c%uOTT2pxd$>h>zZF z&M1VAR!lEO9T`qV*kszXJUJI1hLt>prjQ7c9Y(358#CK(#pJw1=@Y6fWhBXln!8IP zTM`bg6vw;Jk5M8)d80){Bpfta%oF~MxSeBG1;%e^2Fye+CKJI1No`dk7Esf=(hUz3 z@yq5vBWMfoT@>Cx@Q{j59y3_h>)`>wJZ-;;J;$uRaw*b-3+lrKvC&zxk0M^+=Vl#W z7LetmD{}MR4PcA5Box9h&vREl|AruC0q%O zwU}59cMo22RcEWdEy6N1taPDV)S;M*lCoaPE@Si7F38hQfMT2tW5i6hw$vJBO$M*2 zNrV_m^^00D~(YKj}cct z8dbA7r4~Zcy@(t*Z9(bzQSrJGY?^XSkCJfcM#d?82U}t=5;zF`C0BGe2MIUkbqazva z!<^AXxpW*e(8KZ2@3`mV$1#%YhK5Z6!!Gj3oz{Zyj8(-;M99A=PO(}CtcB^>>`1*a zlf{#-tETzWnZ3s4YvcXY#sfqByPFRy>h@o3%j#-qU;xM%b5(ZByyjZ}%_6_Z<3sl+ zu5#Okb&vNSD)&5)i~;XQ8KOjawX_P*cOO1{M)l!z-zT5| zpPlljgXh-SnMfoPP7U;D-XTe-$i}g66WR8^!_oOk&lZaxx0AtsX~A6IVq9$%s7@ps zKZes z&*?DZdjFC1jX|6(p*GIsGzrwvMnwAMI%rIq3NG3rerm|Q7{yEFx5=#_iR-s%ij}lN zEMq&crQiIVL+|{1$xhF|Ky)S&Ijzijan8l!n2%8zjCdph@liWus|(y>du3tGTH6u9AcLe^Vu}TF>=&`?!p{Cq^0f8$$G*9& z-+MJ+z}XsdPaMrJw?1PQGX8QGCMNtjGlL)S31i)BiNR zE~oAiB(1iI{&y*L+`Rm%lhNsO&QR4ege((Dx)=CXma%N=O${R{cD<0`8j;od_idiX zzpeiwP@HwjWtwL4D8F&*_X-`>K;1saoskyKpXVDlbDdPW`V*ZJd8L_xodj%`V@3pH zEQ3yD2eQpv%iNwj9|qM|r!q9NcNx|Oe!S-z$4N<%P-wW|WpeKlvgZjMImDbw?0>Jr z>vEruvv9r8+)Q6A;h{FlCAo};Kgs-0!_h-X8bVSA##RQ!v0w~w{y~x-AQ;*_wZ2A; z;TeI(lF%XqdqlIud1K&NIo5EzItb9Y!{T6Sl0JRojGD!`OI@Xr#)x}Gx!rTq7xC@c zuuLsqZIjI=MdTiyL6i>$AfXF0qx~Z%e3K8&i`7f)H*k#zv4MFi5iy%d9J$pYv&A|< zuALBD^<+S?08d>5$|8JbqIi4>{wL4B^XE?)p*O8h(TA-4USC~ae%I>XHZ;7t z7b&+g7LQ(Fw*p&?$%IdCTAftVa%D2W&(_JRl;P@rI|1{c!y+@ggg8BF#4QoP@#aj&8_{5mSs9HhV14L63lBFJFf#E!dG1_cEh2{SB4tw87wo{rMO}~j$ z74Ix+>=A`@Yl_ys<3wJO2pMDT?eHD8p929b5|QJJ!~WugUJYocBsU`5i@i5u8*N_B zhLsb6&*OuBOG_qg=lbh0;H~xl8#^RPk*@}utHYE94-7x2aOh({JCn=^{RbVq?R%Oq ztBGg$+jD^Muf5_cg1}NW6@)CAI{B_{{mLFUnWFPTBP0iyR5?}Mb%V3JaB`liUs+N2 zP{&L?GWg7So)SgHu;lyu;DGLa7F#WHTKbJ2pGiH0e4Znysr;Vadp)^EVQ1n+mRawk z2DmFME{hI6wQiMF7TtB1`NW+~K1#Ezhh?Wn*-Ta*?w>MvKlxO!@%YPlW+0gqiqy~T@eXS48^WCI}T_wUHv9C|wzH$T^G)Riu^Znu5coIf2U z<62%ZaQ>}<6umng`Vd&PiM@31!X&iq>OqK*C_QhYUnEl)@HVW za56yA8Qz5|=SewqUtI`2GsV3q;5R)D80}!_oB$Xqh6AqY__GKoIx2T#idO#-?N){H z>d*NP5wCnY`gXlJ2LMJw$Hz1Q8ouLKpXcc%fnbsy%^xET2x8d^#PQL3h2o|E3vh7U z*9ygJt2(Uvqb+)Q4Sc}rpQA~;p+TRwH^e?4OF~R0_}Vg4N#o?T%Fx&_<=Dkt(t`Vj zkaDk!MLaiyhT{T9P_RpvybkM5h?qjW8mix`H#9PB?f&8UBZCdeP6Hr)u`W74C?;l% z(o8iixIgI>M)vWJoo65f<47W5sqZ$ZSc10OMFiS}K3?!9j@DifbZ8ZD^T)XJBiIRt zI0SW^bCEIf^;mlZ5FFsw%fy;PF>l4u&_@_en?bgyko)~57gChYE6lfKvZDKdt+Q<+AK#V9-Rj}VAg3L7^FH*7WFU11m) z6Ocx)To%o`308jQ#*J+k&Pr8ETYXJy;@`mc(RkbsZ)XwDv;pjdkBw>=*ooSF17n8f zC3NE|W59QM{I|wcsRN4)Z&)Q^hSY_y_USh|p0LK#A$mujkSNDP0w!CVAucg~$-=jO zb0VjqNQBt485%qo1~B~%PDzqfAo&4xysyy(xgc4bqMcV;4}~Nijmy&p7Oe{gTsvcX zFG|vA_v*3l`c76oe3M@E^u=oiGH#{7>K+Q1#^CJx{U484*RLWXexlF5z1z_PF&iFB zIl=!Bl1^8nd71p&5Cewp<+YaxuNexA}We|xmg|AW|G(wbmU{VV8vLv6lS;GNWI1#@Y|WO2dM~m^0`+A#^NYy z?Sff1E2!-j+~|`wvP$=xeM9;*+rL*EIMZV?Tw6-ws_fSjn`@=x;?&^+Y2$da-Vk~g z`ET{=fyk5+Qb6eC&y&TyQsG&$Mq9Gy0_lb~n;*J36c3uq!95>xIh>#U(s^Ls7l?`y z=)kc;AfBZ=K~qjeB}(h1Zr~RZ;2Vn$E_yH_kOI)eO2<~gT7f+a6z%Hn5zcV)=~)`@ zlrFoxO-YFvQ{JY3rFgROqf+sL+;8_fhMYW(!{Dh;BQ0UgN>VaZ(z|EZ>(j|m-2qQF znrv1sARmq6?}}v)t2cP-I$t_4H7l&`EhJJgNlLbtm8QWf0X@=3rj+JdXUipW#0MRx zJv#PoElaK{SDwW~$Mb7qRpws#;UyH-AY#2CZSn0JW5MLktyu2oT9E?6Xt_#6n$wG4 zIaUvtR?;R6T6U7u7ZsbL4_{CeQNmUbaZ$ZvD-l1%a+btXF^8jIM=5$=xIs3zx>Oay+Rg25g|Eib6-ACW54 zUCYjO7fo zU`$`Z^pmn_@sV+>yAAx)@pE_EjNdx~fpH?~@ogD^<2(3e^{8VjnI_dYAc_eGloq43 zb+KhjlOS0HNJf)IpEKs8Btnyph5;fxRd3bg8Ayy+V|CyVxsd^jrEk)rWzYJ9HKc}p zKzQSEv9`NMDwSHNCAY?L=o2w_tDvb2Qd0@LN>!LR3qRhbx}+P&2! z@3!5VBF?neUu;w@)xU{7xF*SclQsBkSk_Me;7mBp9(2@e@h?Us=<%pgC5%F@DSXcH zLF;-}TqC2~mJ?;vTRQRYy}n~c45)#KYEvp-(GyV_!Z0#ysJsk~g_ink;MxU8Eu%cUN}=^3*(&0p{I}m0RC(hGM0o1I9bS8Tau;I=m-(4ozqjIG= zHcewf0+O*MU}oRCqO*;xjaq#q%?(RrJyYQ|G1#bjweo>;?Dxm#erT7hLWdG| znWE(S!g!4K_N0}BP%dg);ss4gcX#){7Yo|&QSU0f;YKHoBAr&_x5oYx3Lyp*L(h|_}2g8wEgRgAe78R#*e}Fs8QHva`q*o_0SpfiAc|tVM5xPr51!tnxNso z7gz=f4Az+r`zx3$H@gDvy?2i+mcV!`9BimoSljfpjmsIIZLTo#qO~+zbSLD7WOMUn zt85xG%U=>UeL^N!O`L&}nN9AyrST$`#O&_+?jMeg?-e@dm{M&+S%#L$l;whfoKpr; zg|D85N(#ImK8L{`$`||(eR4)dxxY_RFZk+Z(Z>}@QAoa15Sx7ti;9tl1ODz-Lq7`$ z2k9z&0@a$C+uBKtyy{}xO&~}U^X5rtH|gIeJb$Fejx)3jA-_S1arpEYY4G zXTj(nZ(77?MDc+IPC$SY7@dX3Xhfb+_e6GtM$-4nAQ1v3@Ah%kHSz9R1r`}U?JEAQ8TQ|DmT zI47+&IMi1B_i|kGAkTgR6ny6Vzm?&f08~e!WP3LSjCo%hI$C-s@j5%2QR~}n@l3tY zho1Ri&6o%2=mfpp88MioxA#c{mgQDR2`(Q>eyOSOT~vsC0N>HLMJS?P1@x<}5h zW^xqWbK>-S6fkVFi~QFOpz#j!axC!VDEBh=27h%#xvzOZYEpqjt)=UN9vMemW_vp{ zL$B&Wpw3d#n;x$H0%wAXc#wN|H^$eE!@6#@!eVvotK$UH?vZYbuR>?eBgCTj-Sb)H zZ``4k5J|i*zf7t3>*V{NDBg;^%$%qQI_{8aNSmZr4c~Pu#m$bBrul>>DD^%JgBC?O zZ<#oL_Fj)k%Z`SH?t>xtY>%Z^0*0_t1NGEd8{|?BZpIsCDw56Ct{=t>cJuGvT6C! z%{^oO4mtjP!vfmRRi!5gmbFh2euApDUBb)YKCaI{9XfV29%Y(H)F&rH&qE>*KNZXS ztimVE{1SpqlyTzT^kZz<5l2>~rZ2qw;KlGm&UvaP;K%N_6DwJ<1oYnrm0S>q76 zf|DZsb0l3(-YL-P?}fX@-M#Hb;{k%b9g?CZyVlH@cSHUz-LHFjBE|0i2IqWe1?84A{#9J8c6)MedE3 zMPJZ}%qHH~$oBi%`%NFUh;K(R`!Jnn2N>+~U%Q#iB}sZQ^6l3MWWRyp+u67N^mjpE zZ6%tf#eAG4Y^*RXMOH%RdOoGu^oAzSm-Mll^(>y*lmFgenxc(W3sMPnbuVK_Lq8T2 zugG!6!V4zPwmCL-FGU75!;S(%gFN$Goe~zSosX*G1a^mK2y>nfy;F6Un{=O5rR=Ez z%-rAOb3gC)0=JmC^`7e%uT~mZjm5{*cP^k?uXWK!Kd%<(}_uFUj;& z0PUg{Z4>fdUXVZ4#0?-O0P1Pz^=XYB1r?gHj;mGY)$?(WSukmRRBnIZHvh`8Na=wT z1>l)I%az0fjq4K7#A&y8ke>kLl&QFRj7>~$OR*)M+_#-43vYslmttCuSQ+qqKv)DY zGbYBeQ`S%PWv7a+3rtys0S@iwQ@$PojCcX8xIQ1s#-r zuyHNP%JU`&Z0Udha{g&C9ndtt3J|^=k=BTB-U*nxqW#eF*SH^ZIsSI{S8sb4j?=t| z*NfXfNoOR1?U7OX&$&$-0R-&m7?S2nTRT;{i7$xniLcK{3^#i*QM!1*3%i^HYQU-xI#G3jlxxXIq?^ClR$4%r@A>;&&(sS^FM@qw|t^LiG_5Wk^(9# zcYjnWy?k3~4#x10TUt=(kJ{mGK8o;@bSy#RExSaPy&hm6%jGpGMCoG@=aMZOq1nrW z4-hf)pNA4wZQq+_(^kQ3bMr?rB7DC}G$5dykCvicd_y_QL6_QAOeUYH%}i&wEk-Xw zkdSt_x}l+g@R%_@lw0O0sQ9hjZ$aV?mRFKN`$q52;oCV8EjF5DvqyrWfpeZ-2fOYE z4MWNx$m-)Iqsb!Yi}PPJ;G&WFRhRZ#o&Z&R&IzXKxrE^CY0YNA>7O>KBDiz<_~J;q zZgRP7VmbOIjp`xSCQG+C`QxYm(_E55vlD}zJoNo@jmB1=8U=_L;h5g}H(&Chw} znoTRs#fLoA9Eq_p4vz))E)V_kpo}5?j0Q&K^k~+qIHR#@5&P^%^vhr8j$wT$J(_ka}ErvK{`a2{0IdiR!z%<+|$A`>JCLKuuufiew z>0OgQt^H1emr2`&{w7X-N9etw>2AiYskxG&Z%I^b{kxX;{mpX8-?tO;v^Jf7r+tWZ zD*vGB^B}Oqv9>5K;k(1F$KK(4XNA=G`;YozhD@EsLqBbaP)+Y~X%f|dO6;sn8@zDP z3^@#t00XZw**$zkMfMr2Z`B=GZ12J+zGs+8nG{|{tIUtQzg0{aGg5HIrLEJw$WWyW%PS15v@@^Ccd5^{4-dwJeCU2Nkt7+#3Fmrgo3rNt zdt$72x2*bLxV5^?EbQ6FZ9<;PFwMj$X!KU@#{=y)V;H7gzRTiq<_PI$b;m#WQrtH5 zrf)GaR^w<){rUq0XM@ei+Zh{9+$}a zROg|BI7yk^od9~w%z&HJ=6~_MV-GvLDVjiihwM-@@gXjh$C zV+bJcGO?3KeEqRwbU=IUPm?k$lL}PgiY=7p7C$-b>Lj=LKyh$rsPnVM1r>}4f+OoA zVf*tFtT&o6jdYF!Lmzy0z~sZCCdmD|Gm?r4`^7b)`w+dfJ%stpu*uu_Se&*nz*d%RJ(PG?l~3w9%s; zSen9wtce^j`Yk0+5n;tFhMOHSo7fNNd(;3&0NPAC?oo>^`89qA{TiAB#x5O|cT0IH zo)K%Ct0$K&PGz|PY2(CbEEb(yy6vuckNkfG~s3#&KucUnEZ;g6jpN>vy z?b~-tP$f(MuB8c(qT~!M+vv>=$U(JIXOqe^wBRK4iCW_va#(!mF4W~R>IcoKs#yTV zfR2CaN5>?ky{&cg%@H0|SC@QJZf*B%_XS7#AFvJH&3uhA`tE`p`VNQMV7l11jb&4= zsasAV4y3yuuZw(x@l&J;r7-?J>=1wMPq(jW(F5d)^PJ4&MP0|EqM zqP0k9xPxG8+KS8>h(iqd43f2&xIc}!ie$4d8-DDjqHkLukbHa2db6BBGiO*Hi<&&; z6uVXEgHRlN^B`}sr)BMlQbCeL$9uIaThzwqLAumGC$2_)ANvmH_}G)XVCQy<<>uG* z#$H~5RYmXPv#*Y6u6=3(uGa4J0{N;zD~>D*j$X62N%NU%z62>ufsbq-&y;yK3-0Al z%m=?a934)B%|DSr#Kq!NxmI%qq%9uAN(v+Gu|Pbx_%9Gc-%z0=m_ylG z(1KF4GNryarV$^#|D)+E0tEp8a3X=YGGhc78M8IcLtyN&6aL1*N)NmspIYb8Y`>u)Tl&j%BZ2GdnPg zt&w)|ms)DMhJ7^)3Fov~m}~(k6v@!n#cO_vW(mqvd&F$IDh%I|E~JvsKoTW#LwP(b z5(H%Q=-4xwU!FflMKzlazPi$z+^OZ)MplL?H@5~sG_qXf&QpI}Qc?H)UPr8GiGLs8 zlCpfgPDMiHw?E5_dU#U*+>6d#UU*bpA3ecoe~UKYyklVUL`A>0l*Xl+Z^BeZYaZKL zhdPO`sv3kQiUV_vHbf`)%hQ;|0jx9D-+POaQt7!5IdO$}2xJK<^mftvmb>w9Wth&7 z{e^?Xj|4+DF?#vXjX7TBl^kljGGZjWKYbs{cQkoCeRFbC0^yXx?V^$u^Qd+WP^GXGg|INBkdtxe)${yIH)T=BL+4F?=KRf<1l!|mq4fV2Spkmw=&g3Z_RtX)N(Zi?lK*Ys$`$;+WxMmFiAd+Iw&cv zBs*gF@x2$bRfV3lqjd$qT{{c8#I+GO4cix+d(vPU-qe=^$xp}_Rz&e zpTpZjTUC-~j^_aq84W_(Lm{8H@;e*Uy!>CBEA zqmLFz8iF_kTMN4{7~*{6(iXvX^xa?X@MQ?e5vkwUc_5`%A~gPm71H`hwh8Fh&9reO zE;C@W(s3R;KgX%>x}}r4xeXrp$txvqcAxE3qSRtuL~OV_$S9{`C#|tvbd-P!(9fA@ zeKXxhW0ABq9DITG+QL+!`qA05BK~P3ieClRBcc-|x3TJ>`gqz7WJHc!LUXmz9aj2u)L8+Dg%zdnVDmq339k&YvSIOEM@F$dqfeteH^_tjz*$|f^!|RE=Bh5Y&hCj zL5q9S-gfMO#Y3*nla^78OifrH4B@qAQbzp^?mQKo3GI|QExnf3+V8avQ$U&gK7Zc; zYUAB9jkuQjlwciDA=7m$z-sdSFw=a=J3!_X!6lI+lXgLX4!EL{uoy1pU>uMof*kt1 zt;7jTlUe^P*X!tNt2E)B?RxWSKENA;LJWc&4#oE7I3riw-tf| z!sAJoSq`$F4nt!KFWYgker~_w?S7zH3)opZKWbZr%?1f0f!>n0m}9!pwA`osbYoR- zoL(x4)*mo~Vx%w{aiM)SGH%(6`&~ZO<9>@RJ>G$9ecMVtWNW>U0?qlTX#F&F<(M1& z8O+wxVTT7`m_d^5Z>WYB;If>UW%f~J2NqZ8i9*XHyQNYyMAi9Mk_Tb+I;iVk|4sPj|iXIm-Zv` ziBGrUe)*b5q}_8n1HZFJ$Rltl`$lO>5U1$K=><2<4s=`%uFyp%(9y;`oXpINmZl@d ze@4nBd{QQ!UgKliG-%^bH!dVEKbiV>g;if@gAv>wKqBTKA)%+2{;AZi)}K1nX>qLn z^Z~15{giCH#N3a@nrX@aKwwMRtpkwyUND72B6>r^Xyx3g(RG{9Yw-dST2c&hqMGS7 zGl^hG?GE+AL{~nbtmI^LK~;_eqD6&;QiqJ`?`XV*CXC@=Xffvb(xl&Lpe$iboa8=& z49MvtBkq9Q%Z3zx?>5+^h8c|^F1@N5QGZ#iAircsR5Y`&SwODGFeE)U9AGa)%%;h; z^d|6ZJJYXwyiEN?`xk-U58~XQ!)pqcX_FvmROJ#IP)(B7BQgf=*)gg={=N5l?XfNJ zq;ri;M{~bLGut}$L$iF-o1rAIj*16M$R7-dLtRl$Yo#KsN}chCd!hWtrxy7~^gg4J zN8V0B=izDiPmhevP)q&zB!j?*C*+(JL`{%iNdp@aiL+~k>Nu!26qy3OCx3 zY<1Rd(pTS&q=TuPE&uBmd*;3)Oeh9Vk9c053lD6vJCZzcX%+(kTKf|I_~MF_qj&!D8?5PDeEsAdBdi)_ftKpAkvFeE37 zZK%od_FhnViV@`<|F>vgS)<7IKnwDn|$D7K6@leGfQiXyZ+-Mn~1) zs+>Nbrd=Z$l(IYzJW_z~IhuYpiP$M~Uq_;N3cTqwqJJ_l=3L^>3#t^>UJrE8FNUE_ zD52Eko+huC^#N||A(>v7kB4b*2d|O~Br$Nk87RI9CzghQ6GgLN-1Gz@3vGKDPn~2W+B?a9f_+#y;%@@~oxN)oqcbwfzz%yj%UENqSYyGyTqK}9 zxW?|JJC{W*d;b>s@N0IM{ax6x{2O)hNG$#F0xtTR@HkXf zFn^SI{#EG9;!-jtHU!R#x)#*IZW;Cm{+U5%1E(0Dwum(1FIvgx|B4+cLZC$JV)#UV zy|7>Nx+h&oYfar`dMsBVWBPtcxa*US)BEQI$7cGODHyDiyAB-VH%U2Ijyd^LTQVD{Di9(dy~J%`U@18lneM9bg~Y5G`{7eQNA1^!TrCWY zof#epx2zwINM6oo1F0~*+3#HeCu_`v-fpewyZ@=2wM-iPPTZcq#mXx9;r%yZX76=d zYNl7$e5V^WeU0`k{uusd8%)ZrOo>%EWG4Thpz~7tpY*wmKr-sEUh5gfRGHo;Sa2e6 zKF6ZY?OyngxiN=_uB2O^PeIy0287ZIdr%@Bo0xW$G=qmLHRCxamU)!~9t zB!eAMfi6LpR7#vzIo#EG-5%hZuGgW`s6$mt0ow3#c-ilvP-3wc3UAPqvXpUT7kJS~ zgtm6w@!?3UzUxw0`s4G?_p^9Pm7HsbX4+{nL*(;rG}%ivEyA`5ft>YEL|OEY~@UWr@D;Tvb_d}Hffg#5$L8Id_okE)2ny{`6}!?g@~Rnk=3 z_?|`gLHKg^dcJzwp(Uq3T6UN$NbUT{BLq5e@D3Xo5n{u*IWmG}8l0BBE8;QjUDAAM z7u(uORTQyw!0Vt4NiN4j>aQ3IkfI8?7q%(1ue8?MS_ZwFT4si8Q8X{??3E}sR1HII-8ck@Adc1|Us-Rs8P|cWYhHwR{Wr0YuNuJ3gvF#hDI8>Z z7Ym|2m*W1H^vFt{5ne49Dq(;8DkQ=-6v5B90pvocq7;#ly#Dqlmt+=*Xdm#gkJXmy zP^3~yi@`juL}+Jd?+ABVD9>KwSD!zx%%H zL?`W~Qwx6e7}g~;O38p#?Hl-m<+^&+)rYGx;qv_2srXJZceB3{(jOuo^xWJfbVaN$ zV|~_m0VxCaWyZJyNMzg-=W8FubWz`M5K*WcIVxYsGif&)cGz{ znU}2MMDJ}@JDha582kAmZ-E+x=&1d)>F66737Y(K&6Xe~r22ibv97Gu)$xT!eGk~_ zJCm&%ms|vswu}W9iknlh`wzEsi?3arl_I{z9CH&vv}fQ-c6P{fBuWH38vJocYC#+9 zqo{G%&(vWZV9i{k@SBbzV>8*;?f(Z}8K0C|kGBG^VGfuphyB2{Yamx90^pzIT2v8SCevij`=)nXGF}3FC zC49kr>eZS4=Kiz$(m9Wi{svt1!>{r@6{v{NC882uNv|Cg<9S>W-F8TjVG%fSK>oN2 zXN*|K!5?D6Xlv}p!~r5DNhoH@op{R)Q&0!2y)3rR*P1V1s6Jb$8^1mOxpdR5%?Lb| z@cs8^ow;unGkj)W*qQK{MA`hoEF^`i$zXG}DY4X;`+Qnp{9<es%(9`KYZ1fw;YX?#7ElO-w5eqTz_uS-O z)=^-xN2QY8f!Rt9h9!F8CD((Z`h+-)Nj_^@W<;zKwCn%w@VLTtjhj?bx|KTbNqwq$ z8_l(WQv`_U}~T4RXSXh!wecs`G1;GQXu6< zD{oydd5(<219cQQBht8<1a#H@BXa+eYM;+ue;gHOc;H|Aa3K^^t=iNfFW@w(Rt<9` z9S0myaUE#}YHtQ@Vdg*ozLXDTvJ9FoZKY;*A;ellckNM%3ZDx2)Uzw%N34`Gc6lEN zmu0l)b-am`_PJUzmB8M7}2xY5SGLDk6 z6r(Z(lF%FM%c}TP>{~h8Gv>ppTrnjBVYJ{;{MJg@lHuuwQgl*|JS2fca17 zwA#x`f;xcP#Zdt9?m>ESS_;j`CO%Klb;@mpiQ|1#SeW*=5_I?lhz$wl{ib;&klQ7K zou^yX1fyIke|E*%Uf9!&5jOaEu)e;cN-OuaCYL%VV=ixd-oe7UI)txpmj;qVSrcMAeTn-2tvi7%+$g~Vf_5FBv;<0TFbpntyj?pEieHXuWj0{*z~HvAg3PC0+smz>83M3jj3rNSMQt zM;Sl{Y7><#61Pr8nSv7A8;Rnm9^%Ef<82)QJ!-$sPB&kv?Zzd}iSCI*l=o#hKUl^& zZX~r~;-sCGvMUhcam9Mq^1oI|ai4N{O3KT_bc!c%q$&0e+sdJ*I_!g&tUFFWg>RuD zbW`Heo6Rh~c=~U*InF=ruDF5Z4ZB?g>a4FtI+(C zqsxjgydgfJ_0zH{Y{dnhL;n0WiVxO`LneD8uppfaN-twYVaMBK3I&p{k8Z4SW-JPz z2Q?9}5DOSTpQ#g)O#&iF0D$<|UioMg>x;)}TZV{$O6d)ULg=WiXmbj*A1zQth68K5 zM(t`k%-g9~Mpc8qR9CjW* z)pA65_lei#zK})m0U+@7B6u9Y@BrIJtCep5Y1E?GnIlu8S(Bf{`@vyt8=lEn5WEbL z@CA^*WDxj|r%ggi-!8BK_lc|`79(4Jp5=WE_Gl@5Ww%S6%eNnLat~6~DUynxF=Mm# zv@9zDiPpk;Drpmce(2jo=l)=3(Q_){R-$#zP?;2QY+19fxMOKCRdF(P$SX`&gdii# zKl5LB(|)&Yi$ywTig1tzyNcBXYotd6P@BXjhQe?ncmwFL zh}k}+{%U*A{!wIQ(PiS;fRn=Xv4IiJ@={d`C4w0p-o=C)5tRt9R8c@yY+PgJy=J$K z`O0DG4o8R6p+lI_pu7Sl0qwGh6=X#cd~2&Nl6m3S4>(TLUcR=N6sLHPz9B&h!|*p z67q_ysgs0x?`!*7Viw1!_#;iJhsUAiF0X>XB=&-fGYMbqBGCm-SJkOBqZ)Yl%u+Lr z5Kb9p^Ca-|5qdWf+MKtEvGJd(clld+gil%0kM++1tA2Z&n~Sd1Z^W0Mk6s6!iCB6b z6bPI2FoYSX)LoxYCQ|=5Lia-j>`)WnERbH91qmloRtnHQIg%3j+L$tY@jSWEG~3o8 zQ3nQqp&t7ijyo6x`TXEzKsb)}9}XQBWnyK{XpJ&*B@^42(mnO}-%c9!{lkyw)Tvrk z^us4P6OMzSm$xXeTeH#27rq|<>ZdC2ty2_)h4Y*>m!>%z$%1sa*tM31u}F?v|Ncy7 zXZPab_ZaTq==}CONN8oXmY7{=WZ<~b%3V$eLP4}F+2NBOrUs-Q;VW4DM_!BVFzcSm zhL2PBuSi5|iASPV?6lI{59uDQicmmq{zbLrbcpduF9+0;`=RY?COTb|YfQQCn9coU z-M08Hx=GxGqdhNj>Jb_m7K&`j=gXuaORohH4odd3^IRlQg=|%rb%2PCge0>N9rW!VnWID6u ztQY@-ENPODEe%86*SiHak@~;HW9Qc3EdLcjWRP_TuN2MYjxMQ3^_5ImVYVy?HCxx7 zajOS{mc{ET1N6lswhUmMep+)>fzV$nA{^9hy-ep!_mb`UDab=mwt@w_tA+cNL6u5` zQc1+y^T1OVur=Z0-5*7;*~b2Szlb7PkW8J&!r`Id?{8|14ET1G$f-kP==zhbEpI4Q zY>Yydz^p`+kRsyLHqMcRj8M8m>nBej{r|%Bu7==WB#?x5Zo^0Vm;)@O`ftq-S+XI^j5`GTXgqH6AR%mo){EXG;Yye`E?tJlTbbx34zz{ zJ9MPCt4b9#U0W;D!!V?U^GGYaWyVnIVOQU&1?$#~K)Rssx0nE577KR#hxGWC00rx| zIa?k3wx=j}Y_#zUzrP)nw+jUiBHyp})!TmykL773&C+xza)Vbj+Y>=MdNpe_X3i zxu$#n?#vGi(TDgI(Sxelkh*9P+V2B_UE|j(Ln<%g1ZN#;yA)DB#=bo;_u+aWn60Tt zYSZXof0f_$4iyNHMU;e`woAd(OelW3^3(^qYTms`?PsV^eP3oz^V3`m$ND#f6l2p4 z7aJ4prC|3D;!iR-j1T?&yfsLCq_^NvIc>_#<5DuS=ex|vxX~|zyke2d9HsC>C$bwZ z%!ygyNGU~V&GfE}0QMW9u*rPif{QWUBnHg|C$F42HFip=ccnLt zT>(6lG!`bYZF)y0%sprq+JqL>C*7(JLBXbDq0dHPJU5o;?E}Uh zp(8eCc_JZzav(4Y$hjAh;2^=SylSG5%*nD@AW_a`vovF|F>&&{ClyAFw}r1P3&XLku@Jg6qNfb{2n>NXfnVj5U0GzH3$@jPS7NgP<*-NHuD*$NXT#4 z6Vz}BY#i=dTVXymfA5QGz3t#sQ-yzoTvjRxfesGc>J-Q(SNvcS#R133lug=@&!(x2 z)ijHr=v7I{mk^T-xSEM9hU*QX^~9lUfK?#XF*>S0&u#Ly2Y6jTkFzXibUA}_i{*yE zJ%<+Wsv? z-YHHf(SIZ<6LddmxXTgu`@&YhZ5t0-`zYGNd-JQR#V<1C6j~r#P|T590n5+>+OtsE z*S-YWT9i&b61Utr8#ohNPh%y6VT#V;M38tKV1=uI4_#k+`pd9~3P+k}G1b0!7JTVe)43*)+|Fv^yWcvywCRHRn5fDNzBaaN?=BF;nkFoLh%XG3=;RQU+O4)0Gr{BN;0 z6z;R(^@X7Mc%cSe^Lew`9KTXzZE%r2#-h+WE%+t}HuRe-(1J9AJtQ>2T!G{tDQx>k zoU0#ImagBA-fWwg>fUIXRewNeQ%Hyjs*L#HjS}o5We~f6qW2P4u)@0 zVQj23U2@8|Dit@HobE`?S;q)p6P(DXuy^*9`Q>6zQy**F1Z+}&jOkD~=T?2WYz`IAVAJ%;U7vHGU{icG-d=t%!+>h0bt(dSM==9Y+ z|G-6Jwla|AR10m!B51Sv`pYEWkt~CW_|EBlL${T?ur~$4vbi*2W&}fCzo|{41IpCp zIv3XAUG)o#rhOL|K*ow{nq_=&$Hy(UHUE3b)!V(EtvrV3EOkuz&Tq06zgd>&y*^g$5Xk+u?*}1XWdQ{j9_qKoU=J&OS;O7c%enpfX|Rep37NrgX+w^<^v8f z3=1^RQ^O~Nc@g=XMxq8|V8^%b2}TT`S?-X^z_N+v`c_9rd8Fd?zq=!cstL^F7x(P} zX8tqgm}ER*Ec5G_t1IjHJ{P<6!Z|CFO`X{*dFE4U!mrHBqlBiySO1l>f2RKjPzesT zXfAJQX~|njUi2wfo*H9|W`mRZ8XDOf8m)fzXup@TBiBLM|1mmJg94+DW67f4Al}$G zJ{vx{zE;E*V&d~VG1ujoWRh2UODxxJI;35x^Q=(sI=a*n&n3`dC^2{VVZ}ED76b@; zqcbtY4kqGnq>XX-MRUP&$-!i4V)JSSymit;MwM=U(~U#gK{y?{YH>P#*j0e^yKZa! z&{tw0$<^{?z20$Dx^WcVFJA+Fwps@-tq9uzKO}-tJjk2@a}*3NEMu z_*CYg>SGmZrw%Fs28vJ74Xpzm9AHn223f|ZIQD-Cmqi>I+4>4JD6G3z10OZXi{`Y1 zDDq(G%R#l_CjJ}^Q7O;wg~-q9uxhJ9$t)M@LPL_ z8?`9uamYv|n!hAUubzis**5AW;DZ8<-A@alP`TrQKbBBpD zFl4;;DY_)7H(Ip=>vikVw=FDS8@MPX*7UNNaF*<3WXtDH(I5<<+nDm zGu-qjpj_`VsA#?L2yq>dr6N5Y+DYeYHWTXme7&+SQzy1Gq_r;-qO_~$jv?5G3tpxc zErA)f9pK@;8nvkr4TpuUmplfo`kN&(1*LR1iShJY7T`+>u z)W8wze*{cQNy44`P=)Cno#sT^Z6*2;8aY#^zjYiyaRVh_N^g-{9FP_jJ2n2xr!g5`Ri-$f{LInKNj)HTCow zAX@Y;|GUqz){69pAzEuH2t|e0DTzVsRG5jmlFwkRe{n5_#<+>D*|mOqd~~Ea^yXa zEfS_z7*v%%7+syFm^6Zs&Xa`igRQLE@IkG}IA>HPBjbELbVZGJg@Qte_dG~==lYrk z{~)m;4nE6n-2Q^&ke6k-gTgxFiZ^(*e9TW@@e>FSeE8dfJ0kqx2E#2uM$?LjMK#u` z4l%d(ahx)f=Xa%uY8jfuc;Cgc6xZz{#R@WgzXpbHm%Si!hs%bFufuG{FS2q9c19N} z{4eVWk+h{HbmOSaBv*A~567b%Yi(tc3%X%D>a4?03u6}L1Ql%D+clB3cv4QZ7lMs`*FVJ%7t;XoQDHXAiSP1 zm4M33@8C{-5tt`f`;o%@lZAv8Hc8@`-Y6WwUx8gBGSAWT<1Vt0diJ+cNvSMntXy-j zP}&MALUxvM84VU%FDlmdYx7}8Ec#j4QE1kNl)h%k>6?9y8V+lzPR_`UdE{@#a9M^P zb4#7}NmBuK(#J@S8H;Ik5oVY%W9CvV?=G-($W>;SfC9K$KHP@%g(b#}*8F8N%E>jx zYQ$y#*KObgif$#60b%lMHQdUn?EvjZNpv5-0vl*MZCF(`se~^n4xs?jl!~J zcNBx8i?(kC`!bZkuqcJShHMYUI3F4EuSP?~yH7jyE^lI5W|1^VhPwr8@WrcbJz{74 zF9#*La0K!k#OJ)6tz_l#)6HAl?~hNsw+m4{n+p~6_6SGDVlmaaNb@($9gT56c(+{1 zJhs@_5`ISyI>i&=fczZ}@Xz_;>@c7WmZ}3$=mcWbD??gRd2o+yqQ9SxMd+NXU(cG{ z9gzpRSI~rYnVt7x0SI$GBz0E<+7A1_oc{O$5@qwKV~5$6B`MK3o7If*7vJEkrO$C@ zGzn%4aWi&j7N&J!9*SYY#AOk(RY1BSPdlIRh|k)ZHMh|OZ;F2Z9*%h#fSpXj!GhCr z>DD%N?(hl8NUJ8Zy?g~hc*Ln{eS&m=XVta$S`cDQ0zcamI_|~rK)_W~g(BeT*;y(1 z;_qEjr30^K63s@Bh}yMpeR9k0oltgbraTn5E-dWRRba%!e!SqlP@b&JN2!|kum1UMCzz;3O-&be_1hhs+R%*#=Vk*wDH~g z;HGtQj6I_x=R!^`uPl-=zj;3vF8^3s|OZpk_=6o|p^Nj9gv0NLOaprsW4Ft*rC0^*KKC-qa52_R zAeBSCzfyK7D`(g2x&+l*EM!NpLJPocGv8=&z=wK@yB(3XxG(JV3U(X3b%%5%`8T4o z>)QE~NmR(RIt`TAe||xgM^2PkCrj8B+<8FtN_?h9xKqzBO}~{P`J_qpatQR`s>Vu24F@n z|Hfjdz6{a3jhpyuHh6*D0$pE!FM=c8jKcu3Az)D`#Yd-OLkYen+vrBfG+m5Bt&sMl zA41zGfdD;Bf`0mCccON6^DZ9C3E!h&bJ<=V6!0TThR_JIdXcL_lkV1FJZ<3lo?`d&6IV3gC_r)tI2=-AlB{O2Z#=aHQ6x2cIY z3(7rzw|Da2irGeIlV@MD)gi=&&vCe4l5W3NbrRykYKE(XdXve;Z1lqAP27o;7?hX@ zRx=tS!%GWIcwlC?Q{WMiH^e8MB>a+y?v(WId8Rk?urApfAJ~ zv6EX1(|H7L&~)EdCA_g5RJF62GOJz6CXF@5VM&0xzr%gs^ylkiciGWokmF}Y)=4=g z^!MkvwIac}+%H9&O>0KAUK882%Rp;9cnCQ4R7ztMvu0)`B7`dz9BNbQGgLc?IqSp8 zHu>9d3B@$}v!0@&56cL?1JYKM_j|j-6x@P7UIZR!CaT#dK*Uafdv;^ZX)FE73{Eu- z5E<&KJ`{A;80=EbEfe1p^hmtQwSD{tU5uyZ-bU~dCvdfq3HXZ8A@j$QOUDz}eiodNE^WlQ7%+5(^ zZ1uC?vUcI1e9dVC(vXomMUcQT_wf%jJS?=0ZPlXwOe+4M#lnggH`>B5v`aY9OlCd7 zsh2*~W*iydS~rHUo_kU%dJx$a4)%RL(=xrm=4NZSstX09p0NZduz4b9t(lI1zN-o_ zP|k%gq<8cUi<6Fj(FAmiPNmq^i$3XoOo$Es-an{>J$C^NWSFDFqiUWl_Lgfhd1rqs z_EY4GPF>pR19Geg@Epw(E+hM_5qTTIocr+*kN0W!Lmqaa%0^N>v1l4c~Wf+ao4X zW08__Oomg2+G>17{wU0p_Zi9}b9x+Erh@&um1vxLG`2a#mdweY#N1A}^P=vs%^dPO zyao6A4PCo))(?5_b(xt^6g5+|ZNZtv&U|J)fz|ioj>hl#tO-r&AUwz(3P`*M!V#2nG7h3`)! zYfT6}ahoyM4)Sj+Oj!~FF5w`orrZvT_}`S60qzg=kT+5R5&g;Z-AE!*Yoi7`jzU3I zrA+Vd{m<7ohntjUT^~v7F3X)JvcK@r0*Ehoj57g4Pd&=L>&v8fJ$%+Vnsup^0jo+0!^o7E~usVr_%9%I^ zdYbSpf$#ud%J>qC0R_TgNc)jNI*0KG$DlhYOC4Z<_HrW9LP$A{iaQ;uGiuASMb1Ah|{Cse3|iU zGAy8x`Wgp2y=7F(Ff0FIcK;6{TXek%9q+8`OWN#m+lT>pC!NHrUT-t@!iKy9VwW)4 z@o3HWfu+d8>*ZqdiCj;SNzJ*YKrUy?!1QMt4Qu%n@o_7>f!5oqCuE)D5YcA5QjwX3jB>RB{TRz06KadoB ze8RL0zNZ^|i(AE_r)JicN3ray^X}y!4ZnJ7(Om$!`NPRndSlUH^JXfVUHn5 zb6Pp+GEq;vc$X{Zy1q45kM=L#?~AQzt3GAyw|B26$rK?Uc{0c3w|``yxHxVmpMoBi zIQs{4OQ@r!i(mLolOHP4L2x=x`49@_zW%mr*g&7+n*%NlyO90fQThh=>HXfLxiTZo zCf$#^4)-?-N&8^Oo1`}p0S%2#HA}tY3b0mH!`GF&OzC#v)vJZME<^#WOupff+$LoeXh~aq6kryaZp?-lj4VCbn`4S+*82b?<`ud>d+4j-cGImykhtzs7Y<)@@$JU&E+}E^sLqwenYkl89k>j8g_=-cOa1AcgdOZuPc z8Z0yf>*GI$zD+CEu~dq|(RUR1$CvzwECL7xA3ebFTgp{$X}ZOTs3L;qE3M8`NHuyJ zL%k9Hd}S{2V(!no?gRFFR{Yr2!_1)2Q1L)36lATy$L816uSiMbIPhj_i_=Q4iuJas zQ1DSo&71sFj{h0E?+?u8<1D*Ka9Z>hGC6`{{+$VwCQ2yzY+y`z;f}r>J-cZHCGwPh z&cXRnN++QWPFGyY(h+go7b~iqOkvF~RuJORk9B5YF~$S7i{B_lbAK5tsulagcM4wD z0O4V|X$iyXGK;OHBH*h}N6|Nz0vhC-g*aQ9%GhVl<6ErlVuq$(!n_3Yi*Y zF9ltL%I)811bNx15M~-2-*UZ;jy5j&@r`3YtJI<4StS1=m@nv$ zI=z4K>e;W>7Z|>J0K^jx-0cYQ1_wU%`LU-nM-Ix{36_tkE127A_l4~uU0_l(f@&1(&V?lL2@ay?hQx+sN4C7cLmx>BuFueZaMpl)CT zg4veR#~8e(%-0Z0M_@>fv?>Nl&gCtWWB7a%SQ@x^ckhqrS{urTGXR1u=-q;fMe`&` zd{{I||Muq9b;=I-Tm&`l=n54^uogvtm15ZtG#KBS-UY1*yBNKi&ge(_=!SbX$p~s65{C;qyaROdZ^@EYe65YY5tQXjbnm|knUgsHFLW_=b%MC&J}=42r}mXm$2 zSyYi0VrHEWFAJU?pNHI^_ASqb>g!W1YjhnI+Pf2T#tJLmCE?;$R;en8MH~QJ=Uabf zEd*J%pa=ay9^x-f4LZ8|oELepay|E^BtZIg=TMVC7Jp4=tB=S>;8M>;@)rf*&F_Ly zftK9_C*Yb_P5rF#-P&`^^G%NX=bu{qGh*>C9tn2p7z>i<=A)vzJ1q$L5`uPD^&4`2 zW?$XgPYH8=_TK-h;b2n|-%3$LT)Xw{Ie#xYcx>}wZgkAxOmbyKes+sI`TXh{LEx)f zb!*n?k$o92(xvlkJ5)Uo_rqV`GZJqhAY3^zunAV5tEBWUoEb#ysAr3gi7JRqo5mSa z>^50DkR=V?ejffa+Vgjw+3=O<6hGcFKF|kA5nut`+Hg+*7y+u3$FH+~Xvsh=soDWV zqn`qvzmQV3lM*ef(zP=X{R=Pv+}&59`=W;3ws5am2AI^QKV=Ssg}fz1x9*tcsexAw z4sB5~bd|1h>LOJOuefGx+y><_vC|{p?(cHW?pVnEl8zMTkIF$h%<5fp4__? z(}DzzNQYkT>qaQ)fhP@{HKCw^X@dmzUlPAA#tXKh1rqrs#WmT|Y5c&S=9`HsCaIB4 zjOd34qzqKw*Vs$BMNzkZf1m5cEo=AvCh5~-&u!1mN<}bBk5S2L9KRmZlp`XV^ZNiZ zWNPY%0S-G7IUNpd%@9J`mvp4)p%cd!hZ25JC@%2n^xcI9gVzwr;j~dTH&RBIvG%ZH zpYZnGXFP3h0*sT-CG=j zJpAH@L*9aVm%w{0Aa*=4S&T_W#;>osw^fu&mK}Z_s-k7(19+h-jI~t5n))=c0}_-Z z<>Y#Pe#j4lH6;Y4K*p)L;L~mv{~fDo9X8hhc^cOdHYP)4^dSS=q~TGoD7epfrCT0J4sO`lTp72IZ7_tTFKrBgUTyy2;Nhyt@-$vfcPO_Kuq zIJ0*5kAHRvCbPg)v6fP~ewsQC1snjY`5!m$8!^{DbWHSs2H^GNyu}e5y%EdzY~@HQ z{tGwUT&7pnMDLJ?ezh-6<^j6YnRDczNMHPT(`&Sa4od^|S}cE&oF`!Ku;-<4#6VrQ zY82;Y@mZW(9io)`e*lg_alYWFt#smPQqDA1D+~#ZMx7f=OI*D8C7*uwN0wI#SYuF9 z;dw4nN)lsG0|0f#8los`!_3ryuji>#uTb)1FZsIC)*0!2SS;N4&CAW&qK5YRq^e-A<7ZlG|8bqdD<5Oz0^-5pM%$Rb1v zi;shc#%vjaJA{Mc9x$k+gXj39{V7uJ42m>bTaqNCR4#G(@@0Pi$>)4==^HBLD#~$) zqL@mx#zZbV7)ZC7Qrv1bD6X%veDezB(mI|Oprk@6XJl}2E3tTPexApF@D%6Y`hW}X z|B4^~RI3!Af}t930Nvf;wSbZ*Xhaf9_XMI7~I+&;X(6b2!PJ>cRF8wJrv;g>Sk5gxh8~A#s#T;AP2p)A-I5 zj_|Nn(~4TGt`_*}t8e)9)6Xa@UE_CuxWwQ5?e92s@;H-|69ele)>^bqsMV_Em#>n~ zU#C&4-~}m^QYbaLAcQSAI6X7N$y29!?&a5b>-}Hy-p_u)^Upj%R@Bjr3Q?&{yt;~6 z&XcSbh$_{#YS7wtVzH1rhLLoq8XSBWNjIv&hj8$4z(KW{GQ2Mk91$F}21+-IeDnWY zq}m9{Iw?e)!jXMWPaQTK?7CYGP(An%5bnr?q>#A6BQ3M!#1sym5K2ocj55}w(fV3TY<{8Rm{>QCH>fF#l}b1$p$_mo zbq)#@Cmxl|FGiHsubCuVPHb{AB%B57`1p)V0&)AjMdIU=A|o7>YowVrR=;4Zewjwi zqgbe6O@-W~erOk_&vxN1)PXwz!TU)axV5d9Cn!~46V{%X^s*+2csp?LK9;k1)^*aaWp|-SL#S7Ryq(IH?@|+;Ng4&%)dp z9!srLudT7(C{We~5*y(NuWcvZ@0ZRUCysH1f!iQc*UYUS7U2$5fxXbiu?KBTz%!oA_3pk2$)b$kLhN6MYW zR}%;!(I%o^Z*b*Cp4F8VzQ25pzy0m+dF14Ave^utH&|P*wU#)FsFX|Om#(t5woDi{ z@jM^pxSOiG(Za#W$w?NE9p~H&KjO`IKjNMDf5FQyo@2_7F^v*Yr9xaNpqG|OmRAVN zWzeSG-&_~D4G#8hDc&0n4%+q7UpS~#yE^IdGg;DE*}X|)z#vD52^;_aRsQgA zzaU8riD=gqPjs?bLV@-(GcY(fq=|Es>cIha>-zx^N(7E@NQpGrO~s&ejkIWKtntz2 z(KZ;YJjq5mAxi29|r6GumDx;h=wlu|lE3DsvF zckg1Z4Fmxej)myt63yD@iH&C>qB9Y(^6_wR#=t^+JDS?XAs`@a(+Yu?kjxotUdJR) zQ7c>4S1Sam+ASOLeQg)+GEAgXyKujgg%5)|aK9jtyYEf0l%-sKQE2nTTsEgXM zjZz(WfLeIl+HJAab(KPr$IXQt`OyWEm;MRaN6w-A^fpE%`~8@A4gcO3>ut@|C za+`WEgCIayABB$=dh=7;0pad&u&t0#ILgI$Qlz~}((Wuu1Xv7-4v7;@*lO|3x8IY` zuc8x;loHo#@asEdyGvmiZ^&-u3mFDs)c6piBavoEwBdkS80Z#j!=zgm=xEmbYtt<8g4)%P$ z_dgs|YP)6F*}S7-lQfJ092A09E2i+9Z;2AaWY$BA77ePjWQAH>A+qu9aqvJ&r`^u! zp?dHkAZ&wYDIC%wO@=lY6poe#BaO8lTA!j7y+*nEB;}eWHZ`0eLJ8YZh)6GhuvV;jz%j_`bfDsckeXx9dNr11OX;z3{kjBt8pbkPsK!! zBqXkbBixZg!Mh7Qw-;Aw(jrCRAgr&^$1vs%n?#RMDms*l8~CXvi`jcG**MyTAF2b{ z7v|m3d;6>oytV%w)PeGDplJn_T8fSGIcdz(Q>nD0q6`iW2M-eIGZ5@S9cZysk`e{I z#KNM3{NX<&_56nfv&U~I3yS{2zys9{>;?wj!SobPkinZhLG$>_sD(#4liHwITw}de zpl&u$D14c|vo1=fbprGOm8;je`1u!n_4PNDYju>ASZi_JwsLP!fX-S=k|Z?hHI|pJ zvYNj^rLuwR`R#U(5gc4Na)c+&KEq3|{e*Xa_DkM)?L5;#M6*&Ptkh`cSF!mO8Y=~C z*lI&rsSu9hzNt3|J%y2sCma+9Z_kL~pmf?hK6WNUFtJ@}C&mH}T5XA%F@^u|HA29D z_0Ru|kALwIS*J!4H;4!+M%y)>Q_=I(jrZc zX?y|@Mk2M+)_B6$leEGgQLa2qt=dAW5~(0T_y(&4R(GcA>s3YA2_*Df!_oNysnkW? zYJQW%Q8qTs#hR@;U~utoi;wmVjO!H$0!+OMqF1=?0EAP ziU6N9X%P^(7P1C?25a81NpzM{(dSw|q7^mBr8Vv*>={S9@LuXb;2t12>M)UEssr!- z%&^sg_v{NnxtgL>c}g1n{B$bqIAN}5AUH5}U=J`bu`wIT8tZzQA3U`{_~w7du>I(^ z>x{R(INqjuFoU%|5*IDZU4W21;GjeZg;EeEB{Dgm7k~XSMhc>Go#o|KzWDNMKK;X| z+_W%p>TzV>|nm=6cpYI1OZYRi8oA%ZgpV4?ZU?F zY!~h|Ok_WGV5fHBPSk zKl~9VE}X?Vu}E><0%2H~{tu4l3DR=^j6uA(d5o9AhUqxLKog zfN(I0H08@{-2BZq_@2YR_{;y6#l_>y&CPLiagno6o#SPZjVu5FAOJ~3K~(j3KIH9p zf6g1Pzs`|KN!VDWq3cwVGA*jKbl4X62sIcmcH41g>p^L6lM2 z7#D3Gp&7o#`o_}~O9_dopqzx1V{m1g88{9jfrQYu5zkE4SeX67M6FMfR)a*h9<7_2 zV}uqiUUydfJwV~kK(JmFc!6bhp+>WD(I(;b#3qllXw4b4<86kG49`L=I=}HKQl!X| z#m9FnWQ@?Kj4|&J$1kx~n&!Kk3G3yMAc#o&wre1`n>ug{2#&j5I2e#!cqet>PS--G z+kfZn2LBF$IuM{zPf;pADwE`VHV8aFn!pimmv!*E?CS$m2S%pFYP?KC7CCzU9qdd0 zm|*d7q}*X4av19d?r{(9{4O9BPIj7b_9-&y0JriTg=&#TQpS}5zD#XPQyxDU*i(}5 z*jR-7pbESd7;?x#;3y&BuHfh)_`APg;h5acVFAKHst0?r7K=SrwA%rp+YTtPX#{Bm zE((ui6A+5cizWnEV`%CE2E)X+XjARV!4URt?9Adq} z1HwV6+Ccf#lNtPs>hKuio-yR0aB#P_Ct*V6;xae>{tDT&&p-Rm|B{)RSzOn>_1yTr z&;0xXk3I1uue|;)Z@>F<&OP-5oTNalS)v?PC?^}#lg8$~k*Gn~iFaBb9vb!FLqK@Y zO>WlR4P=@uIXoL+FcOtWW37ueCul|IDVCmLqoUEejN`OZiMQrIM{N7kXGpjoD0Cge z%v2HVHztlQn@bl|)Pcsd)q$CP;N4zOQQaLjqK2;y1gJMWN|i@s6u+Je0zZf*ain{Iu05h45h;jF zNFmNcrooXP{si^h$G9`ck#`MlqqGWlQ#VjZb?XJGYZ!RzvPfhqhnzc&o;=2}=xdhN z3sm(6fz05`^v+}dIKaTJ```dA!o8>h4{8q{AqYIMEqGKAuw&)lA!J@73>`kSpm5aZ zHP(Qz7xm!5;NUGlD8NDB;-ajJvh4(8aBcxYZ6X@+Dv3#$I=jfsWAk`vpL{+clmTLH z7PYvDJhA{m09q3@o2(Vq`SzP{`1I3@eD(F$l*=`&F=%TLQsNG{=AX3|oy64YRSNm* zZu((94QlXV!#pIU> zR|}YC6Kgj?%>x!jGM;d7L}4U7z(Gd|tbkL`X7K{q!!h~<2X|?E+=!`ta+NEeEisex z`SZW{FPWL0MeP9ag%AWm!2H4yo;vpuZ@l|4ufFy+)9IMf#!bp$nW`>RPikmukV2v4 z5V8vng?ey6{qg|=gtvZR6Apn)Ga)AlL>eo!uu>~yjVp{jK`Z%LDBQgcW?;sNs$p*(vHIMh2V&_<^`*h*J-rQv9y-q z>WZOUYmrIEIQtB|{SFh^>;K(PVIs{)aryc@SFWDr`pr|^$j`I1GSBLIj%EnibhP8W z-cucz9*sH>pjrzkRZgimdHWU+6rBUXaZv|0O@n-V12-EodHy537k`C6b@ZMwY}8ia zPU{9LsYnMYGC>L{CB|5+HC@5Lt-lvSAp8Jt_Bf5)Bb;b`#mf2ywWNp=4xUV-gfn6o zD24+Ad$kC6yYs%(3GC!M35${iCuugQ8mX777+GV zJ=mX6k~^@C04drELf5u|pt2dP6_i>x(I#Tz)Ex8AoxlxTYGuvFT7(c1>3cX6In?42 z)UjhY3-cJ)MQB5_-k`9$##di`%_o2OoG-t)#PUjkD2mZZg4t9LDm57Opx|~ONwZmJ zHGiG_(lv_3Rb0=E12}BC1tlR{HzSZU=t?*Tf<+GG4O`wc& z5|nH|Fnc8i4;m5%Uc&tB8mZtblf<7VQBy>^d8%RSz1fJn0)hZR+A?=^gL?H3Hi@st z#HU)cW?~XY;V`%qV$qiy-v)yLSu$kF$N=AyLQHDR8KKSFCW&9B);Pt@fpNmH8XVjZ-QfvH> zjnY~2t0|(mL@wKEKXi<*IuM{zOHrvFmtp))#`FCknZoS?2#!OLNQ)MQWEt&OnST9O z1kZkemz&%DJ)}?1WVgHNrf#4Vl1wViRBnoFDvjrQSRgS5tnC;EZvT5J74F0=_1q&o zCa$wmSfvydH-Bl$wWZo4gMkbO26o%PVW|T5trKYXetQ`u2ppywupcPD}B5wb)XZ7Hn=PHC~tNL|9shKAppgtE+_N3Rdejkdg9`gpqWZRNP}2$spk1!IO$d3kRiYCk>x|HivRWACJ)= zI2hL>Du4YASFWt{#K{?c_2>TuQ&Ur2J&TUxaP;URFP*=@+wXqJlaHSuu3o1aR;k1l zT2!e=%}s#g+yaC{day@tEq(|H_n(*h00un~kP#Dj)<-BLN^jN})Td~MZ?j%{f@-ya zkY#)?!cm(qllvqFcMJ)YK$z|>SvDOqKeG&6GGVx^ljuZ4*K#2(DG{Pu8}YqBuwLE! z+D^}fG;3GT$t8`JG0}-8O&6>hObT&-d!a<);%?cARhG1?aMD6@)END;HTreJ_#CC` z4A)j&R*MoLo8;2E4WM?h3lAbpq+7f2eqkcpf#AOCzypSfY=Jy&1YciXBCH#qm=~q7{{lZ7Mx!E1T)^6%RVJ$jt zV&V{?+}on2eJ1Sgtis*Z4Ybx0CkaMtJl7+YN|6pyI8u>lgRusCcSjKWa9Yt09PuXS zsn0#b$>cJtt9i;%5fG%@iOzqK5hI3y-6jbS%p%+;RbVgn;IRRLLxh0+c+u)N;5rl} z?hr!5kvC`r?HY!~c&x3(x4&mZLM>V+HYHRh;MAK>;O7FAf*aqrNRplF-b$sAL4cZ^ zKrPH8jx8dO9Ki-@93hBXAseL%*RS2+^NU~bcYps0m%jXl<<$al91|xA))-vZ*;MuP z`KH@;T5*yj)azAN3QH_+)*OtZ7E(E2?MM@gl~Uw#IgTAW!PC$Gkhk9dC2zm|4yTV# zL$g4mQpFTEi1RDx!YW~<3dXd%t7_LzI}BkYqe&_jy+5yq5Dq#*ARWnL&*hM6Fra5I zIJn<3F)TMJ{naI|=PNw_EiZTEhq-m-8OGNJ{dA(ZC3gCu0%{* zp&!ARx2;azAdH`3tuoE^RhL2u(y0c%+a3xYM7wZC-1~QXsRQ$cEZ6cMI+6Jwb0U{r z6pPN3m}QblCYT^2vSdY0WklAs)@CBzJZI{)30mQ|%uJT=co6PZ2ksXpvY$He)-~us z9cZnfQctl_J}aX5^@&t!(=zPz(5*)S16$;in>1yK`SU-;d+tNr?93)$vAY~*n`PHp zqS6ZWul^Rk`YYts-%(q;iB&!_okMI3A`!+w5|Y%)#HCf@ja8_Yq1nJ`G!cyk)N6=( z4Oy!}qmFDekgX;}AtH&9MuX8>KsYwm;vI6^j3(4ID$y#+Rh<6G zlX$rRr4;MS5w%*fPcsF=X~RL0%i_+>!m(qB;m*~DmrwHD8F2LlH;0ijM3>a_~%Ybz|>yuw-`Poq{wIc{71;fw|jZlx4Y zPEK;_^kcm6%A36P?k{-r%{MtVpTX2th^lpxwKeo|9$hF9S8HG`2HS?STlj4Z!$`Kn z!Qs^#gwchO3?B{(DN&x}@#k`b8!rVNBo^-g2aTm!Zj%2uU$9Ya@!Birc=yA9Kqiwp z@G~`G7}{&(JJgrqrrX)0K9eL1U08)KaQ6H?4z?PD18W2=)_X+60{wQg3vVe3?*@W#A|SZ;^TP@gQC)_Ke0Tj3YK`|6m^-&1jyh?P zxuajmO?vGMpFjjytV(S3hz?r?T=!chvf=HAff-aicC>t zs`ed?Vu2`_$MsUkFvM2N*wrOk-(IBr`Cn7H_#3L<{2k33-{OWE&pNOP1x2F)TmP)r zp;l}Evr<8n%TO*OYgI(6)dqxjrTgBiOtd6M(~KjcC~Vt$0-scnMhby3rd?lfbCI_% z4BQ3{dO5r+KNg#7L(xJ1Emr=pMgABh1g@N5B2zQ$v+)H4{us|S# zQv>b^0f)zXh70=+`!*tYII_#xfz^1FfKc>r-~F=|_X-CMiHRw-ZXg}Osdt_vHJL)V zk}x!^=fkb)86CZ(<2Z=GN2JrJnQ1tB6pkN9&CVcQ7pXO2Go(~1bNTXBKKtwAj90r)DFiS{5ZKA95j(;?W;Vs?+RS|o6EE!&3o^>!K-iolyo}X zw`V4mO0jtCI4}L^E#7?ZV;(smVMx*&E#nN#a%?i+H*BDf`^ZJ0jLc(3tglL$| zHkq5gisYgRTX~a2i*;R@3~3385(;Nm8*%SIaBG{KPMA!Vs7Id~ofHxqA8FE@jEI~q z*wed>c({xHwrWt}6ObiK)@DVHoa^Cwj!<(Jb6Obtmet7{#PQ2C8mCxa$#DIqN1fi$}d4BVy;OhQ_h|A3SKgxYieoaU3iq;leID)T?Y?n~vqZ(aU2AG*fPtWx9bahWxRd!~Tl&Msvl*&b-#3drgVC>6X&N==N zq(pI3kc=RyEL|cXh>W{$@BQ89d7mhx9R_G^a9xj7B8lh4&{`8kn$1r~y}axbLLj|3 zo#A_#WQ}U!I<=sR5)N^dy)|g$PJ@B_4G-B@A+n!K`<8-Rh}(>8cb?x#0)clb1nhgE zcei=qiQ8VsvMY|U7vYIg5B3`lc3*U@b*_<&8M2Sfkvlbl@*Jdq`73R-wb*rWORuXc zHk5-g51C3LM}|=oQkx~v6 z4q9u7qL6m0NujvN^1>Ag%hxHdtss@^DvYGsF%fmpa4;5&F)}*JJ@-AxGcUf$J0JXv zmtT63tlPn_m+-4~!s05?@-o44fv8pk({-jP<-iVb@Z|OzybA{pI!FP-({V;;11hKGlF{ORX;_3fYV@O?9s zmoHHd8dUrW&7gIo$DrIAK5{I*ZBK}L@b?-J_D4l{BYZ?A$dEBU5%8sXV`Z;NVs1$Va&5+M`{d@d};m8MH2>E>u{!FYfeO@lyH!! zZ8qXtf#B`>2ktgJnbnLWOEiKnY!F_Etag3;(=E|*ELJ)=r~@StA7hhX1nzo5ajI)7 zmRT}hf_Ti6&WJ>uverB=w0_U}{tMI^k8^EloU4l|7MGJ$>Y8jiz;*434-@GX2*&rR z4g^?P%ciRQ1JA0*;x-{~2ZxnVSd47Yh-njDArb$YbTYWrF5H7U(3ruh0|CmlH0A1Z zQtM|&5^2Zn0SFFE9oWltMi^?kLP;!h=AlvQPya&_llO13_uk$r+}#8LL8XX}jgWZk zE#jF`9BuJh0bWNV4Pd&{irO{G^PgaK$oPXVlbd~<)W|7fnK6_X-vb8jy;2*H5FKHC zAF*yZ##&Gkq}(=bV+}zN5QaXE;}DO>iN_L1A<)`jjNae9TPajBOECU06K0Ka{wmd= zL|mnasWfuqEzF$;1NTGx1`-@{*wBz(`vl&BAn+(4U|*rkF#%2O)^U5TynfOtKz+5(GZY zMvcPqb(WXrDdewHtCWz+!5EEF3Mr2c5N@cTMn}hZ;Gsu&{?+$*>%E`w{Buu{aoTih zYxwmBt>q$md5O+ao~YjKImmkJ6eU%69}cMB;9WR)d~i@o$;51e;c0h$x}t}94*nYH z#2kW50`*Oig+h%eGJJEr$glqT&shBSGu&8)WI9VCk?8CBtdwG8bd)oXKg+9c|A_lf zP0%cTL)EWS_A4~QHWGy++}(So{XVG&5467D6+n1^8SbGX+^`ZSMUs@rp{yf>iiE~U zYfTbu9;MNGnNlT7r&GakTg1HRR&mNcKwmGQaIbM40ZC6YGoB|NJ8%5Xw^0~)k?Bk{ zZ9{>TQm9*O#J2*${i*{2UQayEW5eK0eE$`y^=Fu0ypJo_b6j5@Vkw_x zxtJsfL((aYk_QMA*~Kn=*f5b^?ZW#B69EW9$GIgM{1qhlw=2LEFDOX;S+B`X$$SOC;+&FZ&;Mm_&EnW+cKO+ADYOCsb( z(SMrPlq4pvGKVpFQHCDH~z2r$MFi^Yh?6S$6pS+^Y79=ud` zy)xZU3i?B*nG3!lpD)nXO)}01u81MFsUPk{76HQaP{ z6o-a`(Cv99V=-hpjT{-lnViI)ogBth6XxDiHHrPK^zbFE#k^>=*p{mw!&- z%6Wz-PLW8ZiN#`lJ(nHFVRUqihaY=}m*4skr>91!6u+ccFH;FB_>qqiE{<>!dxa?+ zN4>Ba4xV^>@pl~%?hg`nd*MnH4k?i$C33jZ5n6=8qJ_0KLliwqz3~ETl^9X9g6H|T zj@k8@w%?F&>-a)IF4Jam>FHW`PTuf1GjFU-PC~qYqczu z>YLJ-hsIMwO8KchfuKD`7#I;!iV8SsANRRGCiCzsC@;AOTwzCbps*Gjg{XE1wN`;@ z6%mFv7GWzg?pk*=neqEj@pNxR!9EKIy9tz7ENG2rx1inZ&d=@k-`SY16&7tYVGt06 z0ZK`di4=)g0<&&2+6xNWE!C)y5+|Odnwa5q`w~klCEB_{!p-4{_@;H1hu+_J9t`aD z`}<80?!P_wM1jDggn%c32;FrM?;j!#d`5Q&BpmcS2c;g|cQ3g8!9im+t*}ZnC?Orm zy>C5CEE5L_fo~}+?bb)Ie{c}bMJD1nxh(F~1Y%~U`^gQVl)^?4wOW&i;2XFM4ZHp>L{I(}gVn_ot+mI&MJZvA6z*ET8D z2@fM#uh|BaRD7qyK_$A+_0#ty$&ST#sA-ND4o2;e#)sc>?W-aQmB4Gx5;Iwh7OXXz zT=?=^KKz?Mqq=g9+~^FMOcvMe-}$rAmvd}s^| zIZUB9MeMNw!V_;V{;mPSgB30}z@TtQkR~N^NGpX^k+f*X8aqrFK24?m9BUPeF>AO^ zfRq*~dr+M0(>C18_)1yEhU-j@UbI2*nQ6CVsDrttX*fni(iPq&Ab3!_aAp_V>)c4d zSbCmv>q8TU3n5XmLub52TY**Twl?BB<0+sUNYYggCP|VZO~z)NA%?t^NO}oknWT!1 zxXPK4);?^FeNjZ_J)-bkg76J||25j3r&y~#%wm3)h5Qitl@ao#49n#NT89j!yWN-v zVHfUI9oUOqcx$Liel{(2nu*cX4|>mLYQes2bJFWD>t*W^Co=Ur&fS(71wH zWr$McJtdf%N{%?9liXV&cuYXhSVP^^sL2)XfAVp7;t%k$V|#+Poz#IM3ZYR$t*k(~ z3}LvvK-w}%B^B}P1ky{OHbJ?*K&(B-5fEuatBD9ha9oU|x=mR&!OAcS>4X8Ss|C~X z6iA5<$BOUI-LUdYEQvj^VYl6v}HDG%0rkN4Ol$b}LQ}4BT(Oz(ZSvdjWx) zRe}4r2cJj~*l!4Us6uPN%CfsH15f)EFv$P_AOJ~3K~yM2y;C6J9v0(4&+gc)#kb$6 zR#+nIQ|&AxC7gQaF=E*mQYnOh`ES}7V|$*@Vc_6;^E+hBL#2{9!$UAJiJYB<(NV1H zg0cARHmfVET>17}J~{UpXV0GF>ih!DRvT?J))-uOkZ^DV5L&d3Xt!HbDr+n)UM0UY z&&tX&9lwJV0&6YK5dgvs@G(9y$-|F4!E5jSl(*miDKEb893$}%-KyYMs`!N>cDX>b zS|ap)um)@w%ywUha^k{BZcb(Zmf|}c4mwgG9LelM2~tDuZ9rcyaIn9C(64u>{D%uH z=BuQ=3~4z=(n*t1IpQKi7+4CG8fQPfz~BG!-%=|rk;sfNJUoi)x_v!Iq?C+~jq&2^ z@AKqS-yh9ij(8B!tx z7GYH+jWx;|Ge!`+Lb>`hm1=~sW#Ta(B`ns88z0f*!`)#Z;l}umW0)E*l1iSl?bbCN z1Ve#okG5o^a}x+2#xA_ukcwFz9B&eHKd0RKoiR}}wBb}!v@!vKQb@6T=*XS$lpwYr z9P2?U9v;c{pM*)PjLEt=JLKg=&P$R=#6^5Ksk|{)syU2(RA~E((E9r}iryv&-=^ii zNwf13h01e$wfHz+7w%<#VVr9V6I@@IWMOHH#pPl0#Vo6(BvJ*Wl6p@d*iUuf?SL7; zYB@u-`C3Z2Ph=R1^$G+HnvQBkRb4NVN&XcxW2-lzqq@C1a0BjboB-RFu@CA%s|2g7 zV^nHCas=b!@o^VF-i2Pfv4dlPfdC!bW{qXWr(y(8|92#39z-a2SIDw8NW>b0Xf=_g z6~t-@eE&uWhuC!;H zfx+M=I4EKsBAGxA=a5sAI5X3T$q8&Si3bF}Pqk9#+O-AFfA%>a|Mnc0FLzUmwbp3e zEq6Dp#e)WfQ54Z`H7TtXSzfqGF@K%P+6sZ+f%U$FN;v}sgqu}S51o0OSKs~-Z@u?p zUU=a-M!b-qv5H@=5)=y9{Ot+hhTyG@*`xZuW2f{(2y4LU0kEBVYogT;E z3l83HynUPz*3v1rnE$i$RO&uCZ-ki1qD1%j@??yZlfffJ$JgY`Retl)Sw8&bzawl_ z7#f>pXlS_ac6`@$IeqW_y!pW&ao?$F8mnJXYF1e5l<}hgB^(^#Y_SpV6Au2qs0U9X zAUw`}ahuvl3W+N`(lSRvrU5IBjFh%UVaz0c@Di2k!&GY>T&INVg{XD4;AS|uUr=~Z zHDNLlkWF7la9#(Uk{`B54hICc+J$!;Mv{gzldIG_zoiviG{&Stf{B)BD^27`6biWs z4BjbE4n6dMK(1Si9Xwp(>q^2DDN-imWK7N-vO``*q`f4`cwEFs;>sKKq?{E-Jb`(%&ZvKOhJ`zz^Q1 zEUx4zmgB@dpSWlC4Fq>m2j0#u3{a}1sWo4Sp`Oe#+%pi=XqvJX)=l#o+0-wY9xJUM z!M&*ice4xkQymx+P*@$OQv0#zsN9$ucSY#!-N^PBfS@K~O|Q@pYm7YgF5a0pa1z-) zAPcuxg+<^aDrHo$0Ie3gc#JSQBu+kM#o@w24-eZ*$hGoL=e$# zwOL-ybNTXDocrWFmo9xtrCMLN6&s|K>!Bb6?)kT#U>t@4jYf^qYO$MOTwJ7DUPVZW zHX0Cv3rXQ-TJiY!1P?#*1TVb)K5u{j4|w*e$4HnOom!bzsZ3BPV)M&{r4qW`K^U_R zoVqs3-@7o9I|L3&xBE>0;L}+gZ{wIY?9U=R7&vG`Lvy*xmH+q!#u{?Y1dd7E^8B*_ z1`|%27%BWPV!2%9??3vO&p!Nfym*4#$Rw#$s;}qlMla4spL~`#zW+0FaZO?AD~k0s zs$m6VLE)gJvx7si#~Z|nP!HY(gvVchiY-?wffNEyc%(&+gh+$X!pKNkjAOMqMcaRo zQsrKn%^IGn6H}U)W6(R^YYqkpdjW+)Kq4M7GE^p&xQsSm9}N)P7)}j`1bUHH@ToE8 zN@$~$FZ_`XEyrNx1{f4b?uUPffRv`EF0 zBr{2o7*4zKp@id(deWJ3guF)>alf=YDYSh7t=|!mevfb+9=84O)9k!St@S+?SI#h> zA7ODN!%D>^7Hi)GgnbMX*%)fg7}dr@BC;>#81g*4p0-aYLMpZ#wh1mWlKmSdhpXMc z+{P}vRUNn^)QfE&_aN#(N5FD%ifZG>G3jK7<+vlYvm+2ZE_I+4mZoV?5qTbZU=;oQ zKO#0fvuBgtTdcyJCaPFKl*?GHx2=-^jE?9uR%wC5I5o=|9NY zHqLEe;KuK*MYKEJ@DneFaGY(B&samK!>&DP+dk~Aw}fPYbut#_~7?yXy3hIu9f8Xhd;S&f7`wR*1L_l}~;GnUZ zx?iLf))21C>DL~>%XItNn#i)a(81dNtZ2XBpl}^TJci1o5#wVxQ`4x~8N~1~(s3Y) z=(O4tizUAL>T5pzH_V``xA} zLV|LTcj4fPf`dW{93{B_nJiL@9qNVSgM(2!q2U;mQJXa5V*i7_#Cig-NU*Yj0MNiLV;nHS#R+2>xtU;BooVxFpB zrLEiDCvc&*zo_5uF>q|^L5|m6d{P17aqg2FM}0SuI40txWsbN=V3n3gt+X*QBK-i( z&P$XkqqO}phz@Z#BBm@#aO2Y}Bs>f#6arGofZ?Hh7YO#df8cII!xxOCG*j6%g6J}V zKBrBz77*szv~#{_D-d$SMl4QrK`jPy7;RXNT^w9oVt6D-k|s??WJr?|Nu5z?lXWv@ z$jzA{cbJjbFvH%E81gbA?WScao*2ihMx*@-ODm6X ztuW5=YKr1&f_hyLPlULR-4h7*q7F1hU=xPgT1NW%`yO5*E)qSZOn2x|GOJIRz#})3*$Lukx11n|);%(&j{)EIm zPomuT93__4{hH-?` z!@3?d3_MJK!<`^quP|^w7U9FG0>9HBaFFEiMDndefVm@Qg5MFCI1os9(g5Li4-Q&k z@O6`hzk)(A`{pAga$SYIRIqTRO%&O_uV_Eu;KsdF#5_bgg)=&gnwmn*&B4StPTWHn zL%Y?XR9fSkufOH9Pe0?r=NDO6DiDStVH9DFxuG09DnNK6!MI+bu(Uvad7hQx5}2;l z*;?DJDF&cs6he?rrNKx^{|~wM)Fh?F3zV8w>R}aM zM>t|V&)~K|w=0T!boFuipV@pt@$$LS{gqn zqg3ZcBC$mv>57lkmd_wSp`&aU2o9ou;Eq?3b%5h4n92nVCswEj7m3WL+G-ivaHb)e zZb0Zbo6?9+CKwb)J}AAdsbSoB2IVCN3M9_Run;}h45nFdb^Hl1t{T=N~TD~Qz#)Y+F)*T zw-rJn;z^8=1WTV&>r_dq95FY8MD@0x#eOaihk=2Ixx^inMVP~>0>3LD@KD9podN)R z0A+U)V>|G2o^WV*=tVlj$VZX5Jg7}Qh`xin!9mgO0bK4ZB7|o6snZP297IZl=XU!JW->57j+{M(n3_Z+k|-eX14^rF%wN6AXPQ=6Zs$-(htnPkwQpVqt-LwcJ%a0*=~edzBssr4-q0mbrWG<>}{N z<*g6?h_~K)mq#9$MFp$)jXJtgCR)y8i$&UNWlR_$0Vy`@*MozD{mI}NEF2X5BtH8% z&7~BK&&C*?iSM(>7(5*GD;-w<-FcP@HPUXHgxCnryFILSgiAuDNVz$LQLNQleEQ|L z{OYg&g0-c~j85Il=-60a)wDtg;_)~SoOzs=-uQswlqJ9XH7m^u&9Dx(Yj2i99`Hhb z0_&;cwih32{l8l(!md)*At6$vL>AT)iM7=NYjTA8Novh!Dc2>DF5|iWEnsl#XD3jo zcfA4i3;{krBCdK$s*Ei^aRU_-4P}Wqp8^vBGD#%;%6l09!EN{J)lch z^=H>g$U*@T={=XknuuEQE85ip;}5+;VrUB4t3CLjFl*a5Jz9l#nTCioqSJvy92|ES z!D08h8FxKKhek;zlIw?`!P-5rpb$vM!=y%;ZCzq1UnDXCId=l3c7x(#{}AigVBjJ9 z1#$owIA~R1KS5wW`vV>&1Uw0p>^tbh9T-GBi5se~iPr01e^E(k&38&(QIA8f-Sa*RFB?vkRO(`zc?2bA?*1j@AZiES~2cAsp<6lb9R*2dfm8uTfZD zpjuf)G@S!;BwW|EW256tY&)6Qwl%SB+qP}nnb^)GlVrk~uw&c&`hLE8tNI6YSM5G$ zpS9P%7SEQCOY>r=j`f%DsJp&P7eVD!S0eRFdgxUz=nRDqkkC3oPsPG9yQ0cnOxLjGK3kQm=7krnT ziwu)7bc@g_Ij|w4U8!%QmSUt)eDoV7!ZE>Qa?nztNh!0_v6$@s(bCL)(@DS7$-3|j zP0}$(=R+_>IIIqK7dmKS_RE6m`Ri>`Qm_yQL0C3gLQkaukadgs4u5!k8va zc6yaa>80uFRv5Jvv zbWa}pQ6aLMj*Tlbv@#$#H+Q4;`1=Z(9Hllb*~~?4?|h@0;R`nNcX5l|en!oGe|^#? zEmdOB9^7JMyW}&WI2rhWqGdD=2CWY$1GOhc2Rt-&^QB)E!)!-*u ztw~+{ha&GBg>Hxs8RqeIQ%ol;Q5|bd3a|#*#6RP@R7^KZZYlYu{<2B<3X7ry!N9*$ zSDqp-AAj8{1Z%?6}FEfEAHFdgg3+558EaPbeadK*dJMkyHlieXLK;+EwzKnT;ChOYtSl5t&o89YQ`@6_2Y#bb; z=hZw!frk<&|`Hic^*KABj;P654LVbxnUJ`!V zjNN>o5$eH%3@G@eDCjS2s+r`bV4f@JCh-Xi1$oCV!|MF|N7D@r$dHVe@^7E&rR>@WFB}g|xapU7yomvGSzt{7Xly zYq#MDrHXK%84UnC3O;Q%)j%x(2z%{ZIEg>ZfLSbFFw;1P%gLHaPs%@mi`!J!d$4$9 zcpO2mOh5gx(?}|bzIVexqI3AT$HAnFm_YGZA}$Nuxrn%t7k>nzi@dR^JoA~Bm#5s#=tJMw_K-e+pnHi0qqFEWgg$UChuoYh3`=~27z%>1-+4KPx9B(d`d2#p4&-=I_rfs_DQEh zrA^qxpv~O%3v%rzEoBHQ1FxtV?HYWY9cj%B-X-0I*AIOHAhanT0ss9*m@qd2TA~PD zG#*jNl+6AN5?SU5U33)Lzgf=kT?9k@&z#mH!Gl&rLuHye^ay>HsCJrF2_i~@QFIBk zdW+CMvIXydG(ef})+@F&2SH#H&TlBN0&_j!umewj@O$q@gbqQRf|=|$i=+!Oky?>T zJ<@3$(n2Zh*yjVbip`-2G_s{lY&zLsbZP*~R$Ie1t&_43Iw|xMe+pHy^Q+%)LMW6i zsIY)~g##h~p>*a95LQD{ey^E`rUg9fkw=;|dJ4)qT>`Cg<+_VwU{Gq{Qx4(IkcG`V zr@8s2|6f#j8WJk%-DK+A%~I=Jsjb!z9etB}4XSz41h=R2*fq~xcN_qb3m?G(%(>bW z$dw>~Mo!u4MInr5ZBEh7>P+TO9KTXqry+SA`kkOMeDB!(vqjL75`gjn5grqr{ZVKf zc|zPt&5?Je^TZ|wo?VRfuU-!KBf7Z)>z`4T1pRsiBa#j;H% zQJEM_=Wni}_!VLoLYB7f;lzF;qgMV>RzJZv@;uE}e^m?D!cD3nDNICN?HFG>2G#C;0(SUXMXn1g_fy^b$JQ)7q z_y^+ga;2k8q*I$r>MohTt&#d`!b)_R#A@~^n3aGMTGX~Mn@ZnkicI3Po2~By_NwF_QZrbNBi6)ykyY!A}Dh5 z$L<1he64>yP=g@eFJrc8 zauQ)_xVGK)!333!cWJ6AvgIHb;z2f!!Cw4R;P^U7>7XX=Dy%!hXg_m1MSeGd*Pk4@ zMRzF|)@~>X1(0n*D>S&`pb+g!GBAn{&R4}Ih0Jq3E6DBG4$qsABf9jt@m#Zdvv99f zw`qT_TK+JoPjzoC+dqE%4DNu^JBLN0+ocnko(f9FtaTUsym#$?K4!kw%UqaJD_cD2 zFNkc`j_X={y8V+YWX6wUY5WQC@(-`RDIA@s;kx?{KkeW9+Gz(Ls43yV0+L#~vwKk} z>exXghKZJzw^PZK%_%$bOLd(BBq&XqQ4-j4f4>nP2Cyi5v4Ex@J=cueQzDg{9|btA zaZ2skf_=ic?*aiwuC@x80E>TZs`ff`qKH$og&-axrWDJ+OD^MZ3aVYN(J-p}wrC=j z;K1-KE+s0gON1lNTFBXqt-!x-gZJXei|pGj+Z*1OxqK5F_YxMB*tq!BsVa{v){m_6 zX3Xw8oJpMrUJrS>U(6XU42`{XAv+K9{J?|rtPN}$mpBh#!o|EY{mhJl@o&GNT%t|1 zL2c6{Tl!p3bO`&JW|3U9`epJE2qrlE5gg3bCKs^*one@Q^XW>!1Y?s-4uC)CfXqLW6>b_P=O}mf#X+%^TPSugbokg z1lC(bIu7XUhieg2<||x2=bN!9(t*6=18)$m^@Tgmki+Cn*r0I%0_hOm^aV7O;7T;> z)39}~TZe_S{?u+eCorQ8c;R$irFj22GK4HlBY>0q|LuFJRe#kctKm1)Az(#z-qh*7 zH_RCx#WFM9PQA=^di-a2k|KdCfur3=w!Kk7^5}aq!i)fgTEzUftk|HUGv#@PR^L4C zvD!F?Py^c4KR+i>;=hAn?!STDdIQdRJ#BXI2xN~hYP4M~HhhQEl*>Bc_ppW+GNh`K zKHzJ<6R$Fsq>a1Jd}bIq{#VPLhM+B-AR|osudR72VTWhDfTPvpV^>pmauVq_D{5X2 z4H`1q)%wOz*wAf#_nqH!Uz-64M65Y2q@ox2W$$6t&C?CWWKI}x4&e^EBO*T)#q2-d zNJsulQs8|93Cu_Yh#-ne+NZY8-L<&ilFae>e@(JFtPPn>x4hJf6On)7+D580bMu`- zliqMc-3B&{gP7xo^8D4_8c~*pSEaWE_%N;=|5kX2e>EqRC~sSRWXCmHx@2q|S3+%y z^in=F(EKVSfO%-*irOoa;40?}&*zQx+ zv_xLVXa+tXZ@mvg#5bXZ?{Qq)Ug>J4&L$NJD3ETYBIt>)QM991bQi6iJba^AX zTR<#pA#Uw2!GID4zD0n-$zJV)LX0TNq~iM)UU zmiTpYvVfH4KhzA2jbveRr0=lwqul9C{B7soJp4hOyzVB7s0oOXGk4BIgzR1$x<2wz^6f#E+NQgf5E zxqbWk84p5_1K{AEv3c2<03=5&vbW}W-^&5Rp!G&)`wKPOXduO=a;+>dvA`f1e<80MDt|L5eFn(Q8%A0Yy z@5Ed4t!Ew-f%4)^XypP9yn%1qN?p-jEArAx8@;4NmArt#4sc}4^sZ`-g=}J=`9w!x z^`aybQ*eS$PVn&&FmR)KSU}@1$uJl_^r(r`Jekf$_ZD^)m)P(aVp}MR*cQ^I!Pr7q1h)|^7#uW`k+ltFct9OClC3uB} zm2nX%kULs41r88J$XC?ILx4gBail8GJCo=?&DfSwWA=1Hz?zmfm! zasRcZhT0{2uvWG#|B1YCuw1g4?kwLxUT4jGlK^LZ5wHK86cF>0rg0~_J~xs!H`muJ z>}NsO%N>EEx>sLuPl4BJ1wOl^lDnj2R)Ft0QMY&tf7r+hsrB^78kd`m;l_hjHqBK} znF!9sbeh{YO@}Wbkld}R>tNCl1?hhY{sJAO9?kHoEWG};yzAl-?X~9p&s>%#P-vyi zth;29=>DgsT~ga3L)|vA6;V@|@rt?34SJ?Gw~gM{$(Gr91t<9DTig{OV=8KacgRFx zK=i*qmU_RAXx}v2+B;ipNwMFmR}-cU{M0jne1w24@FeA^hWIr#R#h|Sx=8HgC2Cl z^}!Fq#uL)+ zR;KdJ5+lpFB&m%x+L`C0|2#oE@3nOOux{or9dSSq4(uGC_TFKAskDR{^j7*nsg7f+ zhZJXcte=z-N#C$Aj4j$_q`)&p$Y8&gBsCPv1)|S`oQq|m7c^`W(*zV!Ip%)EAMxbz zdoubnc=Rpa=YYwFS_uQc3)Vl`7xv61&WT?9;}ZkjYZ~xGug2$q)1iO@Fc3Fi)Z?o7 zK@m-;W-koyYRLCnA9Xl7`T^WDJ!!j+TM-t&j8ju!=9K$E&Jk$}{Qf-Pa+KS~0*{9? zA$~$-1@H=FVp+(qwwZ8Y~Uo{Rqw=yYbk{U z&Gi!woQ?5G)K7!>>F;_^ zjoG*_r`X{;5&B-B6Yl~H7y#nFkBEDy!#)D2T=?8~ETB!=zgbpalRO*}Po!t!H!spD z?q;|F3xapRmV$MxL>py)aXJyb1&!W^N^^PK4XuXIVKt|p4w(f?)uHUufTEs+D+v3o zkjP?4vPUnuW*sXnJ!zYD*mYjx%HI*tC025UWgNj+l0YGX(ZRu?ZE&t$8au)wJA&Ky zCx{A9nAZ({qhXJ+x;gZVIG@xw%JXtA;ZtNM28xvw^tSqh`KR<0VT$N5$b&2bqVt$ zsWXC{5jdVALGX;Ra{2m-m3*)$k3HKvhkFX0C}hdP=B?bOrjyy(OeFG@&drz4BeEXA#K~c(#nw?#ik}v+f@F@2nt0TB!l)fLA)mreIqOjrTw& zO6P{@p4ps;Fzm(udu@%o@~W?py1+ksb^A?h>uX`o`yd@B8(#^H3)ya-s%B+@o*wi* zGVzWsQl_BMYRXq!U2Q<7X-6bEM@EV1&&v*t3|+7Eoph~|;^zGjPFYN}aN=)1>1=M( z%whP7O`JTcrRbyJ`R=~R#PG9Q00tViM+;M{lfn$4mhz6C@^`^oQZx_~GzlxYQg#w! zd|q2*cAnc{2!B!1*48b@;&cv+q&I;@((FZqa|{oo1^^zR(PIRe3I@@bK({h2JFabb zdNPOAgblk`&mG;tG($j7TqWKpLEooG74=z@Xf^Is+lhDd<9|g8Dy>)8Ew(_1h9m3ZMIh(eRT^m7V>x&n0fBym0V{whKEPsaiZT)xtHG(mIjX>894yF4 zTzW!(B>LN~(pT8pB!{R2#E*JjvcfCmvWsDD6i?|ZEyB)B#?Co^NYC;*m8TSE)PLZ&Y(9oDlXm|j&b|0ql zV;1(kqAc!TRE~|niyUdM_rXzc#3 zHjw@&G`Mtr{1cXWLL*KIlpWFt+9p<2-;F zCJJZLjN1j8tW{eR@!oN7`@Yz3z3*7Q?@$Mh{$duKs9u0-Xb?Fr#YcW0M);XD!Nd%j z8r*2f9cv;E14_xmn)Q2*86Wh$J+V!3bC9R_9U3K){MqkY)$N~K`Yoi__-p5qE22K1(1F3n8p)MkGU@8xGOUvL>? zi-jI+1Uu=IVrDk(M+V6=<3B&Ede9t~lkiBH zfQk&IR|yh--bEJ4Tz|<_Xm~bm(~LzWNLxFM=G>a618aVw0_7aqAZ92J5&uE{n4BN= zY|LSRs3W&gT^weEexPIpY04+ni>_;vbHfp&!q<(3^H&rhJ*g0wj;KiC0E$I;NorRP{CwShJc%5g_Ni88L3z$q1rK%Elqm{r zTJ`7GKM*S@7I)AhqdL{Ue>w91WOUbt1Hrdh0$;9#Dm1N$fFo=9pvgb#WQK=wF_yY> z37o4nh{=CQOeVvxuU{5Bqz|R_# z;>v}prL^l0($@)jXZy5?Zdw4VZ&raa#zEJibQHb@-T55{PGvhYh&;O|x@QYTTfox5 zfQ-|0$}}fj^vbAe?vQo+?b)B(pCclmQ0_QjQqe!VyOVH4hJXk93Ppj@(Iq#-5lJI~ za4(Mpt?ds;JKJo>qk)p8nxb}6CbctnzrqG<$O|0*G^1OVSYHTmAbfBbL@;JbR$OYv zra=K|ag(T=t$hrOPoB-5v&{n-shpQXRBQD>(P;#tV?-E&?H6>uX2$I)dV(5t!A4&l zAMFPuS43ngUm&&4m*PzOOq_dXV8!6^ytmH9cG2v__;LGugkr8@2`OF+=%b*EI}?xG z*SEcM6%0a$8AgWHwa9L+{QIZz6;s`ui2K{a0o*#Y4Ut$XE9$}Fg0Qobe@gXcAoCwT z-#N-y#J9|XYlj20$cW%bun<+ie6dLM-zknE|Et}yh!w3xGA#t<#wYogQOy;XFqV0u z4h^p}BZgxDdbEQ{D*#pyHasnhhN9z{l)jvfHJkJRrI?de;ff!(bM@&F0rgvu#Iy41 zEZ;XMqENi+N#M38Z9&Jj@Qsle|0Syc*R;?lwGc4yy;A5P@YOJIdT~x@)G_dma@OZ4 z!@99v^BdvZ&Ah2=r^D0dsSguK#wY%qJ!;eW9Q-L7;2gjBq;xw-Ug;482szV=(Hl@D zK`Qxld=wcHalSw5DWZp~a?4<)8Z3*<=4O{Mz&6?@4c3`y!tn0`BDJtNZ;D zP>~745i3invcvu^7{Tq1!1Fy?z7jkbg&fqC#v;n;z3-wQ3BIJo;xIRNs*@l=xRovF zl&S{~u8VkNj%}Tb;J$L;xoaZCGBD1lO&XfktDhq%#7W9Vt11$68fry<=Vu$fzeh^s zf5dF;yEEPT9AftRk_wyz(Ew)s7k{L*gva|0YepK?hcICRZ!`9vW+FlJ5H92v=A8c?8E&-`2Y$L6gNFY(#C2| znz4*JDPvaagV2n>T|7K2js}gukXXQAwDyjBx-Z!ikA!L#j(cirYG1QN$N*OAmVGmR zFI&H!1YbTr`bTFdR2aiaXIAjijuow%0qAP2%?~VNHtA|O%&r&bwFF&PtT2%gd??W2 zfUprzklgdPS6_k#1HVGu>>oBFgmPKlMS>Y9u&M*{mB$wRR?)7VZHf@o_ZS z7~vK3B8YerX_aaLN#2e^Ri0Sm{UlZ6x&lMx*7BD*Wqx9suKzCLRh}}h2wuC&;(${MhU1o?8RbH8{sjwId6EAOX$|{cz_Ge~7LF*&jM2OvXXs6;{+As7svd+MM8!To^>X*!6%l1x3|XY&A?a2&&w^EW_=`SO6J~Q;_ zh^n+&Kc`bV*-iI+WQehQvk0j|epw~D6*%_v5b2p>15X~;TbDft&tl{nVb%cKj3c2p z0MHzUy#FW^kSE|C?)P)!W%*YHK|LQl5tk4O9BHx@rj43cz&HJuu*byt)(H_CbOi(l zgT}4zG1fi)KT%+XI4vk*aT;^PajD46iYH2}K4|ZOr27Q|^NX<#csp-ta#$7>mR&9{ z2v>!lL5r1hPX6aqe?_AQpKe0I#8x|yQMR&2Xt4k^g+BF?)mfH4r<@oa4eUJ5q4GWm z!Gov}913T+Q41XL+6?3K*Kkq^`8y!f*=~3y9_cu9-#yQz5Qn@WZd*~rHGfSw#Ekhh zbtM2}Z}P-B#4SgMGtscVq}Q9W_z1iN&4FQ5fE$j$heft-PVd&esgjBh|cUCN;s51H;;=B3S19wu! z9$_XpIL4G6vloJC<@eAFzL>xpA&(&5RTY*s(qmMLiey{L=xR!OI%zP$Z4kkLzu|FE z#Dz7@vy8`U;h*>uKBNf#`NoL1^+OHXQ|WnC=0tDM4yZ171^A|&+EfBM*@^S_i-XRRHX9zI79aQ?0s7<@~kUZLy|@54VsiBd<1kODw{(5y>lLNsbpr_MURt#DfkaZgO8 zUb%j5NKjE%-teQY-YJU&8FPrn@}a2wngjd0wNlv+;NDt?fNu)2~w(o@i6fxZPngxP2ji8i1NzKRi zJWZkc$)-wdy{$H4V8&?Yi0L62BeaHltfCOuIWpEE63V&4K@6owe^V@ch4zhr<#u}J zjxcuf+h3dk+c?`fm(j`N-sGC>SC$V+-4l5C76HHj4|BSh08 z4UUKmXAZ!JQM5Y_HdM^*yo@{(9SNKiE&}FdO`8lI__&E)R4^1k?eJVa8f<}YOQiHO^lAp;YSON zT1AQXa4u}v5V~|{ZSYP@;#ucRvPH&^0a<@}o|UiP&5(^Lr_~K$)@R{}Z}?%T_`g1{ zY&TgktR)D&CgdsLp!OE~HuAiFbY3122w=)alUgIf%HaPVKKtzUcPD{>@PnuoZzvey zx#f7BN8?~$%4(aPC9`SQFG0~$g6|wF9!9i3`i%ow29Y92-zC)KVO2T)UPS_@- ze+bIZ?|?So>B$f{@MYLP;`#Y0$N#)W>horT&$J%~2rDJ!Up?yc6cmMy4FQK3+xN=( z??~SkHUXDjBZZv1<9T?Lx+AHE$4KS;d9!Y9;CF&HyZ{g>>U8(d`MN0lf){$3qn1%J zKf;PXV@$go5(yT^;O+WHQJ^IW6*KDZ8(l66M@oAj(DE(OsIM%^UL?iWf`Wdh$eKhf zek0VvkQfP>G$Jy&88$9rj7qoTsH)9;1uDvy7x`bm-9*X;gt~Vj?R)yGU=E{5v5QlvVcvE3B#hYP4kO{X;qK zx4*xd--!0Bj|AuL3cq*_KgJ!eZ|S%9!;cDpgH9<#)Putko!@)?h>{ie6y!@3Gbi(VFjl`p@j_Y?Y#^`ex)rdtqhD1-fQWtuhz! zOXv{~F6_l$UrUTD5kf2E&hS;i$0s3`BF0Yn<=oU>-Ogjov9fS4vC{MrAY85oX1x*l z#l%(y47Z>Bh-(_eBo$|AJhta8F{7@5^<*W{!$7~>u{MM~RU%0iC8rqXW=mlD4n)*~ zn$Dzy^Qr1eOkyM`)0--_=0Vz&T7|F=D;AocheIO^W8^5iL}13M+EGz=iZc04S(snG z+F<-Mi`=C44p!5)UQ7Z^Kh$irw2^wQAQ)bC>JDlM-)k3nr(T%lkZwR(qunPwhCx{w zn(;`ZEyXb1yrzcAABYCn0b&41)+55!ahM3Af^w?VFrh87EEH##Yf3y+{vHy$SZyoe zp6X_|uY2N!H()XKlKFXsIsqNBqiL4QvZI`FxGio;8#ety{B8zV!dJG*U*p51OA!5` zbFF?RF3_s=2`B~ON@{Xax@C=HS-1R9ziX zn2r3%w`mq$c(=DdvF*XScmF(uCyk;WITzxX-2S@!^*-`-c=jH;9T<*d=#$m=_J(u& z(cW^>E$L_&hq^T|J)`b06;GRK%bhUhk9slj6CX7|VfFYV_T~{EXVM(u7w-lhS4aGm zBdL~&l@f86U9iwI^;bmTTVwyk+A^(d__Qo;r*Z4XZEo|(rSbr1T!1;%$YK!XsUb-M$p#g7kJ@?IO`mm*`)GpXyE*}OI2x;XDhNh z{qw7*a`)M+!_ulq203OD_=fQ!L>RD3I~pCq(FI>Nj=UdR4fp5`zufyD>9-GC3j>lz z-c*sE*1{g}B5rS{u|o7vk_#xavh1qhsi~6|7rnBP9_)xTYK#362OpICBheugCRdJn z&IUzj|DCyB3=b85pu8nSHj8?W^nMIh@~R#73HhYH+QEn+F4&$ArLFvVYoEdDFGa4M z?FG4|+-66gusYbSr`d75Z(o?vW5>GLRFAtAl?-E&{Uf{lPWaVY*)eON&5BGJG}U6L z-u?&(uN_z~GAW}qz{2PL#$lKbSB#=bh$;bfMm~Q~{Rp?WrMh0Bvi%5FK~U5 zbe3=ynOBCrta1X*=0wlbLL!={%4rdsbH3?Ab`7i^x4w;%bhBh^bvT3}c2uF*apZ3D>k%{|(Z>lT!bX=U0#8?OEWJ>&DYgfRCE9oB!QQ zk7z=8!%6SkI5hv9p^Gln#F5v|LMT$g{gwtiFE+Z@QzlMk6@nIV-ij3zej9T6&OS5q zHP?1vX7<$irk*F^kHvF{2cyWHA^^I+&OY7Vv%$9klu*=*A(@DI`KeLu@a|e2&x9>a z?zIn%A6m20*p2XE!da3dSrpmA6{?d0c6l;gjHPi0T6wuU9h_0p|QM;2oQQ5iq+~yw~xqF4u+0Zu=Elfvsr;%^WK@} zq)-*s=!p|2XL76@{KLhiPdCSl%(pX@1H(A|uV;P-XWNIijqeCbLZ2*BkEm=}EYZhI z5x4MkSnu)~MizL1Cg`k!!JGoYLR?Y;xztswLwDDHs6Z~4oEXla^G%ygor9en@W^B_ zAmzY)jl0A9EzD}5Tg2eQNh_?g8H9q(Y&-IDICyLLyh*fpCU3Y-G`?Dg*K75}TE~~u zgn}ftW@Cg%3w5-qwS3(6{^2vDO-%$Pftz(56X10XLUbWnzXQAbf=qf1f~I#*(he@Q zDbB>Cn8T0`7)^3L;`IrCI~F;GwS>@8S&TuRAeP1O!!qF<*g}W;=6e=UN9II;WO3Hu1IQwqcI6ZKLBhRX z^D5Y@L!1O=f=5OM$Z4?tlg67fKhMf>A}5CER*eWrNQi;awe!IMkR?ev78R?R9XL=E z1=6Duhcn|LjPri4QLm1!sj+VN*=&SuxI&~{vM=imGXKo#AH^s5$0fqOUk}z&YmX1= z%=)!`zcgmVLo^aBqYo1{@2@flN6?YAfVq3*GZq8nAv<29aXJF`rf{a#RZbH{_POTM z<*}BOnB5Je43){$aN(MCT+oovh`_8Z@$$X7!3YVgDKk zt+OyoeHY?e)k7gi?d5{q#{e)1ASwDqn3 zTg8Zv;C3-VHGElV<-b`{d4<7{Ug)z#uRo9HM{JJ=ja&fo}u_BOEj2IYc*eb=^_*`j*W% z-Lpi`!>NVGsyA#Hoqx!fh@mn3D(aXkQGUD$eLORA#zI(ri9x`|qSL6%o5>X#;G4)K zOuXxaZ|?y~CO@^Fg0^?I;AT5232 z6~W{8%o2%0OtQQlx)7SiO#W}PU{!g?|jrFp@F;MLHDzn^2#X-i*G$HXngws zrF%Ax7UFdj;~$(A=AM>i=_yX!^4tUlw=auxf=bouWQB8T_3AX4zc5`~^}5_5KyTrL zX{n=cg?W_ujLG@gWKI+CW#U;>WSAwp;w0EoN}~&+D1YYBe#Xz|s@Wj2UVT+wYPRU8 zN1i>Dx4&-OUTyqUf}bxd3N*BWA61i8nOo_+&aAwt`OYvqtSJ*_1zu6l8hE+J-PHL} zvkWYv6r+d>_!D0Hz8?6%%s zfr1>U@5kxxc5GL?(~v)6QEBok9?N5Ts=ZlU69O_d?3`RYtu6KkPo95{D89knnr<26s#qV!OlHA9h>mr9em)faE)kU-#;Oz6=&##E=#R*YusV zoa%eE9Iab%acMEU{;rG|R1Qa3LInqho7=+k%WnajxaiulQdDlo0irD`C8)=T%% zvc_!VOT!hNAsrT!Y|@A&3TdP1Nu|^IQ*?x*i`f@9=`TZ!LvZ>T@t-b;nz{}R##AlZ z5`el^d1R!8pkR!?jhuJRf+sKO*0?gfq>3i3PMhiks`YihM%1)K%#vh2WofgbB2`h^ z_RGK3FHj4j?w-On7jlg9m$?F47NX%eID1{nOk{Sp_7lK(Diqa9TzpEi)6N6B;9D-k zsS*sXLktv1F15%W7^t5J;C%34>)*_Hkv}|k!yM8*4S$N*uuS0?1msN!x#xvO!bDS& zZ#sX|HhkXD$gVs$?GL3cO?2>%Xq- z{N6Fut)&1q{POYB21v4EyP?|!c1A?7R3?$gKCNdR=TkjATUc-~m^wlsxr>CPyOC3; zdiO3dSo;tPw@RsuP;5=3VC$T)z)R4ZOXqX8W7Krqwd&3dXJln131x!TR$#DnY@og= zfr;?E$Q}iflA0&Ycz^B7=b-*BnDDUkNrjJix&%%Zi=A%|BziIMqQZ$~S-^q;Z8RD( z!1FYAj7+DA08rp#q6we}(C9O6gu_l)DN;fldOQ{OPSFAou(vF1%z;OV7ti$ao_%Cc zrc9Ic>)^j^#=9R4`maIkSN*?VP`8d&Mj2ZFvYE9mIc!m|Ah9Ue6te^{#AM5pk)xFv zbLH#p4a+XC*Oo zd_SyT$oY@2gSvVJXuc1~Vux|S=E7YS^!(0#+A=bmBeLt^OZoxF!Vn8fdL$u4FFxgjw}fZ__nVwW@#0HuEd5;98fTCCwfmi8EKo>1M?NB<~vo zVT#9_qvk%O*o7^C?5kLqzwkP!P1ESnLIy`47~$-C2SuPEr=KEwh0FO59+v&kX|N#4 zf*{vu7>b*~X~Qsc&{b1arAbHg_p4N;Ihwf%3x>78`&B#pah~J(iDcoYJNMB_f&i`3 z&XAkEQN{)%tSw>ZJda4f=QFLi;e17GZ3Z z+q7#jSdaOP6%k=MyA`{4Wd1~e+`nb5Hg+kUlH^VTK$P=~*Ke5tJq=MW8QhC(YB!dP zE&1%t%=-|_i?qeZ(2ah=)4M??6O6LC)0NZ7LRWc*mOKV2;sh-^ga`M?Vy#gEI-vng zcVJGfJ4)_V4L_~a=)X*Vz$gg?hRg*VI1~BYlYEQ_=xcyGaLb?Ip$dVf`ow&L%!Wb( zWi2k*=tA$chA!v*efN)C>LC%;cN?)!cd3<$w~upkjVY^**&dxMo}<4(@v#*|c919y zt+kkV3E3nk=ce6W(SOSEl^jDB z7W@hLy^YaZt_{gO|1lE+$O+Bgb{ye`;$(OQPpVGhlQR!RDTB+VcsV)x#wuf zs?4f$e-SH&9+}9dMjcBq?JHgh2mS-?+%dT`FiZMeatb}i3LXBZOH58mdrE>sqX##f z8}MeUUG=TDvqz49goE+4U>cd!Oigkz9hJy%tGH8L-GMI5?}I@bHWU zV(LZr-*JC@7gNKtK#qrk9}b(U&dVqDtP;1LynCpcAjl|AB}v z(l@5d^Do;}lAzEOHZxdMDJhQ_84)YqHr1K#0Z`C%?VnG=qB1>tN66nO1znR#B28DG z60DjKOH8Uv1x|_we}^R8!*`BI>=aBVx}R)&l-7gaOsIJ(d3-*1G_%ai!q14qGMCr=GbD)4mWUS~%~FW0uF{Q3OB#vB!-$zEBGA1kqW zg5KG(T`N#v|El7D0xWv5f}CoXLTkwR8hUD(?0rUHCp8^0)PHTf-@wKRwnSbV#d-ZH zQ>|eF8yaJ;wg46ZAd;tca1f$GVO4iJ z0G+&CgPioaJ7pC+$Et19L|@{M;kWNVvCPQAQNlKO8RmOorDZS?&cm#Bzs7$O-ZO%Q zd6F2DC6gpea|n7JlN!8lWXe=7njQX`nN_@7cu~vqJJVp&e@@C>$ei zj$l&|HO`fGjB}w-oJ}YWCrmRg%B33S$PBuV2O5>4=LUyHDvC>^Fx1mGUa~rSR0f*eDeHhWd~)MdQfH>1&P8>&M30-2_&cz zG5Z}-_CI|Pr!*=Wdy{f7CSbOxjm*F-_veBe$0j*dCRZ-!1$$)WDANQdh^RgS0p*l$ zJdmLVKG6WQZ|U%s5|_$9G@h!upCC+62F%Ewh`Bkvf(4@EQ+v-N-h=V&8#=n~Vj}#A zcv)6y=v!Lq#w_T|W5#E7Wo+CLx4Gcb#HEVTU=Y843&DpaViI*sm3{mT8}6!=s>WGG`_U2~T^Lw*!s@e~Ft}aT znF1mRPoWk~DNH#Qf%xQE0A`F?thog{PlMjKy`#oHku~Szljv5<-@E9G|F<~U~MGhXtu{!*v6Bt zI^%_eghWC@0;Bf2%|7ya(H&4=$}Lx(WMy}cUA*cYkE~R>U06PopG}{{iIuN#?Ht05 zunw^&%?FfABQa)+$4(?=gj@W8TQp(B-_^WDITdB`8WdrmlY@@Y0RcgUgu-3UaQ{$M zl+R<=hpt@J=ANq&hK9-|Ho_B5w9snk@z0I9Z!%@aMvbc+y-8A_A9g7TOg%qiUiEv% z_}SyB{aYhjiZ?zqg@My$@T0DU%WS*K$8qtaj?;Ghc!aaFgTW;!De=kS=_5gqvK9Fl zC^_w){JS1FR9>wm6XxK&Z4{i;br)K@`ipoirll#@h?U@$C%_EbbD?W|OxCFr3P!%0i(bpecD)MssaLF&Ea6 z+_qN^`;}q2Y8~Utrfy^5UTh=3h!Wk;B8NCig8rMcIp^D1L`=j3jjK(Y3;8xen07HR zweGh{&Ho2eL9D*YaN~!k8GK-f$evz8j-*@_1pZ2;TQhJ_({w~{ z5A~5fM5iYxONlsq5M`N7jXzrt2Y06#$znLTB&2v@!6(2n&@2NYVPrCnF_6NmyNG%n zEuTlu&Z4E~@JmHk{C=f1-1>@4|QBb+-ueVg~+`Wfd=zr*G0x0%V5DdaM!nOXcX4PhE6+otS9 z(0Y;>i3HLKA#?-HG#kHPR{tBp!9$Nm=^0wu59{R`SATJt;?+rn5+uw%Of7_1L(#Tn zaBvfVP^kbv@F-R*jKmxFUe~)L^bkrdiL}x*jiG@QUwio_(sQ$1`0xtUCrDW%n62a! zyax!|qkg*;5^e)1Y^Vj>z6ME@2o5#{RWveWdkPevtOxEvs_vJV_Wl#u%FpSK+~82E zvMLzds{Dal0ri#uK3A*>{*tQ=tcjh|I6qe5!W)>0RBAd`ZysWD_B+(w&zqW&>=pfb zpB%(o2L^VZXL2fg{Q;U(cdLSh*@2ndw749qog!CirY8-bfoFbv!kAh10(;N~FUCIO)Mc!0l! z+K_@+GR!m2-_Pg1{3s7Ra)@{$%x>NcQ|GZKkMiKd2YBa=3rn&~pI5%ed|KO?Sq3K<9vfl z2Pu?oq1p3u=bi*=Xb@F*p;klY^62SVw7EIFVu@m} zM2JuzZ)M00l|(67^W76v-CyBW_CGRRe2wAw7^6M49j_SdRQ|wCgSidVeDMw}mOe@0 z!b_igf=U|`3Zpy*sz?}8ezyAZGy__tfY-`aH&i8&1K>E-Lc`aJhPa)3RfDV(s)$7xIU zMfvite2TNDt}V$W7zBdXUp>PYzV-wUK6(f#1?lNLfBOIYn3Hc@L@fa=K@)W6O z9Xg0ttzurgh9@NA;66kP3-hglgP#a9l2rhq2-%2`jU)n(W!L zXW_FapLv$A{_1ZtGc!#tn`L_P1|OXK1!v!Ti!0Y}Fq9Y!$`fS_0CkkKu0G*k}wgG5Avam$PJe%^|-$OAXWDa z*VBK_ME*67^pBBv&}+Kz?aCjxe*@y>dRu>9uHVKn?}ZDm_MnRKOvBq)ZGBHIEClCXhG2Eool>-65BN3ZJj!>%?U=6 z+(Rf3)!J&=|C$Ccihxo{5w}}}ft!ZSpD-A>9jd@x2Ljb50N@(m?+D!PKG17*vu%@} zRE%d|e2`~eyr28--%GqF+SNtlc5k|_@%U3mdFZi&y#2<9jfKxVWSE=E^3%V5kB`pX zDFy76Za=HjEzB{*{@Z`cr4P??b9{!m ze3g8rfS8%WQvx|3PAoz;Zpgt4MKBUEa{c{e6E2#iBP|`x(wMq9!_^<1!*e|zdte{a zSCdGz4z|6u`fT??i|eXJx;9CfB2OOP&%;kVkK;I9xnF_r;nu3ut5wu0=1PfJloy_R znu*CN-amDQLTw6Lg_h+L6wAi(dw_7;4zQabVTVAW-q|V_n3(j^OISr@fxMHES-YaD z&v?FnoJ##0d~o|OFlOH&mbgX#NQrPX*w#v{tpnNG2{m3XTzJ*bBb$4oY?wc=m9lnm zxbWg~*9sRdS9NYr_A@d48H$zP(h$QDEo%3Q0T~sEE*pq+U{NgB?|Xr(A*3W!9>?|F zhM@?|n~H4cDzb^o+2!iM%_K5*UFJoYO;5&`d>%BaUPJ2;+-hdOjl$`6Fbv$$s=%!R zfjb2P?j!)HI#tnYZkA{MccJ_w_Y$bA5ugcu#~ce*I}qpS(=9>MpGA zd=!8Fr$1W+37f6!)!NubD#BL7j9YOr-iGkvZOuC<7Of`?qSgRCp;6N1E6lxrg~_u= z8Gd9xv(q}28Gp^SMKf?v69O+8M?ZEL@5~1TXU-D%K63BKJQQsGn(vvBbOH`;T(HzM z2x;>QLJ+-4)ShAdY7J4V+ zLYDf>3Uq-B-zS%SgJkb@`UWdafx&L)5A1fha8mA^M$&G$@K$b{RU~#+xr-w{tor}=QU(+LW^4|F+xZ>Xvj`?0=BY1fyA#F=u#4|-DJk|AZWaqQflXn zSUXZ3xYjyUZhRujt3%*})LXuPLaBLI=tdr=l>>LT@&+!SY-}+M+z}zdom2&OFi+r? zfWQtyz%2!UiVocP`Co5*o|-Nh7)>3EP8&TL}o;P!E1=LW>24=FlHKLa{!LUn%j?e>_S5u>nSg%|%l>ZKn?UGAG{y$>^a1Ri}<#M8tlhlbHMGM8A-cyveli6H~fySqeXOxgwc8u zsNq5UY8~OaP%5F)Y0SAfR6b9sS|d9)&b6`Iy!G};9LJ%rC(g*8Jsdf5nEj)BiN#|$ z^9n-4(AS1)8^J-bY|hew`U-r1VJz}}k6Nulv6yFiY8)Z%n3ve}^ri?o*NnwF001BW zNkl$~7_bG1P8mC&FqwXisv~Y6xn|&yXvAQw08FrZA#$(WCW=ery>+Hc2Kr6D};;TR(4bic&~) zbPP>rHdiKaYbdn^ipP$s162p=m-f|x?c75@K)NnU)7L!Z^-jn20t5oN0w``p-oTGB z4BWC1;SQ++I|u?>R|D=e2&me>!JAlcNePLbD0}z!^VM&CiU%J)$ez)Dr2J&50N2`b z*%D{oyTYIT(T})%alDP^Tr-fcyMVCs;lVb~!wsbN|chGBNRl}IUx$K%A~@rBPGdGv8U`-N91l}eO~Me6k`xlD$SE}rIR zKl}^6|2J<@uX~t=j-hLuzdA!r1xN&CUm%4g?KBaaH|#4vy&U{Yugsbj~!v}$RHnmG)7tGFqG9W7}?bNOKly9Y8w!CaD3bn z5ckP~gj*6LDUo*-gMQQ~Q8aSooD!u(J@AeY)PIBNiJy?3{%h>ehYanTr6=Wm?DGe< zQqF4m1Mh_kuPpaYxNr~%iWP%vHxDvB_cFEm%MyAbTG&pK(h{NvLzvxZKijl^)X*@b zLAFpMRL-HaMB{m(I>XL3KiOQZazsb#wVUd|<&JF)Qt2Zg+Dg;4?!n0Q+HL4jE;YMM`&F3K8e0cE|st30S z4r-c3k26ZXGD)#I$>ghN>AP=)L@GtLpiwS+E$1&^t{N0lB8LVDsx`#95AokWi}C0~ z_yegW{d+gT!B1?y!8HJ(Gz~BfG{OYQ1Xh0v>UCtjPLMC6W@Z|IuvjEtu8_Gr#z&XO zc=czm6N!Ww92nr(vBTVV-%(PjKBAE@kw_R_Uqd~(jd1V|6jHvwXt@*Mc^{*6~hcS%qKGR*d&h*r6>ecF!u=CX!o*YUnyhG-Nf$;H{ZeAaT(r9bzsvlumkGA zH9l{I(}*SQK`DiF-PKd$iw#aZ2&lXMJP?$$uUu=_M5Gl6)R7g&Hp0N2t_s{L5V+kC zP_+PzM8}UMg&>v)^T?A&`NCJ9;E^W|lSoGHk-ueIu~6a1|M^}1_z!=;%v5%bMNY?Q z_)22amWr@>1!3pHi`Rfb-CFx}5e^C^u#Ff)@e^E~%}~$ex$?bJ9RKZ4lZ+eqbw$Mu z+CJ98%+An}2lk=qI^O$da4%fK(scaZBtnW+LE=t^gZIox)|S*;EWOIn=8ML`HeyPk{Hpler92YKJ;s-za3CVbz(F3ELIDV7^2lf$<$B9P5*iHyt z%9Vg{o8jOJP`KzthwuB;>orQH!jifB9W`OHCxzog2!&%usn=@M>s3mnBH6iVZd|^=wJYbDygkO;+#H!)fl|fAb$#l- zkLM{oKOpb}{2(AuiXc$C`-X~-cK{Vb(G*Cm!FF-?n@ zV=~;I;Qj|5=IPIVmC=LuF)%npZ*TAV>e3Evp64<*GsX3*7dM1~ceaQV;>e+c*tSWf zT*VW00%2`B1bfEA9~^tA9yCzoUi13DGAL^k7PB-bGk+xZ`*8d(HAWiSCDS-8mw2=Lvcaujt|pRon8( zvFiG{ZCV}J>TJIi7#M8g{wW21d+#ii3aGh0QfLd~V!JSO{r%c-6c+0(dY64uHhEum z8VtM#0=EDHHhE2LP1-k}H3=bbA~wB!QNH@E=Xm6a!yGs?L^xvKqkhY$1%AMp_pb2o z|J_e`^R;t#U4oTbW4vfRr)A5XxGg}~eu#1V;l)ja7I%vebs7!|kU}G3_0i*uGF7-h z?%Y+zez})@&mN^*(WvDWfxr0`j52iCI}G(2_T?+o&whY${|Wq5@4TYuE)?7t4&HMr z-VJbYoLZzm6AC*!9uBSr3Gb>2t9R9e2sB;CG%cKPguc|!JR}TZ=sK2Vqv_pI zzBN>A2@;9bL@VFGbzQRAETvKr&-L(q4|n0;`rYgDJSvqE)k=|CtxBy@#;sMU)v5%( zPu;C8S_1lLx{gw6LD46LhHjV$O=1}q`n;Ko6OLg!VNBD;vP>e;IDLJ6*tXqu0J!v- z=`%Mo$@#PI;Jfvv`-86QBoZ;A(Fpm%41{Y0zSDuV=?(>iErGc%6S6G@a223n2(c zLp=N9{e0$2k8|R|QF>FcPn;ugbB|WV{cGZJBB(%7La8TE5`l5%(*QTh}GGu;nmhk=|qOmCDs-#l!o2-kCp`dnP z6i-UT>9f>6ynv-YfJnw0p{Hsk5L_J&?nX0`t$>4D;Z(fI>yQ#08_lsH5l0TB5Y+<& zwHm5W#Gjf*pG#BE7f9!d%+BSxcC!k=dEaC6Le#IV2Lj*dd2dD1vU9Xqt|u=~%Xnrgd+5Zx{xtREkt8 z^@)9UDy1kD^IX1k2Dese*}O3nYUItld25QgDq|8~`m9|j?~@J)Ti$ugxLs%0^xF># z^_|eM8ep*TCyYZf=rKza&AgVkN~#pCEAN=9*1tu~Jx9LuV{S~o$G*Xj811iOnVr3D zJ28LYst~V(`2%;{Dy4<%sMa)YPxLc0`w)fFuj2a;X+lQATFmSfy&@_S=)#zP^U~h> zWG9=6EZJ2^bPR0GBA3hK6mwV+3n|To>sYA{Z1=iEi}lxxI&ha5iL7X^J}Xt0>z_~H z)^H1Hsx=Q?gy)TIT7{uI+(e`u7`Wr|1$G()HnSMqO(3w-0IQ&tHAEMoN48J$I z;6A(*2;MO@6FR#x{!;vL$aPtLAO@pw57IqNvhCzv{yBM_^+FS-^W)PVS#Zrm< ztqE@49OvY_?-7qi>Fe+1(7}ToJ$jg-p#efph-f&BZCgtLVbgF>br}#eQNKa3aQMZL za4tQ)Fb-={qU$DxVPe_#5?H92CYsccQZ^isEek0%?rm)@QGK6$KEp>Jo~D?~%|CKl z>&K?9F*G>+raqMSYz4a5qp$m)-O|Y-O-qNXTW&Xfb!-cmgf1uq&Zot*@ z2kx|RVb7D?o=h?|eVkn36+G`5p;VtGEi)l{WRL8_7NM0Ou&V>=Hf@V8M-v*BicqM{ zV9j12uzQfEx$y*7bhI0{FgmGCA8T9HfvYS)n_-i}_c3x4WL*zSh8FUtY#Mg0RkuR0 z<&MHl*6GSa?Ua0h-Bbl`6A0WY2q?rR%Gr3+bdA(Ng3rA42v0qCf`dng=}X17G+b!c zEn<}7*7a%r{lEJOKmEab6bsF$8d?ks-V`M4)XTO`DhNBR9&FLIc$?v%rdh;8Bb1yO zW{Ov+UAW5aSQ2?)KY`VlS7=QuJ2p6$VIU5U;`u)6gAZ|C7yaP}peIQnmO{agCmh^5 z)!^decgv}`QE!_sTxl92q#;5!k|-pTsJ$Zuu8UbH;?JfL=^6Zdk*REsso6A_E?nlP zuf9es+At^CyML6UhY!*}kRlYa30W4QPzb}AHz*P7bycybn{GcGTsXZ&knj$qa$T27 zrGzX>(zDZz;Y2h5tETH1hKXsIMB_rZN1nz(%o)q!&3 z>s{+GLN)#>(S(u6!sN}xDcqt~RmANm0+(9w~3H^Y0|dRs16;z!?mhd=(;KO~dRZ^9**w%T#? zkg!uK!gUmcs+lovtpu~3P!F~eTHGa5k`~~gKw#-%hT;!Us%NMa(>NcT$B)Me`umWY z#^Tqxn}vhQvJgiPAq)fk!wdN5FCy+chU!Tmq+9@giy_uVaPXc}@%rc2t$c%xdh0A4 z1i;V`hJyx(cno8pAFqBG>UFeC26u8AvKgx7GUb^$CMIS$efAu-Z4(WL=pRTiI=Y{O z2lq2D*iR%JCS+TL!_HC@id_T;S1!4NCFkx3KCWA*S}7xiMkbS90+oc6=(;xVfNcN& z?7iuioY#Hd`MLL5>#42x4f_rPAO%vSNJ*v^$B{jX9WR+U<2my(FY-UktDKxU$KyA1 zX6DS2iRZ+2Ja(K|j-$wtY)Q6cilQiPAV`7)2x8xR?^>Vb-a9X<0dzNdsj9B68+CDb zz(zmy+-FD6CQ{EHXd$fIGLY zQ7xCyS}jAojqf{~0YV7`L4dFx`jl*N-RJ|tEt;r9^sX!Z{#uafI_xvP{`8TLn`TMZ2ov!6Z>KxOiJ(Q)hMnr+HbSw z!mThf-pYSqV>_8x_und^#hvM4X6BAlDE}gH@?~MnfGeGBM&_IWF)T77izDpj=hBv! z^4<(4vg#@$EIbk53!nM98B&Y)ahwd&_UhwjTlo>(t?IySRoI{(Jy~A^nIs}ryouHl z-^x9y5Zsoj@Kz>jTLGg@AeC%*(lpS-y#NC{sS4~Q2uO2N=bp0EDWS$^Rc zpXJ%-50grHeZp7Iu_0Ex`{pJ7{7?RlH($GeQk^&kHJ~PJ8WL_75Vp&_xL);OBc{b2 z2ue~19F)Ssce9M=PjYSMXH;h9NPYYXI`<+v2v(Wqw*n3d*F_%Mk4X~b<elU^-R|nA|e}ik^={i`h0|e;7JpSH2m}-crR*C24aA&5` z3yXy13ZXgAXp^c@BOm#mG>e$;l}WA34N<1N+G5vZPX}nvyW(W83zQhJ#Ox zF{7R=r&1^t6NXhPUn`6*mKz;RqG+eQjmGfTE> zk&$<*Vn2yvqNqx>TA{c&$K5+OC@d|YlVsV?qj@xIHao99>1T7rTmy>5B1QqW*kEUC z;2WWi`X5{|{#TZ*8{>alD#A8S+MZDp)}Oh(lO}0RHMks|SY^Z@v0tX_SL|X?Fr^^W z@qQgAUn5bsDTn8oUib+q_d^DG)Hf`5j zxKy!gAaMQ!OT}-HB)@%2&B`7Q3#rViXXn}-KnQ|IAF7=sQgRF>wjg-^=PJ&H8EeHggjhTTj=;cdb| z+2}Ce1u$@%s=$_kz?Q24I|BiQ5ab8b96U0?FaO%hoIZP)z57P+y!J#=+-*r4!_BMr z`N8+z<=_3A?-EC<%ZJm(#{ZLw2igD#w~Aui2q0{ydaw&YNj8ClQaB8y_EJnAVWxDM z>Xqxbxjf?ZNrdmA)>#*}0|$lcVvZdK&qbX7i0H!$xcVe!Yy@H3Yam)H;b1=)$&QIs zyxz_zL~YD?E;^UN8yGRr^lk$Cn zw9mxYCeZ-AJ0qSc_|#v!*xA`l&hej>v~;>hDs@-sEUqbVyy_vB^DQF znVY^(sZ=0Y3jx>c5l?I(8=T|T-iK7IxN+kKky7NPi%`wnUmGzm?ld5zLCdplfw(S1 z!j7#KTW4V{~Ya;e3Q+KiLf(@gLZ&l`m;NnsB;RWvEk;7{wM>Z;vrOcZx#!8zkyQj2UyK z?WSeM9$-jhWDXa1XMGFRhF~IVlO-%XokK87b?z!&VFuexBQ2*se%45|;ifNy9aaZ! zbdPI6XVpxF1)|R9RT7cR-)DZQf-3_o;UFI>TSW`oy51lnoBn&lC;goZ1A7JpZuHr9 zg23)Vz;FKg7x~iH&T#a^9 z3fDy(*oQ{oT>2Ds?tQFd#}EhiVH{@zh_*Q#>_;ko+Tfsr_3#TNokb1}LUaI`BsgIe zF~5MAnZ;gQBrcaIg&~DfnOnD~IrqUQc&_T=MWo~!3M_RDxBk^$Ya7mdIagx{(kzJxl*)9boT^WdUauS{VI!SVma`ilmrJr#9 z?x&>v+l&v-kNUmMu2av!f>tsz|Ck(l1OIe1Lo((nOi(dsrrj(eMT6Q z^DHOG$c&TKgCZldxOfQDgra9RnG0`FK7qs)9-hunDKEh7^Z1z&+#p{kX{&Qnsq>(> zd0TWy9as-2Y%&`o1dXssT`l9?Imey3kO5~3OE`^ncrW@5>?Ii3ld8ZS1_Ij%0W-OP z)6X5`AN|%BIs3vf21m2~h`^0*!^Uv+(>wg>AN(yp`oTFWrRp~JAXEQG+IC27Mn%|W zK=_3J!B(gTTL}jrKGzvID1;>C4zefz9M|T4M!2|yckVov@1rKiz^?B)(Fhzgjtd9( zVLTUg@l&i%E|DY&_QCyV&)w9I*?PdQAE~$%aIh1RirY{ZDG{DqQxF1@JoeZq`oMmO zW85ghUMiqwXGt$CkSr|`hY@oN1!m_L`Si2vy!Mlykq%PiavApSnd0z~BOE?_fT6(w ze9t2Y0#d1EK)76bH32Bi7kIb`v1%6*J?V3JKesrOhr%*76@8 zk2EQwWYCSMx<#u*#VYv~6%Ix^dB()auaYFwRKxd~FTRF-=Oet-U93aXj19*tBT0@B#h#ac-x zWGiM^nkDb8s0;KJBco6Swbzoi0(XtwXr8+E=oB0r} zEpqM{)?j!6O7q}$fxu?ffX$smT;E}Ibbw#~r(fokubk%4 zv8g@)Y%i^)~y#3N``Pk^g#t;X!cwWs!cu{& z*YEK2x6hFdQsi?PCML!?c<2xZ5AJ7tY?O35AiWF-AF0}&7C5*HGOc+|n8#+x>-a5I zDB|UxrDahn7M6c9kNkA64d#K_Wa_Lq<{4wwRsFSY+}5WaEEh|Bbm1a}Vg*-vSjNLz z8CY;L@%gs)_Fe~sbjQqiv*SU-kg(0vu8mplDj>M(;DSvGy9NhUhFB$TM3s_NqGFe< za#9Tol^eS4P!kC;RtW@Bn?X=E2S&_#VDQsaO%ub7HCAN1L*-p+v z6375gWhs^Buy4PEpC7}|jMVMxZqp5;&cj^WD&LGcP}jj*YR87v!?s!?i7PmM7U{T8 z)WwMU$EA)VqPe@wOwZuR6oE5{6s_=))}X0ytAdC$0|P|^<3TjABX$Y~wp10^10b+X z5b$fi^gLhrrO)xqvj-WQ80bU5W{(U}!W%!iz`y^)AM(MwSK4}^Y5MfpkuT4?4G5c6 z4|dD6xIJ*tmM%lV0m6KN`%9k?-?@i({sZLM&!GqMO@E=e85|T+qJ{>so_!XENAPE- ziLYNr9yov*$TfBhXaWxQBNcC5zQ_5uuc;F+4w%C(!9Q$NsC zVF~x<+gyK8B5Uu(5l+qQp;b|Zg`hdVfg7}QtJ`?n=KZ}016!pE>=h8$_`yY5lF6xI zzWE!k@Wrp5=IDvNSk?~T|GK&L8pD-KclgdEEN2>ah~mF?QO1CT=w#>?QSJ zZ^J>y@)^sWAWACC7C%E=y^ifT=oii+Qz>|)+H0=EAD$#vfKMe~D zP%Kgks}%0daPRH|&VTqZsZ@$=CSY`Am;(n6aP;UArY6S;f&kz5NTpIZuDt>X?d+f= z8&3`K3ENPZ?wAU z%$5+R1&d#s)PY8bCnWw4lVA9hFgc9lWDs(V^WQqbhc*UPSiryjCMvNQ2$uZ^wiE`| z`>qxR5ornriYCY0c46QSRRy*L1lD5~T>spZQZO`<=SyEb!>hmeIi7#%2&urQpPElv z8oT@1Z#R|~Kll-07?HI` zNm=Q~ZiAXlO}Ry?Xa8=%pS&@hV?Dj5B5VMckIzlCSouKi7=X+QkxG4-=$ETClgq1QB=fN9> zl|WERj9sTfuu>$s`Zm{Z&EeS@()KV?x-A|Q9rhd8@R;2#FmP*CU~A2Tw+RBb2?2!= zWb*;TBYA$~zk8K4pF7B*qf>aEL%WkPhQ-B2ip3(?Y?fRux3eP4Z&A0xQkjoGy1}>q z{B?fz+DC+8Tyu=x?E1FuzT9hjVJ9HrR)9}zaESIpB^!@*Vnv-Kg`iXQ1lDsI{Q?;IR79bMCm0Bjp! z+lVwUn8z9)Sq6j&vQmM$Ijs44#Nr}xxx&n1ftlF_E?v69Yp?wj-}f09%(HLL9u6Nl z%)tYD85$bI_dK$>ERJI%IuSRf)7!xleg{`numRKJj)RmYQj#QGyMBxR{O#}Y;NE>4 znPR}6z>y9uRY0~(JxF8a>NOQ%ubAQQAT{Ar4Fp%uA&E=va-K3Na^y(j#8xP~A}W+A zr(-M3hawz}RD3*6)T<~R5{C0oy2IS!Wv<=&5Zk_j=gec^T2olE0&ha0p zwW!N~pwfcb`4kI_St?)p*(oT7fCj!!LN@YY10y;Ga*a_c& zyUAR*0Z<|k_%cOSjWQqKqImOdQu#@;qlb`=*M>t`BNw!`WYW}SSZws|mR5wtSyWWU zbpzxYb)b1u@7kKp-KgToA9Uz}i(}|?Drd%#_@#00^c;gK&UAjc2Qej|VfCC2(aPs6y zPMLnHj{w0&%56SSmBWSm4Ulo4o$UTciS?d@jTI z*cgWn9pu>2!we4(5db5b?zp{h-F1Fl0Uo)dtO>lCvO2wO6^b`m74tDD;k3dM^&-$euFUR{;eHnl;ciAhi-RH#rE z6%xA|heS!FVijwZ01Ckph$V!$ixgL|{98-0h3%AaH;M#uq8FVW3XboA;D}SXknNk3QzV{MFxZ z=gu8e3^{9(5q}C>I!(^=7S=^~X3Vd1AnE}=v_pdVn9h8-4+NViUkwndWjvS=ijbf8bgmxSpBuS|FGtlDXJpae9b2af#x9D9Tff4id*l(fT0TOkvC*kdZ<- zuCy%Ia_~txw({*X8C>Dw7#DjhF>0eGin77}?I;jzGPfFMJ%cOOD-JRr47sNVh*|NFno#mloyrB5>+9K*3v+W=W+&DgF-9k@+X z;im-#c0(1|lqz}qAkg(4hDY-JgJ1qUFTeT>hmKA#FqrN7Wuj84@Y-vy@yCDs#|#Y( z@!P-s+l-Hoqm*K9ZjKK>{E+W{_q*J^dzat+-QVTaS6}Vf3s9w8<>JS;`2Kg_<%i#U zhf<-8)~1O*?y=MrP-r^XRHBZ{OnqxZ!*y!|9Nhe(xqUdOjbgEKhg);+QjX?u(jM~J z)9}o3tW*lMW_~_xa8R1omZ1*^w=uJO2@V=SKL&(E5qhbBo|(a#pC>L9QDKCNW0cld zQsTNc=~RkbF3r@$IGJpQ4=;Sm!cvh#hYs+~Z+x9or%sT|W{`3h1ozqus*48hjU5=z z#u%z$$il)R*RJ2<^`E}Q2OnKvad8P-xC}Ux4EvL{$ij8*70rFI(+m5$X|(ZrfEn!| zznv`xg&i;%-W|SvR@X?>ly2BH|AQt#sT_$?wnp2EgsP|#T2+i2B~=pzu}(%3r4Gbe zYh#QcNg_f~0V+TdAr=tKBIG@8-@A=v-Nv$J@MIMsW2DeXksyRd${5>H*mlJD@DjOH z{3rz0R!J$r+>*=eLY8XiV~iwGF2-0W<)DpA9OsGDew5me)_X8|48tJCWT_?7Lw>buk=-3eKnz^tPZJlybNCGR%pqOA@-Jy8v zJ(dQh7}$FTX>Z`iu4#4PX6@HpJ=^6waJ_m6A;^sE$97YwB*IG%;O0gUw)1$yddOcK z7b(QX*C}IAg?apszsKdP^JJV+2E0AkmcI><)g@Emc1=Ffj=9`T7}#!A;PybE>pQ&k z%1OTdD=+Ze3rCsUGt?Co;O5(u;@-V`3=a?UJHPWgoIZV;bo#Nm@=Gth#E~OM_*ehx zU-A9#f1fjF&M-7I)HCHz62*hN^Su4@OZ@)-@mDM?lu&Wfp83fCfn^u#f`zi#?6X5Yf}6;pIvWOys{rH34w>iLm04z1~HS9=s3nr zVnn%uS(?Kt&Xde95f;iU6qn76uirr{gEj^!1atRp@bjPloavca_8-{CKrTzl_i-GD zRLaNqy`2XMTW(t1`tiIH1b%YyGH<^57MDM}#?n#&r691g3_5$sxr123Zg9MAHrHFc z@wL^&c#HCN-OPBiyF(AE3AbfIEV=;%cYmryFSb{y;4)-TTA?b+)s2oWMg44CD= z6QnR;Y_#z)CXF#Z#-uPNz>vk5JjUd~WHESv3#0%KV{9RWa4kz(mL+Uy317IDh&|gg zKAuV8CN>fa%UD>#LYOs^$%r1EF&%ns58bmZVUuN;k}6X*bIgAB6KpR{X7td;P_QMJ zQM3IvYLoB4bqgRZ>~x-VkgaXL4-Zf4IE2^!#(o%uF+`;Wq7VO;`L|y~8lS23GX!>S z>u(0@sjk>+v#tNY(;idd?Z7~>jk(l07}y$BV0%HJl#=nOA-?(RFZ0T)r#W$YKbFRYx+;h)y`}S>0rBY7-!NO9R^Y2~dKmFNj zy!X!KE|~<22FFsHAz@oVVW$A$X6t}hJ(pXe9;^oru6u>YsTjxl5F6neYKA&ZDY>dgtDfaG}WPE%S&+~9>8^^JcmWA(mc%Hj6 zOpP~8C+`fB{Bn;77V2gmfJIsJHf@68e zZAKI}o5ZZ@2q0`ZBy0c>b`27)-RFB45^e(&_JLr#`opY%gv$$71~9@9Cka|9+hA;s zCLtjrA|^uH306wGv5AvdE3LFP+Gv!~!We@xMjK3bvsiXxOy*=n^(iK zF#g6$zc{W^{`76+yZ?z|Q85`DC*uqwrL&FkQ||?{7yJh9L>O4Vzre;}V6&>gb;_{` z2$VuFFr4Gr=a2C9Uw)obXAUsAcLXVSj#__VVS)4K&+{+-#lIk%&2D-aw{5$tiiaqS zxpMg~umAW%{^C!6OrcOgDUI2{wWsKb17xG?OdCL(s%UTA5{Yb^V1qa0jW!T+tP+EeqNuOt4%#$0m5yB@8=85BV@b`)woJ*Dnv<0r4myt&2i`c3>Pk5#dRzk$0qPo1c663n_*;l zn4#tW#>Yk&92~%LY%I&hwk(7cSW@CR4zBCsx;^Hfu*2#>V+=|u78eUl&&=@2#mk&~ z|08bPxXDtn2-;vt8`sK^wuZ?#1Gtut#A-|RI}Qlf+s``%2-kyzrddV)Qw9mQY97-E zf*l_~!U$X(FwQy?y9NtQK?^O6gD^b&qm3pJ3CXhOLWM>+nsipW2D7{~8k8{@Q{#cg zm`5~yWmubC(=DFhQY5&$ySux)1uMlvaVQ$3I24K$cc(~kDDFuYV&bQWsFi?ncVx zS4uI1KkyC1d_64p_Y5`NpECnna~o}Z>}vR}Kp(gJkTr6}M*sZz^DaFpA_B%5Xdk?p zmP|bGBj?Dodheg?v)Mk7_uPx!>KFKpEAE7(u?By#1)HN;@SFJol~qni9n2&Gla>g^ zUZ@@EfYEeCXJcR~_HJ01>mQGx{f1TjM}R~}OpMI{y1kWeT`eb7p4JjQ_gxb!-CSQ> ze7_WyS<4l#o``&X_VBl^(Vhu$!fgD}5#Z<+6-`cM1&T|D3#1MRvTg3?v^lC?!nHJg!C9=3f9OzU}WzjlJvJ{sf5r^32F>o z)l8{M%=NZsZp`#)^tdufDvvqX5Srrqv>__sia>JXn{^ zPl%3ODAb!w*z5_hORE-@0ow^^AvF_$&LpH-<%tFLaqrORPTjRy%}yn7PD@^Wf#@sW zYCu+6%3-oeDB;3g;z1}eO*YOMP=kxBp7gqE?Ij9VCj8`>k zu_zHAw(eK?2wVXe&cznwQK751M9WzETPajpz!B`y$G&vUs|8Du@fD&(9nOWjj>FDrRhi>7W@r;XDeVc39zg2JU3b_u>)=M@SOr^TPVx0_%Mi9EM}%s6iR zSbYwQ)~U_cN#US}E*~bMs&WnmR9D*<7fdl{UMA!_EY+GZX`S8Vg?vZiyK0>~^aJJ}UC`4o?NE6Vr!!b)@h{k}Ub~-&f4Nx>@g&_0fv)ejRj{e$)T8eXX&vS? zu;elENIFo^YzTDXRgEmd>u6}mQ|P#r%Rg5V#0;X1O%&n9Tbzq7HPo?1ry{J@Q)ZHy zrZt`B&Cn`6!p@T#gDgWjtrGGdz%>TeAJj1X+!GE~EcWWXdum4?-K83NRd2EmFF1Ev zp;kg13BJ9hZ;t%MB#{H!YK8cFIuWZr=kAY57KuePaEymwfOq7X7JI>h?N;Rcq1XXBP=36EO&>Iq+O;GwYDg~Iy(?y;i-?E1GYp`*BISG6G!EGPHE^gzk~gP&^6VTI-#o(xcI zy1&__kLwRi(cpPJ_>ps^!^drP3~x9_RM6h{WK#2?Klo;eZ6aMu<*Z%6E%A39CZ~(j z7T&KRM^7F{_afZblSG3x-vL$G482y-;9Nk&xDx9S2}w9?I)QZ>h=hC+AqK>i;4&A4_t?pI?_Pa6F)YKs~cV#c8= zkVOrI^=RsKH0kCTO4Jl>0Ne%!TU;GB)4^!<>30fQ!#l)?Dh@vunM#ztgv->AOiZvf zHr`B3PVxwf_MfgHz*ruR!gOW{*KBb;Ujzsxm@^r7v9?C>6Ff=rbe%=KMMq#>mWaRg zKkmGzpZj6S#^R+f{J{q%3W~H$5%Hu-d0XaCskE2`qIzz*1Mg z<~goW|LJ&8?Y^Mavgy1}RlOrgcqr>zS9E!wC@P9T`=SdeO6~or!C28g7%Y;$Q`PMW zlfRfV*2vzNzWh*oK!X5NLa*_=+=9oZ5CeOAr)6dm6A}?Ae+jRsV7B;lHRv@N-IDX2 zdtws*;qY1i=S$6!-^Cg1f~`fsQFq`HHn(D~q5##iVlA<$*2p0k(?}Zj_Z{WN;dHhFn1`eMU}yrk|9*L$V4>1PQS$CYJR_hvI|pmxe}B zAGMfI9SK;d-&cfW<}w(Wgvj9TmVJ(loV6+X96G$^eoGX%N=in$(1H!f!xB0a`tlO> zi%c}j92rr+kZIHWPmQE6^d$I+I!yrSj_X}!QDSOnjkAdhMVL&yg}3=&gD49Z2ytwH zjz!@JI6k|a(5HnMRiB`(vXEb-!&KyV$k6+lL`rRb*K40z%#$rNl~6~;xucXuPQ`4s zubGW)b;!%vd3C6PF3nCnEL>;tHE5YoCSLR?DUvaF_W)Cl{?y z0U~h1E72YTFFl{oMnt%@Dedi!VlXpCF^aRnX6?>z%V&svQ#t(Yj;>~kfxp`#Z$tAB z*Tn_|D3AGYQcZh06+*X~=R@cB0N<@(_~vPBa|NO)Iubn1JDzu&1^M<#wegZy!b5qF zXcqn-beW7=M6^b3?Pg8&y54iFg^%eiVIvyecS-AyhsR>q{SsaSgPZb-2q438an_NF z6vzhA{XBc<-*=x+vD<ao&d*PZ!A(-+%edX4)=y5BhE`h! z41MvTQo~+C{-3bl9`arg>?MO!y8y$vEO5(bdd!Ax|5n5;o~{5eZ?q@Wy^l(Gj4zQ6 z%yJ)Y=xr1c`Ya-#r2HQ|AY9tiyo1xNyl?O(>A1v{Cx4lR+%a-2BoVIOa}Aq#UurhR z7_nHNOZMdDC@63*^h!_sp?lAis8N=jwr&*V5RXCY$uE~WcGxC7r;1)&X{S=FDJBq| z2~vDN2U2bR1Qs)g)aefNJI`9wm=KXp_uR7IQL4G0IulCT)f9W+m!WsQJbm}ry^!dW zLp65Gpnii3%`uiJ%EDs%{yxX60%a|3b{wrgYI-s|55x3ndeX9r&`g);O9{e5kDO80ff{mWVK`ELu85LAK1 zNH&f?Z{rKzkFnL5XyI%ZzQfLfTe@=(hvFDaet%WCr}>q6wQ3qt7ms`_+c$LFGzk;_ z58dK000@|O{cOAZ1?K4VC+3!8uodVWF8rAYaSprs6-O2j0qdNurTu9w9jy@`e)J;z z4#}J}@ygeb*%`x2BL$1TIvOz=W~bSm;WRz^8W&;B$CR7o`yS|yH3|}o{S`Y(eo4H6 zt*ZPWpUCaX&EctoeYSkpb(_AH$HBXGX65!zSjYSPs<*(w3!IpR=EMG3NfZo@ zeMT0@M}v(?1%yW=pZ8Ut`#2@WM|lBREfr=R(KZD(rjNw3h4ZF)%9AM|oc40B@s zjb|$Gr(H_X>9e(MeYmlS%v!f*yH4?G$xKR0`7G{8@e-5&@d=j;hBtmuKaMsVEgEu| zV=`9?qeNYIsjcI#(S`(UqLw=xDD=>Z*)m0y({=vUO$DV(a&WK);J@NdJ!M?1_rha#sKSt<00nf+vJrACZ*UlW{?v=~36 zZ2hAuksc!v`cy8!N5V(qiHV_ND)zf00tcka%TFi+whF}ox!@XLn3x*%4W?nG)zwq{ znd}Df!=lvnrlfLi=oCf36A)1NCsk*7bM%CLnuYF$#`BG7iEu@p z!B!&o{pgzFG8J!1T<)_-W<9M@bN|1w3Wkt;?nK03)cSLHM{zH(QO5g!eb`rkyDuca zqsVRRov|Gje%9+M%bBs`d?ix0Q-n0il9tOMi=b5ymd+|qO2%M~rUk?_?Hc(#!-@(~L@acUvujp``t_5@c)T zac5Cb%|+&PA7O8X$&DiTK9lW45pDbn_N)Ewp!k6AmIDJZKX?Z|Kt8ADRQys`VBFdg z;ao{`6Sx_e<{#X;HvTl2Q-tz5z!3W{<)qNp^OG6k({J&g>QO^izmR~d&3SG`6QU^i z62cb$`)q!{UjTQ7ZICWV(XZnk!mr~%S!cYo9pm>Yt8{WgN4Sw#T@yX82N0b^0=F78 zh6V{7B%1|_>X)B)90dAI>)k_hxA&h}V|_DmPfxitxZo1d-J@+^1^P(egWnp3GD9&# z!FXvI-Tye)%&0jgbuj(|;Z6s%KR!)w6@MJjBhjs?MxFamz);3jD|_`jDlYd4k>ism zdWqQ(ls4{B5mK#}bGA__MYGOFaQU>I~}XAyLZUzRKS`9L^O zWr1bgmCjv=p-46=&pwru{`~^ z-ScO~iLbR*!YBb;iGJtC0|hWPWYO&5mn?)FM*>20{^gA6!ljHy0YreHN}y2d%fEAP zp%3tg{Tz(B<2=pNrm#mmo9pd}@8WrOy7g&@UWt#`EqwNGs2zwY>kzsQ2QaK=SI->H z`nPECtM8wWSJj0M1nt+}*gdtC$IGGw)$%=MYmL~yS47f)*Jwx2x!|oSejAqAL`>mS z>6-5UPOVl#E?;|x?O95)J03_L~>^B~Kati5D4lB9CP z->;7NkP`*XiPh_LfBFkec23n4-P$@VA09op!O(0QSM1#5{J9&RnRs!v2)i9^*xzkv zug<84coiYe-`~%*m#XKw3bj7}jD)w!fk0MWW&z z;`Z3K`*P*`!uL(fFhlcP_dS*aF&?Al>sBnrsd#)IvBg>ccMC5tx!np+LmgK>A4??; zqrMh@*_+O9BMX$HR-mfuZ-#h9LV z(W~N50XMEtJGYp)wg??cxmhs%*6NlZGwV)b4~L@2e$g{xTK_Zk?AK?D$_T-Ix}%ox zK@m@aWuU^-noy|e)1Q<6-o@!(W$0LFs$9ZHR}%+-5v<>d8iYfj!jBVYKCYMN7jGFm zO#m>}K_V~S>2RaY=i75kQ39-51R7B#@z$EVLwccB@8H9xmrrGtKvS((j?lg`5b$m? zV(A6UnSuWOKA~(j7z}{@=6&M>S--2t=j6&;qb`WqYhQkR!65gKK3$e(lk9L-SR;X% z2xKQKY(~KxljKF-wyO25;ND`p}o2xk4yognWe`3H5Wu0DI>>hA!n|h+c9wuN_ zpu2&h{rL$3`DOFPq11JiQUTU#*tS!fptp zT8@4E`vMTSdw#cYSlo8`&GH=LvF){_R8(RMb=8rYb4-}2({glxgIGs$AQT<5t zFnKQChiQ6akd9E;K0EraJ3;`QslWPsQ{!=u zxfRPABG-(&3qvW&qubll_p3hEVPRkAN^H0QDhC%MGp3K*(34O1tC9!td7tE(NM^CI z=cag_FPdCC;N_k;aRP-t#4*I7ubFoCsBQE9sI>-ATt9G6@G>SNBAUukZ}>s#vR+Y6 zs#fpDFJbJhnxWJa6Efk<{mTkI*W)Xq5s}%6b)&5=$$!H4LD$sU^)al!)JpTL_`E=? z*SJ88B(N3@f(+i6OC;2**=jnIuzyMqTi|kAg6h=SMvOkc4jU;5 zRoyF}tCX;&wNuGqUj*H7lRmpU9?j-crqzUGU%qI>iLK*LGl5DY*bC@ywKZ1%6Vq!; z7Zx`$3{SFH%h%g<*fK}%UgobS;>`c}v=mCPN$%Gq*7S?3UoarQ<+XoPmo4>4J4|!~ z*Sw>`lU(M<{oD-Jubmut0OdEF>2$Y`KCiNsS2WG`w8M(^x#G}o*;0NSX*i~quP4r( zXFa{^cyYE}?JgSvus6n7f^~ILbA?Rw>-NkjUm7dLnN?+F>*Eyr)XUX0lUZkICDSLE zN!^48hJT9DoOufxiPi@^ZF!s&t(7haWZ~amz6t=TuQVe}ma*kgg3kH4&g?#D0}$4g zF|2{b)Bt@3-2G^~e0SkUi?fCY$$O0YK>T_p>bMQq(s&NhEk0TGZVtQCyI*OFrgMVkYa0Q5^R0UU zL4af1+_lYBB%~*J`EOH2lv=h2|FG90_WKeEbM>czaa;o;g=9p=Dy7l3p+@pb<9%4y z%a71MWg0sN!w?-mHo=IbkFl@Ir6Q1D^$mnTk~keY?dW2&Vv~#l-+R2PQ~km@JeD~m zgIsAhPCp-n%_%Udea_Va>=gQ!_MLQl9#kTV!h(p85&!4mx1hz=e~karSVbk|Aj-qP zT66!^sveI!E32Xu_{PW#0(Df3sZWR&^xAA}K7M zaNg!U=d_@UORqDJ<`+Pj&ZSx5joy1CeISI*9lx=M=pdS}ML}0t`dy*WT-Id|s;%WC zwxiD5LtqWfXR3DJ;;Gi284O76}uS039V=Tvq;RzLpqWDU-ijSCUWGHCVN(VYHcSD%3 z%`SmPp7_LT|2yB@Us3$xsXw>}wEN;uesw-A(!XB5JyHx>H+@H0i?2|mvKof7qQr95 zT8!T)Qqoi6&fa_7K_*mffse>iF2E)q5c5Fb%>XQ|BV}ib9Ir${O&3~Vi!@nTvGIFL z8bVCSaS6U;V#)8VyA$_De&d=t_2~@Qe>dOj3w{lz>s};wP$70IZQF+>bST*dlowe|u&p zBtjcVmbs_i`t`LP1J$S0AL7$5ZNulT1ODlm@)Vn=6;D)820=lYVN5K-I`6mT0k4`$ zHJ^bm z^yvLQnD+oYe%<^OL1ZB^b@&Ii52}>N;DVtI^4Nndh#dkB9;Y||p_W*C9Z2<9kQj7i zW_jb{or~SV=)7S2PgssQTG9J3oHIIN4inE@x*gBS7Rmiu$bXXph%n!9v1AbnJ&V)p z^b$7}bZbWjL^y1lE!VkD_DVB@sV*RYSJ-p`fz?qz5t>SQ4EM%PmL4BCHwyjFu-wZp z&&b~OqDF=xw(>;ae4Km`jGyck$=WLDmR3iWcjpJKRVU~9|Js>EV{B&fp~PAIYL%F6 z?r)&JJa^NJ;&p-8OEF%=DphwOS=V;=3GErMsGFv)=Ji#Z2`^Ox==JquXLwx|9Sz+q zw+bT=z1S0C26KE)(m>n&!=({|#~gkJUXhq<==FcDsZzGq!z(Cckuj`KL7?HtFXVB@ z*Qp7Yvx+mIDv4qj(=kZqJ&4eFt^r5rX^*C-R{Cp3O0OF@0V^2 z`iV`8%c+0C+x5UbI2MS{op3>Yr)I4|p{N-b+Wosbf1$3j3>zRQK6STE)r`5T3(q)Z zJCeAp#4JU+qtcgy&im;y{lMtcJ>Ir8ZUMbta7^@HWu7Unv^|#{PRJe^*X?w#$cidL zxn0UmxXwjyZyLu*4IlePCHPDWyHiY6u4>5AJl%_9*~N?NmY7{>cefn00e7_(b-N~=*I#)*opnEo zP3MYF3~X#mAe~+nrlLWT}LI<^%u< z$fu%sTaOLzb4i&?zfavdwY4-&4g@H|wEWtM?%}uZ?m{_qiY=nT)w79V_dosm5P~}LB}f#s)59TPT4grlXI2B-2m?U{Q0o&ut3@jrYKth~7Aemt*l>-NPL2dI2jBMF>4ww8F+^tzc<}D%h`LK-$cBj{izB{>n4IsdQxsBa%Mj+I@ z>+_9%ob!5*W>`LiZX__`2?s-;6tRjFqN1VrbN+MmO5gi>b3k#nMIsl3LWjWUyf12} zSHhk&>aIP~&u?d4eyL#Vml4eLB ziijLgiYqeo=SlRt7~g;mdrE{vN>B&7;HS2gFIu1vYDunzajOZ@^p&+3Xc1EL2{SiZ zT1wFjo_ultT#{Ue#G0}G@-birlVw-c;fE#bL)ShoeOQ{8XJ~n$wj}av1cbF%#Q+pClHABYGfJ&7F5SoC z`YI|lnk_Gg#A8LZsFC07EL~%%8_R7ZX#l|hK-VW;5CC3Msvp$i=vxox*s2y8xbX0t z<*k}0OsC21-(DnX@8_H{Jp7zhxxjJt-j_O&I!;QT)z}TFIBGIG&;c&UrA*XZ+$U}L zEhL9QA<)>VDvb`J7JosM@X34G@N!+ol+>nQQy`#1d9H;96W%bk^SZ>5mw&$}k?XD2 z<$2$@(+o~ELzO4C2bK7=_MsGn-UJYdgjj-8y~;P$B^fMgXx(i~Ts;VoQd`dLotS|uZ5q9a!SsrS8SUg`vl~%sV zDgoG&rK(Mk)15>4-!02Rleh>6iOrZ`Z~8uB^V}A==(X89)3qD(4Caj7GeZZZMIo}t zwpt&etEi6DiMck5*nKKpe%o@&4&2wDsBoBQkd=848aJCbo{%q&lji$7DX84!FS~Q@6ngNKQqtDeZU@`iyoI=;zX_a z{Vu5AT1W{x?#%_!62@xQEw!EE&IyP;dX|p)Y8+mtT>5ULmpVIEVB7gOuwOPw#aeJS zwzF4y+o8u=$f(z(6HArYxN7m z4tn;k?e-FVcVaj=D&?=`ylUmoGW=?ocsYVN?eQilLGBucgZluj_tbezc&0BfHZ4Q~ zb{v_kWkF`@*~j+D>|+%($H?g{a}~6yljm`d_#CYfIDX=A|0Ll}sW8D5NUqz;|0|Tn zP3HU^Gycv@2HI-{y(QIkZWWScV23eVpEGF~?{fCz6*s~AZA;u`_7E0BL>xUgy)6O$+43#Sn6|M@nqM4}yUN_=?Qe9`aZ}{le^Xe@`2B|E1b%Al3*= z0>Rz2{SE8DrQkeR*Lv=-6JJ&rI^-mdE>cr#RQf44sCN$6Hs`=%Kw%EZllLvAvzcU#P$3f*n*Ot^j0M`^y*fbVUd0msemCYk9U`((jZ}-tER=nhk)h$z)Y&O!sf-aoJb?D%O+ zhVPQgBMhMGV;7=JI|>I@g6pyCo-?#m7|s*^-1ACqQZnD4>>}WMh58}uL;>OjN}Ge& zX2j=x3&B7*OE^Q9_It7=Rb8#0;|J9b2dD49z-U?oBYyn&new>tapN`STvV zv-yH4__D)t`*cNYuMRK#b2H_kB!8i*i0ia~ntVyLHhlOC20$N?idD>K*_%bL8X;ni z@7JU3AC~IUovo3~Rr!%a zz3lywdwTtLU9oL@&S@8NnCU7dN(icxNzcX5CfMQzr2h2VMneM z4A*NBLkUXixafX7L0eJC%nTSJ#VDH3 zE07Cz7E|Uq()u>a{rHG2f8#Au(TO`LSVP z*DH|mvj?Y~kkLBGC6G?NhtMuRjNZ`zs*we$>!mLew8ma!=EAw(F~Gzm#aVO+Sk`J{ z{QH%nfgvswEO#6on*VgLdI-HHXRMjR_U8!#d#*)HGdnmU$=cz@;<@}Nuj5RKmRl9k zQt3Ucq~3VDGHu&lJTvp(lc!5jz)<-o#Wucws+XH?DKa99eZJRAdD>fTWd0!LZ4~vn z*V54Qww6C1mc=muPRJ-o0QEAdiZ8U5VuNbiOc7&z&E^U~(ten(Swiw8m7)SujWHBt z8UIzC784Ne4&enSI{8^Y1Gh`VCRp*e3Pf9qjv)k7xNq#%Xu~V9_p{_5=lDC zQZEu6793}!wdJS}BuG`>7?sJEeUJ+yk1f2Gx56<$--cPjirLgj(AVDZ7zvUqC zuHa%9fZ|HNoIlgE7I82wtGs9o{jiLE4vQ}} zdfXdC8e$Gz7HQgU&_DE$E+A1`KAr%|^;pJlZxTKciWZB8Td2*oA+u6BgQwWK)HSGK|6F5WT;gTDqSh z%sm`^fbHQporRyMX+@-xK|rd02>K1zU(tk7wwR)fQRKwTmn@XdG;sU#P+92E+wI4N ziI^Kd6BoDq`KM~>VcAWw9_cq-JpTI~@9yn0TW;@Pv#tnz0%)<)R$kuLRG?51YpTQ7 z6@h;^9q8|@pQVCfY59U--VwuYzM?trOEh02mf6G2xiJ8Z8bmRA9j)0NOTOg%{-%T! z1e(B6efw;;k}V=Jc@wa)#rgUt3m=WZdHfgwi18RergG&NQT-+9pp>;ABrUZZx(wwe zqmvRc>TOnc?vNQA<24jhuJ!!(g+JCIUAqzu*iDI%Mt$z${bf6 zrj7R94hXB+Fp&d!G<@hXX=qt4=Bf#m$5`3DRLZqsWW|Oz+y4sK7U*V`BcWQNHNdvY zM9*dWEp)(9ftM(W-@xjS*fY};0Ka}3Tiz?ZbfED7(SlEd)HxYI(=w_sEf85J$~y?7 zKF0ar;&}H@3SDxa0+d>drKy|PQNpy#X*HO3URUhQKkowCT{Xvr+;e=0a*6({ZFIaU z<5Qx;UC1-0id#>*I@->1I$Hn4#K(Onr%!vuQ)Hgfn67_YD0+T)n!bWwh(nD9>N~E9 zF|I_(lxD3yn67Ko?aF!8b(DuF661KU`g27>T}7Nl8JhKb4G3VR-N!-QKddRKlfup& z;n0X$^zecr`Vm^ku`!SvCr*a^1q+Fm zNOFc1r}73W6a-%PX3EpzDNvZzN2xy@XA@792?rdSoR``{QI1o-yLnokPJe^#3FNCT)N5_6@D4m+YWX9#8@gNbuOeV1h#`ROr%A6J;H%#8tU8G zIfD~K^(q9;q;x2exfL=!e?@qr7eGA5<9O8(-o38voCX+Ve+|+Qm(i-*y=(q1@VQ5$4ShOK zzey-8Hi*I$uvj(EiZLG!UKjvgJa1u|1wRp-u5}Tt&qS9<4mLP5Xii`6+_+s+N<3kH zY@sbnbk!wp9NR zu~^1sz7Zz4P_vT`dshahk6UR@=jY_~jvUmZBcFcc{~KY)lKSP4M_GpwOvOC~b`1L= z5zg@L&;)@Q;F#sfze-m#Z!d8jhrG82;T?7LgBls*~)jcsp0quVdlpMvKnb*ei4?f z6;dwXkslnh61F27Mj$Ijs!-;uNt+b10%O=}BO1qK!q3m(SbqT8frP$A&eJF0D5>v! z5TV0JYLL!?MhgO8xAK3uko}VRz0lgEBP^s6T9Y&euehDT(4ZCGMrJ~-*K+5vZ4~!5a5n1D4A(O`li;3?e=FIf&6!J8{XDdVc=qC z_M;J$(2mYv(s8EZO#>%dnZ)eBIPTKAHP!N&$WA!T>xC_> zA-O+`mU-?WbW!4pEcg=7>P&>vZp=&WLv;6^e7QW2BrN%g`uue(e$Dp)tG4q!>u9Pp z+Y5WCgU9J5-SnAX4(Iccq!t?+1l9Gv`u=tukGz}~=u(Av`Q5PdQnWN*B!{%q74g4# zc94mgdn0btQTOyZ)?=mV_PVQ)4HxdDGNqM`q)%xzOj(;CJ9mWDuw}Hw;pv$tcwtsJ z0L>LiL`FT)l2xqi=Tg5oRI8z|XNBsal{ip2^=K)P!Rw%9i?k=1J@_vOxaFnA9RaI3@ond{F; zE&O7Z6~`KQi0a25ctQ*8MnSZ;DMiI`xSm#2B?%0e#e6uJ2YfwVEpuC24T>Ts zCeGSTBzmd!a`2(@x~wZy)c{g6h_%#Vn!E_s99 z_0qDBr@?z%*c;tZl#-WZr49@5p)T1sXSs>wFLCYKRx)rQtjwqH%f~8zWx^YplTj_i z`=R}u17SrX0uIK@W%{m#l|EFW5qPBO?6H-Mu@Q8H*b!BYs-;Hgcza!j%gpOx$fhtc z^3?#YpbI_&Ok^iUM>*b%tYG-_%{y9mg)IUY+uP&s2p#8z_{f3ez4~>V4u6L=6lm*!j3OE)j4U(4Mv;v#G}c#ZjL%Y{)dvs2_r|3Amf`)_X}67V(&q;*uaw3* zaSFGl0L1(bR;9Zpt9~a#lLU*83Zgp6A&>ipi=k3Do_;ygzG~&y5=X)qy&8fNu4AKr z$n`(WB$n@fI`iehZ!(iv_4EZ-Z^5whUMStMoj2)kYH>Zav6>@8h zYdPEGLZOvGFCV41HDWyij_4K3hjzcq{TfDm;)=M&bkaK1fhIIp1J~E0^m0mplzXjR z0e+WtsCLS&sQ!~ z9c~d(i%@`1q*wyo&v&9^#l6cY06;oc0zPVSDRj|)S2!VFw~<0@vyX&L7+^x^D^^aw z`L0Rmhgwr60y96~cdqY8e)$ON);}pQ(6LbJ&k!P^s$L&_7NH#Ayh}6y=^23!M5{0f z4P!0?0pn}+Ac+|eg>;@XU2h8+hlAXs{<-ZHKK$n3LsH0$-L8C2Q=wV&Qo7FENRF7A zQy-4BRjjoE5GRiR&1i?zc$YF3>y)5nPb5AGEH{nbUCMnBT*}A?6A_7rq2n6O=I+!^ zoS<0hEwt2+D}N46%lwX`13%q3C4PJ!ad0l_tQpj@0_#cTV+5NH&vn@>HtMja2g;fd zF?F_RMl855go=>zONZ|moF-`gr6n_ipi~)5w>y`W6B(+vg0lC#R4S-T7OgE(yD!(mhak~yq<4K$egb=sw@ka*h~NYEP%tnMYKJX*urW|ReFbFm##MwyW^c)+u~eS1q+W%KIPU()w5+)@OpGUtYwKk zyoifk&sdO|`dM0Px1c$bA`Rg{o8^=Y!pYmryn6j1gZg#WLpM8%le}^xP1ajf)E$IR0;-~$#m!q=eHvcFO-68$c%b5XxN>{` z!@^gkcA|i1E-wt6sXSCGQ{2T9xfUv`lzT+)v)j_c_V04o-Q4v9{e)jbPlzbjv4*k# z=3hQJo)=y`ej@7)cT(Es$W;1#GsE&+$N;k7A91;8kIXu6k1-dtRAI=9X}LlpP-KST z)?~hCplOL)63dq?O6}Uzz>proF$Jn&6-Fs=$YRKqpx54~>(#Juc*MS-dJ3~|pK4g$ z0iu|Illg-H*REFl4rGdW&jbTV-E5C14pwDIi`-^!Z^=pV<_=c7nQUkqq2TN|!6B2U z-44+RoI= zyf{qOcnXo*9Q?eON9f`mkZw-ZvV;42e8?<4=|c~rtNpOo>hcdS@(NEH2?oPDSPPOs zp0iVOfPEPu`9e5oO+4JNDug9JVjm9lBSl6+2zdBaC6eaqeUx+?`g3m4jsYwMf=vrb zvIZe_qc=6bkEu7du0v6Yu~0But%X1nUB$4qsb&+Onjw!~EhboFHLr&^WsLco0_$Gk ze6VKiM3f+SW_P%vD5TCnddnbO{kZb}V5SC@RD9J%tF^NW)@#wH1$DW!w~su;Q!@E~ zz>q~EMGunT`?e=e*_KIq(f*}IRDhdD1jjAUhzXWc0$?RXkQ?^>OaE?0>4KKv-ydAE z(9m^+&=(s_5Z~cD3G-5YM3$YVKyi4S)dreVWU0fs|N75ccqP+aa=ZT!<-~y_C{ADI*C4=rPicR2bxJiw zNKH>?KP}yMQf|dw z3Y{TcgyJQ^HV}^*cbIcaNTc72fE@%X)dycddkmzi2`+UX$cv`({9;!(eG{e_C0#Hv zX%W!_O~v>S!?hbJPOaB^VRao4K)_A*S412(%{bv8bXeM&PSBX~}W)#C(8P za6ivO6V2bP5T7X^C28rjVQlGk6I}Iieg9H=1wt75XkqD%-`MD95wHgg$laJW{P~ya z4ljMnfXG}EokxXhrbRy=Bk-izheZI<^tLzedj5?m`da+x;K?#rBEk_9ofaM~(ENi8 zLO5(npmpr1=Y;|2^64TV!$;@ng#8@}arnO8Qh7NzEEN8rWN&th>rHASY{!sDtPe&q z1y&)I;Ak24MQ~N%vhx?xK}zS@gIYux>=Th6Zt7*!1?dTX(dx_9>K0N~jnW3S7x=7j zz?fE3_hC^%urxhBs%^O((teL7sUDXl4&`FBPD-@}Z{O4FXbr5h-gEBu=lxcTtIBrp zm%oJRj|!P2&!{RV`JeBv{XT^BK!>Ig0~Cx?a-3z50ee*NSYzLUTcMezh1W#d^rOsp zpHf(#7Q9ti4WI+$1G_M+FxMHPn>l;P%a6^~hyOLe_dneh@4{Fd(rZv-l zYP%rzQPfeu3eAoqC;RLtLafDLfk>zX_LrU@<{49WK>G3DP-AQXFLu`^l=N7X4`Xl` zY6UoSGj&|@SOuw3HyfN(f0KHBkId$?i0F@xOA1VIQQD^he^k-aIU7>nCd(DqfFf#8 zX4gfzaWGtFZyTp5JJf1F(=)D`q2vbreAsTts2IYiV1s|zd?km z4FN|`6?*$;`yia80Qd4mD0!SH3>1MOh}p3vi&6hC)EX=0{RRg;JQ&9vbO{IDtS17E zJ!q(E5)vB_q;V)=i97;pK@o1t>;fRH_vgO0B5YDoBagbktO=XF-^7B?H7N8`{^ED^ za0WM)XiA)6xaa3D(94;Ka8DHuCe`1^wKrZu2nL2S-2UEcx#gW#bLH-B437=O%PE$I zVwyH5j!*IYGq3Z=1JCosqc1Pc5-dBhPa^^Ydl&>Rg@Dbi0Am2yJ!u>-r=CS&WFTQw z+>674gMru6sM;6~dhhy5fP?kQh~Z#+{q1cy2vLYVxVZdzt3ic@?Uv ztO-AK+5)R z9oP#n(5HKF$lI_P1nfO4z_8D(DEGgy`%7dYVQB8fF&qr){EgvY3=uG`s+~uhLRX$Yc_&O6qTCQpi}FwTJX9Ti^QN}5H5K>AVBDEI(>XFy9x^&x(w&%}CDE+A}VJ=iVR;w~j6iQ!-u;Gpo<&d9*Q`DbD{*j|4_ zPD)a5IrOphpbqFNiB0l+5)u|9A*owj1OegFxoHrGu->a3u_A2awP1CoPJ+T#W%z@I zF%XQ!+acbQ7by{Zk-aXhG7xt$e&D=RM2?h7H*Ab<=xpD)iT8ct4z9R%3m0x(7X!dp zT+5kLv;6GkgFN!!UViZ1r?4t^>xJ8qxPd_*ks^RHnkgI60fF-naCs|L6eglyJ{}&S zL?@&fBwQYouxnO?ZN(pqu=QZ4;9%X0a~rEBhJ#DspqD)!CnV`#I0(JyS`5Kh587BL zWg}$*Io~dy$w{j2#2S#n6belx5SW-^uJ+AokW?ZnfUsU)yJ|(~auIeE61J$YqoA-= zIgMdq3boTYc^z9E4C@i=j0jRLY@X&5*C0!E}nG z^bv+q;}{~<;GFXY2n_`WNo-OGQVWuh*mcIaUU5AN2p7Dg0-4%ghJ*_$?l>rHURHdY zj>W&$pXb>vpnxX_o;((#W8RWb1RS+pfYZ1O_gIHr=rX6oL1s zdmP$t-6CK&)K1NvJ1fFQu?V9L2z^)&#&FP;ni^R+*w)y_aB#)J!NB%o$Z-ejEr||T z50>pbX9@?HEFQ#mDr8bgPUQBnc3?Xb1KTj>^*~qd#mxs>L!l`h#Xv0yNolb=aow@5 zw}rz3gbSW`8tr=zZpL-jN|08BF52i-9SQySmOfmMmz|@*>ZE-R1V!AeSXQ3&@cNQc zGCDTQy}$T=uDf*?J9b@0GL?wuG!{={nl@8sX4(IVc4hj|6WW{hWhJ)=LizFRKL79k9?P;^ zEl8yta^=&!b?Ql!Q{m1V)}b85kDfY2**wcec>@FKafFcJ95CI2ff2U~><$PNzFQmr zvd`sMs35+VDx7vNJsY9`2m^^d*bUcW7jQ6)sSE)Qx;Ija;b3dUFNT9{RS?G=Jijbl zY|Qyz_MR>rpkmI|fMAl8F+@tslB=9yrgW5F`uRKfSAX;cCMG6OO7SoMRfQkE|5qqm z1+uzA2%lDWE&!pfKqpmmCr)Ei#Ayfy>y3B4rl=MZD_r(v$)8=h883Oqj}_s9_risQ zE*ELntO;A4v0kkT>z5Y;!LD5%y3kG$4|UvrA0J(>ce$24QZP6)z$bt8qulwv+qiJ^ z2Beh45{n;k9L4Dq)4crRAs&DDMZSOE)7X}Sm)JU{UEuWeeoS+Y&;H&o@pGU24GM)> z?)%&SkAMCDeud*xd)YW~1L?$Y%f;T^s0dwxfjtcZeKuZ%r3FUqEObIxrcEw5s-1ZY zdQKt;2z%DGxSJV^V>lQ*9Hc=8=stymK`b57Oj%eVaR-Ck<1VcSOXgV)PCtVqD%^DS zI7vft;Anx9XAY3F9cmvP(F^Lc?g|aCQd>t4T<7 z6oXjj+=(5`MX?6mjCsALsFvS1_utnhZpP=fsYffqdTXU4kg!dCqN|{=)tReWClRfk zyD<=qrMn`#xl#J~4i_;=rIWnlp4++o-8Xaj)t9h#!1kt?0xowr`X2R`>LR6(P$BtnL|H)q@A``Ktron<#%3#)XF0c2zxN@ zpj^OUlvJl9MiNoX2ERoD8t@Bxm`etQ6fRd-?y zgDjR%P;)1C2L|iyt$I!I0tj36XUU)aSP?c-q9X+fJuKR;gThv4@M1S)J-muy=?jU> z-9>b;$bQZ++?j+Tx}mXl!vsJ7OZT$-)?IAAbW>~v7)#qyDpfds`#oAOz`)M92uBhGwhaJR;(6Dq&yMdE;vW=-2?_lH!f03z1{inHFTW6w zOefjAbsdJGlbMY(69*Gwy4-P8BIehh#}o9 zIf?&CX^@}<(3LpnPHbY}h#Uf|g*$Ppaj&(?BmVG~ai>DuZg>QfT zQ5;7t_yeeyJsY6}a^voYQYLKoeZOC$Yh6Ew{F9-cLxTCSvQ_x-+|*y%?*-Ct;WzZB(y9-3ZF-t z2xuGj2MkBLCQ!| zD$g)0G!j}GT}z_N1XAdA*KR#PXk%g7rP?_^A1Xn^5a|VpO56iNTO_bCu*jl`3cAXn zQAS{Ua3^-N*XlJXXe+`6e{RQ$u#qC}0TQ|`A{ae108kjP`Y3j@O9kK2zNaJY)zMDY zTG2*3+ttzC+V6JqM*N;BHT{msuk3RopuDEKq>o(={dH&%m|B>JN?LXu6^jT7g zA<~I41~U_6Qez~H0SqHsCj(u;XK_0jg(Cz5>w&=VZcvRL=`;jX@#YR(H)}Iqp=XL8 zen#t#x)=NIn&W>y7u1tT=zQ)keuZnUzvLVYbR(6r$s-TF$bb3bcX{i;sm^UP6?`S` zk0I63t+Cu?FX+9l+JJ)%8m8Q=N5^#=8_$h$S%wOCZK@Co4`V&5P&(|Xt@-j94o&aj zH-G(ZKKjXDWAnBv(Dl~#Q2BhG|M}(r%%6VlJDi%H!BLRVG9Ow<#R1`gwXQJb$mZp zCAJWZB^ICOSY|NI-5jz=H(4v#(dI8W|9%<(fv5yBvy8fAE3Bg5GZBol+J+blY8IQiBXdKm_W z0Rm+};~IR2`e6>H1qIH+@Ati$fbfw~sA{w1swf}3u=f}Ojzc!Gfd ziKM}u@3@+0pL~r|$IntKm3{WZ?-<3FgZ|fe6fFnq*W0_6gKbpMD{%*x&3EIsY^TCh z@i2y=^O0ZpRkmGrmFr*LX0us-?w5a!yFd0xP8~bQkG}mKzWg^o;@IS2%4Ug#KFCmV z4FicWKv6VjnJFD(u5y}+mBUhHlDf|DV44e7rO0M9Y{wyAs8A@)QLb3n4wNc3m5PmJ z+qG~wRRE|s4+4eINE$kh($KX8DSZH49|mn0AyObDmdv1QtIhHae6;b31Nz_NicsX;4%Q1Y_wDG8Mfht>3toPyAmWXVaw@ z0&v0R^<1%gJK2Ai<-V_ek3zl}>Gn60!QlZu@~IDS;~l%XbjMZ(M+W2d7faw$O%O84 z(?5BYCmwy7Cm(you%+v zCysII*g+1y_7aai^Z?(!|2dAId4ajY2{uk#N5U8g{vZp*Rk(97FkJWGph2MY+`CwU z6xHS;tT%s-yLtt!FAjb##XjLlEBE4Fg@cK7l3)Gx4`L+zT|pd2arEdUm5SN8!F>-0 zmG|us!$B7V)8lY(*|`;wCM_J62j&VBoI-hv|ZH%wmUus*;Rbv|NIQc4!_QxM}Np?Kl``5b$Sm&sWm9aX0~z?DPZfSA+Eo23s-CzVep<%r<%Ap%0*S&JJdCDAm=XMXd;Y}h#FyIGcLa_q=t&6>sqnCMG5=%Z6H9Bfcd zAHl(8O^ImS!9e$Aee1zoX_6CXUuDDU2|n|Czs;&u?RhvEhQa9QD5Im-ap~o|xZ|Er zaNpnlC%*LM|4ufYxngl*GS6(j!r5Gfqo?v5 zJ(c6c=@KWW%S=w^IWsfKq(q32-Pr@NBCPjf0Fdz9 z7H=aiVZAwRVNK|zsNj`CcNORrDu~+uYToLdiCMBDH0F3XBHL-v{y?2LdYZre!Z-M} z-~Sg3jt+tX(=?erHH~fCk)F6@I>G<`o1fywyLNNwm0M!~7)z*9ES5QZ;1oZ7=tUm< z-ZQ-U+VKS+Dd|Hqac><6kdSFsk8Gt-nc}a$^g~jq6ue&UF~o4t#okvTj-i`r3aEmx zU5nf9zo25}nJOGYXcqtRFMo&aJFfNo3*c6|-UxatoiP@*mc<`pStIA##d#Q zcR~q&I?9sgk_nwn>z9YTDOW5`PZycXo6Hp|oH(6l|64P>ex$(R<7avE$RVb33aJLk zrq_{44wKLX0<~b>iIBh7Uabh-e%n1l!bMx$r^|7@Ic+qr&E`6E*JHQmWVIswQ0h$* z7^FlBy__WFq%kni(9QwESbAM^UpeF4$wbDLQiX@V`zWPynRk5fPS$Lk;NZSPeC@Bk z!R+*0u-1WX4wIhHdFO}jaHKum8qpnah{B zU}86^1f6YPKS3GVyWS1FcFc3!fY z;i06v*p2}K!ufKN37rep3@#Z1$QLWTb$pHkM`!uT^Cx)xg_9gOx{ujHihzyfaitxa99VTNBnP(<|BY8KcmXy6a&s^nz8UKp7$OXnGX^CPadS znPR{hAWa4XJ%)p^#8O8wotc{Dq5B@?=|}dEOeHAfip);WHAyHErkvlOQkP7uUCq6p zx`%6T-NlYw+tG9_p0rp(m$Nf@Ufz3=-}>r99w3I_Y=iE;j8Y~T%uFyoyp1gv zA0s{l2W8EJdC9LHgHc9s{Pewe+_KFX6%KF+KA53zbA z!^husF}rt6kTAsJwXxJ&q(guZs@B*8nFN<_8DsnAG2V8~I^H~dmY?oD!2?enzJZZR0>8p^LIS$0n>(hF7xJhE<^_m3WEh*Il-T z<5LA@^JPk9n~G&qRt2P1WJb*q)$ zjkbz^`pJFF&Ex|bt{4uwTIw+zWW~V2W#?4yxfU1AIcCcz`M00>1-9?JArM#LLZQGn z{@b7M$AA7sMg~%B+q9a0{-Nz$d-*sQtsf?nHtK8?XYra@HXb1Z!dh8E!0Izd00000NkvXXu0mjfXpj3M literal 0 HcmV?d00001 diff --git a/app/javascript/mastodon/features/community_timeline/index.jsx b/app/javascript/mastodon/features/community_timeline/index.jsx index a18da2f642..7e3b9babe9 100644 --- a/app/javascript/mastodon/features/community_timeline/index.jsx +++ b/app/javascript/mastodon/features/community_timeline/index.jsx @@ -140,11 +140,8 @@ class CommunityTimeline extends PureComponent { - - - - } trackScroll={!pinned} scrollKey={`community_timeline-${columnId}`} timelineId={`community${onlyMedia ? ':media' : ''}`} diff --git a/app/javascript/mastodon/features/explore/links.jsx b/app/javascript/mastodon/features/explore/links.jsx index df91337fdd..49c667f027 100644 --- a/app/javascript/mastodon/features/explore/links.jsx +++ b/app/javascript/mastodon/features/explore/links.jsx @@ -35,7 +35,7 @@ class Links extends PureComponent { const banner = ( - + ); diff --git a/app/javascript/mastodon/features/explore/statuses.jsx b/app/javascript/mastodon/features/explore/statuses.jsx index c90273714a..eb2fe777a6 100644 --- a/app/javascript/mastodon/features/explore/statuses.jsx +++ b/app/javascript/mastodon/features/explore/statuses.jsx @@ -47,7 +47,7 @@ class Statuses extends PureComponent { return ( <> - + - + ); diff --git a/app/javascript/mastodon/features/home_timeline/components/explore_prompt.jsx b/app/javascript/mastodon/features/home_timeline/components/explore_prompt.jsx new file mode 100644 index 0000000000..172f1a96c8 --- /dev/null +++ b/app/javascript/mastodon/features/home_timeline/components/explore_prompt.jsx @@ -0,0 +1,23 @@ +import React from 'react'; + +import { FormattedMessage } from 'react-intl'; + +import { Link } from 'react-router-dom'; + +import background from 'mastodon/../images/friends-cropped.png'; +import DismissableBanner from 'mastodon/components/dismissable_banner'; + + +export const ExplorePrompt = () => ( + + + +

    +

    + +
    + + +
    +
    +); \ No newline at end of file diff --git a/app/javascript/mastodon/features/home_timeline/index.jsx b/app/javascript/mastodon/features/home_timeline/index.jsx index c9fe078755..f936e8327e 100644 --- a/app/javascript/mastodon/features/home_timeline/index.jsx +++ b/app/javascript/mastodon/features/home_timeline/index.jsx @@ -5,9 +5,10 @@ import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import classNames from 'classnames'; import { Helmet } from 'react-helmet'; -import { Link } from 'react-router-dom'; +import { List as ImmutableList } from 'immutable'; import { connect } from 'react-redux'; +import { createSelector } from 'reselect'; import { fetchAnnouncements, toggleShowAnnouncements } from 'mastodon/actions/announcements'; import { IconWithBadge } from 'mastodon/components/icon_with_badge'; @@ -20,6 +21,7 @@ import Column from '../../components/column'; import ColumnHeader from '../../components/column_header'; import StatusListContainer from '../ui/containers/status_list_container'; +import { ExplorePrompt } from './components/explore_prompt'; import ColumnSettingsContainer from './containers/column_settings_container'; const messages = defineMessages({ @@ -28,12 +30,36 @@ const messages = defineMessages({ hide_announcements: { id: 'home.hide_announcements', defaultMessage: 'Hide announcements' }, }); +const getHomeFeedSpeed = createSelector([ + state => state.getIn(['timelines', 'home', 'items'], ImmutableList()), + state => state.get('statuses'), +], (statusIds, statusMap) => { + const statuses = statusIds.take(20).map(id => statusMap.get(id)); + const uniqueAccountIds = (new Set(statuses.map(status => status.get('account')).toArray())).size; + const oldest = new Date(statuses.getIn([statuses.size - 1, 'created_at'], 0)); + const newest = new Date(statuses.getIn([0, 'created_at'], 0)); + const averageGap = (newest - oldest) / (1000 * (statuses.size + 1)); // Average gap between posts on first page in seconds + + return { + unique: uniqueAccountIds, + gap: averageGap, + newest, + }; +}); + +const homeTooSlow = createSelector(getHomeFeedSpeed, speed => + speed.unique < 5 // If there are fewer than 5 different accounts visible + || speed.gap > (30 * 60) // If the average gap between posts is more than 20 minutes + || (Date.now() - speed.newest) > (1000 * 3600) // If the most recent post is from over an hour ago +); + const mapStateToProps = state => ({ hasUnread: state.getIn(['timelines', 'home', 'unread']) > 0, isPartial: state.getIn(['timelines', 'home', 'isPartial']), hasAnnouncements: !state.getIn(['announcements', 'items']).isEmpty(), unreadAnnouncements: state.getIn(['announcements', 'items']).count(item => !item.get('read')), showAnnouncements: state.getIn(['announcements', 'show']), + tooSlow: homeTooSlow(state), }); class HomeTimeline extends PureComponent { @@ -52,6 +78,7 @@ class HomeTimeline extends PureComponent { hasAnnouncements: PropTypes.bool, unreadAnnouncements: PropTypes.number, showAnnouncements: PropTypes.bool, + tooSlow: PropTypes.bool, }; handlePin = () => { @@ -121,11 +148,11 @@ class HomeTimeline extends PureComponent { }; render () { - const { intl, hasUnread, columnId, multiColumn, hasAnnouncements, unreadAnnouncements, showAnnouncements } = this.props; + const { intl, hasUnread, columnId, multiColumn, tooSlow, hasAnnouncements, unreadAnnouncements, showAnnouncements } = this.props; const pinned = !!columnId; const { signedIn } = this.context.identity; - let announcementsButton = null; + let announcementsButton, banner; if (hasAnnouncements) { announcementsButton = ( @@ -141,6 +168,10 @@ class HomeTimeline extends PureComponent { ); } + if (tooSlow) { + banner = ; + } + return ( }} />} + emptyMessage={} bindToDocument={!multiColumn} /> ) : } diff --git a/app/javascript/mastodon/features/public_timeline/index.jsx b/app/javascript/mastodon/features/public_timeline/index.jsx index 01b02d4024..d77b76a63e 100644 --- a/app/javascript/mastodon/features/public_timeline/index.jsx +++ b/app/javascript/mastodon/features/public_timeline/index.jsx @@ -142,11 +142,8 @@ class PublicTimeline extends PureComponent { - - - - } timelineId={`public${onlyRemote ? ':remote' : ''}${onlyMedia ? ':media' : ''}`} onLoadMore={this.handleLoadMore} trackScroll={!pinned} diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 9f7ffad66c..fc46f9c5e6 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -197,9 +197,9 @@ "disabled_account_banner.text": "Your account {disabledAccount} is currently disabled.", "dismissable_banner.community_timeline": "These are the most recent public posts from people whose accounts are hosted by {domain}.", "dismissable_banner.dismiss": "Dismiss", - "dismissable_banner.explore_links": "These news stories are being talked about by people on this and other servers of the decentralized network right now.", - "dismissable_banner.explore_statuses": "These posts from this and other servers in the decentralized network are gaining traction on this server right now.", - "dismissable_banner.explore_tags": "These hashtags are gaining traction among people on this and other servers of the decentralized network right now.", + "dismissable_banner.explore_links": "These are news stories being shared the most on the social web today. Newer news stories posted by more different people are ranked higher.", + "dismissable_banner.explore_statuses": "These are posts from across the social web that are gaining traction today. Newer posts with more boosts and favourites are ranked higher.", + "dismissable_banner.explore_tags": "These are hashtags that are gaining traction on the social web today. Hashtags that are used by more different people are ranked higher.", "dismissable_banner.public_timeline": "These are the most recent public posts from people on this and other servers of the decentralized network that this server knows about.", "embed.instructions": "Embed this post on your website by copying the code below.", "embed.preview": "Here is what it will look like:", @@ -232,8 +232,7 @@ "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.", "empty_column.followed_tags": "You have not followed any hashtags yet. When you do, they will show up here.", "empty_column.hashtag": "There is nothing in this hashtag yet.", - "empty_column.home": "Your home timeline is empty! Follow more people to fill it up. {suggestions}", - "empty_column.home.suggestions": "See some suggestions", + "empty_column.home": "Your home timeline is empty! Follow more people to fill it up.", "empty_column.list": "There is nothing in this list yet. When members of this list publish new posts, they will appear here.", "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.", "empty_column.mutes": "You haven't muted any users yet.", @@ -292,9 +291,13 @@ "hashtag.column_settings.tag_toggle": "Include additional tags for this column", "hashtag.follow": "Follow hashtag", "hashtag.unfollow": "Unfollow hashtag", + "home.actions.go_to_explore": "See what's trending", + "home.actions.go_to_suggestions": "Find people to follow", "home.column_settings.basic": "Basic", "home.column_settings.show_reblogs": "Show boosts", "home.column_settings.show_replies": "Show replies", + "home.explore_prompt.body": "Your home feed will have a mix of posts from the hashtags you've chosen to follow, the people you've chosen to follow, and the posts they boost. It's looking pretty quiet right now, so how about:", + "home.explore_prompt.title": "This is your home base within Mastodon.", "home.hide_announcements": "Hide announcements", "home.show_announcements": "Show announcements", "interaction_modal.description.favourite": "With an account on Mastodon, you can favourite this post to let the author know you appreciate it and save it for later.", diff --git a/app/javascript/styles/mastodon-light/diff.scss b/app/javascript/styles/mastodon-light/diff.scss index 7498477caa..91828d408a 100644 --- a/app/javascript/styles/mastodon-light/diff.scss +++ b/app/javascript/styles/mastodon-light/diff.scss @@ -653,11 +653,6 @@ html { border: 1px solid lighten($ui-base-color, 8%); } -.dismissable-banner { - border-left: 1px solid lighten($ui-base-color, 8%); - border-right: 1px solid lighten($ui-base-color, 8%); -} - .status__content, .reply-indicator__content { a { diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index a9c19a231f..c966eb5ee3 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -8695,27 +8695,71 @@ noscript { } .dismissable-banner { - background: $ui-base-color; - border-bottom: 1px solid lighten($ui-base-color, 8%); - display: flex; - align-items: center; - gap: 30px; + position: relative; + margin: 10px; + margin-bottom: 5px; + border-radius: 8px; + border: 1px solid $highlight-text-color; + background: rgba($highlight-text-color, 0.15); + padding-inline-end: 45px; + overflow: hidden; + + &__background-image { + width: 125%; + position: absolute; + bottom: -25%; + inset-inline-end: -25%; + z-index: -1; + opacity: 0.15; + mix-blend-mode: luminosity; + } &__message { flex: 1 1 auto; - padding: 20px 15px; - cursor: default; - font-size: 14px; - line-height: 18px; + padding: 15px; + font-size: 15px; + line-height: 22px; + font-weight: 500; color: $primary-text-color; + + p { + margin-bottom: 15px; + + &:last-child { + margin-bottom: 0; + } + } + + h1 { + color: $highlight-text-color; + font-size: 22px; + line-height: 33px; + font-weight: 700; + margin-bottom: 15px; + } + + &__actions { + display: flex; + align-items: center; + gap: 4px; + margin-top: 30px; + } + + .button-tertiary { + background: rgba($ui-base-color, 0.15); + backdrop-filter: blur(8px); + } } &__action { - padding: 15px; - flex: 0 0 auto; - display: flex; - align-items: center; - justify-content: center; + position: absolute; + inset-inline-end: 0; + top: 0; + padding: 10px; + + .icon-button { + color: $highlight-text-color; + } } } From 0842a68532b1d1f5732e0ba6f2c62b5522114167 Mon Sep 17 00:00:00 2001 From: Claire Date: Fri, 23 Jun 2023 14:44:54 +0200 Subject: [PATCH 090/118] Remove unique accounts condition from Home onboarding prompt (#25556) --- app/javascript/mastodon/features/home_timeline/index.jsx | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/app/javascript/mastodon/features/home_timeline/index.jsx b/app/javascript/mastodon/features/home_timeline/index.jsx index f936e8327e..389efcc875 100644 --- a/app/javascript/mastodon/features/home_timeline/index.jsx +++ b/app/javascript/mastodon/features/home_timeline/index.jsx @@ -14,6 +14,7 @@ import { fetchAnnouncements, toggleShowAnnouncements } from 'mastodon/actions/an import { IconWithBadge } from 'mastodon/components/icon_with_badge'; import { NotSignedInIndicator } from 'mastodon/components/not_signed_in_indicator'; import AnnouncementsContainer from 'mastodon/features/getting_started/containers/announcements_container'; +import { me } from 'mastodon/initial_state'; import { addColumn, removeColumn, moveColumn } from '../../actions/columns'; import { expandHomeTimeline } from '../../actions/timelines'; @@ -34,22 +35,19 @@ const getHomeFeedSpeed = createSelector([ state => state.getIn(['timelines', 'home', 'items'], ImmutableList()), state => state.get('statuses'), ], (statusIds, statusMap) => { - const statuses = statusIds.take(20).map(id => statusMap.get(id)); - const uniqueAccountIds = (new Set(statuses.map(status => status.get('account')).toArray())).size; + const statuses = statusIds.map(id => statusMap.get(id)).filter(status => status.get('account') !== me).take(20); const oldest = new Date(statuses.getIn([statuses.size - 1, 'created_at'], 0)); const newest = new Date(statuses.getIn([0, 'created_at'], 0)); const averageGap = (newest - oldest) / (1000 * (statuses.size + 1)); // Average gap between posts on first page in seconds return { - unique: uniqueAccountIds, gap: averageGap, newest, }; }); const homeTooSlow = createSelector(getHomeFeedSpeed, speed => - speed.unique < 5 // If there are fewer than 5 different accounts visible - || speed.gap > (30 * 60) // If the average gap between posts is more than 20 minutes + speed.gap > (30 * 60) // If the average gap between posts is more than 20 minutes || (Date.now() - speed.newest) > (1000 * 3600) // If the most recent post is from over an hour ago ); From a985d587e13494b78ef2879e4d97f78a2df693db Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Fri, 23 Jun 2023 16:34:27 +0200 Subject: [PATCH 091/118] Change labels and styles on the onboarding screen in web UI (#25559) --- .../mastodon/components/account.jsx | 14 ++++- .../features/onboarding/components/step.jsx | 10 +-- .../mastodon/features/onboarding/follows.jsx | 24 ++----- .../mastodon/features/onboarding/index.jsx | 14 +++-- .../mastodon/features/onboarding/share.jsx | 4 +- app/javascript/mastodon/locales/en.json | 28 ++++----- .../styles/mastodon/components.scss | 63 ++++++++++++++++--- 7 files changed, 101 insertions(+), 56 deletions(-) diff --git a/app/javascript/mastodon/components/account.jsx b/app/javascript/mastodon/components/account.jsx index 0f3b85388c..dd5aff1d8e 100644 --- a/app/javascript/mastodon/components/account.jsx +++ b/app/javascript/mastodon/components/account.jsx @@ -1,6 +1,6 @@ import PropTypes from 'prop-types'; -import { defineMessages, injectIntl } from 'react-intl'; +import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import classNames from 'classnames'; import { Link } from 'react-router-dom'; @@ -49,6 +49,7 @@ class Account extends ImmutablePureComponent { actionTitle: PropTypes.string, defaultAction: PropTypes.string, onActionClick: PropTypes.func, + withBio: PropTypes.bool, }; static defaultProps = { @@ -80,7 +81,7 @@ class Account extends ImmutablePureComponent { }; render () { - const { account, intl, hidden, onActionClick, actionIcon, actionTitle, defaultAction, size, minimal } = this.props; + const { account, intl, hidden, withBio, onActionClick, actionIcon, actionTitle, defaultAction, size, minimal } = this.props; if (!account) { return ; @@ -171,6 +172,15 @@ class Account extends ImmutablePureComponent {
)}
+ + {withBio && (account.get('note').length > 0 ? ( +
+ ) : ( +
+ ))}
); } diff --git a/app/javascript/mastodon/features/onboarding/components/step.jsx b/app/javascript/mastodon/features/onboarding/components/step.jsx index 0f478f26a3..379f433040 100644 --- a/app/javascript/mastodon/features/onboarding/components/step.jsx +++ b/app/javascript/mastodon/features/onboarding/components/step.jsx @@ -3,6 +3,8 @@ import PropTypes from 'prop-types'; import { Check } from 'mastodon/components/check'; import { Icon } from 'mastodon/components/icon'; +import ArrowSmallRight from './arrow_small_right'; + const Step = ({ label, description, icon, completed, onClick, href }) => { const content = ( <> @@ -15,11 +17,9 @@ const Step = ({ label, description, icon, completed, onClick, href }) => {

{description}

- {completed && ( -
- -
- )} +
+ {completed ? : } +
); diff --git a/app/javascript/mastodon/features/onboarding/follows.jsx b/app/javascript/mastodon/features/onboarding/follows.jsx index 8b4ad0b087..472a87f5ec 100644 --- a/app/javascript/mastodon/features/onboarding/follows.jsx +++ b/app/javascript/mastodon/features/onboarding/follows.jsx @@ -12,20 +12,11 @@ import Column from 'mastodon/components/column'; import ColumnBackButton from 'mastodon/components/column_back_button'; import { EmptyAccount } from 'mastodon/components/empty_account'; import Account from 'mastodon/containers/account_container'; -import { me } from 'mastodon/initial_state'; -import { makeGetAccount } from 'mastodon/selectors'; -import ProgressIndicator from './components/progress_indicator'; - -const mapStateToProps = () => { - const getAccount = makeGetAccount(); - - return state => ({ - account: getAccount(state, me), - suggestions: state.getIn(['suggestions', 'items']), - isLoading: state.getIn(['suggestions', 'isLoading']), - }); -}; +const mapStateToProps = state => ({ + suggestions: state.getIn(['suggestions', 'items']), + isLoading: state.getIn(['suggestions', 'isLoading']), +}); class Follows extends PureComponent { @@ -33,7 +24,6 @@ class Follows extends PureComponent { onBack: PropTypes.func, dispatch: PropTypes.func.isRequired, suggestions: ImmutablePropTypes.list, - account: ImmutablePropTypes.map, isLoading: PropTypes.bool, multiColumn: PropTypes.bool, }; @@ -49,7 +39,7 @@ class Follows extends PureComponent { } render () { - const { onBack, isLoading, suggestions, account, multiColumn } = this.props; + const { onBack, isLoading, suggestions, multiColumn } = this.props; let loadedContent; @@ -58,7 +48,7 @@ class Follows extends PureComponent { } else if (suggestions.isEmpty()) { loadedContent =
; } else { - loadedContent = suggestions.map(suggestion => ); + loadedContent = suggestions.map(suggestion => ); } return ( @@ -71,8 +61,6 @@ class Follows extends PureComponent {

- -
{loadedContent}
diff --git a/app/javascript/mastodon/features/onboarding/index.jsx b/app/javascript/mastodon/features/onboarding/index.jsx index 79291b3d08..41d499f684 100644 --- a/app/javascript/mastodon/features/onboarding/index.jsx +++ b/app/javascript/mastodon/features/onboarding/index.jsx @@ -18,6 +18,7 @@ import { closeOnboarding } from 'mastodon/actions/onboarding'; import Column from 'mastodon/features/ui/components/column'; import { me } from 'mastodon/initial_state'; import { makeGetAccount } from 'mastodon/selectors'; +import { assetHost } from 'mastodon/utils/config'; import ArrowSmallRight from './components/arrow_small_right'; import Step from './components/step'; @@ -121,21 +122,22 @@ class Onboarding extends ImmutablePureComponent {
0 && account.get('note').length > 0)} icon='address-book-o' label={} description={} /> = 7} icon='user-plus' label={} description={} /> - = 1} icon='pencil-square-o' label={} description={} /> + = 1} icon='pencil-square-o' label={} description={ }} />} /> } description={} />
-

+

+ - -
-
- + + + +
diff --git a/app/javascript/mastodon/features/onboarding/share.jsx b/app/javascript/mastodon/features/onboarding/share.jsx index 6871793026..c5b185a244 100644 --- a/app/javascript/mastodon/features/onboarding/share.jsx +++ b/app/javascript/mastodon/features/onboarding/share.jsx @@ -177,13 +177,13 @@ class Share extends PureComponent {
+ - + -
diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index fc46f9c5e6..63ab26bc56 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -52,6 +52,7 @@ "account.mute_notifications_short": "Mute notifications", "account.mute_short": "Mute", "account.muted": "Muted", + "account.no_bio": "No description provided.", "account.open_original_page": "Open original page", "account.posts": "Posts", "account.posts_with_replies": "Posts and replies", @@ -452,28 +453,27 @@ "notifications_permission_banner.title": "Never miss a thing", "onboarding.action.back": "Take me back", "onboarding.actions.back": "Take me back", - "onboarding.actions.close": "Don't show this screen again", - "onboarding.actions.go_to_explore": "See what's trending", - "onboarding.actions.go_to_home": "Go to your home feed", + "onboarding.actions.go_to_explore": "Take me to trending", + "onboarding.actions.go_to_home": "Take me to my home feed", "onboarding.compose.template": "Hello #Mastodon!", "onboarding.follows.empty": "Unfortunately, no results can be shown right now. You can try using search or browsing the explore page to find people to follow, or try again later.", - "onboarding.follows.lead": "You curate your own home feed. The more people you follow, the more active and interesting it will be. These profiles may be a good starting point—you can always unfollow them later!", - "onboarding.follows.title": "Popular on Mastodon", + "onboarding.follows.lead": "Your home feed is the primary way to experience Mastodon. The more people you follow, the more active and interesting it will be. To get you started, here are some suggestions:", + "onboarding.follows.title": "Personalize your home feed", "onboarding.share.lead": "Let people know how they can find you on Mastodon!", "onboarding.share.message": "I'm {username} on #Mastodon! Come follow me at {url}", "onboarding.share.next_steps": "Possible next steps:", "onboarding.share.title": "Share your profile", - "onboarding.start.lead": "Your new Mastodon account is ready to go. Here's how you can make the most of it:", - "onboarding.start.skip": "Want to skip right ahead?", + "onboarding.start.lead": "You're now part of Mastodon, a unique, decentralized social media platform where you—not an algorithm—curate your own experience. Let's get you started on this new social frontier:", + "onboarding.start.skip": "Don't need help getting started?", "onboarding.start.title": "You've made it!", - "onboarding.steps.follow_people.body": "You curate your own home feed. Let's fill it with interesting people.", - "onboarding.steps.follow_people.title": "Find at least {count, plural, one {one person} other {# people}} to follow", - "onboarding.steps.publish_status.body": "Say hello to the world.", + "onboarding.steps.follow_people.body": "Following interesting people is what Mastodon is all about.", + "onboarding.steps.follow_people.title": "Personalize your home feed", + "onboarding.steps.publish_status.body": "Say hello to the world with text, photos, videos, or polls {emoji}", "onboarding.steps.publish_status.title": "Make your first post", - "onboarding.steps.setup_profile.body": "Others are more likely to interact with you with a filled out profile.", - "onboarding.steps.setup_profile.title": "Customize your profile", - "onboarding.steps.share_profile.body": "Let your friends know how to find you on Mastodon!", - "onboarding.steps.share_profile.title": "Share your profile", + "onboarding.steps.setup_profile.body": "Boost your interactions by having a comprehensive profile.", + "onboarding.steps.setup_profile.title": "Personalize your profile", + "onboarding.steps.share_profile.body": "Let your friends know how to find you on Mastodon", + "onboarding.steps.share_profile.title": "Share your Mastodon profile", "onboarding.tips.2fa": "Did you know? You can secure your account by setting up two-factor authentication in your account settings. It works with any TOTP app of your choice, no phone number necessary!", "onboarding.tips.accounts_from_other_servers": "Did you know? Since Mastodon is decentralized, some profiles you come across will be hosted on servers other than yours. And yet you can interact with them seamlessly! Their server is in the second half of their username!", "onboarding.tips.migration": "Did you know? If you feel like {domain} is not a great server choice for you in the future, you can move to another Mastodon server without losing your followers. You can even host your own server!", diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index c966eb5ee3..81dee20d33 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -1514,12 +1514,37 @@ body > [data-popper-placement] { } &__note { + font-size: 14px; + font-weight: 400; overflow: hidden; text-overflow: ellipsis; display: -webkit-box; - -webkit-line-clamp: 2; + -webkit-line-clamp: 1; -webkit-box-orient: vertical; - color: $ui-secondary-color; + margin-top: 10px; + color: $darker-text-color; + + &--missing { + color: $dark-text-color; + } + + p { + margin-bottom: 10px; + + &:last-child { + margin-bottom: 0; + } + } + + a { + color: inherit; + + &:hover, + &:focus, + &:active { + text-decoration: none; + } + } } } @@ -2617,13 +2642,15 @@ $ui-header-height: 55px; .onboarding__link { display: flex; align-items: center; + justify-content: space-between; gap: 10px; color: $highlight-text-color; background: lighten($ui-base-color, 4%); border-radius: 8px; - padding: 10px; + padding: 10px 15px; box-sizing: border-box; - font-size: 17px; + font-size: 14px; + font-weight: 500; height: 56px; text-decoration: none; @@ -2685,6 +2712,7 @@ $ui-header-height: 55px; align-items: center; gap: 10px; padding: 10px; + padding-inline-end: 15px; margin-bottom: 2px; text-decoration: none; text-align: start; @@ -2697,14 +2725,14 @@ $ui-header-height: 55px; &__icon { flex: 0 0 auto; - background: $ui-base-color; border-radius: 50%; display: none; align-items: center; justify-content: center; width: 36px; height: 36px; - color: $dark-text-color; + color: $highlight-text-color; + font-size: 1.2rem; @media screen and (width >= 600px) { display: flex; @@ -2728,16 +2756,33 @@ $ui-header-height: 55px; } } + &__go { + flex: 0 0 auto; + display: flex; + align-items: center; + justify-content: center; + width: 21px; + height: 21px; + color: $highlight-text-color; + font-size: 17px; + + svg { + height: 1.5em; + width: auto; + } + } + &__description { flex: 1 1 auto; - line-height: 18px; + line-height: 20px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden; h6 { - color: $primary-text-color; - font-weight: 700; + color: $highlight-text-color; + font-weight: 500; + font-size: 14px; overflow: hidden; text-overflow: ellipsis; } From 55e7c08a83547424024bac311d5459cb82cf6dae Mon Sep 17 00:00:00 2001 From: Claire Date: Sat, 24 Jun 2023 17:24:31 +0200 Subject: [PATCH 092/118] Fix verified badge in account lists potentially including rel="me" links (#25561) --- .../mastodon/components/verified_badge.tsx | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/app/javascript/mastodon/components/verified_badge.tsx b/app/javascript/mastodon/components/verified_badge.tsx index 6b421ba42c..9a6adcfa86 100644 --- a/app/javascript/mastodon/components/verified_badge.tsx +++ b/app/javascript/mastodon/components/verified_badge.tsx @@ -1,11 +1,27 @@ import { Icon } from './icon'; +const domParser = new DOMParser(); + +const stripRelMe = (html: string) => { + const document = domParser.parseFromString(html, 'text/html').documentElement; + + document.querySelectorAll('a[rel]').forEach((link) => { + link.rel = link.rel + .split(' ') + .filter((x: string) => x !== 'me') + .join(' '); + }); + + const body = document.querySelector('body'); + return body ? { __html: body.innerHTML } : undefined; +}; + interface Props { link: string; } export const VerifiedBadge: React.FC = ({ link }) => ( - + ); From c71fc42f4ecc41358b7ffccc1c7dadaf7decf518 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=9F=E3=81=84=E3=81=A1=20=E3=81=B2?= Date: Mon, 19 Jun 2023 21:11:46 +0900 Subject: [PATCH 093/118] [Glitch] Rewrite `` as FC and TS Port 804488d38e9942280f7d320af8c7fef7860a4ee5 to glitch-soc Signed-off-by: Claire --- .../glitch/components/autosuggest_hashtag.jsx | 44 ------------------- .../glitch/components/autosuggest_hashtag.tsx | 42 ++++++++++++++++++ .../glitch/components/autosuggest_input.jsx | 4 +- .../components/autosuggest_textarea.jsx | 2 +- 4 files changed, 44 insertions(+), 48 deletions(-) delete mode 100644 app/javascript/flavours/glitch/components/autosuggest_hashtag.jsx create mode 100644 app/javascript/flavours/glitch/components/autosuggest_hashtag.tsx diff --git a/app/javascript/flavours/glitch/components/autosuggest_hashtag.jsx b/app/javascript/flavours/glitch/components/autosuggest_hashtag.jsx deleted file mode 100644 index 37f7e20f0a..0000000000 --- a/app/javascript/flavours/glitch/components/autosuggest_hashtag.jsx +++ /dev/null @@ -1,44 +0,0 @@ -import PropTypes from 'prop-types'; -import { PureComponent } from 'react'; - -import { FormattedMessage } from 'react-intl'; - -import ShortNumber from 'flavours/glitch/components/short_number'; - -export default class AutosuggestHashtag extends PureComponent { - - static propTypes = { - tag: PropTypes.shape({ - name: PropTypes.string.isRequired, - url: PropTypes.string, - history: PropTypes.array, - }).isRequired, - }; - - render() { - const { tag } = this.props; - const weeklyUses = tag.history && ( - total + day.uses * 1, 0)} - /> - ); - - return ( -
-
- #{tag.name} -
- {tag.history !== undefined && ( -
- -
- )} -
- ); - } - -} diff --git a/app/javascript/flavours/glitch/components/autosuggest_hashtag.tsx b/app/javascript/flavours/glitch/components/autosuggest_hashtag.tsx new file mode 100644 index 0000000000..932370884a --- /dev/null +++ b/app/javascript/flavours/glitch/components/autosuggest_hashtag.tsx @@ -0,0 +1,42 @@ +import { FormattedMessage } from 'react-intl'; + +import ShortNumber from 'flavours/glitch/components/short_number'; + +interface Props { + tag: { + name: string; + url?: string; + history?: Array<{ + uses: number; + accounts: string; + day: string; + }>; + following?: boolean; + type: 'hashtag'; + }; +} + +export const AutosuggestHashtag: React.FC = ({ tag }) => { + const weeklyUses = tag.history && ( + total + day.uses * 1, 0)} + /> + ); + + return ( +
+
+ #{tag.name} +
+ {tag.history !== undefined && ( +
+ +
+ )} +
+ ); +}; diff --git a/app/javascript/flavours/glitch/components/autosuggest_input.jsx b/app/javascript/flavours/glitch/components/autosuggest_input.jsx index d3b7c48ab0..f0833c8c6b 100644 --- a/app/javascript/flavours/glitch/components/autosuggest_input.jsx +++ b/app/javascript/flavours/glitch/components/autosuggest_input.jsx @@ -8,9 +8,7 @@ import ImmutablePureComponent from 'react-immutable-pure-component'; import AutosuggestAccountContainer from 'flavours/glitch/features/compose/containers/autosuggest_account_container'; import AutosuggestEmoji from './autosuggest_emoji'; -import AutosuggestHashtag from './autosuggest_hashtag'; - - +import { AutosuggestHashtag } from './autosuggest_hashtag'; const textAtCursorMatchesToken = (str, caretPosition, searchTokens) => { let word; diff --git a/app/javascript/flavours/glitch/components/autosuggest_textarea.jsx b/app/javascript/flavours/glitch/components/autosuggest_textarea.jsx index 86f10651d6..25ca3fefa5 100644 --- a/app/javascript/flavours/glitch/components/autosuggest_textarea.jsx +++ b/app/javascript/flavours/glitch/components/autosuggest_textarea.jsx @@ -10,7 +10,7 @@ import Textarea from 'react-textarea-autosize'; import AutosuggestAccountContainer from 'flavours/glitch/features/compose/containers/autosuggest_account_container'; import AutosuggestEmoji from './autosuggest_emoji'; -import AutosuggestHashtag from './autosuggest_hashtag'; +import { AutosuggestHashtag } from './autosuggest_hashtag'; const textAtCursorMatchesToken = (str, caretPosition) => { let word; From 6fe345c38396a2a1d74df8c3c28d2d24a78b058b Mon Sep 17 00:00:00 2001 From: Ian Date: Wed, 21 Jun 2023 16:58:00 +0100 Subject: [PATCH 094/118] [Glitch] Change emoji picker icon Port 69db507924d6d9350cca8a7127e773d46f9b8f48 to glitch-soc Signed-off-by: Claire --- .../features/compose/components/emoji_picker_dropdown.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/flavours/glitch/features/compose/components/emoji_picker_dropdown.jsx b/app/javascript/flavours/glitch/features/compose/components/emoji_picker_dropdown.jsx index e01be88a2f..c2c8030615 100644 --- a/app/javascript/flavours/glitch/features/compose/components/emoji_picker_dropdown.jsx +++ b/app/javascript/flavours/glitch/features/compose/components/emoji_picker_dropdown.jsx @@ -391,7 +391,7 @@ class EmojiPickerDropdown extends PureComponent { {button || 🙂} From 222713a768a9aa9894cfceee8c9155d8f7cd5c37 Mon Sep 17 00:00:00 2001 From: mogaminsk Date: Thu, 22 Jun 2023 19:10:49 +0900 Subject: [PATCH 095/118] [Glitch] Fix custom signup URL may not loaded Port 8d2c26834f7a485e6fd9083b17b025ad5030e471 to glitch-soc Signed-off-by: Claire --- .../flavours/glitch/features/ui/components/header.jsx | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/javascript/flavours/glitch/features/ui/components/header.jsx b/app/javascript/flavours/glitch/features/ui/components/header.jsx index bbef3a5fb8..873ff20e79 100644 --- a/app/javascript/flavours/glitch/features/ui/components/header.jsx +++ b/app/javascript/flavours/glitch/features/ui/components/header.jsx @@ -8,6 +8,7 @@ import { Link, withRouter } from 'react-router-dom'; import { connect } from 'react-redux'; import { openModal } from 'flavours/glitch/actions/modal'; +import { fetchServer } from 'flavours/glitch/actions/server'; import { Avatar } from 'flavours/glitch/components/avatar'; import { WordmarkLogo, SymbolLogo } from 'flavours/glitch/components/logo'; import Permalink from 'flavours/glitch/components/permalink'; @@ -29,6 +30,9 @@ const mapDispatchToProps = (dispatch) => ({ openClosedRegistrationsModal() { dispatch(openModal({ modalType: 'CLOSED_REGISTRATIONS' })); }, + dispatchServer() { + dispatch(fetchServer()); + } }); class Header extends PureComponent { @@ -41,8 +45,14 @@ class Header extends PureComponent { openClosedRegistrationsModal: PropTypes.func, location: PropTypes.object, signupUrl: PropTypes.string.isRequired, + dispatchServer: PropTypes.func }; + componentDidMount () { + const { dispatchServer } = this.props; + dispatchServer(); + } + render () { const { signedIn } = this.context.identity; const { location, openClosedRegistrationsModal, signupUrl } = this.props; From 7d160d2272d15833c2f49013b077d7609cf4658b Mon Sep 17 00:00:00 2001 From: Claire Date: Thu, 22 Jun 2023 17:54:43 +0200 Subject: [PATCH 096/118] [Glitch] Fix j/k keyboard shortcuts on some status lists Port a8c1c8bd377263677bfb654513a4160caeac77bb to glitch-soc Signed-off-by: Claire --- .../glitch/features/pinned_statuses/index.jsx | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/app/javascript/flavours/glitch/features/pinned_statuses/index.jsx b/app/javascript/flavours/glitch/features/pinned_statuses/index.jsx index add05bdff0..bbb95e5522 100644 --- a/app/javascript/flavours/glitch/features/pinned_statuses/index.jsx +++ b/app/javascript/flavours/glitch/features/pinned_statuses/index.jsx @@ -8,17 +8,19 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; import { connect } from 'react-redux'; -import { fetchPinnedStatuses } from 'flavours/glitch/actions/pin_statuses'; -import ColumnBackButtonSlim from 'flavours/glitch/components/column_back_button_slim'; -import StatusList from 'flavours/glitch/components/status_list'; -import Column from 'flavours/glitch/features/ui/components/column'; +import { getStatusList } from 'flavours/glitch/selectors'; + +import { fetchPinnedStatuses } from '../../actions/pin_statuses'; +import ColumnBackButtonSlim from '../../components/column_back_button_slim'; +import StatusList from '../../components/status_list'; +import Column from '../ui/components/column'; const messages = defineMessages({ heading: { id: 'column.pins', defaultMessage: 'Pinned post' }, }); const mapStateToProps = state => ({ - statusIds: state.getIn(['status_lists', 'pins', 'items']), + statusIds: getStatusList(state, 'pins'), hasMore: !!state.getIn(['status_lists', 'pins', 'next']), }); From 6fb34258a4ae7e1b8ac252325224c25dd6739dd5 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Thu, 22 Jun 2023 22:48:40 +0100 Subject: [PATCH 097/118] [Glitch] Add onboarding prompt when home feed too slow in web UI Port 00ec43914aeded13bb369483f795fdb24dfb4b42 to glitch-soc Signed-off-by: Claire --- .../features/bookmarked_statuses/index.jsx | 3 +- .../features/community_timeline/index.jsx | 5 +- .../glitch/features/explore/links.jsx | 2 +- .../glitch/features/explore/statuses.jsx | 5 +- .../flavours/glitch/features/explore/tags.jsx | 2 +- .../features/favourited_statuses/index.jsx | 3 +- .../components/explore_prompt.jsx | 23 ++++++ .../glitch/features/home_timeline/index.jsx | 41 +++++++++-- .../glitch/features/public_timeline/index.jsx | 5 +- .../flavours/glitch/selectors/index.js | 4 ++ .../glitch/styles/components/columns.scss | 72 +++++++++++++++---- .../glitch/styles/mastodon-light/diff.scss | 5 -- 12 files changed, 133 insertions(+), 37 deletions(-) create mode 100644 app/javascript/flavours/glitch/features/home_timeline/components/explore_prompt.jsx diff --git a/app/javascript/flavours/glitch/features/bookmarked_statuses/index.jsx b/app/javascript/flavours/glitch/features/bookmarked_statuses/index.jsx index fe8b883de5..c674c82547 100644 --- a/app/javascript/flavours/glitch/features/bookmarked_statuses/index.jsx +++ b/app/javascript/flavours/glitch/features/bookmarked_statuses/index.jsx @@ -15,13 +15,14 @@ import { addColumn, removeColumn, moveColumn } from 'flavours/glitch/actions/col import ColumnHeader from 'flavours/glitch/components/column_header'; import StatusList from 'flavours/glitch/components/status_list'; import Column from 'flavours/glitch/features/ui/components/column'; +import { getStatusList } from 'flavours/glitch/selectors'; const messages = defineMessages({ heading: { id: 'column.bookmarks', defaultMessage: 'Bookmarks' }, }); const mapStateToProps = state => ({ - statusIds: state.getIn(['status_lists', 'bookmarks', 'items']), + statusIds: getStatusList(state, 'bookmarks'), isLoading: state.getIn(['status_lists', 'bookmarks', 'isLoading'], true), hasMore: !!state.getIn(['status_lists', 'bookmarks', 'next']), }); diff --git a/app/javascript/flavours/glitch/features/community_timeline/index.jsx b/app/javascript/flavours/glitch/features/community_timeline/index.jsx index 127e7cf182..ca11adb464 100644 --- a/app/javascript/flavours/glitch/features/community_timeline/index.jsx +++ b/app/javascript/flavours/glitch/features/community_timeline/index.jsx @@ -142,11 +142,8 @@ class CommunityTimeline extends PureComponent { - - - - } trackScroll={!pinned} scrollKey={`community_timeline-${columnId}`} timelineId={`community${onlyMedia ? ':media' : ''}`} diff --git a/app/javascript/flavours/glitch/features/explore/links.jsx b/app/javascript/flavours/glitch/features/explore/links.jsx index ca7d948625..88976c4ea6 100644 --- a/app/javascript/flavours/glitch/features/explore/links.jsx +++ b/app/javascript/flavours/glitch/features/explore/links.jsx @@ -35,7 +35,7 @@ class Links extends PureComponent { const banner = ( - + ); diff --git a/app/javascript/flavours/glitch/features/explore/statuses.jsx b/app/javascript/flavours/glitch/features/explore/statuses.jsx index 212980c28f..ce484ef77c 100644 --- a/app/javascript/flavours/glitch/features/explore/statuses.jsx +++ b/app/javascript/flavours/glitch/features/explore/statuses.jsx @@ -11,9 +11,10 @@ import { debounce } from 'lodash'; import { fetchTrendingStatuses, expandTrendingStatuses } from 'flavours/glitch/actions/trends'; import DismissableBanner from 'flavours/glitch/components/dismissable_banner'; import StatusList from 'flavours/glitch/components/status_list'; +import { getStatusList } from 'flavours/glitch/selectors'; const mapStateToProps = state => ({ - statusIds: state.getIn(['status_lists', 'trending', 'items']), + statusIds: getStatusList(state, 'trending'), isLoading: state.getIn(['status_lists', 'trending', 'isLoading'], true), hasMore: !!state.getIn(['status_lists', 'trending', 'next']), }); @@ -46,7 +47,7 @@ class Statuses extends PureComponent { return ( <> - + - + ); diff --git a/app/javascript/flavours/glitch/features/favourited_statuses/index.jsx b/app/javascript/flavours/glitch/features/favourited_statuses/index.jsx index 08152063c7..ed11f2b8ce 100644 --- a/app/javascript/flavours/glitch/features/favourited_statuses/index.jsx +++ b/app/javascript/flavours/glitch/features/favourited_statuses/index.jsx @@ -15,13 +15,14 @@ import { fetchFavouritedStatuses, expandFavouritedStatuses } from 'flavours/glit import ColumnHeader from 'flavours/glitch/components/column_header'; import StatusList from 'flavours/glitch/components/status_list'; import Column from 'flavours/glitch/features/ui/components/column'; +import { getStatusList } from 'flavours/glitch/selectors'; const messages = defineMessages({ heading: { id: 'column.favourites', defaultMessage: 'Favourites' }, }); const mapStateToProps = state => ({ - statusIds: state.getIn(['status_lists', 'favourites', 'items']), + statusIds: getStatusList(state, 'favourites'), isLoading: state.getIn(['status_lists', 'favourites', 'isLoading'], true), hasMore: !!state.getIn(['status_lists', 'favourites', 'next']), }); diff --git a/app/javascript/flavours/glitch/features/home_timeline/components/explore_prompt.jsx b/app/javascript/flavours/glitch/features/home_timeline/components/explore_prompt.jsx new file mode 100644 index 0000000000..972dedd3be --- /dev/null +++ b/app/javascript/flavours/glitch/features/home_timeline/components/explore_prompt.jsx @@ -0,0 +1,23 @@ +import React from 'react'; + +import { FormattedMessage } from 'react-intl'; + +import { Link } from 'react-router-dom'; + +import DismissableBanner from 'flavours/glitch/components/dismissable_banner'; +import background from 'mastodon/../images/friends-cropped.png'; + + +export const ExplorePrompt = () => ( + + + +

+

+ +
+ + +
+
+); diff --git a/app/javascript/flavours/glitch/features/home_timeline/index.jsx b/app/javascript/flavours/glitch/features/home_timeline/index.jsx index 791c310557..7036857020 100644 --- a/app/javascript/flavours/glitch/features/home_timeline/index.jsx +++ b/app/javascript/flavours/glitch/features/home_timeline/index.jsx @@ -5,9 +5,10 @@ import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import classNames from 'classnames'; import { Helmet } from 'react-helmet'; -import { Link } from 'react-router-dom'; +import { List as ImmutableList } from 'immutable'; import { connect } from 'react-redux'; +import { createSelector } from 'reselect'; import { fetchAnnouncements, toggleShowAnnouncements } from 'flavours/glitch/actions/announcements'; import { addColumn, removeColumn, moveColumn } from 'flavours/glitch/actions/columns'; @@ -19,6 +20,7 @@ import { NotSignedInIndicator } from 'flavours/glitch/components/not_signed_in_i import AnnouncementsContainer from 'flavours/glitch/features/getting_started/containers/announcements_container'; import StatusListContainer from 'flavours/glitch/features/ui/containers/status_list_container'; +import { ExplorePrompt } from './components/explore_prompt'; import ColumnSettingsContainer from './containers/column_settings_container'; @@ -28,12 +30,36 @@ const messages = defineMessages({ hide_announcements: { id: 'home.hide_announcements', defaultMessage: 'Hide announcements' }, }); +const getHomeFeedSpeed = createSelector([ + state => state.getIn(['timelines', 'home', 'items'], ImmutableList()), + state => state.get('statuses'), +], (statusIds, statusMap) => { + const statuses = statusIds.take(20).map(id => statusMap.get(id)); + const uniqueAccountIds = (new Set(statuses.map(status => status.get('account')).toArray())).size; + const oldest = new Date(statuses.getIn([statuses.size - 1, 'created_at'], 0)); + const newest = new Date(statuses.getIn([0, 'created_at'], 0)); + const averageGap = (newest - oldest) / (1000 * (statuses.size + 1)); // Average gap between posts on first page in seconds + + return { + unique: uniqueAccountIds, + gap: averageGap, + newest, + }; +}); + +const homeTooSlow = createSelector(getHomeFeedSpeed, speed => + speed.unique < 5 // If there are fewer than 5 different accounts visible + || speed.gap > (30 * 60) // If the average gap between posts is more than 20 minutes + || (Date.now() - speed.newest) > (1000 * 3600) // If the most recent post is from over an hour ago +); + const mapStateToProps = state => ({ hasUnread: state.getIn(['timelines', 'home', 'unread']) > 0, isPartial: state.getIn(['timelines', 'home', 'isPartial']), hasAnnouncements: !state.getIn(['announcements', 'items']).isEmpty(), unreadAnnouncements: state.getIn(['announcements', 'items']).count(item => !item.get('read')), showAnnouncements: state.getIn(['announcements', 'show']), + tooSlow: homeTooSlow(state), regex: state.getIn(['settings', 'home', 'regex', 'body']), }); @@ -53,6 +79,7 @@ class HomeTimeline extends PureComponent { hasAnnouncements: PropTypes.bool, unreadAnnouncements: PropTypes.number, showAnnouncements: PropTypes.bool, + tooSlow: PropTypes.bool, regex: PropTypes.string, }; @@ -123,11 +150,11 @@ class HomeTimeline extends PureComponent { }; render () { - const { intl, hasUnread, columnId, multiColumn, hasAnnouncements, unreadAnnouncements, showAnnouncements } = this.props; + const { intl, hasUnread, columnId, multiColumn, tooSlow, hasAnnouncements, unreadAnnouncements, showAnnouncements } = this.props; const pinned = !!columnId; const { signedIn } = this.context.identity; - let announcementsButton = null; + let announcementsButton, banner; if (hasAnnouncements) { announcementsButton = ( @@ -142,6 +169,10 @@ class HomeTimeline extends PureComponent { ); } + if (tooSlow) { + banner = ; + } + return ( }} />} + emptyMessage={} bindToDocument={!multiColumn} regex={this.props.regex} /> diff --git a/app/javascript/flavours/glitch/features/public_timeline/index.jsx b/app/javascript/flavours/glitch/features/public_timeline/index.jsx index 5bbbea0662..4e4b350f8b 100644 --- a/app/javascript/flavours/glitch/features/public_timeline/index.jsx +++ b/app/javascript/flavours/glitch/features/public_timeline/index.jsx @@ -146,11 +146,8 @@ class PublicTimeline extends PureComponent { - - - - } timelineId={`public${onlyRemote ? ':remote' : (allowLocalOnly ? ':allow_local_only' : '')}${onlyMedia ? ':media' : ''}`} onLoadMore={this.handleLoadMore} trackScroll={!pinned} diff --git a/app/javascript/flavours/glitch/selectors/index.js b/app/javascript/flavours/glitch/selectors/index.js index e02bfab5db..a296ef8ede 100644 --- a/app/javascript/flavours/glitch/selectors/index.js +++ b/app/javascript/flavours/glitch/selectors/index.js @@ -137,3 +137,7 @@ export const getAccountHidden = createSelector([ ], (hidden, followingOrRequested, isSelf) => { return hidden && !(isSelf || followingOrRequested); }); + +export const getStatusList = createSelector([ + (state, type) => state.getIn(['status_lists', type, 'items']), +], (items) => items.toList()); diff --git a/app/javascript/flavours/glitch/styles/components/columns.scss b/app/javascript/flavours/glitch/styles/components/columns.scss index 533c5eda0f..97c8a84d69 100644 --- a/app/javascript/flavours/glitch/styles/components/columns.scss +++ b/app/javascript/flavours/glitch/styles/components/columns.scss @@ -960,26 +960,70 @@ $ui-header-height: 55px; } .dismissable-banner { - background: $ui-base-color; - border-bottom: 1px solid lighten($ui-base-color, 8%); - display: flex; - align-items: center; - gap: 30px; + position: relative; + margin: 10px; + margin-bottom: 5px; + border-radius: 8px; + border: 1px solid $highlight-text-color; + background: rgba($highlight-text-color, 0.15); + padding-inline-end: 45px; + overflow: hidden; + + &__background-image { + width: 125%; + position: absolute; + bottom: -25%; + inset-inline-end: -25%; + z-index: -1; + opacity: 0.15; + mix-blend-mode: luminosity; + } &__message { flex: 1 1 auto; - padding: 20px 15px; - cursor: default; - font-size: 14px; - line-height: 18px; + padding: 15px; + font-size: 15px; + line-height: 22px; + font-weight: 500; color: $primary-text-color; + + p { + margin-bottom: 15px; + + &:last-child { + margin-bottom: 0; + } + } + + h1 { + color: $highlight-text-color; + font-size: 22px; + line-height: 33px; + font-weight: 700; + margin-bottom: 15px; + } + + &__actions { + display: flex; + align-items: center; + gap: 4px; + margin-top: 30px; + } + + .button-tertiary { + background: rgba($ui-base-color, 0.15); + backdrop-filter: blur(8px); + } } &__action { - padding: 15px; - flex: 0 0 auto; - display: flex; - align-items: center; - justify-content: center; + position: absolute; + inset-inline-end: 0; + top: 0; + padding: 10px; + + .icon-button { + color: $highlight-text-color; + } } } diff --git a/app/javascript/flavours/glitch/styles/mastodon-light/diff.scss b/app/javascript/flavours/glitch/styles/mastodon-light/diff.scss index 2294f2d7c2..cfcdd742e1 100644 --- a/app/javascript/flavours/glitch/styles/mastodon-light/diff.scss +++ b/app/javascript/flavours/glitch/styles/mastodon-light/diff.scss @@ -653,11 +653,6 @@ html { border: 1px solid lighten($ui-base-color, 8%); } -.dismissable-banner { - border-left: 1px solid lighten($ui-base-color, 8%); - border-right: 1px solid lighten($ui-base-color, 8%); -} - .status__content, .reply-indicator__content { a { From 5def74a4366891944ed4493d99d31207a8eff3da Mon Sep 17 00:00:00 2001 From: Claire Date: Fri, 23 Jun 2023 14:44:54 +0200 Subject: [PATCH 098/118] [Glitch] Remove unique accounts condition from Home onboarding prompt Port 0842a68532b1d1f5732e0ba6f2c62b5522114167 to glitch-soc Signed-off-by: Claire --- .../glitch/features/home_timeline/index.jsx | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/app/javascript/flavours/glitch/features/home_timeline/index.jsx b/app/javascript/flavours/glitch/features/home_timeline/index.jsx index 7036857020..b22f2d886b 100644 --- a/app/javascript/flavours/glitch/features/home_timeline/index.jsx +++ b/app/javascript/flavours/glitch/features/home_timeline/index.jsx @@ -11,19 +11,20 @@ import { connect } from 'react-redux'; import { createSelector } from 'reselect'; import { fetchAnnouncements, toggleShowAnnouncements } from 'flavours/glitch/actions/announcements'; -import { addColumn, removeColumn, moveColumn } from 'flavours/glitch/actions/columns'; -import { expandHomeTimeline } from 'flavours/glitch/actions/timelines'; -import Column from 'flavours/glitch/components/column'; -import ColumnHeader from 'flavours/glitch/components/column_header'; import { IconWithBadge } from 'flavours/glitch/components/icon_with_badge'; import { NotSignedInIndicator } from 'flavours/glitch/components/not_signed_in_indicator'; import AnnouncementsContainer from 'flavours/glitch/features/getting_started/containers/announcements_container'; -import StatusListContainer from 'flavours/glitch/features/ui/containers/status_list_container'; +import { me } from 'flavours/glitch/initial_state'; + +import { addColumn, removeColumn, moveColumn } from '../../actions/columns'; +import { expandHomeTimeline } from '../../actions/timelines'; +import Column from '../../components/column'; +import ColumnHeader from '../../components/column_header'; +import StatusListContainer from '../ui/containers/status_list_container'; import { ExplorePrompt } from './components/explore_prompt'; import ColumnSettingsContainer from './containers/column_settings_container'; - const messages = defineMessages({ title: { id: 'column.home', defaultMessage: 'Home' }, show_announcements: { id: 'home.show_announcements', defaultMessage: 'Show announcements' }, @@ -34,22 +35,19 @@ const getHomeFeedSpeed = createSelector([ state => state.getIn(['timelines', 'home', 'items'], ImmutableList()), state => state.get('statuses'), ], (statusIds, statusMap) => { - const statuses = statusIds.take(20).map(id => statusMap.get(id)); - const uniqueAccountIds = (new Set(statuses.map(status => status.get('account')).toArray())).size; + const statuses = statusIds.map(id => statusMap.get(id)).filter(status => status.get('account') !== me).take(20); const oldest = new Date(statuses.getIn([statuses.size - 1, 'created_at'], 0)); const newest = new Date(statuses.getIn([0, 'created_at'], 0)); const averageGap = (newest - oldest) / (1000 * (statuses.size + 1)); // Average gap between posts on first page in seconds return { - unique: uniqueAccountIds, gap: averageGap, newest, }; }); const homeTooSlow = createSelector(getHomeFeedSpeed, speed => - speed.unique < 5 // If there are fewer than 5 different accounts visible - || speed.gap > (30 * 60) // If the average gap between posts is more than 20 minutes + speed.gap > (30 * 60) // If the average gap between posts is more than 20 minutes || (Date.now() - speed.newest) > (1000 * 3600) // If the most recent post is from over an hour ago ); From 2b78c07ef16c8cb89f95393aa12f0d79efdc41c2 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 26 Jun 2023 05:26:41 +0200 Subject: [PATCH 099/118] Fix search not being easily findable on smaller screens in web UI (#25576) --- .../mastodon/features/ui/components/header.jsx | 18 +++++++++++++----- app/javascript/mastodon/locales/en.json | 2 +- app/javascript/styles/mastodon/components.scss | 5 +++-- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/app/javascript/mastodon/features/ui/components/header.jsx b/app/javascript/mastodon/features/ui/components/header.jsx index 05abc1ca63..bdd1c73052 100644 --- a/app/javascript/mastodon/features/ui/components/header.jsx +++ b/app/javascript/mastodon/features/ui/components/header.jsx @@ -1,7 +1,7 @@ import PropTypes from 'prop-types'; import { PureComponent } from 'react'; -import { FormattedMessage } from 'react-intl'; +import { FormattedMessage, defineMessages, injectIntl } from 'react-intl'; import { Link, withRouter } from 'react-router-dom'; @@ -10,6 +10,7 @@ import { connect } from 'react-redux'; import { openModal } from 'mastodon/actions/modal'; import { fetchServer } from 'mastodon/actions/server'; import { Avatar } from 'mastodon/components/avatar'; +import { Icon } from 'mastodon/components/icon'; import { WordmarkLogo, SymbolLogo } from 'mastodon/components/logo'; import { registrationsOpen, me } from 'mastodon/initial_state'; @@ -21,6 +22,10 @@ const Account = connect(state => ({ )); +const messages = defineMessages({ + search: { id: 'navigation_bar.search', defaultMessage: 'Search' }, +}); + const mapStateToProps = (state) => ({ signupUrl: state.getIn(['server', 'server', 'registrations', 'url'], null) || '/auth/sign_up', }); @@ -44,7 +49,8 @@ class Header extends PureComponent { openClosedRegistrationsModal: PropTypes.func, location: PropTypes.object, signupUrl: PropTypes.string.isRequired, - dispatchServer: PropTypes.func + dispatchServer: PropTypes.func, + intl: PropTypes.object.isRequired, }; componentDidMount () { @@ -54,14 +60,15 @@ class Header extends PureComponent { render () { const { signedIn } = this.context.identity; - const { location, openClosedRegistrationsModal, signupUrl } = this.props; + const { location, openClosedRegistrationsModal, signupUrl, intl } = this.props; let content; if (signedIn) { content = ( <> - {location.pathname !== '/publish' && } + {location.pathname !== '/search' && } + {location.pathname !== '/publish' && } ); @@ -84,6 +91,7 @@ class Header extends PureComponent { content = ( <> + {location.pathname !== '/search' && } {signupButton} @@ -106,4 +114,4 @@ class Header extends PureComponent { } -export default withRouter(connect(mapStateToProps, mapDispatchToProps)(Header)); +export default injectIntl(withRouter(connect(mapStateToProps, mapDispatchToProps)(Header))); diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 63ab26bc56..da3b6e19eb 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -147,7 +147,7 @@ "compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices", "compose_form.poll.switch_to_single": "Change poll to allow for a single choice", "compose_form.publish": "Publish", - "compose_form.publish_form": "Publish", + "compose_form.publish_form": "New post", "compose_form.publish_loud": "{publish}!", "compose_form.save_changes": "Save changes", "compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}", diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 81dee20d33..15a14ce57f 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -133,12 +133,13 @@ color: $darker-text-color; background: transparent; padding: 6px 17px; - border: 1px solid $ui-primary-color; + border: 1px solid lighten($ui-base-color, 12%); &:active, &:focus, &:hover { - border-color: lighten($ui-primary-color, 4%); + background: lighten($ui-base-color, 4%); + border-color: lighten($ui-base-color, 16%); color: lighten($darker-text-color, 4%); text-decoration: none; } From 65aa04647a6a5cabdea11acf960bc4912529c738 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 26 Jun 2023 05:26:54 +0200 Subject: [PATCH 100/118] Fix onboarding prompt flashing while home feed is loading in web UI (#25579) --- .../mastodon/features/home_timeline/index.jsx | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/app/javascript/mastodon/features/home_timeline/index.jsx b/app/javascript/mastodon/features/home_timeline/index.jsx index 389efcc875..41e5aa3447 100644 --- a/app/javascript/mastodon/features/home_timeline/index.jsx +++ b/app/javascript/mastodon/features/home_timeline/index.jsx @@ -33,9 +33,11 @@ const messages = defineMessages({ const getHomeFeedSpeed = createSelector([ state => state.getIn(['timelines', 'home', 'items'], ImmutableList()), + state => state.getIn(['timelines', 'home', 'pendingItems'], ImmutableList()), state => state.get('statuses'), -], (statusIds, statusMap) => { - const statuses = statusIds.map(id => statusMap.get(id)).filter(status => status.get('account') !== me).take(20); +], (statusIds, pendingStatusIds, statusMap) => { + const recentStatusIds = pendingStatusIds.size > 0 ? pendingStatusIds : statusIds; + const statuses = recentStatusIds.map(id => statusMap.get(id)).filter(status => status?.get('account') !== me).take(20); const oldest = new Date(statuses.getIn([statuses.size - 1, 'created_at'], 0)); const newest = new Date(statuses.getIn([0, 'created_at'], 0)); const averageGap = (newest - oldest) / (1000 * (statuses.size + 1)); // Average gap between posts on first page in seconds @@ -46,9 +48,14 @@ const getHomeFeedSpeed = createSelector([ }; }); -const homeTooSlow = createSelector(getHomeFeedSpeed, speed => - speed.gap > (30 * 60) // If the average gap between posts is more than 20 minutes - || (Date.now() - speed.newest) > (1000 * 3600) // If the most recent post is from over an hour ago +const homeTooSlow = createSelector([ + state => state.getIn(['timelines', 'home', 'isLoading']), + state => state.getIn(['timelines', 'home', 'isPartial']), + getHomeFeedSpeed, +], (isLoading, isPartial, speed) => + !isLoading && !isPartial // Only if the home feed has finished loading + && (speed.gap > (30 * 60) // If the average gap between posts is more than 20 minutes + || (Date.now() - speed.newest) > (1000 * 3600)) // If the most recent post is from over an hour ago ); const mapStateToProps = state => ({ From 7b024baf50f58ed8062b2dbf34e3e40d9af31e62 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 26 Jun 2023 05:27:07 +0200 Subject: [PATCH 101/118] Change header backgrounds to use fewer different colors in web UI (#25577) --- .../styles/mastodon/components.scss | 62 +++++++------------ 1 file changed, 22 insertions(+), 40 deletions(-) diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 15a14ce57f..53b68a8434 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -3147,7 +3147,7 @@ $ui-header-height: 55px; .column-back-button { box-sizing: border-box; width: 100%; - background: lighten($ui-base-color, 4%); + background: $ui-base-color; border-radius: 4px 4px 0 0; color: $highlight-text-color; cursor: pointer; @@ -3155,6 +3155,7 @@ $ui-header-height: 55px; font-size: 16px; line-height: inherit; border: 0; + border-bottom: 1px solid lighten($ui-base-color, 8%); text-align: unset; padding: 15px; margin: 0; @@ -3167,7 +3168,7 @@ $ui-header-height: 55px; } .column-header__back-button { - background: lighten($ui-base-color, 4%); + background: $ui-base-color; border: 0; font-family: inherit; color: $highlight-text-color; @@ -3202,7 +3203,7 @@ $ui-header-height: 55px; padding: 15px; position: absolute; inset-inline-end: 0; - top: -48px; + top: -50px; } .react-toggle { @@ -3883,7 +3884,8 @@ a.status-card.compact:hover { .column-header { display: flex; font-size: 16px; - background: lighten($ui-base-color, 4%); + background: $ui-base-color; + border-bottom: 1px solid lighten($ui-base-color, 8%); border-radius: 4px 4px 0 0; flex: 0 0 auto; cursor: pointer; @@ -3938,7 +3940,7 @@ a.status-card.compact:hover { } .column-header__button { - background: lighten($ui-base-color, 4%); + background: $ui-base-color; border: 0; color: $darker-text-color; cursor: pointer; @@ -3946,16 +3948,15 @@ a.status-card.compact:hover { padding: 0 15px; &:hover { - color: lighten($darker-text-color, 7%); + color: lighten($darker-text-color, 4%); } &.active { color: $primary-text-color; - background: lighten($ui-base-color, 8%); + background: lighten($ui-base-color, 4%); &:hover { color: $primary-text-color; - background: lighten($ui-base-color, 8%); } } @@ -3969,6 +3970,7 @@ a.status-card.compact:hover { max-height: 70vh; overflow: hidden; overflow-y: auto; + border-bottom: 1px solid lighten($ui-base-color, 8%); color: $darker-text-color; transition: max-height 150ms ease-in-out, opacity 300ms linear; opacity: 1; @@ -3988,13 +3990,13 @@ a.status-card.compact:hover { height: 0; background: transparent; border: 0; - border-top: 1px solid lighten($ui-base-color, 12%); + border-top: 1px solid lighten($ui-base-color, 8%); margin: 10px 0; } } .column-header__collapsible-inner { - background: lighten($ui-base-color, 8%); + background: $ui-base-color; padding: 15px; } @@ -4407,17 +4409,13 @@ a.status-card.compact:hover { color: $primary-text-color; margin-bottom: 4px; display: block; - background-color: $base-overlay-background; - text-transform: uppercase; + background-color: rgba($black, 0.45); + backdrop-filter: blur(10px) saturate(180%) contrast(75%) brightness(70%); font-size: 11px; - font-weight: 500; - padding: 4px; + text-transform: uppercase; + font-weight: 700; + padding: 2px 6px; border-radius: 4px; - opacity: 0.7; - - &:hover { - opacity: 1; - } } .setting-toggle { @@ -4477,6 +4475,7 @@ a.status-card.compact:hover { .follow_requests-unlocked_explanation { background: darken($ui-base-color, 4%); + border-bottom: 1px solid lighten($ui-base-color, 8%); contain: initial; flex-grow: 0; } @@ -6161,6 +6160,7 @@ a.status-card.compact:hover { display: block; color: $white; background: rgba($black, 0.65); + backdrop-filter: blur(10px) saturate(180%) contrast(75%) brightness(70%); padding: 2px 6px; border-radius: 4px; font-size: 11px; @@ -6838,24 +6838,6 @@ a.status-card.compact:hover { } } } - - &.directory__section-headline { - background: darken($ui-base-color, 2%); - border-bottom-color: transparent; - - a, - button { - &.active { - &::before { - display: none; - } - - &::after { - border-color: transparent transparent darken($ui-base-color, 7%); - } - } - } - } } .filter-form { @@ -7370,7 +7352,6 @@ noscript { .account__header { overflow: hidden; - background: lighten($ui-base-color, 4%); &.inactive { opacity: 0.5; @@ -7392,6 +7373,7 @@ noscript { height: 145px; position: relative; background: darken($ui-base-color, 4%); + border-bottom: 1px solid lighten($ui-base-color, 8%); img { object-fit: cover; @@ -7405,7 +7387,7 @@ noscript { &__bar { position: relative; padding: 0 20px; - border-bottom: 1px solid lighten($ui-base-color, 12%); + border-bottom: 1px solid lighten($ui-base-color, 8%); .avatar { display: block; @@ -7414,7 +7396,7 @@ noscript { .account__avatar { background: darken($ui-base-color, 8%); - border: 2px solid lighten($ui-base-color, 4%); + border: 2px solid $ui-base-color; } } } From ed96e28c9e47a0b7e3cdf538772d37d9b16ddc89 Mon Sep 17 00:00:00 2001 From: Claire Date: Mon, 26 Jun 2023 12:30:35 +0200 Subject: [PATCH 102/118] =?UTF-8?q?Fix=20compose=20form=20not=20being=20sh?= =?UTF-8?q?own=20when=20clicking=20=E2=80=9CMake=20your=20first=20post?= =?UTF-8?q?=E2=80=9D=20on=20mobile=20(#25581)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/javascript/mastodon/actions/compose.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/javascript/mastodon/actions/compose.js b/app/javascript/mastodon/actions/compose.js index 2ad7678caa..99610ac31f 100644 --- a/app/javascript/mastodon/actions/compose.js +++ b/app/javascript/mastodon/actions/compose.js @@ -129,13 +129,13 @@ export function resetCompose() { }; } -export const focusCompose = (routerHistory, defaultText) => dispatch => { +export const focusCompose = (routerHistory, defaultText) => (dispatch, getState) => { dispatch({ type: COMPOSE_FOCUS, defaultText, }); - ensureComposeIsVisible(routerHistory); + ensureComposeIsVisible(getState, routerHistory); }; export function mentionCompose(account, routerHistory) { From ae30a60b1f6b7f51be38fe541e42a80ee2242d79 Mon Sep 17 00:00:00 2001 From: Renaud Chaput Date: Mon, 26 Jun 2023 12:31:48 +0200 Subject: [PATCH 103/118] Improve dismissable banner buttons when they dont fit on 1 line (#25580) Co-authored-by: Claire --- .../home_timeline/components/explore_prompt.jsx | 10 ++++++---- app/javascript/styles/mastodon/components.scss | 13 +++++++++++-- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/app/javascript/mastodon/features/home_timeline/components/explore_prompt.jsx b/app/javascript/mastodon/features/home_timeline/components/explore_prompt.jsx index 172f1a96c8..a6993c6418 100644 --- a/app/javascript/mastodon/features/home_timeline/components/explore_prompt.jsx +++ b/app/javascript/mastodon/features/home_timeline/components/explore_prompt.jsx @@ -15,9 +15,11 @@ export const ExplorePrompt = () => (

-
- - +
+
+ + +
-); \ No newline at end of file +); diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 53b68a8434..3bf0b10edb 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -8768,9 +8768,18 @@ noscript { &__actions { display: flex; - align-items: center; + flex-wrap: wrap; gap: 4px; - margin-top: 30px; + + &__wrapper { + display: flex; + margin-top: 30px; + } + + .button { + display: block; + flex-grow: 1; + } } .button-tertiary { From bb4756c823eef72ab6f9c52808726846a85a39f3 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 26 Jun 2023 14:17:41 +0200 Subject: [PATCH 104/118] Change files to be deleted in batches instead of one-by-one (#23302) --- app/lib/attachment_batch.rb | 103 +++++++++++++++++++++ app/lib/vacuum/media_attachments_vacuum.rb | 10 +- app/services/clear_domain_media_service.rb | 30 ++---- 3 files changed, 114 insertions(+), 29 deletions(-) create mode 100644 app/lib/attachment_batch.rb diff --git a/app/lib/attachment_batch.rb b/app/lib/attachment_batch.rb new file mode 100644 index 0000000000..41dc36b64c --- /dev/null +++ b/app/lib/attachment_batch.rb @@ -0,0 +1,103 @@ +# frozen_string_literal: true + +class AttachmentBatch + # Maximum amount of objects you can delete in an S3 API call. It's + # important to remember that this does not correspond to the number + # of records in the batch, since records can have multiple attachments + LIMIT = 1_000 + + # Attributes generated and maintained by Paperclip (not all of them + # are always used on every class, however) + NULLABLE_ATTRIBUTES = %w( + file_name + content_type + file_size + fingerprint + created_at + updated_at + ).freeze + + # Styles that are always present even when not explicitly defined + BASE_STYLES = %i(original).freeze + + attr_reader :klass, :records, :storage_mode + + def initialize(klass, records) + @klass = klass + @records = records + @storage_mode = Paperclip::Attachment.default_options[:storage] + @attachment_names = klass.attachment_definitions.keys + end + + def delete + remove_files + batch.delete_all + end + + def clear + remove_files + batch.update_all(nullified_attributes) # rubocop:disable Rails/SkipsModelValidations + end + + private + + def batch + klass.where(id: records.map(&:id)) + end + + def remove_files + keys = [] + + logger.debug { "Preparing to delete attachments for #{records.size} records" } + + records.each do |record| + @attachment_names.each do |attachment_name| + attachment = record.public_send(attachment_name) + styles = BASE_STYLES | attachment.styles.keys + + next if attachment.blank? + + styles.each do |style| + case @storage_mode + when :s3 + logger.debug { "Adding #{attachment.path(style)} to batch for deletion" } + keys << attachment.style_name_as_path(style) + when :filesystem + logger.debug { "Deleting #{attachment.path(style)}" } + FileUtils.remove_file(attachment.path(style)) + when :fog + logger.debug { "Deleting #{attachment.path(style)}" } + attachment.directory.files.new(key: attachment.path(style)).destroy + end + end + end + end + + return unless storage_mode == :s3 + + # We can batch deletes over S3, but there is a limit of how many + # objects can be processed at once, so we have to potentially + # separate them into multiple calls. + + keys.each_slice(LIMIT) do |keys_slice| + logger.debug { "Deleting #{keys_slice.size} objects" } + + bucket.delete_objects(delete: { + objects: keys_slice.map { |key| { key: key } }, + quiet: true, + }) + end + end + + def bucket + @bucket ||= records.first.public_send(@attachment_names.first).s3_bucket + end + + def nullified_attributes + @attachment_names.flat_map { |attachment_name| NULLABLE_ATTRIBUTES.map { |attribute| "#{attachment_name}_#{attribute}" } & klass.column_names }.index_with(nil) + end + + def logger + Rails.logger + end +end diff --git a/app/lib/vacuum/media_attachments_vacuum.rb b/app/lib/vacuum/media_attachments_vacuum.rb index 7c0a85a9d9..7b21c84bbc 100644 --- a/app/lib/vacuum/media_attachments_vacuum.rb +++ b/app/lib/vacuum/media_attachments_vacuum.rb @@ -15,15 +15,15 @@ class Vacuum::MediaAttachmentsVacuum private def vacuum_cached_files! - media_attachments_past_retention_period.find_each do |media_attachment| - media_attachment.file.destroy - media_attachment.thumbnail.destroy - media_attachment.save + media_attachments_past_retention_period.find_in_batches do |media_attachments| + AttachmentBatch.new(MediaAttachment, media_attachments).clear end end def vacuum_orphaned_records! - orphaned_media_attachments.in_batches.destroy_all + orphaned_media_attachments.find_in_batches do |media_attachments| + AttachmentBatch.new(MediaAttachment, media_attachments).delete + end end def media_attachments_past_retention_period diff --git a/app/services/clear_domain_media_service.rb b/app/services/clear_domain_media_service.rb index 9e70ebe51c..7bf2d62fb0 100644 --- a/app/services/clear_domain_media_service.rb +++ b/app/services/clear_domain_media_service.rb @@ -10,14 +10,6 @@ class ClearDomainMediaService < BaseService private - def invalidate_association_caches!(status_ids) - # Normally, associated models of a status are immutable (except for accounts) - # so they are aggressively cached. After updating the media attachments to no - # longer point to a local file, we need to clear the cache to make those - # changes appear in the API and UI - Rails.cache.delete_multi(status_ids.map { |id| "statuses/#{id}" }) - end - def clear_media! clear_account_images! clear_account_attachments! @@ -25,31 +17,21 @@ class ClearDomainMediaService < BaseService end def clear_account_images! - blocked_domain_accounts.reorder(nil).find_each do |account| - account.avatar.destroy if account.avatar&.exists? - account.header.destroy if account.header&.exists? - account.save + blocked_domain_accounts.reorder(nil).find_in_batches do |accounts| + AttachmentBatch.new(Account, accounts).clear end end def clear_account_attachments! media_from_blocked_domain.reorder(nil).find_in_batches do |attachments| - affected_status_ids = [] - - attachments.each do |attachment| - affected_status_ids << attachment.status_id if attachment.status_id.present? - - attachment.file.destroy if attachment.file&.exists? - attachment.type = :unknown - attachment.save - end - - invalidate_association_caches!(affected_status_ids) unless affected_status_ids.empty? + AttachmentBatch.new(MediaAttachment, attachments).clear end end def clear_emojos! - emojis_from_blocked_domains.destroy_all + emojis_from_blocked_domains.find_in_batches do |custom_emojis| + AttachmentBatch.new(CustomEmoji, custom_emojis).delete + end end def blocked_domain From 7a25af64ddcfac1f4ad3fda2b6f72b03152b202e Mon Sep 17 00:00:00 2001 From: "S.H" Date: Mon, 26 Jun 2023 23:38:19 +0900 Subject: [PATCH 105/118] Remove media attachment only when file was exist (#25586) --- app/lib/attachment_batch.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/lib/attachment_batch.rb b/app/lib/attachment_batch.rb index 41dc36b64c..6372b01319 100644 --- a/app/lib/attachment_batch.rb +++ b/app/lib/attachment_batch.rb @@ -64,7 +64,7 @@ class AttachmentBatch keys << attachment.style_name_as_path(style) when :filesystem logger.debug { "Deleting #{attachment.path(style)}" } - FileUtils.remove_file(attachment.path(style)) + FileUtils.remove_file(attachment.path(style), true) when :fog logger.debug { "Deleting #{attachment.path(style)}" } attachment.directory.files.new(key: attachment.path(style)).destroy From 9caa0475f891ded573739cd00e7bc915b31abb12 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 26 Jun 2023 20:59:58 +0200 Subject: [PATCH 106/118] Update dependency react-redux to v8.1.1 (#25432) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 7acecd4e3a..1bd14820a8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9567,9 +9567,9 @@ react-redux-loading-bar@^5.0.4: react-lifecycles-compat "^3.0.4" react-redux@^8.0.4: - version "8.1.0" - resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-8.1.0.tgz#4e147339f00bbaac7196bc42bc99e6fc412846e7" - integrity sha512-CtHZzAOxi7GQvTph4dVLWwZHAWUjV2kMEQtk50OrN8z3gKxpWg3Tz7JfDw32N3Rpd7fh02z73cF6yZkK467gbQ== + version "8.1.1" + resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-8.1.1.tgz#8e740f3fd864a4cd0de5ba9cdc8ad39cc9e7c81a" + integrity sha512-5W0QaKtEhj+3bC0Nj0NkqkhIv8gLADH/2kYFMTHxCVqQILiWzLv6MaLuV5wJU3BQEdHKzTfcvPN0WMS6SC1oyA== dependencies: "@babel/runtime" "^7.12.1" "@types/hoist-non-react-statics" "^3.3.1" From 0ccf6c0eb73f612f1e727bac64dddea62b296e30 Mon Sep 17 00:00:00 2001 From: Claire Date: Tue, 27 Jun 2023 09:36:11 +0200 Subject: [PATCH 107/118] Fix batch attachment deletion leaving empty directories (#25587) --- app/lib/attachment_batch.rb | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/app/lib/attachment_batch.rb b/app/lib/attachment_batch.rb index 6372b01319..1f87b94336 100644 --- a/app/lib/attachment_batch.rb +++ b/app/lib/attachment_batch.rb @@ -64,7 +64,15 @@ class AttachmentBatch keys << attachment.style_name_as_path(style) when :filesystem logger.debug { "Deleting #{attachment.path(style)}" } - FileUtils.remove_file(attachment.path(style), true) + path = attachment.path(style) + FileUtils.remove_file(path, true) + + begin + FileUtils.rmdir(File.dirname(path), parents: true) + rescue Errno::EEXIST, Errno::ENOTEMPTY, Errno::ENOENT, Errno::EINVAL, Errno::ENOTDIR, Errno::EACCES + # Ignore failure to delete a directory, with the same ignored errors + # as Paperclip + end when :fog logger.debug { "Deleting #{attachment.path(style)}" } attachment.directory.files.new(key: attachment.path(style)).destroy From d9b07b6a11b2e050e7d423f8c1fdfef4b22e810d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 27 Jun 2023 10:19:51 +0200 Subject: [PATCH 108/118] Update dependency rails to v6.1.7.4 (#25606) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 108 +++++++++++++++++++++++++-------------------------- 1 file changed, 54 insertions(+), 54 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 5f3678fe58..c3eb9d4d71 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -18,40 +18,40 @@ GIT GEM remote: https://rubygems.org/ specs: - actioncable (6.1.7.3) - actionpack (= 6.1.7.3) - activesupport (= 6.1.7.3) + actioncable (6.1.7.4) + actionpack (= 6.1.7.4) + activesupport (= 6.1.7.4) nio4r (~> 2.0) websocket-driver (>= 0.6.1) - actionmailbox (6.1.7.3) - actionpack (= 6.1.7.3) - activejob (= 6.1.7.3) - activerecord (= 6.1.7.3) - activestorage (= 6.1.7.3) - activesupport (= 6.1.7.3) + actionmailbox (6.1.7.4) + actionpack (= 6.1.7.4) + activejob (= 6.1.7.4) + activerecord (= 6.1.7.4) + activestorage (= 6.1.7.4) + activesupport (= 6.1.7.4) mail (>= 2.7.1) - actionmailer (6.1.7.3) - actionpack (= 6.1.7.3) - actionview (= 6.1.7.3) - activejob (= 6.1.7.3) - activesupport (= 6.1.7.3) + actionmailer (6.1.7.4) + actionpack (= 6.1.7.4) + actionview (= 6.1.7.4) + activejob (= 6.1.7.4) + activesupport (= 6.1.7.4) mail (~> 2.5, >= 2.5.4) rails-dom-testing (~> 2.0) - actionpack (6.1.7.3) - actionview (= 6.1.7.3) - activesupport (= 6.1.7.3) + actionpack (6.1.7.4) + actionview (= 6.1.7.4) + activesupport (= 6.1.7.4) rack (~> 2.0, >= 2.0.9) rack-test (>= 0.6.3) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.2.0) - actiontext (6.1.7.3) - actionpack (= 6.1.7.3) - activerecord (= 6.1.7.3) - activestorage (= 6.1.7.3) - activesupport (= 6.1.7.3) + actiontext (6.1.7.4) + actionpack (= 6.1.7.4) + activerecord (= 6.1.7.4) + activestorage (= 6.1.7.4) + activesupport (= 6.1.7.4) nokogiri (>= 1.8.5) - actionview (6.1.7.3) - activesupport (= 6.1.7.3) + actionview (6.1.7.4) + activesupport (= 6.1.7.4) builder (~> 3.1) erubi (~> 1.4) rails-dom-testing (~> 2.0) @@ -61,22 +61,22 @@ GEM activemodel (>= 4.1, < 7.1) case_transform (>= 0.2) jsonapi-renderer (>= 0.1.1.beta1, < 0.3) - activejob (6.1.7.3) - activesupport (= 6.1.7.3) + activejob (6.1.7.4) + activesupport (= 6.1.7.4) globalid (>= 0.3.6) - activemodel (6.1.7.3) - activesupport (= 6.1.7.3) - activerecord (6.1.7.3) - activemodel (= 6.1.7.3) - activesupport (= 6.1.7.3) - activestorage (6.1.7.3) - actionpack (= 6.1.7.3) - activejob (= 6.1.7.3) - activerecord (= 6.1.7.3) - activesupport (= 6.1.7.3) + activemodel (6.1.7.4) + activesupport (= 6.1.7.4) + activerecord (6.1.7.4) + activemodel (= 6.1.7.4) + activesupport (= 6.1.7.4) + activestorage (6.1.7.4) + actionpack (= 6.1.7.4) + activejob (= 6.1.7.4) + activerecord (= 6.1.7.4) + activesupport (= 6.1.7.4) marcel (~> 1.0) mini_mime (>= 1.1.0) - activesupport (6.1.7.3) + activesupport (6.1.7.4) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 1.6, < 2) minitest (>= 5.1) @@ -412,7 +412,7 @@ GEM mime-types-data (3.2023.0218.1) mini_mime (1.1.2) mini_portile2 (2.8.2) - minitest (5.18.0) + minitest (5.18.1) msgpack (1.7.1) multi_json (1.15.0) multipart-post (2.3.0) @@ -511,20 +511,20 @@ GEM rack rack-test (2.1.0) rack (>= 1.3) - rails (6.1.7.3) - actioncable (= 6.1.7.3) - actionmailbox (= 6.1.7.3) - actionmailer (= 6.1.7.3) - actionpack (= 6.1.7.3) - actiontext (= 6.1.7.3) - actionview (= 6.1.7.3) - activejob (= 6.1.7.3) - activemodel (= 6.1.7.3) - activerecord (= 6.1.7.3) - activestorage (= 6.1.7.3) - activesupport (= 6.1.7.3) + rails (6.1.7.4) + actioncable (= 6.1.7.4) + actionmailbox (= 6.1.7.4) + actionmailer (= 6.1.7.4) + actionpack (= 6.1.7.4) + actiontext (= 6.1.7.4) + actionview (= 6.1.7.4) + activejob (= 6.1.7.4) + activemodel (= 6.1.7.4) + activerecord (= 6.1.7.4) + activestorage (= 6.1.7.4) + activesupport (= 6.1.7.4) bundler (>= 1.15.0) - railties (= 6.1.7.3) + railties (= 6.1.7.4) sprockets-rails (>= 2.0.0) rails-controller-testing (1.0.5) actionpack (>= 5.0.1.rc1) @@ -539,9 +539,9 @@ GEM rails-i18n (6.0.0) i18n (>= 0.7, < 2) railties (>= 6.0.0, < 7) - railties (6.1.7.3) - actionpack (= 6.1.7.3) - activesupport (= 6.1.7.3) + railties (6.1.7.4) + actionpack (= 6.1.7.4) + activesupport (= 6.1.7.4) method_source rake (>= 12.2) thor (~> 1.0) From ccaa676452ac592efa07214dba5fba7137550bf8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 27 Jun 2023 10:20:09 +0200 Subject: [PATCH 109/118] Update dependency sass to v1.63.6 (#25607) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 1bd14820a8..696df8fa8e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10156,9 +10156,9 @@ sass-loader@^10.2.0: semver "^7.3.2" sass@^1.62.1: - version "1.63.4" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.63.4.tgz#caf60643321044c61f6a0fe638a07abbd31cfb5d" - integrity sha512-Sx/+weUmK+oiIlI+9sdD0wZHsqpbgQg8wSwSnGBjwb5GwqFhYNwwnI+UWZtLjKvKyFlKkatRK235qQ3mokyPoQ== + version "1.63.6" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.63.6.tgz#481610e612902e0c31c46b46cf2dad66943283ea" + integrity sha512-MJuxGMHzaOW7ipp+1KdELtqKbfAWbH7OLIdoSMnVe3EXPMTmxTmlaZDCTsgIpPCs3w99lLo9/zDKkOrJuT5byw== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" From a90190f8137f441304dc1d2e17acd75058038054 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 27 Jun 2023 10:20:46 +0200 Subject: [PATCH 110/118] Update dependency react-textarea-autosize to v8.5.0 (#25610) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 696df8fa8e..697e827764 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9687,9 +9687,9 @@ react-test-renderer@^18.2.0: scheduler "^0.23.0" react-textarea-autosize@*, react-textarea-autosize@^8.4.1: - version "8.4.1" - resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-8.4.1.tgz#bcfc5462727014b808b14ee916c01e275e8a8335" - integrity sha512-aD2C+qK6QypknC+lCMzteOdIjoMbNlgSFmJjCV+DrfTPwp59i/it9mMNf2HDzvRjQgKAyBDPyLJhcrzElf2U4Q== + version "8.5.0" + resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-8.5.0.tgz#bb0f7faf9849850f1c20b6e7fac0309d4b92f87b" + integrity sha512-cp488su3U9RygmHmGpJp0KEt0i/+57KCK33XVPH+50swVRBhIZYh0fGduz2YLKXwl9vSKBZ9HUXcg9PQXUXqIw== dependencies: "@babel/runtime" "^7.20.13" use-composed-ref "^1.3.0" From b7f6280ef46e9e9f408b34d1e90619a029c06132 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 27 Jun 2023 10:21:54 +0200 Subject: [PATCH 111/118] Update dependency pg-connection-string to v2.6.1 (#25605) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 697e827764..024a680e00 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8760,9 +8760,9 @@ pg-cloudflare@^1.1.0: integrity sha512-tGM8/s6frwuAIyRcJ6nWcIvd3+3NmUKIs6OjviIm1HPPFEt5MzQDOTBQyhPWg/m0kCl95M6gA1JaIXtS8KovOA== pg-connection-string@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.6.0.tgz#12a36cc4627df19c25cc1b9b736cc39ee1f73ae8" - integrity sha512-x14ibktcwlHKoHxx9X3uTVW9zIGR41ZB6QNhHb21OPNdCCO3NaRnpJuwKIQSR4u+Yqjx4HCvy7Hh7VSy1U4dGg== + version "2.6.1" + resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.6.1.tgz#78c23c21a35dd116f48e12e23c0965e8d9e2cbfb" + integrity sha512-w6ZzNu6oMmIzEAYVw+RLK0+nqHPt8K3ZnknKi+g48Ak2pr3dtljJW3o+D/n2zzCG07Zoe9VOX3aiKpj+BN0pjg== pg-int8@1.0.1: version "1.0.1" From dbd37f129d152b49e13b7c9773ef07a259686be5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 27 Jun 2023 10:36:21 +0200 Subject: [PATCH 112/118] Update dependency pg to v8.11.1 (#25604) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/yarn.lock b/yarn.lock index 024a680e00..770f33b842 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8754,16 +8754,21 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== -pg-cloudflare@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pg-cloudflare/-/pg-cloudflare-1.1.0.tgz#833d70870d610d14bf9df7afb40e1cba310c17a0" - integrity sha512-tGM8/s6frwuAIyRcJ6nWcIvd3+3NmUKIs6OjviIm1HPPFEt5MzQDOTBQyhPWg/m0kCl95M6gA1JaIXtS8KovOA== +pg-cloudflare@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz#e6d5833015b170e23ae819e8c5d7eaedb472ca98" + integrity sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q== pg-connection-string@^2.6.0: version "2.6.1" resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.6.1.tgz#78c23c21a35dd116f48e12e23c0965e8d9e2cbfb" integrity sha512-w6ZzNu6oMmIzEAYVw+RLK0+nqHPt8K3ZnknKi+g48Ak2pr3dtljJW3o+D/n2zzCG07Zoe9VOX3aiKpj+BN0pjg== +pg-connection-string@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.6.1.tgz#78c23c21a35dd116f48e12e23c0965e8d9e2cbfb" + integrity sha512-w6ZzNu6oMmIzEAYVw+RLK0+nqHPt8K3ZnknKi+g48Ak2pr3dtljJW3o+D/n2zzCG07Zoe9VOX3aiKpj+BN0pjg== + pg-int8@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c" @@ -8774,10 +8779,10 @@ pg-numeric@1.0.2: resolved "https://registry.yarnpkg.com/pg-numeric/-/pg-numeric-1.0.2.tgz#816d9a44026086ae8ae74839acd6a09b0636aa3a" integrity sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw== -pg-pool@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.6.0.tgz#3190df3e4747a0d23e5e9e8045bcd99bda0a712e" - integrity sha512-clFRf2ksqd+F497kWFyM21tMjeikn60oGDmqMT8UBrynEwVEX/5R5xd2sdvdo1cZCFlguORNpVuqxIj+aK4cfQ== +pg-pool@^3.6.1: + version "3.6.1" + resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.6.1.tgz#5a902eda79a8d7e3c928b77abf776b3cb7d351f7" + integrity sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og== pg-protocol@*, pg-protocol@^1.6.0: version "1.6.0" @@ -8809,19 +8814,19 @@ pg-types@^4.0.1: postgres-range "^1.1.1" pg@^8.5.0: - version "8.11.0" - resolved "https://registry.yarnpkg.com/pg/-/pg-8.11.0.tgz#a37e534e94b57a7ed811e926f23a7c56385f55d9" - integrity sha512-meLUVPn2TWgJyLmy7el3fQQVwft4gU5NGyvV0XbD41iU9Jbg8lCH4zexhIkihDzVHJStlt6r088G6/fWeNjhXA== + version "8.11.1" + resolved "https://registry.yarnpkg.com/pg/-/pg-8.11.1.tgz#297e0eb240306b1e9e4f55af8a3bae76ae4810b1" + integrity sha512-utdq2obft07MxaDg0zBJI+l/M3mBRfIpEN3iSemsz0G5F2/VXx+XzqF4oxrbIZXQxt2AZzIUzyVg/YM6xOP/WQ== dependencies: buffer-writer "2.0.0" packet-reader "1.0.0" - pg-connection-string "^2.6.0" - pg-pool "^3.6.0" + pg-connection-string "^2.6.1" + pg-pool "^3.6.1" pg-protocol "^1.6.0" pg-types "^2.1.0" pgpass "1.x" optionalDependencies: - pg-cloudflare "^1.1.0" + pg-cloudflare "^1.1.1" pgpass@1.x: version "1.0.5" From a9ba8263a072cdf16a18dbfc0ec8e359f308d9aa Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 27 Jun 2023 11:28:07 +0200 Subject: [PATCH 113/118] Update mcr.microsoft.com/devcontainers/ruby Docker tag to v1 (#25613) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .devcontainer/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 04ac9560ca..f991036add 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,5 +1,5 @@ # For details, see https://github.com/devcontainers/images/tree/main/src/ruby -FROM mcr.microsoft.com/devcontainers/ruby:0-3.2-bullseye +FROM mcr.microsoft.com/devcontainers/ruby:1-3.2-bullseye # Install Rails # RUN gem install rails webdrivers From ceca93d0d1146dd37da3cb947cf9cfdaeca0f80f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 27 Jun 2023 12:16:17 +0200 Subject: [PATCH 114/118] Update dependency glob to v10.3.0 (#25608) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/yarn.lock b/yarn.lock index 770f33b842..12a992ec38 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5826,9 +5826,9 @@ glob-parent@^6.0.2: is-glob "^4.0.3" glob@^10.2.5, glob@^10.2.6: - version "10.2.7" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.2.7.tgz#9dd2828cd5bc7bd861e7738d91e7113dda41d7d8" - integrity sha512-jTKehsravOJo8IJxUGfZILnkvVJM/MOfHRs8QcXolVef2zNI9Tqyy5+SeuOAZd3upViEZQLyFpQhYiHLrMUNmA== + version "10.3.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.0.tgz#763d02a894f3cdfc521b10bbbbc8e0309e750cce" + integrity sha512-AQ1/SB9HH0yCx1jXAT4vmCbTOPe5RQ+kCurjbel5xSCGhebumUv+GJZfa1rEqor3XIViqwSEmlkZCQD43RWrBg== dependencies: foreground-child "^3.1.0" jackspeak "^2.0.3" @@ -8027,9 +8027,9 @@ minimatch@^5.0.1: brace-expansion "^2.0.1" minimatch@^9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.1.tgz#8a555f541cf976c622daf078bb28f29fb927c253" - integrity sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w== + version "9.0.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.2.tgz#397e387fff22f6795844d00badc903a3d5de7057" + integrity sha512-PZOT9g5v2ojiTL7r1xF6plNHLtOeTpSlDI007As2NlA2aYBMfVom17yqa6QzhmDP8QOhn7LjHTg7DFCVSSa6yg== dependencies: brace-expansion "^2.0.1" @@ -10836,7 +10836,6 @@ stringz@^2.1.0: char-regex "^1.0.2" "strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: - name strip-ansi-cjs version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== From c7c6f02ae61cdbaa8248f6264b22e1ce11aa1f35 Mon Sep 17 00:00:00 2001 From: Claire Date: Tue, 27 Jun 2023 12:32:51 +0200 Subject: [PATCH 115/118] Fix suspending an already-limited domain (#25603) --- app/views/admin/domain_blocks/confirm_suspension.html.haml | 2 +- spec/features/admin/domain_blocks_spec.rb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/views/admin/domain_blocks/confirm_suspension.html.haml b/app/views/admin/domain_blocks/confirm_suspension.html.haml index fa9272c77b..1d28ba1579 100644 --- a/app/views/admin/domain_blocks/confirm_suspension.html.haml +++ b/app/views/admin/domain_blocks/confirm_suspension.html.haml @@ -4,7 +4,7 @@ - content_for :page_title do = t('.title', domain: Addressable::IDNA.to_unicode(@domain_block.domain)) -= simple_form_for @domain_block, url: admin_domain_blocks_path(@domain_block) do |f| += simple_form_for @domain_block, url: admin_domain_blocks_path, method: :post do |f| %p.hint= t('.preamble_html', domain: Addressable::IDNA.to_unicode(@domain_block.domain)) %ul.hint diff --git a/spec/features/admin/domain_blocks_spec.rb b/spec/features/admin/domain_blocks_spec.rb index 3cf60a48ae..c77d604ebd 100644 --- a/spec/features/admin/domain_blocks_spec.rb +++ b/spec/features/admin/domain_blocks_spec.rb @@ -53,7 +53,7 @@ describe 'blocking domains through the moderation interface' do # Confirming updates the block click_on I18n.t('admin.domain_blocks.confirm_suspension.confirm') - expect(domain_block.reload.severity).to eq 'silence' + expect(domain_block.reload.severity).to eq 'suspend' end end @@ -72,7 +72,7 @@ describe 'blocking domains through the moderation interface' do # Confirming updates the block click_on I18n.t('admin.domain_blocks.confirm_suspension.confirm') - expect(domain_block.reload.severity).to eq 'silence' + expect(domain_block.reload.severity).to eq 'suspend' end end end From 2f996375e5f459ec94adf2c7bce3b4524b7de55a Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 26 Jun 2023 05:26:41 +0200 Subject: [PATCH 116/118] [Glitch] Fix search not being easily findable on smaller screens in web UI Port 2b78c07ef16c8cb89f95393aa12f0d79efdc41c2 to glitch-soc Signed-off-by: Claire --- .../glitch/features/ui/components/header.jsx | 18 +++++++++++++----- .../glitch/styles/components/misc.scss | 5 +++-- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/app/javascript/flavours/glitch/features/ui/components/header.jsx b/app/javascript/flavours/glitch/features/ui/components/header.jsx index 873ff20e79..f2b89f3bdc 100644 --- a/app/javascript/flavours/glitch/features/ui/components/header.jsx +++ b/app/javascript/flavours/glitch/features/ui/components/header.jsx @@ -1,7 +1,7 @@ import PropTypes from 'prop-types'; import { PureComponent } from 'react'; -import { FormattedMessage } from 'react-intl'; +import { FormattedMessage, defineMessages, injectIntl } from 'react-intl'; import { Link, withRouter } from 'react-router-dom'; @@ -10,6 +10,7 @@ import { connect } from 'react-redux'; import { openModal } from 'flavours/glitch/actions/modal'; import { fetchServer } from 'flavours/glitch/actions/server'; import { Avatar } from 'flavours/glitch/components/avatar'; +import { Icon } from 'flavours/glitch/components/icon'; import { WordmarkLogo, SymbolLogo } from 'flavours/glitch/components/logo'; import Permalink from 'flavours/glitch/components/permalink'; import { registrationsOpen, me } from 'flavours/glitch/initial_state'; @@ -22,6 +23,10 @@ const Account = connect(state => ({ )); +const messages = defineMessages({ + search: { id: 'navigation_bar.search', defaultMessage: 'Search' }, +}); + const mapStateToProps = (state) => ({ signupUrl: state.getIn(['server', 'server', 'registrations', 'url'], null) || '/auth/sign_up', }); @@ -45,7 +50,8 @@ class Header extends PureComponent { openClosedRegistrationsModal: PropTypes.func, location: PropTypes.object, signupUrl: PropTypes.string.isRequired, - dispatchServer: PropTypes.func + dispatchServer: PropTypes.func, + intl: PropTypes.object.isRequired, }; componentDidMount () { @@ -55,14 +61,15 @@ class Header extends PureComponent { render () { const { signedIn } = this.context.identity; - const { location, openClosedRegistrationsModal, signupUrl } = this.props; + const { location, openClosedRegistrationsModal, signupUrl, intl } = this.props; let content; if (signedIn) { content = ( <> - {location.pathname !== '/publish' && } + {location.pathname !== '/search' && } + {location.pathname !== '/publish' && } ); @@ -85,6 +92,7 @@ class Header extends PureComponent { content = ( <> + {location.pathname !== '/search' && } {signupButton} @@ -107,4 +115,4 @@ class Header extends PureComponent { } -export default withRouter(connect(mapStateToProps, mapDispatchToProps)(Header)); +export default injectIntl(withRouter(connect(mapStateToProps, mapDispatchToProps)(Header))); diff --git a/app/javascript/flavours/glitch/styles/components/misc.scss b/app/javascript/flavours/glitch/styles/components/misc.scss index 53620eeb3c..208204021a 100644 --- a/app/javascript/flavours/glitch/styles/components/misc.scss +++ b/app/javascript/flavours/glitch/styles/components/misc.scss @@ -108,12 +108,13 @@ text-transform: none; background: transparent; padding: 6px 17px; - border: 1px solid $ui-primary-color; + border: 1px solid lighten($ui-base-color, 12%); &:active, &:focus, &:hover { - border-color: lighten($ui-primary-color, 4%); + background: lighten($ui-base-color, 4%); + border-color: lighten($ui-base-color, 16%); color: lighten($darker-text-color, 4%); text-decoration: none; } From 4faa4eb3c45986dd0019641fbf15a9a59e9497cf Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 26 Jun 2023 05:26:54 +0200 Subject: [PATCH 117/118] [Glitch] Fix onboarding prompt flashing while home feed is loading in web UI Port 65aa04647a6a5cabdea11acf960bc4912529c738 to glitch-soc Signed-off-by: Claire --- .../glitch/features/home_timeline/index.jsx | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/app/javascript/flavours/glitch/features/home_timeline/index.jsx b/app/javascript/flavours/glitch/features/home_timeline/index.jsx index b22f2d886b..9a110f06e7 100644 --- a/app/javascript/flavours/glitch/features/home_timeline/index.jsx +++ b/app/javascript/flavours/glitch/features/home_timeline/index.jsx @@ -33,9 +33,11 @@ const messages = defineMessages({ const getHomeFeedSpeed = createSelector([ state => state.getIn(['timelines', 'home', 'items'], ImmutableList()), + state => state.getIn(['timelines', 'home', 'pendingItems'], ImmutableList()), state => state.get('statuses'), -], (statusIds, statusMap) => { - const statuses = statusIds.map(id => statusMap.get(id)).filter(status => status.get('account') !== me).take(20); +], (statusIds, pendingStatusIds, statusMap) => { + const recentStatusIds = pendingStatusIds.size > 0 ? pendingStatusIds : statusIds; + const statuses = recentStatusIds.map(id => statusMap.get(id)).filter(status => status?.get('account') !== me).take(20); const oldest = new Date(statuses.getIn([statuses.size - 1, 'created_at'], 0)); const newest = new Date(statuses.getIn([0, 'created_at'], 0)); const averageGap = (newest - oldest) / (1000 * (statuses.size + 1)); // Average gap between posts on first page in seconds @@ -46,9 +48,14 @@ const getHomeFeedSpeed = createSelector([ }; }); -const homeTooSlow = createSelector(getHomeFeedSpeed, speed => - speed.gap > (30 * 60) // If the average gap between posts is more than 20 minutes - || (Date.now() - speed.newest) > (1000 * 3600) // If the most recent post is from over an hour ago +const homeTooSlow = createSelector([ + state => state.getIn(['timelines', 'home', 'isLoading']), + state => state.getIn(['timelines', 'home', 'isPartial']), + getHomeFeedSpeed, +], (isLoading, isPartial, speed) => + !isLoading && !isPartial // Only if the home feed has finished loading + && (speed.gap > (30 * 60) // If the average gap between posts is more than 20 minutes + || (Date.now() - speed.newest) > (1000 * 3600)) // If the most recent post is from over an hour ago ); const mapStateToProps = state => ({ From c43cfd24064120b0e75cdcfa352997382fdea6eb Mon Sep 17 00:00:00 2001 From: Renaud Chaput Date: Mon, 26 Jun 2023 12:31:48 +0200 Subject: [PATCH 118/118] [Glitch] Improve dismissable banner buttons when they dont fit on 1 line Port ae30a60b1f6b7f51be38fe541e42a80ee2242d79 to glitch-soc Co-authored-by: Claire Signed-off-by: Claire --- .../home_timeline/components/explore_prompt.jsx | 8 +++++--- .../flavours/glitch/styles/components/columns.scss | 13 +++++++++++-- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/app/javascript/flavours/glitch/features/home_timeline/components/explore_prompt.jsx b/app/javascript/flavours/glitch/features/home_timeline/components/explore_prompt.jsx index 972dedd3be..3eb28c59a1 100644 --- a/app/javascript/flavours/glitch/features/home_timeline/components/explore_prompt.jsx +++ b/app/javascript/flavours/glitch/features/home_timeline/components/explore_prompt.jsx @@ -15,9 +15,11 @@ export const ExplorePrompt = () => (

-
- - +
+
+ + +
); diff --git a/app/javascript/flavours/glitch/styles/components/columns.scss b/app/javascript/flavours/glitch/styles/components/columns.scss index 97c8a84d69..a296a31613 100644 --- a/app/javascript/flavours/glitch/styles/components/columns.scss +++ b/app/javascript/flavours/glitch/styles/components/columns.scss @@ -1005,9 +1005,18 @@ $ui-header-height: 55px; &__actions { display: flex; - align-items: center; + flex-wrap: wrap; gap: 4px; - margin-top: 30px; + + &__wrapper { + display: flex; + margin-top: 30px; + } + + .button { + display: block; + flex-grow: 1; + } } .button-tertiary {