summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRaindropsSys <raindrops@equestria.dev>2023-11-18 11:34:36 +0100
committerRaindropsSys <raindrops@equestria.dev>2023-11-18 11:34:36 +0100
commit9337aae8b1c87fad34884dacd5cd79d9591c60db (patch)
tree5340f9fa67cd6236e4c879f0057d51d0b1e21361
parent953ddd82e48dd206cef5ac94456549aed13b3ad5 (diff)
downloadpluralconnect-9337aae8b1c87fad34884dacd5cd79d9591c60db.tar.gz
pluralconnect-9337aae8b1c87fad34884dacd5cd79d9591c60db.tar.bz2
pluralconnect-9337aae8b1c87fad34884dacd5cd79d9591c60db.zip
Updated 39 files, added 86 files, deleted 40 files and renamed 2 files (automated)
-rw-r--r--.idea/.name1
-rw-r--r--.idea/deployment.xml8
-rw-r--r--.idea/inspectionProfiles/Project_Default.xml2
-rw-r--r--.idea/modules.xml2
-rw-r--r--.idea/ponycule.iml (renamed from .idea/cold-haze.iml)1
-rw-r--r--app.php5
-rw-r--r--assets/logo/custom-2023.css149
-rw-r--r--assets/logo/custom.css782
-rw-r--r--assets/logo/dark.svg49
-rw-r--r--assets/logo/light.css220
-rw-r--r--assets/logo/light.svg47
-rw-r--r--assets/logo/newlogo-template.pngbin37664 -> 0 bytes
-rw-r--r--assets/logo/newlogo.pngbin5628 -> 0 bytes
-rw-r--r--assets/logo/newlogo3-template.pngbin46121 -> 0 bytes
-rw-r--r--assets/logo/newlogo3.pngbin6326 -> 0 bytes
-rw-r--r--assets/logo/pacifier.pngbin2128 -> 0 bytes
-rw-r--r--assets/logo/plush.pngbin2027 -> 0 bytes
-rw-r--r--assets/uploads/pt-mistybrightdawn.pngbin1092 -> 1112 bytes
-rw-r--r--assets/uploads/pt-velvet.pngbin840 -> 1014 bytes
-rw-r--r--auth/callback/index.php9
-rw-r--r--auth/init/index.php2
-rw-r--r--error.php6
-rw-r--r--includes/backup.inc (renamed from includes/refresh/backup.inc)0
-rw-r--r--includes/components/2023ui.inc13
-rw-r--r--includes/components/explicit.php130
-rw-r--r--includes/components/footer.inc40
-rw-r--r--includes/components/fullbanner.inc6
-rw-r--r--includes/components/header.inc326
-rw-r--r--includes/components/mobilenav.inc89
-rw-r--r--includes/components/navigation.inc448
-rw-r--r--includes/components/pane.inc132
-rw-r--r--includes/components/timeline.inc2
-rw-r--r--includes/external/pair/reference.js2
-rw-r--r--includes/external/signal/node_modules/.bin/sdp-verify47
-rw-r--r--includes/external/signal/node_modules/.bin/uuid2
-rw-r--r--includes/external/signal/node_modules/bs58/CHANGELOG.md65
-rw-r--r--includes/external/signal/node_modules/bs58/LICENSE21
-rw-r--r--includes/external/signal/node_modules/bs58/README.md91
-rw-r--r--includes/external/signal/node_modules/bs58/index.d.ts5
-rw-r--r--includes/external/signal/node_modules/bs58/index.js4
-rw-r--r--includes/external/signal/node_modules/bs58/package.json39
-rw-r--r--includes/external/signal/node_modules/uuid/CHANGELOG.md268
-rw-r--r--includes/external/signal/node_modules/uuid/CONTRIBUTING.md18
-rw-r--r--includes/external/signal/node_modules/uuid/LICENSE.md9
-rw-r--r--includes/external/signal/node_modules/uuid/README.md462
-rw-r--r--includes/external/signal/node_modules/uuid/dist/bin/uuid2
-rw-r--r--includes/external/signal/node_modules/uuid/dist/commonjs-browser/index.js79
-rw-r--r--includes/external/signal/node_modules/uuid/dist/commonjs-browser/md5.js223
-rw-r--r--includes/external/signal/node_modules/uuid/dist/commonjs-browser/native.js11
-rw-r--r--includes/external/signal/node_modules/uuid/dist/commonjs-browser/nil.js8
-rw-r--r--includes/external/signal/node_modules/uuid/dist/commonjs-browser/parse.js45
-rw-r--r--includes/external/signal/node_modules/uuid/dist/commonjs-browser/regex.js8
-rw-r--r--includes/external/signal/node_modules/uuid/dist/commonjs-browser/rng.js25
-rw-r--r--includes/external/signal/node_modules/uuid/dist/commonjs-browser/sha1.js104
-rw-r--r--includes/external/signal/node_modules/uuid/dist/commonjs-browser/stringify.js44
-rw-r--r--includes/external/signal/node_modules/uuid/dist/commonjs-browser/v1.js107
-rw-r--r--includes/external/signal/node_modules/uuid/dist/commonjs-browser/v3.js16
-rw-r--r--includes/external/signal/node_modules/uuid/dist/commonjs-browser/v35.js80
-rw-r--r--includes/external/signal/node_modules/uuid/dist/commonjs-browser/v4.js43
-rw-r--r--includes/external/signal/node_modules/uuid/dist/commonjs-browser/v5.js16
-rw-r--r--includes/external/signal/node_modules/uuid/dist/commonjs-browser/validate.js17
-rw-r--r--includes/external/signal/node_modules/uuid/dist/commonjs-browser/version.js21
-rw-r--r--includes/external/signal/node_modules/uuid/dist/esm-browser/index.js9
-rw-r--r--includes/external/signal/node_modules/uuid/dist/esm-browser/md5.js215
-rw-r--r--includes/external/signal/node_modules/uuid/dist/esm-browser/native.js4
-rw-r--r--includes/external/signal/node_modules/uuid/dist/esm-browser/nil.js1
-rw-r--r--includes/external/signal/node_modules/uuid/dist/esm-browser/parse.js35
-rw-r--r--includes/external/signal/node_modules/uuid/dist/esm-browser/regex.js1
-rw-r--r--includes/external/signal/node_modules/uuid/dist/esm-browser/rng.js18
-rw-r--r--includes/external/signal/node_modules/uuid/dist/esm-browser/sha1.js96
-rw-r--r--includes/external/signal/node_modules/uuid/dist/esm-browser/stringify.js33
-rw-r--r--includes/external/signal/node_modules/uuid/dist/esm-browser/v1.js95
-rw-r--r--includes/external/signal/node_modules/uuid/dist/esm-browser/v3.js4
-rw-r--r--includes/external/signal/node_modules/uuid/dist/esm-browser/v35.js66
-rw-r--r--includes/external/signal/node_modules/uuid/dist/esm-browser/v4.js29
-rw-r--r--includes/external/signal/node_modules/uuid/dist/esm-browser/v5.js4
-rw-r--r--includes/external/signal/node_modules/uuid/dist/esm-browser/validate.js7
-rw-r--r--includes/external/signal/node_modules/uuid/dist/esm-browser/version.js11
-rw-r--r--includes/external/signal/node_modules/uuid/dist/esm-node/index.js9
-rw-r--r--includes/external/signal/node_modules/uuid/dist/esm-node/md5.js13
-rw-r--r--includes/external/signal/node_modules/uuid/dist/esm-node/native.js4
-rw-r--r--includes/external/signal/node_modules/uuid/dist/esm-node/nil.js1
-rw-r--r--includes/external/signal/node_modules/uuid/dist/esm-node/parse.js35
-rw-r--r--includes/external/signal/node_modules/uuid/dist/esm-node/regex.js1
-rw-r--r--includes/external/signal/node_modules/uuid/dist/esm-node/rng.js12
-rw-r--r--includes/external/signal/node_modules/uuid/dist/esm-node/sha1.js13
-rw-r--r--includes/external/signal/node_modules/uuid/dist/esm-node/stringify.js33
-rw-r--r--includes/external/signal/node_modules/uuid/dist/esm-node/v1.js95
-rw-r--r--includes/external/signal/node_modules/uuid/dist/esm-node/v3.js4
-rw-r--r--includes/external/signal/node_modules/uuid/dist/esm-node/v35.js66
-rw-r--r--includes/external/signal/node_modules/uuid/dist/esm-node/v4.js29
-rw-r--r--includes/external/signal/node_modules/uuid/dist/esm-node/v5.js4
-rw-r--r--includes/external/signal/node_modules/uuid/dist/esm-node/validate.js7
-rw-r--r--includes/external/signal/node_modules/uuid/dist/esm-node/version.js11
-rw-r--r--includes/external/signal/node_modules/uuid/dist/index.js79
-rw-r--r--includes/external/signal/node_modules/uuid/dist/md5-browser.js223
-rw-r--r--includes/external/signal/node_modules/uuid/dist/md5.js23
-rw-r--r--includes/external/signal/node_modules/uuid/dist/native-browser.js11
-rw-r--r--includes/external/signal/node_modules/uuid/dist/native.js15
-rw-r--r--includes/external/signal/node_modules/uuid/dist/nil.js8
-rw-r--r--includes/external/signal/node_modules/uuid/dist/parse.js45
-rw-r--r--includes/external/signal/node_modules/uuid/dist/regex.js8
-rw-r--r--includes/external/signal/node_modules/uuid/dist/rng-browser.js25
-rw-r--r--includes/external/signal/node_modules/uuid/dist/rng.js24
-rw-r--r--includes/external/signal/node_modules/uuid/dist/sha1-browser.js104
-rw-r--r--includes/external/signal/node_modules/uuid/dist/sha1.js23
-rw-r--r--includes/external/signal/node_modules/uuid/dist/stringify.js44
-rw-r--r--includes/external/signal/node_modules/uuid/dist/uuid-bin.js85
-rw-r--r--includes/external/signal/node_modules/uuid/dist/v1.js107
-rw-r--r--includes/external/signal/node_modules/uuid/dist/v3.js16
-rw-r--r--includes/external/signal/node_modules/uuid/dist/v35.js80
-rw-r--r--includes/external/signal/node_modules/uuid/dist/v4.js43
-rw-r--r--includes/external/signal/node_modules/uuid/dist/v5.js16
-rw-r--r--includes/external/signal/node_modules/uuid/dist/validate.js17
-rw-r--r--includes/external/signal/node_modules/uuid/dist/version.js21
-rw-r--r--includes/external/signal/node_modules/uuid/package.json131
-rw-r--r--includes/external/signal/node_modules/uuid/wrapper.mjs10
-rw-r--r--includes/fragments/dashboard.inc267
-rw-r--r--includes/fragments/member.inc2
-rw-r--r--includes/fragments/metadata.inc2
-rw-r--r--includes/jobs/FrontersNotification.php6
-rw-r--r--includes/lowertokens/2d418045034cbc5a5965201c4ae811520681762e2a5c109396e057f82b2f52731
-rw-r--r--includes/lowertokens/42cd9b69c7ae246d8f1387371671db63a0e989a7e16819b770cb16e137d08aa51
-rw-r--r--includes/lowertokens/4603277f84413087b2e908d8e89bf664ef046e481eb4ae0fef29d91e192c75ee1
-rw-r--r--includes/lowertokens/78e12095fc9f96617fb264fe879e7ca8161b0276691da279d184f29a6d8d86a41
-rw-r--r--includes/lowertokens/ee685f047ea684468cc641bf792d9ab5983260b645be9e91ec74b0d1dd430e8a1
-rw-r--r--includes/lowertokens/fd6817b78ef51afad3e01744ea1193debb6d0f8ac6c60271f51fa9d67ba677c91
-rw-r--r--includes/refresh.php45
-rw-r--r--includes/refresh/assets.inc86
-rw-r--r--includes/refresh/cleanup.inc24
-rw-r--r--includes/util/agewarning.inc4
-rw-r--r--includes/util/banner.inc7
-rw-r--r--includes/util/bitset.inc25
-rw-r--r--includes/util/evening.inc68
-rw-r--r--includes/util/functions.inc102
-rw-r--r--includes/util/language.inc3
-rw-r--r--includes/util/profiles.inc97
-rw-r--r--includes/util/pronouns.inc16
-rw-r--r--includes/util/rainbow.inc1
-rw-r--r--includes/util/short.inc1
-rw-r--r--includes/util/timezones.inc148
-rw-r--r--pages/account.inc4
-rw-r--r--pages/alerts.inc6
-rw-r--r--pages/api/2023ui.php5
-rw-r--r--pages/api/close.php1
-rw-r--r--pages/api/computer.php68
-rw-r--r--pages/api/computername.php12
-rw-r--r--pages/api/data.php12
-rw-r--r--pages/api/design.php58
-rw-r--r--pages/api/evening.php155
-rw-r--r--pages/api/overage.php47
-rw-r--r--pages/api/pleasure-real.php2
-rw-r--r--pages/api/pleasure.php2
-rw-r--r--pages/api/ponytown.php2
-rw-r--r--pages/docs.inc3
-rw-r--r--pages/evening.inc11
-rw-r--r--pages/home.inc202
-rw-r--r--pages/lists.inc2
-rw-r--r--pages/login.inc2
-rw-r--r--pages/metadata.inc3
-rw-r--r--pages/money.inc2
-rw-r--r--pages/pair.inc12
-rw-r--r--pages/ponytown.inc6
-rw-r--r--pages/profiles.inc106
-rw-r--r--pages/public.inc210
-rw-r--r--pages/schedules.inc134
-rw-r--r--pages/sessions.inc2
167 files changed, 4776 insertions, 3677 deletions
diff --git a/.idea/.name b/.idea/.name
deleted file mode 100644
index 348539b..0000000
--- a/.idea/.name
+++ /dev/null
@@ -1 +0,0 @@
-Cold Haze \ No newline at end of file
diff --git a/.idea/deployment.xml b/.idea/deployment.xml
index b63ac80..0a2a236 100644
--- a/.idea/deployment.xml
+++ b/.idea/deployment.xml
@@ -8,6 +8,14 @@
<mappings>
<mapping deploy="/opt/peh" local="$PROJECT_DIR$" web="/" />
</mappings>
+ <excludedPaths>
+ <excludedPath path="/opt/peh/includes/tokens" />
+ <excludedPath path="/opt/peh/includes/lowertokens" />
+ <excludedPath path="/opt/peh/includes/sessions" />
+ <excludedPath local="true" path="$PROJECT_DIR$/includes/tokens" />
+ <excludedPath local="true" path="$PROJECT_DIR$/includes/lowertokens" />
+ <excludedPath local="true" path="$PROJECT_DIR$/includes/sessions" />
+ </excludedPaths>
</serverdata>
</paths>
</serverData>
diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
index 4558473..487788f 100644
--- a/.idea/inspectionProfiles/Project_Default.xml
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -1,6 +1,8 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
+ <inspection_tool class="CssUnresolvedCustomProperty" enabled="false" level="ERROR" enabled_by_default="false" />
+ <inspection_tool class="DuplicatedCode" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
<inspection_tool class="HtmlFormInputWithoutLabel" enabled="false" level="WARNING" enabled_by_default="false" />
<inspection_tool class="HtmlUnknownTag" enabled="true" level="WARNING" enabled_by_default="true">
<option name="myValues">
diff --git a/.idea/modules.xml b/.idea/modules.xml
index d1afdb0..f243f25 100644
--- a/.idea/modules.xml
+++ b/.idea/modules.xml
@@ -2,7 +2,7 @@
<project version="4">
<component name="ProjectModuleManager">
<modules>
- <module fileurl="file://$PROJECT_DIR$/.idea/cold-haze.iml" filepath="$PROJECT_DIR$/.idea/cold-haze.iml" />
+ <module fileurl="file://$PROJECT_DIR$/.idea/ponycule.iml" filepath="$PROJECT_DIR$/.idea/ponycule.iml" />
</modules>
</component>
</project> \ No newline at end of file
diff --git a/.idea/cold-haze.iml b/.idea/ponycule.iml
index ad21c3e..77a2019 100644
--- a/.idea/cold-haze.iml
+++ b/.idea/ponycule.iml
@@ -4,6 +4,7 @@
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/vendor/composer" />
<excludeFolder url="file://$MODULE_DIR$/vendor/ksubileau/color-thief-php" />
+ <excludeFolder url="file://$MODULE_DIR$/includes/composer" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
diff --git a/app.php b/app.php
index edf2439..638d8c4 100644
--- a/app.php
+++ b/app.php
@@ -2,8 +2,7 @@
ob_start();
-if (false) {
-//if (!str_starts_with($_SERVER['REQUEST_URI'], "/api")) {
+if (!str_starts_with($_SERVER['REQUEST_URI'], "/api")) {
require_once $_SERVER['DOCUMENT_ROOT'] . "/error.php";
set_error_handler("ch_error");
}
@@ -18,7 +17,7 @@ if (!function_exists("formatPonypush")) {
}
}
-require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/util/language.inc"; global $lang; global $pages;
+$lang = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/i18n/en.json"), true); global $lang; global $pages;
require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/util/session.inc"; global $isLoggedIn; global $isLowerLoggedIn;
require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/util/functions.inc";
diff --git a/assets/logo/custom-2023.css b/assets/logo/custom-2023.css
index 05350e5..85b3266 100644
--- a/assets/logo/custom-2023.css
+++ b/assets/logo/custom-2023.css
@@ -968,4 +968,153 @@ hr {
.relation-intro {
background-color: var(--palette-2) !important;
border-right: 1px solid var(--palette-3) !important;
+}
+
+body {
+ margin-left: 300px;
+}
+
+.modal.show {
+ left: 300px;
+ width: calc(100% - 300px);
+}
+
+.modal {
+ left: 150px;
+}
+
+nav {
+ display: none !important;
+}
+
+#navigation-pane {
+ z-index: 9999;
+ background: black;
+ position: fixed;
+ top: 0;
+ left: 0;
+ bottom: 0;
+ width: 300px;
+ border-right: 1px solid rgba(255, 255, 255, .25);
+ overflow: auto;
+}
+
+#title-bar {
+ position: fixed;
+ top: 0;
+ left: 300px;
+ right: 0;
+ height: 34px;
+ background: rgba(0, 0, 0, .75);
+ z-index: 9999;
+ padding: 5px;
+ text-align: center;
+ backdrop-filter: blur(10px);
+ -webkit-backdrop-filter: blur(10px);
+ border-bottom: 1px solid rgba(255, 255, 255, .25);
+}
+
+#mobile-navigation {
+ display: none;
+ position: fixed;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ height: 48px;
+ background: rgba(0, 0, 0, .75);
+ backdrop-filter: blur(30px);
+ -webkit-backdrop-filter: blur(30px);
+ border-top: 1px solid rgba(255, 255, 255, .25);
+ z-index: 999999;
+}
+
+@media (max-width: 1360px) {
+ .modal.show {
+ left: 250px !important;
+ width: calc(100% - 250px) !important;
+ }
+
+ .modal {
+ left: 125px !important;
+ }
+
+ #title-bar {
+ left: 250px !important;
+ }
+
+ #navigation-pane {
+ width: 250px !important;
+ }
+
+ body {
+ margin-left: 250px !important;
+ }
+
+ #system-banner-container, #member-banner-container {
+ width: 100% !important;
+ }
+}
+
+@media (max-width: 1300px) {
+ .modal.show {
+ left: 200px !important;
+ width: calc(100% - 200px) !important;
+ }
+
+ .modal {
+ left: 100px !important;
+ }
+
+ #title-bar {
+ left: 200px !important;
+ }
+
+ #navigation-pane {
+ width: 200px !important;
+ }
+
+ body {
+ margin-left: 200px !important;
+ }
+}
+
+@media (max-width: 1195px) {
+ .modal.show {
+ left: 0 !important;
+ width: 100% !important;
+ }
+
+ .modal {
+ left: 0 !important;
+ }
+
+ #title-bar {
+ left: 0 !important;
+ }
+
+ #navigation-pane {
+ display: none !important;
+ }
+
+ body {
+ margin-left: 0 !important;
+ }
+
+ #mobile-navigation {
+ display: block !important;
+ }
+}
+
+@media (max-width: 700px) {
+ #title-bar-parts-mobile {
+ display: inline !important;
+ }
+
+ #title-bar-parts-desktop {
+ display: none;
+ }
+
+ #title-bar {
+ text-align: left;
+ }
} \ No newline at end of file
diff --git a/assets/logo/custom.css b/assets/logo/custom.css
deleted file mode 100644
index 79612cb..0000000
--- a/assets/logo/custom.css
+++ /dev/null
@@ -1,782 +0,0 @@
-img {
- image-rendering: pixelated !important;
-}
-
-.modal-dialog {
- margin-bottom: 3.5rem !important;
-}
-
-#admin-page {
- margin-left: 32px;
-}
-
-.debug-hidden {
- display: none;
-}
-
-#system-banner-container, #member-banner-container {
- z-index: -1;
-}
-
-.debug-outer:hover .debug-hidden {
- display: inline-block;
-}
-
-.modal {
- backdrop-filter: blur(30px);
- -webkit-backdrop-filter: blur(30px);
-}
-
-nav.navbar {
- background-color: rgba(0, 0, 0, .75) !important;
- backdrop-filter: blur(10px);
- -webkit-backdrop-filter: blur(10px);
- border-bottom: 1px solid rgba(255, 255, 255, .25);
-}
-
-body {
- background-color: black !important;
- color: white !important;
-}
-
-.hpd-item-card:hover {
- background-color: rgba(255, 255, 255, .15) !important;
-}
-
-.hpd-item-card:active, .hpd-item-card:focus {
- background-color: rgba(255, 255, 255, .2) !important;
-}
-
-.hpd-system {
- transition: opacity 200ms;
-}
-
-.hpd-item-card {
- outline-style: solid;
- outline-width: 0;
- transition: background-color 200ms, outline-width 200ms;
-}
-
-.hpd-item-card:hover {
- outline-style: solid;
- outline-width: 4px;
-}
-
-.hpd-item-card:active {
- outline-style: solid;
- outline-width: 6px;
-}
-
-.hpd-system:hover {
- opacity: .9 !important;
-}
-
-.hpd-system:active, .hpd-system:focus {
- opacity: .8 !important;
-}
-
-.hpd-link:hover {
- background-color: rgba(255, 255, 255, .15) !important;
-}
-
-.hpd-link:active, .hpd-link:focus {
- background-color: rgba(255, 255, 255, .2) !important;
-}
-
-.list-separator-mobile {
- display: none;
-}
-
-@media (max-width: 991px) {
- #hpd-cloudburst > div, #hpd-raindrops > div, #hpd-legacy > div, #hpd-other > div {
- grid-template-columns: repeat(3, 1fr) !important;
- }
-
- .list-separator-desktop {
- display: none;
- }
-
- span.list-separator-mobile {
- display: inline;
- }
-}
-
-@media (max-width: 768px) {
- #hpd-cloudburst > div, #hpd-raindrops > div, #hpd-legacy > div, #hpd-other > div {
- grid-template-columns: repeat(2, 1fr) !important;
- }
-}
-
-@media (max-width: 575px) {
- #hpd-cloudburst > div, #hpd-raindrops > div, #hpd-legacy > div, #hpd-other > div {
- grid-template-columns: repeat(1, 1fr) !important;
- }
-
- .hpd-item-card img {
- display: inline-block !important;
- margin-right: 5px !important;
- height: 32px !important;
- width: 32px !important;
- }
-
- #hpd-cloudburst > div, #hpd-raindrops > div, #hpd-legacy > div, #hpd-other > div {
- grid-gap: 5px !important;
- }
-
- .hpd-item-card div {
- display: inline-block !important;
- }
-
- .hpd-item-card div:nth-child(3)::before {
- content: "(";
- padding-left: 5px;
- color: white !important;
- }
-
- .hpd-item-card div:nth-child(3)::after {
- content: ")";
- color: white !important;
- }
-}
-
-.dropdown-menu {
- background-color: #222 !important;
-}
-
-.dropdown-item:hover {
- background-color: rgba(255, 255, 255, .1) !important;
-}
-
-.dropdown-item:active, .dropdown-item:focus {
- background-color: rgba(255, 255, 255, .2) !important;
-}
-
-.dropdown-item {
- color: white !important;
-}
-
-.dropdown-icon {
- filter: invert(1) !important;
-}
-
-.dropdown-toggle .dropdown-icon {
- opacity: .5; !important;
- transition: 200ms opacity !important;
-}
-
-.dropdown-toggle:hover .dropdown-icon, .dropdown-toggle:active .dropdown-icon, .dropdown-toggle:focus .dropdown-icon {
- opacity: .75 !important;
-}
-
-dd {
- margin-left: 20px;
-}
-
-#system-info a {
- color: white !important;
-}
-
-#system-info a:hover {
- opacity: .75;
-}
-
-#system-info a:active, #system-info a:focus {
- opacity: .5;
-}
-
-@media (max-width: 991px) {
- #member-card {
- grid-template-columns: repeat(3, 1fr) !important;
- }
-
- .species-name {
- display: none;
- }
-}
-
-.member-small-only {
- display: none;
-}
-
-@media (max-width: 767px) {
- #member-card {
- grid-template-columns: 1fr !important;
- text-align: left;
- }
-
- #member-icon-mobile {
- display: inline-block !important;
- }
-
- #mobile-left {
- text-align: left !important;
- }
-
- #mobile-species {
- display: inline-block !important;
- }
-
- #system-info {
- grid-template-columns: 1fr !important;
- }
-
- #member-icon, #member-icon-outer {
- display: none !important;
- }
-
- #member-relations {
- grid-template-columns: 1fr !important;
- text-align: left;
- }
-
- .member-small-separator {
- display: none;
- }
-
- .member-small-only {
- display: inline-block;
- }
-}
-
-#page-content a {
- color: #afd0ff;
-}
-
-#page-content .btn-outline-light:hover {
- color: black !important;
-}
-
-#page-content a:hover {
- opacity: .75;
-}
-
-#page-content a:active, #page-content a:focus {
- opacity: .5;
-}
-
-.tooltip.show {
- opacity: 1;
-}
-
-.tooltip-inner {
- background: #151515;
- box-shadow: 3px 4px 10px #ffffff26;
-}
-
-.alert {
- filter: invert(1) hue-rotate(180deg);
-}
-
-.member-link {
- color: white !important;
- text-decoration: none !important;
-}
-
-.system-action {
- border-radius: 10px;
- color: white !important;
- text-decoration: none !important;
- cursor: pointer;
- transition: background 200ms;
-}
-
-.system-action:hover {
- background: rgba(255, 255, 255, .1);
-}
-
-.table-dark {
- --bs-table-bg: #000000;
-}
-
-.comparison {
- display: grid;
- grid-template-columns: 3fr 1.5fr 1.5fr 2fr repeat(4, 1fr);
-}
-
-.comparison-header {
- border-bottom: 2px solid rgba(255, 255, 255, .25);
- font-weight: bold;
-}
-
-.comparison-item {
- padding: 5px 10px;
- text-align: center;
-}
-
-.comparison-item-clickable:hover {
- background-color: rgba(255, 255, 255, .1);
-}
-
-.comparison-item-clickable:active, .comparison-item-clickable:focus {
- background-color: rgba(255, 255, 255, .25);
-}
-
-@media (min-width: 1400px) {
- .comparison-header-l0 {
- display: inline;
- }
- .comparison-header-l1 {
- display: none;
- }
- .comparison-header-l2 {
- display: none;
- }
- .comparison-header-l3 {
- display: none;
- }
- .comparison-header-l4 {
- display: none;
- }
- .comparison-header-l5 {
- display: none;
- }
- .comparison-name-full {
- display: inline;
- }
- .comparison-name-small {
- display: none;
- }
- .comparison-colors {
- display: inline;
- }
- .comparison-relations-count {
- display: none;
- }
- .comparison-relations-full {
- display: inline;
- }
-}
-
-@media (max-width: 1399px) {
- .comparison-header-l0 {
- display: none;
- }
- .comparison-header-l1 {
- display: inline;
- }
- .comparison-header-l2 {
- display: none;
- }
- .comparison-header-l3 {
- display: none;
- }
- .comparison-header-l4 {
- display: none;
- }
- .comparison-header-l5 {
- display: none;
- }
- .comparison-name-full {
- display: inline;
- }
- .comparison-name-small {
- display: none;
- }
- .comparison-colors {
- display: inline;
- }
- .comparison-relations-count {
- display: none;
- }
- .comparison-relations-full {
- display: inline;
- }
-}
-
-@media (max-width: 1199px) {
- .comparison-header-l0 {
- display: none;
- }
- .comparison-header-l1 {
- display: none;
- }
- .comparison-header-l2 {
- display: initial;
- }
- .comparison-header-l3 {
- display: none;
- }
- .comparison-header-l4 {
- display: none;
- }
- .comparison-header-l5 {
- display: none;
- }
- .comparison-name-full {
- display: none;
- }
- .comparison-name-small {
- display: inline;
- }
- .comparison-colors {
- display: inline;
- }
- .comparison-relations-count {
- display: inline;
- }
- .comparison-relations-full {
- display: none;
- }
-}
-
-@media (max-width: 991px) {
- .comparison-header-l0 {
- display: none;
- }
- .comparison-header-l1 {
- display: none;
- }
- .comparison-header-l2 {
- display: none;
- }
- .comparison-header-l3 {
- display: initial;
- }
- .comparison-header-l4 {
- display: none;
- }
- .comparison-header-l5 {
- display: none;
- }
- .comparison-name-full {
- display: none;
- }
- .comparison-name-small {
- display: inline;
- }
- .comparison-colors {
- display: none !important;
- }
- .comparison-relations-count {
- display: inline;
- }
- .comparison-relations-full {
- display: none;
- }
-}
-
-@media (max-width: 767px) {
- .comparison-header-l0 {
- display: none;
- }
- .comparison-header-l1 {
- display: none;
- }
- .comparison-header-l2 {
- display: none;
- }
- .comparison-header-l3 {
- display: none;
- }
- .comparison-header-l4 {
- display: initial;
- }
- .comparison-header-l5 {
- display: none;
- }
- .comparison-name-full {
- display: none;
- }
- .comparison-name-small {
- display: none;
- }
- .comparison-colors {
- display: none !important;
- }
- .comparison-relations-count {
- display: inline;
- }
- .comparison-relations-full {
- display: none;
- }
-}
-
-@media (max-width: 575px) {
- .comparison-header-l0 {
- display: none;
- }
- .comparison-header-l1 {
- display: none;
- }
- .comparison-header-l2 {
- display: none;
- }
- .comparison-header-l3 {
- display: none;
- }
- .comparison-header-l4 {
- display: none;
- }
- .comparison-header-l5 {
- display: initial;
- }
- .comparison-name-full {
- display: none;
- }
- .comparison-name-small {
- display: none;
- }
- .comparison-colors {
- display: none !important;
- }
- .comparison {
- grid-template-columns: repeat(4, 2fr) repeat(4, 1fr) !important;
- }
- .comparison-relations-count {
- display: inline;
- }
- .comparison-relations-full {
- display: none;
- }
-}
-
-.tree-first-separator {
- height: 14px !important;
- top: 0 !important;
-}
-
-.tree-l0-separator {
- display: inline-block;
- width: 20px;
- margin-left: 35px;
- border-bottom: 1px solid white;
- border-left: 1px solid white;
- height: 26px;
- position: relative;
- top: -12px;
-}
-
-.tree-l1 .tree-l0-separator {
- border-bottom: none !important;
-}
-
-.tree-l1-separator {
- display: inline-block;
- width: 20px;
- margin-left: 35px;
- border-bottom: 1px solid white;
- border-left: 1px solid white;
- height: 26px;
- position: relative;
- top: -12px;
- left: -10px;
-}
-
-.tree-l1 .tree-l0-separator {
- width: 30px;
-}
-
-.tree-l1 .tree-inner {
- position: relative;
- left: -10px;
-}
-
-.tree-l1 .tree-l0-separator {
- border-bottom: none !important;
-}
-
-.tree-l2-separator {
- display: inline-block;
- width: 20px;
- margin-left: 35px;
- border-bottom: 1px solid white;
- border-left: 1px solid white;
- height: 26px;
- position: relative;
- top: -12px;
- left: -10px;
-}
-
-.tree-l2 .tree-l1-separator {
- width: 30px;
-}
-
-.tree-l2 .tree-l0-separator {
- width: 30px;
-}
-
-.tree-l2 .tree-inner {
- position: relative;
- left: -10px;
-}
-
-.tree-inner {
- display: inline-block;
-}
-
-.navbar-collapse.collapse.show, .navbar-collapse.collapsing {
- background: black;
- margin: 7px -12px;
- padding: 0 12px;
- border-bottom: 1px solid rgba(255, 255, 255, .25);
-}
-
-.new-homepage-system-title:hover {
- opacity: .85;
-}
-
-#new-homepage-systems {
- display: grid;
- grid-template-columns: repeat(3, 1fr);
- grid-gap: 20px;
-}
-
-
-@media (max-width: 1198px) {
- #new-homepage-systems {
- grid-template-columns: 1fr 1fr !important;
- }
-}
-
-@media (max-width: 991px) {
- #new-homepage-systems {
- grid-template-columns: 1fr !important;
- }
-}
-
-.new-homepage-system-list {
- background-color: rgba(255, 255, 255, .1);
- border-bottom-left-radius: 10px;
- border-bottom-right-radius: 10px;
- display: grid;
-}
-
-.new-homepage-link-last {
- border-bottom-left-radius: 10px;
- border-bottom-right-radius: 10px;
-}
-
-.new-homepage-link:hover {
- opacity: .85;
-}
-
-.new-homepage-link:active {
- opacity: .75;
-}
-
-.new-homepage-system-title:active {
- opacity: .75;
-}
-
-peh-muted {
- --bs-text-opacity: 1;
- color: #6c757d!important;
-}
-
-.dropdown-toggle::after {
- margin-bottom: -3px !important;
-}
-
-.navbar-nav {
- width: 100%;
-}
-
-.card {
- background-color: #111 !important;
- border: 1px solid rgba(255, 255, 255, .125) !important;
-}
-
-#member-banner-container > #member-banner > #system-info {
- border-bottom-right-radius: 0 !important;
- border-bottom-left-radius: 0 !important;
-}
-
-#member-details {
- background: rgba(255, 255, 255, .1);
- border: 1px solid transparent;
- border-top: none;
- padding: 10px 20px;
- border-bottom-left-radius: 10px;
- border-bottom-right-radius: 10px;
- display: grid;
- grid-template-columns: repeat(4, 1fr);
- text-align: center;
-}
-
-#member-details.member-details-loggedIn {
- border-radius: 0;
- padding-bottom: 0 !important;
-}
-
-#member-details-2 {
- border-bottom-left-radius: 10px;
- border-bottom-right-radius: 10px;
- padding: 10px 20px;
- text-align: center;
- display: grid;
- grid-template-columns: repeat(4, 1fr);
- background: rgba(255, 255, 255, .1);
- border: 1px solid transparent;
- border-top: none;
-}
-
-.navbar-collapse.show {
- z-index: 99999;
-}
-
-@media (max-width: 991px) {
- div#member-details.member-details-loggedIn, div#member-details.member-details-loggedIn2 {
- grid-template-columns: repeat(3, 1fr) !important;
- text-align: center;
- }
-
- #member-details {
- grid-template-columns: 1fr !important;
- text-align: left;
- }
-}
-
-@media (max-width: 767px) {
- div#member-details.member-details-loggedIn, div#member-details.member-details-loggedIn2 {
- grid-template-columns: repeat(2, 1fr) !important;
- text-align: left;
- }
-
- #member-details-2 {
- grid-template-columns: repeat(2, 1fr) !important;
- text-align: left;
- }
-
- .member-detail-desktop {
- display: none !important;
- }
-
- .member-detail-mobile {
- display: initial !important;
- }
-}
-
-.member-detail-desktop {
- display: initial;
-}
-
-.member-detail-mobile {
- display: none;
-}
-
-.linked-card {
- opacity: 1 !important;
- color: white !important;
- text-decoration: none !important;
-}
-
-.linked-card:hover {
- opacity: .75 !important;
-}
-
-.linked-card:active {
- opacity: .5 !important;
-}
-
-.navbar-brand {
- position: relative;
- z-index: 9999;
-}
-
-html, body {
- overflow-x: hidden;
-}
-
-.form-check-input {
- filter: invert(1) hue-rotate(180deg);
-} \ No newline at end of file
diff --git a/assets/logo/dark.svg b/assets/logo/dark.svg
deleted file mode 100644
index 38557db..0000000
--- a/assets/logo/dark.svg
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 27.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- viewBox="0 0 4256 1080" style="enable-background:new 0 0 4256 1080;" xml:space="preserve">
-<style type="text/css">
- .st0{fill:#FFFFFF;}
- .st1{opacity:0.25;fill:none;stroke:#FFFFFF;stroke-miterlimit:10;enable-background:new ;}
- .st2{opacity:0.54;fill:#333232;enable-background:new ;}
- .st3{fill:#333232;}
- .st4{opacity:0.1;fill:#FFFFFF;enable-background:new ;}
- .st5{fill:#212326;}
- .st6{fill:#1B1B1B;}
- .st7{fill:#292F35;}
- .st8{fill:#25292D;}
-</style>
-<path class="st0" d="M2214.1,552.7h-219.5v-25h219.5l-103.5-103.5l17.5-17.5l133.6,133.6l-133.6,133.6l-17.5-17.5L2214.1,552.7z"/>
-<g>
- <rect y="0.1" width="480.8" height="1080"/>
- <rect x="479.1" y="0.3" width="1440.9" height="1080"/>
- <line class="st1" x1="479.1" y1="0.3" x2="479.1" y2="1080.3"/>
- <line class="st1" x1="0" y1="174.6" x2="479.1" y2="174.6"/>
- <line class="st1" x1="0" y1="234.3" x2="479.1" y2="234.3"/>
- <line class="st1" x1="0" y1="724.6" x2="479.1" y2="724.6"/>
- <path class="st2" d="M1778.7,724.6H621.3c-11,0-20-9-20-20V294.3h1197.4v410.3C1798.7,715.7,1789.7,724.6,1778.7,724.6z"/>
- <path class="st2" d="M621.3,755.6h343c11,0,20,9,20,20v304.5h-383V775.6C601.3,764.5,610.3,755.6,621.3,755.6z"/>
- <path class="st2" d="M1027.9,755.6h343c11,0,20,9,20,20v304.5h-383V775.6C1007.9,764.5,1016.9,755.6,1027.9,755.6z"/>
- <path class="st2" d="M1435.7,755.6h343c11,0,20,9,20,20v304.5h-383V775.6C1415.7,764.5,1424.7,755.6,1435.7,755.6z"/>
- <path class="st3" d="M621.3,755.6h343c11,0,20,9,20,20v58.1h-383v-58.1C601.3,764.5,610.3,755.6,621.3,755.6z"/>
- <path class="st3" d="M1028.5,755.6h343c11,0,20,9,20,20v58.1h-383v-58.1C1008.5,764.5,1017.5,755.6,1028.5,755.6z"/>
- <path class="st3" d="M1435.7,755.6h343c11,0,20,9,20,20v58.1h-383v-58.1C1415.7,764.5,1424.7,755.6,1435.7,755.6z"/>
- <rect y="0.1" class="st4" width="1920" height="1080.2"/>
-</g>
-<g>
- <rect x="2336.2" y="0.3" class="st5" width="1920" height="1080"/>
- <path class="st6" d="M4206.5,1052.2H2510.6c-11,0-20-9-20-20V114.5c0-11,9-20,20-20h1695.8c11,0,20,9,20,20v917.7
- C4226.5,1043.2,4217.5,1052.2,4206.5,1052.2z"/>
- <path class="st7" d="M2414.8,335.9L2414.8,335.9c-23.7,0-42.9-19.2-42.9-42.9V161.2c0-23.7,19.2-42.9,42.9-42.9l0,0
- c23.7,0,42.9,19.2,42.9,42.9V293C2457.6,316.7,2438.4,335.9,2414.8,335.9z"/>
- <path class="st7" d="M3620.4,78.4h-648.2c-5.5,0-10-4.5-10-10v-34c0-5.5,4.5-10,10-10h648.3c5.5,0,10,4.5,10,10v33.9
- C3630.4,73.9,3625.9,78.4,3620.4,78.4z"/>
- <path class="st5" d="M3936.7,696.7H2779.2c-11,0-20-9-20-20V266.4h1197.4v410.3C3956.7,687.8,3947.7,696.7,3936.7,696.7z"/>
- <path class="st5" d="M2779.2,727.7h343c11,0,20,9,20,20v304.5h-383V747.7C2759.2,736.6,2768.2,727.7,2779.2,727.7z"/>
- <path class="st5" d="M3185.9,727.7h343c11,0,20,9,20,20v304.5h-383V747.7C3165.9,736.6,3174.9,727.7,3185.9,727.7z"/>
- <path class="st5" d="M3593.7,727.7h343c11,0,20,9,20,20v304.5h-383V747.7C3573.7,736.6,3582.7,727.7,3593.7,727.7z"/>
- <path class="st8" d="M2779.2,727.7h343c11,0,20,9,20,20v58.1h-383v-58.1C2759.2,736.6,2768.2,727.7,2779.2,727.7z"/>
- <path class="st8" d="M3186.4,727.7h343c11,0,20,9,20,20v58.1h-383v-58.1C3166.4,736.6,3175.4,727.7,3186.4,727.7z"/>
- <path class="st8" d="M3593.7,727.7h343c11,0,20,9,20,20v58.1h-383v-58.1C3573.7,736.6,3582.7,727.7,3593.7,727.7z"/>
-</g>
-</svg>
diff --git a/assets/logo/light.css b/assets/logo/light.css
deleted file mode 100644
index ead5586..0000000
--- a/assets/logo/light.css
+++ /dev/null
@@ -1,220 +0,0 @@
-@media (prefers-color-scheme: light) {
- body {
- color: black !important;
- background-color: #efefef !important;
- }
-
- #banner-lower {
- background: #dddddd8a !important;
- }
-
- #timeline-container {
- background: #dddddd8a !important;
- border-top-color: rgba(0, 0, 0, .1) !important;
- }
-
- #timeline a, .new-homepage-system-title, .new-homepage-link, .home-legacy, .member-card-name, .member-card-prefix, .member-card-prefix code, #navigation-pane *, #mobile-navigation-box-container *, .member-link, .relation-intro, .system-action, #member-banner code, #system-info a {
- color: black !important;
- }
-
- .timeline-indicator {
- border-right-color: rgba(0, 0, 0, .5) !important;
- }
-
- .home-legacy-icon, #explicit-modal img {
- filter: invert(1);
- }
-
- #hpd-legacy, .hpd-item-card {
- background-color: rgba(0, 0, 0, .05) !important;
- }
-
- .hpd-item-card:hover {
- background-color: rgba(0, 0, 0, .1) !important;
- }
-
- .hpd-item-card:active {
- background-color: rgba(0, 0, 0, .15) !important;
- }
-
- #navigation-pane {
- background-color: #ddd !important;
- border-right: 1px solid rgba(0, 0, 0, .1) !important;
- }
-
- #mobile-navigation {
- background-color: #ddd !important;
- border-top: 1px solid rgba(0, 0, 0, .1) !important;
- }
-
- .dropdown-icon, #login-link img, .alert, .btn-close, .relation img, .text-danger, .text-success, .form-select, .ck-toolbar, .form-check-input, .system-action img, #member-designs-inner img, .form-control, .list-group-item img {
- filter: none !important;
- }
-
- #login-link, #pane-header, .pane-group {
- border-bottom: 1px solid rgba(0, 0, 0, .1) !important;
- }
-
- .pane-group-category {
- background: rgba(0, 0, 0, .025) !important;
- border: 1px solid rgba(0, 0, 0, .05) !important;
- }
-
- .pane-group-item:hover, .mobile-navigation-item:hover {
- background-color: rgba(0, 0, 0, .05);
- }
-
- .mobile-navigation-item:active, .mobile-navigation-item.open {
- background-color: rgba(0, 0, 0, .1);
- }
-
- #mobile-navigation-box-container {
- background-color: rgba(255, 255, 255, .5) !important;
- }
-
- #page-content a {
- color: #0d6efd;
- }
-
- #btn-on {
- background: hsl(0, 80%, 75%) !important;
- }
-
- .modal-backdrop {
- background-color: #fff !important;
- }
-
- .modal-header, #explicit-modal .modal-header {
- border-bottom: 1px solid #dee2e6 !important;
- }
-
- .modal-content, #explicit-modal .modal-content {
- background-color: #fff !important;
- border: 1px solid rgba(0,0,0,.2) !important;
- }
-
- .relation {
- background-color: rgba(0, 0, 0, .05) !important;
- }
-
- .relation-intro {
- background-color: rgba(0, 0, 0, .025) !important;
- border-right: 1px solid rgba(0, 0, 0, .05) !important;
- }
-
- .card {
- background-color: #fff !important;
- border: 1px solid rgba(0,0,0,.125) !important;
- color: black;
- }
-
- .list-group-item {
- color: #212529 !important;
- background-color: #fff !important;
- border-color: rgba(0,0,0,.125) !important;
- }
-
- .list-group-item-action:focus, .list-group-item-action:hover {
- color: #495057 !important;
- background-color: #f8f9fa !important;
- }
-
- .btn-outline-light, #page-content .btn-outline-light {
- color: #212529 !important;
- border-color: #212529 !important;
- }
-
- .btn-outline-light:hover, #page-content .btn-outline-light:hover {
- color: #fff !important;
- background-color: #212529 !important;
- border-color: #212529 !important;
- }
-
- .btn-check:active+.btn-outline-light, .btn-check:checked+.btn-outline-light, .btn-outline-light.active, .btn-outline-light.dropdown-toggle.show, .btn-outline-light:active, #page-content .btn-outline-light:active {
- color: #fff !important;
- background-color: #212529 !important;
- border-color: #212529 !important;
- }
-
- .form-control {
- color: #212529 !important;
- background-color: #fff !important;
- background-clip: padding-box !important;
- border: 1px solid #ced4da !important;
- }
-
- .contact-item {
- background-color: #ddd;
- }
-
- .contact-method {
- background-color: #ccc;
- }
-
- .dropdown-menu {
- background-color: #fff !important;
- }
-
- .dropdown-item {
- color: #212529 !important;
- opacity: 1 !important;
- }
-
- .dropdown-item:focus, .dropdown-item:hover {
- color: #1e2125 !important;
- background-color: #e9ecef !important;
- }
-
- .day-gradient {
- color: white;
- }
-
- #system-banner-inner, #member-banner-inner {
- background: linear-gradient(180deg, rgba(239,239,239,0) 0%, rgba(239,239,239,.25) 50%, rgba(239,239,239,1) 100%) !important;
- }
-
- #system-page, #member-page {
- background-color: rgba(226,226,226,0.8) !important;
- }
-
- .system-info-system {
- background-color: rgba(0, 0, 0, .05) !important;
- }
-
- #system-actions {
- background-color: rgba(0, 0, 0, .025) !important;
- }
-
- .system-action:hover {
- background: rgba(0, 0, 0, .05) !important;
- }
-
- #member-designs-inner {
- background-color: rgba(20, 20, 20, .05) !important;
- }
-
- .btn-dark {
- color: #000 !important;
- background-color: #f8f9fa !important;
- border-color: #f8f9fa !important;
- }
-
- .btn-dark:hover {
- color: #000 !important;
- background-color: #f9fafb !important;
- border-color: #f9fafb !important;
- }
-
- .btn-check:active+.btn-dark, .btn-check:checked+.btn-dark, .btn-dark.active, .btn-dark:active, .show>.btn-dark.dropdown-toggle {
- color: #000 !important;
- background-color: #f9fafb !important;
- border-color: #f9fafb !important;
- }
-
- .btn-check:focus+.btn-dark, .btn-dark:focus {
- color: #000 !important;
- background-color: #f9fafb !important;
- border-color: #f9fafb !important;
- box-shadow: 0 0 0 0.25rem rgba(211,212,213,.5) !important;
- }
-} \ No newline at end of file
diff --git a/assets/logo/light.svg b/assets/logo/light.svg
deleted file mode 100644
index c76f07e..0000000
--- a/assets/logo/light.svg
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 27.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- viewBox="0 0 4256 1080" style="enable-background:new 0 0 4256 1080;" xml:space="preserve">
-<style type="text/css">
- .st0{fill:#DDDDDD;}
- .st1{fill:#EFEFEF;}
- .st2{opacity:0.1;fill:none;stroke:#231F20;stroke-miterlimit:10;enable-background:new ;}
- .st3{opacity:0.54;fill:#DDDDDD;enable-background:new ;}
- .st4{fill:#EFF4F7;}
- .st5{fill:#FCFCFC;}
- .st6{fill:#DEEAF0;}
- .st7{fill:#E7EFF4;}
-</style>
-<g>
- <rect y="0" class="st0" width="480.8" height="1080"/>
- <rect x="479.1" y="0.2" class="st1" width="1440.9" height="1080"/>
- <line class="st2" x1="479.1" y1="0.2" x2="479.1" y2="1080.2"/>
- <line class="st2" x1="0" y1="174.5" x2="479.1" y2="174.5"/>
- <line class="st2" x1="0" y1="234.2" x2="479.1" y2="234.2"/>
- <line class="st2" x1="0" y1="724.5" x2="479.1" y2="724.5"/>
- <path class="st3" d="M1778.7,724.5H621.3c-11,0-20-9-20-20V294.2h1197.4v410.3C1798.7,715.6,1789.7,724.5,1778.7,724.5z"/>
- <path class="st3" d="M621.3,755.5h343c11,0,20,9,20,20V1080h-383V775.5C601.3,764.4,610.3,755.5,621.3,755.5z"/>
- <path class="st3" d="M1027.9,755.5h343c11,0,20,9,20,20V1080h-383V775.5C1007.9,764.4,1016.9,755.5,1027.9,755.5z"/>
- <path class="st3" d="M1435.7,755.5h343c11,0,20,9,20,20V1080h-383V775.5C1415.7,764.4,1424.7,755.5,1435.7,755.5z"/>
- <path class="st0" d="M621.3,755.5h343c11,0,20,9,20,20v58.1h-383v-58.1C601.3,764.4,610.3,755.5,621.3,755.5z"/>
- <path class="st0" d="M1028.5,755.5h343c11,0,20,9,20,20v58.1h-383v-58.1C1008.5,764.4,1017.5,755.5,1028.5,755.5z"/>
- <path class="st0" d="M1435.7,755.5h343c11,0,20,9,20,20v58.1h-383v-58.1C1415.7,764.4,1424.7,755.5,1435.7,755.5z"/>
-</g>
-<g>
- <rect x="2329.4" y="0.2" class="st4" width="1920" height="1080"/>
- <path class="st5" d="M4199.6,1052.1H2503.8c-11,0-20-9-20-20V114.4c0-11,9-20,20-20h1695.8c11,0,20,9,20,20v917.7
- C4219.6,1043.1,4210.6,1052.1,4199.6,1052.1z"/>
- <path class="st6" d="M2407.9,335.8L2407.9,335.8c-23.7,0-42.9-19.2-42.9-42.9V161.1c0-23.7,19.2-42.9,42.9-42.9l0,0
- c23.7,0,42.9,19.2,42.9,42.9v131.8C2450.7,316.6,2431.5,335.8,2407.9,335.8z"/>
- <path class="st6" d="M3613.5,78.3h-648.2c-5.5,0-10-4.5-10-10v-34c0-5.5,4.5-10,10-10h648.3c5.5,0,10,4.5,10,10v33.9
- C3623.5,73.8,3619.1,78.3,3613.5,78.3z"/>
- <path class="st4" d="M3929.8,696.6H2772.4c-11,0-20-9-20-20V266.3h1197.4v410.3C3949.8,687.7,3940.8,696.6,3929.8,696.6z"/>
- <path class="st4" d="M2772.4,727.6h343c11,0,20,9,20,20v304.5h-383V747.6C2752.4,736.5,2761.4,727.6,2772.4,727.6z"/>
- <path class="st4" d="M3179,727.6h343c11,0,20,9,20,20v304.5h-383V747.6C3159,736.5,3168,727.6,3179,727.6z"/>
- <path class="st4" d="M3586.8,727.6h343c11,0,20,9,20,20v304.5h-383V747.6C3566.8,736.5,3575.8,727.6,3586.8,727.6z"/>
- <path class="st7" d="M2772.4,727.6h343c11,0,20,9,20,20v58.1h-383v-58.1C2752.4,736.5,2761.4,727.6,2772.4,727.6z"/>
- <path class="st7" d="M3179.6,727.6h343c11,0,20,9,20,20v58.1h-383v-58.1C3159.6,736.5,3168.6,727.6,3179.6,727.6z"/>
- <path class="st7" d="M3586.8,727.6h343c11,0,20,9,20,20v58.1h-383v-58.1C3566.8,736.5,3575.8,727.6,3586.8,727.6z"/>
-</g>
-<path d="M2214.1,552.7h-219.5v-25h219.5l-103.5-103.5l17.5-17.5l133.6,133.6l-133.6,133.6l-17.5-17.5L2214.1,552.7z"/>
-</svg>
diff --git a/assets/logo/newlogo-template.png b/assets/logo/newlogo-template.png
deleted file mode 100644
index 14d8864..0000000
--- a/assets/logo/newlogo-template.png
+++ /dev/null
Binary files differ
diff --git a/assets/logo/newlogo.png b/assets/logo/newlogo.png
deleted file mode 100644
index 540f36c..0000000
--- a/assets/logo/newlogo.png
+++ /dev/null
Binary files differ
diff --git a/assets/logo/newlogo3-template.png b/assets/logo/newlogo3-template.png
deleted file mode 100644
index 2f67b11..0000000
--- a/assets/logo/newlogo3-template.png
+++ /dev/null
Binary files differ
diff --git a/assets/logo/newlogo3.png b/assets/logo/newlogo3.png
deleted file mode 100644
index ec7d40b..0000000
--- a/assets/logo/newlogo3.png
+++ /dev/null
Binary files differ
diff --git a/assets/logo/pacifier.png b/assets/logo/pacifier.png
deleted file mode 100644
index caa54ab..0000000
--- a/assets/logo/pacifier.png
+++ /dev/null
Binary files differ
diff --git a/assets/logo/plush.png b/assets/logo/plush.png
deleted file mode 100644
index e3a02b2..0000000
--- a/assets/logo/plush.png
+++ /dev/null
Binary files differ
diff --git a/assets/uploads/pt-mistybrightdawn.png b/assets/uploads/pt-mistybrightdawn.png
index bc07a9b..0f835c6 100644
--- a/assets/uploads/pt-mistybrightdawn.png
+++ b/assets/uploads/pt-mistybrightdawn.png
Binary files differ
diff --git a/assets/uploads/pt-velvet.png b/assets/uploads/pt-velvet.png
index 666ed93..0972860 100644
--- a/assets/uploads/pt-velvet.png
+++ b/assets/uploads/pt-velvet.png
Binary files differ
diff --git a/auth/callback/index.php b/auth/callback/index.php
index 1ff53f7..9697e63 100644
--- a/auth/callback/index.php
+++ b/auth/callback/index.php
@@ -21,7 +21,7 @@ curl_setopt($crl, CURLOPT_HTTPHEADER, [
"Content-Type: application/x-www-form-urlencoded",
"Accept: application/json"
]);
-curl_setopt($crl, CURLOPT_POSTFIELDS, "grant_type=authorization_code&redirect_uri=" . urlencode("https://ponies.equestria.horse/auth/callback") . "&code=" . $_GET['code']);
+curl_setopt($crl, CURLOPT_POSTFIELDS, "grant_type=authorization_code&redirect_uri=" . urlencode("https://ponycule.equestria.horse/auth/callback") . "&code=" . $_GET['code']);
$result = curl_exec($crl);
$result = json_decode($result, true);
@@ -42,7 +42,6 @@ if (isset($result["access_token"])) {
if (!in_array($result["id"], $appdata["oauth"]["allowed"]["admin"]) && !in_array($result["id"], $appdata["oauth"]["allowed"]["lower"])) {
peh_error("Access denied, you are not allowed to login to this website", 403);
- die();
}
if (!file_exists($_SERVER['DOCUMENT_ROOT'] . "/includes/sessions")) mkdir($_SERVER['DOCUMENT_ROOT'] . "/includes/sessions");
@@ -57,17 +56,17 @@ if (isset($result["access_token"])) {
"last" => time(),
"profile" => $result,
"addresses" => [],
- "name" => "Cold Haze Web (" . get_browser(null, true)["browser"] . " on " . str_replace("Windows dows", "Windows", str_replace("Win", "Windows ", str_replace("MacOSX", "macOS", get_browser(null, true)["platform"]))) . ")"
+ "name" => "Ponycule Web (" . get_browser(null, true)["browser"] . " on " . str_replace("Windows dows", "Windows", str_replace("Win", "Windows ", str_replace("MacOSX", "macOS", get_browser(null, true)["platform"]))) . ")"
]));
file_put_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/tokens/" . $token, $result_orig);
} else {
- file_put_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/session/" . $token, json_encode([
+ file_put_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/sessions/" . $token, json_encode([
"created" => time(),
"last" => time(),
"profile" => $result,
"addresses" => [],
- "name" => "Cold Haze Web (" . get_browser(null, true)["browser"] . " on " . get_browser(null, true)["platform"] . ")"
+ "name" => "Ponycule Web (" . get_browser(null, true)["browser"] . " on " . get_browser(null, true)["platform"] . ")"
]));
file_put_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/lowertokens/" . $token, $result_orig);
diff --git a/auth/init/index.php b/auth/init/index.php
index 64535f4..d2f93ce 100644
--- a/auth/init/index.php
+++ b/auth/init/index.php
@@ -3,5 +3,5 @@
$app = $GLOBALS["ColdHazeApp"] = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/app.json"), true);
$server = "account.equestria.dev";
-header("Location: https://$server/hub/api/rest/oauth2/auth?client_id=" . $GLOBALS["ColdHazeApp"]["oauth"]["id"] . "&response_type=code&redirect_uri=https://ponies.equestria.horse/auth/callback&scope=Hub&request_credentials=default&access_type=offline");
+header("Location: https://$server/hub/api/rest/oauth2/auth?client_id=" . $GLOBALS["ColdHazeApp"]["oauth"]["id"] . "&response_type=code&redirect_uri=https://ponycule.equestria.horse/auth/callback&scope=Hub&request_credentials=default&access_type=offline");
die();
diff --git a/error.php b/error.php
index 5b65ab3..7e2a227 100644
--- a/error.php
+++ b/error.php
@@ -9,12 +9,12 @@
<html lang="en">
<head>
<meta charset="UTF-8">
- <title>500 Internal server error · Cold Haze</title>
+ <title>500 Internal server error · Ponycule</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script>
- <link rel="shortcut icon" href="/assets/logo/newlogo.png" type="image/png">
+ <link rel="shortcut icon" href="/assets/logo/newlogo-ng.png" type="image/png">
<style>
html, body {
background: black;
@@ -55,7 +55,7 @@
</div>
<hr>
<pre>
- Cold Haze crash report
+ Ponycule/CH crash report
======================
Code <?= $level ?> [<?php
diff --git a/includes/refresh/backup.inc b/includes/backup.inc
index bed4637..bed4637 100644
--- a/includes/refresh/backup.inc
+++ b/includes/backup.inc
diff --git a/includes/components/2023ui.inc b/includes/components/2023ui.inc
index 8e9dc69..d0792ec 100644
--- a/includes/components/2023ui.inc
+++ b/includes/components/2023ui.inc
@@ -99,7 +99,7 @@
<div style="height: 52px; display: flex; align-items: center;">
<a href="/" style="color: inherit; text-decoration: inherit;">
<img class="antialias" src="/assets/logo/newlogo-ng.png" style="width: 32px;">
- <span style="margin-left: 5px; vertical-align: middle; position: relative; top: -1px; font-weight: bold;">Cold Haze</span>
+ <span style="margin-left: 5px; vertical-align: middle; position: relative; top: -1px; font-weight: bold;">Ponycule</span>
</a>
</div>
<div style="display: flex; align-items: center;">
@@ -188,10 +188,10 @@
<div id="side-bar" style="position: fixed; top: 62px; bottom: 20px; left: 0; width: 64px; display: flex; justify-content: center;">
<div>
<div id="side-bar-systems" style="background-color: var(--palette-4); height: max-content; border-radius: 999px;">
- <a data-bs-toggle="tooltip" data-bs-placement="right" title="Cloudburst System" class="ui2023-side-bar-system" href="/cloudburst" style="padding: 8px; height: 48px; width: 48px; display: block; border-bottom-left-radius: 999px; border-bottom-right-radius: 999px;">
+ <a data-bs-toggle="tooltip" data-bs-placement="right" title="Cloudburst System" class="ui2023-side-bar-system" href="/cloudburst" style="padding: 8px; height: 48px; width: 48px; display: block; border-top-left-radius: 999px; border-top-right-radius: 999px;">
<img class="antialias" src="<?= getAsset("ynmuc") ?>" style="max-width: 32px; max-height: 32px;">
</a>
- <a data-bs-toggle="tooltip" data-bs-placement="right" title="Raindrops System" class="ui2023-side-bar-system" href="/raindrops" style="padding: 8px; height: 48px; width: 48px; display: block; border-top-left-radius: 999px; border-top-right-radius: 999px;">
+ <a data-bs-toggle="tooltip" data-bs-placement="right" title="Raindrops System" class="ui2023-side-bar-system" href="/raindrops" style="padding: 8px; height: 48px; width: 48px; display: block;">
<img class="antialias" class="antialias" src="<?= getAsset("gdapd") ?>" style="max-width: 32px; max-height: 32px;">
</a>
<?php global $app; if ($isLoggedIn || $isLowerLoggedIn): ?>
@@ -199,7 +199,7 @@
<img class="antialias" class="antialias" src="<?= getAsset("other") ?>" style="max-width: 32px; max-height: 32px;">
</a>
<?php endif; ?>
- <a data-bs-toggle="tooltip" data-bs-placement="right" title="Moonglow" class="ui2023-side-bar-system" href="/moonglow" style="padding: 8px; height: 48px; width: 48px; display: block; border-top-left-radius: 999px; border-top-right-radius: 999px;">
+ <a data-bs-toggle="tooltip" data-bs-placement="right" title="Moonglow" class="ui2023-side-bar-system" href="/moonglow" style="padding: 8px; height: 48px; width: 48px; display: block; border-bottom-left-radius: 999px; border-bottom-right-radius: 999px;">
<img class="antialias" class="antialias" src="<?= getAsset("hrbom") ?>" style="max-width: 32px; max-height: 32px;">
</a>
</div>
@@ -209,13 +209,10 @@
<img src="<?= icon("relations") ?>" style="max-width: 28px; max-height: 28px;">
</a>
- <?php if ($isLowerLoggedIn || $isLoggedIn): ?>
+ <?php if ($isLoggedIn): ?>
<div class="mobile-hide" style="margin: 10px 0; width: 48px; height: 2px; background-color: var(--palette-2);"></div>
<div class="mobile-show" style="display: none; margin: 0 10px; height: 48px; width: 2px; background-color: var(--palette-2); vertical-align: middle;"></div>
- <a data-bs-toggle="tooltip" data-bs-placement="right" title="Schedules" class="ui2023-side-bar-item" href="/-/schedules" style="padding: 10px; height: 48px; width: 48px; display: block; border-radius: 999px;">
- <img src="<?= icon("schedule") ?>" style="max-width: 28px; max-height: 28px;">
- </a>
<a data-bs-toggle="tooltip" data-bs-placement="right" title="Money tracker" class="ui2023-side-bar-item" href="/-/money" style="padding: 10px; height: 48px; width: 48px; display: block; border-radius: 999px;">
<img src="<?= icon("money") ?>" style="max-width: 28px; max-height: 28px;">
</a>
diff --git a/includes/components/explicit.php b/includes/components/explicit.php
deleted file mode 100644
index 3e7675c..0000000
--- a/includes/components/explicit.php
+++ /dev/null
@@ -1,130 +0,0 @@
-<?php global $isLoggedIn; global $isLowerLoggedIn; global $_PROFILE; global $app; if ($isLoggedIn || $isLowerLoggedIn): ?>
-<div class="modal" id="explicit-modal" data-bs-backdrop="static" data-bs-keyboard="false">
- <div class="modal-dialog">
- <div class="modal-content">
- <div class="modal-body" style="text-align: center;">
- <img alt="" style="width: 64px; height: 64px;" src="/assets/icons/explicit.svg">
- <h3>This content is sexually explicit</h3>
-
- <p>This page shows uncensored graphically explicit sexual content that you may not want to see in some cases. Please refrain from visiting this part of the website in a public place.</p>
- <p>By continuing, you agree to be presented with sexually explicit content that is not appropriate for everyone.</p>
-
- <span onclick="explicitConfirm();" id="explicit-modal-confirm" class="btn btn-primary">Continue</span>
- <span onclick="explicitCancel();" id="explicit-modal-cancel" class="btn btn-outline-secondary">Go back</span>
-
- <label style="margin-top:10px; display: block; text-align: left; opacity: .5;">
- <input checked type="checkbox" class="form-check-input" id="explicit-modal-hour">
- Don't show for the next hour
- </label>
- </div>
- </div>
- </div>
-</div>
-
-<?php global $use2023UI; if (!$use2023UI): ?>
- <style>
- #explicit-modal .modal-header {
- border-bottom: 1px solid #353738;
- }
-
- #explicit-modal .modal-content {
- border: 1px solid rgba(255, 255, 255, .2);
- background-color: #111;
- }
- </style>
-<?php endif; ?>
-
-<!--suppress JSVoidFunctionReturnValueUsed -->
-<script>
- window.explicitModal = new bootstrap.Modal(document.getElementById("explicit-modal"));
- window.ip = "<?= $_SERVER['REMOTE_ADDR'] ?>";
- window.front = "<?php
-
- $front = [];
- $id = null;
-
- if ($_PROFILE["login"] === "raindrops") {
- $id = "gdapd";
- } else if ($_PROFILE["login"] === "cloudburst") {
- $id = "ynmuc";
- } else {
- $id = $app["other"]["id"];
- }
-
- $fronters = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/$id/fronters.json"), true)["members"];
- $front = array_map(function ($i) {
- return $i["id"];
- }, $fronters);
-
- echo(implode(",", $front));
-
- ?>";
- window.age = <?php
-
- if (isset($front[0]) && file_exists($_SERVER['DOCUMENT_ROOT'] . "/includes/data/metadata/" . $front[0] . ".json")) {
- $metadata = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/metadata/" . $front[0] . ".json"), true);
- $age = null;
-
- if (isset($metadata["birth"]["age"]) && $metadata["birth"]["age"] !== 0) {
- $age = $metadata["birth"]["age"];
- } else if (isset($metadata["birth"]["year"]) && $metadata["birth"]["year"] > 1990) {
- $age = (int)date('Y') - $metadata["birth"]["year"] + (strtotime(date('Y') . "-" . $metadata["birth"]["date"]) <= time() ? 0 : -1);
- }
-
- if (is_string($age) && isset(explode("-", $age)[1]) && is_numeric(explode("-", $age)[1])) {
- $age = (int)explode("-", $age)[1];
- }
-
- echo($age);
- }
-
- ?>;
- window.explicitCancelAction = "back";
-
- function requestExplicit(ifNotAgreed, allowUnderage) {
- window.explicitCancelAction = ifNotAgreed;
-
- if (!allowUnderage && window.age !== -1 && (window.age < 15 || !window.age)) {
- document.getElementById("explicit-modal-confirm").classList.add("disabled");
- document.getElementById("explicit-modal-hour").disabled = true;
-
- window.explicitModal.show();
- document.getElementById("explicit-modal").classList.add("fade");
- }
-
- if (!localStorage.getItem("explicit-consent")) {
- window.explicitModal.show();
- document.getElementById("explicit-modal").classList.add("fade");
- } else {
- let parts = localStorage.getItem("explicit-consent").split("|");
-
- if (parts[0] !== window.front || parts[1] !== window.ip || new Date().getTime() - parseInt(parts[2]) > 3600000) {
- window.explicitModal.show();
- document.getElementById("explicit-modal").classList.add("fade");
- }
- }
- }
-
- function explicitConfirm() {
- window.explicitModal.hide();
-
- if (document.getElementById("explicit-modal-hour").checked) {
- localStorage.setItem("explicit-consent", window.front + "|" + window.ip + "|" + new Date().getTime());
- }
- }
-
- function explicitCancel() {
- if (window.explicitCancelAction === "refresh") {
- location.reload();
- } else {
- if (history.length > 1) {
- if (history.back() === undefined) {
- location.href = "https://ponies.equestria.horse";
- }
- } else {
- location.href = "https://ponies.equestria.horse";
- }
- }
- }
-</script>
-<?php endif; ?>
diff --git a/includes/components/footer.inc b/includes/components/footer.inc
index a348ce4..c062436 100644
--- a/includes/components/footer.inc
+++ b/includes/components/footer.inc
@@ -2,37 +2,11 @@
global $start;
$GLOBALS["ColdHazePerformance"]["page"] = (microtime(true) - $start) * 1000;
$start = microtime(true);
-global $pageFile;
-global $use2023UI;
?>
<script src="/assets/editor/ua-parser.js"></script>
-<?php if (!$use2023UI): ?>
-<div id="footer-pre"></div>
-<div id="footer">
- <hr>
- <div class="container text-muted">
- <?php
-
- $refresh = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/refresh.json"), true);
- $version = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/version.json"), true);
-
- global $lang; global $pages;
-
- $time = microtime(true) - $GLOBALS["ColdHazeStart"];
-
- ?>
- © 2022-<?= date("Y") ?> <a href="https://equestria.dev" target="_blank" class="text-muted"><?= $lang["footer"]["copyright"] ?></a> · build <?= $version["build"] ?>.<?= $version["revision"] ?>, took <?= round($time * 1000, 2) ?> ms
- <?php global $use2023UI; global $isLoggedIn; global $isLowerLoggedIn; global $_PROFILE; if (($isLoggedIn || $isLowerLoggedIn) && !$use2023UI && ((isset($_COOKIE["enable2023UIcta"]) && $_COOKIE["enable2023UIcta"] === "yes") || ($_PROFILE["login"] === "raindrops"))) { ?>
- <br>
- <a class="text-muted" href="#" data-bs-toggle="modal" data-bs-target="#new-ui-cta" onclick="newShape();">Enable Cold Haze's experimental new shape</a>
- <?php } ?>
- <br><br><br><br><br>
- </div>
-</div>
-<?php else: ?><br><br><?php endif; ?>
-</main>
+<br><br></main>
<script>
let tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'))
@@ -40,15 +14,7 @@ global $use2023UI;
return new bootstrap.Tooltip(tooltipTriggerEl)
});
- <?php if (!$use2023UI): ?>
- Array.from(document.querySelectorAll('[data-bs-toggle="tooltip"]')).forEach((item) => {
- if (!item.classList.contains("tooltip-nohelp")) {
- item.style.cursor = "help";
- }
- });
- <?php endif; ?>
-
- //window.fetch("/api/rename?name=" + encodeURIComponent("Cold Haze Web (" + UAParser().browser.name + " on " + UAParser().os.name + ")"));
+ window.fetch("/api/rename?name=" + encodeURIComponent("Cold Haze Web (" + UAParser().browser.name + " on " + UAParser().os.name + ")"));
if (document.createElement("canvas").getContext("webgl") === null) {
let style = document.createElement("style");
@@ -62,7 +28,5 @@ global $use2023UI;
<pre><?php $GLOBALS["ColdHazePerformance"]["footer"] = (microtime(true) - $start) * 1000; var_dump($GLOBALS["ColdHazePerformance"]); ?></pre>
<?php endif; ?>
-<?php global $isLoggedIn; global $isLowerLoggedIn; if ($isLoggedIn || $isLowerLoggedIn) require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/components/explicit.php"; ?>
-
</body>
</html> \ No newline at end of file
diff --git a/includes/components/fullbanner.inc b/includes/components/fullbanner.inc
index 8d3f4a1..960ae0a 100644
--- a/includes/components/fullbanner.inc
+++ b/includes/components/fullbanner.inc
@@ -4,14 +4,14 @@
</script>
<div id="member-banner"></div>
-<script src="/assets/logo/banner.js"></script><script>refreshBanner(false, <?= $lang["_french"] ? "true" : "false" ?>)</script>
+<script src="/assets/logo/banner.js?_=<?= sha1_file($_SERVER['DOCUMENT_ROOT'] . "/assets/logo/banner.js") ?>"></script><script>refreshBanner(false, <?= $lang["_french"] ? "true" : "false" ?>)</script>
-<?php if ($travelling[$memberID]['travelling'] && !$travelling[$memberID]['equestria']): ?>
+<?php if (isset($travelling[$memberID]) && $travelling[$memberID]['travelling'] && !$travelling[$memberID]['equestria']): ?>
<br>
<div class="alert alert-primary" style="margin-bottom: 0 !important;">
<?= getMiniName($memberData["display_name"] ?? $memberData["name"]) ?> <?= $lang["fullbanner"]["visit"][0] ?> <?= $systemID === "ynmuc" ? "Raindrops System" : "Cloudburst System" ?><?= str_replace("%1", getMemberPronouns($memberData["pronouns"])["subjective"], str_replace("%2", getMemberPronouns($memberData["pronouns"])["third"] ? "is" : "are", $lang["fullbanner"]["visit"][1])) ?><?= $systemCommonName ?>.
</div>
-<?php elseif ($travelling[$memberID]['travelling'] && $travelling[$memberID]['equestria']): ?>
+<?php elseif (isset($travelling[$memberID]) && $travelling[$memberID]['travelling'] && $travelling[$memberID]['equestria']): ?>
<br>
<div class="alert alert-primary" style="margin-bottom: 0 !important;">
<?= getMiniName($memberData["display_name"] ?? $memberData["name"]) ?> is on a trip to <?= $metadata["fictive"] ? "Equestria" : "Celeste" ?>. <?= str_replace("%1", getMemberPronouns($memberData["pronouns"])["subjective"], str_replace("%2", getMemberPronouns($memberData["pronouns"])["third"] ? "is" : "are", "Therefore %1 %2 currently not in the ")) ?><?= $systemCommonName ?>.
diff --git a/includes/components/header.inc b/includes/components/header.inc
index 5ab13dc..9409917 100644
--- a/includes/components/header.inc
+++ b/includes/components/header.inc
@@ -1,13 +1,8 @@
<?php global $title; global $pages; global $readOnly;
$start = microtime(true);
-$useNewUI = !isset($_GET['old']);
-$use2023UI = !isset($_GET["no2023"]);
+$use2023UI = $useNewUI = true;
global $use2023UI;
-if (!isset($_COOKIE["new2023UIctaFirstVisit"])) {
- setcookie("new2023UIctaFirstVisit", time(), time() + 86400*365, "/", "", true, true);
-}
-
$isNormallyLoggedIn = false;
require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/util/session.inc"; global $isLoggedIn; global $isUserLoggedIn; global $isLowerLoggedIn;
@@ -19,23 +14,6 @@ if ($readOnly && $isLoggedIn || $readOnly && $isUserLoggedIn) {
$pages = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/pages.json"), true);
-if (!function_exists("error")) {
- function error($errno, $errstr, $file, $line) {
- echo('
- <!-- -->">
- <div class="alert alert-danger" style="text-align: left;">
- <b>Error ' . $errno . ':</b> ' . $errstr . ' [' . $file . ':' . $line . ']
- </div>');
- }
-}
-
-if (isset($_GET['errors'])) {
- ini_set('display_errors', '1');
- ini_set('display_startup_errors', '1');
- error_reporting(E_ALL);
- set_error_handler("error", E_ALL);
-}
-
global $_MemberName;
global $_MemberPage;
global $_SystemName;
@@ -49,11 +27,9 @@ $page = $pages[$toplevel] ?? [
require_once $_SERVER["DOCUMENT_ROOT"] . "/includes/util/travelling.inc"; global $travelling;
require_once $_SERVER["DOCUMENT_ROOT"] . "/includes/util/score.inc";
-require_once $_SERVER["DOCUMENT_ROOT"] . "/includes/util/pronouns.inc";
-require_once $_SERVER["DOCUMENT_ROOT"] . "/includes/util/bitset.inc";
+require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/util/functions.inc";
require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/util/banner.inc";
require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/util/rainbow.inc";
-require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/util/functions.inc";
?>
<!doctype html>
@@ -62,184 +38,19 @@ require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/util/functions.inc";
<script>
document.cookie = "new2023UIDarkMode=" + (window.matchMedia("(prefers-color-scheme: dark)").matches ? "yes" : "no") + "; max-age=" + (60*60*24*365) + "; path=/; samesite; secure";
</script>
- <link href="/assets/logo/custom<?= $use2023UI ? "-2023" : "" ?>.css" rel="preload" as="style">
- <link href="/assets/logo/light<?= $use2023UI ? "-2023" : "" ?>.css" rel="preload" as="style">
- <link href="/assets/logo/custom<?= $use2023UI ? "-2023" : "" ?>.css" rel="stylesheet">
+ <link href="/assets/logo/custom-2023.css" rel="preload" as="style">
+ <link href="/assets/logo/light-2023.css" rel="preload" as="style">
+ <link href="/assets/logo/custom-2023.css" rel="stylesheet">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js"></script>
- <title><?= $title && $title !== "-" ? $title . " · " : "" ?>Cold Haze</title>
- <link rel="shortcut icon" href="/assets/logo/<?php if ($use2023UI): ?>newlogo-ng<?php else: ?>newlogo<?= $isLoggedIn || $isLowerLoggedIn ? "3" : "" ?><?php endif; ?>.png" type="image/png">
- <link href="/assets/logo/light<?= $use2023UI ? "-2023" : "" ?>.css" rel="stylesheet">
+ <title><?= $title && $title !== "-" ? $title . " · " : "" ?>Ponycule</title>
+ <link rel="shortcut icon" href="/assets/logo/newlogo-ng.png" type="image/png">
+ <link href="/assets/logo/light-2023.css" rel="stylesheet">
</head>
-<body<?php if (!$use2023UI): ?> style="background-color: #000;"<?php else: ?> style="background-color: var(--palette-1);"<?php endif; ?>>
- <?php require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/components/navigation.inc"; global $navigation; ?>
-
- <?php if (!$useNewUI): ?>
- <div style="margin-top: 60px;" id="top-of-page"></div>
- <?php endif; ?>
-
- <?php if ($useNewUI && !$use2023UI): ?>
- <aside id="navigation-pane">
- <?php require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/components/pane.inc"; ?>
- </aside>
-
- <?php require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/components/mobilenav.inc"; ?>
-
- <style>
- body {
- margin-left: 300px;
- }
-
- .modal.show {
- left: 300px;
- width: calc(100% - 300px);
- }
-
- .modal {
- left: 150px;
- }
-
- nav {
- display: none !important;
- }
-
- #navigation-pane {
- z-index: 9999;
- background: black;
- position: fixed;
- top: 0;
- left: 0;
- bottom: 0;
- width: 300px;
- border-right: 1px solid rgba(255, 255, 255, .25);
- overflow: auto;
- }
-
- #title-bar {
- position: fixed;
- top: 0;
- left: 300px;
- right: 0;
- height: 34px;
- background: rgba(0, 0, 0, .75);
- z-index: 9999;
- padding: 5px;
- text-align: center;
- backdrop-filter: blur(10px);
- -webkit-backdrop-filter: blur(10px);
- border-bottom: 1px solid rgba(255, 255, 255, .25);
- }
-
- #mobile-navigation {
- display: none;
- position: fixed;
- bottom: 0;
- left: 0;
- right: 0;
- height: 48px;
- background: rgba(0, 0, 0, .75);
- backdrop-filter: blur(30px);
- -webkit-backdrop-filter: blur(30px);
- border-top: 1px solid rgba(255, 255, 255, .25);
- z-index: 999999;
- }
-
- @media (max-width: 1360px) {
- .modal.show {
- left: 250px !important;
- width: calc(100% - 250px) !important;
- }
-
- .modal {
- left: 125px !important;
- }
-
- #title-bar {
- left: 250px !important;
- }
-
- #navigation-pane {
- width: 250px !important;
- }
-
- body {
- margin-left: 250px !important;
- }
-
- #system-banner-container, #member-banner-container {
- width: 100% !important;
- }
- }
-
- @media (max-width: 1300px) {
- .modal.show {
- left: 200px !important;
- width: calc(100% - 200px) !important;
- }
-
- .modal {
- left: 100px !important;
- }
-
- #title-bar {
- left: 200px !important;
- }
-
- #navigation-pane {
- width: 200px !important;
- }
-
- body {
- margin-left: 200px !important;
- }
- }
-
- @media (max-width: 1195px) {
- .modal.show {
- left: 0 !important;
- width: 100% !important;
- }
-
- .modal {
- left: 0 !important;
- }
-
- #title-bar {
- left: 0 !important;
- }
-
- #navigation-pane {
- display: none !important;
- }
-
- body {
- margin-left: 0 !important;
- }
-
- #mobile-navigation {
- display: block !important;
- }
- }
-
- @media (max-width: 700px) {
- #title-bar-parts-mobile {
- display: inline !important;
- }
-
- #title-bar-parts-desktop {
- display: none;
- }
-
- #title-bar {
- text-align: left;
- }
- }
- </style>
- <?php endif; ?>
-
- <?php if ($use2023UI) {
+<body style="background-color: var(--palette-1);">
+ <?php
$palettes = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/themes.json"), true);
$selectedPalette = $palettes["default"];
@@ -658,119 +469,8 @@ require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/util/functions.inc";
}
}
</style>
- <?php }
- } ?>
-
- <?php if ($use2023UI): ?>
- <?php require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/components/2023ui.inc"; ?>
- <?php endif; ?>
-
-<?php if (isset($_GET["mini"]) || str_contains($_SERVER["HTTP_USER_AGENT"], "+ColdHazeDesktop")) {
- ?>
- <style>
- #navigation-pane, #title-bar, #footer, #titlebar-separator, #mobile-navigation, #global-search-container {
- display: none !important;
- }
-
- body {
- margin-left: 0 !important;
- }
- </style>
-<?php } if (str_contains($_SERVER["HTTP_USER_AGENT"], "+ColdHazeDesktop")) { ?>
-<style>
- body {
- background: #222 !important;
- }
-
- .container {
- margin-left: 10px;
- margin-right: 10px;
- max-width: calc(100vw - 20px);
- }
-
- h2 {
- display: none;
- }
-</style>
-<?php }
-
-if (
- (($isLoggedIn || $isLowerLoggedIn) && !$use2023UI && isset($_COOKIE["enable2023UIcta"]) && $_COOKIE["enable2023UIcta"] === "yes") ||
- (isset($_COOKIE["force2023UIcta"]) && $_COOKIE["force2023UIcta"] === "yes" && !$use2023UI) ||
- (($isLoggedIn || $isLowerLoggedIn) && isset($_PROFILE) && !$use2023UI)
-) { ?>
- <div class="modal fade" id="new-ui-cta">
- <div class="modal-dialog">
- <div class="modal-content">
- <div class="modal-body">
- <img src="/assets/logo/light.svg" style="width: 100%; margin-bottom: 20px;" class="cta-light">
- <img src="/assets/logo/dark.svg" style="width: 100%; margin-bottom: 20px;" class="cta-dark">
- <style>
- @media (prefers-color-scheme: light) {
- .cta-dark {
- display: none;
- }
- }
-
- @media (prefers-color-scheme: dark) {
- .cta-light {
- display: none;
- }
-
- #new-ui-cta .modal-header {
- border-bottom: 1px solid #353738;
- }
-
- #new-ui-cta .modal-content {
- border: 1px solid rgba(255, 255, 255, .2);
- background-color: #111;
- }
- }
- </style>
- <h3 style="text-align: center;">There is more to it</h3>
- <p style="text-align: center;">Cold Haze is getting a new shape. Help us improve it by testing it early before it is made publicly available.</p>
- <p style="text-align: center;">The new design is colorful, clean, modern, simple, fast, and gives you access to what you need the most.</p>
- <div style="text-align: center;"><a class="btn btn-primary" href="/api/2023ui">Try it now</a> <a data-bs-dismiss="modal" onclick="localStorage.setItem('dismissed2023cta', '')" class="btn btn-outline-secondary">Maybe later</a></div>
- <hr>
- <div class="small text-muted">Some features are not available in the new design. <a href="https://bugs.equestria.dev/articles/CH-A-1/New-design-FAQ" target="_blank">Learn more.</a></div>
- <!-- Equestria.dev makes no guarantee whatsoever that, after turning on this experimental feature, Cold Haze will continue working as intended. Access to emergency features might be unavailable while this option is turned on. Temporarily turning it off is possible using the "no2023" URL parameter. -->
- </div>
- </div>
- </div>
- </div>
-
- <script>
- if (localStorage.getItem("dismissed2023cta") === null) {
- let modal = new bootstrap.Modal(document.getElementById("new-ui-cta"));
- modal.show();
- }
- </script>
-<?php }
-
-if ($use2023UI && isset($_GET["ui2023intro"])) { ?>
- <div class="modal fade" id="new-ui-success">
- <div class="modal-dialog">
- <div class="modal-content">
- <div class="modal-body" style="text-align: center;">
- <img src="<?= icon("wave", false) ?>" class="light-only" style="height: 56px; margin: 10px 0;">
- <img src="<?= icon("wave", true) ?>" class="dark-only" style="height: 56px; margin: 10px 0;">
- <h3 style="text-align: center;">Welcome to a new experience</h3>
- <p style="text-align: center;">The new design is now activated and you can use it now.</p>
- <p style="text-align: center;">Please remember that it is currently experimental and you should report any issue you encounter.</p>
- <div style="text-align: center;"><a data-bs-dismiss="modal" onclick="localStorage.setItem('dismissed2023cta', '')" class="btn btn-outline-primary">Done</a></div>
- <hr>
- <div class="small text-muted">Some features are not available in the new design. <a href="">Learn more.</a></div>
- </div>
- </div>
- </div>
- </div>
-
- <script>
- let modal = new bootstrap.Modal(document.getElementById("new-ui-success"));
- modal.show();
- </script>
-<?php }
+ <?php } ?>
-require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/components/explicit.php";
-$GLOBALS["ColdHazePerformance"]["header"] = (microtime(true) - $start) * 1000; $start = microtime(true); ?>
+ <?php require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/components/2023ui.inc"; ?>
+<?php $GLOBALS["ColdHazePerformance"]["header"] = (microtime(true) - $start) * 1000; $start = microtime(true); ?>
<main id="app" style="background-color: var(--palette-0);"> \ No newline at end of file
diff --git a/includes/components/mobilenav.inc b/includes/components/mobilenav.inc
deleted file mode 100644
index e42e9ab..0000000
--- a/includes/components/mobilenav.inc
+++ /dev/null
@@ -1,89 +0,0 @@
-<?php global $use2023UI; global $navigation; global $isLoggedIn; global $isLowerLoggedIn; if (!$use2023UI): ?>
-<div id="mobile-navigation">
- <div id="mobile-navigation-container" class="container" style="display: grid; grid-template-columns: repeat(<?= count(array_values(array_filter($navigation, function ($item) use ($isLoggedIn) {
- return !$item["admin"] || $isLoggedIn;
- }))) + 1 ?>, 1fr); height: 100%;">
- <a title="Cold Haze" data-bs-toggle="tooltip" href="/" id="mobile-navigation-item--logo" class="tooltip-nohelp mobile-navigation-item">
- <img src="/assets/logo/newlogo.png" alt="" style="width:24px;vertical-align: middle;">
- </a>
- <?php foreach ($navigation as $id => $item): if (!$item["admin"] || $isLoggedIn): ?>
- <a onclick="toggleMobileNavigation('<?= $id ?>');" title="<?= $item["name"] ?>" data-bs-toggle="tooltip" id="mobile-navigation-item-<?= $id ?>" class="tooltip-nohelp mobile-navigation-item">
- <img src="<?= $item["icon"] ?>" <?php if ($item["invert"]): ?>class="dropdown-icon"<?php endif; ?> alt="" style="width:24px;vertical-align: middle;border-radius:3px;">
- </a>
- <?php endif; endforeach; ?>
- </div>
-</div>
-
-<div id="mobile-navigation-box-container" style="display: none; position: fixed; top: 0; left: 0; right: 0; bottom: 48px; background-color: rgba(0, 0, 0, .75); backdrop-filter: blur(30px); -webkit-backdrop-filter: blur(30px); z-index: 99999; overflow: auto;">
- <?php foreach ($navigation as $id => $item): if (!$item["admin"] || $isLoggedIn): ?>
- <div id="mobile-navigation-box-<?= $id ?>" style="display: none; margin-top: 10px; margin-bottom: 10px;" class="mobile-navigation-box container">
- <div class="pane-group-title">
- <img src="<?= $item["icon"] ?>" <?php if ($item["invert"]): ?>class="dropdown-icon"<?php endif; ?> alt="" style="width:24px;vertical-align: middle;">
- <span style="vertical-align: middle;"><?= $item["name"] ?></span>
- </div>
-
- <?php foreach ($item["items"] as $category): ?>
- <div class="pane-group-category <?= $category["minimal"] ? "pane-group-category-minimal" : "" ?>" <?= $category["minimal"] ? 'style="display: grid; grid-template-columns: repeat(' . ($isLowerLoggedIn ? 2 : 3) . ', 1fr); grid-gap: 10px;"' : "" ?>>
- <?php if (isset($category["name"])): ?>
- <div class="pane-group-category-title"><?= $category["name"] ?></div>
- <?php endif; ?>
- <?php foreach ($category["items"] as $link): if (isset($link)): if (!($isLowerLoggedIn && $link["private"])): ?>
- <a class="pane-group-item" href="<?= $link["link"] ?>">
- <img src="<?= $link["icon"] ?>" <?php if ($link["invert"]): ?>class="dropdown-icon"<?php endif; ?> alt="" style="width:24px; border-radius: 5px; vertical-align: middle;">
- <?php if (!$category["minimal"]): ?><span style="vertical-align: middle;<?= isset($link["stepped"]) ? "color: $link[stepped];" : "" ?>"><?= isset($link["stepped"]) ? "<b>$link[name]</b>" : $link["name"] ?></span><?php endif; ?>
- </a>
- <?php endif; endif; endforeach; ?>
- </div>
- <?php endforeach; ?>
- </div>
- <?php endif; endforeach; ?>
-</div>
-
-<style>
- .mobile-navigation-item {
- display: flex;
- cursor: pointer;
- align-items: center;
- justify-content: center;
- }
-
- .mobile-navigation-item:hover {
- background: rgba(255, 255, 255, .1);
- }
-
- .mobile-navigation-item:active, .mobile-navigation-item:focus, .mobile-navigation-item.open {
- background: rgba(255, 255, 255, .25);
- }
-</style>
-
-<script>
- function closeMobileNavigation() {
- document.getElementById("mobile-navigation-box-container").style.display = "none";
- document.body.style.overflow = "";
-
- Array.from(document.getElementsByClassName("mobile-navigation-item")).forEach((i) => {
- i.classList.remove("open");
- });
-
- Array.from(document.getElementsByClassName("mobile-navigation-box")).forEach((i) => {
- i.style.display = "none";
- });
- }
-
- function openMobileNavigation(id) {
- document.getElementById("mobile-navigation-item-" + id).classList.add("open");
- document.body.style.overflow = "hidden";
- document.getElementById("mobile-navigation-box-container").style.display = "block";
- document.getElementById("mobile-navigation-box-" + id).style.display = "block";
- }
-
- function toggleMobileNavigation(id) {
- if (document.getElementById("mobile-navigation-box-" + id).style.display !== "block") {
- closeMobileNavigation();
- openMobileNavigation(id);
- } else {
- closeMobileNavigation();
- }
- }
-</script>
-<?php endif; ?> \ No newline at end of file
diff --git a/includes/components/navigation.inc b/includes/components/navigation.inc
deleted file mode 100644
index 1d24dea..0000000
--- a/includes/components/navigation.inc
+++ /dev/null
@@ -1,448 +0,0 @@
-<?php
-
-global $use2023UI;
-$pages = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/pages.json"), true);
-
-global $navigation;
-global $toplevel;
-global $lang; global $pages; global $app; global $isLowerLoggedIn; global $isLoggedIn;
-
-if (!$use2023UI) {
-
- $cache = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/cache/navigation.json"), true);
-
- if (!isset($cache["raindrops"])) $cache["raindrops"] = [];
- if (!isset($cache["cloudburst"])) $cache["cloudburst"] = [];
- if (!isset($cache["other"])) $cache["other"] = [];
-
- foreach ([
- [
- "name" => "raindrops",
- "id" => "gdapd"
- ],
- [
- "name" => "cloudburst",
- "id" => "ynmuc"
- ],
- [
- "name" => "other",
- "id" => $app["other"]["id"]
- ]
- ] as $cacheSystem) {
- if (!isset($cache[$cacheSystem["name"]]["public"])) {
- $isLoggedInOldState = $isLoggedIn;
- $isLowerLoggedInOldState = $isLowerLoggedIn;
-
- $isLoggedIn = false;
- $isLowerLoggedIn = false;
-
- $cache[$cacheSystem["name"]]["public"] = array_map(function ($member) {
- return [
- "name" => $member['display_name'] ?? $member['name'],
- "icon" => getAsset($member["system"], $member["id"], "heads"),
- "invert" => false,
- "link" => "/$member[name]",
- "stepped" => null,
- "private" => false
- ];
- }, array_filter(scoreOrder(withTravelers(json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/$cacheSystem[id]/members.json"), true), "$cacheSystem[id]"), "$cacheSystem[id]"), function ($member) {
- return $member['name'] !== "unknown" && $member['name'] !== "fusion" && $member['name'] !== "new";
- }));
-
- $isLoggedIn = $isLoggedInOldState;
- $isLowerLoggedIn = $isLowerLoggedInOldState;
- }
-
- if (!isset($cache[$cacheSystem["name"]]["private"])) {
- $isLoggedInOldState = $isLoggedIn;
- $isLowerLoggedInOldState = $isLowerLoggedIn;
-
- $isLoggedIn = true;
- $isLowerLoggedIn = false;
-
- $cache[$cacheSystem["name"]]["private"] = array_map(function ($member) {
- return [
- "name" => $member['display_name'] ?? $member['name'],
- "icon" => getAsset($member["system"], $member["id"], "heads"),
- "invert" => false,
- "link" => "/$member[name]",
- "stepped" => null,
- "private" => false
- ];
- }, array_filter(scoreOrder(withTravelers(json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/$cacheSystem[id]/members.json"), true), "$cacheSystem[id]"), "$cacheSystem[id]"), function ($member) {
- return $member['name'] !== "unknown" && $member['name'] !== "fusion" && $member['name'] !== "new";
- }));
-
- $isLoggedIn = $isLoggedInOldState;
- $isLowerLoggedIn = $isLowerLoggedInOldState;
- }
- }
-
- file_put_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/cache/navigation.json", json_encode($cache));
-
- $navigation_admin = [
- "admin" => !$isLowerLoggedIn,
- "name" => "Private utilities",
- "icon" => "/assets/icons/admin.svg",
- "invert" => true,
- "items" => [
- "alerts" => [
- "name" => null,
- "minimal" => true,
- "items" => [
- [
- "name" => $pages["emergency"]["name"][$lang["_name"]],
- "icon" => "/assets/icons/emergency.svg",
- "invert" => false,
- "link" => "/-/emergency",
- "stepped" => null,
- "private" => false
- ],
- [
- "name" => $pages["wakeup"]["name"][$lang["_name"]],
- "icon" => "/assets/icons/wakeup.svg",
- "invert" => false,
- "link" => "/-/wakeup",
- "stepped" => null,
- "private" => true
- ],
- [
- "name" => $pages["pleasure"]["name"][$lang["_name"]],
- "icon" => "/assets/icons/pleasure.svg",
- "invert" => false,
- "link" => "/-/pleasure",
- "stepped" => null,
- "private" => false
- ]
- ]
- ],
- "apps" => [
- "name" => $lang["navigation"]["apps"],
- "minimal" => false,
- "items" => [
- time() >= 1686787200 ? null : [
- "name" => "Front planner<span class='badge bg-warning text-black rounded-pill' style='position:relative;top:-1px; margin-left: 5px;'>EOL</span>",
- "icon" => "/assets/icons/fronting.svg",
- "invert" => true,
- "link" => "/-/fronting",
- "stepped" => null,
- "private" => false
- ],
- [
- "name" => $pages["evening"]["name"][$lang["_name"]] . (time() >= 1686787200 ? "" : "<span class='badge bg-info text-black rounded-pill' style='position:relative;top:-1px; margin-left: 5px;'>Beta</span>"),
- "icon" => "/assets/icons/evening.svg",
- "invert" => true,
- "link" => "/-/evening",
- "stepped" => null,
- "private" => false
- ],
- [
- "name" => $pages["profiles"]["name"][$lang["_name"]],
- "icon" => "/assets/icons/profiles.svg",
- "invert" => true,
- "link" => "/-/profiles",
- "stepped" => null,
- "private" => false
- ],
- [
- "name" => $pages["money"]["name"][$lang["_name"]],
- "icon" => "/assets/icons/money.svg",
- "invert" => true,
- "link" => "/-/money",
- "stepped" => null,
- "private" => true
- ],
- [
- "name" => $pages["contacts"]["name"][$lang["_name"]],
- "icon" => "/assets/icons/contacts.svg",
- "invert" => true,
- "link" => "/-/contacts",
- "stepped" => null,
- "private" => true
- ],
- [
- "name" => $pages["schedules"]["name"][$lang["_name"]],
- "icon" => "/assets/icons/schedules.svg",
- "invert" => true,
- "link" => "/-/schedules",
- "stepped" => null,
- "private" => false
- ],
- [
- "name" => $pages["docs"]["name"][$lang["_name"]],
- "icon" => "/assets/icons/docs.svg",
- "invert" => true,
- "link" => "/-/docs",
- "stepped" => null,
- "private" => true
- ],
- time() >= 1688169600 ? null : [
- "name" => "Devices<span class='badge bg-warning text-black rounded-pill' style='position:relative;top:-1px; margin-left: 5px;'>EOL</span>",
- "icon" => "/assets/icons/computers.svg",
- "invert" => true,
- "link" => "/-/computers",
- "stepped" => null,
- "private" => true
- ],
- [
- "name" => $pages["travelling"]["name"][$lang["_name"]],
- "icon" => "/assets/icons/travelling.svg",
- "invert" => true,
- "link" => "/-/travelling",
- "stepped" => null,
- "private" => false
- ],
- [
- "name" => $pages["stats"]["name"][$lang["_name"]],
- "icon" => "/assets/icons/stats.svg",
- "invert" => true,
- "link" => "/-/stats",
- "stepped" => null,
- "private" => true
- ],
- [
- "name" => $pages["pair"]["name"][$lang["_name"]],
- "icon" => "/assets/icons/pair.svg",
- "invert" => true,
- "link" => "/-/pair",
- "stepped" => null,
- "private" => true
- ],
- [
- "name" => $pages["sessions"]["name"][$lang["_name"]],
- "icon" => "/assets/icons/sessions.svg",
- "invert" => true,
- "link" => "/-/sessions",
- "stepped" => null,
- "private" => true
- ],
- [
- "name" => $pages["logout"]["name"][$lang["_name"]],
- "icon" => "/assets/icons/logout.svg",
- "invert" => true,
- "link" => "/-/logout",
- "stepped" => null,
- "private" => false
- ]
- ]
- ],
- "sort" => [
- "name" => "Sorted members lists",
- "minimal" => false,
- "items" => [
- [
- "name" => $pages["splitting"]["name"][$lang["_name"]],
- "icon" => "/assets/icons/splitting.svg",
- "invert" => true,
- "link" => "/-/splitting",
- "stepped" => null,
- "private" => false
- ],
- [
- "name" => $pages["byfront"]["name"][$lang["_name"]],
- "icon" => "/assets/icons/byfront.svg",
- "invert" => true,
- "link" => "/-/byfront",
- "stepped" => null,
- "private" => false
- ],
- [
- "name" => $pages["alphabet"]["name"][$lang["_name"]],
- "icon" => "/assets/icons/alphabet.svg",
- "invert" => true,
- "link" => "/-/alphabet",
- "stepped" => null,
- "private" => false
- ],
- [
- "name" => $pages["s:species"]["name"][$lang["_name"]],
- "icon" => "/assets/icons/species.svg",
- "invert" => true,
- "link" => "/-/byspecies",
- "stepped" => null,
- "private" => false
- ],
- ]
- ]
- ]
- ];
- $navigation_global = [
- "admin" => false,
- "name" => $lang["navigation"]["general"],
- "icon" => "/assets/icons/global.svg",
- "invert" => true,
- "items" => [
- "main" => [
- "name" => null,
- "minimal" => false,
- "items" => [
- [
- "name" => $pages["home"]["name"][$lang["_name"]],
- "icon" => "/assets/icons/home.svg",
- "invert" => true,
- "link" => "/",
- "stepped" => null,
- "private" => false
- ],
- [
- "name" => $pages["relations"]["name"][$lang["_name"]],
- "icon" => "/assets/icons/relations.svg",
- "invert" => true,
- "link" => "/-/relations",
- "stepped" => null,
- "private" => false
- ],
- [
- "name" => $pages["terminology"]["name"][$lang["_name"]],
- "icon" => "/assets/icons/terminology.svg",
- "invert" => true,
- "link" => "/-/terminology",
- "stepped" => null,
- "private" => false
- ]
- ]
- ]
- ]
- ];
- $navigation_cloudburst = [
- "admin" => false,
- "name" => "Cloudburst System",
- "icon" => getAsset("ynmuc"),
- "invert" => false,
- "items" => [
- "header" => [
- "name" => null,
- "minimal" => false,
- "items" => [
- [
- "name" => $lang["navigation"]["about"],
- "icon" => "/assets/icons/about.svg",
- "invert" => true,
- "link" => "/cloudburst",
- "stepped" => null,
- "private" => false
- ],
- [
- "name" => $pages["s:history"]["name"][$lang["_name"]],
- "icon" => "/assets/icons/history.svg",
- "invert" => true,
- "link" => "/cloudburst/-/history",
- "stepped" => null,
- "private" => false
- ]
- ]
- ],
- "members" => [
- "name" => $lang["navigation"]["members"],
- "minimal" => false,
- "items" => $cache["cloudburst"][$isLoggedIn || $isLowerLoggedIn ? "private" : "public"]
- ]
- ]
- ];
- $navigation_other = [
- "admin" => !$isLowerLoggedIn,
- "name" => $app["other"]["name"],
- "icon" => getAsset($app["other"]["id"]),
- "invert" => false,
- "items" => [
- "header" => [
- "name" => null,
- "minimal" => false,
- "items" => [
- [
- "name" => $lang["navigation"]["about"],
- "icon" => "/assets/icons/about.svg",
- "invert" => true,
- "link" => "/" . $app["other"]["slug"],
- "stepped" => null,
- "private" => false
- ],
- [
- "name" => $pages["s:history"]["name"][$lang["_name"]],
- "icon" => "/assets/icons/history.svg",
- "invert" => true,
- "link" => "/" . $app["other"]["slug"] . "/-/history",
- "stepped" => null,
- "private" => false
- ]
- ]
- ],
- "members" => [
- "name" => $lang["navigation"]["members"],
- "minimal" => false,
- "items" => $cache["other"][$isLoggedIn || $isLowerLoggedIn ? "private" : "public"]
- ]
- ]
- ];
- $navigation_raindrops = [
- "admin" => false,
- "name" => "Raindrops System",
- "icon" => getAsset("gdapd"),
- "invert" => false,
- "items" => [
- "header" => [
- "name" => null,
- "minimal" => false,
- "items" => [
- [
- "name" => $lang["navigation"]["about"],
- "icon" => "/assets/icons/about.svg",
- "invert" => true,
- "link" => "/raindrops",
- "stepped" => null,
- "private" => false
- ],
- [
- "name" => $pages["s:history"]["name"][$lang["_name"]],
- "icon" => "/assets/icons/history.svg",
- "invert" => true,
- "link" => "/raindrops/-/history",
- "stepped" => null,
- "private" => false
- ]
- ]
- ],
- "members" => [
- "name" => $lang["navigation"]["members"],
- "minimal" => false,
- "items" => $cache["raindrops"][$isLoggedIn || $isLowerLoggedIn ? "private" : "public"]
- ]
- ]
- ];
-
- global $parts;
-
- if (isset($parts) && isset($parts[0]) && $parts[0] === $app["other"]["slug"]) {
- $navigation = [
- "other" => $navigation_other,
- "cloudburst" => $navigation_cloudburst,
- "raindrops" => $navigation_raindrops,
- "admin" => $navigation_admin,
- "global" => $navigation_global
- ];
- } elseif (isset($parts) && isset($parts[0]) && $parts[0] === "cloudburst") {
- $navigation = [
- "cloudburst" => $navigation_cloudburst,
- "raindrops" => $navigation_raindrops,
- "other" => $navigation_other,
- "admin" => $navigation_admin,
- "global" => $navigation_global
- ];
- } elseif (isset($parts) && isset($parts[0]) && $parts[0] === "raindrops") {
- $navigation = [
- "raindrops" => $navigation_raindrops,
- "cloudburst" => $navigation_cloudburst,
- "other" => $navigation_other,
- "admin" => $navigation_admin,
- "global" => $navigation_global
- ];
- } else {
- $navigation = [
- "admin" => $navigation_admin,
- "global" => $navigation_global,
- "cloudburst" => $navigation_cloudburst,
- "raindrops" => $navigation_raindrops,
- "other" => $navigation_other,
- ];
- }
-} \ No newline at end of file
diff --git a/includes/components/pane.inc b/includes/components/pane.inc
deleted file mode 100644
index a4b2d43..0000000
--- a/includes/components/pane.inc
+++ /dev/null
@@ -1,132 +0,0 @@
-<?php global $use2023UI; global $isLoggedIn; global $isLowerLoggedIn; global $pages; global $navigation; $byColor = getMembersByColor(); global $lang; global $pages; if (!$use2023UI): ?>
-
-<div id="pane-header-background" style="background-image: linear-gradient(90deg, <?php
-
-$index = 0;
-$list = array_map(function ($i) { return $i["color"]; }, $byColor);
-$length = count($list);
-
-foreach ($list as $color) {
- $perc = ($index / $length) * 100;
- echo("#${color}33 $perc%");
-
- $index++;
- if ($index < $length) echo(", ");
-}
-
-?>)">
- <a href="/" id="pane-header" class="login-link-clickable" style="color: white; text-decoration: none; padding: 20px; display: block; text-align: center; border-bottom: 1px solid rgba(255, 255, 255, .25); backdrop-filter: blur(20px);">
- <img src="/assets/logo/newlogo<?= $isLoggedIn || $isLowerLoggedIn ? "3" : "" ?>.png" alt="" style="width:32px;vertical-align: middle;margin-right:5px;">
- <span style="vertical-align: middle; font-weight: bold;">Cold Haze</span>
- </a>
-</div>
-
-<?php if ($isLoggedIn || $isLowerLoggedIn): ?>
- <a href="/-/logout" id="login-link" class="login-link-clickable">
- <img alt="" src="/assets/icons/logout.svg" style="filter:invert(1);width:24px;vertical-align: middle;">
- <span style="vertical-align: middle;"><?= $pages["logout"]["name"]["en"] ?></span>
- </a>
-<?php else: ?>
- <a href="/-/login" id="login-link" class="login-link-clickable">
- <?php global $_PROFILE; ?>
- <img alt="" src="/assets/icons/login.svg" style="filter:invert(1);width:24px;vertical-align: middle;">
- <span style="vertical-align: middle;"><?= $lang["navigation"]["login"] ?></span>
- </a>
-<?php endif; ?>
-
-<?php foreach ($navigation as $id => $item): if (!$item["admin"] || $isLoggedIn || $isLowerLoggedIn): ?>
-
-<div class="pane-group" id="pane-group-<?= $id ?>">
- <div class="pane-group-title">
- <img src="<?= $item["icon"] ?>" <?php if ($item["invert"]): ?>class="dropdown-icon"<?php endif; ?> alt="" style=" border-radius: 2px;width:24px;vertical-align: middle;">
- <span style="vertical-align: middle;"><?= $item["name"] ?></span>
- </div>
-
- <?php foreach ($item["items"] as $category): ?>
- <div class="pane-group-category <?= $category["minimal"] ? "pane-group-category-minimal" : "" ?>" <?= $category["minimal"] ? 'style="display: grid; grid-template-columns: repeat(' . ($isLowerLoggedIn ? 2 : 3) . ', 1fr); grid-gap: 10px;"' : "" ?>>
- <?php if (isset($category["name"])): ?>
- <div class="pane-group-category-title"><?= $category["name"] ?></div>
- <?php endif; ?>
- <?php foreach ($category["items"] as $link): if (isset($link)): if (!($isLowerLoggedIn && $link["private"])): ?>
- <a class="pane-group-item" href="<?= $link["link"] ?>">
- <img src="<?= $link["icon"] ?>" <?php if ($link["invert"]): ?>class="dropdown-icon"<?php endif; ?> alt="" style="width:24px; border-radius: 5px; vertical-align: middle;">
- <?php if (!$category["minimal"]): ?><span style="vertical-align: middle;<?= isset($link["stepped"]) ? "color: $link[stepped];" : "" ?>"><?= isset($link["stepped"]) ? "<b>$link[name]</b>" : $link["name"] ?></span><?php endif; ?>
- </a>
- <?php endif; endif; endforeach; ?>
- </div>
- <?php endforeach; ?>
-</div>
-
-<?php endif; endforeach; ?>
-
-<style>
-
- .pane-group-category-title {
- margin-bottom: 5px;
- font-size: .8em;
- opacity: .75;
- padding: 0 5px;
- }
-
- .pane-group-category-minimal .pane-group-item {
- text-align: center;
- }
-
- .pane-group-item {
- display: block;
- color: white !important;
- text-decoration: none;
- }
-
- .pane-group-category {
- background: rgba(255, 255, 255, .075);
- border: 1px solid rgba(255, 255, 255, .1);
- border-radius: 10px;
- padding: 10px;
- margin-top: 10px;
- margin-bottom: 10px;
- }
-
- .pane-group-item {
- padding: 5px;
- border-radius: 10px;
- text-overflow: ellipsis;
- white-space: nowrap;
- overflow: hidden;
- }
-
- .pane-group-item:hover {
- background-color: rgba(255, 255, 255, .1);
- }
-
- .pane-group-title {
- opacity: .75;
- padding: 0 15px;
- margin-top: 10px;
- }
-
- .pane-group {
- padding: 10px;
- border-bottom: 1px solid rgba(255, 255, 255, .25);
- }
-
- #login-link {
- text-align: center;
- padding: 10px;
- display: block;
- border-bottom: 1px solid rgba(255, 255, 255, .25);
- height: 47px;
- }
-
- .login-link-clickable {
- color: white !important;
- cursor: pointer !important;
- text-decoration: none !important;
- }
-
- .login-link-clickable:hover {
- background-color: rgba(255, 255, 255, .1);
- }
-
-</style>
-<?php endif; ?> \ No newline at end of file
diff --git a/includes/components/timeline.inc b/includes/components/timeline.inc
index bbda780..95b413b 100644
--- a/includes/components/timeline.inc
+++ b/includes/components/timeline.inc
@@ -29,7 +29,7 @@ function displayTimeline($systems) { global $app; $showIcons = count($systems) >
<?php foreach ($systems as $system): ?>
<tr style="height: <?= count($systems) === 1 ? 50 : 30 ?>px;">
<?php if ($showIcons): ?><td colspan="20">
- <a href="/<?= $system === "gdapd" ? "raindrops" : ($system === "ynmuc" ? "cloudburst" : ($system === "hrbom" ? "Moonglow" : $app["other"]["slug"])) ?>" style="width: 100%; height: 30px; display: flex; align-items: center; justify-content: center;">
+ <a href="/<?= $system === "gdapd" ? "raindrops" : ($system === "ynmuc" ? "cloudburst" : ($system === "hrbom" ? "moonglow" : $app["other"]["slug"])) ?>" style="width: 100%; height: 30px; display: flex; align-items: center; justify-content: center;">
<img alt="" style="border-radius: 5px; height: 24px; text-align: center;" src="<?= getAsset($system) ?>">
</a>
</td><?php endif; ?>
diff --git a/includes/external/pair/reference.js b/includes/external/pair/reference.js
index 16d1653..9b7b61e 100644
--- a/includes/external/pair/reference.js
+++ b/includes/external/pair/reference.js
@@ -21,7 +21,7 @@ ws.on('message', (raw) => {
// Note: future implementations can read 'data.version' to get the protocol version (as an integer)
ws.send(JSON.stringify({
type: "init",
- name: "Cold Haze pairing reference client" // Replace this with the name of your application
+ name: "Ponycule pairing reference client" // Replace this with the name of your application
// The 'name' value must be a string between 2 and 50 characters, additional requirements might get
// added in future protocol versions.
}));
diff --git a/includes/external/signal/node_modules/.bin/sdp-verify b/includes/external/signal/node_modules/.bin/sdp-verify
new file mode 100644
index 0000000..cf88a90
--- /dev/null
+++ b/includes/external/signal/node_modules/.bin/sdp-verify
@@ -0,0 +1,47 @@
+#!/usr/bin/env node
+
+var transform = require('./')
+ , file = require('path').join(process.cwd(), process.argv[2])
+ , sdp = require('fs').readFileSync(file).toString()
+ , parsed = transform.parse(sdp)
+ , written = transform.write(parsed)
+ , writtenLines = written.split('\r\n')
+ , origLines = sdp.split('\r\n')
+ , numMissing = 0
+ , numNew = 0
+ ;
+
+var parseFails = 0;
+parsed.media.forEach(function (media) {
+ (media.invalid || []).forEach(function (inv) {
+ console.warn('unrecognized a=' + inv.value + ' belonging to m=' + media.type);
+ parseFails += 1;
+ });
+});
+var parseStr = parseFails + ' unrecognized line(s) copied blindly';
+
+origLines.forEach(function (line, i) {
+ if (writtenLines.indexOf(line) < 0) {
+ console.error('l' + i + ' lost (' + line + ')');
+ numMissing += 1;
+ }
+});
+
+writtenLines.forEach(function (line, i) {
+ if (origLines.indexOf(line) < 0) {
+ console.error('l' + i + ' new (' + line + ')');
+ numNew += 1;
+ }
+});
+
+var failed = (numMissing > 0 || numNew > 0);
+if (failed) {
+ console.log('\n' + file + ' changes during transform:');
+ console.log(numMissing + ' missing line(s), ' + numNew + ' new line(s)%s',
+ parseFails > 0 ? ', ' + parseStr : ''
+ );
+}
+else {
+ console.log(file + ' verified%s', parseFails > 0 ? ', but had ' + parseStr : '');
+}
+process.exit(failed ? 1 : 0);
diff --git a/includes/external/signal/node_modules/.bin/uuid b/includes/external/signal/node_modules/.bin/uuid
new file mode 100644
index 0000000..f38d2ee
--- /dev/null
+++ b/includes/external/signal/node_modules/.bin/uuid
@@ -0,0 +1,2 @@
+#!/usr/bin/env node
+require('../uuid-bin');
diff --git a/includes/external/signal/node_modules/bs58/CHANGELOG.md b/includes/external/signal/node_modules/bs58/CHANGELOG.md
new file mode 100644
index 0000000..369f77f
--- /dev/null
+++ b/includes/external/signal/node_modules/bs58/CHANGELOG.md
@@ -0,0 +1,65 @@
+5.0.0 / 2022-02-17
+------------------
+- `decode` and `decodeUnsafe` now return a Uint8Array.
+
+4.0.0 / 2016-12-3
+------------------
+- `decode` now returns a `Buffer` again, to avoid potential cryptographic errors. [Daniel Cousens / #21](https://github.com/cryptocoinjs/bs58/pull/21)
+
+3.0.0 / 2015-08-18
+------------------
+- refactored module into generic [`base-x`](https://github.com/cryptocoinjs/base-x).
+
+2.0.1 / 2014-12-23
+------------------
+- performance boost in `encode()` [#10](https://github.com/cryptocoinjs/bs58/pull/10)
+
+2.0.0 / 2014-10-03
+------------------
+- `decode` now returns an `Array` instead of `Buffer` to keep things simple. [Daniel Cousens / #9](https://github.com/cryptocoinjs/bs58/pull/9)
+
+1.2.1 / 2014-07-24
+------------------
+* speed optimizations [Daniel Cousens / #8](https://github.com/cryptocoinjs/bs58/pull/8)
+
+1.2.0 / 2014-06-29
+------------------
+* removed `bigi` dep, implemented direct byte conversion [Jared Deckard / #6](https://github.com/cryptocoinjs/bs58/pull/6)
+
+1.1.0 / 2014-06-26
+------------------
+* user `Buffer` internally for calculations, providing cleaner code and a performance increase. [Daniel Cousens](https://github.com/cryptocoinjs/bs58/commit/129c71de8bc1e36f113bce06da0616066f41c5ca)
+
+1.0.0 / 2014-05-27
+------------------
+* removed `binstring` dep, `Buffer` now only input to `encode()` and output of `decode()`
+* update `bigi` from `~0.3.0` to `^1.1.0`
+* added travis-ci support
+* added coveralls support
+* modified tests and library to handle fixture style testing (thanks to bitcoinjs-lib devs and [Daniel Cousens](https://github.com/dcousens))
+
+
+0.3.0 / 2014-02-24
+------------------
+* duck type input to `encode` and change output of `decode` to `Buffer`.
+
+
+0.2.1 / 2014-02-24
+------------------
+* removed bower and component support. Closes #1
+* convert from 4 spaces to 2
+
+
+0.2.0 / 2013-12-07
+------------------
+* renamed from `cryptocoin-base58` to `bs58`
+
+
+0.1.0 / 2013-11-20
+------------------
+* removed AMD support
+
+
+0.0.1 / 2013-11-04
+------------------
+* initial release
diff --git a/includes/external/signal/node_modules/bs58/LICENSE b/includes/external/signal/node_modules/bs58/LICENSE
new file mode 100644
index 0000000..4d5f7a1
--- /dev/null
+++ b/includes/external/signal/node_modules/bs58/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2018 cryptocoinjs
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/includes/external/signal/node_modules/bs58/README.md b/includes/external/signal/node_modules/bs58/README.md
new file mode 100644
index 0000000..ca0aa19
--- /dev/null
+++ b/includes/external/signal/node_modules/bs58/README.md
@@ -0,0 +1,91 @@
+bs58
+====
+
+[![build status](https://travis-ci.org/cryptocoinjs/bs58.svg)](https://travis-ci.org/cryptocoinjs/bs58)
+
+JavaScript component to compute base 58 encoding. This encoding is typically used for crypto currencies such as Bitcoin.
+
+**Note:** If you're looking for **base 58 check** encoding, see: [https://github.com/bitcoinjs/bs58check](https://github.com/bitcoinjs/bs58check), which depends upon this library.
+
+
+Install
+-------
+
+ npm i --save bs58
+
+
+API
+---
+
+### encode(input)
+
+`input` must be a `Uint8Array`, `Buffer`, or an `Array`. It returns a `string`.
+
+**example**:
+
+```js
+const bs58 = require('bs58')
+
+const bytes = Uint8Array.from([
+ 0, 60, 23, 110, 101, 155, 234,
+ 15, 41, 163, 233, 191, 120, 128,
+ 193, 18, 177, 179, 27, 77, 200,
+ 38, 38, 129, 135
+])
+const address = bs58.encode(bytes)
+console.log(address)
+// => 16UjcYNBG9GTK4uq2f7yYEbuifqCzoLMGS
+```
+
+
+### decode(input)
+
+`input` must be a base 58 encoded string. Returns a Uint8Array.
+
+**example**:
+
+```js
+const bs58 = require('bs58')
+
+const address = '16UjcYNBG9GTK4uq2f7yYEbuifqCzoLMGS'
+const bytes = bs58.decode(address)
+// See uint8array-tools package for helpful hex encoding/decoding/compare tools
+console.log(Buffer.from(bytes).toString('hex'))
+// => 003c176e659bea0f29a3e9bf7880c112b1b31b4dc826268187
+```
+
+Browser
+-----------
+You can use this module in the browser. Install Browserify:
+
+```bash
+npm install -g browserify
+```
+
+then run:
+
+```bash
+browserify node_modules/bs58/index.js -o bs58.bundle.js --standalone bs58
+```
+
+Hack / Test
+-----------
+
+Uses JavaScript standard style. Read more:
+
+[![js-standard-style](https://cdn.rawgit.com/feross/standard/master/badge.svg)](https://github.com/feross/standard)
+
+
+Credits
+-------
+- [Mike Hearn](https://github.com/mikehearn) for original Java implementation
+- [Stefan Thomas](https://github.com/justmoon) for porting to JavaScript
+- [Stephan Pair](https://github.com/gasteve) for buffer improvements
+- [Daniel Cousens](https://github.com/dcousens) for cleanup and merging improvements from bitcoinjs-lib
+- [Jared Deckard](https://github.com/deckar01) for killing `bigi` as a dependency
+
+
+License
+-------
+
+MIT
diff --git a/includes/external/signal/node_modules/bs58/index.d.ts b/includes/external/signal/node_modules/bs58/index.d.ts
new file mode 100644
index 0000000..72d0ab8
--- /dev/null
+++ b/includes/external/signal/node_modules/bs58/index.d.ts
@@ -0,0 +1,5 @@
+import { BaseConverter } from 'base-x';
+
+declare const base58: BaseConverter;
+
+export = base58;
diff --git a/includes/external/signal/node_modules/bs58/index.js b/includes/external/signal/node_modules/bs58/index.js
new file mode 100644
index 0000000..3d02b0c
--- /dev/null
+++ b/includes/external/signal/node_modules/bs58/index.js
@@ -0,0 +1,4 @@
+const basex = require('base-x')
+const ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
+
+module.exports = basex(ALPHABET)
diff --git a/includes/external/signal/node_modules/bs58/package.json b/includes/external/signal/node_modules/bs58/package.json
new file mode 100644
index 0000000..6e53086
--- /dev/null
+++ b/includes/external/signal/node_modules/bs58/package.json
@@ -0,0 +1,39 @@
+{
+ "name": "bs58",
+ "version": "5.0.0",
+ "description": "Base 58 encoding / decoding",
+ "keywords": [
+ "base58",
+ "bitcoin",
+ "crypto",
+ "crytography",
+ "decode",
+ "decoding",
+ "encode",
+ "encoding",
+ "litecoin"
+ ],
+ "license": "MIT",
+ "devDependencies": {
+ "standard": "^16.0.4",
+ "tape": "^4.6.3"
+ },
+ "repository": {
+ "url": "https://github.com/cryptocoinjs/bs58",
+ "type": "git"
+ },
+ "files": [
+ "index.js",
+ "index.d.ts"
+ ],
+ "main": "index.js",
+ "types": "index.d.ts",
+ "scripts": {
+ "standard": "standard",
+ "test": "npm run standard && npm run unit",
+ "unit": "tape test/index.js"
+ },
+ "dependencies": {
+ "base-x": "^4.0.0"
+ }
+}
diff --git a/includes/external/signal/node_modules/uuid/CHANGELOG.md b/includes/external/signal/node_modules/uuid/CHANGELOG.md
new file mode 100644
index 0000000..d4d3972
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/CHANGELOG.md
@@ -0,0 +1,268 @@
+# Changelog
+
+All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
+
+## [9.0.0](https://github.com/uuidjs/uuid/compare/v8.3.2...v9.0.0) (2022-09-05)
+
+### ⚠ BREAKING CHANGES
+
+- Drop Node.js 10.x support. This library always aims at supporting one EOLed LTS release which by this time now is 12.x which has reached EOL 30 Apr 2022.
+
+- Remove the minified UMD build from the package.
+
+ Minified code is hard to audit and since this is a widely used library it seems more appropriate nowadays to optimize for auditability than to ship a legacy module format that, at best, serves educational purposes nowadays.
+
+ For production browser use cases, users should be using a bundler. For educational purposes, today's online sandboxes like replit.com offer convenient ways to load npm modules, so the use case for UMD through repos like UNPKG or jsDelivr has largely vanished.
+
+- Drop IE 11 and Safari 10 support. Drop support for browsers that don't correctly implement const/let and default arguments, and no longer transpile the browser build to ES2015.
+
+ This also removes the fallback on msCrypto instead of the crypto API.
+
+ Browser tests are run in the first supported version of each supported browser and in the latest (as of this commit) version available on Browserstack.
+
+### Features
+
+- optimize uuid.v1 by 1.3x uuid.v4 by 4.3x (430%) ([#597](https://github.com/uuidjs/uuid/issues/597)) ([3a033f6](https://github.com/uuidjs/uuid/commit/3a033f6bab6bb3780ece6d645b902548043280bc))
+- remove UMD build ([#645](https://github.com/uuidjs/uuid/issues/645)) ([e948a0f](https://github.com/uuidjs/uuid/commit/e948a0f22bf22f4619b27bd913885e478e20fe6f)), closes [#620](https://github.com/uuidjs/uuid/issues/620)
+- use native crypto.randomUUID when available ([#600](https://github.com/uuidjs/uuid/issues/600)) ([c9e076c](https://github.com/uuidjs/uuid/commit/c9e076c852edad7e9a06baaa1d148cf4eda6c6c4))
+
+### Bug Fixes
+
+- add Jest/jsdom compatibility ([#642](https://github.com/uuidjs/uuid/issues/642)) ([16f9c46](https://github.com/uuidjs/uuid/commit/16f9c469edf46f0786164cdf4dc980743984a6fd))
+- change default export to named function ([#545](https://github.com/uuidjs/uuid/issues/545)) ([c57bc5a](https://github.com/uuidjs/uuid/commit/c57bc5a9a0653273aa639cda9177ce52efabe42a))
+- handle error when parameter is not set in v3 and v5 ([#622](https://github.com/uuidjs/uuid/issues/622)) ([fcd7388](https://github.com/uuidjs/uuid/commit/fcd73881692d9fabb63872576ba28e30ff852091))
+- run npm audit fix ([#644](https://github.com/uuidjs/uuid/issues/644)) ([04686f5](https://github.com/uuidjs/uuid/commit/04686f54c5fed2cfffc1b619f4970c4bb8532353))
+- upgrading from uuid3 broken link ([#568](https://github.com/uuidjs/uuid/issues/568)) ([1c849da](https://github.com/uuidjs/uuid/commit/1c849da6e164259e72e18636726345b13a7eddd6))
+
+### build
+
+- drop Node.js 8.x from babel transpile target ([#603](https://github.com/uuidjs/uuid/issues/603)) ([aa11485](https://github.com/uuidjs/uuid/commit/aa114858260402107ec8a1e1a825dea0a259bcb5))
+- drop support for legacy browsers (IE11, Safari 10) ([#604](https://github.com/uuidjs/uuid/issues/604)) ([0f433e5](https://github.com/uuidjs/uuid/commit/0f433e5ec444edacd53016de67db021102f36148))
+
+- drop node 10.x to upgrade dev dependencies ([#653](https://github.com/uuidjs/uuid/issues/653)) ([28a5712](https://github.com/uuidjs/uuid/commit/28a571283f8abda6b9d85e689f95b7d3ee9e282e)), closes [#643](https://github.com/uuidjs/uuid/issues/643)
+
+### [8.3.2](https://github.com/uuidjs/uuid/compare/v8.3.1...v8.3.2) (2020-12-08)
+
+### Bug Fixes
+
+- lazy load getRandomValues ([#537](https://github.com/uuidjs/uuid/issues/537)) ([16c8f6d](https://github.com/uuidjs/uuid/commit/16c8f6df2f6b09b4d6235602d6a591188320a82e)), closes [#536](https://github.com/uuidjs/uuid/issues/536)
+
+### [8.3.1](https://github.com/uuidjs/uuid/compare/v8.3.0...v8.3.1) (2020-10-04)
+
+### Bug Fixes
+
+- support expo>=39.0.0 ([#515](https://github.com/uuidjs/uuid/issues/515)) ([c65a0f3](https://github.com/uuidjs/uuid/commit/c65a0f3fa73b901959d638d1e3591dfacdbed867)), closes [#375](https://github.com/uuidjs/uuid/issues/375)
+
+## [8.3.0](https://github.com/uuidjs/uuid/compare/v8.2.0...v8.3.0) (2020-07-27)
+
+### Features
+
+- add parse/stringify/validate/version/NIL APIs ([#479](https://github.com/uuidjs/uuid/issues/479)) ([0e6c10b](https://github.com/uuidjs/uuid/commit/0e6c10ba1bf9517796ff23c052fc0468eedfd5f4)), closes [#475](https://github.com/uuidjs/uuid/issues/475) [#478](https://github.com/uuidjs/uuid/issues/478) [#480](https://github.com/uuidjs/uuid/issues/480) [#481](https://github.com/uuidjs/uuid/issues/481) [#180](https://github.com/uuidjs/uuid/issues/180)
+
+## [8.2.0](https://github.com/uuidjs/uuid/compare/v8.1.0...v8.2.0) (2020-06-23)
+
+### Features
+
+- improve performance of v1 string representation ([#453](https://github.com/uuidjs/uuid/issues/453)) ([0ee0b67](https://github.com/uuidjs/uuid/commit/0ee0b67c37846529c66089880414d29f3ae132d5))
+- remove deprecated v4 string parameter ([#454](https://github.com/uuidjs/uuid/issues/454)) ([88ce3ca](https://github.com/uuidjs/uuid/commit/88ce3ca0ba046f60856de62c7ce03f7ba98ba46c)), closes [#437](https://github.com/uuidjs/uuid/issues/437)
+- support jspm ([#473](https://github.com/uuidjs/uuid/issues/473)) ([e9f2587](https://github.com/uuidjs/uuid/commit/e9f2587a92575cac31bc1d4ae944e17c09756659))
+
+### Bug Fixes
+
+- prepare package exports for webpack 5 ([#468](https://github.com/uuidjs/uuid/issues/468)) ([8d6e6a5](https://github.com/uuidjs/uuid/commit/8d6e6a5f8965ca9575eb4d92e99a43435f4a58a8))
+
+## [8.1.0](https://github.com/uuidjs/uuid/compare/v8.0.0...v8.1.0) (2020-05-20)
+
+### Features
+
+- improve v4 performance by reusing random number array ([#435](https://github.com/uuidjs/uuid/issues/435)) ([bf4af0d](https://github.com/uuidjs/uuid/commit/bf4af0d711b4d2ed03d1f74fd12ad0baa87dc79d))
+- optimize V8 performance of bytesToUuid ([#434](https://github.com/uuidjs/uuid/issues/434)) ([e156415](https://github.com/uuidjs/uuid/commit/e156415448ec1af2351fa0b6660cfb22581971f2))
+
+### Bug Fixes
+
+- export package.json required by react-native and bundlers ([#449](https://github.com/uuidjs/uuid/issues/449)) ([be1c8fe](https://github.com/uuidjs/uuid/commit/be1c8fe9a3206c358e0059b52fafd7213aa48a52)), closes [ai/nanoevents#44](https://github.com/ai/nanoevents/issues/44#issuecomment-602010343) [#444](https://github.com/uuidjs/uuid/issues/444)
+
+## [8.0.0](https://github.com/uuidjs/uuid/compare/v7.0.3...v8.0.0) (2020-04-29)
+
+### ⚠ BREAKING CHANGES
+
+- For native ECMAScript Module (ESM) usage in Node.js only named exports are exposed, there is no more default export.
+
+ ```diff
+ -import uuid from 'uuid';
+ -console.log(uuid.v4()); // -> 'cd6c3b08-0adc-4f4b-a6ef-36087a1c9869'
+ +import { v4 as uuidv4 } from 'uuid';
+ +uuidv4(); // ⇨ '9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d'
+ ```
+
+- Deep requiring specific algorithms of this library like `require('uuid/v4')`, which has been deprecated in `uuid@7`, is no longer supported.
+
+ Instead use the named exports that this module exports.
+
+ For ECMAScript Modules (ESM):
+
+ ```diff
+ -import uuidv4 from 'uuid/v4';
+ +import { v4 as uuidv4 } from 'uuid';
+ uuidv4();
+ ```
+
+ For CommonJS:
+
+ ```diff
+ -const uuidv4 = require('uuid/v4');
+ +const { v4: uuidv4 } = require('uuid');
+ uuidv4();
+ ```
+
+### Features
+
+- native Node.js ES Modules (wrapper approach) ([#423](https://github.com/uuidjs/uuid/issues/423)) ([2d9f590](https://github.com/uuidjs/uuid/commit/2d9f590ad9701d692625c07ed62f0a0f91227991)), closes [#245](https://github.com/uuidjs/uuid/issues/245) [#419](https://github.com/uuidjs/uuid/issues/419) [#342](https://github.com/uuidjs/uuid/issues/342)
+- remove deep requires ([#426](https://github.com/uuidjs/uuid/issues/426)) ([daf72b8](https://github.com/uuidjs/uuid/commit/daf72b84ceb20272a81bb5fbddb05dd95922cbba))
+
+### Bug Fixes
+
+- add CommonJS syntax example to README quickstart section ([#417](https://github.com/uuidjs/uuid/issues/417)) ([e0ec840](https://github.com/uuidjs/uuid/commit/e0ec8402c7ad44b7ef0453036c612f5db513fda0))
+
+### [7.0.3](https://github.com/uuidjs/uuid/compare/v7.0.2...v7.0.3) (2020-03-31)
+
+### Bug Fixes
+
+- make deep require deprecation warning work in browsers ([#409](https://github.com/uuidjs/uuid/issues/409)) ([4b71107](https://github.com/uuidjs/uuid/commit/4b71107d8c0d2ef56861ede6403fc9dc35a1e6bf)), closes [#408](https://github.com/uuidjs/uuid/issues/408)
+
+### [7.0.2](https://github.com/uuidjs/uuid/compare/v7.0.1...v7.0.2) (2020-03-04)
+
+### Bug Fixes
+
+- make access to msCrypto consistent ([#393](https://github.com/uuidjs/uuid/issues/393)) ([8bf2a20](https://github.com/uuidjs/uuid/commit/8bf2a20f3565df743da7215eebdbada9d2df118c))
+- simplify link in deprecation warning ([#391](https://github.com/uuidjs/uuid/issues/391)) ([bb2c8e4](https://github.com/uuidjs/uuid/commit/bb2c8e4e9f4c5f9c1eaaf3ea59710c633cd90cb7))
+- update links to match content in readme ([#386](https://github.com/uuidjs/uuid/issues/386)) ([44f2f86](https://github.com/uuidjs/uuid/commit/44f2f86e9d2bbf14ee5f0f00f72a3db1292666d4))
+
+### [7.0.1](https://github.com/uuidjs/uuid/compare/v7.0.0...v7.0.1) (2020-02-25)
+
+### Bug Fixes
+
+- clean up esm builds for node and browser ([#383](https://github.com/uuidjs/uuid/issues/383)) ([59e6a49](https://github.com/uuidjs/uuid/commit/59e6a49e7ce7b3e8fb0f3ee52b9daae72af467dc))
+- provide browser versions independent from module system ([#380](https://github.com/uuidjs/uuid/issues/380)) ([4344a22](https://github.com/uuidjs/uuid/commit/4344a22e7aed33be8627eeaaf05360f256a21753)), closes [#378](https://github.com/uuidjs/uuid/issues/378)
+
+## [7.0.0](https://github.com/uuidjs/uuid/compare/v3.4.0...v7.0.0) (2020-02-24)
+
+### ⚠ BREAKING CHANGES
+
+- The default export, which used to be the v4() method but which was already discouraged in v3.x of this library, has been removed.
+- Explicitly note that deep imports of the different uuid version functions are deprecated and no longer encouraged and that ECMAScript module named imports should be used instead. Emit a deprecation warning for people who deep-require the different algorithm variants.
+- Remove builtin support for insecure random number generators in the browser. Users who want that will have to supply their own random number generator function.
+- Remove support for generating v3 and v5 UUIDs in Node.js<4.x
+- Convert code base to ECMAScript Modules (ESM) and release CommonJS build for node and ESM build for browser bundlers.
+
+### Features
+
+- add UMD build to npm package ([#357](https://github.com/uuidjs/uuid/issues/357)) ([4e75adf](https://github.com/uuidjs/uuid/commit/4e75adf435196f28e3fbbe0185d654b5ded7ca2c)), closes [#345](https://github.com/uuidjs/uuid/issues/345)
+- add various es module and CommonJS examples ([b238510](https://github.com/uuidjs/uuid/commit/b238510bf352463521f74bab175a3af9b7a42555))
+- ensure that docs are up-to-date in CI ([ee5e77d](https://github.com/uuidjs/uuid/commit/ee5e77db547474f5a8f23d6c857a6d399209986b))
+- hybrid CommonJS & ECMAScript modules build ([a3f078f](https://github.com/uuidjs/uuid/commit/a3f078faa0baff69ab41aed08e041f8f9c8993d0))
+- remove insecure fallback random number generator ([3a5842b](https://github.com/uuidjs/uuid/commit/3a5842b141a6e5de0ae338f391661e6b84b167c9)), closes [#173](https://github.com/uuidjs/uuid/issues/173)
+- remove support for pre Node.js v4 Buffer API ([#356](https://github.com/uuidjs/uuid/issues/356)) ([b59b5c5](https://github.com/uuidjs/uuid/commit/b59b5c5ecad271c5453f1a156f011671f6d35627))
+- rename repository to github:uuidjs/uuid ([#351](https://github.com/uuidjs/uuid/issues/351)) ([c37a518](https://github.com/uuidjs/uuid/commit/c37a518e367ac4b6d0aa62dba1bc6ce9e85020f7)), closes [#338](https://github.com/uuidjs/uuid/issues/338)
+
+### Bug Fixes
+
+- add deep-require proxies for local testing and adjust tests ([#365](https://github.com/uuidjs/uuid/issues/365)) ([7fedc79](https://github.com/uuidjs/uuid/commit/7fedc79ac8fda4bfd1c566c7f05ef4ac13b2db48))
+- add note about removal of default export ([#372](https://github.com/uuidjs/uuid/issues/372)) ([12749b7](https://github.com/uuidjs/uuid/commit/12749b700eb49db8a9759fd306d8be05dbfbd58c)), closes [#370](https://github.com/uuidjs/uuid/issues/370)
+- deprecated deep requiring of the different algorithm versions ([#361](https://github.com/uuidjs/uuid/issues/361)) ([c0bdf15](https://github.com/uuidjs/uuid/commit/c0bdf15e417639b1aeb0b247b2fb11f7a0a26b23))
+
+## [3.4.0](https://github.com/uuidjs/uuid/compare/v3.3.3...v3.4.0) (2020-01-16)
+
+### Features
+
+- rename repository to github:uuidjs/uuid ([#351](https://github.com/uuidjs/uuid/issues/351)) ([e2d7314](https://github.com/uuidjs/uuid/commit/e2d7314)), closes [#338](https://github.com/uuidjs/uuid/issues/338)
+
+## [3.3.3](https://github.com/uuidjs/uuid/compare/v3.3.2...v3.3.3) (2019-08-19)
+
+### Bug Fixes
+
+- no longer run ci tests on node v4
+- upgrade dependencies
+
+## [3.3.2](https://github.com/uuidjs/uuid/compare/v3.3.1...v3.3.2) (2018-06-28)
+
+### Bug Fixes
+
+- typo ([305d877](https://github.com/uuidjs/uuid/commit/305d877))
+
+## [3.3.1](https://github.com/uuidjs/uuid/compare/v3.3.0...v3.3.1) (2018-06-28)
+
+### Bug Fixes
+
+- fix [#284](https://github.com/uuidjs/uuid/issues/284) by setting function name in try-catch ([f2a60f2](https://github.com/uuidjs/uuid/commit/f2a60f2))
+
+# [3.3.0](https://github.com/uuidjs/uuid/compare/v3.2.1...v3.3.0) (2018-06-22)
+
+### Bug Fixes
+
+- assignment to readonly property to allow running in strict mode ([#270](https://github.com/uuidjs/uuid/issues/270)) ([d062fdc](https://github.com/uuidjs/uuid/commit/d062fdc))
+- fix [#229](https://github.com/uuidjs/uuid/issues/229) ([c9684d4](https://github.com/uuidjs/uuid/commit/c9684d4))
+- Get correct version of IE11 crypto ([#274](https://github.com/uuidjs/uuid/issues/274)) ([153d331](https://github.com/uuidjs/uuid/commit/153d331))
+- mem issue when generating uuid ([#267](https://github.com/uuidjs/uuid/issues/267)) ([c47702c](https://github.com/uuidjs/uuid/commit/c47702c))
+
+### Features
+
+- enforce Conventional Commit style commit messages ([#282](https://github.com/uuidjs/uuid/issues/282)) ([cc9a182](https://github.com/uuidjs/uuid/commit/cc9a182))
+
+## [3.2.1](https://github.com/uuidjs/uuid/compare/v3.2.0...v3.2.1) (2018-01-16)
+
+### Bug Fixes
+
+- use msCrypto if available. Fixes [#241](https://github.com/uuidjs/uuid/issues/241) ([#247](https://github.com/uuidjs/uuid/issues/247)) ([1fef18b](https://github.com/uuidjs/uuid/commit/1fef18b))
+
+# [3.2.0](https://github.com/uuidjs/uuid/compare/v3.1.0...v3.2.0) (2018-01-16)
+
+### Bug Fixes
+
+- remove mistakenly added typescript dependency, rollback version (standard-version will auto-increment) ([09fa824](https://github.com/uuidjs/uuid/commit/09fa824))
+- use msCrypto if available. Fixes [#241](https://github.com/uuidjs/uuid/issues/241) ([#247](https://github.com/uuidjs/uuid/issues/247)) ([1fef18b](https://github.com/uuidjs/uuid/commit/1fef18b))
+
+### Features
+
+- Add v3 Support ([#217](https://github.com/uuidjs/uuid/issues/217)) ([d94f726](https://github.com/uuidjs/uuid/commit/d94f726))
+
+# [3.1.0](https://github.com/uuidjs/uuid/compare/v3.1.0...v3.0.1) (2017-06-17)
+
+### Bug Fixes
+
+- (fix) Add .npmignore file to exclude test/ and other non-essential files from packing. (#183)
+- Fix typo (#178)
+- Simple typo fix (#165)
+
+### Features
+
+- v5 support in CLI (#197)
+- V5 support (#188)
+
+# 3.0.1 (2016-11-28)
+
+- split uuid versions into separate files
+
+# 3.0.0 (2016-11-17)
+
+- remove .parse and .unparse
+
+# 2.0.0
+
+- Removed uuid.BufferClass
+
+# 1.4.0
+
+- Improved module context detection
+- Removed public RNG functions
+
+# 1.3.2
+
+- Improve tests and handling of v1() options (Issue #24)
+- Expose RNG option to allow for perf testing with different generators
+
+# 1.3.0
+
+- Support for version 1 ids, thanks to [@ctavan](https://github.com/ctavan)!
+- Support for node.js crypto API
+- De-emphasizing performance in favor of a) cryptographic quality PRNGs where available and b) more manageable code
diff --git a/includes/external/signal/node_modules/uuid/CONTRIBUTING.md b/includes/external/signal/node_modules/uuid/CONTRIBUTING.md
new file mode 100644
index 0000000..4a4503d
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/CONTRIBUTING.md
@@ -0,0 +1,18 @@
+# Contributing
+
+Please feel free to file GitHub Issues or propose Pull Requests. We're always happy to discuss improvements to this library!
+
+## Testing
+
+```shell
+npm test
+```
+
+## Releasing
+
+Releases are supposed to be done from master, version bumping is automated through [`standard-version`](https://github.com/conventional-changelog/standard-version):
+
+```shell
+npm run release -- --dry-run # verify output manually
+npm run release # follow the instructions from the output of this command
+```
diff --git a/includes/external/signal/node_modules/uuid/LICENSE.md b/includes/external/signal/node_modules/uuid/LICENSE.md
new file mode 100644
index 0000000..3934168
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/LICENSE.md
@@ -0,0 +1,9 @@
+The MIT License (MIT)
+
+Copyright (c) 2010-2020 Robert Kieffer and other contributors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/includes/external/signal/node_modules/uuid/README.md b/includes/external/signal/node_modules/uuid/README.md
new file mode 100644
index 0000000..c1fb9ac
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/README.md
@@ -0,0 +1,462 @@
+<!--
+ -- This file is auto-generated from README_js.md. Changes should be made there.
+ -->
+
+# uuid [![CI](https://github.com/uuidjs/uuid/workflows/CI/badge.svg)](https://github.com/uuidjs/uuid/actions?query=workflow%3ACI) [![Browser](https://github.com/uuidjs/uuid/workflows/Browser/badge.svg)](https://github.com/uuidjs/uuid/actions?query=workflow%3ABrowser)
+
+For the creation of [RFC4122](https://www.ietf.org/rfc/rfc4122.txt) UUIDs
+
+- **Complete** - Support for RFC4122 version 1, 3, 4, and 5 UUIDs
+- **Cross-platform** - Support for ...
+ - CommonJS, [ECMAScript Modules](#ecmascript-modules) and [CDN builds](#cdn-builds)
+ - Node 12, 14, 16, 18
+ - Chrome, Safari, Firefox, Edge browsers
+ - Webpack and rollup.js module bundlers
+ - [React Native / Expo](#react-native--expo)
+- **Secure** - Cryptographically-strong random values
+- **Small** - Zero-dependency, small footprint, plays nice with "tree shaking" packagers
+- **CLI** - Includes the [`uuid` command line](#command-line) utility
+
+**Upgrading from `uuid@3`?** Your code is probably okay, but check out [Upgrading From `uuid@3`](#upgrading-from-uuid3) for details.
+
+## Quickstart
+
+To create a random UUID...
+
+**1. Install**
+
+```shell
+npm install uuid
+```
+
+**2. Create a UUID** (ES6 module syntax)
+
+```javascript
+import { v4 as uuidv4 } from 'uuid';
+uuidv4(); // ⇨ '9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d'
+```
+
+... or using CommonJS syntax:
+
+```javascript
+const { v4: uuidv4 } = require('uuid');
+uuidv4(); // ⇨ '1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed'
+```
+
+For timestamp UUIDs, namespace UUIDs, and other options read on ...
+
+## API Summary
+
+| | | |
+| --- | --- | --- |
+| [`uuid.NIL`](#uuidnil) | The nil UUID string (all zeros) | New in `uuid@8.3` |
+| [`uuid.parse()`](#uuidparsestr) | Convert UUID string to array of bytes | New in `uuid@8.3` |
+| [`uuid.stringify()`](#uuidstringifyarr-offset) | Convert array of bytes to UUID string | New in `uuid@8.3` |
+| [`uuid.v1()`](#uuidv1options-buffer-offset) | Create a version 1 (timestamp) UUID | |
+| [`uuid.v3()`](#uuidv3name-namespace-buffer-offset) | Create a version 3 (namespace w/ MD5) UUID | |
+| [`uuid.v4()`](#uuidv4options-buffer-offset) | Create a version 4 (random) UUID | |
+| [`uuid.v5()`](#uuidv5name-namespace-buffer-offset) | Create a version 5 (namespace w/ SHA-1) UUID | |
+| [`uuid.validate()`](#uuidvalidatestr) | Test a string to see if it is a valid UUID | New in `uuid@8.3` |
+| [`uuid.version()`](#uuidversionstr) | Detect RFC version of a UUID | New in `uuid@8.3` |
+
+## API
+
+### uuid.NIL
+
+The nil UUID string (all zeros).
+
+Example:
+
+```javascript
+import { NIL as NIL_UUID } from 'uuid';
+
+NIL_UUID; // ⇨ '00000000-0000-0000-0000-000000000000'
+```
+
+### uuid.parse(str)
+
+Convert UUID string to array of bytes
+
+| | |
+| --------- | ---------------------------------------- |
+| `str` | A valid UUID `String` |
+| _returns_ | `Uint8Array[16]` |
+| _throws_ | `TypeError` if `str` is not a valid UUID |
+
+Note: Ordering of values in the byte arrays used by `parse()` and `stringify()` follows the left &Rarr; right order of hex-pairs in UUID strings. As shown in the example below.
+
+Example:
+
+```javascript
+import { parse as uuidParse } from 'uuid';
+
+// Parse a UUID
+const bytes = uuidParse('6ec0bd7f-11c0-43da-975e-2a8ad9ebae0b');
+
+// Convert to hex strings to show byte order (for documentation purposes)
+[...bytes].map((v) => v.toString(16).padStart(2, '0')); // ⇨
+ // [
+ // '6e', 'c0', 'bd', '7f',
+ // '11', 'c0', '43', 'da',
+ // '97', '5e', '2a', '8a',
+ // 'd9', 'eb', 'ae', '0b'
+ // ]
+```
+
+### uuid.stringify(arr[, offset])
+
+Convert array of bytes to UUID string
+
+| | |
+| -------------- | ---------------------------------------------------------------------------- |
+| `arr` | `Array`-like collection of 16 values (starting from `offset`) between 0-255. |
+| [`offset` = 0] | `Number` Starting index in the Array |
+| _returns_ | `String` |
+| _throws_ | `TypeError` if a valid UUID string cannot be generated |
+
+Note: Ordering of values in the byte arrays used by `parse()` and `stringify()` follows the left &Rarr; right order of hex-pairs in UUID strings. As shown in the example below.
+
+Example:
+
+```javascript
+import { stringify as uuidStringify } from 'uuid';
+
+const uuidBytes = [
+ 0x6e, 0xc0, 0xbd, 0x7f, 0x11, 0xc0, 0x43, 0xda, 0x97, 0x5e, 0x2a, 0x8a, 0xd9, 0xeb, 0xae, 0x0b,
+];
+
+uuidStringify(uuidBytes); // ⇨ '6ec0bd7f-11c0-43da-975e-2a8ad9ebae0b'
+```
+
+### uuid.v1([options[, buffer[, offset]]])
+
+Create an RFC version 1 (timestamp) UUID
+
+| | |
+| --- | --- |
+| [`options`] | `Object` with one or more of the following properties: |
+| [`options.node` ] | RFC "node" field as an `Array[6]` of byte values (per 4.1.6) |
+| [`options.clockseq`] | RFC "clock sequence" as a `Number` between 0 - 0x3fff |
+| [`options.msecs`] | RFC "timestamp" field (`Number` of milliseconds, unix epoch) |
+| [`options.nsecs`] | RFC "timestamp" field (`Number` of nanseconds to add to `msecs`, should be 0-10,000) |
+| [`options.random`] | `Array` of 16 random bytes (0-255) |
+| [`options.rng`] | Alternative to `options.random`, a `Function` that returns an `Array` of 16 random bytes (0-255) |
+| [`buffer`] | `Array \| Buffer` If specified, uuid will be written here in byte-form, starting at `offset` |
+| [`offset` = 0] | `Number` Index to start writing UUID bytes in `buffer` |
+| _returns_ | UUID `String` if no `buffer` is specified, otherwise returns `buffer` |
+| _throws_ | `Error` if more than 10M UUIDs/sec are requested |
+
+Note: The default [node id](https://tools.ietf.org/html/rfc4122#section-4.1.6) (the last 12 digits in the UUID) is generated once, randomly, on process startup, and then remains unchanged for the duration of the process.
+
+Note: `options.random` and `options.rng` are only meaningful on the very first call to `v1()`, where they may be passed to initialize the internal `node` and `clockseq` fields.
+
+Example:
+
+```javascript
+import { v1 as uuidv1 } from 'uuid';
+
+uuidv1(); // ⇨ '2c5ea4c0-4067-11e9-8bad-9b1deb4d3b7d'
+```
+
+Example using `options`:
+
+```javascript
+import { v1 as uuidv1 } from 'uuid';
+
+const v1options = {
+ node: [0x01, 0x23, 0x45, 0x67, 0x89, 0xab],
+ clockseq: 0x1234,
+ msecs: new Date('2011-11-01').getTime(),
+ nsecs: 5678,
+};
+uuidv1(v1options); // ⇨ '710b962e-041c-11e1-9234-0123456789ab'
+```
+
+### uuid.v3(name, namespace[, buffer[, offset]])
+
+Create an RFC version 3 (namespace w/ MD5) UUID
+
+API is identical to `v5()`, but uses "v3" instead.
+
+&#x26a0;&#xfe0f; Note: Per the RFC, "_If backward compatibility is not an issue, SHA-1 [Version 5] is preferred_."
+
+### uuid.v4([options[, buffer[, offset]]])
+
+Create an RFC version 4 (random) UUID
+
+| | |
+| --- | --- |
+| [`options`] | `Object` with one or more of the following properties: |
+| [`options.random`] | `Array` of 16 random bytes (0-255) |
+| [`options.rng`] | Alternative to `options.random`, a `Function` that returns an `Array` of 16 random bytes (0-255) |
+| [`buffer`] | `Array \| Buffer` If specified, uuid will be written here in byte-form, starting at `offset` |
+| [`offset` = 0] | `Number` Index to start writing UUID bytes in `buffer` |
+| _returns_ | UUID `String` if no `buffer` is specified, otherwise returns `buffer` |
+
+Example:
+
+```javascript
+import { v4 as uuidv4 } from 'uuid';
+
+uuidv4(); // ⇨ '1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed'
+```
+
+Example using predefined `random` values:
+
+```javascript
+import { v4 as uuidv4 } from 'uuid';
+
+const v4options = {
+ random: [
+ 0x10, 0x91, 0x56, 0xbe, 0xc4, 0xfb, 0xc1, 0xea, 0x71, 0xb4, 0xef, 0xe1, 0x67, 0x1c, 0x58, 0x36,
+ ],
+};
+uuidv4(v4options); // ⇨ '109156be-c4fb-41ea-b1b4-efe1671c5836'
+```
+
+### uuid.v5(name, namespace[, buffer[, offset]])
+
+Create an RFC version 5 (namespace w/ SHA-1) UUID
+
+| | |
+| --- | --- |
+| `name` | `String \| Array` |
+| `namespace` | `String \| Array[16]` Namespace UUID |
+| [`buffer`] | `Array \| Buffer` If specified, uuid will be written here in byte-form, starting at `offset` |
+| [`offset` = 0] | `Number` Index to start writing UUID bytes in `buffer` |
+| _returns_ | UUID `String` if no `buffer` is specified, otherwise returns `buffer` |
+
+Note: The RFC `DNS` and `URL` namespaces are available as `v5.DNS` and `v5.URL`.
+
+Example with custom namespace:
+
+```javascript
+import { v5 as uuidv5 } from 'uuid';
+
+// Define a custom namespace. Readers, create your own using something like
+// https://www.uuidgenerator.net/
+const MY_NAMESPACE = '1b671a64-40d5-491e-99b0-da01ff1f3341';
+
+uuidv5('Hello, World!', MY_NAMESPACE); // ⇨ '630eb68f-e0fa-5ecc-887a-7c7a62614681'
+```
+
+Example with RFC `URL` namespace:
+
+```javascript
+import { v5 as uuidv5 } from 'uuid';
+
+uuidv5('https://www.w3.org/', uuidv5.URL); // ⇨ 'c106a26a-21bb-5538-8bf2-57095d1976c1'
+```
+
+### uuid.validate(str)
+
+Test a string to see if it is a valid UUID
+
+| | |
+| --------- | --------------------------------------------------- |
+| `str` | `String` to validate |
+| _returns_ | `true` if string is a valid UUID, `false` otherwise |
+
+Example:
+
+```javascript
+import { validate as uuidValidate } from 'uuid';
+
+uuidValidate('not a UUID'); // ⇨ false
+uuidValidate('6ec0bd7f-11c0-43da-975e-2a8ad9ebae0b'); // ⇨ true
+```
+
+Using `validate` and `version` together it is possible to do per-version validation, e.g. validate for only v4 UUIds.
+
+```javascript
+import { version as uuidVersion } from 'uuid';
+import { validate as uuidValidate } from 'uuid';
+
+function uuidValidateV4(uuid) {
+ return uuidValidate(uuid) && uuidVersion(uuid) === 4;
+}
+
+const v1Uuid = 'd9428888-122b-11e1-b85c-61cd3cbb3210';
+const v4Uuid = '109156be-c4fb-41ea-b1b4-efe1671c5836';
+
+uuidValidateV4(v4Uuid); // ⇨ true
+uuidValidateV4(v1Uuid); // ⇨ false
+```
+
+### uuid.version(str)
+
+Detect RFC version of a UUID
+
+| | |
+| --------- | ---------------------------------------- |
+| `str` | A valid UUID `String` |
+| _returns_ | `Number` The RFC version of the UUID |
+| _throws_ | `TypeError` if `str` is not a valid UUID |
+
+Example:
+
+```javascript
+import { version as uuidVersion } from 'uuid';
+
+uuidVersion('45637ec4-c85f-11ea-87d0-0242ac130003'); // ⇨ 1
+uuidVersion('6ec0bd7f-11c0-43da-975e-2a8ad9ebae0b'); // ⇨ 4
+```
+
+## Command Line
+
+UUIDs can be generated from the command line using `uuid`.
+
+```shell
+$ npx uuid
+ddeb27fb-d9a0-4624-be4d-4615062daed4
+```
+
+The default is to generate version 4 UUIDS, however the other versions are supported. Type `uuid --help` for details:
+
+```shell
+$ npx uuid --help
+
+Usage:
+ uuid
+ uuid v1
+ uuid v3 <name> <namespace uuid>
+ uuid v4
+ uuid v5 <name> <namespace uuid>
+ uuid --help
+
+Note: <namespace uuid> may be "URL" or "DNS" to use the corresponding UUIDs
+defined by RFC4122
+```
+
+## ECMAScript Modules
+
+This library comes with [ECMAScript Modules](https://www.ecma-international.org/ecma-262/6.0/#sec-modules) (ESM) support for Node.js versions that support it ([example](./examples/node-esmodules/)) as well as bundlers like [rollup.js](https://rollupjs.org/guide/en/#tree-shaking) ([example](./examples/browser-rollup/)) and [webpack](https://webpack.js.org/guides/tree-shaking/) ([example](./examples/browser-webpack/)) (targeting both, Node.js and browser environments).
+
+```javascript
+import { v4 as uuidv4 } from 'uuid';
+uuidv4(); // ⇨ '1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed'
+```
+
+To run the examples you must first create a dist build of this library in the module root:
+
+```shell
+npm run build
+```
+
+## CDN Builds
+
+### ECMAScript Modules
+
+To load this module directly into modern browsers that [support loading ECMAScript Modules](https://caniuse.com/#feat=es6-module) you can make use of [jspm](https://jspm.org/):
+
+```html
+<script type="module">
+ import { v4 as uuidv4 } from 'https://jspm.dev/uuid';
+ console.log(uuidv4()); // ⇨ '1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed'
+</script>
+```
+
+### UMD
+
+As of `uuid@9` [UMD (Universal Module Definition)](https://github.com/umdjs/umd) builds are no longer shipped with this library.
+
+If you need a UMD build of this library, use a bundler like Webpack or Rollup. Alternatively, refer to the documentation of [`uuid@8.3.2`](https://github.com/uuidjs/uuid/blob/v8.3.2/README.md#umd) which was the last version that shipped UMD builds.
+
+## Known issues
+
+### Duplicate UUIDs (Googlebot)
+
+This module may generate duplicate UUIDs when run in clients with _deterministic_ random number generators, such as [Googlebot crawlers](https://developers.google.com/search/docs/advanced/crawling/overview-google-crawlers). This can cause problems for apps that expect client-generated UUIDs to always be unique. Developers should be prepared for this and have a strategy for dealing with possible collisions, such as:
+
+- Check for duplicate UUIDs, fail gracefully
+- Disable write operations for Googlebot clients
+
+### "getRandomValues() not supported"
+
+This error occurs in environments where the standard [`crypto.getRandomValues()`](https://developer.mozilla.org/en-US/docs/Web/API/Crypto/getRandomValues) API is not supported. This issue can be resolved by adding an appropriate polyfill:
+
+### React Native / Expo
+
+1. Install [`react-native-get-random-values`](https://github.com/LinusU/react-native-get-random-values#readme)
+1. Import it _before_ `uuid`. Since `uuid` might also appear as a transitive dependency of some other imports it's safest to just import `react-native-get-random-values` as the very first thing in your entry point:
+
+```javascript
+import 'react-native-get-random-values';
+import { v4 as uuidv4 } from 'uuid';
+```
+
+Note: If you are using Expo, you must be using at least `react-native-get-random-values@1.5.0` and `expo@39.0.0`.
+
+### Web Workers / Service Workers (Edge <= 18)
+
+[In Edge <= 18, Web Crypto is not supported in Web Workers or Service Workers](https://caniuse.com/#feat=cryptography) and we are not aware of a polyfill (let us know if you find one, please).
+
+### IE 11 (Internet Explorer)
+
+Support for IE11 and other legacy browsers has been dropped as of `uuid@9`. If you need to support legacy browsers, you can always transpile the uuid module source yourself (e.g. using [Babel](https://babeljs.io/)).
+
+## Upgrading From `uuid@7`
+
+### Only Named Exports Supported When Using with Node.js ESM
+
+`uuid@7` did not come with native ECMAScript Module (ESM) support for Node.js. Importing it in Node.js ESM consequently imported the CommonJS source with a default export. This library now comes with true Node.js ESM support and only provides named exports.
+
+Instead of doing:
+
+```javascript
+import uuid from 'uuid';
+uuid.v4();
+```
+
+you will now have to use the named exports:
+
+```javascript
+import { v4 as uuidv4 } from 'uuid';
+uuidv4();
+```
+
+### Deep Requires No Longer Supported
+
+Deep requires like `require('uuid/v4')` [which have been deprecated in `uuid@7`](#deep-requires-now-deprecated) are no longer supported.
+
+## Upgrading From `uuid@3`
+
+"_Wait... what happened to `uuid@4` thru `uuid@6`?!?_"
+
+In order to avoid confusion with RFC [version 4](#uuidv4options-buffer-offset) and [version 5](#uuidv5name-namespace-buffer-offset) UUIDs, and a possible [version 6](http://gh.peabody.io/uuidv6/), releases 4 thru 6 of this module have been skipped.
+
+### Deep Requires Now Deprecated
+
+`uuid@3` encouraged the use of deep requires to minimize the bundle size of browser builds:
+
+```javascript
+const uuidv4 = require('uuid/v4'); // <== NOW DEPRECATED!
+uuidv4();
+```
+
+As of `uuid@7` this library now provides ECMAScript modules builds, which allow packagers like Webpack and Rollup to do "tree-shaking" to remove dead code. Instead, use the `import` syntax:
+
+```javascript
+import { v4 as uuidv4 } from 'uuid';
+uuidv4();
+```
+
+... or for CommonJS:
+
+```javascript
+const { v4: uuidv4 } = require('uuid');
+uuidv4();
+```
+
+### Default Export Removed
+
+`uuid@3` was exporting the Version 4 UUID method as a default export:
+
+```javascript
+const uuid = require('uuid'); // <== REMOVED!
+```
+
+This usage pattern was already discouraged in `uuid@3` and has been removed in `uuid@7`.
+
+----
+Markdown generated from [README_js.md](README_js.md) by [![RunMD Logo](https://i.imgur.com/h0FVyzU.png)](https://github.com/broofa/runmd) \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/bin/uuid b/includes/external/signal/node_modules/uuid/dist/bin/uuid
new file mode 100644
index 0000000..f38d2ee
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/bin/uuid
@@ -0,0 +1,2 @@
+#!/usr/bin/env node
+require('../uuid-bin');
diff --git a/includes/external/signal/node_modules/uuid/dist/commonjs-browser/index.js b/includes/external/signal/node_modules/uuid/dist/commonjs-browser/index.js
new file mode 100644
index 0000000..5586dd3
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/commonjs-browser/index.js
@@ -0,0 +1,79 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+Object.defineProperty(exports, "NIL", {
+ enumerable: true,
+ get: function get() {
+ return _nil.default;
+ }
+});
+Object.defineProperty(exports, "parse", {
+ enumerable: true,
+ get: function get() {
+ return _parse.default;
+ }
+});
+Object.defineProperty(exports, "stringify", {
+ enumerable: true,
+ get: function get() {
+ return _stringify.default;
+ }
+});
+Object.defineProperty(exports, "v1", {
+ enumerable: true,
+ get: function get() {
+ return _v.default;
+ }
+});
+Object.defineProperty(exports, "v3", {
+ enumerable: true,
+ get: function get() {
+ return _v2.default;
+ }
+});
+Object.defineProperty(exports, "v4", {
+ enumerable: true,
+ get: function get() {
+ return _v3.default;
+ }
+});
+Object.defineProperty(exports, "v5", {
+ enumerable: true,
+ get: function get() {
+ return _v4.default;
+ }
+});
+Object.defineProperty(exports, "validate", {
+ enumerable: true,
+ get: function get() {
+ return _validate.default;
+ }
+});
+Object.defineProperty(exports, "version", {
+ enumerable: true,
+ get: function get() {
+ return _version.default;
+ }
+});
+
+var _v = _interopRequireDefault(require("./v1.js"));
+
+var _v2 = _interopRequireDefault(require("./v3.js"));
+
+var _v3 = _interopRequireDefault(require("./v4.js"));
+
+var _v4 = _interopRequireDefault(require("./v5.js"));
+
+var _nil = _interopRequireDefault(require("./nil.js"));
+
+var _version = _interopRequireDefault(require("./version.js"));
+
+var _validate = _interopRequireDefault(require("./validate.js"));
+
+var _stringify = _interopRequireDefault(require("./stringify.js"));
+
+var _parse = _interopRequireDefault(require("./parse.js"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/commonjs-browser/md5.js b/includes/external/signal/node_modules/uuid/dist/commonjs-browser/md5.js
new file mode 100644
index 0000000..7a4582a
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/commonjs-browser/md5.js
@@ -0,0 +1,223 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = void 0;
+
+/*
+ * Browser-compatible JavaScript MD5
+ *
+ * Modification of JavaScript MD5
+ * https://github.com/blueimp/JavaScript-MD5
+ *
+ * Copyright 2011, Sebastian Tschan
+ * https://blueimp.net
+ *
+ * Licensed under the MIT license:
+ * https://opensource.org/licenses/MIT
+ *
+ * Based on
+ * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
+ * Digest Algorithm, as defined in RFC 1321.
+ * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
+ * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
+ * Distributed under the BSD License
+ * See http://pajhome.org.uk/crypt/md5 for more info.
+ */
+function md5(bytes) {
+ if (typeof bytes === 'string') {
+ const msg = unescape(encodeURIComponent(bytes)); // UTF8 escape
+
+ bytes = new Uint8Array(msg.length);
+
+ for (let i = 0; i < msg.length; ++i) {
+ bytes[i] = msg.charCodeAt(i);
+ }
+ }
+
+ return md5ToHexEncodedArray(wordsToMd5(bytesToWords(bytes), bytes.length * 8));
+}
+/*
+ * Convert an array of little-endian words to an array of bytes
+ */
+
+
+function md5ToHexEncodedArray(input) {
+ const output = [];
+ const length32 = input.length * 32;
+ const hexTab = '0123456789abcdef';
+
+ for (let i = 0; i < length32; i += 8) {
+ const x = input[i >> 5] >>> i % 32 & 0xff;
+ const hex = parseInt(hexTab.charAt(x >>> 4 & 0x0f) + hexTab.charAt(x & 0x0f), 16);
+ output.push(hex);
+ }
+
+ return output;
+}
+/**
+ * Calculate output length with padding and bit length
+ */
+
+
+function getOutputLength(inputLength8) {
+ return (inputLength8 + 64 >>> 9 << 4) + 14 + 1;
+}
+/*
+ * Calculate the MD5 of an array of little-endian words, and a bit length.
+ */
+
+
+function wordsToMd5(x, len) {
+ /* append padding */
+ x[len >> 5] |= 0x80 << len % 32;
+ x[getOutputLength(len) - 1] = len;
+ let a = 1732584193;
+ let b = -271733879;
+ let c = -1732584194;
+ let d = 271733878;
+
+ for (let i = 0; i < x.length; i += 16) {
+ const olda = a;
+ const oldb = b;
+ const oldc = c;
+ const oldd = d;
+ a = md5ff(a, b, c, d, x[i], 7, -680876936);
+ d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);
+ c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);
+ b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);
+ a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);
+ d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);
+ c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);
+ b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);
+ a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);
+ d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);
+ c = md5ff(c, d, a, b, x[i + 10], 17, -42063);
+ b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);
+ a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);
+ d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);
+ c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);
+ b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);
+ a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);
+ d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);
+ c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);
+ b = md5gg(b, c, d, a, x[i], 20, -373897302);
+ a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);
+ d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);
+ c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);
+ b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);
+ a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);
+ d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);
+ c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);
+ b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);
+ a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);
+ d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);
+ c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);
+ b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);
+ a = md5hh(a, b, c, d, x[i + 5], 4, -378558);
+ d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);
+ c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);
+ b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);
+ a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);
+ d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);
+ c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);
+ b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);
+ a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);
+ d = md5hh(d, a, b, c, x[i], 11, -358537222);
+ c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);
+ b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);
+ a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);
+ d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);
+ c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);
+ b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);
+ a = md5ii(a, b, c, d, x[i], 6, -198630844);
+ d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);
+ c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);
+ b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);
+ a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);
+ d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);
+ c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);
+ b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);
+ a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);
+ d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);
+ c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);
+ b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);
+ a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);
+ d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);
+ c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);
+ b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);
+ a = safeAdd(a, olda);
+ b = safeAdd(b, oldb);
+ c = safeAdd(c, oldc);
+ d = safeAdd(d, oldd);
+ }
+
+ return [a, b, c, d];
+}
+/*
+ * Convert an array bytes to an array of little-endian words
+ * Characters >255 have their high-byte silently ignored.
+ */
+
+
+function bytesToWords(input) {
+ if (input.length === 0) {
+ return [];
+ }
+
+ const length8 = input.length * 8;
+ const output = new Uint32Array(getOutputLength(length8));
+
+ for (let i = 0; i < length8; i += 8) {
+ output[i >> 5] |= (input[i / 8] & 0xff) << i % 32;
+ }
+
+ return output;
+}
+/*
+ * Add integers, wrapping at 2^32. This uses 16-bit operations internally
+ * to work around bugs in some JS interpreters.
+ */
+
+
+function safeAdd(x, y) {
+ const lsw = (x & 0xffff) + (y & 0xffff);
+ const msw = (x >> 16) + (y >> 16) + (lsw >> 16);
+ return msw << 16 | lsw & 0xffff;
+}
+/*
+ * Bitwise rotate a 32-bit number to the left.
+ */
+
+
+function bitRotateLeft(num, cnt) {
+ return num << cnt | num >>> 32 - cnt;
+}
+/*
+ * These functions implement the four basic operations the algorithm uses.
+ */
+
+
+function md5cmn(q, a, b, x, s, t) {
+ return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);
+}
+
+function md5ff(a, b, c, d, x, s, t) {
+ return md5cmn(b & c | ~b & d, a, b, x, s, t);
+}
+
+function md5gg(a, b, c, d, x, s, t) {
+ return md5cmn(b & d | c & ~d, a, b, x, s, t);
+}
+
+function md5hh(a, b, c, d, x, s, t) {
+ return md5cmn(b ^ c ^ d, a, b, x, s, t);
+}
+
+function md5ii(a, b, c, d, x, s, t) {
+ return md5cmn(c ^ (b | ~d), a, b, x, s, t);
+}
+
+var _default = md5;
+exports.default = _default; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/commonjs-browser/native.js b/includes/external/signal/node_modules/uuid/dist/commonjs-browser/native.js
new file mode 100644
index 0000000..c2eea59
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/commonjs-browser/native.js
@@ -0,0 +1,11 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = void 0;
+const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);
+var _default = {
+ randomUUID
+};
+exports.default = _default; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/commonjs-browser/nil.js b/includes/external/signal/node_modules/uuid/dist/commonjs-browser/nil.js
new file mode 100644
index 0000000..7ade577
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/commonjs-browser/nil.js
@@ -0,0 +1,8 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = void 0;
+var _default = '00000000-0000-0000-0000-000000000000';
+exports.default = _default; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/commonjs-browser/parse.js b/includes/external/signal/node_modules/uuid/dist/commonjs-browser/parse.js
new file mode 100644
index 0000000..4c69fc3
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/commonjs-browser/parse.js
@@ -0,0 +1,45 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = void 0;
+
+var _validate = _interopRequireDefault(require("./validate.js"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function parse(uuid) {
+ if (!(0, _validate.default)(uuid)) {
+ throw TypeError('Invalid UUID');
+ }
+
+ let v;
+ const arr = new Uint8Array(16); // Parse ########-....-....-....-............
+
+ arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24;
+ arr[1] = v >>> 16 & 0xff;
+ arr[2] = v >>> 8 & 0xff;
+ arr[3] = v & 0xff; // Parse ........-####-....-....-............
+
+ arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8;
+ arr[5] = v & 0xff; // Parse ........-....-####-....-............
+
+ arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8;
+ arr[7] = v & 0xff; // Parse ........-....-....-####-............
+
+ arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8;
+ arr[9] = v & 0xff; // Parse ........-....-....-....-############
+ // (Use "/" to avoid 32-bit truncation when bit-shifting high-order bytes)
+
+ arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff;
+ arr[11] = v / 0x100000000 & 0xff;
+ arr[12] = v >>> 24 & 0xff;
+ arr[13] = v >>> 16 & 0xff;
+ arr[14] = v >>> 8 & 0xff;
+ arr[15] = v & 0xff;
+ return arr;
+}
+
+var _default = parse;
+exports.default = _default; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/commonjs-browser/regex.js b/includes/external/signal/node_modules/uuid/dist/commonjs-browser/regex.js
new file mode 100644
index 0000000..1ef91d6
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/commonjs-browser/regex.js
@@ -0,0 +1,8 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = void 0;
+var _default = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;
+exports.default = _default; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/commonjs-browser/rng.js b/includes/external/signal/node_modules/uuid/dist/commonjs-browser/rng.js
new file mode 100644
index 0000000..d067cdb
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/commonjs-browser/rng.js
@@ -0,0 +1,25 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = rng;
+// Unique ID creation requires a high quality random # generator. In the browser we therefore
+// require the crypto API and do not support built-in fallback to lower quality random number
+// generators (like Math.random()).
+let getRandomValues;
+const rnds8 = new Uint8Array(16);
+
+function rng() {
+ // lazy load so that environments that need to polyfill have a chance to do so
+ if (!getRandomValues) {
+ // getRandomValues needs to be invoked in a context where "this" is a Crypto implementation.
+ getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto);
+
+ if (!getRandomValues) {
+ throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');
+ }
+ }
+
+ return getRandomValues(rnds8);
+} \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/commonjs-browser/sha1.js b/includes/external/signal/node_modules/uuid/dist/commonjs-browser/sha1.js
new file mode 100644
index 0000000..24cbced
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/commonjs-browser/sha1.js
@@ -0,0 +1,104 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = void 0;
+
+// Adapted from Chris Veness' SHA1 code at
+// http://www.movable-type.co.uk/scripts/sha1.html
+function f(s, x, y, z) {
+ switch (s) {
+ case 0:
+ return x & y ^ ~x & z;
+
+ case 1:
+ return x ^ y ^ z;
+
+ case 2:
+ return x & y ^ x & z ^ y & z;
+
+ case 3:
+ return x ^ y ^ z;
+ }
+}
+
+function ROTL(x, n) {
+ return x << n | x >>> 32 - n;
+}
+
+function sha1(bytes) {
+ const K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6];
+ const H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0];
+
+ if (typeof bytes === 'string') {
+ const msg = unescape(encodeURIComponent(bytes)); // UTF8 escape
+
+ bytes = [];
+
+ for (let i = 0; i < msg.length; ++i) {
+ bytes.push(msg.charCodeAt(i));
+ }
+ } else if (!Array.isArray(bytes)) {
+ // Convert Array-like to Array
+ bytes = Array.prototype.slice.call(bytes);
+ }
+
+ bytes.push(0x80);
+ const l = bytes.length / 4 + 2;
+ const N = Math.ceil(l / 16);
+ const M = new Array(N);
+
+ for (let i = 0; i < N; ++i) {
+ const arr = new Uint32Array(16);
+
+ for (let j = 0; j < 16; ++j) {
+ arr[j] = bytes[i * 64 + j * 4] << 24 | bytes[i * 64 + j * 4 + 1] << 16 | bytes[i * 64 + j * 4 + 2] << 8 | bytes[i * 64 + j * 4 + 3];
+ }
+
+ M[i] = arr;
+ }
+
+ M[N - 1][14] = (bytes.length - 1) * 8 / Math.pow(2, 32);
+ M[N - 1][14] = Math.floor(M[N - 1][14]);
+ M[N - 1][15] = (bytes.length - 1) * 8 & 0xffffffff;
+
+ for (let i = 0; i < N; ++i) {
+ const W = new Uint32Array(80);
+
+ for (let t = 0; t < 16; ++t) {
+ W[t] = M[i][t];
+ }
+
+ for (let t = 16; t < 80; ++t) {
+ W[t] = ROTL(W[t - 3] ^ W[t - 8] ^ W[t - 14] ^ W[t - 16], 1);
+ }
+
+ let a = H[0];
+ let b = H[1];
+ let c = H[2];
+ let d = H[3];
+ let e = H[4];
+
+ for (let t = 0; t < 80; ++t) {
+ const s = Math.floor(t / 20);
+ const T = ROTL(a, 5) + f(s, b, c, d) + e + K[s] + W[t] >>> 0;
+ e = d;
+ d = c;
+ c = ROTL(b, 30) >>> 0;
+ b = a;
+ a = T;
+ }
+
+ H[0] = H[0] + a >>> 0;
+ H[1] = H[1] + b >>> 0;
+ H[2] = H[2] + c >>> 0;
+ H[3] = H[3] + d >>> 0;
+ H[4] = H[4] + e >>> 0;
+ }
+
+ return [H[0] >> 24 & 0xff, H[0] >> 16 & 0xff, H[0] >> 8 & 0xff, H[0] & 0xff, H[1] >> 24 & 0xff, H[1] >> 16 & 0xff, H[1] >> 8 & 0xff, H[1] & 0xff, H[2] >> 24 & 0xff, H[2] >> 16 & 0xff, H[2] >> 8 & 0xff, H[2] & 0xff, H[3] >> 24 & 0xff, H[3] >> 16 & 0xff, H[3] >> 8 & 0xff, H[3] & 0xff, H[4] >> 24 & 0xff, H[4] >> 16 & 0xff, H[4] >> 8 & 0xff, H[4] & 0xff];
+}
+
+var _default = sha1;
+exports.default = _default; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/commonjs-browser/stringify.js b/includes/external/signal/node_modules/uuid/dist/commonjs-browser/stringify.js
new file mode 100644
index 0000000..bdcea1c
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/commonjs-browser/stringify.js
@@ -0,0 +1,44 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = void 0;
+exports.unsafeStringify = unsafeStringify;
+
+var _validate = _interopRequireDefault(require("./validate.js"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * Convert array of 16 byte values to UUID string format of the form:
+ * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
+ */
+const byteToHex = [];
+
+for (let i = 0; i < 256; ++i) {
+ byteToHex.push((i + 0x100).toString(16).slice(1));
+}
+
+function unsafeStringify(arr, offset = 0) {
+ // Note: Be careful editing this code! It's been tuned for performance
+ // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434
+ return (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase();
+}
+
+function stringify(arr, offset = 0) {
+ const uuid = unsafeStringify(arr, offset); // Consistency check for valid UUID. If this throws, it's likely due to one
+ // of the following:
+ // - One or more input array values don't map to a hex octet (leading to
+ // "undefined" in the uuid)
+ // - Invalid input values for the RFC `version` or `variant` fields
+
+ if (!(0, _validate.default)(uuid)) {
+ throw TypeError('Stringified UUID is invalid');
+ }
+
+ return uuid;
+}
+
+var _default = stringify;
+exports.default = _default; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/commonjs-browser/v1.js b/includes/external/signal/node_modules/uuid/dist/commonjs-browser/v1.js
new file mode 100644
index 0000000..125bc58
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/commonjs-browser/v1.js
@@ -0,0 +1,107 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = void 0;
+
+var _rng = _interopRequireDefault(require("./rng.js"));
+
+var _stringify = require("./stringify.js");
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+// **`v1()` - Generate time-based UUID**
+//
+// Inspired by https://github.com/LiosK/UUID.js
+// and http://docs.python.org/library/uuid.html
+let _nodeId;
+
+let _clockseq; // Previous uuid creation time
+
+
+let _lastMSecs = 0;
+let _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details
+
+function v1(options, buf, offset) {
+ let i = buf && offset || 0;
+ const b = buf || new Array(16);
+ options = options || {};
+ let node = options.node || _nodeId;
+ let clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not
+ // specified. We do this lazily to minimize issues related to insufficient
+ // system entropy. See #189
+
+ if (node == null || clockseq == null) {
+ const seedBytes = options.random || (options.rng || _rng.default)();
+
+ if (node == null) {
+ // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)
+ node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]];
+ }
+
+ if (clockseq == null) {
+ // Per 4.2.2, randomize (14 bit) clockseq
+ clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;
+ }
+ } // UUID timestamps are 100 nano-second units since the Gregorian epoch,
+ // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so
+ // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'
+ // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.
+
+
+ let msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock
+ // cycle to simulate higher resolution clock
+
+ let nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs)
+
+ const dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression
+
+ if (dt < 0 && options.clockseq === undefined) {
+ clockseq = clockseq + 1 & 0x3fff;
+ } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new
+ // time interval
+
+
+ if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {
+ nsecs = 0;
+ } // Per 4.2.1.2 Throw error if too many uuids are requested
+
+
+ if (nsecs >= 10000) {
+ throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");
+ }
+
+ _lastMSecs = msecs;
+ _lastNSecs = nsecs;
+ _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch
+
+ msecs += 12219292800000; // `time_low`
+
+ const tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;
+ b[i++] = tl >>> 24 & 0xff;
+ b[i++] = tl >>> 16 & 0xff;
+ b[i++] = tl >>> 8 & 0xff;
+ b[i++] = tl & 0xff; // `time_mid`
+
+ const tmh = msecs / 0x100000000 * 10000 & 0xfffffff;
+ b[i++] = tmh >>> 8 & 0xff;
+ b[i++] = tmh & 0xff; // `time_high_and_version`
+
+ b[i++] = tmh >>> 24 & 0xf | 0x10; // include version
+
+ b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)
+
+ b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low`
+
+ b[i++] = clockseq & 0xff; // `node`
+
+ for (let n = 0; n < 6; ++n) {
+ b[i + n] = node[n];
+ }
+
+ return buf || (0, _stringify.unsafeStringify)(b);
+}
+
+var _default = v1;
+exports.default = _default; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/commonjs-browser/v3.js b/includes/external/signal/node_modules/uuid/dist/commonjs-browser/v3.js
new file mode 100644
index 0000000..6b47ff5
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/commonjs-browser/v3.js
@@ -0,0 +1,16 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = void 0;
+
+var _v = _interopRequireDefault(require("./v35.js"));
+
+var _md = _interopRequireDefault(require("./md5.js"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+const v3 = (0, _v.default)('v3', 0x30, _md.default);
+var _default = v3;
+exports.default = _default; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/commonjs-browser/v35.js b/includes/external/signal/node_modules/uuid/dist/commonjs-browser/v35.js
new file mode 100644
index 0000000..7c522d9
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/commonjs-browser/v35.js
@@ -0,0 +1,80 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.URL = exports.DNS = void 0;
+exports.default = v35;
+
+var _stringify = require("./stringify.js");
+
+var _parse = _interopRequireDefault(require("./parse.js"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function stringToBytes(str) {
+ str = unescape(encodeURIComponent(str)); // UTF8 escape
+
+ const bytes = [];
+
+ for (let i = 0; i < str.length; ++i) {
+ bytes.push(str.charCodeAt(i));
+ }
+
+ return bytes;
+}
+
+const DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';
+exports.DNS = DNS;
+const URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';
+exports.URL = URL;
+
+function v35(name, version, hashfunc) {
+ function generateUUID(value, namespace, buf, offset) {
+ var _namespace;
+
+ if (typeof value === 'string') {
+ value = stringToBytes(value);
+ }
+
+ if (typeof namespace === 'string') {
+ namespace = (0, _parse.default)(namespace);
+ }
+
+ if (((_namespace = namespace) === null || _namespace === void 0 ? void 0 : _namespace.length) !== 16) {
+ throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');
+ } // Compute hash of namespace and value, Per 4.3
+ // Future: Use spread syntax when supported on all platforms, e.g. `bytes =
+ // hashfunc([...namespace, ... value])`
+
+
+ let bytes = new Uint8Array(16 + value.length);
+ bytes.set(namespace);
+ bytes.set(value, namespace.length);
+ bytes = hashfunc(bytes);
+ bytes[6] = bytes[6] & 0x0f | version;
+ bytes[8] = bytes[8] & 0x3f | 0x80;
+
+ if (buf) {
+ offset = offset || 0;
+
+ for (let i = 0; i < 16; ++i) {
+ buf[offset + i] = bytes[i];
+ }
+
+ return buf;
+ }
+
+ return (0, _stringify.unsafeStringify)(bytes);
+ } // Function#name is not settable on some platforms (#270)
+
+
+ try {
+ generateUUID.name = name; // eslint-disable-next-line no-empty
+ } catch (err) {} // For CommonJS default export support
+
+
+ generateUUID.DNS = DNS;
+ generateUUID.URL = URL;
+ return generateUUID;
+} \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/commonjs-browser/v4.js b/includes/external/signal/node_modules/uuid/dist/commonjs-browser/v4.js
new file mode 100644
index 0000000..959d698
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/commonjs-browser/v4.js
@@ -0,0 +1,43 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = void 0;
+
+var _native = _interopRequireDefault(require("./native.js"));
+
+var _rng = _interopRequireDefault(require("./rng.js"));
+
+var _stringify = require("./stringify.js");
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function v4(options, buf, offset) {
+ if (_native.default.randomUUID && !buf && !options) {
+ return _native.default.randomUUID();
+ }
+
+ options = options || {};
+
+ const rnds = options.random || (options.rng || _rng.default)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`
+
+
+ rnds[6] = rnds[6] & 0x0f | 0x40;
+ rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided
+
+ if (buf) {
+ offset = offset || 0;
+
+ for (let i = 0; i < 16; ++i) {
+ buf[offset + i] = rnds[i];
+ }
+
+ return buf;
+ }
+
+ return (0, _stringify.unsafeStringify)(rnds);
+}
+
+var _default = v4;
+exports.default = _default; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/commonjs-browser/v5.js b/includes/external/signal/node_modules/uuid/dist/commonjs-browser/v5.js
new file mode 100644
index 0000000..99d615e
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/commonjs-browser/v5.js
@@ -0,0 +1,16 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = void 0;
+
+var _v = _interopRequireDefault(require("./v35.js"));
+
+var _sha = _interopRequireDefault(require("./sha1.js"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+const v5 = (0, _v.default)('v5', 0x50, _sha.default);
+var _default = v5;
+exports.default = _default; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/commonjs-browser/validate.js b/includes/external/signal/node_modules/uuid/dist/commonjs-browser/validate.js
new file mode 100644
index 0000000..fd05215
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/commonjs-browser/validate.js
@@ -0,0 +1,17 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = void 0;
+
+var _regex = _interopRequireDefault(require("./regex.js"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function validate(uuid) {
+ return typeof uuid === 'string' && _regex.default.test(uuid);
+}
+
+var _default = validate;
+exports.default = _default; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/commonjs-browser/version.js b/includes/external/signal/node_modules/uuid/dist/commonjs-browser/version.js
new file mode 100644
index 0000000..f63af01
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/commonjs-browser/version.js
@@ -0,0 +1,21 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = void 0;
+
+var _validate = _interopRequireDefault(require("./validate.js"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function version(uuid) {
+ if (!(0, _validate.default)(uuid)) {
+ throw TypeError('Invalid UUID');
+ }
+
+ return parseInt(uuid.slice(14, 15), 16);
+}
+
+var _default = version;
+exports.default = _default; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/esm-browser/index.js b/includes/external/signal/node_modules/uuid/dist/esm-browser/index.js
new file mode 100644
index 0000000..1db6f6d
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/esm-browser/index.js
@@ -0,0 +1,9 @@
+export { default as v1 } from './v1.js';
+export { default as v3 } from './v3.js';
+export { default as v4 } from './v4.js';
+export { default as v5 } from './v5.js';
+export { default as NIL } from './nil.js';
+export { default as version } from './version.js';
+export { default as validate } from './validate.js';
+export { default as stringify } from './stringify.js';
+export { default as parse } from './parse.js'; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/esm-browser/md5.js b/includes/external/signal/node_modules/uuid/dist/esm-browser/md5.js
new file mode 100644
index 0000000..f12212e
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/esm-browser/md5.js
@@ -0,0 +1,215 @@
+/*
+ * Browser-compatible JavaScript MD5
+ *
+ * Modification of JavaScript MD5
+ * https://github.com/blueimp/JavaScript-MD5
+ *
+ * Copyright 2011, Sebastian Tschan
+ * https://blueimp.net
+ *
+ * Licensed under the MIT license:
+ * https://opensource.org/licenses/MIT
+ *
+ * Based on
+ * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
+ * Digest Algorithm, as defined in RFC 1321.
+ * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
+ * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
+ * Distributed under the BSD License
+ * See http://pajhome.org.uk/crypt/md5 for more info.
+ */
+function md5(bytes) {
+ if (typeof bytes === 'string') {
+ const msg = unescape(encodeURIComponent(bytes)); // UTF8 escape
+
+ bytes = new Uint8Array(msg.length);
+
+ for (let i = 0; i < msg.length; ++i) {
+ bytes[i] = msg.charCodeAt(i);
+ }
+ }
+
+ return md5ToHexEncodedArray(wordsToMd5(bytesToWords(bytes), bytes.length * 8));
+}
+/*
+ * Convert an array of little-endian words to an array of bytes
+ */
+
+
+function md5ToHexEncodedArray(input) {
+ const output = [];
+ const length32 = input.length * 32;
+ const hexTab = '0123456789abcdef';
+
+ for (let i = 0; i < length32; i += 8) {
+ const x = input[i >> 5] >>> i % 32 & 0xff;
+ const hex = parseInt(hexTab.charAt(x >>> 4 & 0x0f) + hexTab.charAt(x & 0x0f), 16);
+ output.push(hex);
+ }
+
+ return output;
+}
+/**
+ * Calculate output length with padding and bit length
+ */
+
+
+function getOutputLength(inputLength8) {
+ return (inputLength8 + 64 >>> 9 << 4) + 14 + 1;
+}
+/*
+ * Calculate the MD5 of an array of little-endian words, and a bit length.
+ */
+
+
+function wordsToMd5(x, len) {
+ /* append padding */
+ x[len >> 5] |= 0x80 << len % 32;
+ x[getOutputLength(len) - 1] = len;
+ let a = 1732584193;
+ let b = -271733879;
+ let c = -1732584194;
+ let d = 271733878;
+
+ for (let i = 0; i < x.length; i += 16) {
+ const olda = a;
+ const oldb = b;
+ const oldc = c;
+ const oldd = d;
+ a = md5ff(a, b, c, d, x[i], 7, -680876936);
+ d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);
+ c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);
+ b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);
+ a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);
+ d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);
+ c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);
+ b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);
+ a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);
+ d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);
+ c = md5ff(c, d, a, b, x[i + 10], 17, -42063);
+ b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);
+ a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);
+ d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);
+ c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);
+ b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);
+ a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);
+ d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);
+ c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);
+ b = md5gg(b, c, d, a, x[i], 20, -373897302);
+ a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);
+ d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);
+ c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);
+ b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);
+ a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);
+ d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);
+ c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);
+ b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);
+ a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);
+ d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);
+ c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);
+ b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);
+ a = md5hh(a, b, c, d, x[i + 5], 4, -378558);
+ d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);
+ c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);
+ b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);
+ a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);
+ d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);
+ c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);
+ b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);
+ a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);
+ d = md5hh(d, a, b, c, x[i], 11, -358537222);
+ c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);
+ b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);
+ a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);
+ d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);
+ c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);
+ b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);
+ a = md5ii(a, b, c, d, x[i], 6, -198630844);
+ d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);
+ c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);
+ b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);
+ a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);
+ d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);
+ c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);
+ b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);
+ a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);
+ d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);
+ c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);
+ b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);
+ a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);
+ d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);
+ c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);
+ b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);
+ a = safeAdd(a, olda);
+ b = safeAdd(b, oldb);
+ c = safeAdd(c, oldc);
+ d = safeAdd(d, oldd);
+ }
+
+ return [a, b, c, d];
+}
+/*
+ * Convert an array bytes to an array of little-endian words
+ * Characters >255 have their high-byte silently ignored.
+ */
+
+
+function bytesToWords(input) {
+ if (input.length === 0) {
+ return [];
+ }
+
+ const length8 = input.length * 8;
+ const output = new Uint32Array(getOutputLength(length8));
+
+ for (let i = 0; i < length8; i += 8) {
+ output[i >> 5] |= (input[i / 8] & 0xff) << i % 32;
+ }
+
+ return output;
+}
+/*
+ * Add integers, wrapping at 2^32. This uses 16-bit operations internally
+ * to work around bugs in some JS interpreters.
+ */
+
+
+function safeAdd(x, y) {
+ const lsw = (x & 0xffff) + (y & 0xffff);
+ const msw = (x >> 16) + (y >> 16) + (lsw >> 16);
+ return msw << 16 | lsw & 0xffff;
+}
+/*
+ * Bitwise rotate a 32-bit number to the left.
+ */
+
+
+function bitRotateLeft(num, cnt) {
+ return num << cnt | num >>> 32 - cnt;
+}
+/*
+ * These functions implement the four basic operations the algorithm uses.
+ */
+
+
+function md5cmn(q, a, b, x, s, t) {
+ return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);
+}
+
+function md5ff(a, b, c, d, x, s, t) {
+ return md5cmn(b & c | ~b & d, a, b, x, s, t);
+}
+
+function md5gg(a, b, c, d, x, s, t) {
+ return md5cmn(b & d | c & ~d, a, b, x, s, t);
+}
+
+function md5hh(a, b, c, d, x, s, t) {
+ return md5cmn(b ^ c ^ d, a, b, x, s, t);
+}
+
+function md5ii(a, b, c, d, x, s, t) {
+ return md5cmn(c ^ (b | ~d), a, b, x, s, t);
+}
+
+export default md5; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/esm-browser/native.js b/includes/external/signal/node_modules/uuid/dist/esm-browser/native.js
new file mode 100644
index 0000000..b22292c
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/esm-browser/native.js
@@ -0,0 +1,4 @@
+const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);
+export default {
+ randomUUID
+}; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/esm-browser/nil.js b/includes/external/signal/node_modules/uuid/dist/esm-browser/nil.js
new file mode 100644
index 0000000..b36324c
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/esm-browser/nil.js
@@ -0,0 +1 @@
+export default '00000000-0000-0000-0000-000000000000'; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/esm-browser/parse.js b/includes/external/signal/node_modules/uuid/dist/esm-browser/parse.js
new file mode 100644
index 0000000..6421c5d
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/esm-browser/parse.js
@@ -0,0 +1,35 @@
+import validate from './validate.js';
+
+function parse(uuid) {
+ if (!validate(uuid)) {
+ throw TypeError('Invalid UUID');
+ }
+
+ let v;
+ const arr = new Uint8Array(16); // Parse ########-....-....-....-............
+
+ arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24;
+ arr[1] = v >>> 16 & 0xff;
+ arr[2] = v >>> 8 & 0xff;
+ arr[3] = v & 0xff; // Parse ........-####-....-....-............
+
+ arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8;
+ arr[5] = v & 0xff; // Parse ........-....-####-....-............
+
+ arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8;
+ arr[7] = v & 0xff; // Parse ........-....-....-####-............
+
+ arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8;
+ arr[9] = v & 0xff; // Parse ........-....-....-....-############
+ // (Use "/" to avoid 32-bit truncation when bit-shifting high-order bytes)
+
+ arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff;
+ arr[11] = v / 0x100000000 & 0xff;
+ arr[12] = v >>> 24 & 0xff;
+ arr[13] = v >>> 16 & 0xff;
+ arr[14] = v >>> 8 & 0xff;
+ arr[15] = v & 0xff;
+ return arr;
+}
+
+export default parse; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/esm-browser/regex.js b/includes/external/signal/node_modules/uuid/dist/esm-browser/regex.js
new file mode 100644
index 0000000..3da8673
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/esm-browser/regex.js
@@ -0,0 +1 @@
+export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/esm-browser/rng.js b/includes/external/signal/node_modules/uuid/dist/esm-browser/rng.js
new file mode 100644
index 0000000..6e65234
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/esm-browser/rng.js
@@ -0,0 +1,18 @@
+// Unique ID creation requires a high quality random # generator. In the browser we therefore
+// require the crypto API and do not support built-in fallback to lower quality random number
+// generators (like Math.random()).
+let getRandomValues;
+const rnds8 = new Uint8Array(16);
+export default function rng() {
+ // lazy load so that environments that need to polyfill have a chance to do so
+ if (!getRandomValues) {
+ // getRandomValues needs to be invoked in a context where "this" is a Crypto implementation.
+ getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto);
+
+ if (!getRandomValues) {
+ throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');
+ }
+ }
+
+ return getRandomValues(rnds8);
+} \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/esm-browser/sha1.js b/includes/external/signal/node_modules/uuid/dist/esm-browser/sha1.js
new file mode 100644
index 0000000..d3c2565
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/esm-browser/sha1.js
@@ -0,0 +1,96 @@
+// Adapted from Chris Veness' SHA1 code at
+// http://www.movable-type.co.uk/scripts/sha1.html
+function f(s, x, y, z) {
+ switch (s) {
+ case 0:
+ return x & y ^ ~x & z;
+
+ case 1:
+ return x ^ y ^ z;
+
+ case 2:
+ return x & y ^ x & z ^ y & z;
+
+ case 3:
+ return x ^ y ^ z;
+ }
+}
+
+function ROTL(x, n) {
+ return x << n | x >>> 32 - n;
+}
+
+function sha1(bytes) {
+ const K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6];
+ const H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0];
+
+ if (typeof bytes === 'string') {
+ const msg = unescape(encodeURIComponent(bytes)); // UTF8 escape
+
+ bytes = [];
+
+ for (let i = 0; i < msg.length; ++i) {
+ bytes.push(msg.charCodeAt(i));
+ }
+ } else if (!Array.isArray(bytes)) {
+ // Convert Array-like to Array
+ bytes = Array.prototype.slice.call(bytes);
+ }
+
+ bytes.push(0x80);
+ const l = bytes.length / 4 + 2;
+ const N = Math.ceil(l / 16);
+ const M = new Array(N);
+
+ for (let i = 0; i < N; ++i) {
+ const arr = new Uint32Array(16);
+
+ for (let j = 0; j < 16; ++j) {
+ arr[j] = bytes[i * 64 + j * 4] << 24 | bytes[i * 64 + j * 4 + 1] << 16 | bytes[i * 64 + j * 4 + 2] << 8 | bytes[i * 64 + j * 4 + 3];
+ }
+
+ M[i] = arr;
+ }
+
+ M[N - 1][14] = (bytes.length - 1) * 8 / Math.pow(2, 32);
+ M[N - 1][14] = Math.floor(M[N - 1][14]);
+ M[N - 1][15] = (bytes.length - 1) * 8 & 0xffffffff;
+
+ for (let i = 0; i < N; ++i) {
+ const W = new Uint32Array(80);
+
+ for (let t = 0; t < 16; ++t) {
+ W[t] = M[i][t];
+ }
+
+ for (let t = 16; t < 80; ++t) {
+ W[t] = ROTL(W[t - 3] ^ W[t - 8] ^ W[t - 14] ^ W[t - 16], 1);
+ }
+
+ let a = H[0];
+ let b = H[1];
+ let c = H[2];
+ let d = H[3];
+ let e = H[4];
+
+ for (let t = 0; t < 80; ++t) {
+ const s = Math.floor(t / 20);
+ const T = ROTL(a, 5) + f(s, b, c, d) + e + K[s] + W[t] >>> 0;
+ e = d;
+ d = c;
+ c = ROTL(b, 30) >>> 0;
+ b = a;
+ a = T;
+ }
+
+ H[0] = H[0] + a >>> 0;
+ H[1] = H[1] + b >>> 0;
+ H[2] = H[2] + c >>> 0;
+ H[3] = H[3] + d >>> 0;
+ H[4] = H[4] + e >>> 0;
+ }
+
+ return [H[0] >> 24 & 0xff, H[0] >> 16 & 0xff, H[0] >> 8 & 0xff, H[0] & 0xff, H[1] >> 24 & 0xff, H[1] >> 16 & 0xff, H[1] >> 8 & 0xff, H[1] & 0xff, H[2] >> 24 & 0xff, H[2] >> 16 & 0xff, H[2] >> 8 & 0xff, H[2] & 0xff, H[3] >> 24 & 0xff, H[3] >> 16 & 0xff, H[3] >> 8 & 0xff, H[3] & 0xff, H[4] >> 24 & 0xff, H[4] >> 16 & 0xff, H[4] >> 8 & 0xff, H[4] & 0xff];
+}
+
+export default sha1; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/esm-browser/stringify.js b/includes/external/signal/node_modules/uuid/dist/esm-browser/stringify.js
new file mode 100644
index 0000000..80fac8a
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/esm-browser/stringify.js
@@ -0,0 +1,33 @@
+import validate from './validate.js';
+/**
+ * Convert array of 16 byte values to UUID string format of the form:
+ * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
+ */
+
+const byteToHex = [];
+
+for (let i = 0; i < 256; ++i) {
+ byteToHex.push((i + 0x100).toString(16).slice(1));
+}
+
+export function unsafeStringify(arr, offset = 0) {
+ // Note: Be careful editing this code! It's been tuned for performance
+ // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434
+ return (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase();
+}
+
+function stringify(arr, offset = 0) {
+ const uuid = unsafeStringify(arr, offset); // Consistency check for valid UUID. If this throws, it's likely due to one
+ // of the following:
+ // - One or more input array values don't map to a hex octet (leading to
+ // "undefined" in the uuid)
+ // - Invalid input values for the RFC `version` or `variant` fields
+
+ if (!validate(uuid)) {
+ throw TypeError('Stringified UUID is invalid');
+ }
+
+ return uuid;
+}
+
+export default stringify; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/esm-browser/v1.js b/includes/external/signal/node_modules/uuid/dist/esm-browser/v1.js
new file mode 100644
index 0000000..382e5d7
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/esm-browser/v1.js
@@ -0,0 +1,95 @@
+import rng from './rng.js';
+import { unsafeStringify } from './stringify.js'; // **`v1()` - Generate time-based UUID**
+//
+// Inspired by https://github.com/LiosK/UUID.js
+// and http://docs.python.org/library/uuid.html
+
+let _nodeId;
+
+let _clockseq; // Previous uuid creation time
+
+
+let _lastMSecs = 0;
+let _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details
+
+function v1(options, buf, offset) {
+ let i = buf && offset || 0;
+ const b = buf || new Array(16);
+ options = options || {};
+ let node = options.node || _nodeId;
+ let clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not
+ // specified. We do this lazily to minimize issues related to insufficient
+ // system entropy. See #189
+
+ if (node == null || clockseq == null) {
+ const seedBytes = options.random || (options.rng || rng)();
+
+ if (node == null) {
+ // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)
+ node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]];
+ }
+
+ if (clockseq == null) {
+ // Per 4.2.2, randomize (14 bit) clockseq
+ clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;
+ }
+ } // UUID timestamps are 100 nano-second units since the Gregorian epoch,
+ // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so
+ // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'
+ // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.
+
+
+ let msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock
+ // cycle to simulate higher resolution clock
+
+ let nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs)
+
+ const dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression
+
+ if (dt < 0 && options.clockseq === undefined) {
+ clockseq = clockseq + 1 & 0x3fff;
+ } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new
+ // time interval
+
+
+ if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {
+ nsecs = 0;
+ } // Per 4.2.1.2 Throw error if too many uuids are requested
+
+
+ if (nsecs >= 10000) {
+ throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");
+ }
+
+ _lastMSecs = msecs;
+ _lastNSecs = nsecs;
+ _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch
+
+ msecs += 12219292800000; // `time_low`
+
+ const tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;
+ b[i++] = tl >>> 24 & 0xff;
+ b[i++] = tl >>> 16 & 0xff;
+ b[i++] = tl >>> 8 & 0xff;
+ b[i++] = tl & 0xff; // `time_mid`
+
+ const tmh = msecs / 0x100000000 * 10000 & 0xfffffff;
+ b[i++] = tmh >>> 8 & 0xff;
+ b[i++] = tmh & 0xff; // `time_high_and_version`
+
+ b[i++] = tmh >>> 24 & 0xf | 0x10; // include version
+
+ b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)
+
+ b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low`
+
+ b[i++] = clockseq & 0xff; // `node`
+
+ for (let n = 0; n < 6; ++n) {
+ b[i + n] = node[n];
+ }
+
+ return buf || unsafeStringify(b);
+}
+
+export default v1; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/esm-browser/v3.js b/includes/external/signal/node_modules/uuid/dist/esm-browser/v3.js
new file mode 100644
index 0000000..09063b8
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/esm-browser/v3.js
@@ -0,0 +1,4 @@
+import v35 from './v35.js';
+import md5 from './md5.js';
+const v3 = v35('v3', 0x30, md5);
+export default v3; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/esm-browser/v35.js b/includes/external/signal/node_modules/uuid/dist/esm-browser/v35.js
new file mode 100644
index 0000000..3355e1f
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/esm-browser/v35.js
@@ -0,0 +1,66 @@
+import { unsafeStringify } from './stringify.js';
+import parse from './parse.js';
+
+function stringToBytes(str) {
+ str = unescape(encodeURIComponent(str)); // UTF8 escape
+
+ const bytes = [];
+
+ for (let i = 0; i < str.length; ++i) {
+ bytes.push(str.charCodeAt(i));
+ }
+
+ return bytes;
+}
+
+export const DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';
+export const URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';
+export default function v35(name, version, hashfunc) {
+ function generateUUID(value, namespace, buf, offset) {
+ var _namespace;
+
+ if (typeof value === 'string') {
+ value = stringToBytes(value);
+ }
+
+ if (typeof namespace === 'string') {
+ namespace = parse(namespace);
+ }
+
+ if (((_namespace = namespace) === null || _namespace === void 0 ? void 0 : _namespace.length) !== 16) {
+ throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');
+ } // Compute hash of namespace and value, Per 4.3
+ // Future: Use spread syntax when supported on all platforms, e.g. `bytes =
+ // hashfunc([...namespace, ... value])`
+
+
+ let bytes = new Uint8Array(16 + value.length);
+ bytes.set(namespace);
+ bytes.set(value, namespace.length);
+ bytes = hashfunc(bytes);
+ bytes[6] = bytes[6] & 0x0f | version;
+ bytes[8] = bytes[8] & 0x3f | 0x80;
+
+ if (buf) {
+ offset = offset || 0;
+
+ for (let i = 0; i < 16; ++i) {
+ buf[offset + i] = bytes[i];
+ }
+
+ return buf;
+ }
+
+ return unsafeStringify(bytes);
+ } // Function#name is not settable on some platforms (#270)
+
+
+ try {
+ generateUUID.name = name; // eslint-disable-next-line no-empty
+ } catch (err) {} // For CommonJS default export support
+
+
+ generateUUID.DNS = DNS;
+ generateUUID.URL = URL;
+ return generateUUID;
+} \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/esm-browser/v4.js b/includes/external/signal/node_modules/uuid/dist/esm-browser/v4.js
new file mode 100644
index 0000000..95ea879
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/esm-browser/v4.js
@@ -0,0 +1,29 @@
+import native from './native.js';
+import rng from './rng.js';
+import { unsafeStringify } from './stringify.js';
+
+function v4(options, buf, offset) {
+ if (native.randomUUID && !buf && !options) {
+ return native.randomUUID();
+ }
+
+ options = options || {};
+ const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`
+
+ rnds[6] = rnds[6] & 0x0f | 0x40;
+ rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided
+
+ if (buf) {
+ offset = offset || 0;
+
+ for (let i = 0; i < 16; ++i) {
+ buf[offset + i] = rnds[i];
+ }
+
+ return buf;
+ }
+
+ return unsafeStringify(rnds);
+}
+
+export default v4; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/esm-browser/v5.js b/includes/external/signal/node_modules/uuid/dist/esm-browser/v5.js
new file mode 100644
index 0000000..e87fe31
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/esm-browser/v5.js
@@ -0,0 +1,4 @@
+import v35 from './v35.js';
+import sha1 from './sha1.js';
+const v5 = v35('v5', 0x50, sha1);
+export default v5; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/esm-browser/validate.js b/includes/external/signal/node_modules/uuid/dist/esm-browser/validate.js
new file mode 100644
index 0000000..f1cdc7a
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/esm-browser/validate.js
@@ -0,0 +1,7 @@
+import REGEX from './regex.js';
+
+function validate(uuid) {
+ return typeof uuid === 'string' && REGEX.test(uuid);
+}
+
+export default validate; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/esm-browser/version.js b/includes/external/signal/node_modules/uuid/dist/esm-browser/version.js
new file mode 100644
index 0000000..9363076
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/esm-browser/version.js
@@ -0,0 +1,11 @@
+import validate from './validate.js';
+
+function version(uuid) {
+ if (!validate(uuid)) {
+ throw TypeError('Invalid UUID');
+ }
+
+ return parseInt(uuid.slice(14, 15), 16);
+}
+
+export default version; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/esm-node/index.js b/includes/external/signal/node_modules/uuid/dist/esm-node/index.js
new file mode 100644
index 0000000..1db6f6d
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/esm-node/index.js
@@ -0,0 +1,9 @@
+export { default as v1 } from './v1.js';
+export { default as v3 } from './v3.js';
+export { default as v4 } from './v4.js';
+export { default as v5 } from './v5.js';
+export { default as NIL } from './nil.js';
+export { default as version } from './version.js';
+export { default as validate } from './validate.js';
+export { default as stringify } from './stringify.js';
+export { default as parse } from './parse.js'; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/esm-node/md5.js b/includes/external/signal/node_modules/uuid/dist/esm-node/md5.js
new file mode 100644
index 0000000..4d68b04
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/esm-node/md5.js
@@ -0,0 +1,13 @@
+import crypto from 'crypto';
+
+function md5(bytes) {
+ if (Array.isArray(bytes)) {
+ bytes = Buffer.from(bytes);
+ } else if (typeof bytes === 'string') {
+ bytes = Buffer.from(bytes, 'utf8');
+ }
+
+ return crypto.createHash('md5').update(bytes).digest();
+}
+
+export default md5; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/esm-node/native.js b/includes/external/signal/node_modules/uuid/dist/esm-node/native.js
new file mode 100644
index 0000000..f0d1992
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/esm-node/native.js
@@ -0,0 +1,4 @@
+import crypto from 'crypto';
+export default {
+ randomUUID: crypto.randomUUID
+}; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/esm-node/nil.js b/includes/external/signal/node_modules/uuid/dist/esm-node/nil.js
new file mode 100644
index 0000000..b36324c
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/esm-node/nil.js
@@ -0,0 +1 @@
+export default '00000000-0000-0000-0000-000000000000'; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/esm-node/parse.js b/includes/external/signal/node_modules/uuid/dist/esm-node/parse.js
new file mode 100644
index 0000000..6421c5d
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/esm-node/parse.js
@@ -0,0 +1,35 @@
+import validate from './validate.js';
+
+function parse(uuid) {
+ if (!validate(uuid)) {
+ throw TypeError('Invalid UUID');
+ }
+
+ let v;
+ const arr = new Uint8Array(16); // Parse ########-....-....-....-............
+
+ arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24;
+ arr[1] = v >>> 16 & 0xff;
+ arr[2] = v >>> 8 & 0xff;
+ arr[3] = v & 0xff; // Parse ........-####-....-....-............
+
+ arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8;
+ arr[5] = v & 0xff; // Parse ........-....-####-....-............
+
+ arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8;
+ arr[7] = v & 0xff; // Parse ........-....-....-####-............
+
+ arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8;
+ arr[9] = v & 0xff; // Parse ........-....-....-....-############
+ // (Use "/" to avoid 32-bit truncation when bit-shifting high-order bytes)
+
+ arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff;
+ arr[11] = v / 0x100000000 & 0xff;
+ arr[12] = v >>> 24 & 0xff;
+ arr[13] = v >>> 16 & 0xff;
+ arr[14] = v >>> 8 & 0xff;
+ arr[15] = v & 0xff;
+ return arr;
+}
+
+export default parse; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/esm-node/regex.js b/includes/external/signal/node_modules/uuid/dist/esm-node/regex.js
new file mode 100644
index 0000000..3da8673
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/esm-node/regex.js
@@ -0,0 +1 @@
+export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/esm-node/rng.js b/includes/external/signal/node_modules/uuid/dist/esm-node/rng.js
new file mode 100644
index 0000000..8006244
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/esm-node/rng.js
@@ -0,0 +1,12 @@
+import crypto from 'crypto';
+const rnds8Pool = new Uint8Array(256); // # of random values to pre-allocate
+
+let poolPtr = rnds8Pool.length;
+export default function rng() {
+ if (poolPtr > rnds8Pool.length - 16) {
+ crypto.randomFillSync(rnds8Pool);
+ poolPtr = 0;
+ }
+
+ return rnds8Pool.slice(poolPtr, poolPtr += 16);
+} \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/esm-node/sha1.js b/includes/external/signal/node_modules/uuid/dist/esm-node/sha1.js
new file mode 100644
index 0000000..e23850b
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/esm-node/sha1.js
@@ -0,0 +1,13 @@
+import crypto from 'crypto';
+
+function sha1(bytes) {
+ if (Array.isArray(bytes)) {
+ bytes = Buffer.from(bytes);
+ } else if (typeof bytes === 'string') {
+ bytes = Buffer.from(bytes, 'utf8');
+ }
+
+ return crypto.createHash('sha1').update(bytes).digest();
+}
+
+export default sha1; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/esm-node/stringify.js b/includes/external/signal/node_modules/uuid/dist/esm-node/stringify.js
new file mode 100644
index 0000000..80fac8a
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/esm-node/stringify.js
@@ -0,0 +1,33 @@
+import validate from './validate.js';
+/**
+ * Convert array of 16 byte values to UUID string format of the form:
+ * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
+ */
+
+const byteToHex = [];
+
+for (let i = 0; i < 256; ++i) {
+ byteToHex.push((i + 0x100).toString(16).slice(1));
+}
+
+export function unsafeStringify(arr, offset = 0) {
+ // Note: Be careful editing this code! It's been tuned for performance
+ // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434
+ return (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase();
+}
+
+function stringify(arr, offset = 0) {
+ const uuid = unsafeStringify(arr, offset); // Consistency check for valid UUID. If this throws, it's likely due to one
+ // of the following:
+ // - One or more input array values don't map to a hex octet (leading to
+ // "undefined" in the uuid)
+ // - Invalid input values for the RFC `version` or `variant` fields
+
+ if (!validate(uuid)) {
+ throw TypeError('Stringified UUID is invalid');
+ }
+
+ return uuid;
+}
+
+export default stringify; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/esm-node/v1.js b/includes/external/signal/node_modules/uuid/dist/esm-node/v1.js
new file mode 100644
index 0000000..382e5d7
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/esm-node/v1.js
@@ -0,0 +1,95 @@
+import rng from './rng.js';
+import { unsafeStringify } from './stringify.js'; // **`v1()` - Generate time-based UUID**
+//
+// Inspired by https://github.com/LiosK/UUID.js
+// and http://docs.python.org/library/uuid.html
+
+let _nodeId;
+
+let _clockseq; // Previous uuid creation time
+
+
+let _lastMSecs = 0;
+let _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details
+
+function v1(options, buf, offset) {
+ let i = buf && offset || 0;
+ const b = buf || new Array(16);
+ options = options || {};
+ let node = options.node || _nodeId;
+ let clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not
+ // specified. We do this lazily to minimize issues related to insufficient
+ // system entropy. See #189
+
+ if (node == null || clockseq == null) {
+ const seedBytes = options.random || (options.rng || rng)();
+
+ if (node == null) {
+ // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)
+ node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]];
+ }
+
+ if (clockseq == null) {
+ // Per 4.2.2, randomize (14 bit) clockseq
+ clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;
+ }
+ } // UUID timestamps are 100 nano-second units since the Gregorian epoch,
+ // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so
+ // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'
+ // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.
+
+
+ let msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock
+ // cycle to simulate higher resolution clock
+
+ let nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs)
+
+ const dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression
+
+ if (dt < 0 && options.clockseq === undefined) {
+ clockseq = clockseq + 1 & 0x3fff;
+ } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new
+ // time interval
+
+
+ if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {
+ nsecs = 0;
+ } // Per 4.2.1.2 Throw error if too many uuids are requested
+
+
+ if (nsecs >= 10000) {
+ throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");
+ }
+
+ _lastMSecs = msecs;
+ _lastNSecs = nsecs;
+ _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch
+
+ msecs += 12219292800000; // `time_low`
+
+ const tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;
+ b[i++] = tl >>> 24 & 0xff;
+ b[i++] = tl >>> 16 & 0xff;
+ b[i++] = tl >>> 8 & 0xff;
+ b[i++] = tl & 0xff; // `time_mid`
+
+ const tmh = msecs / 0x100000000 * 10000 & 0xfffffff;
+ b[i++] = tmh >>> 8 & 0xff;
+ b[i++] = tmh & 0xff; // `time_high_and_version`
+
+ b[i++] = tmh >>> 24 & 0xf | 0x10; // include version
+
+ b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)
+
+ b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low`
+
+ b[i++] = clockseq & 0xff; // `node`
+
+ for (let n = 0; n < 6; ++n) {
+ b[i + n] = node[n];
+ }
+
+ return buf || unsafeStringify(b);
+}
+
+export default v1; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/esm-node/v3.js b/includes/external/signal/node_modules/uuid/dist/esm-node/v3.js
new file mode 100644
index 0000000..09063b8
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/esm-node/v3.js
@@ -0,0 +1,4 @@
+import v35 from './v35.js';
+import md5 from './md5.js';
+const v3 = v35('v3', 0x30, md5);
+export default v3; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/esm-node/v35.js b/includes/external/signal/node_modules/uuid/dist/esm-node/v35.js
new file mode 100644
index 0000000..3355e1f
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/esm-node/v35.js
@@ -0,0 +1,66 @@
+import { unsafeStringify } from './stringify.js';
+import parse from './parse.js';
+
+function stringToBytes(str) {
+ str = unescape(encodeURIComponent(str)); // UTF8 escape
+
+ const bytes = [];
+
+ for (let i = 0; i < str.length; ++i) {
+ bytes.push(str.charCodeAt(i));
+ }
+
+ return bytes;
+}
+
+export const DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';
+export const URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';
+export default function v35(name, version, hashfunc) {
+ function generateUUID(value, namespace, buf, offset) {
+ var _namespace;
+
+ if (typeof value === 'string') {
+ value = stringToBytes(value);
+ }
+
+ if (typeof namespace === 'string') {
+ namespace = parse(namespace);
+ }
+
+ if (((_namespace = namespace) === null || _namespace === void 0 ? void 0 : _namespace.length) !== 16) {
+ throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');
+ } // Compute hash of namespace and value, Per 4.3
+ // Future: Use spread syntax when supported on all platforms, e.g. `bytes =
+ // hashfunc([...namespace, ... value])`
+
+
+ let bytes = new Uint8Array(16 + value.length);
+ bytes.set(namespace);
+ bytes.set(value, namespace.length);
+ bytes = hashfunc(bytes);
+ bytes[6] = bytes[6] & 0x0f | version;
+ bytes[8] = bytes[8] & 0x3f | 0x80;
+
+ if (buf) {
+ offset = offset || 0;
+
+ for (let i = 0; i < 16; ++i) {
+ buf[offset + i] = bytes[i];
+ }
+
+ return buf;
+ }
+
+ return unsafeStringify(bytes);
+ } // Function#name is not settable on some platforms (#270)
+
+
+ try {
+ generateUUID.name = name; // eslint-disable-next-line no-empty
+ } catch (err) {} // For CommonJS default export support
+
+
+ generateUUID.DNS = DNS;
+ generateUUID.URL = URL;
+ return generateUUID;
+} \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/esm-node/v4.js b/includes/external/signal/node_modules/uuid/dist/esm-node/v4.js
new file mode 100644
index 0000000..95ea879
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/esm-node/v4.js
@@ -0,0 +1,29 @@
+import native from './native.js';
+import rng from './rng.js';
+import { unsafeStringify } from './stringify.js';
+
+function v4(options, buf, offset) {
+ if (native.randomUUID && !buf && !options) {
+ return native.randomUUID();
+ }
+
+ options = options || {};
+ const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`
+
+ rnds[6] = rnds[6] & 0x0f | 0x40;
+ rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided
+
+ if (buf) {
+ offset = offset || 0;
+
+ for (let i = 0; i < 16; ++i) {
+ buf[offset + i] = rnds[i];
+ }
+
+ return buf;
+ }
+
+ return unsafeStringify(rnds);
+}
+
+export default v4; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/esm-node/v5.js b/includes/external/signal/node_modules/uuid/dist/esm-node/v5.js
new file mode 100644
index 0000000..e87fe31
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/esm-node/v5.js
@@ -0,0 +1,4 @@
+import v35 from './v35.js';
+import sha1 from './sha1.js';
+const v5 = v35('v5', 0x50, sha1);
+export default v5; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/esm-node/validate.js b/includes/external/signal/node_modules/uuid/dist/esm-node/validate.js
new file mode 100644
index 0000000..f1cdc7a
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/esm-node/validate.js
@@ -0,0 +1,7 @@
+import REGEX from './regex.js';
+
+function validate(uuid) {
+ return typeof uuid === 'string' && REGEX.test(uuid);
+}
+
+export default validate; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/esm-node/version.js b/includes/external/signal/node_modules/uuid/dist/esm-node/version.js
new file mode 100644
index 0000000..9363076
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/esm-node/version.js
@@ -0,0 +1,11 @@
+import validate from './validate.js';
+
+function version(uuid) {
+ if (!validate(uuid)) {
+ throw TypeError('Invalid UUID');
+ }
+
+ return parseInt(uuid.slice(14, 15), 16);
+}
+
+export default version; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/index.js b/includes/external/signal/node_modules/uuid/dist/index.js
new file mode 100644
index 0000000..88d676a
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/index.js
@@ -0,0 +1,79 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+Object.defineProperty(exports, "NIL", {
+ enumerable: true,
+ get: function () {
+ return _nil.default;
+ }
+});
+Object.defineProperty(exports, "parse", {
+ enumerable: true,
+ get: function () {
+ return _parse.default;
+ }
+});
+Object.defineProperty(exports, "stringify", {
+ enumerable: true,
+ get: function () {
+ return _stringify.default;
+ }
+});
+Object.defineProperty(exports, "v1", {
+ enumerable: true,
+ get: function () {
+ return _v.default;
+ }
+});
+Object.defineProperty(exports, "v3", {
+ enumerable: true,
+ get: function () {
+ return _v2.default;
+ }
+});
+Object.defineProperty(exports, "v4", {
+ enumerable: true,
+ get: function () {
+ return _v3.default;
+ }
+});
+Object.defineProperty(exports, "v5", {
+ enumerable: true,
+ get: function () {
+ return _v4.default;
+ }
+});
+Object.defineProperty(exports, "validate", {
+ enumerable: true,
+ get: function () {
+ return _validate.default;
+ }
+});
+Object.defineProperty(exports, "version", {
+ enumerable: true,
+ get: function () {
+ return _version.default;
+ }
+});
+
+var _v = _interopRequireDefault(require("./v1.js"));
+
+var _v2 = _interopRequireDefault(require("./v3.js"));
+
+var _v3 = _interopRequireDefault(require("./v4.js"));
+
+var _v4 = _interopRequireDefault(require("./v5.js"));
+
+var _nil = _interopRequireDefault(require("./nil.js"));
+
+var _version = _interopRequireDefault(require("./version.js"));
+
+var _validate = _interopRequireDefault(require("./validate.js"));
+
+var _stringify = _interopRequireDefault(require("./stringify.js"));
+
+var _parse = _interopRequireDefault(require("./parse.js"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/md5-browser.js b/includes/external/signal/node_modules/uuid/dist/md5-browser.js
new file mode 100644
index 0000000..7a4582a
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/md5-browser.js
@@ -0,0 +1,223 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = void 0;
+
+/*
+ * Browser-compatible JavaScript MD5
+ *
+ * Modification of JavaScript MD5
+ * https://github.com/blueimp/JavaScript-MD5
+ *
+ * Copyright 2011, Sebastian Tschan
+ * https://blueimp.net
+ *
+ * Licensed under the MIT license:
+ * https://opensource.org/licenses/MIT
+ *
+ * Based on
+ * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
+ * Digest Algorithm, as defined in RFC 1321.
+ * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
+ * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
+ * Distributed under the BSD License
+ * See http://pajhome.org.uk/crypt/md5 for more info.
+ */
+function md5(bytes) {
+ if (typeof bytes === 'string') {
+ const msg = unescape(encodeURIComponent(bytes)); // UTF8 escape
+
+ bytes = new Uint8Array(msg.length);
+
+ for (let i = 0; i < msg.length; ++i) {
+ bytes[i] = msg.charCodeAt(i);
+ }
+ }
+
+ return md5ToHexEncodedArray(wordsToMd5(bytesToWords(bytes), bytes.length * 8));
+}
+/*
+ * Convert an array of little-endian words to an array of bytes
+ */
+
+
+function md5ToHexEncodedArray(input) {
+ const output = [];
+ const length32 = input.length * 32;
+ const hexTab = '0123456789abcdef';
+
+ for (let i = 0; i < length32; i += 8) {
+ const x = input[i >> 5] >>> i % 32 & 0xff;
+ const hex = parseInt(hexTab.charAt(x >>> 4 & 0x0f) + hexTab.charAt(x & 0x0f), 16);
+ output.push(hex);
+ }
+
+ return output;
+}
+/**
+ * Calculate output length with padding and bit length
+ */
+
+
+function getOutputLength(inputLength8) {
+ return (inputLength8 + 64 >>> 9 << 4) + 14 + 1;
+}
+/*
+ * Calculate the MD5 of an array of little-endian words, and a bit length.
+ */
+
+
+function wordsToMd5(x, len) {
+ /* append padding */
+ x[len >> 5] |= 0x80 << len % 32;
+ x[getOutputLength(len) - 1] = len;
+ let a = 1732584193;
+ let b = -271733879;
+ let c = -1732584194;
+ let d = 271733878;
+
+ for (let i = 0; i < x.length; i += 16) {
+ const olda = a;
+ const oldb = b;
+ const oldc = c;
+ const oldd = d;
+ a = md5ff(a, b, c, d, x[i], 7, -680876936);
+ d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);
+ c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);
+ b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);
+ a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);
+ d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);
+ c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);
+ b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);
+ a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);
+ d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);
+ c = md5ff(c, d, a, b, x[i + 10], 17, -42063);
+ b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);
+ a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);
+ d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);
+ c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);
+ b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);
+ a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);
+ d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);
+ c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);
+ b = md5gg(b, c, d, a, x[i], 20, -373897302);
+ a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);
+ d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);
+ c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);
+ b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);
+ a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);
+ d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);
+ c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);
+ b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);
+ a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);
+ d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);
+ c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);
+ b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);
+ a = md5hh(a, b, c, d, x[i + 5], 4, -378558);
+ d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);
+ c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);
+ b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);
+ a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);
+ d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);
+ c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);
+ b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);
+ a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);
+ d = md5hh(d, a, b, c, x[i], 11, -358537222);
+ c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);
+ b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);
+ a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);
+ d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);
+ c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);
+ b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);
+ a = md5ii(a, b, c, d, x[i], 6, -198630844);
+ d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);
+ c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);
+ b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);
+ a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);
+ d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);
+ c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);
+ b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);
+ a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);
+ d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);
+ c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);
+ b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);
+ a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);
+ d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);
+ c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);
+ b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);
+ a = safeAdd(a, olda);
+ b = safeAdd(b, oldb);
+ c = safeAdd(c, oldc);
+ d = safeAdd(d, oldd);
+ }
+
+ return [a, b, c, d];
+}
+/*
+ * Convert an array bytes to an array of little-endian words
+ * Characters >255 have their high-byte silently ignored.
+ */
+
+
+function bytesToWords(input) {
+ if (input.length === 0) {
+ return [];
+ }
+
+ const length8 = input.length * 8;
+ const output = new Uint32Array(getOutputLength(length8));
+
+ for (let i = 0; i < length8; i += 8) {
+ output[i >> 5] |= (input[i / 8] & 0xff) << i % 32;
+ }
+
+ return output;
+}
+/*
+ * Add integers, wrapping at 2^32. This uses 16-bit operations internally
+ * to work around bugs in some JS interpreters.
+ */
+
+
+function safeAdd(x, y) {
+ const lsw = (x & 0xffff) + (y & 0xffff);
+ const msw = (x >> 16) + (y >> 16) + (lsw >> 16);
+ return msw << 16 | lsw & 0xffff;
+}
+/*
+ * Bitwise rotate a 32-bit number to the left.
+ */
+
+
+function bitRotateLeft(num, cnt) {
+ return num << cnt | num >>> 32 - cnt;
+}
+/*
+ * These functions implement the four basic operations the algorithm uses.
+ */
+
+
+function md5cmn(q, a, b, x, s, t) {
+ return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);
+}
+
+function md5ff(a, b, c, d, x, s, t) {
+ return md5cmn(b & c | ~b & d, a, b, x, s, t);
+}
+
+function md5gg(a, b, c, d, x, s, t) {
+ return md5cmn(b & d | c & ~d, a, b, x, s, t);
+}
+
+function md5hh(a, b, c, d, x, s, t) {
+ return md5cmn(b ^ c ^ d, a, b, x, s, t);
+}
+
+function md5ii(a, b, c, d, x, s, t) {
+ return md5cmn(c ^ (b | ~d), a, b, x, s, t);
+}
+
+var _default = md5;
+exports.default = _default; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/md5.js b/includes/external/signal/node_modules/uuid/dist/md5.js
new file mode 100644
index 0000000..824d481
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/md5.js
@@ -0,0 +1,23 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = void 0;
+
+var _crypto = _interopRequireDefault(require("crypto"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function md5(bytes) {
+ if (Array.isArray(bytes)) {
+ bytes = Buffer.from(bytes);
+ } else if (typeof bytes === 'string') {
+ bytes = Buffer.from(bytes, 'utf8');
+ }
+
+ return _crypto.default.createHash('md5').update(bytes).digest();
+}
+
+var _default = md5;
+exports.default = _default; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/native-browser.js b/includes/external/signal/node_modules/uuid/dist/native-browser.js
new file mode 100644
index 0000000..c2eea59
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/native-browser.js
@@ -0,0 +1,11 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = void 0;
+const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);
+var _default = {
+ randomUUID
+};
+exports.default = _default; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/native.js b/includes/external/signal/node_modules/uuid/dist/native.js
new file mode 100644
index 0000000..de80469
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/native.js
@@ -0,0 +1,15 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = void 0;
+
+var _crypto = _interopRequireDefault(require("crypto"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var _default = {
+ randomUUID: _crypto.default.randomUUID
+};
+exports.default = _default; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/nil.js b/includes/external/signal/node_modules/uuid/dist/nil.js
new file mode 100644
index 0000000..7ade577
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/nil.js
@@ -0,0 +1,8 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = void 0;
+var _default = '00000000-0000-0000-0000-000000000000';
+exports.default = _default; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/parse.js b/includes/external/signal/node_modules/uuid/dist/parse.js
new file mode 100644
index 0000000..4c69fc3
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/parse.js
@@ -0,0 +1,45 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = void 0;
+
+var _validate = _interopRequireDefault(require("./validate.js"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function parse(uuid) {
+ if (!(0, _validate.default)(uuid)) {
+ throw TypeError('Invalid UUID');
+ }
+
+ let v;
+ const arr = new Uint8Array(16); // Parse ########-....-....-....-............
+
+ arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24;
+ arr[1] = v >>> 16 & 0xff;
+ arr[2] = v >>> 8 & 0xff;
+ arr[3] = v & 0xff; // Parse ........-####-....-....-............
+
+ arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8;
+ arr[5] = v & 0xff; // Parse ........-....-####-....-............
+
+ arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8;
+ arr[7] = v & 0xff; // Parse ........-....-....-####-............
+
+ arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8;
+ arr[9] = v & 0xff; // Parse ........-....-....-....-############
+ // (Use "/" to avoid 32-bit truncation when bit-shifting high-order bytes)
+
+ arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff;
+ arr[11] = v / 0x100000000 & 0xff;
+ arr[12] = v >>> 24 & 0xff;
+ arr[13] = v >>> 16 & 0xff;
+ arr[14] = v >>> 8 & 0xff;
+ arr[15] = v & 0xff;
+ return arr;
+}
+
+var _default = parse;
+exports.default = _default; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/regex.js b/includes/external/signal/node_modules/uuid/dist/regex.js
new file mode 100644
index 0000000..1ef91d6
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/regex.js
@@ -0,0 +1,8 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = void 0;
+var _default = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;
+exports.default = _default; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/rng-browser.js b/includes/external/signal/node_modules/uuid/dist/rng-browser.js
new file mode 100644
index 0000000..d067cdb
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/rng-browser.js
@@ -0,0 +1,25 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = rng;
+// Unique ID creation requires a high quality random # generator. In the browser we therefore
+// require the crypto API and do not support built-in fallback to lower quality random number
+// generators (like Math.random()).
+let getRandomValues;
+const rnds8 = new Uint8Array(16);
+
+function rng() {
+ // lazy load so that environments that need to polyfill have a chance to do so
+ if (!getRandomValues) {
+ // getRandomValues needs to be invoked in a context where "this" is a Crypto implementation.
+ getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto);
+
+ if (!getRandomValues) {
+ throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');
+ }
+ }
+
+ return getRandomValues(rnds8);
+} \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/rng.js b/includes/external/signal/node_modules/uuid/dist/rng.js
new file mode 100644
index 0000000..3507f93
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/rng.js
@@ -0,0 +1,24 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = rng;
+
+var _crypto = _interopRequireDefault(require("crypto"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+const rnds8Pool = new Uint8Array(256); // # of random values to pre-allocate
+
+let poolPtr = rnds8Pool.length;
+
+function rng() {
+ if (poolPtr > rnds8Pool.length - 16) {
+ _crypto.default.randomFillSync(rnds8Pool);
+
+ poolPtr = 0;
+ }
+
+ return rnds8Pool.slice(poolPtr, poolPtr += 16);
+} \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/sha1-browser.js b/includes/external/signal/node_modules/uuid/dist/sha1-browser.js
new file mode 100644
index 0000000..24cbced
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/sha1-browser.js
@@ -0,0 +1,104 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = void 0;
+
+// Adapted from Chris Veness' SHA1 code at
+// http://www.movable-type.co.uk/scripts/sha1.html
+function f(s, x, y, z) {
+ switch (s) {
+ case 0:
+ return x & y ^ ~x & z;
+
+ case 1:
+ return x ^ y ^ z;
+
+ case 2:
+ return x & y ^ x & z ^ y & z;
+
+ case 3:
+ return x ^ y ^ z;
+ }
+}
+
+function ROTL(x, n) {
+ return x << n | x >>> 32 - n;
+}
+
+function sha1(bytes) {
+ const K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6];
+ const H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0];
+
+ if (typeof bytes === 'string') {
+ const msg = unescape(encodeURIComponent(bytes)); // UTF8 escape
+
+ bytes = [];
+
+ for (let i = 0; i < msg.length; ++i) {
+ bytes.push(msg.charCodeAt(i));
+ }
+ } else if (!Array.isArray(bytes)) {
+ // Convert Array-like to Array
+ bytes = Array.prototype.slice.call(bytes);
+ }
+
+ bytes.push(0x80);
+ const l = bytes.length / 4 + 2;
+ const N = Math.ceil(l / 16);
+ const M = new Array(N);
+
+ for (let i = 0; i < N; ++i) {
+ const arr = new Uint32Array(16);
+
+ for (let j = 0; j < 16; ++j) {
+ arr[j] = bytes[i * 64 + j * 4] << 24 | bytes[i * 64 + j * 4 + 1] << 16 | bytes[i * 64 + j * 4 + 2] << 8 | bytes[i * 64 + j * 4 + 3];
+ }
+
+ M[i] = arr;
+ }
+
+ M[N - 1][14] = (bytes.length - 1) * 8 / Math.pow(2, 32);
+ M[N - 1][14] = Math.floor(M[N - 1][14]);
+ M[N - 1][15] = (bytes.length - 1) * 8 & 0xffffffff;
+
+ for (let i = 0; i < N; ++i) {
+ const W = new Uint32Array(80);
+
+ for (let t = 0; t < 16; ++t) {
+ W[t] = M[i][t];
+ }
+
+ for (let t = 16; t < 80; ++t) {
+ W[t] = ROTL(W[t - 3] ^ W[t - 8] ^ W[t - 14] ^ W[t - 16], 1);
+ }
+
+ let a = H[0];
+ let b = H[1];
+ let c = H[2];
+ let d = H[3];
+ let e = H[4];
+
+ for (let t = 0; t < 80; ++t) {
+ const s = Math.floor(t / 20);
+ const T = ROTL(a, 5) + f(s, b, c, d) + e + K[s] + W[t] >>> 0;
+ e = d;
+ d = c;
+ c = ROTL(b, 30) >>> 0;
+ b = a;
+ a = T;
+ }
+
+ H[0] = H[0] + a >>> 0;
+ H[1] = H[1] + b >>> 0;
+ H[2] = H[2] + c >>> 0;
+ H[3] = H[3] + d >>> 0;
+ H[4] = H[4] + e >>> 0;
+ }
+
+ return [H[0] >> 24 & 0xff, H[0] >> 16 & 0xff, H[0] >> 8 & 0xff, H[0] & 0xff, H[1] >> 24 & 0xff, H[1] >> 16 & 0xff, H[1] >> 8 & 0xff, H[1] & 0xff, H[2] >> 24 & 0xff, H[2] >> 16 & 0xff, H[2] >> 8 & 0xff, H[2] & 0xff, H[3] >> 24 & 0xff, H[3] >> 16 & 0xff, H[3] >> 8 & 0xff, H[3] & 0xff, H[4] >> 24 & 0xff, H[4] >> 16 & 0xff, H[4] >> 8 & 0xff, H[4] & 0xff];
+}
+
+var _default = sha1;
+exports.default = _default; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/sha1.js b/includes/external/signal/node_modules/uuid/dist/sha1.js
new file mode 100644
index 0000000..03bdd63
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/sha1.js
@@ -0,0 +1,23 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = void 0;
+
+var _crypto = _interopRequireDefault(require("crypto"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function sha1(bytes) {
+ if (Array.isArray(bytes)) {
+ bytes = Buffer.from(bytes);
+ } else if (typeof bytes === 'string') {
+ bytes = Buffer.from(bytes, 'utf8');
+ }
+
+ return _crypto.default.createHash('sha1').update(bytes).digest();
+}
+
+var _default = sha1;
+exports.default = _default; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/stringify.js b/includes/external/signal/node_modules/uuid/dist/stringify.js
new file mode 100644
index 0000000..bdcea1c
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/stringify.js
@@ -0,0 +1,44 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = void 0;
+exports.unsafeStringify = unsafeStringify;
+
+var _validate = _interopRequireDefault(require("./validate.js"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * Convert array of 16 byte values to UUID string format of the form:
+ * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
+ */
+const byteToHex = [];
+
+for (let i = 0; i < 256; ++i) {
+ byteToHex.push((i + 0x100).toString(16).slice(1));
+}
+
+function unsafeStringify(arr, offset = 0) {
+ // Note: Be careful editing this code! It's been tuned for performance
+ // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434
+ return (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase();
+}
+
+function stringify(arr, offset = 0) {
+ const uuid = unsafeStringify(arr, offset); // Consistency check for valid UUID. If this throws, it's likely due to one
+ // of the following:
+ // - One or more input array values don't map to a hex octet (leading to
+ // "undefined" in the uuid)
+ // - Invalid input values for the RFC `version` or `variant` fields
+
+ if (!(0, _validate.default)(uuid)) {
+ throw TypeError('Stringified UUID is invalid');
+ }
+
+ return uuid;
+}
+
+var _default = stringify;
+exports.default = _default; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/uuid-bin.js b/includes/external/signal/node_modules/uuid/dist/uuid-bin.js
new file mode 100644
index 0000000..50a7a9f
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/uuid-bin.js
@@ -0,0 +1,85 @@
+"use strict";
+
+var _assert = _interopRequireDefault(require("assert"));
+
+var _v = _interopRequireDefault(require("./v1.js"));
+
+var _v2 = _interopRequireDefault(require("./v3.js"));
+
+var _v3 = _interopRequireDefault(require("./v4.js"));
+
+var _v4 = _interopRequireDefault(require("./v5.js"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function usage() {
+ console.log('Usage:');
+ console.log(' uuid');
+ console.log(' uuid v1');
+ console.log(' uuid v3 <name> <namespace uuid>');
+ console.log(' uuid v4');
+ console.log(' uuid v5 <name> <namespace uuid>');
+ console.log(' uuid --help');
+ console.log('\nNote: <namespace uuid> may be "URL" or "DNS" to use the corresponding UUIDs defined by RFC4122');
+}
+
+const args = process.argv.slice(2);
+
+if (args.indexOf('--help') >= 0) {
+ usage();
+ process.exit(0);
+}
+
+const version = args.shift() || 'v4';
+
+switch (version) {
+ case 'v1':
+ console.log((0, _v.default)());
+ break;
+
+ case 'v3':
+ {
+ const name = args.shift();
+ let namespace = args.shift();
+ (0, _assert.default)(name != null, 'v3 name not specified');
+ (0, _assert.default)(namespace != null, 'v3 namespace not specified');
+
+ if (namespace === 'URL') {
+ namespace = _v2.default.URL;
+ }
+
+ if (namespace === 'DNS') {
+ namespace = _v2.default.DNS;
+ }
+
+ console.log((0, _v2.default)(name, namespace));
+ break;
+ }
+
+ case 'v4':
+ console.log((0, _v3.default)());
+ break;
+
+ case 'v5':
+ {
+ const name = args.shift();
+ let namespace = args.shift();
+ (0, _assert.default)(name != null, 'v5 name not specified');
+ (0, _assert.default)(namespace != null, 'v5 namespace not specified');
+
+ if (namespace === 'URL') {
+ namespace = _v4.default.URL;
+ }
+
+ if (namespace === 'DNS') {
+ namespace = _v4.default.DNS;
+ }
+
+ console.log((0, _v4.default)(name, namespace));
+ break;
+ }
+
+ default:
+ usage();
+ process.exit(1);
+} \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/v1.js b/includes/external/signal/node_modules/uuid/dist/v1.js
new file mode 100644
index 0000000..125bc58
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/v1.js
@@ -0,0 +1,107 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = void 0;
+
+var _rng = _interopRequireDefault(require("./rng.js"));
+
+var _stringify = require("./stringify.js");
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+// **`v1()` - Generate time-based UUID**
+//
+// Inspired by https://github.com/LiosK/UUID.js
+// and http://docs.python.org/library/uuid.html
+let _nodeId;
+
+let _clockseq; // Previous uuid creation time
+
+
+let _lastMSecs = 0;
+let _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details
+
+function v1(options, buf, offset) {
+ let i = buf && offset || 0;
+ const b = buf || new Array(16);
+ options = options || {};
+ let node = options.node || _nodeId;
+ let clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not
+ // specified. We do this lazily to minimize issues related to insufficient
+ // system entropy. See #189
+
+ if (node == null || clockseq == null) {
+ const seedBytes = options.random || (options.rng || _rng.default)();
+
+ if (node == null) {
+ // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)
+ node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]];
+ }
+
+ if (clockseq == null) {
+ // Per 4.2.2, randomize (14 bit) clockseq
+ clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;
+ }
+ } // UUID timestamps are 100 nano-second units since the Gregorian epoch,
+ // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so
+ // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'
+ // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.
+
+
+ let msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock
+ // cycle to simulate higher resolution clock
+
+ let nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs)
+
+ const dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression
+
+ if (dt < 0 && options.clockseq === undefined) {
+ clockseq = clockseq + 1 & 0x3fff;
+ } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new
+ // time interval
+
+
+ if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {
+ nsecs = 0;
+ } // Per 4.2.1.2 Throw error if too many uuids are requested
+
+
+ if (nsecs >= 10000) {
+ throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");
+ }
+
+ _lastMSecs = msecs;
+ _lastNSecs = nsecs;
+ _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch
+
+ msecs += 12219292800000; // `time_low`
+
+ const tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;
+ b[i++] = tl >>> 24 & 0xff;
+ b[i++] = tl >>> 16 & 0xff;
+ b[i++] = tl >>> 8 & 0xff;
+ b[i++] = tl & 0xff; // `time_mid`
+
+ const tmh = msecs / 0x100000000 * 10000 & 0xfffffff;
+ b[i++] = tmh >>> 8 & 0xff;
+ b[i++] = tmh & 0xff; // `time_high_and_version`
+
+ b[i++] = tmh >>> 24 & 0xf | 0x10; // include version
+
+ b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)
+
+ b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low`
+
+ b[i++] = clockseq & 0xff; // `node`
+
+ for (let n = 0; n < 6; ++n) {
+ b[i + n] = node[n];
+ }
+
+ return buf || (0, _stringify.unsafeStringify)(b);
+}
+
+var _default = v1;
+exports.default = _default; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/v3.js b/includes/external/signal/node_modules/uuid/dist/v3.js
new file mode 100644
index 0000000..6b47ff5
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/v3.js
@@ -0,0 +1,16 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = void 0;
+
+var _v = _interopRequireDefault(require("./v35.js"));
+
+var _md = _interopRequireDefault(require("./md5.js"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+const v3 = (0, _v.default)('v3', 0x30, _md.default);
+var _default = v3;
+exports.default = _default; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/v35.js b/includes/external/signal/node_modules/uuid/dist/v35.js
new file mode 100644
index 0000000..7c522d9
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/v35.js
@@ -0,0 +1,80 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.URL = exports.DNS = void 0;
+exports.default = v35;
+
+var _stringify = require("./stringify.js");
+
+var _parse = _interopRequireDefault(require("./parse.js"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function stringToBytes(str) {
+ str = unescape(encodeURIComponent(str)); // UTF8 escape
+
+ const bytes = [];
+
+ for (let i = 0; i < str.length; ++i) {
+ bytes.push(str.charCodeAt(i));
+ }
+
+ return bytes;
+}
+
+const DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';
+exports.DNS = DNS;
+const URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';
+exports.URL = URL;
+
+function v35(name, version, hashfunc) {
+ function generateUUID(value, namespace, buf, offset) {
+ var _namespace;
+
+ if (typeof value === 'string') {
+ value = stringToBytes(value);
+ }
+
+ if (typeof namespace === 'string') {
+ namespace = (0, _parse.default)(namespace);
+ }
+
+ if (((_namespace = namespace) === null || _namespace === void 0 ? void 0 : _namespace.length) !== 16) {
+ throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');
+ } // Compute hash of namespace and value, Per 4.3
+ // Future: Use spread syntax when supported on all platforms, e.g. `bytes =
+ // hashfunc([...namespace, ... value])`
+
+
+ let bytes = new Uint8Array(16 + value.length);
+ bytes.set(namespace);
+ bytes.set(value, namespace.length);
+ bytes = hashfunc(bytes);
+ bytes[6] = bytes[6] & 0x0f | version;
+ bytes[8] = bytes[8] & 0x3f | 0x80;
+
+ if (buf) {
+ offset = offset || 0;
+
+ for (let i = 0; i < 16; ++i) {
+ buf[offset + i] = bytes[i];
+ }
+
+ return buf;
+ }
+
+ return (0, _stringify.unsafeStringify)(bytes);
+ } // Function#name is not settable on some platforms (#270)
+
+
+ try {
+ generateUUID.name = name; // eslint-disable-next-line no-empty
+ } catch (err) {} // For CommonJS default export support
+
+
+ generateUUID.DNS = DNS;
+ generateUUID.URL = URL;
+ return generateUUID;
+} \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/v4.js b/includes/external/signal/node_modules/uuid/dist/v4.js
new file mode 100644
index 0000000..959d698
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/v4.js
@@ -0,0 +1,43 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = void 0;
+
+var _native = _interopRequireDefault(require("./native.js"));
+
+var _rng = _interopRequireDefault(require("./rng.js"));
+
+var _stringify = require("./stringify.js");
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function v4(options, buf, offset) {
+ if (_native.default.randomUUID && !buf && !options) {
+ return _native.default.randomUUID();
+ }
+
+ options = options || {};
+
+ const rnds = options.random || (options.rng || _rng.default)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`
+
+
+ rnds[6] = rnds[6] & 0x0f | 0x40;
+ rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided
+
+ if (buf) {
+ offset = offset || 0;
+
+ for (let i = 0; i < 16; ++i) {
+ buf[offset + i] = rnds[i];
+ }
+
+ return buf;
+ }
+
+ return (0, _stringify.unsafeStringify)(rnds);
+}
+
+var _default = v4;
+exports.default = _default; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/v5.js b/includes/external/signal/node_modules/uuid/dist/v5.js
new file mode 100644
index 0000000..99d615e
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/v5.js
@@ -0,0 +1,16 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = void 0;
+
+var _v = _interopRequireDefault(require("./v35.js"));
+
+var _sha = _interopRequireDefault(require("./sha1.js"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+const v5 = (0, _v.default)('v5', 0x50, _sha.default);
+var _default = v5;
+exports.default = _default; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/validate.js b/includes/external/signal/node_modules/uuid/dist/validate.js
new file mode 100644
index 0000000..fd05215
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/validate.js
@@ -0,0 +1,17 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = void 0;
+
+var _regex = _interopRequireDefault(require("./regex.js"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function validate(uuid) {
+ return typeof uuid === 'string' && _regex.default.test(uuid);
+}
+
+var _default = validate;
+exports.default = _default; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/dist/version.js b/includes/external/signal/node_modules/uuid/dist/version.js
new file mode 100644
index 0000000..f63af01
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/dist/version.js
@@ -0,0 +1,21 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = void 0;
+
+var _validate = _interopRequireDefault(require("./validate.js"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function version(uuid) {
+ if (!(0, _validate.default)(uuid)) {
+ throw TypeError('Invalid UUID');
+ }
+
+ return parseInt(uuid.slice(14, 15), 16);
+}
+
+var _default = version;
+exports.default = _default; \ No newline at end of file
diff --git a/includes/external/signal/node_modules/uuid/package.json b/includes/external/signal/node_modules/uuid/package.json
new file mode 100644
index 0000000..92cd9eb
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/package.json
@@ -0,0 +1,131 @@
+{
+ "name": "uuid",
+ "version": "9.0.0",
+ "description": "RFC4122 (v1, v4, and v5) UUIDs",
+ "commitlint": {
+ "extends": [
+ "@commitlint/config-conventional"
+ ]
+ },
+ "keywords": [
+ "uuid",
+ "guid",
+ "rfc4122"
+ ],
+ "license": "MIT",
+ "bin": {
+ "uuid": "./dist/bin/uuid"
+ },
+ "sideEffects": false,
+ "main": "./dist/index.js",
+ "exports": {
+ ".": {
+ "node": {
+ "module": "./dist/esm-node/index.js",
+ "require": "./dist/index.js",
+ "import": "./wrapper.mjs"
+ },
+ "browser": {
+ "import": "./dist/esm-browser/index.js",
+ "require": "./dist/commonjs-browser/index.js"
+ },
+ "default": "./dist/esm-browser/index.js"
+ },
+ "./package.json": "./package.json"
+ },
+ "module": "./dist/esm-node/index.js",
+ "browser": {
+ "./dist/md5.js": "./dist/md5-browser.js",
+ "./dist/native.js": "./dist/native-browser.js",
+ "./dist/rng.js": "./dist/rng-browser.js",
+ "./dist/sha1.js": "./dist/sha1-browser.js",
+ "./dist/esm-node/index.js": "./dist/esm-browser/index.js"
+ },
+ "files": [
+ "CHANGELOG.md",
+ "CONTRIBUTING.md",
+ "LICENSE.md",
+ "README.md",
+ "dist",
+ "wrapper.mjs"
+ ],
+ "devDependencies": {
+ "@babel/cli": "7.18.10",
+ "@babel/core": "7.18.10",
+ "@babel/eslint-parser": "7.18.9",
+ "@babel/preset-env": "7.18.10",
+ "@commitlint/cli": "17.0.3",
+ "@commitlint/config-conventional": "17.0.3",
+ "bundlewatch": "0.3.3",
+ "eslint": "8.21.0",
+ "eslint-config-prettier": "8.5.0",
+ "eslint-config-standard": "17.0.0",
+ "eslint-plugin-import": "2.26.0",
+ "eslint-plugin-node": "11.1.0",
+ "eslint-plugin-prettier": "4.2.1",
+ "eslint-plugin-promise": "6.0.0",
+ "husky": "8.0.1",
+ "jest": "28.1.3",
+ "lint-staged": "13.0.3",
+ "npm-run-all": "4.1.5",
+ "optional-dev-dependency": "2.0.1",
+ "prettier": "2.7.1",
+ "random-seed": "0.3.0",
+ "runmd": "1.3.6",
+ "standard-version": "9.5.0"
+ },
+ "optionalDevDependencies": {
+ "@wdio/browserstack-service": "7.16.10",
+ "@wdio/cli": "7.16.10",
+ "@wdio/jasmine-framework": "7.16.6",
+ "@wdio/local-runner": "7.16.10",
+ "@wdio/spec-reporter": "7.16.9",
+ "@wdio/static-server-service": "7.16.6"
+ },
+ "scripts": {
+ "examples:browser:webpack:build": "cd examples/browser-webpack && npm install && npm run build",
+ "examples:browser:rollup:build": "cd examples/browser-rollup && npm install && npm run build",
+ "examples:node:commonjs:test": "cd examples/node-commonjs && npm install && npm test",
+ "examples:node:esmodules:test": "cd examples/node-esmodules && npm install && npm test",
+ "examples:node:jest:test": "cd examples/node-jest && npm install && npm test",
+ "prepare": "cd $( git rev-parse --show-toplevel ) && husky install",
+ "lint": "npm run eslint:check && npm run prettier:check",
+ "eslint:check": "eslint src/ test/ examples/ *.js",
+ "eslint:fix": "eslint --fix src/ test/ examples/ *.js",
+ "pretest": "[ -n $CI ] || npm run build",
+ "test": "BABEL_ENV=commonjsNode node --throw-deprecation node_modules/.bin/jest test/unit/",
+ "pretest:browser": "optional-dev-dependency && npm run build && npm-run-all --parallel examples:browser:**",
+ "test:browser": "wdio run ./wdio.conf.js",
+ "pretest:node": "npm run build",
+ "test:node": "npm-run-all --parallel examples:node:**",
+ "test:pack": "./scripts/testpack.sh",
+ "pretest:benchmark": "npm run build",
+ "test:benchmark": "cd examples/benchmark && npm install && npm test",
+ "prettier:check": "prettier --check '**/*.{js,jsx,json,md}'",
+ "prettier:fix": "prettier --write '**/*.{js,jsx,json,md}'",
+ "bundlewatch": "npm run pretest:browser && bundlewatch --config bundlewatch.config.json",
+ "md": "runmd --watch --output=README.md README_js.md",
+ "docs": "( node --version | grep -q 'v16' ) && ( npm run build && runmd --output=README.md README_js.md )",
+ "docs:diff": "npm run docs && git diff --quiet README.md",
+ "build": "./scripts/build.sh",
+ "prepack": "npm run build",
+ "release": "standard-version --no-verify"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/uuidjs/uuid.git"
+ },
+ "lint-staged": {
+ "*.{js,jsx,json,md}": [
+ "prettier --write"
+ ],
+ "*.{js,jsx}": [
+ "eslint --fix"
+ ]
+ },
+ "standard-version": {
+ "scripts": {
+ "postchangelog": "prettier --write CHANGELOG.md"
+ }
+ }
+}
diff --git a/includes/external/signal/node_modules/uuid/wrapper.mjs b/includes/external/signal/node_modules/uuid/wrapper.mjs
new file mode 100644
index 0000000..c31e9ce
--- /dev/null
+++ b/includes/external/signal/node_modules/uuid/wrapper.mjs
@@ -0,0 +1,10 @@
+import uuid from './dist/index.js';
+export const v1 = uuid.v1;
+export const v3 = uuid.v3;
+export const v4 = uuid.v4;
+export const v5 = uuid.v5;
+export const NIL = uuid.NIL;
+export const version = uuid.version;
+export const validate = uuid.validate;
+export const stringify = uuid.stringify;
+export const parse = uuid.parse;
diff --git a/includes/fragments/dashboard.inc b/includes/fragments/dashboard.inc
new file mode 100644
index 0000000..2a6d905
--- /dev/null
+++ b/includes/fragments/dashboard.inc
@@ -0,0 +1,267 @@
+<?php
+
+if (isset($_GET["ec"])) {
+ header("HTTP/1.1 " . $_GET["ec"] . " Error");
+}
+
+require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/init.inc"; $title = "Dashboard"; require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/components/header.inc'; global $readOnly; global $isNormallyLoggedIn; global $_PROFILE; global $lang; global $pages; global $isLowerLoggedIn; global $app; global $isLoggedIn;
+
+global $use2023UI;
+
+?>
+
+ <br>
+ <div class="container">
+ <?php if (isset($_GET['em'])): ?>
+ <div class="alert alert-danger alert-dismissible">
+ <button onclick='window.history.pushState({"html":null,"pageTitle":document.title},"", "/");' type="button" class="btn-close" data-bs-dismiss="alert"></button>
+ <b><?= $lang["home"]["error"] ?> </b><?= strip_tags(base64_decode($_GET['em'])) ?>
+ </div>
+ <?php endif; ?>
+
+ <div class="alert alert-warning alert-dismissible" id="gpuWarning" style="display: none;">
+ <button onclick='window.history.pushState({"html":null,"pageTitle":document.title},"", "/");' type="button" class="btn-close" data-bs-dismiss="alert"></button>
+ <b>GPU acceleration is turned off or not supported.</b> A lot of visual effects on this website rely on GPU acceleration, which is currently disabled on your browser, meaning the website's overall look will be affected. Please enable GPU acceleration in your browser settings.
+ </div>
+
+ <style>
+ .day-gradient {
+ background-image: linear-gradient(180deg, rgba(7,15,36,1) 0%, rgba(36,56,83,1) 14%, rgba(165,126,57,1) 28%, rgba(37,109,201,1) 42%, rgba(47,165,208,1) 57%, rgba(252,120,15,1) 71%, rgba(38,66,97,1) 85%, rgba(7,15,36,1) 100%);
+ background-size: 100% 1000%;
+ }
+
+ .invert {
+ filter: invert(1) hue-rotate(180deg);
+ }
+
+ @media (max-width: 800px) {
+ #schedules {
+ grid-template-columns: 1fr !important;
+ }
+
+ .schedules-separator {
+ display: block !important;
+ }
+ }
+ </style>
+
+ <h2>
+ <span id="greeting">Hi</span> <span><?php
+
+ $fronters = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/" . ($_PROFILE["login"] === "raindrops" ? "gdapd" : ($_PROFILE["login"] === "cloudburst" ? "ynmuc" : ($_PROFILE["login"] === "Moonwind" ? "hrbom" : "other"))) . "/fronters.json"), true);
+ $name = ($_PROFILE["login"] === "raindrops" ? "Raindrops System" : ($_PROFILE["login"] === "cloudburst" ? "Cloudburst System" : ($_PROFILE["login"] === "Moonwind" ? "Moonglow" : $app["other"]["name"])));
+
+ if (isset($fronters["members"][0])) {
+ $name = implode(" and ", array_map(function ($i) {
+ return $i["display_name"] ?? $i["name"];
+ }, $fronters["members"]));
+ }
+
+ echo $name;
+
+ ?>!</span>
+ </h2>
+ <script>
+ let greeting = "Hi";
+
+ switch (new Date().getHours()) {
+ case 22:
+ case 23:
+ case 0:
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ greeting = "Good night";
+ break;
+
+ case 6:
+ case 7:
+ case 8:
+ case 9:
+ case 10:
+ case 11:
+ greeting = "Good morning";
+ break;
+
+ case 12:
+ case 13:
+ case 14:
+ case 15:
+ case 16:
+ case 17:
+ greeting = "Good afternoon";
+ break;
+
+ case 18:
+ case 19:
+ case 20:
+ case 21:
+ greeting = "Good evening";
+ break;
+ }
+
+ document.getElementById("greeting").innerText = greeting;
+ </script>
+
+ <div id="schedules" style="margin-top: 20px; display: grid; grid-template-columns: repeat(4, 1fr); grid-gap: 20px;">
+ <div>
+ <div id="live-time-other-outer" class="day-gradient" style="text-align: center; background-color: rgba(255, 255, 255, .1); padding: 20px 0; border-radius: 10px;">
+ <b><?= $app["other"]["name"] ?></b><br>
+ <h3 id="live-time-other">--:--</h3>
+ </div>
+
+ <hr style="display: none;" class="schedules-separator">
+ </div>
+
+ <div>
+ <div id="live-time-cloudburst-outer" class="day-gradient" style="text-align: center; background-color: rgba(255, 255, 255, .1); padding: 20px 0; border-radius: 10px;">
+ <b>Cloudburst System</b><br>
+ <h3 id="live-time-cloudburst">--:--</h3>
+ </div>
+
+ <hr style="display: none;" class="schedules-separator">
+ </div>
+
+ <div>
+ <div id="live-time-raindrops-outer" class="day-gradient" style="text-align: center; background-color: rgba(255, 255, 255, .1); padding: 20px 0; border-radius: 10px;">
+ <b>Raindrops System</b><br>
+ <h3 id="live-time-raindrops">--:--</h3>
+ </div>
+ </div>
+
+ <div>
+ <div id="live-time-moonwind-outer" class="day-gradient" style="text-align: center; background-color: rgba(255, 255, 255, .1); padding: 20px 0; border-radius: 10px;">
+ <b>Moonglow</b><br>
+ <h3 id="live-time-moonwind">--:--</h3>
+ </div>
+ </div>
+ </div>
+
+ <script>
+ function getDayPercentage(time) {
+ let hours = parseInt(time.split(":")[0]);
+ let minutes = parseInt(time.split(":")[1].split(" ")[0]);
+
+ if (time.split(":")[1].split(" ")[1] === "PM") hours += 12;
+ if (hours === 12 && time.split(":")[1].split(" ")[1] === "AM") hours = 0;
+ if (hours === 24 && time.split(":")[1].split(" ")[1] === "PM") hours = 12;
+
+ let timestamp = new Date("1970-01-01 " + hours + ":" + minutes + " UTC").getTime() / 1000;
+
+ return (timestamp / 86400) * 100;
+ }
+
+ function updateTime() {
+ let time1 = (new Intl.DateTimeFormat('en-US', {
+ timeZone: 'Europe/Paris',
+ hour: 'numeric',
+ minute: '2-digit',
+ hour12: false
+ })).format(new Date());
+
+ document.getElementById("live-time-raindrops").innerText = time1;
+ document.getElementById("live-time-raindrops-outer").style.backgroundPositionY = getDayPercentage(time1) + "%";
+
+ let time4 = (new Intl.DateTimeFormat('en-US', {
+ timeZone: 'Europe/Kyiv',
+ hour: 'numeric',
+ minute: '2-digit',
+ hour12: false
+ })).format(new Date());
+
+ document.getElementById("live-time-moonwind").innerText = time4;
+ document.getElementById("live-time-moonwind-outer").style.backgroundPositionY = getDayPercentage(time4) + "%";
+
+ let time2 = (new Intl.DateTimeFormat('en-US', {
+ timeZone: 'Europe/London',
+ hour: 'numeric',
+ minute: '2-digit',
+ hour12: false
+ })).format(new Date());
+
+ document.getElementById("live-time-cloudburst").innerText = time2;
+ document.getElementById("live-time-cloudburst-outer").style.backgroundPositionY = getDayPercentage(time2) + "%";
+
+ let time3 = (new Intl.DateTimeFormat('en-US', {
+ timeZone: 'America/Chicago',
+ hour: 'numeric',
+ minute: '2-digit',
+ hour12: false
+ })).format(new Date());
+
+ document.getElementById("live-time-other").innerText = time3;
+ document.getElementById("live-time-other-outer").style.backgroundPositionY = getDayPercentage(time3) + "%";
+ }
+
+ updateTime();
+
+ setInterval(() => {
+ updateTime();
+ }, 10000);
+ </script>
+
+ <div id="timeline-container" style="background: #3332328a;padding: 5px 10px;border-radius: 10px; margin-top: 20px;">
+ <div id="timeline"></div>
+ <script>
+ async function refreshTimeline() {
+ document.getElementById("timeline").innerHTML = await (await fetch("/api/timeline?gdapd&ynmuc<?= ($isLowerLoggedIn || $isLoggedIn) ? "&" . $app["other"]["id"] : "" ?>&hrbom")).text();
+
+ Array.from(document.getElementsByClassName("dynamic-time")).forEach((el) => {
+ let time = el.getAttribute("data-time");
+ el.innerText = new Date(parseInt(time) * 1000).toTimeString().split(":").splice(0, 2).join(":");
+ });
+
+ Array.from(document.getElementsByClassName("dynamic-time-mobile")).forEach((el) => {
+ let time = el.getAttribute("data-time");
+ el.innerText = new Date(parseInt(time) * 1000).toTimeString().split(":")[0] + ":";
+ });
+ }
+
+ setInterval(refreshTimeline, 10000);
+ refreshTimeline();
+ </script>
+ </div>
+
+ <div style="display: grid; grid-template-columns: 1fr 2fr; grid-gap: 20px;" id="home-parts">
+ <div style="background-color: var(--palette-2) !important; margin-top: 20px; border-radius: 10px;">
+ <div class="list-group">
+ <a href="/cloudburst" class="list-group-item list-group-item-action" style="display: flex; align-items: center;">
+ <img src="/assets/avatars/ade46823206b4b0cad3ccaae934a5f3b.webp" style="margin-right: 5px; width: 24px;"><div style="vertical-align: middle; display: flex; align-items: center; color: var(--bs-body-color);">Cloudburst System</div>
+ </a>
+ <a href="/raindrops" class="list-group-item list-group-item-action" style="display: flex; align-items: center;">
+ <img src="/assets/avatars/7d9f543ef74240f69d0786c3f2983124.webp" style="margin-right: 5px; width: 24px;"><div style="vertical-align: middle; display: flex; align-items: center; color: var(--bs-body-color);">Raindrops System</div>
+ </a>
+ <a href="/<?= $app["other"]["slug"] ?>" class="list-group-item list-group-item-action" style="display: flex; align-items: center;">
+ <img src="/assets/avatars/64fb19057fae41cfac0f844e9e186848.webp" style="margin-right: 5px; width: 24px;"><div style="vertical-align: middle; display: flex; align-items: center; color: var(--bs-body-color);"><?= $app["other"]["name"] ?></div>
+ </a>
+ <a href="/moonglow" class="list-group-item list-group-item-action" style="display: flex; align-items: center;">
+ <img src="/assets/avatars/d1cd97eb9c924e4294cd4397a5074ff9.webp" style="margin-right: 5px; width: 24px;"><div style="vertical-align: middle; display: flex; align-items: center; color: var(--bs-body-color);">Moonwind</div>
+ </a>
+ <a href="/-/wakeup" class="list-group-item list-group-item-action" style="display: grid; grid-template-columns: max-content 1fr;">
+ <img src="/assets/icons/new/wakeup.svg?color=474747" style="margin-right: 5px; height: 24px; width: 24px;"><div style="display: flex; align-items: center; color: var(--bs-body-color);">Wake-up alert</div>
+ </a>
+ <a href="/-/byfront" class="list-group-item list-group-item-action" style="display: grid; grid-template-columns: max-content 1fr;">
+ <img src="/assets/icons/new/front.svg?color=474747" style="margin-right: 5px; height: 24px; width: 24px;"><div style="display: flex; align-items: center; color: var(--bs-body-color);">By last fronted date</div>
+ </a>
+ <a href="https://countdown.equestria.horse" target="_blank" class="list-group-item list-group-item-action" style="display: grid; grid-template-columns: max-content 1fr;">
+ <img src="/assets/icons/new/schedule.svg?color=474747" style="margin-right: 5px; height: 24px; width: 24px;"><div style="display: flex; align-items: center; color: var(--bs-body-color);">Meet-up countdown</div>
+ </a>
+ <a href="https://plex.equestria.horse" target="_blank" class="list-group-item list-group-item-action" style="display: grid; grid-template-columns: max-content 1fr;">
+ <img src="https://plex.equestria.horse/web/favicon.ico" style="margin-right: 5px; height: 24px; width: 24px;"><div style="display: flex; align-items: center; color: var(--bs-body-color);">Plex</div>
+ </a>
+ <a href="https://live.equestria.dev" target="_blank" class="list-group-item list-group-item-action" style="display: grid; grid-template-columns: max-content 1fr;">
+ <img src="https://avatars.githubusercontent.com/u/8463692?s=128" style="margin-right: 5px; height: 24px; width: 24px;"><div style="display: flex; align-items: center; color: var(--bs-body-color);">Streaming server</div>
+ </a>
+ <a href="https://mist.equestria.horse" target="_blank" class="list-group-item list-group-item-action" style="display: grid; grid-template-columns: max-content 1fr;">
+ <img src="https://mist.equestria.horse/icons/normal_128x128.png" style="margin-right: 5px; height: 24px; width: 24px;"><div style="display: flex; align-items: center; color: var(--bs-body-color);">Mist</div>
+ </a>
+ </div>
+ </div>
+ <div style="background-color: var(--palette-2) !important; text-align: center; margin-top: 20px; border-radius: 10px; display: flex; align-items: center; justify-content: center;">
+ <div style="color: var(--palette-9);">There is nothing here yet, check back later!</div>
+ </div>
+ </div>
+ </div>
+<?php require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/components/footer.inc'; ?> \ No newline at end of file
diff --git a/includes/fragments/member.inc b/includes/fragments/member.inc
index 10cd241..8b153fa 100644
--- a/includes/fragments/member.inc
+++ b/includes/fragments/member.inc
@@ -135,7 +135,7 @@ if (file_exists($_SERVER['DOCUMENT_ROOT'] . "/assets/ponies/" . $memberID . ".pn
</div>
<div class="container">
- <?php global $isLoggedIn; global $isLowerLoggedIn; if ($isLoggedIn || ($isLowerLoggedIn && $systemID === $app["other"]["id"])): ?>
+ <?php global $isLoggedIn; global $isLowerLoggedIn; if ($isLoggedIn || ($isLowerLoggedIn && ($systemID === $app["other"]["id"] || $systemID === "hrbom"))): ?>
<hr>
<details>
diff --git a/includes/fragments/metadata.inc b/includes/fragments/metadata.inc
index da3c326..6449dc0 100644
--- a/includes/fragments/metadata.inc
+++ b/includes/fragments/metadata.inc
@@ -266,7 +266,7 @@ if (file_exists($_SERVER['DOCUMENT_ROOT'] . "/includes/data/metadata/" . $member
<h3>Age and birth</h3>
<p>
- <b>Birth date (use January 1<sup>st</sup> for none, fixed age takes priority over birth year if applicable)</b><br>
+ <b>Birthdate (use January 1<sup>st</sup> for none, fixed age takes priority over birth year if applicable)</b><br>
<input name="birth" class="form-control" style="filter: invert(1) hue-rotate(180deg);" type="date" value="<?= $metadata["birth"]["year"] ?? "" ?>-<?= $metadata["birth"]["date"] ?? "" ?>">
</p>
<p>
diff --git a/includes/jobs/FrontersNotification.php b/includes/jobs/FrontersNotification.php
index bf0ced4..04fff9b 100644
--- a/includes/jobs/FrontersNotification.php
+++ b/includes/jobs/FrontersNotification.php
@@ -68,7 +68,7 @@ if (count($fronters["members"]) > 1) {
"Title: " . formatPonypush("🐴 Switch occurred in $name") . "\r\n" .
"Priority: default\r\n" .
"Tags: switch\r\n" .
- "Actions: view, Open " . $fronters["members"][0]["display_name"] . " on Cold Haze, https://ponies.equestria.horse/" . $fronters["members"][0]["name"] . "/, clear=true;view, Open " . $fronters["members"][1]["display_name"] . " on Cold Haze, https://ponies.equestria.horse/" . $fronters["members"][1]["name"] . "/, clear=true\r\n" .
+ "Actions: view, Open " . $fronters["members"][0]["display_name"] . " on Ponycule, https://ponies.equestria.horse/" . $fronters["members"][0]["name"] . "/, clear=true;view, Open " . $fronters["members"][1]["display_name"] . " on Cold Haze, https://ponies.equestria.horse/" . $fronters["members"][1]["name"] . "/, clear=true\r\n" .
"Authorization: Basic " . base64_encode($ntfy["user"] . ":" . $ntfy["password"]),
'content' => formatPonypush(($fronters["members"][0]["display_name"] ?? $fronters["members"][0]["name"]) . " and " . ($fronters["members"][1]["display_name"] ?? $fronters["members"][1]["name"]) . " switched in just now")
]
@@ -83,7 +83,7 @@ if (count($fronters["members"]) > 1) {
"Title: " . formatPonypush("🐴 Switch occurred in $name") . "\r\n" .
"Priority: default\r\n" .
"Tags: switch\r\n" .
- "Actions: view, Open on Cold Haze, https://ponies.equestria.horse/" . $fronters["members"][0]["name"] . "/, clear=true\r\n" .
+ "Actions: view, Open on Ponycule, https://ponies.equestria.horse/" . $fronters["members"][0]["name"] . "/, clear=true\r\n" .
"Authorization: Basic " . base64_encode($ntfy["user"] . ":" . $ntfy["password"]),
'content' => formatPonypush(($fronters["members"][0]["display_name"] ?? $fronters["members"][0]["name"]) . " switched in just now")
]
@@ -98,7 +98,7 @@ if (count($fronters["members"]) > 1) {
"Title: " . formatPonypush("🐴 Switch occurred in $name") . "\r\n" .
"Priority: default\r\n" .
"Tags: switch\r\n" .
- "Actions: view, Open on Cold Haze, https://ponies.equestria.horse/, clear=true\r\n" .
+ "Actions: view, Open on Ponycule, https://ponies.equestria.horse/, clear=true\r\n" .
"Authorization: Basic " . base64_encode($ntfy["user"] . ":" . $ntfy["password"]),
'content' => formatPonypush("The fallback pony switched in just now")
]
diff --git a/includes/lowertokens/2d418045034cbc5a5965201c4ae811520681762e2a5c109396e057f82b2f5273 b/includes/lowertokens/2d418045034cbc5a5965201c4ae811520681762e2a5c109396e057f82b2f5273
deleted file mode 100644
index 39ca943..0000000
--- a/includes/lowertokens/2d418045034cbc5a5965201c4ae811520681762e2a5c109396e057f82b2f5273
+++ /dev/null
@@ -1 +0,0 @@
-{"type":"user","id":"ce1606a9-344f-4547-bffe-bc2ab0eebfa8","name":"Lunar Aurora","login":"lunaraurora","banned":false,"guest":false,"avatar":{"type":"defaultavatar","url":"https:\/\/auth.equestria.horse\/hub\/api\/rest\/avatar\/ce1606a9-344f-4547-bffe-bc2ab0eebfa8"},"profile":{"avatar":{"type":"defaultavatar","url":"https:\/\/auth.equestria.horse\/hub\/api\/rest\/avatar\/ce1606a9-344f-4547-bffe-bc2ab0eebfa8"},"email":{"type":"EmailJSON","verified":true,"email":"lunar@lunaraurora.com"},"locale":{"name":"en","language":"en"},"attributes":[{"id":"d251756e-1200-4ee7-b06d-c07738489517-41-7","prototype":{"id":"d251756e-1200-4ee7-b06d-c07738489517","type":"Text"}}]},"details":[{"type":"LoginuserdetailsJSON","id":"36d9a741-cee8-4754-88b9-ba4968367b84"}],"VCSUserNames":[{"name":"lunaraurora"},{"name":"lunar@lunaraurora.com"}],"creationTime":1677088313965,"lastAccessTime":1678306788685,"refreshTokens":[{"id":"64-13"}],"approvedScopes":[{"id":"54-15"}],"twoFactorAuthentication":{"type":"TwoFactorAuthenticationJSON"},"requiredTwoFactorAuthentication":false} \ No newline at end of file
diff --git a/includes/lowertokens/42cd9b69c7ae246d8f1387371671db63a0e989a7e16819b770cb16e137d08aa5 b/includes/lowertokens/42cd9b69c7ae246d8f1387371671db63a0e989a7e16819b770cb16e137d08aa5
deleted file mode 100644
index 39ca943..0000000
--- a/includes/lowertokens/42cd9b69c7ae246d8f1387371671db63a0e989a7e16819b770cb16e137d08aa5
+++ /dev/null
@@ -1 +0,0 @@
-{"type":"user","id":"ce1606a9-344f-4547-bffe-bc2ab0eebfa8","name":"Lunar Aurora","login":"lunaraurora","banned":false,"guest":false,"avatar":{"type":"defaultavatar","url":"https:\/\/auth.equestria.horse\/hub\/api\/rest\/avatar\/ce1606a9-344f-4547-bffe-bc2ab0eebfa8"},"profile":{"avatar":{"type":"defaultavatar","url":"https:\/\/auth.equestria.horse\/hub\/api\/rest\/avatar\/ce1606a9-344f-4547-bffe-bc2ab0eebfa8"},"email":{"type":"EmailJSON","verified":true,"email":"lunar@lunaraurora.com"},"locale":{"name":"en","language":"en"},"attributes":[{"id":"d251756e-1200-4ee7-b06d-c07738489517-41-7","prototype":{"id":"d251756e-1200-4ee7-b06d-c07738489517","type":"Text"}}]},"details":[{"type":"LoginuserdetailsJSON","id":"36d9a741-cee8-4754-88b9-ba4968367b84"}],"VCSUserNames":[{"name":"lunaraurora"},{"name":"lunar@lunaraurora.com"}],"creationTime":1677088313965,"lastAccessTime":1678306788685,"refreshTokens":[{"id":"64-13"}],"approvedScopes":[{"id":"54-15"}],"twoFactorAuthentication":{"type":"TwoFactorAuthenticationJSON"},"requiredTwoFactorAuthentication":false} \ No newline at end of file
diff --git a/includes/lowertokens/4603277f84413087b2e908d8e89bf664ef046e481eb4ae0fef29d91e192c75ee b/includes/lowertokens/4603277f84413087b2e908d8e89bf664ef046e481eb4ae0fef29d91e192c75ee
deleted file mode 100644
index 39ca943..0000000
--- a/includes/lowertokens/4603277f84413087b2e908d8e89bf664ef046e481eb4ae0fef29d91e192c75ee
+++ /dev/null
@@ -1 +0,0 @@
-{"type":"user","id":"ce1606a9-344f-4547-bffe-bc2ab0eebfa8","name":"Lunar Aurora","login":"lunaraurora","banned":false,"guest":false,"avatar":{"type":"defaultavatar","url":"https:\/\/auth.equestria.horse\/hub\/api\/rest\/avatar\/ce1606a9-344f-4547-bffe-bc2ab0eebfa8"},"profile":{"avatar":{"type":"defaultavatar","url":"https:\/\/auth.equestria.horse\/hub\/api\/rest\/avatar\/ce1606a9-344f-4547-bffe-bc2ab0eebfa8"},"email":{"type":"EmailJSON","verified":true,"email":"lunar@lunaraurora.com"},"locale":{"name":"en","language":"en"},"attributes":[{"id":"d251756e-1200-4ee7-b06d-c07738489517-41-7","prototype":{"id":"d251756e-1200-4ee7-b06d-c07738489517","type":"Text"}}]},"details":[{"type":"LoginuserdetailsJSON","id":"36d9a741-cee8-4754-88b9-ba4968367b84"}],"VCSUserNames":[{"name":"lunaraurora"},{"name":"lunar@lunaraurora.com"}],"creationTime":1677088313965,"lastAccessTime":1678306788685,"refreshTokens":[{"id":"64-13"}],"approvedScopes":[{"id":"54-15"}],"twoFactorAuthentication":{"type":"TwoFactorAuthenticationJSON"},"requiredTwoFactorAuthentication":false} \ No newline at end of file
diff --git a/includes/lowertokens/78e12095fc9f96617fb264fe879e7ca8161b0276691da279d184f29a6d8d86a4 b/includes/lowertokens/78e12095fc9f96617fb264fe879e7ca8161b0276691da279d184f29a6d8d86a4
deleted file mode 100644
index 8ac1cd8..0000000
--- a/includes/lowertokens/78e12095fc9f96617fb264fe879e7ca8161b0276691da279d184f29a6d8d86a4
+++ /dev/null
@@ -1 +0,0 @@
-{"type":"user","id":"ce1606a9-344f-4547-bffe-bc2ab0eebfa8","name":"Lunar Aurora","login":"lunaraurora","banned":false,"guest":false,"avatar":{"type":"defaultavatar","url":"https:\/\/auth.equestria.horse\/hub\/api\/rest\/avatar\/ce1606a9-344f-4547-bffe-bc2ab0eebfa8"},"profile":{"avatar":{"type":"defaultavatar","url":"https:\/\/auth.equestria.horse\/hub\/api\/rest\/avatar\/ce1606a9-344f-4547-bffe-bc2ab0eebfa8"},"email":{"type":"EmailJSON","verified":true,"email":"lunar@lunaraurora.com"},"locale":{"name":"en","language":"en"},"attributes":[{"id":"d251756e-1200-4ee7-b06d-c07738489517-41-7","prototype":{"id":"d251756e-1200-4ee7-b06d-c07738489517","type":"Text"}}]},"details":[{"type":"LoginuserdetailsJSON","id":"36d9a741-cee8-4754-88b9-ba4968367b84"}],"VCSUserNames":[{"name":"lunaraurora"},{"name":"lunar@lunaraurora.com"}],"creationTime":1677088313965,"lastAccessTime":1679286716546,"refreshTokens":[{"id":"64-13"}],"approvedScopes":[{"id":"54-15"}],"twoFactorAuthentication":{"type":"TwoFactorAuthenticationJSON"},"requiredTwoFactorAuthentication":false} \ No newline at end of file
diff --git a/includes/lowertokens/ee685f047ea684468cc641bf792d9ab5983260b645be9e91ec74b0d1dd430e8a b/includes/lowertokens/ee685f047ea684468cc641bf792d9ab5983260b645be9e91ec74b0d1dd430e8a
deleted file mode 100644
index 39ca943..0000000
--- a/includes/lowertokens/ee685f047ea684468cc641bf792d9ab5983260b645be9e91ec74b0d1dd430e8a
+++ /dev/null
@@ -1 +0,0 @@
-{"type":"user","id":"ce1606a9-344f-4547-bffe-bc2ab0eebfa8","name":"Lunar Aurora","login":"lunaraurora","banned":false,"guest":false,"avatar":{"type":"defaultavatar","url":"https:\/\/auth.equestria.horse\/hub\/api\/rest\/avatar\/ce1606a9-344f-4547-bffe-bc2ab0eebfa8"},"profile":{"avatar":{"type":"defaultavatar","url":"https:\/\/auth.equestria.horse\/hub\/api\/rest\/avatar\/ce1606a9-344f-4547-bffe-bc2ab0eebfa8"},"email":{"type":"EmailJSON","verified":true,"email":"lunar@lunaraurora.com"},"locale":{"name":"en","language":"en"},"attributes":[{"id":"d251756e-1200-4ee7-b06d-c07738489517-41-7","prototype":{"id":"d251756e-1200-4ee7-b06d-c07738489517","type":"Text"}}]},"details":[{"type":"LoginuserdetailsJSON","id":"36d9a741-cee8-4754-88b9-ba4968367b84"}],"VCSUserNames":[{"name":"lunaraurora"},{"name":"lunar@lunaraurora.com"}],"creationTime":1677088313965,"lastAccessTime":1678306788685,"refreshTokens":[{"id":"64-13"}],"approvedScopes":[{"id":"54-15"}],"twoFactorAuthentication":{"type":"TwoFactorAuthenticationJSON"},"requiredTwoFactorAuthentication":false} \ No newline at end of file
diff --git a/includes/lowertokens/fd6817b78ef51afad3e01744ea1193debb6d0f8ac6c60271f51fa9d67ba677c9 b/includes/lowertokens/fd6817b78ef51afad3e01744ea1193debb6d0f8ac6c60271f51fa9d67ba677c9
deleted file mode 100644
index b24fd76..0000000
--- a/includes/lowertokens/fd6817b78ef51afad3e01744ea1193debb6d0f8ac6c60271f51fa9d67ba677c9
+++ /dev/null
@@ -1 +0,0 @@
-{"type":"user","id":"ce1606a9-344f-4547-bffe-bc2ab0eebfa8","name":"Lunar Aurora","projectRoles":[{"type":"projectRole","id":"4f93b6d4-2de9-4f69-9a68-7a55af2ca56d","role":{"id":"35d43711-705d-4b7b-b4f2-3bc3f18dba54","key":"project-admin","name":"Project Admin","immutable":false},"project":{"id":"74860131-311e-427a-9b04-de71b9019fce"},"owner":{"type":"user","id":"ce1606a9-344f-4547-bffe-bc2ab0eebfa8","login":"lunaraurora"}},{"type":"projectRole","id":"4bc77bee-1327-4a8b-8097-06b01cfb4ae9","role":{"id":"8da3cccc-5311-4aa3-8beb-4e217cc63e40","key":"youtrack-reporter","name":"Reporter","immutable":false},"project":{"id":"74860131-311e-427a-9b04-de71b9019fce"},"owner":{"type":"user","id":"ce1606a9-344f-4547-bffe-bc2ab0eebfa8","login":"lunaraurora"}},{"type":"projectRole","id":"9d8605d5-91d3-4abd-be40-3637974c66e2","role":{"id":"c6248e99-77b9-4807-bf97-1ee65faa0b0e","key":"developer","name":"Developer","immutable":false},"project":{"id":"74860131-311e-427a-9b04-de71b9019fce"},"owner":{"type":"user","id":"ce1606a9-344f-4547-bffe-bc2ab0eebfa8","login":"lunaraurora"}},{"type":"projectRole","id":"55e67bb9-98b0-4df8-a884-7cc1bf28f7eb","role":{"id":"0b631a62-0169-4f7d-9007-f4c2f11f4c61","key":"code-viewer","name":"Code Viewer","immutable":false},"project":{"id":"74860131-311e-427a-9b04-de71b9019fce"},"owner":{"type":"user","id":"ce1606a9-344f-4547-bffe-bc2ab0eebfa8","login":"lunaraurora"}},{"type":"projectRole","id":"dfe14070-4660-4b7b-825b-fa068ecebab9","role":{"id":"fa88b885-7f80-468b-8205-f959f0a3708e","key":"documentation-reader","name":"Documentation Reader","immutable":false},"project":{"id":"74860131-311e-427a-9b04-de71b9019fce"},"owner":{"type":"user","id":"ce1606a9-344f-4547-bffe-bc2ab0eebfa8","login":"lunaraurora"}},{"type":"projectRole","id":"33e2221a-c209-44e2-aba6-2ec268047ace","role":{"id":"632a45f3-5b60-4a58-995d-e5fab24643e0","key":"youtrack-helpdesk-reporter","name":"Helpdesk Reporter","immutable":false},"project":{"id":"74860131-311e-427a-9b04-de71b9019fce"},"owner":{"type":"user","id":"ce1606a9-344f-4547-bffe-bc2ab0eebfa8","login":"lunaraurora"}},{"type":"projectRole","id":"fd692371-d16a-4af8-b7bb-f5a1a13d422f","role":{"id":"e0afffb6-2419-4d53-915d-0c76239f48ed","key":"youtrack-issue-reader","name":"Issue Reader","immutable":false},"project":{"id":"74860131-311e-427a-9b04-de71b9019fce"},"owner":{"type":"user","id":"ce1606a9-344f-4547-bffe-bc2ab0eebfa8","login":"lunaraurora"}},{"type":"projectRole","id":"0010f607-bb0a-4f95-b6a2-1ab42609c3a1","role":{"id":"63c0029c-22ac-4e3e-ac2f-f3dc464f24a4","key":"observer","name":"Observer","immutable":false},"project":{"id":"74860131-311e-427a-9b04-de71b9019fce"},"owner":{"type":"user","id":"ce1606a9-344f-4547-bffe-bc2ab0eebfa8","login":"lunaraurora"}}],"transitiveProjectRoles":[{"type":"projectRole","id":"4f93b6d4-2de9-4f69-9a68-7a55af2ca56d","role":{"id":"35d43711-705d-4b7b-b4f2-3bc3f18dba54","key":"project-admin","name":"Project Admin","immutable":false},"project":{"id":"74860131-311e-427a-9b04-de71b9019fce"},"owner":{"type":"user","id":"ce1606a9-344f-4547-bffe-bc2ab0eebfa8","login":"lunaraurora"}},{"type":"projectRole","id":"4bc77bee-1327-4a8b-8097-06b01cfb4ae9","role":{"id":"8da3cccc-5311-4aa3-8beb-4e217cc63e40","key":"youtrack-reporter","name":"Reporter","immutable":false},"project":{"id":"74860131-311e-427a-9b04-de71b9019fce"},"owner":{"type":"user","id":"ce1606a9-344f-4547-bffe-bc2ab0eebfa8","login":"lunaraurora"}},{"type":"projectRole","id":"9d8605d5-91d3-4abd-be40-3637974c66e2","role":{"id":"c6248e99-77b9-4807-bf97-1ee65faa0b0e","key":"developer","name":"Developer","immutable":false},"project":{"id":"74860131-311e-427a-9b04-de71b9019fce"},"owner":{"type":"user","id":"ce1606a9-344f-4547-bffe-bc2ab0eebfa8","login":"lunaraurora"}},{"type":"projectRole","id":"55e67bb9-98b0-4df8-a884-7cc1bf28f7eb","role":{"id":"0b631a62-0169-4f7d-9007-f4c2f11f4c61","key":"code-viewer","name":"Code Viewer","immutable":false},"project":{"id":"74860131-311e-427a-9b04-de71b9019fce"},"owner":{"type":"user","id":"ce1606a9-344f-4547-bffe-bc2ab0eebfa8","login":"lunaraurora"}},{"type":"projectRole","id":"dfe14070-4660-4b7b-825b-fa068ecebab9","role":{"id":"fa88b885-7f80-468b-8205-f959f0a3708e","key":"documentation-reader","name":"Documentation Reader","immutable":false},"project":{"id":"74860131-311e-427a-9b04-de71b9019fce"},"owner":{"type":"user","id":"ce1606a9-344f-4547-bffe-bc2ab0eebfa8","login":"lunaraurora"}},{"type":"projectRole","id":"33e2221a-c209-44e2-aba6-2ec268047ace","role":{"id":"632a45f3-5b60-4a58-995d-e5fab24643e0","key":"youtrack-helpdesk-reporter","name":"Helpdesk Reporter","immutable":false},"project":{"id":"74860131-311e-427a-9b04-de71b9019fce"},"owner":{"type":"user","id":"ce1606a9-344f-4547-bffe-bc2ab0eebfa8","login":"lunaraurora"}},{"type":"projectRole","id":"fd692371-d16a-4af8-b7bb-f5a1a13d422f","role":{"id":"e0afffb6-2419-4d53-915d-0c76239f48ed","key":"youtrack-issue-reader","name":"Issue Reader","immutable":false},"project":{"id":"74860131-311e-427a-9b04-de71b9019fce"},"owner":{"type":"user","id":"ce1606a9-344f-4547-bffe-bc2ab0eebfa8","login":"lunaraurora"}},{"type":"projectRole","id":"0010f607-bb0a-4f95-b6a2-1ab42609c3a1","role":{"id":"63c0029c-22ac-4e3e-ac2f-f3dc464f24a4","key":"observer","name":"Observer","immutable":false},"project":{"id":"74860131-311e-427a-9b04-de71b9019fce"},"owner":{"type":"user","id":"ce1606a9-344f-4547-bffe-bc2ab0eebfa8","login":"lunaraurora"}}],"sourcedProjectRoles":[{"type":"sourcedProjectRole","id":"4f93b6d4-2de9-4f69-9a68-7a55af2ca56d","role":{"id":"35d43711-705d-4b7b-b4f2-3bc3f18dba54","key":"project-admin","name":"Project Admin","immutable":false},"project":{"id":"74860131-311e-427a-9b04-de71b9019fce"},"owner":{"type":"user","id":"ce1606a9-344f-4547-bffe-bc2ab0eebfa8","login":"lunaraurora"},"sources":[{"type":"ownRoleSource"}]},{"type":"sourcedProjectRole","id":"4bc77bee-1327-4a8b-8097-06b01cfb4ae9","role":{"id":"8da3cccc-5311-4aa3-8beb-4e217cc63e40","key":"youtrack-reporter","name":"Reporter","immutable":false},"project":{"id":"74860131-311e-427a-9b04-de71b9019fce"},"owner":{"type":"user","id":"ce1606a9-344f-4547-bffe-bc2ab0eebfa8","login":"lunaraurora"},"sources":[{"type":"ownRoleSource"}]},{"type":"sourcedProjectRole","id":"9d8605d5-91d3-4abd-be40-3637974c66e2","role":{"id":"c6248e99-77b9-4807-bf97-1ee65faa0b0e","key":"developer","name":"Developer","immutable":false},"project":{"id":"74860131-311e-427a-9b04-de71b9019fce"},"owner":{"type":"user","id":"ce1606a9-344f-4547-bffe-bc2ab0eebfa8","login":"lunaraurora"},"sources":[{"type":"ownRoleSource"}]},{"type":"sourcedProjectRole","id":"55e67bb9-98b0-4df8-a884-7cc1bf28f7eb","role":{"id":"0b631a62-0169-4f7d-9007-f4c2f11f4c61","key":"code-viewer","name":"Code Viewer","immutable":false},"project":{"id":"74860131-311e-427a-9b04-de71b9019fce"},"owner":{"type":"user","id":"ce1606a9-344f-4547-bffe-bc2ab0eebfa8","login":"lunaraurora"},"sources":[{"type":"ownRoleSource"}]},{"type":"sourcedProjectRole","id":"dfe14070-4660-4b7b-825b-fa068ecebab9","role":{"id":"fa88b885-7f80-468b-8205-f959f0a3708e","key":"documentation-reader","name":"Documentation Reader","immutable":false},"project":{"id":"74860131-311e-427a-9b04-de71b9019fce"},"owner":{"type":"user","id":"ce1606a9-344f-4547-bffe-bc2ab0eebfa8","login":"lunaraurora"},"sources":[{"type":"ownRoleSource"}]},{"type":"sourcedProjectRole","id":"33e2221a-c209-44e2-aba6-2ec268047ace","role":{"id":"632a45f3-5b60-4a58-995d-e5fab24643e0","key":"youtrack-helpdesk-reporter","name":"Helpdesk Reporter","immutable":false},"project":{"id":"74860131-311e-427a-9b04-de71b9019fce"},"owner":{"type":"user","id":"ce1606a9-344f-4547-bffe-bc2ab0eebfa8","login":"lunaraurora"},"sources":[{"type":"ownRoleSource"}]},{"type":"sourcedProjectRole","id":"fd692371-d16a-4af8-b7bb-f5a1a13d422f","role":{"id":"e0afffb6-2419-4d53-915d-0c76239f48ed","key":"youtrack-issue-reader","name":"Issue Reader","immutable":false},"project":{"id":"74860131-311e-427a-9b04-de71b9019fce"},"owner":{"type":"user","id":"ce1606a9-344f-4547-bffe-bc2ab0eebfa8","login":"lunaraurora"},"sources":[{"type":"ownRoleSource"}]},{"type":"sourcedProjectRole","id":"0010f607-bb0a-4f95-b6a2-1ab42609c3a1","role":{"id":"63c0029c-22ac-4e3e-ac2f-f3dc464f24a4","key":"observer","name":"Observer","immutable":false},"project":{"id":"74860131-311e-427a-9b04-de71b9019fce"},"owner":{"type":"user","id":"ce1606a9-344f-4547-bffe-bc2ab0eebfa8","login":"lunaraurora"},"sources":[{"type":"ownRoleSource"}]}],"transitiveOrganizationRoles":[{"type":"organizationRole","id":"cf6b4afc-fbde-42a1-ace7-568f92ec1877","role":{"id":"e0afffb6-2419-4d53-915d-0c76239f48ed","key":"youtrack-issue-reader","name":"Issue Reader","immutable":false},"organization":{"id":"957f7b0e-3aa3-4c08-9fb2-d708e8b23ff4"}},{"type":"organizationRole","id":"763ed6a0-7fd5-46b7-9dcc-c6a0aabff98d","role":{"id":"8da3cccc-5311-4aa3-8beb-4e217cc63e40","key":"youtrack-reporter","name":"Reporter","immutable":false},"organization":{"id":"957f7b0e-3aa3-4c08-9fb2-d708e8b23ff4"}},{"type":"organizationRole","id":"db3aab4d-bc13-4b8d-9d53-a31d8d8edcd6","role":{"id":"fa88b885-7f80-468b-8205-f959f0a3708e","key":"documentation-reader","name":"Documentation Reader","immutable":false},"organization":{"id":"957f7b0e-3aa3-4c08-9fb2-d708e8b23ff4"}},{"type":"organizationRole","id":"e139475c-c661-4c5d-aa81-5ca2b61dfdd8","role":{"id":"63c0029c-22ac-4e3e-ac2f-f3dc464f24a4","key":"observer","name":"Observer","immutable":false},"organization":{"id":"957f7b0e-3aa3-4c08-9fb2-d708e8b23ff4"}},{"type":"organizationRole","id":"fc439119-866a-4b8b-9215-a605b13b22ca","role":{"id":"632a45f3-5b60-4a58-995d-e5fab24643e0","key":"youtrack-helpdesk-reporter","name":"Helpdesk Reporter","immutable":false},"organization":{"id":"957f7b0e-3aa3-4c08-9fb2-d708e8b23ff4"}}],"sourcedOrganizationRoles":[{"type":"sourcedOrganizationRole","id":"cf6b4afc-fbde-42a1-ace7-568f92ec1877","role":{"id":"e0afffb6-2419-4d53-915d-0c76239f48ed","key":"youtrack-issue-reader","name":"Issue Reader","immutable":false},"organization":{"id":"957f7b0e-3aa3-4c08-9fb2-d708e8b23ff4"}},{"type":"sourcedOrganizationRole","id":"763ed6a0-7fd5-46b7-9dcc-c6a0aabff98d","role":{"id":"8da3cccc-5311-4aa3-8beb-4e217cc63e40","key":"youtrack-reporter","name":"Reporter","immutable":false},"organization":{"id":"957f7b0e-3aa3-4c08-9fb2-d708e8b23ff4"}},{"type":"sourcedOrganizationRole","id":"db3aab4d-bc13-4b8d-9d53-a31d8d8edcd6","role":{"id":"fa88b885-7f80-468b-8205-f959f0a3708e","key":"documentation-reader","name":"Documentation Reader","immutable":false},"organization":{"id":"957f7b0e-3aa3-4c08-9fb2-d708e8b23ff4"}},{"type":"sourcedOrganizationRole","id":"e139475c-c661-4c5d-aa81-5ca2b61dfdd8","role":{"id":"63c0029c-22ac-4e3e-ac2f-f3dc464f24a4","key":"observer","name":"Observer","immutable":false},"organization":{"id":"957f7b0e-3aa3-4c08-9fb2-d708e8b23ff4"}},{"type":"sourcedOrganizationRole","id":"fc439119-866a-4b8b-9215-a605b13b22ca","role":{"id":"632a45f3-5b60-4a58-995d-e5fab24643e0","key":"youtrack-helpdesk-reporter","name":"Helpdesk Reporter","immutable":false},"organization":{"id":"957f7b0e-3aa3-4c08-9fb2-d708e8b23ff4"}}],"login":"lunaraurora","banned":false,"guest":false,"avatar":{"type":"defaultavatar","url":"https:\/\/auth.equestria.horse\/hub\/api\/rest\/avatar\/ce1606a9-344f-4547-bffe-bc2ab0eebfa8"},"profile":{"avatar":{"type":"defaultavatar","url":"https:\/\/auth.equestria.horse\/hub\/api\/rest\/avatar\/ce1606a9-344f-4547-bffe-bc2ab0eebfa8"},"email":{"type":"EmailJSON","verified":true,"email":"lunar@lunaraurora.com"},"locale":{"name":"en","language":"en"},"attributes":[{"id":"d251756e-1200-4ee7-b06d-c07738489517-41-7","prototype":{"id":"d251756e-1200-4ee7-b06d-c07738489517","type":"Text"}}]},"groups":[{"type":"userGroup","id":"0083bb84-f62e-4b8e-b699-eb6a2599280c"}],"transitiveGroups":[{"type":"userGroup","id":"c512043f-cbb4-45e1-8d39-583c34d13b2a"},{"type":"userGroup","id":"0083bb84-f62e-4b8e-b699-eb6a2599280c"}],"details":[{"type":"LoginuserdetailsJSON","id":"36d9a741-cee8-4754-88b9-ba4968367b84"}],"VCSUserNames":[{"name":"lunaraurora"},{"name":"lunar@lunaraurora.com"}],"creationTime":1677088313965,"lastAccessTime":1680266516898,"refreshTokens":[{"id":"64-13"},{"id":"64-18"}],"approvedScopes":[{"id":"54-15"}],"twoFactorAuthentication":{"type":"TwoFactorAuthenticationJSON"},"requiredTwoFactorAuthentication":false} \ No newline at end of file
diff --git a/includes/refresh.php b/includes/refresh.php
index 8263f8e..cac1fb1 100644
--- a/includes/refresh.php
+++ b/includes/refresh.php
@@ -9,40 +9,12 @@ $app = json_decode(file_get_contents("./app.json"), true);
$version = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/version.json"), true);
$ignore = [
- $_SERVER['DOCUMENT_ROOT'] . "/Data",
- $_SERVER['DOCUMENT_ROOT'] . "/bits/Data",
- $_SERVER['DOCUMENT_ROOT'] . "/Private/Data",
- $_SERVER['DOCUMENT_ROOT'] . "/bits/Data",
- $_SERVER['DOCUMENT_ROOT'] . "/bits/Private/Data",
$_SERVER['DOCUMENT_ROOT'] . "/includes/data",
$_SERVER['DOCUMENT_ROOT'] . "/includes/tokens",
$_SERVER['DOCUMENT_ROOT'] . "/app",
$_SERVER['DOCUMENT_ROOT'] . "/assets",
];
-$screens = array_values(array_filter(scandir($_SERVER['DOCUMENT_ROOT'] . "/includes/data/computers/screens"), function ($i) {
- return !str_starts_with($i, ".");
-}));
-
-$computers = array_values(array_filter(scandir($_SERVER['DOCUMENT_ROOT'] . "/includes/data/computers/metadata"), function ($i) {
- return !str_starts_with($i, ".");
-}));
-
-foreach ($screens as $screen) {
- $delete = true;
- $id = explode(".", explode("-", $screen)[2])[0];
-
- foreach ($computers as $file) {
- $computer = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/computers/metadata/" . $file), true);
-
- foreach ($computer["screens"] as $sel) {
- if ($sel["id"] === $id) $delete = false;
- }
- }
-
- if ($delete) unlink($_SERVER['DOCUMENT_ROOT'] . "/includes/data/computers/screens/" . $screen);
-}
-
$documents = array_map(function ($i) {
return [
"id" => substr($i, 0, -5),
@@ -119,26 +91,11 @@ echo("Backing up...\n");
$lastBackup = (int)trim(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/backup.txt"));
if (time() - $lastBackup >= 3600) {
- require_once "./refresh/backup.inc";
+ require_once "./backup.inc";
file_put_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/backup.txt", time());
echo("Backup completed\n");
} else {
echo("Backup skipped\n");
}
-echo("Updating address book...\n");
-
-$contacts = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/addressbook/contacts.json"), true);
-
-foreach ($contacts as $id => $_) {
- $out = [];
- exec("cd /_ch/includes/jobs && php UpdateContactMethods.php {\\\"contact\\\":\\\"$id\\\"}", $out);
-
- foreach ($out as $line) {
- echo(" " . $line . "\n");
- }
-}
-
-echo("Updated address book\n");
-
echo("Completed.\n"); \ No newline at end of file
diff --git a/includes/refresh/assets.inc b/includes/refresh/assets.inc
deleted file mode 100644
index b27840a..0000000
--- a/includes/refresh/assets.inc
+++ /dev/null
@@ -1,86 +0,0 @@
-<?php
-
-global $app;
-
-if (!file_exists("" . $_SERVER['DOCUMENT_ROOT'] . "/assets/avatars")) mkdir("" . $_SERVER['DOCUMENT_ROOT'] . "/assets/avatars");
-if (!file_exists("" . $_SERVER['DOCUMENT_ROOT'] . "/assets/banners")) mkdir("" . $_SERVER['DOCUMENT_ROOT'] . "/assets/banners");
-if (!file_exists("" . $_SERVER['DOCUMENT_ROOT'] . "/assets/heads")) mkdir("" . $_SERVER['DOCUMENT_ROOT'] . "/assets/heads");
-if (!file_exists("" . $_SERVER['DOCUMENT_ROOT'] . "/assets/bodies")) mkdir("" . $_SERVER['DOCUMENT_ROOT'] . "/assets/bodies");
-
-function downloadAssets($system, $path = null) {
- if (!isset($path)) {
- $path = $system;
- }
-
- $general = json_decode(file_get_contents("./data/$path/general.json"), true);
-
- if (isset($general["avatar_url"])) {
- $id = preg_replace("/^([\da-f]{8})-([\da-f]{4})-([\da-f]{4})-([\da-f]{4})-([\da-f]{12})$/", "$1$2$3$4$5", $general["uuid"]);
- echo(" /avatars/$id.webp\n");
- file_put_contents("/tmp/img." . pathinfo($general['avatar_url'], PATHINFO_EXTENSION), file_get_contents($general['avatar_url']));
- exec("convert -resize 512x512 \"" . "/tmp/img." . pathinfo($general['avatar_url'], PATHINFO_EXTENSION) . "\" " . $_SERVER['DOCUMENT_ROOT'] . "/assets/avatars/" . $id . ".webp");
- unlink("/tmp/img." . pathinfo($general['avatar_url'], PATHINFO_EXTENSION));
- }
-
- if (isset($general["banner"])) {
- $id = preg_replace("/^([\da-f]{8})-([\da-f]{4})-([\da-f]{4})-([\da-f]{4})-([\da-f]{12})$/", "$1$2$3$4$5", $general["uuid"]);
- echo(" /banners/$id.webp\n");
- file_put_contents("/tmp/img." . pathinfo($general['banner'], PATHINFO_EXTENSION), file_get_contents($general['banner']));
- exec("convert -resize 2048x2048 \"" . "/tmp/img." . pathinfo($general['banner'], PATHINFO_EXTENSION) ."\" " . $_SERVER['DOCUMENT_ROOT'] . "/assets/banners/" . $id . ".webp");
- unlink("/tmp/img." . pathinfo($general['banner'], PATHINFO_EXTENSION));
- }
-
- $members = json_decode(file_get_contents("./data/$path/members.json"), true);
-
- foreach ($members as $member) {
- $id = preg_replace("/^([\da-f]{8})-([\da-f]{4})-([\da-f]{4})-([\da-f]{4})-([\da-f]{12})$/", "$1$2$3$4$5", $general["uuid"]) . preg_replace("/^([\da-f]{8})-([\da-f]{4})-([\da-f]{4})-([\da-f]{4})-([\da-f]{12})$/", "$1$2$3$4$5", $member["uuid"]);
-
- if (isset($member["avatar_url"])) {
- echo(" /avatars/$id.webp\n");
- file_put_contents("/tmp/img." . pathinfo($member['avatar_url'], PATHINFO_EXTENSION), file_get_contents($member['avatar_url']));
- exec("convert -resize 512x512 \"" . "/tmp/img." . pathinfo($member['avatar_url'], PATHINFO_EXTENSION) . "\" " . $_SERVER['DOCUMENT_ROOT'] . "/assets/avatars/" . $id . ".webp");
- unlink("/tmp/img." . pathinfo($member['avatar_url'], PATHINFO_EXTENSION));
- }
-
- echo(" /banners/$id.webp\n");
-
- if (isset($member["banner"])) {
- file_put_contents("/tmp/img." . pathinfo($member['banner'], PATHINFO_EXTENSION), file_get_contents($member['banner']));
- exec("convert -resize 2048x2048 \"" . "/tmp/img." . pathinfo($member['banner'], PATHINFO_EXTENSION) . "\" " . $_SERVER['DOCUMENT_ROOT'] . "/assets/banners/" . $id . ".webp");
- unlink("/tmp/img." . pathinfo($member['banner'], PATHINFO_EXTENSION));
- } else {
- $img = imagecreate(2048, 1024);
-
- if (isset($member["color"])) {
- imagecolorallocate($img, hexdec(substr($member["color"], 0, 2)) / 2, hexdec(substr($member["color"], 2, 2)) / 2, hexdec(substr($member["color"], 4, 2)) / 2);
- } else {
- imagecolorallocate($img, 0, 0, 0);
- }
-
- imagejpeg($img, "/tmp/img.jpeg", 100);
- imagedestroy($img);
- exec("convert -resize 2048x2048 \"/tmp/img.jpeg\" " . $_SERVER['DOCUMENT_ROOT'] . "/assets/banners/" . $id . ".webp");
- unlink("/tmp/img.jpeg");
- }
-
- if (file_exists("" . $_SERVER['DOCUMENT_ROOT'] . "/assets/uploads/pt-" . $member["name"] . ".png")) {
- $url = "" . $_SERVER['DOCUMENT_ROOT'] . "/assets/uploads/pt-" . $member["name"] . ".png";
- } else {
- $url = "" . $_SERVER['DOCUMENT_ROOT'] . "/assets/uploads/pt.png";
- }
- echo(" /heads/$id.png\n");
- exec("convert \"" . $url . "\" " . $_SERVER['DOCUMENT_ROOT'] . "/assets/heads/" . $id . ".png");
-
- if (file_exists("" . $_SERVER['DOCUMENT_ROOT'] . "/assets/ponies/" . $member["id"] . ".png")) {
- echo(" /bodies/$id.png\n");
- exec("convert \"" . "" . $_SERVER['DOCUMENT_ROOT'] . "/assets/ponies/" . $member["id"] . ".png" . "\" " . $_SERVER['DOCUMENT_ROOT'] . "/assets/bodies/" . $id . ".png");
- }
- }
-}
-
-downloadAssets("gdapd");
-downloadAssets("ynmuc");
-
-if (isset($app["other"]) && isset($app["other"]["id"]) && isset($app["other"]["token"])) {
- downloadAssets($app["other"]["id"], "other");
-} \ No newline at end of file
diff --git a/includes/refresh/cleanup.inc b/includes/refresh/cleanup.inc
deleted file mode 100644
index 39ec41a..0000000
--- a/includes/refresh/cleanup.inc
+++ /dev/null
@@ -1,24 +0,0 @@
-<?php
-
-$screens = array_values(array_filter(scandir($_SERVER['DOCUMENT_ROOT'] . "/includes/data/computers/screens"), function ($i) {
- return !str_starts_with($i, ".");
-}));
-
-$computers = array_values(array_filter(scandir($_SERVER['DOCUMENT_ROOT'] . "/includes/data/computers/metadata"), function ($i) {
- return !str_starts_with($i, ".");
-}));
-
-foreach ($screens as $screen) {
- $delete = true;
- $id = explode(".", explode("-", $screen)[2])[0];
-
- foreach ($computers as $file) {
- $computer = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/computers/metadata/" . $file), true);
-
- foreach ($computer["screens"] as $sel) {
- if ($sel["id"] === $id) $delete = false;
- }
- }
-
- if ($delete) unlink($_SERVER['DOCUMENT_ROOT'] . "/includes/data/computers/screens/" . $screen);
-} \ No newline at end of file
diff --git a/includes/util/agewarning.inc b/includes/util/agewarning.inc
index f8bc650..66a163c 100644
--- a/includes/util/agewarning.inc
+++ b/includes/util/agewarning.inc
@@ -12,7 +12,7 @@ function showWarning($name, $id, $system) {
"Title: " . formatPonypush("⚠️ $name does not have an age or birth year set") . "\r\n" .
"Priority: max\r\n" .
"Tags: switch\r\n" .
- "Actions: view, Edit on Cold Haze, https://ponies.equestria.horse/-/metadata/" . ($system === "gdapd" ? "raindrops" : "cloudburst") . "/" . $id . "/, clear=true\r\n" .
+ "Actions: view, Edit on Ponycule, https://ponies.equestria.horse/-/metadata/" . ($system === "gdapd" ? "raindrops" : "cloudburst") . "/" . $id . "/, clear=true\r\n" .
"Authorization: Basic " . base64_encode($ntfy["user"] . ":" . $ntfy["password"]),
'content' => formatPonypush("To make sure they appear on the fronting schedule (and to make sure they can front again), they need to set an age or birth year now.")
]
@@ -26,7 +26,7 @@ function showWarning($name, $id, $system) {
"Title: " . formatPonypush("⚠️ $name does not have an age or birth year set") . "\r\n" .
"Priority: max\r\n" .
"Tags: switch\r\n" .
- "Actions: view, Edit on Cold Haze, https://ponies.equestria.horse/-/metadata/" . ($system === "gdapd" ? "raindrops" : "cloudburst") . "/" . $id . "/, clear=true\r\n" .
+ "Actions: view, Edit on Ponycule, https://ponies.equestria.horse/-/metadata/" . ($system === "gdapd" ? "raindrops" : "cloudburst") . "/" . $id . "/, clear=true\r\n" .
"Authorization: Basic " . base64_encode($ntfy["user"] . ":" . $ntfy["password"]),
'content' => formatPonypush("To make sure they still appear on the fronting schedule after March 1st, they need to set an age or birth year now.")
]
diff --git a/includes/util/banner.inc b/includes/util/banner.inc
index 944a701..955b93d 100644
--- a/includes/util/banner.inc
+++ b/includes/util/banner.inc
@@ -22,7 +22,6 @@ function getAge($metadata) {
}
require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/util/session.inc"; global $isLoggedIn; global $lang; global $pages; global $isLowerLoggedIn;
-require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/util/pronouns.inc";
require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/util/functions.inc";
require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/util/Parsedown.php"; $Parsedown = new Parsedown();
@@ -63,7 +62,7 @@ function getMemberBannerData(string $id, string $system, bool $french = false) {
$prefixes = [];
foreach ($member['proxy_tags'] as $proxy) {
- if ($travelling[$member['id']]["travelling"]) {
+ if (isset($travelling[$member['id']]) && $travelling[$member['id']]["travelling"]) {
if (isset($travelling[$member['id']]['equestria']) && $travelling[$member['id']]['equestria']) {
$prefixes[] = null;
} else {
@@ -194,7 +193,7 @@ function getMemberBannerData(string $id, string $system, bool $french = false) {
$systemData['full_name'] = $system === "gdapd" ? "Raindrops System" : ($system === $app["other"]["id"] ? $app["other"]["name"] : ($system === "hrbom" ? "Moonglow" : "Cloudburst System"));
$systemData['temporary'] = false;
- if ($travelling[$member['id']]["travelling"] && !$travelling[$member['id']]["equestria"]) {
+ if (isset($travelling[$member['id']]) && $travelling[$member['id']]["travelling"] && !$travelling[$member['id']]["equestria"]) {
$systemData['page'] = "/" . ($system === "gdapd" ? "cloudburst" : "raindrops");
$systemData['icon'] = getAsset($system === "gdapd" ? "ynmuc" : "gdapd");
$systemData['name'] = $system === "gdapd" ? "Cloudburst" : "Raindrops";
@@ -202,7 +201,7 @@ function getMemberBannerData(string $id, string $system, bool $french = false) {
$systemData['temporary'] = true;
}
- if ($travelling[$member['id']]["travelling"] && $travelling[$member['id']]["equestria"]) {
+ if (isset($travelling[$member['id']]) && $travelling[$member['id']]["travelling"] && $travelling[$member['id']]["equestria"]) {
$systemData['page'] = null;
$systemData['icon'] = "/assets/logo/equestria.png";
$systemData['name'] = "Equestria";
diff --git a/includes/util/bitset.inc b/includes/util/bitset.inc
deleted file mode 100644
index 14f178c..0000000
--- a/includes/util/bitset.inc
+++ /dev/null
@@ -1,25 +0,0 @@
-<?php
-
-function parseMetadata ($metadata) {
- $metadata["little"] = 0;
-
- $age = -1;
-
- if (isset($metadata["birth"]["age"]) && $metadata["birth"]["age"] !== 0) {
- $age = $metadata["birth"]["age"];
- } else if (isset($metadata["birth"]["year"]) && $metadata["birth"]["year"] > 1990) {
- $age = (int)date('Y') - $metadata["birth"]["year"] + (strtotime(date('Y') . "-" . $metadata["birth"]["date"]) <= time() ? 0 : -1);
- }
-
- if (is_string($age) && isset(explode("-", $age)[1]) && is_numeric(explode("-", $age)[1])) {
- $age = (int)explode("-", $age)[1];
- }
-
- if ($age > 0 && $age <= 10) {
- $metadata["little"] = 2;
- } else if ($age > 0 && $age <= 15) {
- $metadata["little"] = 3;
- }
-
- return $metadata;
-} \ No newline at end of file
diff --git a/includes/util/evening.inc b/includes/util/evening.inc
deleted file mode 100644
index 58e511e..0000000
--- a/includes/util/evening.inc
+++ /dev/null
@@ -1,68 +0,0 @@
-<?php
-
-if (!file_exists($_SERVER['DOCUMENT_ROOT'] . "/includes/data/evening/ignored.json")) file_put_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/evening/ignored.json", "[]");
-if (!file_exists($_SERVER['DOCUMENT_ROOT'] . "/includes/data/evening/locked.json")) file_put_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/evening/locked.json", "{}");
-
-if (file_exists($_SERVER['DOCUMENT_ROOT'] . "/includes/data/cache/evening.json")) unlink($_SERVER['DOCUMENT_ROOT'] . "/includes/data/cache/evening.json");
-
-global $use2023UI;
-
-$pairs = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/evening/pairs.json"), true);
-$ignored = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/evening/ignored.json"), true);
-$locked = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/evening/locked.json"), true);
-
-if (isset($_GET["ignore"]) && isset($_GET["day"])) {
- if ($_GET["ignore"] === "1") {
- if (preg_match("/^\d{4}-\d{2}-\d{2}$/m", $_GET["day"]) === false) {
- header("Location: /$_GET[_]");
- die();
- }
-
- if (!in_array($_GET["day"], $ignored)) {
- $ignored[] = $_GET["day"];
- }
-
- if (file_exists($_SERVER['DOCUMENT_ROOT'] . "/includes/data/cache/evening.json")) unlink($_SERVER['DOCUMENT_ROOT'] . "/includes/data/cache/evening.json");
-
- file_put_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/evening/ignored.json", json_encode($ignored));
- header("Location: /$_GET[_]");
- die();
- } elseif ($_GET["ignore"] === "0") {
- if (preg_match("/^\d{4}-\d{2}-\d{2}$/m", $_GET["day"]) === false) {
- header("Location: /$_GET[_]");
- die();
- }
-
- if (in_array($_GET["day"], $ignored)) {
- unset($ignored[array_search($_GET["day"], $ignored)]);
- }
-
- if (file_exists($_SERVER['DOCUMENT_ROOT'] . "/includes/data/cache/evening.json")) unlink($_SERVER['DOCUMENT_ROOT'] . "/includes/data/cache/evening.json");
-
- file_put_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/evening/ignored.json", json_encode($ignored));
- header("Location: /$_GET[_]");
- die();
- }
-
- die();
-}
-
-if (isset($_GET["lock"]) && isset($_GET["day"]) && isset($_GET["data"])) {
- if (isset($locked[$_GET["day"]])) {
- unset($locked[$_GET["day"]]);
-
- if (file_exists($_SERVER['DOCUMENT_ROOT'] . "/includes/data/cache/evening.json")) unlink($_SERVER['DOCUMENT_ROOT'] . "/includes/data/cache/evening.json");
-
- file_put_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/evening/locked.json", json_encode($locked));
- header("Location: /$_GET[_]");
- die();
- } else {
- $locked[$_GET["day"]] = $_GET["data"];
-
- if (file_exists($_SERVER['DOCUMENT_ROOT'] . "/includes/data/cache/evening.json")) unlink($_SERVER['DOCUMENT_ROOT'] . "/includes/data/cache/evening.json");
-
- file_put_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/evening/locked.json", json_encode($locked));
- header("Location: /$_GET[_]");
- die();
- }
-} \ No newline at end of file
diff --git a/includes/util/functions.inc b/includes/util/functions.inc
index 0cf15d2..67b1786 100644
--- a/includes/util/functions.inc
+++ b/includes/util/functions.inc
@@ -1,10 +1,54 @@
<?php
+use JetBrains\PhpStorm\NoReturn;
+
require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/util/score.inc";
-require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/util/bitset.inc";
require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/util/homepage.inc";
require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/util/random.inc";
+if (!function_exists("getMemberPronouns")) {
+ function getMemberPronouns(?string $pronouns): ?array {
+ return [
+ "gender" => "invalid",
+ "gender:fr" => "invalide",
+ "object" => "this pony",
+ "person" => "pony",
+ "possessive_det" => "this pony's",
+ "possessive_pro" => "this pony's",
+ "reflexive" => "this pony",
+ "subjective" => "this pony",
+ "third" => true,
+ "color" => "success"
+ ];
+ }
+}
+
+if (!function_exists("parseMetadata")) {
+ function parseMetadata ($metadata) {
+ $metadata["little"] = 0;
+
+ $age = -1;
+
+ if (isset($metadata["birth"]["age"]) && $metadata["birth"]["age"] !== 0) {
+ $age = $metadata["birth"]["age"];
+ } else if (isset($metadata["birth"]["year"]) && $metadata["birth"]["year"] > 1990) {
+ $age = (int)date('Y') - $metadata["birth"]["year"] + (strtotime(date('Y') . "-" . $metadata["birth"]["date"]) <= time() ? 0 : -1);
+ }
+
+ if (is_string($age) && isset(explode("-", $age)[1]) && is_numeric(explode("-", $age)[1])) {
+ $age = (int)explode("-", $age)[1];
+ }
+
+ if ($age > 0 && $age <= 10) {
+ $metadata["little"] = 2;
+ } else if ($age > 0 && $age <= 15) {
+ $metadata["little"] = 3;
+ }
+
+ return $metadata;
+ }
+}
+
if (!function_exists("pf_utf8_decode")) {
function pf_utf8_decode(string $string): string {
return iconv("UTF-8", "ISO-8859-1", $string);
@@ -30,7 +74,7 @@ if (!function_exists("getLastFronted")) {
}
if (!function_exists("createJob")) {
- function createJob($title, $options) {
+ function createJob($title, $options): void {
$job = [
"name" => $title,
"options" => $options,
@@ -42,7 +86,7 @@ if (!function_exists("createJob")) {
}
if (!function_exists("formatPonypush")) {
- function formatPonypush($message) {
+ function formatPonypush($message): string {
return "Update to Ponypush 3.1.0 or later — (\$PA1$\$" . base64_encode($message) . "\$\$)";
}
}
@@ -54,14 +98,14 @@ if (!function_exists("generateToken")) {
}
if (!function_exists("peh_error")) {
- function peh_error($message, $code = 500): void {
+ #[NoReturn] function peh_error($message, $code = 500): void {
header("Location: /?em=" . urlencode(base64_encode($message)) . "&ec=" . $code);
die();
}
}
if (!function_exists("getAsset")) {
- function getAsset($systemID, $memberID = null, $type = "avatars") {
+ function getAsset($systemID, $memberID = null, $type = "avatars"): string {
$app = $GLOBALS["ColdHazeApp"] ?? json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/app.json"), true);
$systemFile = (isset($app["other"]) && $systemID === $app["other"]["id"]) ? "other" : $systemID;
@@ -132,11 +176,7 @@ if (!function_exists("getAsset")) {
}
if (!function_exists("rgbToHsl")) {
- function rgbToHsl($r, $g, $b) {
- $oldR = $r;
- $oldG = $g;
- $oldB = $b;
-
+ function rgbToHsl($r, $g, $b): array {
$r /= 255;
$g /= 255;
$b /= 255;
@@ -176,13 +216,11 @@ if (!function_exists("rgbToHsl")) {
if (!function_exists("imageCreateCorners")) {
function imageCreateCorners($sourceImageFile, $radius) {
- # test source image
if (file_exists($sourceImageFile)) {
$res = is_array($info = getimagesize($sourceImageFile));
}
else $res = false;
- # open image
if ($res) {
$w = $info[0];
$h = $info[1];
@@ -198,13 +236,11 @@ if (!function_exists("imageCreateCorners")) {
}
}
- # create corners
if ($res) {
- $q = 10; # change this if you want
+ $q = 10;
$radius *= $q;
- # find unique color
do {
$r = rand(0, 255);
$g = rand(0, 255);
@@ -235,14 +271,12 @@ if (!function_exists("imageCreateCorners")) {
imagealphablending($img, true);
imagecolortransparent($img, $alphacolor);
- # resize image down
$dest = imagecreatetruecolor($w, $h);
imagealphablending($dest, false);
imagesavealpha($dest, true);
imagefilledrectangle($dest, 0, 0, $w, $h, $alphacolor);
imagecopyresampled($dest, $img, 0, 0, 0, 0, $w, $h, $nw, $nh);
- # output image
$res = $dest;
imagedestroy($src);
imagedestroy($img);
@@ -253,22 +287,8 @@ if (!function_exists("imageCreateCorners")) {
}
if (!function_exists("getMiniName")) {
- function getMiniName(string $name) {
- $parts = explode(" ", $name);
-
- if (strlen($parts[0]) > 3 && $parts[0] !== "Sweetie" && $parts[0] !== "Filly" && $parts[0] !== "Windy" && (isset($parts[1]) && $parts[1] !== "Brightdawn" && $parts[1] !== "Fizz")) {
- if ($parts[0] === "Princess") {
- array_shift($parts);
- }
-
- if (str_contains($parts[0], "/")) {
- return explode("/", $parts[0])[0];
- } else {
- return $parts[0];
- }
- } else {
- return $name;
- }
+ function getMiniName(string $name): string {
+ return $name;
}
}
@@ -339,7 +359,7 @@ if (!function_exists("getMemberWithoutSystem")) {
}
if (!function_exists("showMembersFromList")) {
- function showMembersFromList(array $list) {
+ function showMembersFromList(array $list): void {
foreach ($list as $member) { if ($member['name'] !== "unknown" && $member['name'] !== "fusion") {
echo('<a href="/' . $member['name'] . '" style="text-decoration:none !important;filter:none !important;"><div class="hpd-item-card" style="background-color:rgba(255, 255, 255, .1);border:1px solid ' . (isset($member['color']) ? "#" . $member['color'] . "55" : "transparent") . ';outline-color:' . (isset($member['color']) ? "#" . $member['color'] . "55" : "transparent") . ';border-radius:10px;text-align:center;display:flex;align-items:center;justify-content:center;padding:5px;' . (isset($member["equestria"]) && $member["equestria"] ? 'opacity:.5;' : '') . '"><div>
<img alt="" src="' . getAsset($member["system"], $member["id"]) . '" style="border-radius:999px;background-color:rgba(0, 0, 0, .25);height:48px;width:48px;display:block;margin-left:auto;margin-right:auto;">
@@ -351,7 +371,7 @@ if (!function_exists("showMembersFromList")) {
}
if (!function_exists("prettySize")) {
- function prettySize($bytes) {
+ function prettySize($bytes): string {
if ($bytes > 1024) {
if ($bytes > 1024**2) {
if ($bytes > 1024**3) {
@@ -369,7 +389,7 @@ if (!function_exists("prettySize")) {
}
if (!function_exists("showSystem")) {
- function showSystem(string $id, string $name, string $color, bool $hideTitle) {
+ function showSystem(string $id, string $name, string $color, bool $hideTitle): void {
$app = $GLOBALS["ColdHazeApp"] ?? json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/app.json"), true);
global $travelling;
@@ -401,7 +421,7 @@ if (!function_exists("showSystem")) {
showMembersFromList(scoreOrder([...array_map(function ($i) use ($id, $travelling) {
$i["travelling"] = false;
$i["system"] = $id;
- $i["equestria"] = $travelling[$i['id']]['travelling'] && $travelling[$i['id']]['equestria'];
+ if (isset($travelling[$i['id']])) $i["equestria"] = $travelling[$i['id']]['travelling'] && $travelling[$i['id']]['equestria'];
return $i;
}, array_filter(json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/" . (isset($app["other"]) && $id === $app["other"]["id"] ? "other" : $id) . "/members.json"), true), function ($i) use ($travelling) {
return !(isset($travelling[$i['id']]) && $travelling[$i['id']]['travelling'] && (!isset($travelling[$i['id']]['equestria']) || !$travelling[$i['id']]['equestria']));
@@ -549,7 +569,7 @@ if (!function_exists("timeIn")) {
}
if (!function_exists("duration")) {
- function duration($seconds) {
+ function duration($seconds): string {
global $lang; global $pages;
if ($seconds >= 60) {
@@ -586,7 +606,7 @@ if (!function_exists("duration")) {
}
if (!function_exists("relativeDate")) {
- function relativeDate($date, $showTime = true) {
+ function relativeDate($date, $showTime = true): string {
if (!is_numeric($date)) $date = strtotime($date);
if (!$showTime) {
@@ -620,6 +640,8 @@ if (!function_exists("getMemberSystem")) {
foreach ($list as $item) {
if ($item["id"] === $id) return $item["_system"];
}
+
+ return null;
}
}
@@ -630,6 +652,8 @@ if (!function_exists("getMemberFromName")) {
foreach ($list as $item) {
if ($item["name"] === $name) return getMemberWithoutSystem($item["id"]);
}
+
+ return null;
}
}
diff --git a/includes/util/language.inc b/includes/util/language.inc
deleted file mode 100644
index e24255f..0000000
--- a/includes/util/language.inc
+++ /dev/null
@@ -1,3 +0,0 @@
-<?php
-
-$lang = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/i18n/en.json"), true); \ No newline at end of file
diff --git a/includes/util/profiles.inc b/includes/util/profiles.inc
deleted file mode 100644
index 66274c7..0000000
--- a/includes/util/profiles.inc
+++ /dev/null
@@ -1,97 +0,0 @@
-<?php
-
-function calculateProfileScore($member) {
- $values = [
- ((isset($member["_metadata"]["birth"]["age"]) && $member["_metadata"]["birth"]["age"] > 0) || isset($member["_metadata"]["birth"]["year"]) && $member["_metadata"]["birth"]["year"] > 1900) || ((isset($member["_metadata"]["birth"]["age"]) && $member["_metadata"]["birth"]["age"] === -1) && in_array("alicorn", $member["_metadata"]["species"])),
- isset($member["_metadata"]["birth"]["date"]) && trim($member["_metadata"]["birth"]["date"]) !== "" && $member["_metadata"]["birth"]["date"] !== "01-01",
- file_exists($_SERVER['DOCUMENT_ROOT'] . "/includes/data/content/" . $member["id"] . ".html") && strlen(preg_replace("/[^a-zA-Z0-9]/m", "", file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/content/" . $member["id"] . ".html"))) > 200,
- file_exists($_SERVER['DOCUMENT_ROOT'] . "/includes/data/content/" . $member["id"] . "-private.html") && strlen(preg_replace("/[^a-zA-Z0-9]/m", "", file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/content/" . $member["id"] . "-private.html"))) > 200,
- isset($member["banner"]),
- file_exists($_SERVER['DOCUMENT_ROOT'] . "/assets/uploads/pt-" . $member["name"] . ".png"),
- isset($member["color"])
- ];
-
- $result = [
- "values" => $values,
- "pages" => [],
- "characters" => [],
- "score" => (float)array_reduce($values, function ($a, $b) {
- return $a + $b;
- }),
- "score2" => (float)array_reduce($values, function ($a, $b) {
- return $a + $b;
- }),
- "actions" => []
- ];
-
- if (file_exists($_SERVER['DOCUMENT_ROOT'] . "/includes/data/content/" . $member["id"] . ".html") && strlen(preg_replace("/[^a-zA-Z0-9]/m", "", file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/content/" . $member["id"] . ".html"))) <= 200) {
- $result["pages"][] = true;
- $result["score"] += strlen(preg_replace("/[^a-zA-Z0-9]/m", "", file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/content/" . $member["id"] . ".html"))) / 201;
- } else {
- $result["pages"][] = false;
- }
-
- if (file_exists($_SERVER['DOCUMENT_ROOT'] . "/includes/data/content/" . $member["id"] . "-private.html") && strlen(preg_replace("/[^a-zA-Z0-9]/m", "", file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/content/" . $member["id"] . "-private.html"))) <= 200) {
- $result["pages"][] = true;
- $result["score"] += strlen(preg_replace("/[^a-zA-Z0-9]/m", "", file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/content/" . $member["id"] . "-private.html"))) / 201;
- } else {
- $result["pages"][] = false;
- }
-
- if (file_exists($_SERVER['DOCUMENT_ROOT'] . "/includes/data/content/" . $member["id"] . ".html")) {
- $result["characters"][] = strlen(preg_replace("/[^a-zA-Z0-9]/m", "", file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/content/" . $member["id"] . ".html")));
- } else {
- $result["characters"][] = -1;
- }
-
- if (file_exists($_SERVER['DOCUMENT_ROOT'] . "/includes/data/content/" . $member["id"] . "-private.html")) {
- $result["characters"][] = strlen(preg_replace("/[^a-zA-Z0-9]/m", "", file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/content/" . $member["id"] . "-private.html")));
- } else {
- $result["characters"][] = -1;
- }
-
- if (!((isset($member["_metadata"]["birth"]["age"]) && $member["_metadata"]["birth"]["age"] > 0) || isset($member["_metadata"]["birth"]["year"]) && $member["_metadata"]["birth"]["year"] > 1900) && !(isset($member["_metadata"]["birth"]["age"]) && $member["_metadata"]["birth"]["age"] === -1) && in_array("alicorn", $member["_metadata"]["species"])) {
- $result["score"] += 0.5;
- }
-
- $result["progress"] = $result["score"] / 7;
- $result["sortable"] = (int)($result["progress"] * 100000000000000);
-
- if (!$result["values"][5]) {
- $result["actions"][] = "a Pony Town character";
- }
-
- if (!$result["values"][6]) {
- $result["actions"][] = "a color";
- }
-
- if (!$result["values"][2]) {
- if ($result["characters"][0] === -1) {
- $result["actions"][] = "a public page";
- } else {
- $result["actions"][] = (200 - $result["characters"][0]) . " characters to the public page";
- }
- }
-
- if (!$result["values"][3]) {
- if ($result["characters"][1] === -1) {
- $result["actions"][] = "a private page";
- } else {
- $result["actions"][] = (200 - $result["characters"][1]) . " characters to the private page";
- }
- }
-
- if (!$result["values"][4]) {
- $result["actions"][] = "a banner";
- }
-
- if (!$result["values"][0]) {
- $result["actions"][] = "an age";
- }
-
- if (!$result["values"][1]) {
- $result["actions"][] = "a birthdate";
- }
-
- return $result;
-} \ No newline at end of file
diff --git a/includes/util/pronouns.inc b/includes/util/pronouns.inc
deleted file mode 100644
index b7c8dd4..0000000
--- a/includes/util/pronouns.inc
+++ /dev/null
@@ -1,16 +0,0 @@
-<?php
-
-function getMemberPronouns(?string $pronouns): ?array {
- return [
- "gender" => "invalid",
- "gender:fr" => "invalide",
- "object" => "this pony",
- "person" => "pony",
- "possessive_det" => "this pony's",
- "possessive_pro" => "this pony's",
- "reflexive" => "this pony",
- "subjective" => "this pony",
- "third" => true,
- "color" => "success"
- ];
-} \ No newline at end of file
diff --git a/includes/util/rainbow.inc b/includes/util/rainbow.inc
index dc4d687..3dc9480 100644
--- a/includes/util/rainbow.inc
+++ b/includes/util/rainbow.inc
@@ -1,7 +1,6 @@
<?php
require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/util/functions.inc";
-require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/util/bitset.inc";
require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/util/score.inc";
function rainbow($hideCloudburst = false): array {
diff --git a/includes/util/short.inc b/includes/util/short.inc
index b586469..81c389d 100644
--- a/includes/util/short.inc
+++ b/includes/util/short.inc
@@ -1,7 +1,6 @@
<?php
require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/util/functions.inc";
-require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/util/bitset.inc";
require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/util/score.inc";
global $toplevel; global $lang; global $pages;
diff --git a/includes/util/timezones.inc b/includes/util/timezones.inc
deleted file mode 100644
index 040e2e6..0000000
--- a/includes/util/timezones.inc
+++ /dev/null
@@ -1,148 +0,0 @@
-<?php
-
-global $timezones;
-$timezones = [
- '(UTC-11:00) Midway Island' => 'Pacific/Midway',
- '(UTC-11:00) Samoa' => 'Pacific/Samoa',
- '(UTC-10:00) Hawaii' => 'Pacific/Honolulu',
- '(UTC-09:00) Alaska' => 'US/Alaska',
- '(UTC-08:00) Pacific Time (US &amp; Canada)' => 'America/Los_Angeles',
- '(UTC-08:00) Tijuana' => 'America/Tijuana',
- '(UTC-07:00) Arizona' => 'US/Arizona',
- '(UTC-07:00) Chihuahua' => 'America/Chihuahua',
- '(UTC-07:00) La Paz' => 'America/Chihuahua',
- '(UTC-07:00) Mazatlan' => 'America/Mazatlan',
- '(UTC-07:00) Mountain Time (US &amp; Canada)' => 'US/Mountain',
- '(UTC-06:00) Central America' => 'America/Managua',
- '(UTC-06:00) Central Time (US &amp; Canada)' => 'US/Central',
- '(UTC-06:00) Guadalajara' => 'America/Mexico_City',
- '(UTC-06:00) Mexico City' => 'America/Mexico_City',
- '(UTC-06:00) Monterrey' => 'America/Monterrey',
- '(UTC-06:00) Saskatchewan' => 'Canada/Saskatchewan',
- '(UTC-05:00) Bogota' => 'America/Bogota',
- '(UTC-05:00) Eastern Time (US &amp; Canada)' => 'US/Eastern',
- '(UTC-05:00) Indiana (East)' => 'US/East-Indiana',
- '(UTC-05:00) Lima' => 'America/Lima',
- '(UTC-05:00) Quito' => 'America/Bogota',
- '(UTC-04:00) Atlantic Time (Canada)' => 'Canada/Atlantic',
- '(UTC-04:30) Caracas' => 'America/Caracas',
- '(UTC-04:00) La Paz' => 'America/La_Paz',
- '(UTC-04:00) Santiago' => 'America/Santiago',
- '(UTC-03:30) Newfoundland' => 'Canada/Newfoundland',
- '(UTC-03:00) Brasilia' => 'America/Sao_Paulo',
- '(UTC-03:00) Buenos Aires' => 'America/Argentina/Buenos_Aires',
- '(UTC-03:00) Georgetown' => 'America/Argentina/Buenos_Aires',
- '(UTC-03:00) Greenland' => 'America/Godthab',
- '(UTC-02:00) Mid-Atlantic' => 'America/Noronha',
- '(UTC-01:00) Azores' => 'Atlantic/Azores',
- '(UTC-01:00) Cape Verde Is.' => 'Atlantic/Cape_Verde',
- '(UTC+00:00) Casablanca' => 'Africa/Casablanca',
- '(UTC+00:00) Edinburgh' => 'Europe/London',
- '(UTC+00:00) Greenwich Mean Time : Dublin' => 'Etc/Greenwich',
- '(UTC+00:00) Lisbon' => 'Europe/Lisbon',
- '(UTC+00:00) London' => 'Europe/London',
- '(UTC+00:00) Monrovia' => 'Africa/Monrovia',
- '(UTC+00:00) UTC' => 'UTC',
- '(UTC+01:00) Amsterdam' => 'Europe/Amsterdam',
- '(UTC+01:00) Belgrade' => 'Europe/Belgrade',
- '(UTC+01:00) Berlin' => 'Europe/Berlin',
- '(UTC+01:00) Bern' => 'Europe/Berlin',
- '(UTC+01:00) Bratislava' => 'Europe/Bratislava',
- '(UTC+01:00) Brussels' => 'Europe/Brussels',
- '(UTC+01:00) Budapest' => 'Europe/Budapest',
- '(UTC+01:00) Copenhagen' => 'Europe/Copenhagen',
- '(UTC+01:00) Ljubljana' => 'Europe/Ljubljana',
- '(UTC+01:00) Madrid' => 'Europe/Madrid',
- '(UTC+01:00) Paris' => 'Europe/Paris',
- '(UTC+01:00) Prague' => 'Europe/Prague',
- '(UTC+01:00) Rome' => 'Europe/Rome',
- '(UTC+01:00) Sarajevo' => 'Europe/Sarajevo',
- '(UTC+01:00) Skopje' => 'Europe/Skopje',
- '(UTC+01:00) Stockholm' => 'Europe/Stockholm',
- '(UTC+01:00) Vienna' => 'Europe/Vienna',
- '(UTC+01:00) Warsaw' => 'Europe/Warsaw',
- '(UTC+01:00) West Central Africa' => 'Africa/Lagos',
- '(UTC+01:00) Zagreb' => 'Europe/Zagreb',
- '(UTC+02:00) Athens' => 'Europe/Athens',
- '(UTC+02:00) Bucharest' => 'Europe/Bucharest',
- '(UTC+02:00) Cairo' => 'Africa/Cairo',
- '(UTC+02:00) Harare' => 'Africa/Harare',
- '(UTC+02:00) Helsinki' => 'Europe/Helsinki',
- '(UTC+02:00) Istanbul' => 'Europe/Istanbul',
- '(UTC+02:00) Jerusalem' => 'Asia/Jerusalem',
- '(UTC+02:00) Kyiv' => 'Europe/Helsinki',
- '(UTC+02:00) Pretoria' => 'Africa/Johannesburg',
- '(UTC+02:00) Riga' => 'Europe/Riga',
- '(UTC+02:00) Sofia' => 'Europe/Sofia',
- '(UTC+02:00) Tallinn' => 'Europe/Tallinn',
- '(UTC+02:00) Vilnius' => 'Europe/Vilnius',
- '(UTC+03:00) Baghdad' => 'Asia/Baghdad',
- '(UTC+03:00) Kuwait' => 'Asia/Kuwait',
- '(UTC+03:00) Minsk' => 'Europe/Minsk',
- '(UTC+03:00) Nairobi' => 'Africa/Nairobi',
- '(UTC+03:00) Riyadh' => 'Asia/Riyadh',
- '(UTC+03:00) Volgograd' => 'Europe/Volgograd',
- '(UTC+03:30) Tehran' => 'Asia/Tehran',
- '(UTC+04:00) Abu Dhabi' => 'Asia/Muscat',
- '(UTC+04:00) Baku' => 'Asia/Baku',
- '(UTC+04:00) Moscow' => 'Europe/Moscow',
- '(UTC+04:00) Muscat' => 'Asia/Muscat',
- '(UTC+04:00) St. Petersburg' => 'Europe/Moscow',
- '(UTC+04:00) Tbilisi' => 'Asia/Tbilisi',
- '(UTC+04:00) Yerevan' => 'Asia/Yerevan',
- '(UTC+04:30) Kabul' => 'Asia/Kabul',
- '(UTC+05:00) Islamabad' => 'Asia/Karachi',
- '(UTC+05:00) Karachi' => 'Asia/Karachi',
- '(UTC+05:00) Tashkent' => 'Asia/Tashkent',
- '(UTC+05:30) Chennai' => 'Asia/Calcutta',
- '(UTC+05:30) Kolkata' => 'Asia/Kolkata',
- '(UTC+05:30) Mumbai' => 'Asia/Calcutta',
- '(UTC+05:30) New Delhi' => 'Asia/Calcutta',
- '(UTC+05:30) Sri Jayawardenepura' => 'Asia/Calcutta',
- '(UTC+05:45) Kathmandu' => 'Asia/Katmandu',
- '(UTC+06:00) Almaty' => 'Asia/Almaty',
- '(UTC+06:00) Astana' => 'Asia/Dhaka',
- '(UTC+06:00) Dhaka' => 'Asia/Dhaka',
- '(UTC+06:00) Ekaterinburg' => 'Asia/Yekaterinburg',
- '(UTC+06:30) Rangoon' => 'Asia/Rangoon',
- '(UTC+07:00) Bangkok' => 'Asia/Bangkok',
- '(UTC+07:00) Hanoi' => 'Asia/Bangkok',
- '(UTC+07:00) Jakarta' => 'Asia/Jakarta',
- '(UTC+07:00) Novosibirsk' => 'Asia/Novosibirsk',
- '(UTC+08:00) Beijing' => 'Asia/Hong_Kong',
- '(UTC+08:00) Chongqing' => 'Asia/Chongqing',
- '(UTC+08:00) Hong Kong' => 'Asia/Hong_Kong',
- '(UTC+08:00) Krasnoyarsk' => 'Asia/Krasnoyarsk',
- '(UTC+08:00) Kuala Lumpur' => 'Asia/Kuala_Lumpur',
- '(UTC+08:00) Perth' => 'Australia/Perth',
- '(UTC+08:00) Singapore' => 'Asia/Singapore',
- '(UTC+08:00) Taipei' => 'Asia/Taipei',
- '(UTC+08:00) Ulaan Bataar' => 'Asia/Ulan_Bator',
- '(UTC+08:00) Urumqi' => 'Asia/Urumqi',
- '(UTC+09:00) Irkutsk' => 'Asia/Irkutsk',
- '(UTC+09:00) Osaka' => 'Asia/Tokyo',
- '(UTC+09:00) Sapporo' => 'Asia/Tokyo',
- '(UTC+09:00) Seoul' => 'Asia/Seoul',
- '(UTC+09:00) Tokyo' => 'Asia/Tokyo',
- '(UTC+09:30) Adelaide' => 'Australia/Adelaide',
- '(UTC+09:30) Darwin' => 'Australia/Darwin',
- '(UTC+10:00) Brisbane' => 'Australia/Brisbane',
- '(UTC+10:00) Canberra' => 'Australia/Canberra',
- '(UTC+10:00) Guam' => 'Pacific/Guam',
- '(UTC+10:00) Hobart' => 'Australia/Hobart',
- '(UTC+10:00) Melbourne' => 'Australia/Melbourne',
- '(UTC+10:00) Port Moresby' => 'Pacific/Port_Moresby',
- '(UTC+10:00) Sydney' => 'Australia/Sydney',
- '(UTC+10:00) Yakutsk' => 'Asia/Yakutsk',
- '(UTC+11:00) Vladivostok' => 'Asia/Vladivostok',
- '(UTC+12:00) Auckland' => 'Pacific/Auckland',
- '(UTC+12:00) Fiji' => 'Pacific/Fiji',
- '(UTC+12:00) International Date Line West' => 'Pacific/Kwajalein',
- '(UTC+12:00) Kamchatka' => 'Asia/Kamchatka',
- '(UTC+12:00) Magadan' => 'Asia/Magadan',
- '(UTC+12:00) Marshall Is.' => 'Pacific/Fiji',
- '(UTC+12:00) New Caledonia' => 'Asia/Magadan',
- '(UTC+12:00) Solomon Is.' => 'Asia/Magadan',
- '(UTC+12:00) Wellington' => 'Pacific/Auckland',
- '(UTC+13:00) Nuku\'alofa' => 'Pacific/Tongatapu'
-]; \ No newline at end of file
diff --git a/pages/account.inc b/pages/account.inc
index b8fc9f5..216892c 100644
--- a/pages/account.inc
+++ b/pages/account.inc
@@ -1,8 +1,6 @@
<?php
require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/init.inc"; global $title; global $isLoggedIn; global $lang; global $pages;
-require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/util/evening.inc";
-
require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/components/header.inc'; ?>
<br>
@@ -25,7 +23,7 @@ require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/components/header.inc'; ?>
<hr>
<?php $version = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/version.json"), true); ?>
- <p>Cold Haze System Software, build <?= $version["build"] ?>.<?= $version["revision"] ?> · © 2022-<?= date('Y') ?> <a href="https://equestria.dev" target="_blank">Equestria.dev Developers</a></p>
+ <p>Ponycule Software, build <?= $version["build"] ?>.<?= $version["revision"] ?> · © 2022-<?= date('Y') ?> <a href="https://equestria.dev" target="_blank">Equestria.dev Developers</a></p>
</div>
</div>
diff --git a/pages/alerts.inc b/pages/alerts.inc
index a0b47ff..ec6c988 100644
--- a/pages/alerts.inc
+++ b/pages/alerts.inc
@@ -1,7 +1,6 @@
<?php
-require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/init.inc"; global $title; global $isLoggedIn; global $lang; global $pages;
-require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/util/evening.inc";
+require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/init.inc"; global $title; global $isLoggedIn; global $lang; global $pages; global $_PROFILE; global $isLowerLoggedIn;
require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/components/header.inc'; ?>
@@ -25,12 +24,15 @@ require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/components/header.inc'; ?>
}, 1000);
</script><?php endif; ?>
</a>
+ <?php if (!$isLowerLoggedIn): ?>
<a href="/-/wakeup" class="list-group-item list-group-item-action" style="display: grid; grid-template-columns: max-content 1fr;">
<img src="<?= icon('wakeup', null, true) ?>" style="margin-right: 5px; height: 24px; width: 24px;"><div style="display: flex; align-items: center; color: var(--bs-body-color);">Wake-up alert</div>
</a>
+ <?php endif; if ($_PROFILE["login"] !== "Moonwind"): ?>
<a href="/-/pleasure" class="list-group-item list-group-item-action" style="display: grid; grid-template-columns: max-content 1fr;">
<img src="<?= icon('pleasure', null, true) ?>" style="margin-right: 5px; height: 24px; width: 24px;"><div style="display: flex; align-items: center; color: var(--bs-body-color);">Pleasure alert</div>
</a>
+ <?php endif; ?>
</div>
</div>
</div>
diff --git a/pages/api/2023ui.php b/pages/api/2023ui.php
deleted file mode 100644
index 0501b9a..0000000
--- a/pages/api/2023ui.php
+++ /dev/null
@@ -1,5 +0,0 @@
-<?php
-
-setcookie("new2023UI", "yes", time() + 86400*365, "/", "", true, true);
-header("Location: /?ui2023intro");
-die(); \ No newline at end of file
diff --git a/pages/api/close.php b/pages/api/close.php
deleted file mode 100644
index 07d1cff..0000000
--- a/pages/api/close.php
+++ /dev/null
@@ -1 +0,0 @@
-<script>window.close();</script> \ No newline at end of file
diff --git a/pages/api/computer.php b/pages/api/computer.php
deleted file mode 100644
index 2c75183..0000000
--- a/pages/api/computer.php
+++ /dev/null
@@ -1,68 +0,0 @@
-<?php
-
-if (time() >= 1688169600) die();
-
-if (isset($_GET["chrome"])) {
- header("Access-Control-Allow-Origin: chrome-extension://" . preg_replace("/[^a-z]/m", "", $_GET["chrome"]));
- header("Access-Control-Allow-Credentials: true");
-}
-
-require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/util/session.inc"; global $isLoggedIn; global $_PROFILE;
-
-if (!$isLoggedIn || !isset($_PROFILE) || !isset($_PROFILE["login"])) {
- header("Location: /-/login");
- die();
-}
-
-$request_raw = file_get_contents('php://input');
-$json_object = json_decode($request_raw, true);
-
-$host = md5($json_object['host'] ?? $_GET["host"]);
-
-switch ($_GET['type']) {
- case "heartbeat":
- if (file_exists($_SERVER['DOCUMENT_ROOT'] . "/includes/data/computers/metadata/" . $_PROFILE['login'] . "-" . $host . ".json")) {
- $data = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/computers/metadata/" . $_PROFILE['login'] . "-" . $host . ".json"), true);
- $data["date"] = date('c');
- file_put_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/computers/metadata/" . $_PROFILE['login'] . "-" . $host . ".json", json_encode($data));
- }
- break;
-
- case "screenshot":
- $id = $json_object['id'];
- $data = base64_decode($json_object['data']);
-
- if (!file_exists($_SERVER['DOCUMENT_ROOT'] . "/includes/data/computers/screens")) mkdir($_SERVER['DOCUMENT_ROOT'] . "/includes/data/computers/screens");
- file_put_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/computers/screens/" . $_PROFILE['login'] . "-" . $host . "-" . $id . ".jpg", $data);
- break;
-
- case "window":
- $id = sha1($json_object['id']);
- $data = base64_decode($json_object['data']);
-
- if (!file_exists($_SERVER['DOCUMENT_ROOT'] . "/includes/data/computers/windows")) mkdir($_SERVER['DOCUMENT_ROOT'] . "/includes/data/computers/windows");
- file_put_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/computers/windows/" . $_PROFILE['login'] . "-" . $host . "-" . $id . ".jpg", $data);
-
- if (isset($json_object['icon'])) {
- $data2 = base64_decode($json_object['icon']);
- file_put_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/computers/windows/" . $_PROFILE['login'] . "-" . $host . "-" . $id . ".png", $data2);
- } else {
- file_put_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/computers/windows/" . $_PROFILE['login'] . "-" . $host . "-" . $id . ".png", "");
- }
-
- break;
-
- case "data":
- if (!file_exists($_SERVER['DOCUMENT_ROOT'] . "/includes/data/computers/metadata")) mkdir($_SERVER['DOCUMENT_ROOT'] . "/includes/data/computers/metadata");
- if (isset($json_object["_session"])) unset($json_object["_session"]);
- file_put_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/computers/metadata/" . $_PROFILE['login'] . "-" . $host . ".json", json_encode($json_object));
- break;
-}
-
-if (isset($_GET["json"])) {
- die(json_encode([
- "id" => $_PROFILE['login'] . "-" . $host
- ]));
-} else {
- die($_PROFILE['login'] . "-" . $host);
-} \ No newline at end of file
diff --git a/pages/api/computername.php b/pages/api/computername.php
deleted file mode 100644
index 477a8e6..0000000
--- a/pages/api/computername.php
+++ /dev/null
@@ -1,12 +0,0 @@
-<?php
-
-if (time() >= 1688169600) die();
-
-require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/util/session.inc"; global $isLoggedIn; global $_PROFILE;
-if (!$isLoggedIn) header("Location: /-/login") and die();
-
-$names = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/computers/names.json"), true);
-$names[$_GET["id"]] = $_GET["name"];
-file_put_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/computers/names.json", json_encode($names));
-
-die(); \ No newline at end of file
diff --git a/pages/api/data.php b/pages/api/data.php
deleted file mode 100644
index eb07824..0000000
--- a/pages/api/data.php
+++ /dev/null
@@ -1,12 +0,0 @@
-<?php
-
-require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/util/session.inc"; global $isLoggedIn;
-require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/util/bitset.inc";
-if (!$isLoggedIn) header("Location: /-/login") and die();
-
-if (!isset($_GET['f']) || !file_exists($_SERVER['DOCUMENT_ROOT'] . "/includes/data/" . $_GET['f'])) {
- die();
-} else {
- header("Content-Type: " . mime_content_type($_SERVER['DOCUMENT_ROOT'] . "/includes/data/" . $_GET['f']));
- die(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/" . $_GET['f']));
-} \ No newline at end of file
diff --git a/pages/api/design.php b/pages/api/design.php
deleted file mode 100644
index 1894a75..0000000
--- a/pages/api/design.php
+++ /dev/null
@@ -1,58 +0,0 @@
-<?php
-
-require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/util/session.inc"; global $isLoggedIn;
-require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/util/random.inc";
-
-if (!$isLoggedIn || !isset($_GET["type"]) || !isset($_GET["member"])) die("Not logged in or missing operand");
-if (!file_exists($_SERVER['DOCUMENT_ROOT'] . "/assets/ponies/" . $_GET["member"] . ".png")) die("No initial Pony Town character");
-
-$designs = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/designs/" . $_GET["member"] . ".json"), true);
-
-$inputJSON = file_get_contents('php://input');
-$input = json_decode($inputJSON, true);
-
-switch ($_GET["type"]) {
- case "name":
- $designs[$_GET["id"]]["name"] = trim(strip_tags(substr(base64_decode($_GET["value"]), 0, 100)));
-
- if (trim(strip_tags(substr(base64_decode($_GET["value"]), 0, 100))) === "" && $_GET["id"] !== "_main") {
- unset($designs[$_GET["id"]]);
- echo("&");
- }
-
- break;
-
- case "note":
- $designs[$_GET["id"]]["note"] = trim(strip_tags(substr(base64_decode($_GET["value"]), 0, 100)));
- break;
-
- case "upload":
- $id = random();
-
- $file = base64_decode($input["file"]);
- $image = @imagecreatefromstring($file);
-
- imagealphablending($image, false);
- imagesavealpha($image, true);
-
- imagepng($image, "/tmp/temp-" . $id . ".png");
- $text = base64_encode(file_get_contents("/tmp/temp-" . $id . ".png"));
- unlink("/tmp/temp-" . $id . ".png");
-
- $designs[$id] = [
- "name" => "Untitled",
- "note" => "ID: " . $id,
- "image" => $text
- ];
-
- break;
-
- default:
- die("Invalid type");
-}
-
-file_put_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/designs/" . $_GET["member"] . ".json", json_encode($designs));
-
-while (trim(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/designs/" . $_GET["member"] . ".json")) === "") {
- file_put_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/designs/" . $_GET["member"] . ".json", json_encode($designs));
-} \ No newline at end of file
diff --git a/pages/api/evening.php b/pages/api/evening.php
deleted file mode 100644
index 4d420ab..0000000
--- a/pages/api/evening.php
+++ /dev/null
@@ -1,155 +0,0 @@
-<?php
-
-require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/util/functions.inc";
-require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/util/session.inc"; global $isLoggedIn; global $isLowerLoggedIn;
-if (!$isLoggedIn || $isLowerLoggedIn) {
- header("Location: /-/login");
- die();
-}
-
-$pairs = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/evening/pairs.json"), true);
-$ignored = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/evening/ignored.json"), true);
-$locked = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/evening/locked.json"), true);
-$data = [];
-
-$members = $members = [
- ...array_map(function ($i) {
- $system = "ynmuc";
- $i["_lastFronted"] = -1;
- $id = $i["id"];
- $memberData = $i;
-
- $fronters = array_map(function ($item) {
- return $item["id"];
- }, json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/$system/fronters.json"), true)["members"]);
-
- if (in_array($id, $fronters)) {
- $i["_lastFronted"] = time();
- } else {
- $switches = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/$system/switches.json"), true);
-
- $thisMember = array_filter($switches, function ($item) use ($memberData) {
- return in_array($memberData["id"], $item["members"]);
- });
-
- $thisMember = array_values($thisMember);
- $frontingEnd = null;
-
- if (count($thisMember) > 0) {
- $thisIndex = array_search($thisMember[0], $switches);
-
- $frontingStart = $thisMember[0];
- $frontingEnd = $switches[$thisIndex - 1];
- }
-
- if ($frontingEnd !== null && isset($frontingStart)) {
- $i["_lastFronted"] = strtotime($frontingEnd["timestamp"]);
- }
- }
-
- return $i;
- }, array_values(array_filter(scoreOrderGlobal(), function ($i) {
- return $i["_system"] === "ynmuc";
- }))),
- ...array_map(function ($i) {
- $system = "gdapd";
- $i["_lastFronted"] = -1;
- $id = $i["id"];
- $memberData = $i;
-
- $fronters = array_map(function ($item) {
- return $item["id"];
- }, json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/$system/fronters.json"), true)["members"]);
-
- if (in_array($id, $fronters)) {
- $i["_lastFronted"] = time();
- } else {
- $switches = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/$system/switches.json"), true);
-
- $thisMember = array_filter($switches, function ($item) use ($memberData) {
- return in_array($memberData["id"], $item["members"]);
- });
-
- $thisMember = array_values($thisMember);
- $frontingEnd = null;
-
- if (count($thisMember) > 0) {
- $thisIndex = array_search($thisMember[0], $switches);
-
- $frontingStart = $thisMember[0];
- $frontingEnd = $switches[$thisIndex - 1];
- }
-
- if ($frontingEnd !== null && isset($frontingStart)) {
- $i["_lastFronted"] = strtotime($frontingEnd["timestamp"]);
- }
- }
-
- return $i;
- }, array_values(array_filter(scoreOrderGlobal(), function ($i) {
- return $i["_system"] === "gdapd";
- })))
-];
-
-usort($pairs, function ($a, $b) use ($members) {
- $times = [];
-
- foreach ($a[0] as $id) {
- if (getLastFronted($members, $id) > 0) $times[] = getLastFronted($members, $id);
- }
- foreach ($a[1] as $id) {
- if (getLastFronted($members, $id) > 0) $times[] = getLastFronted($members, $id);
- }
-
- $timeA = time() - min($times);
- $times = [];
-
- foreach ($b[0] as $id) {
- if (getLastFronted($members, $id) > 0) $times[] = getLastFronted($members, $id);
- }
- foreach ($b[1] as $id) {
- if (getLastFronted($members, $id) > 0) $times[] = getLastFronted($members, $id);
- }
-
- $timeB = time() - min($times);
-
- return $timeB - $timeA;
-}); $pairs = array_values($pairs); foreach ($pairs as $pair): $times = [];
- foreach ($pair[0] as $id): $times[] = getLastFronted($members, $id); endforeach;
- foreach ($pair[1] as $id): $times[] = getLastFronted($members, $id); endforeach;
-endforeach;
-
-$listI = 0; for ($i = 0; $i < 7; $i++): $pair = $pairs[$listI];
- $realPair = $pair;
-
- if (isset($locked[date('Y-m-d', time() + 86400 * $i)])) {
- $pair = array_map(function ($i) {
- return explode(",", $i);
- }, explode("|", $locked[date('Y-m-d', time() + 86400 * $i)]));
- }
-
- $data[$i] = [];
- if (!in_array(date('Y-m-d', time() + 86400 * $i), $ignored)) {
- $data[$i][0] = [];
- $data[$i][1] = [];
- foreach ($pair[0] as $id):
- $data[$i][0][] = (getMemberWithoutSystem($id)["display_name"] ?? getMemberWithoutSystem($id)["name"]) . (isset($locked[date('Y-m-d', time() + 86400 * $i)]) ? "*" : "");
- endforeach;
- foreach ($pair[1] as $id):
- $data[$i][1][] = (getMemberWithoutSystem($id)["display_name"] ?? getMemberWithoutSystem($id)["name"]) . (isset($locked[date('Y-m-d', time() + 86400 * $i)]) ? "*" : "");
- endforeach;
- } else {
- $data[$i] = null;
- }
-
- if (
- (!isset($locked[date('Y-m-d', time() + 86400 * $i)]) && !in_array(date('Y-m-d', time() + 86400 * $i), $ignored))
- || (isset($locked[date('Y-m-d', time() + 86400 * $i)]) && $locked[date('Y-m-d', time() + 86400 * $i)] === implode(",", $realPair[0]) . "|" . implode(",", $realPair[1]))
- ) {
- $listI++;
- }
-
- if ($listI === count($pairs)) $listI = 0; endfor;
-
-header("Content-Type: application/json");
-die(json_encode($data, JSON_PRETTY_PRINT)); \ No newline at end of file
diff --git a/pages/api/overage.php b/pages/api/overage.php
deleted file mode 100644
index aef4ac6..0000000
--- a/pages/api/overage.php
+++ /dev/null
@@ -1,47 +0,0 @@
-<?php
-
-require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/util/session.inc"; global $isLoggedIn; global $_PROFILE;
-require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/util/functions.inc";
-if (!$isLoggedIn) header("Location: /-/login") and die();
-
-header("Content-Type: application/json");
-
-$obj = [
- "raindrops" => null,
- "cloudburst" => null
-];
-
-foreach (["raindrops", "cloudburst"] as $userName) {
- $allowNsfw = null;
- $fronters = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/" . ($userName === "raindrops" ? "gdapd" : "ynmuc") . "/fronters.json"), true);
-
- if (count($fronters["members"]) > 0) {
- $id = $fronters["members"][0]["id"];
-
- if (file_exists($_SERVER['DOCUMENT_ROOT'] . "/includes/data/metadata/" . $id . ".json")) {
- $info = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/metadata/" . $id . ".json"), true);
-
- if (isset($info["birth"]["age"]) && $info["birth"]["age"] < 15 && $info["birth"]["age"] > 0) {
- $allowNsfw = false;
- } else if (isset($info["birth"]["year"]) && $info["birth"]["year"] > 1900) {
- if (!isset($info["birth"]["date"])) $info["birth"]["date"] = "01-01";
-
- $age = (int)date('Y') - $info["birth"]["year"] + (strtotime(date('Y') . "-" . $info["birth"]["date"]) <= time() ? 0 : -1);
-
- if ($age < 15) {
- $allowNsfw = false;
- } else {
- $allowNsfw = true;
- }
- } else if ((!isset($info["birth"]["age"]) || $info["birth"]["age"] === 0) && (!isset($info["birth"]["year"]) || $info["birth"]["year"] > 1900)) {
- $allowNsfw = false;
- } else {
- $allowNsfw = true;
- }
- }
- }
-
- $obj[$userName] = $allowNsfw;
-}
-
-die(json_encode($obj, JSON_PRETTY_PRINT)); \ No newline at end of file
diff --git a/pages/api/pleasure-real.php b/pages/api/pleasure-real.php
index 122d994..b523c1a 100644
--- a/pages/api/pleasure-real.php
+++ b/pages/api/pleasure-real.php
@@ -9,8 +9,6 @@ if (!$isLoggedIn && !$isLowerLoggedIn) {
global $_PROFILE;
-if ($_PROFILE["login"] === "cloudburst") return;
-
$frontRaindrops = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/gdapd/fronters.json"), true)["members"];
$frontOther = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/other/fronters.json"), true)["members"];
diff --git a/pages/api/pleasure.php b/pages/api/pleasure.php
index 14abada..58def71 100644
--- a/pages/api/pleasure.php
+++ b/pages/api/pleasure.php
@@ -9,8 +9,6 @@ if (!$isLoggedIn && !$isLowerLoggedIn) {
global $_PROFILE;
-if ($_PROFILE["login"] === "cloudburst") return;
-
$frontRaindrops = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/gdapd/fronters.json"), true)["members"];
$frontOther = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/other/fronters.json"), true)["members"];
diff --git a/pages/api/ponytown.php b/pages/api/ponytown.php
index 6deec43..bc40975 100644
--- a/pages/api/ponytown.php
+++ b/pages/api/ponytown.php
@@ -20,7 +20,7 @@ if (getMemberWithoutSystem($select) === null) {
$member = getMemberWithoutSystem($select);
-if ($isLowerLoggedIn && $member["_system"] !== $app["other"]["id"]) {
+if ($isLowerLoggedIn && $member["_system"] !== $app["other"]["id"] && $member["_system"] !== "hrbom") {
peh_error("System member not found", 404);
return;
}
diff --git a/pages/docs.inc b/pages/docs.inc
index 58256c7..403a4f9 100644
--- a/pages/docs.inc
+++ b/pages/docs.inc
@@ -24,7 +24,7 @@ if ($select === "add") {
if (ctype_alnum($select) && file_exists($_SERVER['DOCUMENT_ROOT'] . "/includes/data/docs/" . $select . ".json")) {
$id = $_documentId = $select;
$data = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/docs/" . $select . ".json"), true);
- $titleBase = " · " . $title . " · Cold Haze";
+ $titleBase = " · " . $title . " · Ponycule";
$title = $data["name"] . " · " . $title;
} else {
header("Location: /-/docs");
@@ -58,7 +58,6 @@ function showDocument($item) { ?>
<div class="container">
<div>
<?php if (isset($data)): ?><div id="page-content">
- <?php if (isset($data["nsfw"]) && $data["nsfw"]): ?><script>requestExplicit("back");</script><?php endif; ?>
<h2>
<span contenteditable="true" id="document-name" style="outline: none;"><?= $data["name"] ?></span>
<a href="/-/docs" class="small btn btn-outline-light" style="float:right;margin-top:5px;vertical-align:middle;opacity:1 !important; color:white;">Back</a>
diff --git a/pages/evening.inc b/pages/evening.inc
deleted file mode 100644
index 59c34e4..0000000
--- a/pages/evening.inc
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/init.inc"; global $title; global $isLoggedIn; global $lang; global $pages;
-require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/util/evening.inc";
-
-require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/components/header.inc'; ?>
-
-<br>
-<?php require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/fragments/evening.inc"; ?>
-
-<?php require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/components/footer.inc'; ?>
diff --git a/pages/home.inc b/pages/home.inc
index 11a01de..b4dc96a 100644
--- a/pages/home.inc
+++ b/pages/home.inc
@@ -4,200 +4,10 @@ if (isset($_GET["ec"])) {
header("HTTP/1.1 " . $_GET["ec"] . " Error");
}
-require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/init.inc"; require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/components/header.inc'; global $readOnly; global $isNormallyLoggedIn; global $_PROFILE; global $lang; global $pages; global $isLowerLoggedIn; global $app; global $isLoggedIn;
+require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/init.inc"; global $isLoggedIn; global $isLowerLoggedIn;
-global $use2023UI;
-
-function banner() { global $isLoggedIn; global $isLowerLoggedIn; $byColor = getMembersByColor(false, true); global $lang; global $use2023UI; ?>
- <div style="text-align: center;">
- <img alt="" src="/assets/logo/newlogo<?= $isLoggedIn || $isLowerLoggedIn ? "3" : "" ?>.png" style="width:128px;" class="old-ui">
- <img alt="" src="/assets/logo/newlogo-ng.png" style="width:128px;" class="new-ui">
- <p style="z-index:999;position:relative;background:transparent;margin: 20px -10px 0 -20px;padding-right:30px;height:32px;text-align: center;display:grid;grid-template-columns: repeat(<?= count($byColor) ?>, 1fr);">
- <?php foreach ($byColor as $member): ?><a class="rainbow-item" style="overflow: hidden;"><img title="<?= $member["display_name"] ?? $member["name"] ?>" data-bs-toggle="tooltip" src="<?= getAsset($member["_system"], $member["id"], "heads") ?>" style="height:32px;position:absolute;z-index:99;"></a><?php endforeach; ?>
- </p>
- <div style="margin-top:-33px;margin-bottom:0;margin-left:-20px;margin-right:20px;height:32px;text-align: center;display:grid;grid-template-columns: repeat(<?= count($byColor) ?>, 1fr);position:relative;left:10px;">
- <?php foreach ($byColor as $member): ?><div>
- <span style="display: inline-block;background: transparent;position:absolute;width: 0;height: 0;margin-top: 17px;box-shadow: 0 6px 20px 20px #<?= $member["color"] ?>;z-index: 9;margin-left: 8px;opacity: .75;"></span>
- </div><?php endforeach; ?>
- </div>
- <div id="banner-lower" style="padding:5px 10px;background:#3332328a;position:relative;z-index: 999;backdrop-filter: blur(30px);">
- <h2 style="margin-top: 20px;">Cold Haze</h2>
- <?php if ($isLoggedIn || $isLowerLoggedIn): ?>
- <p><?= count($byColor) ?> ponies in 4 plural systems</p>
- <?php else: ?>
- <p><?= count($byColor) ?> ponies in 3 plural systems</p>
- <?php endif; ?>
- </div>
- </div>
-<?php }
-
-function members() { global $isLoggedIn; global $isLowerLoggedIn; global $app; ?>
- <div id="new-homepage" style="margin-top:20px;">
-
- <div id="new-homepage-systems" <?php if ($isLoggedIn || $isLowerLoggedIn): ?>style="grid-template-columns: repeat(4, 1fr);"<?php endif; ?>>
- <?php newHomepage("ynmuc", "cloudburst", true); ?>
- <?php newHomepage("gdapd", "raindrops", true); ?>
- <?php if ($isLoggedIn || $isLowerLoggedIn) newHomepage($app["other"]["id"], $app["other"]["slug"], true); ?>
- <?php newHomepage("hrbom", "moonglow", true); ?>
- </div>
-
- </div>
-<?php } ?>
-
-<br>
-<div class="container">
- <?php if (isset($_GET['em'])): ?>
- <div class="alert alert-danger alert-dismissible">
- <button onclick='window.history.pushState({"html":null,"pageTitle":document.title},"", "/");' type="button" class="btn-close" data-bs-dismiss="alert"></button>
- <b><?= $lang["home"]["error"] ?> </b><?= strip_tags(base64_decode($_GET['em'])) ?>
- </div>
- <?php endif; ?>
-
- <div class="alert alert-warning alert-dismissible" id="gpuWarning" style="display: none;">
- <button onclick='window.history.pushState({"html":null,"pageTitle":document.title},"", "/");' type="button" class="btn-close" data-bs-dismiss="alert"></button>
- <b>GPU acceleration is turned off or not supported.</b> A lot of visual effects on this website rely on GPU acceleration, which is currently disabled on your browser, meaning the website's overall look will be affected. Please enable GPU acceleration in your browser settings.
- </div>
-
- <?php if ($readOnly && $isNormallyLoggedIn || $readOnly && $isLowerLoggedIn): ?>
- <div class="alert alert-warning">
- <b>Notice: </b>This website is temporarily under maintenance and the administrators have locked the database. Although you are logged in as <?= $_PROFILE['name'] ?>, you cannot access any of the logged-in features while the website is under maintenance. <a href="/-/emergency">Alerts dispatching</a> remains possible in case of an emergency.
- </div>
- <?php endif; ?>
-
-
- <?php
-
- //file_put_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/cache/home.json", "{}");
- $cache = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/cache/home.json"), true);
- if (!isset($cache["banner"])) $cache["banner"] = [];
- if (!isset($cache["members"])) $cache["members"] = [];
-
- if (!isset($cache["banner"]["public"])) {
- ob_start();
-
- $isLoggedInOldState = $isLoggedIn;
- $isLowerLoggedInOldState = $isLowerLoggedIn;
- $isLoggedIn = false;
- $isLowerLoggedIn = false;
- banner();
- $isLoggedIn = $isLoggedInOldState;
- $isLowerLoggedIn = $isLowerLoggedInOldState;
-
- $cache["banner"]["public"] = ob_get_contents();
- ob_end_clean();
- }
-
- if (!isset($cache["banner"]["private"])) {
- ob_start();
-
- $isLoggedInOldState = $isLoggedIn;
- $isLowerLoggedInOldState = $isLowerLoggedIn;
- $isLoggedIn = true;
- $isLowerLoggedIn = true;
- banner();
- $isLoggedIn = $isLoggedInOldState;
- $isLowerLoggedIn = $isLowerLoggedInOldState;
-
- $cache["banner"]["private"] = ob_get_contents();
- ob_end_clean();
- }
-
- if (!isset($cache["members"]["public"])) {
- ob_start();
-
- $isLoggedInOldState = $isLoggedIn;
- $isLowerLoggedInOldState = $isLowerLoggedIn;
- $isLoggedIn = false;
- $isLowerLoggedIn = false;
- members();
- $isLoggedIn = $isLoggedInOldState;
- $isLowerLoggedIn = $isLowerLoggedInOldState;
-
- $cache["members"]["public"] = ob_get_contents();
- ob_end_clean();
- }
-
- if (!isset($cache["members"]["private"])) {
- ob_start();
-
- $isLoggedInOldState = $isLoggedIn;
- $isLowerLoggedInOldState = $isLowerLoggedIn;
- $isLoggedIn = true;
- $isLowerLoggedIn = true;
- members();
- $isLoggedIn = $isLoggedInOldState;
- $isLowerLoggedIn = $isLowerLoggedInOldState;
-
- $cache["members"]["private"] = ob_get_contents();
- ob_end_clean();
- }
-
- if ($isLowerLoggedIn || $isLoggedIn) {
- echo($cache["banner"]["private"]);
- } else {
- echo($cache["banner"]["public"]);
- }
-
- ?>
- <div id="timeline-container" style="background: #3332328a;padding: 5px 10px;border-top:1px solid rgba(255,255,255,.1);border-bottom-left-radius: 10px;border-bottom-right-radius: 10px;">
- <div id="timeline"></div>
- <script>
- async function refreshTimeline() {
- document.getElementById("timeline").innerHTML = await (await fetch("/api/timeline?gdapd&ynmuc<?= ($isLowerLoggedIn || $isLoggedIn) ? "&" . $app["other"]["id"] : "" ?>&hrbom")).text();
-
- Array.from(document.getElementsByClassName("dynamic-time")).forEach((el) => {
- let time = el.getAttribute("data-time");
- el.innerText = new Date(parseInt(time) * 1000).toTimeString().split(":").splice(0, 2).join(":");
- });
-
- Array.from(document.getElementsByClassName("dynamic-time-mobile")).forEach((el) => {
- let time = el.getAttribute("data-time");
- el.innerText = new Date(parseInt(time) * 1000).toTimeString().split(":")[0] + ":";
- });
- }
-
- setInterval(refreshTimeline, 10000);
- refreshTimeline();
- </script>
- </div>
-
- <?php if ($isLoggedIn || $isLowerLoggedIn): ?>
- <div class="alert alert-warning" style="margin-top: 20px;">
- <b>Cold Haze Documents is now deprecated.</b> Cold Haze's Documents feature is now deprecated in favor of Google Docs and will be removed in the future. Please migrate your documents to Google Drive as soon as possible.
- </div>
- <?php endif; ?>
-
- <!--<div class="alert alert-warning" style="margin-top:20px;">
- <b>Notice:</b> The administrators are currently trying a new optimisation technique based on a virtual file system (chvfs). Data loss, corruption or inconsistency may happen and should be reported on <a href="https://bugs.equestria.dev/issues/CH" target="_blank">bugs.equestria.dev</a>.
- </div>-->
-
- <?php if (isset($_COOKIE["PEH2_SESSION_TOKEN"]) && $_COOKIE["PEH2_SESSION_TOKEN"] !== "" && !$isLoggedIn && !$isLowerLoggedIn): ?>
- <div class="alert alert-warning" style="margin-top:20px;">
- <b>You were previously logged in to Cold Haze, </b>however you have been logged out due to inactivity, due to your device being removed, or due to switching to a new authentication system (such as the v3). Please log in again. <a href="https://bugs.equestria.dev/issue/CH-56/Better-session-security" target="_blank">Learn more.</a>
- </div>
- <?php endif; ?>
-
- <?php
-
- if ($isLowerLoggedIn || $isLoggedIn) {
- echo($cache["members"]["private"]);
- } else {
- echo($cache["members"]["public"]);
- }
-
- ?>
-</div>
-
-<style>
-<?php if ($use2023UI): ?>
-.old-ui {
- display: none;
-}
-<?php else: ?>
-.new-ui {
- display: none;
-}
-<?php endif; ?>
-</style>
-
-<?php file_put_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/cache/home.json", json_encode($cache)); require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/components/footer.inc'; ?> \ No newline at end of file
+if ($isLoggedIn || $isLowerLoggedIn) {
+ require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/fragments/dashboard.inc";
+} else {
+ require_once $_SERVER['DOCUMENT_ROOT'] . "/pages/public.inc";
+} \ No newline at end of file
diff --git a/pages/lists.inc b/pages/lists.inc
index c9baf06..e14f706 100644
--- a/pages/lists.inc
+++ b/pages/lists.inc
@@ -1,8 +1,6 @@
<?php
require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/init.inc"; global $title; global $isLoggedIn; global $lang; global $pages;
-require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/util/evening.inc";
-
require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/components/header.inc'; ?>
<br>
diff --git a/pages/login.inc b/pages/login.inc
index 157794f..0e306f1 100644
--- a/pages/login.inc
+++ b/pages/login.inc
@@ -28,7 +28,7 @@ require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/components/header.inc'; glob
<b>You are already logged in.</b> If you want to log into a different account or using a different authentication method, you may do so now.
</div>
<?php else: ?>
- <p><?= $lang["login"]["select"] ?> Cold Haze.</p>
+ <p><?= $lang["login"]["select"] ?> Ponycule.</p>
<div class="row">
<div class="col-md-6">
<div class="card" style="margin-bottom:10px;text-align: center;">
diff --git a/pages/metadata.inc b/pages/metadata.inc
index aea128b..0c02398 100644
--- a/pages/metadata.inc
+++ b/pages/metadata.inc
@@ -2,7 +2,6 @@
require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/init.inc"; global $title; global $isLowerLoggedIn; global $isLoggedIn; global $lang; global $pages; global $app;
require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/util/functions.inc";
-require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/util/bitset.inc";
if (!isset($_GET['_']) || trim($_GET['_']) === "") peh_error("Invalid request", 400);
@@ -16,7 +15,7 @@ if ($system !== "cloudburst" && $system !== "raindrops" && $system !== "moonglow
$systemCommonName = $system === "cloudburst" ? "Cloudburst System" : ($system === $app["other"]["slug"] && ($isLoggedIn || $isLowerLoggedIn) ? $app["other"]["name"] : ($system === "moonglow" ? "Moonglow" : "Raindrops System"));
$systemID = $system === "cloudburst" ? "ynmuc" : ($system === $app["other"]["slug"] && ($isLoggedIn || $isLowerLoggedIn) ? $app["other"]["id"] : ($system === "moonglow" ? "hrbom" : "gdapd"));
-if ($isLowerLoggedIn && $systemID !== $app["other"]["id"]) {
+if ($isLowerLoggedIn && $systemID !== $app["other"]["id"] && $systemID !== "hrbom") {
header("Location: /");
die();
}
diff --git a/pages/money.inc b/pages/money.inc
index e3edd27..d1651bc 100644
--- a/pages/money.inc
+++ b/pages/money.inc
@@ -805,7 +805,7 @@ function getMonthlyEarnings(): array {
</label>
</p>
- <p>Adding a transaction takes effect immediately and cannot be modified afterwards.</p>
+ <p>Adding a transaction takes effect immediately and cannot be modified afterward.</p>
<button id="delete-link" class="btn btn-<?= $use2023UI ? "primary" : "success" ?>">Create</button>
</form>
</div>
diff --git a/pages/pair.inc b/pages/pair.inc
index 8b0bb09..42e70ef 100644
--- a/pages/pair.inc
+++ b/pages/pair.inc
@@ -11,7 +11,7 @@ require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/components/header.inc'; glob
<div class="alert alert-success alert-dismissible" id="pair-confirm" style="display: none;">
<button type="button" class="btn-close" onclick="document.getElementById('pair-confirm').style.display='none';"></button>
- Successfully paired "<span id="paired-name-1">-</span>" with your Cold Haze account. You may now close this page.
+ Successfully paired "<span id="paired-name-1">-</span>" with your Ponycule account. You may now close this page.
</div>
<div class="alert alert-danger alert-dismissible" id="pair-cancel" style="display: none;">
@@ -19,7 +19,7 @@ require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/components/header.inc'; glob
Cancelled pairing "<span id="paired-name-2">-</span>", this device does not have access to your account. You may now close this page.
</div>
- <p>Pairing allows a connected device that cannot normally use Cold Haze to gather data. This device will get full access to your account as if they were acting on your behalf, so make sure you trust the device and/or application you are using.</p>
+ <p>Pairing allows a connected device that cannot normally use Ponycule to gather data. This device will get full access to your account as if they were acting on your behalf, so make sure you trust the device and/or application you are using.</p>
<?php $data = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/tokens/" . str_replace("/", "", $_COOKIE['PEH2_SESSION_TOKEN'])), true); if (isset($data["profile"])): ?>
<p>Equestria.dev may not have verified the application you use, always check for a signature. Enter the pairing code displayed on your device below:</p>
@@ -42,10 +42,10 @@ require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/components/header.inc'; glob
</div>
<div class="modal-body">
- <p>You are about to pair the following device with your Cold Haze account:</p>
+ <p>You are about to pair the following device with your Ponycule account:</p>
<blockquote style="display: grid; grid-template-columns: max-content 1fr; grid-gap: 10px;">
<div style="display: flex; align-items: center; justify-content: center;">
- <img src="/assets/logo/newlogo3.png" id="device-icon" style="width: 32px; height: 32px;">
+ <img src="/assets/logo/newlogo-ng.png" id="device-icon" style="width: 32px; height: 32px;">
</div>
<div>
<b>Name:</b> <span id="device-name">-</span><br>
@@ -95,11 +95,11 @@ require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/components/header.inc'; glob
return "https://git.equestria.dev/equestria.dev/luna/raw/branch/mane/icons/logo.png";
}
- if (name.startsWith("Cold Haze for Wear OS ")) {
+ if (name.startsWith("Cold Haze for Wear OS ") || name.startsWith("Ponycule for Wear OS ")) {
return "https://static.equestria.horse/ch-wear.png";
}
- return "/assets/logo/newlogo3.png";
+ return "/assets/logo/newlogo-ng.png";
}
(async () => {
diff --git a/pages/ponytown.inc b/pages/ponytown.inc
index 08c3f27..b268aa3 100644
--- a/pages/ponytown.inc
+++ b/pages/ponytown.inc
@@ -16,7 +16,7 @@ if (getMemberWithoutSystem($parts[2]) === null) {
$member = getMemberWithoutSystem($parts[2]);
-if ($isLowerLoggedIn && $member["_system"] !== $app["other"]["id"]) {
+if ($isLowerLoggedIn && $member["_system"] !== $app["other"]["id"] && $member["_system"] !== "hrbom") {
peh_error("System member not found", 404);
return;
}
@@ -48,7 +48,7 @@ $member = getMemberWithoutSystem($parts[2]);
<img src="data:image/png;base64,<?= file_exists($_SERVER['DOCUMENT_ROOT'] . "/assets/ponies/" . $member["id"] . ".png") ? base64_encode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/assets/ponies/" . $member["id"] . ".png")) : "" ?>" style="width: 100%; border: 1px dashed rgba(255, 255, 255, .5); border-radius: 10px;">
</div>
<div style="display: flex; align-items: center; justify-content: center;">
- <img src="data:image/png;base64,<?= file_exists($_SERVER['DOCUMENT_ROOT'] . "/assets/uploads/pt-" . $member["name"] . ".png") ? base64_encode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/assets/uploads/pt-" . $member["name"] . ".png")) : "" ?>" style="width: 100%; border: 1px dashed rgba(255, 255, 255, .5); border-radius: 10px;">
+ <img src="data:image/png;base64,<?= file_exists($_SERVER['DOCUMENT_ROOT'] . "/assets/uploads/pt-" . $member["name"] . ".png") ? base64_encode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/assets/uploads/pt-" . $member["name"] . ".png")) : (file_exists($_SERVER['DOCUMENT_ROOT'] . getAsset($member["_system"], $member["id"], "heads")) ? base64_encode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . getAsset($member["_system"], $member["id"], "heads"))) : "") ?>" style="width: 100%; border: 1px dashed rgba(255, 255, 255, .5); border-radius: 10px;">
</div>
</div>
@@ -61,7 +61,7 @@ $member = getMemberWithoutSystem($parts[2]);
}
if ($info[1] > 60): ?>
- <p class="text-warning" style="margin-top: 15px; margin-bottom: 0; text-align: center;"><b>This Pony Town character needs to be updated.</b><br>Cold Haze now relies on pixel-perfect versions of one's Pony Town character to work properly, and the current character for this member is not compliant or non-existant.</p>
+ <p class="text-warning" style="margin-top: 15px; margin-bottom: 0; text-align: center;"><b>This Pony Town character needs to be updated.</b><br>Ponycule now relies on pixel-perfect versions of one's Pony Town character to work properly, and the current character for this member is not compliant or non-existant.</p>
<?php endif; ?>
</div>
</div>
diff --git a/pages/profiles.inc b/pages/profiles.inc
deleted file mode 100644
index 8440b5f..0000000
--- a/pages/profiles.inc
+++ /dev/null
@@ -1,106 +0,0 @@
-<?php
-
-require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/init.inc"; global $title; global $isLoggedIn; global $lang; global $pages; global $_PROFILE; global $isLowerLoggedIn;
-require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/components/header.inc';
-require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/util/profiles.inc';
-
-?>
-
-<br>
-<div class="container">
- <div id="page-content">
- <h2>Profile scores</h2>
- <?php
-
- $ordered = scoreOrderGlobal();
-
- $ordered = array_map(function ($i) {
- $i["_score"] = calculateProfileScore($i);
- return $i;
- }, $ordered);
-
- usort($ordered, function ($a, $b) {
- return $b["_score"]["sortable"] - $a["_score"]["sortable"];
- });
-
- $fronters = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/" . ($_PROFILE['login'] === "raindrops" ? "gdapd" : "ynmuc") . "/fronters.json"), true)["members"];
-
- ?>
-
- <?php if (!$isLowerLoggedIn && count($fronters) > 0): $me = $fronters[0]; $me = array_values(array_filter($ordered, function ($i) use ($me) { return $i["id"] === $me["id"]; }))[0]; ?>
- <p>Hi <b><?= $me["display_name"] ?></b>,
- <?php if ($me["_score"]["progress"] === 1): ?>
- your profile is complete, congratulations!
- <?php else: ?>
- <?php if (count($me["_score"]["actions"]) > 2): ?>
- your profile is not complete, here is all you need to do:
- <?php else: ?>
- your profile is almost complete, all there's left to do is
- <?php endif; ?>
- <?php endif; ?>
-
- <?php if (count($me["_score"]["actions"]) > 2 || count($me["_score"]["actions"]) === 0): ?></p><?php endif; ?>
-
- <?php if ($me["_score"]["progress"] === 1): ?>
- <p>You will be getting a Complete Profile badge pretty soon, so watch out for it.</p>
- <?php elseif (count($me["_score"]["actions"]) > 2): ?>
- <ul>
- <?php $index = -1; foreach ($me["_score"]["actions"] as $action): $index++; ?>
- <li>add <?= $action ?><?= $index !== count($me["_score"]["actions"]) - 1 ? ($index !== count($me["_score"]["actions"]) - 2 ? ";" : "; and") : "" ?></li>
- <?php endforeach; ?>
- </ul>
- <?php else: ?>
- add <?= implode(" and ", $me["_score"]["actions"]) ?>.
- <p>Once you are done, you will get a Complete Profile badge.</p>
- <?php endif; ?>
-
- <hr>
- <?php endif; ?>
-
- <?php foreach ($ordered as $member): ?>
- <div class="relation" style="background-color:rgba(255, 255, 255, .1);margin-bottom:10px;padding:10px;border-radius:10px;display:grid;grid-template-columns: 1.5fr 6fr;">
- <a class="relation-intro" style="background-color:rgba(255, 255, 255, .05);border-right:1px solid rgba(255, 255, 255, .1);margin:-10px;padding:10px;border-top-left-radius:10px;border-bottom-left-radius:10px;color: white;text-decoration: none;" href="/<?= $member["name"] ?>">
- <img src="<?= getAsset($member["system"], $member["id"], "heads") ?>" style="width:24px;"> <?= $member["display_name"] ?? $member["name"] ?>
- </a>
-
- <div style="margin: -10px -10px -10px 10px;background: linear-gradient(90deg, rgba(255, 255, 255, .1) 0%, rgba(255, 255, 255, .1) <?= round($member["_score"]["progress"] * 100) ?>%, transparent <?= round($member["_score"]["progress"] * 100) ?>.000001%);border-top-right-radius: 10px;border-bottom-right-radius: 10px;display: flex;align-items: center;">
- <div style="margin-left: 10px; width: 100%;">
- <?php if (count($member["_score"]["actions"]) === 0): ?>
- Complete profile
- <?php elseif (count($member["_score"]["actions"]) < 3): ?>
- Add <?= implode(" and ", $member["_score"]["actions"]) ?> to get to 100%
- <?php else: ?>
- <?= round($member["_score"]["progress"] * 100) ?>% complete
- <?php endif; ?>
-
- <div id="icons" style="float:right; margin-right: 10px;">
- <span title="<?= $member["_score"]["values"][5] ? "This member has a Pony Town character" : "This member does not have a Pony Town character" ?>" data-bs-toggle="tooltip">
- <img alt="" src="/assets/icons/ponytown.svg" style="filter: invert(1); opacity: <?= $member["_score"]["values"][5] ? "1" : ".25" ?>;">
- </span>
- <span title="<?= $member["_score"]["values"][6] ? "This member has a color" : "This member does not have a color" ?>" data-bs-toggle="tooltip">
- <img alt="" src="/assets/icons/color.svg" style="filter: invert(1); opacity: <?= $member["_score"]["values"][6] ? "1" : ".25" ?>;">
- </span>
- <span title="<?= $member["_score"]["values"][2] ? "This member has a public page that is over 200 letters long" : ($member["_score"]["pages"][0] ? "This member has a public page but it is only " . $member["_score"]["characters"][0] . " characters long" : "This member does not have a public page") ?>" data-bs-toggle="tooltip">
- <img alt="" src="/assets/icons/global.svg" style="filter: invert(1); opacity: <?= $member["_score"]["values"][2] ? "1" : ($member["_score"]["pages"][0] ? ".5" : ".25") ?>;">
- </span>
- <span title="<?= $member["_score"]["values"][3] ? "This member has a public page that is over 200 letters long" : ($member["_score"]["pages"][1] ? "This member has a public page but it is only " . $member["_score"]["characters"][1] . " characters long" : "This member does not have a public page") ?>" data-bs-toggle="tooltip">
- <img alt="" src="/assets/icons/logout.svg" style="filter: invert(1); opacity: <?= $member["_score"]["values"][3] ? "1" : ($member["_score"]["pages"][1] ? ".5" : ".25") ?>;">
- </span>
- <span title="<?= $member["_score"]["values"][0] ? "This member has their age entered" : (in_array("alicorn", $member["_metadata"]["species"]) ? "This member does not have their age entered, but this might be because they are an alicorn" : "This member does not have their age entered") ?>" data-bs-toggle="tooltip">
- <img alt="" src="/assets/icons/age.svg" style="filter: invert(1); opacity: <?= $member["_score"]["values"][0] ? "1" : (in_array("alicorn", $member["_metadata"]["species"]) ? ".5" : ".25") ?>;">
- </span>
- <span title="<?= $member["_score"]["values"][4] ? "This member has a banner" : "This member does not have a banner" ?>" data-bs-toggle="tooltip">
- <img alt="" src="/assets/icons/banner.svg" style="filter: invert(1); opacity: <?= $member["_score"]["values"][4] ? "1" : ".25" ?>;">
- </span>
- <span title="<?= $member["_score"]["values"][1] ? "This member has their birth date entered" : "This member does not have their birth date entered" ?>" data-bs-toggle="tooltip">
- <img alt="" src="/assets/icons/splitting.svg" style="filter: invert(1); opacity: <?= $member["_score"]["values"][1] ? "1" : ".25" ?>;">
- </span>
- </div>
- </div>
- </div>
- </div>
- <?php endforeach; ?>
- </div>
-</div>
-
-<?php require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/components/footer.inc'; ?>
diff --git a/pages/public.inc b/pages/public.inc
new file mode 100644
index 0000000..b29d626
--- /dev/null
+++ b/pages/public.inc
@@ -0,0 +1,210 @@
+<?php
+
+if (isset($_GET["ec"])) {
+ header("HTTP/1.1 " . $_GET["ec"] . " Error");
+}
+
+require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/init.inc"; $title = ""; global $isNormallyLoggedIn; global $_PROFILE; global $lang; global $pages; global $isLowerLoggedIn; global $app; global $isLoggedIn;
+$isOrigLoggedIn = $isLoggedIn; $isOrigLowerLoggedIn = $isLowerLoggedIn;
+
+if ($isOrigLowerLoggedIn || $isOrigLoggedIn) {
+ $title = "Public home page";
+}
+
+require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/components/header.inc'; global $readOnly;
+$isLoggedIn = false; $isLowerLoggedIn = false;
+
+global $use2023UI;
+
+function banner() { $isLoggedIn = false; $isLowerLoggedIn = false; $byColor = getMembersByColor(false, true); global $lang; global $use2023UI; ?>
+ <div style="text-align: center;">
+ <img alt="" src="/assets/logo/newlogo-ng.png" style="width:128px;">
+ <p style="z-index:999;position:relative;background:transparent;margin: 20px -10px 0 -20px;padding-right:30px;height:32px;text-align: center;display:grid;grid-template-columns: repeat(<?= count($byColor) ?>, 1fr);">
+ <?php foreach ($byColor as $member): ?><a class="rainbow-item" style="overflow: hidden;"><img title="<?= $member["display_name"] ?? $member["name"] ?>" data-bs-toggle="tooltip" src="<?= getAsset($member["_system"], $member["id"], "heads") ?>" style="height:32px;position:absolute;z-index:99;"></a><?php endforeach; ?>
+ </p>
+ <div style="margin-top:-33px;margin-bottom:0;margin-left:-20px;margin-right:20px;height:32px;text-align: center;display:grid;grid-template-columns: repeat(<?= count($byColor) ?>, 1fr);position:relative;left:10px;">
+ <?php foreach ($byColor as $member): ?><div>
+ <span style="display: inline-block;background: transparent;position:absolute;width: 0;height: 0;margin-top: 17px;box-shadow: 0 6px 20px 20px #<?= $member["color"] ?>;z-index: 9;margin-left: 8px;opacity: .75;"></span>
+ </div><?php endforeach; ?>
+ </div>
+ <div id="banner-lower" style="padding:5px 10px;background:#3332328a;position:relative;z-index: 999;backdrop-filter: blur(30px);">
+ <h2 style="margin-top: 20px;">Ponycule</h2>
+ <?php if ($isLoggedIn || $isLowerLoggedIn): ?>
+ <p><?= count($byColor) ?> ponies in 4 plural systems</p>
+ <?php else: ?>
+ <p><?= count($byColor) ?> ponies in 3 plural systems</p>
+ <?php endif; ?>
+ </div>
+ </div>
+<?php }
+
+function members() { $isLoggedIn = false; $isLowerLoggedIn = false; global $app; ?>
+ <div id="new-homepage" style="margin-top:20px;">
+
+ <div id="new-homepage-systems" <?php if ($isLoggedIn || $isLowerLoggedIn): ?>style="grid-template-columns: repeat(4, 1fr);"<?php endif; ?>>
+ <?php newHomepage("ynmuc", "cloudburst", true); ?>
+ <?php newHomepage("gdapd", "raindrops", true); ?>
+ <?php if ($isLoggedIn || $isLowerLoggedIn) newHomepage($app["other"]["id"], $app["other"]["slug"], true); ?>
+ <?php newHomepage("hrbom", "moonglow", true); ?>
+ </div>
+
+ </div>
+<?php } ?>
+
+<br>
+<div class="container">
+ <?php if (isset($_GET['em'])): ?>
+ <div class="alert alert-danger alert-dismissible">
+ <button onclick='window.history.pushState({"html":null,"pageTitle":document.title},"", "/");' type="button" class="btn-close" data-bs-dismiss="alert"></button>
+ <b><?= $lang["home"]["error"] ?> </b><?= strip_tags(base64_decode($_GET['em'])) ?>
+ </div>
+ <?php endif; ?>
+
+ <div class="alert alert-warning alert-dismissible" id="gpuWarning" style="display: none;">
+ <button onclick='window.history.pushState({"html":null,"pageTitle":document.title},"", "/");' type="button" class="btn-close" data-bs-dismiss="alert"></button>
+ <b>GPU acceleration is turned off or not supported.</b> A lot of visual effects on this website rely on GPU acceleration, which is currently disabled on your browser, meaning the website's overall look will be affected. Please enable GPU acceleration in your browser settings.
+ </div>
+
+ <?php if ($readOnly && $isNormallyLoggedIn || $readOnly && $isLowerLoggedIn): ?>
+ <div class="alert alert-warning">
+ <b>Notice: </b>This website is temporarily under maintenance and the administrators have locked the database. Although you are logged in as <?= $_PROFILE['name'] ?>, you cannot access any of the logged-in features while the website is under maintenance. <a href="/-/emergency">Alerts dispatching</a> remains possible in case of an emergency.
+ </div>
+ <?php endif; ?>
+
+
+ <?php
+
+ //file_put_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/cache/home.json", "{}");
+ $cache = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/cache/home.json"), true);
+ if (!isset($cache["banner"])) $cache["banner"] = [];
+ if (!isset($cache["members"])) $cache["members"] = [];
+
+ if (!isset($cache["banner"]["public"])) {
+ ob_start();
+
+ $isLoggedInOldState = $isLoggedIn;
+ $isLowerLoggedInOldState = $isLowerLoggedIn;
+ $isLoggedIn = false;
+ $isLowerLoggedIn = false;
+ banner();
+ $isLoggedIn = $isLoggedInOldState;
+ $isLowerLoggedIn = $isLowerLoggedInOldState;
+
+ $cache["banner"]["public"] = ob_get_contents();
+ ob_end_clean();
+ }
+
+ if (!isset($cache["banner"]["private"])) {
+ ob_start();
+
+ $isLoggedInOldState = $isLoggedIn;
+ $isLowerLoggedInOldState = $isLowerLoggedIn;
+ $isLoggedIn = true;
+ $isLowerLoggedIn = true;
+ banner();
+ $isLoggedIn = $isLoggedInOldState;
+ $isLowerLoggedIn = $isLowerLoggedInOldState;
+
+ $cache["banner"]["private"] = ob_get_contents();
+ ob_end_clean();
+ }
+
+ if (!isset($cache["members"]["public"])) {
+ ob_start();
+
+ $isLoggedInOldState = $isLoggedIn;
+ $isLowerLoggedInOldState = $isLowerLoggedIn;
+ $isLoggedIn = false;
+ $isLowerLoggedIn = false;
+ members();
+ $isLoggedIn = $isLoggedInOldState;
+ $isLowerLoggedIn = $isLowerLoggedInOldState;
+
+ $cache["members"]["public"] = ob_get_contents();
+ ob_end_clean();
+ }
+
+ if (!isset($cache["members"]["private"])) {
+ ob_start();
+
+ $isLoggedInOldState = $isLoggedIn;
+ $isLowerLoggedInOldState = $isLowerLoggedIn;
+ $isLoggedIn = true;
+ $isLowerLoggedIn = true;
+ members();
+ $isLoggedIn = $isLoggedInOldState;
+ $isLowerLoggedIn = $isLowerLoggedInOldState;
+
+ $cache["members"]["private"] = ob_get_contents();
+ ob_end_clean();
+ }
+
+ if ($isLowerLoggedIn || $isLoggedIn) {
+ echo($cache["banner"]["private"]);
+ } else {
+ echo($cache["banner"]["public"]);
+ }
+
+ ?>
+ <div id="timeline-container" style="background: #3332328a;padding: 5px 10px;border-top:1px solid rgba(255,255,255,.1);border-bottom-left-radius: 10px;border-bottom-right-radius: 10px;">
+ <div id="timeline"></div>
+ <script>
+ async function refreshTimeline() {
+ document.getElementById("timeline").innerHTML = await (await fetch("/api/timeline?gdapd&ynmuc<?= ($isLowerLoggedIn || $isLoggedIn) ? "&" . $app["other"]["id"] : "" ?>&hrbom")).text();
+
+ Array.from(document.getElementsByClassName("dynamic-time")).forEach((el) => {
+ let time = el.getAttribute("data-time");
+ el.innerText = new Date(parseInt(time) * 1000).toTimeString().split(":").splice(0, 2).join(":");
+ });
+
+ Array.from(document.getElementsByClassName("dynamic-time-mobile")).forEach((el) => {
+ let time = el.getAttribute("data-time");
+ el.innerText = new Date(parseInt(time) * 1000).toTimeString().split(":")[0] + ":";
+ });
+ }
+
+ setInterval(refreshTimeline, 10000);
+ refreshTimeline();
+ </script>
+ </div>
+
+ <?php if ($isLoggedIn || $isLowerLoggedIn): ?>
+ <div class="alert alert-warning" style="margin-top: 20px;">
+ <b>Ponycule Documents is now deprecated.</b> Ponycule's Documents feature is now deprecated in favor of Google Docs and will be removed in the future. Please migrate your documents to Google Drive as soon as possible.
+ </div>
+ <?php endif; ?>
+
+ <!--<div class="alert alert-warning" style="margin-top:20px;">
+ <b>Notice:</b> The administrators are currently trying a new optimisation technique based on a virtual file system (chvfs). Data loss, corruption or inconsistency may happen and should be reported on <a href="https://bugs.equestria.dev/issues/CH" target="_blank">bugs.equestria.dev</a>.
+ </div>-->
+
+ <?php if (isset($_COOKIE["PEH2_SESSION_TOKEN"]) && $_COOKIE["PEH2_SESSION_TOKEN"] !== "" && !$isOrigLoggedIn && !$isOrigLowerLoggedIn): ?>
+ <div class="alert alert-warning" style="margin-top:20px;">
+ <b>You were previously logged in to Ponycule, </b>however you have been logged out due to inactivity, due to your device being removed, or due to switching to a new authentication system (such as the v3). Please log in again. <a href="https://bugs.equestria.dev/issue/CH-56/Better-session-security" target="_blank">Learn more.</a>
+ </div>
+ <?php endif; ?>
+
+ <?php
+
+ if ($isLowerLoggedIn || $isLoggedIn) {
+ echo($cache["members"]["private"]);
+ } else {
+ echo($cache["members"]["public"]);
+ }
+
+ ?>
+</div>
+
+<style>
+<?php if ($use2023UI): ?>
+.old-ui {
+ display: none;
+}
+<?php else: ?>
+.new-ui {
+ display: none;
+}
+<?php endif; ?>
+</style>
+
+<?php file_put_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/cache/home.json", json_encode($cache)); require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/components/footer.inc'; ?> \ No newline at end of file
diff --git a/pages/schedules.inc b/pages/schedules.inc
deleted file mode 100644
index dde2981..0000000
--- a/pages/schedules.inc
+++ /dev/null
@@ -1,134 +0,0 @@
-<?php
-
-require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/util/evening.inc";
-require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/init.inc"; global $title; global $isLoggedIn; global $lang; global $pages; global $app;
-require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/components/header.inc'; global $readOnly; global $isNormallyLoggedIn;
-
-global $use2023UI;
-
-?>
-
-<style>
- .day-gradient {
- background-image: linear-gradient(180deg, rgba(7,15,36,1) 0%, rgba(36,56,83,1) 14%, rgba(165,126,57,1) 28%, rgba(37,109,201,1) 42%, rgba(47,165,208,1) 57%, rgba(252,120,15,1) 71%, rgba(38,66,97,1) 85%, rgba(7,15,36,1) 100%);
- background-size: 100% 1000%;
- }
-
- .invert {
- filter: invert(1) hue-rotate(180deg);
- }
-
- @media (max-width: 800px) {
- #schedules {
- grid-template-columns: 1fr !important;
- }
-
- .schedules-separator {
- display: block !important;
- }
- }
-</style>
-
-<br>
-<div class="container">
- <h2>Schedules</h2>
-
- <div id="schedules" style="margin-top: 20px; display: grid; grid-template-columns: repeat(4, 1fr); grid-gap: 20px;">
- <div>
- <div id="live-time-other-outer" class="day-gradient" style="text-align: center; background-color: rgba(255, 255, 255, .1); padding: 20px 0; border-radius: 10px; margin-bottom: 20px;">
- <b><?= $app["other"]["name"] ?></b><br>
- <h3 id="live-time-other">--:--</h3>
- </div>
-
- <hr style="display: none;" class="schedules-separator">
- </div>
-
- <div>
- <div id="live-time-cloudburst-outer" class="day-gradient" style="text-align: center; background-color: rgba(255, 255, 255, .1); padding: 20px 0; border-radius: 10px; margin-bottom: 20px;">
- <b>Cloudburst System</b><br>
- <h3 id="live-time-cloudburst">--:--</h3>
- </div>
-
- <hr style="display: none;" class="schedules-separator">
- </div>
-
- <div>
- <div id="live-time-raindrops-outer" class="day-gradient" style="text-align: center; background-color: rgba(255, 255, 255, .1); padding: 20px 0; border-radius: 10px; margin-bottom: 20px;">
- <b>Raindrops System</b><br>
- <h3 id="live-time-raindrops">--:--</h3>
- </div>
- </div>
-
- <div>
- <div id="live-time-moonwind-outer" class="day-gradient" style="text-align: center; background-color: rgba(255, 255, 255, .1); padding: 20px 0; border-radius: 10px; margin-bottom: 20px;">
- <b>Moonwind System</b><br>
- <h3 id="live-time-moonwind">--:--</h3>
- </div>
- </div>
- </div>
-</div>
-
-<script>
- function getDayPercentage(time) {
- let hours = parseInt(time.split(":")[0]);
- let minutes = parseInt(time.split(":")[1].split(" ")[0]);
-
- if (time.split(":")[1].split(" ")[1] === "PM") hours += 12;
- if (hours === 12 && time.split(":")[1].split(" ")[1] === "AM") hours = 0;
- if (hours === 24 && time.split(":")[1].split(" ")[1] === "PM") hours = 12;
-
- let timestamp = new Date("1970-01-01 " + hours + ":" + minutes + " UTC").getTime() / 1000;
-
- return (timestamp / 86400) * 100;
- }
-
- function updateTime() {
- let time1 = (new Intl.DateTimeFormat('en-US', {
- timeZone: 'Europe/Paris',
- hour: 'numeric',
- minute: '2-digit',
- hour12: false
- })).format(new Date());
-
- document.getElementById("live-time-raindrops").innerText = time1;
- document.getElementById("live-time-raindrops-outer").style.backgroundPositionY = getDayPercentage(time1) + "%";
-
- let time4 = (new Intl.DateTimeFormat('en-US', {
- timeZone: 'Europe/Kyiv',
- hour: 'numeric',
- minute: '2-digit',
- hour12: false
- })).format(new Date());
-
- document.getElementById("live-time-moonwind").innerText = time4;
- document.getElementById("live-time-moonwind-outer").style.backgroundPositionY = getDayPercentage(time4) + "%";
-
- let time2 = (new Intl.DateTimeFormat('en-US', {
- timeZone: 'Europe/London',
- hour: 'numeric',
- minute: '2-digit',
- hour12: false
- })).format(new Date());
-
- document.getElementById("live-time-cloudburst").innerText = time2;
- document.getElementById("live-time-cloudburst-outer").style.backgroundPositionY = getDayPercentage(time2) + "%";
-
- let time3 = (new Intl.DateTimeFormat('en-US', {
- timeZone: 'America/Chicago',
- hour: 'numeric',
- minute: '2-digit',
- hour12: false
- })).format(new Date());
-
- document.getElementById("live-time-other").innerText = time3;
- document.getElementById("live-time-other-outer").style.backgroundPositionY = getDayPercentage(time3) + "%";
- }
-
- updateTime();
-
- setInterval(() => {
- updateTime();
- }, 10000);
-</script>
-
-<?php require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/components/footer.inc'; ?>
diff --git a/pages/sessions.inc b/pages/sessions.inc
index fc861bf..7e6f328 100644
--- a/pages/sessions.inc
+++ b/pages/sessions.inc
@@ -105,7 +105,7 @@ $verifiedNames = [
</div>
<div class="modal-body">
- <p>You are about to log out the following device from your Cold Haze account:</p>
+ <p>You are about to log out the following device from your Ponycule account:</p>
<blockquote id="device-bq">
<div>
<b>Name:</b> <span id="device-name">-</span><br>