home to your local SPACEGIRL ๐Ÿ’ซ arimelody.space
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

first commit! ๐ŸŽ‰

Signed-off-by: ari melody <ari@arimelody.me>

ari melody 27d6e4f0

+2957
+10
.gitattributes
··· 1 + *.woff2 filter=lfs diff=lfs merge=lfs -text 2 + *.gif filter=lfs diff=lfs merge=lfs -text 3 + *.png filter=lfs diff=lfs merge=lfs -text 4 + *.jpg filter=lfs diff=lfs merge=lfs -text 5 + *.webp filter=lfs diff=lfs merge=lfs -text 6 + *.webm filter=lfs diff=lfs merge=lfs -text 7 + *.mp3 filter=lfs diff=lfs merge=lfs -text 8 + *.mp4 filter=lfs diff=lfs merge=lfs -text 9 + . !text !filter !merge !diff 10 + * !text !filter !merge !diff
+1
.gitignore
··· 1 + **/.DS_Store
+343
api/v1/music/music.go
··· 1 + package music 2 + 3 + var placeholders = []Album{ 4 + { 5 + Id: "test", 6 + Title: "test album", 7 + Type: "album", 8 + Year: 2024, 9 + Buyname: "go get it!!", 10 + Buylink: "https://arimelody.me/", 11 + Artists: []string{ 12 + "ari melody", 13 + "zaire", 14 + "mae taylor", 15 + "Loudar", 16 + }, 17 + Links: []AlbumLink{ 18 + AlbumLink{ 19 + Name: "youtube", 20 + Url: "https://youtu.be/dQw4w9WgXcQ", 21 + }, 22 + }, 23 + Description: "she sample on my text 'til i ๐Ÿšซ๐Ÿšซ๐Ÿšซ", 24 + }, 25 + { 26 + Id: "free2play", 27 + Title: "free2play", 28 + Type: "upcoming", 29 + Year: 2024, 30 + Buyname: "pre-order", 31 + Buylink: "https://arimelody.me/", 32 + Artists: []string{ "ari melody" }, 33 + Description: "hello from your local SPACEGIRL! ๐Ÿ’ซ", 34 + }, 35 + { 36 + Id: "dream", 37 + Title: "Dream", 38 + Type: "single", 39 + Year: 2022, 40 + Artists: []string{ "mellodoot" }, 41 + Artwork: "https://mellodoot.com/img/music_artwork/mellodoot_-_Dream.webp", 42 + Buylink: "https://arimelody.bandcamp.com/track/dream", 43 + Free: false, 44 + Links: []AlbumLink{ 45 + AlbumLink{ 46 + Name: "spotify", 47 + Url: "https://open.spotify.com/album/5talRpqzjExP1w6j5LFIAh", 48 + }, 49 + AlbumLink{ 50 + Name: "apple music", 51 + Url: "https://music.apple.com/ie/album/dream-single/1650037132", 52 + }, 53 + AlbumLink{ 54 + Name: "soundcloud", 55 + Url: "https://soundcloud.com/arimelody/dream2022", 56 + }, 57 + AlbumLink{ 58 + Name: "youtube", 59 + Url: "https://www.youtube.com/watch?v=nfFgtMuYAx8", 60 + }, 61 + }, 62 + Description: "living the dream ๐ŸŒŒ โœจ", 63 + }, 64 + { 65 + Id: "gomyway", 66 + Title: "Go My Way", 67 + Type: "single", 68 + Year: 2021, 69 + Artists: []string{ "mellodoot" }, 70 + Artwork: "https://mellodoot.com/img/music_artwork/mellodoot_-_Go_My_Way.webp", 71 + Buylink: "https://arimelody.bandcamp.com/track/go-my-way", 72 + Links: []AlbumLink{ 73 + AlbumLink{ 74 + Name: "spotify", 75 + Url: "https://open.spotify.com/album/35WNtxK12IDHCUoXHDePGE", 76 + }, 77 + AlbumLink{ 78 + Name: "apple music", 79 + Url: "https://music.apple.com/ie/album/go-my-way-single/1547145699", 80 + }, 81 + AlbumLink{ 82 + Name: "soundcloud", 83 + Url: "https://soundcloud.com/arimelody/go-my-way", 84 + }, 85 + AlbumLink{ 86 + Name: "youtube", 87 + Url: "https://www.youtube.com/watch?v=CNptNQdLkl0", 88 + }, 89 + }, 90 + Description: "hey! go my way! ๐Ÿ’ฅ โœจ", 91 + }, 92 + { 93 + Id: "rowboat", 94 + Title: "Rowboat", 95 + Type: "single", 96 + Year: 2020, 97 + Artists: []string{ "mellodoot" }, 98 + Artwork: "https://mellodoot.com/img/music_artwork/mellodoot_-_Rowboat.webp", 99 + Buylink: "https://arimelody.bandcamp.com/track/rowboat", 100 + Links: []AlbumLink{ 101 + { 102 + Name: "spotify", 103 + Url: "https://open.spotify.com/album/7jyqJFVKaENCPm58v5O44Y", 104 + }, 105 + { 106 + Name: "apple music", 107 + Url: "https://music.apple.com/ie/album/rowboat-single/1502608714", 108 + }, 109 + { 110 + Name: "soundcloud", 111 + Url: "https://soundcloud.com/arimelody/rowboat", 112 + }, 113 + { 114 + Name: "youtube", 115 + Url: "https://www.youtube.com/watch?v=uOQyILDTzME", 116 + }, 117 + }, 118 + Description: "let's take a trip. i've got a goddamn boat โ›ต๏ธ", 119 + }, 120 + { 121 + Id: "helloworld", 122 + Title: "Hello World", 123 + Type: "single", 124 + Year: 2019, 125 + Artists: []string{ "mellodoot" }, 126 + Artwork: "https://mellodoot.com/img/music_artwork/mellodoot_-_Hello_World.webp", 127 + Buylink: "https://arimelody.bandcamp.com/track/hello-world", 128 + Links: []AlbumLink{ 129 + { 130 + Name: "spotify", 131 + Url: "https://open.spotify.com/album/3LbElPXD4dsDumttGBuYxx", 132 + }, 133 + { 134 + Name: "apple music", 135 + Url: "https://music.apple.com/ie/album/hello-world-single/1491880155", 136 + }, 137 + { 138 + Name: "soundcloud", 139 + Url: "https://soundcloud.com/arimelody/helloworld", 140 + }, 141 + { 142 + Name: "youtube", 143 + Url: "https://www.youtube.com/watch?v=CQhlRsl0Mjk", 144 + }, 145 + }, 146 + Description: "we'll dawn a new frontier! ๐Ÿ‘พ", 147 + }, 148 + { 149 + Id: "sine", 150 + Title: "Sine", 151 + Type: "single", 152 + Artists: []string{ "zaire", "mellodoot" }, 153 + Year: 2019, 154 + Artwork: "https://mellodoot.com/img/music_artwork/zaire_-_Sine_ft._mellodoot.webp", 155 + Links: []AlbumLink{ 156 + { 157 + Name: "spotify", 158 + Url: "https://open.spotify.com/album/4WPuaJtTV7z86KubD9Rnmk", 159 + }, 160 + { 161 + Name: "apple music", 162 + Url: "https://music.apple.com/us/album/sine-feat-mellodoot/1489163020", 163 + }, 164 + { 165 + Name: "youtube", 166 + Url: "https://www.youtube.com/watch?v=z1H1s6VRnyY", 167 + }, 168 + }, 169 + }, 170 + { 171 + Id: "10", 172 + Title: "10", 173 + Type: "single", 174 + Year: 2019, 175 + Artists: []string{ "mellodoot" }, 176 + Artwork: "https://mellodoot.com/img/music_artwork/mellodoot_-_10.webp", 177 + Buylink: "https://arimelody.bandcamp.com/track/10", 178 + Links: []AlbumLink{ 179 + { 180 + Name: "spotify", 181 + Url: "https://open.spotify.com/album/2x4gbACfDm99unaXpLXyj0", 182 + }, 183 + { 184 + Name: "apple music", 185 + Url: "https://music.apple.com/ie/album/ten-single/1483193041", 186 + }, 187 + { 188 + Name: "soundcloud", 189 + Url: "https://soundcloud.com/arimelody/ten", 190 + }, 191 + { 192 + Name: "youtube", 193 + Url: "https://www.youtube.com/watch?v=C7WP5L2BK4U", 194 + }, 195 + }, 196 + }, 197 + { 198 + Id: "mad", 199 + Title: "MAD", 200 + Type: "single", 201 + Year: 2018, 202 + Artists: []string{ "mellodoot" }, 203 + Artwork: "https://mellodoot.com/img/music_artwork/mellodoot_-_MAD.webp", 204 + Buylink: "https://arimelody.bandcamp.com/track/mad", 205 + Links: []AlbumLink{ 206 + { 207 + Name: "spotify", 208 + Url: "https://open.spotify.com/album/59nFXw1WNoRhXou7lXqBZd", 209 + }, 210 + { 211 + Name: "apple music", 212 + Url: "https://music.apple.com/ie/album/mad/1441233120", 213 + }, 214 + { 215 + Name: "soundcloud", 216 + Url: "https://soundcloud.com/arimelody/mad", 217 + }, 218 + { 219 + Name: "youtube", 220 + Url: "https://www.youtube.com/watch?v=OB-Pk6p6mfQ", 221 + }, 222 + }, 223 + }, 224 + { 225 + Id: "welcomingparty", 226 + Title: "Welcoming Party", 227 + Type: "album", 228 + Year: 2018, 229 + Artists: []string{ "mellodoot" }, 230 + Artwork: "https://mellodoot.com/img/music_artwork/mellodoot_-_Welcoming_Party.webp", 231 + Buylink: "https://arimelody.bandcamp.com/album/welcoming-party", 232 + Links: []AlbumLink{ 233 + { 234 + Name: "spotify", 235 + Url: "https://open.spotify.com/album/3EPa4HZpkISQVRAks64LfR", 236 + }, 237 + { 238 + Name: "apple music", 239 + Url: "https://music.apple.com/ie/album/welcoming-party-ep/1441161424", 240 + }, 241 + { 242 + Name: "soundcloud", 243 + Url: "https://soundcloud.com/arimelody/sets/welcoming-party", 244 + }, 245 + { 246 + Name: "youtube", 247 + Url: "https://www.youtube.com/playlist?list=PLBG_QJeOHrB5EeniiXBIlHpoQbD6CUJca", 248 + }, 249 + }, 250 + // "tracks": [ 251 + // { 252 + // "title": "Paradigm" 253 + // }, 254 + // { 255 + // "title": "Mitrio" 256 + // }, 257 + // { 258 + // "title": "Level One" 259 + // }, 260 + // { 261 + // "title": "Cubes" 262 + // }, 263 + // { 264 + // "title": "Aria" 265 + // } 266 + // ] 267 + }, 268 + { 269 + Id: "howtheyknow2018", 270 + Title: "How They Know (2018)", 271 + Type: "single", 272 + Year: 2018, 273 + Artists: []string{ "mellodoot" }, 274 + Artwork: "https://mellodoot.com/img/music_artwork/mellodoot_-_How_They_Know_2018.webp", 275 + Buylink: "https://arimelody.bandcamp.com/track/how-they-know-2018-remastered", 276 + Free: true, 277 + Links: []AlbumLink{ 278 + { 279 + Name: "soundcloud", 280 + Url: "https://soundcloud.com/arimelody/how-they-know-2018", 281 + }, 282 + { 283 + Name: "youtube", 284 + Url: "https://www.youtube.com/watch?v=mbAgSwCzyMw", 285 + }, 286 + }, 287 + }, 288 + { 289 + Id: "howtheyknow", 290 + Title: "How They Know", 291 + Type: "single", 292 + Year: 2017, 293 + Artists: []string{ "mellodoot" }, 294 + Artwork: "https://mellodoot.com/img/music_artwork/mellodoot_-_How_They_Know.webp", 295 + Buylink: "https://arimelody.bandcamp.com/track/how-they-know", 296 + Free: true, 297 + Links: []AlbumLink{ 298 + { 299 + Name: "soundcloud", 300 + Url: "https://soundcloud.com/arimelody/how-they-know", 301 + }, 302 + { 303 + Name: "youtube", 304 + Url: "https://www.youtube.com/watch?v=q6lzKuG1Emo", 305 + }, 306 + }, 307 + }, 308 + { 309 + Id: "traveller", 310 + Title: "Traveller", 311 + Type: "single", 312 + Year: 2017, 313 + Artists: []string{ "mellodoot" }, 314 + Artwork: "https://mellodoot.com/img/music_artwork/mellodoot_-_Traveller.webp", 315 + Buylink: "https://arimelody.bandcamp.com/track/traveller", 316 + Free: true, 317 + Links: []AlbumLink{ 318 + { 319 + Name: "soundcloud", 320 + Url: "https://soundcloud.com/arimelody/traveller", 321 + }, 322 + { 323 + Name: "youtube", 324 + Url: "https://www.youtube.com/watch?v=ZTO7IQZ-yXA", 325 + }, 326 + }, 327 + Description: "an 8-bit expedition! โš”๏ธ๐Ÿ›ก๏ธ", 328 + }, 329 + } 330 + 331 + func GetAlbum(id string) (Album, bool) { 332 + for _, album := range placeholders { 333 + if album.Id == id { 334 + return album, true 335 + } 336 + } 337 + return Album{}, false 338 + } 339 + 340 + func QueryAll() ([]Album) { 341 + return placeholders 342 + } 343 +
+55
api/v1/music/music_types.go
··· 1 + package music 2 + 3 + import ( 4 + "regexp" 5 + "strings" 6 + ) 7 + 8 + type ( 9 + Album struct { 10 + Id string; 11 + Title string; 12 + Type string; 13 + Year int; 14 + Artists []string; 15 + Artwork string; 16 + Buyname string; 17 + Buylink string; 18 + Free bool; 19 + Links []AlbumLink; 20 + Description string; 21 + } 22 + 23 + AlbumLink struct { 24 + Name string; 25 + Url string; 26 + } 27 + ) 28 + 29 + func (album Album) PrintArtists() string { 30 + if len(album.Artists) == 1 { 31 + return album.Artists[0] 32 + } 33 + res := strings.Join(album.Artists[:len(album.Artists) - 1], ", ") 34 + res += " & " + album.Artists[len(album.Artists) - 1] 35 + return res 36 + } 37 + 38 + func (album Album) PrintCommaArtists() string { 39 + if len(album.Artists) == 1 { 40 + return album.Artists[0] 41 + } 42 + return strings.Join(album.Artists[:len(album.Artists)], ", ") 43 + } 44 + 45 + func (album Album) ResolveArtwork() string { 46 + if album.Artwork != "" { 47 + return album.Artwork 48 + } 49 + return "/img/music-artwork/default.png" 50 + } 51 + 52 + func (link AlbumLink) NormaliseName() string { 53 + re := regexp.MustCompile(`[^a-z0-9]`) 54 + return strings.ToLower(re.ReplaceAllString(link.Name, "")) 55 + }
+5
go.mod
··· 1 + module arimelody.me/arimelody.me 2 + 3 + go 1.22.1 4 + 5 + require github.com/gomarkdown/markdown v0.0.0-20231222211730-1d6d20845b47 // indirect
+2
go.sum
··· 1 + github.com/gomarkdown/markdown v0.0.0-20231222211730-1d6d20845b47 h1:k4Tw0nt6lwro3Uin8eqoET7MDA4JnT8YgbCjc/g5E3k= 2 + github.com/gomarkdown/markdown v0.0.0-20231222211730-1d6d20845b47/go.mod h1:JDGcbDT52eL4fju3sZ4TeHGsQwhG9nbDV21aMyhwPoA=
+122
main.go
··· 1 + package main 2 + 3 + import ( 4 + "arimelody.me/arimelody.me/api/v1/music" 5 + 6 + "fmt" 7 + "html/template" 8 + "os" 9 + "net/http" 10 + "log" 11 + "strings" 12 + 13 + "github.com/gomarkdown/markdown" 14 + "github.com/gomarkdown/markdown/html" 15 + "github.com/gomarkdown/markdown/parser" 16 + ) 17 + 18 + var mime_types = map[string]string{ 19 + "css": "text/css; charset=utf-8", 20 + "png": "image/png", 21 + "jpg": "image/jpg", 22 + "webp": "image/webp", 23 + "html": "text/html", 24 + "asc": "text/plain", 25 + "pub": "text/plain", 26 + "js": "application/javascript", 27 + } 28 + 29 + var templates = template.Must(template.ParseFiles( 30 + "views/header.html", 31 + "views/footer.html", 32 + "views/index.html", 33 + "views/music.html", 34 + "views/music-gateway.html", 35 + )) 36 + 37 + func web_handler(writer http.ResponseWriter, req *http.Request) { 38 + uri := req.URL.Path 39 + 40 + fmt.Printf("%s %s (%s)\n", req.Method, req.URL.Path, req.Header["User-Agent"][0]) 41 + 42 + if req.URL.Path == "/" { 43 + index_handler(writer, req) 44 + return 45 + } 46 + if uri == "/music" { 47 + music_handler(writer, req) 48 + return 49 + } 50 + if strings.HasPrefix(uri, "/music/") { 51 + music_gateway_handler(writer, req) 52 + return 53 + } 54 + static_handler(writer, req) 55 + } 56 + 57 + func index_handler(writer http.ResponseWriter, req *http.Request) { 58 + err := templates.ExecuteTemplate(writer, "index.html", nil) 59 + if err != nil { 60 + http.Error(writer, err.Error(), http.StatusInternalServerError) 61 + } 62 + } 63 + 64 + func music_handler(writer http.ResponseWriter, req *http.Request) { 65 + err := templates.ExecuteTemplate(writer, "music.html", music.QueryAll()) 66 + if err != nil { 67 + http.Error(writer, err.Error(), http.StatusInternalServerError) 68 + } 69 + } 70 + 71 + func music_gateway_handler(writer http.ResponseWriter, req *http.Request) { 72 + if len(req.URL.Path) <= len("/music/") { 73 + http.Error(writer, "400 bad request", http.StatusBadRequest) 74 + return 75 + } 76 + 77 + id := req.URL.Path[len("/music/"):] 78 + // http.Redirect(writer, req, "https://mellodoot.com/music/"+title, 302) 79 + // return 80 + album, ok := music.GetAlbum(id) 81 + if !ok { 82 + http.Error(writer, "404 not found", http.StatusNotFound) 83 + return 84 + } 85 + err := templates.ExecuteTemplate(writer, "music-gateway.html", album) 86 + if err != nil { 87 + http.Error(writer, err.Error(), http.StatusInternalServerError) 88 + } 89 + } 90 + 91 + func static_handler(writer http.ResponseWriter, req *http.Request) { 92 + filename := "public/" + req.URL.Path[1:] 93 + body, err := os.ReadFile(filename) 94 + if err != nil { 95 + http.Error(writer, "404 not found", http.StatusNotFound) 96 + return 97 + } 98 + filetype := filename[strings.LastIndex(filename, ".") + 1:] 99 + if mime_type, ok := mime_types[filetype]; ok { 100 + writer.Header().Set("Content-Type", mime_type) 101 + } else { 102 + writer.Header().Set("Content-Type", "text/plain; charset=utf-8") 103 + } 104 + writer.Write([]byte(body)) 105 + } 106 + 107 + func parse_markdown(md []byte) []byte { 108 + extensions := parser.CommonExtensions | parser.AutoHeadingIDs | parser.NoEmptyLineBeforeBlock 109 + p := parser.NewWithExtensions(extensions) 110 + doc := p.Parse(md) 111 + 112 + htmlFlags := html.CommonFlags 113 + opts := html.RendererOptions{ Flags: htmlFlags } 114 + renderer := html.NewRenderer(opts) 115 + 116 + return markdown.Render(doc, renderer) 117 + } 118 + 119 + func main() { 120 + http.HandleFunc("/", web_handler) 121 + log.Fatal(http.ListenAndServe(":8080", nil)) 122 + }
+1
public/font/monaspace-argon/AUTHORS.txt
··· 1 + GitHub Next <next@github.com>
+74
public/font/monaspace-argon/CODE_OF_CONDUCT.md
··· 1 + # Contributor Covenant Code of Conduct 2 + 3 + ## Our Pledge 4 + 5 + In the interest of fostering an open and welcoming environment, we as 6 + contributors and maintainers pledge to making participation in our project and 7 + our community a harassment-free experience for everyone, regardless of age, body 8 + size, disability, ethnicity, gender identity and expression, level of experience, 9 + nationality, personal appearance, race, religion, or sexual identity and 10 + orientation. 11 + 12 + ## Our Standards 13 + 14 + Examples of behavior that contributes to creating a positive environment 15 + include: 16 + 17 + * Using welcoming and inclusive language 18 + * Being respectful of differing viewpoints and experiences 19 + * Gracefully accepting constructive criticism 20 + * Focusing on what is best for the community 21 + * Showing empathy towards other community members 22 + 23 + Examples of unacceptable behavior by participants include: 24 + 25 + * The use of sexualized language or imagery and unwelcome sexual attention or 26 + advances 27 + * Trolling, insulting/derogatory comments, and personal or political attacks 28 + * Public or private harassment 29 + * Publishing others' private information, such as a physical or electronic 30 + address, without explicit permission 31 + * Other conduct which could reasonably be considered inappropriate in a 32 + professional setting 33 + 34 + ## Our Responsibilities 35 + 36 + Project maintainers are responsible for clarifying the standards of acceptable 37 + behavior and are expected to take appropriate and fair corrective action in 38 + response to any instances of unacceptable behavior. 39 + 40 + Project maintainers have the right and responsibility to remove, edit, or 41 + reject comments, commits, code, wiki edits, issues, and other contributions 42 + that are not aligned to this Code of Conduct, or to ban temporarily or 43 + permanently any contributor for other behaviors that they deem inappropriate, 44 + threatening, offensive, or harmful. 45 + 46 + ## Scope 47 + 48 + This Code of Conduct applies both within project spaces and in public spaces 49 + when an individual is representing the project or its community. Examples of 50 + representing a project or community include using an official project e-mail 51 + address, posting via an official social media account, or acting as an appointed 52 + representative at an online or offline event. Representation of a project may be 53 + further defined and clarified by project maintainers. 54 + 55 + ## Enforcement 56 + 57 + Instances of abusive, harassing, or otherwise unacceptable behavior may be 58 + reported by contacting the project team at opensource@github.com. All 59 + complaints will be reviewed and investigated and will result in a response that 60 + is deemed necessary and appropriate to the circumstances. The project team is 61 + obligated to maintain confidentiality with regard to the reporter of an incident. 62 + Further details of specific enforcement policies may be posted separately. 63 + 64 + Project maintainers who do not follow or enforce the Code of Conduct in good 65 + faith may face temporary or permanent repercussions as determined by other 66 + members of the project's leadership. 67 + 68 + ## Attribution 69 + 70 + This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, 71 + available at [https://contributor-covenant.org/version/1/4][version] 72 + 73 + [homepage]: https://contributor-covenant.org 74 + [version]: https://contributor-covenant.org/version/1/4/
+6
public/font/monaspace-argon/CONTRIBUTORS.txt
··· 1 + Riley Cran <riley@lettermatic.com> 2 + Heather Cran Arrow <heather@lettermatic.com> 3 + Danelle Cheney <danelle@lettermatic.com> 4 + Idan Gazit <idan@github.com> 5 + Cole Bemis <colebemis@github.com> 6 + Amelia Wattenberger <wattenberger@github.com>
+93
public/font/monaspace-argon/LICENSE
··· 1 + Copyright (c) 2023, GitHub https://github.com/githubnext/monaspace 2 + with Reserved Font Name "Monaspace", including subfamilies: "Argon", "Neon", "Xenon", "Radon", and "Krypton" 3 + 4 + This Font Software is licensed under the SIL Open Font License, Version 1.1. 5 + This license is copied below, and is also available with a FAQ at: 6 + http://scripts.sil.org/OFL 7 + 8 + ----------------------------------------------------------- 9 + SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 10 + ----------------------------------------------------------- 11 + 12 + PREAMBLE 13 + The goals of the Open Font License (OFL) are to stimulate worldwide 14 + development of collaborative font projects, to support the font creation 15 + efforts of academic and linguistic communities, and to provide a free and 16 + open framework in which fonts may be shared and improved in partnership 17 + with others. 18 + 19 + The OFL allows the licensed fonts to be used, studied, modified and 20 + redistributed freely as long as they are not sold by themselves. The 21 + fonts, including any derivative works, can be bundled, embedded, 22 + redistributed and/or sold with any software provided that any reserved 23 + names are not used by derivative works. The fonts and derivatives, 24 + however, cannot be released under any other type of license. The 25 + requirement for fonts to remain under this license does not apply 26 + to any document created using the fonts or their derivatives. 27 + 28 + DEFINITIONS 29 + "Font Software" refers to the set of files released by the Copyright 30 + Holder(s) under this license and clearly marked as such. This may 31 + include source files, build scripts and documentation. 32 + 33 + "Reserved Font Name" refers to any names specified as such after the 34 + copyright statement(s). 35 + 36 + "Original Version" refers to the collection of Font Software components as 37 + distributed by the Copyright Holder(s). 38 + 39 + "Modified Version" refers to any derivative made by adding to, deleting, 40 + or substituting โ€” in part or in whole โ€” any of the components of the 41 + Original Version, by changing formats or by porting the Font Software to a 42 + new environment. 43 + 44 + "Author" refers to any designer, engineer, programmer, technical 45 + writer or other person who contributed to the Font Software. 46 + 47 + PERMISSION & CONDITIONS 48 + Permission is hereby granted, free of charge, to any person obtaining 49 + a copy of the Font Software, to use, study, copy, merge, embed, modify, 50 + redistribute, and sell modified and unmodified copies of the Font 51 + Software, subject to the following conditions: 52 + 53 + 1) Neither the Font Software nor any of its individual components, 54 + in Original or Modified Versions, may be sold by itself. 55 + 56 + 2) Original or Modified Versions of the Font Software may be bundled, 57 + redistributed and/or sold with any software, provided that each copy 58 + contains the above copyright notice and this license. These can be 59 + included either as stand-alone text files, human-readable headers or 60 + in the appropriate machine-readable metadata fields within text or 61 + binary files as long as those fields can be easily viewed by the user. 62 + 63 + 3) No Modified Version of the Font Software may use the Reserved Font 64 + Name(s) unless explicit written permission is granted by the corresponding 65 + Copyright Holder. This restriction only applies to the primary font name as 66 + presented to the users. 67 + 68 + 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font 69 + Software shall not be used to promote, endorse or advertise any 70 + Modified Version, except to acknowledge the contribution(s) of the 71 + Copyright Holder(s) and the Author(s) or with their explicit written 72 + permission. 73 + 74 + 5) The Font Software, modified or unmodified, in part or in whole, 75 + must be distributed entirely under this license, and must not be 76 + distributed under any other license. The requirement for fonts to 77 + remain under this license does not apply to any document created 78 + using the Font Software. 79 + 80 + TERMINATION 81 + This license becomes null and void if any of the above conditions are 82 + not met. 83 + 84 + DISCLAIMER 85 + THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 86 + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF 87 + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT 88 + OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE 89 + COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 90 + INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL 91 + DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 92 + FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM 93 + OTHER DEALINGS IN THE FONT SOFTWARE.
public/font/monaspace-argon/MonaspaceArgon-Bold.woff

This is a binary file and will not be displayed.

public/font/monaspace-argon/MonaspaceArgon-BoldItalic.woff

This is a binary file and will not be displayed.

public/font/monaspace-argon/MonaspaceArgon-ExtraBold.woff

This is a binary file and will not be displayed.

public/font/monaspace-argon/MonaspaceArgon-ExtraBoldItalic.woff

This is a binary file and will not be displayed.

public/font/monaspace-argon/MonaspaceArgon-ExtraLight.woff

This is a binary file and will not be displayed.

public/font/monaspace-argon/MonaspaceArgon-ExtraLightItalic.woff

This is a binary file and will not be displayed.

public/font/monaspace-argon/MonaspaceArgon-Italic.woff

This is a binary file and will not be displayed.

public/font/monaspace-argon/MonaspaceArgon-Light.woff

This is a binary file and will not be displayed.

public/font/monaspace-argon/MonaspaceArgon-LightItalic.woff

This is a binary file and will not be displayed.

public/font/monaspace-argon/MonaspaceArgon-Medium.woff

This is a binary file and will not be displayed.

public/font/monaspace-argon/MonaspaceArgon-MediumItalic.woff

This is a binary file and will not be displayed.

public/font/monaspace-argon/MonaspaceArgon-Regular.woff

This is a binary file and will not be displayed.

public/font/monaspace-argon/MonaspaceArgon-SemiBold.woff

This is a binary file and will not be displayed.

public/font/monaspace-argon/MonaspaceArgon-SemiBoldItalic.woff

This is a binary file and will not be displayed.

public/font/monaspace-argon/MonaspaceArgon-SemiWideBold.woff

This is a binary file and will not be displayed.

public/font/monaspace-argon/MonaspaceArgon-SemiWideBoldItalic.woff

This is a binary file and will not be displayed.

public/font/monaspace-argon/MonaspaceArgon-SemiWideExtraBold.woff

This is a binary file and will not be displayed.

public/font/monaspace-argon/MonaspaceArgon-SemiWideExtraBoldItalic.woff

This is a binary file and will not be displayed.

public/font/monaspace-argon/MonaspaceArgon-SemiWideExtraLight.woff

This is a binary file and will not be displayed.

public/font/monaspace-argon/MonaspaceArgon-SemiWideExtraLightItalic.woff

This is a binary file and will not be displayed.

public/font/monaspace-argon/MonaspaceArgon-SemiWideItalic.woff

This is a binary file and will not be displayed.

public/font/monaspace-argon/MonaspaceArgon-SemiWideLight.woff

This is a binary file and will not be displayed.

public/font/monaspace-argon/MonaspaceArgon-SemiWideLightItalic.woff

This is a binary file and will not be displayed.

public/font/monaspace-argon/MonaspaceArgon-SemiWideMedium.woff

This is a binary file and will not be displayed.

public/font/monaspace-argon/MonaspaceArgon-SemiWideMediumItalic.woff

This is a binary file and will not be displayed.

public/font/monaspace-argon/MonaspaceArgon-SemiWideRegular.woff

This is a binary file and will not be displayed.

public/font/monaspace-argon/MonaspaceArgon-SemiWideSemiBold.woff

This is a binary file and will not be displayed.

public/font/monaspace-argon/MonaspaceArgon-SemiWideSemiBoldItalic.woff

This is a binary file and will not be displayed.

public/font/monaspace-argon/MonaspaceArgon-WideBold.woff

This is a binary file and will not be displayed.

public/font/monaspace-argon/MonaspaceArgon-WideBoldItalic.woff

This is a binary file and will not be displayed.

public/font/monaspace-argon/MonaspaceArgon-WideExtraBold.woff

This is a binary file and will not be displayed.

public/font/monaspace-argon/MonaspaceArgon-WideExtraBoldItalic.woff

This is a binary file and will not be displayed.

public/font/monaspace-argon/MonaspaceArgon-WideExtraLight.woff

This is a binary file and will not be displayed.

public/font/monaspace-argon/MonaspaceArgon-WideExtraLightItalic.woff

This is a binary file and will not be displayed.

public/font/monaspace-argon/MonaspaceArgon-WideItalic.woff

This is a binary file and will not be displayed.

public/font/monaspace-argon/MonaspaceArgon-WideLight.woff

This is a binary file and will not be displayed.

public/font/monaspace-argon/MonaspaceArgon-WideLightItalic.woff

This is a binary file and will not be displayed.

public/font/monaspace-argon/MonaspaceArgon-WideMedium.woff

This is a binary file and will not be displayed.

public/font/monaspace-argon/MonaspaceArgon-WideMediumItalic.woff

This is a binary file and will not be displayed.

public/font/monaspace-argon/MonaspaceArgon-WideRegular.woff

This is a binary file and will not be displayed.

public/font/monaspace-argon/MonaspaceArgon-WideSemiBold.woff

This is a binary file and will not be displayed.

public/font/monaspace-argon/MonaspaceArgon-WideSemiBoldItalic.woff

This is a binary file and will not be displayed.

public/font/monaspace-argon/MonaspaceArgonVarVF[wght,wdth,slnt].woff

This is a binary file and will not be displayed.

public/font/monaspace-argon/MonaspaceArgonVarVF[wght,wdth,slnt].woff2

This is a binary file and will not be displayed.

public/img/buttons/ari melody.gif

This is a binary file and will not be displayed.

public/img/buttons/mae.png

This is a binary file and will not be displayed.

public/img/buttons/misc/debian.gif

This is a binary file and will not be displayed.

public/img/buttons/misc/epicblazed.png

This is a binary file and will not be displayed.

public/img/buttons/misc/gaywebring.gif

This is a binary file and will not be displayed.

public/img/buttons/misc/girls4notepad.gif

This is a binary file and will not be displayed.

public/img/buttons/misc/gplv3.gif

This is a binary file and will not be displayed.

public/img/buttons/misc/graphicdesign.gif

This is a binary file and will not be displayed.

public/img/buttons/misc/h-free-anim.gif

This is a binary file and will not be displayed.

public/img/buttons/misc/hl.gif

This is a binary file and will not be displayed.

public/img/buttons/misc/iemandatory.gif

This is a binary file and will not be displayed.

public/img/buttons/misc/ipv6.gif

This is a binary file and will not be displayed.

public/img/buttons/misc/learn_html.gif

This is a binary file and will not be displayed.

public/img/buttons/misc/ltg.gif

This is a binary file and will not be displayed.

public/img/buttons/misc/mymusic.gif

This is a binary file and will not be displayed.

public/img/buttons/misc/smokepowered.gif

This is a binary file and will not be displayed.

public/img/buttons/misc/sprunk.gif

This is a binary file and will not be displayed.

public/img/buttons/misc/tohell.gif

This is a binary file and will not be displayed.

public/img/buttons/misc/virusalert.gif

This is a binary file and will not be displayed.

public/img/buttons/misc/wii.gif

This is a binary file and will not be displayed.

public/img/buttons/misc/www2.gif

This is a binary file and will not be displayed.

public/img/buttons/zaire.gif

This is a binary file and will not be displayed.

public/img/favicon.png

This is a binary file and will not be displayed.

+1
public/img/mailicon.svg
··· 1 + <?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg width="100%" height="100%" viewBox="0 0 267 267" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"><use id="Background" xlink:href="#_Image1" x="0" y="0" width="648px" height="648px" transform="matrix(0.998523,0,0,0.998523,0,0)"/><defs><image id="_Image1" width="267px" height="267px" xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8SEhEPERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7/2wBDAQUFBQcGBw4ICA4eFBEUHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7/wAARCAELAQsDAREAAhEBAxEB/8QAHQAAAgICAwEAAAAAAAAAAAAAAAcGCAQFAQIDCf/EAEgQAAEDAwEEBgYHBQYFBQEAAAECAwQABREGBxIhMRNBUWFxgQgUIpGhsRUjMkJSYsEkcoKS0RYzorLh8ENTY3TCFzQ1RHOE/8QAGwEBAAIDAQEAAAAAAAAAAAAAAAMEAQIFBgf/xAAzEQACAgEDAwIDBwQDAQEAAAAAAQIDEQQhMQUSQRNRIjJhBhRCcYGx0SMzkaEkUvDh8f/aAAwDAQACEQMRAD8AhNUS6FAYsm4QY3/uJbLeOpSxmsqLfBhySMJWpLKlWPXkHwBNbenL2NfUj7mXCuUCbwjS2nD2BXH3Vq4tcmyknwZiFFJBBIIOQR1VG1kmhNxeUYd+1HFiHfnzFuvAcEA7y/8ASswp/wCqJtRrp2vusk2/qQq6aznPkphtojI7T7SqsxpS5OfO9vgj0uZLmK3pMh109W+onFTJJcEDbfJ4VkwZMKBNmr3IcORJV2NNKWfhWspxj8zwZSb4JFbNnGu7kkKh6TuziTyJjqT88VWnr9ND5po3VU3wjfxNhe1CSAU6ZW3n/mvto+aqry6xo4/j/c3Wmsfg20X0cdpj2Oki2yP/APpNB/yg1DLr2kXlv9DZaSw20P0X9cOEetXiwMDuddWf8g+dQy+0OnXEX/r+TZaOfuSG2eiq6SDc9YoHamPCJ+Kl/pVef2jX4a/8s3Wi92TGw+jXoOApK579yuahzDroQk+SQKpW9f1M/lwiWOkguRnaW0dpfS7e7YbFBgHGC420OkUO9Z9o++uXdqrr/wC5JsnjXGPCN9Vc3CgCgCgKv+nE2PXtMu9fRvp+Ka9V9nHtYvyKGt8Fd7KcXWPj/mCvST+VlOPJOarFgKAyILwjy2XygLDa0qKTyVg5wajksrBa09qrsjJrOHx7jClardW1uxY6WTj7RVvY8KoR0qT3Z7C/7VTlHFUO3/ZH5Ehx9xTrq1LWrmSatRgksI8xfqp2ycpvLZ4E5qRIpSlkKyaHNZAUAUBE7vrOMypTVva9YUP+Irgny6zU0aW+SKVqXBFrjf7rPJDstaUfgb9lPw5+dSquKIXOTNYSSck5NbmpxQHZpxbTiXG1lC0nIUDgg05BJp2sJbluaYjjo39wB14jiT3f1qFUrOWSu14wiMrUpaytalKUeJJOSamIsks0Hs31hrV8JsVndXHz7cp36tlHio8/AZPdVPU6+jTL+pLf28kkKpz4Q9tJei7CbSh3VF/dfXzUzCTuJ8N5WT8K4F/2ik9qo/5LcNGvxMaem9j2zewpSYuloUhwf8SYDIUT2+3kDyArlXdU1dvM2vy2/YsRorjwiaxYUKI2luLEjsISMBLbYSB5CqMpylu2SpJGRWpkKAKAKAKAKAKAKAKAKAKAq16cD4N403GB4pjvLPmpI/SvV/ZxfBN/kc/W8orxbX0xZrT6klQQrJAr0kllYKaeHkkKdSRc8WHR7qh9JkvqIyo97tzuB0xbPYtOPjyrDhJGVNM2DbrbiQptaVg9aTmo2sEikSNkktIPakVHgk7jtis4MNnNZMBQBQBQBQCet8KXcJjUODGelSXVbrbTKCtaj2ADiauSnGC7pPCKaTeyHTob0bdXXhLcjUElmxMK4ltQ6V7H7oOB5muJqevUV7Vruf8AotQ0knzsTzU2zjZDsl019L6ghyL7NV7MdqU9xfcxyShOEgdpIOK59Ov13ULOyt9q+ngllVVSsy3K3aw1G/qK4qf9ShW6KknoIcNkNtNJ7OHEnvPGvTaehUxxlt+7KU59zNHU5oe8GJKnTGYcOO7IkvrCGmm0lSlqJwAAOZrWUlBOUnhGUs7ItJsZ9HeHASzetdJTLlYCm7aD9U2f+ofvHu5eNeV6h1yU8w0+y9/4L9OlS3mWEix2IsdEeKy2wygYQ22kJSkdwFeclJyeWXEsHrWDIUAUAUAUAUAUAUAUAUAUAUAUAUBTL0w7omdtZ9RQrIt8FplQHUpWVn4KTXteg19ml7vdv+DmauWbMCst2nNQXFsOW+xXSYg8lMRHHB7wK6076obSkl+pXUJPhHW42C+W5O9cLLcYae1+KtsfEUhdXP5ZJ/qHGS5RralNT0ZedZVvNOKQe1JxWGsmU8Ejs+sJsYJamITJaHDPJYHyNRyqT4JI2tckxtF5gXRP7M8OkAyW1cFDyqCUHHkmjJS4NjWpsFAFAFAFAWb2bbONMaDgJYs0JKpRTh2Y6Ap5zz6h3DhXidXr7tVLM3t7eC3XVGtbEnuc2NbbdJuExwNR4zSnXVnklKRkn4VVhBzkox5ZI3hZZQXa7rifr3WMm7yXFiKlRbhME8GmgeAHeeZPbX0HQaOOkpUFz5/M5Ftjslkh1XSI7sNOPvIZZQpxxaglCUjJJPICsNpLLBc70dNkcfRdqavt6ZQ7qGUjewRkREH7ifzY5ny8fFdW6m9TL04fKv8AZ1NPR2LL5HHXFLIUAUAUAUAUAUAUAUAUAUAUAUAUAUAUAlNKaEXfNpM3U95tPRNCWp4qfawp1QPsJGeoYHdgYrtXaz0tOqoS8FWNfdPuaHUAAAAAAOQFcUtAoBQwQCD1GgIvqXZ5orUSVC66bt7q1c3UtBC/5k4NW6ddqKfkmyOVUJcoT+ufRhtMltcjSF3dgv8AMRpn1jR7goe0nz3q7Gm+0M47XRyvdFaejT+Vlf8AXez3Vui3ym/Wl5lnOEyUDfZV4KHD316LTa6jUr+nL9PJTnVKHKIs04tpxLja1IWk5CgcEVbIyVWPVslBDM5YWOQcI+dQTq8omjb7kujXNlxIKhu55EcQahaJsmahSVp3kqBHaKwZO1AFAXLr56dASfphaketGzZq0RnChy7yA04QePRI9pQ8zujwzXc6DQrNR3v8P7lXVzxDHuU3r2hzAoCwfoibO27tdnNa3ZjfiwF7kFChwW91r793q7z3V53ruudcfQg93z+Rc0lWX3stjXkTohQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQHjNixp0VyJMjtSI7qSlxp1AUlQPUQeBraMnF5i8Mw0nsyu22L0dIz7L940EAw+kFa7atXsL7myeR7jw7xXo9B11pqGo3Xv/JSt0ud4FYZ0STBmOw5jDkeQyoocbcTuqSR1EV6mMlJd0XlFFprZmxsF2VFWI76ssE8Cfuf6VrOGd0bQnjZkxjvrbIW0vgePDkagwT5NpEnIdwhzCF/A1q0bJmZWDJcuvnp0Cr3pwqc+kNNo49H0Tx7s5TXqvs5jtn+hQ1vKK2V6YomZZLdKvF4iWuEjfkS3kstjvUcVpZYq4OcuEZinJ4R9DtDadh6U0nbtPwUgNQ2EoKscVq+8o95OT51851N8r7ZWS8nZhFQikjdVAbhQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQCl2+7IYWu7au6WptqNqGOgltzG6JIH3F9/Yerwrr9L6pLSy7Z7wf+itfQrFlclLJ8STBmPQ5jK2JDCy242sYUlQOCDXt4yUkpR4ZzGsPDN9pS4bw9RdVxAy2T2dlR2R8klcvBIKiJTIRMkISEhzgO0VjAyXhhyY8yK1LiPtvx3UhbbjagpK0nkQRzr55KLi8Pk6SeeBN+l1pGTf9ANXiA0XZFndLziEjJLKhhZHhgHwzXb6FqVVf2S4l+5W1UO6GV4Ka17Q5g6fRB02LxtMXdXm96PaI5eyRw6VXsoH+Y/w1xOvX+np+xcyLWkhmefYuXXijphQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQFY/TC2etNhrXlqZ3SpQZuSEjgT9x3x6j5d9eo6Drm/8Ajz/T+Chq6vxorZGdUxIQ8g4UhWRXp2srBSTwT5lxLrKHU8UrSFDzqqWDtQydNlu1zVegVJjQnxNtm9lUGQSUDt3TzSfDh3VDremU6veSxL3I6r5V8cFg7d6SWgZmn3X7pFuEWWEYXB6HpOlJ5hKvskfvYrzs+g6mNmINNe5cWrg1uVS1lPs9z1JMnWK1LtUB5ZU3FU70m524OBgd3VXrdPCyFajZLL9znzabylgbPovL2iWvUrTVlszqrJOeQbg69H3UbgzxCz2ZOMdtcfrP3WdeZy+JcFnTeonsti2N1v1ltSt243SJFV+Fx0A+6vIRrlLhF+VkY8sxYertMS3A3HvsBxR5APAVs6bFyjVXVvhm7SpKkhSSFA8QQeBqIlOaAKAKAKAKAKAKAKAKAKAKAKAKAKAKAKAKAKAKAxrhPg29rpZ0tmOjtcWE1tGEpvEVkw2lyRyTtF0gwvdVdgs9rbK1D3gVZWivf4TT1Y+5hu7WNBsKAl3tMQKOEqfaWhJ8yMVuum6mXyxyY9aC5ZJrJfrLe2eltF1hzkYzlh5K8eQqtZTZU8Ti0bqSlwzx1pZGNSaTudikAFE2MtoE/dUR7J8jg+VZ09zptjYvDE490Wj5zyGnGH3GHklDjaihaT1EHBFfSU01lHEJhptwuWdnPNOU+48PhUE18RPDg2NaG4uqtlUZ+yrYtqrXIROU39FWgn/3chJBcH/TTzV48u+uVrerU6X4eZe38k9WnlZv4LN7PNjGg9IhD7NvbulwSOMqZhwg/lT9lPkM99eX1XVdTqNm8L2Rfr08IfUk+0S9K01o2ZcIqUpdQkNs8OAUo4Bx3c6pUw9SxJmb7PTrckV60vp+9a1vD6WHw46B0siRIWTjJ6zxJJNdHUamvTRTkcKUs7s3N52VasgArjsM3BsDJLDgCh/CrBPlmq9fVKJ8vBr3I01rv+q9KTN1mVOhLT9ph8HcPihXCrbjVcs8k9d84fKxp6H2uxLg+3B1AyiE8shKZCP7on82eKfiKp26Nx3gdCnWqTxPYaiSFJCkkEEZBHXVEvHNAFAFAFAFAFAFAFAFAFAFAFAFAFAFAdXFobQpa1BKUjJUTgAUSyBX642oojrcg6c3HVpJSqUpOUg/kHX48vGupp+n5+Kz/BBO7xEXMWHqPVdwUppuXcpCj7S1HIHio8Ej3V0XKqiO+yIEpTZK4OyO+uoCpU2HGJ+6CVke7FVJdSrXCbJFQzD1TsOudztTsRFyhOqUMoKkqThXV21JR1eFc1LDMS07awVdns33R+pJEJT0u23KE8UKLTim1JUOsEV6yLr1Falymc9qUHgbez30kNUWcNxNTMIvkROB0vBEgDxHBXmM99cfVdBps3qfa/8ARZr1cl824n9XTo101VdrnCQtuNLnPPspWMKShayoA468GuzRBwqjGXKSRWm8ybRINNNluzs55qyr41pZ8xLDg2NaG45dhewCPAQzqDXLAfmEBbFuVxQ13ufiV3ch156vPdS6055roe3v/BNRpcfFMkm2vW0mFK/svZHvVkNIAkra4EZHBsY5DGM48K5mloUl3yI9XqHF9kRZNPakt7LVyQu6RmV8WpHtpQrwVyNWs1ybjs2c9WST2Zu7xtBud60c5YLun1h3pULblDgogHiFDrPfWsdPGE++JPLUynX2SJP6OKv2+9J7Wmj8Vf1rmdZ+WH6lOY564JGYN4s9svEYx7lCZktkY9tPEeB5ipK7p1PMHgyngQu1jRcfSk2O9BfUuHLKujbWcrbKcZGescRxr0mg1j1EWpLdEkXkaGwW7yrlo1UeWtTioTxabWo5O5gEDy4jwxUWsgozyvJ2tHNyr38DCqoWwoAoAoAoAoAoAoAoAoAoAoAoAoDxmyY8KK5LlPIZYaSVLWo4AFZjFyeEYbwI3aNr2TfnlwLctbFsScHHBT3eru7vfXc0ujVS7pclWyxy2Rm7PdnD10DVyviXI8I4Uhjkt0dWexPxPdWmq1yh8MOTNdWd2OOBDiwIqI0OO2wygYShCcCuPKTk8yZZSS4MitTIUAg/S02cC9WM6ztMfNwtzf7YlA4usD73eU8/DPZXoOh6/wBKfoTez4/P/wClPVVdy7kVHr2BzjaRrHMfKFDow0oAhe9kYqN2JG6g2S5htLLCGk/ZQkJHlUDeSZbHqE8KxkzgvU+4lllbyzhKElSvADNfPEs7HSexVFoPaj1mkOkqduE72j++v5DNdqclVU37I8/ZLuk5Ms+IUT1BMBUdtcYNhvolJBSUgYxivH98u7uzuVyr3pAqsmkdSiBYXAuQ630jsfGUxieXHrzzx1V7Ho8LdVV328e/uWKoOW7FM1dNQSFrXGlzhvfaDC1JH+Gu/wChTFbpFlQXhG803tE11paUlUW9TgkHJYlKLiFeSv0qvf03S6hfFBfmjEqovlFjdBbb9P3vTLky6pVDukbCXojYKukPUpB7Djr5fGvIa3od1FvbDeL8/wAlOdTixe6z1HcdaX5DnQKCc9HFjIO9ugn4k9ZrpaXTR00ML9WZjHwh97LdOHTWk2IbxSqW6ovSCnkFn7vkMDxzVDUWepPK4O7p6vThglVQE4UAUAUAUAUAUAUAUAUAUAUAUBh3m6QbRAXNuEhDDKBzJ4k9gHWa3rrlZLtijDaSyxDa91nO1RL9XZC2belf1TA5rPUVdp7q72l0saVnyVJ2ORItP7Kpzul5F1nlbU4t78WLjqHH2u8jkOqr6htuIrG7JHsr1KuSj6DnuEvtD9nUo8VJHNPiPlXD6hpex+pHjyWYsYFcs3CgCgOrqEOtqbcSFIWClSSOBB5isp43BQ3b5ohWhtoUqCy0U26V+0wlY4dGo8U/wnI91e+6Zq/vVCk+VszkX1+nPBo9JTspVCcPEe03+oq3ZHyYrl4JFURKeycYFaMyXT1e8Y+lro8OaYjmP5TXgKlmaL9jxBsrvsfjiTtFtSVDKUKW4fFLaiPjiuh1GXbppf8AvJ52XBZOvKERQjWc16/7QLnLfWSuVPWMnqTv4A8hivqGkrVOnjFeEdKEcJImsOMzEjoYYQEIQMACq8pOTyy0lgxb9Bbn2x5paRvhJUhXYocq2rm4yMSWUQ3RbxavjaBydSUEdvXU2sjmtv2KlizEadv07f5wDkK0T3h1KbZVj31wZaiqHzSSKucHs07qXSVzbd/b7ZJHtALCk747weChWVKu+OzTRJC2UXmLLHbPdQp1PpaNdCEpeOW30DklxPP38D51ybq/Tn2naos9SCkSGoiYKAKA4JABJIAHMmgEdO2mXtnU8uVCeQ7by4UtR1jKSgcAQeYJ5+ddyOgrdaUuSq7X3bE205tQsNxCWrgVW18/8zi2T3KHLzxVK3p9kN47oljdF8k1iS4stsORZLL6CMgtrCh8KpSi48okTye9amQoDgkAEkgAcyaAVO0vbto3SClwojxvdzTwLEVQ3Gz+dzkPAZPhXW0fRr9R8T+FfX+CvZqYQ25YgtXekNtBvS1t22SxZY6uATFbCnMfvqyfdivQ0dD0tW8l3P6lOeqnLjYhCjr/AFVKTvOaivL6zlIUt15R8OddCENPVtFJf4Im5y5yez+lNo9oAmu2HUsLoyFB31d5BSeo5xwqROp+xjtmhx+jVtm1i9rWBo3UcmReIsxZabdkZVIYVgkEqPFQ4cd7JFQX0R7e5bEtVss4Yx9p1qc05q9F0gZaakL9YaI+64DlQ9/HzrlWwUk0+GXosZWm7o1ebNHuDWPrE+2n8KhwI99eVuqdU3BkyeTY1EZCgCgFF6VmkU6j2au3Jlrem2ZRktkDiW+Tg8MAH+Gux0TVejqO18S2/graqHdDPsUtiPKjyW3kc0KzXt2srBzE8MnzLiXWUOoOUrSFDzqq9iwtz2SrhWpkufr5JVoq8BPP1RfyrwNP9xF67+2xD7EFpTtEhBR4qbdCfHcJ+QNW+pr/AIz/AE/c8/LgsQ6tDTanHVpQhIJUpRwAO0mvMJNvCIihu0KO1bNf3X1F5D0cTVvR3EfZUkq3hjtHV5V9N0M3Zp4uXONzo1yzFMldpuUa4xUvMrG9j20Z4pNRTg4vDLaaZg6puzMKC4whaVSXUlKUg8Ug9ZreqtyefBrOWEbX0YNMqvu0duc6wHIdrQX3SpOU75yEDxzk+Rqj1/VejpXFPeW38lK+WI4LhAAAAAADkBXgSkKL0jVNdFaEcOl3nD37vD9a7fRk8yJIG69HJDidGzVqBCFz1bmev6tGT/vsq1rvnX5HZ0P9t/mM2qRdCgCgIPth1Gmz6eVAYcxMnpKEgHilH3lfp7+yr2ho9Sfc+ERWzwsGFsc0jbbloR5d5gNyETXypsqGFJSkbuUkcRxzXo4LYrxWxr9S7GJCFKdsFwS6jPBmTwUP4gMH3CsOv2DgQSfprV+n3FLdttxjBBz0rIUUeO8nhUcq88o13QRNbathpCWr3LwOQcw5/mBqtLSUy5ibKyS8nvM2p6qhQ3JMq8toabGVLVGb4f4a1j06mTwo/uZd0l5FHtD2z6x1PGctbd4kNW5XBYbQhtTvcSkA47q7Wk6TRQ+9x3KtmonLbJpdJbOr9fUCUqM+1GxvKUGypW72nqSO81at1Si+2KyzSNbe7JvY7ds1048E3bUMJpxJ9v1cGa8f4kZbB8/Kq0oai75uCVdkRqaU25bGdMRxHtcW8BeMLkLiArc7yd74DArK0k0bq6CJ5p3bvsvvTyWG9SswnVchOQpgfzK9ke+tZaexeDdWwfkmtutGnVTk323262Kkuo9mYw0gqUk9ixzBqNyljDN0lya3afZfpnSkgNpzJi/Xs8OJxzHmM+eK0ayjZPDF9seu5j3N20ur+rkjfbB6lgcfePlXG6lT3RVi8E0WNauIbhQBQHnKYalRnY0htLjLqChxChwUkjBB8qym4vKMNZPndtD0+vSutrvYF7xEKSpDalc1N5yg+aSK+j6S/wBemNnujjWR7JNGbpKR0kBTCjxaVw8D/s1mxb5N63sbmoyQvPcYyJtvkQ3PsvtKbPmMV87i8PJ0msrBVdhy46P1cHC1uTLe+fYWDhXV7iD7jXZnCN9bi+Geesg4txZnaq1rqHVCxHkvbjClYTFjpIST1DHNR8aio0dOn3XPuzRJIz2tiFw1Lp12TcJAts4JzCbWjJz/ANTsB7OfX3HRdbhprUorK8//AA2jb2sU+odluvbA+tL9hluoTk9NFHSIwOvKeXnXep6rpLltNfrsWY2xfk1Vg0ncLrco8eS63AaecShT7+SEAnGSBxqW7W11xbW+PYSsSLo7ONG2rRGm2rRaxv59t99Q9p5eOKj+g6q+fa7W2ay12T/RexSnNzeWSWqZoVz2xX1F81k6iMvfjQx6u2RyUoH2iPPh5V6np1HpUrPL3JYrYeOzG0qsuh7bCcTh0t9K5w47yzvfDOPKqmon32Nnf08OytIktQkwUBrtRXiFYrU7cZzm622OCRzWrqSO81JVVK2XbE1lJRWWIRpN019rZKTnpZLmOHEMtD9APjXpKKVXFQiU23N5LL2uDHtltj2+IjcYjthtsdwHzq6SGVQBQCc9JzXCdn9gt8uHpq23KbcH1tB6YxvtNBKQTnGCVHPAZHI9lT0VK1vJFbPsWyKrbS9oEzaA5bIzNghWstJ3VMQEnEh4n7WOfYAnJ8au1URqy0VZ2OY2tGbP9N7INGp2gbSoyJ93cx9H2kgEIWRkA54FfWTySO01FOyVsuyHBLGCrXdITu0fabqrXMtZuc1UeBvfVW+MShhsdQ3R9o95qeuqMOCGVjlyQupTQyLa3CdmIbuEp6LHJwp1pkOqT37pUnPvoBtQvR+1NftMp1Hoi8WfVEBWRiM4WnkqHNKkLAwriOGeugIMq6690LMdsirhe7E8yrK4pdW3unt3eXmOdauEZco2UmuGb/S21DatOu8Oz27VdzffmOpYbbUQvJWcdY76jlVWllo2jZNvCY77jDnaT1KGFO9JJhLQtLhHBw4Bz4GuHdBTTi+GdOPA9YEpubBYlsn6t5AWnwIryc4uEnF+CU961MhQBQFPPTKs4g7SYtzQjCbhCSpR7VIJSfhivZ/Z+3u07h7M5urjieRTaSe3LkWjycQR5jj/AFrs2LYr1vcltQE5e+vnR0yEbWtMW27aZn3JUBC7lGjKWy8ngvCeODjnwzwNWdNbKM1HOxW1NUZwbxuJnZHKtkTXMN66KQhsBQaWv7KXCPZJ7OurXUIzlQ1A4cuCyYIIBBBB5EV5QiPKWyJEV5hXJxBQfMYrMX2tMFS5zBjTX46hgtOKQR4HFe1i+6KZON/ZZtIieotWbUL4YcZSEsSln2Vp6kqPUR28j8+HrunS7vUqX6Eco+xs9pW0a3QLU5BsctuVPfSU9I0rKWUnmc9vYP8AZi0XT5zn3WLCX+xGPuL3ZBpVepNTIkSUE2+GoOvqI4LVzSjzPPuBrtam304YXJe0tPqTy+EWSxgYHDsrkHZOaA0uqdU2DTEFcu93SNESkZCVuALV3BPM1PTp7b5Ygsmkpxistlatoe1y16guXSPT8RmiQxHaSpQSO0kDBV316XS9MsqjstylZepMkOybbRsv0vFWZiLx9Iv8HZBhpKEpzwSnCicdZ4ca6EdHOKNY3QQ4Ldtp2aXC0ybjF1RFKIzSnXGVpU27gDJAQoAk+FauixPGCRWwazk9Nkm1jTO0oTUWVEyNJhkFyPKQlKyg8ljdJBHypbTKvkQsU+Cf1ESGo1bpuyarsrtmv9vanQnCFFtY+yoclJPMEZPEVtGTi8oxKKksMgGhdg2hdIaqRqKC1LkyWSVRkSXAtDKj94DHEjqJ5VLPUTnHDI40xi8iF9MS8XG/bYI+loyHHEQGWWY7COJW88ArIHad5A8qtaWOIZ9yC95lgV+06wR9K6oXpppQckW5pDUx0HIXII3l47gTujwz11aICL0AUA6/Q41pL0ztbiWgvqFuvh9Vfaz7PSYJbVjtB4fxGgLebbtlNg2n6eVEnNtxrqyk+pXBKMrZP4T+JB6x5igE/sA2Dz9A6ql33VbkKTOj7zVvDCitKQeBd4gYJHADmATVLVWfgRb09f4iSbdLeEy4F1QnG+gsOHwOU/M/CudNFtG42TT/AFvSwYUrK4rhb8uY+deb6jX23Z9yWPBMKomxHNX6tgWBlTeRImkewyk8u9R6hVvTaSd7zwjDeBVXLUGoL3KO9KlKzyZYKgkD90c/Ou5Vpaq1hIjbIPtOsL1/tBbnrkiXDQpcfpVK9nPEjB6jgVd001TPZc8kNtanEQ1qWWbpHUeGHAD58DXalujnx2ZOqrFgvfXzo6Z1WlK0KQsBSVDBB6xQCB2n7NJtnfeutlaXJtqiVqbQMrY8utPf1V1aNSprtlycnUaRxfdHg1ejdo9908hMR1Qnwk8A08faR+6rmPA5HhUep6dVd8S2ZQcUxn2TarpWegCW+7bnSOKXmyU57lJyPfiuPb0u+HyrJo4sSGqXY0vVlyehrDkd6Y4ppSeSklZwRXoaE41RUucEqJ7qLY5d2lB6xvNSWlAHoXVhC0HsyeB+FQQ1kXtIv2aGXMCK6e0bLn6za05NfajOFSg6tCw5u7qSogEHGeGKs2T7avUXBFDSyc+2RY/Tdkt2n7S1bbayG2W+ZPFS1dalHrJrjWWSsllnWrrjXHtieOr9TWTSdldu9+ntw4rY5q4qWepKUjionsFb0aezUT7K1lmZzUFllW9pnpH6hvCnYOkWzZYRyPWFAKkrHceSPLj316vR9Bqr+K74n7eDn2auT2jsKyy2DV+uLuhESPOukuQvHSvLKsntKlV2HOqldq2+iK6jKbHNY/RT1G+0ld41HboaiOLbLanSPPgKjerXhEq078s2kr0TXuhPq2sGy51dJEOPga1+9/Qz93+ouNe7ANoWlWFzG4CL1CR9p23krWkdpb+17gQKmhqIS24I5UyiTL0KLDfmNf3G7uwJLFtbgrYdccbKElwqSUpGeZGD4VHq5Ltwb6dPuyW+zXPLYqds20DVWzi8wryuzMXTSDwDUlTQIfjO9pOcEEcuGMjGeIzPVXGxYzuRWTcHnwTzRup7Lq+wR75YZqJUN8cCOCkK60qHMKHYainBweGSRkpLKFhrPZnKn+kzo7WseIp+3KcT6+Upz0TzKFqbWrsBwgZ7UjtFXdJZt2sraiG/cVG2rOvP7TtTuSCouG7SQc8+DqgPhirhWI1QBQE32Cw3522bSTMdKitN0ZdOOpKFBSj7gaA+l6XWlHCXEKPYFCgNRqABL7au1OKoatfEmXdK/haF/tbiiVox90D2o7iHB4ZwfnVKXBaIbsXmFu7zYJPsvMhweKT/AEUfdXG6pDMFL2N4m313rtEEuW6zrSuSPZcf5pbPYO0/Kq+k0Dn8dnBlyI3ovRN01Q79ITHHI0FSsqfWMre7d3PzrvRrSRE5DlsFhtViiCPbojbQH2lkZWs9qlczUhoV820amYlTrtdAtPq0dtTTJ/EBwB8zWsU5zSRmT7YtlU4h357R7XR867j4OYuSfVVLJe+vnR0woAoCH6r2c6a1AVuuRTDlK49PGwkk945GrFepnD6le3TV2crcW912LXtlw/R1xiS288N8FtXmOI+NW462D5RSloJL5WbTQ2yKXEvDFw1A+wpqOsLTHaJVvqHEbx7M9XXWlusTjiBJTonGWZk52pX5dh0q65HUUyZKuhZUOaSRxPkAah0dPq2YfCLtku2IpNkxV/6g21Rzklziev2FV19av6EivV8yG/qzXemtNxJD024NuOMIUtTLJ31jAzxxy865FGjtuaUVyWJWRjyUl2jaz1BtI1YqXJU64hSymFDQfZZRngAO3tNe50mkq0VWF+rOXZZK2Q1Nkvo/3W4oauF9YEZCsKBfTwSO5HNR7zwqG7Uym8R2RLXR5ZZ/R+k7JpWEI1qjBKsYW8oArX4nqHcMCq6WC0opG+zWTOAzQYOc0MYOQaGDmsAxLxbYN3tki2XKM3JiSUFt1pYyFJPVWU2nlBrOzKmzRffRx2qIXGW9N0fdVk9Gr7zeeI7nEZHHrHjwvrGoh9UVHmmX0Lb6YukO6R4N0gPpfiS20uNOJ5KSocDValuNqTJ7F3VvBSf0wdDS9KbV5l2SwoWu+KMqO6B7O/w6RHiDx8CK6hQEvQBQDB0Lss2lXtxubZLPOgIUPYlvLMYYPYTgkEdlRSuhHlksaJy4Q2NOej7r9DqJM7aCu3OZzmM466sf4kj41C9UvCJ1o5eWWD0Xa7rZLE1brtqWfqF5s+zJlpSFgfhGOOPEk99VbbHY8stVVKtYRlaqY9b0xc4/WuK5u+O6SPjUTRsyv0SVIiOKdjPLZWUlBUk4O6RxFVZQjNYkgMTZvs/E9Dd3vra0xzhbEY8Ok/Mr8vd11NGODRsbraENNpbbSEoSMJSBgAVuakA2savFsiKs1vd/bXk/WrSf7pB/U/KtZPBslkqTtwuUhsQrUk7jLqS8vtVg4HlwNW9BFPMitqp8RFzZGy7doyR1OBXu4/pXQm8RZVjyTmqxYL3186OmFAFAFAFAFAJrb/MWu9W6373sNRy9jvUoj/wrs9Mj8DkVr3ukSzSuhbHfNCWWRKbeZliMfr2HNxZCieB7eddnsUluaJbHlI2K6YkRH4z8y4rQ82pB9tIwCMfhraMVFpoemmeuyrY5pLZ4t2VBQ5cLg4eEuWlKltjsRgYT4jjViy6VnIrpjAn8yZGiNF2VJZjt9a3VhI95qJLJLwR6XtB0REJD+q7Okjn+1oPyNbKub8GvfFeTUyNsezNk4VrG2n91ZV8hW3oz9jX1Ye54Dbdswzj+1sP+VX9Kz6FnsPWh7mbE2v7NZKglvWNryeQU7u/OsOma8D1YPySiyagsd7TvWi7wZ3DJ6B9KyPEA5FRuLXKNk0+DaA1gYOc0wYITts0bE1xs8uVofbSZKGy/DcxxbeSCUkdx5HuJqSqfZJM0sh3RwKb0KdWy5FnuujZ7i1Ltiw/ECjxQhRwtHgFcf4jVjVRw1JEemllOLNx6VW0aLeoDmzXT+mFaivDm6qU4WCtMJWPZ3Mcek48+AA7c4FqFicVJleVbUsIU2z30bNU3hbcrVEhuxQjxLYw5IX3bvJPiTnuqGeqivl3Jq9LKXzbFhNC7JtD6ODbtts7T8xGCJcoB13PaCeCfICqs7pz5ZchTCHCJuTUZOGaA7g44k0NRX7SNaGSXLPaXCGB7L7yT9vtSO7tPX84py8I1Z67LNDicW75eG/2YHMZhQ/vD+JXd2Dr+eIx8kbY363NSO691Mxpqzqe9lcx0FMZonmrtPcKw3gylkS1gts3VWoVB51at9XSynz91PWfHqFUtTqFTDufJIkVz2yX2LqDaFc5Vv3fo9hfq0Pd5Fpv2QR44J867nT6ZVURUuXu/zZzLp9020Ri2zFQZBfQ2la90gb3IZq3KPcsEcXgzFaguJJIU2B2bla+nE29Rn0er5mdoKAKAKAKAKAS236K4jUUCaQejdidED3oWon/OK7PTZL03H6lW9bpjG2L3FudoGG0lQLkUqZWOsYJI+BFdqDzExDgmKjW5IV72vbJNpl7v8q46b19MchPrK0wZU95oM5+6jdykjyFW6rq0sSRXspm3lMqnfvpmNc5MC8PS/W4zqmnUPOKUUqBwRxNXo4ayik8p4ZrqyYCgCgCgN1oj+0Y1NBVpVM1V1Q8lUcRQor3ge7q7c8MVrPtx8XBtHOdj6PWhctVriKuCUomFlBfSnkHN0bwHnmuQ8Z2OmuNzLrUGv1JdIdlsM67XB5DMWIwt1xazwAAraKcnhGraSyVW9DND8/afqG7tNqTG9WUVcOAK3MpHwPuq9qtoJFbT7ybLYFtsKK0oSFHmQOJqiXUdFUNzzVWTY6GhkAKAXe03Vpb6SyWx7CiN2S6g8vyA/P3VHOXhGjZrtl+izenxdLm0fo5pXsoVw6dQ6v3e3t5dtaRj5I2x2JSlCQlKQlIGAAMAVIaGHfLnFs9rfuM1YQyynJ7SeoDvNAV/us66ax1N024px99W4yyOTaOodw6yfGq9tsYJylwiSKMvbDqC2bNtlUy1W6Yyu93FJj5Qr28qGFK7QAnOPGqGhpnrtUpzXwo1vn6cNuWU5AJOAMk17I5RPdA7INea0WhdrsrrENR4y5f1TQHaCeKvIGop3QhyySNcpcDgieiZKMZsy9XtIfI9tLcUlIPcSarvWL2Jfu/1LJR3m5DDb7KwtpxIWhQ5KBGQa+etNPDOoelYAUAUAUAUBFNqOnl6h00tuOjelxj0rAHNRxxT5j9KtaO/0rN+GR2R7kKbZpq17Sd7JeClQHyESWscRjkoDtHyzXpISwVYvDLFRJcedEalxHkPMOpC0LSchQNWCdbnKzQ2RorxpfTV2cccudhtstxz7anYyVFXiSK3UpLhmXCL5RHHtkuzV1YUrRtqB/K1uj3A1v60/c19Cv2O7eyvZw39nRdmP70cH509WfuZ9Cv2MhrZts+bGEaNsY//AI0f0rHqT9x6MPY5/wDTHZ2pWTouxk/9mj+lPVn7mPRh7G/sOn7DY0lNms8G3g8D6uwlHyFaOTfLCglwjcpNag9AaGrEX6TmnNoet51p0rpiAv6FUOmmSS6lDZXnAC+OcJHHAB591WdPKEE5S5K90ZS2RPNjOzu3bONIotUZQfmvq6WdKxguuY6uxIHADxPMmorbHZLJLVBQWCYS3mIzC35LzbLSBlTjiglKR2knlWhJnBCLntZ2awCpL+tLQop5hl/pv8makVM34MetBeRd6w9JDTzKhA0bbpV9uLqg2wVNltorJwOH2lceoAZqaOmlzLYjlqlxHcc9gVcXbHCdu7bTVwWwhUlDY9lLhHtAcTyPfVZ4zsWYt43I/tI1MLJb/U4q/wBvkJO7j/hp/F49laSlhBsgWz7Sr+p7qVvlaYLKt6Q51qP4Qe01FFZNG8D6isMxY7ceO2ltptIShCRwAFSkZ6EgAkkADiSeqgERtR1V/aC6+qQ3CbbFUQgjk6vkVeHZWkn4N4ryRy1TLiypUS2Bz1iQd36hJLqx+EY448POoJVKx77m2cHWb6P+o9aXtqfqG7ItNubSAhhI6R454qJ6gT58q6NFsaYYS3Ktlbsl9Br6H2KbPNJpaXEsbc2Y2c+tzT0rme0Z9keQFYnfOXkzGqMRiISlCQhCQlIGAAMAVCSHagFjsFuirvsi05KcVvOIiBhRz/yyUD4AV5nqdfp6qa+v7ktEs1onBOATVAlMa2XCJco3rEN4OICihXUUqHMEdRracJQeGYTT4MqtTIUAUAUArtq2glS1OX2ytZf4qkx0j7f5k9/aOuupo9Z2/BPjwQW153RD9neuJulZXqz6Vv21avrWc8UHrUnsPd1/Gu3CeCGMu0fdqucK729udb5CH2HOSknkew9h7qnTyWE8nuqsm551k2OMmhkBQwd0mhhnqmsGrIjqvafo3Sd9TZtQ3Fy3yVthxCnGF9GtJ6woDB5YPZUkapSWUQzsjF4ZtrFrrR16SDbNT2mSTySJSQo/wk5rV1yXKMKcXwzeOzoLLHTuzI7bWM76nQE+/NaYZnKFRtQ2/wCjdJR3Y9qkN3+64IQzGcHRJPatwZGO4ZNT16eUudiKd8Y8FVdc6+1ztKnKNylPORgr2IkcFEdvs4dZ7zk1djCFSK6Vt7wlkztP7Jp9zjIkO3iGy2r7QbSXFJ7jyGfOop6tReEjr6foNlq7pTSX+RmbCLPYtD7SEw7lGalvycNxZryRllSvslI5DP2c9tQ2WuyJvb02Olbw8tFmL5colotr06WsBDaSQnPFZ6gO+qzeCtkScONdNbaqVjPSPq3nFc0so/oOXfUPzMw3gfNhtUOy2xq3wWwhpsc+tR6ye0mpCMz6yBcbXdUOMNp01aitybJGHujGSlB+6MdZ+VYbwZSI1pbZjdbjuP3Vf0bF57mMuqHhyT5+6tVD3NnL2GppzTVn0+zuW2IlCyMKdV7S1eJrc0NxQHFAQHXu2DQejQtu43luRLR/9WIQ65nsOOA8zUsKZz4RHK2MRLT/AEtHhMdEHR7aowV9WXpZCyO/CcVZWj92Q/ePoML0Wm3EbF7Rv59pbqk57N815HrTT1kv0Lmm/toaNcosC4vco6M2htTd4otF6x6wPutujgVfEHzNdGuP3ijt/FEhb7J58MYwIIyDkGucTHNAFAFAFALvaNs7Zu3S3SyobYn8VOND2UvHr8Fd/X19tdHS611/DPghsqzuhZaZ1BedH3ZwNBaMK3ZEV0EJVjtHUe+u3XZtlcFeMnFj20fqe26nt/rEJe48gfXMKPttn9R31aUk90WoTUkbkprY3ycYoZDFAd0ihhnokVg1ZH9oGhtO67sv0ZqCGHkoJUy8k7rjKj1pV1eHI1tCyUHlEVkFNYZXLVvor6hjvLd0vfIE5jmlqWVMu+AIBSfPFXI6uP4kU5aZ+GQW6bBdqNthSJsyxtoix0FbjiZrS8JHM4SoqPuqT7zX7msdPNvB00Fs2iXOQVXi44LZyYzIwVj94/0qG3VOK+FHa0PRo2PNsv0X8jfh6es0K2G2xLewzGIwUpTgnvJ5k99UXZKTy2emr0tNcOyMcI6WCzJtCpBTIU426QQCMbuM1mUu4zTR6Od9jAvEVmbdmpgWtPQgBJTwJIOQc1r6jisI4mv1kZzxA3EKNdtSXdLLanpst08VuLJwO0k8gKj3ZyeB8aK01F01avVmiHH3MKfexjfV/QdVSJYNG8m+rJgKAwIVntkOc/Ojw2ky5Ct514jK1eZ447uVAZ9AdXFobbU44tKEJGVKUcACgFBtQ9IHRmkEORLa79O3QZAZjK+qQfzucvIZNWK9NKfOyIZ3RjwVg17tt2gaudeQ/eXbfBcBHqcI9Gjd7CR7SvM1dhRCPgrStlIXSEOvuYQlTi1Hq4k1NnBHjJsEWG4qQFdGhOeor41p6kTfsZ9ANnFiOmdC2axKA6SJEQh3HLpMZX/iJr51q7vXulZ7s69ce2KRIKrm5DNsdsFw0W+8lOXIag+nwHBXwOfKrmhs7LUvcitWYnvspvBvGjoynF7z8b9nc48fZ5fAisa2r07XjyZqlmJLKqEgUAUAUAUBFNe6LgamjdIAmPcED6t8Dn+VXaPlVrTaqVLx4I51qQjp0W8aYu7kd0vQ5KOG8hRAWntBHMGu/Tcprugyo04vBnQtR3kHeYu05tfWA+r+tXoTUjXukvJJLNtGv8IpTLW3PaHU6nCv5h+ua2wbxukuRj6U1laL+Qy256tLx/cOnBP7p5H51jBYjapEnCawb5O6U1g1bPVIoanoKGAUhDiFIWkKQoYIIyCKGojNfbGJ7dxduej3klClFYiKXuKbPPCFcsdmcVIpp7MvU6vt+Yg0yTrOwn1e72WSlSeAW9HUM/xDgfKnpxfB1K+ovHKZ0hXW63F1XrLYjx0j7AQQVHxPHHhUViUVhEGr185x7U+RkbL9Fpva/pS5oV9HtqwhGcdMof8AiP8AfXUcY+WcdsbdlsdqsyFptsJqPvnK1DipXiTx8qkNDY0AUAUAUBjXN96NAfkR4q5TraCpDKCAVnsGaATGtdNbQtoMKZDlNOW6K8gobbW90aEdnAcT4kUrk4yUhNJxaK17StjWudCRlT7pARKtwOFTIi+kQnP4hzT4kY766td8J7IoTqlHkXjZSFp3wSnPEDhkVMRk7gMRWo6DFaShCkggjmQe+qrbb3LCSXBkVg2L3186OmFAeE+M3MgyIjwy2+0ptY7lDB+dbRk4tNeDDWRR7C5jkLUdysrxx0iN7H521YPwJ91dbqMVKuM1/wCyV6XhtDjrjlkKAKAKAKA4oDTau03b9SW1USYgJcAJaeA9ptXaO7uqai+VMsxNZQUlhiCvNsuukr+GnwEPtK32nAMocT2jtB7K9FRerF3wKU4uLwxoaegaX19ZC+mKiBcmgEv+r+yUq7ccik10ITU0RNYIZqrSt20zIDrgLkfe+rktcBnqz+E1tgJk42aa7Mpbdnvbv1x9liQr7/5Vd/Ya1aLELPDGckVqSncDFDB2AoYO1YMHIFABAxx5UAgLk29q/aG+1EJWiRJKULHINJ4b3hgZ86je7N+EPi3Q2IEBiFGQEMsoCEAdgqQ0MigCgOKA5oAoAoDigIptLvdigWN+2XlpUoTmVI9WRjeUk8CTnkO+nd2vI7e7Y+eepbaq03uVAOd1pwhBPMp6vhXXrn3xUjnzj2ywbjTFyDrSYTuAtA9g/iHZWlkcbm8JZ2N5UZIXvr50dMKAKAR2ml+p7aHEo4Bcx5H82f613Ll3aT9EVY7WDxrhloKAKAKAKAKAKAj2vNMxtTWVcZYCZTYKozvWlXZ4Hrqxpr3TPPg0nBSQjdMXifpDU4fLagplZaksk43059oePYa9LVYtpLgoyXgsapMK7WwBaUSIklsHBGQpJFXiMSOv9MO6auiVMFaoTx3mHOtJ/CT2isMyhn7KNUKv1pMSYsGfEACiebiOpXj1H/WtGixCWUTYCsG52rBg5AoDmgIrtQvQs2lXyhe7IlfUtDPHiOJ8hWG8Iylk0Gwu1hq1y7stA3319E2rr3U8/j8qxFbGZcjJrY1CgCgCgCgCgCgOKA1t2sFmu0huRcbcxJdbTupUscQM5x3isYMiY9KjZZZLpoaVqm1Q2YN0tDPSEsoCUvMj7SVAdYHEHuxVrTWuMu3wyvdBNZKaxHVMymnUnBQoGui1lFRPDGAkgpBHI8aqlkYd89KS9uoUizachRSeS5DqnCPIYrj1/Z2tfPNs3lrH4Q0PRm13fteWC7TtQSmXpEeWlCENMhtKElOern51yusaOvS2RjWtmifTWSsTbG5XHLIh7CoStsocb4j6QcOe4E13bPh0mPoVI72D4rhFsKAKAKAKAKA4zQHNAJXbtaG4l8jXVlASJiCl3HWtPX5jHurtdOtcoOD8FW6OHknGxS4rn6IabcUVKiPKYyewYUPgoV3anmJVlySPVNnZvljkW94DK05bUfuLHI1IYEfpa5ydMarZkqBSWHS1IR2pzhQ/XxArVo3i8PJZBpaHG0uNqCkLAUkjrBqMsHcCgOaAKAQ+0e7Pam1emHDJcaZX6tGSORUTxV5n4AVHJ5eDdbLI6NO2xuz2OJbGjkMNhJVj7Sus+ZzUhobCgCgCgCgCgCgCgCgCgEJ6X+0WHY9Hu6Nguhy63ZG6+En+4YzxJ71cgOzJ7Ktaapyl3PwQXzwsFOrZHVKntMpHNQJ7gOddCTwslSKyyeVVLIvX2nGXC26kpWOYPVVpPJVawWw9CWIpvRl7mHOHpyUD+FHH515H7RSzdGPsjo6NfC2Pe7zW7dapc977EdlTqu/AziuBCDnJRXktt4WRJbF2HJuvPWl+0WWXHlnvPD5qrt69qNOCrSsyyPeuEWwoAoDT6nvqLDEEp23zZTPHfVHRvBvvV2VNTT6rwmkayl2mmtW0nSs5YQuYuIonA6dG6PfyHnU09DdHxk0VsWS5pxt5pLrTiXG1jKVJOQR2g1UaaeGSnasAMcKAV/pAuI+jbWz98vLUPDdx+tdTpi+KTIL+EZvo/MrRpic8rglyYQnyQnJ+Pwr0VPylOXIyalNRJ7YbamFqsym0hKJjYcIH4hwV+h86wzKGpstuBuWiIDq1ZcaSWV+KTj5YqN8liDyiUVg2CgINtP1hHtNqct8F9Dk+Sgo9heSyk8Co45HsrWTwZSyRjYtpxUmcrUEpH1LGURwfvL61eA+Z7qxFeTMn4HBW5qFAFAFAFAFAFAFAFAKTbftusOgGHrbBW1c9QlOExUqyhgkcC6Ry7d3me7nU9NDnu+CKy1R28lIr/d7pqK9ybtdZTkydLcK3HFc1E9QHUOwDlXTSUVhFJtyeWSDT9s9SY6R0fXrHH8o7KgnLLJoRwbStDcgM98ypz0gjHSLKsdmTwFWksLBWby8l5PRq0+5p7ZDaWn0bj8wKmOD/APQ5T/hCa8H1e9XaqTXC2/wdXTx7a0bLbTcvUdGOR0n25jiWvL7R+VQ6CHdbn2NrniJqNgVuDVpn3RSfbfdDSCfwpGT8T8Km6lPMlH2NaFtkZ1cwnOBnroAoAxkHPXQEP1Vs8sV7St1pr1CWckOspwCfzJ5H4Vcp1tlez3RHKqMhXCfqTZ7fnLcmUlaUYUWioqacSeRx1Z8jXU7KtXDuwV8yreBv6K1fbNTxAWFBmWkfWx1K9pPeO0d9cjUaadL34LMJqRIlEJBUogAcST1VWNxAbUr7/aPVnQwsux4/7PH3ePSKJ4keJ4DwFeg0VDrr35ZTtl3Mc+grMbDpWFb1gB5Kd9399XE/0rswj2rBXbyb2tjAt9ukcGBbpIHFLikE9xGf0ozKI1ofXMvTNnft8eE1I6R4uhbiyAklIGMD93tqGcsE9SyjJuG0vU8kENvR4qT1NNcvM5NR97Ju1Edul4vU3H0hPmOhY3gHFkJI7ccqw2zKSMzRGnJGpLwiKjLcdGFPugfZT2DvPVSKyG8FgrbCjW6CzCiNhthlO6hIqUjMmgCgCgCgCgCgCgPCfLiwIbsybIbjx2UlbjriglKEjrJNEs8BvBVjbl6R7skvWHZ+4tlkZQ9dCMKX3NDqH5jx7B11ep03mZVsv8RK0uLkTJSnHFuPvuqypSiVKWo9ZPWaucFbklFhs6YqRIkAF88h1I/1qGc87ImhDG7NxUZIFAaTZRpd7WGvrXY2kKLbroW+R91pPFRPl86a7ULT0Ssf/mQ1Q75pH0Gjstx47bDSQhtpIQhI5AAYAr52228s7Altvd2Q9f41uDgCIbO85k4AWvj/AJQn312em1tQcvcrXy3wNHQdtNq0lboak7rgZC3B+ZXE/OuZqZ99rZPBYikbyoDcKAKAKAKASl0Yj33beqK+0H46nw24hXEEIbwfiK9L06GK4plK5/Ezz13oq46RmJvlieeMNC94LQr2457+1Pf7++3dQmuMojjIxb9tBvuobUxZmGOicdAQ+pnip89gHUD1gfKudToYQn3c+xNK1tYJtsv2e/Qzjd5vASufu5aZHEMZ6yetXyrr119u7K7eRkVKanHXQEA234/s7E7fWeH8pozKNbsPs1tubF3cuNvjSwlTSUF5oK3eC84zy5jlUciarySnWM7S+jogVFs9t+knB9S2iOkKH5lHGQKjbSJUsimZbu+q9QhOVyZklfFR5JH6JArTeTN+B9aSsETTtoRBipBV9p5zHFxfWTUiWDQ3FZMBQBQBQBQBQBQEd1/rOwaHsLt4v8xLDSQejaHFx5X4UJ6z8O2t4Qc3hGspKKyyke2fbFqLaNLVHcUqBZEL3mYDa+BxyU4fvH4DqrpVUxr/ADKVljmL6BBkzXNxhvI61HkKkckuTRRbJXabUxATvf3jxHFZ/SoJTciaMUjYVqbhQBQD19EjRCdPaVkawuraWZV0QAwpzh0cccc8eW8cHwSmvNdd1frWqmHEf3J9LX2x7n5NxtL2/wCkdMB2HZnE365JyN2Ov6hCvzOcj/DmoNH0W+/4p/Cv9/4N7NVCOy3EBo263zantotSLy8FtSpyX5DDQ3Ww2j2inHZhO7x7a9DqKq9Do5OHKRThKVtiyXhrwp1QoDgUBzQBQHjOktw4T0t5QS2y2pxRPUAM1tGLk0kYbwJ/Y205dtez704klKErcJPUpZ4DxxmvXaWHasexz5vI55DLUlhxh9tLjTiSlaFDIUDzBq2Rmj01o6waedcet8P65ZJ6V076kjsBPIVrGCjwZbySCtjAUAUAtdushIhW2Ln2lOLWR3AAfrRhGv0BqOLpXQ8yUQHZ8uUpLDJPAhKE+0e7JPjUU3gsVLKIvHZvGrL+Up35U2QreUo8kjtPYkVDvJk/A79DaVh6Zt+4gh6Y6Pr3yOfcOwCpEsGjeSR1kwFAFAFAFAFAFARrXWroemYgCgH5rgJZYB/xK7BWG8GUslEds131RetZyZmp5bkhwkmOMbraG88AhPUP9murp3FwXaULlJS3NFp61ImHp31AtJONwHiT39grec8bIxCOdyVNNoaQENoShI5ADFQEp2oZCgCgPRLLqkhSWlkHrArGRgjGo9b6r1C0GLtfZkiOkBKWN/daSByAQMDFb06Oml5hFJkErJS5ZHasmg+/QstAla6ud3WnIgw9xJ7FLVj5A15/7Q29tMYe7/YuaOOZNlua8edEKAKAKAKAWW3DUiY9vTp+K7h5/C5O6fst9ST4n4Dvrp9PozL1H4ILp4WDdbGLGbTpMSXkFMierplZ5hHJA92T516SqPbEpSe5OKkMBQBQBQBQCY20y/WNWMxEnIjRhnuUo5+WK1lJRW5tCLk9iP6ZsNwvs9MK3tbyua1q4JQO0mq7zJ5LaSgsD70fpuBpq3CLGAW+sZeeIwpw/oO6t0sGG8m8rJgKAKAKAKAKAKAiuvdYxNNRS0jdfuDifqmc8E/mV3fOsN4MpZE1IhX2/RbhqJ1K3m2vaddVwz2hPcPhWIwct2YsmorCPbUej4O1PZaYEdlhnUFmH7I4ABvA8d09ysEeIzVymfY/oU5rJVFpc6xXV6NIZcZeYcLUhhwYIIOCCOog1faUkRJuLJbDktS46XmVZSfeD2Gq7WHgnTye1YMnZtCnFhCAST1UBtItvQjCnfbV2dQrVs2SM0DAwKwZInF0REQQZEt13uSkJH61M7n4IVUvJEL4yzHu8piOCGm3ChIJ7OFTRbayyKSw9i03oSW7otF3y6EcZFwDIPc22D83DXkvtFPN0Iey/f8A/C/o18LZYGvPFw4xxzQHNAFAQnXuvrfYWFxYK0S7kRgIScpa71H9Ku6bRyteZbIinYo8C82fabnay1Eu6XRTjkNDnSSXVc3VdSB8PAV6KilJJLhFOUh+ISlCEoQkJSkYAA4AVcIztQBQBQBQGn1Xf4en7aqVJUFOHgy0DxcV/TtNYlJRWWbRi5PCE5Ch3bWWpnFNoCpEhe+6vGENp5ZPcAMVWbc2XElBYQ9dLWGFp61pgw08ftOuEe04rtNbrY1NrWTBzQBQBQBQBQBQEQ2iaxY05C9XjFLtydH1aOYbH4lfoOusN4MpZFjpLT0/V13cnT3nfV9/ekPq4qWfwjv+QrEIdzyzFk+xYQ448CGxbRbmmEJihst9GBw3SOI86sFRvIoNHrc0ttHVbnlENLcVHVnkpJ+yflWDJoPSs2UKu8VzW+nowVPYSPpFhA4vNgY6QDrUnhntHhxtUW4+Fkc4+SrlpuDtvkbw9ptR9tHb/rVqUe40jLBNI7zb7KXmlBSFDgarNYJ08mVDfMd3fAyDwI7qw1kymbttaXEBaDkGtTc7UAUAo77/APOT/wDuXP8AMauR+VFSXLLk+iLHDOxiI4BgvzJDh78K3f8AxrxPXZZ1bXskdLSr+mMm76isVoJFxukVhYH2CvK/5Rx+FcyFFlnyonckuWRmbtV0uySGPXJR6ihndB/mIPwqzHp1z52NHdE0c/bCjBEGzKJ6i87+gFTx6Z/2kaO/2RE71rrVeoT6o06tltfDoIaCCruJHtHwq5ToqoPZZZHK2TN1o7ZZcp625d+UqFHJCiz/AMVY7/w/OujCn3IXIc1uhRLdCahwmEMMNJ3UIQMAf699WUsGhkUAUAUAUBrNSXqHYrYubLVy4NoHNauoCsNpLLNoxcnhCWlybvrLUqEJSXZD6t1ppP2WkfoB1mqzbmy3FKCHforTcXTdoTFZw4+v2n3scVq/oOoVulgxnJvayYCgCgCgCgCgCgIttB1axpq37rZQ7cHgehaPHd/Mru+dYbwZSyK3SWn7hq+7uXC4OuKjdJvSHlHi4fwp/wB8BWIR7nlmLJ9iwhyQYkaDFbixGUMstjCUJGAKsFVvJ70MCr212dTUiLfo4I3vqXinmFDilXzHkKMyiZaBvY1Bptp94pVIbHRSB2qA547xxoYKvelBsm/stcl6ssDB+hZjuZDKRwiuq7PyE8uw8OyrtNvcsPkinHG4nLHc1QHt1ZJYWfaHZ3ipZx7hGWCYtrS4hK0KCkqGQQcgiq5MZUKSqOvjxQeYrDRlM3KFJWkKScg8jWpudqAUmoP/AJ2f/wBy5/mNXIfKipL5mWM0/e7rp/0PY8+zTXIUr1h1sOt43gFPrBwTy8RxrzNtMLerOM1lbfsXYycdPlC72ZPvS7VKlynnH5DsglxxxRUpRwOZNdDWpRmkuMENW6yStXAVTRINXZrpawXOKH59vS+sBJ9pxeOXYDirUK444NG2NW2Wi12xG7b4EaMP+m2AffUiSXBqZ1ZAUAUAUAUAUAj9qEuTI1bKZeeUttghLSTySMDlVe17lulLtJxsIhxhYpU4Mp9ZW+W1Ode6AMDwrMeDL5GRWTAUAUAUAUAUAUAUBWvV0qRM1HcHpLqnXA+tIKuoAkAe6opcki4HtYokeFaI0eK0lppLYwkeFW0sIot5e5nUMBQEe2jNNu6LuQcQFbrW8M9RBGDQEE2GPOi8T2As9EqOFlPVvBQAPxNYRljRvMGHc7VKgXCM3JivtKQ604MpWkjka2Tw8mGfN29stx7zOjsp3WmpDiEJznACiAK6a4K5uNEOuKiyWlLJQ27hAP3QRmobFuTV8EhqMkOwWsDAWoDxoD//2Q=="/></defs></svg>
public/img/music-artwork/default.png

This is a binary file and will not be displayed.

+13
public/keys/ari melody_0x92678188_public.asc
··· 1 + -----BEGIN PGP PUBLIC KEY BLOCK----- 2 + 3 + mDMEZNW03RYJKwYBBAHaRw8BAQdAuMUNVjXT7m/YisePPnSYY6lc1Xmm3oS79ZEO 4 + JriRCZy0HWFyaSBtZWxvZHkgPGFyaUBhcmltZWxvZHkubWU+iJMEExYKADsWIQTu 5 + jeuNYocuegkeKt/PmYKckmeBiAUCZNW03QIbAwULCQgHAgIiAgYVCgkICwIEFgID 6 + AQIeBwIXgAAKCRDPmYKckmeBiGCbAP4wTcLCU5ZlfSTJrFtGhQKWA6DxtUO7Cegk 7 + Vu8SgkY3KgEA1/YqjZ1vSaqPDN4137vmhkhfduoYOjN0iptNj39u2wG4OARk1bTd 8 + EgorBgEEAZdVAQUBAQdAnA2drPzQBoXNdwIrFnovuF0CjX+8+8QSugCF4a5ZEXED 9 + AQgHiHgEGBYKACAWIQTujeuNYocuegkeKt/PmYKckmeBiAUCZNW03QIbDAAKCRDP 10 + mYKckmeBiC/xAQD1hu4WcstR40lkUxMqhZ44wmizrDA+eGCdh7Ge3Gy79wEAx385 11 + GnYoNplMTA4BTGs7orV4WSfSkoBx0+px1UOewgs= 12 + =M1Bp 13 + -----END PGP PUBLIC KEY BLOCK-----
+1
public/keys/id_ari_ed25519.pub
··· 1 + ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBHkNL8tYKlEDX0eAQB9rD1GZ3jYzRXZfKmCEFuYJ9jP ari@aria
+313
public/music.json
··· 1 + [ 2 + { 3 + "id": "dream", 4 + "title": "Dream", 5 + "type": "single", 6 + "year": 2022, 7 + "artists": [ 8 + "mellodoot" 9 + ], 10 + "artwork": "https://mellodoot.com/img/music_artwork/mellodoot_-_Dream.webp", 11 + "buylink": "https://arimelody.bandcamp.com/track/dream", 12 + "links": [ 13 + { 14 + "title": "Spotify", 15 + "url": "https://open.spotify.com/album/5talRpqzjExP1w6j5LFIAh" 16 + }, 17 + { 18 + "title": "Apple Music", 19 + "url": "https://music.apple.com/ie/album/dream-single/1650037132" 20 + }, 21 + { 22 + "title": "Soundcloud", 23 + "url": "https://soundcloud.com/arimelody/dream2022" 24 + }, 25 + { 26 + "title": "YouTube", 27 + "url": "https://www.youtube.com/watch?v=nfFgtMuYAx8" 28 + } 29 + ] 30 + }, 31 + { 32 + "id": "gomyway", 33 + "title": "Go My Way", 34 + "type": "single", 35 + "year": 2021, 36 + "artists": [ 37 + "mellodoot" 38 + ], 39 + "artwork": "https://mellodoot.com/img/music_artwork/mellodoot_-_Go_My_Way.webp", 40 + "buylink": "https://arimelody.bandcamp.com/track/go-my-way", 41 + "links": [ 42 + { 43 + "title": "Spotify", 44 + "url": "https://open.spotify.com/album/35WNtxK12IDHCUoXHDePGE" 45 + }, 46 + { 47 + "title": "Apple Music", 48 + "url": "https://music.apple.com/ie/album/go-my-way-single/1547145699" 49 + }, 50 + { 51 + "title": "Soundcloud", 52 + "url": "https://soundcloud.com/arimelody/go-my-way" 53 + }, 54 + { 55 + "title": "YouTube", 56 + "url": "https://www.youtube.com/watch?v=CNptNQdLkl0" 57 + } 58 + ] 59 + }, 60 + { 61 + "id": "rowboat", 62 + "title": "Rowboat", 63 + "type": "single", 64 + "year": 2020, 65 + "artists": [ 66 + "mellodoot" 67 + ], 68 + "artwork": "https://mellodoot.com/img/music_artwork/mellodoot_-_Rowboat.webp", 69 + "buylink": "https://arimelody.bandcamp.com/track/rowboat", 70 + "links": [ 71 + { 72 + "title": "Spotify", 73 + "url": "https://open.spotify.com/album/7jyqJFVKaENCPm58v5O44Y" 74 + }, 75 + { 76 + "title": "Apple Music", 77 + "url": "https://music.apple.com/ie/album/rowboat-single/1502608714" 78 + }, 79 + { 80 + "title": "Soundcloud", 81 + "url": "https://soundcloud.com/arimelody/rowboat" 82 + }, 83 + { 84 + "title": "YouTube", 85 + "url": "https://www.youtube.com/watch?v=uOQyILDTzME" 86 + } 87 + ] 88 + }, 89 + { 90 + "id": "helloworld", 91 + "title": "Hello World", 92 + "type": "single", 93 + "year": 2019, 94 + "artists": [ 95 + "mellodoot" 96 + ], 97 + "artwork": "https://mellodoot.com/img/music_artwork/mellodoot_-_Hello_World.webp", 98 + "buylink": "https://arimelody.bandcamp.com/track/hello-world", 99 + "links": [ 100 + { 101 + "title": "Spotify", 102 + "url": "https://open.spotify.com/album/3LbElPXD4dsDumttGBuYxx" 103 + }, 104 + { 105 + "title": "Apple Music", 106 + "url": "https://music.apple.com/ie/album/hello-world-single/1491880155" 107 + }, 108 + { 109 + "title": "Soundcloud", 110 + "url": "https://soundcloud.com/arimelody/helloworld" 111 + }, 112 + { 113 + "title": "YouTube", 114 + "url": "https://www.youtube.com/watch?v=CQhlRsl0Mjk" 115 + } 116 + ] 117 + }, 118 + { 119 + "id": "sine", 120 + "title": "Sine", 121 + "type": "single", 122 + "artists": [ 123 + "zaire", 124 + "mellodoot" 125 + ], 126 + "year": 2019, 127 + "artwork": "https://mellodoot.com/img/music_artwork/zaire_-_Sine_ft._mellodoot.webp", 128 + "links": [ 129 + { 130 + "title": "Spotify", 131 + "url": "https://open.spotify.com/album/4WPuaJtTV7z86KubD9Rnmk" 132 + }, 133 + { 134 + "title": "Apple Music", 135 + "url": "https://music.apple.com/us/album/sine-feat-mellodoot/1489163020" 136 + }, 137 + { 138 + "title": "YouTube", 139 + "url": "https://www.youtube.com/watch?v=z1H1s6VRnyY" 140 + } 141 + ] 142 + }, 143 + { 144 + "id": "10", 145 + "title": "10", 146 + "type": "single", 147 + "year": 2019, 148 + "artists": [ 149 + "mellodoot" 150 + ], 151 + "artwork": "https://mellodoot.com/img/music_artwork/mellodoot_-_10.webp", 152 + "buylink": "https://arimelody.bandcamp.com/track/10", 153 + "links": [ 154 + { 155 + "title": "Spotify", 156 + "url": "https://open.spotify.com/album/2x4gbACfDm99unaXpLXyj0" 157 + }, 158 + { 159 + "title": "Apple Music", 160 + "url": "https://music.apple.com/ie/album/ten-single/1483193041" 161 + }, 162 + { 163 + "title": "Soundcloud", 164 + "url": "https://soundcloud.com/arimelody/ten" 165 + }, 166 + { 167 + "title": "YouTube", 168 + "url": "https://www.youtube.com/watch?v=C7WP5L2BK4U" 169 + } 170 + ] 171 + }, 172 + { 173 + "id": "mad", 174 + "title": "MAD", 175 + "type": "single", 176 + "year": 2018, 177 + "artists": [ 178 + "mellodoot" 179 + ], 180 + "artwork": "https://mellodoot.com/img/music_artwork/mellodoot_-_MAD.webp", 181 + "buylink": "https://arimelody.bandcamp.com/track/mad", 182 + "links": [ 183 + { 184 + "title": "Spotify", 185 + "url": "https://open.spotify.com/album/59nFXw1WNoRhXou7lXqBZd" 186 + }, 187 + { 188 + "title": "Apple Music", 189 + "url": "https://music.apple.com/ie/album/mad/1441233120" 190 + }, 191 + { 192 + "title": "Soundcloud", 193 + "url": "https://soundcloud.com/arimelody/mad" 194 + }, 195 + { 196 + "title": "YouTube", 197 + "url": "https://www.youtube.com/watch?v=OB-Pk6p6mfQ" 198 + } 199 + ] 200 + }, 201 + { 202 + "id": "welcomingparty", 203 + "title": "Welcoming Party", 204 + "type": "album", 205 + "year": 2018, 206 + "artists": [ 207 + "mellodoot" 208 + ], 209 + "artwork": "https://mellodoot.com/img/music_artwork/mellodoot_-_Welcoming_Party.webp", 210 + "buylink": "https://arimelody.bandcamp.com/album/welcoming-party", 211 + "links": [ 212 + { 213 + "title": "Spotify", 214 + "url": "https://open.spotify.com/album/3EPa4HZpkISQVRAks64LfR" 215 + }, 216 + { 217 + "title": "Apple Music", 218 + "url": "https://music.apple.com/ie/album/welcoming-party-ep/1441161424" 219 + }, 220 + { 221 + "title": "Soundcloud", 222 + "url": "https://soundcloud.com/arimelody/sets/welcoming-party" 223 + }, 224 + { 225 + "title": "YouTube", 226 + "url": "https://www.youtube.com/playlist?list=PLBG_QJeOHrB5EeniiXBIlHpoQbD6CUJca" 227 + } 228 + ], 229 + "tracks": [ 230 + { 231 + "title": "Paradigm" 232 + }, 233 + { 234 + "title": "Mitrio" 235 + }, 236 + { 237 + "title": "Level One" 238 + }, 239 + { 240 + "title": "Cubes" 241 + }, 242 + { 243 + "title": "Aria" 244 + } 245 + ] 246 + }, 247 + { 248 + "id": "howtheyknow2018", 249 + "title": "How They Know (2018)", 250 + "type": "single", 251 + "year": 2018, 252 + "artists": [ 253 + "mellodoot" 254 + ], 255 + "artwork": "https://mellodoot.com/img/music_artwork/mellodoot_-_How_They_Know_2018.webp", 256 + "buylink": "https://arimelody.bandcamp.com/track/how-they-know-2018-remastered", 257 + "free": true, 258 + "links": [ 259 + { 260 + "title": "Soundcloud", 261 + "url": "https://soundcloud.com/arimelody/how-they-know-2018" 262 + }, 263 + { 264 + "title": "YouTube", 265 + "url": "https://www.youtube.com/watch?v=mbAgSwCzyMw" 266 + } 267 + ] 268 + }, 269 + { 270 + "id": "howtheyknow", 271 + "title": "How They Know", 272 + "type": "single", 273 + "year": 2017, 274 + "artists": [ 275 + "mellodoot" 276 + ], 277 + "artwork": "https://mellodoot.com/img/music_artwork/mellodoot_-_How_They_Know.webp", 278 + "buylink": "https://arimelody.bandcamp.com/track/how-they-know", 279 + "free": true, 280 + "links": [ 281 + { 282 + "title": "Soundcloud", 283 + "url": "https://soundcloud.com/arimelody/how-they-know" 284 + }, 285 + { 286 + "title": "YouTube", 287 + "url": "https://www.youtube.com/watch?v=q6lzKuG1Emo" 288 + } 289 + ] 290 + }, 291 + { 292 + "id": "traveller", 293 + "title": "Traveller", 294 + "type": "single", 295 + "year": 2017, 296 + "artists": [ 297 + "mellodoot" 298 + ], 299 + "artwork": "https://mellodoot.com/img/music_artwork/mellodoot_-_Traveller.webp", 300 + "buylink": "https://arimelody.bandcamp.com/track/traveller", 301 + "free": true, 302 + "links": [ 303 + { 304 + "title": "Soundcloud", 305 + "url": "https://soundcloud.com/arimelody/traveller" 306 + }, 307 + { 308 + "title": "YouTube", 309 + "url": "https://www.youtube.com/watch?v=ZTO7IQZ-yXA" 310 + } 311 + ] 312 + } 313 + ]
+14
public/robots.txt
··· 1 + User-agent: * 2 + Disallow: /nobot/ 3 + Disallow: /private/ 4 + 5 + User-agent: GPTBot 6 + Disallow: / 7 + User-agent: ChatGPT-User 8 + Disallow: / 9 + 10 + User-agent: Google-Extended 11 + Disallow: / 12 + 13 + User-agent: CCBot 14 + Disallow: /
+44
public/script/accessibility.js
··· 1 + const accessibility = JSON.parse(localStorage.getItem("accessibility")) || {}; 2 + 3 + function toggle_accessibility_setting(name) { 4 + if (accessibility[name]) { 5 + delete accessibility[name]; 6 + update_accessibility(); 7 + return true; 8 + } 9 + accessibility[name] = true; 10 + update_accessibility(); 11 + return true; 12 + } 13 + 14 + function set_accessibility_setting(name, value) { 15 + accessibility[name] = value; 16 + update_accessibility(); 17 + return true; 18 + } 19 + 20 + function clear_accessibility_setting(name) { 21 + if (!accessibility[name]) return false; 22 + delete accessibility[name]; 23 + update_accessibility(); 24 + return true; 25 + } 26 + 27 + function update_accessibility() { 28 + localStorage.setItem("accessibility", JSON.stringify(accessibility)); 29 + } 30 + 31 + if (accessibility) { 32 + if (accessibility.disable_crt) { 33 + document.querySelector('div#overlay').setAttribute("hidden", true); 34 + document.body.style.textShadow = "none"; 35 + document.getElementById('toggle-crt').classList.add("disabled"); 36 + } 37 + } 38 + 39 + document.getElementById("toggle-crt").addEventListener("click", () => { 40 + toggle_accessibility_setting("disable_crt"); 41 + document.querySelector('div#overlay').toggleAttribute("hidden"); 42 + document.getElementById('toggle-crt').className = accessibility.disable_crt ? "disabled" : ""; 43 + }); 44 +
+66
public/script/main.js
··· 1 + const header_links = document.getElementById("header-links"); 2 + const hamburger = document.getElementById("header-links-toggle"); 3 + 4 + function type_out(e) { 5 + const text = e.innerText; 6 + const original = e.innerHTML; 7 + e.innerText = ""; 8 + const delay = 25; 9 + let chars = 0; 10 + 11 + function insert_char(character, parent) { 12 + const c = document.createElement("span"); 13 + c.innerText = character; 14 + parent.appendChild(c); 15 + c.classList.add("newchar"); 16 + } 17 + 18 + function normalize() { 19 + e.innerHTML = original; 20 + } 21 + 22 + function increment_char() { 23 + const newchar = text.substring(chars - 1, chars); 24 + insert_char(newchar, e); 25 + chars++; 26 + if (chars <= text.length) { 27 + setTimeout(increment_char, delay); 28 + } else { 29 + setTimeout(normalize, 250); 30 + } 31 + } 32 + 33 + increment_char(); 34 + } 35 + 36 + function fill_list(list) { 37 + const items = list.querySelectorAll("li a, li span"); 38 + items.innerText = ""; 39 + const delay = 100; 40 + 41 + items.forEach((item, iter) => { 42 + item.style.animationDelay = `${iter * delay}ms`; 43 + item.style.animationPlayState = "playing"; 44 + }); 45 + } 46 + 47 + [...document.querySelectorAll("h1, h2, h3, h4, h5, h6")] 48 + .filter((e) => e.innerText != "") 49 + .forEach((e) => { 50 + type_out(e); 51 + }); 52 + [...document.querySelectorAll("ol, ul")] 53 + .filter((e) => e.innerText != "") 54 + .forEach((e) => { 55 + fill_list(e); 56 + }); 57 + 58 + function toggle_header_links() { 59 + header_links.classList.toggle("open"); 60 + } 61 + 62 + document.addEventListener("click", event => { 63 + if (!header_links.contains(event.target) && !hamburger.contains(event.target)) { 64 + header_links.classList.remove("open"); 65 + } 66 + });
+67
public/script/music-gateway.js
··· 1 + const bg = document.getElementById("background"); 2 + bg.style.backgroundImage = `url(${bg.dataset.url})`; 3 + bg.removeAttribute("data-url"); 4 + 5 + const share_btn = document.getElementById("share"); 6 + share_btn.onclick = (e) => { 7 + navigator.clipboard.writeText(window.location.href); 8 + share_btn.classList.remove('active'); 9 + void share_btn.offsetWidth; 10 + share_btn.classList.add('active'); 11 + } 12 + 13 + document.getElementById("go-back").addEventListener("click", () => { 14 + window.history.back(); 15 + }); 16 + 17 + apply_funny_bob_to_upcoming_tags(); 18 + 19 + function apply_funny_bob_to_upcoming_tags() { 20 + upcomingTags = document.querySelectorAll("#type.upcoming"); 21 + for (var i = 0; i < upcomingTags.length; i++) { 22 + const tag = upcomingTags[i]; 23 + chars = tag.innerText.split(""); 24 + result = chars.map((c, i) => `<span style="animation-delay: -${i * 100}ms;">${c}</span>`); 25 + tag.innerHTML = result.join(""); 26 + } 27 + } 28 + 29 + const previews = document.querySelectorAll("[id^=preview-]"); 30 + for (const preview of previews) { 31 + preview.addEventListener("click", (e) => { 32 + if (e.target.classList.contains('playing')) { 33 + stopPreview(e.target); 34 + } else { 35 + playPreview(e.target); 36 + } 37 + }); 38 + preview.querySelector('audio').addEventListener("ended", () => { stopPreview(preview); }); 39 + } 40 + 41 + var stupidsounds = false; 42 + 43 + function stopPreviews() { 44 + for (const preview of previews) stopPreview(preview); 45 + } 46 + 47 + function playPreview(preview) { 48 + if (!stupidsounds) stopPreviews(); 49 + const btn = preview.querySelector('i'); 50 + btn.classList.remove("play", "fa-play"); 51 + btn.classList.add("pause", "fa-pause"); 52 + const audio = preview.querySelector('audio'); 53 + audio.play(); 54 + preview.classList.add('playing'); 55 + } 56 + 57 + function stopPreview(preview) { 58 + const btn = preview.querySelector('i'); 59 + btn.classList.remove("pause", "fa-pause"); 60 + btn.classList.add("play", "fa-play"); 61 + const audio = preview.querySelector('audio'); 62 + audio.pause(); 63 + audio.currentTime = 0; 64 + preview.classList.remove('playing'); 65 + } 66 + 67 + stopPreviews();
+15
public/script/music.js
··· 1 + document.querySelectorAll("h2.question").forEach(element => { 2 + element.onclick = (e) => { 3 + const url = `${window.location.protocol}//${window.location.host}${window.location.pathname}#${e.target.id}`; 4 + window.location = url; 5 + }; 6 + }); 7 + 8 + document.querySelectorAll("div.music").forEach(element => { 9 + console.log(element); 10 + element.addEventListener("click", (e) => { 11 + const url = `${window.location.protocol}//${window.location.host}/music/${element.id}`; 12 + window.location = url; 13 + }); 14 + }); 15 +
+66
public/script/prideflag.js
··· 1 + /** 2 + * ๐Ÿณ๏ธโ€๐ŸŒˆ๐Ÿณ๏ธโ€โšง๏ธ๐Ÿ’– pride flag ๐Ÿ’–๐Ÿณ๏ธโ€โšง๏ธ๐Ÿณ๏ธโ€๐ŸŒˆ 3 + * made with โค๏ธ by ari melody, 2023 4 + * 5 + * web: https://arimelody.me 6 + * source: https://github.com/mellodoot/prideflag 7 + */ 8 + 9 + const pride_flag_svg = 10 + `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 120 120" width="120" height="120"> 11 + <path id="red" d="M120,80 L100,100 L120,120 Z" style="fill:#d20605"/> 12 + <path id="orange" d="M120,80 V40 L80,80 L100,100 Z" style="fill:#ef9c00"/> 13 + <path id="yellow" d="M120,40 V0 L60,60 L80,80 Z" style="fill:#e5fe02"/> 14 + <path id="green" d="M120,0 H80 L40,40 L60,60 Z" style="fill:#09be01"/> 15 + <path id="blue" d="M80,0 H40 L20,20 L40,40 Z" style="fill:#081a9a"/> 16 + <path id="purple" d="M40,0 H0 L20,20 Z" style="fill:#76008a"/> 17 + 18 + <rect id="black" x="60" width="60" height="60" style="fill:#010101"/> 19 + <rect id="brown" x="70" width="50" height="50" style="fill:#603814"/> 20 + <rect id="lightblue" x="80" width="40" height="40" style="fill:#73d6ed"/> 21 + <rect id="pink" x="90" width="30" height="30" style="fill:#ffafc8"/> 22 + <rect id="white" x="100" width="20" height="20" style="fill:#fff"/> 23 + 24 + <rect id="intyellow" x="110" width="10" height="10" style="fill:#fed800"/> 25 + <circle id="intpurple" cx="120" cy="0" r="5" stroke="#7601ad" stroke-width="2" fill="none"/> 26 + </svg>`; 27 + 28 + const pride_flag_css = 29 + `#pride-flag svg { 30 + position: fixed; 31 + top: 0; 32 + right: 0; 33 + width: 120px; 34 + transform-origin: 100% 0%; 35 + transition: transform .5s cubic-bezier(.32,1.63,.41,1.01); 36 + z-index: 8008135; 37 + pointer-events: none; 38 + } 39 + #pride-flag svg:hover { 40 + transform: scale(110%); 41 + } 42 + #pride-flag svg:active { 43 + transform: scale(110%); 44 + } 45 + #pride-flag svg * { 46 + pointer-events: all; 47 + }`; 48 + 49 + function create_pride_flag() { 50 + const container = document.createElement("a"); 51 + container.id = "pride-flag"; 52 + container.href = "https://github.com/mellodoot/prideflag"; 53 + container.target = "_blank"; 54 + container.innerHTML = pride_flag_svg; 55 + return container; 56 + } 57 + 58 + function load_pride_flag_style() { 59 + const pride_stylesheet = document.createElement('style'); 60 + pride_stylesheet.textContent = pride_flag_css; 61 + document.head.appendChild(pride_stylesheet); 62 + } 63 + 64 + load_pride_flag_style(); 65 + pride_flag = create_pride_flag(); 66 + document.body.appendChild(pride_flag);
+448
public/style/main.css
··· 1 + @font-face { 2 + font-family: "Monaspace Argon"; 3 + src: url("/font/monaspace-argon/MonaspaceArgonVarVF[wght,wdth,slnt].woff2") format("woff2-variations"); 4 + font-weight: 125 950; 5 + font-stretch: 75% 125%; 6 + font-style: oblique 0deg 20deg; 7 + } 8 + 9 + :root { 10 + --primary: #b7fd49; 11 + --secondary: #f8e05b; 12 + --tertiary: #f788fe; 13 + --links: #5eb2ff; 14 + } 15 + 16 + .col-primary { 17 + color: var(--primary); 18 + } 19 + 20 + .col-secondary { 21 + color: var(--secondary); 22 + } 23 + 24 + .col-tertiary { 25 + color: var(--tertiary); 26 + } 27 + 28 + body { 29 + margin: 0; 30 + padding: 0; 31 + background: #080808; 32 + color: #eee; 33 + font-family: "Monaspace Argon", monospace; 34 + font-size: 18px; 35 + text-shadow: 0 0 3em; 36 + scroll-behavior: smooth; 37 + } 38 + 39 + header { 40 + position: fixed; 41 + top: 0; 42 + left: 0; 43 + width: 100vw; 44 + border-bottom: 1px solid #888; 45 + background-color: #080808; 46 + z-index: 1; 47 + } 48 + 49 + nav { 50 + width: min(calc(100% - 4rem), 720px); 51 + height: 3em; 52 + margin: auto; 53 + padding: 0 1em; 54 + display: flex; 55 + flex-direction: row; 56 + gap: .8em; 57 + align-items: center; 58 + } 59 + 60 + img#header-icon { 61 + width: 2em; 62 + height: 2em; 63 + margin: .5em; 64 + display: block; 65 + } 66 + 67 + #header-text { 68 + width: 11em; 69 + margin-left: -0.5rem; 70 + display: flex; 71 + flex-direction: column; 72 + justify-content: center; 73 + flex-grow: 1; 74 + } 75 + 76 + #header-text h1 { 77 + margin: 0; 78 + font-size: 1em; 79 + } 80 + 81 + #header-text h2 { 82 + height: 1.2em; 83 + line-height: 1.2em; 84 + margin: 0; 85 + font-size: .7em; 86 + color: #bbb; 87 + } 88 + 89 + #header-links-toggle { 90 + width: 3em; 91 + height: 3em; 92 + display: none; 93 + justify-content: center; 94 + align-items: center; 95 + transition: background-color .2s; 96 + } 97 + 98 + #header-links-toggle:hover { 99 + background-color: #fff2; 100 + } 101 + 102 + header ul#header-links { 103 + margin: 0; 104 + padding: 0; 105 + display: flex; 106 + flex-direction: row; 107 + gap: .5em; 108 + align-items: center; 109 + } 110 + 111 + header ul li { 112 + list-style: none; 113 + } 114 + 115 + header ul li a, 116 + header ul li span { 117 + padding: .2em .5em; 118 + border: 1px solid var(--links); 119 + color: var(--links); 120 + border-radius: 2px; 121 + background-color: transparent; 122 + transition-property: color, border-color, background-color; 123 + transition-duration: .2s; 124 + animation-delay: 0s; 125 + animation: list-item-fadein .2s forwards; 126 + opacity: 0; 127 + } 128 + 129 + header ul li span { 130 + color: #aaa; 131 + border-color: #aaa; 132 + cursor: default; 133 + text-decoration: none; 134 + } 135 + 136 + header ul li a:hover { 137 + color: #eee; 138 + border-color: #eee; 139 + background-color: var(--links) !important; 140 + text-decoration: none; 141 + } 142 + 143 + 144 + #toggle-crt a { 145 + color: var(--primary); 146 + border-color: var(--primary); 147 + opacity: 1; 148 + } 149 + 150 + #toggle-crt a:hover { 151 + color: #111; 152 + background-color: var(--primary) !important; 153 + } 154 + 155 + #toggle-crt.disabled a { 156 + opacity: .5 !important; 157 + } 158 + 159 + main { 160 + width: min(calc(100% - 4rem), 720px); 161 + min-height: calc(100vh - 10.3rem); 162 + margin: 5rem auto 2rem auto; 163 + } 164 + 165 + main h1 { 166 + line-height: 3rem; 167 + color: var(--primary); 168 + } 169 + 170 + main h2 { 171 + color: var(--secondary); 172 + } 173 + 174 + main h3 { 175 + color: var(--tertiary); 176 + } 177 + 178 + a { 179 + color: var(--links); 180 + text-decoration: none; 181 + } 182 + 183 + a:hover { 184 + text-decoration: underline; 185 + } 186 + 187 + small { 188 + font-size: 1em; 189 + color: #aaa; 190 + } 191 + 192 + span.newchar { 193 + animation: newchar 0.25s; 194 + } 195 + 196 + @keyframes newchar { 197 + from { 198 + background: #fff8; 199 + } 200 + } 201 + 202 + span.hide { 203 + display: none; 204 + } 205 + 206 + h1:hover span.hide { 207 + display: initial; 208 + opacity: 0.1; 209 + } 210 + 211 + div#me_irl { 212 + width: fit-content; 213 + height: fit-content; 214 + border: 2px solid white; 215 + } 216 + 217 + div#me_irl img { 218 + display: block; 219 + } 220 + 221 + div#me_irl::before { 222 + content: ""; 223 + position: absolute; 224 + width: 104px; 225 + height: 104px; 226 + transform: translate(2px, 2px); 227 + background-image: linear-gradient(to top right, 228 + var(--primary), 229 + var(--secondary)); 230 + z-index: -1; 231 + } 232 + 233 + h1, 234 + h2, 235 + h3, 236 + h4, 237 + h5, 238 + h6, 239 + p, 240 + small, 241 + blockquote { 242 + transition: background-color 0.1s; 243 + } 244 + 245 + h1 a, 246 + h2 a, 247 + h3 a, 248 + h4 a, 249 + h5 a, 250 + h6 a { 251 + color: inherit; 252 + } 253 + 254 + h1 a:hover, 255 + h2 a:hover, 256 + h3 a:hover, 257 + h4 a:hover, 258 + h5 a:hover, 259 + h6 a:hover { 260 + text-decoration: none; 261 + } 262 + 263 + main h1:hover, 264 + main h2:hover, 265 + main h3:hover, 266 + main h4:hover, 267 + main h5:hover, 268 + main h6:hover, 269 + main p:hover, 270 + main small:hover, 271 + main blockquote:hover { 272 + background-color: #fff1; 273 + } 274 + 275 + blockquote { 276 + margin: 1rem 0; 277 + padding: 0 2.5rem; 278 + } 279 + 280 + hr { 281 + text-align: center; 282 + line-height: 0px; 283 + border-width: 1px 0 0 0; 284 + border-color: #888f; 285 + margin: 1.5em 0; 286 + overflow: visible; 287 + } 288 + 289 + ul.links { 290 + display: flex; 291 + gap: 1em .5em; 292 + flex-wrap: wrap; 293 + } 294 + 295 + ul.links li { 296 + list-style: none; 297 + } 298 + 299 + ul.links li a { 300 + padding: .2em .5em; 301 + border: 1px solid var(--links); 302 + color: var(--links); 303 + border-radius: 2px; 304 + background-color: transparent; 305 + transition-property: color, border-color, background-color; 306 + transition-duration: .2s; 307 + animation-delay: 0s; 308 + animation: list-item-fadein .2s forwards; 309 + opacity: 0; 310 + } 311 + 312 + ul.links li a:hover { 313 + color: #eee; 314 + border-color: #eee; 315 + background-color: var(--links) !important; 316 + text-decoration: none; 317 + box-shadow: 0 0 1em var(--links); 318 + } 319 + 320 + @keyframes list-item-fadein { 321 + from { 322 + opacity: 1; 323 + background: #fff8; 324 + } 325 + 326 + to { 327 + opacity: 1; 328 + background: transparent; 329 + } 330 + } 331 + 332 + div#web-buttons { 333 + margin: 2rem 0; 334 + } 335 + 336 + #web-buttons a { 337 + text-decoration: none; 338 + } 339 + 340 + #web-buttons img { 341 + image-rendering: auto; 342 + image-rendering: crisp-edges; 343 + image-rendering: pixelated; 344 + } 345 + 346 + #web-buttons img:hover { 347 + margin: -1px; 348 + border: 1px solid #eee; 349 + transform: translate(-2px, -2px); 350 + box-shadow: 1px 1px 0 #eee, 2px 2px 0 #eee; 351 + } 352 + 353 + footer { 354 + border-top: 1px solid #888; 355 + } 356 + 357 + #footer { 358 + width: min(calc(100% - 4rem), 720px); 359 + margin: auto; 360 + padding: 2rem 0; 361 + color: #aaa; 362 + } 363 + 364 + @keyframes overlay-flicker { 365 + from { 366 + opacity: .5; 367 + } 368 + to { 369 + opacity: .6; 370 + } 371 + } 372 + 373 + @keyframes overlay-scroll { 374 + from { 375 + background-position-y: 0; 376 + } 377 + to { 378 + background-position-y: .2em; 379 + } 380 + } 381 + 382 + #overlay { 383 + position: fixed; 384 + top: 0; 385 + left: 0; 386 + width: 100vw; 387 + height: 100vh; 388 + background-image: linear-gradient(180deg, rgba(0,0,0,0) 15%, rgb(0, 0, 0) 40%, rgb(0, 0, 0) 60%, rgba(0,0,0,0) 85%); 389 + background-size: 100vw .2em; 390 + background-repeat: repeat; 391 + opacity: .5; 392 + pointer-events: none; 393 + /* animation: linear .05s infinite alternate overlay-flicker; */ 394 + mix-blend-mode: overlay; 395 + } 396 + 397 + @media screen and (max-width: 780px) { 398 + body { 399 + font-size: 14px; 400 + } 401 + 402 + nav { 403 + width: calc(100vw - 2rem); 404 + margin: 0; 405 + } 406 + 407 + div#header-text { 408 + flex-grow: 1; 409 + } 410 + 411 + a#header-links-toggle { 412 + display: flex; 413 + } 414 + 415 + header ul#header-links { 416 + position: fixed; 417 + left: 0; 418 + top: 2.7rem; 419 + width: calc(100vw - 2rem); 420 + padding: 1rem; 421 + flex-direction: column; 422 + gap: 1rem; 423 + border-bottom: 1px solid #888; 424 + background: #080808; 425 + display: none; 426 + } 427 + 428 + header ul#header-links.open { 429 + display: flex; 430 + } 431 + 432 + ul#header-links li { 433 + width: 100%; 434 + } 435 + 436 + ul#header-links li a, 437 + ul#header-links li span { 438 + margin: 0; 439 + display: block; 440 + font-size: 1rem; 441 + text-align: center; 442 + } 443 + 444 + main { 445 + margin-top: 4rem; 446 + } 447 + } 448 +
+550
public/style/music-gateway.css
··· 1 + @font-face { 2 + font-family: "Monaspace Argon"; 3 + src: url("/font/monaspace-argon/MonaspaceArgonVarVF[wght,wdth,slnt].woff2") format("woff2-variations"); 4 + font-weight: 125 950; 5 + font-stretch: 75% 125%; 6 + font-style: oblique 0deg 20deg; 7 + } 8 + 9 + html, 10 + body { 11 + margin: 0; 12 + padding: 0; 13 + color: #fff; 14 + background-color: #111; 15 + font-family: "Monaspace Argon", monospace; 16 + } 17 + 18 + #background { 19 + position: fixed; 20 + top: 0; 21 + left: 0; 22 + width: 100vw; 23 + height: 100vh; 24 + background-size: cover; 25 + background-position: center; 26 + filter: blur(25px) saturate(25%) brightness(0.5); 27 + -webkit-filter: blur(25px) saturate(25%) brightness(0.5);; 28 + animation: background-init .5s forwards,background-loop 30s ease-in-out infinite 29 + } 30 + 31 + #go-back { 32 + position: absolute; 33 + top: 1rem; 34 + left: 1rem; 35 + width: 2.5rem; 36 + height: 2.5rem; 37 + margin: 0; 38 + font-size: 1.5rem; 39 + display: flex; 40 + justify-content: center; 41 + align-items: center; 42 + color: #fff; 43 + background-color: #fff1; 44 + border-radius: 4px; 45 + text-decoration: none; 46 + box-shadow: 0 0 8px #0004; 47 + z-index: 100 48 + } 49 + 50 + main { 51 + display: flex; 52 + min-height: calc(100vh - 6rem); 53 + justify-content: center; 54 + align-items: center 55 + } 56 + 57 + #music-container { 58 + position: absolute; 59 + width: min(960px, calc(100vw - 4rem)); 60 + display: flex; 61 + flex-direction: row; 62 + flex-wrap: nowrap; 63 + gap: 4rem; 64 + animation: card-init .5s forwards 65 + } 66 + 67 + #art-container { 68 + display: flex; 69 + align-items: center; 70 + position: relative; 71 + width: 20rem; 72 + transition: transform .5s cubic-bezier(0,0,0,1); 73 + } 74 + 75 + #art-container:hover { 76 + transform: scale(1.05) translateY(-5px); 77 + } 78 + 79 + #art-container:hover img#artwork { 80 + box-shadow: 0 16px 18px #0003; 81 + } 82 + 83 + /* TILT CONTROLS */ 84 + 85 + #art-container > div { 86 + position: absolute; 87 + width: 33.3%; 88 + height: 33.3%; 89 + z-index: 2; 90 + } 91 + 92 + #art-container > div.tilt-topleft { 93 + top: 0; 94 + left: 0; 95 + } 96 + 97 + #art-container > div.tilt-topleft:hover ~ #artwork { 98 + transform: rotate3d(-1, 1, 0, 20deg); 99 + filter: brightness(var(--shine)); 100 + -webkit-filter: brightness(var(--shine)); 101 + } 102 + 103 + #art-container > div.tilt-top { 104 + top: 0; 105 + left: 33.3%; 106 + } 107 + 108 + #art-container > div.tilt-top:hover ~ #artwork { 109 + transform: rotate3d(-1, 0, 0, 20deg); 110 + filter: brightness(var(--shine)); 111 + -webkit-filter: brightness(var(--shine)); 112 + } 113 + 114 + #art-container > div.tilt-topright { 115 + top: 0; 116 + right: 0; 117 + } 118 + 119 + #art-container > div.tilt-topright:hover ~ #artwork { 120 + transform: rotate3d(-1, -1, 0, 20deg); 121 + filter: brightness(var(--shine)); 122 + -webkit-filter: brightness(var(--shine)); 123 + } 124 + 125 + #art-container > div.tilt-right { 126 + top: 33.3%; 127 + right: 0; 128 + } 129 + 130 + #art-container > div.tilt-right:hover ~ #artwork { 131 + transform: rotate3d(0, -1, 0, 20deg); 132 + } 133 + 134 + #art-container > div.tilt-bottomright { 135 + bottom: 0; 136 + right: 0; 137 + } 138 + 139 + #art-container > div.tilt-bottomright:hover ~ #artwork { 140 + transform: rotate3d(1, -1, 0, 20deg); 141 + filter: brightness(var(--shadow)); 142 + -webkit-filter: brightness(var(--shadow)); 143 + } 144 + 145 + #art-container > div.tilt-bottom { 146 + bottom: 0; 147 + left: 33.3%; 148 + } 149 + 150 + #art-container > div.tilt-bottom:hover ~ #artwork { 151 + transform: rotate3d(1, 0, 0, 20deg); 152 + filter: brightness(var(--shadow)); 153 + -webkit-filter: brightness(var(--shadow)); 154 + } 155 + 156 + #art-container > div.tilt-bottomleft { 157 + bottom: 0; 158 + left: 0; 159 + } 160 + 161 + #art-container > div.tilt-bottomleft:hover ~ #artwork { 162 + transform: rotate3d(1, 1, 0, 20deg); 163 + filter: brightness(var(--shadow)); 164 + -webkit-filter: brightness(var(--shadow)); 165 + } 166 + 167 + #art-container > div.tilt-left { 168 + top: 33.3%; 169 + left: 0; 170 + } 171 + 172 + #art-container > div.tilt-left:hover ~ #artwork { 173 + transform: rotate3d(0, 1, 0, 20deg); 174 + } 175 + 176 + /* TILT CONTROLS */ 177 + 178 + #artwork { 179 + --shine: 1.05; 180 + --shadow: 0.8; 181 + width: 100%; 182 + max-width: 512px; 183 + margin: auto; 184 + display: flex; 185 + justify-content: center; 186 + line-height: 15rem; 187 + border-radius: 4px; 188 + color: #888; 189 + background-color: #ccc; 190 + box-shadow: 0 16px 16px #0004; 191 + transition: transform 1s cubic-bezier(0,0,0,1), filter .3s linear, box-shadow .3s linear; 192 + } 193 + 194 + div#vertical-line { 195 + width: 1px; 196 + background-color: #fff4; 197 + box-shadow: 0 0 16px #000; 198 + } 199 + 200 + #title { 201 + margin: 0; 202 + line-height: 1em; 203 + font-size: 3em; 204 + } 205 + 206 + #year { 207 + margin-left: .9em; 208 + font-size: .5em; 209 + color: #eee 210 + } 211 + 212 + #artist { 213 + margin: .2em 0 1em 0; 214 + font-size: 1em; 215 + color: #eee 216 + } 217 + 218 + #title, 219 + #artist { 220 + text-shadow: 0 .05em 2px #0004 221 + } 222 + 223 + #type { 224 + display: inline-block; 225 + margin: 0; 226 + padding: .3em .8em; 227 + color: #fff; 228 + background-color: #111; 229 + text-transform: uppercase; 230 + border-radius: 4px 231 + } 232 + 233 + #type.single { 234 + background-color: #3b47f4 235 + } 236 + 237 + #type.ep { 238 + background-color: #f419bd 239 + } 240 + 241 + #type.album { 242 + background-color: #34c627 243 + } 244 + 245 + #type.comp { 246 + background-color: #ee8d46 247 + } 248 + 249 + #type.upcoming { 250 + background-color: #ff3e3e 251 + } 252 + 253 + #type.upcoming span { 254 + animation: bob 2s ease-in-out infinite; 255 + display: inline-block; 256 + } 257 + 258 + #links { 259 + margin: 1rem 0; 260 + display: flex; 261 + flex-direction: row; 262 + flex-wrap: wrap; 263 + gap: .5rem 264 + } 265 + 266 + #links a { 267 + padding: .5em .8em; 268 + border-radius: 4px; 269 + flex-grow: 1; 270 + font-size: 1em; 271 + color: #111; 272 + background-color: #fff; 273 + text-align: center; 274 + text-decoration: none; 275 + transition: filter .1s,-webkit-filter .1s 276 + } 277 + 278 + #links a.buy { 279 + background-color: #ff94e9 280 + } 281 + 282 + #links a.presave { 283 + background-color: #ff94e9 284 + } 285 + 286 + #links a.spotify { 287 + background-color: #8cff83 288 + } 289 + 290 + #links a.applemusic { 291 + background-color: #8cd9ff 292 + } 293 + 294 + #links a.soundcloud { 295 + background-color: #fdaa6d 296 + } 297 + 298 + #links a.youtube { 299 + background-color: #ff6e6e 300 + } 301 + 302 + #links a:hover { 303 + filter: brightness(125%); 304 + -webkit-filter: brightness(125%) 305 + } 306 + 307 + #description { 308 + font-size: 1.2em; 309 + } 310 + 311 + #share { 312 + margin: 0; 313 + display: inline-block; 314 + text-shadow: 0 .05em 2px #0004; 315 + cursor: pointer; 316 + opacity: .5; 317 + transition: opacity .1s linear; 318 + } 319 + 320 + #share:hover { 321 + opacity: 1; 322 + } 323 + 324 + #share.active { 325 + animation: share-click .5s forwards 326 + } 327 + 328 + #share.active::after { 329 + content: "โœ“"; 330 + font-size: 1.5em; 331 + line-height: .75em; 332 + position: absolute; 333 + transform: translateX(.3em); 334 + animation: share-after 2s cubic-bezier(.5,0,1,.5) forwards 335 + } 336 + 337 + #tracks { 338 + flex-basis: 100%; 339 + max-height: 10rem; 340 + margin: auto 8rem; 341 + display: flex; 342 + flex-wrap: wrap; 343 + gap: 0 2rem; 344 + overflow-y: auto; 345 + scrollbar-color: #fff transparent; 346 + scrollbar-width: thin 347 + } 348 + 349 + #tracks .track-preview { 350 + width: 100%; 351 + height: 2.5rem; 352 + display: flex; 353 + flex-direction: row; 354 + border-bottom: 1px solid #fff2; 355 + border-radius: 4px; 356 + user-select: none; 357 + transition: background-color .2s,color .2s 358 + } 359 + 360 + #tracks .track-preview: last-of-type { 361 + border-bottom: none 362 + } 363 + 364 + .track-preview:hover { 365 + background-color: #0002 366 + } 367 + 368 + .track-preview.playing { 369 + color: #111; 370 + background-color: #fff 371 + } 372 + 373 + .track-preview i { 374 + width: .7em; 375 + margin: auto .8em; 376 + pointer-events: none 377 + } 378 + 379 + .track-preview p { 380 + margin: auto 0; 381 + display: inline-block; 382 + line-height: 2em; 383 + font-size: 1em; 384 + pointer-events: none 385 + } 386 + 387 + .track-preview audio { 388 + width: 100% 389 + } 390 + 391 + footer { 392 + position: fixed; 393 + left: 0; 394 + bottom: 0; 395 + width: 100vw; 396 + height: 6rem; 397 + display: flex; 398 + flex-direction: column; 399 + justify-content: center; 400 + align-items: center; 401 + color: #eee; 402 + background-color: #0008; 403 + backdrop-filter: blur(25px) 404 + } 405 + 406 + footer p { 407 + margin: 0 408 + } 409 + 410 + footer a { 411 + color: inherit; 412 + text-decoration: none 413 + } 414 + 415 + footer a:hover { 416 + text-decoration: underline 417 + } 418 + 419 + @media only screen and (max-width: 800px) { 420 + main { 421 + min-height: calc(100vh - 4rem); 422 + } 423 + 424 + #music-container { 425 + width: calc(100vw - 8rem); 426 + height: fit-content; 427 + gap: 1rem; 428 + padding: 2rem 0; 429 + flex-direction: column; 430 + text-align: center 431 + } 432 + 433 + #art-container { 434 + width: 100%; 435 + margin-bottom: 2rem; 436 + } 437 + 438 + #artwork { 439 + max-width: 40vh; 440 + max-height: 40vh; 441 + } 442 + 443 + #vertical-line { 444 + display: none; 445 + } 446 + 447 + #music-container #info { 448 + width: 100% 449 + } 450 + 451 + #year { 452 + display: block; 453 + margin: -.5em 0 .5rem; 454 + } 455 + 456 + #links { 457 + margin: 2rem 0; 458 + justify-content: center; 459 + } 460 + 461 + #share.active: : after { 462 + transform: translate(calc(-50% - .6em),1.5em); 463 + } 464 + 465 + #tracks { 466 + margin: 0; 467 + } 468 + 469 + footer { 470 + height: 4rem; 471 + font-size: .8rem; 472 + } 473 + 474 + } 475 + 476 + #overlay { 477 + position: fixed; 478 + top: 0; 479 + left: 0; 480 + width: 100vw; 481 + height: 100vh; 482 + background-image: linear-gradient(180deg, rgba(0,0,0,0) 15%, rgb(0, 0, 0) 40%, rgb(0, 0, 0) 60%, rgba(0,0,0,0) 85%); 483 + background-size: 100vw .2em; 484 + background-repeat: repeat; 485 + opacity: .5; 486 + pointer-events: none; 487 + /* animation: linear .05s infinite alternate overlay-flicker; */ 488 + mix-blend-mode: overlay; 489 + } 490 + 491 + @keyframes background-init { 492 + from { 493 + opacity: 0 494 + } 495 + to { 496 + opacity: 1 497 + } 498 + } 499 + 500 + @keyframes background-loop { 501 + from { 502 + transform: scale(1) 503 + } 504 + 50% { 505 + transform: scale(1.05) 506 + } 507 + to { 508 + transform: scale(1) 509 + } 510 + } 511 + 512 + @keyframes card-init { 513 + from { 514 + opacity: 0; 515 + transform: scale(.9) 516 + } 517 + to { 518 + opacity: 1; 519 + transform: scale(1) 520 + } 521 + } 522 + 523 + @keyframes share-click { 524 + from { 525 + color: #5dfc01 526 + } 527 + to { 528 + color: #eee 529 + } 530 + } 531 + 532 + @keyframes share-after { 533 + from { 534 + opacity: 1 535 + } 536 + to { 537 + opacity: 0 538 + } 539 + } 540 + 541 + @keyframes bob { 542 + from, 543 + to { 544 + transform: translateY(-10%); 545 + } 546 + 50% { 547 + transform: translateY(10%); 548 + } 549 + } 550 +
+134
public/style/music.css
··· 1 + div.music { 2 + margin-bottom: 1rem; 3 + padding: 1.5rem; 4 + display: flex; 5 + flex-direction: row; 6 + gap: 1.5em; 7 + border: 1px solid #222; 8 + border-radius: 4px; 9 + background-color: #ffffff08; 10 + transition: background-color .1s; 11 + text-decoration: none; 12 + cursor: pointer; 13 + } 14 + 15 + div.music:hover { 16 + background-color: #fff1; 17 + } 18 + 19 + div.music a { 20 + text-decoration: none; 21 + } 22 + 23 + .music h1:hover, 24 + .music h2:hover, 25 + .music h3:hover { 26 + background: initial; 27 + } 28 + 29 + .music-artwork img { 30 + border: 1px solid #888; 31 + } 32 + 33 + .music-title { 34 + margin: 0; 35 + color: #eee; 36 + font-size: 1.6em; 37 + line-height: 1.6em; 38 + } 39 + 40 + .music-year { 41 + color: #888; 42 + } 43 + 44 + .music-artist { 45 + margin: -.5rem 0 0 0; 46 + font-size: 1em; 47 + color: #aaa; 48 + } 49 + 50 + h3[class^=music-type] { 51 + margin: 0 0 1rem 0; 52 + font-size: .8em; 53 + color: #eee; 54 + } 55 + 56 + h3.music-type-single { 57 + color: var(--tertiary); 58 + } 59 + 60 + h3.music-type-compilation { 61 + color: var(--secondary); 62 + } 63 + 64 + h3.music-type-album { 65 + color: var(--primary); 66 + } 67 + 68 + h3.music-type-upcoming { 69 + color: #f47070; 70 + } 71 + 72 + .music-links { 73 + width: fit-content; 74 + margin: .5em 0; 75 + padding: 0; 76 + display: flex; 77 + gap: .5rem; 78 + flex-wrap: wrap; 79 + line-height: 1.7em; 80 + justify-content: center; 81 + } 82 + 83 + .music-links li { 84 + list-style: none; 85 + } 86 + 87 + .music-links li a { 88 + padding: .2em .5em; 89 + border: 1px solid #65b4fd; 90 + color: #65b4fd; 91 + border-radius: 2px; 92 + background-color: transparent; 93 + transition-property: color, border-color, background-color; 94 + transition-duration: .2s; 95 + animation: list-item-fadein .2s forwards; 96 + animation-delay: 0s; 97 + opacity: 0; 98 + } 99 + 100 + 101 + .music-links li a:hover { 102 + color: #eee; 103 + border-color: #eee; 104 + background-color: var(--links) !important; 105 + text-decoration: none; 106 + } 107 + 108 + h2.question { 109 + margin: 1rem 0; 110 + padding: 1rem 1.5rem; 111 + border-radius: 4px; 112 + cursor: pointer; 113 + } 114 + 115 + .collapse { 116 + margin: -1rem 0 1rem 0; 117 + padding: .5em 1.5em; 118 + border-radius: 4px; 119 + } 120 + 121 + @media screen and (max-width: 740px) { 122 + div.music { 123 + flex-direction: column; 124 + } 125 + 126 + .music-artwork, 127 + .music-details { 128 + text-align: center; 129 + align-items: center; 130 + display: flex; 131 + flex-direction: column; 132 + } 133 + } 134 +
+9
views/footer.html
··· 1 + {{define "footer"}} 2 + 3 + <footer> 4 + <div id="footer"> 5 + <small><em>*made with โ™ฅ by ari, 2024*</em></small> 6 + </div> 7 + </footer> 8 + 9 + {{end}}
+42
views/header.html
··· 1 + {{define "header"}} 2 + 3 + <header> 4 + <nav> 5 + <img src="img/favicon.png" id="header-icon" width="100" height="100" alt=""> 6 + <div id="header-text"> 7 + <h1>ari melody</h1> 8 + <h2>your local SPACEGIRL ๐Ÿ’ซ</h2> 9 + </div> 10 + <a id="header-links-toggle" onclick="toggle_header_links()"> 11 + <svg viewBox="0 0 70 50" xmlns="http://www.w3.org/2000/svg" width="24" height="24"> 12 + <rect y="00" width="70" height="10" rx="5" fill="#eee" /> 13 + <rect y="20" width="70" height="10" rx="5" fill="#eee" /> 14 + <rect y="40" width="70" height="10" rx="5" fill="#eee" /> 15 + </svg> 16 + </a> 17 + <ul id="header-links"> 18 + <li> 19 + <a href="/">home</a> 20 + </li> 21 + <li> 22 + <a href="/music">music</a> 23 + </li> 24 + <li> 25 + <a href="https://git.arimelody.me/ari/arimelody.me" target="_blank">source</a> 26 + </li> 27 + <li> 28 + <!-- coming later! --> 29 + <span title="coming later!">blog</span> 30 + </li> 31 + <li> 32 + <!-- coming later! --> 33 + <span title="coming later!">art</span> 34 + </li> 35 + <li id="toggle-crt"> 36 + <a href="javascript:void(0)">crt</a> 37 + </li> 38 + </ul> 39 + </nav> 40 + </header> 41 + 42 + {{end}}
+196
views/index.html
··· 1 + <!DOCTYPE html> 2 + <html lang="en"> 3 + <head> 4 + <meta http-equiv="content-type" content="text/html; charset=UTF-8"> 5 + <meta charset="UTF-8"> 6 + <meta http-equiv="X-UA-Compatible" content="IE=edge"> 7 + <meta name="viewport" content="width=device-width, initial-scale=1.0"> 8 + 9 + <title>ari melody ๐Ÿ’ซ</title> 10 + <link rel="shortcut icon" href="img/favicon.png" type="image/x-icon"> 11 + 12 + <meta name="description" content="home to your local SPACEGIRL ๐Ÿ’ซ"> 13 + 14 + <meta property="og:title" content="ari melody"> 15 + <meta property="og:type" content="website"> 16 + <meta property="og:url" content="www.arimelody.me"> 17 + <meta property="og:image" content="https://www.arimelody.me/img/favicon.png"> 18 + <meta property="og:site_name" content="ari melody"> 19 + <meta property="og:description" content="home to your local SPACEGIRL ๐Ÿ’ซ"> 20 + 21 + <link rel="stylesheet" href="style/main.css"> 22 + 23 + <script src="/script/main.js" defer></script> 24 + <script src="/script/accessibility.js" defer></script> 25 + <link rel="me" href="https://wetdry.world/@ari"> 26 + </head> 27 + <body> 28 + {{block "header" .}}{{end}} 29 + 30 + <main> 31 + <h1> 32 + # hello, world! 33 + </h1> 34 + 35 + 36 + <p> 37 + <strong>i'm ari!</strong> 38 + <br> 39 + <small>she/her ๐Ÿณ๏ธโ€โšง๏ธ๐Ÿณ๏ธโ€๐ŸŒˆ๐Ÿ’ซ๐Ÿฆ†๐Ÿ‡ฎ๐Ÿ‡ช</small> 40 + </p> 41 + 42 + <p> 43 + i like to create things on the internet! namely <a href="/music">music</a>, 44 + <a href="https://youtube.com/mellodoot" target="_blank">videos</a>, art <small><em>(link pending)</em></small>, and the odd 45 + <a href="https://github.com/mellodoot?tab=repositories" target="_blank">code project</a> from time to time! 46 + if it's a thing you can create on a computer, i've probably taken a swing at it. 47 + </p> 48 + <p> 49 + you're very welcome to take a look around my little slice of the internet here, 50 + or explore any of the other corners i inhabit! 51 + </p> 52 + <p> 53 + and if you're looking to support me financially, that's so cool of you!! 54 + if you like, you can buy one or more of my songs over on 55 + <a href="https://arimelody.bandcamp.com" target="_blank">bandcamp</a>, 56 + so you can at least get something for your money. 57 + thank you very much either way!! ๐Ÿ’• 58 + </p> 59 + <p> 60 + for anything else, you can reach me for any and all communications through 61 + <a href="mailto:ari@arimelody.me">ari@arimelody.me</a>. if your message 62 + contains anything beyond a silly gag, i strongly recommend encrypting 63 + your message using my public pgp key, listed below! 64 + </p> 65 + <p> 66 + thank you for stopping by- i hope you have a lovely rest of your day! ๐Ÿ’ซ 67 + </p> 68 + 69 + <hr> 70 + 71 + <h2> 72 + ## metadata 73 + </h2> 74 + 75 + <p> 76 + <strong>my colours ๐ŸŒˆ</strong> 77 + </p> 78 + <ul> 79 + <li>primary: <span class="col-primary">#b7fd49</span></li> 80 + <li>secondary: <span class="col-secondary">#f8e05b</span></li> 81 + <li>tertiary: <span class="col-tertiary">#f788fe</span></li> 82 + </ul> 83 + 84 + <p> 85 + <strong>my keys ๐Ÿ”‘</strong> 86 + </p> 87 + <ul> 88 + <li>pgp: <a href="/keys/ari melody_0x92678188_public.asc" target="_blank">[link]</a></li> 89 + <li>ssh (ed25519): <a href="/keys/id_ari_ed25519.pub" target="_blank">[link]</a></li> 90 + </ul> 91 + 92 + <p> 93 + <strong>where to find me ๐Ÿ›ฐ๏ธ</strong> 94 + </p> 95 + <ul class="links"> 96 + <li> 97 + <a href="https://youtube.com/@mellodoot" target="_blank">youtube</a> 98 + </li> 99 + <li> 100 + <a href="https://mellodoot.tumblr.com" target="_blank">tumblr</a> 101 + </li> 102 + <li> 103 + <a href="https://twitch.tv/mellodoot" target="_blank">twitch</a> 104 + </li> 105 + <li> 106 + <a href="https://sptfy.com/mellodoot" target="_blank">spotify</a> 107 + </li> 108 + <li> 109 + <a href="https://soundcloud.com/arimelody" target="_blank">soundcloud</a> 110 + </li> 111 + <li> 112 + <a href="https://github.com/mellodoot" target="_blank">github</a> 113 + </li> 114 + </ul> 115 + 116 + <p> 117 + <strong>projects i've worked on ๐Ÿ› ๏ธ</strong> 118 + </p> 119 + <ul class="links"> 120 + <li> 121 + <a href="https://catdance.xyz" target="_blank"> 122 + catdance 123 + </a> 124 + </li> 125 + <li> 126 + <a href="https://github.com/mellodoot/sandblock" target="_blank"> 127 + sandblock 128 + </a> 129 + </li> 130 + <li> 131 + <a href="https://github.com/mellodoot/prideflag" target="_blank"> 132 + pride flag 133 + </a> 134 + </li> 135 + <li> 136 + <a href="https://github.com/mellodoot/ipaddrgen" target="_blank"> 137 + ipaddrgen 138 + </a> 139 + </li> 140 + <li> 141 + <a href="https://impact.arimelody.me/" target="_blank"> 142 + impact meme 143 + </a> 144 + </li> 145 + <li> 146 + <a href="https://term.arimelody.me/" target="_blank"> 147 + OpenTerminal 148 + </a> 149 + </li> 150 + </ul> 151 + 152 + <hr> 153 + 154 + <h2>## cool people</h2> 155 + 156 + <div id="web-buttons"> 157 + <a href="https://arimelody.me"> 158 + <img src="/img/buttons/ari melody.gif" alt="ari melody web button"> 159 + </a> 160 + <a href="https://supitszaire.com" target="_blank"> 161 + <img src="/img/buttons/zaire.gif" alt="zaire web button"> 162 + </a> 163 + <a href="https://mae.wtf" target="_blank"> 164 + <img src="/img/buttons/mae.png" alt="vimae web button"> 165 + </a> 166 + 167 + <hr> 168 + 169 + <img src="/img/buttons/misc/debian.gif" alt="powered by debian"> 170 + <img src="/img/buttons/misc/girls4notepad.gif" alt="girls 4 notepad"> 171 + <img src="/img/buttons/misc/gaywebring.gif" alt="this website is GAY"> 172 + <img src="/img/buttons/misc/graphicdesign.gif" alt="graphic design is my passion"> 173 + <img src="/img/buttons/misc/gplv3.gif" alt="GPLv3 free software"> 174 + <img src="/img/buttons/misc/hl.gif" alt="half-life"> 175 + <img src="/img/buttons/misc/h-free-anim.gif" alt="dis site is hentai FREE"> 176 + <img src="/img/buttons/misc/sprunk.gif" alt="sprunk"> 177 + <img src="/img/buttons/misc/tohell.gif" alt="go straight to hell"> 178 + <img src="/img/buttons/misc/virusalert.gif" alt="virus alert! click here" onclick="alert('meow :3')"> 179 + <img src="/img/buttons/misc/wii.gif" alt="wii"> 180 + <img src="/img/buttons/misc/www2.gif" alt="www"> 181 + <img src="/img/buttons/misc/iemandatory.gif" alt="get mandatory internet explorer"> 182 + <img src="/img/buttons/misc/learn_html.gif" alt="HTML - learn it today!"> 183 + <a href="https://smokepowered.com" target="_blank"> 184 + <img src="/img/buttons/misc/smokepowered.gif" alt="high on SMOKE"> 185 + </a> 186 + <a href="https://epicblazed.com" target="_blank"> 187 + <img src="/img/buttons/misc/epicblazed.png" alt="epic blazed"> 188 + </a> 189 + </div> 190 + </main> 191 + 192 + {{block "footer" .}}{{end}} 193 + 194 + <div id="overlay"></div> 195 + </body> 196 + </html>
+121
views/music-gateway.html
··· 1 + <!DOCTYPE html> 2 + <html lang="en"> 3 + <head> 4 + <meta http-equiv="content-type" content="text/html; charset=UTF-8"> 5 + <meta charset="UTF-8"> 6 + <meta http-equiv="X-UA-Compatible" content="IE=edge"> 7 + <meta name="viewport" content="width=device-width, initial-scale=1.0"> 8 + 9 + <title>{{.PrintArtists}} - {{.Title}}</title> 10 + <link rel="icon" href="{{.ResolveArtwork}}"> 11 + 12 + <meta name="description" content="Stream &quot;{{.Title}}&quot; by {{.PrintArtists}} on all platforms!"> 13 + <meta name="author" content="{{.PrintArtists}}"> 14 + <meta name="keywords" content="{{.PrintCommaArtists}}, music, {{.Title}}, {{.Id}}, {{.Year}}"> 15 + 16 + <meta property="og:url" content="https://arimelody.me/music/{{.Id}}"> 17 + <meta property="og:type" content="website"> 18 + <meta property="og:locale" content="en_IE"> 19 + <meta property="og:site_name" content="ari melody music"> 20 + <meta property="og.Title" content="{{.PrintArtists}} - {{.Title}}"> 21 + <meta property="og:description" content="Stream &quot;{{.Title}}&quot; by {{.PrintArtists}} on all platforms!"> 22 + <meta property="og:image" content="https://arimelody.me{{.ResolveArtwork}}"> 23 + 24 + <meta name="twitter:card" content="summary_large_image"> 25 + <meta name="twitter:site" content="@funniduck"> 26 + <meta name="twitter:creator" content="@funniduck"> 27 + <meta property="twitter:domain" content="arimelody.me"> 28 + <meta property="twitter:url" content="https://arimelody.me/music/{{.Id}}"> 29 + <meta name="twitter.Title" content="{{.PrintArtists}} - {{.Title}}"> 30 + <meta name="twitter:description" content="Stream &quot;{{.Title}}&quot; by mellodoot on all platforms!"> 31 + <meta name="twitter:image" content="https://arimelody.me{{.ResolveArtwork}}"> 32 + <meta name="twitter:image:alt" content="Cover art for &quot;{{.Title}}&quot;"> 33 + 34 + <script type="text/javascript" src="/script/music-gateway.js" defer=""></script> 35 + <script type="text/javascript" src="/script/prideflag.js" defer=""></script> 36 + <link rel="stylesheet" href="/style/music-gateway.css"> 37 + </head> 38 + <body> 39 + <div id="background" data-url="{{.ResolveArtwork}}"></div> 40 + <div id="overlay"></div> 41 + 42 + <a id="go-back" title="back to arimelody.me" href="/music">&lt;</a> 43 + 44 + <main> 45 + <div id="music-container"> 46 + <div id="art-container"> 47 + <div class="tilt-topleft"></div> 48 + <div class="tilt-top"></div> 49 + <div class="tilt-topright"></div> 50 + <div class="tilt-right"></div> 51 + <div class="tilt-bottomright"></div> 52 + <div class="tilt-bottom"></div> 53 + <div class="tilt-bottomleft"></div> 54 + <div class="tilt-left"></div> 55 + <img id="artwork" src="{{.ResolveArtwork}}" alt="{{.Title}} artwork"> 56 + </div> 57 + <div id="vertical-line"></div> 58 + <div id="info"> 59 + <h1 id="title">{{.Title}}<span id="year">{{.Year}}</span></h1> 60 + <p id="artist">{{.PrintArtists}}</p> 61 + <p id="type" class="{{.Type}}">{{.Type}}</p> 62 + 63 + <div id="links"> 64 + {{if .Buylink}} 65 + <a href="{{.Buylink}}" target="_blank" class="buy"> 66 + {{if .Buyname}} 67 + {{.Buyname}} 68 + {{else}} 69 + {{if .Free}} 70 + download 71 + {{else}} 72 + buy 73 + {{end}} 74 + {{end}}</a> 75 + {{end}} 76 + 77 + {{range .Links}} 78 + <a class="{{.NormaliseName}}" target="_blank" href="{{.Url}}"> 79 + {{.Name}} 80 + </a> 81 + {{end}} 82 + </div> 83 + 84 + <p id="description"> 85 + {{.Description}} 86 + </p> 87 + 88 + <p id="share">share</p> 89 + </div> 90 + <!-- <div id="tracks"> --> 91 + <!-- <% var file = `/audio/preview/${data.id}.webm` %> --> 92 + <!-- <% if (data.tracks && typeof(data.tracks) == typeof([])) { %> --> 93 + <!-- <% for( let i = 0; i < data.tracks.length; i++ ) { %> --> 94 + <!-- <% --> 95 + <!-- songid = data.tracks[i].title.toLowerCase().replace(/[^a-z0-9]/g, ""); --> 96 + <!-- file = `/audio/preview/${data.id}-${songid}.webm`; --> 97 + <!-- %> --> 98 + <!----> 99 + <!-- <div class="track-preview" id="preview-<%= songid %>"> --> 100 + <!-- <i class="fa-solid fa-play play"></i> --> 101 + <!-- <p><%= data.tracks[i].title %></p> --> 102 + <!-- <audio src="<%= file %>"></audio> --> 103 + <!-- </div> --> 104 + <!----> 105 + <!-- <% } %> --> 106 + <!-- <% } else { %> --> 107 + <!-- <div class="track-preview" id="preview-<%= data.id %>"> --> 108 + <!-- <i class="fa-solid fa-play play"></i> --> 109 + <!-- <p>{{.Title}}</p> --> 110 + <!-- <audio src="<%= file %>"></audio> --> 111 + <!-- </div> --> 112 + <!-- <% } %> --> 113 + <!-- </div> --> 114 + </div> 115 + </main> 116 + 117 + <footer> 118 + <p>made with &#10084; by <a href="/" target="_blank">ari melody</a>, 2024</p> 119 + </footer> 120 + </body> 121 + </html>
+145
views/music.html
··· 1 + <!DOCTYPE html> 2 + <html lang="en"> 3 + <head> 4 + <meta http-equiv="content-type" content="text/html; charset=UTF-8"> 5 + <meta charset="UTF-8"> 6 + <meta http-equiv="X-UA-Compatible" content="IE=edge"> 7 + <meta name="viewport" content="width=device-width, initial-scale=1.0"> 8 + 9 + <title>music - ari melody ๐Ÿ’ซ</title> 10 + <link rel="shortcut icon" href="/img/favicon.png" type="image/x-icon"> 11 + 12 + <meta name="description" content="music from your local SPACEGIRL ๐Ÿ’ซ"> 13 + 14 + <meta property="og:title" content="ari melody music"> 15 + <meta property="og:type" content="website"> 16 + <meta property="og:url" content="www.arimelody.me/music"> 17 + <meta property="og:image" content="https://www.arimelody.me/img/favicon.png"> 18 + <meta property="og:site_name" content="ari melody"> 19 + <meta property="og:description" content="music from your local SPACEGIRL ๐Ÿ’ซ"> 20 + 21 + <link rel="stylesheet" href="/style/main.css"> 22 + <link rel="stylesheet" href="/style/music.css"> 23 + 24 + <script src="/script/main.js" defer></script> 25 + <script src="/script/accessibility.js" defer></script> 26 + <script src="/script/music.js" defer></script> 27 + </head> 28 + <body> 29 + <header> 30 + <nav> 31 + <img src="/img/favicon.png" id="header-icon" width="100" height="100" alt=""> 32 + <div id="header-text"> 33 + <h1>ari melody</h1> 34 + <h2>your local SPACEGIRL ๐Ÿ’ซ</h2> 35 + </div> 36 + <a id="header-links-toggle" onclick="toggle_header_links()"> 37 + <svg viewBox="0 0 70 50" xmlns="http://www.w3.org/2000/svg" width="24" height="24"> 38 + <rect y="00" width="70" height="10" rx="5" fill="#eee" /> 39 + <rect y="20" width="70" height="10" rx="5" fill="#eee" /> 40 + <rect y="40" width="70" height="10" rx="5" fill="#eee" /> 41 + </svg> 42 + </a> 43 + <ul id="header-links"> 44 + <li> 45 + <a href="/">home</a> 46 + </li> 47 + <li> 48 + <a href="/music">music</a> 49 + </li> 50 + <li> 51 + <a href="https://git.arimelody.me/ari/arimelody.me" target="_blank">source</a> 52 + </li> 53 + <li> 54 + <!-- coming later! --> 55 + <span title="coming later!">blog</span> 56 + </li> 57 + <li> 58 + <!-- coming later! --> 59 + <span title="coming later!">art</span> 60 + </li> 61 + <li id="toggle-crt"> 62 + <a href="javascript:void(0)">crt</a> 63 + </li> 64 + </ul> 65 + </nav> 66 + </header> 67 + 68 + <main> 69 + <h1> 70 + # my music 71 + </h1> 72 + 73 + <div id="music-container"> 74 + {{range $Album := .}} 75 + <div class="music" id="{{$Album.Id}}"> 76 + <div class="music-artwork"> 77 + <img src="{{$Album.ResolveArtwork}}" alt="{{$Album.Title}} artwork" width="128"> 78 + </div> 79 + <div class="music-details"> 80 + <a href="/music/{{$Album.Id}}"><h1 class="music-title">{{$Album.Title}}</h1></a> 81 + <h2 class="music-artist">{{$Album.PrintArtists}}</h2> 82 + <h3 class="music-type-{{.Type}}">{{$Album.Type}}</h3> 83 + <ul class="music-links"> 84 + {{range $Link := $Album.Links}} 85 + <li> 86 + <a href="{{$Link.Url}}">{{$Link.Name}}</a> 87 + </li> 88 + {{end}} 89 + </ul> 90 + </div> 91 + </div> 92 + {{end}} 93 + </div> 94 + 95 + <h2 id="usage" class="question"> 96 + <a href="#usage"> 97 + &gt; "can i use your music in my content?" 98 + </a> 99 + </h2> 100 + <div class="collapse"> 101 + <p> 102 + <strong class="big">yes!</strong> well, in most cases... 103 + </p> 104 + <p> 105 + from <a href="/music/dream">Dream (2022)</a> onward, all of my <em>self-released</em> songs are 106 + licensed under <a href="https://creativecommons.org/licenses/by-sa/3.0/" target="_blank">Creative Commons Attribution-ShareAlike 3.0</a>. anyone may use these 107 + songs freely, so long as they provide credit back to me! 108 + </p> 109 + <p> 110 + a great example of some credit text would be as follows: 111 + </p> 112 + <blockquote> 113 + music used: mellodoot - Dream<br> 114 + buy it here: <a href="/music/dream">https://arimelody.me/music/dream</a><br> 115 + licensed under CC BY-SA 3.0. 116 + </blockquote> 117 + <p> 118 + for any songs prior to this, they were all either released by me (in which case, i honestly 119 + don't mind), or in collaboration with chill people who i don't see having an issue with it. 120 + do be sure to ask them about it, though! 121 + </p> 122 + <p> 123 + in the event the song you want to use is released under some other label, their usage rights 124 + will more than likely trump whatever i'd otherwise have in mind. i'll try to negotiate some 125 + nice terms, though! ;3 126 + </p> 127 + <p> 128 + i love the idea of other creators using my songs in their work, so if you do happen to use 129 + my stuff in a work you're particularly proud of, feel free to send it my way! 130 + </p> 131 + <p> 132 + &gt; <a href="mailto:ari@arimelody.me">ari@arimelody.me</a> 133 + </p> 134 + </div> 135 + </main> 136 + 137 + <footer> 138 + <div id="footer"> 139 + <small><em>*made with โ™ฅ by ari, 2024*</em></small> 140 + </div> 141 + </footer> 142 + 143 + <div id="overlay"></div> 144 + </body> 145 + </html>