update to bare-mux 2.0

This commit is contained in:
Percs 2024-07-11 09:52:34 -05:00
parent 31d8b6a650
commit 3506d85cc0
7 changed files with 55 additions and 81 deletions

1
.gitignore vendored
View file

@ -5,4 +5,5 @@ static/bare-mux.js
static/bare-client.js static/bare-client.js
static/curl-client.js static/curl-client.js
static/epoxy-client.js static/epoxy-client.js
static/bare-mux-worker.js
meta.json meta.json

View file

@ -64,21 +64,25 @@ const devServer = await context({
resolveFrom: "cwd", resolveFrom: "cwd",
assets: [ assets: [
{ {
from: ["./node_modules/@mercuryworkshop/bare-mux/dist/bare.cjs"], from: ["./node_modules/@mercuryworkshop/bare-mux/dist/index.js"],
to: ["./static/bare-mux.js"], to: ["./static/bare-mux.js"],
}, },
{ {
from: ["./node_modules/@mercuryworkshop/bare-as-module3/dist/bare.cjs"], from: ["./node_modules/@mercuryworkshop/bare-as-module3/dist/index.mjs"],
to: ["./static/bare-client.js"], to: ["./static/bare-client.js"],
}, },
{ {
from: ["./node_modules/@mercuryworkshop/libcurl-transport/dist/index.cjs"], from: ["./node_modules/@mercuryworkshop/libcurl-transport/dist/index.mjs"],
to: ["./static/curl-client.js"], to: ["./static/curl-client.js"],
}, },
{ {
from: ["./node_modules/@mercuryworkshop/epoxy-transport/dist/index.js"], from: ["./node_modules/@mercuryworkshop/epoxy-transport/dist/index.mjs"],
to: ["./static/epoxy-client.js"], to: ["./static/epoxy-client.js"],
}, },
{
from: ["./node_modules/@mercuryworkshop/bare-mux/dist/worker.js"],
to: ["./static/bare-mux-worker.js"],
},
{ {
from: ["./dist/*"], from: ["./dist/*"],
to: ["./static"] to: ["./static"]

View file

@ -23,9 +23,9 @@
"license": "ISC", "license": "ISC",
"devDependencies": { "devDependencies": {
"@fastify/static": "^7.0.3", "@fastify/static": "^7.0.3",
"@mercuryworkshop/bare-as-module3": "^2.2.0-alpha", "@mercuryworkshop/bare-as-module3": "^2.2.2",
"@mercuryworkshop/epoxy-transport": "^1.1.0", "@mercuryworkshop/epoxy-transport": "^2.1.2",
"@mercuryworkshop/libcurl-transport": "^1.3.1", "@mercuryworkshop/libcurl-transport": "^1.3.6",
"@tomphttp/bare-server-node": "^2.0.3", "@tomphttp/bare-server-node": "^2.0.3",
"@types/eslint": "^8.56.10", "@types/eslint": "^8.56.10",
"@types/serviceworker": "^0.0.85", "@types/serviceworker": "^0.0.85",
@ -42,7 +42,7 @@
}, },
"type": "module", "type": "module",
"dependencies": { "dependencies": {
"@mercuryworkshop/bare-mux": "^1.1.2", "@mercuryworkshop/bare-mux": "^2.0.1",
"@webreflection/idb-map": "^0.1.3", "@webreflection/idb-map": "^0.1.3",
"astravel": "^0.6.1", "astravel": "^0.6.1",
"astring": "^1.8.6", "astring": "^1.8.6",

99
pnpm-lock.yaml generated
View file

@ -9,8 +9,8 @@ importers:
.: .:
dependencies: dependencies:
'@mercuryworkshop/bare-mux': '@mercuryworkshop/bare-mux':
specifier: ^1.1.2 specifier: ^2.0.1
version: 1.1.2 version: 2.0.1
'@webreflection/idb-map': '@webreflection/idb-map':
specifier: ^0.1.3 specifier: ^0.1.3
version: 0.1.3 version: 0.1.3
@ -43,14 +43,14 @@ importers:
specifier: ^7.0.3 specifier: ^7.0.3
version: 7.0.3 version: 7.0.3
'@mercuryworkshop/bare-as-module3': '@mercuryworkshop/bare-as-module3':
specifier: ^2.2.0-alpha specifier: ^2.2.2
version: 2.2.0-alpha version: 2.2.2
'@mercuryworkshop/epoxy-transport': '@mercuryworkshop/epoxy-transport':
specifier: ^1.1.0 specifier: ^2.1.2
version: 1.1.0(typescript@5.4.5) version: 2.1.2(typescript@5.4.5)
'@mercuryworkshop/libcurl-transport': '@mercuryworkshop/libcurl-transport':
specifier: ^1.3.1 specifier: ^1.3.6
version: 1.3.1(typescript@5.4.5) version: 1.3.6(typescript@5.4.5)
'@tomphttp/bare-server-node': '@tomphttp/bare-server-node':
specifier: ^2.0.3 specifier: ^2.0.3
version: 2.0.3 version: 2.0.3
@ -290,20 +290,20 @@ packages:
resolution: {integrity: sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==} resolution: {integrity: sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==}
engines: {node: '>=8'} engines: {node: '>=8'}
'@mercuryworkshop/bare-as-module3@2.2.0-alpha': '@mercuryworkshop/bare-as-module3@2.2.2':
resolution: {integrity: sha512-Vbk07NDfwENaiadfZFdG+FkjZb6dQODhykYhMpY7k2TZJanuDjs+MDIucpiqufymCTemx+9uAnv91v/GTxqJsg==} resolution: {integrity: sha512-Ds8981SmI1DQp1mDCVax1x0I5mH2dR1tYKytW7xTjlnpsfwn3RzQDiVJHUCrpc7cWGCe+7mHCF3EoMjM3hFfvQ==}
'@mercuryworkshop/bare-mux@1.1.2': '@mercuryworkshop/bare-mux@2.0.1':
resolution: {integrity: sha512-a9tfRAbpDUnJENmIPJpQT/QHVuiS6cohaQxxQ+NKZQGCeZX8v2phDUX3oya7rdwmKpASeS7Zf3o3UOX8IcHTgw==} resolution: {integrity: sha512-94YThllV9sWSb5hzIDg+U0JSNfFdkvOq6j5wwV1OON3izZhrKSsdDOkaywS5WP6HE/jm0/0ZYaYixbf8u3kjYg==}
'@mercuryworkshop/epoxy-tls@1.5.0': '@mercuryworkshop/epoxy-tls@2.0.6-1':
resolution: {integrity: sha512-U2TxqKksH8O8ml+7bm3yR4oZ3cnUSSSCO8sRqDWOoVM9B6iYQ0vBF62gfT3djJLiNLnrCQ0rJWI6H1+wzCJo7w==} resolution: {integrity: sha512-sirpgUiIO6gxjvoI+QDRebsWEgutHiMbV5ghx2Q39IkfGqYNFinaMIDZRno8yY4IZCxydf9KAo/V+1xEMwvJ+w==}
'@mercuryworkshop/epoxy-transport@1.1.0': '@mercuryworkshop/epoxy-transport@2.1.2':
resolution: {integrity: sha512-JVdKr+u53qu3GQyehZDWRfWV1UWct2fAtU2/50plFl9TLzy2rPLUHqyHTmyAuErNS6SP2uZ9BlgMz6FN4PlpVg==} resolution: {integrity: sha512-W5OnmUdYsRZt1koyUbYPJh8CLKAWLL7c6JR68CjgREVfOGXjcG2px3Jo/CXk7tErVyuiYDECnbcbhtIppvkZdQ==}
'@mercuryworkshop/libcurl-transport@1.3.1': '@mercuryworkshop/libcurl-transport@1.3.6':
resolution: {integrity: sha512-yGt8K7D1j8WLn7LgH6YPnxmHc+JUCB0x/QPIStuRftl0tq3D8uHskRFeOJ8ksTrru7mTAjk5Cpmvix8jNJ+Lug==} resolution: {integrity: sha512-K4/TSfHlkjuzY6j0XXFmIbG8m3tpMoTxLga46fhmeuX8k3EJR/FVbW8JTXOD34Iofu0vCZuuY8n/ywNCcB6XjA==}
'@nodelib/fs.scandir@2.1.5': '@nodelib/fs.scandir@2.1.5':
resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
@ -431,9 +431,6 @@ packages:
'@types/serviceworker@0.0.85': '@types/serviceworker@0.0.85':
resolution: {integrity: sha512-jBhFui72jyO0Tpsq/8AvL7GRJKiuUxdHPD9rrSRhf2SSElCn61yTyU2G133IlBVvBumCH4T5FDjmjbAG7MU9tg==} resolution: {integrity: sha512-jBhFui72jyO0Tpsq/8AvL7GRJKiuUxdHPD9rrSRhf2SSElCn61yTyU2G133IlBVvBumCH4T5FDjmjbAG7MU9tg==}
'@types/uuid@9.0.8':
resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==}
'@typescript-eslint/eslint-plugin@6.21.0': '@typescript-eslint/eslint-plugin@6.21.0':
resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==}
engines: {node: ^16.0.0 || >=18.0.0} engines: {node: ^16.0.0 || >=18.0.0}
@ -1021,8 +1018,8 @@ packages:
resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
engines: {node: '>= 0.8.0'} engines: {node: '>= 0.8.0'}
libcurl.js@0.6.8: libcurl.js@0.6.10:
resolution: {integrity: sha512-KYkWFxnSdnIeN00AZRWv1tywDawVqb7VKxw213GjqxehGQDBv0rWAKZ/R/rwEKumVYlPvRNrzZPRa9wlYgEjCg==} resolution: {integrity: sha512-GDyxCRi7+R7XFhcCRFAsNYxg3x91LiwiBISo+pWfUXfgO45J/9ZWcHqjKQg8/FbWHRkV1wwSCyPOZ8pLlbdivg==}
light-my-request@5.13.0: light-my-request@5.13.0:
resolution: {integrity: sha512-9IjUN9ZyCS9pTG+KqTDEQo68Sui2lHsYBrfMyVUTTZ3XhH8PMZq7xO94Kr+eP9dhi/kcKsx4N41p2IXEBil1pQ==} resolution: {integrity: sha512-9IjUN9ZyCS9pTG+KqTDEQo68Sui2lHsYBrfMyVUTTZ3XhH8PMZq7xO94Kr+eP9dhi/kcKsx4N41p2IXEBil1pQ==}
@ -1384,6 +1381,11 @@ packages:
engines: {node: '>=14.17'} engines: {node: '>=14.17'}
hasBin: true hasBin: true
typescript@5.5.3:
resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==}
engines: {node: '>=14.17'}
hasBin: true
undici-types@5.26.5: undici-types@5.26.5:
resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
@ -1394,10 +1396,6 @@ packages:
uri-js@4.4.1: uri-js@4.4.1:
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
uuid@9.0.1:
resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==}
hasBin: true
which@2.0.2: which@2.0.2:
resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
engines: {node: '>= 8'} engines: {node: '>= 8'}
@ -1418,18 +1416,6 @@ packages:
wrappy@1.0.2: wrappy@1.0.2:
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
ws@8.16.0:
resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==}
engines: {node: '>=10.0.0'}
peerDependencies:
bufferutil: ^4.0.1
utf-8-validate: '>=5.0.2'
peerDependenciesMeta:
bufferutil:
optional: true
utf-8-validate:
optional: true
ws@8.17.0: ws@8.17.0:
resolution: {integrity: sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==} resolution: {integrity: sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==}
engines: {node: '>=10.0.0'} engines: {node: '>=10.0.0'}
@ -1601,40 +1587,33 @@ snapshots:
'@lukeed/ms@2.0.2': {} '@lukeed/ms@2.0.2': {}
'@mercuryworkshop/bare-as-module3@2.2.0-alpha': {} '@mercuryworkshop/bare-as-module3@2.2.2':
'@mercuryworkshop/bare-mux@1.1.2':
dependencies: dependencies:
'@types/uuid': 9.0.8 typescript: 5.5.3
uuid: 9.0.1
'@mercuryworkshop/epoxy-tls@1.5.0': {} '@mercuryworkshop/bare-mux@2.0.1': {}
'@mercuryworkshop/epoxy-transport@1.1.0(typescript@5.4.5)': '@mercuryworkshop/epoxy-tls@2.0.6-1': {}
'@mercuryworkshop/epoxy-transport@2.1.2(typescript@5.4.5)':
dependencies: dependencies:
'@mercuryworkshop/epoxy-tls': 1.5.0 '@mercuryworkshop/epoxy-tls': 2.0.6-1
esbuild-plugin-umd-wrapper: 2.0.0 esbuild-plugin-umd-wrapper: 2.0.0
rollup: 4.17.2 rollup: 4.17.2
rollup-plugin-node-resolve: 5.2.0(rollup@4.17.2) rollup-plugin-node-resolve: 5.2.0(rollup@4.17.2)
rollup-plugin-typescript2: 0.36.0(rollup@4.17.2)(typescript@5.4.5) rollup-plugin-typescript2: 0.36.0(rollup@4.17.2)(typescript@5.4.5)
ws: 8.16.0
transitivePeerDependencies: transitivePeerDependencies:
- bufferutil
- typescript - typescript
- utf-8-validate
'@mercuryworkshop/libcurl-transport@1.3.1(typescript@5.4.5)': '@mercuryworkshop/libcurl-transport@1.3.6(typescript@5.4.5)':
dependencies: dependencies:
esbuild-plugin-umd-wrapper: 2.0.0 esbuild-plugin-umd-wrapper: 2.0.0
libcurl.js: 0.6.8 libcurl.js: 0.6.10
rollup: 4.17.2 rollup: 4.17.2
rollup-plugin-node-resolve: 5.2.0(rollup@4.17.2) rollup-plugin-node-resolve: 5.2.0(rollup@4.17.2)
rollup-plugin-typescript2: 0.36.0(rollup@4.17.2)(typescript@5.4.5) rollup-plugin-typescript2: 0.36.0(rollup@4.17.2)(typescript@5.4.5)
ws: 8.16.0
transitivePeerDependencies: transitivePeerDependencies:
- bufferutil
- typescript - typescript
- utf-8-validate
'@nodelib/fs.scandir@2.1.5': '@nodelib/fs.scandir@2.1.5':
dependencies: dependencies:
@ -1738,8 +1717,6 @@ snapshots:
'@types/serviceworker@0.0.85': {} '@types/serviceworker@0.0.85': {}
'@types/uuid@9.0.8': {}
'@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)': '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)':
dependencies: dependencies:
'@eslint-community/regexpp': 4.10.0 '@eslint-community/regexpp': 4.10.0
@ -2408,7 +2385,7 @@ snapshots:
prelude-ls: 1.2.1 prelude-ls: 1.2.1
type-check: 0.4.0 type-check: 0.4.0
libcurl.js@0.6.8: {} libcurl.js@0.6.10: {}
light-my-request@5.13.0: light-my-request@5.13.0:
dependencies: dependencies:
@ -2747,6 +2724,8 @@ snapshots:
typescript@5.4.5: {} typescript@5.4.5: {}
typescript@5.5.3: {}
undici-types@5.26.5: {} undici-types@5.26.5: {}
universalify@2.0.1: {} universalify@2.0.1: {}
@ -2755,8 +2734,6 @@ snapshots:
dependencies: dependencies:
punycode: 2.3.1 punycode: 2.3.1
uuid@9.0.1: {}
which@2.0.2: which@2.0.2:
dependencies: dependencies:
isexe: 2.0.0 isexe: 2.0.0
@ -2777,8 +2754,6 @@ snapshots:
wrappy@1.0.2: {} wrappy@1.0.2: {}
ws@8.16.0: {}
ws@8.17.0: {} ws@8.17.0: {}
yallist@4.0.0: {} yallist@4.0.0: {}

View file

@ -22,9 +22,6 @@
<body> <body>
<script src="https://unpkg.com/dreamland"></script> <script src="https://unpkg.com/dreamland"></script>
<script src="./bare-mux.js" defer></script> <script src="./bare-mux.js" defer></script>
<script src="./bare-client.js" defer></script>
<script src="./curl-client.js" defer></script>
<script src="./epoxy-client.js" defer></script>
<script src="./ui.js" defer></script> <script src="./ui.js" defer></script>
<script src="./scramjet.codecs.js"></script> <script src="./scramjet.codecs.js"></script>
<script src="./scramjet.config.js"></script> <script src="./scramjet.config.js"></script>

View file

@ -2,9 +2,6 @@ importScripts("scramjet.codecs.js");
importScripts("scramjet.config.js"); importScripts("scramjet.config.js");
importScripts( __scramjet$config.bundle || "scramjet.bundle.js") importScripts( __scramjet$config.bundle || "scramjet.bundle.js")
importScripts( __scramjet$config.worker || "scramjet.worker.js"); importScripts( __scramjet$config.worker || "scramjet.worker.js");
importScripts("bare-client.js")
importScripts("curl-client.js")
importScripts("epoxy-client.js")
const scramjet = new ScramjetServiceWorker(); const scramjet = new ScramjetServiceWorker();

View file

@ -1,7 +1,7 @@
navigator.serviceWorker.register("./sw.js", { navigator.serviceWorker.register("./sw.js", {
scope: __scramjet$config.prefix scope: __scramjet$config.prefix
}) })
BareMux.SetTransport("BareMod.BareClient", (location.protocol === "https:" ? "https" : "http") + "://" + location.host + "/bare/") const connection = new BareMux.BareMuxConnection("/bare-mux-worker.js")
const flex = css`display: flex;`; const flex = css`display: flex;`;
const col = css`flex-direction: column;`; const col = css`flex-direction: column;`;
const store = $store({ const store = $store({
@ -9,6 +9,7 @@ const store = $store({
wispurl: "wss://wisp.mercurywork.shop/", wispurl: "wss://wisp.mercurywork.shop/",
bareurl: (location.protocol === "https:" ? "https" : "http") + "://" + location.host + "/bare/", bareurl: (location.protocol === "https:" ? "https" : "http") + "://" + location.host + "/bare/",
}, { ident: "settings", backing: "localstorage", autosave: "auto" }); }, { ident: "settings", backing: "localstorage", autosave: "auto" });
connection.setTransport("/bare-client.js", [store.bareurl])
function App() { function App() {
this.urlencoded = ""; this.urlencoded = "";
this.css = ` this.css = `
@ -81,10 +82,9 @@ function App() {
<div class=${[flex, "buttons"]}> <div class=${[flex, "buttons"]}>
<button on:click=${() => BareMux.SetTransport("BareMod.BareClient", store.bareurl)}>use bare server 3</button> <button on:click=${() => connection.setTransport("/bare-client.js", [store.bareurl])}>use bare server 3</button>
<button on:click=${() => BareMux.SetTransport("CurlMod.LibcurlClient", { wisp: store.wispurl })}>use libcurl.js</button> <button on:click=${() => connection.setTransport("/curl-client.js", [{ wisp: store.wispurl }])}>use libcurl.js</button>
<button on:click=${() => BareMux.SetTransport("EpxMod.EpoxyClient", { wisp: store.wispurl })}>use epoxy</button> <button on:click=${() => connection.setTransport("/epoxy-client.js", [{ wisp: store.wispurl }])}>use epoxy</button>
<button on:click=${() => BareMux.SetSingletonTransport(new BareMod.BareClient(store.bareurl))}>use bare server 3 (remote)</button>
<button on:click=${() => window.open(this.urlencoded)}>open in fullscreen</button> <button on:click=${() => window.open(this.urlencoded)}>open in fullscreen</button>
</div> </div>
</div> </div>