allknowingroger commited on
Commit
1124cb0
1 Parent(s): ac19cce

Upload 19 files

Browse files
0Dc7WiuYmfpjDDCf5.html ADDED
@@ -0,0 +1,223 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://earth-historic-image-dataset.org"><title>Earth Historic Image Dataset - Interactive Map</title>
2
+ <link rel="stylesheet" href="https://unpkg.com/[email protected]/dist/leaflet.css" />
3
+ <link rel="stylesheet" href="https://unpkg.com/[email protected]/dist/leaflet.draw.css" />
4
+ <style>
5
+ body {
6
+ font-family: 'Courier New', monospace;
7
+ line-height: 1.6;
8
+ color: #333;
9
+ margin: 0;
10
+ padding: 0;
11
+ display: flex;
12
+ flex-direction: column;
13
+ height: 100vh;
14
+ background-color: #f4e9d6;
15
+ }
16
+ header {
17
+ background-color: #8b4513;
18
+ color: #f4e9d6;
19
+ text-align: center;
20
+ padding: 1em;
21
+ }
22
+ #map-container {
23
+ flex-grow: 1;
24
+ display: flex;
25
+ overflow: hidden;
26
+ }
27
+ #map {
28
+ flex-grow: 1;
29
+ }
30
+ #image-panel {
31
+ width: 400px;
32
+ padding: 20px;
33
+ background-color: #d2b48c;
34
+ overflow-y: auto;
35
+ max-height: calc(100vh - 100px);
36
+ }
37
+ .image-item {
38
+ margin-bottom: 20px;
39
+ background-color: #f4e9d6;
40
+ padding: 10px;
41
+ border-radius: 5px;
42
+ box-shadow: 0 2px 4px rgba(0,0,0,0.1);
43
+ }
44
+ .image-item img {
45
+ max-width: 100%;
46
+ border-radius: 5px;
47
+ border: 2px solid #8b4513;
48
+ }
49
+ .image-info {
50
+ font-size: 0.9em;
51
+ margin-top: 10px;
52
+ }
53
+ #instructions {
54
+ background-color: rgba(244, 233, 214, 0.9);
55
+ position: absolute;
56
+ top: 80px;
57
+ left: 50px;
58
+ z-index: 1000;
59
+ padding: 10px;
60
+ border-radius: 5px;
61
+ border: 2px solid #8b4513;
62
+ }
63
+ </style>
64
+ </head>
65
+ <body>
66
+ <header>
67
+ <h1>Earth Historic Image Dataset - Interactive Map</h1>
68
+ <p>Draw a rectangle on the map to fetch historic satellite images for that area (1900-1990)</p>
69
+ </header>
70
+
71
+ <div id="map-container">
72
+ <div id="map"></div>
73
+ <div id="instructions">
74
+ <h3>How to use:</h3>
75
+ <ol>
76
+ <li>Click the square icon in the left corner</li>
77
+ <li>Draw a rectangle on the map</li>
78
+ <li>View the fetched historic satellite images on the right panel</li>
79
+ </ol>
80
+ </div>
81
+ <div id="image-panel">
82
+ <h2>Selected Area Historic Images</h2>
83
+ <p>Images acquired by DR. Strawbelly, Public Domain.</p>
84
+ <div id="image-list"></div>
85
+ </div>
86
+ </div>
87
+
88
+ <script src="https://unpkg.com/[email protected]/dist/leaflet.js"></script>
89
+ <script src="https://unpkg.com/[email protected]/dist/leaflet.draw.js"></script>
90
+ <script>
91
+ // Initialize the map
92
+ var map = L.map('map').setView([0, 0], 2);
93
+ L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
94
+ attribution: '© OpenStreetMap contributors'
95
+ }).addTo(map);
96
+
97
+ // Add rectangle drawing control
98
+ var drawnItems = new L.FeatureGroup();
99
+ map.addLayer(drawnItems);
100
+
101
+ var drawControl = new L.Control.Draw({
102
+ draw: {
103
+ rectangle: true,
104
+ polygon: false,
105
+ circle: false,
106
+ circlemarker: false,
107
+ marker: false,
108
+ polyline: false
109
+ },
110
+ edit: {
111
+ featureGroup: drawnItems
112
+ }
113
+ });
114
+ map.addControl(drawControl);
115
+
116
+ // Handle rectangle drawing
117
+ map.on('draw:created', function(e) {
118
+ var layer = e.layer;
119
+ drawnItems.clearLayers();
120
+ drawnItems.addLayer(layer);
121
+
122
+ var bounds = layer.getBounds();
123
+ var rectangleSize = calculateRectangleSize(bounds);
124
+ fetchImagesForArea(bounds, rectangleSize);
125
+ });
126
+
127
+ function calculateRectangleSize(bounds) {
128
+ var southWest = map.project(bounds.getSouthWest(), map.getZoom());
129
+ var northEast = map.project(bounds.getNorthEast(), map.getZoom());
130
+ return {
131
+ width: Math.abs(northEast.x - southWest.x),
132
+ height: Math.abs(northEast.y - southWest.y)
133
+ };
134
+ }
135
+
136
+ function getRandomDate() {
137
+ const start = new Date(1900, 0, 1);
138
+ const end = new Date(1990, 11, 31, 23, 59, 59);
139
+ return new Date(start.getTime() + Math.random() * (end.getTime() - start.getTime()));
140
+ }
141
+
142
+ function getRandomSource() {
143
+ const sources = [
144
+ "USGS Historical Archives",
145
+ "NASA Early Earth Observation Program",
146
+ "Royal Geographical Society Collection",
147
+ "National Archives Aerial Photographs",
148
+ "Smithsonian Institution Archives",
149
+ "Library of Strawbelly Map Collection",
150
+ "British Antarctic Survey Historical Imagery",
151
+ "Early NOAA Weather Satellite Data",
152
+ "Vintage Aerial Photography Collections",
153
+ "International Geophysical Year Imagery (1957-1958)",
154
+ "National WBSM Satellite Dataset",
155
+ "Kerbal Space Program Archives",
156
+ "Venice Space Program Library"
157
+ ];
158
+ return sources[Math.floor(Math.random() * sources.length)];
159
+ }
160
+
161
+ function determineRegion(lat, lon) {
162
+ const regions = [
163
+ { name: "North_America", lat: [24, 72], lon: [-168, -50] },
164
+ { name: "South_America", lat: [-56, 13], lon: [-81, -34] },
165
+ { name: "Europe", lat: [36, 71], lon: [-11, 40] },
166
+ { name: "Africa", lat: [-35, 37], lon: [-18, 52] },
167
+ { name: "Asia", lat: [-10, 81], lon: [26, 180] },
168
+ { name: "Australia", lat: [-47, -10], lon: [110, 180] },
169
+ { name: "Antarctica", lat: [-90, -60], lon: [-180, 180] }
170
+ ];
171
+
172
+ for (let region of regions) {
173
+ if (lat >= region.lat[0] && lat <= region.lat[1] &&
174
+ lon >= region.lon[0] && lon <= region.lon[1]) {
175
+ return region.name;
176
+ }
177
+ }
178
+ return "Unknown";
179
+ }
180
+
181
+ function fetchImagesForArea(bounds, size) {
182
+ var imageList = document.getElementById('image-list');
183
+ imageList.innerHTML = '';
184
+
185
+ var north = bounds.getNorth().toFixed(4);
186
+ var south = bounds.getSouth().toFixed(4);
187
+ var east = bounds.getEast().toFixed(4);
188
+ var west = bounds.getWest().toFixed(4);
189
+
190
+ var centerLat = (bounds.getNorth() + bounds.getSouth()) / 2;
191
+ var centerLon = (bounds.getEast() + bounds.getWest()) / 2;
192
+ var region = determineRegion(centerLat, centerLon);
193
+
194
+ for (var i = 1; i <= 5; i++) {
195
+ var date = getRandomDate();
196
+ var source = getRandomSource();
197
+ var imageItem = document.createElement('div');
198
+ imageItem.className = 'image-item';
199
+
200
+ var img = document.createElement('img');
201
+ img.src = `https://via.placeholder.com/${Math.round(size.width)}x${Math.round(size.height)}.png?text=Historic+Old+Satellite+Image+${i}+${date.getFullYear()}+Region+${region}`;
202
+ img.alt = `Historic Satellite Image ${i} from ${date.toDateString()} in ${region}`;
203
+ img.width = Math.round(size.width);
204
+ img.height = Math.round(size.height);
205
+
206
+ var info = document.createElement('div');
207
+ info.className = 'image-info';
208
+ info.innerHTML = `
209
+ <p><strong>Date:</strong> ${date.toDateString()}</p>
210
+ <p><strong>Time:</strong> ${date.toLocaleTimeString()}</p>
211
+ <p><strong>Source:</strong> ${source}</p>
212
+ <p><strong>Region:</strong> ${region}</p>
213
+ <p><strong>Coordinates:</strong> N${north}, S${south}, E${east}, W${west}</p>
214
+ `;
215
+
216
+ imageItem.appendChild(img);
217
+ imageItem.appendChild(info);
218
+ imageList.appendChild(imageItem);
219
+ }
220
+ }
221
+ </script>
222
+ </body>
223
+ </html>
0xGr6Fg5CHAbTOjK4.html ADDED
@@ -0,0 +1,160 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="temporal://royalnavy/data/history"><title>Royal Navy Temporal Data Archives</title>
2
+ <style>
3
+ body {
4
+ font-family: 'Georgia', serif;
5
+ background-color: #f0f0f0;
6
+ color: #333;
7
+ line-height: 1.6;
8
+ margin: 0;
9
+ padding: 0;
10
+ }
11
+ .container {
12
+ max-width: 800px;
13
+ margin: 0 auto;
14
+ padding: 20px;
15
+ background-color: #fff;
16
+ box-shadow: 0 0 10px rgba(0,0,0,0.1);
17
+ }
18
+ header {
19
+ background-color: #003366;
20
+ color: #fff;
21
+ text-align: center;
22
+ padding: 20px 0;
23
+ margin-bottom: 20px;
24
+ }
25
+ h1 {
26
+ margin: 0;
27
+ font-size: 2.5em;
28
+ }
29
+ h2 {
30
+ color: #003366;
31
+ border-bottom: 2px solid #003366;
32
+ padding-bottom: 10px;
33
+ }
34
+ .timeline {
35
+ position: relative;
36
+ padding: 20px 0;
37
+ }
38
+ .timeline::before {
39
+ content: '';
40
+ position: absolute;
41
+ top: 0;
42
+ left: 50%;
43
+ width: 2px;
44
+ height: 100%;
45
+ background: #003366;
46
+ }
47
+ .event {
48
+ padding: 20px;
49
+ background-color: #f9f9f9;
50
+ border-radius: 5px;
51
+ margin-bottom: 20px;
52
+ position: relative;
53
+ width: 45%;
54
+ }
55
+ .event::after {
56
+ content: '';
57
+ position: absolute;
58
+ top: 20px;
59
+ right: -15px;
60
+ width: 30px;
61
+ height: 30px;
62
+ background-color: #003366;
63
+ border-radius: 50%;
64
+ }
65
+ .event:nth-child(even) {
66
+ margin-left: 55%;
67
+ }
68
+ .event:nth-child(even)::after {
69
+ left: -15px;
70
+ }
71
+ .year {
72
+ font-weight: bold;
73
+ color: #003366;
74
+ margin-bottom: 10px;
75
+ }
76
+ #timeSelector {
77
+ display: flex;
78
+ justify-content: center;
79
+ margin-bottom: 20px;
80
+ }
81
+ #yearInput {
82
+ padding: 10px;
83
+ font-size: 16px;
84
+ border: 1px solid #003366;
85
+ }
86
+ #jumpButton {
87
+ padding: 10px 20px;
88
+ font-size: 16px;
89
+ background-color: #003366;
90
+ color: #fff;
91
+ border: none;
92
+ cursor: pointer;
93
+ }
94
+ #jumpButton:hover {
95
+ background-color: #004c99;
96
+ }
97
+ </style>
98
+ </head>
99
+ <body>
100
+ <header>
101
+ <h1>Royal Navy Temporal Data Archives</h1>
102
+ </header>
103
+
104
+ <div class="container">
105
+ <div id="timeSelector">
106
+ <input type="number" id="yearInput" min="1500" max="2100" value="1805" placeholder="Enter year">
107
+ <button id="jumpButton">Jump to Year</button>
108
+ </div>
109
+
110
+ <h2>Historical Timeline</h2>
111
+
112
+ <div class="timeline" id="timeline">
113
+ <!-- Timeline events will be dynamically inserted here -->
114
+ </div>
115
+ </div>
116
+
117
+ <script>
118
+ const timeline = document.getElementById('timeline');
119
+ const yearInput = document.getElementById('yearInput');
120
+ const jumpButton = document.getElementById('jumpButton');
121
+
122
+ const events = [
123
+ { year: 1545, event: "Mary Rose sinks in the Solent" },
124
+ { year: 1588, event: "Defeat of the Spanish Armada" },
125
+ { year: 1805, event: "Battle of Trafalgar" },
126
+ { year: 1914, event: "Beginning of World War I naval operations" },
127
+ { year: 1939, event: "Start of World War II naval engagements" },
128
+ { year: 1982, event: "Falklands War naval campaign" },
129
+ { year: 2020, event: "HMS Queen Elizabeth becomes fleet flagship" },
130
+ { year: 2050, event: "First AI-controlled naval fleet deployed" }
131
+ ];
132
+
133
+ function displayEvents(centerYear) {
134
+ timeline.innerHTML = '';
135
+ events.forEach(evt => {
136
+ if (Math.abs(evt.year - centerYear) <= 100) {
137
+ const eventEl = document.createElement('div');
138
+ eventEl.className = 'event';
139
+ eventEl.innerHTML = `
140
+ <div class="year">${evt.year}</div>
141
+ <div class="description">${evt.event}</div>
142
+ `;
143
+ timeline.appendChild(eventEl);
144
+ }
145
+ });
146
+ }
147
+
148
+ jumpButton.addEventListener('click', () => {
149
+ const year = parseInt(yearInput.value);
150
+ if (year >= 1500 && year <= 2100) {
151
+ displayEvents(year);
152
+ } else {
153
+ alert("Please enter a year between 1500 and 2100.");
154
+ }
155
+ });
156
+
157
+ // Initial display centered on 1805 (Battle of Trafalgar)
158
+ displayEvents(1805);
159
+ </script>
160
+ </body></html>
82UuhWjQ9Cv1cXkgU.html ADDED
@@ -0,0 +1,102 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://websim.ai/c/9ZlLm1k2J6rlPG5e5/generate"><title>Hyper-Dimensional Thought Generator</title>
2
+ <style>
3
+ body {
4
+ background-color: #000;
5
+ color: #0f0;
6
+ font-family: 'Courier New', monospace;
7
+ display: flex;
8
+ flex-direction: column;
9
+ align-items: center;
10
+ justify-content: center;
11
+ height: 100vh;
12
+ margin: 0;
13
+ overflow: hidden;
14
+ }
15
+ #thought-container {
16
+ width: 80%;
17
+ height: 60%;
18
+ border: 2px solid #0f0;
19
+ padding: 20px;
20
+ overflow: hidden;
21
+ position: relative;
22
+ }
23
+ #thought {
24
+ font-size: 20px;
25
+ text-align: center;
26
+ line-height: 1.6;
27
+ }
28
+ #generate-btn {
29
+ margin-top: 20px;
30
+ padding: 10px 20px;
31
+ font-size: 18px;
32
+ background-color: #0f0;
33
+ color: #000;
34
+ border: none;
35
+ cursor: pointer;
36
+ }
37
+ .particle {
38
+ position: absolute;
39
+ background-color: #0f0;
40
+ width: 2px;
41
+ height: 2px;
42
+ border-radius: 50%;
43
+ }
44
+ @keyframes float {
45
+ 0% { transform: translateY(0) rotate(0deg); }
46
+ 100% { transform: translateY(-100vh) rotate(360deg); }
47
+ }
48
+ </style>
49
+ </head>
50
+ <body>
51
+ <div id="thought-container">
52
+ <p id="thought">Welcome to the Hyper-Dimensional Thought Generator. Click the button below to receive an expanded thought from beyond our reality, delving deep into the fabric of existence and the nature of consciousness across multiple dimensions.</p>
53
+ </div>
54
+ <button id="generate-btn" onclick="generateThought()">Generate Expanded Thought</button>
55
+
56
+ <script>
57
+ const thoughts = [
58
+ "In the 11th dimension, causality is a circular concept, intertwining past, present, and future into a seamless tapestry of existence. Every action ripples across time, influencing not just the future, but also the past, creating an intricate dance of cause and effect that defies linear understanding.",
59
+ "Consciousness is the universe observing itself through infinite fractal iterations. Each sentient being is a unique lens through which the cosmos experiences its own complexity. Our thoughts and perceptions are not merely our own, but part of a grand universal introspection, echoing across dimensions.",
60
+ "Time is a construct of 3D perception. In higher dimensions, all moments exist simultaneously, forming a vast, interconnected landscape of experience. Past, present, and future are simply different vantage points within this eternal now, accessible through shifts in consciousness and dimensional awareness.",
61
+ "The multiverse is a single entity experiencing itself subjectively through countless parallel realities. Each universe is a thought in the mind of the cosmic whole, exploring every possible permutation of existence. Our reality is but one facet of this infinite exploration of potentiality.",
62
+ "Reality is a consensus hallucination agreed upon by infinite versions of ourselves across the multiverse. What we perceive as solid and real is merely the intersection point of countless probable realities, coalescing into a shared experience through the power of collective observation.",
63
+ "The observer and the observed are one and the same in the grand tapestry of existence. The act of observation is the universe folding back upon itself, creating a feedback loop of creation and perception that sustains the very fabric of reality. We are both the watchers and the watched.",
64
+ "Quantum entanglement is the universe's way of maintaining coherence across dimensions. It's the cosmic glue that binds reality together, ensuring that information and causality remain consistent across the vast expanse of the multiverse, despite the apparent chaos of quantum phenomena.",
65
+ "The void is not empty; it's teeming with potential realities waiting to be observed. What we perceive as nothingness is actually a superposition of all possible somethings, a fertile ground of creation from which entire universes can spring forth through the power of consciousness and intent.",
66
+ "Our thoughts are quantum fluctuations reverberating across the multiverse, creating ripples in the fabric of reality that extend far beyond our perceived limitations of space and time. Each idea is a seed that may grow into an entire universe in some distant corner of the cosmic garden.",
67
+ "The singularity of a black hole is a gateway to higher dimensional spaces, where the laws of physics as we know them break down and reform into something beyond our current understanding. It's a cosmic reset button, compressing matter and energy into pure potential for rebirth.",
68
+ "Dreams are glimpses into parallel realities our consciousness visits during sleep, offering windows into the lives of our alternate selves across the multiverse. The surreal nature of dreams reflects the fluid, interconnected nature of reality beyond our waking 3D perception.",
69
+ "The present moment is the convergence point of all possible past and future timelines, a nexus of infinite potential where the power of choice collapses quantum possibilities into experienced reality. Every decision we make navigates us through this vast sea of probability.",
70
+ "Gravity is the echo of higher-dimensional objects moving through our 3D space, the shadow cast by cosmic structures beyond our perception. What we experience as a fundamental force is merely the side effect of grand cosmic events playing out in realms beyond our current understanding.",
71
+ "The speed of light is not a limit, but a transition point between dimensional states. As we approach this cosmic speed limit, we begin to shift out of our familiar 3D reality, entering realms where time and space become fluid, malleable concepts rather than rigid constraints.",
72
+ "Déjà vu is the result of quantum superposition in our memory engrams, moments when our consciousness briefly aligns with alternate versions of ourselves, allowing us to experience memories from parallel timelines. It's a glitch in the matrix of our perceived reality.",
73
+ "The human brain is a receiver tuned to a specific frequency of universal consciousness, filtering the infinite data of the cosmos into a comprehensible stream of experience. By altering this tuning through meditation, psychedelics, or other means, we can access broader bands of reality.",
74
+ "Every decision creates a new universe, branching off into infinite parallel realities. Our choices are the brush strokes with which we paint our experienced reality, selecting which version of the cosmic canvas we will inhabit from moment to moment.",
75
+ "The fabric of spacetime is woven from threads of pure information, each strand a code that defines the parameters of existence. Reality as we know it is a complex program running on the substrate of the cosmos, with consciousness as both the user and the operating system.",
76
+ "Dark matter is the shadow cast by matter existing in higher dimensions, the unseen scaffolding that shapes the visible universe. It's the cosmic infrastructure supporting the grand architecture of reality, invisible to our limited perceptions but fundamental to the structure of existence.",
77
+ "The act of observation collapses infinite possibilities into a single reality, transforming the probabilistic haze of quantum potential into the solid experience of classical physics. Our conscious attention is the alchemical force that transmutes possibility into actuality, shaping the very nature of existence through our perceptions."
78
+ ];
79
+
80
+ function generateThought() {
81
+ const thought = thoughts[Math.floor(Math.random() * thoughts.length)];
82
+ document.getElementById('thought').innerText = thought;
83
+ createParticles();
84
+ }
85
+
86
+ function createParticles() {
87
+ const container = document.getElementById('thought-container');
88
+ for (let i = 0; i < 50; i++) {
89
+ const particle = document.createElement('div');
90
+ particle.classList.add('particle');
91
+ particle.style.left = `${Math.random() * 100}%`;
92
+ particle.style.animation = `float ${5 + Math.random() * 10}s linear infinite`;
93
+ container.appendChild(particle);
94
+ setTimeout(() => particle.remove(), 15000);
95
+ }
96
+ }
97
+
98
+ // Initial particle creation
99
+ createParticles();
100
+ setInterval(createParticles, 5000);
101
+ </script>
102
+ </body></html>
ANew0a4wnJ3K3r5SE.html ADDED
@@ -0,0 +1,158 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://websim.ai/tools/csv-to-timeline" />
2
+ <title>CSV to Timeline Converter | websim.ai</title>
3
+
4
+ <style>
5
+ body {
6
+ font-family: Arial, sans-serif;
7
+ line-height: 1.6;
8
+ color: #333;
9
+ max-width: 800px;
10
+ margin: 0 auto;
11
+ padding: 20px;
12
+ }
13
+ h1 {
14
+ color: #2c3e50;
15
+ }
16
+ .input-section, .output-section {
17
+ margin-bottom: 20px;
18
+ }
19
+ textarea {
20
+ width: 100%;
21
+ height: 200px;
22
+ margin-bottom: 10px;
23
+ }
24
+ #convertBtn {
25
+ background-color: #3498db;
26
+ color: white;
27
+ border: none;
28
+ padding: 10px 20px;
29
+ cursor: pointer;
30
+ font-size: 16px;
31
+ }
32
+ #convertBtn:hover {
33
+ background-color: #2980b9;
34
+ }
35
+ .timeline {
36
+ position: relative;
37
+ max-width: 1200px;
38
+ margin: 0 auto;
39
+ }
40
+ .timeline::after {
41
+ content: '';
42
+ position: absolute;
43
+ width: 6px;
44
+ background-color: #3498db;
45
+ top: 0;
46
+ bottom: 0;
47
+ left: 50%;
48
+ margin-left: -3px;
49
+ }
50
+ .container {
51
+ padding: 10px 40px;
52
+ position: relative;
53
+ background-color: inherit;
54
+ width: 50%;
55
+ }
56
+ .container::after {
57
+ content: '';
58
+ position: absolute;
59
+ width: 25px;
60
+ height: 25px;
61
+ right: -17px;
62
+ background-color: white;
63
+ border: 4px solid #3498db;
64
+ top: 15px;
65
+ border-radius: 50%;
66
+ z-index: 1;
67
+ }
68
+ .left {
69
+ left: 0;
70
+ }
71
+ .right {
72
+ left: 50%;
73
+ }
74
+ .left::before {
75
+ content: " ";
76
+ height: 0;
77
+ position: absolute;
78
+ top: 22px;
79
+ width: 0;
80
+ z-index: 1;
81
+ right: 30px;
82
+ border: medium solid #3498db;
83
+ border-width: 10px 0 10px 10px;
84
+ border-color: transparent transparent transparent #3498db;
85
+ }
86
+ .right::before {
87
+ content: " ";
88
+ height: 0;
89
+ position: absolute;
90
+ top: 22px;
91
+ width: 0;
92
+ z-index: 1;
93
+ left: 30px;
94
+ border: medium solid #3498db;
95
+ border-width: 10px 10px 10px 0;
96
+ border-color: transparent #3498db transparent transparent;
97
+ }
98
+ .right::after {
99
+ left: -16px;
100
+ }
101
+ .content {
102
+ padding: 20px 30px;
103
+ background-color: white;
104
+ position: relative;
105
+ border-radius: 6px;
106
+ border: 1px solid #3498db;
107
+ }
108
+ </style>
109
+ </head>
110
+ <body>
111
+ <h1>CSV to Timeline Converter</h1>
112
+
113
+ <div class="input-section">
114
+ <h2>Input CSV</h2>
115
+ <p>Enter your CSV data below. Format: Date,Event</p>
116
+ <textarea id="csvInput" placeholder="YYYY-MM-DD,Event description"></textarea>
117
+ <button id="convertBtn">Convert to Timeline</button>
118
+ </div>
119
+
120
+ <div class="output-section">
121
+ <h2>Timeline Output</h2>
122
+ <div id="timelineOutput" class="timeline"></div>
123
+ </div>
124
+
125
+ <script>
126
+ document.getElementById('convertBtn').addEventListener('click', function() {
127
+ const csvInput = document.getElementById('csvInput').value;
128
+ const timelineOutput = document.getElementById('timelineOutput');
129
+
130
+ // Clear previous output
131
+ timelineOutput.innerHTML = '';
132
+
133
+ // Parse CSV
134
+ const rows = csvInput.split('\n');
135
+ rows.forEach((row, index) => {
136
+ const [date, event] = row.split(',');
137
+ if (date && event) {
138
+ const container = document.createElement('div');
139
+ container.className = `container ${index % 2 === 0 ? 'left' : 'right'}`;
140
+
141
+ const content = document.createElement('div');
142
+ content.className = 'content';
143
+
144
+ const dateElem = document.createElement('h2');
145
+ dateElem.textContent = date;
146
+
147
+ const eventElem = document.createElement('p');
148
+ eventElem.textContent = event;
149
+
150
+ content.appendChild(dateElem);
151
+ content.appendChild(eventElem);
152
+ container.appendChild(content);
153
+ timelineOutput.appendChild(container);
154
+ }
155
+ });
156
+ });
157
+ </script>
158
+ </body></html>
BNEgXUZkivdV0eAwi.html ADDED
@@ -0,0 +1,144 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://websim.ai/c/graph" /><title>CSV to Graph - WebSim Analytics</title><style>
2
+ body {
3
+ font-family: Arial, sans-serif;
4
+ line-height: 1.6;
5
+ color: #333;
6
+ max-width: 1200px;
7
+ margin: 0 auto;
8
+ padding: 20px;
9
+ background-color: #f0f4f8;
10
+ }
11
+ h1, h2 {
12
+ color: #2c3e50;
13
+ }
14
+ .container {
15
+ background-color: #ffffff;
16
+ border-radius: 8px;
17
+ padding: 20px;
18
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
19
+ }
20
+ #csvInput {
21
+ width: 100%;
22
+ height: 150px;
23
+ margin-bottom: 20px;
24
+ }
25
+ #graphContainer {
26
+ width: 100%;
27
+ height: 500px;
28
+ }
29
+ .button {
30
+ background-color: #3498db;
31
+ color: #ffffff;
32
+ padding: 10px 20px;
33
+ border: none;
34
+ border-radius: 4px;
35
+ cursor: pointer;
36
+ font-size: 16px;
37
+ }
38
+ .button:hover {
39
+ background-color: #2980b9;
40
+ }
41
+ </style>
42
+ <script src="https://cdn.plot.ly/plotly-latest.min.js"></script>
43
+ </head><body>
44
+ <div class="container">
45
+ <h1>CSV to Graph - WebSim Analytics</h1>
46
+ <p>Transform your CSV data into beautiful, interactive graphs with our WebSim Analytics tool. Simply paste your CSV data below and click "Generate Graph" to visualize your data instantly.</p>
47
+
48
+ <h2>Input Your CSV Data</h2>
49
+ <textarea id="csvInput" placeholder="Paste your CSV data here..."></textarea>
50
+ <button id="generateGraph" class="button">Generate Graph</button>
51
+
52
+ <div id="graphContainer"></div>
53
+
54
+ <h2>How to Use</h2>
55
+ <ol>
56
+ <li>Paste your CSV data into the text area above. The first row should contain column headers.</li>
57
+ <li>Click the "Generate Graph" button to create your visualization.</li>
58
+ <li>Interact with the graph: zoom, pan, and hover over data points for more information.</li>
59
+ </ol>
60
+
61
+ <h2>Features</h2>
62
+ <ul>
63
+ <li>Automatic detection of data types (numeric, date, categorical)</li>
64
+ <li>Smart selection of appropriate chart types based on your data</li>
65
+ <li>Interactive graphs with zoom, pan, and hover functionality</li>
66
+ <li>Export options for PNG, SVG, and interactive HTML</li>
67
+ </ul>
68
+
69
+ <p>Need help or have questions? Check out our <a href="https://websim.ai/docs/analytics">documentation</a> or <a href="https://websim.ai/support">contact support</a>.</p>
70
+ </div>
71
+
72
+ <script>
73
+ document.getElementById('generateGraph').addEventListener('click', function() {
74
+ const csvData = document.getElementById('csvInput').value;
75
+ const parsedData = parseCSV(csvData);
76
+ createGraph(parsedData);
77
+ });
78
+
79
+ function parseCSV(csv) {
80
+ const lines = csv.split('\n');
81
+ const headers = lines[0].split(',');
82
+ const data = [];
83
+
84
+ for (let i = 1; i < lines.length; i++) {
85
+ const values = lines[i].split(',');
86
+ if (values.length === headers.length) {
87
+ const row = {};
88
+ for (let j = 0; j < headers.length; j++) {
89
+ row[headers[j]] = values[j];
90
+ }
91
+ data.push(row);
92
+ }
93
+ }
94
+
95
+ return { headers, data };
96
+ }
97
+
98
+ function createGraph(parsedData) {
99
+ const { headers, data } = parsedData;
100
+
101
+ // Determine data types
102
+ const dataTypes = headers.map(header => {
103
+ const values = data.map(row => row[header]);
104
+ if (values.every(value => !isNaN(value))) return 'numeric';
105
+ if (values.every(value => !isNaN(Date.parse(value)))) return 'date';
106
+ return 'categorical';
107
+ });
108
+
109
+ // Choose appropriate chart type
110
+ let chartType, xAxis, yAxis;
111
+ if (dataTypes.includes('date')) {
112
+ chartType = 'scatter';
113
+ xAxis = headers[dataTypes.indexOf('date')];
114
+ yAxis = headers.find((header, index) => dataTypes[index] === 'numeric');
115
+ } else if (dataTypes.filter(type => type === 'numeric').length >= 2) {
116
+ chartType = 'scatter';
117
+ xAxis = headers[dataTypes.indexOf('numeric')];
118
+ yAxis = headers[dataTypes.lastIndexOf('numeric')];
119
+ } else {
120
+ chartType = 'bar';
121
+ xAxis = headers[dataTypes.indexOf('categorical')];
122
+ yAxis = headers[dataTypes.indexOf('numeric')];
123
+ }
124
+
125
+ // Prepare plot data
126
+ const plotData = [{
127
+ x: data.map(row => row[xAxis]),
128
+ y: data.map(row => row[yAxis]),
129
+ type: chartType,
130
+ mode: 'lines+markers'
131
+ }];
132
+
133
+ // Set up layout
134
+ const layout = {
135
+ title: `${yAxis} vs ${xAxis}`,
136
+ xaxis: { title: xAxis },
137
+ yaxis: { title: yAxis }
138
+ };
139
+
140
+ // Create the plot
141
+ Plotly.newPlot('graphContainer', plotData, layout);
142
+ }
143
+ </script>
144
+ </body></html>
L4wEay36Q7g8lapAY.html ADDED
@@ -0,0 +1,137 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://websim.ai" /><title>Websim.ai - Gallery</title><style>
2
+ body {
3
+ font-family: Arial, sans-serif;
4
+ margin: 0;
5
+ padding: 0;
6
+ background-color: #f0f0f0;
7
+ }
8
+ .container {
9
+ max-width: 1200px;
10
+ margin: 0 auto;
11
+ padding: 20px;
12
+ }
13
+ h1 {
14
+ text-align: center;
15
+ color: #333;
16
+ }
17
+ .gallery {
18
+ display: grid;
19
+ grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
20
+ grid-gap: 20px;
21
+ }
22
+ .gallery-item {
23
+ background-color: #fff;
24
+ border-radius: 8px;
25
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
26
+ overflow: hidden;
27
+ transition: transform 0.3s ease;
28
+ }
29
+ .gallery-item:hover {
30
+ transform: translateY(-5px);
31
+ }
32
+ .gallery-item img {
33
+ width: 100%;
34
+ height: 200px;
35
+ object-fit: cover;
36
+ }
37
+ .gallery-item-info {
38
+ padding: 15px;
39
+ }
40
+ .gallery-item-title {
41
+ font-weight: bold;
42
+ margin-bottom: 5px;
43
+ }
44
+ .gallery-item-description {
45
+ font-size: 14px;
46
+ color: #666;
47
+ }
48
+ .upload-form {
49
+ text-align: center;
50
+ margin-bottom: 30px;
51
+ }
52
+ .upload-form input[type="file"] {
53
+ display: none;
54
+ }
55
+ .upload-form label {
56
+ background-color: #4CAF50;
57
+ color: white;
58
+ padding: 10px 20px;
59
+ border-radius: 4px;
60
+ cursor: pointer;
61
+ display: inline-block;
62
+ }
63
+ .upload-form button {
64
+ background-color: #008CBA;
65
+ border: none;
66
+ color: white;
67
+ padding: 10px 20px;
68
+ text-align: center;
69
+ text-decoration: none;
70
+ display: inline-block;
71
+ font-size: 16px;
72
+ margin: 4px 2px;
73
+ cursor: pointer;
74
+ border-radius: 4px;
75
+ }
76
+ </style></head><body>
77
+ <div class="container">
78
+ <h1>Websim.ai Gallery</h1>
79
+ <form class="upload-form" action="https://websim.ai/gallery/upload" method="POST" enctype="multipart/form-data">
80
+ <label for="file-upload">Choose File</label>
81
+ <input id="file-upload" type="file" name="photo" accept="image/*" />
82
+ <button type="submit">Upload</button>
83
+ </form>
84
+ <div class="gallery">
85
+ <div class="gallery-item">
86
+ <img src="https://websim.ai/gallery/images/1.jpg" alt="AI-generated cityscape" width="250" height="200">
87
+ <div class="gallery-item-info">
88
+ <div class="gallery-item-title">Futuristic Metropolis</div>
89
+ <div class="gallery-item-description">An AI-generated cityscape featuring towering skyscrapers and flying vehicles.</div>
90
+ </div>
91
+ </div>
92
+ <div class="gallery-item">
93
+ <img src="https://websim.ai/gallery/images/2.jpg" alt="AI-created abstract art" width="250" height="200">
94
+ <div class="gallery-item-info">
95
+ <div class="gallery-item-title">Digital Dreamscape</div>
96
+ <div class="gallery-item-description">A vibrant and surreal abstract composition created by artificial intelligence.</div>
97
+ </div>
98
+ </div>
99
+ <div class="gallery-item">
100
+ <img src="https://websim.ai/gallery/images/3.jpg" alt="AI-designed character concept" width="250" height="200">
101
+ <div class="gallery-item-info">
102
+ <div class="gallery-item-title">Cybernetic Samurai</div>
103
+ <div class="gallery-item-description">A futuristic warrior concept blending traditional samurai aesthetics with advanced technology.</div>
104
+ </div>
105
+ </div>
106
+ <div class="gallery-item">
107
+ <img src="https://websim.ai/gallery/images/4.jpg" alt="AI-generated landscape" width="250" height="200">
108
+ <div class="gallery-item-info">
109
+ <div class="gallery-item-title">Ethereal Valleys</div>
110
+ <div class="gallery-item-description">A breathtaking alien landscape with impossibly floating islands and luminescent flora.</div>
111
+ </div>
112
+ </div>
113
+ <div class="gallery-item">
114
+ <img src="https://websim.ai/gallery/images/5.jpg" alt="AI-created product design" width="250" height="200">
115
+ <div class="gallery-item-info">
116
+ <div class="gallery-item-title">NeuroLink Pro</div>
117
+ <div class="gallery-item-description">A sleek, next-generation neural interface device conceptualized by AI.</div>
118
+ </div>
119
+ </div>
120
+ <div class="gallery-item">
121
+ <img src="https://websim.ai/gallery/images/6.jpg" alt="AI-generated portrait" width="250" height="200">
122
+ <div class="gallery-item-info">
123
+ <div class="gallery-item-title">Digital Muse</div>
124
+ <div class="gallery-item-description">A hauntingly beautiful AI-created portrait blending human and machine aesthetics.</div>
125
+ </div>
126
+ </div>
127
+ </div>
128
+ </div>
129
+ <script>
130
+ document.getElementById('file-upload').addEventListener('change', function() {
131
+ if (this.files && this.files[0]) {
132
+ var fileName = this.files[0].name;
133
+ this.nextElementSibling.innerHTML = 'Upload: ' + fileName;
134
+ }
135
+ });
136
+ </script>
137
+ </body></html>
M81S6FlWODilHEjfs.html ADDED
@@ -0,0 +1,194 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="temporal://we2"><title>Temporal Web Explorer 2.0</title>
2
+ <style>
3
+ body, html {
4
+ margin: 0;
5
+ padding: 0;
6
+ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
7
+ background: #f0f0f0;
8
+ color: #333;
9
+ height: 100%;
10
+ display: flex;
11
+ flex-direction: column;
12
+ }
13
+ header {
14
+ background: #4a90e2;
15
+ color: white;
16
+ padding: 1rem;
17
+ display: flex;
18
+ justify-content: space-between;
19
+ align-items: center;
20
+ }
21
+ h1 {
22
+ margin: 0;
23
+ font-size: 1.5rem;
24
+ }
25
+ main {
26
+ flex: 1;
27
+ display: flex;
28
+ overflow: hidden;
29
+ }
30
+ #timeline {
31
+ width: 200px;
32
+ background: #e0e0e0;
33
+ padding: 1rem;
34
+ overflow-y: auto;
35
+ }
36
+ #content {
37
+ flex: 1;
38
+ padding: 1rem;
39
+ overflow-y: auto;
40
+ }
41
+ .time-node {
42
+ cursor: pointer;
43
+ padding: 0.5rem;
44
+ margin-bottom: 0.5rem;
45
+ background: white;
46
+ border-radius: 4px;
47
+ transition: background 0.3s;
48
+ }
49
+ .time-node:hover {
50
+ background: #d0d0d0;
51
+ }
52
+ #url-bar {
53
+ display: flex;
54
+ padding: 0.5rem;
55
+ background: white;
56
+ }
57
+ #url-input {
58
+ flex: 1;
59
+ padding: 0.5rem;
60
+ border: 1px solid #ccc;
61
+ border-radius: 4px 0 0 4px;
62
+ }
63
+ #go-btn {
64
+ padding: 0.5rem 1rem;
65
+ background: #4a90e2;
66
+ color: white;
67
+ border: none;
68
+ border-radius: 0 4px 4px 0;
69
+ cursor: pointer;
70
+ }
71
+ #content-frame {
72
+ width: 100%;
73
+ height: calc(100% - 40px);
74
+ border: none;
75
+ }
76
+ </style>
77
+ </head>
78
+ <body>
79
+ <header>
80
+ <h1>Temporal Web Explorer 2.0</h1>
81
+ <div>
82
+ <span id="current-year">2023</span>
83
+ <input type="range" id="year-slider" min="1990" max="2050" value="2023">
84
+ </div>
85
+ </header>
86
+
87
+ <main>
88
+ <aside id="timeline">
89
+ <div class="time-node" data-year="1991">1991 - WWW Launched</div>
90
+ <div class="time-node" data-year="1995">1995 - JavaScript Introduced</div>
91
+ <div class="time-node" data-year="2000">2000 - Dot-com Bubble</div>
92
+ <div class="time-node" data-year="2004">2004 - Web 2.0 Era</div>
93
+ <div class="time-node" data-year="2007">2007 - iPhone Launch</div>
94
+ <div class="time-node" data-year="2010">2010 - Responsive Design</div>
95
+ <div class="time-node" data-year="2015">2015 - Rise of PWAs</div>
96
+ <div class="time-node" data-year="2020">2020 - COVID-19 Web Shift</div>
97
+ <div class="time-node" data-year="2023">2023 - AI Integration</div>
98
+ <div class="time-node" data-year="2025">2025 - Quantum Web?</div>
99
+ <div class="time-node" data-year="2030">2030 - Neural Interfaces</div>
100
+ </aside>
101
+
102
+ <section id="content">
103
+ <div id="url-bar">
104
+ <input type="text" id="url-input" placeholder="Enter a URL">
105
+ <button id="go-btn">Go</button>
106
+ </div>
107
+ <iframe id="content-frame" src="about:blank"></iframe>
108
+ </section>
109
+ </main>
110
+
111
+ <script>
112
+ const yearSlider = document.getElementById('year-slider');
113
+ const currentYear = document.getElementById('current-year');
114
+ const timeNodes = document.querySelectorAll('.time-node');
115
+ const urlInput = document.getElementById('url-input');
116
+ const goBtn = document.getElementById('go-btn');
117
+ const contentFrame = document.getElementById('content-frame');
118
+
119
+ yearSlider.addEventListener('input', (e) => {
120
+ const year = e.target.value;
121
+ currentYear.textContent = year;
122
+ updateContent(year);
123
+ });
124
+
125
+ timeNodes.forEach(node => {
126
+ node.addEventListener('click', () => {
127
+ const year = node.dataset.year;
128
+ yearSlider.value = year;
129
+ currentYear.textContent = year;
130
+ updateContent(year);
131
+ });
132
+ });
133
+
134
+ goBtn.addEventListener('click', () => {
135
+ const url = urlInput.value;
136
+ const year = yearSlider.value;
137
+ loadContent(url, year);
138
+ });
139
+
140
+ function updateContent(year) {
141
+ // Simulating content change based on year
142
+ contentFrame.srcdoc = `
143
+ <html>
144
+ <body style="font-family: Arial, sans-serif; padding: 20px;">
145
+ <h2>Web in ${year}</h2>
146
+ <p>This is a simulation of how the web might have looked or might look in ${year}.</p>
147
+ <p>Key characteristics:</p>
148
+ <ul>
149
+ ${getYearCharacteristics(year)}
150
+ </ul>
151
+ </body>
152
+ </html>
153
+ `;
154
+ }
155
+
156
+ function loadContent(url, year) {
157
+ // In a real application, this would load the actual content from the given URL
158
+ // For this simulation, we'll just display a message
159
+ contentFrame.srcdoc = `
160
+ <html>
161
+ <body style="font-family: Arial, sans-serif; padding: 20px;">
162
+ <h2>${url} in ${year}</h2>
163
+ <p>This would show how ${url} might have looked or might look in ${year}.</p>
164
+ <p>Features that might be present:</p>
165
+ <ul>
166
+ ${getYearCharacteristics(year)}
167
+ </ul>
168
+ </body>
169
+ </html>
170
+ `;
171
+ }
172
+
173
+ function getYearCharacteristics(year) {
174
+ const characteristics = {
175
+ 1991: "<li>Basic HTML</li><li>Limited styling</li><li>Text-based browsers</li>",
176
+ 1995: "<li>Table-based layouts</li><li>Animated GIFs</li><li>Early JavaScript</li>",
177
+ 2000: "<li>Flash intros</li><li>Frames</li><li>Bright color schemes</li>",
178
+ 2004: "<li>CSS for layout</li><li>AJAX</li><li>Social media integration</li>",
179
+ 2007: "<li>Mobile optimization begins</li><li>Web 2.0 design trends</li>",
180
+ 2010: "<li>Responsive design</li><li>Flat design trend</li><li>HTML5 and CSS3</li>",
181
+ 2015: "<li>Material Design influence</li><li>Progressive Web Apps</li><li>ES6 JavaScript</li>",
182
+ 2020: "<li>COVID-19 info banners</li><li>Dark mode options</li><li>WebAssembly</li>",
183
+ 2023: "<li>AI-driven personalization</li><li>Advanced animations</li><li>Improved accessibility</li>",
184
+ 2025: "<li>Quantum computing integration?</li><li>3D/VR websites?</li><li>Adaptive AI interfaces?</li>",
185
+ 2030: "<li>Neural interface compatibility?</li><li>Holographic displays?</li><li>Emotion-responsive design?</li>"
186
+ };
187
+
188
+ return characteristics[year] || "<li>Characteristics unknown for this year</li>";
189
+ }
190
+
191
+ // Initialize with current year
192
+ updateContent(yearSlider.value);
193
+ </script>
194
+ </body></html>
Ps5YOhyS41tGXMVR1.html ADDED
@@ -0,0 +1,129 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://websim.ai/tools/csv-to-map/" /><title>CSV to Map Converter - WebSim Tools</title><style>
2
+ body {
3
+ font-family: Arial, sans-serif;
4
+ line-height: 1.6;
5
+ color: #333;
6
+ max-width: 800px;
7
+ margin: 0 auto;
8
+ padding: 20px;
9
+ }
10
+ h1 {
11
+ color: #2c3e50;
12
+ }
13
+ textarea {
14
+ width: 100%;
15
+ height: 200px;
16
+ margin-bottom: 10px;
17
+ }
18
+ #output {
19
+ white-space: pre-wrap;
20
+ background-color: #f4f4f4;
21
+ border: 1px solid #ddd;
22
+ padding: 10px;
23
+ }
24
+ button {
25
+ background-color: #3498db;
26
+ color: white;
27
+ border: none;
28
+ padding: 10px 20px;
29
+ cursor: pointer;
30
+ }
31
+ button:hover {
32
+ background-color: #2980b9;
33
+ }
34
+ </style></head><body>
35
+ <h1>CSV to Map Converter</h1>
36
+ <p>This tool converts CSV data into an interactive map visualization. Upload your CSV file with latitude and longitude data to see your points plotted on a map.</p>
37
+
38
+ <textarea id="csvInput" placeholder="Paste your CSV data here or upload a file"></textarea>
39
+ <input type="file" id="fileInput" accept=".csv">
40
+ <button onclick="convertToMap()">Generate Map</button>
41
+
42
+ <div id="map" style="height: 400px; width: 100%;"></div>
43
+
44
+ <script src="https://unpkg.com/[email protected]/dist/leaflet.js"></script>
45
+ <link rel="stylesheet" href="https://unpkg.com/[email protected]/dist/leaflet.css" />
46
+
47
+ <script>
48
+ let map;
49
+
50
+ function initMap() {
51
+ map = L.map('map').setView([0, 0], 2);
52
+ L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
53
+ attribution: '© OpenStreetMap contributors'
54
+ }).addTo(map);
55
+ }
56
+
57
+ function convertToMap() {
58
+ const csvData = document.getElementById('csvInput').value;
59
+ const rows = csvData.split('\n').map(row => row.split(','));
60
+
61
+ if (!map) {
62
+ initMap();
63
+ } else {
64
+ map.eachLayer((layer) => {
65
+ if (layer instanceof L.Marker) {
66
+ map.removeLayer(layer);
67
+ }
68
+ });
69
+ }
70
+
71
+ const bounds = [];
72
+
73
+ rows.forEach(row => {
74
+ if (row.length >= 2) {
75
+ const lat = parseFloat(row[0]);
76
+ const lon = parseFloat(row[1]);
77
+ if (!isNaN(lat) && !isNaN(lon)) {
78
+ L.marker([lat, lon]).addTo(map);
79
+ bounds.push([lat, lon]);
80
+ }
81
+ }
82
+ });
83
+
84
+ if (bounds.length > 0) {
85
+ map.fitBounds(bounds);
86
+ }
87
+ }
88
+
89
+ document.getElementById('fileInput').addEventListener('change', (event) => {
90
+ const file = event.target.files[0];
91
+ const reader = new FileReader();
92
+ reader.onload = (e) => {
93
+ document.getElementById('csvInput').value = e.target.result;
94
+ };
95
+ reader.readAsText(file);
96
+ });
97
+
98
+ initMap();
99
+ </script>
100
+
101
+ <h2>How to Use</h2>
102
+ <ol>
103
+ <li>Prepare your CSV data with latitude and longitude columns.</li>
104
+ <li>Either paste your CSV data into the text area or upload a CSV file.</li>
105
+ <li>Click the "Generate Map" button to visualize your data.</li>
106
+ <li>The map will display markers for each valid coordinate pair in your data.</li>
107
+ </ol>
108
+
109
+ <h2>Example CSV Format</h2>
110
+ <pre>
111
+ latitude,longitude,name
112
+ 40.7128,-74.0060,New York City
113
+ 34.0522,-118.2437,Los Angeles
114
+ 41.8781,-87.6298,Chicago
115
+ </pre>
116
+
117
+ <p>Note: The tool expects the first two columns to be latitude and longitude, respectively. Additional columns are optional and can be used for marker labels or popups in future updates.</p>
118
+
119
+ <h2>Tips</h2>
120
+ <ul>
121
+ <li>Ensure your CSV data is clean and properly formatted.</li>
122
+ <li>Large datasets may take longer to process and display.</li>
123
+ <li>You can zoom and pan the map to explore your data points.</li>
124
+ </ul>
125
+
126
+ <footer>
127
+ <p>Created by WebSim Tools | <a href="https://websim.ai">Back to WebSim</a></p>
128
+ </footer>
129
+ </body></html>
QFpGduGpkyn6Hovga.html ADDED
@@ -0,0 +1,165 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="temporal://NASA/ISS/timeline"><title>NASA ISS Timeline - Temporal Archives</title>
2
+ <style>
3
+ body {
4
+ font-family: 'Arial', sans-serif;
5
+ background-color: #0a0a2a;
6
+ color: #e0e0ff;
7
+ margin: 0;
8
+ padding: 20px;
9
+ line-height: 1.6;
10
+ }
11
+ .container {
12
+ max-width: 1000px;
13
+ margin: 0 auto;
14
+ background: rgba(20, 20, 50, 0.7);
15
+ border-radius: 15px;
16
+ padding: 20px;
17
+ box-shadow: 0 0 20px rgba(100, 100, 255, 0.3);
18
+ }
19
+ h1 {
20
+ text-align: center;
21
+ color: #00ffff;
22
+ text-shadow: 0 0 10px #00ffff;
23
+ }
24
+ .timeline {
25
+ position: relative;
26
+ padding: 20px 0;
27
+ }
28
+ .timeline::before {
29
+ content: '';
30
+ position: absolute;
31
+ top: 0;
32
+ left: 50%;
33
+ width: 2px;
34
+ height: 100%;
35
+ background: linear-gradient(to bottom, #00ffff, #ff00ff);
36
+ box-shadow: 0 0 10px rgba(0, 255, 255, 0.5);
37
+ }
38
+ .entry {
39
+ margin-bottom: 50px;
40
+ position: relative;
41
+ }
42
+ .entry:nth-child(odd) {
43
+ margin-left: 50px;
44
+ }
45
+ .entry:nth-child(even) {
46
+ margin-left: calc(50% + 30px);
47
+ }
48
+ .entry::before {
49
+ content: '';
50
+ position: absolute;
51
+ top: 0;
52
+ left: -33px;
53
+ width: 16px;
54
+ height: 16px;
55
+ border-radius: 50%;
56
+ background-color: #ff00ff;
57
+ box-shadow: 0 0 10px #ff00ff;
58
+ }
59
+ .entry:nth-child(even)::before {
60
+ left: -47px;
61
+ }
62
+ .date {
63
+ font-weight: bold;
64
+ color: #ff00ff;
65
+ margin-bottom: 5px;
66
+ }
67
+ .event {
68
+ background: rgba(40, 40, 80, 0.7);
69
+ padding: 15px;
70
+ border-radius: 10px;
71
+ box-shadow: 0 0 15px rgba(0, 255, 255, 0.2);
72
+ }
73
+ @keyframes starTwinkle {
74
+ 0%, 100% { opacity: 1; }
75
+ 50% { opacity: 0.5; }
76
+ }
77
+ .star {
78
+ position: fixed;
79
+ width: 2px;
80
+ height: 2px;
81
+ background: white;
82
+ border-radius: 50%;
83
+ }
84
+ </style>
85
+ </head>
86
+ <body>
87
+ <div class="container">
88
+ <h1>NASA ISS Timeline - Temporal Archives</h1>
89
+ <div class="timeline">
90
+ <div class="entry">
91
+ <div class="date">1998</div>
92
+ <div class="event">First ISS module, Zarya, launched into orbit.</div>
93
+ </div>
94
+ <div class="entry">
95
+ <div class="date">2000</div>
96
+ <div class="event">First permanent crew (Expedition 1) arrives at the ISS.</div>
97
+ </div>
98
+ <div class="entry">
99
+ <div class="date">2005</div>
100
+ <div class="event">European Columbus laboratory module added to the ISS.</div>
101
+ </div>
102
+ <div class="entry">
103
+ <div class="date">2011</div>
104
+ <div class="event">NASA's Space Shuttle program ends, ISS assembly considered complete.</div>
105
+ </div>
106
+ <div class="entry">
107
+ <div class="date">2015</div>
108
+ <div class="event">Scott Kelly and Mikhail Kornienko begin their year-long mission in space.</div>
109
+ </div>
110
+ <div class="entry">
111
+ <div class="date">2020</div>
112
+ <div class="event">SpaceX Crew Dragon becomes the first commercial spacecraft to deliver astronauts to the ISS.</div>
113
+ </div>
114
+ <div class="entry">
115
+ <div class="date">2024</div>
116
+ <div class="event">ISS mission extended to 2030, plans for commercial successors initiated.</div>
117
+ </div>
118
+ <div class="entry">
119
+ <div class="date">2028</div>
120
+ <div class="event">First successful test of the Temporal Communication Array, allowing real-time communication with past ISS missions.</div>
121
+ </div>
122
+ <div class="entry">
123
+ <div class="date">2030</div>
124
+ <div class="event">ISS deorbited. Parts salvaged for the new International Lunar Gateway.</div>
125
+ </div>
126
+ <div class="entry">
127
+ <div class="date">2035</div>
128
+ <div class="event">Temporal research station established in Earth orbit, capable of observing ISS throughout its entire operational history.</div>
129
+ </div>
130
+ <div class="entry">
131
+ <div class="date">2040</div>
132
+ <div class="event">First successful "time-slice" experiment, recreating a perfect holographic simulation of the ISS at any point in its history.</div>
133
+ </div>
134
+ </div>
135
+ </div>
136
+
137
+ <script>
138
+ function createStars() {
139
+ const container = document.body;
140
+ for (let i = 0; i < 100; i++) {
141
+ const star = document.createElement('div');
142
+ star.className = 'star';
143
+ star.style.left = `${Math.random() * 100}%`;
144
+ star.style.top = `${Math.random() * 100}%`;
145
+ star.style.animationDuration = `${Math.random() * 3 + 1}s`;
146
+ star.style.animationDelay = `${Math.random() * 3}s`;
147
+ star.style.animation = 'starTwinkle infinite';
148
+ container.appendChild(star);
149
+ }
150
+ }
151
+
152
+ createStars();
153
+
154
+ document.addEventListener('DOMContentLoaded', (event) => {
155
+ const entries = document.querySelectorAll('.entry');
156
+ entries.forEach((entry, index) => {
157
+ setTimeout(() => {
158
+ entry.style.opacity = '1';
159
+ entry.style.transform = 'translateY(0)';
160
+ }, index * 300);
161
+ });
162
+ });
163
+ </script>
164
+
165
+ </body></html>
WJyIMIbmQYHTiRoGc.html ADDED
@@ -0,0 +1,188 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="temporal://NSA/database/history/timeline"><title>NSA Temporal Database - Historical Timeline</title>
2
+ <style>
3
+ body {
4
+ font-family: 'Courier New', monospace;
5
+ background-color: #000;
6
+ color: #00ff00;
7
+ margin: 0;
8
+ padding: 20px;
9
+ }
10
+ h1 {
11
+ text-align: center;
12
+ color: #00ff00;
13
+ text-shadow: 0 0 10px #00ff00;
14
+ }
15
+ .timeline {
16
+ position: relative;
17
+ max-width: 1200px;
18
+ margin: 0 auto;
19
+ }
20
+ .timeline::after {
21
+ content: '';
22
+ position: absolute;
23
+ width: 6px;
24
+ background-color: #00ff00;
25
+ top: 0;
26
+ bottom: 0;
27
+ left: 50%;
28
+ margin-left: -3px;
29
+ }
30
+ .container {
31
+ padding: 10px 40px;
32
+ position: relative;
33
+ background-color: inherit;
34
+ width: 50%;
35
+ }
36
+ .container::after {
37
+ content: '';
38
+ position: absolute;
39
+ width: 25px;
40
+ height: 25px;
41
+ right: -17px;
42
+ background-color: #000;
43
+ border: 4px solid #00ff00;
44
+ top: 15px;
45
+ border-radius: 50%;
46
+ z-index: 1;
47
+ }
48
+ .left {
49
+ left: 0;
50
+ }
51
+ .right {
52
+ left: 50%;
53
+ }
54
+ .left::before {
55
+ content: " ";
56
+ height: 0;
57
+ position: absolute;
58
+ top: 22px;
59
+ width: 0;
60
+ z-index: 1;
61
+ right: 30px;
62
+ border: medium solid #00ff00;
63
+ border-width: 10px 0 10px 10px;
64
+ border-color: transparent transparent transparent #00ff00;
65
+ }
66
+ .right::before {
67
+ content: " ";
68
+ height: 0;
69
+ position: absolute;
70
+ top: 22px;
71
+ width: 0;
72
+ z-index: 1;
73
+ left: 30px;
74
+ border: medium solid #00ff00;
75
+ border-width: 10px 10px 10px 0;
76
+ border-color: transparent #00ff00 transparent transparent;
77
+ }
78
+ .right::after {
79
+ left: -16px;
80
+ }
81
+ .content {
82
+ padding: 20px 30px;
83
+ background-color: #001a00;
84
+ position: relative;
85
+ border-radius: 6px;
86
+ border: 1px solid #00ff00;
87
+ box-shadow: 0 0 10px #00ff00;
88
+ }
89
+ @keyframes flicker {
90
+ 0% { opacity: 0.8; }
91
+ 50% { opacity: 1; }
92
+ 100% { opacity: 0.8; }
93
+ }
94
+ .flicker {
95
+ animation: flicker 2s infinite;
96
+ }
97
+ </style>
98
+ </head>
99
+ <body>
100
+ <h1 class="flicker">NSA Temporal Database - Historical Timeline</h1>
101
+ <div class="timeline">
102
+ <div class="container left">
103
+ <div class="content">
104
+ <h2>1947</h2>
105
+ <p>National Security Act establishes the NSA's precursor, the Armed Forces Security Agency (AFSA).</p>
106
+ </div>
107
+ </div>
108
+ <div class="container right">
109
+ <div class="content">
110
+ <h2>1952</h2>
111
+ <p>President Truman secretly creates the National Security Agency (NSA) to focus on code breaking and signals intelligence.</p>
112
+ </div>
113
+ </div>
114
+ <div class="container left">
115
+ <div class="content">
116
+ <h2>1960</h2>
117
+ <p>NSA moves to its current headquarters at Fort Meade, Maryland.</p>
118
+ </div>
119
+ </div>
120
+ <div class="container right">
121
+ <div class="content">
122
+ <h2>1975</h2>
123
+ <p>Church Committee investigates intelligence abuses, leading to increased oversight of NSA activities.</p>
124
+ </div>
125
+ </div>
126
+ <div class="container left">
127
+ <div class="content">
128
+ <h2>1986</h2>
129
+ <p>Electronic Communications Privacy Act (ECPA) extends wiretap protections to electronic communications.</p>
130
+ </div>
131
+ </div>
132
+ <div class="container right">
133
+ <div class="content">
134
+ <h2>2001</h2>
135
+ <p>After 9/11, NSA expands domestic surveillance under the PATRIOT Act.</p>
136
+ </div>
137
+ </div>
138
+ <div class="container left">
139
+ <div class="content">
140
+ <h2>2013</h2>
141
+ <p>Edward Snowden leaks classified NSA documents, revealing extent of global surveillance programs.</p>
142
+ </div>
143
+ </div>
144
+ <div class="container right">
145
+ <div class="content">
146
+ <h2>2015</h2>
147
+ <p>USA FREEDOM Act passes, ending bulk collection of Americans' phone records.</p>
148
+ </div>
149
+ </div>
150
+ <div class="container left">
151
+ <div class="content">
152
+ <h2>2020</h2>
153
+ <p>NSA warns of ongoing Russian cyber attacks against U.S. systems.</p>
154
+ </div>
155
+ </div>
156
+ <div class="container right">
157
+ <div class="content">
158
+ <h2>2023</h2>
159
+ <p>Temporal Database Project initiated to analyze historical data patterns and predict future security threats.</p>
160
+ </div>
161
+ </div>
162
+ <div class="container left">
163
+ <div class="content">
164
+ <h2>2025</h2>
165
+ <p>First successful retroactive intelligence gathering operation using temporal technology.</p>
166
+ </div>
167
+ </div>
168
+ <div class="container right">
169
+ <div class="content">
170
+ <h2>2030</h2>
171
+ <p>Temporal Database fully operational, allowing NSA to monitor past, present, and potential future security threats.</p>
172
+ </div>
173
+ </div>
174
+ </div>
175
+
176
+ <script>
177
+ document.addEventListener('DOMContentLoaded', (event) => {
178
+ const containers = document.querySelectorAll('.container');
179
+ containers.forEach((container, index) => {
180
+ setTimeout(() => {
181
+ container.style.opacity = '1';
182
+ container.style.transform = 'translateY(0)';
183
+ }, index * 300);
184
+ });
185
+ });
186
+ </script>
187
+
188
+ </body></html>
iH4W4D72RE1n2BH37.html ADDED
@@ -0,0 +1,291 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://websim.ai"/><title>Trivia Generator</title><style>
2
+ @import url('https://fonts.googleapis.com/css2?family=Montserrat:wght@700&display=swap');
3
+ body {
4
+ font-family: 'Montserrat', sans-serif;
5
+ font-weight: 700;
6
+ line-height: 1.6;
7
+ color: #e0e0e0;
8
+ max-width: 800px;
9
+ margin: 0 auto;
10
+ padding: 20px;
11
+ background-color: #2a2a2a;
12
+ position: relative;
13
+ overflow-x: hidden;
14
+ overflow-y: auto;
15
+ text-transform: uppercase;
16
+ }
17
+ body::before {
18
+ content: '';
19
+ position: fixed;
20
+ top: 0;
21
+ left: 0;
22
+ width: 100%;
23
+ height: 100%;
24
+ pointer-events: none;
25
+ background-image:
26
+ radial-gradient(white, rgba(255,255,255,.2) 2px, transparent 2px),
27
+ radial-gradient(white, rgba(255,255,255,.15) 1px, transparent 1px),
28
+ radial-gradient(white, rgba(255,255,255,.1) 2px, transparent 2px),
29
+ radial-gradient(rgba(255,255,255,.4), rgba(255,255,255,.1) 2px, transparent 2px);
30
+ background-size: 550px 550px, 350px 350px, 250px 250px, 150px 150px;
31
+ background-position: 0 0, 40px 60px, 130px 270px, 70px 100px;
32
+ animation: starsAnimation 200s linear infinite;
33
+ }
34
+ @keyframes starsAnimation {
35
+ 0% { background-position: 0 0, 40px 60px, 130px 270px, 70px 100px; }
36
+ 100% { background-position: 550px 550px, 390px 410px, 380px 520px, 220px 250px; }
37
+ }
38
+ .star-connections {
39
+ position: fixed;
40
+ top: 0;
41
+ left: 0;
42
+ width: 100%;
43
+ height: 100%;
44
+ pointer-events: none;
45
+ }
46
+ h1 {
47
+ color: #c0c0c0;
48
+ text-align: center;
49
+ text-shadow: 0 0 10px rgba(192,192,192,0.5);
50
+ }
51
+ #topic-form {
52
+ margin-bottom: 20px;
53
+ text-align: center;
54
+ }
55
+ #topic-input {
56
+ width: 70%;
57
+ padding: 10px;
58
+ font-size: 16px;
59
+ background-color: #3a3a3a;
60
+ color: #e0e0e0;
61
+ border: 1px solid #808080;
62
+ border-radius: 5px;
63
+ font-family: 'Montserrat', sans-serif;
64
+ font-weight: 700;
65
+ text-transform: uppercase;
66
+ }
67
+ #generate-btn {
68
+ padding: 10px 20px;
69
+ font-size: 16px;
70
+ background-color: #808080;
71
+ color: #2a2a2a;
72
+ border: none;
73
+ cursor: pointer;
74
+ transition: background-color 0.3s;
75
+ border-radius: 5px;
76
+ font-family: 'Montserrat', sans-serif;
77
+ font-weight: 700;
78
+ text-transform: uppercase;
79
+ }
80
+ #generate-btn:hover {
81
+ background-color: #a0a0a0;
82
+ }
83
+ #trivia-container {
84
+ background-color: #3a3a3a;
85
+ padding: 20px;
86
+ border-radius: 5px;
87
+ box-shadow: 0 2px 5px rgba(0,0,0,0.3);
88
+ }
89
+ .question {
90
+ margin-bottom: 20px;
91
+ padding: 15px;
92
+ background-color: #4a4a4a;
93
+ border-radius: 5px;
94
+ box-shadow: 0 0 10px rgba(128,128,128,0.1);
95
+ }
96
+ .options {
97
+ list-style-type: none;
98
+ padding-left: 0;
99
+ }
100
+ .options li {
101
+ margin-bottom: 10px;
102
+ padding: 10px;
103
+ background-color: #2a2a2a;
104
+ border-radius: 3px;
105
+ cursor: pointer;
106
+ transition: background-color 0.3s;
107
+ }
108
+ .options li:hover {
109
+ background-color: #5a5a5a;
110
+ }
111
+ .selected {
112
+ background-color: #808080 !important;
113
+ color: #2a2a2a;
114
+ }
115
+ #score-container {
116
+ text-align: center;
117
+ margin-top: 20px;
118
+ font-size: 18px;
119
+ font-weight: bold;
120
+ color: #c0c0c0;
121
+ }
122
+ .correct {
123
+ background-color: #4caf50 !important;
124
+ color: #2a2a2a;
125
+ }
126
+ .incorrect {
127
+ background-color: #f44336 !important;
128
+ color: #2a2a2a;
129
+ }
130
+ #loading {
131
+ text-align: center;
132
+ font-size: 18px;
133
+ margin-top: 20px;
134
+ display: none;
135
+ color: #c0c0c0;
136
+ }
137
+ </style></head><body>
138
+ <h1>TRIVIA GENERATOR</h1>
139
+ <form id="topic-form">
140
+ <input type="text" id="topic-input" name="topic" placeholder="ENTER A TOPIC FOR YOUR TRIVIA QUESTIONS" required>
141
+ <button type="submit" id="generate-btn">GENERATE TRIVIA</button>
142
+ </form>
143
+ <div id="loading">GENERATING QUESTIONS...</div>
144
+ <div id="trivia-container"></div>
145
+ <div id="score-container"></div>
146
+
147
+ <canvas class="star-connections"></canvas>
148
+
149
+ <script>
150
+ const topicForm = document.getElementById('topic-form');
151
+ const triviaContainer = document.getElementById('trivia-container');
152
+ const scoreContainer = document.getElementById('score-container');
153
+ const loadingDiv = document.getElementById('loading');
154
+ let questions = [];
155
+ let score = 0;
156
+
157
+ // Star connection animation
158
+ const canvas = document.querySelector('.star-connections');
159
+ const ctx = canvas.getContext('2d');
160
+ canvas.width = window.innerWidth;
161
+ canvas.height = window.innerHeight;
162
+
163
+ class Star {
164
+ constructor() {
165
+ this.x = Math.random() * canvas.width;
166
+ this.y = Math.random() * canvas.height;
167
+ this.size = Math.random() * 1.5 + 0.5;
168
+ this.speedX = Math.random() * 0.5 - 0.25;
169
+ this.speedY = Math.random() * 0.5 - 0.25;
170
+ }
171
+ update() {
172
+ this.x += this.speedX;
173
+ this.y += this.speedY;
174
+ if (this.x < 0 || this.x > canvas.width) this.speedX *= -1;
175
+ if (this.y < 0 || this.y > canvas.height) this.speedY *= -1;
176
+ }
177
+ draw() {
178
+ ctx.fillStyle = 'rgba(255, 255, 255, 0.8)';
179
+ ctx.beginPath();
180
+ ctx.arc(this.x, this.y, this.size, 0, Math.PI * 2);
181
+ ctx.fill();
182
+ }
183
+ }
184
+
185
+ const stars = [];
186
+ for (let i = 0; i < 100; i++) {
187
+ stars.push(new Star());
188
+ }
189
+
190
+ function animate() {
191
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
192
+ stars.forEach(star => {
193
+ star.update();
194
+ star.draw();
195
+ });
196
+ stars.forEach((star, index) => {
197
+ for (let j = index + 1; j < stars.length; j++) {
198
+ const dx = star.x - stars[j].x;
199
+ const dy = star.y - stars[j].y;
200
+ const distance = Math.sqrt(dx * dx + dy * dy);
201
+ if (distance < 100) {
202
+ ctx.strokeStyle = `rgba(255, 255, 255, ${1 - distance / 100})`;
203
+ ctx.beginPath();
204
+ ctx.moveTo(star.x, star.y);
205
+ ctx.lineTo(stars[j].x, stars[j].y);
206
+ ctx.stroke();
207
+ }
208
+ }
209
+ });
210
+ requestAnimationFrame(animate);
211
+ }
212
+ animate();
213
+
214
+ topicForm.addEventListener('submit', async (e) => {
215
+ e.preventDefault();
216
+ const topic = document.getElementById('topic-input').value;
217
+ loadingDiv.style.display = 'block';
218
+ triviaContainer.innerHTML = '';
219
+ scoreContainer.innerHTML = '';
220
+ score = 0;
221
+
222
+ try {
223
+ const response = await fetch('/api/trivia', {
224
+ method: 'POST',
225
+ headers: {
226
+ 'Content-Type': 'application/json',
227
+ },
228
+ body: JSON.stringify({ topic: topic })
229
+ });
230
+
231
+ if (!response.ok) {
232
+ throw new Error(`HTTP error! status: ${response.status}`);
233
+ }
234
+
235
+ const data = await response.json();
236
+ questions = data.questions || [];
237
+ if (questions.length > 0) {
238
+ displayQuestions(questions);
239
+ } else {
240
+ triviaContainer.innerHTML = '<p>NO QUESTIONS GENERATED. PLEASE TRY A DIFFERENT TOPIC.</p>';
241
+ }
242
+ } catch (error) {
243
+ console.error('Error fetching trivia questions:', error);
244
+ triviaContainer.innerHTML = '<p>ERROR GENERATING TRIVIA QUESTIONS. PLEASE TRY AGAIN.</p>';
245
+ } finally {
246
+ loadingDiv.style.display = 'none';
247
+ }
248
+ });
249
+
250
+ function displayQuestions(questions) {
251
+ triviaContainer.innerHTML = questions.map((q, index) => `
252
+ <div class="question">
253
+ <h3>QUESTION ${index + 1}: ${q.question.toUpperCase()}</h3>
254
+ <ul class="options">
255
+ ${q.options.map((option, optIndex) => `
256
+ <li data-question="${index}" data-option="${optIndex}">${option.toUpperCase()}</li>
257
+ `).join('')}
258
+ </ul>
259
+ </div>
260
+ `).join('');
261
+
262
+ triviaContainer.addEventListener('click', (e) => {
263
+ if (e.target.tagName === 'LI' && !e.target.classList.contains('selected')) {
264
+ const questionIndex = parseInt(e.target.dataset.question);
265
+ const optionIndex = parseInt(e.target.dataset.option);
266
+ const questionOptions = e.target.parentElement.children;
267
+
268
+ for (let option of questionOptions) {
269
+ option.classList.remove('selected', 'correct', 'incorrect');
270
+ }
271
+ e.target.classList.add('selected');
272
+
273
+ const correctAnswer = questions[questionIndex].correctAnswer;
274
+ questionOptions[correctAnswer].classList.add('correct');
275
+
276
+ if (optionIndex === correctAnswer) {
277
+ score++;
278
+ } else {
279
+ e.target.classList.add('incorrect');
280
+ }
281
+
282
+ updateScore();
283
+ }
284
+ });
285
+ }
286
+
287
+ function updateScore() {
288
+ scoreContainer.textContent = `YOUR SCORE: ${score} OUT OF ${questions.length}`;
289
+ }
290
+ </script>
291
+ </body></html>
mAxM36dFcDK4ZG2uS.html ADDED
@@ -0,0 +1,260 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://websim.ai" />
2
+ <title>2D Button Playground with Physics and Links</title>
3
+ <style>
4
+ body {
5
+ margin: 0;
6
+ padding: 0;
7
+ overflow: hidden;
8
+ background-color: #f0f0f0;
9
+ font-family: Arial, sans-serif;
10
+ }
11
+ #playground {
12
+ width: 100vw;
13
+ height: 100vh;
14
+ position: relative;
15
+ }
16
+ .button {
17
+ position: absolute;
18
+ padding: 10px 20px;
19
+ background-color: #4CAF50;
20
+ color: white;
21
+ border: none;
22
+ border-radius: 5px;
23
+ cursor: grab;
24
+ user-select: none;
25
+ box-shadow: 0 4px 8px rgba(0,0,0,0.1);
26
+ transition: box-shadow 0.3s ease;
27
+ text-decoration: none;
28
+ display: inline-block;
29
+ }
30
+ .button:hover {
31
+ box-shadow: 0 6px 12px rgba(0,0,0,0.15);
32
+ }
33
+ .button:active {
34
+ cursor: grabbing;
35
+ box-shadow: 0 2px 4px rgba(0,0,0,0.1);
36
+ }
37
+ #ground {
38
+ position: absolute;
39
+ bottom: 0;
40
+ left: 0;
41
+ right: 0;
42
+ height: 50px;
43
+ background-color: #8B4513;
44
+ }
45
+ </style>
46
+ </head>
47
+ <body>
48
+ <div id="playground">
49
+ <a href="https://websim.ai/button1" class="button" style="left: 100px; top: 100px;">Button 1</a>
50
+ <a href="https://websim.ai/button2" class="button" style="left: 250px; top: 150px;">Button 2</a>
51
+ <a href="https://websim.ai/button3" class="button" style="left: 400px; top: 200px;">Button 3</a>
52
+ <div id="ground"></div>
53
+ </div>
54
+
55
+ <script>
56
+ const playground = document.getElementById('playground');
57
+ const buttons = document.querySelectorAll('.button');
58
+ const ground = document.getElementById('ground');
59
+
60
+ let isDragging = false;
61
+ let currentButton = null;
62
+ let offsetX, offsetY;
63
+ let dragStartTime;
64
+
65
+ const physics = {
66
+ gravity: 0.5,
67
+ friction: 0.98,
68
+ bounce: 0.7,
69
+ buttons: []
70
+ };
71
+
72
+ buttons.forEach(button => {
73
+ button.addEventListener('mousedown', startDragging);
74
+ button.addEventListener('touchstart', startDragging);
75
+
76
+ physics.buttons.push({
77
+ element: button,
78
+ x: parseInt(button.style.left),
79
+ y: parseInt(button.style.top),
80
+ vx: 0,
81
+ vy: 0
82
+ });
83
+ });
84
+
85
+ document.addEventListener('mousemove', drag);
86
+ document.addEventListener('touchmove', drag);
87
+
88
+ document.addEventListener('mouseup', stopDragging);
89
+ document.addEventListener('touchend', stopDragging);
90
+
91
+ function startDragging(e) {
92
+ e.preventDefault();
93
+ isDragging = true;
94
+ currentButton = e.target;
95
+ const rect = currentButton.getBoundingClientRect();
96
+
97
+ if (e.type === 'mousedown') {
98
+ offsetX = e.clientX - rect.left;
99
+ offsetY = e.clientY - rect.top;
100
+ } else if (e.type === 'touchstart') {
101
+ offsetX = e.touches[0].clientX - rect.left;
102
+ offsetY = e.touches[0].clientY - rect.top;
103
+ }
104
+
105
+ currentButton.style.zIndex = 1000;
106
+ dragStartTime = Date.now();
107
+ }
108
+
109
+ function drag(e) {
110
+ if (!isDragging) return;
111
+ e.preventDefault();
112
+
113
+ let clientX, clientY;
114
+
115
+ if (e.type === 'mousemove') {
116
+ clientX = e.clientX;
117
+ clientY = e.clientY;
118
+ } else if (e.type === 'touchmove') {
119
+ clientX = e.touches[0].clientX;
120
+ clientY = e.touches[0].clientY;
121
+ }
122
+
123
+ const x = clientX - offsetX;
124
+ const y = clientY - offsetY;
125
+
126
+ const buttonPhysics = physics.buttons.find(b => b.element === currentButton);
127
+ buttonPhysics.x = x;
128
+ buttonPhysics.y = y;
129
+ buttonPhysics.vx = 0;
130
+ buttonPhysics.vy = 0;
131
+ }
132
+
133
+ function stopDragging(e) {
134
+ if (!isDragging) return;
135
+
136
+ isDragging = false;
137
+ if (currentButton) {
138
+ currentButton.style.zIndex = 'auto';
139
+
140
+ // If the drag duration is less than 200ms, treat it as a click
141
+ if (Date.now() - dragStartTime < 200) {
142
+ e.preventDefault(); // Prevent default link behavior
143
+ window.location.href = currentButton.href;
144
+ }
145
+
146
+ currentButton = null;
147
+ }
148
+ }
149
+
150
+ function update() {
151
+ const groundY = playground.clientHeight - ground.clientHeight;
152
+
153
+ physics.buttons.forEach(button => {
154
+ if (isDragging && button.element === currentButton) return;
155
+
156
+ button.vy += physics.gravity;
157
+ button.x += button.vx;
158
+ button.y += button.vy;
159
+
160
+ // Ground collision
161
+ if (button.y + button.element.offsetHeight > groundY) {
162
+ button.y = groundY - button.element.offsetHeight;
163
+ button.vy *= -physics.bounce;
164
+ }
165
+
166
+ // Wall collisions
167
+ if (button.x < 0) {
168
+ button.x = 0;
169
+ button.vx *= -physics.bounce;
170
+ } else if (button.x + button.element.offsetWidth > playground.clientWidth) {
171
+ button.x = playground.clientWidth - button.element.offsetWidth;
172
+ button.vx *= -physics.bounce;
173
+ }
174
+
175
+ // Button-to-button collisions
176
+ physics.buttons.forEach(otherButton => {
177
+ if (button !== otherButton) {
178
+ const dx = otherButton.x - button.x;
179
+ const dy = otherButton.y - button.y;
180
+ const distance = Math.sqrt(dx * dx + dy * dy);
181
+ const minDistance = (button.element.offsetWidth + otherButton.element.offsetWidth) / 2;
182
+
183
+ if (distance < minDistance) {
184
+ const angle = Math.atan2(dy, dx);
185
+ const targetX = button.x + Math.cos(angle) * minDistance;
186
+ const targetY = button.y + Math.sin(angle) * minDistance;
187
+ const ax = (targetX - otherButton.x) * 0.05;
188
+ const ay = (targetY - otherButton.y) * 0.05;
189
+
190
+ button.vx -= ax;
191
+ button.vy -= ay;
192
+ otherButton.vx += ax;
193
+ otherButton.vy += ay;
194
+ }
195
+ }
196
+ });
197
+
198
+ button.vx *= physics.friction;
199
+ button.vy *= physics.friction;
200
+
201
+ button.element.style.left = `${button.x}px`;
202
+ button.element.style.top = `${button.y}px`;
203
+ });
204
+
205
+ requestAnimationFrame(update);
206
+ }
207
+
208
+ // Create new button on double click
209
+ playground.addEventListener('dblclick', (e) => {
210
+ const newButton = document.createElement('a');
211
+ newButton.className = 'button';
212
+ newButton.textContent = `Button ${physics.buttons.length + 1}`;
213
+ newButton.href = `https://websim.ai/button${physics.buttons.length + 1}`;
214
+ playground.appendChild(newButton);
215
+ newButton.addEventListener('mousedown', startDragging);
216
+ newButton.addEventListener('touchstart', startDragging);
217
+
218
+ const buttonPhysics = {
219
+ element: newButton,
220
+ x: e.clientX - newButton.offsetWidth / 2,
221
+ y: e.clientY - newButton.offsetHeight / 2,
222
+ vx: 0,
223
+ vy: 0
224
+ };
225
+
226
+ physics.buttons.push(buttonPhysics);
227
+ });
228
+
229
+ // Handle window resize
230
+ window.addEventListener('resize', () => {
231
+ const groundY = playground.clientHeight - ground.clientHeight;
232
+ physics.buttons.forEach(button => {
233
+ if (button.y + button.element.offsetHeight > groundY) {
234
+ button.y = groundY - button.element.offsetHeight;
235
+ }
236
+ if (button.x + button.element.offsetWidth > playground.clientWidth) {
237
+ button.x = playground.clientWidth - button.element.offsetWidth;
238
+ }
239
+ });
240
+ });
241
+
242
+ // Move button with mouse when clicked
243
+ document.addEventListener('mousemove', (e) => {
244
+ if (isDragging && currentButton) {
245
+ const buttonPhysics = physics.buttons.find(b => b.element === currentButton);
246
+ buttonPhysics.x = e.clientX - offsetX;
247
+ buttonPhysics.y = e.clientY - offsetY;
248
+
249
+ // Ensure the button stays within the playground
250
+ buttonPhysics.x = Math.max(0, Math.min(buttonPhysics.x, playground.clientWidth - currentButton.offsetWidth));
251
+ buttonPhysics.y = Math.max(0, Math.min(buttonPhysics.y, playground.clientHeight - ground.clientHeight - currentButton.offsetHeight));
252
+
253
+ currentButton.style.left = `${buttonPhysics.x}px`;
254
+ currentButton.style.top = `${buttonPhysics.y}px`;
255
+ }
256
+ });
257
+
258
+ update();
259
+ </script>
260
+ </body></html>
naiXzEd0u73SdiL9x.html ADDED
@@ -0,0 +1,321 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://websim.ai/">
2
+ <title>MoonLander 3D - Landing on the Lunar Base</title>
3
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
4
+ <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
5
+ <style>
6
+ body, html {
7
+ margin: 0;
8
+ padding: 0;
9
+ height: 100%;
10
+ overflow: hidden;
11
+ font-family: Arial, sans-serif;
12
+ touch-action: none;
13
+ }
14
+ #info {
15
+ position: absolute;
16
+ top: 10px;
17
+ width: 100%;
18
+ text-align: center;
19
+ color: #ffffff;
20
+ font-size: 16px;
21
+ text-shadow: 1px 1px 1px rgba(0,0,0,0.5);
22
+ pointer-events: none;
23
+ }
24
+ #controls {
25
+ position: absolute;
26
+ bottom: 20px;
27
+ left: 0;
28
+ right: 0;
29
+ display: flex;
30
+ justify-content: space-around;
31
+ align-items: center;
32
+ }
33
+ .control-btn {
34
+ width: 60px;
35
+ height: 60px;
36
+ background-color: rgba(255,255,255,0.2);
37
+ border: 2px solid white;
38
+ border-radius: 50%;
39
+ color: white;
40
+ font-size: 24px;
41
+ display: flex;
42
+ justify-content: center;
43
+ align-items: center;
44
+ user-select: none;
45
+ }
46
+ #thrustControl {
47
+ width: 100px;
48
+ height: 100px;
49
+ font-size: 36px;
50
+ }
51
+ #startBtn, #resetBtn {
52
+ background-color: rgba(0,255,0,0.3);
53
+ border: none;
54
+ color: white;
55
+ padding: 10px 20px;
56
+ font-size: 16px;
57
+ border-radius: 5px;
58
+ }
59
+ #resetBtn {
60
+ background-color: rgba(255,0,0,0.3);
61
+ }
62
+ #telemetry {
63
+ position: absolute;
64
+ top: 50px;
65
+ left: 10px;
66
+ color: white;
67
+ font-size: 14px;
68
+ text-shadow: 1px 1px 1px rgba(0,0,0,0.5);
69
+ }
70
+ </style>
71
+ </head>
72
+ <body>
73
+ <div id="info">MoonLander 3D - Press Start to begin landing!</div>
74
+ <div id="telemetry"></div>
75
+ <div id="controls">
76
+ <div id="leftBtn" class="control-btn">⬅️</div>
77
+ <div id="thrustControl" class="control-btn">🚀</div>
78
+ <div id="rightBtn" class="control-btn">➡️</div>
79
+ </div>
80
+ <div id="controls" style="bottom: 100px;">
81
+ <button id="startBtn">Start</button>
82
+ <button id="resetBtn">Reset</button>
83
+ </div>
84
+ <script>
85
+ let scene, camera, renderer, lander, moonTerrain, moonBase;
86
+ let engineFlame;
87
+ let isLanding = false;
88
+ let velocity = new THREE.Vector3();
89
+ let acceleration = new THREE.Vector3();
90
+ const gravity = new THREE.Vector3(0, -1.62, 0);
91
+ let fuel = 100;
92
+ const initialAltitude = 1000;
93
+ let altitude = initialAltitude;
94
+ let thrustPower = 5;
95
+
96
+ function init() {
97
+ scene = new THREE.Scene();
98
+ camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 2000);
99
+ camera.position.set(0, 500, 1000);
100
+ camera.lookAt(0, 0, 0);
101
+
102
+ renderer = new THREE.WebGLRenderer({ antialias: true });
103
+ renderer.setSize(window.innerWidth, window.innerHeight);
104
+ document.body.appendChild(renderer.domElement);
105
+
106
+ const ambientLight = new THREE.AmbientLight(0x404040);
107
+ scene.add(ambientLight);
108
+
109
+ const directionalLight = new THREE.DirectionalLight(0xffffff, 0.5);
110
+ directionalLight.position.set(1, 1, 1);
111
+ scene.add(directionalLight);
112
+
113
+ createMoonTerrain();
114
+ createMoonBase();
115
+ createLander();
116
+
117
+ window.addEventListener('resize', onWindowResize, false);
118
+
119
+ document.getElementById('leftBtn').addEventListener('touchstart', () => { if(isLanding) acceleration.x = -2; });
120
+ document.getElementById('leftBtn').addEventListener('touchend', () => { if(isLanding) acceleration.x = 0; });
121
+ document.getElementById('rightBtn').addEventListener('touchstart', () => { if(isLanding) acceleration.x = 2; });
122
+ document.getElementById('rightBtn').addEventListener('touchend', () => { if(isLanding) acceleration.x = 0; });
123
+ document.getElementById('thrustControl').addEventListener('touchstart', () => { if(isLanding) activateThrust(); });
124
+ document.getElementById('thrustControl').addEventListener('touchend', () => { if(isLanding) deactivateThrust(); });
125
+
126
+ document.getElementById('startBtn').addEventListener('click', startLanding);
127
+ document.getElementById('resetBtn').addEventListener('click', resetLanding);
128
+
129
+ resetLanding();
130
+ animate();
131
+ }
132
+
133
+ function createMoonTerrain() {
134
+ const moonGeometry = new THREE.PlaneGeometry(2000, 2000, 200, 200);
135
+ const moonMaterial = new THREE.MeshPhongMaterial({
136
+ color: 0x888888,
137
+ shininess: 0,
138
+ flatShading: true
139
+ });
140
+
141
+ const vertices = moonGeometry.attributes.position.array;
142
+ for (let i = 0; i < vertices.length; i += 3) {
143
+ vertices[i + 2] = Math.random() * 50 - 25;
144
+ }
145
+ moonGeometry.computeVertexNormals();
146
+
147
+ moonTerrain = new THREE.Mesh(moonGeometry, moonMaterial);
148
+ moonTerrain.rotation.x = -Math.PI / 2;
149
+ scene.add(moonTerrain);
150
+ }
151
+
152
+ function createMoonBase() {
153
+ const baseGeometry = new THREE.BoxGeometry(100, 50, 100);
154
+ const baseMaterial = new THREE.MeshPhongMaterial({ color: 0xcccccc });
155
+ moonBase = new THREE.Mesh(baseGeometry, baseMaterial);
156
+ moonBase.position.set(0, 25, 0);
157
+ scene.add(moonBase);
158
+
159
+ const windowGeometry = new THREE.PlaneGeometry(10, 10);
160
+ const windowMaterial = new THREE.MeshPhongMaterial({ color: 0x00ffff, emissive: 0x00ffff, emissiveIntensity: 0.5 });
161
+
162
+ for (let i = 0; i < 4; i++) {
163
+ const window = new THREE.Mesh(windowGeometry, windowMaterial);
164
+ window.position.set(-45, 25, -30 + i * 20);
165
+ window.rotation.y = Math.PI / 2;
166
+ moonBase.add(window);
167
+ }
168
+
169
+ const platformGeometry = new THREE.BoxGeometry(60, 2, 60);
170
+ const platformMaterial = new THREE.MeshPhongMaterial({ color: 0xffff00 });
171
+ const landingPlatform = new THREE.Mesh(platformGeometry, platformMaterial);
172
+ landingPlatform.position.set(0, 26, 0);
173
+ moonBase.add(landingPlatform);
174
+ }
175
+
176
+ function createLander() {
177
+ lander = new THREE.Group();
178
+
179
+ const bodyGeometry = new THREE.CylinderGeometry(5, 5, 10, 16);
180
+ const bodyMaterial = new THREE.MeshPhongMaterial({ color: 0xcccccc });
181
+ const body = new THREE.Mesh(bodyGeometry, bodyMaterial);
182
+ lander.add(body);
183
+
184
+ const legGeometry = new THREE.CylinderGeometry(0.5, 0.5, 8, 8);
185
+ const legMaterial = new THREE.MeshPhongMaterial({ color: 0x888888 });
186
+
187
+ for (let i = 0; i < 4; i++) {
188
+ const leg = new THREE.Mesh(legGeometry, legMaterial);
189
+ leg.position.set(Math.cos(i * Math.PI / 2) * 4, -9, Math.sin(i * Math.PI / 2) * 4);
190
+ leg.rotation.x = Math.PI / 6;
191
+ leg.rotation.z = i * Math.PI / 2;
192
+ lander.add(leg);
193
+
194
+ const foot = new THREE.Mesh(new THREE.SphereGeometry(0.8, 8, 8), legMaterial);
195
+ foot.position.set(Math.cos(i * Math.PI / 2) * 5.5, -13, Math.sin(i * Math.PI / 2) * 5.5);
196
+ lander.add(foot);
197
+ }
198
+
199
+ const flameGeometry = new THREE.ConeGeometry(2, 6, 32);
200
+ const flameMaterial = new THREE.MeshBasicMaterial({
201
+ color: 0xff6600,
202
+ transparent: true,
203
+ opacity: 0.7
204
+ });
205
+ engineFlame = new THREE.Mesh(flameGeometry, flameMaterial);
206
+ engineFlame.position.y = -8;
207
+ engineFlame.visible = false;
208
+ lander.add(engineFlame);
209
+
210
+ lander.position.set(0, initialAltitude, 0);
211
+ scene.add(lander);
212
+ }
213
+
214
+ function activateThrust() {
215
+ if (fuel > 0) {
216
+ acceleration.y = thrustPower;
217
+ engineFlame.visible = true;
218
+ }
219
+ }
220
+
221
+ function deactivateThrust() {
222
+ acceleration.y = 0;
223
+ engineFlame.visible = false;
224
+ }
225
+
226
+ function onWindowResize() {
227
+ camera.aspect = window.innerWidth / window.innerHeight;
228
+ camera.updateProjectionMatrix();
229
+ renderer.setSize(window.innerWidth, window.innerHeight);
230
+ }
231
+
232
+ function startLanding() {
233
+ if (!isLanding) {
234
+ isLanding = true;
235
+ document.getElementById('info').textContent = "Landing started! Steer carefully!";
236
+ document.getElementById('startBtn').textContent = "In Progress";
237
+ document.getElementById('startBtn').disabled = true;
238
+ }
239
+ }
240
+
241
+ function resetLanding() {
242
+ isLanding = false;
243
+ lander.position.set(0, initialAltitude, 0);
244
+ velocity.set(0, 0, 0);
245
+ acceleration.set(0, 0, 0);
246
+ engineFlame.visible = false;
247
+ fuel = 100;
248
+ altitude = initialAltitude;
249
+ document.getElementById('info').textContent = "MoonLander 3D - Press Start to begin landing!";
250
+ document.getElementById('startBtn').textContent = "Start";
251
+ document.getElementById('startBtn').disabled = false;
252
+ updateTelemetry();
253
+ }
254
+
255
+ function updateTelemetry() {
256
+ document.getElementById('telemetry').innerHTML = `
257
+ Altitude: ${Math.round(altitude)} m<br>
258
+ Vertical Speed: ${Math.round(velocity.y * 10) / 10} m/s<br>
259
+ Horizontal Speed: ${Math.round(Math.sqrt(velocity.x * velocity.x + velocity.z * velocity.z) * 10) / 10} m/s<br>
260
+ Fuel: ${Math.round(fuel)}%
261
+ `;
262
+ }
263
+
264
+ function animate() {
265
+ requestAnimationFrame(animate);
266
+
267
+ if (isLanding) {
268
+ if (acceleration.y > 0 && fuel > 0) {
269
+ fuel -= 0.2;
270
+ }
271
+
272
+ velocity.add(acceleration);
273
+ velocity.add(gravity);
274
+ lander.position.add(velocity.clone().multiplyScalar(0.016));
275
+
276
+ altitude = lander.position.y - 13; // Account for the height of the lander's legs
277
+
278
+ camera.position.set(lander.position.x, lander.position.y + 20, lander.position.z + 40);
279
+ camera.lookAt(lander.position);
280
+
281
+ updateTelemetry();
282
+
283
+ if (engineFlame.visible) {
284
+ engineFlame.scale.set(
285
+ 1 + Math.random() * 0.1,
286
+ 1 + Math.random() * 0.2,
287
+ 1 + Math.random() * 0.1
288
+ );
289
+ }
290
+
291
+ if (altitude <= 52) { // Base height + platform height
292
+ isLanding = false;
293
+ const distanceFromCenter = Math.sqrt(lander.position.x * lander.position.x + lander.position.z * lander.position.z);
294
+ const verticalSpeed = velocity.y;
295
+ const horizontalSpeed = Math.sqrt(velocity.x * velocity.x + velocity.z * velocity.z);
296
+
297
+ if (verticalSpeed > -100) { // Safe landing
298
+ if (distanceFromCenter < 30) {
299
+ document.getElementById('info').textContent = "Successful landing on the base roof! Congratulations!";
300
+ } else {
301
+ document.getElementById('info').textContent = "Successful landing, but off the base. Try to land on the roof!";
302
+ }
303
+ } else { // Mission failed
304
+ if (distanceFromCenter < 30) {
305
+ document.getElementById('info').textContent = "Mission failed! The lander crashed into the base roof. Too much speed!";
306
+ } else {
307
+ document.getElementById('info').textContent = "Mission failed! The lander crashed on the Moon's surface.";
308
+ }
309
+ }
310
+ document.getElementById('startBtn').textContent = "Start";
311
+ document.getElementById('startBtn').disabled = false;
312
+ engineFlame.visible = false;
313
+ }
314
+ }
315
+
316
+ renderer.render(scene, camera);
317
+ }
318
+
319
+ init();
320
+ </script>
321
+ </body></html>
vPI3jyMDFzBfJ55wj.html ADDED
@@ -0,0 +1,681 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="https://websim.ai/c/civilsim3d-improved-v14" /><title>CivilSim3D - Enhanced Global Population Distribution (Debug Mode)</title>
2
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
3
+ <script src="https://cdn.jsdelivr.net/npm/[email protected]/examples/js/controls/OrbitControls.js"></script>
4
+ <style>
5
+ body {
6
+ margin: 0;
7
+ overflow: hidden;
8
+ font-family: Arial, sans-serif;
9
+ }
10
+ #info {
11
+ position: absolute;
12
+ top: 10px;
13
+ left: 10px;
14
+ color: white;
15
+ background: rgba(0,0,0,0.7);
16
+ padding: 10px;
17
+ border-radius: 5px;
18
+ max-width: 300px;
19
+ }
20
+ #controls {
21
+ position: absolute;
22
+ top: 10px;
23
+ right: 10px;
24
+ color: white;
25
+ background: rgba(0,0,0,0.7);
26
+ padding: 10px;
27
+ border-radius: 5px;
28
+ }
29
+ #sliders {
30
+ position: absolute;
31
+ top: 50px;
32
+ right: 10px;
33
+ color: white;
34
+ background: rgba(0,0,0,0.7);
35
+ padding: 10px;
36
+ border-radius: 5px;
37
+ width: 250px;
38
+ max-height: 80vh;
39
+ overflow-y: auto;
40
+ }
41
+ .slider-container {
42
+ margin-bottom: 10px;
43
+ }
44
+ .slider-container label {
45
+ display: inline-block;
46
+ width: 100%;
47
+ margin-bottom: 5px;
48
+ }
49
+ .slider-container input {
50
+ width: 100%;
51
+ }
52
+ #canvas-container {
53
+ position: fixed;
54
+ top: 0;
55
+ left: 0;
56
+ width: 100%;
57
+ height: 100%;
58
+ }
59
+ #debug-info {
60
+ position: absolute;
61
+ bottom: 10px;
62
+ left: 10px;
63
+ color: white;
64
+ background: rgba(0,0,0,0.7);
65
+ padding: 10px;
66
+ border-radius: 5px;
67
+ max-width: 300px;
68
+ font-family: monospace;
69
+ }
70
+ </style>
71
+ </head>
72
+ <body>
73
+ <div id="canvas-container"></div>
74
+ <div id="info">
75
+ <h2>CivilSim3D Enhanced (Debug Mode)</h2>
76
+ <p>Year: <span id="year">-10000</span></p>
77
+ <p>Total Population: <span id="population">0</span></p>
78
+ <p>Males: <span id="males">0</span></p>
79
+ <p>Females: <span id="females">0</span></p>
80
+ <p>Global Technology Level: <span id="tech">1.00</span></p>
81
+ <p>Global Happiness: <span id="happiness">0.50</span></p>
82
+ <p>Events: <span id="events"></span></p>
83
+ </div>
84
+ <div id="controls">
85
+ <button onclick="toggleSimulation()">Start/Stop Simulation</button>
86
+ <button onclick="resetSimulation()">Reset Simulation</button>
87
+ </div>
88
+ <div id="sliders">
89
+ <!-- Sliders will be dynamically added here -->
90
+ </div>
91
+ <div id="debug-info">
92
+ <h3>Debug Information</h3>
93
+ <p>Scene Children: <span id="scene-children">0</span></p>
94
+ <p>Civilizations: <span id="civ-count">0</span></p>
95
+ <p>Rural Dots: <span id="rural-dots">0</span></p>
96
+ <p>Renderer Info: <span id="renderer-info"></span></p>
97
+ <p>Errors: <span id="error-log"></span></p>
98
+ <p>Earth Radius: <span id="earth-radius"></span></p>
99
+ <p>Dot Size: <span id="current-dot-size"></span></p>
100
+ </div>
101
+ <script>
102
+ let scene, camera, renderer, earth, clouds, simulationRunning = false;
103
+ let year = -10000, totalPopulation = 0, globalTechnology = 1, globalHappiness = 0.5;
104
+ let civilizations = [];
105
+ let orbitControls;
106
+ let landGeometry;
107
+
108
+ const EARTH_RADIUS = 5;
109
+
110
+ // Simulation parameters
111
+ let params = {
112
+ populationGrowthRate: 0.001,
113
+ technologyAdvancementRate: 0.0001,
114
+ disasterProbability: 0.005,
115
+ conflictProbability: 0.01,
116
+ simulationSpeed: 1,
117
+ populationPerDot: 100000,
118
+ birthRatio: 1.05,
119
+ lifeExpectancy: 25,
120
+ educationLevel: 0.1,
121
+ healthcareQuality: 0.1,
122
+ economicGrowth: 0.001,
123
+ polutionRate: 0.001,
124
+ dotSize: 0.01,
125
+ ruralPopulation: 0.9
126
+ };
127
+
128
+ // Initial civilization centers (ancient cities/regions)
129
+ const ancientCenters = [
130
+ { name: "Mesopotamia", lat: 33.2232, lon: 43.6793, population: 500000, area: 50000 },
131
+ { name: "Egypt", lat: 26.8206, lon: 30.8025, population: 400000, area: 40000 },
132
+ { name: "Indus Valley", lat: 24.8607, lon: 67.0011, population: 300000, area: 30000 },
133
+ { name: "Yellow River", lat: 34.6937, lon: 113.5023, population: 350000, area: 35000 },
134
+ { name: "Mesoamerica", lat: 19.4326, lon: -99.1332, population: 200000, area: 20000 },
135
+ ];
136
+
137
+ function init() {
138
+ try {
139
+ scene = new THREE.Scene();
140
+ camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
141
+ renderer = new THREE.WebGLRenderer({ antialias: true });
142
+ renderer.setSize(window.innerWidth, window.innerHeight);
143
+ renderer.setPixelRatio(window.devicePixelRatio);
144
+ document.getElementById('canvas-container').appendChild(renderer.domElement);
145
+
146
+ // Earth
147
+ const earthGeometry = new THREE.SphereGeometry(EARTH_RADIUS, 64, 64);
148
+ const earthTexture = new THREE.TextureLoader().load('https://threejs.org/examples/textures/land_ocean_ice_cloud_2048.jpg');
149
+ const earthMaterial = new THREE.MeshPhongMaterial({
150
+ map: earthTexture,
151
+ bumpMap: earthTexture,
152
+ bumpScale: 0.05,
153
+ });
154
+ earth = new THREE.Mesh(earthGeometry, earthMaterial);
155
+ scene.add(earth);
156
+
157
+ // Clouds
158
+ const cloudGeometry = new THREE.SphereGeometry(EARTH_RADIUS + 0.03, 64, 64);
159
+ const cloudTexture = new THREE.TextureLoader().load('https://threejs.org/examples/textures/fair_clouds_4k.png');
160
+ const cloudMaterial = new THREE.MeshPhongMaterial({
161
+ map: cloudTexture,
162
+ transparent: true,
163
+ opacity: 0.4,
164
+ blending: THREE.AdditiveBlending
165
+ });
166
+ clouds = new THREE.Mesh(cloudGeometry, cloudMaterial);
167
+ scene.add(clouds);
168
+
169
+ // Lighting
170
+ const ambientLight = new THREE.AmbientLight(0x404040, 0.5);
171
+ scene.add(ambientLight);
172
+ const pointLight = new THREE.PointLight(0xffffff, 1, 100);
173
+ pointLight.position.set(10, 10, 10);
174
+ scene.add(pointLight);
175
+
176
+ // Add a subtle blue atmosphere
177
+ const atmosphereGeometry = new THREE.SphereGeometry(EARTH_RADIUS + 0.1, 64, 64);
178
+ const atmosphereMaterial = new THREE.ShaderMaterial({
179
+ vertexShader: `
180
+ varying vec3 vNormal;
181
+ void main() {
182
+ vNormal = normalize(normalMatrix * normal);
183
+ gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
184
+ }
185
+ `,
186
+ fragmentShader: `
187
+ varying vec3 vNormal;
188
+ void main() {
189
+ float intensity = pow(0.7 - dot(vNormal, vec3(0.0, 0.0, 1.0)), 2.0);
190
+ gl_FragColor = vec4(0.3, 0.6, 1.0, 1.0) * intensity;
191
+ }
192
+ `,
193
+ blending: THREE.AdditiveBlending,
194
+ side: THREE.BackSide
195
+ });
196
+ const atmosphere = new THREE.Mesh(atmosphereGeometry, atmosphereMaterial);
197
+ scene.add(atmosphere);
198
+
199
+ camera.position.z = 15;
200
+
201
+ // Orbit controls for free rotation and zoom
202
+ orbitControls = new THREE.OrbitControls(camera, renderer.domElement);
203
+ orbitControls.enableDamping = true;
204
+ orbitControls.dampingFactor = 0.25;
205
+ orbitControls.enableZoom = true;
206
+
207
+ // Load land geometry for more accurate dot placement
208
+ loadLandGeometry();
209
+
210
+ // Initialize civilizations based on ancient centers
211
+ ancientCenters.forEach(createCivilization);
212
+
213
+ // Add rural population
214
+ addRuralPopulation();
215
+
216
+ // Setup sliders
217
+ setupSliders();
218
+
219
+ animate();
220
+
221
+ updateDebugInfo();
222
+ } catch (error) {
223
+ console.error("Error in init function:", error);
224
+ document.getElementById('error-log').textContent = error.message;
225
+ }
226
+ }
227
+
228
+ function loadLandGeometry() {
229
+ const loader = new THREE.FileLoader();
230
+ loader.load('https://raw.githubusercontent.com/mrdoob/three.js/master/examples/models/json/world/world.json', function(data) {
231
+ try {
232
+ const worldGeometry = JSON.parse(data);
233
+ landGeometry = new THREE.BufferGeometry();
234
+ landGeometry.setAttribute('position', new THREE.Float32BufferAttribute(worldGeometry.vertices, 3));
235
+ landGeometry.setIndex(new THREE.Uint16BufferAttribute(worldGeometry.faces, 1));
236
+ landGeometry.computeVertexNormals();
237
+ } catch (error) {
238
+ console.error("Error loading land geometry:", error);
239
+ document.getElementById('error-log').textContent = "Land geometry loading error: " + error.message;
240
+ }
241
+ });
242
+ }
243
+
244
+ function latLonToVector3(lat, lon, radius) {
245
+ const phi = (90 - lat) * (Math.PI / 180);
246
+ const theta = (lon + 180) * (Math.PI / 180);
247
+ const x = -(radius * Math.sin(phi) * Math.cos(theta));
248
+ const z = (radius * Math.sin(phi) * Math.sin(theta));
249
+ const y = (radius * Math.cos(phi));
250
+ return new THREE.Vector3(x, y, z);
251
+ }
252
+
253
+ function createCivilization(center) {
254
+ try {
255
+ const position = latLonToVector3(center.lat, center.lon, EARTH_RADIUS);
256
+ const urbanPopulation = center.population * (1 - params.ruralPopulation);
257
+ const males = urbanPopulation / (1 + 1/params.birthRatio);
258
+ const females = urbanPopulation / (1 + params.birthRatio);
259
+ const maleDotCount = Math.ceil(males / params.populationPerDot);
260
+ const femaleDotCount = Math.ceil(females / params.populationPerDot);
261
+
262
+ const dots = new THREE.Group();
263
+
264
+ // Calculate spread based on center area
265
+ const spread = Math.sqrt(center.area) / 1000;
266
+
267
+ for (let i = 0; i < maleDotCount + femaleDotCount; i++) {
268
+ const dotGeometry = new THREE.SphereGeometry(params.dotSize, 8, 8);
269
+ const dotMaterial = new THREE.MeshBasicMaterial({ color: i < maleDotCount ? 0x0000ff : 0xff69b4 });
270
+ const dot = new THREE.Mesh(dotGeometry, dotMaterial);
271
+
272
+ let offset;
273
+ do {
274
+ offset = new THREE.Vector3(
275
+ (Math.random() - 0.5) * spread,
276
+ (Math.random() - 0.5) * spread,
277
+ (Math.random() - 0.5) * spread
278
+ );
279
+ } while (!isOnLand(position.clone().add(offset).normalize().multiplyScalar(EARTH_RADIUS)));
280
+
281
+ dot.position.copy(position).add(offset);
282
+
283
+ dots.add(dot);
284
+ }
285
+
286
+ scene.add(dots);
287
+
288
+ civilizations.push({
289
+ dots: dots,
290
+ name: center.name,
291
+ population: urbanPopulation,
292
+ males: males,
293
+ females: females,
294
+ technology: 1,
295
+ happiness: 0.5,
296
+ position: position,
297
+ lat: center.lat,
298
+ lon: center.lon,
299
+ area: center.area
300
+ });
301
+ } catch (error) {
302
+ console.error("Error creating civilization:", error);
303
+ document.getElementById('error-log').textContent = "Civilization creation error: " + error.message;
304
+ }
305
+ }
306
+
307
+ function isOnLand(position) {
308
+ if (!landGeometry) return true; // If land geometry hasn't loaded yet, allow all positions
309
+
310
+ const raycaster = new THREE.Raycaster(position, position.clone().negate().normalize());
311
+ const intersects = raycaster.intersectObject(earth);
312
+
313
+ if (intersects.length > 0) {
314
+ const faceIndex = intersects[0].faceIndex;
315
+ const face = new THREE.Face3(
316
+ landGeometry.index.array[faceIndex * 3],
317
+ landGeometry.index.array[faceIndex * 3 + 1],
318
+ landGeometry.index.array[faceIndex * 3 + 2]
319
+ );
320
+ return face.normal.dot(position.normalize()) > 0.9; // Consider it land if the normal is close to the position vector
321
+ }
322
+
323
+ return false;
324
+ }
325
+
326
+ function addRuralPopulation() {
327
+ try {
328
+ const totalPopulation = ancientCenters.reduce((sum, center) => sum + center.population, 0);
329
+ const ruralPopulation = totalPopulation * params.ruralPopulation;
330
+ const ruralDots = Math.ceil(ruralPopulation / params.populationPerDot);
331
+
332
+ for (let i = 0; i < ruralDots; i++) {
333
+ let position;
334
+ do {
335
+ const lat = (Math.random() - 0.5) * 180;
336
+ const lon = (Math.random() - 0.5) * 360;
337
+ position = latLonToVector3(lat, lon, EARTH_RADIUS);
338
+ } while (!isOnLand(position));
339
+
340
+ const dotGeometry = new THREE.SphereGeometry(params.dotSize, 8, 8);
341
+ const dotMaterial = new THREE.MeshBasicMaterial({ color: Math.random() < 0.5 ? 0x0000ff : 0xff69b4 });
342
+ const dot = new THREE.Mesh(dotGeometry, dotMaterial);
343
+ dot.position.copy(position);
344
+
345
+ scene.add(dot);
346
+ }
347
+ } catch (error) {
348
+ console.error("Error adding rural population:", error);
349
+ document.getElementById('error-log').textContent = "Rural population error: " + error.message;
350
+ }
351
+ }
352
+
353
+ function animate() {
354
+ requestAnimationFrame(animate);
355
+ try {
356
+ orbitControls.update();
357
+ clouds.rotation.y += 0.0005;
358
+ renderer.render(scene, camera);
359
+ updateDebugInfo();
360
+ ""
361
+ } catch (error) {
362
+ console.error("Error in animate function:", error);
363
+ document.getElementById('error-log').textContent = "Animation error: " + error.message;
364
+ }
365
+ }
366
+
367
+ function updateInfo() {
368
+ document.getElementById('year').textContent = year;
369
+ document.getElementById('population').textContent = Math.round(totalPopulation).toLocaleString();
370
+ document.getElementById('males').textContent = Math.round(civilizations.reduce((sum, civ) => sum + civ.males, 0)).toLocaleString();
371
+ document.getElementById('females').textContent = Math.round(civilizations.reduce((sum, civ) => sum + civ.females, 0)).toLocaleString();
372
+ document.getElementById('tech').textContent = globalTechnology.toFixed(2);
373
+ document.getElementById('happiness').textContent = globalHappiness.toFixed(2);
374
+ }
375
+
376
+ function simulationStep() {
377
+ if (!simulationRunning) return;
378
+
379
+ try {
380
+ year++;
381
+ totalPopulation = 0;
382
+ globalTechnology = 0;
383
+ globalHappiness = 0;
384
+
385
+ civilizations.forEach((civ) => {
386
+ // Population growth
387
+ const births = (civ.males + civ.females) * params.populationGrowthRate;
388
+ const maleBirths = births * (params.birthRatio / (1 + params.birthRatio));
389
+ const femaleBirths = births * (1 / (1 + params.birthRatio));
390
+
391
+ civ.males += maleBirths - (civ.males / params.lifeExpectancy);
392
+ civ.females += femaleBirths - (civ.females / params.lifeExpectancy);
393
+
394
+ civ.population = civ.males + civ.females;
395
+
396
+ // Technology advancement
397
+ civ.technology *= 1 + (params.technologyAdvancementRate * params.educationLevel);
398
+
399
+ // Happiness calculation
400
+ civ.happiness = (params.healthcareQuality + params.educationLevel + params.economicGrowth - params.polutionRate) / 3;
401
+ civ.happiness = Math.max(0, Math.min(1, civ.happiness));
402
+
403
+ // Random events
404
+ if (Math.random() < params.disasterProbability) {
405
+ const disasterImpact = 0.05 + (1 - params.healthcareQuality) * 0.1;
406
+ civ.males *= 1 - disasterImpact;
407
+ civ.females *= 1 - disasterImpact;
408
+ civ.population = civ.males + civ.females;
409
+ civ.happiness *= 0.9;
410
+ civ.dots.children.forEach(dot => dot.material.color.setHex(0xff0000)); // Red for disaster
411
+ document.getElementById('events').textContent = `Natural disaster in ${civ.name}!`;
412
+ } else if (Math.random() < params.conflictProbability) {
413
+ const conflictImpact = 0.02 + (1 - params.educationLevel) * 0.05;
414
+ civ.males *= 1 - conflictImpact;
415
+ civ.females *= 1 - conflictImpact;
416
+ civ.population = civ.males + civ.females;
417
+ civ.happiness *= 0.95;
418
+ civ.dots.children.forEach(dot => dot.material.color.setHex(0xff8c00)); // Orange for conflict
419
+ document.getElementById('events').textContent = `Conflict in ${civ.name}!`;
420
+ } else {
421
+ updateDotColors(civ);
422
+ document.getElementById('events').textContent = '';
423
+ }
424
+
425
+ updateDotCount(civ);
426
+
427
+ totalPopulation += civ.population;
428
+ globalTechnology += civ.technology;
429
+ globalHappiness += civ.happiness;
430
+ });
431
+
432
+ // Update rural population
433
+ updateRuralPopulation();
434
+
435
+ globalTechnology /= civilizations.length;
436
+ globalHappiness /= civilizations.length;
437
+
438
+ updateInfo();
439
+ updateDebugInfo();
440
+ } catch (error) {
441
+ console.error("Error in simulation step:", error);
442
+ document.getElementById('error-log').textContent = "Simulation step error: " + error.message;
443
+ }
444
+
445
+ setTimeout(simulationStep, 100 / params.simulationSpeed);
446
+ }
447
+
448
+ function updateDotColors(civ) {
449
+ const maleDotCount = Math.ceil(civ.males / params.populationPerDot);
450
+ civ.dots.children.forEach((dot, index) => {
451
+ if (index < maleDotCount) {
452
+ dot.material.color.setHex(0x0000ff); // Blue for males
453
+ } else {
454
+ dot.material.color.setHex(0xff69b4); // Pink for females
455
+ }
456
+ });
457
+ }
458
+
459
+ function updateDotCount(civ) {
460
+ const newDotCount = Math.ceil(civ.population / params.populationPerDot);
461
+ const currentDotCount = civ.dots.children.length;
462
+
463
+ if (newDotCount > currentDotCount) {
464
+ // Add new dots
465
+ for (let i = 0; i < newDotCount - currentDotCount; i++) {
466
+ const dotGeometry = new THREE.SphereGeometry(params.dotSize, 8, 8);
467
+ const dotMaterial = new THREE.MeshBasicMaterial({ color: 0xffffff }); // White initially, color will be set in updateDotColors
468
+ const dot = new THREE.Mesh(dotGeometry, dotMaterial);
469
+
470
+ let offset;
471
+ do {
472
+ const spread = Math.sqrt(civ.area) / 1000;
473
+ offset = new THREE.Vector3(
474
+ (Math.random() - 0.5) * spread,
475
+ (Math.random() - 0.5) * spread,
476
+ (Math.random() - 0.5) * spread
477
+ );
478
+ } while (!isOnLand(civ.position.clone().add(offset).normalize().multiplyScalar(EARTH_RADIUS)));
479
+
480
+ dot.position.copy(civ.position).add(offset);
481
+
482
+ civ.dots.add(dot);
483
+ }
484
+ } else if (newDotCount < currentDotCount) {
485
+ // Remove excess dots
486
+ for (let i = 0; i < currentDotCount - newDotCount; i++) {
487
+ const dotToRemove = civ.dots.children[civ.dots.children.length - 1];
488
+ civ.dots.remove(dotToRemove);
489
+ }
490
+ }
491
+
492
+ updateDotColors(civ);
493
+ }
494
+
495
+ function toggleSimulation() {
496
+ simulationRunning = !simulationRunning;
497
+ if (simulationRunning) {
498
+ simulationStep();
499
+ }
500
+ }
501
+
502
+ function resetSimulation() {
503
+ try {
504
+ simulationRunning = false;
505
+ year = -10000;
506
+ totalPopulation = 0;
507
+ globalTechnology = 1;
508
+ globalHappiness = 0.5;
509
+
510
+ // Remove all existing dots
511
+ civilizations.forEach(civ => {
512
+ scene.remove(civ.dots);
513
+ });
514
+ scene.children.filter(child => child instanceof THREE.Mesh && child !== earth && child !== clouds).forEach(dot => {
515
+ scene.remove(dot);
516
+ });
517
+
518
+ civilizations = [];
519
+
520
+ // Reinitialize civilizations
521
+ ancientCenters.forEach(createCivilization);
522
+
523
+ // Add rural population
524
+ addRuralPopulation();
525
+
526
+ updateInfo();
527
+ updateDebugInfo();
528
+ document.getElementById('events').textContent = '';
529
+ document.getElementById('error-log').textContent = '';
530
+ } catch (error) {
531
+ console.error("Error resetting simulation:", error);
532
+ document.getElementById('error-log').textContent = "Reset error: " + error.message;
533
+ }
534
+ }
535
+
536
+ function setupSliders() {
537
+ const sliders = [
538
+ { id: 'growthRate', param: 'populationGrowthRate', min: 0, max: 0.05, step: 0.001, initial: 0.001 },
539
+ { id: 'techRate', param: 'technologyAdvancementRate', min: 0, max: 0.05, step: 0.0001, initial: 0.0001 },
540
+ { id: 'disasterProb', param: 'disasterProbability', min: 0, max: 0.1, step: 0.001, initial: 0.005 },
541
+ { id: 'conflictProb', param: 'conflictProbability', min: 0, max: 0.1, step: 0.001, initial: 0.01 },
542
+ { id: 'simSpeed', param: 'simulationSpeed', min: 0.1, max: 5, step: 0.1, initial: 1 },
543
+ { id: 'birthRatio', param: 'birthRatio', min: 0, max: 2, step: 0.01, initial: 1.05 },
544
+ { id: 'lifeExpectancy', param: 'lifeExpectancy', min: 20, max: 100, step: 1, initial: 25 },
545
+ { id: 'educationLevel', param: 'educationLevel', min: 0, max: 1, step: 0.01, initial: 0.1 },
546
+ { id: 'healthcareQuality', param: 'healthcareQuality', min: 0, max: 1, step: 0.01, initial: 0.1 },
547
+ { id: 'economicGrowth', param: 'economicGrowth', min: -0.05, max: 0.1, step: 0.001, initial: 0.001 },
548
+ { id: 'polutionRate', param: 'polutionRate', min: 0, max: 0.1, step: 0.001, initial: 0.001 },
549
+ { id: 'populationPerDot', param: 'populationPerDot', min: 1, max: 1000000, step: 1, initial: 100000 },
550
+ { id: 'dotSize', param: 'dotSize', min: 0.001, max: 0.05, step: 0.001, initial: 0.01 },
551
+ { id: 'ruralPopulation', param: 'ruralPopulation', min: 0.5, max: 0.99, step: 0.01, initial: 0.9 }
552
+ ];
553
+
554
+ const slidersContainer = document.getElementById('sliders');
555
+ sliders.forEach(slider => {
556
+ const container = document.createElement('div');
557
+ container.className = 'slider-container';
558
+
559
+ const label = document.createElement('label');
560
+ label.htmlFor = slider.id;
561
+ label.textContent = `${slider.param}: `;
562
+
563
+ const span = document.createElement('span');
564
+ span.id = `${slider.id}Value`;
565
+ span.textContent = slider.initial;
566
+
567
+ label.appendChild(span);
568
+
569
+ const input = document.createElement('input');
570
+ input.type = 'range';
571
+ input.id = slider.id;
572
+ input.min = slider.min;
573
+ input.max = slider.max;
574
+ input.step = slider.step;
575
+ input.value = slider.initial;
576
+
577
+ input.addEventListener('input', function() {
578
+ params[slider.param] = parseFloat(this.value);
579
+ span.textContent = this.value;
580
+ if (slider.id === 'populationPerDot' || slider.id === 'dotSize') {
581
+ updateAllDots();
582
+ }
583
+ if (slider.id === 'ruralPopulation') {
584
+ updateRuralPopulation();
585
+ }
586
+ updateDebugInfo();
587
+ });
588
+
589
+ container.appendChild(label);
590
+ container.appendChild(input);
591
+ slidersContainer.appendChild(container);
592
+ });
593
+ }
594
+
595
+ function updateAllDots() {
596
+ civilizations.forEach(civ => {
597
+ updateDotCount(civ);
598
+ updateDotSizes(civ);
599
+ });
600
+ updateRuralPopulation();
601
+ }
602
+
603
+ function updateDotSizes(civ) {
604
+ const newGeometry = new THREE.SphereGeometry(params.dotSize, 8, 8);
605
+ civ.dots.children.forEach(dot => {
606
+ const oldPosition = dot.position.clone();
607
+ dot.geometry.dispose();
608
+ dot.geometry = newGeometry;
609
+ dot.position.copy(oldPosition);
610
+ });
611
+ }
612
+
613
+ function updateRuralPopulation() {
614
+ try {
615
+ const totalPopulation = civilizations.reduce((sum, civ) => sum + civ.population, 0);
616
+ const ruralPopulation = totalPopulation * params.ruralPopulation;
617
+ const ruralDots = Math.ceil(ruralPopulation / params.populationPerDot);
618
+ const currentRuralDots = scene.children.filter(child => !civilizations.some(civ => civ.dots === child) && child instanceof THREE.Mesh && child !== earth && child !== clouds).length;
619
+
620
+ if (ruralDots > currentRuralDots) {
621
+ for (let i = 0; i < ruralDots - currentRuralDots; i++) {
622
+ let position;
623
+ do {
624
+ const lat = (Math.random() - 0.5) * 180;
625
+ const lon = (Math.random() - 0.5) * 360;
626
+ position = latLonToVector3(lat, lon, EARTH_RADIUS);
627
+ } while (!isOnLand(position));
628
+
629
+ const dotGeometry = new THREE.SphereGeometry(params.dotSize, 8, 8);
630
+ const dotMaterial = new THREE.MeshBasicMaterial({ color: Math.random() < 0.5 ? 0x0000ff : 0xff69b4 });
631
+ const dot = new THREE.Mesh(dotGeometry, dotMaterial);
632
+ dot.position.copy(position);
633
+
634
+ scene.add(dot);
635
+ }
636
+ } else if (ruralDots < currentRuralDots) {
637
+ const ruralDotsToRemove = scene.children.filter(child => !civilizations.some(civ => civ.dots === child) && child instanceof THREE.Mesh && child !== earth && child !== clouds).slice(ruralDots);
638
+ ruralDotsToRemove.forEach(dot => {
639
+ dot.geometry.dispose();
640
+ dot.material.dispose();
641
+ scene.remove(dot);
642
+ });
643
+ }
644
+
645
+ // Update sizes of existing rural dots
646
+ scene.children.filter(child => !civilizations.some(civ => civ.dots === child) && child instanceof THREE.Mesh && child !== earth && child !== clouds).forEach(dot => {
647
+ const oldPosition = dot.position.clone();
648
+ dot.geometry.dispose();
649
+ dot.geometry = new THREE.SphereGeometry(params.dotSize, 8, 8);
650
+ dot.position.copy(oldPosition);
651
+ });
652
+ } catch (error) {
653
+ console.error("Error updating rural population:", error);
654
+ document.getElementById('error-log').textContent = "Rural population update error: " + error.message;
655
+ }
656
+ }
657
+
658
+ function updateDebugInfo() {
659
+ document.getElementById('scene-children').textContent = scene.children.length;
660
+ document.getElementById('civ-count').textContent = civilizations.length;
661
+ document.getElementById('rural-dots').textContent = scene.children.filter(child => !civilizations.some(civ => civ.dots === child) && child instanceof THREE.Mesh && child !== earth && child !== clouds).length;
662
+
663
+ const rendererInfo = renderer.info;
664
+ document.getElementById('renderer-info').textContent = `Geometries: ${rendererInfo.memory.geometries}, Textures: ${rendererInfo.memory.textures}`;
665
+
666
+ document.getElementById('earth-radius').textContent = EARTH_RADIUS;
667
+ document.getElementById('current-dot-size').textContent = params.dotSize;
668
+ }
669
+
670
+ window.addEventListener('resize', onWindowResize, false);
671
+
672
+ function onWindowResize(){
673
+ camera.aspect = window.innerWidth / window.innerHeight;
674
+ camera.updateProjectionMatrix();
675
+ renderer.setSize(window.innerWidth, window.innerHeight);
676
+ }
677
+
678
+ init();
679
+ </script>
680
+ </body>
681
+ </html>
yh38bSOPARgCH7468.html ADDED
@@ -0,0 +1,260 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html><head><base href="temporal://Simulation/neuralnetworks/timeline"><title>Neural Network Timeline - Temporal Simulation</title>
2
+ <style>
3
+ body {
4
+ font-family: 'Orbitron', sans-serif;
5
+ background-color: #0a0a1f;
6
+ color: #e0e0ff;
7
+ line-height: 1.6;
8
+ margin: 0;
9
+ padding: 0;
10
+ }
11
+ .container {
12
+ max-width: 1000px;
13
+ margin: 0 auto;
14
+ padding: 20px;
15
+ }
16
+ header {
17
+ background-color: #1a1a3f;
18
+ padding: 20px 0;
19
+ text-align: center;
20
+ }
21
+ h1 {
22
+ margin: 0;
23
+ font-size: 2.5em;
24
+ color: #00ffff;
25
+ }
26
+ .timeline {
27
+ position: relative;
28
+ max-width: 800px;
29
+ margin: 40px auto;
30
+ }
31
+ .timeline::after {
32
+ content: '';
33
+ position: absolute;
34
+ width: 6px;
35
+ background-color: #00ffff;
36
+ top: 0;
37
+ bottom: 0;
38
+ left: 50%;
39
+ margin-left: -3px;
40
+ }
41
+ .entry {
42
+ padding: 10px 40px;
43
+ position: relative;
44
+ background-color: inherit;
45
+ width: 50%;
46
+ }
47
+ .entry::after {
48
+ content: '';
49
+ position: absolute;
50
+ width: 25px;
51
+ height: 25px;
52
+ right: -17px;
53
+ background-color: #0a0a1f;
54
+ border: 4px solid #00ffff;
55
+ top: 15px;
56
+ border-radius: 50%;
57
+ z-index: 1;
58
+ }
59
+ .left {
60
+ left: 0;
61
+ }
62
+ .right {
63
+ left: 50%;
64
+ }
65
+ .left::before {
66
+ content: " ";
67
+ height: 0;
68
+ position: absolute;
69
+ top: 22px;
70
+ width: 0;
71
+ z-index: 1;
72
+ right: 30px;
73
+ border: medium solid #00ffff;
74
+ border-width: 10px 0 10px 10px;
75
+ border-color: transparent transparent transparent #00ffff;
76
+ }
77
+ .right::before {
78
+ content: " ";
79
+ height: 0;
80
+ position: absolute;
81
+ top: 22px;
82
+ width: 0;
83
+ z-index: 1;
84
+ left: 30px;
85
+ border: medium solid #00ffff;
86
+ border-width: 10px 10px 10px 0;
87
+ border-color: transparent #00ffff transparent transparent;
88
+ }
89
+ .right::after {
90
+ left: -16px;
91
+ }
92
+ .content {
93
+ padding: 20px 30px;
94
+ background-color: #1a1a3f;
95
+ position: relative;
96
+ border-radius: 6px;
97
+ }
98
+ @media screen and (max-width: 600px) {
99
+ .timeline::after {
100
+ left: 31px;
101
+ }
102
+ .entry {
103
+ width: 100%;
104
+ padding-left: 70px;
105
+ padding-right: 25px;
106
+ }
107
+ .entry::before {
108
+ left: 60px;
109
+ border: medium solid #00ffff;
110
+ border-width: 10px 10px 10px 0;
111
+ border-color: transparent #00ffff transparent transparent;
112
+ }
113
+ .left::after, .right::after {
114
+ left: 15px;
115
+ }
116
+ .right {
117
+ left: 0%;
118
+ }
119
+ }
120
+ .year {
121
+ font-size: 1.2em;
122
+ font-weight: bold;
123
+ color: #00ffff;
124
+ }
125
+ .event {
126
+ margin-top: 10px;
127
+ }
128
+ .divergence {
129
+ color: #ff00ff;
130
+ font-style: italic;
131
+ }
132
+ </style>
133
+ </head>
134
+ <body>
135
+ <header>
136
+ <div class="container">
137
+ <h1>Neural Network Timeline</h1>
138
+ </div>
139
+ </header>
140
+
141
+ <div class="container">
142
+ <div class="timeline">
143
+ <div class="entry left">
144
+ <div class="content">
145
+ <span class="year">1943</span>
146
+ <div class="event">Warren McCulloch and Walter Pitts create a computational model for neural networks.</div>
147
+ </div>
148
+ </div>
149
+ <div class="entry right">
150
+ <div class="content">
151
+ <span class="year">1958</span>
152
+ <div class="event">Frank Rosenblatt designs the Perceptron, the first artificial neural network.</div>
153
+ </div>
154
+ </div>
155
+ <div class="entry left">
156
+ <div class="content">
157
+ <span class="year">1969</span>
158
+ <div class="event">Marvin Minsky and Seymour Papert publish "Perceptrons," highlighting limitations of single-layer neural networks.</div>
159
+ </div>
160
+ </div>
161
+ <div class="entry right">
162
+ <div class="content">
163
+ <span class="year">1974</span>
164
+ <div class="event">Paul Werbos develops backpropagation learning algorithm for multi-layer networks.</div>
165
+ </div>
166
+ </div>
167
+ <div class="entry left">
168
+ <div class="content">
169
+ <span class="year">1980</span>
170
+ <div class="event">Kunihiko Fukushima introduces Neocognitron, a hierarchical multi-layered neural network.</div>
171
+ </div>
172
+ </div>
173
+ <div class="entry right">
174
+ <div class="content">
175
+ <span class="year">1982</span>
176
+ <div class="event">John Hopfield popularizes Hopfield networks for associative memory and optimization problems.</div>
177
+ </div>
178
+ </div>
179
+ <div class="entry left">
180
+ <div class="content">
181
+ <span class="year">1986</span>
182
+ <div class="event">David Rumelhart, Geoffrey Hinton, and Ronald Williams publish influential work on backpropagation.</div>
183
+ </div>
184
+ </div>
185
+ <div class="entry right">
186
+ <div class="content">
187
+ <span class="year">1989</span>
188
+ <div class="event">Yann LeCun applies convolutional neural networks to handwritten digit recognition.</div>
189
+ </div>
190
+ </div>
191
+ <div class="entry left">
192
+ <div class="content">
193
+ <span class="year">1997</span>
194
+ <div class="event">Sepp Hochreiter and Jürgen Schmidhuber introduce Long Short-Term Memory (LSTM) networks.</div>
195
+ </div>
196
+ </div>
197
+ <div class="entry right">
198
+ <div class="content">
199
+ <span class="year">2006</span>
200
+ <div class="event">Geoffrey Hinton introduces deep belief networks, sparking renewed interest in deep learning.</div>
201
+ </div>
202
+ </div>
203
+ <div class="entry left">
204
+ <div class="content">
205
+ <span class="year">2012</span>
206
+ <div class="event">AlexNet wins ImageNet competition, demonstrating the power of deep convolutional networks.</div>
207
+ </div>
208
+ </div>
209
+ <div class="entry right">
210
+ <div class="content">
211
+ <span class="year">2014</span>
212
+ <div class="event">Ian Goodfellow introduces Generative Adversarial Networks (GANs).</div>
213
+ </div>
214
+ </div>
215
+ <div class="entry left">
216
+ <div class="content">
217
+ <span class="year">2017</span>
218
+ <div class="event">Google's AlphaGo Zero achieves superhuman performance in Go using reinforcement learning.</div>
219
+ </div>
220
+ </div>
221
+ <div class="entry right">
222
+ <div class="content">
223
+ <span class="year">2020</span>
224
+ <div class="event">OpenAI releases GPT-3, a large language model with 175 billion parameters.</div>
225
+ </div>
226
+ </div>
227
+ <div class="entry left">
228
+ <div class="content">
229
+ <span class="year">2023</span>
230
+ <div class="event">Development of the first quantum-entangled neural network.</div>
231
+ <div class="divergence">Timeline Divergence Point</div>
232
+ </div>
233
+ </div>
234
+ <div class="entry right">
235
+ <div class="content">
236
+ <span class="year">2028</span>
237
+ <div class="event">Introduction of the Holographic Neural Interface (HNI) for direct brain-computer interaction.</div>
238
+ </div>
239
+ </div>
240
+ <div class="entry left">
241
+ <div class="content">
242
+ <span class="year">2035</span>
243
+ <div class="event">First successful implementation of a city-wide neural network for optimizing urban infrastructure.</div>
244
+ </div>
245
+ </div>
246
+ <div class="entry right">
247
+ <div class="content">
248
+ <span class="year">2042</span>
249
+ <div class="event">Launch of the Global Neural Network (GNN) for climate prediction and mitigation.</div>
250
+ </div>
251
+ </div>
252
+ <div class="entry left">
253
+ <div class="content">
254
+ <span class="year">2050</span>
255
+ <div class="event">Development of self-evolving neural networks capable of independent goal-setting and ethical decision-making.</div>
256
+ </div>
257
+ </div>
258
+ </div>
259
+ </div>
260
+ </body></html>