You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airflow.apache.org by po...@apache.org on 2022/04/29 17:45:49 UTC
[airflow] branch main updated: Fix mssql in the new Breeze (#23368)
This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/main by this push:
new 9e11d208da Fix mssql in the new Breeze (#23368)
9e11d208da is described below
commit 9e11d208dac0951d4f3a5beda0d8801f4e70cb0a
Author: Jarek Potiuk <ja...@polidea.com>
AuthorDate: Fri Apr 29 19:45:37 2022 +0200
Fix mssql in the new Breeze (#23368)
The new Breeze did not use conditionally debian version to run
MsSQL docker compose.
This PR fixes it
---
.../airflow_breeze/commands/developer_commands.py | 6 +++
dev/breeze/src/airflow_breeze/commands/main.py | 2 +
.../src/airflow_breeze/shell/shell_params.py | 9 +++-
images/breeze/output-commands.svg | 53 +++++++++++-----------
images/breeze/output-shell.svg | 53 +++++++++++-----------
5 files changed, 70 insertions(+), 53 deletions(-)
diff --git a/dev/breeze/src/airflow_breeze/commands/developer_commands.py b/dev/breeze/src/airflow_breeze/commands/developer_commands.py
index f2c8715f95..13ed9c5937 100644
--- a/dev/breeze/src/airflow_breeze/commands/developer_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/developer_commands.py
@@ -27,6 +27,7 @@ from airflow_breeze.commands.common_options import (
option_answer,
option_backend,
option_db_reset,
+ option_debian_version,
option_dry_run,
option_force_build,
option_forward_credentials,
@@ -84,6 +85,7 @@ DEVELOPER_PARAMETERS = {
"--postgres-version",
"--mysql-version",
"--mssql-version",
+ "--debian-version",
"--forward-credentials",
"--db-reset",
],
@@ -107,6 +109,7 @@ DEVELOPER_PARAMETERS = {
"--postgres-version",
"--mysql-version",
"--mssql-version",
+ "--debian-version",
"--forward-credentials",
"--db-reset",
],
@@ -192,6 +195,7 @@ DEVELOPER_PARAMETERS = {
@option_dry_run
@option_python
@option_backend
+@option_debian_version
@option_github_repository
@option_postgres_version
@option_mysql_version
@@ -214,6 +218,7 @@ def shell(
postgres_version: str,
mysql_version: str,
mssql_version: str,
+ debian_version: str,
forward_credentials: bool,
mount_sources: str,
use_airflow_version: str,
@@ -244,6 +249,7 @@ def shell(
db_reset=db_reset,
extra_args=extra_args,
answer=answer,
+ debian_version=debian_version,
)
diff --git a/dev/breeze/src/airflow_breeze/commands/main.py b/dev/breeze/src/airflow_breeze/commands/main.py
index 6434e5a63e..22baa02edd 100644
--- a/dev/breeze/src/airflow_breeze/commands/main.py
+++ b/dev/breeze/src/airflow_breeze/commands/main.py
@@ -19,6 +19,7 @@ from airflow_breeze.commands.common_options import (
option_answer,
option_backend,
option_db_reset,
+ option_debian_version,
option_dry_run,
option_force_build,
option_forward_credentials,
@@ -45,6 +46,7 @@ from airflow_breeze.utils.path_utils import create_directories
@option_postgres_version
@option_mysql_version
@option_mssql_version
+@option_debian_version
@option_forward_credentials
@option_force_build
@option_use_airflow_version
diff --git a/dev/breeze/src/airflow_breeze/shell/shell_params.py b/dev/breeze/src/airflow_breeze/shell/shell_params.py
index 28e9478317..129ef46097 100644
--- a/dev/breeze/src/airflow_breeze/shell/shell_params.py
+++ b/dev/breeze/src/airflow_breeze/shell/shell_params.py
@@ -22,6 +22,7 @@ from typing import Optional, Tuple
from airflow_breeze.branch_defaults import AIRFLOW_BRANCH
from airflow_breeze.global_constants import (
ALLOWED_BACKENDS,
+ ALLOWED_DEBIAN_VERSIONS,
ALLOWED_MSSQL_VERSIONS,
ALLOWED_MYSQL_VERSIONS,
ALLOWED_POSTGRES_VERSIONS,
@@ -51,6 +52,7 @@ class ShellParams:
mysql_version: str = ALLOWED_MYSQL_VERSIONS[0]
backend: str = ALLOWED_BACKENDS[0]
python: str = ALLOWED_PYTHON_MAJOR_MINOR_VERSIONS[0]
+ debian_version: str = ALLOWED_DEBIAN_VERSIONS[0]
dry_run: bool = False
load_example_dags: bool = False
load_default_connections: bool = False
@@ -156,7 +158,12 @@ class ShellParams:
def compose_files(self):
compose_ci_file = []
main_ci_docker_compose_file = f"{str(SCRIPTS_CI_DIR)}/docker-compose/base.yml"
- backend_docker_compose_file = f"{str(SCRIPTS_CI_DIR)}/docker-compose/backend-{self.backend}.yml"
+ if self.backend == "mssql":
+ backend_docker_compose_file = (
+ f"{str(SCRIPTS_CI_DIR)}/docker-compose/backend-{self.backend}-{self.debian_version}.yml"
+ )
+ else:
+ backend_docker_compose_file = f"{str(SCRIPTS_CI_DIR)}/docker-compose/backend-{self.backend}.yml"
backend_port_docker_compose_file = (
f"{str(SCRIPTS_CI_DIR)}/docker-compose/backend-{self.backend}-port.yml"
)
diff --git a/images/breeze/output-commands.svg b/images/breeze/output-commands.svg
index ce8af6ddff..66b560b308 100644
--- a/images/breeze/output-commands.svg
+++ b/images/breeze/output-commands.svg
@@ -1,4 +1,4 @@
-<svg width="1720.0" height="1836" viewBox="0 0 1720.0 1836"
+<svg width="1720.0" height="1858" viewBox="0 0 1720.0 1858"
xmlns="http://www.w3.org/2000/svg">
<style>
@font-face {
@@ -17,30 +17,30 @@
font-style: bold;
font-weight: 700;
}
- .rich-svg-1828580335-terminal-wrapper span {
+ .rich-svg-3448604350-terminal-wrapper span {
display: inline-block;
white-space: pre;
vertical-align: top;
font-size: 18px;
font-family:'Rich Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
}
- .rich-svg-1828580335-terminal-wrapper a {
+ .rich-svg-3448604350-terminal-wrapper a {
text-decoration: none;
color: inherit;
}
- .rich-svg-1828580335-terminal-body .blink {
- animation: rich-svg-1828580335-blinker 1s infinite;
+ .rich-svg-3448604350-terminal-body .blink {
+ animation: rich-svg-3448604350-blinker 1s infinite;
}
- @keyframes rich-svg-1828580335-blinker {
+ @keyframes rich-svg-3448604350-blinker {
from { opacity: 1.0; }
50% { opacity: 0.3; }
to { opacity: 1.0; }
}
- .rich-svg-1828580335-terminal-wrapper {
+ .rich-svg-3448604350-terminal-wrapper {
padding: 140px;
padding-top: 100px;
}
- .rich-svg-1828580335-terminal {
+ .rich-svg-3448604350-terminal {
position: relative;
display: flex;
flex-direction: column;
@@ -49,7 +49,7 @@
border-radius: 14px;
box-shadow: 0 0 0 1px #484848;
}
- .rich-svg-1828580335-terminal:after {
+ .rich-svg-3448604350-terminal:after {
position: absolute;
width: 100%;
height: 100%;
@@ -60,7 +60,7 @@
transform: rotate(-4.5deg);
z-index: -1;
}
- .rich-svg-1828580335-terminal-header {
+ .rich-svg-3448604350-terminal-header {
position: relative;
width: 100%;
background-color: #2e2e2e;
@@ -72,7 +72,7 @@
box-shadow: inset 0px -1px 0px 0px #4e4e4e,
inset 0px -4px 8px 0px #1a1a1a;
}
- .rich-svg-1828580335-terminal-title-tab {
+ .rich-svg-3448604350-terminal-title-tab {
display: inline-block;
margin-top: 14px;
margin-left: 124px;
@@ -85,36 +85,36 @@
inset 1px 0px 0px 0px #4e4e4e,
inset -1px 0px 0px 0px #4e4e4e;
}
- .rich-svg-1828580335-terminal-traffic-lights {
+ .rich-svg-3448604350-terminal-traffic-lights {
position: absolute;
top: 24px;
left: 20px;
}
- .rich-svg-1828580335-terminal-body {
+ .rich-svg-3448604350-terminal-body {
line-height: 22px;
padding: 14px;
}
- .rich-svg-1828580335-terminal-body .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
-.rich-svg-1828580335-terminal-body .r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.rich-svg-1828580335-terminal-body .r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
-.rich-svg-1828580335-terminal-body .r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.rich-svg-1828580335-terminal-body .r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
-.rich-svg-1828580335-terminal-body .r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
-.rich-svg-1828580335-terminal-body .r7 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;}
+ .rich-svg-3448604350-terminal-body .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
+.rich-svg-3448604350-terminal-body .r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-3448604350-terminal-body .r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-3448604350-terminal-body .r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-3448604350-terminal-body .r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-3448604350-terminal-body .r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-3448604350-terminal-body .r7 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;}
</style>
<foreignObject x="0" y="0" width="100%" height="100%">
<body xmlns="http://www.w3.org/1999/xhtml">
- <div class="rich-svg-1828580335-terminal-wrapper">
- <div class="rich-svg-1828580335-terminal">
- <div class="rich-svg-1828580335-terminal-header">
- <svg class="rich-svg-1828580335-terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
+ <div class="rich-svg-3448604350-terminal-wrapper">
+ <div class="rich-svg-3448604350-terminal">
+ <div class="rich-svg-3448604350-terminal-header">
+ <svg class="rich-svg-3448604350-terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
<circle cx="14" cy="8" r="8" fill="#ff6159"/>
<circle cx="38" cy="8" r="8" fill="#ffbd2e"/>
<circle cx="62" cy="8" r="8" fill="#28c941"/>
</svg>
- <div class="rich-svg-1828580335-terminal-title-tab">Breeze commands</div>
+ <div class="rich-svg-3448604350-terminal-title-tab">Breeze commands</div>
</div>
- <div class="rich-svg-1828580335-terminal-body">
+ <div class="rich-svg-3448604350-terminal-body">
<div><span class="r2"> </span></div>
<div><span class="r2"> </span><span class="r3">Usage: </span><span class="r2">breeze [OPTIONS] COMMAND [ARGS]... </span></div>
<div><span class="r2"> </span></div>
@@ -126,6 +126,7 @@
<div><span class="r4">│</span><span class="r1"> </span><span class="r5">--postgres-version</span><span class="r1"> </span><span class="r6">-P</span><span class="r1"> </span><span class="r1">Version of Postgres used.</span><span class="r1"> </span><span class="r7">(>10< | 11 | 12 | 13)</span><span class="r1"> </span><span class="r4">[default: 10]</span><span class="r1"> </span><span class="r1"> </span><span class="r4">│</span></div>
<div><span class="r4">│</span><span class="r1"> </span><span class="r5">--mysql-version</span><span class="r1"> </span><span class="r6">-M</span><span class="r1"> </span><span class="r1">Version of MySQL used.</span><span class="r1"> </span><span class="r7">(>5.7< | 8)</span><span class="r1"> </span><span class="r4">[default: 5.7]</span><span class="r1"> </span><span class="r1"> </span><span class="r4">│</span></div>
<div><span class="r4">│</span><span class="r1"> </span><span class="r5">--mssql-version</span><span class="r1"> </span><span class="r6">-S</span><span class="r1"> </span><span class="r1">Version of MsSQL used.</span><span class="r1"> </span><span class="r7">(>2017-latest< | 2019-latest)</span><span class="r1"> </span><span class="r4">[default: 2017-latest]</span><span class="r1"> </span><span class="r1"> </span><span class="r4">│</span></div>
+<div><span class="r4">│</span><span class="r1"> </span><span class="r5">--debian-version</span><span class="r1"> </span><span class="r6">-d</span><span class="r1"> </span><span class="r1">Debian version used for the image.</span><span class="r1"> </span><span class="r7">(bullseye | buster)</span><span class="r1"> </span><span class="r4">[default: bullseye]</span><span class="r1"> </span><span class="r1"> </span><span class="r4">│</span></div>
<div><span class="r4">│</span><span class="r1"> </span><span class="r5">--forward-credentials</span><span class="r1"> </span><span class="r6">-f</span><span class="r1"> </span><span class="r1">Forward local credentials to container when running. </span><span class="r1"> </span><span class="r4">│</span></div>
<div><span class="r4">│</span><span class="r1"> </span><span class="r5">--db-reset</span><span class="r1"> </span><span class="r6">-d</span><span class="r1"> </span><span class="r1">Reset DB when entering the container. </span><span class="r1"> </span><span class="r4">│</span></div>
<div><span class="r4">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</span></div>
diff --git a/images/breeze/output-shell.svg b/images/breeze/output-shell.svg
index c0a7da761a..aee6d87e98 100644
--- a/images/breeze/output-shell.svg
+++ b/images/breeze/output-shell.svg
@@ -1,4 +1,4 @@
-<svg width="1720.0" height="1022" viewBox="0 0 1720.0 1022"
+<svg width="1720.0" height="1044" viewBox="0 0 1720.0 1044"
xmlns="http://www.w3.org/2000/svg">
<style>
@font-face {
@@ -17,30 +17,30 @@
font-style: bold;
font-weight: 700;
}
- .rich-svg-379414012-terminal-wrapper span {
+ .rich-svg-2505769163-terminal-wrapper span {
display: inline-block;
white-space: pre;
vertical-align: top;
font-size: 18px;
font-family:'Rich Fira Code','Cascadia Code',Monaco,Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace;
}
- .rich-svg-379414012-terminal-wrapper a {
+ .rich-svg-2505769163-terminal-wrapper a {
text-decoration: none;
color: inherit;
}
- .rich-svg-379414012-terminal-body .blink {
- animation: rich-svg-379414012-blinker 1s infinite;
+ .rich-svg-2505769163-terminal-body .blink {
+ animation: rich-svg-2505769163-blinker 1s infinite;
}
- @keyframes rich-svg-379414012-blinker {
+ @keyframes rich-svg-2505769163-blinker {
from { opacity: 1.0; }
50% { opacity: 0.3; }
to { opacity: 1.0; }
}
- .rich-svg-379414012-terminal-wrapper {
+ .rich-svg-2505769163-terminal-wrapper {
padding: 140px;
padding-top: 100px;
}
- .rich-svg-379414012-terminal {
+ .rich-svg-2505769163-terminal {
position: relative;
display: flex;
flex-direction: column;
@@ -49,7 +49,7 @@
border-radius: 14px;
box-shadow: 0 0 0 1px #484848;
}
- .rich-svg-379414012-terminal:after {
+ .rich-svg-2505769163-terminal:after {
position: absolute;
width: 100%;
height: 100%;
@@ -60,7 +60,7 @@
transform: rotate(-4.5deg);
z-index: -1;
}
- .rich-svg-379414012-terminal-header {
+ .rich-svg-2505769163-terminal-header {
position: relative;
width: 100%;
background-color: #2e2e2e;
@@ -72,7 +72,7 @@
box-shadow: inset 0px -1px 0px 0px #4e4e4e,
inset 0px -4px 8px 0px #1a1a1a;
}
- .rich-svg-379414012-terminal-title-tab {
+ .rich-svg-2505769163-terminal-title-tab {
display: inline-block;
margin-top: 14px;
margin-left: 124px;
@@ -85,36 +85,36 @@
inset 1px 0px 0px 0px #4e4e4e,
inset -1px 0px 0px 0px #4e4e4e;
}
- .rich-svg-379414012-terminal-traffic-lights {
+ .rich-svg-2505769163-terminal-traffic-lights {
position: absolute;
top: 24px;
left: 20px;
}
- .rich-svg-379414012-terminal-body {
+ .rich-svg-2505769163-terminal-body {
line-height: 22px;
padding: 14px;
}
- .rich-svg-379414012-terminal-body .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
-.rich-svg-379414012-terminal-body .r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.rich-svg-379414012-terminal-body .r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
-.rich-svg-379414012-terminal-body .r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
-.rich-svg-379414012-terminal-body .r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
-.rich-svg-379414012-terminal-body .r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
-.rich-svg-379414012-terminal-body .r7 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;}
+ .rich-svg-2505769163-terminal-body .r1 {color: #f2f2f2; text-decoration-color: #f2f2f2;background-color: #0c0c0c;}
+.rich-svg-2505769163-terminal-body .r2 {font-weight: bold;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-2505769163-terminal-body .r3 {color: #e5e510; text-decoration-color: #e5e510; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-2505769163-terminal-body .r4 {color: #7f7f7f; text-decoration-color: #7f7f7f;color: #f2f2f2; text-decoration-color: #f2f2f2;;background-color: #0c0c0c;}
+.rich-svg-2505769163-terminal-body .r5 {color: #11a8cd; text-decoration-color: #11a8cd; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-2505769163-terminal-body .r6 {color: #0dbc79; text-decoration-color: #0dbc79; font-weight: bold;background-color: #0c0c0c;}
+.rich-svg-2505769163-terminal-body .r7 {color: #78780e; text-decoration-color: #78780e;background-color: #0c0c0c;}
</style>
<foreignObject x="0" y="0" width="100%" height="100%">
<body xmlns="http://www.w3.org/1999/xhtml">
- <div class="rich-svg-379414012-terminal-wrapper">
- <div class="rich-svg-379414012-terminal">
- <div class="rich-svg-379414012-terminal-header">
- <svg class="rich-svg-379414012-terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
+ <div class="rich-svg-2505769163-terminal-wrapper">
+ <div class="rich-svg-2505769163-terminal">
+ <div class="rich-svg-2505769163-terminal-header">
+ <svg class="rich-svg-2505769163-terminal-traffic-lights" width="90" height="21" viewBox="0 0 90 21" xmlns="http://www.w3.org/2000/svg">
<circle cx="14" cy="8" r="8" fill="#ff6159"/>
<circle cx="38" cy="8" r="8" fill="#ffbd2e"/>
<circle cx="62" cy="8" r="8" fill="#28c941"/>
</svg>
- <div class="rich-svg-379414012-terminal-title-tab">Command: shell</div>
+ <div class="rich-svg-2505769163-terminal-title-tab">Command: shell</div>
</div>
- <div class="rich-svg-379414012-terminal-body">
+ <div class="rich-svg-2505769163-terminal-body">
<div><span class="r2"> </span></div>
<div><span class="r2"> </span><span class="r3">Usage: </span><span class="r2">breeze shell [OPTIONS] [EXTRA_ARGS]... </span></div>
<div><span class="r2"> </span></div>
@@ -128,6 +128,7 @@
<div><span class="r4">│</span><span class="r1"> </span><span class="r5">--postgres-version</span><span class="r1"> </span><span class="r6">-P</span><span class="r1"> </span><span class="r1">Version of Postgres used.</span><span class="r1"> </span><span class="r7">(>10< | 11 | 12 | 13)</span><span class="r1"> </span><span class="r4">[default: 10]</span><span class="r1"> </span><span class="r1"> </span><span class="r4">│</span></div>
<div><span class="r4">│</span><span class="r1"> </span><span class="r5">--mysql-version</span><span class="r1"> </span><span class="r6">-M</span><span class="r1"> </span><span class="r1">Version of MySQL used.</span><span class="r1"> </span><span class="r7">(>5.7< | 8)</span><span class="r1"> </span><span class="r4">[default: 5.7]</span><span class="r1"> </span><span class="r1"> </span><span class="r4">│</span></div>
<div><span class="r4">│</span><span class="r1"> </span><span class="r5">--mssql-version</span><span class="r1"> </span><span class="r6">-S</span><span class="r1"> </span><span class="r1">Version of MsSQL used.</span><span class="r1"> </span><span class="r7">(>2017-latest< | 2019-latest)</span><span class="r1"> </span><span class="r4">[default: 2017-latest]</span><span class="r1"> </span><span class="r1"> </span><span class="r4">│</span></div>
+<div><span class="r4">│</span><span class="r1"> </span><span class="r5">--debian-version</span><span class="r1"> </span><span class="r6">-d</span><span class="r1"> </span><span class="r1">Debian version used for the image.</span><span class="r1"> </span><span class="r7">(bullseye | buster)</span><span class="r1"> </span><span class="r4">[default: bullseye]</span><span class="r1"> </span><span class="r1"> </span><span class="r4">│</span></div>
<div><span class="r4">│</span><span class="r1"> </span><span class="r5">--forward-credentials</span><span class="r1"> </span><span class="r6">-f</span><span class="r1"> </span><span class="r1">Forward local credentials to container when running. </span><span class="r1"> </span><span class="r4">│</span></div>
<div><span class="r4">│</span><span class="r1"> </span><span class="r5">--db-reset</span><span class="r1"> </span><span class="r6">-d</span><span class="r1"> </span><span class="r1">Reset DB when entering the container. </span><span class="r1"> </span><span class="r4">│</span></div>
<div><span class="r4">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</span></div>