Merge remote-tracking branch 'upstream/master'

pull/816/head
Shubham Verma 2020-10-03 05:15:30 +00:00 committed by GitHub
commit 501001ef21
59 changed files with 877 additions and 408 deletions

1
.gitignore vendored
View File

@ -23,6 +23,7 @@
.DS_Store
.idea
*.iml
.vscode/*
# debug
npm-debug.log*

View File

@ -1,4 +1,5 @@
.menu {
background: var(--gray50);
border: 1px solid var(--gray500);
border-radius: 4px;
overflow: hidden;

View File

@ -9,6 +9,7 @@ export default function MenuButton({
icon,
value,
options,
menuClassname,
menuPosition = 'bottom',
menuAlign = 'right',
onSelect,
@ -45,7 +46,7 @@ export default function MenuButton({
</Button>
{showMenu && (
<Menu
className={styles.menu}
className={classNames(styles.menu, menuClassname)}
options={options}
selectedOption={selectedOption}
onSelect={handleSelect}

View File

@ -7,21 +7,21 @@ import Button from './Button';
import useForceUpdate from '../../hooks/useForceUpdate';
export default function UpdateNotice() {
const forceUpdte = useForceUpdate();
const { hasUpdate, latest, updateCheck } = useVersion();
const forceUpdate = useForceUpdate();
const { hasUpdate, checked, latest, updateCheck } = useVersion(true);
function handleViewClick() {
location.href = 'https://github.com/mikecao/umami/releases';
updateCheck();
forceUpdte();
forceUpdate();
}
function handleDismissClick() {
updateCheck();
forceUpdte();
forceUpdate();
}
if (!hasUpdate) {
if (!hasUpdate || checked) {
return null;
}

View File

@ -6,6 +6,8 @@ import tinycolor from 'tinycolor2';
import useTheme from 'hooks/useTheme';
import { THEME_COLORS } from 'lib/constants';
import styles from './WorldMap.module.css';
import useCountryNames from 'hooks/useCountryNames';
import useLocale from 'hooks/useLocale';
const geoUrl = '/world-110m.json';
@ -21,6 +23,8 @@ export default function WorldMap({ data, className }) {
}),
[theme],
);
const [locale] = useLocale();
const countryNames = useCountryNames(locale);
function getFillColor(code) {
if (code === 'AQ') return;
@ -39,10 +43,10 @@ export default function WorldMap({ data, className }) {
return code === 'AQ' ? 0 : 1;
}
function handleHover({ ISO_A2: code, NAME: name }) {
function handleHover(code) {
if (code === 'AQ') return;
const country = data?.find(({ x }) => x === code);
setTooltip(`${name}: ${country?.y || 0} visitors`);
setTooltip(`${countryNames[code]}: ${country?.y || 0} visitors`);
}
return (
@ -70,7 +74,7 @@ export default function WorldMap({ data, className }) {
hover: { outline: 'none', fill: colors.hoverColor },
pressed: { outline: 'none' },
}}
onMouseOver={() => handleHover(geo.properties)}
onMouseOver={() => handleHover(code)}
onMouseOut={() => setTooltip(null)}
/>
);

View File

@ -1,6 +1,7 @@
import React, { useState } from 'react';
import { FormattedMessage } from 'react-intl';
import { Formik, Form, Field } from 'formik';
import { useRouter } from 'next/router';
import { post } from 'lib/web';
import Button from 'components/common/Button';
import FormLayout, {
@ -29,18 +30,17 @@ const validate = ({ user_id, username, password }) => {
};
export default function AccountEditForm({ values, onSave, onClose }) {
const { basePath } = useRouter();
const [message, setMessage] = useState();
const handleSubmit = async values => {
const response = await post(`/api/account`, values);
const { ok, data } = await post(`${basePath}/api/account`, values);
if (typeof response !== 'string') {
if (ok) {
onSave();
} else {
setMessage(
response || (
<FormattedMessage id="message.failure" defaultMessage="Something went wrong." />
),
data || <FormattedMessage id="message.failure" defaultMessage="Something went wrong." />,
);
}
};

View File

@ -1,5 +1,6 @@
import React, { useState } from 'react';
import { FormattedMessage } from 'react-intl';
import { useRouter } from 'next/router';
import { Formik, Form, Field } from 'formik';
import { post } from 'lib/web';
import Button from 'components/common/Button';
@ -37,18 +38,17 @@ const validate = ({ current_password, new_password, confirm_password }) => {
};
export default function ChangePasswordForm({ values, onSave, onClose }) {
const { basePath } = useRouter();
const [message, setMessage] = useState();
const handleSubmit = async values => {
const response = await post(`/api/account/password`, values);
const { ok, data } = await post(`${basePath}/api/account/password`, values);
if (typeof response !== 'string') {
if (ok) {
onSave();
} else {
setMessage(
response || (
<FormattedMessage id="message.failure" defaultMessage="Something went wrong." />
),
data || <FormattedMessage id="message.failure" defaultMessage="Something went wrong." />,
);
}
};

View File

@ -1,4 +1,6 @@
import React, { useState } from 'react';
import { FormattedMessage } from 'react-intl';
import { useRouter } from 'next/router';
import { Formik, Form, Field } from 'formik';
import { del } from 'lib/web';
import Button from 'components/common/Button';
@ -8,7 +10,6 @@ import FormLayout, {
FormMessage,
FormRow,
} from 'components/layout/FormLayout';
import { FormattedMessage } from 'react-intl';
const CONFIRMATION_WORD = 'DELETE';
@ -27,15 +28,18 @@ const validate = ({ confirmation }) => {
};
export default function DeleteForm({ values, onSave, onClose }) {
const { basePath } = useRouter();
const [message, setMessage] = useState();
const handleSubmit = async ({ type, id }) => {
const response = await del(`/api/${type}/${id}`);
const { ok, data } = await del(`${basePath}/api/${type}/${id}`);
if (typeof response !== 'string') {
if (ok) {
onSave();
} else {
setMessage(<FormattedMessage id="message.failure" defaultMessage="Something went wrong." />);
setMessage(
data || <FormattedMessage id="message.failure" defaultMessage="Something went wrong." />,
);
}
};

View File

@ -1,7 +1,7 @@
import React, { useState } from 'react';
import { FormattedMessage } from 'react-intl';
import { Formik, Form, Field } from 'formik';
import Router from 'next/router';
import { useRouter } from 'next/router';
import { post } from 'lib/web';
import Button from 'components/common/Button';
import FormLayout, {
@ -28,22 +28,26 @@ const validate = ({ username, password }) => {
};
export default function LoginForm() {
const router = useRouter();
const [message, setMessage] = useState();
const handleSubmit = async ({ username, password }) => {
const response = await post('/api/auth/login', { username, password });
const { ok, status, data } = await post(`${router.basePath}/api/auth/login`, {
username,
password,
});
if (typeof response !== 'string') {
await Router.push('/');
if (ok) {
return router.push('/');
} else {
setMessage(
response.startsWith('401') ? (
status === 401 ? (
<FormattedMessage
id="message.incorrect-username-password"
defaultMessage="Incorrect username/password."
/>
) : (
response
data
),
);
}

View File

@ -11,6 +11,7 @@ import FormLayout, {
} from 'components/layout/FormLayout';
import Checkbox from 'components/common/Checkbox';
import { DOMAIN_REGEX } from 'lib/constants';
import { useRouter } from 'next/router';
const initialValues = {
name: '',
@ -34,15 +35,18 @@ const validate = ({ name, domain }) => {
};
export default function WebsiteEditForm({ values, onSave, onClose }) {
const { basePath } = useRouter();
const [message, setMessage] = useState();
const handleSubmit = async values => {
const response = await post(`/api/website`, values);
const { ok, data } = await post(`${basePath}/api/website`, values);
if (typeof response !== 'string') {
if (ok) {
onSave();
} else {
setMessage(<FormattedMessage id="message.failure" defaultMessage="Something went wrong." />);
setMessage(
data || <FormattedMessage id="message.failure" defaultMessage="Something went wrong." />,
);
}
};

View File

@ -2,9 +2,10 @@ import React from 'react';
import { FormattedMessage } from 'react-intl';
import Link from 'components/common/Link';
import styles from './Footer.module.css';
import useVersion from 'hooks/useVersion';
export default function Footer() {
const version = process.env.VERSION;
const { current } = useVersion();
return (
<footer className="container">
<div className={styles.footer}>
@ -22,7 +23,7 @@ export default function Footer() {
}}
/>
</div>
<div>{`v${version}`}</div>
<div>{`v${current}`}</div>
</div>
</footer>
);

View File

@ -1,9 +1,18 @@
import React from 'react';
import MetricsTable from './MetricsTable';
import { countryFilter, percentFilter } from 'lib/filters';
import { percentFilter } from 'lib/filters';
import { FormattedMessage } from 'react-intl';
import useCountryNames from 'hooks/useCountryNames';
import useLocale from 'hooks/useLocale';
export default function CountriesTable({ websiteId, token, limit, onDataLoad = () => {} }) {
const [locale] = useLocale();
const countryNames = useCountryNames(locale);
function renderLabel({ x }) {
return <div className={locale}>{countryNames[x]}</div>;
}
return (
<MetricsTable
title={<FormattedMessage id="metrics.countries" defaultMessage="Countries" />}
@ -12,8 +21,8 @@ export default function CountriesTable({ websiteId, token, limit, onDataLoad = (
websiteId={websiteId}
token={token}
limit={limit}
dataFilter={countryFilter}
onDataLoad={data => onDataLoad(percentFilter(data))}
renderLabel={renderLabel}
/>
);
}

View File

@ -42,7 +42,7 @@ export default function WebsiteDetails({ websiteId, token }) {
} = usePageQuery();
const BackButton = () => (
<div className={styles.backButton}>
<div key="back-button" className={styles.backButton}>
<Link
key="back-button"
href={router.pathname}

View File

@ -1,16 +1,14 @@
import React from 'react';
import { FormattedMessage } from 'react-intl';
import { useRouter } from 'next/router';
import Link from 'components/common/Link';
import WebsiteChart from 'components/metrics/WebsiteChart';
import Page from 'components/layout/Page';
import Button from 'components/common/Button';
import EmptyPlaceholder from 'components/common/EmptyPlaceholder';
import useFetch from 'hooks/useFetch';
import Arrow from 'assets/arrow-right.svg';
import styles from './WebsiteList.module.css';
export default function WebsiteList({ userId }) {
const router = useRouter();
const { data } = useFetch('/api/websites', { user_id: userId });
if (!data) {
@ -33,9 +31,9 @@ export default function WebsiteList({ userId }) {
/>
}
>
<Button icon={<Arrow />} size="medium" onClick={() => router.push('/settings')}>
<Link href="/settings" icon={<Arrow />} iconRight>
<FormattedMessage id="message.go-to-settings" defaultMessage="Go to settings" />
</Button>
</Link>
</EmptyPlaceholder>
)}
</Page>

View File

@ -4,6 +4,7 @@ import { menuOptions } from 'lib/lang';
import useLocale from 'hooks/useLocale';
import MenuButton from 'components/common/MenuButton';
import Globe from 'assets/globe.svg';
import styles from './LanguageButton.module.css';
export default function LanguageButton() {
const [locale, setLocale] = useLocale();
@ -32,6 +33,7 @@ export default function LanguageButton() {
icon={<Globe />}
options={menuOptions}
value={locale}
menuClassname={styles.menu}
renderValue={option => option?.display}
onSelect={handleSelect}
/>

View File

@ -0,0 +1,12 @@
.menu {
display: flex;
flex-flow: row wrap;
min-width: 500px;
max-width: 100vw;
padding: 10px;
}
.menu div {
border-radius: 5px;
min-width: 33%;
}

34
hooks/useCountryNames.js Normal file
View File

@ -0,0 +1,34 @@
import { useState, useEffect } from 'react';
import { useRouter } from 'next/router';
import { get } from 'lib/web';
import enUS from 'public/country/en-US.json';
const countryNames = {
'en-US': enUS,
};
export default function useCountryNames(locale) {
const [list, setList] = useState(countryNames[locale] || enUS);
const { basePath } = useRouter();
async function loadData(locale) {
const { ok, data } = await get(`${basePath}/country/${locale}.json`);
if (ok) {
countryNames[locale] = data;
setList(countryNames[locale]);
} else {
setList(enUS);
}
}
useEffect(() => {
if (!countryNames[locale]) {
loadData(locale);
} else {
setList(countryNames[locale]);
}
}, [locale]);
return list;
}

View File

@ -2,12 +2,15 @@ import { useState, useEffect } from 'react';
import { useDispatch } from 'react-redux';
import { get } from 'lib/web';
import { updateQuery } from 'redux/actions/queries';
import { useRouter } from 'next/router';
export default function useFetch(url, params = {}, options = {}) {
const dispatch = useDispatch();
const [data, setData] = useState();
const [status, setStatus] = useState();
const [error, setError] = useState();
const [loading, setLoadiing] = useState(false);
const { basePath } = useRouter();
const keys = Object.keys(params)
.sort()
.map(key => params[key]);
@ -18,11 +21,12 @@ export default function useFetch(url, params = {}, options = {}) {
setLoadiing(true);
setError(null);
const time = performance.now();
const data = await get(url, params);
const { data, status } = await get(`${basePath}${url}`, params);
dispatch(updateQuery({ url, time: performance.now() - time, completed: Date.now() }));
setData(data);
setStatus(status);
onDataLoad(data);
} catch (e) {
console.error(e);
@ -46,5 +50,5 @@ export default function useFetch(url, params = {}, options = {}) {
}
}, [url, ...keys, ...update]);
return { data, error, loading, loadData };
return { data, status, error, loading };
}

View File

@ -1,6 +1,8 @@
import { useState, useEffect } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import { updateUser } from 'redux/actions/user';
import { useRouter } from 'next/router';
import { get } from '../lib/web';
export async function fetchUser() {
const res = await fetch('/api/auth/verify');
@ -13,29 +15,33 @@ export async function fetchUser() {
}
export default function useRequireLogin() {
const router = useRouter();
const dispatch = useDispatch();
const storeUser = useSelector(state => state.user);
const [loading, setLoading] = useState(!storeUser);
const [user, setUser] = useState(storeUser);
async function loadUser() {
setLoading(true);
const { ok, data } = await get(`${router.basePath}/api/auth/verify`);
if (!ok) {
return router.push('/login');
}
await dispatch(updateUser(data));
setUser(user);
setLoading(false);
}
useEffect(() => {
if (!loading && user) {
return;
}
setLoading(true);
fetchUser().then(async user => {
if (!user) {
window.location.href = '/login';
return;
}
await dispatch(updateUser(user));
setUser(user);
setLoading(false);
});
loadUser();
}, []);
return { user, loading };

View File

@ -4,7 +4,7 @@ import { getItem, setItem } from 'lib/web';
import { THEME_CONFIG } from 'lib/constants';
import { useEffect } from 'react';
export default function useLocale() {
export default function useTheme() {
const theme = useSelector(state => state.app.theme || getItem(THEME_CONFIG) || 'light');
const dispatch = useDispatch();

View File

@ -1,13 +1,14 @@
import { useState, useCallback } from 'react';
import { getTimezone } from 'lib/date';
import { getItem, setItem } from 'lib/web';
import { TIMEZONE_CONFIG } from 'lib/constants';
export default function useTimezone() {
const [timezone, setTimezone] = useState(getItem('umami.timezone') || getTimezone());
const [timezone, setTimezone] = useState(getItem(TIMEZONE_CONFIG) || getTimezone());
const saveTimezone = useCallback(
value => {
setItem('umami.timezone', value);
setItem(TIMEZONE_CONFIG, value);
setTimezone(value);
},
[setTimezone],

View File

@ -1,27 +1,23 @@
import { useEffect, useCallback } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import semver from 'semver';
import { getItem, setItem } from 'lib/web';
import { checkVersion } from 'redux/actions/app';
import { VERSION_CHECK } from 'lib/constants';
import { getItem, setItem } from 'lib/web';
export default function useVersion() {
export default function useVersion(check) {
const dispatch = useDispatch();
const versions = useSelector(state => state.app.versions);
const lastCheck = getItem(VERSION_CHECK);
const { current, latest } = versions;
const hasUpdate = latest && semver.gt(latest, current) && lastCheck?.version !== latest;
const checked = versions.latest === getItem(VERSION_CHECK)?.version;
const updateCheck = useCallback(() => {
setItem(VERSION_CHECK, { version: latest, time: Date.now() });
setItem(VERSION_CHECK, { version: versions.latest, time: Date.now() });
}, [versions]);
useEffect(() => {
if (!versions.latest) {
if (check && !versions.latest) {
dispatch(checkVersion());
}
}, [versions]);
}, [versions, check]);
return { ...versions, hasUpdate, updateCheck };
return { ...versions, checked, updateCheck };
}

View File

@ -7,7 +7,7 @@
"button.copy-to-clipboard": "In die Zwischenablage kopieren",
"button.date-range": "Datumsbereich",
"button.delete": "Löschen",
"button.dismiss": "Dismiss",
"button.dismiss": "Verwerfen",
"button.edit": "Bearbeiten",
"button.login": "Anmelden",
"button.more": "Mehr",
@ -55,7 +55,7 @@
"message.get-tracking-code": "Erstelle Tracking Kennung",
"message.go-to-settings": "Zu den Einstellungen",
"message.incorrect-username-password": "Falsches Passwort oder Benutzername.",
"message.new-version-available": "A new version of umami {version} is available!",
"message.new-version-available": "Eine neue Version umami {version} ist verfügbar!",
"message.no-data-available": "Keine Daten vorhanden.",
"message.no-websites-configured": "Es ist keine Webseite vorhanden.",
"message.page-not-found": "Seite nicht gefunden.",

View File

@ -7,7 +7,7 @@
"button.copy-to-clipboard": "Хуулах",
"button.date-range": "Хугацааны мужид",
"button.delete": "Устгах",
"button.dismiss": "Dismiss",
"button.dismiss": "Үл хэргэсэх",
"button.edit": "Засах",
"button.login": "Нэвтрэх",
"button.more": "Цааш",
@ -27,7 +27,7 @@
"label.enable-share-url": "Хуваалцах холбоос идэвхжүүлэх",
"label.invalid": "Буруу",
"label.invalid-domain": "Буруу домэйн",
"label.last-days": "Сүүлийн {x} өдөр",
"label.last-days": "Сүүлийн {x} хоног",
"label.last-hours": "Сүүлийн {x} цаг",
"label.logged-in-as": "{username}-р нэвтэрсэн",
"label.logout": "Гарах",
@ -55,7 +55,7 @@
"message.get-tracking-code": "Мөрдөх код авах",
"message.go-to-settings": "Тохиргоо руу очих",
"message.incorrect-username-password": "Буруу хэрэглэгчийн нэр/нууц үг.",
"message.new-version-available": "A new version of umami {version} is available!",
"message.new-version-available": "Umami-гийн шинэ хувилбар {version} гарсан байна!",
"message.no-data-available": "Өгөгдөл алга.",
"message.no-websites-configured": "Та ямар нэгэн веб тохируулаагүй байна.",
"message.page-not-found": "Хуудас олдсонгүй.",

97
lang/nb-NO.json Normal file
View File

@ -0,0 +1,97 @@
{
"button.add-account": "Legg til konto",
"button.add-website": "Legg til nettsted",
"button.back": "Tilbake",
"button.cancel": "Avvis",
"button.change-password": "Bytt passord",
"button.copy-to-clipboard": "Kopier til utklippstavle",
"button.date-range": "Datointervall",
"button.delete": "Slett",
"button.dismiss": "Avbryt",
"button.edit": "Rediger",
"button.login": "Logg inn",
"button.more": "Mer",
"button.refresh": "Oppdater",
"button.reset": "Nullstill",
"button.save": "Lagre",
"button.single-day": "Enkelt dag",
"button.view-details": "Vis detaljer",
"label.accounts": "Kontoer",
"label.administrator": "Administrator",
"label.confirm-password": "Godkjenn passord",
"label.current-password": "Nåværende passord",
"label.custom-range": "Egendefinert utvalg",
"label.dashboard": "Dashboard",
"label.default-date-range": "Standard datoperiode",
"label.domain": "Domene",
"label.enable-share-url": "Aktiver delings-URL",
"label.invalid": "Ugyldig",
"label.invalid-domain": "Ugyldig domene",
"label.last-days": "Siste {x} dager",
"label.last-hours": "Siste {x} timer",
"label.logged-in-as": "Logget på som {brukernavn}",
"label.logout": "Logg ut",
"label.name": "Navn",
"label.new-password": "Nytt passord",
"label.password": "Passord",
"label.passwords-dont-match": "Passordene er ikke like",
"label.profile": "Profil",
"label.required": "Påkrevd",
"label.settings": "Innstillinger",
"label.this-month": "Denne måneden",
"label.this-week": "Denne uka",
"label.this-year": "I år",
"label.timezone": "Tidssone",
"label.today": "I dag",
"label.unknown": "Ukjent",
"label.username": "Brukernavn",
"label.websites": "Nettsteder",
"message.active-users": "{x} {x, plural, one {besøkende} other {besøkende}} nå",
"message.confirm-delete": "Er du sikker på at du vil slette {target}?",
"message.copied": "Kopiert!",
"message.delete-warning": "Alle tilknyttede data slettes også.",
"message.failure": "Noe gikk galt.",
"message.get-share-url": "Få delings-URL",
"message.get-tracking-code": "Få sporingskode",
"message.go-to-settings": "Gå til innstillinger",
"message.incorrect-username-password": "Ugyldig brukernavn/passord.",
"message.new-version-available": "En ny versjon av umami {version} er tilgjengelig!",
"message.no-data-available": "Ingen data tilgjengelig.",
"message.no-websites-configured": "Du har ikke satt opp noen nettsteder.",
"message.page-not-found": "Side ikke funnet.",
"message.powered-by": "Drevet av {name}",
"message.save-success": "Lagret!",
"message.share-url": "Dette er den offentlige delings-URL-en for {target}.",
"message.track-stats": "For å spore statistikk for {target}, plasser følgende kode i {head}-delen av nettstedet ditt.",
"message.type-delete": "Skriv inn {delete} i boksen nedenfor for å bekrefte.",
"metrics.actions": "Handlinger",
"metrics.average-visit-time": "Gjennomsnittlig besøkelsestid",
"metrics.bounce-rate": "Avvisningsfrekvens",
"metrics.browsers": "Nettlesere",
"metrics.countries": "Land",
"metrics.device.desktop": "Desktop",
"metrics.device.laptop": "Laptop",
"metrics.device.mobile": "Mobiltelefon",
"metrics.device.tablet": "Nettbrett",
"metrics.devices": "Enheter",
"metrics.events": "Arrangementer",
"metrics.filter.combined": "Kombinert",
"metrics.filter.domain-only": "Bare domene",
"metrics.filter.raw": "Rå",
"metrics.operating-systems": "Operativsystemer",
"metrics.page-views": "Sidevisninger",
"metrics.pages": "Sider",
"metrics.referrers": "Referanser",
"metrics.unique-visitors": "Unike besøkende",
"metrics.views": "Visninger",
"metrics.visitors": "Besøkende",
"title.add-account": "Legg til konto",
"title.add-website": "Legg til nettsted",
"title.change-password": "Bytt passord",
"title.delete-account": "Slett konto",
"title.delete-website": "Slett nettstedet",
"title.edit-account": "Rediger konto",
"title.edit-website": "Rediger nettsted",
"title.share-url": "Del URL",
"title.tracking-code": "Sporingskode"
}

97
lang/pt-PT.json Normal file
View File

@ -0,0 +1,97 @@
{
"button.add-account": "Adicionar conta",
"button.add-website": "Adicionar website",
"button.back": "Voltar",
"button.cancel": "Cancelar",
"button.change-password": "Alterar palavra-passe",
"button.copy-to-clipboard": "Copiar para a área de transferência",
"button.date-range": "Intervalo de datas",
"button.delete": "Eliminar",
"button.dismiss": "Ignorar",
"button.edit": "Editar",
"button.login": "Iniciar sessão",
"button.more": "Mais",
"button.refresh": "Atualizar",
"button.reset": "Repor",
"button.save": "Guardar",
"button.single-day": "Dia único",
"button.view-details": "Ver detalhes",
"label.accounts": "Contas",
"label.administrator": "Administrador",
"label.confirm-password": "Confirmar palavra-passe",
"label.current-password": "Palavra-passe atual",
"label.custom-range": "Intervalo personalizado",
"label.dashboard": "Dashboard",
"label.default-date-range": "Intervalo de datas predefinido",
"label.domain": "Domínio",
"label.enable-share-url": "Ativar link de partilha",
"label.invalid": "Inválido",
"label.invalid-domain": "Domínio inválido",
"label.last-days": "Últimos {x} dias",
"label.last-hours": "Últimas {x} horas",
"label.logged-in-as": "Sessão iniciada como {username}",
"label.logout": "Sair",
"label.name": "Nome",
"label.new-password": "Nova palavra-passe",
"label.password": "Palavra-passe",
"label.passwords-dont-match": "Palavra-passes não correspondem",
"label.profile": "Perfil",
"label.required": "Obrigatório",
"label.settings": "Definições",
"label.this-month": "Este mês",
"label.this-week": "Esta semana",
"label.this-year": "Este ano",
"label.timezone": "Fuso horário",
"label.today": "Hoje",
"label.unknown": "Desconhecido",
"label.username": "Nome de utilizador",
"label.websites": "Websites",
"message.active-users": "{x} {x, plural, one {visitante} other {visitantes}} neste momento",
"message.confirm-delete": "Tens a certeza que queres eliminar {target}?",
"message.copied": "Copiado!",
"message.delete-warning": "Todos os dados associados também serão eliminados.",
"message.failure": "Ocorreu um erro.",
"message.get-share-url": "Obter link de partilha",
"message.get-tracking-code": "Obter código de tracking",
"message.go-to-settings": "Ir para as definições",
"message.incorrect-username-password": "Nome de utilizador/palavra-passe incorretos.",
"message.new-version-available": "Uma nova versão de umami {version} está disponível!",
"message.no-data-available": "Sem dados disponíveis.",
"message.no-websites-configured": "Não tens nenhum website configurado.",
"message.page-not-found": "Página não encontrada.",
"message.powered-by": "Distribuído por {name}",
"message.save-success": "Guardado com sucesso.",
"message.share-url": "Este é o link de partilha público para {target}.",
"message.track-stats": "Para recolheres estatísticas para {target}, coloca o seguinte código na secção {head} do teu website.",
"message.type-delete": "Escreve {delete} abaixo para confirmares.",
"metrics.actions": "Ações",
"metrics.average-visit-time": "Tempo médio de visita",
"metrics.bounce-rate": "Taxa de rejeição",
"metrics.browsers": "Navegadores",
"metrics.countries": "Países",
"metrics.device.desktop": "Desktop",
"metrics.device.laptop": "Portátil",
"metrics.device.mobile": "Telemóvel",
"metrics.device.tablet": "Tablet",
"metrics.devices": "Dispositivos",
"metrics.events": "Eventos",
"metrics.filter.combined": "Combinado",
"metrics.filter.domain-only": "Apenas domínio",
"metrics.filter.raw": "Dados brutos",
"metrics.operating-systems": "Sistemas operativos",
"metrics.page-views": "Visualizações da página",
"metrics.pages": "Páginas",
"metrics.referrers": "Referrers",
"metrics.unique-visitors": "Visitantes únicos",
"metrics.views": "Visualizações",
"metrics.visitors": "Visitantes",
"title.add-account": "Adicionar conta",
"title.add-website": "Adicionar website",
"title.change-password": "Alterar palavra-passe",
"title.delete-account": "Eliminar conta",
"title.delete-website": "Eliminar website",
"title.edit-account": "Editar conta",
"title.edit-website": "Editar website",
"title.share-url": "Partilhar link",
"title.tracking-code": "Código de tracking"
}

97
lang/ro-RO.json Normal file
View File

@ -0,0 +1,97 @@
{
"button.add-account": "Adaugă cont",
"button.add-website": "Adaugă site web",
"button.back": "Înapoi",
"button.cancel": "Anulează",
"button.change-password": "Schimbă parola",
"button.copy-to-clipboard": "Copiază în clipboard",
"button.date-range": "Interval de date",
"button.delete": "Șterge",
"button.dismiss": "Renunță",
"button.edit": "Editare",
"button.login": "Autentificare",
"button.more": "Mai mult",
"button.refresh": "Reîmprospătare",
"button.reset": "Resetează",
"button.save": "Salvează",
"button.single-day": "O singură zi",
"button.view-details": "Vizualizare detalii",
"label.accounts": "Conturi",
"label.administrator": "Administrator",
"label.confirm-password": "Confirmare parolă",
"label.current-password": "Parola curentă",
"label.custom-range": "Interval personalizat",
"label.dashboard": "Tablou de bord",
"label.default-date-range": "Interval de date implicit",
"label.domain": "Domeniu",
"label.enable-share-url": "Activare adresa URL de distribuire",
"label.invalid": "Invalid",
"label.invalid-domain": "Invalid domain",
"label.last-days": "Ultimele {x} zile",
"label.last-hours": "Ultimele {x} ore",
"label.logged-in-as": "Autentificat ca {username}",
"label.logout": "Dezautentificare",
"label.name": "Nume",
"label.new-password": "Parola nouă",
"label.password": "Parolă",
"label.passwords-dont-match": "Parolele nu se potrivesc",
"label.profile": "Profil",
"label.required": "Obligatoriu",
"label.settings": "Setări",
"label.this-month": "Această lună",
"label.this-week": "Această săptămână",
"label.this-year": "Acest an",
"label.timezone": "Fus orar",
"label.today": "Astăzi",
"label.unknown": "Necunoscut",
"label.username": "Username",
"label.websites": "Site-uri web",
"message.active-users": "{x} {x, plural, one {vizitator activ} other {vizitatori activi}}",
"message.confirm-delete": "Sunteți sigur că doriți să ștergeți {target}?",
"message.copied": "Copiat!",
"message.delete-warning": "Toate datele asociate vor fi șterse, de asemenea.",
"message.failure": "Ceva n-a mers bine.",
"message.get-share-url": "Obține adresa URL de partajare",
"message.get-tracking-code": "Obține codul de urmărire",
"message.go-to-settings": "Mergi la Setări",
"message.incorrect-username-password": "Username/parolă incorecte.",
"message.new-version-available": "Este disponibilă o nouă versiune {version} de umami!",
"message.no-data-available": "Nicio informație disponibilă.",
"message.no-websites-configured": "Nu aveți niciun site web configurat.",
"message.page-not-found": "Pagina nu a fost găsită.",
"message.powered-by": "Cu sprijinul {name}",
"message.save-success": "Salvat cu succes.",
"message.share-url": "Aceasta este adresa URL de partajare pentru {target}.",
"message.track-stats": "Pentru a urmări statisticile pentru {target}, plasați următorul cod în secțiunea {head} a site-ului dvs. web.",
"message.type-delete": "Tastați {delete} în casuța de mai jos pentru a confirma.",
"metrics.actions": "Acțiuni",
"metrics.average-visit-time": "Timp mediu de vizitare",
"metrics.bounce-rate": "Rata de respingere",
"metrics.browsers": "Browsere",
"metrics.countries": "Țări",
"metrics.device.desktop": "Desktop",
"metrics.device.laptop": "Laptop",
"metrics.device.mobile": "Mobil",
"metrics.device.tablet": "Tabletă",
"metrics.devices": "Dispozitive",
"metrics.events": "Evenimente",
"metrics.filter.combined": "Combinat",
"metrics.filter.domain-only": "Numai domeniu",
"metrics.filter.raw": "Brut",
"metrics.operating-systems": "Sisteme de operare",
"metrics.page-views": "Vizualizări de pagină",
"metrics.pages": "Pagini",
"metrics.referrers": "Site-uri de proveniență",
"metrics.unique-visitors": "Vizitatori unici",
"metrics.views": "Vizualizări",
"metrics.visitors": "Vizitatori",
"title.add-account": "Adăugare cont",
"title.add-website": "Adăugare site web",
"title.change-password": "Schimbare parolă",
"title.delete-account": "Ștergere cont",
"title.delete-website": "Ștergere site web",
"title.edit-account": "Editare cont",
"title.edit-website": "Editare site web",
"title.share-url": "Partajare URL",
"title.tracking-code": "Cod de urmărire"
}

View File

@ -7,7 +7,7 @@
"button.copy-to-clipboard": "Скопировать в буфер обмена",
"button.date-range": "Диапазон дат",
"button.delete": "Удалить",
"button.dismiss": "Dismiss",
"button.dismiss": "Отклонить",
"button.edit": "Редактировать",
"button.login": "Войти",
"button.more": "Больше",
@ -55,7 +55,7 @@
"message.get-tracking-code": "Получить код отслеживания",
"message.go-to-settings": "Перейти к настройкам",
"message.incorrect-username-password": "Неверное имя пользователя/пароль.",
"message.new-version-available": "A new version of umami {version} is available!",
"message.new-version-available": "Доступна новая версия umami {version}",
"message.no-data-available": "Нет данных.",
"message.no-websites-configured": "У вас нет настроенных сайтов.",
"message.page-not-found": "Страница не найдена.",

View File

@ -132,251 +132,3 @@ export const BROWSERS = {
'ios-webview': 'iOS (webview)',
searchbot: 'Searchbot',
};
export const ISO_COUNTRIES = {
AF: 'Afghanistan',
AX: 'Aland Islands',
AL: 'Albania',
DZ: 'Algeria',
AS: 'American Samoa',
AD: 'Andorra',
AO: 'Angola',
AI: 'Anguilla',
AQ: 'Antarctica',
AG: 'Antigua And Barbuda',
AR: 'Argentina',
AM: 'Armenia',
AW: 'Aruba',
AU: 'Australia',
AT: 'Austria',
AZ: 'Azerbaijan',
BS: 'Bahamas',
BH: 'Bahrain',
BD: 'Bangladesh',
BB: 'Barbados',
BY: 'Belarus',
BE: 'Belgium',
BZ: 'Belize',
BJ: 'Benin',
BM: 'Bermuda',
BT: 'Bhutan',
BO: 'Bolivia',
BA: 'Bosnia And Herzegovina',
BW: 'Botswana',
BV: 'Bouvet Island',
BR: 'Brazil',
IO: 'British Indian Ocean Territory',
BN: 'Brunei Darussalam',
BG: 'Bulgaria',
BF: 'Burkina Faso',
BI: 'Burundi',
KH: 'Cambodia',
CM: 'Cameroon',
CA: 'Canada',
CV: 'Cape Verde',
KY: 'Cayman Islands',
CF: 'Central African Republic',
TD: 'Chad',
CL: 'Chile',
CN: 'China',
CX: 'Christmas Island',
CC: 'Cocos (Keeling) Islands',
CO: 'Colombia',
KM: 'Comoros',
CG: 'Congo',
CD: 'Congo, Democratic Republic',
CK: 'Cook Islands',
CR: 'Costa Rica',
CI: "Cote D'Ivoire",
HR: 'Croatia',
CU: 'Cuba',
CY: 'Cyprus',
CZ: 'Czech Republic',
DK: 'Denmark',
DJ: 'Djibouti',
DM: 'Dominica',
DO: 'Dominican Republic',
EC: 'Ecuador',
EG: 'Egypt',
SV: 'El Salvador',
GQ: 'Equatorial Guinea',
ER: 'Eritrea',
EE: 'Estonia',
ET: 'Ethiopia',
FK: 'Falkland Islands (Malvinas)',
FO: 'Faroe Islands',
FJ: 'Fiji',
FI: 'Finland',
FR: 'France',
GF: 'French Guiana',
PF: 'French Polynesia',
TF: 'French Southern Territories',
GA: 'Gabon',
GM: 'Gambia',
GE: 'Georgia',
DE: 'Germany',
GH: 'Ghana',
GI: 'Gibraltar',
GR: 'Greece',
GL: 'Greenland',
GD: 'Grenada',
GP: 'Guadeloupe',
GU: 'Guam',
GT: 'Guatemala',
GG: 'Guernsey',
GN: 'Guinea',
GW: 'Guinea-Bissau',
GY: 'Guyana',
HT: 'Haiti',
HM: 'Heard Island & Mcdonald Islands',
VA: 'Holy See (Vatican City State)',
HN: 'Honduras',
HK: 'Hong Kong',
HU: 'Hungary',
IS: 'Iceland',
IN: 'India',
ID: 'Indonesia',
IR: 'Iran, Islamic Republic Of',
IQ: 'Iraq',
IE: 'Ireland',
IM: 'Isle Of Man',
IL: 'Israel',
IT: 'Italy',
JM: 'Jamaica',
JP: 'Japan',
JE: 'Jersey',
JO: 'Jordan',
KZ: 'Kazakhstan',
KE: 'Kenya',
KI: 'Kiribati',
KR: 'Korea',
KW: 'Kuwait',
KG: 'Kyrgyzstan',
LA: "Lao People's Democratic Republic",
LV: 'Latvia',
LB: 'Lebanon',
LS: 'Lesotho',
LR: 'Liberia',
LY: 'Libyan Arab Jamahiriya',
LI: 'Liechtenstein',
LT: 'Lithuania',
LU: 'Luxembourg',
MO: 'Macao',
MK: 'Macedonia',
MG: 'Madagascar',
MW: 'Malawi',
MY: 'Malaysia',
MV: 'Maldives',
ML: 'Mali',
MT: 'Malta',
MH: 'Marshall Islands',
MQ: 'Martinique',
MR: 'Mauritania',
MU: 'Mauritius',
YT: 'Mayotte',
MX: 'Mexico',
FM: 'Micronesia, Federated States Of',
MD: 'Moldova',
MC: 'Monaco',
MN: 'Mongolia',
ME: 'Montenegro',
MS: 'Montserrat',
MA: 'Morocco',
MZ: 'Mozambique',
MM: 'Myanmar',
NA: 'Namibia',
NR: 'Nauru',
NP: 'Nepal',
NL: 'Netherlands',
AN: 'Netherlands Antilles',
NC: 'New Caledonia',
NZ: 'New Zealand',
NI: 'Nicaragua',
NE: 'Niger',
NG: 'Nigeria',
NU: 'Niue',
NF: 'Norfolk Island',
MP: 'Northern Mariana Islands',
NO: 'Norway',
OM: 'Oman',
PK: 'Pakistan',
PW: 'Palau',
PS: 'Palestinian Territory, Occupied',
PA: 'Panama',
PG: 'Papua New Guinea',
PY: 'Paraguay',
PE: 'Peru',
PH: 'Philippines',
PN: 'Pitcairn',
PL: 'Poland',
PT: 'Portugal',
PR: 'Puerto Rico',
QA: 'Qatar',
RE: 'Reunion',
RO: 'Romania',
RU: 'Russia',
RW: 'Rwanda',
BL: 'Saint Barthelemy',
SH: 'Saint Helena',
KN: 'Saint Kitts And Nevis',
LC: 'Saint Lucia',
MF: 'Saint Martin',
PM: 'Saint Pierre And Miquelon',
VC: 'Saint Vincent And Grenadines',
WS: 'Samoa',
SM: 'San Marino',
ST: 'Sao Tome And Principe',
SA: 'Saudi Arabia',
SN: 'Senegal',
RS: 'Serbia',
SC: 'Seychelles',
SL: 'Sierra Leone',
SG: 'Singapore',
SK: 'Slovakia',
SI: 'Slovenia',
SB: 'Solomon Islands',
SO: 'Somalia',
ZA: 'South Africa',
GS: 'South Georgia And Sandwich Isl.',
ES: 'Spain',
LK: 'Sri Lanka',
SD: 'Sudan',
SR: 'Suriname',
SJ: 'Svalbard And Jan Mayen',
SZ: 'Swaziland',
SE: 'Sweden',
CH: 'Switzerland',
SY: 'Syrian Arab Republic',
TW: 'Taiwan',
TJ: 'Tajikistan',
TZ: 'Tanzania',
TH: 'Thailand',
TL: 'Timor-Leste',
TG: 'Togo',
TK: 'Tokelau',
TO: 'Tonga',
TT: 'Trinidad And Tobago',
TN: 'Tunisia',
TR: 'Turkey',
TM: 'Turkmenistan',
TC: 'Turks And Caicos Islands',
TV: 'Tuvalu',
UG: 'Uganda',
UA: 'Ukraine',
AE: 'United Arab Emirates',
GB: 'United Kingdom',
US: 'United States',
UM: 'United States Outlying Islands',
UY: 'Uruguay',
UZ: 'Uzbekistan',
VU: 'Vanuatu',
VE: 'Venezuela',
VN: 'Viet Nam',
VG: 'Virgin Islands, British',
VI: 'Virgin Islands, U.S.',
WF: 'Wallis And Futuna',
EH: 'Western Sahara',
YE: 'Yemen',
ZM: 'Zambia',
ZW: 'Zimbabwe',
};

View File

@ -1,5 +1,5 @@
import firstBy from 'thenby';
import { BROWSERS, ISO_COUNTRIES } from './constants';
import { BROWSERS } from './constants';
import { removeTrailingSlash, removeWWW, getDomainName } from './url';
export const urlFilter = (data, { raw }) => {
@ -125,9 +125,6 @@ export const osFilter = data => data.filter(({ x }) => x);
export const deviceFilter = data => data.filter(({ x }) => x);
export const countryFilter = data =>
data.map(({ x, y }) => ({ x: ISO_COUNTRIES[x] || x, y })).filter(({ x }) => x);
export const percentFilter = data => {
const total = data.reduce((n, { y }) => n + y, 0);
return data.map(({ x, y, ...props }) => ({ x, y, z: total ? (y / total) * 100 : 0, ...props }));

View File

@ -1,5 +1,5 @@
import { format } from 'date-fns';
import { enUS, nl, zhCN, tr, ru, de, ja, es, fr, da, sv, el } from 'date-fns/locale';
import { enUS, nl, zhCN, tr, ru, de, ja, es, fr, da, sv, el, pt, ro, nb } from 'date-fns/locale';
import enMessages from 'lang-compiled/en-US.json';
import nlMessages from 'lang-compiled/nl-NL.json';
import zhCNMessages from 'lang-compiled/zh-CN.json';
@ -14,6 +14,9 @@ import daMessages from 'lang-compiled/da-DK.json';
import svMessages from 'lang-compiled/sv-SE.json';
import grMessages from 'lang-compiled/el-GR.json';
import foMessages from 'lang-compiled/fo-FO.json';
import ptMessages from 'lang-compiled/pt-PT.json';
import roMessages from 'lang-compiled/ro-RO.json';
import nbNOMessages from 'lang-compiled/nb-NO.json';
export const messages = {
'en-US': enMessages,
@ -30,6 +33,9 @@ export const messages = {
'sv-SE': svMessages,
'el-GR': grMessages,
'fo-FO': foMessages,
'pt-PT': ptMessages,
'ro-RO': roMessages,
'nb-NO': nbNOMessages,
};
export const dateLocales = {
@ -47,13 +53,16 @@ export const dateLocales = {
'mn-MN': enUS,
'el-GR': el,
'fo-FO': da,
'pt-PT': pt,
'ro-RO': ro,
'nb-NO': nb,
};
export const menuOptions = [
{ label: 'English', value: 'en-US', display: 'en' },
{ label: '中文', value: 'zh-CN', display: 'cn' },
{ label: 'Dansk', value: 'da-DK', display: 'da' },
{ label: 'Deutsch', value: 'de-DE', display: 'de' },
{ label: 'English', value: 'en-US', display: 'en' },
{ label: 'Español', value: 'es-MX', display: 'es' },
{ label: 'Føroyskt', value: 'fo-FO', display: 'fo' },
{ label: 'Français', value: 'fr-FR', display: 'fr' },
@ -61,7 +70,10 @@ export const menuOptions = [
{ label: '日本語', value: 'ja-JP', display: 'ja' },
{ label: 'Монгол', value: 'mn-MN', display: 'mn' },
{ label: 'Nederlands', value: 'nl-NL', display: 'nl' },
{ label: 'Norsk Bokmål', value: 'nb-NO', display: 'nb' },
{ label: 'Português', value: 'pt-PT', display: 'pt' },
{ label: 'Русский', value: 'ru-RU', display: 'ru' },
{ label: 'Română', value: 'ro-RO', display: 'ro' },
{ label: 'Svenska', value: 'sv-SE', display: 'sv' },
{ label: 'Türkçe', value: 'tr-TR', display: 'tr' },
];

View File

@ -25,7 +25,7 @@ export async function runQuery(query) {
});
}
export async function rawQuery(query, params) {
export async function rawQuery(query, params = []) {
const db = getDatabase();
if (db !== POSTGRESQL && db !== MYSQL) {

View File

@ -1,6 +1,6 @@
import { getQueryString } from './url';
export const apiRequest = (method, url, body) =>
export const apiRequest = (method, url, body, headers) =>
fetch(url, {
method,
cache: 'no-cache',
@ -8,18 +8,15 @@ export const apiRequest = (method, url, body) =>
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
...headers,
},
body,
}).then(res => {
if (res.ok) {
return res.json();
return res.json().then(data => ({ ok: res.ok, status: res.status, data }));
}
if (['post', 'put', 'delete'].includes(method)) {
return res.text();
}
return null;
return res.text().then(data => ({ ok: res.ok, status: res.status, res: res, data }));
});
export const get = (url, params) => apiRequest('get', `${url}${getQueryString(params)}`);

View File

@ -1,6 +1,6 @@
{
"name": "umami",
"version": "0.62.0",
"version": "0.72.0",
"description": "A simple, fast, website analytics alternative to Google Analytics. ",
"author": "Mike Cao <mike@mikecao.com>",
"license": "MIT",
@ -13,6 +13,7 @@
"dev": "next dev",
"build": "npm-run-all build-tracker build-lang build-geo build-db build-app",
"start": "next start",
"start-env": "node scripts/start-env.js",
"build-app": "next build",
"build-tracker": "rollup -c rollup.tracker.config.js",
"build-db": "npm-run-all copy-db-schema build-db-client",
@ -29,7 +30,11 @@
"extract-lang": "formatjs extract {pages,components}/**/*.js --out-file build/messages.json",
"merge-lang": "node scripts/merge-lang.js",
"format-lang": "node scripts/format-lang.js",
"compile-lang": "formatjs compile-folder --ast build lang-compiled"
"compile-lang": "formatjs compile-folder --ast build lang-compiled",
"check-lang": "node scripts/check-lang.js",
"loadtest": "node scripts/loadtest.js",
"loadtest:medium": "node scripts/loadtest.js --weight=medium",
"loadtest:heavy": "node scripts/loadtest.js --weight=heavy --verbose"
},
"lint-staged": {
"**/*.js": [
@ -61,7 +66,8 @@
"date-fns": "^2.16.1",
"date-fns-tz": "^1.0.10",
"detect-browser": "^5.1.1",
"formik": "^2.1.6",
"dotenv": "^8.2.0",
"formik": "^2.1.7",
"immer": "^7.0.9",
"is-localhost-ip": "^1.4.0",
"isbot-fast": "^1.2.0",
@ -71,7 +77,7 @@
"next": "^9.5.3",
"react": "^16.13.1",
"react-dom": "^16.13.1",
"react-intl": "^5.8.3",
"react-intl": "^5.8.4",
"react-redux": "^7.2.1",
"react-simple-maps": "^2.1.2",
"react-spring": "^8.0.27",
@ -87,7 +93,7 @@
"uuid": "^8.3.0"
},
"devDependencies": {
"@formatjs/cli": "^2.12.0",
"@formatjs/cli": "^2.13.0",
"@prisma/cli": "2.8.0",
"@rollup/plugin-buble": "^0.21.3",
"@rollup/plugin-node-resolve": "^9.0.0",
@ -95,7 +101,6 @@
"@svgr/webpack": "^5.4.0",
"cross-env": "^7.0.2",
"del": "^6.0.0",
"dotenv": "^8.2.0",
"dotenv-cli": "^4.0.0",
"eslint": "^7.10.0",
"eslint-config-prettier": "^6.12.0",
@ -105,6 +110,7 @@
"extract-react-intl-messages": "^4.1.1",
"husky": "^4.3.0",
"lint-staged": "^10.4.0",
"loadtest": "5.1.0",
"npm-run-all": "^4.1.5",
"postcss-flexbugs-fixes": "^4.2.1",
"postcss-import": "^12.0.1",

View File

@ -1,6 +1,6 @@
import { serialize } from 'cookie';
import { AUTH_COOKIE_NAME } from 'lib/constants';
import { redirect } from 'lib/response';
import { ok } from 'lib/response';
export default async (req, res) => {
const cookie = serialize(AUTH_COOKIE_NAME, '', {
@ -11,5 +11,5 @@ export default async (req, res) => {
res.setHeader('Set-Cookie', [cookie]);
return redirect(res, '/login');
return ok(res);
};

View File

@ -1,8 +1,12 @@
import { useEffect } from 'react';
import { useRouter } from 'next/router';
export default function LogoutPage() {
const router = useRouter();
const { basePath } = router;
useEffect(() => {
fetch('/api/auth/logout').then(() => (window.location.href = '/login'));
fetch(`${basePath}/api/auth/logout`).then(() => router.push('/login'));
}, []);
return null;

View File

@ -0,0 +1 @@
{"AF":"Afghanistan","AL":"Albanien","DZ":"Algeriet","AS":"Amerikansk Samoa","UM":"Amerikanske overs\u00f8iske \u00f8er","AD":"Andorra","AO":"Angola","AI":"Anguilla","AQ":"Antarktis","AG":"Antigua og Barbuda","AR":"Argentina","AM":"Armenien","AW":"Aruba","AZ":"Aserbajdsjan","AU":"Australien","BS":"Bahamas","BH":"Bahrain","BD":"Bangladesh","BB":"Barbados","BE":"Belgien","BZ":"Belize","BJ":"Benin","BM":"Bermuda","BT":"Bhutan","BO":"Bolivia","BA":"Bosnien-Hercegovina","BW":"Botswana","BV":"Bouvet\u00f8en","BR":"Brasilien","BN":"Brunei","BG":"Bulgarien","BF":"Burkina Faso","BI":"Burundi","KH":"Cambodja","CM":"Cameroun","CA":"Canada","KY":"Cayman\u00f8erne","CL":"Chile","CC":"Cocos\u00f8erne","CO":"Colombia","KM":"Comorerne","CG":"Congo-Brazzaville","CD":"Congo-Kinshasa","CK":"Cook\u00f8erne","CR":"Costa Rica","CU":"Cuba","CW":"Cura\u00e7ao","CY":"Cypern","DK":"Danmark","VI":"De Amerikanske Jomfru\u00f8er","VG":"De Britiske Jomfru\u00f8er","AE":"De Forenede Arabiske Emirater","TF":"De Franske Besiddelser i Det Sydlige Indiske Ocean og Antarktis","PS":"De pal\u00e6stinensiske omr\u00e5der","BQ":"De tidligere Nederlandske Antiller","CF":"Den Centralafrikanske Republik","DO":"Den Dominikanske Republik","IO":"Det Britiske Territorium i Det Indiske Ocean","DJ":"Djibouti","DM":"Dominica","EC":"Ecuador","EG":"Egypten","SV":"El Salvador","CI":"Elfenbenskysten","ER":"Eritrea","EE":"Estland","SZ":"Eswatini","ET":"Etiopien","FK":"Falklands\u00f8erne","FJ":"Fiji","PH":"Filippinerne","FI":"Finland","FR":"Frankrig","GF":"Fransk Guyana","PF":"Fransk Polynesien","FO":"F\u00e6r\u00f8erne","GA":"Gabon","GM":"Gambia","GE":"Georgien","GH":"Ghana","GI":"Gibraltar","GD":"Grenada","GR":"Gr\u00e6kenland","GL":"Gr\u00f8nland","GP":"Guadeloupe","GU":"Guam","GT":"Guatemala","GG":"Guernsey","GN":"Guinea","GW":"Guinea-Bissau","GY":"Guyana","HT":"Haiti","HM":"Heard Island og McDonald Islands","NL":"Holland","HN":"Honduras","BY":"Hviderusland","IN":"Indien","ID":"Indonesien","IQ":"Irak","IR":"Iran","IE":"Irland","IS":"Island","IM":"Isle of Man","IL":"Israel","IT":"Italien","JM":"Jamaica","JP":"Japan","JE":"Jersey","JO":"Jordan","CX":"Jule\u00f8en","CV":"Kap Verde","KZ":"Kasakhstan","KE":"Kenya","CN":"Kina","KG":"Kirgisistan","KI":"Kiribati","HR":"Kroatien","KW":"Kuwait","LA":"Laos","LS":"Lesotho","LV":"Letland","LB":"Libanon","LR":"Liberia","LY":"Libyen","LI":"Liechtenstein","LT":"Litauen","LU":"Luxembourg","MG":"Madagaskar","MW":"Malawi","MY":"Malaysia","MV":"Maldiverne","ML":"Mali","MT":"Malta","MA":"Marokko","MH":"Marshall\u00f8erne","MQ":"Martinique","MR":"Mauretanien","MU":"Mauritius","YT":"Mayotte","MX":"Mexico","FM":"Mikronesien","MD":"Moldova","MC":"Monaco","MN":"Mongoliet","ME":"Montenegro","MS":"Montserrat","MZ":"Mozambique","MM":"Myanmar (Burma)","NA":"Namibia","NR":"Nauru","NP":"Nepal","NZ":"New Zealand","NI":"Nicaragua","NE":"Niger","NG":"Nigeria","NU":"Niue","KP":"Nordkorea","MK":"Nordmakedonien","MP":"Nordmarianerne","NF":"Norfolk Island","NO":"Norge","NC":"Ny Kaledonien","OM":"Oman","PK":"Pakistan","PW":"Palau","PA":"Panama","PG":"Papua Ny Guinea","PY":"Paraguay","PE":"Peru","PN":"Pitcairn","PL":"Polen","PT":"Portugal","PR":"Puerto Rico","QA":"Qatar","RE":"R\u00e9union","RO":"Rum\u00e6nien","RU":"Rusland","RW":"Rwanda","BL":"Saint Barth\u00e9lemy","KN":"Saint Kitts og Nevis","LC":"Saint Lucia","MF":"Saint Martin","PM":"Saint Pierre og Miquelon","VC":"Saint Vincent og Grenadinerne","SB":"Salomon\u00f8erne","WS":"Samoa","SM":"San Marino","ST":"S\u00e3o Tom\u00e9 og Pr\u00edncipe","HK":"SAR Hongkong","MO":"SAR Macao","SA":"Saudi-Arabien","CH":"Schweiz","SN":"Senegal","RS":"Serbien","SC":"Seychellerne","SL":"Sierra Leone","SG":"Singapore","SX":"Sint Maarten","SK":"Slovakiet","SI":"Slovenien","SO":"Somalia","GS":"South Georgia og De Sydlige Sandwich\u00f8er","ES":"Spanien","LK":"Sri Lanka","SH":"St. Helena","GB":"Storbritannien","SD":"Sudan","SR":"Surinam","SJ":"Svalbard og Jan Mayen","SE":"Sverige","ZA":"Sydafrika","KR":"Sydkorea","SS":"Sydsudan","SY":"Syrien","TJ":"Tadsjikistan","TW":"Taiwan","TZ":"Tanzania","TD":"Tchad","TH":"Thailand","TL":"Timor-Leste","CZ":"Tjekkiet","TG":"Togo","TK":"Tokelau","TO":"Tonga","TT":"Trinidad og Tobago","TN":"Tunesien","TM":"Turkmenistan","TC":"Turks- og Caicos\u00f8erne","TV":"Tuvalu","TR":"Tyrkiet","DE":"Tyskland","UG":"Uganda","UA":"Ukraine","HU":"Ungarn","UY":"Uruguay","US":"USA","UZ":"Usbekistan","VU":"Vanuatu","VA":"Vatikanstaten","VE":"Venezuela","EH":"Vestsahara","VN":"Vietnam","WF":"Wallis og Futuna","YE":"Yemen","ZM":"Zambia","ZW":"Zimbabwe","GQ":"\u00c6kvatorialguinea","AT":"\u00d8strig","AX":"\u00c5land"}

View File

@ -0,0 +1 @@
{"AF":"Afghanistan","EG":"\u00c4gypten","AX":"\u00c5landinseln","AL":"Albanien","DZ":"Algerien","AS":"Amerikanisch-Samoa","VI":"Amerikanische Jungferninseln","UM":"Amerikanische \u00dcberseeinseln","AD":"Andorra","AO":"Angola","AI":"Anguilla","AQ":"Antarktis","AG":"Antigua und Barbuda","GQ":"\u00c4quatorialguinea","AR":"Argentinien","AM":"Armenien","AW":"Aruba","AZ":"Aserbaidschan","ET":"\u00c4thiopien","AU":"Australien","BS":"Bahamas","BH":"Bahrain","BD":"Bangladesch","BB":"Barbados","BY":"Belarus","BE":"Belgien","BZ":"Belize","BJ":"Benin","BM":"Bermuda","BT":"Bhutan","BO":"Bolivien","BQ":"Bonaire, Sint Eustatius und Saba","BA":"Bosnien und Herzegowina","BW":"Botsuana","BV":"Bouvetinsel","BR":"Brasilien","VG":"Britische Jungferninseln","IO":"Britisches Territorium im Indischen Ozean","BN":"Brunei Darussalam","BG":"Bulgarien","BF":"Burkina Faso","BI":"Burundi","CV":"Cabo Verde","CL":"Chile","CN":"China","CK":"Cookinseln","CR":"Costa Rica","CI":"C\u00f4te d\u2019Ivoire","CW":"Cura\u00e7ao","DK":"D\u00e4nemark","DE":"Deutschland","DM":"Dominica","DO":"Dominikanische Republik","DJ":"Dschibuti","EC":"Ecuador","SV":"El Salvador","ER":"Eritrea","EE":"Estland","SZ":"Eswatini","FK":"Falklandinseln","FO":"F\u00e4r\u00f6er","FJ":"Fidschi","FI":"Finnland","FR":"Frankreich","GF":"Franz\u00f6sisch-Guayana","PF":"Franz\u00f6sisch-Polynesien","TF":"Franz\u00f6sische S\u00fcd- und Antarktisgebiete","GA":"Gabun","GM":"Gambia","GE":"Georgien","GH":"Ghana","GI":"Gibraltar","GD":"Grenada","GR":"Griechenland","GL":"Gr\u00f6nland","GP":"Guadeloupe","GU":"Guam","GT":"Guatemala","GG":"Guernsey","GN":"Guinea","GW":"Guinea-Bissau","GY":"Guyana","HT":"Haiti","HM":"Heard und McDonaldinseln","HN":"Honduras","IN":"Indien","ID":"Indonesien","IQ":"Irak","IR":"Iran","IE":"Irland","IS":"Island","IM":"Isle of Man","IL":"Israel","IT":"Italien","JM":"Jamaika","JP":"Japan","YE":"Jemen","JE":"Jersey","JO":"Jordanien","KY":"Kaimaninseln","KH":"Kambodscha","CM":"Kamerun","CA":"Kanada","KZ":"Kasachstan","QA":"Katar","KE":"Kenia","KG":"Kirgisistan","KI":"Kiribati","CC":"Kokosinseln","CO":"Kolumbien","KM":"Komoren","CG":"Kongo-Brazzaville","CD":"Kongo-Kinshasa","HR":"Kroatien","CU":"Kuba","KW":"Kuwait","LA":"Laos","LS":"Lesotho","LV":"Lettland","LB":"Libanon","LR":"Liberia","LY":"Libyen","LI":"Liechtenstein","LT":"Litauen","LU":"Luxemburg","MG":"Madagaskar","MW":"Malawi","MY":"Malaysia","MV":"Malediven","ML":"Mali","MT":"Malta","MA":"Marokko","MH":"Marshallinseln","MQ":"Martinique","MR":"Mauretanien","MU":"Mauritius","YT":"Mayotte","MX":"Mexiko","FM":"Mikronesien","MC":"Monaco","MN":"Mongolei","ME":"Montenegro","MS":"Montserrat","MZ":"Mosambik","MM":"Myanmar","NA":"Namibia","NR":"Nauru","NP":"Nepal","NC":"Neukaledonien","NZ":"Neuseeland","NI":"Nicaragua","NL":"Niederlande","NE":"Niger","NG":"Nigeria","NU":"Niue","KP":"Nordkorea","MP":"N\u00f6rdliche Marianen","MK":"Nordmazedonien","NF":"Norfolkinsel","NO":"Norwegen","OM":"Oman","AT":"\u00d6sterreich","PK":"Pakistan","PS":"Pal\u00e4stinensische Autonomiegebiete","PW":"Palau","PA":"Panama","PG":"Papua-Neuguinea","PY":"Paraguay","PE":"Peru","PH":"Philippinen","PN":"Pitcairninseln","PL":"Polen","PT":"Portugal","PR":"Puerto Rico","MD":"Republik Moldau","RE":"R\u00e9union","RW":"Ruanda","RO":"Rum\u00e4nien","RU":"Russland","SB":"Salomonen","ZM":"Sambia","WS":"Samoa","SM":"San Marino","ST":"S\u00e3o Tom\u00e9 und Pr\u00edncipe","SA":"Saudi-Arabien","SE":"Schweden","CH":"Schweiz","SN":"Senegal","RS":"Serbien","SC":"Seychellen","SL":"Sierra Leone","ZW":"Simbabwe","SG":"Singapur","SX":"Sint Maarten","SK":"Slowakei","SI":"Slowenien","SO":"Somalia","HK":"Sonderverwaltungsregion Hongkong","MO":"Sonderverwaltungsregion Macau","ES":"Spanien","SJ":"Spitzbergen und Jan Mayen","LK":"Sri Lanka","BL":"St. Barth\u00e9lemy","SH":"St. Helena","KN":"St. Kitts und Nevis","LC":"St. Lucia","MF":"St. Martin","PM":"St. Pierre und Miquelon","VC":"St. Vincent und die Grenadinen","ZA":"S\u00fcdafrika","SD":"Sudan","GS":"S\u00fcdgeorgien und die S\u00fcdlichen Sandwichinseln","KR":"S\u00fcdkorea","SS":"S\u00fcdsudan","SR":"Suriname","SY":"Syrien","TJ":"Tadschikistan","TW":"Taiwan","TZ":"Tansania","TH":"Thailand","TL":"Timor-Leste","TG":"Togo","TK":"Tokelau","TO":"Tonga","TT":"Trinidad und Tobago","TD":"Tschad","CZ":"Tschechien","TN":"Tunesien","TR":"T\u00fcrkei","TM":"Turkmenistan","TC":"Turks- und Caicosinseln","TV":"Tuvalu","UG":"Uganda","UA":"Ukraine","HU":"Ungarn","UY":"Uruguay","UZ":"Usbekistan","VU":"Vanuatu","VA":"Vatikanstadt","VE":"Venezuela","AE":"Vereinigte Arabische Emirate","US":"Vereinigte Staaten","GB":"Vereinigtes K\u00f6nigreich","VN":"Vietnam","WF":"Wallis und Futuna","CX":"Weihnachtsinsel","EH":"Westsahara","CF":"Zentralafrikanische Republik","CY":"Zypern"}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
{"AF":"Afghanistan","AX":"\u00c5land Islands","AL":"Albania","DZ":"Algeria","AS":"American Samoa","AD":"Andorra","AO":"Angola","AI":"Anguilla","AQ":"Antarctica","AG":"Antigua & Barbuda","AR":"Argentina","AM":"Armenia","AW":"Aruba","AU":"Australia","AT":"Austria","AZ":"Azerbaijan","BS":"Bahamas","BH":"Bahrain","BD":"Bangladesh","BB":"Barbados","BY":"Belarus","BE":"Belgium","BZ":"Belize","BJ":"Benin","BM":"Bermuda","BT":"Bhutan","BO":"Bolivia","BA":"Bosnia & Herzegovina","BW":"Botswana","BV":"Bouvet Island","BR":"Brazil","IO":"British Indian Ocean Territory","VG":"British Virgin Islands","BN":"Brunei","BG":"Bulgaria","BF":"Burkina Faso","BI":"Burundi","KH":"Cambodia","CM":"Cameroon","CA":"Canada","CV":"Cape Verde","BQ":"Caribbean Netherlands","KY":"Cayman Islands","CF":"Central African Republic","TD":"Chad","CL":"Chile","CN":"China","CX":"Christmas Island","CC":"Cocos (Keeling) Islands","CO":"Colombia","KM":"Comoros","CG":"Congo - Brazzaville","CD":"Congo - Kinshasa","CK":"Cook Islands","CR":"Costa Rica","CI":"C\u00f4te d\u2019Ivoire","HR":"Croatia","CU":"Cuba","CW":"Cura\u00e7ao","CY":"Cyprus","CZ":"Czechia","DK":"Denmark","DJ":"Djibouti","DM":"Dominica","DO":"Dominican Republic","EC":"Ecuador","EG":"Egypt","SV":"El Salvador","GQ":"Equatorial Guinea","ER":"Eritrea","EE":"Estonia","SZ":"Eswatini","ET":"Ethiopia","FK":"Falkland Islands","FO":"Faroe Islands","FJ":"Fiji","FI":"Finland","FR":"France","GF":"French Guiana","PF":"French Polynesia","TF":"French Southern Territories","GA":"Gabon","GM":"Gambia","GE":"Georgia","DE":"Germany","GH":"Ghana","GI":"Gibraltar","GR":"Greece","GL":"Greenland","GD":"Grenada","GP":"Guadeloupe","GU":"Guam","GT":"Guatemala","GG":"Guernsey","GN":"Guinea","GW":"Guinea-Bissau","GY":"Guyana","HT":"Haiti","HM":"Heard & McDonald Islands","HN":"Honduras","HK":"Hong Kong SAR China","HU":"Hungary","IS":"Iceland","IN":"India","ID":"Indonesia","IR":"Iran","IQ":"Iraq","IE":"Ireland","IM":"Isle of Man","IL":"Israel","IT":"Italy","JM":"Jamaica","JP":"Japan","JE":"Jersey","JO":"Jordan","KZ":"Kazakhstan","KE":"Kenya","KI":"Kiribati","KW":"Kuwait","KG":"Kyrgyzstan","LA":"Laos","LV":"Latvia","LB":"Lebanon","LS":"Lesotho","LR":"Liberia","LY":"Libya","LI":"Liechtenstein","LT":"Lithuania","LU":"Luxembourg","MO":"Macao SAR China","MG":"Madagascar","MW":"Malawi","MY":"Malaysia","MV":"Maldives","ML":"Mali","MT":"Malta","MH":"Marshall Islands","MQ":"Martinique","MR":"Mauritania","MU":"Mauritius","YT":"Mayotte","MX":"Mexico","FM":"Micronesia","MD":"Moldova","MC":"Monaco","MN":"Mongolia","ME":"Montenegro","MS":"Montserrat","MA":"Morocco","MZ":"Mozambique","MM":"Myanmar (Burma)","NA":"Namibia","NR":"Nauru","NP":"Nepal","NL":"Netherlands","NC":"New Caledonia","NZ":"New Zealand","NI":"Nicaragua","NE":"Niger","NG":"Nigeria","NU":"Niue","NF":"Norfolk Island","KP":"North Korea","MK":"North Macedonia","MP":"Northern Mariana Islands","NO":"Norway","OM":"Oman","PK":"Pakistan","PW":"Palau","PS":"Palestinian Territories","PA":"Panama","PG":"Papua New Guinea","PY":"Paraguay","PE":"Peru","PH":"Philippines","PN":"Pitcairn Islands","PL":"Poland","PT":"Portugal","PR":"Puerto Rico","QA":"Qatar","RE":"R\u00e9union","RO":"Romania","RU":"Russia","RW":"Rwanda","WS":"Samoa","SM":"San Marino","ST":"S\u00e3o Tom\u00e9 & Pr\u00edncipe","SA":"Saudi Arabia","SN":"Senegal","RS":"Serbia","SC":"Seychelles","SL":"Sierra Leone","SG":"Singapore","SX":"Sint Maarten","SK":"Slovakia","SI":"Slovenia","SB":"Solomon Islands","SO":"Somalia","ZA":"South Africa","GS":"South Georgia & South Sandwich Islands","KR":"South Korea","SS":"South Sudan","ES":"Spain","LK":"Sri Lanka","BL":"St. Barth\u00e9lemy","SH":"St. Helena","KN":"St. Kitts & Nevis","LC":"St. Lucia","MF":"St. Martin","PM":"St. Pierre & Miquelon","VC":"St. Vincent & Grenadines","SD":"Sudan","SR":"Suriname","SJ":"Svalbard & Jan Mayen","SE":"Sweden","CH":"Switzerland","SY":"Syria","TW":"Taiwan","TJ":"Tajikistan","TZ":"Tanzania","TH":"Thailand","TL":"Timor-Leste","TG":"Togo","TK":"Tokelau","TO":"Tonga","TT":"Trinidad & Tobago","TN":"Tunisia","TR":"Turkey","TM":"Turkmenistan","TC":"Turks & Caicos Islands","TV":"Tuvalu","UM":"U.S. Outlying Islands","VI":"U.S. Virgin Islands","UG":"Uganda","UA":"Ukraine","AE":"United Arab Emirates","GB":"United Kingdom","US":"United States","UY":"Uruguay","UZ":"Uzbekistan","VU":"Vanuatu","VA":"Vatican City","VE":"Venezuela","VN":"Vietnam","WF":"Wallis & Futuna","EH":"Western Sahara","YE":"Yemen","ZM":"Zambia","ZW":"Zimbabwe"}

View File

@ -0,0 +1 @@
{"AF":"Afganist\u00e1n","AL":"Albania","DE":"Alemania","AD":"Andorra","AO":"Angola","AI":"Anguila","AQ":"Ant\u00e1rtida","AG":"Antigua y Barbuda","SA":"Arabia Saudita","DZ":"Argelia","AR":"Argentina","AM":"Armenia","AW":"Aruba","AU":"Australia","AT":"Austria","AZ":"Azerbaiy\u00e1n","BS":"Bahamas","BD":"Banglad\u00e9s","BB":"Barbados","BH":"Bar\u00e9in","BE":"B\u00e9lgica","BZ":"Belice","BJ":"Ben\u00edn","BM":"Bermudas","BY":"Bielorrusia","BO":"Bolivia","BA":"Bosnia y Herzegovina","BW":"Botsuana","BR":"Brasil","BN":"Brun\u00e9i","BG":"Bulgaria","BF":"Burkina Faso","BI":"Burundi","BT":"But\u00e1n","CV":"Cabo Verde","KH":"Camboya","CM":"Camer\u00fan","CA":"Canad\u00e1","BQ":"Caribe neerland\u00e9s","QA":"Catar","TD":"Chad","CZ":"Chequia","CL":"Chile","CN":"China","CY":"Chipre","VA":"Ciudad del Vaticano","CO":"Colombia","KM":"Comoras","CG":"Congo","KP":"Corea del Norte","KR":"Corea del Sur","CR":"Costa Rica","CI":"C\u00f4te d\u2019Ivoire","HR":"Croacia","CU":"Cuba","CW":"Curazao","DK":"Dinamarca","DM":"Dominica","EC":"Ecuador","EG":"Egipto","SV":"El Salvador","AE":"Emiratos \u00c1rabes Unidos","ER":"Eritrea","SK":"Eslovaquia","SI":"Eslovenia","ES":"Espa\u00f1a","US":"Estados Unidos","EE":"Estonia","SZ":"Eswatini","ET":"Etiop\u00eda","PH":"Filipinas","FI":"Finlandia","FJ":"Fiyi","FR":"Francia","GA":"Gab\u00f3n","GM":"Gambia","GE":"Georgia","GH":"Ghana","GI":"Gibraltar","GD":"Granada","GR":"Grecia","GL":"Groenlandia","GP":"Guadalupe","GU":"Guam","GT":"Guatemala","GF":"Guayana Francesa","GG":"Guernsey","GN":"Guinea","GQ":"Guinea Ecuatorial","GW":"Guinea-Bis\u00e1u","GY":"Guyana","HT":"Hait\u00ed","HN":"Honduras","HU":"Hungr\u00eda","IN":"India","ID":"Indonesia","IQ":"Irak","IR":"Ir\u00e1n","IE":"Irlanda","BV":"Isla Bouvet","IM":"Isla de Man","CX":"Isla de Navidad","NF":"Isla Norfolk","IS":"Islandia","AX":"Islas \u00c5land","KY":"Islas Caim\u00e1n","CC":"Islas Cocos","CK":"Islas Cook","FO":"Islas Feroe","GS":"Islas Georgia del Sur y Sandwich del Sur","HM":"Islas Heard y McDonald","FK":"Islas Malvinas","MP":"Islas Marianas del Norte","MH":"Islas Marshall","UM":"Islas menores alejadas de EE. UU.","PN":"Islas Pitcairn","SB":"Islas Salom\u00f3n","TC":"Islas Turcas y Caicos","VG":"Islas V\u00edrgenes Brit\u00e1nicas","VI":"Islas V\u00edrgenes de EE. UU.","IL":"Israel","IT":"Italia","JM":"Jamaica","JP":"Jap\u00f3n","JE":"Jersey","JO":"Jordania","KZ":"Kazajist\u00e1n","KE":"Kenia","KG":"Kirguist\u00e1n","KI":"Kiribati","KW":"Kuwait","LA":"Laos","LS":"Lesoto","LV":"Letonia","LB":"L\u00edbano","LR":"Liberia","LY":"Libia","LI":"Liechtenstein","LT":"Lituania","LU":"Luxemburgo","MK":"Macedonia del Norte","MG":"Madagascar","MY":"Malasia","MW":"Malaui","MV":"Maldivas","ML":"Mali","MT":"Malta","MA":"Marruecos","MQ":"Martinica","MU":"Mauricio","MR":"Mauritania","YT":"Mayotte","MX":"M\u00e9xico","FM":"Micronesia","MD":"Moldavia","MC":"M\u00f3naco","MN":"Mongolia","ME":"Montenegro","MS":"Montserrat","MZ":"Mozambique","MM":"Myanmar (Birmania)","NA":"Namibia","NR":"Nauru","NP":"Nepal","NI":"Nicaragua","NE":"N\u00edger","NG":"Nigeria","NU":"Niue","NO":"Noruega","NC":"Nueva Caledonia","NZ":"Nueva Zelanda","OM":"Om\u00e1n","NL":"Pa\u00edses Bajos","PK":"Pakist\u00e1n","PW":"Palaos","PA":"Panam\u00e1","PG":"Pap\u00faa Nueva Guinea","PY":"Paraguay","PE":"Per\u00fa","PF":"Polinesia Francesa","PL":"Polonia","PT":"Portugal","PR":"Puerto Rico","HK":"RAE de Hong Kong (China)","MO":"RAE de Macao (China)","GB":"Reino Unido","CF":"Rep\u00fablica Centroafricana","CD":"Rep\u00fablica Democr\u00e1tica del Congo","DO":"Rep\u00fablica Dominicana","RE":"Reuni\u00f3n","RW":"Ruanda","RO":"Rumania","RU":"Rusia","EH":"S\u00e1hara Occidental","WS":"Samoa","AS":"Samoa Americana","BL":"San Bartolom\u00e9","KN":"San Crist\u00f3bal y Nieves","SM":"San Marino","MF":"San Mart\u00edn","PM":"San Pedro y Miquel\u00f3n","VC":"San Vicente y las Granadinas","SH":"Santa Elena","LC":"Santa Luc\u00eda","ST":"Santo Tom\u00e9 y Pr\u00edncipe","SN":"Senegal","RS":"Serbia","SC":"Seychelles","SL":"Sierra Leona","SG":"Singapur","SX":"Sint Maarten","SY":"Siria","SO":"Somalia","LK":"Sri Lanka","ZA":"Sud\u00e1frica","SD":"Sud\u00e1n","SS":"Sud\u00e1n del Sur","SE":"Suecia","CH":"Suiza","SR":"Surinam","SJ":"Svalbard y Jan Mayen","TH":"Tailandia","TW":"Taiw\u00e1n","TZ":"Tanzania","TJ":"Tayikist\u00e1n","IO":"Territorio Brit\u00e1nico del Oc\u00e9ano \u00cdndico","TF":"Territorios Australes Franceses","PS":"Territorios Palestinos","TL":"Timor-Leste","TG":"Togo","TK":"Tokelau","TO":"Tonga","TT":"Trinidad y Tobago","TN":"T\u00fanez","TM":"Turkmenist\u00e1n","TR":"Turqu\u00eda","TV":"Tuvalu","UA":"Ucrania","UG":"Uganda","UY":"Uruguay","UZ":"Uzbekist\u00e1n","VU":"Vanuatu","VE":"Venezuela","VN":"Vietnam","WF":"Wallis y Futuna","YE":"Yemen","DJ":"Yibuti","ZM":"Zambia","ZW":"Zimbabue"}

View File

@ -0,0 +1 @@
{"AF":"Afganistan","AX":"\u00c1land","AL":"Albania","DZ":"Algeria","AS":"Amerikanska Samoa","AD":"Andorra","AO":"Angola","AI":"Anguilla","AQ":"Antarktis","AG":"Antigua & Barbuda","AR":"Argentina","AM":"Armenia","AW":"Aruba","AZ":"Aserbadjan","AU":"Avstralia","BS":"Bahamaoyggjar","BD":"Bangladesj","BB":"Barbados","BH":"Barein","BE":"Belgia","BZ":"Belis","BJ":"Benin","BM":"Bermuda","BO":"Bolivia","BA":"Bosnia-Hersegovina","BW":"Botsvana","BV":"Bouvetoyggj","BR":"Brasil","BN":"Brunei","BG":"Bulgaria","BF":"Burkina Faso","BI":"Burundi","BT":"Butan","KY":"Caymanoyggjar","CK":"Cooksoyggjar","CW":"Cura\u00e7ao","DK":"Danmark","DJ":"Djibuti","DM":"Dominika","DO":"Dominikal\u00fd\u00f0veldi\u00f0","EG":"Egyptaland","EC":"Ekvador","GQ":"Ekvatorguinea","SV":"El Salvador","ER":"Eritrea","EE":"Estland","SZ":"Esvatini","ET":"Etiopia","AT":"Eysturr\u00edki","TL":"Eysturtimor","FK":"Falklandsoyggjar","FJ":"Fiji","CI":"F\u00edlabeinsstrondin","PH":"Filipsoyggjar","FI":"Finnland","FR":"Frakland","GF":"Franska Gujana","PF":"Franska Polynesia","TF":"Fronsku sunnaru landa\u00f8ki","FO":"F\u00f8royar","GA":"Gabon","GM":"Gambia","GH":"Gana","GE":"Georgia","GI":"Gibraltar","GD":"Grenada","GR":"Grikkaland","CV":"Gr\u00f8nh\u00f8vdaoyggjar","GL":"Gr\u00f8nland","GP":"Guadeloupe","GU":"Guam","GT":"Guatemala","GG":"Guernsey","GN":"Guinea","GW":"Guinea-Bissau","GY":"Gujana","HT":"Haiti","HM":"Heard og McDonaldoyggjar","HN":"Honduras","HK":"Hong Kong SAR Kina","BY":"Hv\u00edtarussland","IN":"India","ID":"Indonesia","IQ":"Irak","IR":"Iran","IE":"\u00cdrland","IS":"\u00cdsland","IM":"Isle of Man","IL":"\u00cdsrael","IT":"Italia","JM":"Jamaika","JP":"Japan","YE":"Jemen","JE":"Jersey","CX":"J\u00f3laoyggjin","JO":"Jordan","KH":"Kambodja","CM":"Kamerun","CA":"Kanada","KZ":"Kasakstan","QA":"Katar","CZ":"Kekkia","KE":"Kenja","CL":"Kili","CN":"Kina","KG":"Kirgisia","KI":"Kiribati","TD":"Kjad","CC":"Kokosoyggjar","CO":"Kolombia","KM":"Komoroyggjar","CG":"Kongo","CD":"Kongo, Dem. L\u00fd\u00f0veldi\u00f0","CR":"Kosta Rika","HR":"Kroatia","CU":"Kuba","KW":"Kuvait","CY":"K\u00fdpros","LA":"Laos","LS":"Lesoto","LV":"Lettland","LB":"Libanon","LR":"Liberia","LY":"Libya","LI":"Liktinstein","LT":"Litava","LU":"Luksemborg","MG":"Madagaskar","MO":"Makao SAR Kina","MY":"Malaisia","MW":"Malavi","MV":"Maldivoyggjar","ML":"Mali","MT":"Malta","MA":"Marokko","MH":"Marshalloyggjar","MQ":"Martinique","YT":"Mayotte","MX":"Meksiko","CF":"Mi\u00f0afrikal\u00fd\u00f0veldi\u00f0","FM":"Mikronesiasamveldi\u00f0","MD":"Moldova","MC":"Monako","MN":"Mongolia","ME":"Montenegro","MS":"Montserrat","MR":"M\u00f3ritania","MU":"M\u00f3ritius","MZ":"Mosambik","MM":"Myanmar (Burma)","NA":"Namibia","NR":"Nauru","NP":"Nepal","NL":"Ni\u00f0urlond","BQ":"Ni\u00f0urlonds Karibia","NE":"Niger","NG":"Nigeria","NI":"Nikaragua","NU":"Niue","MP":"Nor\u00f0aru Mariuoyggjar","KP":"Nor\u00f0urkorea","NO":"Noreg","NF":"Norfolksoyggj","MK":"North Macedonia","NC":"N\u00fdkaled\u00f3nia","NZ":"N\u00fds\u00e6land","OM":"Oman","PK":"Pakistan","PW":"Palau","PS":"Palestinskt land\u00f8ki","PA":"Panama","PG":"Papua N\u00fdguinea","PY":"Paraguai","PE":"Peru","PN":"Pitcairnoyggjar","PL":"P\u00f3lland","PT":"Portugal","PR":"Puerto Riko","RE":"R\u00e9union","RW":"Ruanda","RO":"Rumenia","RU":"Russland","PM":"Saint Pierre & Miquelon","SB":"Salomonoyggjar","US":"Sambandsr\u00edki Amerika","UM":"Sambandsr\u00edki Amerikas fjarskotnu oyggjar","VI":"Sambandsr\u00edki Amerikas Jomfr\u00faoyggjar","ZM":"Sambia","AE":"Sameindu Emirr\u00edkini","WS":"Samoa","SM":"San Marino","ST":"Sao Tome & Prinsipi","SA":"Saudiarabia","SN":"Senegal","RS":"Serbia","SC":"Seyskelloyggjar","SL":"Sierra Leona","ZW":"Simbabvi","SG":"Singapor","SX":"Sint Maarten","SK":"Slovakia","SI":"Slovenia","SO":"Somalia","ES":"Spania","LK":"Sri Lanka","MF":"St-Martin","BL":"St. Barth\u00e9lemy","SH":"St. Helena","KN":"St. Kitts & Nevis","LC":"St. Lusia","VC":"St. Vinsent & Grenadinoyggjar","IO":"St\u00f3ra Bretlands Indiahavoyggjar","VG":"St\u00f3ra Bretlands Jomfr\u00faoyggjar","GB":"St\u00f3rabretland","SD":"Sudan","ZA":"Su\u00f0urafrika","GS":"Su\u00f0urgeorgia og Su\u00f0ursandwichoyggjar","KR":"Su\u00f0urkorea","SS":"Su\u00f0ursudan","SR":"Surinam","SJ":"Svalbard & Jan Mayen","CH":"Sveis","SE":"Sv\u00f8r\u00edki","SY":"S\u00fdria","TJ":"Tadsjikistan","TH":"Tailand","TW":"Taivan","TZ":"Tansania","TG":"Togo","TK":"Tokelau","TO":"Tonga","TT":"Trinidad & Tobago","TN":"Tunesia","TR":"Turkaland","TM":"Turkmenistan","TC":"Turks- og Caicosoyggjar","TV":"Tuvalu","DE":"T\u00fdskland","UG":"Uganda","UA":"Ukraina","HU":"Ungarn","UY":"Uruguai","UZ":"Usbekistan","VU":"Vanuatu","VA":"Vatikanb\u00fdur","VE":"Venesuela","EH":"Vestursahara","VN":"Vjetnam","WF":"Wallis- og Futunaoyggjar"}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
{"AF":"Afghanistan","AL":"Albania","DZ":"Algerie","AS":"Amerikansk Samoa","AD":"Andorra","AO":"Angola","AI":"Anguilla","AQ":"Antarktis","AG":"Antigua og Barbuda","AR":"Argentina","AM":"Armenia","AW":"Aruba","AZ":"Aserbajdsjan","AU":"Australia","BS":"Bahamas","BH":"Bahrain","BD":"Bangladesh","BB":"Barbados","BE":"Belgia","BZ":"Belize","BJ":"Benin","BM":"Bermuda","BT":"Bhutan","BO":"Bolivia","BA":"Bosnia-Hercegovina","BW":"Botswana","BV":"Bouvet\u00f8ya","BR":"Brasil","BN":"Brunei","BG":"Bulgaria","BF":"Burkina Faso","BI":"Burundi","CA":"Canada","KY":"Cayman\u00f8yene","CL":"Chile","CX":"Christmas\u00f8ya","CO":"Colombia","CK":"Cook\u00f8yene","CR":"Costa Rica","CU":"Cuba","CW":"Cura\u00e7ao","DK":"Danmark","VI":"De amerikanske jomfru\u00f8yene","VG":"De britiske jomfru\u00f8yene","AE":"De forente arabiske emirater","TF":"De franske s\u00f8rterritorier","DO":"Den dominikanske republikk","CF":"Den sentralafrikanske republikk","IO":"Det britiske territoriet i Indiahavet","PS":"Det palestinske omr\u00e5det","DJ":"Djibouti","DM":"Dominica","EC":"Ecuador","EG":"Egypt","GQ":"Ekvatorial-Guinea","SV":"El Salvador","CI":"Elfenbenskysten","ER":"Eritrea","EE":"Estland","SZ":"Eswatini","ET":"Etiopia","FK":"Falklands\u00f8yene","FJ":"Fiji","PH":"Filippinene","FI":"Finland","FR":"Frankrike","GF":"Fransk Guyana","PF":"Fransk Polynesia","FO":"F\u00e6r\u00f8yene","GA":"Gabon","GM":"Gambia","GE":"Georgia","GH":"Ghana","GI":"Gibraltar","GD":"Grenada","GL":"Gr\u00f8nland","GP":"Guadeloupe","GU":"Guam","GT":"Guatemala","GG":"Guernsey","GN":"Guinea","GW":"Guinea-Bissau","GY":"Guyana","HT":"Haiti","HM":"Heard- og McDonald\u00f8yene","GR":"Hellas","HN":"Honduras","HK":"Hongkong S.A.R. Kina","BY":"Hviterussland","IN":"India","ID":"Indonesia","IQ":"Irak","IR":"Iran","IE":"Irland","IS":"Island","IL":"Israel","IT":"Italia","JM":"Jamaica","JP":"Japan","YE":"Jemen","JE":"Jersey","JO":"Jordan","KH":"Kambodsja","CM":"Kamerun","CV":"Kapp Verde","BQ":"Karibisk Nederland","KZ":"Kasakhstan","KE":"Kenya","CN":"Kina","KG":"Kirgisistan","KI":"Kiribati","CC":"Kokos\u00f8yene","KM":"Komorene","CG":"Kongo-Brazzaville","CD":"Kongo-Kinshasa","HR":"Kroatia","KW":"Kuwait","CY":"Kypros","LA":"Laos","LV":"Latvia","LS":"Lesotho","LB":"Libanon","LR":"Liberia","LY":"Libya","LI":"Liechtenstein","LT":"Litauen","LU":"Luxemburg","MO":"Macao S.A.R. Kina","MG":"Madagaskar","MW":"Malawi","MY":"Malaysia","MV":"Maldivene","ML":"Mali","MT":"Malta","IM":"Man","MA":"Marokko","MH":"Marshall\u00f8yene","MQ":"Martinique","MR":"Mauritania","MU":"Mauritius","YT":"Mayotte","MX":"Mexico","FM":"Mikronesiaf\u00f8derasjonen","MD":"Moldova","MC":"Monaco","MN":"Mongolia","ME":"Montenegro","MS":"Montserrat","MZ":"Mosambik","MM":"Myanmar (Burma)","NA":"Namibia","NR":"Nauru","NL":"Nederland","NP":"Nepal","NZ":"New Zealand","NI":"Nicaragua","NE":"Niger","NG":"Nigeria","NU":"Niue","KP":"Nord-Korea","MK":"Nord-Makedonia","MP":"Nord-Marianene","NF":"Norfolk\u00f8ya","NO":"Norge","NC":"Ny-Caledonia","OM":"Oman","PK":"Pakistan","PW":"Palau","PA":"Panama","PG":"Papua Ny-Guinea","PY":"Paraguay","PE":"Peru","PN":"Pitcairn\u00f8yene","PL":"Polen","PT":"Portugal","PR":"Puerto Rico","QA":"Qatar","RE":"R\u00e9union","RO":"Romania","RU":"Russland","RW":"Rwanda","KN":"Saint Kitts og Nevis","BL":"Saint-Barth\u00e9lemy","MF":"Saint-Martin","PM":"Saint-Pierre-et-Miquelon","SB":"Salomon\u00f8yene","WS":"Samoa","SM":"San Marino","ST":"S\u00e3o Tom\u00e9 og Pr\u00edncipe","SA":"Saudi-Arabia","SN":"Senegal","RS":"Serbia","SC":"Seychellene","SL":"Sierra Leone","SG":"Singapore","SX":"Sint Maarten","SK":"Slovakia","SI":"Slovenia","SO":"Somalia","ES":"Spania","LK":"Sri Lanka","SH":"St. Helena","LC":"St. Lucia","VC":"St. Vincent og Grenadinene","GB":"Storbritannia","SD":"Sudan","SR":"Surinam","SJ":"Svalbard og Jan Mayen","CH":"Sveits","SE":"Sverige","SY":"Syria","ZA":"S\u00f8r-Afrika","GS":"S\u00f8r-Georgia og S\u00f8r-Sandwich\u00f8yene","KR":"S\u00f8r-Korea","SS":"S\u00f8r-Sudan","TJ":"Tadsjikistan","TW":"Taiwan","TZ":"Tanzania","TH":"Thailand","TG":"Togo","TK":"Tokelau","TO":"Tonga","TT":"Trinidad og Tobago","TD":"Tsjad","CZ":"Tsjekkia","TN":"Tunisia","TM":"Turkmenistan","TC":"Turks- og Caicos\u00f8yene","TV":"Tuvalu","TR":"Tyrkia","DE":"Tyskland","UG":"Uganda","UA":"Ukraina","HU":"Ungarn","UY":"Uruguay","US":"USA","UM":"USAs ytre \u00f8yer","UZ":"Usbekistan","VU":"Vanuatu","VA":"Vatikanstaten","VE":"Venezuela","EH":"Vest-Sahara","VN":"Vietnam","WF":"Wallis og Futuna","ZM":"Zambia","ZW":"Zimbabwe","TL":"\u00d8st-Timor","AT":"\u00d8sterrike","AX":"\u00c5land"}

View File

@ -0,0 +1 @@
{"AF":"Afghanistan","AX":"\u00c5land","AL":"Albani\u00eb","DZ":"Algerije","AS":"Amerikaans-Samoa","VI":"Amerikaanse Maagdeneilanden","AD":"Andorra","AO":"Angola","AI":"Anguilla","AQ":"Antarctica","AG":"Antigua en Barbuda","AR":"Argentini\u00eb","AM":"Armeni\u00eb","AW":"Aruba","AU":"Australi\u00eb","AZ":"Azerbeidzjan","BS":"Bahama\u2019s","BH":"Bahrein","BD":"Bangladesh","BB":"Barbados","BY":"Belarus","BE":"Belgi\u00eb","BZ":"Belize","BJ":"Benin","BM":"Bermuda","BT":"Bhutan","BO":"Bolivia","BA":"Bosni\u00eb en Herzegovina","BW":"Botswana","BV":"Bouveteiland","BR":"Brazili\u00eb","IO":"Brits Indische Oceaanterritorium","VG":"Britse Maagdeneilanden","BN":"Brunei","BG":"Bulgarije","BF":"Burkina Faso","BI":"Burundi","KH":"Cambodja","CA":"Canada","BQ":"Caribisch Nederland","CF":"Centraal-Afrikaanse Republiek","CL":"Chili","CN":"China","CX":"Christmaseiland","CC":"Cocoseilanden","CO":"Colombia","KM":"Comoren","CG":"Congo-Brazzaville","CD":"Congo-Kinshasa","CK":"Cookeilanden","CR":"Costa Rica","CU":"Cuba","CW":"Cura\u00e7ao","CY":"Cyprus","DK":"Denemarken","DJ":"Djibouti","DM":"Dominica","DO":"Dominicaanse Republiek","DE":"Duitsland","EC":"Ecuador","EG":"Egypte","SV":"El Salvador","GQ":"Equatoriaal-Guinea","ER":"Eritrea","EE":"Estland","SZ":"eSwatini","ET":"Ethiopi\u00eb","FO":"Faer\u00f6er","FK":"Falklandeilanden","FJ":"Fiji","PH":"Filipijnen","FI":"Finland","FR":"Frankrijk","GF":"Frans-Guyana","PF":"Frans-Polynesi\u00eb","TF":"Franse Gebieden in de zuidelijke Indische Oceaan","GA":"Gabon","GM":"Gambia","GE":"Georgi\u00eb","GH":"Ghana","GI":"Gibraltar","GD":"Grenada","GR":"Griekenland","GL":"Groenland","GP":"Guadeloupe","GU":"Guam","GT":"Guatemala","GG":"Guernsey","GN":"Guinee","GW":"Guinee-Bissau","GY":"Guyana","HT":"Ha\u00efti","HM":"Heard en McDonaldeilanden","HN":"Honduras","HU":"Hongarije","HK":"Hongkong SAR van China","IE":"Ierland","IS":"IJsland","IN":"India","ID":"Indonesi\u00eb","IQ":"Irak","IR":"Iran","IM":"Isle of Man","IL":"Isra\u00ebl","IT":"Itali\u00eb","CI":"Ivoorkust","JM":"Jamaica","JP":"Japan","YE":"Jemen","JE":"Jersey","JO":"Jordani\u00eb","KY":"Kaaimaneilanden","CV":"Kaapverdi\u00eb","CM":"Kameroen","KZ":"Kazachstan","KE":"Kenia","KG":"Kirgizi\u00eb","KI":"Kiribati","UM":"Kleine afgelegen eilanden van de Verenigde Staten","KW":"Koeweit","HR":"Kroati\u00eb","LA":"Laos","LS":"Lesotho","LV":"Letland","LB":"Libanon","LR":"Liberia","LY":"Libi\u00eb","LI":"Liechtenstein","LT":"Litouwen","LU":"Luxemburg","MO":"Macau SAR van China","MG":"Madagaskar","MW":"Malawi","MV":"Maldiven","MY":"Maleisi\u00eb","ML":"Mali","MT":"Malta","MA":"Marokko","MH":"Marshalleilanden","MQ":"Martinique","MR":"Mauritani\u00eb","MU":"Mauritius","YT":"Mayotte","MX":"Mexico","FM":"Micronesia","MD":"Moldavi\u00eb","MC":"Monaco","MN":"Mongoli\u00eb","ME":"Montenegro","MS":"Montserrat","MZ":"Mozambique","MM":"Myanmar (Birma)","NA":"Namibi\u00eb","NR":"Nauru","NL":"Nederland","NP":"Nepal","NI":"Nicaragua","NC":"Nieuw-Caledoni\u00eb","NZ":"Nieuw-Zeeland","NE":"Niger","NG":"Nigeria","NU":"Niue","KP":"Noord-Korea","MK":"Noord-Macedoni\u00eb","MP":"Noordelijke Marianen","NO":"Noorwegen","NF":"Norfolk","UG":"Oeganda","UA":"Oekra\u00efne","UZ":"Oezbekistan","OM":"Oman","TL":"Oost-Timor","AT":"Oostenrijk","PK":"Pakistan","PW":"Palau","PS":"Palestijnse gebieden","PA":"Panama","PG":"Papoea-Nieuw-Guinea","PY":"Paraguay","PE":"Peru","PN":"Pitcairneilanden","PL":"Polen","PT":"Portugal","PR":"Puerto Rico","QA":"Qatar","RE":"R\u00e9union","RO":"Roemeni\u00eb","RU":"Rusland","RW":"Rwanda","KN":"Saint Kitts en Nevis","LC":"Saint Lucia","VC":"Saint Vincent en de Grenadines","BL":"Saint-Barth\u00e9lemy","MF":"Saint-Martin","PM":"Saint-Pierre en Miquelon","SB":"Salomonseilanden","WS":"Samoa","SM":"San Marino","ST":"Sao Tom\u00e9 en Principe","SA":"Saoedi-Arabi\u00eb","SN":"Senegal","RS":"Servi\u00eb","SC":"Seychellen","SL":"Sierra Leone","SG":"Singapore","SH":"Sint-Helena","SX":"Sint-Maarten","SI":"Sloveni\u00eb","SK":"Slowakije","SD":"Soedan","SO":"Somali\u00eb","ES":"Spanje","SJ":"Spitsbergen en Jan Mayen","LK":"Sri Lanka","SR":"Suriname","SY":"Syri\u00eb","TJ":"Tadzjikistan","TW":"Taiwan","TZ":"Tanzania","TH":"Thailand","TG":"Togo","TK":"Tokelau","TO":"Tonga","TT":"Trinidad en Tobago","TD":"Tsjaad","CZ":"Tsjechi\u00eb","TN":"Tunesi\u00eb","TR":"Turkije","TM":"Turkmenistan","TC":"Turks- en Caicoseilanden","TV":"Tuvalu","UY":"Uruguay","VU":"Vanuatu","VA":"Vaticaanstad","VE":"Venezuela","GB":"Verenigd Koninkrijk","AE":"Verenigde Arabische Emiraten","US":"Verenigde Staten","VN":"Vietnam","WF":"Wallis en Futuna","EH":"Westelijke Sahara","ZM":"Zambia","ZW":"Zimbabwe","ZA":"Zuid-Afrika","GS":"Zuid-Georgia en Zuidelijke Sandwicheilanden","KR":"Zuid-Korea","SS":"Zuid-Soedan","SE":"Zweden","CH":"Zwitserland"}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
{"AF":"Afganistan","ZA":"Africa de Sud","AL":"Albania","DZ":"Algeria","AD":"Andorra","AO":"Angola","AI":"Anguilla","AQ":"Antarctica","AG":"Antigua \u0219i Barbuda","SA":"Arabia Saudit\u0103","AR":"Argentina","AM":"Armenia","AW":"Aruba","AU":"Australia","AT":"Austria","AZ":"Azerbaidjan","BS":"Bahamas","BH":"Bahrain","BD":"Bangladesh","BB":"Barbados","BY":"Belarus","BE":"Belgia","BZ":"Belize","BJ":"Benin","BM":"Bermuda","BT":"Bhutan","BO":"Bolivia","BA":"Bosnia \u0219i Her\u021begovina","BW":"Botswana","BR":"Brazilia","BN":"Brunei","BG":"Bulgaria","BF":"Burkina Faso","BI":"Burundi","KH":"Cambodgia","CM":"Camerun","CA":"Canada","CV":"Capul Verde","CZ":"Cehia","CL":"Chile","CN":"China","TD":"Ciad","CY":"Cipru","CO":"Columbia","KM":"Comore","CG":"Congo - Brazzaville","CD":"Congo - Kinshasa","KP":"Coreea de Nord","KR":"Coreea de Sud","CR":"Costa Rica","CI":"C\u00f4te d\u2019Ivoire","HR":"Croa\u021bia","CU":"Cuba","CW":"Cura\u00e7ao","DK":"Danemarca","DJ":"Djibouti","DM":"Dominica","EC":"Ecuador","EG":"Egipt","SV":"El Salvador","CH":"Elve\u021bia","AE":"Emiratele Arabe Unite","ER":"Eritreea","EE":"Estonia","SZ":"eSwatini","ET":"Etiopia","FJ":"Fiji","PH":"Filipine","FI":"Finlanda","FR":"Fran\u021ba","GA":"Gabon","GM":"Gambia","GE":"Georgia","GS":"Georgia de Sud \u0219i Insulele Sandwich de Sud","DE":"Germania","GH":"Ghana","GI":"Gibraltar","GR":"Grecia","GD":"Grenada","GL":"Groenlanda","GP":"Guadelupa","GU":"Guam","GT":"Guatemala","GG":"Guernsey","GN":"Guineea","GQ":"Guineea Ecuatorial\u0103","GW":"Guineea-Bissau","GY":"Guyana","GF":"Guyana Francez\u0103","HT":"Haiti","HN":"Honduras","IN":"India","ID":"Indonezia","BV":"Insula Bouvet","CX":"Insula Christmas","HM":"Insula Heard \u0219i Insulele McDonald","IM":"Insula Man","NF":"Insula Norfolk","AX":"Insulele \u00c5land","BQ":"Insulele Caraibe Olandeze","KY":"Insulele Cayman","CC":"Insulele Cocos (Keeling)","CK":"Insulele Cook","FK":"Insulele Falkland","FO":"Insulele Feroe","UM":"Insulele \u00cendep\u0103rtate ale S.U.A.","MP":"Insulele Mariane de Nord","MH":"Insulele Marshall","PN":"Insulele Pitcairn","SB":"Insulele Solomon","TC":"Insulele Turks \u0219i Caicos","VI":"Insulele Virgine Americane","VG":"Insulele Virgine Britanice","JO":"Iordania","IQ":"Irak","IR":"Iran","IE":"Irlanda","IS":"Islanda","IL":"Israel","IT":"Italia","JM":"Jamaica","JP":"Japonia","JE":"Jersey","KZ":"Kazahstan","KG":"K\u00e2rg\u00e2zstan","KE":"Kenya","KI":"Kiribati","KW":"Kuweit","LA":"Laos","LS":"Lesotho","LV":"Letonia","LB":"Liban","LR":"Liberia","LY":"Libia","LI":"Liechtenstein","LT":"Lituania","LU":"Luxemburg","MK":"Macedonia de Nord","MG":"Madagascar","MW":"Malawi","MY":"Malaysia","MV":"Maldive","ML":"Mali","MT":"Malta","MA":"Maroc","MQ":"Martinica","MR":"Mauritania","MU":"Mauritius","YT":"Mayotte","MX":"Mexic","FM":"Micronezia","MC":"Monaco","MN":"Mongolia","MS":"Montserrat","MZ":"Mozambic","ME":"Muntenegru","MM":"Myanmar (Birmania)","NA":"Namibia","NR":"Nauru","NP":"Nepal","NI":"Nicaragua","NE":"Niger","NG":"Nigeria","NU":"Niue","NO":"Norvegia","NC":"Noua Caledonie","NZ":"Noua Zeeland\u0103","OM":"Oman","PK":"Pakistan","PW":"Palau","PA":"Panama","PG":"Papua-Noua Guinee","PY":"Paraguay","PE":"Peru","PF":"Polinezia Francez\u0103","PL":"Polonia","PT":"Portugalia","PR":"Puerto Rico","QA":"Qatar","HK":"R.A.S. Hong Kong a Chinei","MO":"R.A.S. Macao, China","GB":"Regatul Unit","CF":"Republica Centrafrican\u0103","DO":"Republica Dominican\u0103","MD":"Republica Moldova","RE":"R\u00e9union","RO":"Rom\u00e2nia","RU":"Rusia","RW":"Rwanda","EH":"Sahara Occidental\u0103","KN":"Saint Kitts \u0219i Nevis","VC":"Saint Vincent \u0219i Grenadinele","BL":"Saint-Barth\u00e9lemy","PM":"Saint-Pierre \u0219i Miquelon","WS":"Samoa","AS":"Samoa American\u0103","SM":"San Marino","ST":"S\u00e3o Tom\u00e9 \u0219i Pr\u00edncipe","SN":"Senegal","RS":"Serbia","SC":"Seychelles","SH":"Sf\u00e2nta Elena","LC":"Sf\u00e2nta Lucia","MF":"Sf\u00e2ntul Martin","SL":"Sierra Leone","SG":"Singapore","SX":"Sint-Maarten","SY":"Siria","SK":"Slovacia","SI":"Slovenia","SO":"Somalia","ES":"Spania","LK":"Sri Lanka","US":"Statele Unite ale Americii","VA":"Statul Cet\u0103\u021bii Vaticanului","SD":"Sudan","SS":"Sudanul de Sud","SE":"Suedia","SR":"Suriname","SJ":"Svalbard \u0219i Jan Mayen","TJ":"Tadjikistan","TW":"Taiwan","TZ":"Tanzania","TF":"Teritoriile Australe \u0219i Antarctice Franceze","PS":"Teritoriile Palestiniene","IO":"Teritoriul Britanic din Oceanul Indian","TH":"Thailanda","TL":"Timor-Leste","TG":"Togo","TK":"Tokelau","TO":"Tonga","TT":"Trinidad \u0219i Tobago","TN":"Tunisia","TR":"Turcia","TM":"Turkmenistan","TV":"Tuvalu","NL":"\u021a\u0103rile de Jos","UA":"Ucraina","UG":"Uganda","HU":"Ungaria","UY":"Uruguay","UZ":"Uzbekistan","VU":"Vanuatu","VE":"Venezuela","VN":"Vietnam","WF":"Wallis \u0219i Futuna","YE":"Yemen","ZM":"Zambia","ZW":"Zimbabwe"}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
{"AF":"Afghanistan","AL":"Albanien","DZ":"Algeriet","VI":"Amerikanska Jungfru\u00f6arna","AS":"Amerikanska Samoa","AD":"Andorra","AO":"Angola","AI":"Anguilla","AQ":"Antarktis","AG":"Antigua och Barbuda","AR":"Argentina","AM":"Armenien","AW":"Aruba","AU":"Australien","AZ":"Azerbajdzjan","BS":"Bahamas","BH":"Bahrain","BD":"Bangladesh","BB":"Barbados","BE":"Belgien","BZ":"Belize","BJ":"Benin","BM":"Bermuda","BT":"Bhutan","BO":"Bolivia","BA":"Bosnien och Hercegovina","BW":"Botswana","BV":"Bouvet\u00f6n","BR":"Brasilien","VG":"Brittiska Jungfru\u00f6arna","IO":"Brittiska territoriet i Indiska oceanen","BN":"Brunei","BG":"Bulgarien","BF":"Burkina Faso","BI":"Burundi","KY":"Cayman\u00f6arna","CF":"Centralafrikanska republiken","CL":"Chile","CO":"Colombia","CK":"Cook\u00f6arna","CR":"Costa Rica","CW":"Cura\u00e7ao","CY":"Cypern","CI":"C\u00f4te d\u2019Ivoire","DK":"Danmark","DJ":"Djibouti","DM":"Dominica","DO":"Dominikanska republiken","EC":"Ecuador","EG":"Egypten","GQ":"Ekvatorialguinea","SV":"El Salvador","ER":"Eritrea","EE":"Estland","ET":"Etiopien","FK":"Falklands\u00f6arna","FJ":"Fiji","PH":"Filippinerna","FI":"Finland","FR":"Frankrike","GF":"Franska Guyana","PF":"Franska Polynesien","TF":"Franska sydterritorierna","FO":"F\u00e4r\u00f6arna","AE":"F\u00f6renade Arabemiraten","GA":"Gabon","GM":"Gambia","GE":"Georgien","GH":"Ghana","GI":"Gibraltar","GR":"Grekland","GD":"Grenada","GL":"Gr\u00f6nland","GP":"Guadeloupe","GU":"Guam","GT":"Guatemala","GG":"Guernsey","GN":"Guinea","GW":"Guinea-Bissau","GY":"Guyana","HT":"Haiti","HM":"Heard\u00f6n och McDonald\u00f6arna","HN":"Honduras","HK":"Hongkong","IN":"Indien","ID":"Indonesien","IQ":"Irak","IR":"Iran","IE":"Irland","IS":"Island","IM":"Isle of Man","IL":"Israel","IT":"Italien","JM":"Jamaica","JP":"Japan","YE":"Jemen","JE":"Jersey","JO":"Jordanien","CX":"Jul\u00f6n","KH":"Kambodja","CM":"Kamerun","CA":"Kanada","CV":"Kap Verde","BQ":"Karibiska Nederl\u00e4nderna","KZ":"Kazakstan","KE":"Kenya","CN":"Kina","KG":"Kirgizistan","KI":"Kiribati","CC":"Kokos\u00f6arna","KM":"Komorerna","CG":"Kongo-Brazzaville","CD":"Kongo-Kinshasa","HR":"Kroatien","CU":"Kuba","KW":"Kuwait","LA":"Laos","LS":"Lesotho","LV":"Lettland","LB":"Libanon","LR":"Liberia","LY":"Libyen","LI":"Liechtenstein","LT":"Litauen","LU":"Luxemburg","MO":"Macao","MG":"Madagaskar","MW":"Malawi","MY":"Malaysia","MV":"Maldiverna","ML":"Mali","MT":"Malta","MA":"Marocko","MH":"Marshall\u00f6arna","MQ":"Martinique","MR":"Mauretanien","MU":"Mauritius","YT":"Mayotte","MX":"Mexiko","FM":"Mikronesien","MZ":"Mo\u00e7ambique","MD":"Moldavien","MC":"Monaco","MN":"Mongoliet","ME":"Montenegro","MS":"Montserrat","MM":"Myanmar (Burma)","NA":"Namibia","NR":"Nauru","NL":"Nederl\u00e4nderna","NP":"Nepal","NI":"Nicaragua","NE":"Niger","NG":"Nigeria","NU":"Niue","KP":"Nordkorea","MK":"Nordmakedonien","MP":"Nordmarianerna","NF":"Norfolk\u00f6n","NO":"Norge","NC":"Nya Kaledonien","NZ":"Nya Zeeland","OM":"Oman","PK":"Pakistan","PW":"Palau","PS":"Palestinska territorierna","PA":"Panama","PG":"Papua Nya Guinea","PY":"Paraguay","PE":"Peru","PN":"Pitcairn\u00f6arna","PL":"Polen","PT":"Portugal","PR":"Puerto Rico","QA":"Qatar","RE":"R\u00e9union","RO":"Rum\u00e4nien","RW":"Rwanda","RU":"Ryssland","BL":"S:t Barth\u00e9lemy","SH":"S:t Helena","KN":"S:t Kitts och Nevis","LC":"S:t Lucia","PM":"S:t Pierre och Miquelon","VC":"S:t Vincent och Grenadinerna","MF":"Saint-Martin","SB":"Salomon\u00f6arna","WS":"Samoa","SM":"San Marino","ST":"S\u00e3o Tom\u00e9 och Pr\u00edncipe","SA":"Saudiarabien","CH":"Schweiz","SN":"Senegal","RS":"Serbien","SC":"Seychellerna","SL":"Sierra Leone","SG":"Singapore","SX":"Sint Maarten","SK":"Slovakien","SI":"Slovenien","SO":"Somalia","ES":"Spanien","LK":"Sri Lanka","GB":"Storbritannien","SD":"Sudan","SR":"Surinam","SJ":"Svalbard och Jan Mayen","SE":"Sverige","SZ":"Swaziland","ZA":"Sydafrika","GS":"Sydgeorgien och Sydsandwich\u00f6arna","KR":"Sydkorea","SS":"Sydsudan","SY":"Syrien","TJ":"Tadzjikistan","TW":"Taiwan","TZ":"Tanzania","TD":"Tchad","TH":"Thailand","CZ":"Tjeckien","TG":"Togo","TK":"Tokelau","TO":"Tonga","TT":"Trinidad och Tobago","TN":"Tunisien","TR":"Turkiet","TM":"Turkmenistan","TC":"Turks- och Caicos\u00f6arna","TV":"Tuvalu","DE":"Tyskland","UG":"Uganda","UA":"Ukraina","HU":"Ungern","UY":"Uruguay","US":"USA","UM":"USA:s yttre \u00f6ar","UZ":"Uzbekistan","VU":"Vanuatu","VA":"Vatikanstaten","VE":"Venezuela","VN":"Vietnam","BY":"Vitryssland","EH":"V\u00e4stsahara","WF":"Wallis- och Futuna\u00f6arna","ZM":"Zambia","ZW":"Zimbabwe","AX":"\u00c5land","AT":"\u00d6sterrike","TL":"\u00d6sttimor"}

View File

@ -0,0 +1 @@
{"UM":"ABD K\u00fc\u00e7\u00fck Harici Adalar\u0131","VI":"ABD Virjin Adalar\u0131","AF":"Afganistan","AX":"\u00c5land Adalar\u0131","DE":"Almanya","US":"Amerika Birle\u015fik Devletleri","AS":"Amerikan Samoas\u0131","AD":"Andorra","AO":"Angola","AI":"Anguilla","AQ":"Antarktika","AG":"Antigua ve Barbuda","AR":"Arjantin","AL":"Arnavutluk","AW":"Aruba","AU":"Avustralya","AT":"Avusturya","AZ":"Azerbaycan","BS":"Bahamalar","BH":"Bahreyn","BD":"Banglade\u015f","BB":"Barbados","EH":"Bat\u0131 Sahra","BY":"Belarus","BE":"Bel\u00e7ika","BZ":"Belize","BJ":"Benin","BM":"Bermuda","AE":"Birle\u015fik Arap Emirlikleri","GB":"Birle\u015fik Krall\u0131k","BO":"Bolivya","BA":"Bosna-Hersek","BW":"Botsvana","BV":"Bouvet Adas\u0131","BR":"Brezilya","IO":"Britanya Hint Okyanusu Topraklar\u0131","VG":"Britanya Virjin Adalar\u0131","BN":"Brunei","BG":"Bulgaristan","BF":"Burkina Faso","BI":"Burundi","BT":"Butan","CV":"Cape Verde","KY":"Cayman Adalar\u0131","GI":"Cebelitar\u0131k","DZ":"Cezayir","CX":"Christmas Adas\u0131","DJ":"Cibuti","CC":"Cocos (Keeling) Adalar\u0131","CK":"Cook Adalar\u0131","CI":"C\u00f4te d\u2019Ivoire","CW":"Cura\u00e7ao","TD":"\u00c7ad","CZ":"\u00c7ekya","CN":"\u00c7in","HK":"\u00c7in Hong Kong \u00d6\u0130B","MO":"\u00c7in Makao \u00d6\u0130B","DK":"Danimarka","DO":"Dominik Cumhuriyeti","DM":"Dominika","EC":"Ekvador","GQ":"Ekvator Ginesi","SV":"El Salvador","ID":"Endonezya","ER":"Eritre","AM":"Ermenistan","EE":"Estonya","SZ":"Esvatini","ET":"Etiyopya","FK":"Falkland Adalar\u0131","FO":"Faroe Adalar\u0131","MA":"Fas","FJ":"Fiji","PH":"Filipinler","PS":"Filistin B\u00f6lgeleri","FI":"Finlandiya","FR":"Fransa","GF":"Frans\u0131z Guyanas\u0131","TF":"Frans\u0131z G\u00fcney Topraklar\u0131","PF":"Frans\u0131z Polinezyas\u0131","GA":"Gabon","GM":"Gambiya","GH":"Gana","GN":"Gine","GW":"Gine-Bissau","GD":"Grenada","GL":"Gr\u00f6nland","GP":"Guadeloupe","GU":"Guam","GT":"Guatemala","GG":"Guernsey","GY":"Guyana","ZA":"G\u00fcney Afrika","GS":"G\u00fcney Georgia ve G\u00fcney Sandwich Adalar\u0131","KR":"G\u00fcney Kore","SS":"G\u00fcney Sudan","GE":"G\u00fcrcistan","HT":"Haiti","HM":"Heard Adas\u0131 ve McDonald Adalar\u0131","HR":"H\u0131rvatistan","IN":"Hindistan","NL":"Hollanda","HN":"Honduras","IQ":"Irak","IR":"\u0130ran","IE":"\u0130rlanda","ES":"\u0130spanya","IL":"\u0130srail","SE":"\u0130sve\u00e7","CH":"\u0130svi\u00e7re","IT":"\u0130talya","IS":"\u0130zlanda","JM":"Jamaika","JP":"Japonya","JE":"Jersey","KH":"Kambo\u00e7ya","CM":"Kamerun","CA":"Kanada","ME":"Karada\u011f","BQ":"Karayip Hollandas\u0131","QA":"Katar","KZ":"Kazakistan","KE":"Kenya","CY":"K\u0131br\u0131s","KG":"K\u0131rg\u0131zistan","KI":"Kiribati","CO":"Kolombiya","KM":"Komorlar","CG":"Kongo - Brazavil","CD":"Kongo - Kin\u015fasa","CR":"Kosta Rika","KW":"Kuveyt","KP":"Kuzey Kore","MK":"Kuzey Makedonya","MP":"Kuzey Mariana Adalar\u0131","CU":"K\u00fcba","LA":"Laos","LS":"Lesotho","LV":"Letonya","LR":"Liberya","LY":"Libya","LI":"Liechtenstein","LT":"Litvanya","LB":"L\u00fcbnan","LU":"L\u00fcksemburg","HU":"Macaristan","MG":"Madagaskar","MW":"Malavi","MV":"Maldivler","MY":"Malezya","ML":"Mali","MT":"Malta","IM":"Man Adas\u0131","MH":"Marshall Adalar\u0131","MQ":"Martinik","MU":"Mauritius","YT":"Mayotte","MX":"Meksika","EG":"M\u0131s\u0131r","FM":"Mikronezya","MN":"Mo\u011folistan","MD":"Moldova","MC":"Monako","MS":"Montserrat","MR":"Moritanya","MZ":"Mozambik","MM":"Myanmar (Burma)","NA":"Namibya","NR":"Nauru","NP":"Nepal","NE":"Nijer","NG":"Nijerya","NI":"Nikaragua","NU":"Niue","NF":"Norfolk Adas\u0131","NO":"Norve\u00e7","CF":"Orta Afrika Cumhuriyeti","UZ":"\u00d6zbekistan","PK":"Pakistan","PW":"Palau","PA":"Panama","PG":"Papua Yeni Gine","PY":"Paraguay","PE":"Peru","PN":"Pitcairn Adalar\u0131","PL":"Polonya","PT":"Portekiz","PR":"Porto Riko","RE":"Reunion","RO":"Romanya","RW":"Ruanda","RU":"Rusya","BL":"Saint Barthelemy","SH":"Saint Helena","KN":"Saint Kitts ve Nevis","LC":"Saint Lucia","MF":"Saint Martin","PM":"Saint Pierre ve Miquelon","VC":"Saint Vincent ve Grenadinler","WS":"Samoa","SM":"San Marino","ST":"Sao Tome ve Principe","SN":"Senegal","SC":"Sey\u015feller","RS":"S\u0131rbistan","SL":"Sierra Leone","SG":"Singapur","SX":"Sint Maarten","SK":"Slovakya","SI":"Slovenya","SB":"Solomon Adalar\u0131","SO":"Somali","LK":"Sri Lanka","SD":"Sudan","SR":"Surinam","SY":"Suriye","SA":"Suudi Arabistan","SJ":"Svalbard ve Jan Mayen","CL":"\u015eili","TJ":"Tacikistan","TZ":"Tanzanya","TH":"Tayland","TW":"Tayvan","TL":"Timor-Leste","TG":"Togo","TK":"Tokelau","TO":"Tonga","TT":"Trinidad ve Tobago","TN":"Tunus","TC":"Turks ve Caicos Adalar\u0131","TV":"Tuvalu","TR":"T\u00fcrkiye","TM":"T\u00fcrkmenistan","UG":"Uganda","UA":"Ukrayna","OM":"Umman","UY":"Uruguay","JO":"\u00dcrd\u00fcn","VU":"Vanuatu","VA":"Vatikan","VE":"Venezuela","VN":"Vietnam","WF":"Wallis ve Futuna","YE":"Yemen","NC":"Yeni Kaledonya","NZ":"Yeni Zelanda","GR":"Yunanistan","ZM":"Zambiya","ZW":"Zimbabve"}

File diff suppressed because one or more lines are too long

View File

@ -1,6 +1,7 @@
import { createSlice } from '@reduxjs/toolkit';
import { getItem } from 'lib/web';
import { LOCALE_CONFIG, THEME_CONFIG } from 'lib/constants';
import { LOCALE_CONFIG, THEME_CONFIG, VERSION_CHECK } from 'lib/constants';
import semver from 'semver';
const app = createSlice({
name: 'app',
@ -10,6 +11,7 @@ const app = createSlice({
versions: {
current: process.env.VERSION,
latest: null,
hasUpdate: false,
},
},
reducers: {
@ -60,11 +62,14 @@ export function checkVersion() {
const { tag_name } = data;
const latest = tag_name.startsWith('v') ? tag_name.slice(1) : tag_name;
const lastCheck = getItem(VERSION_CHECK);
const hasUpdate = latest && semver.gt(latest, current) && lastCheck?.version !== latest;
return dispatch(
setVersions({
current,
latest,
hasUpdate,
}),
);
};

View File

@ -9,5 +9,5 @@ export default {
file: 'public/umami.js',
format: 'iife',
},
plugins: [resolve(), buble(), terser({ compress: { evaluate: false } })],
plugins: [resolve(), buble({ objectAssign: true }), terser({ compress: { evaluate: false } })],
};

24
scripts/check-lang.js Normal file
View File

@ -0,0 +1,24 @@
const fs = require('fs');
const path = require('path');
const chalk = require('chalk');
const messages = require('../lang/en-US.json');
const dir = path.resolve(__dirname, '../lang');
const files = fs.readdirSync(dir);
const keys = Object.keys(messages).sort();
files.forEach(file => {
if (file !== 'en-US.json') {
const lang = require(`../lang/${file}`);
console.log(chalk.yellowBright(`\n## ${file}`));
keys.forEach(key => {
const orig = messages[key];
const check = lang[key];
if (!check || check === orig) {
console.log(chalk.redBright('*'), chalk.greenBright(`${key}:`), orig);
}
});
}
});

140
scripts/loadtest.js Normal file
View File

@ -0,0 +1,140 @@
const loadtest = require('loadtest');
const chalk = require('chalk');
const trunc = num => +num.toFixed(1);
/**
* Example invocations:
*
* npm run loadtest -- --weight=heavy
* npm run loadtest -- --weight=heavy --verbose
* npm run loadtest -- --weight=single --verbose
* npm run loadtest -- --weight=medium
*/
/**
* Command line arguments like --weight=heavy and --verbose use this object
* If you are providing _alternative_ configs, use --weight
* e.g. add --weight=ultra then add commandlineOptions.ultra={}
* --verbose can be combied with any weight.
*/
const commandlineOptions = {
single: {
concurrency: 1,
requestsPerSecond: 1,
maxSeconds: 5,
maxRequests: 1,
},
// Heavy can saturate CPU which leads to requests stalling depending on machine
// Keep an eye if --verbose logs pause, or if node CPU in top is > 100.
// https://github.com/alexfernandez/loadtest#usage-donts
heavy: {
concurrency: 10,
requestsPerSecond: 200,
maxSeconds: 60,
},
// Throttled requests should not max out CPU,
medium: {
concurrency: 3,
requestsPerSecond: 5,
maxSeconds: 60,
},
verbose: { statusCallback },
};
const options = {
url: 'http://localhost:3000',
method: 'POST',
concurrency: 5,
requestsPerSecond: 5,
maxSeconds: 5,
requestGenerator: (params, options, client, callback) => {
const message = JSON.stringify(mockPageView());
options.headers['Content-Length'] = message.length;
options.headers['Content-Type'] = 'application/json';
options.headers['user-agent'] = 'User-Agent: Mozilla/5.0 LoadTest';
options.body = message;
options.path = '/api/collect';
const request = client(options, callback);
request.write(message);
return request;
},
};
function getArgument() {
const weight = process.argv[2] && process.argv[2].replace('--weight=', '');
const verbose = process.argv.includes('--verbose') && 'verbose';
return [weight, verbose];
}
// Patch in all command line arguments over options object
// Must do this prior to calling `loadTest()`
getArgument().map(arg => Object.assign(options, commandlineOptions[arg]));
loadtest.loadTest(options, (error, results) => {
if (error) {
return console.error(chalk.redBright('Got an error: %s', error));
}
console.log(chalk.bold(chalk.yellow('\n--------\n')));
console.log(chalk.yellowBright('Loadtests complete:'), chalk.greenBright('success'), '\n');
prettyLogItem('Total Requests:', results.totalRequests);
prettyLogItem('Total Errors:', results.totalErrors);
prettyLogItem(
'Latency(mean/min/max)',
trunc(results.meanLatencyMs),
'/',
trunc(results.maxLatencyMs),
'/',
trunc(results.minLatencyMs),
);
if (results.totalErrors) {
console.log(chalk.redBright('*'), chalk.red('Total Errors:'), results.totalErrors);
}
if (results.errorCodes && Object.keys(results.errorCodes).length) {
console.log(chalk.redBright('*'), chalk.red('Error Codes:'), results.errorCodes);
}
// console.log(results);
});
/**
* Create a new object for each request. Note, we could randomize values here if desired.
*
* TODO: Need a better way of passing in websiteId, hostname, URL.
*
* @param {object} payload pageview payload same as sent via tracker
*/
function mockPageView(
payload = {
website: 'fcd4c7e3-ed76-439c-9121-3a0f102df126',
hostname: 'localhost',
screen: '1680x1050',
url: '/LOADTESTING',
},
) {
return {
type: 'pageview',
payload,
};
}
// If you pass in --verbose, this function is called
function statusCallback(error, result, latency) {
console.log(
chalk.yellowBright(`\n## req #${result.requestIndex + 1} of ${latency.totalRequests}`),
);
prettyLogItem('Request elapsed milliseconds:', trunc(result.requestElapsed));
prettyLogItem(
'Latency(mean/max/min):',
trunc(latency.meanLatencyMs),
'/',
trunc(latency.maxLatencyMs),
'/',
trunc(latency.minLatencyMs),
);
}
function prettyLogItem(label, ...args) {
console.log(chalk.redBright('*'), chalk.green(label), ...args);
}

3
scripts/start-env.js Normal file
View File

@ -0,0 +1,3 @@
const cli = require('next/dist/cli/next-start');
cli.nextStart(['-p', process.env.PORT || 3000, '-H', process.env.HOSTNAME || 'localhost']);

253
yarn.lock
View File

@ -1064,12 +1064,12 @@
minimatch "^3.0.4"
strip-json-comments "^3.1.1"
"@formatjs/cli@^2.12.0":
version "2.12.0"
resolved "https://registry.yarnpkg.com/@formatjs/cli/-/cli-2.12.0.tgz#f0bb253db073903634e57e587e0395cd0d0cd681"
integrity sha512-F0epNBWCXjKGgej8GL1q4RLGqR38bRCPmGLb3VautkbZ74achB0cVGj2w/AdlQiJJ1mU5rEU13pRroukUBZ+GA==
"@formatjs/cli@^2.13.0":
version "2.13.0"
resolved "https://registry.yarnpkg.com/@formatjs/cli/-/cli-2.13.0.tgz#64018c82f9fbc291918792daf1eed16e4b56bb7f"
integrity sha512-1E/rdrKiHi7gbcN0WuY792X+jCHWI+9jC3565hhZXAJYmgNe9SntRW02nEJOK3WOkhm6yMWiHPLkFpyLq5hW3w==
dependencies:
"@formatjs/ts-transformer" "^2.11.0"
"@formatjs/ts-transformer" "^2.11.1"
"@types/json-stable-stringify" "^1.0.32"
"@types/lodash" "^4.14.150"
"@types/loud-rejection" "^2.0.0"
@ -1078,10 +1078,11 @@
commander "^6.1.0"
fast-glob "^3.2.4"
fs-extra "^9.0.0"
intl-messageformat-parser "^6.0.7"
intl-messageformat-parser "^6.0.8"
json-stable-stringify "^1.0.1"
lodash "^4.17.15"
loud-rejection "^2.2.0"
tslib "^2.0.1"
typescript "^4.0"
"@formatjs/ecma402-abstract@^1.2.2":
@ -1089,19 +1090,28 @@
resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-1.2.2.tgz#4810bdbd696d3805c535fd0620b7c8f45ab3164f"
integrity sha512-mLCoAPGlXCVskb/ojBO6iurGqwo6sZvAl8pRC4N25bz4LPWExAM9LsOo057zN3Br1JxUM3RZHG4YGnVt+nSRYQ==
"@formatjs/intl-displaynames@^3.3.9":
version "3.3.9"
resolved "https://registry.yarnpkg.com/@formatjs/intl-displaynames/-/intl-displaynames-3.3.9.tgz#18eeb39aa05d4a8b064e520725f9178d0c3f8c50"
integrity sha512-6Ez9Ab9p9bsxCM4OlqsT+R0rmrj5lr6xjIXiCTs/pSDFeiNPQabWDHcBpiGlMRE3zifOwUOFSoi5AGGYMFgetw==
"@formatjs/ecma402-abstract@^1.2.3":
version "1.2.3"
resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-1.2.3.tgz#ca94911dd8e9c89eeaabba0f00e2f692979fc27b"
integrity sha512-sEkxTZj7qa+Pi/c4ppE5mxZYJkqQO3GNZzJZjAxgsXip2ixO/TZn58qrxdQ0V8mXmf+5xf+AfveyPvv4yHaRtw==
dependencies:
"@formatjs/ecma402-abstract" "^1.2.2"
tslib "^2.0.1"
"@formatjs/intl-listformat@^4.2.7":
version "4.2.7"
resolved "https://registry.yarnpkg.com/@formatjs/intl-listformat/-/intl-listformat-4.2.7.tgz#bcccfee92c69e661d4da51567540aa39fef9ceae"
integrity sha512-7sYy7pBGzClvSZI98FhVeNt6N/ELdvrj8pvLOfcR0+FQyhv0ixanog7bRo9kT8ECin9+RwEpTmX7jGCh8Bcgjw==
"@formatjs/intl-displaynames@^3.3.10":
version "3.3.10"
resolved "https://registry.yarnpkg.com/@formatjs/intl-displaynames/-/intl-displaynames-3.3.10.tgz#905ad86431fdadfab2ec188bf9f4fe9e359d1fe6"
integrity sha512-SdIMuaKUO0N5zQb6CXtIrwjJbX+DC8ju7ifrcqpLagUMh2nIEJCz7sf0Q6lOMWEE+un1VTmjaXpRPP55cP40IA==
dependencies:
"@formatjs/ecma402-abstract" "^1.2.2"
"@formatjs/ecma402-abstract" "^1.2.3"
tslib "^2.0.1"
"@formatjs/intl-listformat@^4.2.8":
version "4.2.8"
resolved "https://registry.yarnpkg.com/@formatjs/intl-listformat/-/intl-listformat-4.2.8.tgz#aa8935234dd5f8fcec6d08dfdf2be43e11ba671c"
integrity sha512-9qAThh/1HV9T/g6E11VbN5b209zg28fMUMrZqrpHiZZxc2PPHvP/CGqK7mo8hpyCoMUVo3kFxB5CFnw5difJrA==
dependencies:
"@formatjs/ecma402-abstract" "^1.2.3"
tslib "^2.0.1"
"@formatjs/intl-numberformat@^5.5.2":
version "5.6.2"
@ -1110,32 +1120,35 @@
dependencies:
"@formatjs/ecma402-abstract" "^1.2.2"
"@formatjs/intl-relativetimeformat@^7.2.7":
version "7.2.7"
resolved "https://registry.yarnpkg.com/@formatjs/intl-relativetimeformat/-/intl-relativetimeformat-7.2.7.tgz#dce72ebafb1ca0bf14673fab3b1aad145e1abac6"
integrity sha512-R6rxX4PfPQ/EuDRALLSIEDCDW/FAmmu6xpRXIPdZ33bEP7SXEksJB039Bw//I0VIm2fBeIlxe9oqvRGfuqpwVg==
"@formatjs/intl-relativetimeformat@^7.2.8":
version "7.2.8"
resolved "https://registry.yarnpkg.com/@formatjs/intl-relativetimeformat/-/intl-relativetimeformat-7.2.8.tgz#a423ef9acd379980f58730b4757713156076de14"
integrity sha512-h6H5lcPn1LbVlAk62m7DYtY68aE6AiZVK1bLEo3HeWrMBFCskWAe9I/5kI+RjStdGZzo+CqBl+rSTcrSXjVj+g==
dependencies:
"@formatjs/ecma402-abstract" "^1.2.2"
"@formatjs/ecma402-abstract" "^1.2.3"
tslib "^2.0.1"
"@formatjs/intl@^1.3.3":
version "1.3.3"
resolved "https://registry.yarnpkg.com/@formatjs/intl/-/intl-1.3.3.tgz#d59997b7ef832e7c47e8ca50861ff7ff7461d56c"
integrity sha512-gFuCIZEH6o1O2ZF8YlhHJEApRrBarQ7iyqxFp4ujllr/tcjgSxfzF+LSBCPyJ1OQIU98ynOc0XKdrAR2wUd3ow==
"@formatjs/intl@^1.3.4":
version "1.3.4"
resolved "https://registry.yarnpkg.com/@formatjs/intl/-/intl-1.3.4.tgz#66441b85986726256f83fdffdb533c6334bc299b"
integrity sha512-aq6bhi2aZPYUEL15iiBrsNzDtw4Qe1r9dsqM26fbTbfWa6r5sdqcFwGySoeTzguxd+ZXoc9RypSMERjH92xFKA==
dependencies:
"@formatjs/ecma402-abstract" "^1.2.2"
"@formatjs/intl-displaynames" "^3.3.9"
"@formatjs/intl-listformat" "^4.2.7"
"@formatjs/intl-relativetimeformat" "^7.2.7"
"@formatjs/ecma402-abstract" "^1.2.3"
"@formatjs/intl-displaynames" "^3.3.10"
"@formatjs/intl-listformat" "^4.2.8"
"@formatjs/intl-relativetimeformat" "^7.2.8"
fast-memoize "^2.5.2"
intl-messageformat "^9.3.8"
intl-messageformat-parser "^6.0.7"
intl-messageformat "^9.3.9"
intl-messageformat-parser "^6.0.8"
tslib "^2.0.1"
"@formatjs/ts-transformer@^2.11.0":
version "2.11.0"
resolved "https://registry.yarnpkg.com/@formatjs/ts-transformer/-/ts-transformer-2.11.0.tgz#90c4b5afae55fd8b8c7ab6aa08ca94a123eb94b9"
integrity sha512-d0++zpEeeCtE+RwbEB+TYw0WnC+jlNniIZu9NcILdgN6LEr9+TRxO+Gz4d7nj3g0D5X1LyNx6P4JI+byGxHqzw==
"@formatjs/ts-transformer@^2.11.1":
version "2.11.1"
resolved "https://registry.yarnpkg.com/@formatjs/ts-transformer/-/ts-transformer-2.11.1.tgz#9b30c066cd1ca1831bfc76e22b01e2858b931923"
integrity sha512-VAjFBnWSQfO71PrR0NeGgwGoHOAlNMuQv4kdV6GpxQ/3d4YM+202Cpu6r1BmCvxkuXhijTMUu7ubKeenUr8WcA==
dependencies:
intl-messageformat-parser "^6.0.7"
intl-messageformat-parser "^6.0.8"
tslib "^2.0.1"
typescript "^4.0"
"@formatjs/ts-transformer@^2.6.0":
@ -1773,6 +1786,18 @@ agent-base@6:
dependencies:
debug "4"
agent-base@^4.3.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee"
integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==
dependencies:
es6-promisify "^5.0.0"
agentkeepalive@^2.0.3:
version "2.2.0"
resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-2.2.0.tgz#c5d1bd4b129008f1163f236f86e5faea2026e2ef"
integrity sha1-xdG9SxKQCPEWPyNvhuX66iAm4u8=
aggregate-error@^3.0.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a"
@ -2309,6 +2334,13 @@ buffer@^4.3.0:
ieee754 "^1.1.4"
isarray "^1.0.0"
bufferutil@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.1.tgz#3a177e8e5819a1243fe16b63a199951a7ad8d4a7"
integrity sha512-xowrxvpxojqkagPcWRQVXZl0YXhRhAtBEIq3VoER1NH5Mw1n1o0ojdspp+GS2J//2gCVyrzQDApQ4unGF+QOoA==
dependencies:
node-gyp-build "~3.7.0"
builtin-modules@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.1.0.tgz#aad97c15131eb76b65b50ef208e7584cd76a7484"
@ -2746,6 +2778,14 @@ concat-stream@^1.5.0:
readable-stream "^2.2.2"
typedarray "^0.0.6"
confinode@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/confinode/-/confinode-2.1.1.tgz#6831961ca48fb3c9f7d5ff063022e2bc40bea86e"
integrity sha512-u5u0ZHpYMnVWtelxjalNtLvL+SdP7B/7s0JTFUIkyvqqIf67DAvy6SKaE6WZiwbufLPk+6zJKsh5SdpbtbFi9g==
dependencies:
quick-lru "^5.0.0"
yaml "^1.7.2"
console-browserify@^1.1.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336"
@ -3196,7 +3236,7 @@ debug@^2.2.0, debug@^2.3.3:
dependencies:
ms "2.0.0"
debug@^3.2.6:
debug@^3.1.0, debug@^3.2.6:
version "3.2.6"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==
@ -3610,6 +3650,18 @@ es6-iterator@2.0.3, es6-iterator@~2.0.3:
es5-ext "^0.10.35"
es6-symbol "^3.1.1"
es6-promise@^4.0.3:
version "4.2.8"
resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a"
integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==
es6-promisify@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203"
integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=
dependencies:
es6-promise "^4.0.3"
es6-symbol@^3.1.1, es6-symbol@~3.1.3:
version "3.1.3"
resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18"
@ -4145,10 +4197,10 @@ for-own@^0.1.3:
dependencies:
for-in "^1.0.1"
formik@^2.1.6:
version "2.1.6"
resolved "https://registry.yarnpkg.com/formik/-/formik-2.1.6.tgz#f723bfccb2c7abec886aa6a4930b360d20f1a0b3"
integrity sha512-m9DcxlZw/58p4xuhH3dzUzQWaC4dig0RKX7yNQOJt4VRhXn7p+YRrs3o17r3YwzvOLua3zC53VMbfupLsDwO5w==
formik@^2.1.7:
version "2.1.7"
resolved "https://registry.yarnpkg.com/formik/-/formik-2.1.7.tgz#40bd04e59b242176d0a17c701830f1536cd7506b"
integrity sha512-n1wviIh0JsvHqj9PufNvOV+fS7mFwh9FfMxxTMnTrKR/uVYMS06DKaivXBlJdDF0qEwTcPHxSmIQ3deFHL3Hsg==
dependencies:
deepmerge "^2.1.1"
hoist-non-react-statics "^3.3.0"
@ -4524,6 +4576,14 @@ https-proxy-agent@5.0.0:
agent-base "6"
debug "4"
https-proxy-agent@^2.2.1:
version "2.2.4"
resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b"
integrity sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==
dependencies:
agent-base "^4.3.0"
debug "^3.1.0"
human-signals@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3"
@ -4694,13 +4754,22 @@ intl-messageformat-parser@^6.0.7:
dependencies:
"@formatjs/ecma402-abstract" "^1.2.2"
intl-messageformat@^9.3.8:
version "9.3.8"
resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-9.3.8.tgz#561f31800cc3ced5dada6c991a0dd0233931850f"
integrity sha512-XuFoC6kvsgL1qtzro9ubOaJ2zVgeJWb5X0mTYvG7p1OinbOZYPscP8eYyVJf9g++tDy/fwx9TfeaFlunmhC+Vw==
intl-messageformat-parser@^6.0.8:
version "6.0.8"
resolved "https://registry.yarnpkg.com/intl-messageformat-parser/-/intl-messageformat-parser-6.0.8.tgz#4180b280d21653df7c8c078e75e0bb7f0e3322c3"
integrity sha512-g1nV8YVI/Nscbu3qjGGgMcq61Es7L2bI+08gcbAx3taiFMJ3oJgQhC/wYksWLsq2cvLxq5pQ5Te06CE793/iVA==
dependencies:
"@formatjs/ecma402-abstract" "^1.2.3"
tslib "^2.0.1"
intl-messageformat@^9.3.9:
version "9.3.9"
resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-9.3.9.tgz#41f9f139adbbb509da657133047c8c5bf4ca22a9"
integrity sha512-SB6b68bY+RZPBhg3XTmwfX0lL3ywvOuAcS+iH6cptiHPfzOPSzP05F3ZOirARwj8pVbC9Xd4w0pMtF/sGnHurw==
dependencies:
fast-memoize "^2.5.2"
intl-messageformat-parser "^6.0.7"
intl-messageformat-parser "^6.0.8"
tslib "^2.0.1"
invariant@^2.2.2, invariant@^2.2.4:
version "2.2.4"
@ -5296,6 +5365,19 @@ loader-utils@^1.2.3:
emojis-list "^3.0.0"
json5 "^1.0.1"
loadtest@5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/loadtest/-/loadtest-5.1.0.tgz#20dd700329d98612b23c7e6fa0d1d4661ea9bccf"
integrity sha512-LFMyFMA77o41JyNPn+FOXNN/SNURXys8KQNK83mR6bDHjH/XpA5Uz8dd4lofh2VITrDsK+ITKi8QNkmxTOFt1Q==
dependencies:
agentkeepalive "^2.0.3"
confinode "^2.1.1"
https-proxy-agent "^2.2.1"
log "1.4.*"
stdio "^0.2.3"
testing "^1.1.1"
websocket "^1.0.28"
locate-path@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e"
@ -5378,6 +5460,11 @@ log-update@^4.0.0:
slice-ansi "^4.0.0"
wrap-ansi "^6.2.0"
log@1.4.*, log@1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/log/-/log-1.4.0.tgz#4ba1d890fde249b031dca03bc37eaaf325656f1c"
integrity sha1-S6HYkP3iSbAx3KA7w36q8yVlbxw=
loglevel-colored-level-prefix@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/loglevel-colored-level-prefix/-/loglevel-colored-level-prefix-1.0.0.tgz#6a40218fdc7ae15fc76c3d0f3e676c465388603e"
@ -5960,6 +6047,11 @@ node-fetch@2.6.0:
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd"
integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==
node-gyp-build@~3.7.0:
version "3.7.0"
resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-3.7.0.tgz#daa77a4f547b9aed3e2aac779eaf151afd60ec8d"
integrity sha512-L/Eg02Epx6Si2NXmedx+Okg+4UHqmaf3TNcxd50SF9NQGcJaON3AtU++kax69XV7YWz4tUspqZSAsVofhFKG2w==
node-html-parser@^1.2.19:
version "1.2.20"
resolved "https://registry.yarnpkg.com/node-html-parser/-/node-html-parser-1.2.20.tgz#37e9ebc627dbe3ff446eea4ac93e3d254b7c6ee4"
@ -7125,6 +7217,11 @@ quick-lru@^4.0.1:
resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f"
integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==
quick-lru@^5.0.0:
version "5.1.1"
resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932"
integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==
randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
@ -7165,22 +7262,23 @@ react-fast-compare@^2.0.1:
resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-2.0.4.tgz#e84b4d455b0fec113e0402c329352715196f81f9"
integrity sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==
react-intl@^5.8.3:
version "5.8.3"
resolved "https://registry.yarnpkg.com/react-intl/-/react-intl-5.8.3.tgz#2018aca11a49d2d1b0f602e0dda653a47bf59dfb"
integrity sha512-ueM7JhbBIi+6FpH6jCrJuKcYpjmFn9UAHA28ojY8LMAL1PowZ/53XGGMvfj32J0/2EIuHQ6vUbi/07kJqe1ksQ==
react-intl@^5.8.4:
version "5.8.4"
resolved "https://registry.yarnpkg.com/react-intl/-/react-intl-5.8.4.tgz#aba5432fcba17f47d9d46ac9bea1881c92f4f354"
integrity sha512-ToDeHYBpO9WBAOpnwQKihUdxB4qE1nqcGKV9Jq2upj1zspxeX3OddWaZwz8wNV5yjoYnoDY3HLWeBP4IXwbwqg==
dependencies:
"@formatjs/ecma402-abstract" "^1.2.2"
"@formatjs/intl" "^1.3.3"
"@formatjs/intl-displaynames" "^3.3.9"
"@formatjs/intl-listformat" "^4.2.7"
"@formatjs/intl-relativetimeformat" "^7.2.7"
"@formatjs/ecma402-abstract" "^1.2.3"
"@formatjs/intl" "^1.3.4"
"@formatjs/intl-displaynames" "^3.3.10"
"@formatjs/intl-listformat" "^4.2.8"
"@formatjs/intl-relativetimeformat" "^7.2.8"
"@types/hoist-non-react-statics" "^3.3.1"
fast-memoize "^2.5.2"
hoist-non-react-statics "^3.3.2"
intl-messageformat "^9.3.8"
intl-messageformat-parser "^6.0.7"
intl-messageformat "^9.3.9"
intl-messageformat-parser "^6.0.8"
shallow-equal "^1.2.1"
tslib "^2.0.1"
react-is@16.13.1, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.9.0:
version "16.13.1"
@ -8090,6 +8188,11 @@ static-extend@^0.1.1:
define-property "^0.2.5"
object-copy "^0.1.0"
stdio@^0.2.3:
version "0.2.7"
resolved "https://registry.yarnpkg.com/stdio/-/stdio-0.2.7.tgz#a1c57da10fe1cfaa0c3bf683c9d0743d1b660839"
integrity sha1-ocV9oQ/hz6oMO/aDydB0PRtmCDk=
stream-browserify@3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f"
@ -8561,6 +8664,13 @@ terser@^5.0.0:
source-map "~0.6.1"
source-map-support "~0.5.12"
testing@^1.1.1:
version "1.1.2"
resolved "https://registry.yarnpkg.com/testing/-/testing-1.1.2.tgz#575b123070f63c5068e943cf255dbae71c5d8ba6"
integrity sha512-+wHrDL29KsI3NQtgGmgdZ/MaUZhnVePbt5ZfiMn6ntDpv/kMWfdiBrg/lJqntor9H8+zQYxvfPLVowPPs1nVEg==
dependencies:
log "1.4.0"
text-table@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
@ -8711,6 +8821,11 @@ tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0:
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043"
integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==
tslib@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.1.tgz#410eb0d113e5b6356490eec749603725b021b43e"
integrity sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==
tsutils@^3.17.1:
version "3.17.1"
resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759"
@ -8964,6 +9079,13 @@ use@^3.1.0:
resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==
utf-8-validate@^5.0.2:
version "5.0.2"
resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.2.tgz#63cfbccd85dc1f2b66cf7a1d0eebc08ed056bfb3"
integrity sha512-SwV++i2gTD5qh2XqaPzBnNX88N6HdyhQrNNRykvcS0QKvItV9u3vPEJr+X5Hhfb1JC0r0e1alL0iB09rY8+nmw==
dependencies:
node-gyp-build "~3.7.0"
util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
@ -9140,6 +9262,18 @@ webpack@4.44.1:
watchpack "^1.7.4"
webpack-sources "^1.4.1"
websocket@^1.0.28:
version "1.0.32"
resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.32.tgz#1f16ddab3a21a2d929dec1687ab21cfdc6d3dbb1"
integrity sha512-i4yhcllSP4wrpoPMU2N0TQ/q0O94LRG/eUQjEAamRltjQ1oT1PFFKOG4i877OlJgCG8rw6LrrowJp+TYCEWF7Q==
dependencies:
bufferutil "^4.0.1"
debug "^2.2.0"
es5-ext "^0.10.50"
typedarray-to-buffer "^3.1.5"
utf-8-validate "^5.0.2"
yaeti "^0.0.6"
whatwg-url@^7.0.0:
version "7.1.0"
resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06"
@ -9240,6 +9374,11 @@ y18n@^4.0.0:
resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b"
integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==
yaeti@^0.0.6:
version "0.0.6"
resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577"
integrity sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=
yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3:
version "3.1.1"
resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"