feat: moonshot v2 profile redesign
This commit is contained in:
commit
c7b0d4ff3b
11 changed files with 692 additions and 191 deletions
BIN
.DS_Store
vendored
BIN
.DS_Store
vendored
Binary file not shown.
62
.github/workflows/demon.yml
vendored
Normal file
62
.github/workflows/demon.yml
vendored
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
name: Maxwell's Demon
|
||||
|
||||
on:
|
||||
issues:
|
||||
types: [opened]
|
||||
|
||||
concurrency:
|
||||
group: demon-state
|
||||
cancel-in-progress: false
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
issues: write
|
||||
|
||||
jobs:
|
||||
sort:
|
||||
if: "startsWith(github.event.issue.title, 'demon: sort 12 bits')"
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Sort 12 bits into the lattice
|
||||
run: |
|
||||
python3 - <<'EOF'
|
||||
import datetime
|
||||
import json
|
||||
|
||||
path = "state/demon.json"
|
||||
with open(path) as fh:
|
||||
state = json.load(fh)
|
||||
state["bits_sorted"] += 12
|
||||
state["generation"] += 1
|
||||
state["demons"] += 1
|
||||
state["last_sorted_at"] = datetime.datetime.now(
|
||||
datetime.timezone.utc
|
||||
).isoformat(timespec="seconds")
|
||||
with open(path, "w") as fh:
|
||||
json.dump(state, fh, indent=2)
|
||||
fh.write("\n")
|
||||
EOF
|
||||
python3 engine/generate_entropy_svg.py
|
||||
|
||||
- name: Commit lowered entropy
|
||||
env:
|
||||
AUTHOR: ${{ github.event.issue.user.login }}
|
||||
run: |
|
||||
git config user.name "github-actions[bot]"
|
||||
git config user.email "41898470+github-actions[bot]@users.noreply.github.com"
|
||||
git add state/demon.json assets/entropy.svg
|
||||
git commit -m "chore: demon sorted 12 bits (S lowered by @${AUTHOR})"
|
||||
git pull --rebase origin "${GITHUB_REF_NAME}"
|
||||
git push
|
||||
|
||||
- name: Thank the demon and close the gate
|
||||
env:
|
||||
GH_TOKEN: ${{ github.token }}
|
||||
ISSUE: ${{ github.event.issue.number }}
|
||||
run: |
|
||||
gh issue comment "$ISSUE" --repo "$GITHUB_REPOSITORY" --body \
|
||||
"12 bits sorted. Entropy of this README decreased by 34.4 zJ (12 × kT ln 2 at 300 K). The second law remains statistical. Thank you, demon."
|
||||
gh issue edit "$ISSUE" --repo "$GITHUB_REPOSITORY" --add-label demon
|
||||
gh issue close "$ISSUE" --repo "$GITHUB_REPOSITORY"
|
||||
37
.github/workflows/nightly.yml
vendored
Normal file
37
.github/workflows/nightly.yml
vendored
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
name: Nightly Telemetry
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: "17 6 * * *"
|
||||
workflow_dispatch:
|
||||
|
||||
concurrency:
|
||||
group: demon-state
|
||||
cancel-in-progress: false
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
jobs:
|
||||
refresh:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Refresh feed, stats, featured cards, entropy field
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ github.token }}
|
||||
run: python3 engine/nightly.py
|
||||
|
||||
- name: Commit if changed
|
||||
run: |
|
||||
if git diff --quiet; then
|
||||
echo "no changes"
|
||||
exit 0
|
||||
fi
|
||||
git config user.name "github-actions[bot]"
|
||||
git config user.email "41898470+github-actions[bot]@users.noreply.github.com"
|
||||
git add README.md state/demon.json assets/entropy.svg
|
||||
git commit -m "chore: nightly telemetry refresh"
|
||||
git pull --rebase origin "${GITHUB_REF_NAME}"
|
||||
git push
|
||||
12
.github/workflows/snake.yml
vendored
12
.github/workflows/snake.yml
vendored
|
|
@ -4,19 +4,15 @@ on:
|
|||
schedule:
|
||||
# Runs every 12 hours
|
||||
- cron: "0 */12 * * *"
|
||||
|
||||
|
||||
workflow_dispatch:
|
||||
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
|
||||
jobs:
|
||||
generate:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
|
||||
steps:
|
||||
- name: Generate Snake
|
||||
uses: Platane/snk/svg-only@v3
|
||||
|
|
@ -25,11 +21,11 @@ jobs:
|
|||
outputs: |
|
||||
dist/github-contribution-grid-snake.svg
|
||||
dist/github-contribution-grid-snake-dark.svg?palette=github-dark
|
||||
|
||||
|
||||
- name: Push to output branch
|
||||
uses: crazy-max/ghaction-github-pages@v4
|
||||
with:
|
||||
target_branch: output
|
||||
build_dir: dist
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
|
|
|||
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
|||
.DS_Store
|
||||
32
CLAUDE.md
32
CLAUDE.md
|
|
@ -4,23 +4,33 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
|
|||
|
||||
## Repository Overview
|
||||
|
||||
This is a GitHub profile repository containing only a README.md file that displays on the @developtheweb GitHub profile page. There is no source code, build configuration, or tests in this repository.
|
||||
This is the GitHub profile repository for @developtheweb. Its README renders on the profile page and is a live system, not a static page: an animated entropy-reversal SVG whose state is lowered by visitors ("Maxwell's demon"), plus nightly-refreshed telemetry. Do not reintroduce third-party rendering services (capsule-render, readme-typing-svg, komarev, vercel stats/quotes apps) — everything renders from this repo, GitHub, or stevenmilanese.com assets.
|
||||
|
||||
## Repository Structure
|
||||
## Architecture
|
||||
|
||||
```
|
||||
/home/aurelius/git/developtheweb/
|
||||
└── README.md
|
||||
README.md profile page; contains marker-fenced generated sections
|
||||
engine/generate_entropy_svg.py SMIL-animated assets/entropy.svg from state/demon.json (stdlib only)
|
||||
engine/nightly.py refreshes README marker sections + bumps entropy generation (stdlib only)
|
||||
state/demon.json bits_sorted / generation / demons / last_sorted_at
|
||||
assets/entropy.svg generated — never hand-edit; regenerate via the engine
|
||||
.github/workflows/demon.yml issues:opened, title "demon: sort 12 bits" → +12 bits, regen SVG, commit, comment, close
|
||||
.github/workflows/nightly.yml cron 17 6 * * * → engine/nightly.py, commit if changed
|
||||
.github/workflows/snake.yml cron every 12h → contribution snake SVGs on the `output` branch
|
||||
```
|
||||
|
||||
## Working with this Repository
|
||||
## README marker sections (machine-written — edit the generators, not the sections)
|
||||
|
||||
Since this is a profile repository with only a README.md file:
|
||||
- `<!-- FEED:START/END -->` — 4 newest Strange Quarks articles (RSS `/feed.xml` if populated, else parsed from https://stevenmilanese.com/blog HTML)
|
||||
- `<!-- STATS:START/END -->` — telemetry row with live star/repo totals
|
||||
- `<!-- FEATURED:START/END -->` — featured cards (anthropic-certs, slTrain, meowchi-releases, mpl) with live star counts
|
||||
|
||||
- Any changes should maintain the professional formatting and structure of the profile README
|
||||
- The README uses GitHub-flavored markdown with centered content, badges, and images
|
||||
- External image assets are referenced from `https://github.com/developtheweb/stevenmilanese-com/blob/main/public/`
|
||||
`engine/nightly.py` is fail-safe per section: on fetch/parse failure it leaves that section untouched and exits 0.
|
||||
|
||||
## Note
|
||||
## Conventions
|
||||
|
||||
This is not a development project - it's a GitHub profile repository used for personal branding and showcasing work. There are no build commands, tests, or development workflows associated with this repository.
|
||||
- Conventional commit messages (`feat:`, `fix:`, `chore:`, `ci:`). No attribution footers of any kind.
|
||||
- Contact is `rev@moonfactory.dev` only — the old Telegram link and the old level-host email address are retired and must not reappear.
|
||||
- Entropy formula: `S = max(12.7, 100 − 0.0002·bits_sorted)`; 12 bits per demon click = 34.4 zJ (12 × kT ln 2 at 300 K).
|
||||
- SVG regeneration is deterministic for a given `generation` — diffs stay reviewable.
|
||||
- Test locally with `python3 engine/generate_entropy_svg.py` and `GITHUB_TOKEN=$(gh auth token) python3 engine/nightly.py` (both stdlib-only; no pip installs).
|
||||
|
|
|
|||
277
README.md
277
README.md
|
|
@ -1,191 +1,120 @@
|
|||
<div align="center">
|
||||
|
||||
<!-- Animated Wave -->
|
||||
<img src="https://capsule-render.vercel.app/api?type=waving&color=gradient&customColorList=14,15,16,17,18,19&height=100§ion=header&fontSize=0" width="100%" />
|
||||
# Reversing the irreversible
|
||||
|
||||
<!-- Logo with Animation -->
|
||||
<img src="https://stevenmilanese.com/StevenMilanese-full-logo.png" alt="Steven Milanese" width="400"/>
|
||||
*Rev. Steven Milanese — the second law is statistical, not sacred. The demon pays its bills in bits.*
|
||||
|
||||
<!-- Animated Typing Header -->
|
||||
[](https://git.io/typing-svg)
|
||||
|
||||
<!-- Profile Views Counter -->
|
||||
<br>
|
||||
<img src="https://komarev.com/ghpvc/?username=developtheweb&color=0891b2&style=for-the-badge&label=PROFILE+VIEWS" alt="Profile Views"/>
|
||||
|
||||
<!-- Social Badges with Custom Colors -->
|
||||
<br><br>
|
||||
[](https://stevenmilanese.com)
|
||||
[](https://www.linkedin.com/in/stevenmilanese/)
|
||||
[](https://stevenmilanese.com/strange-quarks)
|
||||
<br>
|
||||
[](https://x.com/developtheweb)
|
||||
[](https://t.me/CodeAndVerse)
|
||||
[](mailto:dev@level.host)
|
||||
<br>
|
||||
[](https://orcid.org/0009-0008-0442-208X)
|
||||
[](https://osf.io/3tsd4/)
|
||||
</div>
|
||||
|
||||
<!-- Animated Banner -->
|
||||
<div align="center">
|
||||
<img src="https://stevenmilanese.com/StevenMilanese-hero-stars.webp" alt="Hero Banner" width="100%"/>
|
||||
<img src="assets/entropy.svg" width="100%" alt="Entropy-reversal field: particles converging from chaos into a (2,5) torus-knot lattice"/>
|
||||
|
||||
[⚡ Be the demon — sort 12 bits](https://github.com/developtheweb/developtheweb/issues/new?title=demon%3A+sort+12+bits&body=One+tap.+Submit+to+sort.)
|
||||
|
||||
<sub>Each click opens a one-tap issue; an Action sorts the field, recommits the SVG, closes the issue. This README's state is community-lowered entropy.</sub>
|
||||
</div>
|
||||
|
||||
<!-- Quote Section -->
|
||||
<div align="center">
|
||||
<br>
|
||||
<img src="https://quotes-github-readme.vercel.app/api?type=horizontal&theme=tokyonight"e=Transforming%20complexity%20into%20elegance%2C%20one%20algorithm%20at%20a%20time.&author=Steven%20Milanese" alt="Quote"/>
|
||||
<br>
|
||||
</div>
|
||||
## About the Reverend
|
||||
|
||||
## 🎯 About Me
|
||||
|
||||
```python
|
||||
class StevenMilanese:
|
||||
def __init__(self):
|
||||
self.title = "Autodidactic Polymath | Systems Alchemist"
|
||||
self.location = "🌍 Earth"
|
||||
self.os = "Arch Linux BTW 🐧"
|
||||
self.current_focus = ["AI Architecture", "Quantum Computing", "WebGL", "Spiritual Tech"]
|
||||
self.philosophy = "Bridge technical excellence with human experience"
|
||||
|
||||
def transform_challenges(self, problem):
|
||||
return f"✨ Inspired solution for {problem}"
|
||||
```
|
||||
Reverend ≔ Physicist ⊗ Minister ⊗ Systems_Alchemist
|
||||
domain : ℝ³·¹ ⊗ CY₃(χ = ±6)
|
||||
axiom : complexity ⟼ elegance
|
||||
method : ∀ p ∈ Inconceivable — solve(p) ∨ pose(better_p)
|
||||
runtime : Arch Linux, btw
|
||||
```
|
||||
|
||||
I transform complex challenges into inspired technological solutions. By seamlessly integrating Artificial Intelligence with cutting-edge development practices, I create systems that push the boundaries of what's possible. My expertise spans multiple domains including theoretical physics, mathematics, AI systems architecture, and spiritual technology.
|
||||
*Written in MPL — the author's own language. Ordained minister, autodidactic polymath, natural philosopher. The ministry and the physics are the same inquiry conducted at different energy scales.*
|
||||
|
||||
## 🚀 Tech Arsenal
|
||||
## The mission — goals inconceivable by design
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td width="50%" valign="top">
|
||||
|
||||
**Reverse the irreversible**
|
||||
|
||||
Maxwell's demon on GitHub's own infrastructure, funded in Landauer's currency. *(running above)*
|
||||
|
||||
</td>
|
||||
<td width="50%" valign="top">
|
||||
|
||||
**Derive the three generations**
|
||||
|
||||
Calabi–Yau compactifications, χ = ±6. [ORCID](https://orcid.org/0009-0008-0442-208X) · [OSF](https://osf.io/3tsd4/) · [companion essays](https://stevenmilanese.com/blog/tag/calabi-yau-manifolds)
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="50%" valign="top">
|
||||
|
||||
**Cognitive universality**
|
||||
|
||||
[MPL](https://github.com/developtheweb/mpl): if you can write the equation, you can run it.
|
||||
|
||||
</td>
|
||||
<td width="50%" valign="top">
|
||||
|
||||
**Planetary intelligence**
|
||||
|
||||
Earth as information processor, argued in full on [Strange Quarks](https://stevenmilanese.com/blog/planetary-intelligence-earth-as-information-processor).
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<!-- STATS:START -->
|
||||
<div align="center">
|
||||
|
||||
### Languages & Frameworks
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Operating System & Environment
|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
### Tools & Technologies
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
`10¹⁰⁶ yr until heat death — the deadline` · `2.9 zJ of order per bit sorted (kT ln 2, 300 K)` · `★ 27 stars across 14 public repos`
|
||||
|
||||
</div>
|
||||
<!-- STATS:END -->
|
||||
|
||||
## 📊 GitHub Analytics
|
||||
## Beneath the physics — the verified inventory
|
||||
|
||||
<!-- FEATURED:START -->
|
||||
<div align="center">
|
||||
<img width="49%" height="195px" src="https://github-readme-stats.vercel.app/api?username=developtheweb&show_icons=true&count_private=true&hide_border=true&title_color=06B6D4&icon_color=06B6D4&text_color=c9d1d9&bg_color=0d1117" alt="Steven Milanese github stats" />
|
||||
<img width="41%" height="195px" src="https://github-readme-stats.vercel.app/api/top-langs/?username=developtheweb&layout=compact&hide_border=true&title_color=06B6D4&text_color=c9d1d9&bg_color=0d1117" />
|
||||
<table>
|
||||
<tr>
|
||||
<td width="50%" valign="top">
|
||||
<h3 align="center"><a href="https://github.com/developtheweb/anthropic-certs">anthropic-certs</a></h3>
|
||||
<p align="center"><code>★ 11</code></p>
|
||||
<p align="center">Verified Anthropic certifications — Claude, API, Claude Code CLI, MCP.</p>
|
||||
</td>
|
||||
<td width="50%" valign="top">
|
||||
<h3 align="center"><a href="https://github.com/developtheweb/slTrain">slTrain</a></h3>
|
||||
<p align="center"><code>★ 4</code></p>
|
||||
<p align="center">A steam locomotive for your terminal, smoke trail included.</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="50%" valign="top">
|
||||
<h3 align="center"><a href="https://github.com/developtheweb/meowchi-releases">meowchi-releases</a></h3>
|
||||
<p align="center"><code>★ 4</code></p>
|
||||
<p align="center">A desktop pet that evolves when you actually get work done.</p>
|
||||
</td>
|
||||
<td width="50%" valign="top">
|
||||
<h3 align="center"><a href="https://github.com/developtheweb/mpl">mpl</a></h3>
|
||||
<p align="center"><code>★ 2</code></p>
|
||||
<p align="center">Mathematics Programming Language — write the equation, run the equation.</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<!-- FEATURED:END -->
|
||||
|
||||
<div align="center">
|
||||
<img src="https://github-readme-activity-graph.vercel.app/graph?username=developtheweb&custom_title=Contribution%20Graph&bg_color=0d1117&color=06B6D4&line=06B6D4&point=06B6D4&area_color=1a1b27&title_color=06B6D4&area=true" alt="Steven Milanese's Activity Graph" width="100%"/>
|
||||
</div>
|
||||
## Latest from Strange Quarks
|
||||
|
||||
## 🎨 Featured Projects
|
||||
<!-- FEED:START -->
|
||||
| Article | |
|
||||
|:---|---:|
|
||||
| [Mathematical Programming Language: A Vision for Cognitive Universality Through Unicode-Based Syntax](https://stevenmilanese.com/blog/mathematical-programming-language-a-vision-for-cognitive-universality-through-unicode-based-syntax) | Jul 28, 2025 · 17 min read |
|
||||
| [The Ultimate Easter Egg Hunt: An Online Odyssey for the Brilliant Minds](https://stevenmilanese.com/blog/gunter) | Jul 21, 2025 · 45 min read |
|
||||
| [The Architect of Acquiescence](https://stevenmilanese.com/blog/the-architect-of-acquiescence) | Jun 25, 2025 · 11 min read |
|
||||
| [Planetary Intelligence: Earth as Information Processor](https://stevenmilanese.com/blog/planetary-intelligence-earth-as-information-processor) | Jun 18, 2025 · 49 min read |
|
||||
<!-- FEED:END -->
|
||||
|
||||
<div align="center">
|
||||
<table>
|
||||
<tr>
|
||||
<td width="50%">
|
||||
<h3 align="center">stevenmilanese.com</h3>
|
||||
<div align="center">
|
||||
<a href="https://stevenmilanese.com" target="_blank"><img src="https://stevenmilanese.com/projects/calabi-yau.webp" width="100%" alt="Portfolio"/></a>
|
||||
<br><br>
|
||||
<p><strong>Immersive Portfolio Experience</strong></p>
|
||||
<p>Three.js visualizations • Server-side rendering • Headless CMS</p>
|
||||
<p>
|
||||
<a href="https://stevenmilanese.com" target="_blank"><img src="https://img.shields.io/badge/Visit-Live_Site-06B6D4?style=for-the-badge&logo=vercel&logoColor=white" alt="Visit Live Site"/></a>
|
||||
</p>
|
||||
</div>
|
||||
</td>
|
||||
<td width="50%">
|
||||
<h3 align="center">Emergence Intelligence</h3>
|
||||
<div align="center">
|
||||
<a href="https://stevenmilanese.com/#projects" target="_blank"><img src="https://stevenmilanese.com/projects/emergence-intelligence.webp" width="100%" alt="Emergence Intelligence"/></a>
|
||||
<br><br>
|
||||
<p><strong>Advanced AI System</strong></p>
|
||||
<p>Cognitive architecture • Semantic processing • Episodic memory</p>
|
||||
<p>
|
||||
<a href="https://stevenmilanese.com/#projects" target="_blank"><img src="https://img.shields.io/badge/Learn-More-14B8A6?style=for-the-badge&logo=openai&logoColor=white" alt="Learn More"/></a>
|
||||
</p>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
## 📚 Latest Articles
|
||||
|
||||
<div align="center">
|
||||
|
||||
| 📝 Article | 🏷️ Topics |
|
||||
|:---|:---|
|
||||
| [The Intersection of Physics and AI](https://stevenmilanese.com/strange-quarks) | `Quantum Computing` `Machine Learning` `Physics` |
|
||||
| [Building Resilient Distributed Systems](https://stevenmilanese.com/strange-quarks) | `Architecture` `Scalability` `DevOps` |
|
||||
| [WebGL Performance Optimization Techniques](https://stevenmilanese.com/strange-quarks) | `WebGL` `Three.js` `Performance` |
|
||||
| [Quantum Computing: Practical Applications](https://stevenmilanese.com/strange-quarks) | `Quantum` `Algorithms` `Future Tech` |
|
||||
|
||||
</div>
|
||||
|
||||
## 🔭 Current Focus
|
||||
|
||||
<div align="center">
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
A[Advanced 3D Visualizations] --> B{Current Projects}
|
||||
C[Serverless Architecture] --> B
|
||||
D[Quantum Computing + AI] --> B
|
||||
E[Spiritual Technology] --> B
|
||||
B --> F[🚀 Innovation]
|
||||
```
|
||||
|
||||
</div>
|
||||
|
||||
## 🏆 Achievements & Certifications
|
||||
|
||||
<div align="center">
|
||||
<img src="https://img.shields.io/badge/Physics-Research_Publications-FF6B6B?style=for-the-badge"/>
|
||||
<img src="https://img.shields.io/badge/AI/ML-Advanced_Practitioner-4ECDC4?style=for-the-badge"/>
|
||||
<img src="https://img.shields.io/badge/Architecture-Systems_Design-95E1D3?style=for-the-badge"/>
|
||||
<img src="https://img.shields.io/badge/Leadership-Technical_Strategy-F38181?style=for-the-badge"/>
|
||||
<br>
|
||||
<img src="https://img.shields.io/badge/🐧_Arch_Linux-Full_Time_BTW-1793D1?style=for-the-badge"/>
|
||||
<img src="https://img.shields.io/badge/pacman-Package_Manager-1793D1?style=for-the-badge"/>
|
||||
<img src="https://img.shields.io/badge/AUR-Helper_yay-1793D1?style=for-the-badge"/>
|
||||
</div>
|
||||
|
||||
|
||||
## 💫 Connect & Collaborate
|
||||
|
||||
<div align="center">
|
||||
<img src="https://readme-typing-svg.demolab.com?font=Fira+Code&size=22&duration=3000&pause=1000&color=06B6D4¢er=true&vCenter=true&width=435&lines=Let's+build+something+amazing!;Open+to+collaborations;Reach+out+anytime!" alt="Typing SVG" />
|
||||
|
||||
<br><br>
|
||||
|
||||
[](https://stevenmilanese.com)
|
||||
[](https://www.linkedin.com/in/stevenmilanese/)
|
||||
[](mailto:dev@level.host)
|
||||
[](https://stevenmilanese.com/strange-quarks)
|
||||
</div>
|
||||
|
||||
<!-- Snake Animation -->
|
||||
<div align="center">
|
||||
<br>
|
||||
<picture>
|
||||
|
|
@ -197,13 +126,17 @@ graph LR
|
|||
|
||||
---
|
||||
|
||||
<div align="center">
|
||||
<img src="https://stevenmilanese.com/StevenMilanese-ghost-logo.png" alt="Steven Milanese Logo" width="80"/>
|
||||
<br>
|
||||
<img src="https://readme-typing-svg.demolab.com?font=Fira+Code&size=14&duration=3000&pause=1000&color=718096¢er=true&vCenter=true&width=435&lines=Systems+Alchemist;Transforming+Complexity+into+Elegance" alt="Typing SVG" />
|
||||
<br>
|
||||
<sub>⚡ Powered by curiosity, driven by innovation</sub>
|
||||
</div>
|
||||
<table width="100%">
|
||||
<tr>
|
||||
<td align="left">
|
||||
|
||||
<!-- Wave Footer -->
|
||||
<img src="https://capsule-render.vercel.app/api?type=waving&color=gradient&customColorList=14,15,16,17,18,19&height=80§ion=footer&fontSize=0" width="100%" />
|
||||
*Founder, [MoonFactory](https://moonfactory.dev) — development and consulting.*
|
||||
|
||||
</td>
|
||||
<td align="right">
|
||||
|
||||
[stevenmilanese.com](https://stevenmilanese.com) · [Strange Quarks](https://stevenmilanese.com/blog) · [X](https://x.com/developtheweb) · [LinkedIn](https://www.linkedin.com/in/stevenmilanese/) · [ORCID](https://orcid.org/0009-0008-0442-208X) · [OSF](https://osf.io/3tsd4/) · [rev@moonfactory.dev](mailto:rev@moonfactory.dev)
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
|
|||
126
assets/entropy.svg
Normal file
126
assets/entropy.svg
Normal file
|
|
@ -0,0 +1,126 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="880" height="260" viewBox="0 0 880 260" role="img" aria-label="Entropy-reversal field: S = 100.0 k-bits">
|
||||
<rect x="0.5" y="0.5" width="879" height="259" rx="8" fill="#010409" stroke="#21262d"/>
|
||||
<circle r="3" fill="#4dd4e8" cx="379.1" cy="69.0"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="379.1;612.1;612.1;379.1"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="69.0;130.0;130.0;69.0"/></circle>
|
||||
<circle r="3" fill="#1d6f7d" cx="49.8" cy="208.5"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="49.8;609.3;609.3;49.8"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="208.5;141.8;141.8;208.5"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="246.0" cy="44.2"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="246.0;601.4;601.4;246.0"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="44.2;152.7;152.7;44.2"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="350.5" cy="92.0"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="350.5;588.9;588.9;350.5"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="92.0;162.2;162.2;92.0"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="240.5" cy="46.6"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="240.5;572.9;572.9;240.5"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="46.6;169.7;169.7;46.6"/></circle>
|
||||
<circle r="3" fill="#1d6f7d" cx="791.9" cy="224.7"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="791.9;554.8;554.8;791.9"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="224.7;175.0;175.0;224.7"/></circle>
|
||||
<circle r="3" fill="#1d6f7d" cx="267.5" cy="234.6"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="267.5;535.8;535.8;267.5"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="234.6;178.1;178.1;234.6"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="262.3" cy="161.5"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="262.3;517.3;517.3;262.3"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="161.5;179.3;179.3;161.5"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="682.3" cy="164.4"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="682.3;500.2;500.2;682.3"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="164.4;179.1;179.1;164.4"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="847.4" cy="120.8"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="847.4;485.4;485.4;847.4"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="120.8;178.1;178.1;120.8"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="647.7" cy="235.9"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="647.7;472.9;472.9;647.7"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="235.9;177.2;177.2;235.9"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="303.3" cy="217.0"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="303.3;462.6;462.6;303.3"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="217.0;176.9;176.9;217.0"/></circle>
|
||||
<circle r="3" fill="#1d6f7d" cx="445.8" cy="230.2"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="445.8;454.0;454.0;445.8"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="230.2;177.8;177.8;230.2"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="333.3" cy="148.9"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="333.3;446.2;446.2;333.3"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="148.9;180.2;180.2;148.9"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="650.0" cy="60.2"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="650.0;438.1;438.1;650.0"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="60.2;184.2;184.2;60.2"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="187.8" cy="136.4"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="187.8;429.0;429.0;187.8"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="136.4;189.5;189.5;136.4"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="490.5" cy="170.3"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="490.5;417.8;417.8;490.5"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="170.3;195.7;195.7;170.3"/></circle>
|
||||
<circle r="3" fill="#1d6f7d" cx="248.8" cy="70.2"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="248.8;404.3;404.3;248.8"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="70.2;202.1;202.1;70.2"/></circle>
|
||||
<circle r="3" fill="#1d6f7d" cx="231.6" cy="129.5"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="231.6;388.2;388.2;231.6"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="129.5;207.9;207.9;129.5"/></circle>
|
||||
<circle r="3" fill="#1d6f7d" cx="80.8" cy="34.3"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="80.8;369.9;369.9;80.8"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="34.3;212.3;212.3;34.3"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="321.3" cy="111.0"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="321.3;350.2;350.2;321.3"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="111.0;214.6;214.6;111.0"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="793.1" cy="219.2"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="793.1;330.1;330.1;793.1"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="219.2;214.4;214.4;219.2"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="396.6" cy="115.6"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="396.6;311.0;311.0;396.6"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="115.6;211.2;211.2;115.6"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="816.9" cy="102.0"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="816.9;294.2;294.2;816.9"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="102.0;205.2;205.2;102.0"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="576.8" cy="84.5"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="576.8;280.8;280.8;576.8"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="84.5;196.7;196.7;84.5"/></circle>
|
||||
<circle r="3" fill="#1d6f7d" cx="423.4" cy="164.0"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="423.4;271.9;271.9;423.4"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="164.0;186.2;186.2;164.0"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="225.7" cy="92.4"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="225.7;267.9;267.9;225.7"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="92.4;174.5;174.5;92.4"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="364.2" cy="130.5"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="364.2;269.0;269.0;364.2"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="130.5;162.2;162.2;130.5"/></circle>
|
||||
<circle r="3" fill="#1d6f7d" cx="528.0" cy="229.3"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="528.0;274.8;274.8;528.0"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="229.3;150.3;150.3;229.3"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="614.1" cy="215.8"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="614.1;284.5;284.5;614.1"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="215.8;139.4;139.4;215.8"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="104.2" cy="238.0"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="104.2;296.9;296.9;104.2"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="238.0;130.0;130.0;238.0"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="322.8" cy="238.5"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="322.8;310.8;310.8;322.8"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="238.5;122.3;122.3;238.5"/></circle>
|
||||
<circle r="3" fill="#1d6f7d" cx="110.0" cy="176.0"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="110.0;324.8;324.8;110.0"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="176.0;116.3;116.3;176.0"/></circle>
|
||||
<circle r="3" fill="#1d6f7d" cx="858.3" cy="169.7"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="858.3;337.7;337.7;858.3"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="169.7;111.6;111.6;169.7"/></circle>
|
||||
<circle r="3" fill="#1d6f7d" cx="789.4" cy="210.9"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="789.4;348.7;348.7;789.4"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="210.9;107.8;107.8;210.9"/></circle>
|
||||
<circle r="3" fill="#1d6f7d" cx="153.7" cy="176.2"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="153.7;357.3;357.3;153.7"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="176.2;104.4;104.4;176.2"/></circle>
|
||||
<circle r="3" fill="#1d6f7d" cx="509.5" cy="81.9"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="509.5;363.4;363.4;509.5"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="81.9;100.5;100.5;81.9"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="706.8" cy="135.9"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="706.8;367.5;367.5;706.8"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="135.9;95.7;95.7;135.9"/></circle>
|
||||
<circle r="3" fill="#1d6f7d" cx="148.3" cy="215.1"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="148.3;370.2;370.2;148.3"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="215.1;89.5;89.5;215.1"/></circle>
|
||||
<circle r="3" fill="#1d6f7d" cx="364.3" cy="83.2"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="364.3;372.6;372.6;364.3"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="83.2;81.9;81.9;83.2"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="248.7" cy="187.2"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="248.7;375.7;375.7;248.7"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="187.2;72.8;72.8;187.2"/></circle>
|
||||
<circle r="3" fill="#1d6f7d" cx="280.4" cy="153.5"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="280.4;380.6;380.6;280.4"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="153.5;62.7;62.7;153.5"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="289.1" cy="58.4"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="289.1;388.2;388.2;289.1"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="58.4;52.1;52.1;58.4"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="804.8" cy="100.1"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="804.8;398.8;398.8;804.8"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="100.1;41.9;41.9;100.1"/></circle>
|
||||
<circle r="3" fill="#1d6f7d" cx="221.2" cy="28.9"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="221.2;412.5;412.5;221.2"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="28.9;32.8;32.8;28.9"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="741.3" cy="212.5"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="741.3;429.0;429.0;741.3"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="212.5;25.7;25.7;212.5"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="638.5" cy="202.9"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="638.5;447.4;447.4;638.5"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="202.9;21.3;21.3;202.9"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="249.0" cy="56.8"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="249.0;466.7;466.7;249.0"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="56.8;20.0;20.0;56.8"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="63.4" cy="126.3"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="63.4;485.5;485.5;63.4"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="126.3;22.0;22.0;126.3"/></circle>
|
||||
<circle r="3" fill="#1d6f7d" cx="463.0" cy="222.2"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="463.0;502.7;502.7;463.0"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="222.2;27.3;27.3;222.2"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="239.2" cy="200.3"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="239.2;517.1;517.1;239.2"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="200.3;35.3;35.3;200.3"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="705.8" cy="177.7"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="705.8;527.8;527.8;705.8"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="177.7;45.6;45.6;177.7"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="818.9" cy="42.0"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="818.9;534.4;534.4;818.9"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="42.0;57.4;57.4;42.0"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="123.3" cy="34.0"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="123.3;536.9;536.9;123.3"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="34.0;69.7;69.7;34.0"/></circle>
|
||||
<circle r="3" fill="#1d6f7d" cx="236.1" cy="162.4"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="236.1;535.8;535.8;236.1"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="162.4;81.9;81.9;162.4"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="89.8" cy="104.2"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="89.8;531.9;531.9;89.8"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="104.2;93.2;93.2;104.2"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="37.3" cy="238.7"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="37.3;526.3;526.3;37.3"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="238.7;103.1;103.1;238.7"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="775.7" cy="119.7"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="775.7;520.2;520.2;775.7"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="119.7;111.6;111.6;119.7"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="576.4" cy="128.3"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="576.4;514.9;514.9;576.4"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="128.3;118.7;118.7;128.3"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="129.7" cy="203.5"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="129.7;511.2;511.2;129.7"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="203.5;124.6;124.6;203.5"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="204.6" cy="220.7"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="204.6;510.0;510.0;204.6"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="220.7;130.0;130.0;220.7"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="256.7" cy="152.7"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="256.7;511.2;511.2;256.7"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="152.7;135.4;135.4;152.7"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="807.5" cy="193.2"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="807.5;514.9;514.9;807.5"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="193.2;141.3;141.3;193.2"/></circle>
|
||||
<circle r="3" fill="#1d6f7d" cx="247.0" cy="194.9"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="247.0;520.2;520.2;247.0"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="194.9;148.4;148.4;194.9"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="196.2" cy="142.2"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="196.2;526.3;526.3;196.2"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="142.2;156.9;156.9;142.2"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="252.9" cy="41.9"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="252.9;531.9;531.9;252.9"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="41.9;166.8;166.8;41.9"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="641.8" cy="236.9"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="641.8;535.8;535.8;641.8"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="236.9;178.1;178.1;236.9"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="163.3" cy="192.4"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="163.3;536.9;536.9;163.3"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="192.4;190.3;190.3;192.4"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="166.4" cy="180.2"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="166.4;534.4;534.4;166.4"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="180.2;202.6;202.6;180.2"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="325.8" cy="157.2"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="325.8;527.8;527.8;325.8"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="157.2;214.4;214.4;157.2"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="471.7" cy="205.4"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="471.7;517.1;517.1;471.7"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="205.4;224.7;224.7;205.4"/></circle>
|
||||
<circle r="3" fill="#1d6f7d" cx="20.7" cy="75.8"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="20.7;502.7;502.7;20.7"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="75.8;232.7;232.7;75.8"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="230.9" cy="184.1"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="230.9;485.5;485.5;230.9"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="184.1;238.0;238.0;184.1"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="217.0" cy="162.4"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="217.0;466.7;466.7;217.0"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="162.4;240.0;240.0;162.4"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="187.1" cy="146.9"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="187.1;447.4;447.4;187.1"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="146.9;238.7;238.7;146.9"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="52.8" cy="23.4"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="52.8;429.0;429.0;52.8"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="23.4;234.3;234.3;23.4"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="403.6" cy="141.9"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="403.6;412.5;412.5;403.6"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="141.9;227.2;227.2;141.9"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="761.6" cy="28.9"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="761.6;398.8;398.8;761.6"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="28.9;218.1;218.1;28.9"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="523.9" cy="94.8"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="523.9;388.2;388.2;523.9"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="94.8;207.9;207.9;94.8"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="50.8" cy="46.4"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="50.8;380.6;380.6;50.8"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="46.4;197.3;197.3;46.4"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="829.3" cy="113.6"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="829.3;375.7;375.7;829.3"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="113.6;187.2;187.2;113.6"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="311.6" cy="21.0"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="311.6;372.6;372.6;311.6"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="21.0;178.1;178.1;21.0"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="774.8" cy="156.1"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="774.8;370.2;370.2;774.8"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="156.1;170.5;170.5;156.1"/></circle>
|
||||
<circle r="3" fill="#1d6f7d" cx="551.4" cy="148.5"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="551.4;367.5;367.5;551.4"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="148.5;164.3;164.3;148.5"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="671.5" cy="238.9"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="671.5;363.4;363.4;671.5"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="238.9;159.5;159.5;238.9"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="569.7" cy="190.5"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="569.7;357.3;357.3;569.7"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="190.5;155.6;155.6;190.5"/></circle>
|
||||
<circle r="3" fill="#1d6f7d" cx="231.3" cy="229.3"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="231.3;348.7;348.7;231.3"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="229.3;152.2;152.2;229.3"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="119.3" cy="150.0"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="119.3;337.7;337.7;119.3"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="150.0;148.4;148.4;150.0"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="517.6" cy="147.9"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="517.6;324.8;324.8;517.6"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="147.9;143.7;143.7;147.9"/></circle>
|
||||
<circle r="3" fill="#1d6f7d" cx="485.4" cy="84.1"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="485.4;310.8;310.8;485.4"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="84.1;137.7;137.7;84.1"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="39.2" cy="65.5"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="39.2;296.9;296.9;39.2"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="65.5;130.0;130.0;65.5"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="264.4" cy="164.3"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="264.4;284.5;284.5;264.4"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="164.3;120.6;120.6;164.3"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="166.7" cy="231.5"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="166.7;274.8;274.8;166.7"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="231.5;109.7;109.7;231.5"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="60.0" cy="212.7"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="60.0;269.0;269.0;60.0"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="212.7;97.8;97.8;212.7"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="248.3" cy="112.4"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="248.3;267.9;267.9;248.3"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="112.4;85.5;85.5;112.4"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="39.8" cy="159.0"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="39.8;271.9;271.9;39.8"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="159.0;73.8;73.8;159.0"/></circle>
|
||||
<circle r="3" fill="#1d6f7d" cx="532.0" cy="229.1"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="532.0;280.8;280.8;532.0"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="229.1;63.3;63.3;229.1"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="642.1" cy="45.2"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="642.1;294.2;294.2;642.1"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="45.2;54.8;54.8;45.2"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="807.2" cy="137.1"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="807.2;311.0;311.0;807.2"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="137.1;48.8;48.8;137.1"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="342.4" cy="64.9"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="342.4;330.1;330.1;342.4"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="64.9;45.6;45.6;64.9"/></circle>
|
||||
<circle r="3" fill="#1d6f7d" cx="624.6" cy="183.4"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="624.6;350.2;350.2;624.6"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="183.4;45.4;45.4;183.4"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="56.3" cy="58.8"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="56.3;369.9;369.9;56.3"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="58.8;47.7;47.7;58.8"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="682.6" cy="54.5"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="682.6;388.2;388.2;682.6"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="54.5;52.1;52.1;54.5"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="460.1" cy="226.1"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="460.1;404.3;404.3;460.1"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="226.1;57.9;57.9;226.1"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="682.6" cy="74.1"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="682.6;417.8;417.8;682.6"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="74.1;64.3;64.3;74.1"/></circle>
|
||||
<circle r="3" fill="#1d6f7d" cx="548.1" cy="112.4"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="548.1;429.0;429.0;548.1"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="112.4;70.5;70.5;112.4"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="265.1" cy="178.5"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="265.1;438.1;438.1;265.1"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="178.5;75.8;75.8;178.5"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="728.6" cy="135.9"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="728.6;446.2;446.2;728.6"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="135.9;79.8;79.8;135.9"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="262.9" cy="215.2"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="262.9;454.0;454.0;262.9"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="215.2;82.2;82.2;215.2"/></circle>
|
||||
<circle r="3" fill="#1d6f7d" cx="582.0" cy="139.6"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="582.0;462.6;462.6;582.0"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="139.6;83.1;83.1;139.6"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="661.3" cy="210.2"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="661.3;472.9;472.9;661.3"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="210.2;82.8;82.8;210.2"/></circle>
|
||||
<circle r="3" fill="#1d6f7d" cx="88.9" cy="100.6"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="88.9;485.4;485.4;88.9"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="100.6;81.9;81.9;100.6"/></circle>
|
||||
<circle r="3" fill="#1d6f7d" cx="364.2" cy="222.8"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="364.2;500.2;500.2;364.2"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="222.8;80.9;80.9;222.8"/></circle>
|
||||
<circle r="3" fill="#1d6f7d" cx="719.9" cy="143.8"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="719.9;517.3;517.3;719.9"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="143.8;80.7;80.7;143.8"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="168.8" cy="155.9"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="168.8;535.8;535.8;168.8"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="155.9;81.9;81.9;155.9"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="473.2" cy="48.0"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="473.2;554.8;554.8;473.2"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="48.0;85.0;85.0;48.0"/></circle>
|
||||
<circle r="3" fill="#1d6f7d" cx="282.6" cy="60.9"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="282.6;572.9;572.9;282.6"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="60.9;90.3;90.3;60.9"/></circle>
|
||||
<circle r="3" fill="#1d6f7d" cx="495.6" cy="74.1"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="495.6;588.9;588.9;495.6"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="74.1;97.8;97.8;74.1"/></circle>
|
||||
<circle r="3" fill="#4dd4e8" cx="313.4" cy="136.1"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="313.4;601.4;601.4;313.4"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="136.1;107.3;107.3;136.1"/></circle>
|
||||
<circle r="3" fill="#1d6f7d" cx="818.1" cy="84.6"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="818.1;609.3;609.3;818.1"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="84.6;118.2;118.2;84.6"/></circle>
|
||||
<text x="16" y="26" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="14" fill="#4dd4e8">S = 100.0 k·bits</text>
|
||||
<text x="864" y="26" text-anchor="end" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="14" fill="#7ee2a8">dS/dt < 0</text>
|
||||
<text x="864" y="246" text-anchor="end" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="11" fill="#8b949e">bits sorted by visitors: 0</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 52 KiB |
120
engine/generate_entropy_svg.py
Normal file
120
engine/generate_entropy_svg.py
Normal file
|
|
@ -0,0 +1,120 @@
|
|||
#!/usr/bin/env python3
|
||||
"""Generate assets/entropy.svg — a SMIL-animated entropy-reversal field.
|
||||
|
||||
120 particles loop from a seeded chaos cloud into a (2,5) torus-knot
|
||||
lattice, hold, and scatter back. State (bits sorted by visitors, chaos
|
||||
generation) comes from state/demon.json. Stdlib only; deterministic for
|
||||
a given generation so regenerated output is diffable.
|
||||
"""
|
||||
|
||||
import hashlib
|
||||
import json
|
||||
import math
|
||||
import os
|
||||
import sys
|
||||
|
||||
ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||
STATE_PATH = os.path.join(ROOT, "state", "demon.json")
|
||||
OUT_PATH = os.path.join(ROOT, "assets", "entropy.svg")
|
||||
|
||||
WIDTH, HEIGHT = 880, 260
|
||||
MARGIN = 20
|
||||
N_PARTICLES = 120
|
||||
KNOT_R, KNOT_r = 150, 58
|
||||
DUR = "11s"
|
||||
KEY_TIMES = "0;0.64;0.82;1"
|
||||
KEY_SPLINES = "0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1"
|
||||
|
||||
BG = "#010409"
|
||||
BORDER = "#21262d"
|
||||
CYAN = "#4dd4e8"
|
||||
DEEP = "#1d6f7d"
|
||||
GREEN = "#7ee2a8"
|
||||
MUTED = "#8b949e"
|
||||
|
||||
|
||||
def seeded_unit(index, generation, channel):
|
||||
"""Deterministic float in [0, 1) from particle index + generation."""
|
||||
digest = hashlib.sha256(f"{index}:{generation}:{channel}".encode()).digest()
|
||||
return int.from_bytes(digest[:8], "big") / 2**64
|
||||
|
||||
|
||||
def knot_points(n):
|
||||
"""(2,5) torus knot sampled at n points, scaled/centered to the canvas."""
|
||||
raw = []
|
||||
for i in range(n):
|
||||
t = 2 * math.pi * i / n
|
||||
rad = KNOT_R + KNOT_r * math.cos(5 * t)
|
||||
raw.append((rad * math.cos(2 * t), 0.62 * rad * math.sin(2 * t)))
|
||||
xs, ys = [p[0] for p in raw], [p[1] for p in raw]
|
||||
span_x, span_y = max(xs) - min(xs), max(ys) - min(ys)
|
||||
scale = min((WIDTH - 2 * MARGIN) / span_x, (HEIGHT - 2 * MARGIN) / span_y)
|
||||
cx, cy = (max(xs) + min(xs)) / 2, (max(ys) + min(ys)) / 2
|
||||
return [
|
||||
(WIDTH / 2 + (x - cx) * scale, HEIGHT / 2 + (y - cy) * scale)
|
||||
for x, y in raw
|
||||
]
|
||||
|
||||
|
||||
def main():
|
||||
with open(STATE_PATH) as fh:
|
||||
state = json.load(fh)
|
||||
bits = int(state.get("bits_sorted", 0))
|
||||
generation = int(state.get("generation", 0))
|
||||
entropy = max(12.7, 100 - 0.0002 * bits)
|
||||
s_label = f"{entropy:.1f}"
|
||||
|
||||
lattice = knot_points(N_PARTICLES)
|
||||
parts = [
|
||||
f'<svg xmlns="http://www.w3.org/2000/svg" width="{WIDTH}" height="{HEIGHT}" '
|
||||
f'viewBox="0 0 {WIDTH} {HEIGHT}" role="img" '
|
||||
f'aria-label="Entropy-reversal field: S = {s_label} k-bits">',
|
||||
f'<rect x="0.5" y="0.5" width="{WIDTH - 1}" height="{HEIGHT - 1}" '
|
||||
f'rx="8" fill="{BG}" stroke="{BORDER}"/>',
|
||||
]
|
||||
|
||||
for i, (lx, ly) in enumerate(lattice):
|
||||
chaos_x = MARGIN + seeded_unit(i, generation, "x") * (WIDTH - 2 * MARGIN)
|
||||
chaos_y = MARGIN + seeded_unit(i, generation, "y") * (HEIGHT - 2 * MARGIN)
|
||||
fill = DEEP if seeded_unit(i, generation, "depth") < 0.3 else CYAN
|
||||
cxv = f"{chaos_x:.1f};{lx:.1f};{lx:.1f};{chaos_x:.1f}"
|
||||
cyv = f"{chaos_y:.1f};{ly:.1f};{ly:.1f};{chaos_y:.1f}"
|
||||
parts.append(
|
||||
f'<circle r="3" fill="{fill}" cx="{chaos_x:.1f}" cy="{chaos_y:.1f}">'
|
||||
f'<animate attributeName="cx" dur="{DUR}" repeatCount="indefinite" '
|
||||
f'calcMode="spline" keyTimes="{KEY_TIMES}" keySplines="{KEY_SPLINES}" '
|
||||
f'values="{cxv}"/>'
|
||||
f'<animate attributeName="cy" dur="{DUR}" repeatCount="indefinite" '
|
||||
f'calcMode="spline" keyTimes="{KEY_TIMES}" keySplines="{KEY_SPLINES}" '
|
||||
f'values="{cyv}"/>'
|
||||
f'</circle>'
|
||||
)
|
||||
|
||||
font = 'font-family="ui-monospace,SFMono-Regular,Menlo,monospace"'
|
||||
parts.append(
|
||||
f'<text x="16" y="26" {font} font-size="14" fill="{CYAN}">'
|
||||
f'S = {s_label} k·bits</text>'
|
||||
)
|
||||
parts.append(
|
||||
f'<text x="{WIDTH - 16}" y="26" text-anchor="end" {font} '
|
||||
f'font-size="14" fill="{GREEN}">dS/dt < 0</text>'
|
||||
)
|
||||
parts.append(
|
||||
f'<text x="{WIDTH - 16}" y="{HEIGHT - 14}" text-anchor="end" {font} '
|
||||
f'font-size="11" fill="{MUTED}">bits sorted by visitors: {bits}</text>'
|
||||
)
|
||||
parts.append("</svg>")
|
||||
|
||||
svg = "\n".join(parts) + "\n"
|
||||
os.makedirs(os.path.dirname(OUT_PATH), exist_ok=True)
|
||||
with open(OUT_PATH, "w") as fh:
|
||||
fh.write(svg)
|
||||
size = os.path.getsize(OUT_PATH)
|
||||
print(f"wrote {OUT_PATH} ({size} bytes, S={s_label}, bits={bits}, gen={generation})")
|
||||
if size > 200 * 1024:
|
||||
print("error: SVG exceeds 200 KB budget", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
210
engine/nightly.py
Normal file
210
engine/nightly.py
Normal file
|
|
@ -0,0 +1,210 @@
|
|||
#!/usr/bin/env python3
|
||||
"""Nightly telemetry refresh for the profile README.
|
||||
|
||||
Updates the marker-fenced sections of README.md:
|
||||
FEED — 4 newest Strange Quarks articles (RSS if populated, else the
|
||||
server-rendered blog HTML)
|
||||
STATS — telemetry row with live star/repo totals
|
||||
FEATURED — star counts on the featured project cards
|
||||
and bumps the entropy field's chaos generation so the field differs daily.
|
||||
|
||||
Every section is fail-safe: if a fetch or parse fails, that section is left
|
||||
untouched and the script still exits 0. Stdlib only.
|
||||
"""
|
||||
|
||||
import datetime
|
||||
import html as htmllib
|
||||
import json
|
||||
import os
|
||||
import re
|
||||
import subprocess
|
||||
import sys
|
||||
import urllib.request
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||
README = os.path.join(ROOT, "README.md")
|
||||
STATE_PATH = os.path.join(ROOT, "state", "demon.json")
|
||||
|
||||
SITE = "https://stevenmilanese.com"
|
||||
FEED_URL = f"{SITE}/feed.xml"
|
||||
BLOG_URL = f"{SITE}/blog"
|
||||
|
||||
FEATURED_REPOS = [
|
||||
("anthropic-certs", "Verified Anthropic certifications — Claude, API, Claude Code CLI, MCP."),
|
||||
("slTrain", "A steam locomotive for your terminal, smoke trail included."),
|
||||
("meowchi-releases", "A desktop pet that evolves when you actually get work done."),
|
||||
("mpl", "Mathematics Programming Language — write the equation, run the equation."),
|
||||
]
|
||||
|
||||
|
||||
def fetch(url, accept=None):
|
||||
req = urllib.request.Request(url, headers={"User-Agent": "developtheweb-nightly/1.0"})
|
||||
if accept:
|
||||
req.add_header("Accept", accept)
|
||||
token = os.environ.get("GITHUB_TOKEN")
|
||||
if token and url.startswith("https://api.github.com"):
|
||||
req.add_header("Authorization", f"Bearer {token}")
|
||||
with urllib.request.urlopen(req, timeout=30) as resp:
|
||||
return resp.read().decode("utf-8", errors="replace")
|
||||
|
||||
|
||||
def gh_api(path):
|
||||
return json.loads(fetch(f"https://api.github.com{path}", accept="application/vnd.github+json"))
|
||||
|
||||
|
||||
def replace_section(text, marker, body):
|
||||
start, end = f"<!-- {marker}:START -->", f"<!-- {marker}:END -->"
|
||||
if start not in text or end not in text:
|
||||
raise ValueError(f"missing {marker} markers")
|
||||
pre = text.split(start)[0]
|
||||
post = text.split(end)[1]
|
||||
return f"{pre}{start}\n{body}\n{end}{post}"
|
||||
|
||||
|
||||
def articles_from_rss():
|
||||
root = ET.fromstring(fetch(FEED_URL))
|
||||
items = []
|
||||
for item in root.iter("item"):
|
||||
title = (item.findtext("title") or "").strip()
|
||||
link = (item.findtext("link") or "").strip()
|
||||
pub = (item.findtext("pubDate") or "").strip()
|
||||
date = None
|
||||
try:
|
||||
date = datetime.datetime.strptime(pub[:16].strip(), "%a, %d %b %Y")
|
||||
except ValueError:
|
||||
pass
|
||||
if title and link:
|
||||
items.append({"title": title, "url": link, "date": date, "meta": ""})
|
||||
return items
|
||||
|
||||
|
||||
def articles_from_html():
|
||||
page = fetch(BLOG_URL)
|
||||
skip = ("/blog/tag/", "/blog/author/")
|
||||
anchors = [
|
||||
m for m in re.finditer(r'<a[^>]+href="(/blog/[a-z0-9][a-z0-9-]*)"', page)
|
||||
if not m.group(1).startswith(skip)
|
||||
]
|
||||
seen, articles = set(), []
|
||||
for idx, m in enumerate(anchors):
|
||||
slug = m.group(1)
|
||||
if slug in seen:
|
||||
continue
|
||||
seen.add(slug)
|
||||
stop = len(page)
|
||||
for nxt in anchors[idx + 1:]:
|
||||
if nxt.group(1) != slug:
|
||||
stop = nxt.start()
|
||||
break
|
||||
window = page[m.start():stop]
|
||||
title_m = re.search(r'alt="([^"]+)"', window)
|
||||
stripped = re.sub(r"<[^>]+>", " ", window)
|
||||
stripped = htmllib.unescape(re.sub(r"<!--.*?-->", "", stripped))
|
||||
date_m = re.search(r"([A-Z][a-z]+ \d{1,2}, \d{4})", stripped)
|
||||
mins_m = re.search(r"(\d+)\s*min", stripped)
|
||||
views_m = re.search(r"([\d,]+)\s*views", stripped)
|
||||
if not (title_m and date_m):
|
||||
continue
|
||||
date = datetime.datetime.strptime(date_m.group(1), "%B %d, %Y")
|
||||
meta = f"{mins_m.group(1)} min read" if mins_m else (
|
||||
f"{views_m.group(1)} views" if views_m else ""
|
||||
)
|
||||
articles.append({
|
||||
"title": htmllib.unescape(title_m.group(1)),
|
||||
"url": f"{SITE}{slug}",
|
||||
"date": date,
|
||||
"meta": meta,
|
||||
})
|
||||
return articles
|
||||
|
||||
|
||||
def update_feed(text):
|
||||
articles = []
|
||||
try:
|
||||
articles = articles_from_rss()
|
||||
except Exception as exc:
|
||||
print(f"feed: rss unusable ({exc}); falling back to html")
|
||||
if not articles:
|
||||
articles = articles_from_html()
|
||||
dated = [a for a in articles if a["date"]]
|
||||
dated.sort(key=lambda a: a["date"], reverse=True)
|
||||
newest = dated[:4]
|
||||
if len(newest) < 4:
|
||||
raise ValueError(f"only {len(newest)} parseable articles")
|
||||
rows = ["| Article | |", "|:---|---:|"]
|
||||
for a in newest:
|
||||
title = a["title"].replace("|", "\\|")
|
||||
when = a["date"].strftime("%b %d, %Y").replace(" 0", " ")
|
||||
meta = f"{when} · {a['meta']}" if a["meta"] else when
|
||||
rows.append(f"| [{title}]({a['url']}) | {meta} |")
|
||||
return replace_section(text, "FEED", "\n".join(rows))
|
||||
|
||||
|
||||
def update_stats(text):
|
||||
repos = gh_api("/users/developtheweb/repos?per_page=100&type=owner")
|
||||
public = [r for r in repos if not r["private"]]
|
||||
stars = sum(r["stargazers_count"] for r in public)
|
||||
line = (
|
||||
"<div align=\"center\">\n\n"
|
||||
"`10¹⁰⁶ yr until heat death — the deadline` · "
|
||||
"`2.9 zJ of order per bit sorted (kT ln 2, 300 K)` · "
|
||||
f"`★ {stars} stars across {len(public)} public repos`\n\n"
|
||||
"</div>"
|
||||
)
|
||||
return replace_section(text, "STATS", line)
|
||||
|
||||
|
||||
def update_featured(text):
|
||||
cards = []
|
||||
for name, blurb in FEATURED_REPOS:
|
||||
repo = gh_api(f"/repos/developtheweb/{name}")
|
||||
cards.append(
|
||||
f'<td width="50%" valign="top">\n'
|
||||
f'<h3 align="center"><a href="{repo["html_url"]}">{name}</a></h3>\n'
|
||||
f'<p align="center"><code>★ {repo["stargazers_count"]}</code></p>\n'
|
||||
f'<p align="center">{blurb}</p>\n'
|
||||
f'</td>'
|
||||
)
|
||||
table = (
|
||||
'<div align="center">\n<table>\n'
|
||||
f'<tr>\n{cards[0]}\n{cards[1]}\n</tr>\n'
|
||||
f'<tr>\n{cards[2]}\n{cards[3]}\n</tr>\n'
|
||||
'</table>\n</div>'
|
||||
)
|
||||
return replace_section(text, "FEATURED", table)
|
||||
|
||||
|
||||
def bump_entropy():
|
||||
with open(STATE_PATH) as fh:
|
||||
state = json.load(fh)
|
||||
state["generation"] += 1
|
||||
with open(STATE_PATH, "w") as fh:
|
||||
json.dump(state, fh, indent=2)
|
||||
fh.write("\n")
|
||||
subprocess.run(
|
||||
[sys.executable, os.path.join(ROOT, "engine", "generate_entropy_svg.py")],
|
||||
check=True,
|
||||
)
|
||||
|
||||
|
||||
def main():
|
||||
with open(README) as fh:
|
||||
text = fh.read()
|
||||
for label, fn in (("FEED", update_feed), ("STATS", update_stats), ("FEATURED", update_featured)):
|
||||
try:
|
||||
text = fn(text)
|
||||
print(f"{label}: updated")
|
||||
except Exception as exc:
|
||||
print(f"{label}: left untouched ({exc})")
|
||||
with open(README, "w") as fh:
|
||||
fh.write(text)
|
||||
try:
|
||||
bump_entropy()
|
||||
print("ENTROPY: regenerated")
|
||||
except Exception as exc:
|
||||
print(f"ENTROPY: left untouched ({exc})")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
6
state/demon.json
Normal file
6
state/demon.json
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"bits_sorted": 0,
|
||||
"generation": 1,
|
||||
"demons": 0,
|
||||
"last_sorted_at": null
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue