Changes to elo.scroll.pub

Breck Yunits
Breck Yunits
1 month ago
updated script.js
script.js
Changed around line 69: function exportCSV() {
- const blob = new Blob(
- [
- `URL,Rating,Wins,Matches\
- ${csv}`,
- ],
- { type: "text/csv" },
- );
+ const blob = new Blob([`URL,Rating,Wins,Matches\n${csv}`], {
+ type: "text/csv",
+ });
Changed around line 82: ${csv}`,
- .value.split(
- "\
- ",
- )
+ .value.split(/\n/g)
Breck Yunits
Breck Yunits
1 month ago
updated index.scroll
index.scroll
Changed around line 20: main
- button
+ button Start Ranking!
- Start Ranking!
Changed around line 36: main
- div
+ div VS
- VS
Changed around line 52: main
- button
+ button Export CSV
- Export CSV
Breck Yunits
Breck Yunits
1 month ago
updated script.js
script.js
Changed around line 1
+ const ELO_K = 32;
+ let items = [];
+ let currentPair = [];
+
+ function initializeRatings(urls) {
+ return urls.map((url) => ({
+ url: url.trim(),
+ rating: 1000,
+ matches: 0,
+ wins: 0,
+ }));
+ }
+
+ function getExpectedScore(a, b) {
+ return 1 / (1 + Math.pow(10, (b - a) / 400));
+ }
+
+ function updateRatings(winner, loser) {
+ const expectedWin = getExpectedScore(winner.rating, loser.rating);
+ const expectedLoss = getExpectedScore(loser.rating, winner.rating);
+
+ winner.rating += ELO_K * (1 - expectedWin);
+ loser.rating += ELO_K * (0 - expectedLoss);
+
+ winner.matches++;
+ loser.matches++;
+ winner.wins++;
+ }
+
+ function getNextPair() {
+ items.sort((a, b) => a.rating - b.rating);
+ const mid = Math.floor(items.length / 2);
+ return [itemsid], itemsid + 1] || items[0]];
+ }
+
+ function showPair() {
+ currentPair = getNextPair();
+ document.getElementById("frameA").src = currentPair[0].url;
+ document.getElementById("frameB").src = currentPair[1].url;
+ }
+
+ function handleChoice(winnerIndex) {
+ const [a, b] = currentPair;
+ updateRatings(winnerIndex === 0 ? a : b, winnerIndex === 0 ? b : a);
+ showPair();
+ updateResults();
+ }
+
+ function updateResults() {
+ const sorted = [...items].sort((a, b) => b.rating - a.rating);
+ const tbody = document.querySelector("#resultsTable tbody");
+ tbody.innerHTML = sorted
+ .map(
+ (item, i) => `
+
+ ${i + 1}
+ ${item.url}
+ ${Math.round(item.rating)}
+
+ `,
+ )
+ .join("");
+ }
+
+ function exportCSV() {
+ const csv = items
+ .map((item) => `${item.url},${item.rating},${item.wins},${item.matches}`)
+ .join(
+ "\
+ ",
+ );
+ const blob = new Blob(
+ [
+ `URL,Rating,Wins,Matches\
+ ${csv}`,
+ ],
+ { type: "text/csv" },
+ );
+ const url = URL.createObjectURL(blob);
+ const a = document.createElement("a");
+ a.href = url;
+ a.download = "elo_rankings.csv";
+ a.click();
+ }
+
+ document.getElementById("startBtn").addEventListener("click", () => {
+ const urls = document
+ .getElementById("urlInput")
+ .value.split(
+ "\
+ ",
+ )
+ .filter(Boolean);
+ if (urls.length < 2) return alert("Please enter at least 2 URLs");
+ items = initializeRatings(urls);
+ document.querySelector(".input-section").hidden = true;
+ document.querySelector(".compare-section").hidden = false;
+ document.querySelector(".results-section").hidden = false;
+ showPair();
+ });
+
+ document.querySelectorAll(".choice-overlay").forEach((overlay) => {
+ overlay.addEventListener("click", (e) => {
+ handleChoice(parseInt(e.target.dataset.choice === "A" ? 0 : 1));
+ });
+ });
+
+ document.getElementById("exportBtn").addEventListener("click", exportCSV);
+
+ // Initialize from localStorage
+ try {
+ const saved = localStorage.getItem("eloItems");
+ if (saved) {
+ items = JSON.parse(saved);
+ updateResults();
+ }
+ } catch {}
+
+ window.addEventListener("beforeunload", () => {
+ localStorage.setItem("eloItems", JSON.stringify(items));
+ });
Breck Yunits
Breck Yunits
1 month ago
created script.js
script.js
Breck Yunits
Breck Yunits
1 month ago
updated style.css
style.css
Changed around line 1
+ :root {
+ --primary: #6c5ce7;
+ --secondary: #a8a5e6;
+ --accent: #ff7675;
+ --bg: #f8f9fa;
+ --text: #2d3436;
+ }
+
+ * {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+ }
+
+ body {
+ font-family:
+ system-ui,
+ -apple-system,
+ sans-serif;
+ line-height: 1.6;
+ color: var(--text);
+ background: var(--bg);
+ }
+
+ .hero {
+ text-align: center;
+ padding: 4rem 1rem;
+ background: linear-gradient(135deg, #6c5ce7 0%, #a8a5e6 100%);
+ color: white;
+ clip-path: polygon(0 0, 100% 0, 100% 90%, 0 100%);
+ margin-bottom: -3rem;
+ }
+
+ .title-gradient {
+ background: linear-gradient(45deg, #fff 45%, #ff7675);
+ -webkit-background-clip: text;
+ background-clip: text;
+ color: transparent;
+ font-size: 3rem;
+ }
+
+ .input-section {
+ max-width: 800px;
+ margin: 4rem auto;
+ padding: 0 1rem;
+ }
+
+ textarea {
+ width: 100%;
+ padding: 1rem;
+ border: 2px solid var(--secondary);
+ border-radius: 1rem;
+ resize: vertical;
+ font: inherit;
+ margin-bottom: 1rem;
+ transition: border-color 0.3s ease;
+ }
+
+ textarea:focus {
+ outline: none;
+ border-color: var(--primary);
+ }
+
+ .vs-container {
+ display: flex;
+ gap: 2rem;
+ justify-content: center;
+ align-items: center;
+ min-height: 60vh;
+ padding: 2rem;
+ flex-wrap: wrap;
+ }
+
+ .frame-container {
+ position: relative;
+ flex: 1;
+ max-width: 600px;
+ min-width: 300px;
+ aspect-ratio: 16/9;
+ border-radius: 1rem;
+ overflow: hidden;
+ box-shadow: 0 10px 20px rgba(0, 0, 0, 0.1);
+ transition: transform 0.3s ease;
+ }
+
+ .frame-container:hover {
+ transform: translateY(-5px);
+ }
+
+ .matchup-frame {
+ width: 100%;
+ height: 100%;
+ border: none;
+ }
+
+ .choice-overlay {
+ position: absolute;
+ inset: 0;
+ cursor: pointer;
+ opacity: 0;
+ transition: opacity 0.3s ease;
+ display: grid;
+ place-items: center;
+ font-size: 4rem;
+ color: white;
+ text-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);
+ }
+
+ .choice-overlay:hover {
+ opacity: 1;
+ background: rgba(0, 0, 0, 0.2);
+ }
+
+ .results-section {
+ max-width: 800px;
+ margin: 4rem auto;
+ padding: 0 1rem;
+ }
+
+ #resultsTable {
+ width: 100%;
+ border-collapse: collapse;
+ background: white;
+ border-radius: 1rem;
+ overflow: hidden;
+ box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
+ }
+
+ th,
+ td {
+ padding: 1rem;
+ text-align: left;
+ }
+
+ th {
+ background: var(--primary);
+ color: white;
+ }
+
+ tr:nth-child(even) {
+ background: var(--bg);
+ }
+
+ .primary-button {
+ background: var(--accent);
+ color: white;
+ border: none;
+ padding: 0.8rem 2rem;
+ border-radius: 0.5rem;
+ cursor: pointer;
+ font: inherit;
+ transition: transform 0.2s ease;
+ }
+
+ .primary-button:hover {
+ transform: scale(1.05);
+ }
+
+ @media (max-width: 768px) {
+ .vs-container {
+ flex-direction: column;
+ }
+ .frame-container {
+ width: 100%;
+ }
+ }
Breck Yunits
Breck Yunits
1 month ago
created style.css
style.css
Breck Yunits
Breck Yunits
1 month ago
updated index.scroll
index.scroll
Changed around line 1
+ buildHtml
+ baseUrl https://elo.scroll.pub
+ title EloAnything - Rank Anything!
+ metaTags
+ editButton /edit.html
+ style.css
+
+ header
+ class hero
+ div
+ class hero-content
+ h1 EloAnything
+ class title-gradient
+ p Paste URLs to start ranking!
+ class subtitle
+ main
+ section
+ class input-section
+ textarea
+ id urlInput
+ placeholder Paste URLs here (one per line)...
+ rows 6
+ button
+ class primary-button
+ id startBtn
+ Start Ranking!
+ section
+ class compare-section
+ hidden
+ div
+ class vs-container
+ div
+ class frame-container
+ iframe
+ class matchup-frame
+ id frameA
+ div
+ class choice-overlay
+ data-choice A
+ div
+ class vs-text
+ VS
+ div
+ class frame-container
+ iframe
+ class matchup-frame
+ id frameB
+ div
+ class choice-overlay
+ data-choice B
+ section
+ class results-section
+ hidden
+ div
+ class results-header
+ h2 Rankings
+ button
+ class export-button
+ id exportBtn
+ Export CSV
+ table
+ id resultsTable
+ thead
+ tr
+ th Rank
+ th URL
+ th Score
+ tbody
+ footer
+ div
+ class footer-content
+ p Made with ❤️ · Refresh to start over
+
+ script.js
Breck Yunits
Breck Yunits
1 month ago
created index.scroll
index.scroll
ScrollHub
ScrollHub
1 month ago
Initial commit
prompt.json
Changed around line 1
+ {
+ "id": "e7c954b0-e038-469f-b390-5d09cd3ffbb3",
+ "object": "chat.completion",
+ "created": 1746300403,
+ "model": "deepseek-reasoner",
+ "choices": [
+ {
+ "index": 0,
+ "message": {
+ "role": "assistant",
+ "content": "---domain--- \nelo.scroll.pub \n\n---index.scroll--- \nbuildHtml \nbaseUrl https://elo.scroll.pub \nmetaTags \neditButton /edit.html \ntitle EloAnything - Rank Anything! \nstyle.css \n\nheader \n class hero \n div \n class hero-content \n h1 EloAnything \n class title-gradient \n p Paste URLs to start ranking! \n class subtitle \nmain \n section \n class input-section \n textarea \n id urlInput \n placeholder Paste URLs here (one per line)... \n rows 6 \n button \n class primary-button \n id startBtn \n Start Ranking! \n section \n class compare-section \n hidden \n div \n class vs-container \n div \n class frame-container \n iframe \n class matchup-frame \n id frameA \n div \n class choice-overlay \n data-choice A \n div \n class vs-text \n VS \n div \n class frame-container \n iframe \n class matchup-frame \n id frameB \n div \n class choice-overlay \n data-choice B \n section \n class results-section \n hidden \n div \n class results-header \n h2 Rankings \n button \n class export-button \n id exportBtn \n Export CSV \n table \n id resultsTable \n thead \n tr \n th Rank \n th URL \n th Score \n tbody \nfooter \n div \n class footer-content \n p Made with ❤️ · Refresh to start over \n\nscript.js \n\n---style.css--- \n:root { \n --primary: #6c5ce7; \n --secondary: #a8a5e6; \n --accent: #ff7675; \n --bg: #f8f9fa; \n --text: #2d3436; \n} \n\n* { \n box-sizing: border-box; \n margin: 0; \n padding: 0; \n} \n\nbody { \n font-family: system-ui, -apple-system, sans-serif; \n line-height: 1.6; \n color: var(--text); \n background: var(--bg); \n} \n\n.hero { \n text-align: center; \n padding: 4rem 1rem; \n background: linear-gradient(135deg, #6c5ce7 0%, #a8a5e6 100%); \n color: white; \n clip-path: polygon(0 0, 100% 0, 100% 90%, 0 100%); \n margin-bottom: -3rem; \n} \n\n.title-gradient { \n background: linear-gradient(45deg, #fff 45%, #ff7675); \n -webkit-background-clip: text; \n background-clip: text; \n color: transparent; \n font-size: 3rem; \n} \n\n.input-section { \n max-width: 800px; \n margin: 4rem auto; \n padding: 0 1rem; \n} \n\ntextarea { \n width: 100%; \n padding: 1rem; \n border: 2px solid var(--secondary); \n border-radius: 1rem; \n resize: vertical; \n font: inherit; \n margin-bottom: 1rem; \n transition: border-color 0.3s ease; \n} \n\ntextarea:focus { \n outline: none; \n border-color: var(--primary); \n} \n\n.vs-container { \n display: flex; \n gap: 2rem; \n justify-content: center; \n align-items: center; \n min-height: 60vh; \n padding: 2rem; \n flex-wrap: wrap; \n} \n\n.frame-container { \n position: relative; \n flex: 1; \n max-width: 600px; \n min-width: 300px; \n aspect-ratio: 16/9; \n border-radius: 1rem; \n overflow: hidden; \n box-shadow: 0 10px 20px rgba(0,0,0,0.1); \n transition: transform 0.3s ease; \n} \n\n.frame-container:hover { \n transform: translateY(-5px); \n} \n\n.matchup-frame { \n width: 100%; \n height: 100%; \n border: none; \n} \n\n.choice-overlay { \n position: absolute; \n inset: 0; \n cursor: pointer; \n opacity: 0; \n transition: opacity 0.3s ease; \n display: grid; \n place-items: center; \n font-size: 4rem; \n color: white; \n text-shadow: 0 2px 10px rgba(0,0,0,0.3); \n} \n\n.choice-overlay:hover { \n opacity: 1; \n background: rgba(0,0,0,0.2); \n} \n\n.results-section { \n max-width: 800px; \n margin: 4rem auto; \n padding: 0 1rem; \n} \n\n#resultsTable { \n width: 100%; \n border-collapse: collapse; \n background: white; \n border-radius: 1rem; \n overflow: hidden; \n box-shadow: 0 5px 15px rgba(0,0,0,0.1); \n} \n\nth, td { \n padding: 1rem; \n text-align: left; \n} \n\nth { \n background: var(--primary); \n color: white; \n} \n\ntr:nth-child(even) { \n background: var(--bg); \n} \n\n.primary-button { \n background: var(--accent); \n color: white; \n border: none; \n padding: 0.8rem 2rem; \n border-radius: 0.5rem; \n cursor: pointer; \n font: inherit; \n transition: transform 0.2s ease; \n} \n\n.primary-button:hover { \n transform: scale(1.05); \n} \n\n@media (max-width: 768px) { \n .vs-container { \n flex-direction: column; \n } \n .frame-container { \n width: 100%; \n } \n} \n\n---script.js--- \nconst ELO_K = 32; \nlet items = []; \nlet currentPair = []; \n\nfunction initializeRatings(urls) { \n return urls.map(url => ({ \n url: url.trim(), \n rating: 1000, \n matches: 0, \n wins: 0 \n })); \n} \n\nfunction getExpectedScore(a, b) { \n return 1 / (1 + Math.pow(10, (b - a) / 400)); \n} \n\nfunction updateRatings(winner, loser) { \n const expectedWin = getExpectedScore(winner.rating, loser.rating); \n const expectedLoss = getExpectedScore(loser.rating, winner.rating); \n\n winner.rating += ELO_K * (1 - expectedWin); \n loser.rating += ELO_K * (0 - expectedLoss); \n\n winner.matches++; \n loser.matches++; \n winner.wins++; \n} \n\nfunction getNextPair() { \n items.sort((a, b) => a.rating - b.rating); \n const mid = Math.floor(items.length / 2); \n return [itemsid], itemsid + 1] || items[0]]; \n} \n\nfunction showPair() { \n currentPair = getNextPair(); \n document.getElementById('frameA').src = currentPair[0].url; \n document.getElementById('frameB').src = currentPair[1].url; \n} \n\nfunction handleChoice(winnerIndex) { \n const [a, b] = currentPair; \n updateRatings(winnerIndex === 0 ? a : b, winnerIndex === 0 ? b : a); \n showPair(); \n updateResults(); \n} \n\nfunction updateResults() { \n const sorted = [...items].sort((a, b) => b.rating - a.rating); \n const tbody = document.querySelector('#resultsTable tbody'); \n tbody.innerHTML = sorted.map((item, i) => ` \n \n ${i + 1} \n ${item.url} \n ${Math.round(item.rating)} \n \n `).join(''); \n} \n\nfunction exportCSV() { \n const csv = items.map(item => \n `${item.url},${item.rating},${item.wins},${item.matches}` \n ).join('\\n'); \n const blob = new Blob([`URL,Rating,Wins,Matches\\n${csv}`], {type: 'text/csv'}); \n const url = URL.createObjectURL(blob); \n const a = document.createElement('a'); \n a.href = url; \n a.download = 'elo_rankings.csv'; \n a.click(); \n} \n\ndocument.getElementById('startBtn').addEventListener('click', () => { \n const urls = document.getElementById('urlInput').value.split('\\n').filter(Boolean); \n if (urls.length < 2) return alert('Please enter at least 2 URLs'); \n items = initializeRatings(urls); \n document.querySelector('.input-section').hidden = true; \n document.querySelector('.compare-section').hidden = false; \n document.querySelector('.results-section').hidden = false; \n showPair(); \n}); \n\ndocument.querySelectorAll('.choice-overlay').forEach(overlay => { \n overlay.addEventListener('click', (e) => { \n handleChoice(parseInt(e.target.dataset.choice === 'A' ? 0 : 1)); \n }); \n}); \n\ndocument.getElementById('exportBtn').addEventListener('click', exportCSV); \n\n// Initialize from localStorage \ntry { \n const saved = localStorage.getItem('eloItems'); \n if (saved) { \n items = JSON.parse(saved); \n updateResults(); \n } \n} catch {} \n\nwindow.addEventListener('beforeunload', () => { \n localStorage.setItem('eloItems', JSON.stringify(items)); \n}); \n\n---end---",
+ "reasoning_content": "Okay, I need to create a client-side only web app called EloAnything based on the user's specifications. Let me start by understanding the requirements. The main features are a textarea for URLs, side-by-side iframes for voting, rankings using ELO, and CSV export. It should be beautiful, responsive, and use only HTML, CSS, and JS without any frameworks.\n\nFirst, the domain name. The user wants something ending in scroll.pub. Maybe \"elo.scroll.pub\"? That's short and memorable.\n\nNext, the structure. The HTML needs a textarea input, a compare section with two iframes, and a results section. Using Scroll syntax, I'll structure the particles with proper indentation. The initial state shows the input, then the comparison, and finally the results.\n\nFor the ELO algorithm, each URL starts with a rating of 1000. When a user selects a winner, their ratings update based on the standard ELO calculation. I'll need functions to calculate expected outcome and update ratings. Also, the pairing selection should prioritize items with closer ratings to make matches more meaningful.\n\nThe UI should be engaging. Using CSS gradients and animations can make it dazzling. Maybe a gradient background for the hero section, smooth transitions for buttons, and a clean grid layout for results. Mobile responsiveness is key, so media queries will adjust the iframes to stack vertically on smaller screens.\n\nAccessibility is important. Semantic HTML elements like header, main, sections, and proper ARIA labels. The buttons should have hover and focus states. The CSV export can be a button that triggers a download via data URI.\n\nJavaScript will handle the state: storing URLs, their ELO ratings, managing the current pair, and handling clicks. LocalStorage can persist the data between sessions. The iframes need to load the URLs, but I should handle errors if the URLs are invalid.\n\nTesting edge cases: empty input, duplicate URLs, odd number of items. The ELO algorithm should handle all cases, and the interface should gracefully show results once enough comparisons are done.\n\nPutting it all together: The index.scroll defines the structure, style.css adds the visual flair with modern CSS features, and script.js manages the logic and interactions. Making sure all elements are styled professionally, with attention to spacing, typography, and color contrast.\n\nFinally, ensuring no external resources, all links are relative, and the footer doesn't have copyright symbols. The code should be clean, commented where necessary, and follow best practices for performance."
+ },
+ "logprobs": null,
+ "finish_reason": "stop"
+ }
+ ],
+ "usage": {
+ "prompt_tokens": 922,
+ "completion_tokens": 2797,
+ "total_tokens": 3719,
+ "prompt_tokens_details": {
+ "cached_tokens": 896
+ },
+ "completion_tokens_details": {
+ "reasoning_tokens": 512
+ },
+ "prompt_cache_hit_tokens": 896,
+ "prompt_cache_miss_tokens": 26
+ },
+ "system_fingerprint": "fp_5417b77867_prod0425fp8"
+ }
readme.scroll
Changed around line 1
+ # error1.scroll.pub
+
+ Prompt: website
+ Agent: deepseekreasoner
+ Model: deepseek-reasoner
+
+ ## User prompt
+ Create a simple clientside only web app called EloAnything. It gives you a textarea to paste in a plain text list of urls, one per line. Then it shows you side by side iframes and you click on which one you prefer. Then it shows you the rankings and score of each url (which you can easily save as csv). So you should use a standard elo algo for determinining which pairings to show. Make it beautiful and fun to use.
+
+ ## System prompt
+ You are an expert web developer. Create a website based on this request: "Create a simple clientside only web app called EloAnything. It gives you a textarea to paste in a plain text list of urls, one per line. Then it shows you side by side iframes and you click on which one you prefer. Then it shows you the rankings and score of each url (which you can easily save as csv). So you should use a standard elo algo for determinining which pairings to show. Make it beautiful and fun to use."
+
+ Requirements:
+ - Use only Scroll, CSS, and JavaScript (NO frameworks, NO external dependencies)
+ - Create clean, semantic HTML5
+ - Make it mobile-responsive
+ - Follow modern best practices and accessibility guidelines
+ - Keep it simple but professional
+ - Use only relative links and no external resources
+ - Do not put a copyright symbol or all rights reserved in the footer.
+ - Make it beautiful. Dazzling. Advanced used of CSS.
+
+ As a refresher, for doing the html body, Scroll is a whitespace based language that uses a single indented space to mark a line (aka particle) as a subparticle of a parent line.
+
+ For example:
+
+ header
+ class hero
+ nav
+ div Scroll
+ class logo
+ div
+ class nav-links
+ a Features
+ href #features
+ a Examples
+ href #examples
+ a Edit
+ href edit.html
+ a GitHub
+ class cta-button
+ href https://github.com/breck7/scroll
+ div
+ class hero-content
+ h1 Write Better with Scroll
+ p The extendible markup language that makes source beautiful and compiles to anything
+ a Get Started
+ class primary-button
+ href https://hub.scroll.pub/
+ main
+ section
+ id features
+ class features
+ h2 Why Scroll?
+ div
+ class feature-grid
+ div
+ class feature-card
+ div ⚡
+ class feature-icon
+ h3 Simple Syntax
+ p Like Markdown, but more powerful. No parentheses needed.
+ div
+ class feature-card
+ div 🧩
+ class feature-icon
+ h3 Extendible
+ p Build your own custom parsers.
+ div
+ class feature-card
+ div 🎨
+ class feature-icon
+ h3 Beautiful Output
+ p Create stunning documents with minimal effort.
+ div
+ class feature-card
+ div 🚀
+ class feature-icon
+ h3 Fast & Light
+ p Built on the efficient PPS Stack.
+ section
+ id examples
+ class code-demo
+ h2 See It In Action
+ div
+ class code-container
+ pre
+ class code-example
+ div
+ class code-output
+ footer
+ div
+ class footer-content
+ div
+ class footer-links
+ a Documentation
+ href https://scroll.pub/tutorial.html
+ a Community
+ href https://www.reddit.com/r/WorldWideScroll/
+ a Blog
+ href https://scroll.pub/blog
+ p Started by Breck Yunits. Evolved by a community.
+ https://twitter.com/breckyunits Breck Yunits
+ https://github.com/breck7/scroll/graphs/contributors community
+
+
+ First suggest a short, memorable domain name ending in scroll.pub that represents this website. Then provide the website files. Use this exact format:
+
+ ---domain---
+ (domainscroll.pub here)
+ ---index.scroll---
+ buildHtml
+ baseUrl https://(domainscroll.pub here)
+ metaTags
+ editButton /edit.html
+ title (Title here)
+ style.css
+
+ (body content here. no blank lines please.)
+
+ script.js
+ ---style.css---
+ (CSS content here)
+ ---script.js---
+ (JavaScript content here)
+ ---end---