Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

release: Bump extension version to 2026.6.0 (#26066) #13281

release: Bump extension version to 2026.6.0 (#26066)

release: Bump extension version to 2026.6.0 (#26066) #13281

Workflow file for this run

name: PR/CI Check
on:
pull_request:
push:
branches-ignore:
- main
- release*
permissions: {}
env:
NODE_VERSION: 22.21.1
PYTHON_VERSION: '3.10' # YML treats 3.10 the number as 3.1, so quotes around 3.10
MOCHA_REPORTER_JUNIT: true # Use the mocha-multi-reporters and send output to both console (spec) and JUnit (mocha-junit-reporter). Also enables a reporter which exits the process running the tests if it haven't already.
ARTIFACT_NAME_VSIX: ms-python-insiders-vsix
TEST_RESULTS_DIRECTORY: .
# Force a path with spaces and to test extension works in these scenarios
# Unicode characters are causing 2.7 failures so skip that for now.
special-working-directory: './path with spaces'
special-working-directory-relative: 'path with spaces'
jobs:
build-vsix:
name: Create VSIX
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
- os: windows-latest
target: x86_64-pc-windows-msvc
vsix-target: win32-x64
- os: windows-latest
target: aarch64-pc-windows-msvc
vsix-target: win32-arm64
- os: ubuntu-latest
target: x86_64-unknown-linux-musl
vsix-target: linux-x64
# - os: ubuntu-latest
# target: aarch64-unknown-linux-gnu
# vsix-target: linux-arm64
# - os: ubuntu-latest
# target: arm-unknown-linux-gnueabihf
# vsix-target: linux-armhf
# - os: macos-latest
# target: x86_64-apple-darwin
# vsix-target: darwin-x64
# - os: macos-14
# target: aarch64-apple-darwin
# vsix-target: darwin-arm64
- os: ubuntu-latest
target: x86_64-unknown-linux-musl
vsix-target: alpine-x64
# - os: ubuntu-latest
# target: aarch64-unknown-linux-musl
# vsix-target: alpine-arm64
steps:
- name: Checkout
uses: actions/checkout@v7
with:
persist-credentials: false
- name: Checkout Python Environment Tools
uses: actions/checkout@v7
with:
repository: 'microsoft/python-environment-tools'
path: 'python-env-tools'
persist-credentials: false
sparse-checkout: |
crates
Cargo.toml
Cargo.lock
sparse-checkout-cone-mode: false
- name: Build VSIX
uses: ./.github/actions/build-vsix
with:
node_version: ${{ env.NODE_VERSION}}
vsix_name: 'ms-python-insiders-${{ matrix.vsix-target }}.vsix'
artifact_name: '${{ env.ARTIFACT_NAME_VSIX }}-${{ matrix.vsix-target }}'
cargo_target: ${{ matrix.target }}
vsix_target: ${{ matrix.vsix-target }}
lint:
name: Lint
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v7
with:
persist-credentials: false
- name: Lint
uses: ./.github/actions/lint
with:
node_version: ${{ env.NODE_VERSION }}
check-types:
name: Check Python types
runs-on: ubuntu-latest
steps:
- name: Use Python ${{ env.PYTHON_VERSION }}
uses: actions/setup-python@v7
with:
python-version: ${{ env.PYTHON_VERSION }}
- name: Checkout
uses: actions/checkout@v7
with:
persist-credentials: false
- name: Checkout Python Environment Tools
uses: actions/checkout@v7
with:
repository: 'microsoft/python-environment-tools'
path: 'python-env-tools'
persist-credentials: false
sparse-checkout: |
crates
Cargo.toml
Cargo.lock
sparse-checkout-cone-mode: false
- name: Install base Python requirements
uses: brettcannon/pip-secure-install@92f400e3191171c1858cc0e0d9ac6320173fdb0c # v1.0.0
with:
options: '-t ./python_files/lib/python --no-cache-dir --implementation py'
- name: Install Jedi requirements
uses: brettcannon/pip-secure-install@92f400e3191171c1858cc0e0d9ac6320173fdb0c # v1.0.0
with:
requirements-file: './python_files/jedilsp_requirements/requirements.txt'
options: '-t ./python_files/lib/jedilsp --no-cache-dir --implementation py'
- name: Install other Python requirements
run: |
python -m pip install --upgrade -r build/test-requirements.txt
- name: Run Pyright
uses: jakebailey/pyright-action@8ec14b5cfe41f26e5f41686a31eb6012758217ef # v3.0.2
with:
version: 1.1.308
working-directory: 'python_files'
python-tests:
name: Python Tests
# The value of runs-on is the OS of the current job (specified in the strategy matrix below) instead of being hardcoded.
runs-on: ${{ matrix.os }}
defaults:
run:
working-directory: ${{ env.special-working-directory }}
strategy:
fail-fast: false
matrix:
# We're not running CI on macOS for now because it's one less matrix entry to lower the number of runners used,
# macOS runners are expensive, and we assume that Ubuntu is enough to cover the Unix case.
os: [ubuntu-latest, windows-latest]
python: ['3.10', '3.11', '3.12', '3.13', '3.14']
# Test approximately one year of pytest releases and upcoming pytest changes.
pytest-version: ['pytest==8.4.*', 'pytest@pre-release']
steps:
- name: Checkout
uses: actions/checkout@v7
with:
path: ${{ env.special-working-directory-relative }}
persist-credentials: false
- name: Use Python ${{ matrix.python }}
uses: actions/setup-python@v7
with:
python-version: ${{ matrix.python }}
- name: Install base Python requirements
uses: brettcannon/pip-secure-install@92f400e3191171c1858cc0e0d9ac6320173fdb0c # v1.0.0
with:
requirements-file: '"${{ env.special-working-directory-relative }}/requirements.txt"'
options: '-t "${{ env.special-working-directory-relative }}/python_files/lib/python" --no-cache-dir --implementation py'
- name: Install test requirements
run: python -m pip install --upgrade -r build/test-requirements.txt
- name: Install specific pytest version (pre-release)
if: matrix.pytest-version == 'pytest@pre-release'
run: python -m pip install --upgrade --pre pytest
- name: Install specific pytest version
if: matrix.pytest-version != 'pytest@pre-release'
run: python -m pip install --upgrade "${{ matrix.pytest-version }}"
- name: Print pytest version
run: python -m pytest --version
- name: Run Python unit tests
run: python python_files/tests/run_all.py
tests:
name: Tests
# The value of runs-on is the OS of the current job (specified in the strategy matrix below) instead of being hardcoded.
runs-on: ${{ matrix.os }}
defaults:
run:
working-directory: ${{ env.special-working-directory }}
strategy:
fail-fast: false
matrix:
# We're not running CI on macOS for now because it's one less matrix entry to lower the number of runners used,
# macOS runners are expensive, and we assume that Ubuntu is enough to cover the Unix case.
os: [ubuntu-latest, windows-latest]
# Run the tests on the oldest and most recent versions of Python.
python: ['3.x']
test-suite: [ts-unit, venv, single-workspace, debugger, functional]
steps:
- name: Checkout
uses: actions/checkout@v7
with:
path: ${{ env.special-working-directory-relative }}
persist-credentials: false
- name: Checkout Python Environment Tools
uses: actions/checkout@v7
with:
repository: 'microsoft/python-environment-tools'
path: ${{ env.special-working-directory-relative }}/python-env-tools
persist-credentials: false
sparse-checkout: |
crates
Cargo.toml
Cargo.lock
sparse-checkout-cone-mode: false
- name: Install Node
uses: actions/setup-node@v7
with:
node-version: ${{ env.NODE_VERSION }}
cache: 'npm'
cache-dependency-path: ${{ env.special-working-directory-relative }}/package-lock.json
- name: Install dependencies (npm ci)
run: npm ci
- name: Compile
run: npx gulp prePublishNonBundle
- name: Localization
run: npx @vscode/l10n-dev@latest export ./src
- name: Use Python ${{ matrix.python }}
uses: actions/setup-python@v7
with:
python-version: ${{ matrix.python }}
- name: Upgrade Pip
run: python -m pip install -U pip
# For faster/better builds of sdists.
- name: Install build pre-requisite
run: python -m pip install wheel nox
- name: Install Python Extension dependencies (jedi, etc.)
run: nox --session install_python_libs
- name: Install test requirements
run: python -m pip install --upgrade -r build/test-requirements.txt
- name: Rust Tool Chain setup
uses: dtolnay/rust-toolchain@stable
- name: Build Native Binaries
run: nox --session native_build
shell: bash
- name: Install functional test requirements
run: python -m pip install --upgrade -r ./build/functional-test-requirements.txt
if: matrix.test-suite == 'functional'
- name: Prepare pipenv for venv tests
env:
TEST_FILES_SUFFIX: testvirtualenvs
PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json'
shell: pwsh
if: matrix.test-suite == 'venv'
run: |
python -m pip install pipenv
python -m pipenv run python ./build/ci/addEnvPath.py ${{ env.PYTHON_VIRTUAL_ENVS_LOCATION }} pipenvPath
- name: Prepare poetry for venv tests
env:
TEST_FILES_SUFFIX: testvirtualenvs
shell: pwsh
if: matrix.test-suite == 'venv'
run: |
python -m pip install poetry
Move-Item -Path ".\build\ci\pyproject.toml" -Destination .
poetry env use python
- name: Prepare virtualenv for venv tests
env:
TEST_FILES_SUFFIX: testvirtualenvs
PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json'
shell: pwsh
if: matrix.test-suite == 'venv'
run: |
python -m pip install virtualenv
python -m virtualenv .virtualenv/
if ('${{ matrix.os }}' -match 'windows-latest') {
& ".virtualenv/Scripts/python.exe" ./build/ci/addEnvPath.py ${{ env.PYTHON_VIRTUAL_ENVS_LOCATION }} virtualEnvPath
} else {
& ".virtualenv/bin/python" ./build/ci/addEnvPath.py ${{ env.PYTHON_VIRTUAL_ENVS_LOCATION }} virtualEnvPath
}
- name: Prepare venv for venv tests
env:
TEST_FILES_SUFFIX: testvirtualenvs
PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json'
shell: pwsh
if: matrix.test-suite == 'venv' && startsWith(matrix.python, 3.)
run: |
python -m venv .venv
if ('${{ matrix.os }}' -match 'windows-latest') {
& ".venv/Scripts/python.exe" ./build/ci/addEnvPath.py ${{ env.PYTHON_VIRTUAL_ENVS_LOCATION }} venvPath
} else {
& ".venv/bin/python" ./build/ci/addEnvPath.py ${{ env.PYTHON_VIRTUAL_ENVS_LOCATION }} venvPath
}
- name: Prepare conda for venv tests
env:
TEST_FILES_SUFFIX: testvirtualenvs
PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json'
shell: pwsh
if: matrix.test-suite == 'venv'
run: |
# 1. For `*.testvirtualenvs.test.ts`
if ('${{ matrix.os }}' -match 'windows-latest') {
$condaPythonPath = Join-Path -Path $Env:CONDA -ChildPath python.exe
$condaExecPath = Join-Path -Path $Env:CONDA -ChildPath Scripts | Join-Path -ChildPath conda
} else{
$condaPythonPath = Join-Path -Path $Env:CONDA -ChildPath bin | Join-Path -ChildPath python
$condaExecPath = Join-Path -Path $Env:CONDA -ChildPath bin | Join-Path -ChildPath conda
}
& $condaPythonPath ./build/ci/addEnvPath.py ${{ env.PYTHON_VIRTUAL_ENVS_LOCATION }} condaExecPath $condaExecPath
& $condaPythonPath ./build/ci/addEnvPath.py ${{ env.PYTHON_VIRTUAL_ENVS_LOCATION }} condaPath
& $condaExecPath init --all
- name: Set CI_PYTHON_PATH and CI_DISABLE_AUTO_SELECTION
run: |
echo "CI_PYTHON_PATH=python" >> $GITHUB_ENV
echo "CI_DISABLE_AUTO_SELECTION=1" >> $GITHUB_ENV
shell: bash
if: matrix.test-suite != 'ts-unit'
# Run TypeScript unit tests only for Python 3.X.
- name: Run TypeScript unit tests
run: npm run test:unittests
if: matrix.test-suite == 'ts-unit' && startsWith(matrix.python, 3.)
# The virtual environment based tests use the `testSingleWorkspace` set of tests
# with the environment variable `TEST_FILES_SUFFIX` set to `testvirtualenvs`,
# which is set in the "Prepare environment for venv tests" step.
# We also use a third-party GitHub Action to install xvfb on Linux,
# run tests and then clean up the process once the tests ran.
# See https://github.com/GabrielBB/xvfb-action
- name: Run venv tests
env:
TEST_FILES_SUFFIX: testvirtualenvs
CI_PYTHON_VERSION: ${{ matrix.python }}
uses: GabrielBB/xvfb-action@b706e4e27b14669b486812790492dc50ca16b465 # v1.7
with:
run: npm run testSingleWorkspace
working-directory: ${{ env.special-working-directory }}
if: matrix.test-suite == 'venv'
- name: Run single-workspace tests
env:
CI_PYTHON_VERSION: ${{ matrix.python }}
uses: GabrielBB/xvfb-action@b706e4e27b14669b486812790492dc50ca16b465 # v1.7
with:
run: npm run testSingleWorkspace
working-directory: ${{ env.special-working-directory }}
if: matrix.test-suite == 'single-workspace'
- name: Run debugger tests
env:
CI_PYTHON_VERSION: ${{ matrix.python }}
uses: GabrielBB/xvfb-action@b706e4e27b14669b486812790492dc50ca16b465 # v1.7
with:
run: npm run testDebugger
working-directory: ${{ env.special-working-directory }}
if: matrix.test-suite == 'debugger'
# Run TypeScript functional tests
- name: Run TypeScript functional tests
run: npm run test:functional
if: matrix.test-suite == 'functional'
native-tests:
name: Native Tests
# The value of runs-on is the OS of the current job (specified in the strategy matrix below) instead of being hardcoded.
runs-on: ${{ matrix.os }}
defaults:
run:
working-directory: ${{ env.special-working-directory }}
strategy:
fail-fast: false
matrix:
# We're not running CI on macOS for now because it's one less matrix entry to lower the number of runners used,
# macOS runners are expensive, and we assume that Ubuntu is enough to cover the Unix case.
os: [ubuntu-latest, windows-latest]
steps:
- name: Checkout
uses: actions/checkout@v7
with:
path: ${{ env.special-working-directory-relative }}
persist-credentials: false
- name: Checkout Python Environment Tools
uses: actions/checkout@v7
with:
repository: 'microsoft/python-environment-tools'
path: ${{ env.special-working-directory-relative }}/python-env-tools
persist-credentials: false
sparse-checkout: |
crates
Cargo.toml
Cargo.lock
sparse-checkout-cone-mode: false
- name: Python Environment Tools tests
run: cargo test -- --nocapture
working-directory: ${{ env.special-working-directory }}/python-env-tools
smoke-tests:
name: Smoke tests
# The value of runs-on is the OS of the current job (specified in the strategy matrix below) instead of being hardcoded.
runs-on: ${{ matrix.os }}
needs: [build-vsix]
strategy:
fail-fast: false
matrix:
# We're not running CI on macOS for now because it's one less matrix entry to lower the number of runners used,
# macOS runners are expensive, and we assume that Ubuntu is enough to cover the UNIX case.
include:
- os: windows-latest
vsix-target: win32-x64
- os: ubuntu-latest
vsix-target: linux-x64
steps:
# Need the source to have the tests available.
- name: Checkout
uses: actions/checkout@v7
with:
persist-credentials: false
- name: Checkout Python Environment Tools
uses: actions/checkout@v7
with:
repository: 'microsoft/python-environment-tools'
path: python-env-tools
persist-credentials: false
sparse-checkout: |
crates
Cargo.toml
Cargo.lock
sparse-checkout-cone-mode: false
- name: Smoke tests
uses: ./.github/actions/smoke-tests
with:
node_version: ${{ env.NODE_VERSION }}
artifact_name: '${{ env.ARTIFACT_NAME_VSIX }}-${{ matrix.vsix-target }}'
### Coverage run
coverage:
name: Coverage
# TEMPORARILY DISABLED - hanging in CI, needs investigation
if: false
# The value of runs-on is the OS of the current job (specified in the strategy matrix below) instead of being hardcoded.
runs-on: ${{ matrix.os }}
needs: [lint, check-types, python-tests, tests, native-tests]
strategy:
fail-fast: false
matrix:
# Only run coverage on linux for PRs
os: [ubuntu-latest]
steps:
- name: Checkout
uses: actions/checkout@v7
with:
persist-credentials: false
- name: Checkout Python Environment Tools
uses: actions/checkout@v7
with:
repository: 'microsoft/python-environment-tools'
path: python-env-tools
persist-credentials: false
sparse-checkout: |
crates
Cargo.toml
Cargo.lock
sparse-checkout-cone-mode: false
- name: Install Node
uses: actions/setup-node@v7
with:
node-version: ${{ env.NODE_VERSION }}
cache: 'npm'
- name: Install dependencies (npm ci)
run: npm ci
- name: Compile
run: npx gulp prePublishNonBundle
- name: Localization
run: npx @vscode/l10n-dev@latest export ./src
- name: Use Python ${{ env.PYTHON_VERSION }}
uses: actions/setup-python@v7
with:
python-version: ${{ env.PYTHON_VERSION }}
cache: 'pip'
cache-dependency-path: |
requirements.txt
python_files/jedilsp_requirements/requirements.txt
build/test-requirements.txt
build/functional-test-requirements.txt
- name: Install base Python requirements
uses: brettcannon/pip-secure-install@92f400e3191171c1858cc0e0d9ac6320173fdb0c # v1.0.0
with:
options: '-t ./python_files/lib/python --implementation py'
- name: Install Jedi requirements
uses: brettcannon/pip-secure-install@92f400e3191171c1858cc0e0d9ac6320173fdb0c # v1.0.0
with:
requirements-file: './python_files/jedilsp_requirements/requirements.txt'
options: '-t ./python_files/lib/jedilsp --implementation py'
- name: Install build pre-requisite
run: python -m pip install wheel nox
shell: bash
- name: Rust Tool Chain setup
uses: dtolnay/rust-toolchain@stable
- name: Build Native Binaries
run: nox --session native_build
shell: bash
- name: Install test requirements
run: python -m pip install --upgrade -r build/test-requirements.txt
- name: Install functional test requirements
run: python -m pip install --upgrade -r ./build/functional-test-requirements.txt
- name: Prepare pipenv for venv tests
env:
TEST_FILES_SUFFIX: testvirtualenvs
PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json'
shell: pwsh
run: |
python -m pip install pipenv
python -m pipenv run python ./build/ci/addEnvPath.py ${{ env.PYTHON_VIRTUAL_ENVS_LOCATION }} pipenvPath
- name: Prepare poetry for venv tests
env:
TEST_FILES_SUFFIX: testvirtualenvs
shell: pwsh
run: |
python -m pip install poetry
Move-Item -Path ".\build\ci\pyproject.toml" -Destination .
poetry env use python
- name: Prepare virtualenv for venv tests
env:
TEST_FILES_SUFFIX: testvirtualenvs
PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json'
shell: pwsh
run: |
python -m pip install virtualenv
python -m virtualenv .virtualenv/
if ('${{ matrix.os }}' -match 'windows-latest') {
& ".virtualenv/Scripts/python.exe" ./build/ci/addEnvPath.py ${{ env.PYTHON_VIRTUAL_ENVS_LOCATION }} virtualEnvPath
} else {
& ".virtualenv/bin/python" ./build/ci/addEnvPath.py ${{ env.PYTHON_VIRTUAL_ENVS_LOCATION }} virtualEnvPath
}
- name: Prepare venv for venv tests
env:
TEST_FILES_SUFFIX: testvirtualenvs
PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json'
shell: pwsh
run: |
python -m venv .venv
if ('${{ matrix.os }}' -match 'windows-latest') {
& ".venv/Scripts/python.exe" ./build/ci/addEnvPath.py ${{ env.PYTHON_VIRTUAL_ENVS_LOCATION }} venvPath
} else {
& ".venv/bin/python" ./build/ci/addEnvPath.py ${{ env.PYTHON_VIRTUAL_ENVS_LOCATION }} venvPath
}
- name: Prepare conda for venv tests
env:
TEST_FILES_SUFFIX: testvirtualenvs
PYTHON_VIRTUAL_ENVS_LOCATION: './src/tmp/envPaths.json'
shell: pwsh
run: |
# 1. For `*.testvirtualenvs.test.ts`
if ('${{ matrix.os }}' -match 'windows-latest') {
$condaPythonPath = Join-Path -Path $Env:CONDA -ChildPath python.exe
$condaExecPath = Join-Path -Path $Env:CONDA -ChildPath Scripts | Join-Path -ChildPath conda
} else{
$condaPythonPath = Join-Path -Path $Env:CONDA -ChildPath bin | Join-Path -ChildPath python
$condaExecPath = Join-Path -Path $Env:CONDA -ChildPath bin | Join-Path -ChildPath conda
}
& $condaPythonPath ./build/ci/addEnvPath.py ${{ env.PYTHON_VIRTUAL_ENVS_LOCATION }} condaExecPath $condaExecPath
& $condaPythonPath ./build/ci/addEnvPath.py ${{ env.PYTHON_VIRTUAL_ENVS_LOCATION }} condaPath
& $condaExecPath init --all
- name: Run TypeScript unit tests
run: npm run test:unittests:cover
- name: Run Python unit tests
run: |
python python_files/tests/run_all.py
# The virtual environment based tests use the `testSingleWorkspace` set of tests
# with the environment variable `TEST_FILES_SUFFIX` set to `testvirtualenvs`,
# which is set in the "Prepare environment for venv tests" step.
# We also use a third-party GitHub Action to install xvfb on Linux,
# run tests and then clean up the process once the tests ran.
# See https://github.com/GabrielBB/xvfb-action
- name: Run venv tests
env:
TEST_FILES_SUFFIX: testvirtualenvs
CI_PYTHON_VERSION: ${{ env.PYTHON_VERSION }}
CI_DISABLE_AUTO_SELECTION: 1
uses: GabrielBB/xvfb-action@b706e4e27b14669b486812790492dc50ca16b465 # v1.7
with:
run: npm run testSingleWorkspace:cover
- name: Run single-workspace tests
env:
CI_PYTHON_VERSION: ${{ env.PYTHON_VERSION }}
CI_DISABLE_AUTO_SELECTION: 1
uses: GabrielBB/xvfb-action@b706e4e27b14669b486812790492dc50ca16b465 # v1.7
with:
run: npm run testSingleWorkspace:cover
# Enable these tests when coverage is setup for multiroot workspace tests
# - name: Run multi-workspace tests
# env:
# CI_PYTHON_VERSION: ${{ env.PYTHON_VERSION }}
# CI_DISABLE_AUTO_SELECTION: 1
# uses: GabrielBB/xvfb-action@b706e4e27b14669b486812790492dc50ca16b465 # v1.7
# with:
# run: npm run testMultiWorkspace:cover
# Enable these tests when coverage is setup for debugger tests
# - name: Run debugger tests
# env:
# CI_PYTHON_VERSION: ${{ env.PYTHON_VERSION }}
# CI_DISABLE_AUTO_SELECTION: 1
# uses: GabrielBB/xvfb-action@b706e4e27b14669b486812790492dc50ca16b465 # v1.7
# with:
# run: npm run testDebugger:cover
# Run TypeScript functional tests
- name: Run TypeScript functional tests
env:
CI_PYTHON_VERSION: ${{ env.PYTHON_VERSION }}
CI_DISABLE_AUTO_SELECTION: 1
run: npm run test:functional:cover
- name: Generate coverage reports
run: npm run test:cover:report
- name: Upload HTML report
uses: actions/upload-artifact@v7
with:
name: ${{ runner.os }}-coverage-report-html
path: ./coverage
retention-days: 1
Morty Proxy This is a proxified and sanitized view of the page, visit original site.