Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 8 additions & 8 deletions .github/workflows/master.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4495,28 +4495,28 @@ jobs:

RegressionTestsRelease:
needs: [config_workflow, build_amd_binary]
if: ${{ !cancelled() && !contains(needs.*.outputs.pipeline_status, 'failure') && !contains(fromJson(needs.config_workflow.outputs.data).workflow_config.custom_data.ci_exclude_tags, 'regression')}}
if: ${{ !cancelled() && !contains(needs.*.outputs.pipeline_status, 'failure') && !contains(fromJson(needs.config_workflow.outputs.data).JOB_KV_DATA.ci_exclude_tags, 'regression')}}
uses: ./.github/workflows/regression.yml
secrets: inherit
with:
runner_type: altinity-regression-tester
commit: c5cae9b244e0839fb307a9fb67a40fe80d93810b
commit: 2cae02cfeafdf95cefaba51a6014dbace2c011ad
arch: release
build_sha: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
timeout_minutes: 300
workflow_config: ${{ needs.config_workflow.outputs.data.workflow_config }}
timeout_minutes: 210
workflow_config: ${{ needs.config_workflow.outputs.data }}
RegressionTestsAarch64:
needs: [config_workflow, build_arm_binary]
if: ${{ !cancelled() && !contains(needs.*.outputs.pipeline_status, 'failure') && !contains(fromJson(needs.config_workflow.outputs.data).workflow_config.custom_data.ci_exclude_tags, 'regression') && !contains(fromJson(needs.config_workflow.outputs.data).workflow_config.custom_data.ci_exclude_tags, 'aarch64')}}
if: ${{ !cancelled() && !contains(needs.*.outputs.pipeline_status, 'failure') && !contains(fromJson(needs.config_workflow.outputs.data).JOB_KV_DATA.ci_exclude_tags, 'regression') && !contains(fromJson(needs.config_workflow.outputs.data).workflow_config.custom_data.ci_exclude_tags, 'aarch64')}}
uses: ./.github/workflows/regression.yml
secrets: inherit
with:
runner_type: altinity-regression-tester-aarch64
commit: c5cae9b244e0839fb307a9fb67a40fe80d93810b
commit: 2cae02cfeafdf95cefaba51a6014dbace2c011ad
arch: aarch64
build_sha: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
timeout_minutes: 300
workflow_config: ${{ needs.config_workflow.outputs.data.workflow_config }}
timeout_minutes: 210
workflow_config: ${{ needs.config_workflow.outputs.data }}

SignRelease:
needs: [config_workflow, build_amd_release]
Expand Down
16 changes: 8 additions & 8 deletions .github/workflows/pull_request.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4685,28 +4685,28 @@ jobs:

RegressionTestsRelease:
needs: [config_workflow, build_amd_binary]
if: ${{ !cancelled() && !contains(needs.*.outputs.pipeline_status, 'failure') && !contains(fromJson(needs.config_workflow.outputs.data).workflow_config.custom_data.ci_exclude_tags, 'regression')}}
if: ${{ !cancelled() && !contains(needs.*.outputs.pipeline_status, 'failure') && !contains(fromJson(needs.config_workflow.outputs.data).JOB_KV_DATA.ci_exclude_tags, 'regression')}}
uses: ./.github/workflows/regression.yml
secrets: inherit
with:
runner_type: altinity-regression-tester
commit: c5cae9b244e0839fb307a9fb67a40fe80d93810b
commit: 2cae02cfeafdf95cefaba51a6014dbace2c011ad
arch: release
build_sha: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
timeout_minutes: 300
workflow_config: ${{ needs.config_workflow.outputs.data.workflow_config }}
timeout_minutes: 210
workflow_config: ${{ needs.config_workflow.outputs.data }}
RegressionTestsAarch64:
needs: [config_workflow, build_arm_binary]
if: ${{ !cancelled() && !contains(needs.*.outputs.pipeline_status, 'failure') && !contains(fromJson(needs.config_workflow.outputs.data).workflow_config.custom_data.ci_exclude_tags, 'regression') && !contains(fromJson(needs.config_workflow.outputs.data).workflow_config.custom_data.ci_exclude_tags, 'aarch64')}}
if: ${{ !cancelled() && !contains(needs.*.outputs.pipeline_status, 'failure') && !contains(fromJson(needs.config_workflow.outputs.data).JOB_KV_DATA.ci_exclude_tags, 'regression') && !contains(fromJson(needs.config_workflow.outputs.data).workflow_config.custom_data.ci_exclude_tags, 'aarch64')}}
uses: ./.github/workflows/regression.yml
secrets: inherit
with:
runner_type: altinity-regression-tester-aarch64
commit: c5cae9b244e0839fb307a9fb67a40fe80d93810b
commit: 2cae02cfeafdf95cefaba51a6014dbace2c011ad
arch: aarch64
build_sha: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
timeout_minutes: 300
workflow_config: ${{ needs.config_workflow.outputs.data.workflow_config }}
timeout_minutes: 210
workflow_config: ${{ needs.config_workflow.outputs.data }}

FinishCIReport:
if: ${{ !cancelled() }}
Expand Down
13 changes: 7 additions & 6 deletions .github/workflows/regression-reusable-suite.yml
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ jobs:
SUITE_EXECUTABLE: ${{ inputs.suite_executable }}
STORAGE: ${{ inputs.storage_path }}
PART: ${{ inputs.part }}
REPORT_JOB_NAME: ${{ format('{0}{1}', inputs.job_name != '' && inputs.job_name || inputs.suite_name, inputs.part != '' && format('_{0}', inputs.part) || '') }}
# AWS credentials
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
Expand All @@ -98,7 +99,7 @@ jobs:
--local
--collect-service-logs
--output ${{ inputs.output_format }}
--attr project="${GITHUB_REPOSITORY}" project.id="${GITHUB_REPOSITORY_ID}" user.name="${GITHUB_ACTOR}" version="${{ fromJson(inputs.workflow_config).custom_data.version.string }}" package="$clickhouse_path" repository="https://github.com/Altinity/clickhouse-regression" commit.hash="$(git rev-parse HEAD)" job.name=$GITHUB_JOB job.retry=$GITHUB_RUN_ATTEMPT job.url="${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}" arch="$(uname -i)"
--attr project="${GITHUB_REPOSITORY}" project.id="${GITHUB_REPOSITORY_ID}" user.name="${GITHUB_ACTOR}" version="${{ fromJson(inputs.workflow_config).JOB_KV_DATA.version.string }}" package="$clickhouse_path" repository="https://github.com/Altinity/clickhouse-regression" commit.hash="$(git rev-parse HEAD)" job.name="$REPORT_JOB_NAME" job.retry=$GITHUB_RUN_ATTEMPT job.url="${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}" arch="$(uname -i)"
--cicd
--log raw.log
${{ inputs.flags != 'none' && inputs.flags || ''}}
Expand Down Expand Up @@ -134,7 +135,7 @@ jobs:
REPORTS_PATH=${{ runner.temp }}/reports_dir
mkdir -p $REPORTS_PATH
cat > $REPORTS_PATH/workflow_config.json << 'EOF'
${{ inputs.workflow_config }}
${{ toJson(fromJson(inputs.workflow_config).WORKFLOW_CONFIG) }}
EOF

python3 .github/get-deb-url.py --github-env $GITHUB_ENV --workflow-config $REPORTS_PATH/workflow_config.json --s3-base-url $S3_BASE_URL --pr-number $PR_NUMBER --branch-name ${{ github.ref_name }} --commit-hash ${{ inputs.build_sha || github.sha }} --binary
Expand Down Expand Up @@ -168,24 +169,24 @@ jobs:
exit $EXITCODE

- name: 📊 Set Commit Status
if: always() && inputs.set_commit_status
if: ${{ !cancelled() && inputs.set_commit_status }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
JOB_OUTCOME: ${{ steps.run_suite.outcome }}
SUITE_NAME: ${{ format('Regression {0} {1}{2}', inputs.runner_arch, inputs.job_name != '' && inputs.job_name || inputs.suite_name, inputs.part != '' && format('_{0}', inputs.part) || '') }}
run: python3 .github/set_builds_status.py

- name: 📝 Create and upload logs
if: always()
if: ${{ !cancelled() }}
run: .github/create_and_upload_logs.sh 1

- name: 📤 Upload logs to results database
if: always()
if: ${{ !cancelled() }}
timeout-minutes: 20
run: .github/upload_results_to_database.sh 1

- uses: actions/upload-artifact@v4
if: always()
if: ${{ !cancelled() }}
with:
name: ${{ format('{0}{1}-artifacts-{2}{3}', inputs.job_name != '' && inputs.job_name || inputs.suite_name, inputs.part != '' && format('_{0}', inputs.part) || '', inputs.runner_arch, contains(inputs.extra_args, '--use-keeper') && '_keeper' || '_zookeeper') }}
path: ${{ env.artifact_paths }}
Expand Down
58 changes: 29 additions & 29 deletions .github/workflows/regression.yml
Original file line number Diff line number Diff line change
Expand Up @@ -121,12 +121,12 @@ env:
jobs:
Common:
if: |
fromJson(inputs.workflow_config).custom_data.ci_regression_jobs[0] == null ||
contains(fromJson(inputs.workflow_config).custom_data.ci_regression_jobs, 'common')
fromJson(inputs.workflow_config).JOB_KV_DATA.ci_regression_jobs[0] == null ||
contains(fromJson(inputs.workflow_config).JOB_KV_DATA.ci_regression_jobs, 'common')
strategy:
fail-fast: false
matrix:
SUITE: [aes_encryption, atomic_insert, base_58, data_types, datetime64_extended_range, disk_level_encryption, dns, engines, example, extended_precision_data_types, functions, kafka, kerberos, key_value, lightweight_delete, memory, part_moves_between_shards, selects, session_timezone, swarms, version, window_functions]
SUITE: [aes_encryption, atomic_insert, attach, base_58, clickhouse_keeper_failover,data_types, datetime64_extended_range, disk_level_encryption, dns, engines, example, extended_precision_data_types, functions, jwt_authentication, kafka, kerberos, key_value, lightweight_delete, memory, part_moves_between_shards, selects, session_timezone, settings, swarms, version, window_functions]
uses: ./.github/workflows/regression-reusable-suite.yml
with:
ref: ${{ inputs.commit }}
Expand All @@ -145,8 +145,8 @@ jobs:

AggregateFunctions:
if: |
fromJson(inputs.workflow_config).custom_data.ci_regression_jobs[0] == null ||
contains(fromJson(inputs.workflow_config).custom_data.ci_regression_jobs, 'aggregate_functions')
fromJson(inputs.workflow_config).JOB_KV_DATA.ci_regression_jobs[0] == null ||
contains(fromJson(inputs.workflow_config).JOB_KV_DATA.ci_regression_jobs, 'aggregate_functions')
strategy:
fail-fast: false
matrix:
Expand All @@ -170,8 +170,8 @@ jobs:
secrets: inherit
Alter:
if: |
fromJson(inputs.workflow_config).custom_data.ci_regression_jobs[0] == null ||
contains(fromJson(inputs.workflow_config).custom_data.ci_regression_jobs, 'alter')
fromJson(inputs.workflow_config).JOB_KV_DATA.ci_regression_jobs[0] == null ||
contains(fromJson(inputs.workflow_config).JOB_KV_DATA.ci_regression_jobs, 'alter')
strategy:
fail-fast: false
matrix:
Expand Down Expand Up @@ -202,8 +202,8 @@ jobs:

Benchmark:
if: |
fromJson(inputs.workflow_config).custom_data.ci_regression_jobs[0] == null ||
contains(fromJson(inputs.workflow_config).custom_data.ci_regression_jobs, 'benchmark')
fromJson(inputs.workflow_config).JOB_KV_DATA.ci_regression_jobs[0] == null ||
contains(fromJson(inputs.workflow_config).JOB_KV_DATA.ci_regression_jobs, 'benchmark')
strategy:
fail-fast: false
matrix:
Expand All @@ -228,8 +228,8 @@ jobs:

ClickHouseKeeper:
if: |
fromJson(inputs.workflow_config).custom_data.ci_regression_jobs[0] == null ||
contains(fromJson(inputs.workflow_config).custom_data.ci_regression_jobs, 'clickhouse_keeper')
fromJson(inputs.workflow_config).JOB_KV_DATA.ci_regression_jobs[0] == null ||
contains(fromJson(inputs.workflow_config).JOB_KV_DATA.ci_regression_jobs, 'clickhouse_keeper')
strategy:
fail-fast: false
matrix:
Expand All @@ -256,8 +256,8 @@ jobs:

Iceberg:
if: |
fromJson(inputs.workflow_config).custom_data.ci_regression_jobs[0] == null ||
contains(fromJson(inputs.workflow_config).custom_data.ci_regression_jobs, 'iceberg')
fromJson(inputs.workflow_config).JOB_KV_DATA.ci_regression_jobs[0] == null ||
contains(fromJson(inputs.workflow_config).JOB_KV_DATA.ci_regression_jobs, 'iceberg')
strategy:
fail-fast: false
matrix:
Expand All @@ -281,8 +281,8 @@ jobs:
secrets: inherit
LDAP:
if: |
fromJson(inputs.workflow_config).custom_data.ci_regression_jobs[0] == null ||
contains(fromJson(inputs.workflow_config).custom_data.ci_regression_jobs, 'ldap')
fromJson(inputs.workflow_config).JOB_KV_DATA.ci_regression_jobs[0] == null ||
contains(fromJson(inputs.workflow_config).JOB_KV_DATA.ci_regression_jobs, 'ldap')
strategy:
fail-fast: false
matrix:
Expand All @@ -305,8 +305,8 @@ jobs:

Parquet:
if: |
fromJson(inputs.workflow_config).custom_data.ci_regression_jobs[0] == null ||
contains(fromJson(inputs.workflow_config).custom_data.ci_regression_jobs, 'parquet')
fromJson(inputs.workflow_config).JOB_KV_DATA.ci_regression_jobs[0] == null ||
contains(fromJson(inputs.workflow_config).JOB_KV_DATA.ci_regression_jobs, 'parquet')
uses: ./.github/workflows/regression-reusable-suite.yml
with:
ref: ${{ inputs.commit }}
Expand All @@ -325,8 +325,8 @@ jobs:

ParquetS3:
if: |
fromJson(inputs.workflow_config).custom_data.ci_regression_jobs[0] == null ||
contains(fromJson(inputs.workflow_config).custom_data.ci_regression_jobs, 'parquet')
fromJson(inputs.workflow_config).JOB_KV_DATA.ci_regression_jobs[0] == null ||
contains(fromJson(inputs.workflow_config).JOB_KV_DATA.ci_regression_jobs, 'parquet')
strategy:
fail-fast: false
matrix:
Expand All @@ -351,8 +351,8 @@ jobs:

RBAC:
if: |
fromJson(inputs.workflow_config).custom_data.ci_regression_jobs[0] == null ||
contains(fromJson(inputs.workflow_config).custom_data.ci_regression_jobs, 'rbac')
fromJson(inputs.workflow_config).JOB_KV_DATA.ci_regression_jobs[0] == null ||
contains(fromJson(inputs.workflow_config).JOB_KV_DATA.ci_regression_jobs, 'rbac')
strategy:
fail-fast: false
matrix:
Expand All @@ -376,8 +376,8 @@ jobs:
secrets: inherit
SSLServer:
if: |
fromJson(inputs.workflow_config).custom_data.ci_regression_jobs[0] == null ||
contains(fromJson(inputs.workflow_config).custom_data.ci_regression_jobs, 'ssl_server')
fromJson(inputs.workflow_config).JOB_KV_DATA.ci_regression_jobs[0] == null ||
contains(fromJson(inputs.workflow_config).JOB_KV_DATA.ci_regression_jobs, 'ssl_server')
strategy:
fail-fast: false
matrix:
Expand All @@ -402,8 +402,8 @@ jobs:

S3:
if: |
fromJson(inputs.workflow_config).custom_data.ci_regression_jobs[0] == null ||
contains(fromJson(inputs.workflow_config).custom_data.ci_regression_jobs, 's3')
fromJson(inputs.workflow_config).JOB_KV_DATA.ci_regression_jobs[0] == null ||
contains(fromJson(inputs.workflow_config).JOB_KV_DATA.ci_regression_jobs, 's3')
strategy:
fail-fast: false
matrix:
Expand Down Expand Up @@ -434,8 +434,8 @@ jobs:

S3Export:
if: |
fromJson(inputs.workflow_config).custom_data.ci_regression_jobs[0] == null ||
contains(fromJson(inputs.workflow_config).custom_data.ci_regression_jobs, 's3')
fromJson(inputs.workflow_config).JOB_KV_DATA.ci_regression_jobs[0] == null ||
contains(fromJson(inputs.workflow_config).JOB_KV_DATA.ci_regression_jobs, 's3')
strategy:
fail-fast: false
matrix:
Expand All @@ -462,8 +462,8 @@ jobs:

TieredStorage:
if: |
fromJson(inputs.workflow_config).custom_data.ci_regression_jobs[0] == null ||
contains(fromJson(inputs.workflow_config).custom_data.ci_regression_jobs, 'tiered_storage')
fromJson(inputs.workflow_config).JOB_KV_DATA.ci_regression_jobs[0] == null ||
contains(fromJson(inputs.workflow_config).JOB_KV_DATA.ci_regression_jobs, 'tiered_storage')
strategy:
fail-fast: false
matrix:
Expand Down
14 changes: 7 additions & 7 deletions ci/praktika/yaml_additional_templates.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ class AltinityWorkflowTemplates:
echo "Workflow Run Report: [View Report]($REPORT_LINK)" >> $GITHUB_STEP_SUMMARY
"""
# Additional jobs
REGRESSION_HASH = "c5cae9b244e0839fb307a9fb67a40fe80d93810b"
REGRESSION_HASH = "2cae02cfeafdf95cefaba51a6014dbace2c011ad"
ALTINITY_JOBS = {
"GrypeScan": r"""
GrypeScanServer:
Expand Down Expand Up @@ -63,28 +63,28 @@ class AltinityWorkflowTemplates:
"Regression": r"""
RegressionTestsRelease:
needs: [config_workflow, build_amd_binary]
if: ${{ !cancelled() && !contains(needs.*.outputs.pipeline_status, 'failure') && !contains(fromJson(needs.config_workflow.outputs.data).workflow_config.custom_data.ci_exclude_tags, 'regression')}}
if: ${{ !cancelled() && !contains(needs.*.outputs.pipeline_status, 'failure') && !contains(fromJson(needs.config_workflow.outputs.data).JOB_KV_DATA.ci_exclude_tags, 'regression')}}
uses: ./.github/workflows/regression.yml
secrets: inherit
with:
runner_type: altinity-regression-tester
commit: {REGRESSION_HASH}
arch: release
build_sha: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
timeout_minutes: 300
workflow_config: ${{ needs.config_workflow.outputs.data.workflow_config }}
timeout_minutes: 210
workflow_config: ${{ needs.config_workflow.outputs.data }}
RegressionTestsAarch64:
needs: [config_workflow, build_arm_binary]
if: ${{ !cancelled() && !contains(needs.*.outputs.pipeline_status, 'failure') && !contains(fromJson(needs.config_workflow.outputs.data).workflow_config.custom_data.ci_exclude_tags, 'regression') && !contains(fromJson(needs.config_workflow.outputs.data).workflow_config.custom_data.ci_exclude_tags, 'aarch64')}}
if: ${{ !cancelled() && !contains(needs.*.outputs.pipeline_status, 'failure') && !contains(fromJson(needs.config_workflow.outputs.data).JOB_KV_DATA.ci_exclude_tags, 'regression') && !contains(fromJson(needs.config_workflow.outputs.data).workflow_config.custom_data.ci_exclude_tags, 'aarch64')}}
uses: ./.github/workflows/regression.yml
secrets: inherit
with:
runner_type: altinity-regression-tester-aarch64
commit: {REGRESSION_HASH}
arch: aarch64
build_sha: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
timeout_minutes: 300
workflow_config: ${{ needs.config_workflow.outputs.data.workflow_config }}
timeout_minutes: 210
workflow_config: ${{ needs.config_workflow.outputs.data }}
""",
"SignRelease": r"""
SignRelease:
Expand Down
8 changes: 4 additions & 4 deletions cmake/autogenerated_versions.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@ SET(VERSION_MAJOR 26)
SET(VERSION_MINOR 1)
SET(VERSION_PATCH 2)
SET(VERSION_GITHASH 4c47e680f5575e73bd37ba2a37e9c039b643a1b7)
SET(VERSION_DESCRIBE v26.1.2.10001.altinitytest)
SET(VERSION_STRING 26.1.2.10001.altinitytest)
SET(VERSION_DESCRIBE v26.1.2.20001.altinityantalya)
SET(VERSION_STRING 26.1.2.20001.altinityantalya)
# end of autochange

SET(VERSION_TWEAK 10001)
SET(VERSION_FLAVOUR altinitytest)
SET(VERSION_TWEAK 20001)
SET(VERSION_FLAVOUR altinityantalya)

3 changes: 1 addition & 2 deletions programs/keeper/dashboard.html
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,7 @@

<head>
<meta charset="UTF-8">
<link rel="icon"
href="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1NCIgaGVpZ2h0PSI0OCIgdmlld0JveD0iMCAwIDkgOCI+PHN0eWxlPi5ve2ZpbGw6I2ZjMH0ucntmaWxsOnJlZH08L3N0eWxlPjxwYXRoIGQ9Ik0wLDcgaDEgdjEgaC0xIHoiIGNsYXNzPSJyIi8+PHBhdGggZD0iTTAsMCBoMSB2NyBoLTEgeiIgY2xhc3M9Im8iLz48cGF0aCBkPSJNMiwwIGgxIHY4IGgtMSB6IiBjbGFzcz0ibyIvPjxwYXRoIGQ9Ik00LDAgaDEgdjggaC0xIHoiIGNsYXNzPSJvIi8+PHBhdGggZD0iTTYsMCBoMSB2OCBoLTEgeiIgY2xhc3M9Im8iLz48cGF0aCBkPSJNOCwzLjI1IGgxIHYxLjUgaC0xIHoiIGNsYXNzPSJvIi8+PC9zdmc+">
<link rel="icon" href="data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTUwIDE1MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJtMTkgNzIgODItNDhMNzUgOSAxOSA0MnptNSAzIDIzIDE0VjYyem00OSAzNEwxOSA3OHY2MnptMjgtNTIgMjktMTctMjQtMTMtMjggMTd6bTMgN3Y2MGwyOCAxNlY4MHptMi00IDI2IDE1VjQ1eiIgZmlsbD0iIzE5OURDRiIvPjwvc3ZnPg==">
<title>ClickHouse Keeper</title>

<!-- Code Style:
Expand Down
Loading