Compare commits
37 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
392b339727 | ||
|
|
852eff8de6 | ||
|
|
c74a15c40c | ||
|
|
5419425834 | ||
|
|
f3a386079b | ||
|
|
aa43713943 | ||
|
|
1dece10679 | ||
|
|
c4f16d786a | ||
|
|
36b8adc019 | ||
|
|
bfe0b4757d | ||
|
|
2b61e55783 | ||
|
|
36c4f451b3 | ||
|
|
268d4ae7fa | ||
|
|
1b49e02cd8 | ||
|
|
9a55a6ec39 | ||
|
|
faaf6f770f | ||
|
|
79e4ed6e8b | ||
|
|
f956df1272 | ||
|
|
089ef56b10 | ||
|
|
c4e8721a2b | ||
|
|
a2efc2f767 | ||
|
|
c0e1c55453 | ||
|
|
860ca52e2d | ||
|
|
b891a1e3c0 | ||
|
|
70fb3b5dbe | ||
|
|
5bcc744867 | ||
|
|
da75226a63 | ||
|
|
cab4219740 | ||
|
|
9252275436 | ||
|
|
9d1c21d8ef | ||
|
|
6473f167a8 | ||
|
|
d280a5b3a9 | ||
|
|
b195ce042b | ||
|
|
974a061b44 | ||
|
|
7c50f5f1d7 | ||
|
|
4bf3f4d1e0 | ||
|
|
46da573715 |
23
.github/workflows/build-docker.yaml
vendored
@@ -1,5 +1,12 @@
|
||||
name: build-docker
|
||||
on: push
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- '**'
|
||||
tags:
|
||||
- 'v*.*.*'
|
||||
- 'v*.*'
|
||||
|
||||
jobs:
|
||||
build:
|
||||
@@ -13,7 +20,7 @@ jobs:
|
||||
uses: actions/checkout@v4
|
||||
- name: Docker meta
|
||||
id: meta
|
||||
uses: docker/metadata-action@v4
|
||||
uses: docker/metadata-action@v5
|
||||
with:
|
||||
images: |
|
||||
ghcr.io/netbymatt/ws4kp
|
||||
@@ -27,23 +34,23 @@ jobs:
|
||||
type=semver,pattern={{major}}
|
||||
type=sha
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v2
|
||||
uses: docker/setup-qemu-action@v3
|
||||
- name: Set up Buildx
|
||||
uses: docker/setup-buildx-action@v2
|
||||
uses: docker/setup-buildx-action@v3
|
||||
- name: Login to GitHub Container Registry
|
||||
uses: docker/login-action@v2
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: Build and Push
|
||||
id: docker_build
|
||||
uses: docker/build-push-action@v3
|
||||
uses: docker/build-push-action@v6
|
||||
with:
|
||||
context: .
|
||||
pull: true
|
||||
push: ${{ github.ref == 'refs/heads/main' }}
|
||||
platforms: linux/amd64,linux/arm/v7,linux/arm64/v8
|
||||
push: ${{ github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/') }}
|
||||
platforms: linux/amd64,linux/arm64/v8
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
cache-from: type=gha
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
FROM node:18-alpine
|
||||
FROM node:24-alpine
|
||||
WORKDIR /app
|
||||
|
||||
COPY package.json .
|
||||
|
||||
@@ -139,6 +139,11 @@ Ws4kp is muted by default, but if it was unmuted on the last visit it is coded t
|
||||
|
||||
Chrome seems to be more lenient on auto play and will eventually let a site auto-play music if you're visited it enough recently and manually clicked to start playing music on each visit. It also has a flag you can add to the command line when launching Chrome: `chrome.exe --autoplay-policy=no-user-gesture-required`. This is the best solution when using Kiosk-style setup.
|
||||
|
||||
If you're unable to pre-set the play state before entering kiosk mode (such as with a home dashboard implemenation) you can add the query string value below to the url. The browser will still follow the auto play rules outlined above.
|
||||
```
|
||||
?settings-mediaPlaying-boolean=true
|
||||
```
|
||||
|
||||
## Community Notes
|
||||
|
||||
Thanks to the WeatherStar community for providing these discussions to further extend your retro forecasts!
|
||||
|
||||
@@ -1,45 +0,0 @@
|
||||
// pass through api requests
|
||||
|
||||
// http(s) modules
|
||||
import https from 'https';
|
||||
|
||||
// url parsing
|
||||
import queryString from 'querystring';
|
||||
|
||||
// return an express router
|
||||
const cors = (req, res) => {
|
||||
// add out-going headers
|
||||
const headers = {};
|
||||
headers['user-agent'] = '(WeatherStar 4000+, ws4000@netbymatt.com)';
|
||||
headers.accept = req.headers.accept;
|
||||
|
||||
// get query paramaters if the exist
|
||||
const queryParams = Object.keys(req.query).reduce((acc, key) => {
|
||||
// skip the paramater 'u'
|
||||
if (key === 'u') return acc;
|
||||
// add the paramter to the resulting object
|
||||
acc[key] = req.query[key];
|
||||
return acc;
|
||||
}, {});
|
||||
let query = queryString.encode(queryParams);
|
||||
if (query.length > 0) query = `?${query}`;
|
||||
|
||||
// get the page
|
||||
https.get(`https://api.weather.gov${req.path}${query}`, {
|
||||
headers,
|
||||
}, (getRes) => {
|
||||
// pull some info
|
||||
const { statusCode } = getRes;
|
||||
// pass the status code through
|
||||
res.status(statusCode);
|
||||
|
||||
// set headers
|
||||
res.header('content-type', getRes.headers['content-type']);
|
||||
// pipe to response
|
||||
getRes.pipe(res);
|
||||
}).on('error', (e) => {
|
||||
console.error(e);
|
||||
});
|
||||
};
|
||||
|
||||
export default cors;
|
||||
@@ -1,46 +0,0 @@
|
||||
// pass through api requests
|
||||
|
||||
// http(s) modules
|
||||
import https from 'https';
|
||||
|
||||
// url parsing
|
||||
import queryString from 'querystring';
|
||||
|
||||
// return an express router
|
||||
const outlook = (req, res) => {
|
||||
// add out-going headers
|
||||
const headers = {};
|
||||
headers['user-agent'] = '(WeatherStar 4000+, ws4000@netbymatt.com)';
|
||||
headers.accept = req.headers.accept;
|
||||
|
||||
// get query paramaters if the exist
|
||||
const queryParams = Object.keys(req.query).reduce((acc, key) => {
|
||||
// skip the paramater 'u'
|
||||
if (key === 'u') return acc;
|
||||
// add the paramter to the resulting object
|
||||
acc[key] = req.query[key];
|
||||
return acc;
|
||||
}, {});
|
||||
let query = queryString.encode(queryParams);
|
||||
if (query.length > 0) query = `?${query}`;
|
||||
|
||||
// get the page
|
||||
https.get(`https://www.cpc.ncep.noaa.gov/${req.path}${query}`, {
|
||||
headers,
|
||||
}, (getRes) => {
|
||||
// pull some info
|
||||
const { statusCode } = getRes;
|
||||
// pass the status code through
|
||||
res.status(statusCode);
|
||||
|
||||
// set headers
|
||||
res.header('content-type', getRes.headers['content-type']);
|
||||
res.header('last-modified', getRes.headers['last-modified']);
|
||||
// pipe to response
|
||||
getRes.pipe(res);
|
||||
}).on('error', (e) => {
|
||||
console.error(e);
|
||||
});
|
||||
};
|
||||
|
||||
export default outlook;
|
||||
@@ -1,46 +0,0 @@
|
||||
// pass through api requests
|
||||
|
||||
// http(s) modules
|
||||
import https from 'https';
|
||||
|
||||
// url parsing
|
||||
import queryString from 'querystring';
|
||||
|
||||
// return an express router
|
||||
const radar = (req, res) => {
|
||||
// add out-going headers
|
||||
const headers = {};
|
||||
headers['user-agent'] = '(WeatherStar 4000+, ws4000@netbymatt.com)';
|
||||
headers.accept = req.headers.accept;
|
||||
|
||||
// get query paramaters if the exist
|
||||
const queryParams = Object.keys(req.query).reduce((acc, key) => {
|
||||
// skip the paramater 'u'
|
||||
if (key === 'u') return acc;
|
||||
// add the paramter to the resulting object
|
||||
acc[key] = req.query[key];
|
||||
return acc;
|
||||
}, {});
|
||||
let query = queryString.encode(queryParams);
|
||||
if (query.length > 0) query = `?${query}`;
|
||||
|
||||
// get the page
|
||||
https.get(`https://radar.weather.gov${req.path}${query}`, {
|
||||
headers,
|
||||
}, (getRes) => {
|
||||
// pull some info
|
||||
const { statusCode } = getRes;
|
||||
// pass the status code through
|
||||
res.status(statusCode);
|
||||
|
||||
// set headers
|
||||
res.header('content-type', getRes.headers['content-type']);
|
||||
res.header('last-modified', getRes.headers['last-modified']);
|
||||
// pipe to response
|
||||
getRes.pipe(res);
|
||||
}).on('error', (e) => {
|
||||
console.error(e);
|
||||
});
|
||||
};
|
||||
|
||||
export default radar;
|
||||
@@ -96,6 +96,19 @@ const buildJs = () => src(mjsSources)
|
||||
.pipe(webpack(webpackOptions))
|
||||
.pipe(dest(RESOURCES_PATH));
|
||||
|
||||
const workerSources = [
|
||||
'server/scripts/modules/radar-worker.mjs',
|
||||
];
|
||||
|
||||
const buildWorkers = () => {
|
||||
// update the file name in the webpack options
|
||||
const output = { filename: 'radar-worker.mjs' };
|
||||
const workerWebpackOptions = { ...webpackOptions, output };
|
||||
return src(workerSources)
|
||||
.pipe(webpack(workerWebpackOptions))
|
||||
.pipe(dest(RESOURCES_PATH));
|
||||
};
|
||||
|
||||
const cssSources = [
|
||||
'server/styles/main.css',
|
||||
];
|
||||
@@ -137,6 +150,8 @@ const s3 = s3Upload({
|
||||
const uploadSources = [
|
||||
'dist/**',
|
||||
'!dist/**/*.map',
|
||||
'!dist/images/**/*',
|
||||
'!dist/fonts/**/*',
|
||||
];
|
||||
const upload = () => src(uploadSources, { base: './dist', encoding: false })
|
||||
.pipe(s3({
|
||||
@@ -167,6 +182,9 @@ const uploadImages = () => src(imageSources, { base: './server', encoding: false
|
||||
}),
|
||||
);
|
||||
|
||||
const copyImageSources = () => src(imageSources, { base: './server', encoding: false })
|
||||
.pipe(dest('./dist'));
|
||||
|
||||
const invalidate = () => cloudfront.send(new CreateInvalidationCommand({
|
||||
DistributionId: process.env.DISTRIBUTION_ID,
|
||||
InvalidationBatch: {
|
||||
@@ -184,7 +202,7 @@ const buildPlaylist = async () => {
|
||||
return file('playlist.json', JSON.stringify(playlist)).pipe(dest('./dist'));
|
||||
};
|
||||
|
||||
const buildDist = series(clean, parallel(buildJs, compressJsData, compressJsVendor, copyCss, compressHtml, copyOtherFiles, buildPlaylist));
|
||||
const buildDist = series(clean, parallel(buildJs, buildWorkers, compressJsData, compressJsVendor, copyCss, compressHtml, copyOtherFiles, copyImageSources, buildPlaylist));
|
||||
|
||||
// upload_images could be in parallel with upload, but _images logs a lot and has little changes
|
||||
// by running upload last the majority of the changes will be at the bottom of the log for easy viewing
|
||||
|
||||
14
index.mjs
@@ -1,9 +1,6 @@
|
||||
import 'dotenv/config';
|
||||
import express from 'express';
|
||||
import fs from 'fs';
|
||||
import corsPassThru from './cors/index.mjs';
|
||||
import radarPassThru from './cors/radar.mjs';
|
||||
import outlookPassThru from './cors/outlook.mjs';
|
||||
import playlist from './src/playlist.mjs';
|
||||
import OVERRIDES from './src/overrides.mjs';
|
||||
|
||||
@@ -13,12 +10,6 @@ const port = process.env.WS4KP_PORT ?? 8080;
|
||||
// template engine
|
||||
app.set('view engine', 'ejs');
|
||||
|
||||
// cors pass-thru to api.weather.gov
|
||||
app.get('/stations/*station', corsPassThru);
|
||||
app.get('/Conus/*radar', radarPassThru);
|
||||
app.get('/products/*product', outlookPassThru);
|
||||
app.get('/playlist.json', playlist);
|
||||
|
||||
// version
|
||||
const { version } = JSON.parse(fs.readFileSync('package.json'));
|
||||
|
||||
@@ -81,8 +72,6 @@ const geoip = (req, res) => {
|
||||
// debugging
|
||||
if (process.env?.DIST === '1') {
|
||||
// distribution
|
||||
app.use('/images', express.static('./server/images'));
|
||||
app.use('/fonts', express.static('./server/fonts'));
|
||||
app.use('/scripts', express.static('./server/scripts'));
|
||||
app.use('/geoip', geoip);
|
||||
app.use('/', express.static('./dist'));
|
||||
@@ -90,8 +79,11 @@ if (process.env?.DIST === '1') {
|
||||
// debugging
|
||||
app.get('/index.html', index);
|
||||
app.use('/geoip', geoip);
|
||||
app.use('/resources', express.static('./server/scripts/modules'));
|
||||
app.get('/', index);
|
||||
app.get('*name', express.static('./server'));
|
||||
// cors pass-thru to api.weather.gov
|
||||
app.get('/playlist.json', playlist);
|
||||
}
|
||||
|
||||
const server = app.listen(port, () => {
|
||||
|
||||
4
package-lock.json
generated
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "ws4kp",
|
||||
"version": "5.21.14",
|
||||
"version": "5.23.7",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "ws4kp",
|
||||
"version": "5.21.14",
|
||||
"version": "5.23.7",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"dotenv": "^16.5.0",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "ws4kp",
|
||||
"version": "5.21.14",
|
||||
"version": "5.23.7",
|
||||
"description": "Welcome to the WeatherStar 4000+ project page!",
|
||||
"main": "index.mjs",
|
||||
"type": "module",
|
||||
|
||||
BIN
server/images/gimp/Radar Basemap5.xcf
Normal file
BIN
server/images/maps/radar-tiles/00-00.webp
Normal file
|
After Width: | Height: | Size: 57 KiB |
BIN
server/images/maps/radar-tiles/00-01.webp
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
server/images/maps/radar-tiles/00-02.webp
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
server/images/maps/radar-tiles/00-03.webp
Normal file
|
After Width: | Height: | Size: 31 KiB |
BIN
server/images/maps/radar-tiles/00-04.webp
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
server/images/maps/radar-tiles/00-05.webp
Normal file
|
After Width: | Height: | Size: 464 B |
BIN
server/images/maps/radar-tiles/00-06.webp
Normal file
|
After Width: | Height: | Size: 50 B |
BIN
server/images/maps/radar-tiles/00-07.webp
Normal file
|
After Width: | Height: | Size: 50 B |
BIN
server/images/maps/radar-tiles/00-08.webp
Normal file
|
After Width: | Height: | Size: 50 B |
BIN
server/images/maps/radar-tiles/00-09.webp
Normal file
|
After Width: | Height: | Size: 50 B |
BIN
server/images/maps/radar-tiles/01-00.webp
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
server/images/maps/radar-tiles/01-01.webp
Normal file
|
After Width: | Height: | Size: 55 KiB |
BIN
server/images/maps/radar-tiles/01-02.webp
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
server/images/maps/radar-tiles/01-03.webp
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
server/images/maps/radar-tiles/01-04.webp
Normal file
|
After Width: | Height: | Size: 50 KiB |
BIN
server/images/maps/radar-tiles/01-05.webp
Normal file
|
After Width: | Height: | Size: 54 KiB |
BIN
server/images/maps/radar-tiles/01-06.webp
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
server/images/maps/radar-tiles/01-07.webp
Normal file
|
After Width: | Height: | Size: 4.3 KiB |
BIN
server/images/maps/radar-tiles/01-08.webp
Normal file
|
After Width: | Height: | Size: 50 B |
BIN
server/images/maps/radar-tiles/01-09.webp
Normal file
|
After Width: | Height: | Size: 50 B |
BIN
server/images/maps/radar-tiles/02-00.webp
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
server/images/maps/radar-tiles/02-01.webp
Normal file
|
After Width: | Height: | Size: 56 KiB |
BIN
server/images/maps/radar-tiles/02-02.webp
Normal file
|
After Width: | Height: | Size: 48 KiB |
BIN
server/images/maps/radar-tiles/02-03.webp
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
server/images/maps/radar-tiles/02-04.webp
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
server/images/maps/radar-tiles/02-05.webp
Normal file
|
After Width: | Height: | Size: 39 KiB |
BIN
server/images/maps/radar-tiles/02-06.webp
Normal file
|
After Width: | Height: | Size: 34 KiB |
BIN
server/images/maps/radar-tiles/02-07.webp
Normal file
|
After Width: | Height: | Size: 35 KiB |
BIN
server/images/maps/radar-tiles/02-08.webp
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
server/images/maps/radar-tiles/02-09.webp
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
server/images/maps/radar-tiles/03-00.webp
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
server/images/maps/radar-tiles/03-01.webp
Normal file
|
After Width: | Height: | Size: 41 KiB |
BIN
server/images/maps/radar-tiles/03-02.webp
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
server/images/maps/radar-tiles/03-03.webp
Normal file
|
After Width: | Height: | Size: 52 KiB |
BIN
server/images/maps/radar-tiles/03-04.webp
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
server/images/maps/radar-tiles/03-05.webp
Normal file
|
After Width: | Height: | Size: 38 KiB |
BIN
server/images/maps/radar-tiles/03-06.webp
Normal file
|
After Width: | Height: | Size: 34 KiB |
BIN
server/images/maps/radar-tiles/03-07.webp
Normal file
|
After Width: | Height: | Size: 2.9 KiB |
BIN
server/images/maps/radar-tiles/03-08.webp
Normal file
|
After Width: | Height: | Size: 6.4 KiB |
BIN
server/images/maps/radar-tiles/03-09.webp
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
server/images/maps/radar-tiles/04-00.webp
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
server/images/maps/radar-tiles/04-01.webp
Normal file
|
After Width: | Height: | Size: 47 KiB |
BIN
server/images/maps/radar-tiles/04-02.webp
Normal file
|
After Width: | Height: | Size: 53 KiB |
BIN
server/images/maps/radar-tiles/04-03.webp
Normal file
|
After Width: | Height: | Size: 48 KiB |
BIN
server/images/maps/radar-tiles/04-04.webp
Normal file
|
After Width: | Height: | Size: 45 KiB |
BIN
server/images/maps/radar-tiles/04-05.webp
Normal file
|
After Width: | Height: | Size: 53 KiB |
BIN
server/images/maps/radar-tiles/04-06.webp
Normal file
|
After Width: | Height: | Size: 62 KiB |
BIN
server/images/maps/radar-tiles/04-07.webp
Normal file
|
After Width: | Height: | Size: 48 KiB |
BIN
server/images/maps/radar-tiles/04-08.webp
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
server/images/maps/radar-tiles/04-09.webp
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
server/images/maps/radar-tiles/05-00.webp
Normal file
|
After Width: | Height: | Size: 30 KiB |
BIN
server/images/maps/radar-tiles/05-01.webp
Normal file
|
After Width: | Height: | Size: 63 KiB |
BIN
server/images/maps/radar-tiles/05-02.webp
Normal file
|
After Width: | Height: | Size: 64 KiB |
BIN
server/images/maps/radar-tiles/05-03.webp
Normal file
|
After Width: | Height: | Size: 75 KiB |
BIN
server/images/maps/radar-tiles/05-04.webp
Normal file
|
After Width: | Height: | Size: 70 KiB |
BIN
server/images/maps/radar-tiles/05-05.webp
Normal file
|
After Width: | Height: | Size: 84 KiB |
BIN
server/images/maps/radar-tiles/05-06.webp
Normal file
|
After Width: | Height: | Size: 90 KiB |
BIN
server/images/maps/radar-tiles/05-07.webp
Normal file
|
After Width: | Height: | Size: 54 KiB |
BIN
server/images/maps/radar-tiles/05-08.webp
Normal file
|
After Width: | Height: | Size: 462 B |
BIN
server/images/maps/radar-tiles/05-09.webp
Normal file
|
After Width: | Height: | Size: 50 B |
BIN
server/images/maps/radar-tiles/06-00.webp
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
server/images/maps/radar-tiles/06-01.webp
Normal file
|
After Width: | Height: | Size: 62 KiB |
BIN
server/images/maps/radar-tiles/06-02.webp
Normal file
|
After Width: | Height: | Size: 69 KiB |
BIN
server/images/maps/radar-tiles/06-03.webp
Normal file
|
After Width: | Height: | Size: 90 KiB |
BIN
server/images/maps/radar-tiles/06-04.webp
Normal file
|
After Width: | Height: | Size: 109 KiB |
BIN
server/images/maps/radar-tiles/06-05.webp
Normal file
|
After Width: | Height: | Size: 97 KiB |
BIN
server/images/maps/radar-tiles/06-06.webp
Normal file
|
After Width: | Height: | Size: 89 KiB |
BIN
server/images/maps/radar-tiles/06-07.webp
Normal file
|
After Width: | Height: | Size: 30 KiB |
BIN
server/images/maps/radar-tiles/06-08.webp
Normal file
|
After Width: | Height: | Size: 50 B |
BIN
server/images/maps/radar-tiles/06-09.webp
Normal file
|
After Width: | Height: | Size: 482 B |
BIN
server/images/maps/radar-tiles/07-00.webp
Normal file
|
After Width: | Height: | Size: 604 B |
BIN
server/images/maps/radar-tiles/07-01.webp
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
server/images/maps/radar-tiles/07-02.webp
Normal file
|
After Width: | Height: | Size: 75 KiB |
BIN
server/images/maps/radar-tiles/07-03.webp
Normal file
|
After Width: | Height: | Size: 99 KiB |
BIN
server/images/maps/radar-tiles/07-04.webp
Normal file
|
After Width: | Height: | Size: 119 KiB |
BIN
server/images/maps/radar-tiles/07-05.webp
Normal file
|
After Width: | Height: | Size: 120 KiB |
BIN
server/images/maps/radar-tiles/07-06.webp
Normal file
|
After Width: | Height: | Size: 83 KiB |
BIN
server/images/maps/radar-tiles/07-07.webp
Normal file
|
After Width: | Height: | Size: 55 KiB |
BIN
server/images/maps/radar-tiles/07-08.webp
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
server/images/maps/radar-tiles/07-09.webp
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
server/images/maps/radar-tiles/08-00.webp
Normal file
|
After Width: | Height: | Size: 50 B |
BIN
server/images/maps/radar-tiles/08-01.webp
Normal file
|
After Width: | Height: | Size: 19 KiB |
BIN
server/images/maps/radar-tiles/08-02.webp
Normal file
|
After Width: | Height: | Size: 88 KiB |
BIN
server/images/maps/radar-tiles/08-03.webp
Normal file
|
After Width: | Height: | Size: 112 KiB |
BIN
server/images/maps/radar-tiles/08-04.webp
Normal file
|
After Width: | Height: | Size: 82 KiB |
BIN
server/images/maps/radar-tiles/08-05.webp
Normal file
|
After Width: | Height: | Size: 43 KiB |
BIN
server/images/maps/radar-tiles/08-06.webp
Normal file
|
After Width: | Height: | Size: 50 B |
BIN
server/images/maps/radar-tiles/08-07.webp
Normal file
|
After Width: | Height: | Size: 50 B |